lcms2-2.19.1/0000755000175000017500000000000015176574575011664 5ustar martimartilcms2-2.19.1/.github/0000755000175000017500000000000015176573557013223 5ustar martimartilcms2-2.19.1/.github/dependabot.yml0000644000175000017500000000027315176573557016055 0ustar martimartiversion: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" groups: github-actions: patterns: - "*" lcms2-2.19.1/.github/workflows/0000755000175000017500000000000015176573557015260 5ustar martimartilcms2-2.19.1/.github/workflows/build.yml0000644000175000017500000001312415176573557017103 0ustar martimartiname: Build on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.job }}-${{ github.ref }} cancel-in-progress: true permissions: read-all jobs: Ubuntu: strategy: matrix: runner: [ ubuntu-latest ] runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v6.0.2 - name: Build Ubuntu run: | ./configure --with-fastfloat --with-threaded make make check macOS: strategy: matrix: runner: [ macos-14, macos-latest ] runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v6.0.2 - name: Build macOS run: | ./configure --with-fastfloat --with-threaded make make check Windows: strategy: matrix: include: - arch: win32 runner: windows-latest - arch: x64 runner: windows-latest # - arch: arm64 # runner: windows-11-arm runs-on: ${{ matrix.runner }} steps: - name: Checkout Repository uses: actions/checkout@v6.0.2 - name: Setup MSVC Build Environment uses: ilammy/msvc-dev-cmd@v1 with: arch: ${{ matrix.arch }} - name: Build Windows run: devenv .\Projects\VC2019\lcms2.sln /Rebuild "Release|${{ matrix.arch }}" /Project testbed - name: Run tests run: testbed\testbed.exe --chdir testbed Ubuntu-meson: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6.0.2 - name: Install packages run: | sudo apt-get -y install build-essential python3-pip ninja-build pip install meson==0.52.0 - name: Build Ubuntu run: | meson setup build -Dfastfloat=true -Dthreaded=true cd build ninja meson test VisualStudio-meson: runs-on: windows-latest steps: - uses: actions/checkout@v6.0.2 - name: Install packages run: | pip install meson==0.52.0 - uses: ilammy/msvc-dev-cmd@v1 - name: Build Windows run: | meson setup build cd build ninja meson test Ubuntu-cmake: strategy: matrix: runner: [ ubuntu-latest ] runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v6.0.2 - name: Install packages run: sudo apt-get -y install build-essential cmake ninja-build - name: Configure run: | cmake -B build \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DLCMS2_WITH_FASTFLOAT=ON \ -DLCMS2_WITH_THREADS=ON \ -DLCMS2_BUILD_TESTS=ON - name: Build run: cmake --build build --parallel - name: Run tests run: ctest --test-dir build --output-on-failure macOS-cmake: strategy: matrix: runner: [ macos-14, macos-latest ] runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v6.0.2 - name: Configure run: | cmake -B build \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DLCMS2_WITH_FASTFLOAT=ON \ -DLCMS2_WITH_THREADS=ON \ -DLCMS2_BUILD_TESTS=ON - name: Build run: cmake --build build --parallel - name: Run tests run: ctest --test-dir build --output-on-failure Windows-cmake: strategy: matrix: include: - arch: Win32 runner: windows-latest - arch: x64 runner: windows-latest # - arch: ARM64 # runner: windows-11-arm runs-on: ${{ matrix.runner }} steps: - name: Checkout Repository uses: actions/checkout@v6.0.2 - name: Configure run: | cmake -B build -A ${{ matrix.arch }} ` -DLCMS2_WITH_FASTFLOAT=ON ` -DLCMS2_WITH_THREADS=ON ` -DLCMS2_BUILD_TESTS=ON - name: Build run: cmake --build build --config Release --parallel - name: Run tests run: ctest --test-dir build -C Release --output-on-failure MSYS2-cmake: strategy: matrix: sys: [ MINGW64, UCRT64 ] runs-on: windows-latest defaults: run: shell: msys2 {0} steps: - uses: actions/checkout@v6.0.2 - uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.sys }} update: true pacboy: cmake:p gcc:p ninja:p - name: Configure run: | cmake -B build \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DLCMS2_WITH_FASTFLOAT=ON \ -DLCMS2_WITH_THREADS=ON \ -DLCMS2_BUILD_TESTS=ON - name: Build run: cmake --build build --parallel - name: Run tests run: ctest --test-dir build --output-on-failure Cygwin-cmake: runs-on: windows-latest env: CHERE_INVOKING: "1" defaults: run: shell: C:\cygwin64\bin\bash.exe --login -eo pipefail -o igncr '{0}' steps: - uses: actions/checkout@v6.0.2 - uses: cygwin/cygwin-install-action@v6 with: install-dir: 'C:\cygwin64' packages: cmake ninja gcc-core gcc-g++ - name: Configure run: | cmake -B build \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DLCMS2_WITH_FASTFLOAT=ON \ -DLCMS2_WITH_THREADS=ON \ -DLCMS2_BUILD_TESTS=ON - name: Build run: cmake --build build --parallel - name: Run tests run: ctest --test-dir build --output-on-failure lcms2-2.19.1/.github/workflows/codeql-analysis.yml0000644000175000017500000000513015176573557021072 0ustar martimarti# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. name: "CodeQL" on: push: branches: [master] pull_request: # The branches below must be a subset of the branches above branches: [master] schedule: - cron: '0 6 * * 5' permissions: read-all jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read # for github/codeql-action/init to get workflow details contents: read # for actions/checkout to fetch code security-events: write # for github/codeql-action/autobuild to send a status report strategy: fail-fast: false matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] language: ['cpp'] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection steps: - name: Checkout repository uses: actions/checkout@v6.0.2 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. fetch-depth: 2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v4.35.1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v4.35.1 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project # uses a compiled language #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4.35.1 lcms2-2.19.1/.github/workflows/scorecard.yml0000644000175000017500000000376515176573557017763 0ustar martimartiname: Scorecard supply-chain security on: # For Branch-Protection check. Only the default branch is supported. See # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection branch_protection_rule: # To guarantee Maintained check is occasionally updated. See # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained schedule: - cron: '38 3 * * 5' push: branches: [ "master" ] # Declare default permissions as read only. permissions: read-all jobs: analysis: name: Scorecard analysis runs-on: ubuntu-latest permissions: # Needed to upload the results to code-scanning dashboard. security-events: write # Needed to publish results and get a badge (see publish_results below). id-token: write steps: - name: "Checkout code" uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v4.1.1 with: persist-credentials: false - name: "Run analysis" uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 with: results_file: results.sarif results_format: sarif # Publish results to OpenSSF REST API for easy access by consumers and allows the repository to include the Scorecard badge. # See https://github.com/ossf/scorecard-action#publishing-results publish_results: true # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: SARIF file path: results.sarif retention-days: 5 # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" uses: github/codeql-action/upload-sarif@b623f5fd572a69d335c9da3487c1ce53741a09bf # v2.24.0 with: sarif_file: results.sarif lcms2-2.19.1/INSTALL0000644000175000017500000000005515176573557012714 0ustar martimarti Please see the documentation in doc folder lcms2-2.19.1/LICENSE0000644000175000017500000000207015176573557012667 0ustar martimartiMIT License Copyright (c) 2023 Marti Maria Saguer 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. lcms2-2.19.1/Lib/0000755000175000017500000000000015176573557012371 5ustar martimartilcms2-2.19.1/Lib/BC/0000755000175000017500000000000015176573557012655 5ustar martimartilcms2-2.19.1/Lib/BC/BC.txt0000644000175000017500000000000215176573557013672 0ustar martimartiBClcms2-2.19.1/Lib/MS/0000755000175000017500000000000015176573557012710 5ustar martimartilcms2-2.19.1/Lib/MS/MS.TXT0000644000175000017500000000000215176573557013620 0ustar martimartiMSlcms2-2.19.1/Projects/0000755000175000017500000000000015176573557013454 5ustar martimartilcms2-2.19.1/Projects/.gitignore0000644000175000017500000000015315176573557015443 0ustar martimarti# Visual Studio **.opensdf **.sdf **.suo **.user Debug/ Release/ # Xcode & macOS xcuserdata/ .DS_Store ._* lcms2-2.19.1/Projects/BorlandC_5.5/0000755000175000017500000000000015176573557015527 5ustar martimartilcms2-2.19.1/Projects/BorlandC_5.5/lcmsdll.lk0000644000175000017500000000065115176573557017513 0ustar martimarti/x/aa/c/Tpd C0D32.OBJ+ cmsalpha.obj+ cmscam02.obj+ cmscgats.obj+ cmscnvrt.obj+ cmserr.obj+ cmsgamma.obj+ cmsgmt.obj+ cmshalf.obj+ cmsintrp.obj+ cmsio0.obj+ cmsio1.obj+ cmslut.obj+ cmsmd5.obj+ cmsmtrx.obj+ cmsnamed.obj+ cmsopt.obj+ cmspack.obj+ cmspcs.obj+ cmsplugin.obj+ cmsps2.obj+ cmssamp.obj+ cmssm.obj+ cmstypes.obj+ cmsvirt.obj+ cmswtpnt.obj+ cmsxform.obj ..\..\bin\lcms2.dll cw32mt.lib import32.lib ..\..\src\lcms2.deflcms2-2.19.1/Projects/BorlandC_5.5/lcmsdll.lst0000644000175000017500000000122615176573557017706 0ustar martimarti-5 -C -DCMS_DLL -DCMS_DLL_BUILD -I..\..\include -K -O2 -a8 -d -ff -w -wucp -wsig -wdef -wnod -wamb -OS -RT- -R- -tWM -tWD -w- -x- -c ..\..\src\cmscam02.c ..\..\src\cmscgats.c ..\..\src\cmscnvrt.c ..\..\src\cmserr.c ..\..\src\cmsgamma.c ..\..\src\cmsgmt.c ..\..\src\cmsintrp.c ..\..\src\cmsio0.c ..\..\src\cmsio1.c ..\..\src\cmslut.c ..\..\src\cmsmd5.c ..\..\src\cmsmtrx.c ..\..\src\cmsnamed.c ..\..\src\cmsopt.c ..\..\src\cmspack.c ..\..\src\cmspcs.c ..\..\src\cmsplugin.c ..\..\src\cmsps2.c ..\..\src\cmssamp.c ..\..\src\cmssm.c ..\..\src\cmstypes.c ..\..\src\cmsvirt.c ..\..\src\cmswtpnt.c ..\..\src\cmsxform.c ..\..\src\cmshalf.c ..\..\src\cmsalpha.clcms2-2.19.1/Projects/BorlandC_5.5/mklcmsdll.bat0000644000175000017500000000043415176573557020202 0ustar martimarti@echo off echo. echo This will build the littlecms DLL using Borland C 5.5 compiler. echo. echo Press Ctrl-C to abort, or pause bcc32 @lcmsdll.lst if errorlevel 0 ilink32 @lcmsdll.lk if errorlevel 0 brc32 -fe ..\..\bin\lcms2.dll lcms2.rc del *.obj del *.res echo Done! lcms2-2.19.1/Projects/BorlandC_5.5/lcms2.rc0000644000175000017500000000101215176573557017067 0ustar martimarti 1 VERSIONINFO FILEVERSION 2, 17, 0, 0 PRODUCTVERSION 2, 17, 0, 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL { BLOCK "StringFileInfo" { BLOCK "040904E4" { VALUE "CompanyName", "Marti Maria\000\000" VALUE "FileDescription", "lcms color engine\000" VALUE "FileVersion", "2.17\000\000" VALUE "InternalName", "lcms2\000" VALUE "LegalCopyright", "Copyright © Marti Maria 2024\000\000" VALUE "OriginalFilename", "lcms2.dll\000" } } BLOCK "VarFileInfo" { VALUE "Translation", 0x409, 1252 } } lcms2-2.19.1/Projects/Qt/0000755000175000017500000000000015176573557014040 5ustar martimartilcms2-2.19.1/Projects/Qt/lcms2/0000755000175000017500000000000015176573557015060 5ustar martimartilcms2-2.19.1/Projects/Qt/lcms2/lcms2.pro0000644000175000017500000000251215176573557016622 0ustar martimartiQT -= gui TEMPLATE = lib CONFIG += staticlib CONFIG += c++17 # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 INCLUDEPATH += ../../../include ../../../src HEADERS += \ ../../../include/lcms2.h \ ../../../include/lcms2_plugin.h \ ../../../src/lcms2_internal.h SOURCES += \ ../../../src/cmsalpha.c \ ../../../src/cmscam02.c \ ../../../src/cmscgats.c \ ../../../src/cmscnvrt.c \ ../../../src/cmserr.c \ ../../../src/cmsgamma.c \ ../../../src/cmsgmt.c \ ../../../src/cmshalf.c \ ../../../src/cmsintrp.c \ ../../../src/cmsio0.c \ ../../../src/cmsio1.c \ ../../../src/cmslut.c \ ../../../src/cmsmd5.c \ ../../../src/cmsmtrx.c \ ../../../src/cmsnamed.c \ ../../../src/cmsopt.c \ ../../../src/cmspack.c \ ../../../src/cmspcs.c \ ../../../src/cmsplugin.c \ ../../../src/cmsps2.c \ ../../../src/cmssamp.c \ ../../../src/cmssm.c \ ../../../src/cmstypes.c \ ../../../src/cmsvirt.c \ ../../../src/cmswtpnt.c \ ../../../src/cmsxform.c # Default rules for deployment. unix { target.path = $$[QT_INSTALL_PLUGINS]/generic } !isEmpty(target.path): INSTALLS += target lcms2-2.19.1/Projects/VC2019/0000755000175000017500000000000015176573557014300 5ustar martimartilcms2-2.19.1/Projects/VC2019/jpegicc/0000755000175000017500000000000015176573557015704 5ustar martimartilcms2-2.19.1/Projects/VC2019/jpegicc/jpegicc.vcxproj0000644000175000017500000004462615176573557020741 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {62812507-F926-4968-96A9-17678460AD90} jpegicc Win32Proj 10.0 Application Unicode true v142 Application Unicode true v142 Application Unicode true v142 Application Unicode v142 Application Unicode v142 Application Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ $(Configuration)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ $(Configuration)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true libjpeg.lib;%(AdditionalDependencies) true Console false Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true false libjpeg.lib;%(AdditionalDependencies) true Console true true MachineX86 false true Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true false libjpeg.lib;%(AdditionalDependencies) true Console true true false true Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true libjpeg.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2019/jpegicc/jpegicc.vcxproj.filters0000644000175000017500000000236715176573557022404 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2019/lcms2.sln0000644000175000017500000006500015176573557016037 0ustar martimarti Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30011.22 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcxproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcxproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcxproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcxproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcxproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcxproj", "{62812507-F926-4968-96A9-17678460AD90}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcxproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcxproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcxproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin", "..\..\plugins\fast_float\Projects\VC2019\lcms2_fast_float_plugin.vcxproj", "{AD9FF79B-CF6E-4971-A7CF-DAA47D636676}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin_testbed", "..\..\plugins\fast_float\Projects\VC2019\lcms2_fast_float_plugin_testbed.vcxproj", "{7629D670-C419-402B-8A90-747952EE9FC0}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plugins", "plugins", "{8349DD7F-F750-4910-A5A5-0628223BD3EB}" ProjectSection(SolutionItems) = preProject ..\..\plugins\README.1ST = ..\..\plugins\README.1ST EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fast_float", "fast_float", "{1696CDC1-F411-4F84-BC94-C63FEB867D06}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.Build.0 = Debug|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.Build.0 = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.ActiveCfg = Release|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.Build.0 = Release|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.Build.0 = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.Build.0 = Debug|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.Build.0 = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.ActiveCfg = Release|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.Build.0 = Release|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.Build.0 = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.Build.0 = Debug|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.Build.0 = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.ActiveCfg = Release|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.Build.0 = Release|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.Build.0 = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.Build.0 = Debug|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.Build.0 = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.ActiveCfg = Release|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.Build.0 = Release|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.Build.0 = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.Build.0 = Debug|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.Build.0 = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.ActiveCfg = Release|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.Build.0 = Release|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.ActiveCfg = Debug|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.Build.0 = Debug|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.Build.0 = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.ActiveCfg = Release|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.Build.0 = Release|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Deploy.0 = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.Build.0 = Debug|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.Build.0 = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.ActiveCfg = Release|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.Build.0 = Release|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.Build.0 = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.Build.0 = Debug|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.Build.0 = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.ActiveCfg = Release|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.Build.0 = Release|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.Build.0 = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.ActiveCfg = Debug|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.Build.0 = Debug|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.Build.0 = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.ActiveCfg = Release|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.Build.0 = Release|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.Build.0 = Release|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.ActiveCfg = Debug|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.Build.0 = Debug|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.ActiveCfg = Debug|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.Build.0 = Debug|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.ActiveCfg = Debug|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.Build.0 = Debug|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.ActiveCfg = Release|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.Build.0 = Release|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.ActiveCfg = Release|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.Build.0 = Release|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.ActiveCfg = Release|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.Build.0 = Release|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.Build.0 = Debug|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.ActiveCfg = Debug|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.Build.0 = Debug|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.ActiveCfg = Debug|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.Build.0 = Debug|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.ActiveCfg = Release|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.Build.0 = Release|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.ActiveCfg = Release|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.Build.0 = Release|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.ActiveCfg = Release|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} {7629D670-C419-402B-8A90-747952EE9FC0} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} {1696CDC1-F411-4F84-BC94-C63FEB867D06} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E95EA102-6884-4CAD-AF6D-9BF36C69A33D} QtVersion = $(DefaultQtVersion) EndGlobalSection EndGlobal lcms2-2.19.1/Projects/VC2019/lcms2_DLL/0000755000175000017500000000000015176573557016013 5ustar martimartilcms2-2.19.1/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj0000644000175000017500000004607715176573557021161 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} lcms2_DLL Win32Proj 10.0 DynamicLibrary Unicode true v142 DynamicLibrary Unicode true v142 DynamicLibrary Unicode true v142 DynamicLibrary Unicode v142 DynamicLibrary Unicode v142 DynamicLibrary Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset lcms2 lcms2 lcms2 lcms2 lcms2 lcms2 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 true false ..\..\..\src\lcms2.def true Windows MachineX86 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 true false ..\..\..\src\lcms2.def true Windows Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 true false true Windows $(OutDir)$(TargetName)$(TargetExt) Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true ..\..\..\src\lcms2.def true Windows true true MachineX86 true Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true ..\..\..\src\lcms2.def true Windows true true true Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true true Windows true true true true lcms2-2.19.1/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj.filters0000644000175000017500000001015115176573557022610 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files Resource Files Resource Files Source Files lcms2-2.19.1/Projects/VC2019/lcms2_static/0000755000175000017500000000000015176573557016667 5ustar martimartilcms2-2.19.1/Projects/VC2019/lcms2_static/lcms2_static.vcxproj0000644000175000017500000004026415176573557022701 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {71DEDE59-3F1E-486B-A899-4283000F76B5} lcms2_static Win32Proj 10.0 StaticLibrary Unicode true v142 StaticLibrary Unicode true v142 StaticLibrary Unicode true v142 StaticLibrary Unicode v142 StaticLibrary Unicode v142 StaticLibrary Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks Level4 EditAndContinue true MultiThreadedDebugDLL Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks Level4 EditAndContinue true MultiThreadedDebugDLL Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true Default MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true false OnlyExplicitInline false true Precise false false false true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true false OnlyExplicitInline false true Precise false false false true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true true OnlyExplicitInline false true true true lcms2-2.19.1/Projects/VC2019/lcms2_static/lcms2_static.vcxproj.filters0000644000175000017500000000737515176573557024356 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files lcms2-2.19.1/Projects/VC2019/linkicc/0000755000175000017500000000000015176573557015714 5ustar martimartilcms2-2.19.1/Projects/VC2019/linkicc/linkicc.vcxproj0000644000175000017500000003672715176573557020764 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849} linkicc Win32Proj 10.0 Application Unicode true v142 Application Unicode true v142 Application Unicode true v142 Application Unicode v142 Application Unicode v142 Application Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true false MultiThreaded true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true false MultiThreaded true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true MultiThreaded true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2019/linkicc/linkicc.vcxproj.filters0000644000175000017500000000221215176573557022411 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2019/psicc/0000755000175000017500000000000015176573557015401 5ustar martimartilcms2-2.19.1/Projects/VC2019/psicc/psicc.vcxproj0000644000175000017500000003673615176573557020136 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693} psicc Win32Proj 10.0 Application Unicode true v142 Application Unicode true v142 Application Unicode true v142 Application Unicode v142 Application Unicode v142 Application Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true false true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true false true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2019/psicc/psicc.vcxproj.filters0000644000175000017500000000220615176573557021566 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2019/resource.h0000644000175000017500000000065615176573557016307 0ustar martimarti//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by lcms2.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif lcms2-2.19.1/Projects/VC2019/testbed/0000755000175000017500000000000015176573557015732 5ustar martimartilcms2-2.19.1/Projects/VC2019/testbed/testbed.vcxproj0000644000175000017500000004124515176573557021007 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {928A3A2B-46EF-4279-959C-513B3652FF0E} testbed Win32Proj 10.0 Application Unicode true v142 Application Unicode true v142 Application Unicode true v142 Application Unicode v142 Application Unicode v142 Application Unicode v142 <_ProjectFileVersion>10.0.21006.1 $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\testbed\ ..\..\..\testbed\ ..\..\..\testbed\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset ..\..\..\testbed\ ..\..\..\testbed\ ..\..\..\testbed\ Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console MachineX86 false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase true true Console false Full true Speed true false ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true false true Console true true MachineX86 false true Full true Speed true false ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true false true Console true true false true Full true Speed true true ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded false true NotSet Level3 ProgramDatabase Cdecl true true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2019/testbed/testbed.vcxproj.filters0000644000175000017500000000220115176573557022443 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2019/tiffdiff/0000755000175000017500000000000015176573557016061 5ustar martimartilcms2-2.19.1/Projects/VC2019/tiffdiff/tiffdiff.vcxproj0000644000175000017500000004504715176573557021271 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE} tiffdiff Win32Proj 10.0 Application Unicode true v142 Application Unicode true v142 Application Unicode true v142 Application Unicode v142 Application Unicode v142 Application Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 $(OutDir)$(TargetName)$(TargetExt) false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2019/tiffdiff/tiffdiff.vcxproj.filters0000644000175000017500000000221115176573557022722 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2019/tifficc/0000755000175000017500000000000015176573557015707 5ustar martimartilcms2-2.19.1/Projects/VC2019/tifficc/tifficc.vcxproj0000644000175000017500000004446515176573557020750 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} tifficc Win32Proj 10.0 Application Unicode true v142 Application Unicode true v142 Application Unicode true v142 Application Unicode v142 Application Unicode v142 Application Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2019/tifficc/tifficc.vcxproj.filters0000644000175000017500000000242215176573557022402 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.19.1/Projects/VC2019/transicc/0000755000175000017500000000000015176573557016106 5ustar martimartilcms2-2.19.1/Projects/VC2019/transicc/transicc.vcxproj0000644000175000017500000003730515176573557021341 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160} transicc Win32Proj 10.0 Application Unicode true v142 Application Unicode true v142 Application Unicode true v142 Application Unicode v142 Application Unicode v142 Application Unicode v142 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2019/transicc/transicc.vcxproj.filters0000644000175000017500000000242615176573557023004 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.19.1/Projects/VC2019/lcms2.rc0000644000175000017500000000452615176573557015655 0ustar martimarti// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Spanish (Spain, International Sort) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// // // Version // 1 VERSIONINFO FILEVERSION 2,17,0,0 PRODUCTVERSION 2,17,0,0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "lcms color engine" VALUE "FileVersion", "2.17.0.0" VALUE "InternalName", "lcms2" VALUE "LegalCopyright", "Copyright © Marti Maria 2025" VALUE "OriginalFilename", "lcms2.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", "2.17.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Spanish (Spain, International Sort) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED lcms2-2.19.1/Projects/VC2022/0000755000175000017500000000000015176573557014272 5ustar martimartilcms2-2.19.1/Projects/VC2022/jpegicc/0000755000175000017500000000000015176573557015676 5ustar martimartilcms2-2.19.1/Projects/VC2022/jpegicc/jpegicc.vcxproj.filters0000644000175000017500000000236715176573557022376 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2022/jpegicc/jpegicc.vcxproj0000644000175000017500000004425415176573557020730 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {62812507-F926-4968-96A9-17678460AD90} jpegicc Win32Proj 10.0 Application Unicode true v143 Application Unicode true v143 Application Unicode true v143 Application Unicode v143 Application Unicode v143 Application Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true libjpeg.lib;%(AdditionalDependencies) true Console false Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true false libjpeg.lib;%(AdditionalDependencies) true Console true true MachineX86 false true Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true false libjpeg.lib;%(AdditionalDependencies) true Console true true false true Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true libjpeg.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2022/lcms2_DLL/0000755000175000017500000000000015176573557016005 5ustar martimartilcms2-2.19.1/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj0000644000175000017500000004534715176573557021152 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} lcms2_DLL Win32Proj 10.0 DynamicLibrary Unicode true v143 DynamicLibrary Unicode true v143 DynamicLibrary Unicode true v143 DynamicLibrary Unicode v143 DynamicLibrary Unicode v143 DynamicLibrary Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset lcms2 lcms2 lcms2 lcms2 lcms2 lcms2 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 true false ..\..\..\src\lcms2.def true Windows MachineX86 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 true false ..\..\..\src\lcms2.def true Windows Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 true false true Windows $(OutDir)$(TargetName)$(TargetExt) Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true ..\..\..\src\lcms2.def true Windows true true MachineX86 true Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true ..\..\..\src\lcms2.def true Windows true true true Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true true Windows true true true true lcms2-2.19.1/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj.filters0000644000175000017500000001015115176573557022602 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files Resource Files Resource Files Source Files lcms2-2.19.1/Projects/VC2022/lcms2_static/0000755000175000017500000000000015176573557016661 5ustar martimartilcms2-2.19.1/Projects/VC2022/lcms2_static/lcms2_static.vcxproj0000644000175000017500000003762615176573557022703 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {71DEDE59-3F1E-486B-A899-4283000F76B5} lcms2_static Win32Proj 10.0 StaticLibrary Unicode true v143 StaticLibrary Unicode true v143 StaticLibrary Unicode true v143 StaticLibrary Unicode v143 StaticLibrary Unicode v143 StaticLibrary Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks Level4 EditAndContinue true MultiThreadedDebugDLL Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks Level4 EditAndContinue true MultiThreadedDebugDLL Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true Default MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true false OnlyExplicitInline false true Precise false false false true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true false OnlyExplicitInline false true Precise false false false true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true true OnlyExplicitInline false true true true lcms2-2.19.1/Projects/VC2022/lcms2_static/lcms2_static.vcxproj.filters0000644000175000017500000000737515176573557024350 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files lcms2-2.19.1/Projects/VC2022/linkicc/0000755000175000017500000000000015176573557015706 5ustar martimartilcms2-2.19.1/Projects/VC2022/linkicc/linkicc.vcxproj0000644000175000017500000003630715176573557020750 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849} linkicc Win32Proj 10.0 Application Unicode true v143 Application Unicode true v143 Application Unicode true v143 Application Unicode v143 Application Unicode v143 Application Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true false MultiThreaded true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true false MultiThreaded true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true MultiThreaded true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2022/linkicc/linkicc.vcxproj.filters0000644000175000017500000000221215176573557022403 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2022/psicc/0000755000175000017500000000000015176573557015373 5ustar martimartilcms2-2.19.1/Projects/VC2022/psicc/psicc.vcxproj0000644000175000017500000003631615176573557020122 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693} psicc Win32Proj 10.0 Application Unicode true v143 Application Unicode true v143 Application Unicode true v143 Application Unicode v143 Application Unicode v143 Application Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true false true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true false true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2022/psicc/psicc.vcxproj.filters0000644000175000017500000000220615176573557021560 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2022/resource.h0000644000175000017500000000065615176573557016301 0ustar martimarti//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by lcms2.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif lcms2-2.19.1/Projects/VC2022/testbed/0000755000175000017500000000000015176573557015724 5ustar martimartilcms2-2.19.1/Projects/VC2022/testbed/testbed.vcxproj0000644000175000017500000004060315176573557020776 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {928A3A2B-46EF-4279-959C-513B3652FF0E} testbed Win32Proj 10.0 Application Unicode true v143 Application Unicode true v143 Application Unicode true v143 Application Unicode v143 true Application Unicode v143 Application Unicode v143 false <_ProjectFileVersion>10.0.21006.1 $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\testbed\ ..\..\..\testbed\ ..\..\..\testbed\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset ..\..\..\testbed\ ..\..\..\testbed\ ..\..\..\testbed\ Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console MachineX86 false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase true true Console false Full true Speed true false ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true false true Console true true MachineX86 false true Full true Speed true false ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true false true Console true true false true Full true Speed true true ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded false true NotSet Level3 ProgramDatabase Cdecl true true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} lcms2-2.19.1/Projects/VC2022/testbed/testbed.vcxproj.filters0000644000175000017500000000220115176573557022435 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2022/tiffdiff/0000755000175000017500000000000015176573557016053 5ustar martimartilcms2-2.19.1/Projects/VC2022/tiffdiff/tiffdiff.vcxproj0000644000175000017500000004437415176573557021265 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE} tiffdiff Win32Proj 10.0 Application Unicode true v143 Application Unicode true v143 Application Unicode true v143 Application Unicode v143 Application Unicode v143 Application Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 $(OutDir)$(TargetName)$(TargetExt) false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2022/tiffdiff/tiffdiff.vcxproj.filters0000644000175000017500000000221115176573557022714 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2022/tifficc/0000755000175000017500000000000015176573557015701 5ustar martimartilcms2-2.19.1/Projects/VC2022/tifficc/tifficc.vcxproj.filters0000644000175000017500000000242215176573557022374 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.19.1/Projects/VC2022/tifficc/tifficc.vcxproj0000644000175000017500000004505015176573557020731 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} tifficc Win32Proj 10.0 Application Unicode true v143 Application Unicode true v143 Application Unicode true v143 Application Unicode v143 Application Unicode v143 Application Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)_Debug/include $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)_Debug/lib Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true tiffd.lib;jpeg-static.lib;zlibstaticd.lib;libwebp.lib;libwebpdecoder.lib;libwebpdemux.lib;libwebpmux.lib;libsharpyuv.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) true Console true true MachineX86 false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2022/transicc/0000755000175000017500000000000015176573557016100 5ustar martimartilcms2-2.19.1/Projects/VC2022/transicc/transicc.vcxproj0000644000175000017500000003666015176573557021336 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160} transicc Win32Proj 10.0 Application Unicode true v143 Application Unicode true v143 Application Unicode true v143 Application Unicode v143 Application Unicode v143 Application Unicode v143 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2022/transicc/transicc.vcxproj.filters0000644000175000017500000000242615176573557022776 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.19.1/Projects/VC2022/fuzzers/0000755000175000017500000000000015176573557016002 5ustar martimartilcms2-2.19.1/Projects/VC2022/fuzzers/fuzzers.vcxproj.filters0000644000175000017500000000171615176573557022603 0ustar martimarti {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files lcms2-2.19.1/Projects/VC2022/fuzzers/fuzzers.vcxproj0000644000175000017500000001744315176573557021140 0ustar martimarti Debug Win32 Release Win32 Debug x64 Release x64 17.0 Win32Proj {32e8c094-1d6b-4959-90ad-9a443df4ae9a} fuzzers 10.0 Application true v143 Unicode true true Application false v143 true Unicode true true Application true v143 Unicode true true Application false v143 true Unicode true true ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ Level3 true WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true Level3 true true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true true true Level3 true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true Level3 true true true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true true true {71dede59-3f1e-486b-a899-4283000f76b5} lcms2-2.19.1/Projects/VC2022/lcms2.sln0000644000175000017500000004125215176573557016034 0ustar martimarti Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.32014.148 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcxproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcxproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcxproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcxproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcxproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcxproj", "{62812507-F926-4968-96A9-17678460AD90}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcxproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcxproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcxproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plugins", "plugins", "{8349DD7F-F750-4910-A5A5-0628223BD3EB}" ProjectSection(SolutionItems) = preProject ..\..\plugins\README.1ST = ..\..\plugins\README.1ST EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fast_float", "fast_float", "{1696CDC1-F411-4F84-BC94-C63FEB867D06}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin.vcxproj", "{AD9FF79B-CF6E-4971-A7CF-DAA47D636676}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin_testbed", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin_testbed.vcxproj", "{7629D670-C419-402B-8A90-747952EE9FC0}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin", "..\..\plugins\threaded\Projects\VC2022\lcms2_threaded_plugin.vcxproj", "{6A44744B-BED4-49EC-87BB-83978458CE19}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "threaded", "threaded", "{09D18587-D927-4047-977F-49918A174D5E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin_testbed", "..\..\plugins\threaded\Projects\VC2022\lcms2_threaded_plugin_testbed.vcxproj", "{F56B9CBA-A34D-4C68-9003-A6919236399E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fuzzers", "fuzzers\fuzzers.vcxproj", "{32E8C094-1D6B-4959-90AD-9A443DF4AE9A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.Build.0 = Debug|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.Build.0 = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.ActiveCfg = Release|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.Build.0 = Release|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.Build.0 = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.Build.0 = Debug|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.Build.0 = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.ActiveCfg = Release|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.Build.0 = Release|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.Build.0 = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.Build.0 = Debug|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.Build.0 = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.ActiveCfg = Release|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.Build.0 = Release|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.Build.0 = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.Build.0 = Debug|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.Build.0 = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.ActiveCfg = Release|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.Build.0 = Release|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.Build.0 = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.Build.0 = Debug|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.Build.0 = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.ActiveCfg = Release|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.Build.0 = Release|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.ActiveCfg = Debug|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.Build.0 = Debug|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.Build.0 = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.ActiveCfg = Release|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.Build.0 = Release|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Deploy.0 = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.Build.0 = Debug|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.Build.0 = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.ActiveCfg = Release|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.Build.0 = Release|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.Build.0 = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.Build.0 = Debug|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.Build.0 = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.ActiveCfg = Release|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.Build.0 = Release|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.Build.0 = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.ActiveCfg = Debug|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.Build.0 = Debug|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.Build.0 = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.ActiveCfg = Release|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.Build.0 = Release|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.Build.0 = Release|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.ActiveCfg = Debug|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.Build.0 = Debug|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.ActiveCfg = Debug|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.Build.0 = Debug|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.ActiveCfg = Debug|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.Build.0 = Debug|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.ActiveCfg = Release|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.Build.0 = Release|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.ActiveCfg = Release|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.Build.0 = Release|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.ActiveCfg = Release|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.Build.0 = Release|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.Build.0 = Debug|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.ActiveCfg = Debug|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.Build.0 = Debug|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.ActiveCfg = Debug|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.Build.0 = Debug|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.ActiveCfg = Release|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.Build.0 = Release|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.ActiveCfg = Release|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.Build.0 = Release|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.ActiveCfg = Release|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.Build.0 = Release|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.ActiveCfg = Debug|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.Build.0 = Debug|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.Build.0 = Debug|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.ActiveCfg = Debug|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.Build.0 = Debug|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.ActiveCfg = Release|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.Build.0 = Release|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.ActiveCfg = Release|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.Build.0 = Release|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.ActiveCfg = Release|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.Build.0 = Release|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.Build.0 = Debug|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.ActiveCfg = Debug|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.Build.0 = Debug|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.ActiveCfg = Debug|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.Build.0 = Debug|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.ActiveCfg = Release|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.Build.0 = Release|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.ActiveCfg = Release|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.Build.0 = Release|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.ActiveCfg = Release|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.Build.0 = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.ActiveCfg = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.Build.0 = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.ActiveCfg = Debug|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.Build.0 = Debug|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.ActiveCfg = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.Build.0 = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.ActiveCfg = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.Build.0 = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.ActiveCfg = Release|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.Build.0 = Release|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.ActiveCfg = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {1696CDC1-F411-4F84-BC94-C63FEB867D06} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} {7629D670-C419-402B-8A90-747952EE9FC0} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} {6A44744B-BED4-49EC-87BB-83978458CE19} = {09D18587-D927-4047-977F-49918A174D5E} {09D18587-D927-4047-977F-49918A174D5E} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} {F56B9CBA-A34D-4C68-9003-A6919236399E} = {09D18587-D927-4047-977F-49918A174D5E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution QtVersion = $(DefaultQtVersion) SolutionGuid = {E95EA102-6884-4CAD-AF6D-9BF36C69A33D} EndGlobalSection EndGlobal lcms2-2.19.1/Projects/VC2022/lcms2.rc0000644000175000017500000000452615176573557015647 0ustar martimarti// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Spanish (Spain, International Sort) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// // // Version // 1 VERSIONINFO FILEVERSION 2,19,0,0 PRODUCTVERSION 2,19,0,0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "lcms color engine" VALUE "FileVersion", "2.19.0.0" VALUE "InternalName", "lcms2" VALUE "LegalCopyright", "Copyright © Marti Maria 2026" VALUE "OriginalFilename", "lcms2.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", "2.19.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Spanish (Spain, International Sort) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED lcms2-2.19.1/Projects/Xcode_12/0000755000175000017500000000000015176573557015020 5ustar martimartilcms2-2.19.1/Projects/Xcode_12/lcms2/0000755000175000017500000000000015176573557016040 5ustar martimartilcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/0000755000175000017500000000000015176573557021054 5ustar martimartilcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.pbxproj0000644000175000017500000020227215176573557024135 0ustar martimarti// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 4123B46925518DB1005F0287 /* linkicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B46825518DB1005F0287 /* linkicc.c */; }; 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4A325518FFB005F0287 /* xgetopt.c */; }; 4123B4B82551903B005F0287 /* tificc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4B72551903B005F0287 /* tificc.c */; }; 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; }; 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */; }; 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */; }; 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */; }; 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */; }; 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */; }; 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3D24C5E1C700DF2C21 /* cmssm.c */; }; 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */; }; 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */; }; 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */; }; 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4124C5E1C800DF2C21 /* cmstypes.c */; }; 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4224C5E1C800DF2C21 /* cmsio1.c */; }; 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4324C5E1C800DF2C21 /* cmspack.c */; }; 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4424C5E1C800DF2C21 /* cmsxform.c */; }; 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */; }; 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */; }; 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4724C5E1C800DF2C21 /* cmspcs.c */; }; 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4824C5E1C800DF2C21 /* cmsps2.c */; }; 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */; }; 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4A24C5E1C800DF2C21 /* cmserr.c */; }; 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4B24C5E1C800DF2C21 /* cmslut.c */; }; 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */; }; 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */; }; 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */; }; 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */; }; 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5024C5E1C900DF2C21 /* cmscam02.c */; }; 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5124C5E1C900DF2C21 /* cmssamp.c */; }; 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6D24C5E1E800DF2C21 /* lcms2.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */; }; 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */; }; 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */; }; 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */; }; 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */; }; 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */; }; 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */; }; 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */; }; 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */; }; 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */; }; 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */; }; 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */; }; 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */; }; 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */; }; 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF324C5E6C700DF2C21 /* xgetopt.c */; }; 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF424C5E6C700DF2C21 /* vprf.c */; }; 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF824C5E6D200DF2C21 /* transicc.c */; }; 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFD24C5E73100DF2C21 /* xgetopt.c */; }; 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFE24C5E73100DF2C21 /* vprf.c */; }; 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B0E24C5E79200DF2C21 /* utils.h */; }; 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B1224C5E7BB00DF2C21 /* vprf.c */; }; 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2424C5E92100DF2C21 /* tifdiff.c */; }; 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2724C5E92B00DF2C21 /* vprf.c */; }; 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2824C5E92B00DF2C21 /* xgetopt.c */; }; 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */; }; 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3924C5E99600DF2C21 /* jpgicc.c */; }; 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3E24C5E9F700DF2C21 /* vprf.c */; }; 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */; }; 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4324C5EC1D00DF2C21 /* testcms2.c */; }; 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4524C5EC1D00DF2C21 /* testplugin.c */; }; 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A8E24C5E35200DF2C21; remoteInfo = fast_float_plugin; }; 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 418B0A7624C5E25200DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0AB624C5E42900DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0AC924C5E4EA00DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0ADF24C5E5C300DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B0324C5E76100DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B1824C5E85600DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B2D24C5E95D00DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 4123B46825518DB1005F0287 /* linkicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linkicc.c; sourceTree = ""; }; 4123B4A325518FFB005F0287 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; 4123B4B72551903B005F0287 /* tificc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tificc.c; sourceTree = ""; }; 4123B4C2255190FE005F0287 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tifdiff.c; sourceTree = ""; }; 418B0A3124C5E19500DF2C21 /* liblcms2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblcms2.a; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgamma.c; path = ../../../src/cmsgamma.c; sourceTree = ""; }; 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsintrp.c; path = ../../../src/cmsintrp.c; sourceTree = ""; }; 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgmt.c; path = ../../../src/cmsgmt.c; sourceTree = ""; }; 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscnvrt.c; path = ../../../src/cmscnvrt.c; sourceTree = ""; }; 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmd5.c; path = ../../../src/cmsmd5.c; sourceTree = ""; }; 418B0A3D24C5E1C700DF2C21 /* cmssm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssm.c; path = ../../../src/cmssm.c; sourceTree = ""; }; 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsopt.c; path = ../../../src/cmsopt.c; sourceTree = ""; }; 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscgats.c; path = ../../../src/cmscgats.c; sourceTree = ""; }; 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsalpha.c; path = ../../../src/cmsalpha.c; sourceTree = ""; }; 418B0A4124C5E1C800DF2C21 /* cmstypes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmstypes.c; path = ../../../src/cmstypes.c; sourceTree = ""; }; 418B0A4224C5E1C800DF2C21 /* cmsio1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio1.c; path = ../../../src/cmsio1.c; sourceTree = ""; }; 418B0A4324C5E1C800DF2C21 /* cmspack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspack.c; path = ../../../src/cmspack.c; sourceTree = ""; }; 418B0A4424C5E1C800DF2C21 /* cmsxform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsxform.c; path = ../../../src/cmsxform.c; sourceTree = ""; }; 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmswtpnt.c; path = ../../../src/cmswtpnt.c; sourceTree = ""; }; 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmtrx.c; path = ../../../src/cmsmtrx.c; sourceTree = ""; }; 418B0A4724C5E1C800DF2C21 /* cmspcs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspcs.c; path = ../../../src/cmspcs.c; sourceTree = ""; }; 418B0A4824C5E1C800DF2C21 /* cmsps2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsps2.c; path = ../../../src/cmsps2.c; sourceTree = ""; }; 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsnamed.c; path = ../../../src/cmsnamed.c; sourceTree = ""; }; 418B0A4A24C5E1C800DF2C21 /* cmserr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmserr.c; path = ../../../src/cmserr.c; sourceTree = ""; }; 418B0A4B24C5E1C800DF2C21 /* cmslut.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmslut.c; path = ../../../src/cmslut.c; sourceTree = ""; }; 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsvirt.c; path = ../../../src/cmsvirt.c; sourceTree = ""; }; 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsplugin.c; path = ../../../src/cmsplugin.c; sourceTree = ""; }; 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmshalf.c; path = ../../../src/cmshalf.c; sourceTree = ""; }; 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio0.c; path = ../../../src/cmsio0.c; sourceTree = ""; }; 418B0A5024C5E1C900DF2C21 /* cmscam02.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscam02.c; path = ../../../src/cmscam02.c; sourceTree = ""; }; 418B0A5124C5E1C900DF2C21 /* cmssamp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssamp.c; path = ../../../src/cmssamp.c; sourceTree = ""; }; 418B0A6D24C5E1E800DF2C21 /* lcms2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2.h; path = ../../../include/lcms2.h; sourceTree = ""; }; 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_plugin.h; path = ../../../include/lcms2_plugin.h; sourceTree = ""; }; 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_internal.h; path = ../../../src/lcms2_internal.h; sourceTree = ""; }; 418B0A7824C5E25200DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfast_float_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_curves.c; path = ../../../plugins/fast_float/src/fast_float_curves.c; sourceTree = ""; }; 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15mats.c; path = ../../../plugins/fast_float/src/fast_float_15mats.c; sourceTree = ""; }; 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_tethra.c; path = ../../../plugins/fast_float/src/fast_float_tethra.c; sourceTree = ""; }; 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_cmyk.c; path = ../../../plugins/fast_float/src/fast_float_cmyk.c; sourceTree = ""; }; 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_16_tethra.c; path = ../../../plugins/fast_float/src/fast_16_tethra.c; sourceTree = ""; }; 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fast_float_internal.h; path = ../../../plugins/fast_float/src/fast_float_internal.h; sourceTree = ""; }; 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh.c; path = ../../../plugins/fast_float/src/fast_8_matsh.c; sourceTree = ""; }; 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_separate.c; path = ../../../plugins/fast_float/src/fast_float_separate.c; sourceTree = ""; }; 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh_sse.c; path = ../../../plugins/fast_float/src/fast_8_matsh_sse.c; sourceTree = ""; }; 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_tethra.c; path = ../../../plugins/fast_float/src/fast_8_tethra.c; sourceTree = ""; }; 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_sup.c; path = ../../../plugins/fast_float/src/fast_float_sup.c; sourceTree = ""; }; 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15bits.c; path = ../../../plugins/fast_float/src/fast_float_15bits.c; sourceTree = ""; }; 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_curves.c; path = ../../../plugins/fast_float/src/fast_8_curves.c; sourceTree = ""; }; 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_matsh.c; path = ../../../plugins/fast_float/src/fast_float_matsh.c; sourceTree = ""; }; 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_fast_float.h; path = ../../../plugins/fast_float/include/lcms2_fast_float.h; sourceTree = ""; }; 418B0AB824C5E42900DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; name = testbed; path = fast_float_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0ACB24C5E4EA00DF2C21 /* transicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0AE124C5E5C300DF2C21 /* linkicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = linkicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fast_float_testbed.c; path = ../../../plugins/fast_float/testbed/fast_float_testbed.c; sourceTree = SOURCE_ROOT; }; 418B0AF324C5E6C700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0AF424C5E6C700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0AF524C5E6C800DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0AF824C5E6D200DF2C21 /* transicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transicc.c; path = ../../../utils/transicc/transicc.c; sourceTree = SOURCE_ROOT; }; 418B0AFC24C5E73100DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0AFD24C5E73100DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0AFE24C5E73100DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B0524C5E76100DF2C21 /* tificc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tificc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B0E24C5E79200DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0B1224C5E7BB00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B1A24C5E85600DF2C21 /* tifdiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tifdiff; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B2424C5E92100DF2C21 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tifdiff.c; path = ../../../utils/tificc/tifdiff.c; sourceTree = SOURCE_ROOT; }; 418B0B2724C5E92B00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../common/vprf.c; sourceTree = ""; }; 418B0B2824C5E92B00DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; 418B0B2F24C5E95D00DF2C21 /* jpegicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jpegicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iccjpeg.c; path = ../../../utils/jpgicc/iccjpeg.c; sourceTree = SOURCE_ROOT; }; 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iccjpeg.h; path = ../../../utils/jpgicc/iccjpeg.h; sourceTree = SOURCE_ROOT; }; 418B0B3924C5E99600DF2C21 /* jpgicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jpgicc.c; sourceTree = ""; }; 418B0B3E24C5E9F700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0B4024C5E9F700DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0B4324C5EC1D00DF2C21 /* testcms2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcms2.c; path = ../../../testbed/testcms2.c; sourceTree = SOURCE_ROOT; }; 418B0B4424C5EC1D00DF2C21 /* testcms2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = testcms2.h; path = ../../../testbed/testcms2.h; sourceTree = SOURCE_ROOT; }; 418B0B4524C5EC1D00DF2C21 /* testplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testplugin.c; path = ../../../testbed/testplugin.c; sourceTree = ""; }; 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zoo_icc.c; path = ../../../testbed/zoo_icc.c; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 418B0A2F24C5E19500DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A7524C5E25200DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8D24C5E35200DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AB524C5E42900DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */, 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AC824C5E4EA00DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0ADE24C5E5C300DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B0224C5E76100DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B1724C5E85600DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B2C24C5E95D00DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 418B0A2824C5E19500DF2C21 = { isa = PBXGroup; children = ( 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */, 418B0A7324C5E1FE00DF2C21 /* include */, 418B0A6C24C5E1CE00DF2C21 /* src */, 418B0A7924C5E25200DF2C21 /* testbed */, 418B0AB924C5E42900DF2C21 /* fast_float_testbed */, 418B0ACC24C5E4EA00DF2C21 /* transicc */, 418B0AE224C5E5C300DF2C21 /* linkicc */, 418B0B0624C5E76100DF2C21 /* tificc */, 418B0B1B24C5E85600DF2C21 /* tifdiff */, 418B0B3024C5E95D00DF2C21 /* jpegicc */, 418B0A3224C5E19500DF2C21 /* Products */, 418B0A8924C5E30000DF2C21 /* Frameworks */, ); sourceTree = ""; }; 418B0A3224C5E19500DF2C21 /* Products */ = { isa = PBXGroup; children = ( 418B0A3124C5E19500DF2C21 /* liblcms2.a */, 418B0A7824C5E25200DF2C21 /* testbed */, 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */, 418B0AB824C5E42900DF2C21 /* testbed */, 418B0ACB24C5E4EA00DF2C21 /* transicc */, 418B0AE124C5E5C300DF2C21 /* linkicc */, 418B0B0524C5E76100DF2C21 /* tificc */, 418B0B1A24C5E85600DF2C21 /* tifdiff */, 418B0B2F24C5E95D00DF2C21 /* jpegicc */, ); name = Products; sourceTree = ""; }; 418B0A6C24C5E1CE00DF2C21 /* src */ = { isa = PBXGroup; children = ( 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */, 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */, 418B0A5024C5E1C900DF2C21 /* cmscam02.c */, 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */, 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */, 418B0A4A24C5E1C800DF2C21 /* cmserr.c */, 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */, 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */, 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */, 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */, 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */, 418B0A4224C5E1C800DF2C21 /* cmsio1.c */, 418B0A4B24C5E1C800DF2C21 /* cmslut.c */, 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */, 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */, 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */, 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */, 418B0A4324C5E1C800DF2C21 /* cmspack.c */, 418B0A4724C5E1C800DF2C21 /* cmspcs.c */, 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */, 418B0A4824C5E1C800DF2C21 /* cmsps2.c */, 418B0A5124C5E1C900DF2C21 /* cmssamp.c */, 418B0A3D24C5E1C700DF2C21 /* cmssm.c */, 418B0A4124C5E1C800DF2C21 /* cmstypes.c */, 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */, 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */, 418B0A4424C5E1C800DF2C21 /* cmsxform.c */, ); name = src; sourceTree = ""; }; 418B0A7324C5E1FE00DF2C21 /* include */ = { isa = PBXGroup; children = ( 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */, 418B0A6D24C5E1E800DF2C21 /* lcms2.h */, ); name = include; sourceTree = ""; }; 418B0A7924C5E25200DF2C21 /* testbed */ = { isa = PBXGroup; children = ( 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */, 418B0B4324C5EC1D00DF2C21 /* testcms2.c */, 418B0B4424C5EC1D00DF2C21 /* testcms2.h */, 418B0B4524C5EC1D00DF2C21 /* testplugin.c */, ); name = testbed; sourceTree = SOURCE_ROOT; }; 418B0A8924C5E30000DF2C21 /* Frameworks */ = { isa = PBXGroup; children = ( ); name = Frameworks; sourceTree = ""; }; 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */ = { isa = PBXGroup; children = ( 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */, 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */, 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */, 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */, 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */, 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */, 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */, 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */, 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */, 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */, 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */, 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */, 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */, 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */, 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */, ); name = fast_float_plugin; sourceTree = ""; }; 418B0AB924C5E42900DF2C21 /* fast_float_testbed */ = { isa = PBXGroup; children = ( 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */, ); name = fast_float_testbed; path = ../../../plugins/fast_float/testbed; sourceTree = ""; }; 418B0ACC24C5E4EA00DF2C21 /* transicc */ = { isa = PBXGroup; children = ( 418B0AF824C5E6D200DF2C21 /* transicc.c */, 418B0AF524C5E6C800DF2C21 /* utils.h */, 418B0AF424C5E6C700DF2C21 /* vprf.c */, 418B0AF324C5E6C700DF2C21 /* xgetopt.c */, ); name = transicc; sourceTree = SOURCE_ROOT; }; 418B0AE224C5E5C300DF2C21 /* linkicc */ = { isa = PBXGroup; children = ( 4123B46825518DB1005F0287 /* linkicc.c */, 418B0AFC24C5E73100DF2C21 /* utils.h */, 418B0AFE24C5E73100DF2C21 /* vprf.c */, 418B0AFD24C5E73100DF2C21 /* xgetopt.c */, ); name = linkicc; path = ../../../utils/linkicc; sourceTree = SOURCE_ROOT; }; 418B0B0624C5E76100DF2C21 /* tificc */ = { isa = PBXGroup; children = ( 4123B4B72551903B005F0287 /* tificc.c */, 4123B4A325518FFB005F0287 /* xgetopt.c */, 418B0B1224C5E7BB00DF2C21 /* vprf.c */, 418B0B0E24C5E79200DF2C21 /* utils.h */, ); name = tificc; path = ../../../utils/tificc; sourceTree = SOURCE_ROOT; }; 418B0B1B24C5E85600DF2C21 /* tifdiff */ = { isa = PBXGroup; children = ( 4123B4C2255190FE005F0287 /* tifdiff.c */, 418B0B2724C5E92B00DF2C21 /* vprf.c */, 418B0B2824C5E92B00DF2C21 /* xgetopt.c */, 418B0B2424C5E92100DF2C21 /* tifdiff.c */, ); name = tifdiff; path = ../../../utils/tificc; sourceTree = SOURCE_ROOT; }; 418B0B3024C5E95D00DF2C21 /* jpegicc */ = { isa = PBXGroup; children = ( 418B0B4024C5E9F700DF2C21 /* utils.h */, 418B0B3E24C5E9F700DF2C21 /* vprf.c */, 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */, 418B0B3924C5E99600DF2C21 /* jpgicc.c */, 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */, 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */, ); name = jpegicc; path = ../../../utils/jpgicc; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 418B0A2D24C5E19500DF2C21 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */, 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */, 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8B24C5E35200DF2C21 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */, 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 418B0A3024C5E19500DF2C21 /* lcms2 */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */; buildPhases = ( 418B0A2D24C5E19500DF2C21 /* Headers */, 418B0A2E24C5E19500DF2C21 /* Sources */, 418B0A2F24C5E19500DF2C21 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = lcms2; productName = lcms2; productReference = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; productType = "com.apple.product-type.library.static"; }; 418B0A7724C5E25200DF2C21 /* testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */; buildPhases = ( 418B0A7424C5E25200DF2C21 /* Sources */, 418B0A7524C5E25200DF2C21 /* Frameworks */, 418B0A7624C5E25200DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */, ); name = testbed; productName = testbed; productReference = 418B0A7824C5E25200DF2C21 /* testbed */; productType = "com.apple.product-type.tool"; }; 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */; buildPhases = ( 418B0A8B24C5E35200DF2C21 /* Headers */, 418B0A8C24C5E35200DF2C21 /* Sources */, 418B0A8D24C5E35200DF2C21 /* Frameworks */, ); buildRules = ( ); dependencies = ( 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */, ); name = fast_float_plugin; productName = fast_float_plugin; productReference = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; productType = "com.apple.product-type.library.static"; }; 418B0AB724C5E42900DF2C21 /* fast_float_testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */; buildPhases = ( 418B0AB424C5E42900DF2C21 /* Sources */, 418B0AB524C5E42900DF2C21 /* Frameworks */, 418B0AB624C5E42900DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */, 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */, ); name = fast_float_testbed; productName = fast_float_testbed; productReference = 418B0AB824C5E42900DF2C21 /* testbed */; productType = "com.apple.product-type.tool"; }; 418B0ACA24C5E4EA00DF2C21 /* transicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */; buildPhases = ( 418B0AC724C5E4EA00DF2C21 /* Sources */, 418B0AC824C5E4EA00DF2C21 /* Frameworks */, 418B0AC924C5E4EA00DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */, ); name = transicc; productName = transicc; productReference = 418B0ACB24C5E4EA00DF2C21 /* transicc */; productType = "com.apple.product-type.tool"; }; 418B0AE024C5E5C300DF2C21 /* linkicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */; buildPhases = ( 418B0ADD24C5E5C300DF2C21 /* Sources */, 418B0ADE24C5E5C300DF2C21 /* Frameworks */, 418B0ADF24C5E5C300DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */, ); name = linkicc; productName = linkicc; productReference = 418B0AE124C5E5C300DF2C21 /* linkicc */; productType = "com.apple.product-type.tool"; }; 418B0B0424C5E76100DF2C21 /* tificc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */; buildPhases = ( 418B0B0124C5E76100DF2C21 /* Sources */, 418B0B0224C5E76100DF2C21 /* Frameworks */, 418B0B0324C5E76100DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */, ); name = tificc; productName = tificc; productReference = 418B0B0524C5E76100DF2C21 /* tificc */; productType = "com.apple.product-type.tool"; }; 418B0B1924C5E85600DF2C21 /* tifdiff */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */; buildPhases = ( 418B0B1624C5E85600DF2C21 /* Sources */, 418B0B1724C5E85600DF2C21 /* Frameworks */, 418B0B1824C5E85600DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */, ); name = tifdiff; productName = tifdiff; productReference = 418B0B1A24C5E85600DF2C21 /* tifdiff */; productType = "com.apple.product-type.tool"; }; 418B0B2E24C5E95D00DF2C21 /* jpegicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */; buildPhases = ( 418B0B2B24C5E95D00DF2C21 /* Sources */, 418B0B2C24C5E95D00DF2C21 /* Frameworks */, 418B0B2D24C5E95D00DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */, ); name = jpegicc; productName = jpegicc; productReference = 418B0B2F24C5E95D00DF2C21 /* jpegicc */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 418B0A2924C5E19500DF2C21 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1210; ORGANIZATIONNAME = littlecms; TargetAttributes = { 418B0A3024C5E19500DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0A7724C5E25200DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0A8E24C5E35200DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0AB724C5E42900DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0ACA24C5E4EA00DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0AE024C5E5C300DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B0424C5E76100DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B1924C5E85600DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B2E24C5E95D00DF2C21 = { CreatedOnToolsVersion = 11.6; }; }; }; buildConfigurationList = 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */; compatibilityVersion = "Xcode 12.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 418B0A2824C5E19500DF2C21; productRefGroup = 418B0A3224C5E19500DF2C21 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 418B0A3024C5E19500DF2C21 /* lcms2 */, 418B0A7724C5E25200DF2C21 /* testbed */, 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */, 418B0AB724C5E42900DF2C21 /* fast_float_testbed */, 418B0ACA24C5E4EA00DF2C21 /* transicc */, 418B0AE024C5E5C300DF2C21 /* linkicc */, 418B0B0424C5E76100DF2C21 /* tificc */, 418B0B1924C5E85600DF2C21 /* tifdiff */, 418B0B2E24C5E95D00DF2C21 /* jpegicc */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 418B0A2E24C5E19500DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */, 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */, 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */, 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */, 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */, 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */, 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */, 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */, 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */, 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */, 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */, 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */, 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */, 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */, 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */, 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */, 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */, 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */, 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */, 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */, 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */, 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */, 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */, 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */, 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */, 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A7424C5E25200DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */, 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */, 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8C24C5E35200DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */, 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */, 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */, 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */, 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */, 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */, 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */, 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */, 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */, 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */, 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */, 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */, 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AB424C5E42900DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AC724C5E4EA00DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */, 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */, 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0ADD24C5E5C300DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */, 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */, 4123B46925518DB1005F0287 /* linkicc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B0124C5E76100DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */, 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */, 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */, 4123B4B82551903B005F0287 /* tificc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B1624C5E85600DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */, 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */, 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B2B24C5E95D00DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */, 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */, 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */, 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */; }; 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */; }; 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */; targetProxy = 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */; }; 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */; }; 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */; }; 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */; }; 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */; }; 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */; }; 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 418B0A3324C5E19500DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 418B0A3424C5E19500DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Release; }; 418B0A3624C5E19500DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; EXECUTABLE_PREFIX = lib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 418B0A3724C5E19500DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; EXECUTABLE_PREFIX = lib; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; 418B0A7D24C5E25200DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0A7E24C5E25200DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0A9124C5E35200DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; EXECUTABLE_PREFIX = lib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 418B0A9224C5E35200DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; EXECUTABLE_PREFIX = lib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; 418B0ABD24C5E42900DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0ABE24C5E42900DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0AD024C5E4EA00DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0AD124C5E4EA00DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0AE624C5E5C300DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0AE724C5E5C300DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B0A24C5E76100DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = 10.15; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B0B24C5E76100DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = 10.15; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B1F24C5E85600DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; HEADER_SEARCH_PATHS = /usr/local/include; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B2024C5E85600DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; HEADER_SEARCH_PATHS = /usr/local/include; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B3424C5E95D00DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; HEADER_SEARCH_PATHS = /usr/local/include; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ljpeg", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B3524C5E95D00DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; HEADER_SEARCH_PATHS = /usr/local/include; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ljpeg", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A3324C5E19500DF2C21 /* Debug */, 418B0A3424C5E19500DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A3624C5E19500DF2C21 /* Debug */, 418B0A3724C5E19500DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A7D24C5E25200DF2C21 /* Debug */, 418B0A7E24C5E25200DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A9124C5E35200DF2C21 /* Debug */, 418B0A9224C5E35200DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0ABD24C5E42900DF2C21 /* Debug */, 418B0ABE24C5E42900DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0AD024C5E4EA00DF2C21 /* Debug */, 418B0AD124C5E4EA00DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0AE624C5E5C300DF2C21 /* Debug */, 418B0AE724C5E5C300DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B0A24C5E76100DF2C21 /* Debug */, 418B0B0B24C5E76100DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B1F24C5E85600DF2C21 /* Debug */, 418B0B2024C5E85600DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B3424C5E95D00DF2C21 /* Debug */, 418B0B3524C5E95D00DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 418B0A2924C5E19500DF2C21 /* Project object */; } lcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/0000755000175000017500000000000015176573557025052 5ustar martimartilcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175000017500000000022615176573557032014 0ustar martimarti lcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/0000755000175000017500000000000015176573557027505 5ustar martimarti././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootlcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plistlcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceCh0000644000175000017500000000035615176573557032167 0ustar martimarti IDEDidComputeMac32BitWarning ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootlcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettingslcms2-2.19.1/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSetti0000644000175000017500000000034215176573557032376 0ustar martimarti PreviewsEnabled lcms2-2.19.1/Projects/Xcode_14/0000755000175000017500000000000015176573557015022 5ustar martimartilcms2-2.19.1/Projects/Xcode_14/lcms2/0000755000175000017500000000000015176573557016042 5ustar martimartilcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/0000755000175000017500000000000015176573557021056 5ustar martimartilcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.pbxproj0000644000175000017500000020643615176573557024145 0ustar martimarti// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 56; objects = { /* Begin PBXBuildFile section */ 4123B46925518DB1005F0287 /* linkicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B46825518DB1005F0287 /* linkicc.c */; }; 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4A325518FFB005F0287 /* xgetopt.c */; }; 4123B4B82551903B005F0287 /* tificc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4B72551903B005F0287 /* tificc.c */; }; 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; }; 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */; }; 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */; }; 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */; }; 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */; }; 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */; }; 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3D24C5E1C700DF2C21 /* cmssm.c */; }; 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */; }; 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */; }; 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */; }; 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4124C5E1C800DF2C21 /* cmstypes.c */; }; 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4224C5E1C800DF2C21 /* cmsio1.c */; }; 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4324C5E1C800DF2C21 /* cmspack.c */; }; 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4424C5E1C800DF2C21 /* cmsxform.c */; }; 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */; }; 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */; }; 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4724C5E1C800DF2C21 /* cmspcs.c */; }; 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4824C5E1C800DF2C21 /* cmsps2.c */; }; 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */; }; 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4A24C5E1C800DF2C21 /* cmserr.c */; }; 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4B24C5E1C800DF2C21 /* cmslut.c */; }; 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */; }; 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */; }; 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */; }; 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */; }; 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5024C5E1C900DF2C21 /* cmscam02.c */; }; 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5124C5E1C900DF2C21 /* cmssamp.c */; }; 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6D24C5E1E800DF2C21 /* lcms2.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */; }; 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */; }; 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */; }; 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */; }; 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */; }; 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */; }; 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */; }; 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */; }; 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */; }; 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */; }; 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */; }; 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */; }; 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */; }; 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */; }; 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF324C5E6C700DF2C21 /* xgetopt.c */; }; 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF424C5E6C700DF2C21 /* vprf.c */; }; 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF824C5E6D200DF2C21 /* transicc.c */; }; 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFD24C5E73100DF2C21 /* xgetopt.c */; }; 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFE24C5E73100DF2C21 /* vprf.c */; }; 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B0E24C5E79200DF2C21 /* utils.h */; }; 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B1224C5E7BB00DF2C21 /* vprf.c */; }; 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2424C5E92100DF2C21 /* tifdiff.c */; }; 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2724C5E92B00DF2C21 /* vprf.c */; }; 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2824C5E92B00DF2C21 /* xgetopt.c */; }; 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */; }; 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3924C5E99600DF2C21 /* jpgicc.c */; }; 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3E24C5E9F700DF2C21 /* vprf.c */; }; 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */; }; 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4324C5EC1D00DF2C21 /* testcms2.c */; }; 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4524C5EC1D00DF2C21 /* testplugin.c */; }; 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A8E24C5E35200DF2C21; remoteInfo = fast_float_plugin; }; 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 418B0A7624C5E25200DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0AB624C5E42900DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0AC924C5E4EA00DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0ADF24C5E5C300DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B0324C5E76100DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B1824C5E85600DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B2D24C5E95D00DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 4123B46825518DB1005F0287 /* linkicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linkicc.c; sourceTree = ""; }; 4123B4A325518FFB005F0287 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; 4123B4B72551903B005F0287 /* tificc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tificc.c; sourceTree = ""; }; 4123B4C2255190FE005F0287 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tifdiff.c; sourceTree = ""; }; 418B0A3124C5E19500DF2C21 /* liblcms2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblcms2.a; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgamma.c; path = ../../../src/cmsgamma.c; sourceTree = ""; }; 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsintrp.c; path = ../../../src/cmsintrp.c; sourceTree = ""; }; 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgmt.c; path = ../../../src/cmsgmt.c; sourceTree = ""; }; 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscnvrt.c; path = ../../../src/cmscnvrt.c; sourceTree = ""; }; 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmd5.c; path = ../../../src/cmsmd5.c; sourceTree = ""; }; 418B0A3D24C5E1C700DF2C21 /* cmssm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssm.c; path = ../../../src/cmssm.c; sourceTree = ""; }; 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsopt.c; path = ../../../src/cmsopt.c; sourceTree = ""; }; 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscgats.c; path = ../../../src/cmscgats.c; sourceTree = ""; }; 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsalpha.c; path = ../../../src/cmsalpha.c; sourceTree = ""; }; 418B0A4124C5E1C800DF2C21 /* cmstypes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmstypes.c; path = ../../../src/cmstypes.c; sourceTree = ""; }; 418B0A4224C5E1C800DF2C21 /* cmsio1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio1.c; path = ../../../src/cmsio1.c; sourceTree = ""; }; 418B0A4324C5E1C800DF2C21 /* cmspack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspack.c; path = ../../../src/cmspack.c; sourceTree = ""; }; 418B0A4424C5E1C800DF2C21 /* cmsxform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsxform.c; path = ../../../src/cmsxform.c; sourceTree = ""; }; 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmswtpnt.c; path = ../../../src/cmswtpnt.c; sourceTree = ""; }; 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmtrx.c; path = ../../../src/cmsmtrx.c; sourceTree = ""; }; 418B0A4724C5E1C800DF2C21 /* cmspcs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspcs.c; path = ../../../src/cmspcs.c; sourceTree = ""; }; 418B0A4824C5E1C800DF2C21 /* cmsps2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsps2.c; path = ../../../src/cmsps2.c; sourceTree = ""; }; 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsnamed.c; path = ../../../src/cmsnamed.c; sourceTree = ""; }; 418B0A4A24C5E1C800DF2C21 /* cmserr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmserr.c; path = ../../../src/cmserr.c; sourceTree = ""; }; 418B0A4B24C5E1C800DF2C21 /* cmslut.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmslut.c; path = ../../../src/cmslut.c; sourceTree = ""; }; 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsvirt.c; path = ../../../src/cmsvirt.c; sourceTree = ""; }; 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsplugin.c; path = ../../../src/cmsplugin.c; sourceTree = ""; }; 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmshalf.c; path = ../../../src/cmshalf.c; sourceTree = ""; }; 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio0.c; path = ../../../src/cmsio0.c; sourceTree = ""; }; 418B0A5024C5E1C900DF2C21 /* cmscam02.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscam02.c; path = ../../../src/cmscam02.c; sourceTree = ""; }; 418B0A5124C5E1C900DF2C21 /* cmssamp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssamp.c; path = ../../../src/cmssamp.c; sourceTree = ""; }; 418B0A6D24C5E1E800DF2C21 /* lcms2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2.h; path = ../../../include/lcms2.h; sourceTree = ""; }; 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_plugin.h; path = ../../../include/lcms2_plugin.h; sourceTree = ""; }; 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_internal.h; path = ../../../src/lcms2_internal.h; sourceTree = ""; }; 418B0A7824C5E25200DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfast_float_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_curves.c; path = ../../../plugins/fast_float/src/fast_float_curves.c; sourceTree = ""; }; 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15mats.c; path = ../../../plugins/fast_float/src/fast_float_15mats.c; sourceTree = ""; }; 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_tethra.c; path = ../../../plugins/fast_float/src/fast_float_tethra.c; sourceTree = ""; }; 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_cmyk.c; path = ../../../plugins/fast_float/src/fast_float_cmyk.c; sourceTree = ""; }; 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_16_tethra.c; path = ../../../plugins/fast_float/src/fast_16_tethra.c; sourceTree = ""; }; 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fast_float_internal.h; path = ../../../plugins/fast_float/src/fast_float_internal.h; sourceTree = ""; }; 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh.c; path = ../../../plugins/fast_float/src/fast_8_matsh.c; sourceTree = ""; }; 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_separate.c; path = ../../../plugins/fast_float/src/fast_float_separate.c; sourceTree = ""; }; 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh_sse.c; path = ../../../plugins/fast_float/src/fast_8_matsh_sse.c; sourceTree = ""; }; 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_tethra.c; path = ../../../plugins/fast_float/src/fast_8_tethra.c; sourceTree = ""; }; 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_sup.c; path = ../../../plugins/fast_float/src/fast_float_sup.c; sourceTree = ""; }; 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15bits.c; path = ../../../plugins/fast_float/src/fast_float_15bits.c; sourceTree = ""; }; 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_curves.c; path = ../../../plugins/fast_float/src/fast_8_curves.c; sourceTree = ""; }; 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_matsh.c; path = ../../../plugins/fast_float/src/fast_float_matsh.c; sourceTree = ""; }; 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_fast_float.h; path = ../../../plugins/fast_float/include/lcms2_fast_float.h; sourceTree = ""; }; 418B0AB824C5E42900DF2C21 /* fast_float_testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fast_float_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0ACB24C5E4EA00DF2C21 /* transicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0AE124C5E5C300DF2C21 /* linkicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = linkicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fast_float_testbed.c; path = ../../../plugins/fast_float/testbed/fast_float_testbed.c; sourceTree = SOURCE_ROOT; }; 418B0AF324C5E6C700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0AF424C5E6C700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0AF524C5E6C800DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0AF824C5E6D200DF2C21 /* transicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transicc.c; path = ../../../utils/transicc/transicc.c; sourceTree = SOURCE_ROOT; }; 418B0AFC24C5E73100DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0AFD24C5E73100DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0AFE24C5E73100DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B0524C5E76100DF2C21 /* tificc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tificc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B0E24C5E79200DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0B1224C5E7BB00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B1A24C5E85600DF2C21 /* tifdiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tifdiff; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B2424C5E92100DF2C21 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tifdiff.c; path = ../../../utils/tificc/tifdiff.c; sourceTree = SOURCE_ROOT; }; 418B0B2724C5E92B00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../common/vprf.c; sourceTree = ""; }; 418B0B2824C5E92B00DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; 418B0B2F24C5E95D00DF2C21 /* jpegicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jpegicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iccjpeg.c; path = ../../../utils/jpgicc/iccjpeg.c; sourceTree = SOURCE_ROOT; }; 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iccjpeg.h; path = ../../../utils/jpgicc/iccjpeg.h; sourceTree = SOURCE_ROOT; }; 418B0B3924C5E99600DF2C21 /* jpgicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jpgicc.c; sourceTree = ""; }; 418B0B3E24C5E9F700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0B4024C5E9F700DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0B4324C5EC1D00DF2C21 /* testcms2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcms2.c; path = ../../../testbed/testcms2.c; sourceTree = SOURCE_ROOT; }; 418B0B4424C5EC1D00DF2C21 /* testcms2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = testcms2.h; path = ../../../testbed/testcms2.h; sourceTree = SOURCE_ROOT; }; 418B0B4524C5EC1D00DF2C21 /* testplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testplugin.c; path = ../../../testbed/testplugin.c; sourceTree = ""; }; 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zoo_icc.c; path = ../../../testbed/zoo_icc.c; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 418B0A2F24C5E19500DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A7524C5E25200DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8D24C5E35200DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AB524C5E42900DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */, 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AC824C5E4EA00DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0ADE24C5E5C300DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B0224C5E76100DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B1724C5E85600DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B2C24C5E95D00DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 4133B38429F8419B0064B31B /* threaded_plugin */ = { isa = PBXGroup; children = ( ); path = threaded_plugin; sourceTree = ""; }; 4133B38529F842000064B31B /* threaded_plugin_testbed */ = { isa = PBXGroup; children = ( ); path = threaded_plugin_testbed; sourceTree = ""; }; 418B0A2824C5E19500DF2C21 = { isa = PBXGroup; children = ( 4133B38529F842000064B31B /* threaded_plugin_testbed */, 4133B38429F8419B0064B31B /* threaded_plugin */, 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */, 418B0A7324C5E1FE00DF2C21 /* include */, 418B0A6C24C5E1CE00DF2C21 /* src */, 418B0A7924C5E25200DF2C21 /* testbed */, 418B0AB924C5E42900DF2C21 /* fast_float_testbed */, 418B0ACC24C5E4EA00DF2C21 /* transicc */, 418B0AE224C5E5C300DF2C21 /* linkicc */, 418B0B0624C5E76100DF2C21 /* tificc */, 418B0B1B24C5E85600DF2C21 /* tifdiff */, 418B0B3024C5E95D00DF2C21 /* jpegicc */, 418B0A3224C5E19500DF2C21 /* Products */, 418B0A8924C5E30000DF2C21 /* Frameworks */, ); sourceTree = ""; }; 418B0A3224C5E19500DF2C21 /* Products */ = { isa = PBXGroup; children = ( 418B0A3124C5E19500DF2C21 /* liblcms2.a */, 418B0A7824C5E25200DF2C21 /* testbed */, 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */, 418B0AB824C5E42900DF2C21 /* fast_float_testbed */, 418B0ACB24C5E4EA00DF2C21 /* transicc */, 418B0AE124C5E5C300DF2C21 /* linkicc */, 418B0B0524C5E76100DF2C21 /* tificc */, 418B0B1A24C5E85600DF2C21 /* tifdiff */, 418B0B2F24C5E95D00DF2C21 /* jpegicc */, ); name = Products; sourceTree = ""; }; 418B0A6C24C5E1CE00DF2C21 /* src */ = { isa = PBXGroup; children = ( 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */, 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */, 418B0A5024C5E1C900DF2C21 /* cmscam02.c */, 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */, 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */, 418B0A4A24C5E1C800DF2C21 /* cmserr.c */, 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */, 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */, 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */, 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */, 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */, 418B0A4224C5E1C800DF2C21 /* cmsio1.c */, 418B0A4B24C5E1C800DF2C21 /* cmslut.c */, 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */, 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */, 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */, 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */, 418B0A4324C5E1C800DF2C21 /* cmspack.c */, 418B0A4724C5E1C800DF2C21 /* cmspcs.c */, 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */, 418B0A4824C5E1C800DF2C21 /* cmsps2.c */, 418B0A5124C5E1C900DF2C21 /* cmssamp.c */, 418B0A3D24C5E1C700DF2C21 /* cmssm.c */, 418B0A4124C5E1C800DF2C21 /* cmstypes.c */, 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */, 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */, 418B0A4424C5E1C800DF2C21 /* cmsxform.c */, ); name = src; sourceTree = ""; }; 418B0A7324C5E1FE00DF2C21 /* include */ = { isa = PBXGroup; children = ( 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */, 418B0A6D24C5E1E800DF2C21 /* lcms2.h */, ); name = include; sourceTree = ""; }; 418B0A7924C5E25200DF2C21 /* testbed */ = { isa = PBXGroup; children = ( 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */, 418B0B4324C5EC1D00DF2C21 /* testcms2.c */, 418B0B4424C5EC1D00DF2C21 /* testcms2.h */, 418B0B4524C5EC1D00DF2C21 /* testplugin.c */, ); name = testbed; sourceTree = SOURCE_ROOT; }; 418B0A8924C5E30000DF2C21 /* Frameworks */ = { isa = PBXGroup; children = ( ); name = Frameworks; sourceTree = ""; }; 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */ = { isa = PBXGroup; children = ( 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */, 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */, 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */, 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */, 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */, 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */, 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */, 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */, 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */, 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */, 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */, 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */, 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */, 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */, 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */, ); name = fast_float_plugin; sourceTree = ""; }; 418B0AB924C5E42900DF2C21 /* fast_float_testbed */ = { isa = PBXGroup; children = ( 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */, ); name = fast_float_testbed; path = ../../../plugins/fast_float/testbed; sourceTree = ""; }; 418B0ACC24C5E4EA00DF2C21 /* transicc */ = { isa = PBXGroup; children = ( 418B0AF824C5E6D200DF2C21 /* transicc.c */, 418B0AF524C5E6C800DF2C21 /* utils.h */, 418B0AF424C5E6C700DF2C21 /* vprf.c */, 418B0AF324C5E6C700DF2C21 /* xgetopt.c */, ); name = transicc; sourceTree = SOURCE_ROOT; }; 418B0AE224C5E5C300DF2C21 /* linkicc */ = { isa = PBXGroup; children = ( 4123B46825518DB1005F0287 /* linkicc.c */, 418B0AFC24C5E73100DF2C21 /* utils.h */, 418B0AFE24C5E73100DF2C21 /* vprf.c */, 418B0AFD24C5E73100DF2C21 /* xgetopt.c */, ); name = linkicc; path = ../../../utils/linkicc; sourceTree = SOURCE_ROOT; }; 418B0B0624C5E76100DF2C21 /* tificc */ = { isa = PBXGroup; children = ( 4123B4B72551903B005F0287 /* tificc.c */, 4123B4A325518FFB005F0287 /* xgetopt.c */, 418B0B1224C5E7BB00DF2C21 /* vprf.c */, 418B0B0E24C5E79200DF2C21 /* utils.h */, ); name = tificc; path = ../../../utils/tificc; sourceTree = SOURCE_ROOT; }; 418B0B1B24C5E85600DF2C21 /* tifdiff */ = { isa = PBXGroup; children = ( 4123B4C2255190FE005F0287 /* tifdiff.c */, 418B0B2724C5E92B00DF2C21 /* vprf.c */, 418B0B2824C5E92B00DF2C21 /* xgetopt.c */, 418B0B2424C5E92100DF2C21 /* tifdiff.c */, ); name = tifdiff; path = ../../../utils/tificc; sourceTree = SOURCE_ROOT; }; 418B0B3024C5E95D00DF2C21 /* jpegicc */ = { isa = PBXGroup; children = ( 418B0B4024C5E9F700DF2C21 /* utils.h */, 418B0B3E24C5E9F700DF2C21 /* vprf.c */, 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */, 418B0B3924C5E99600DF2C21 /* jpgicc.c */, 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */, 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */, ); name = jpegicc; path = ../../../utils/jpgicc; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 418B0A2D24C5E19500DF2C21 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */, 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */, 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8B24C5E35200DF2C21 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */, 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 418B0A3024C5E19500DF2C21 /* lcms2 */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */; buildPhases = ( 418B0A2D24C5E19500DF2C21 /* Headers */, 418B0A2E24C5E19500DF2C21 /* Sources */, 418B0A2F24C5E19500DF2C21 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = lcms2; productName = lcms2; productReference = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; productType = "com.apple.product-type.library.static"; }; 418B0A7724C5E25200DF2C21 /* testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */; buildPhases = ( 418B0A7424C5E25200DF2C21 /* Sources */, 418B0A7524C5E25200DF2C21 /* Frameworks */, 418B0A7624C5E25200DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */, ); name = testbed; productName = testbed; productReference = 418B0A7824C5E25200DF2C21 /* testbed */; productType = "com.apple.product-type.tool"; }; 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */; buildPhases = ( 418B0A8B24C5E35200DF2C21 /* Headers */, 418B0A8C24C5E35200DF2C21 /* Sources */, 418B0A8D24C5E35200DF2C21 /* Frameworks */, ); buildRules = ( ); dependencies = ( 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */, ); name = fast_float_plugin; productName = fast_float_plugin; productReference = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; productType = "com.apple.product-type.library.static"; }; 418B0AB724C5E42900DF2C21 /* fast_float_testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */; buildPhases = ( 418B0AB424C5E42900DF2C21 /* Sources */, 418B0AB524C5E42900DF2C21 /* Frameworks */, 418B0AB624C5E42900DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */, 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */, ); name = fast_float_testbed; productName = fast_float_testbed; productReference = 418B0AB824C5E42900DF2C21 /* fast_float_testbed */; productType = "com.apple.product-type.tool"; }; 418B0ACA24C5E4EA00DF2C21 /* transicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */; buildPhases = ( 418B0AC724C5E4EA00DF2C21 /* Sources */, 418B0AC824C5E4EA00DF2C21 /* Frameworks */, 418B0AC924C5E4EA00DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */, ); name = transicc; productName = transicc; productReference = 418B0ACB24C5E4EA00DF2C21 /* transicc */; productType = "com.apple.product-type.tool"; }; 418B0AE024C5E5C300DF2C21 /* linkicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */; buildPhases = ( 418B0ADD24C5E5C300DF2C21 /* Sources */, 418B0ADE24C5E5C300DF2C21 /* Frameworks */, 418B0ADF24C5E5C300DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */, ); name = linkicc; productName = linkicc; productReference = 418B0AE124C5E5C300DF2C21 /* linkicc */; productType = "com.apple.product-type.tool"; }; 418B0B0424C5E76100DF2C21 /* tificc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */; buildPhases = ( 418B0B0124C5E76100DF2C21 /* Sources */, 418B0B0224C5E76100DF2C21 /* Frameworks */, 418B0B0324C5E76100DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */, ); name = tificc; productName = tificc; productReference = 418B0B0524C5E76100DF2C21 /* tificc */; productType = "com.apple.product-type.tool"; }; 418B0B1924C5E85600DF2C21 /* tifdiff */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */; buildPhases = ( 418B0B1624C5E85600DF2C21 /* Sources */, 418B0B1724C5E85600DF2C21 /* Frameworks */, 418B0B1824C5E85600DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */, ); name = tifdiff; productName = tifdiff; productReference = 418B0B1A24C5E85600DF2C21 /* tifdiff */; productType = "com.apple.product-type.tool"; }; 418B0B2E24C5E95D00DF2C21 /* jpegicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */; buildPhases = ( 418B0B2B24C5E95D00DF2C21 /* Sources */, 418B0B2C24C5E95D00DF2C21 /* Frameworks */, 418B0B2D24C5E95D00DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */, ); name = jpegicc; productName = jpegicc; productReference = 418B0B2F24C5E95D00DF2C21 /* jpegicc */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 418B0A2924C5E19500DF2C21 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1430; ORGANIZATIONNAME = littlecms; TargetAttributes = { 418B0A3024C5E19500DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0A7724C5E25200DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0A8E24C5E35200DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0AB724C5E42900DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0ACA24C5E4EA00DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0AE024C5E5C300DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B0424C5E76100DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B1924C5E85600DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B2E24C5E95D00DF2C21 = { CreatedOnToolsVersion = 11.6; }; }; }; buildConfigurationList = 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */; compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 418B0A2824C5E19500DF2C21; productRefGroup = 418B0A3224C5E19500DF2C21 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 418B0A3024C5E19500DF2C21 /* lcms2 */, 418B0A7724C5E25200DF2C21 /* testbed */, 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */, 418B0AB724C5E42900DF2C21 /* fast_float_testbed */, 418B0ACA24C5E4EA00DF2C21 /* transicc */, 418B0AE024C5E5C300DF2C21 /* linkicc */, 418B0B0424C5E76100DF2C21 /* tificc */, 418B0B1924C5E85600DF2C21 /* tifdiff */, 418B0B2E24C5E95D00DF2C21 /* jpegicc */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 418B0A2E24C5E19500DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */, 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */, 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */, 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */, 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */, 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */, 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */, 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */, 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */, 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */, 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */, 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */, 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */, 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */, 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */, 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */, 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */, 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */, 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */, 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */, 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */, 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */, 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */, 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */, 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */, 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A7424C5E25200DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */, 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */, 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8C24C5E35200DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */, 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */, 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */, 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */, 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */, 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */, 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */, 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */, 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */, 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */, 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */, 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */, 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AB424C5E42900DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AC724C5E4EA00DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */, 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */, 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0ADD24C5E5C300DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */, 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */, 4123B46925518DB1005F0287 /* linkicc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B0124C5E76100DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */, 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */, 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */, 4123B4B82551903B005F0287 /* tificc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B1624C5E85600DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */, 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */, 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B2B24C5E95D00DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */, 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */, 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */, 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */; }; 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */; }; 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */; targetProxy = 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */; }; 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */; }; 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */; }; 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */; }; 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */; }; 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */; }; 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 418B0A3324C5E19500DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 418B0A3424C5E19500DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Release; }; 418B0A3624C5E19500DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 418B0A3724C5E19500DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; 418B0A7D24C5E25200DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0A7E24C5E25200DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0A9124C5E35200DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 418B0A9224C5E35200DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; 418B0ABD24C5E42900DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0ABE24C5E42900DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0AD024C5E4EA00DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0AD124C5E4EA00DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0AE624C5E5C300DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0AE724C5E5C300DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B0A24C5E76100DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B0B24C5E76100DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B1F24C5E85600DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B2024C5E85600DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B3424C5E95D00DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ljpeg", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B3524C5E95D00DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ljpeg", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A3324C5E19500DF2C21 /* Debug */, 418B0A3424C5E19500DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A3624C5E19500DF2C21 /* Debug */, 418B0A3724C5E19500DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A7D24C5E25200DF2C21 /* Debug */, 418B0A7E24C5E25200DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A9124C5E35200DF2C21 /* Debug */, 418B0A9224C5E35200DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0ABD24C5E42900DF2C21 /* Debug */, 418B0ABE24C5E42900DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0AD024C5E4EA00DF2C21 /* Debug */, 418B0AD124C5E4EA00DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0AE624C5E5C300DF2C21 /* Debug */, 418B0AE724C5E5C300DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B0A24C5E76100DF2C21 /* Debug */, 418B0B0B24C5E76100DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B1F24C5E85600DF2C21 /* Debug */, 418B0B2024C5E85600DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B3424C5E95D00DF2C21 /* Debug */, 418B0B3524C5E95D00DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 418B0A2924C5E19500DF2C21 /* Project object */; } lcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/0000755000175000017500000000000015176573557025054 5ustar martimartilcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175000017500000000022615176573557032016 0ustar martimarti lcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/0000755000175000017500000000000015176573557027507 5ustar martimarti././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootlcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plistlcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceCh0000644000175000017500000000035615176573557032171 0ustar martimarti IDEDidComputeMac32BitWarning ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootlcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettingslcms2-2.19.1/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSetti0000644000175000017500000000034215176573557032400 0ustar martimarti PreviewsEnabled lcms2-2.19.1/Projects/cppcheck/0000755000175000017500000000000015176573557015234 5ustar martimartilcms2-2.19.1/Projects/cppcheck/lcms2.cppcheck0000755000175000017500000000032215176573557017756 0ustar martimarti lcms2-2.19.1/Projects/VC2026/0000755000175000017500000000000015176573557014276 5ustar martimartilcms2-2.19.1/Projects/VC2026/fuzzers/0000755000175000017500000000000015176573557016006 5ustar martimartilcms2-2.19.1/Projects/VC2026/fuzzers/fuzzers.vcxproj0000644000175000017500000001744315176573557021144 0ustar martimarti Debug Win32 Release Win32 Debug x64 Release x64 17.0 Win32Proj {32e8c094-1d6b-4959-90ad-9a443df4ae9a} fuzzers 10.0 Application true v145 Unicode true true Application false v145 true Unicode true true Application true v145 Unicode true true Application false v145 true Unicode true true ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ ..\..\..\fuzzers\ ../../../include;$(IncludePath) $(Configuration)_$(Platform)\ Level3 true WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true Level3 true true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true true true Level3 true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true Level3 true true true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true true true {71dede59-3f1e-486b-a899-4283000f76b5} lcms2-2.19.1/Projects/VC2026/fuzzers/fuzzers.vcxproj.filters0000644000175000017500000000171615176573557022607 0ustar martimarti {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files lcms2-2.19.1/Projects/VC2026/jpegicc/0000755000175000017500000000000015176573557015702 5ustar martimartilcms2-2.19.1/Projects/VC2026/jpegicc/jpegicc.vcxproj.filters0000644000175000017500000000236715176573557022402 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2026/jpegicc/jpegicc.vcxproj0000644000175000017500000004503415176573557020731 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {62812507-F926-4968-96A9-17678460AD90} jpegicc Win32Proj 10.0 Application Unicode true v145 Application Unicode true v145 Application Unicode true v145 Application Unicode v145 Application Unicode v145 Application Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(IncludePath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a $(LibraryPath);;C:\code\jpeg-9a jpgicc jpgicc Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true stdc11 libjpeg.lib;%(AdditionalDependencies) true Console false Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true false libjpeg.lib;%(AdditionalDependencies) true Console true true MachineX86 false true Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true false libjpeg.lib;%(AdditionalDependencies) true Console true true false true Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true stdc11 libjpeg.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2026/lcms2_DLL/0000755000175000017500000000000015176573557016011 5ustar martimartilcms2-2.19.1/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj.filters0000644000175000017500000001015115176573557022606 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files Resource Files Resource Files Source Files lcms2-2.19.1/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj0000644000175000017500000004564315176573557021155 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} lcms2_DLL Win32Proj 10.0 DynamicLibrary Unicode true v145 DynamicLibrary Unicode true v145 DynamicLibrary Unicode true v145 DynamicLibrary Unicode v145 DynamicLibrary Unicode v145 DynamicLibrary Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset lcms2 lcms2 lcms2 lcms2 lcms2 lcms2 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 true false ..\..\..\src\lcms2.def true Windows MachineX86 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 true false ..\..\..\src\lcms2.def true Windows Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 true false CompileAsC stdc11 true Windows $(OutDir)$(TargetName)$(TargetExt) Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true ..\..\..\src\lcms2.def true Windows true true MachineX86 true Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true ..\..\..\src\lcms2.def true Windows true true true Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 true OnlyExplicitInline true CompileAsC stdc11 true Windows true true true true lcms2-2.19.1/Projects/VC2026/lcms2_static/0000755000175000017500000000000015176573557016665 5ustar martimartilcms2-2.19.1/Projects/VC2026/lcms2_static/lcms2_static.vcxproj.filters0000644000175000017500000000737515176573557024354 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files lcms2-2.19.1/Projects/VC2026/lcms2_static/lcms2_static.vcxproj0000644000175000017500000004005515176573557022675 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {71DEDE59-3F1E-486B-A899-4283000F76B5} lcms2_static Win32Proj 10.0 StaticLibrary Unicode true v145 StaticLibrary Unicode true v145 StaticLibrary Unicode true v145 StaticLibrary Unicode v145 StaticLibrary Unicode v145 StaticLibrary Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks Level4 EditAndContinue true MultiThreadedDebugDLL Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks Level4 EditAndContinue true MultiThreadedDebugDLL Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true CompileAsC stdc11 MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true false OnlyExplicitInline false true Precise false false false true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true false OnlyExplicitInline false true Precise false false false true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true true OnlyExplicitInline false true true true CompileAsC stdc11 lcms2-2.19.1/Projects/VC2026/linkicc/0000755000175000017500000000000015176573557015712 5ustar martimartilcms2-2.19.1/Projects/VC2026/linkicc/linkicc.vcxproj.filters0000644000175000017500000000221215176573557022407 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2026/linkicc/linkicc.vcxproj0000644000175000017500000003642715176573557020757 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849} linkicc Win32Proj 10.0 Application Unicode true v145 Application Unicode true v145 Application Unicode true v145 Application Unicode v145 Application Unicode v145 Application Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true CompileAsC true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true false MultiThreaded true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true false MultiThreaded true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Level4 ProgramDatabase true MultiThreaded CompileAsC true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2026/psicc/0000755000175000017500000000000015176573557015377 5ustar martimartilcms2-2.19.1/Projects/VC2026/psicc/psicc.vcxproj.filters0000644000175000017500000000220615176573557021564 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2026/psicc/psicc.vcxproj0000644000175000017500000003643615176573557020131 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693} psicc Win32Proj 10.0 Application Unicode true v145 Application Unicode true v145 Application Unicode true v145 Application Unicode v145 Application Unicode v145 Application Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true CompileAsC true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true false true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true false true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true CompileAsC true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2026/resource.h0000644000175000017500000000065615176573557016305 0ustar martimarti//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by lcms2.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif lcms2-2.19.1/Projects/VC2026/testbed/0000755000175000017500000000000015176573557015730 5ustar martimartilcms2-2.19.1/Projects/VC2026/testbed/testbed.vcxproj.filters0000644000175000017500000000220115176573557022441 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2026/testbed/testbed.vcxproj0000644000175000017500000004107715176573557021010 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {928A3A2B-46EF-4279-959C-513B3652FF0E} testbed Win32Proj 10.0 Application Unicode true v145 Application Unicode true v145 Application Unicode true v145 Application Unicode v145 true Application Unicode v145 Application Unicode v145 false <_ProjectFileVersion>10.0.21006.1 $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\testbed\ ..\..\..\testbed\ ..\..\..\testbed\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset ..\..\..\testbed\ ..\..\..\testbed\ ..\..\..\testbed\ Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console MachineX86 false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase true CompileAsC stdc11 true Console false Full true Speed true false ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true false true Console true true MachineX86 false true Full true Speed true false ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true false true Console true true false true Full true Speed true true ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded false true NotSet Level3 ProgramDatabase Cdecl true CompileAsC stdc11 true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} lcms2-2.19.1/Projects/VC2026/tiffdiff/0000755000175000017500000000000015176573557016057 5ustar martimartilcms2-2.19.1/Projects/VC2026/tiffdiff/tiffdiff.vcxproj.filters0000644000175000017500000000221115176573557022720 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.19.1/Projects/VC2026/tiffdiff/tiffdiff.vcxproj0000644000175000017500000004614715176573557021271 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE} tiffdiff Win32Proj 10.0 Application Unicode true v145 Application Unicode true v145 Application Unicode true v145 Application Unicode v145 Application Unicode v145 Application Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff tifdiff tifdiff tifdiff tifdiff tifdiff tifdiff Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true CompileAsC libtiff.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 $(OutDir)$(TargetName)$(TargetExt) false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true CompileAsC libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2026/tifficc/0000755000175000017500000000000015176573557015705 5ustar martimartilcms2-2.19.1/Projects/VC2026/tifficc/tifficc.vcxproj.filters0000644000175000017500000000242215176573557022400 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.19.1/Projects/VC2026/tifficc/tifficc.vcxproj0000644000175000017500000004552215176573557020741 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} tifficc Win32Proj 10.0 Application Unicode true v145 Application Unicode true v145 Application Unicode true v145 Application Unicode v145 Application Unicode v145 Application Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib tificc tificc Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true CompileAsC tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) true Console true true MachineX86 false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false libtiff.lib;%(AdditionalDependencies) true Console true true false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true CompileAsC tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2026/transicc/0000755000175000017500000000000015176573557016104 5ustar martimartilcms2-2.19.1/Projects/VC2026/transicc/transicc.vcxproj.filters0000644000175000017500000000242615176573557023002 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.19.1/Projects/VC2026/transicc/transicc.vcxproj0000644000175000017500000003700015176573557021327 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160} transicc Win32Proj 10.0 Application Unicode true v145 Application Unicode true v145 Application Unicode true v145 Application Unicode v145 Application Unicode v145 Application Unicode v145 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ true true true ..\..\..\bin\ ..\..\..\bin\ ..\..\..\bin\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ $(Configuration)_$(Platform)\ false false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true CompileAsC true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true false true Console true true true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true CompileAsC true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.19.1/Projects/VC2026/lcms2.rc0000644000175000017500000000452615176573557015653 0ustar martimarti// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Spanish (Spain, International Sort) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// // // Version // 1 VERSIONINFO FILEVERSION 2,19,0,0 PRODUCTVERSION 2,19,0,0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "lcms color engine" VALUE "FileVersion", "2.19.0.0" VALUE "InternalName", "lcms2" VALUE "LegalCopyright", "Copyright © Marti Maria 2026" VALUE "OriginalFilename", "lcms2.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", "2.19.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Spanish (Spain, International Sort) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED lcms2-2.19.1/Projects/VC2026/lcms2.sln0000644000175000017500000004260715176573557016045 0ustar martimarti Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 VisualStudioVersion = 18.4.11612.150 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcxproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcxproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcxproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcxproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcxproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcxproj", "{62812507-F926-4968-96A9-17678460AD90}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcxproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcxproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcxproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plugins", "plugins", "{8349DD7F-F750-4910-A5A5-0628223BD3EB}" ProjectSection(SolutionItems) = preProject ..\..\plugins\README.1ST = ..\..\plugins\README.1ST EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fast_float", "fast_float", "{1696CDC1-F411-4F84-BC94-C63FEB867D06}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin.vcxproj", "{AD9FF79B-CF6E-4971-A7CF-DAA47D636676}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin_testbed", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin_testbed.vcxproj", "{7629D670-C419-402B-8A90-747952EE9FC0}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "threaded", "threaded", "{09D18587-D927-4047-977F-49918A174D5E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fuzzers", "fuzzers\fuzzers.vcxproj", "{32E8C094-1D6B-4959-90AD-9A443DF4AE9A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin", "..\..\plugins\threaded\Projects\VC2026\lcms2_threaded_plugin.vcxproj", "{6A44744B-BED4-49EC-87BB-83978458CE19}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin_testbed", "..\..\plugins\threaded\Projects\VC2026\lcms2_threaded_plugin_testbed.vcxproj", "{F56B9CBA-A34D-4C68-9003-A6919236399E}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{4DD637AE-09B1-4994-8FC7-7F6EB19165EC}" ProjectSection(SolutionItems) = preProject ..\..\BUILDING.md = ..\..\BUILDING.md ..\..\plugins\fast_float\doc\LittleCMS floating point extensions 1.7.pdf = ..\..\plugins\fast_float\doc\LittleCMS floating point extensions 1.7.pdf ..\..\plugins\threaded\doc\LittleCMS threaded extensions 1.0.pdf = ..\..\plugins\threaded\doc\LittleCMS threaded extensions 1.0.pdf ..\..\doc\LittleCMS2.19 API.pdf = ..\..\doc\LittleCMS2.19 API.pdf ..\..\doc\LittleCMS2.19 Plugin API.pdf = ..\..\doc\LittleCMS2.19 Plugin API.pdf ..\..\doc\LittleCMS2.19 tutorial.pdf = ..\..\doc\LittleCMS2.19 tutorial.pdf EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.Build.0 = Debug|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.Build.0 = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.ActiveCfg = Release|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.Build.0 = Release|ARM64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.Build.0 = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.Build.0 = Debug|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.Build.0 = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.ActiveCfg = Release|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.Build.0 = Release|ARM64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.Build.0 = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.Build.0 = Debug|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.Build.0 = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.ActiveCfg = Release|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.Build.0 = Release|ARM64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.Build.0 = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.Build.0 = Debug|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.Build.0 = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.ActiveCfg = Release|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.Build.0 = Release|ARM64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.Build.0 = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.Build.0 = Debug|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.Build.0 = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.ActiveCfg = Release|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.Build.0 = Release|ARM64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.ActiveCfg = Debug|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.Build.0 = Debug|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.Build.0 = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.ActiveCfg = Release|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.Build.0 = Release|ARM64 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Deploy.0 = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.Build.0 = Debug|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.Build.0 = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.ActiveCfg = Release|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.Build.0 = Release|ARM64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.Build.0 = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.Build.0 = Debug|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.Build.0 = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.ActiveCfg = Release|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.Build.0 = Release|ARM64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.Build.0 = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.ActiveCfg = Debug|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.Build.0 = Debug|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.Build.0 = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.ActiveCfg = Release|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.Build.0 = Release|ARM64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.Build.0 = Release|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.ActiveCfg = Debug|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.Build.0 = Debug|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.ActiveCfg = Debug|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.Build.0 = Debug|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.ActiveCfg = Debug|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.Build.0 = Debug|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.ActiveCfg = Release|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.Build.0 = Release|ARM64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.ActiveCfg = Release|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.Build.0 = Release|Win32 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.ActiveCfg = Release|x64 {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.Build.0 = Release|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.Build.0 = Debug|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.ActiveCfg = Debug|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.Build.0 = Debug|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.ActiveCfg = Debug|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.Build.0 = Debug|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.ActiveCfg = Release|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.Build.0 = Release|ARM64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.ActiveCfg = Release|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.Build.0 = Release|Win32 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.ActiveCfg = Release|x64 {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.Build.0 = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.ActiveCfg = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.Build.0 = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.ActiveCfg = Debug|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.Build.0 = Debug|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.ActiveCfg = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.Build.0 = Debug|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.ActiveCfg = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.Build.0 = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.ActiveCfg = Release|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.Build.0 = Release|Win32 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.ActiveCfg = Release|x64 {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.Build.0 = Release|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.ActiveCfg = Debug|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.Build.0 = Debug|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.Build.0 = Debug|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.ActiveCfg = Debug|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.Build.0 = Debug|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.ActiveCfg = Release|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.Build.0 = Release|ARM64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.ActiveCfg = Release|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.Build.0 = Release|Win32 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.ActiveCfg = Release|x64 {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.Build.0 = Release|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.Build.0 = Debug|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.ActiveCfg = Debug|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.Build.0 = Debug|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.ActiveCfg = Debug|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.Build.0 = Debug|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.ActiveCfg = Release|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.Build.0 = Release|ARM64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.ActiveCfg = Release|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.Build.0 = Release|Win32 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.ActiveCfg = Release|x64 {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {1696CDC1-F411-4F84-BC94-C63FEB867D06} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} {7629D670-C419-402B-8A90-747952EE9FC0} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} {09D18587-D927-4047-977F-49918A174D5E} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} {6A44744B-BED4-49EC-87BB-83978458CE19} = {09D18587-D927-4047-977F-49918A174D5E} {F56B9CBA-A34D-4C68-9003-A6919236399E} = {09D18587-D927-4047-977F-49918A174D5E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution QtVersion = $(DefaultQtVersion) SolutionGuid = {E95EA102-6884-4CAD-AF6D-9BF36C69A33D} EndGlobalSection EndGlobal lcms2-2.19.1/Projects/Xcode_26/0000755000175000017500000000000015176573557015025 5ustar martimartilcms2-2.19.1/Projects/Xcode_26/lcms2/0000755000175000017500000000000015176573557016045 5ustar martimartilcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/0000755000175000017500000000000015176573557021061 5ustar martimartilcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/0000755000175000017500000000000015176573557025057 5ustar martimartilcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175000017500000000022615176573557032021 0ustar martimarti lcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/0000755000175000017500000000000015176573557027512 5ustar martimarti././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootlcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plistlcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceCh0000644000175000017500000000035615176573557032174 0ustar martimarti IDEDidComputeMac32BitWarning ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootlcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettingslcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSetti0000644000175000017500000000034215176573557032403 0ustar martimarti PreviewsEnabled lcms2-2.19.1/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.pbxproj0000644000175000017500000023640715176573557024151 0ustar martimarti// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 56; objects = { /* Begin PBXBuildFile section */ 4123B46925518DB1005F0287 /* linkicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B46825518DB1005F0287 /* linkicc.c */; }; 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4A325518FFB005F0287 /* xgetopt.c */; }; 4123B4B82551903B005F0287 /* tificc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4B72551903B005F0287 /* tificc.c */; }; 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; }; 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */; }; 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */; }; 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */; }; 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */; }; 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */; }; 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3D24C5E1C700DF2C21 /* cmssm.c */; }; 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */; }; 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */; }; 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */; }; 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4124C5E1C800DF2C21 /* cmstypes.c */; }; 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4224C5E1C800DF2C21 /* cmsio1.c */; }; 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4324C5E1C800DF2C21 /* cmspack.c */; }; 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4424C5E1C800DF2C21 /* cmsxform.c */; }; 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */; }; 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */; }; 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4724C5E1C800DF2C21 /* cmspcs.c */; }; 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4824C5E1C800DF2C21 /* cmsps2.c */; }; 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */; }; 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4A24C5E1C800DF2C21 /* cmserr.c */; }; 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4B24C5E1C800DF2C21 /* cmslut.c */; }; 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */; }; 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */; }; 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */; }; 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */; }; 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5024C5E1C900DF2C21 /* cmscam02.c */; }; 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5124C5E1C900DF2C21 /* cmssamp.c */; }; 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6D24C5E1E800DF2C21 /* lcms2.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */; }; 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */; }; 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */; }; 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */; }; 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */; }; 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */; }; 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */; }; 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */; }; 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */; }; 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */; }; 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */; }; 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */; }; 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */; }; 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */; settings = {ATTRIBUTES = (Public, ); }; }; 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */; }; 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF324C5E6C700DF2C21 /* xgetopt.c */; }; 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF424C5E6C700DF2C21 /* vprf.c */; }; 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF824C5E6D200DF2C21 /* transicc.c */; }; 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFD24C5E73100DF2C21 /* xgetopt.c */; }; 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFE24C5E73100DF2C21 /* vprf.c */; }; 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B0E24C5E79200DF2C21 /* utils.h */; }; 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B1224C5E7BB00DF2C21 /* vprf.c */; }; 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2424C5E92100DF2C21 /* tifdiff.c */; }; 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2724C5E92B00DF2C21 /* vprf.c */; }; 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2824C5E92B00DF2C21 /* xgetopt.c */; }; 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */; }; 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3924C5E99600DF2C21 /* jpgicc.c */; }; 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3E24C5E9F700DF2C21 /* vprf.c */; }; 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */; }; 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4324C5EC1D00DF2C21 /* testcms2.c */; }; 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4524C5EC1D00DF2C21 /* testplugin.c */; }; 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */; }; 4198300D2EDC66D700E88CD7 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; 419830262EDC887300E88CD7 /* fast_float_lab.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830252EDC887300E88CD7 /* fast_float_lab.c */; }; 419830352EDC8AC800E88CD7 /* threaded_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830342EDC8AC800E88CD7 /* threaded_testbed.c */; }; 419830412EDC8CF800E88CD7 /* libthreaded_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */; }; 419830492EDC8DC900E88CD7 /* threaded_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830442EDC8DC900E88CD7 /* threaded_core.c */; }; 4198304A2EDC8DC900E88CD7 /* threaded_scheduler.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830472EDC8DC900E88CD7 /* threaded_scheduler.c */; }; 4198304B2EDC8DC900E88CD7 /* threaded_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830462EDC8DC900E88CD7 /* threaded_main.c */; }; 4198304C2EDC8DC900E88CD7 /* threaded_split.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830482EDC8DC900E88CD7 /* threaded_split.c */; }; 4198304D2EDC8DC900E88CD7 /* threaded_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 419830452EDC8DC900E88CD7 /* threaded_internal.h */; }; 419830782EDC8ECC00E88CD7 /* lcms2_threaded.h in Headers */ = {isa = PBXBuildFile; fileRef = 419830772EDC8ECC00E88CD7 /* lcms2_threaded.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A8E24C5E35200DF2C21; remoteInfo = fast_float_plugin; }; 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 4198300E2EDC66D700E88CD7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 418B0A3024C5E19500DF2C21; remoteInfo = lcms2; }; 419830422EDC8CF800E88CD7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; proxyType = 1; remoteGlobalIDString = 419830392EDC8B1A00E88CD7; remoteInfo = threaded_plugin; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 418B0A7624C5E25200DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0AB624C5E42900DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0AC924C5E4EA00DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0ADF24C5E5C300DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B0324C5E76100DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B1824C5E85600DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 418B0B2D24C5E95D00DF2C21 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 41982FF42EDC65BC00E88CD7 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 4123B46825518DB1005F0287 /* linkicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linkicc.c; sourceTree = ""; }; 4123B4A325518FFB005F0287 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; 4123B4B72551903B005F0287 /* tificc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tificc.c; sourceTree = ""; }; 4123B4C2255190FE005F0287 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tifdiff.c; sourceTree = ""; }; 418B0A3124C5E19500DF2C21 /* liblcms2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblcms2.a; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgamma.c; path = ../../../src/cmsgamma.c; sourceTree = ""; }; 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsintrp.c; path = ../../../src/cmsintrp.c; sourceTree = ""; }; 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgmt.c; path = ../../../src/cmsgmt.c; sourceTree = ""; }; 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscnvrt.c; path = ../../../src/cmscnvrt.c; sourceTree = ""; }; 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmd5.c; path = ../../../src/cmsmd5.c; sourceTree = ""; }; 418B0A3D24C5E1C700DF2C21 /* cmssm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssm.c; path = ../../../src/cmssm.c; sourceTree = ""; }; 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsopt.c; path = ../../../src/cmsopt.c; sourceTree = ""; }; 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscgats.c; path = ../../../src/cmscgats.c; sourceTree = ""; }; 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsalpha.c; path = ../../../src/cmsalpha.c; sourceTree = ""; }; 418B0A4124C5E1C800DF2C21 /* cmstypes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmstypes.c; path = ../../../src/cmstypes.c; sourceTree = ""; }; 418B0A4224C5E1C800DF2C21 /* cmsio1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio1.c; path = ../../../src/cmsio1.c; sourceTree = ""; }; 418B0A4324C5E1C800DF2C21 /* cmspack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspack.c; path = ../../../src/cmspack.c; sourceTree = ""; }; 418B0A4424C5E1C800DF2C21 /* cmsxform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsxform.c; path = ../../../src/cmsxform.c; sourceTree = ""; }; 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmswtpnt.c; path = ../../../src/cmswtpnt.c; sourceTree = ""; }; 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmtrx.c; path = ../../../src/cmsmtrx.c; sourceTree = ""; }; 418B0A4724C5E1C800DF2C21 /* cmspcs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspcs.c; path = ../../../src/cmspcs.c; sourceTree = ""; }; 418B0A4824C5E1C800DF2C21 /* cmsps2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsps2.c; path = ../../../src/cmsps2.c; sourceTree = ""; }; 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsnamed.c; path = ../../../src/cmsnamed.c; sourceTree = ""; }; 418B0A4A24C5E1C800DF2C21 /* cmserr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmserr.c; path = ../../../src/cmserr.c; sourceTree = ""; }; 418B0A4B24C5E1C800DF2C21 /* cmslut.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmslut.c; path = ../../../src/cmslut.c; sourceTree = ""; }; 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsvirt.c; path = ../../../src/cmsvirt.c; sourceTree = ""; }; 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsplugin.c; path = ../../../src/cmsplugin.c; sourceTree = ""; }; 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmshalf.c; path = ../../../src/cmshalf.c; sourceTree = ""; }; 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio0.c; path = ../../../src/cmsio0.c; sourceTree = ""; }; 418B0A5024C5E1C900DF2C21 /* cmscam02.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscam02.c; path = ../../../src/cmscam02.c; sourceTree = ""; }; 418B0A5124C5E1C900DF2C21 /* cmssamp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssamp.c; path = ../../../src/cmssamp.c; sourceTree = ""; }; 418B0A6D24C5E1E800DF2C21 /* lcms2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2.h; path = ../../../include/lcms2.h; sourceTree = ""; }; 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_plugin.h; path = ../../../include/lcms2_plugin.h; sourceTree = ""; }; 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_internal.h; path = ../../../src/lcms2_internal.h; sourceTree = ""; }; 418B0A7824C5E25200DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfast_float_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_curves.c; path = ../../../plugins/fast_float/src/fast_float_curves.c; sourceTree = ""; }; 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15mats.c; path = ../../../plugins/fast_float/src/fast_float_15mats.c; sourceTree = ""; }; 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_tethra.c; path = ../../../plugins/fast_float/src/fast_float_tethra.c; sourceTree = ""; }; 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_cmyk.c; path = ../../../plugins/fast_float/src/fast_float_cmyk.c; sourceTree = ""; }; 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_16_tethra.c; path = ../../../plugins/fast_float/src/fast_16_tethra.c; sourceTree = ""; }; 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fast_float_internal.h; path = ../../../plugins/fast_float/src/fast_float_internal.h; sourceTree = ""; }; 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh.c; path = ../../../plugins/fast_float/src/fast_8_matsh.c; sourceTree = ""; }; 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_separate.c; path = ../../../plugins/fast_float/src/fast_float_separate.c; sourceTree = ""; }; 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh_sse.c; path = ../../../plugins/fast_float/src/fast_8_matsh_sse.c; sourceTree = ""; }; 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_tethra.c; path = ../../../plugins/fast_float/src/fast_8_tethra.c; sourceTree = ""; }; 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_sup.c; path = ../../../plugins/fast_float/src/fast_float_sup.c; sourceTree = ""; }; 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15bits.c; path = ../../../plugins/fast_float/src/fast_float_15bits.c; sourceTree = ""; }; 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_curves.c; path = ../../../plugins/fast_float/src/fast_8_curves.c; sourceTree = ""; }; 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_matsh.c; path = ../../../plugins/fast_float/src/fast_float_matsh.c; sourceTree = ""; }; 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_fast_float.h; path = ../../../plugins/fast_float/include/lcms2_fast_float.h; sourceTree = ""; }; 418B0AB824C5E42900DF2C21 /* fast_float_testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fast_float_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0ACB24C5E4EA00DF2C21 /* transicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0AE124C5E5C300DF2C21 /* linkicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = linkicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fast_float_testbed.c; path = ../../../plugins/fast_float/testbed/fast_float_testbed.c; sourceTree = SOURCE_ROOT; }; 418B0AF324C5E6C700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0AF424C5E6C700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0AF524C5E6C800DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0AF824C5E6D200DF2C21 /* transicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transicc.c; path = ../../../utils/transicc/transicc.c; sourceTree = SOURCE_ROOT; }; 418B0AFC24C5E73100DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0AFD24C5E73100DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0AFE24C5E73100DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B0524C5E76100DF2C21 /* tificc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tificc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B0E24C5E79200DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0B1224C5E7BB00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B1A24C5E85600DF2C21 /* tifdiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tifdiff; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B2424C5E92100DF2C21 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tifdiff.c; path = ../../../utils/tificc/tifdiff.c; sourceTree = SOURCE_ROOT; }; 418B0B2724C5E92B00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../common/vprf.c; sourceTree = ""; }; 418B0B2824C5E92B00DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; 418B0B2F24C5E95D00DF2C21 /* jpegicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jpegicc; sourceTree = BUILT_PRODUCTS_DIR; }; 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iccjpeg.c; path = ../../../utils/jpgicc/iccjpeg.c; sourceTree = SOURCE_ROOT; }; 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iccjpeg.h; path = ../../../utils/jpgicc/iccjpeg.h; sourceTree = SOURCE_ROOT; }; 418B0B3924C5E99600DF2C21 /* jpgicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jpgicc.c; sourceTree = ""; }; 418B0B3E24C5E9F700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; 418B0B4024C5E9F700DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; 418B0B4324C5EC1D00DF2C21 /* testcms2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcms2.c; path = ../../../testbed/testcms2.c; sourceTree = SOURCE_ROOT; }; 418B0B4424C5EC1D00DF2C21 /* testcms2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = testcms2.h; path = ../../../testbed/testcms2.h; sourceTree = SOURCE_ROOT; }; 418B0B4524C5EC1D00DF2C21 /* testplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testplugin.c; path = ../../../testbed/testplugin.c; sourceTree = ""; }; 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zoo_icc.c; path = ../../../testbed/zoo_icc.c; sourceTree = SOURCE_ROOT; }; 41982FF62EDC65BC00E88CD7 /* threaded_plugin_testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = threaded_plugin_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 419830252EDC887300E88CD7 /* fast_float_lab.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_lab.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/fast_float/src/fast_float_lab.c"; sourceTree = ""; }; 419830342EDC8AC800E88CD7 /* threaded_testbed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_testbed.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/testbed/threaded_testbed.c"; sourceTree = ""; }; 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libthreaded_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; 419830442EDC8DC900E88CD7 /* threaded_core.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_core.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_core.c"; sourceTree = ""; }; 419830452EDC8DC900E88CD7 /* threaded_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = threaded_internal.h; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_internal.h"; sourceTree = ""; }; 419830462EDC8DC900E88CD7 /* threaded_main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_main.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_main.c"; sourceTree = ""; }; 419830472EDC8DC900E88CD7 /* threaded_scheduler.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_scheduler.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_scheduler.c"; sourceTree = ""; }; 419830482EDC8DC900E88CD7 /* threaded_split.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_split.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_split.c"; sourceTree = ""; }; 419830772EDC8ECC00E88CD7 /* lcms2_threaded.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_threaded.h; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/include/lcms2_threaded.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 418B0A2F24C5E19500DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A7524C5E25200DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8D24C5E35200DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AB524C5E42900DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */, 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AC824C5E4EA00DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0ADE24C5E5C300DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B0224C5E76100DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B1724C5E85600DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B2C24C5E95D00DF2C21 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 41982FF32EDC65BC00E88CD7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 4198300D2EDC66D700E88CD7 /* liblcms2.a in Frameworks */, 419830412EDC8CF800E88CD7 /* libthreaded_plugin.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 419830382EDC8B1A00E88CD7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 418B0A2824C5E19500DF2C21 = { isa = PBXGroup; children = ( 419830762EDC8E3400E88CD7 /* threaded_plugin */, 419830332EDC8A9C00E88CD7 /* threaded_plugin_testbed */, 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */, 418B0A7324C5E1FE00DF2C21 /* include */, 418B0A6C24C5E1CE00DF2C21 /* src */, 418B0A7924C5E25200DF2C21 /* testbed */, 418B0AB924C5E42900DF2C21 /* fast_float_testbed */, 418B0ACC24C5E4EA00DF2C21 /* transicc */, 418B0AE224C5E5C300DF2C21 /* linkicc */, 418B0B0624C5E76100DF2C21 /* tificc */, 418B0B1B24C5E85600DF2C21 /* tifdiff */, 418B0B3024C5E95D00DF2C21 /* jpegicc */, 418B0A3224C5E19500DF2C21 /* Products */, 418B0A8924C5E30000DF2C21 /* Frameworks */, ); sourceTree = ""; }; 418B0A3224C5E19500DF2C21 /* Products */ = { isa = PBXGroup; children = ( 418B0A3124C5E19500DF2C21 /* liblcms2.a */, 418B0A7824C5E25200DF2C21 /* testbed */, 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */, 418B0AB824C5E42900DF2C21 /* fast_float_testbed */, 418B0ACB24C5E4EA00DF2C21 /* transicc */, 418B0AE124C5E5C300DF2C21 /* linkicc */, 418B0B0524C5E76100DF2C21 /* tificc */, 418B0B1A24C5E85600DF2C21 /* tifdiff */, 418B0B2F24C5E95D00DF2C21 /* jpegicc */, 41982FF62EDC65BC00E88CD7 /* threaded_plugin_testbed */, 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */, ); name = Products; sourceTree = ""; }; 418B0A6C24C5E1CE00DF2C21 /* src */ = { isa = PBXGroup; children = ( 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */, 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */, 418B0A5024C5E1C900DF2C21 /* cmscam02.c */, 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */, 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */, 418B0A4A24C5E1C800DF2C21 /* cmserr.c */, 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */, 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */, 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */, 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */, 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */, 418B0A4224C5E1C800DF2C21 /* cmsio1.c */, 418B0A4B24C5E1C800DF2C21 /* cmslut.c */, 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */, 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */, 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */, 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */, 418B0A4324C5E1C800DF2C21 /* cmspack.c */, 418B0A4724C5E1C800DF2C21 /* cmspcs.c */, 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */, 418B0A4824C5E1C800DF2C21 /* cmsps2.c */, 418B0A5124C5E1C900DF2C21 /* cmssamp.c */, 418B0A3D24C5E1C700DF2C21 /* cmssm.c */, 418B0A4124C5E1C800DF2C21 /* cmstypes.c */, 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */, 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */, 418B0A4424C5E1C800DF2C21 /* cmsxform.c */, ); name = src; sourceTree = ""; }; 418B0A7324C5E1FE00DF2C21 /* include */ = { isa = PBXGroup; children = ( 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */, 418B0A6D24C5E1E800DF2C21 /* lcms2.h */, ); name = include; sourceTree = ""; }; 418B0A7924C5E25200DF2C21 /* testbed */ = { isa = PBXGroup; children = ( 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */, 418B0B4324C5EC1D00DF2C21 /* testcms2.c */, 418B0B4424C5EC1D00DF2C21 /* testcms2.h */, 418B0B4524C5EC1D00DF2C21 /* testplugin.c */, ); name = testbed; sourceTree = SOURCE_ROOT; }; 418B0A8924C5E30000DF2C21 /* Frameworks */ = { isa = PBXGroup; children = ( ); name = Frameworks; sourceTree = ""; }; 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */ = { isa = PBXGroup; children = ( 419830252EDC887300E88CD7 /* fast_float_lab.c */, 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */, 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */, 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */, 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */, 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */, 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */, 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */, 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */, 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */, 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */, 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */, 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */, 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */, 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */, 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */, ); name = fast_float_plugin; sourceTree = ""; }; 418B0AB924C5E42900DF2C21 /* fast_float_testbed */ = { isa = PBXGroup; children = ( 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */, ); name = fast_float_testbed; path = ../../../plugins/fast_float/testbed; sourceTree = ""; }; 418B0ACC24C5E4EA00DF2C21 /* transicc */ = { isa = PBXGroup; children = ( 418B0AF824C5E6D200DF2C21 /* transicc.c */, 418B0AF524C5E6C800DF2C21 /* utils.h */, 418B0AF424C5E6C700DF2C21 /* vprf.c */, 418B0AF324C5E6C700DF2C21 /* xgetopt.c */, ); name = transicc; sourceTree = SOURCE_ROOT; }; 418B0AE224C5E5C300DF2C21 /* linkicc */ = { isa = PBXGroup; children = ( 4123B46825518DB1005F0287 /* linkicc.c */, 418B0AFC24C5E73100DF2C21 /* utils.h */, 418B0AFE24C5E73100DF2C21 /* vprf.c */, 418B0AFD24C5E73100DF2C21 /* xgetopt.c */, ); name = linkicc; path = ../../../utils/linkicc; sourceTree = SOURCE_ROOT; }; 418B0B0624C5E76100DF2C21 /* tificc */ = { isa = PBXGroup; children = ( 4123B4B72551903B005F0287 /* tificc.c */, 4123B4A325518FFB005F0287 /* xgetopt.c */, 418B0B1224C5E7BB00DF2C21 /* vprf.c */, 418B0B0E24C5E79200DF2C21 /* utils.h */, ); name = tificc; path = ../../../utils/tificc; sourceTree = SOURCE_ROOT; }; 418B0B1B24C5E85600DF2C21 /* tifdiff */ = { isa = PBXGroup; children = ( 4123B4C2255190FE005F0287 /* tifdiff.c */, 418B0B2724C5E92B00DF2C21 /* vprf.c */, 418B0B2824C5E92B00DF2C21 /* xgetopt.c */, 418B0B2424C5E92100DF2C21 /* tifdiff.c */, ); name = tifdiff; path = ../../../utils/tificc; sourceTree = SOURCE_ROOT; }; 418B0B3024C5E95D00DF2C21 /* jpegicc */ = { isa = PBXGroup; children = ( 418B0B4024C5E9F700DF2C21 /* utils.h */, 418B0B3E24C5E9F700DF2C21 /* vprf.c */, 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */, 418B0B3924C5E99600DF2C21 /* jpgicc.c */, 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */, 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */, ); name = jpegicc; path = ../../../utils/jpgicc; sourceTree = ""; }; 419830332EDC8A9C00E88CD7 /* threaded_plugin_testbed */ = { isa = PBXGroup; children = ( 419830342EDC8AC800E88CD7 /* threaded_testbed.c */, ); path = threaded_plugin_testbed; sourceTree = ""; }; 419830762EDC8E3400E88CD7 /* threaded_plugin */ = { isa = PBXGroup; children = ( 419830772EDC8ECC00E88CD7 /* lcms2_threaded.h */, 419830442EDC8DC900E88CD7 /* threaded_core.c */, 419830452EDC8DC900E88CD7 /* threaded_internal.h */, 419830462EDC8DC900E88CD7 /* threaded_main.c */, 419830472EDC8DC900E88CD7 /* threaded_scheduler.c */, 419830482EDC8DC900E88CD7 /* threaded_split.c */, ); path = threaded_plugin; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 418B0A2D24C5E19500DF2C21 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */, 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */, 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8B24C5E35200DF2C21 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */, 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 419830362EDC8B1A00E88CD7 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 4198304D2EDC8DC900E88CD7 /* threaded_internal.h in Headers */, 419830782EDC8ECC00E88CD7 /* lcms2_threaded.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 418B0A3024C5E19500DF2C21 /* lcms2 */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */; buildPhases = ( 418B0A2D24C5E19500DF2C21 /* Headers */, 418B0A2E24C5E19500DF2C21 /* Sources */, 418B0A2F24C5E19500DF2C21 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = lcms2; productName = lcms2; productReference = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; productType = "com.apple.product-type.library.static"; }; 418B0A7724C5E25200DF2C21 /* testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */; buildPhases = ( 418B0A7424C5E25200DF2C21 /* Sources */, 418B0A7524C5E25200DF2C21 /* Frameworks */, 418B0A7624C5E25200DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */, ); name = testbed; productName = testbed; productReference = 418B0A7824C5E25200DF2C21 /* testbed */; productType = "com.apple.product-type.tool"; }; 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */; buildPhases = ( 418B0A8B24C5E35200DF2C21 /* Headers */, 418B0A8C24C5E35200DF2C21 /* Sources */, 418B0A8D24C5E35200DF2C21 /* Frameworks */, ); buildRules = ( ); dependencies = ( 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */, ); name = fast_float_plugin; productName = fast_float_plugin; productReference = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; productType = "com.apple.product-type.library.static"; }; 418B0AB724C5E42900DF2C21 /* fast_float_testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */; buildPhases = ( 418B0AB424C5E42900DF2C21 /* Sources */, 418B0AB524C5E42900DF2C21 /* Frameworks */, 418B0AB624C5E42900DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */, 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */, ); name = fast_float_testbed; productName = fast_float_testbed; productReference = 418B0AB824C5E42900DF2C21 /* fast_float_testbed */; productType = "com.apple.product-type.tool"; }; 418B0ACA24C5E4EA00DF2C21 /* transicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */; buildPhases = ( 418B0AC724C5E4EA00DF2C21 /* Sources */, 418B0AC824C5E4EA00DF2C21 /* Frameworks */, 418B0AC924C5E4EA00DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */, ); name = transicc; productName = transicc; productReference = 418B0ACB24C5E4EA00DF2C21 /* transicc */; productType = "com.apple.product-type.tool"; }; 418B0AE024C5E5C300DF2C21 /* linkicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */; buildPhases = ( 418B0ADD24C5E5C300DF2C21 /* Sources */, 418B0ADE24C5E5C300DF2C21 /* Frameworks */, 418B0ADF24C5E5C300DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */, ); name = linkicc; productName = linkicc; productReference = 418B0AE124C5E5C300DF2C21 /* linkicc */; productType = "com.apple.product-type.tool"; }; 418B0B0424C5E76100DF2C21 /* tificc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */; buildPhases = ( 418B0B0124C5E76100DF2C21 /* Sources */, 418B0B0224C5E76100DF2C21 /* Frameworks */, 418B0B0324C5E76100DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */, ); name = tificc; productName = tificc; productReference = 418B0B0524C5E76100DF2C21 /* tificc */; productType = "com.apple.product-type.tool"; }; 418B0B1924C5E85600DF2C21 /* tifdiff */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */; buildPhases = ( 418B0B1624C5E85600DF2C21 /* Sources */, 418B0B1724C5E85600DF2C21 /* Frameworks */, 418B0B1824C5E85600DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */, ); name = tifdiff; productName = tifdiff; productReference = 418B0B1A24C5E85600DF2C21 /* tifdiff */; productType = "com.apple.product-type.tool"; }; 418B0B2E24C5E95D00DF2C21 /* jpegicc */ = { isa = PBXNativeTarget; buildConfigurationList = 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */; buildPhases = ( 418B0B2B24C5E95D00DF2C21 /* Sources */, 418B0B2C24C5E95D00DF2C21 /* Frameworks */, 418B0B2D24C5E95D00DF2C21 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */, ); name = jpegicc; productName = jpegicc; productReference = 418B0B2F24C5E95D00DF2C21 /* jpegicc */; productType = "com.apple.product-type.tool"; }; 41982FF52EDC65BC00E88CD7 /* threaded_plugin_testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 41982FFA2EDC65BC00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin_testbed" */; buildPhases = ( 41982FF22EDC65BC00E88CD7 /* Sources */, 41982FF32EDC65BC00E88CD7 /* Frameworks */, 41982FF42EDC65BC00E88CD7 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 4198300F2EDC66D700E88CD7 /* PBXTargetDependency */, 419830432EDC8CF800E88CD7 /* PBXTargetDependency */, ); name = threaded_plugin_testbed; packageProductDependencies = ( ); productName = threaded_plugin_testbed; productReference = 41982FF62EDC65BC00E88CD7 /* threaded_plugin_testbed */; productType = "com.apple.product-type.tool"; }; 419830392EDC8B1A00E88CD7 /* threaded_plugin */ = { isa = PBXNativeTarget; buildConfigurationList = 4198303B2EDC8B1A00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin" */; buildPhases = ( 419830362EDC8B1A00E88CD7 /* Headers */, 419830372EDC8B1A00E88CD7 /* Sources */, 419830382EDC8B1A00E88CD7 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = threaded_plugin; packageProductDependencies = ( ); productName = threaded_plugin; productReference = 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 418B0A2924C5E19500DF2C21 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1430; ORGANIZATIONNAME = littlecms; TargetAttributes = { 418B0A3024C5E19500DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0A7724C5E25200DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0A8E24C5E35200DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0AB724C5E42900DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0ACA24C5E4EA00DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0AE024C5E5C300DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B0424C5E76100DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B1924C5E85600DF2C21 = { CreatedOnToolsVersion = 11.6; }; 418B0B2E24C5E95D00DF2C21 = { CreatedOnToolsVersion = 11.6; }; 41982FF52EDC65BC00E88CD7 = { CreatedOnToolsVersion = 26.1.1; }; 419830392EDC8B1A00E88CD7 = { CreatedOnToolsVersion = 26.1.1; }; }; }; buildConfigurationList = 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */; compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 418B0A2824C5E19500DF2C21; productRefGroup = 418B0A3224C5E19500DF2C21 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 418B0A3024C5E19500DF2C21 /* lcms2 */, 418B0A7724C5E25200DF2C21 /* testbed */, 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */, 418B0AB724C5E42900DF2C21 /* fast_float_testbed */, 418B0ACA24C5E4EA00DF2C21 /* transicc */, 418B0AE024C5E5C300DF2C21 /* linkicc */, 418B0B0424C5E76100DF2C21 /* tificc */, 418B0B1924C5E85600DF2C21 /* tifdiff */, 418B0B2E24C5E95D00DF2C21 /* jpegicc */, 41982FF52EDC65BC00E88CD7 /* threaded_plugin_testbed */, 419830392EDC8B1A00E88CD7 /* threaded_plugin */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 418B0A2E24C5E19500DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */, 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */, 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */, 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */, 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */, 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */, 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */, 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */, 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */, 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */, 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */, 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */, 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */, 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */, 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */, 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */, 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */, 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */, 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */, 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */, 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */, 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */, 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */, 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */, 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */, 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A7424C5E25200DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */, 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */, 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0A8C24C5E35200DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */, 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */, 419830262EDC887300E88CD7 /* fast_float_lab.c in Sources */, 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */, 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */, 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */, 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */, 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */, 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */, 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */, 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */, 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */, 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */, 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AB424C5E42900DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0AC724C5E4EA00DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */, 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */, 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0ADD24C5E5C300DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */, 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */, 4123B46925518DB1005F0287 /* linkicc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B0124C5E76100DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */, 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */, 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */, 4123B4B82551903B005F0287 /* tificc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B1624C5E85600DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */, 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */, 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 418B0B2B24C5E95D00DF2C21 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */, 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */, 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */, 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 41982FF22EDC65BC00E88CD7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 419830352EDC8AC800E88CD7 /* threaded_testbed.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 419830372EDC8B1A00E88CD7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 419830492EDC8DC900E88CD7 /* threaded_core.c in Sources */, 4198304A2EDC8DC900E88CD7 /* threaded_scheduler.c in Sources */, 4198304B2EDC8DC900E88CD7 /* threaded_main.c in Sources */, 4198304C2EDC8DC900E88CD7 /* threaded_split.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */; }; 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */; }; 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */; targetProxy = 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */; }; 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */; }; 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */; }; 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */; }; 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */; }; 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */; }; 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */; }; 4198300F2EDC66D700E88CD7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 418B0A3024C5E19500DF2C21 /* lcms2 */; targetProxy = 4198300E2EDC66D700E88CD7 /* PBXContainerItemProxy */; }; 419830432EDC8CF800E88CD7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 419830392EDC8B1A00E88CD7 /* threaded_plugin */; targetProxy = 419830422EDC8CF800E88CD7 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 418B0A3324C5E19500DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 418B0A3424C5E19500DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Release; }; 418B0A3624C5E19500DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 418B0A3724C5E19500DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; 418B0A7D24C5E25200DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0A7E24C5E25200DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0A9124C5E35200DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = ( "DEBUG=1", "$(inherited)", ); "GCC_PREPROCESSOR_DEFINITIONS[arch=arm64]" = ( "CMS_DONT_USE_SSE2=1", "$(inherited)", ); PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 418B0A9224C5E35200DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; EXECUTABLE_PREFIX = lib; "GCC_PREPROCESSOR_DEFINITIONS[arch=arm64]" = "CMS_DONT_USE_SSE2=1"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; 418B0ABD24C5E42900DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0ABE24C5E42900DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0AD024C5E4EA00DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0AD124C5E4EA00DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0AE624C5E5C300DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0AE724C5E5C300DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B0A24C5E76100DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B0B24C5E76100DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B1F24C5E85600DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B2024C5E85600DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ltiff", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 418B0B3424C5E95D00DF2C21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ljpeg", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 418B0B3524C5E95D00DF2C21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; HEADER_SEARCH_PATHS = /usr/local/include; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ( "-L", /usr/local/lib, "-ljpeg", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 41982FFB2EDC65BC00E88CD7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = c99; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 41982FFC2EDC65BC00E88CD7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = c99; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 4198303C2EDC8B1A00E88CD7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 2B6XNJ4DBN; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = gnu17; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 4198303D2EDC8B1A00E88CD7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 2B6XNJ4DBN; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = gnu17; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A3324C5E19500DF2C21 /* Debug */, 418B0A3424C5E19500DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A3624C5E19500DF2C21 /* Debug */, 418B0A3724C5E19500DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A7D24C5E25200DF2C21 /* Debug */, 418B0A7E24C5E25200DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0A9124C5E35200DF2C21 /* Debug */, 418B0A9224C5E35200DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0ABD24C5E42900DF2C21 /* Debug */, 418B0ABE24C5E42900DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0AD024C5E4EA00DF2C21 /* Debug */, 418B0AD124C5E4EA00DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0AE624C5E5C300DF2C21 /* Debug */, 418B0AE724C5E5C300DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B0A24C5E76100DF2C21 /* Debug */, 418B0B0B24C5E76100DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B1F24C5E85600DF2C21 /* Debug */, 418B0B2024C5E85600DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */ = { isa = XCConfigurationList; buildConfigurations = ( 418B0B3424C5E95D00DF2C21 /* Debug */, 418B0B3524C5E95D00DF2C21 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 41982FFA2EDC65BC00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin_testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 41982FFB2EDC65BC00E88CD7 /* Debug */, 41982FFC2EDC65BC00E88CD7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4198303B2EDC8B1A00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin" */ = { isa = XCConfigurationList; buildConfigurations = ( 4198303C2EDC8B1A00E88CD7 /* Debug */, 4198303D2EDC8B1A00E88CD7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 418B0A2924C5E19500DF2C21 /* Project object */; } lcms2-2.19.1/README.md0000644000175000017500000000235415176573557013146 0ustar martimarti ![Little CMS](doc/logo-small.png) # About Little CMS [www.littlecms.com](https://www.littlecms.com) Little CMS intends to be an **OPEN SOURCE** small-footprint color management engine, with special focus on accuracy and performance. It uses the International Color Consortium standard (ICC), which is the modern standard when regarding to color management. The ICC specification is widely used and is referred to in many International and other de-facto standards. It was approved as an International Standard, ISO 15076-1, in 2005. # Conformance Little CMS is a **FULL IMPLEMENTATION** of ICC specification 4.4, it fully supports all kind of V2 and V4 profiles, including abstract, devicelink and named color profiles. Check the tutorial for a exhaustive list of features. # A bit of story Since the initial release, back in 1998, Little CMS has grown to become one of the most popular open-source color management libraries, and has been used in a large number of production projects, in areas as printer firmware, monitors, digital cameras, RIPs, publishing, scientific, and many others. You can find Little CMS in most Linux distributions, and it's released under an open source license. ### Please see the complete documentation in doc folder lcms2-2.19.1/autogen.sh0000755000175000017500000000531715176573557013672 0ustar martimarti#!/bin/sh # Run this to generate all the initial makefiles, etc. srcdir=`dirname $0` test -z "$srcdir" && srcdir=. DIE=0 ACLOCAL_FLAGS="-I m4" if [ "$1" = "--distclean" ]; then make distclean rm configure config.guess config.sub depcomp install-sh missing rm aclocal.m4 compile ltmain.sh m4/libtool.m4 m4/ltoptions.m4 rm m4/ltsugar.m4 m4/lt~obsolete.m4 m4/ltversion.m4 echo done cleaning! exit 0 fi (test -f $srcdir/configure.ac) || { echo -n "**Error**: Directory $srcdir does not look like the" echo " top-level package directory" exit 1 } (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have autoconf installed." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } (grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && { (libtoolize --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have libtool installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 } } (automake --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have automake installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 NO_AUTOMAKE=yes } # if no automake, don't bother testing for aclocal test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: Missing aclocal. The version of automake" echo "installed doesn't appear recent enough." echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi if test -z "$*"; then echo "**Warning**: I am going to run configure with no arguments." echo "If you wish to pass any to it, please specify them on the" echo $0 " command line." echo fi case $CC in xlc ) am_opt=--include-deps;; esac aclocalinclude="$ACLOCAL_FLAGS" if grep "^LT_INIT" configure.ac >/dev/null; then if test -z "$NO_LIBTOOLIZE" ; then echo "Running libtoolize..." libtoolize --force --copy fi fi echo "Running aclocal $aclocalinclude ..." aclocal $aclocalinclude if grep "^AC_CONFIG_HEADERS" configure.ac >/dev/null; then echo "Running autoheader..." autoheader fi echo "Running automake --add-missing -copy --gnu -Wno-portability $am_opt ..." automake --add-missing --copy --gnu -Wno-portability $am_opt echo "Running autoconf ..." autoconf conf_flags="--enable-maintainer-mode" if test x$NOCONFIGURE = x; then echo "Running $srcdir/configure $conf_flags $@ ..." $srcdir/configure $conf_flags "$@" \ && echo "Now type make to compile." || exit 1 else echo "Skipping configure process." fi lcms2-2.19.1/bin/0000755000175000017500000000000015176573557012433 5ustar martimartilcms2-2.19.1/bin/Bin.txt0000644000175000017500000000000315176573557013675 0ustar martimartiBinlcms2-2.19.1/doc/0000755000175000017500000000000015176573557012430 5ustar martimartilcms2-2.19.1/doc/logo-small.png0000644000175000017500000000537315176573557015214 0ustar martimartiPNG  IHDRnpiCCPicc(u;KA?%)I"Q$iEMvCcM`+X,D_@[VAA_૑I$ޏ3s.3g9} r }Ke7e:[|t.FuOwիk-i (<#(wLbMHxԔ _+]t?,8TO_kXϘ9a.[ϣnҝ/Fb!D%R$ 5/5| ģߠ)4ZI)ѓe)i&ݻlCڅjŶmz'7iSJCg ί0h$DMrtRv=q轅ΕzV>@lS`X{V<$h& pHYs.#.#x?v 1IDAThCY{pWޛGM& N:F!iӁRMKNmJVTc#XqT%'/mi}L+0V҆ږ(oB !=~ߞfہמ=9גBp8n0Lwe8:x+i < g ❁%Zhziu`!-n"x#~0n-Ah+b[AC +gxpQNkh'  Ƹ,TDݗG"=ض-2ydimm+VT8xy>_PQ}E -,aںQ? nڋU2=gЮV5%QTf?Ҍd21_&ɩ_Y1!CUV)u]եF/0E叏e D+XWC3DE.cՕJp_:Q^-Z5FH+i:3c(醔PuNCm6rs۝V1Uԥ뷡-mիeRSS#{ݻwÇYM#z1sjJ<,a+B[y™dgפּܧ\9 n^ y*g|4"[4Ut(L@=7Bg%z:_ Q|Gt+Rph+TWW{.r֬Y2n8y̙3~nD ?1/h$.3lӦgWDSb)nqo_ @Q*Cnqu5k]GhEqs_+=Xb\Omۭ +qM,_kRY^~]DȒݭ-[/_ʹsq1'Z>ϕs۱m1L=/w1> |Y~ڔ4Ksޔ{7)JUVEw,A[qsY\עiE<~'04/n|Ov/\Z\FTyIGG=Z̙#UUU!Ur8}-B:ΙZ:Ŕ=~}`0M6jϒ`*÷AX%0$p[NIN6EG3zcSf¡Tڗ(Y:A;Z`i}iJݝ^_~05p6HRVV&TJ&M$ϗ%KZ Qxp\V@'3-&RrZYSp_pd@Z#Zhe> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj [ 16 0 R] endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> stream JFIF``C   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQL" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )UK0Uw~k}*\PD@~@MI@-tk =? x6e>ӦtuKq,uWPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPV>Ty}&asEegy[ j_ x^V .(CZ%[Dd#G/[o}p!mQּA|y]ѭ3!BzwJFAo4XՉX/כ|"ф7:̫_?#?k(9IpFݏ@$׉_>Ō-ǻֽ#p"`]~q:{VzYG?zCMGYxwNۙfaHާVxƱhP,zAH|}4 m>յ$r!]Ggv,rNI>M%449,$((((((((((((((((((((((((((((((((('<Oz} H{_trnc '֢E9 4]nzڀ/Q v%r{vY&rYI>Y1$OzJ(((((((((((((((((((((((((((((((((4mPH=q,q#;ª}^wˍCj$-ԑH$ҵ|%&|\ߑLÅQֺ)K<: p&\ĝ/ښ/D;7h?Q4;O$㆗z/?ʍV#PEPEPEPEPEPEPEPEPEPEPEPS[Z]7rjy~fX m`CoƃYT\DqƓZ WbrJd3f8lT!s]WI~gq?OQ8S$o!h7U zuxqQ}0aj'᎜]#iѣI"֭{ilήʰCeEur5>Y6նe-Cy/) CgQ^mo<>~F#_+>:t9V7 n)̑ 9JȄvE]./6L%خ1k܆[Os7s!R\8[IΡXsA[&1cב^ Gq4*vA[Zw]A3yks: RB5KI*Á hZYX^W'-MT3OGϨFdZ)0/ʚ񆈏\;gjz=0_(Z6>NކO<JӛvS*{TUaaEy>,2V8O|{W~ KUꖩQEz(QEQEQEQEQEQEQEQEQE{M:(qv^iZ]XG+(:^*kVK L 8MptQEQEQEQEQEQEQEQEQEQEU>ﯢN x&@?j֌=LOr:kxmWlh0s#Z1#9?=v34,j س1'GYӊzf'9 $y\rM6+=K$2 "vG^WK]9X]~/EiN,ʥ(TeiZY\cԖ_t_PT_t_J:)h kʣ0U=s6d #Boe(f}#e ݍMrV TfHe 5OߺOyٕFyYUYz?У[#ݸ~T5m, ]ͥQ{/ʰү{G</+* ͷB0]Cc+ķTC زʽxV(. G*kh|M!cǭE?f^'zŢ"S$ypJclη<~(yuCU[J|8*p}i;ekFюπq!+=(Πή.ƽN긝SBw?m\N!;kA>M}KzlL3$_0w>Շ^}CG'ކ20zVyUIol,3 =9 Y>t3ʐ@ ɤC 5[C*X<>E,]Swy9һ[/kbdokU ,0^~wռ{%3* &{5?na6sY5;FDmb^J0~»/k> stream xw`o.H#">EtJ >Tz( v{/vgl-G_r3s3ߛᰱQ3HxTtR՚=Gͮ_ᎬP^w}yog_%[<\]9X]{uҭ^̮a+wt ҵԌlV=B~66"Zvc?5Kz26V}fo{KeK-1ghw~=wU|16Xo&)mTÙ(ccO}J LrI[dc $eI+cvlLԀ픅Cvec8'j\avl)5=CSfc(#II^ogc nv˧ͳ1ҋ2Sao]xɿ,9Bv]<{Ǧ ;i^rPM1ȅjgJNli7kJ#B܌ٍ1(OƵKL3ٚ%]-)W:J@rUt/uoY>D~1+,vM^[S3RB?&O(^!%JYƖԬO{f:#殗KGHa-9M?LluT9OXA_e7d-?m_),67ܽy l2Z%;Z2-#-~j: [˓jGj70.@o}0>B'cNm n(3η }th)]v"g@մ4\EwG(x ѝ&ZB]TQ%G`wk#FKs;R+OdJS%]4:th)j5Y |Դ1*Mr-o92;h,o&JBR?h*Z;k!f7MRH+ ,<5 Wnag&i9x`< ({Է\Nnb/hxI-xOa}@m1ջ~?틚b5ү|,nMtR;b8\r%1/U?lWZr6#zڗ%oGK|SIP#Eع%wTWk>-7YL~b3ķVUw>MrIn$]3-E=>Z]cWq*ULdw9SDAKr:/3g/ѹܿpi24Td]=x9M;@)-|]58QBE1r\/Mܿzpi5IKdîݸZO:n܂I}WcWp GL4|tx?Zi=Od?/a=* 4S6Fhʞjyw24 ƿONjQ#.ZϹ mq?hU29y9Gro M%֒q)ck$YeZ*D Sɀ6z*qǔΗ3g ǣ T-8=}s QRsY:yͬ%y*#-q1@>s UMjPFs,-@K5|' B95ZEt>l?5Ah[~} --s \+ l"S0@Kq+y2: EtR`}-sq$x$e4BS!&C@K ڹ#T`}-ոh_  mش1Z$ DLeƞPFQjR)؆lfI$$a̜-3.`ƮPJQmZ DBW sj [_K 9 ժ% Y_QRMCok)Z cZW^PJji )Gʹe(4%˺R;riZW2**76qBTֻaD>RqD12--u-R 3~ eⰔ~645-}2!7H_a<,{μL&ѿxisXNMI*fTك^6+z1 Uh1* 5-}rJ(έx-K!H:U=2Z\M9Sg6%ef|ic)Z =mĮzO[̂HTL e6W[ye/.ˇ ZF78w-[D>Vz>j#]05g޹\8YpךgyZ{ 3N%f 1GB |ze6T@ܝ$%n ЋlC4;̈,̼ty!eH!zt~X|zѓ =ٷ{XJYEwh+㙏S5:rP2!a!]~_a4 ,+Z`fC .7p&΂4t{`f} m$Oˆ٨UsAA[qɂv"z|9e6FmIV['&%|ic帻M16^GA+&/ӥMiUVwJBhDogߺ /΍njB jҺ5{hb$!cV#)~2+\!"ŔC|8[dR{x 60sZ!v6@ MuQФ2ܨ~1h*ig0pe64 8|" Z*٧ {5>ӗp$6lϗȅ!6tWo-8ÉgyGի&bF3(!bH챞0O +A!epW/O-se"cyD* [%®8Qh̍1l^XU%N%[ 1l1 ,K8SxQZA~wv>: F) !-G~GQ8Y}/ y |MgCtWo_ު#&qKgt LIx b8Uט.-=<ЁNif5А- B3@ уH +9} CC>7ewcDfO*2+pBFҒP"qҊn|&6 y?lLBO, qg1ĠYJNgBR4Dفllە:D&41A']UW?pb]ِhΘY㡈VNi<4{;aik0-iۦmx7 ;|W7ڦݥ\Bݕ6;޾Pʝvͅ_VOf=~C%L1{GZ>eLjR,1_}жYWo)masV?ۅyN/6UWJI^5V?O h##< BBˆ',Z=I+?2r7ndlRQJM}{z}LOU'v{rV&aqom}N*G˪Hf0SG. :͗29ALDJBY\c]+]_a-uP$̝CkYT틂.ψ٩%iQاMZq`#Ǔ~z<=Ty_b =*h`XKLK;LX1Q-LGdm{E=#IJF3KpoT3^\Rݗ]L14Gm}-ABp%bb,_';)F1d<ηIu'4OtHw`HP)X-nL.8 d#g}wW}Y5 3w jIQL1 Gv`j;dx!-W3a ywp)UйGj;0} Y̍ҕ%6X[Y]0SR &7Vրݫ/#,OMVZ*vK]Y{њ܍Ci\[Gkz%>.KDR,Bk!^K`>_~%j?7K /Ck:mpօ$pU?pP g -8ȗZWl[Zʁ ^r(3 \ӄ{y?S~9i[ jLRK>5|$O4Jq wȷ|+a? Xq~ZE%UCF24RP_ ZAêFjsxՁb*PK>@u>Eu:HZjoS|kY`FJWsS>(Z <]E,uαh-jЈ;l\wV}B z"lZ$_{gLc@D#[zUΕ*dke<Wb71?YjSc<ZD3L},rgW;HKA fo?9;S?WEuߪ/E6kJw"f-bv>OW `J?ZrA:'y∸p=)S4֊]y_>@`U|X^i(4MN%-xJ 'KiJH#\r-jZr~t @ps /o/{_* ;G%ɛPW X-2^#ĴļH4?@ښwg&*3lP^aW h X=K֘؂S6-9=QYik[USm>mF]qX6c9THr|P-K=X;CLKGbWV7؃޵d (MP)pi*j QUp!wE\KRDg; Yq0C$bKjlrh lʣ>HhԜ!`IU, D 覲}jq7cdJJh"̗^N%G7~`h ~RJ܁7&Dp_. m#9]&=Pr#2{x 44H<\p  UpqZr;OK 5ټ,-q^ca,I~l9h`? 4Iy!pxxi10&WK90AeOODL6ŀovckU; A.-! ˝). VKgfK T@KyjAJ;]qނ9ɣpaY-U?L]=Z 6p/Z-L!Qx!dcz3~|KR7ak L? W9H5d-ޭJH=ATSL}~QDRjpV20u'Bo>:n|@d>DNù/ͪf-9aV^YP*pF+1il{#1 q<^gՁQ"<ۦ\dWSIKEzڬVK&ß,(?Tݭ 3rEG[ݍ`ƵIKF^yCq/ K9TK'jxhN8uSg*MR7 L y1-E[ïpnN(u&|DjZ_ea,qN*Zr<y"Z U.tZEG`Qm4aVKcy)y21YK=*CYKQÿw 2 M# Mk:- Y!+HpkyR+ׄvWHLd-9*Ƕ kGOtXH*Mq~wQ 괕޴Zm*cc(np?vy>wVnBP"Z*"/\Zjj1%}/Tp!j%0*o9?sjju#]*|sКWDK\2"i)s3Όa~5 v8W &$g2ьn&ֽ",Ph%`=qS &1-v##'AKŷUAl%F+TAN ܳwHyu`%Ig!Eɩm8oA-gjŴ̘.ȇx-9V@>خ ͏L=3x7yi9_B^IWO쳩8 7{UWTKR(X^N#UVj킅B?. ̗q6m]E {}T3ѭZ=+ҡ8 ~Zr<]n~גk|r3%h+Z4~{;Žk4\b'-%RM|7X(bŵR0cڎKrw75i' ;G6AڪEk\={W뽶4Zl .9גZ3~_\LJ|? չ$լ˔nɛg v++_*KBK"]!n|0"%TX6*s.ՎGe(7i!)z`t$cSź'z>ђ:& XxdF=G3}k(?#zgiY} p>0Puv&-1Nw@U4lc݆Nü%j=6N|~EoJFaم?ݴCA ?0ϙYIw-Uod^^?m;?t[UF_8u[[X~D%~iWmuSe _ۣu,[AǔWLX tѱErz2u]7on Sͺ"oc 1R5j1j6:qJZaύ2p% dzE}(䀴6q}vC(j'ϭ=-{"S z =]7%|,ؘ*iɸ&%Mpkc1m xd۝ M>Ԉ(u3v[̖ %\ԑjU+`|OL;YΝ;o}v@L@K'c[6oڸxݺtҦnI[<6rirfL^V֩SBK6gaܲ1,I endstream endobj 21 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 23 0 R 29 0 R 30 0 R 31 0 R 32 0 R 34 0 R 36 0 R 38 0 R 39 0 R 40 0 R 42 0 R 45 0 R 46 0 R 48 0 R 50 0 R 52 0 R 54 0 R 59 0 R 62 0 R 65 0 R 69 0 R 76 0 R 89 0 R 92 0 R 95 0 R 98 0 R 102 0 R 104 0 R 106 0 R 109 0 R 111 0 R] /MediaBox[ 0 0 612 792] /Contents 22 0 R/Group<>/Tabs/S>> endobj 22 0 obj <> stream x͝s=b2F$Moҹ6לyHȴI%EϖGL=MyW>yRO5ZUՁs7>f̫ȁDhgTUDz]!+rL}⟜kSRd@QRRdA;rT8$uelА;ΐc U?GGV:Pc @Ï~/I$ ^$F9D =NHAIHAGH>N# jzv~ йͷG Iۿ6%Ei"k`vs(L@@"!-AԼňWHG hjeDWc-nYCSZUרNIEqc$ϡsto(Ir"[#!raG(I+ߺ\Z 0,Ih&(ڔPLJ,(2'JJsBx#l|Qyn-<--I[R[R[T$ԃw&|s2`*JewCܴ^RKy6_,Ǵ? CWONj6WUH|9kh(GT9#wn(CBT]ᖹ ^ޏZH'ٌyoТjIh%DEKIt׌ >=W.HKc=%Vb ʖJn*8;S-o96$Oo و#V62 & ͟ν@ Q#Zp.ۅsogBx1kg&GHpMĤhHĤhHļ@;=X?G0O(K9'#Ӫ[]QC!@bL%#h4DG/$ϣسpD#jB yBqZkM d˻KjUw@mHPXCsMHz"ypD#t[J9!v`!h=a'71 ٗwtUB}WG)QIyz;|J9U>lD2U7凧]Ehm6O;Ms%'֢yDJ<3UFI y$TIJ~kpuU endstream endobj 23 0 obj <>/F 4/Dest[ 26 0 R/XYZ 82 721 0] >> endobj 24 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 116 0 R 118 0 R 121 0 R 124 0 R 125 0 R 127 0 R 134 0 R 137 0 R 139 0 R 140 0 R 141 0 R 143 0 R 146 0 R 147 0 R 148 0 R 150 0 R 152 0 R 154 0 R 159 0 R 166 0 R 169 0 R 173 0 R 175 0 R 181 0 R 186 0 R 189 0 R 193 0 R 196 0 R 200 0 R 202 0 R 205 0 R 208 0 R 210 0 R] /MediaBox[ 0 0 612 792] /Contents 115 0 R/Group<>/Tabs/S>> endobj 25 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 214 0 R 216 0 R 218 0 R 221 0 R 223 0 R 228 0 R 235 0 R 237 0 R 241 0 R 244 0 R 252 0 R 257 0 R 259 0 R 263 0 R 265 0 R 267 0 R 271 0 R 275 0 R 282 0 R 290 0 R 292 0 R] /MediaBox[ 0 0 612 792] /Contents 213 0 R/Group<>/Tabs/S>> endobj 26 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 296 0 R] /MediaBox[ 0 0 612 792] /Contents 295 0 R/Group<>/Tabs/S>> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <>/F 4/Dest[ 26 0 R/XYZ 82 636 0] >> endobj 30 0 obj <>/F 4/Dest[ 26 0 R/XYZ 82 541 0] >> endobj 31 0 obj <>/F 4/Dest[ 26 0 R/XYZ 82 498 0] >> endobj 32 0 obj <>/F 4/Dest[ 33 0 R/XYZ 82 338 0] >> endobj 33 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 298 0 R] /MediaBox[ 0 0 612 792] /Contents 297 0 R/Group<>/Tabs/S>> endobj 34 0 obj <>/F 4/Dest[ 35 0 R/XYZ 82 721 0] >> endobj 35 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 299 0 R/Group<>/Tabs/S>> endobj 36 0 obj <>/F 4/Dest[ 37 0 R/XYZ 82 628 0] >> endobj 37 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 305 0 R/Group<>/Tabs/S>> endobj 38 0 obj <>/F 4/Dest[ 37 0 R/XYZ 82 520 0] >> endobj 39 0 obj <>/F 4/Dest[ 37 0 R/XYZ 82 438 0] >> endobj 40 0 obj <>/F 4/Dest[ 41 0 R/XYZ 82 721 0] >> endobj 41 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 306 0 R/Group<>/Tabs/S>> endobj 42 0 obj <>/F 4/Dest[ 44 0 R/XYZ 82 721 0] >> endobj 43 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 314 0 R/Group<>/Tabs/S>> endobj 44 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 315 0 R/Group<>/Tabs/S>> endobj 45 0 obj <>/F 4/Dest[ 44 0 R/XYZ 82 559 0] >> endobj 46 0 obj <>/F 4/Dest[ 47 0 R/XYZ 82 721 0] >> endobj 47 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 316 0 R/Group<>/Tabs/S>> endobj 48 0 obj <>/F 4/Dest[ 49 0 R/XYZ 82 721 0] >> endobj 49 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 317 0 R/Group<>/Tabs/S>> endobj 50 0 obj <>/F 4/Dest[ 51 0 R/XYZ 82 721 0] >> endobj 51 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 318 0 R/Group<>/Tabs/S>> endobj 52 0 obj <>/F 4/Dest[ 53 0 R/XYZ 82 721 0] >> endobj 53 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 319 0 R/Group<>/Tabs/S>> endobj 54 0 obj <>/F 4/Dest[ 58 0 R/XYZ 82 721 0] >> endobj 55 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 320 0 R/Group<>/Tabs/S>> endobj 56 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 321 0 R/Group<>/Tabs/S>> endobj 57 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 322 0 R/Group<>/Tabs/S>> endobj 58 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 323 0 R/Group<>/Tabs/S>> endobj 59 0 obj <>/F 4/Dest[ 61 0 R/XYZ 82 721 0] >> endobj 60 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 324 0 R/Group<>/Tabs/S>> endobj 61 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 325 0 R/Group<>/Tabs/S>> endobj 62 0 obj <>/F 4/Dest[ 64 0 R/XYZ 82 721 0] >> endobj 63 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 326 0 R/Group<>/Tabs/S>> endobj 64 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 327 0 R/Group<>/Tabs/S>> endobj 65 0 obj <>/F 4/Dest[ 68 0 R/XYZ 82 721 0] >> endobj 66 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 328 0 R/Group<>/Tabs/S>> endobj 67 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 329 0 R/Group<>/Tabs/S>> endobj 68 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 330 0 R/Group<>/Tabs/S>> endobj 69 0 obj <>/F 4/Dest[ 75 0 R/XYZ 82 721 0] >> endobj 70 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 331 0 R/Group<>/Tabs/S>> endobj 71 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 333 0 R] /MediaBox[ 0 0 612 792] /Contents 332 0 R/Group<>/Tabs/S>> endobj 72 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 335 0 R] /MediaBox[ 0 0 612 792] /Contents 334 0 R/Group<>/Tabs/S>> endobj 73 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 336 0 R/Group<>/Tabs/S>> endobj 74 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 337 0 R/Group<>/Tabs/S>> endobj 75 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 338 0 R/Group<>/Tabs/S>> endobj 76 0 obj <>/F 4/Dest[ 88 0 R/XYZ 82 721 0] >> endobj 77 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 339 0 R/Group<>/Tabs/S>> endobj 78 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 341 0 R 342 0 R] /MediaBox[ 0 0 612 792] /Contents 340 0 R/Group<>/Tabs/S>> endobj 79 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 344 0 R] /MediaBox[ 0 0 612 792] /Contents 343 0 R/Group<>/Tabs/S>> endobj 80 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 345 0 R/Group<>/Tabs/S>> endobj 81 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 349 0 R] /MediaBox[ 0 0 612 792] /Contents 348 0 R/Group<>/Tabs/S>> endobj 82 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 355 0 R/Group<>/Tabs/S>> endobj 83 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 357 0 R] /MediaBox[ 0 0 612 792] /Contents 356 0 R/Group<>/Tabs/S>> endobj 84 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 358 0 R/Group<>/Tabs/S>> endobj 85 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 359 0 R/Group<>/Tabs/S>> endobj 86 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 363 0 R] /MediaBox[ 0 0 612 792] /Contents 362 0 R/Group<>/Tabs/S>> endobj 87 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 365 0 R] /MediaBox[ 0 0 612 792] /Contents 364 0 R/Group<>/Tabs/S>> endobj 88 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 367 0 R 368 0 R] /MediaBox[ 0 0 612 792] /Contents 366 0 R/Group<>/Tabs/S>> endobj 89 0 obj <>/F 4/Dest[ 91 0 R/XYZ 82 721 0] >> endobj 90 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 374 0 R/Group<>/Tabs/S>> endobj 91 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 375 0 R/Group<>/Tabs/S>> endobj 92 0 obj <>/F 4/Dest[ 94 0 R/XYZ 82 721 0] >> endobj 93 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 376 0 R/Group<>/Tabs/S>> endobj 94 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 378 0 R 379 0 R] /MediaBox[ 0 0 612 792] /Contents 377 0 R/Group<>/Tabs/S>> endobj 95 0 obj <>/F 4/Dest[ 97 0 R/XYZ 82 721 0] >> endobj 96 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 380 0 R/Group<>/Tabs/S>> endobj 97 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 382 0 R] /MediaBox[ 0 0 612 792] /Contents 381 0 R/Group<>/Tabs/S>> endobj 98 0 obj <>/F 4/Dest[ 101 0 R/XYZ 82 721 0] >> endobj 99 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 384 0 R] /MediaBox[ 0 0 612 792] /Contents 383 0 R/Group<>/Tabs/S>> endobj 100 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 385 0 R/Group<>/Tabs/S>> endobj 101 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 387 0 R 388 0 R] /MediaBox[ 0 0 612 792] /Contents 386 0 R/Group<>/Tabs/S>> endobj 102 0 obj <>/F 4/Dest[ 103 0 R/XYZ 82 721 0] >> endobj 103 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 390 0 R 391 0 R] /MediaBox[ 0 0 612 792] /Contents 389 0 R/Group<>/Tabs/S>> endobj 104 0 obj <>/F 4/Dest[ 105 0 R/XYZ 82 721 0] >> endobj 105 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 392 0 R/Group<>/Tabs/S>> endobj 106 0 obj <>/F 4/Dest[ 108 0 R/XYZ 82 721 0] >> endobj 107 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 393 0 R/Group<>/Tabs/S>> endobj 108 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 395 0 R] /MediaBox[ 0 0 612 792] /Contents 394 0 R/Group<>/Tabs/S>> endobj 109 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 721 0] >> endobj 110 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 396 0 R/Group<>/Tabs/S>> endobj 111 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 721 0] >> endobj 112 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 398 0 R 399 0 R 400 0 R] /MediaBox[ 0 0 612 792] /Contents 397 0 R/Group<>/Tabs/S>> endobj 113 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 402 0 R 403 0 R] /MediaBox[ 0 0 612 792] /Contents 401 0 R/Group<>/Tabs/S>> endobj 114 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 404 0 R/Group<>/Tabs/S>> endobj 115 0 obj <> stream x͝n9 RL 0d,v؋^(HVٲڪNlm‘/6X,R*6YM^lyzir]\h.tVyyUT7Uv]ϧ'M鿲?ӓh謹йYx+p},iS>/gt&ޔJgϕʩ:F>_ep-ҹpΟ.o/orfz t:vu3!>cOnEc=紪Ϲ;tj+<۪ 6{ÞwS?Y}zs;/jTzzf'~}9G/>E/ 31ăuv1m~Ȓ"]ȑ6 TYzN9θՕ 0^i {た Ǣ՞S7YW4/okzMa!J zd0_>G}%TH ENIh#83 3d;ppf;bSZfOb2̮a5KV2΀0h:MG#E!m܅]Т( G.3C9y]}7YBlh$ "_%Ȓ"[ȑ"shQ4x/(E @( !k$Lb)d#΍ SdI r$Bx O#C%C@҆LnrKo%??!rO34钫ʆJq} }Fxh 1"5DwQ sI δ nx1gm9! ~@6EIئܢd˔YRDә9Rlw6lلrҪu)$-21Z}[+{;P ƪ+G)CCss#ϓeXL6X)sD+_ir#<\W[H>CS"b%!Eb兊3D~r9.vbo[z0Gfwp0 *}_m#>_=4gw|aHv ]1Y1/-a_=ZC# tR*[>s8qr3m]rAo⒗*n$<)n?\or͵= @noH)*9RDQnB<)rϻkp@ '@u?Pe%M,BLe/rVF^UExhg")QB腊$wF~vH/@9"ſn%_&Rgc)t{QS*& T,!ET,!ETExj]O ]j/ lXMbm b5Kt,AWJYF.dW8DOI%E$%!E{mg52I$ u(@Lҵ*>|\Qt&0262:%E6!E6!E-G nQ΁p\5Zpf-˅Pq=θtt)cj1%T9L4P{V<}Zlc,!U>G+Ze:FaSRdISRHQ̻\<> pٽ]X= 9b޷vR)iEj oqG8t}z\k?lwIHQ G .D33{q?䟪/8yXnapgC(ܛCݻܬ1DY*o×;{t8egШI#෢ݡ8r4 qr}onw5KN6Xw7C/EN3reL:t&dgLtY rUg ³i٢IC&_A91;`:=L5e{~S_}~~fWkߗy z8QYmF=n3!Ë́6Rgnb5w{<zCn`~hveU3zTeb?Mz 7ϫn#W9!Y,2T\$++[8)u4@Guq,Ѱ<ݒCev(?=%/?0틟VBhh@-!E1PKHQ RnLe~{ 4ѝ/ƟnoSq>=Z?\;nnS2Jȸ8ޑ*[gB)Gwr(@t'WRgubU3]=[ K8HF+l"Ax$ 1["I^vϜ(*Lx sO b밁 _Kaol_ >/F 4/Dest[ 117 0 R/XYZ 82 700 0] >> endobj 117 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 405 0 R/Group<>/Tabs/S>> endobj 118 0 obj <>/F 4/Dest[ 120 0 R/XYZ 82 721 0] >> endobj 119 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 407 0 R 408 0 R 409 0 R 410 0 R] /MediaBox[ 0 0 612 792] /Contents 406 0 R/Group<>/Tabs/S>> endobj 120 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R] /MediaBox[ 0 0 612 792] /Contents 411 0 R/Group<>/Tabs/S>> endobj 121 0 obj <>/F 4/Dest[ 123 0 R/XYZ 82 721 0] >> endobj 122 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R] /MediaBox[ 0 0 612 792] /Contents 418 0 R/Group<>/Tabs/S>> endobj 123 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 425 0 R/Group<>/Tabs/S>> endobj 124 0 obj <>/F 4/Dest[ 123 0 R/XYZ 82 702 0] >> endobj 125 0 obj <>/F 4/Dest[ 126 0 R/XYZ 82 721 0] >> endobj 126 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 426 0 R/Group<>/Tabs/S>> endobj 127 0 obj <>/F 4/Dest[ 133 0 R/XYZ 82 721 0] >> endobj 128 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 427 0 R/Group<>/Tabs/S>> endobj 129 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 428 0 R/Group<>/Tabs/S>> endobj 130 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 430 0 R 431 0 R 432 0 R] /MediaBox[ 0 0 612 792] /Contents 429 0 R/Group<>/Tabs/S>> endobj 131 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 434 0 R 435 0 R] /MediaBox[ 0 0 612 792] /Contents 433 0 R/Group<>/Tabs/S>> endobj 132 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 436 0 R/Group<>/Tabs/S>> endobj 133 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 437 0 R/Group<>/Tabs/S>> endobj 134 0 obj <>/F 4/Dest[ 136 0 R/XYZ 82 721 0] >> endobj 135 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 438 0 R/Group<>/Tabs/S>> endobj 136 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 439 0 R/Group<>/Tabs/S>> endobj 137 0 obj <>/F 4/Dest[ 138 0 R/XYZ 82 526 0] >> endobj 138 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 440 0 R/Group<>/Tabs/S>> endobj 139 0 obj <>/F 4/Dest[ 138 0 R/XYZ 82 396 0] >> endobj 140 0 obj <>/F 4/Dest[ 138 0 R/XYZ 82 347 0] >> endobj 141 0 obj <>/F 4/Dest[ 142 0 R/XYZ 82 721 0] >> endobj 142 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 441 0 R/Group<>/Tabs/S>> endobj 143 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 144 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 442 0 R/Group<>/Tabs/S>> endobj 145 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 443 0 R/Group<>/Tabs/S>> endobj 146 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 413 0] >> endobj 147 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 248 0] >> endobj 148 0 obj <>/F 4/Dest[ 149 0 R/XYZ 82 709 0] >> endobj 149 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 444 0 R/Group<>/Tabs/S>> endobj 150 0 obj <>/F 4/Dest[ 151 0 R/XYZ 82 721 0] >> endobj 151 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R] /MediaBox[ 0 0 612 792] /Contents 445 0 R/Group<>/Tabs/S>> endobj 152 0 obj <>/F 4/Dest[ 153 0 R/XYZ 82 721 0] >> endobj 153 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 457 0 R/Group<>/Tabs/S>> endobj 154 0 obj <>/F 4/Dest[ 158 0 R/XYZ 82 721 0] >> endobj 155 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 458 0 R/Group<>/Tabs/S>> endobj 156 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 459 0 R/Group<>/Tabs/S>> endobj 157 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 460 0 R/Group<>/Tabs/S>> endobj 158 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 461 0 R/Group<>/Tabs/S>> endobj 159 0 obj <>/F 4/Dest[ 165 0 R/XYZ 82 721 0] >> endobj 160 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 464 0 R/Group<>/Tabs/S>> endobj 161 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 465 0 R/Group<>/Tabs/S>> endobj 162 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 466 0 R/Group<>/Tabs/S>> endobj 163 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 470 0 R/Group<>/Tabs/S>> endobj 164 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 471 0 R/Group<>/Tabs/S>> endobj 165 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 477 0 R/Group<>/Tabs/S>> endobj 166 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 167 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 479 0 R] /MediaBox[ 0 0 612 792] /Contents 478 0 R/Group<>/Tabs/S>> endobj 168 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 480 0 R/Group<>/Tabs/S>> endobj 169 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 721 0] >> endobj 170 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 482 0 R] /MediaBox[ 0 0 612 792] /Contents 481 0 R/Group<>/Tabs/S>> endobj 171 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 484 0 R 485 0 R] /MediaBox[ 0 0 612 792] /Contents 483 0 R/Group<>/Tabs/S>> endobj 172 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 486 0 R/Group<>/Tabs/S>> endobj 173 0 obj <>/F 4/Dest[ 174 0 R/XYZ 82 721 0] >> endobj 174 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R] /MediaBox[ 0 0 612 792] /Contents 487 0 R/Group<>/Tabs/S>> endobj 175 0 obj <>/F 4/Dest[ 180 0 R/XYZ 82 721 0] >> endobj 176 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 496 0 R/Group<>/Tabs/S>> endobj 177 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 497 0 R/Group<>/Tabs/S>> endobj 178 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 498 0 R/Group<>/Tabs/S>> endobj 179 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 499 0 R/Group<>/Tabs/S>> endobj 180 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R] /MediaBox[ 0 0 612 792] /Contents 502 0 R/Group<>/Tabs/S>> endobj 181 0 obj <>/F 4/Dest[ 185 0 R/XYZ 82 721 0] >> endobj 182 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R] /MediaBox[ 0 0 612 792] /Contents 508 0 R/Group<>/Tabs/S>> endobj 183 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 514 0 R/Group<>/Tabs/S>> endobj 184 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 515 0 R/Group<>/Tabs/S>> endobj 185 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R] /MediaBox[ 0 0 612 792] /Contents 516 0 R/Group<>/Tabs/S>> endobj 186 0 obj <>/F 4/Dest[ 188 0 R/XYZ 82 721 0] >> endobj 187 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R] /MediaBox[ 0 0 612 792] /Contents 524 0 R/Group<>/Tabs/S>> endobj 188 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 530 0 R/Group<>/Tabs/S>> endobj 189 0 obj <>/F 4/Dest[ 192 0 R/XYZ 82 721 0] >> endobj 190 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 531 0 R/Group<>/Tabs/S>> endobj 191 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 533 0 R 534 0 R] /MediaBox[ 0 0 612 792] /Contents 532 0 R/Group<>/Tabs/S>> endobj 192 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 536 0 R 537 0 R] /MediaBox[ 0 0 612 792] /Contents 535 0 R/Group<>/Tabs/S>> endobj 193 0 obj <>/F 4/Dest[ 195 0 R/XYZ 82 721 0] >> endobj 194 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 539 0 R 540 0 R 541 0 R 542 0 R] /MediaBox[ 0 0 612 792] /Contents 538 0 R/Group<>/Tabs/S>> endobj 195 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 544 0 R 545 0 R] /MediaBox[ 0 0 612 792] /Contents 543 0 R/Group<>/Tabs/S>> endobj 196 0 obj <>/F 4/Dest[ 199 0 R/XYZ 82 721 0] >> endobj 197 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 547 0 R 548 0 R 549 0 R 550 0 R] /MediaBox[ 0 0 612 792] /Contents 546 0 R/Group<>/Tabs/S>> endobj 198 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 557 0 R 558 0 R 559 0 R 560 0 R] /MediaBox[ 0 0 612 792] /Contents 551 0 R/Group<>/Tabs/S>> endobj 199 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 561 0 R/Group<>/Tabs/S>> endobj 200 0 obj <>/F 4/Dest[ 201 0 R/XYZ 82 721 0] >> endobj 201 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 563 0 R 564 0 R 565 0 R] /MediaBox[ 0 0 612 792] /Contents 562 0 R/Group<>/Tabs/S>> endobj 202 0 obj <>/F 4/Dest[ 204 0 R/XYZ 82 721 0] >> endobj 203 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 566 0 R/Group<>/Tabs/S>> endobj 204 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 568 0 R] /MediaBox[ 0 0 612 792] /Contents 567 0 R/Group<>/Tabs/S>> endobj 205 0 obj <>/F 4/Dest[ 207 0 R/XYZ 82 721 0] >> endobj 206 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 570 0 R] /MediaBox[ 0 0 612 792] /Contents 569 0 R/Group<>/Tabs/S>> endobj 207 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 572 0 R] /MediaBox[ 0 0 612 792] /Contents 571 0 R/Group<>/Tabs/S>> endobj 208 0 obj <>/F 4/Dest[ 209 0 R/XYZ 82 721 0] >> endobj 209 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 576 0 R] /MediaBox[ 0 0 612 792] /Contents 575 0 R/Group<>/Tabs/S>> endobj 210 0 obj <>/F 4/Dest[ 212 0 R/XYZ 82 721 0] >> endobj 211 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 578 0 R] /MediaBox[ 0 0 612 792] /Contents 577 0 R/Group<>/Tabs/S>> endobj 212 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 579 0 R/Group<>/Tabs/S>> endobj 213 0 obj <> stream x͝MoFxx޽im6*zzPe5KdH}gVjZD H,Ҕ̒0TW M=XM'_ϧS2f:p\U"X!a7VP7oCq,nVlL'fEg1a:gMdmˠ$mVFPa*XH%MyKiycҁO:,?^VaK0蘣y1=;{{3F(18OQDTW:DN~[ K#[Eif/ݬޞ6`ٗ' ihCx*廙̋Oҕ:'Ey" ƈO_"Pm =.#ePgeV-eU9NxHġxQmղfD©>,NT=Fb"ĜiPmN (;ІA]yvq / GPX]u)}ߕիR+3̓"\O 'oHIC# " `ꔑ"zY1ȏ#&pAP)~ݕwf p"8G A>\ĜP.#~$ -Ho;H?cBVy Y<.#bB:JJE BP1#AI /!~ -(o:@<νp:|kռhhuWin鷻e) nÚ/}lj14@HmN ( '5~> -H;2HL F-qMgL9\csm)P8۲ג\j&N.ΤLIEȀ"yilD{مd{LpZ]jîu93S/ʼn]V,y’^H"sRd@9g4xdP"}BNrs5?(eEa^.Hmo}Nv،}5{w.p*X׫GU8(),FX{HE1RtK C\1QCa0,X'l>r֥ {d4tSZۜiq=SF (?K,Y͏%&$-'Su,wj\JڳOhM{ШM5M5MKimDz%F.^8MD+'k>qTb =blFee镝MÇe&.;cBlXyȺ.0#ź^WBɜiPT)R%b "U">VT /sRdBdE0<0[.vaavs50 J[]?in9U:UDQWeYEf94xlD"8YIIȦ:R-C3.!ytV*CwSMyT~c¥\3k;?iCcV+3Rdd9FD<ZnvrkǬQP?ljKK{%?44s2R<(#Es.VrL7sǓh(Lb:"&K,CQ }X'a&24$'sRA9)2H5F`<4[0Nv-?c &LMMX.wn9I}R@eh\$壨ER>Z$If$=I Imم/W摐\VI%mg6+E"Nϩ\Sk.8%#ނI5oH"ی43" <54HQDi(mDs9&TA029@r{8 caINBHS qmNuRsuxR͎[m.}JkS.>-g>u& Eh`\LyxoR &?b endstream endobj 214 0 obj <>/F 4/Dest[ 215 0 R/XYZ 82 721 0] >> endobj 215 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 580 0 R/Group<>/Tabs/S>> endobj 216 0 obj <>/F 4/Dest[ 217 0 R/XYZ 82 721 0] >> endobj 217 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 581 0 R/Group<>/Tabs/S>> endobj 218 0 obj <>/F 4/Dest[ 220 0 R/XYZ 82 721 0] >> endobj 219 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 582 0 R/Group<>/Tabs/S>> endobj 220 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 583 0 R/Group<>/Tabs/S>> endobj 221 0 obj <>/F 4/Dest[ 222 0 R/XYZ 82 721 0] >> endobj 222 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 584 0 R/Group<>/Tabs/S>> endobj 223 0 obj <>/F 4/Dest[ 227 0 R/XYZ 82 721 0] >> endobj 224 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 585 0 R/Group<>/Tabs/S>> endobj 225 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 586 0 R/Group<>/Tabs/S>> endobj 226 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 587 0 R/Group<>/Tabs/S>> endobj 227 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 588 0 R/Group<>/Tabs/S>> endobj 228 0 obj <>/F 4/Dest[ 234 0 R/XYZ 82 721 0] >> endobj 229 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 589 0 R/Group<>/Tabs/S>> endobj 230 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 590 0 R/Group<>/Tabs/S>> endobj 231 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 591 0 R/Group<>/Tabs/S>> endobj 232 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 592 0 R/Group<>/Tabs/S>> endobj 233 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 593 0 R/Group<>/Tabs/S>> endobj 234 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 594 0 R/Group<>/Tabs/S>> endobj 235 0 obj <>/F 4/Dest[ 236 0 R/XYZ 82 721 0] >> endobj 236 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 595 0 R/Group<>/Tabs/S>> endobj 237 0 obj <>/F 4/Dest[ 240 0 R/XYZ 82 721 0] >> endobj 238 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 596 0 R/Group<>/Tabs/S>> endobj 239 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 597 0 R/Group<>/Tabs/S>> endobj 240 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 598 0 R/Group<>/Tabs/S>> endobj 241 0 obj <>/F 4/Dest[ 243 0 R/XYZ 82 721 0] >> endobj 242 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 599 0 R/Group<>/Tabs/S>> endobj 243 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 600 0 R/Group<>/Tabs/S>> endobj 244 0 obj <>/F 4/Dest[ 251 0 R/XYZ 82 721 0] >> endobj 245 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 601 0 R/Group<>/Tabs/S>> endobj 246 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 602 0 R/Group<>/Tabs/S>> endobj 247 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 603 0 R/Group<>/Tabs/S>> endobj 248 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 604 0 R/Group<>/Tabs/S>> endobj 249 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 605 0 R/Group<>/Tabs/S>> endobj 250 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 606 0 R/Group<>/Tabs/S>> endobj 251 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 607 0 R/Group<>/Tabs/S>> endobj 252 0 obj <>/F 4/Dest[ 256 0 R/XYZ 82 721 0] >> endobj 253 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 608 0 R/Group<>/Tabs/S>> endobj 254 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 609 0 R/Group<>/Tabs/S>> endobj 255 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 610 0 R/Group<>/Tabs/S>> endobj 256 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 611 0 R/Group<>/Tabs/S>> endobj 257 0 obj <>/F 4/Dest[ 258 0 R/XYZ 82 721 0] >> endobj 258 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 612 0 R/Group<>/Tabs/S>> endobj 259 0 obj <>/F 4/Dest[ 262 0 R/XYZ 82 721 0] >> endobj 260 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 621 0 R 622 0 R 623 0 R] /MediaBox[ 0 0 612 792] /Contents 620 0 R/Group<>/Tabs/S>> endobj 261 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 625 0 R] /MediaBox[ 0 0 612 792] /Contents 624 0 R/Group<>/Tabs/S>> endobj 262 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 627 0 R] /MediaBox[ 0 0 612 792] /Contents 626 0 R/Group<>/Tabs/S>> endobj 263 0 obj <>/F 4/Dest[ 264 0 R/XYZ 82 721 0] >> endobj 264 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 628 0 R/Group<>/Tabs/S>> endobj 265 0 obj <>/F 4/Dest[ 266 0 R/XYZ 82 721 0] >> endobj 266 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 629 0 R/Group<>/Tabs/S>> endobj 267 0 obj <>/F 4/Dest[ 270 0 R/XYZ 82 721 0] >> endobj 268 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 630 0 R/Group<>/Tabs/S>> endobj 269 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 631 0 R/Group<>/Tabs/S>> endobj 270 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 632 0 R/Group<>/Tabs/S>> endobj 271 0 obj <>/F 4/Dest[ 274 0 R/XYZ 82 721 0] >> endobj 272 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 633 0 R/Group<>/Tabs/S>> endobj 273 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 634 0 R/Group<>/Tabs/S>> endobj 274 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 635 0 R/Group<>/Tabs/S>> endobj 275 0 obj <>/F 4/Dest[ 281 0 R/XYZ 82 721 0] >> endobj 276 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 636 0 R/Group<>/Tabs/S>> endobj 277 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 637 0 R/Group<>/Tabs/S>> endobj 278 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 638 0 R/Group<>/Tabs/S>> endobj 279 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 639 0 R/Group<>/Tabs/S>> endobj 280 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 640 0 R/Group<>/Tabs/S>> endobj 281 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 641 0 R/Group<>/Tabs/S>> endobj 282 0 obj <>/F 4/Dest[ 289 0 R/XYZ 82 721 0] >> endobj 283 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 642 0 R/Group<>/Tabs/S>> endobj 284 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 643 0 R/Group<>/Tabs/S>> endobj 285 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 644 0 R/Group<>/Tabs/S>> endobj 286 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 645 0 R/Group<>/Tabs/S>> endobj 287 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 647 0 R 648 0 R] /MediaBox[ 0 0 612 792] /Contents 646 0 R/Group<>/Tabs/S>> endobj 288 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 649 0 R/Group<>/Tabs/S>> endobj 289 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 650 0 R/Group<>/Tabs/S>> endobj 290 0 obj <>/F 4/Dest[ 291 0 R/XYZ 82 436 0] >> endobj 291 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 651 0 R/Group<>/Tabs/S>> endobj 292 0 obj <>/F 4/Dest[ 294 0 R/XYZ 82 721 0] >> endobj 293 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 652 0 R/Group<>/Tabs/S>> endobj 294 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 654 0 R] /MediaBox[ 0 0 612 792] /Contents 653 0 R/Group<>/Tabs/S>> endobj 295 0 obj <> stream xko~ ncE^.h&q[I?2Sϖ|z3"U΀m{gg"ch.,)oE//uxsuy{p2\^^pT9pT9+R%wk3O~z{y$I\pyǽ KUL ]Jr>1 <+ox*rQ2yDT VۯJ5XՃ +)2|A8=L#Q|NRi>Ct3tX9'TN󴘬җrR?ԋ ^{ :kUAd*2*d*YHA,%jlIWwlAFz/ϵ0]\dOY lϛdPή2]m+h2Qe^L ?HR\. dJ#<|B1]gSrwlxJ3&g)#NXbKIl,`d$-m}<6^vP "xh7O@i%B3xґ{8w/RcrYyCУ劉6)V!1|(wQG/D>y^opLQ>%“֤Y߰kehF͑)4:ihB h%G^39[e7Ĵc(GtTd0I^}gFHy*N i8R1] W:kaz]1u *22Q&JAas#Hu1(v0 z7MmXzYMl^/ˁѤRE #Ә[/9_O˭1WaoH.w{;[>!dORمbnV]HE}C=zO b(_4r.pŝ /2Af)elC@^g0CK~i*Sk[0|-xW=6K%s,9%+5P>c2ޮ`.8B˱*ʝ<< @NG .2o ev$ۓ)ޥ#Wj{ʡn:sNđAH+l(J|3)$×vZ+ j=̠*4GQcKĚrpL!A(-u93-5BDbl֤dX5565sh0Ȭ !-C9)[b ޅKaa 띒|Հot]on@7[hV ޣwZNЎc|zʆP^ rf({sTvDkfyh1ǹ -A-Cڠ@t`D={,]D-s@"=0|&0zU,{5\sM^XWU ܂pf[l]BE9j }7q'ᨘC8;W)bV)֑lI~1٢N5ϱfݧ/JnWީL-R>!fm+ $>4ږmkUz`Rj'XG,|gC|G5#fqXĪ\cDG\EY*VB T\}v@d,-M"tɤ:gh+ @R\Ca10b!R5Kr4%{G8n=7b1 ;= -YܟdRWL}I%Cy)E`e /N\`e;\ QfnV&~jHWi+siQW_Tk@U釘J"H񐩟%FtNKZj;A=*J!lޭXz'&ўQV;Qmp!/ĉjct.qعtu&/g˻d DRa Hx [315I5]viJkAyiV"۹ģb1iV~\m?'s`:|`@F\53?Ψr4;ZT?w1NZ1:r* `2r". gAAZ0yLN;RyL9@ڋ(vY[aYUV؅6VibP}f8݄/ 4o6D@yhe͖';0k (V)֓NWe~(3Naxƶw6[fxcmll# nɥ[QWfn0;;8QB;gBc8G97ښD0\pO'uϨמYC7ABxbngo4:9+a⮟znNuVGeE?ex;HghZy+1xLG[9r\zU7kOwQφ ;g񻃑{J0C 9щ:imŒr,k%ƿ2Ǧx \7eu%g9T2@4~5nsj>LL5|{)4JLЉF zQInPT4ȆA8vP_^"˱2rsY7B|&t-c|@Grqs\Qqw2Uq ע8#{DozaD["u2]$ [\CYFf<U #xӈ)7Wy u/lg53:#K3Uj5Jr1u"yj7UP+g & .fnvf->vLYnQOmWbn͢g>d -\Ybܟ679 t A kDYHJ;{#6l endstream endobj 296 0 obj <>/F 4/A<>>> endobj 297 0 obj <> stream x\o7A#~ >$Hm\ERZw|nR%M߮8 ggt~\dyfoQ>?/$2Y3ty3Gf7-зMWvoǿ}Zd:*s3̭|>gdc:7P<{)( 3a3Xq׮LJ" p=KK /(G5qs1Scvd /SO9dq)q w?oߪ}>nVomO:)4/YbRLjӄ̚ȈF]rSsr[{u4A}> X_QffV9B4w(|=p 6l lUPg]i>; ,֔fq HQ`#(4wC㐯nP~G?=|H]Q :χ>;B}6jRazVҩLYQّiau ԖJS@-JVa"+)B<ɴbj `Ǐ7_9rA~} BԣNv^# -(K$AgWj[() q5JR9IțTO8u rTv4RH~ٙ7C2,\bҮ*Iəv7ќp:E&nz'eiR9a6rc I7nk<t31`&2dF,-d)s"3+~H5@ A,!B|mv lwa2 u:SCJ0)#CC-LmBiPn`9QΌV%-7&t{QZc&ܠxX ?dacBOb0[jxGk.,p;VCmaS_ gI<O+ EY[6u+SOЭ:G4ghp88ޢFr΢{*X0-W]~޼}})p/ -idG+^5'zyrYW:aC95G2vf R׵L*`P34~h1j@a`u@EUէHL1gHˆE@oYd@]K0Z5W8cFcJr_!W)bs7` ^]8}w?i3|opڣ RAjȚM .p X? 3݋nsp?qqQ/#+Q%ӧA/ 1Š@qT,<ar5Xp8H4g%P.]j M ~ U?ɦ[!@8 u}ޛn5+jK8B-e`KqO2V06=Sqfs*4EEP|~>$\7!:ȕz4Ǿ|GjT.~P\ d6TWqKu᲋ Xo⸣H6!Gh^Brq5S/(pNFF/J" nCua}< -_n[n*G#xЗ`NJҒO4oBW’* p HN1.+Pu Qj",Ά[ti C =KĚTzUwE*ɺ~ XRolUb= ؞>k"6e#o6q`߸9DO܉mO[J| _YBj7cnJh}=XoкMUpgIUSzXW2ŘC_k ap+1L;VL\-{rui  R3HH $Rr).sTA&hoXfiF):)pRYmw b4T:![,%40`۸q&%xsF u":$5.Uf+z< 9~6r}s4>G2EcY$.p.]R3w 3wj= {¬Pʢ0n.E3l4k$X WIc0÷@~^A{٣lUƧNfOrLoYd2 Je}TPZkWFtt?Α_w`AmʚZs{u㬰 lLl\k_.9^^{OQyvѥ[, p40u!p C9䈃#lڮn=.P1GI:mѰz&Z?>pmIZ(<9@݈C>(d}{ҌP`9pN;t|ٷބqX篾LBrYWO-:hߎҌvByWahO>AM,IRN~ӌ6jL).ju~}eȶYey0XLy+ wgm\+.xjp vt)gL, 86c茙#?7kMnk* o"Y@t`hs@$-}?D]q BρNd(v&Y1 $1JV"CF> V_e-R-G9T)X i>RD rMp/rLInJ\7M6@w典`q ?$,$ endstream endobj 298 0 obj <>/F 4/A<>>> endobj 299 0 obj <> stream x[o6>Z’4}lk=C1N^xclwGJKqex/'qEE6 N| NFLU6<8@39ܲJ3-e 3|a~|넎D.uB4s&7OD6.taȬpSg`F>?@0L$JµUZ^Z*ax@y ұ;yAVDj?#Ry }|)c_AWJy~|M .v8.̫L$MpIOwnxѤ~3uP2|d3s0#BF <÷0":% 1l9"H 'GOK5No{,Wb s !L2p6I  *:P c)-R"4%҂I -mJ 2=%f>tfd p\ JQp G0"&u|Pg>`]p5I8T~gXns@Qg WI.W% wx DK|FCB hw6?ܹZ 3:(HӾ m8PۣTm?(KJR6Yޒ gN{HrȟtȕgW]8TvG2iS) d{x?i[V(V H"I)m"-Rcߝj?(Ӧq6f%A6x'4X&Wu= p[ ]_-ZM4Q 0א+Vv/!B}r 7r b@;X7ҷ)l^`b՛ÏEEk|dzf7QhHQnGbHEfwDoƊ+;%xK,iyX1ه 0# Y>B&p{ ˻*ON7<3(i _[@jikvjja{S9:mmaqoh_b \^.-[ޣW%?<}Kl몙<] T Zi{QIzfaz*J>GPŲzSE ȅ.TuBT-Ҫ.=D#f,zUOЫz%kϞЄ~[aGh[,3S,nn wus=J7_r<\e8ZxZ&B)<`&Go1%dX=Xc3N ԃ5/9zGsa7 +t5³HvaS@mէy-^4ieq)l\GR#RYl%^ZQlC'5Q%c> tId MjzPa,,,I]0NSuk?J^I endstream endobj 300 0 obj <> endobj 301 0 obj [ 302 0 R] endobj 302 0 obj <> endobj 303 0 obj <> endobj 304 0 obj <> endobj 305 0 obj <> stream x[ms6~F(Jsح;wiLF۵-:$~.z(sDKbX =>*X |Ndog"*xs|āxf5T]/mv@%ݹpѫA;'㣷e퉆Bꌮ/٘. |gsB6 f4!2iT;"[TR1/ QMkni˘)Pca /S3wSRd`ǎ\4W%Yos9`r/Bsǜbv>iHˤȒx횧[_,4u N^ ~Mw箢(eZ ƕ%ӟ)֫b[?\Y&Ne Ӥ8PJ 2˔Rtvy,a9f/)dr ]2l{!c9:͵|qA5 9y> y1#A5 tAM9ڿWғ;En[sG<zso"glYItH1 I 94Jop%-\M܋BӯƏߢN&t}vjWp1AcډّFWهz.Q1Y4ٚΖMұtqk}=Cўp Q¿vbo;Pz~-i}iSn&s#i2+6NHDɒfiBP8Kv2M::Pȡ "lncLbx7ذ%l%m ?xfy;zHi:yPL>y߅B{,t |B)A-U-Yu}鋸Qcse:a{ p8%YǨ R4bϔZIG,Ϟ%ԏ1,SRЬVi1-n%=o_#aHױwWD^CFC@?98) |l 8h Quq/ I~w>]Y믮yV~R{V@6kT d j1b<g d/'.gm'd趙ݍ^|%$T1ͷ%au%;D6)Y*T(qcY!2#`ZhV qU()>D=im|JR}{_qTO|e'>oKCc#zb0]mA@F@OZlMz(_+- <P"/w@ݴ G djιj4H}ʓ|ہ)|CFOt{AY0'jz 5 O>)*ةճܧ0P6T&SzWpͻivKC&xceQ4Xڜ&fP^鑖Y5D=Am S{`!!ہY9Y.&Jװ(޺FW '>| w$IbGkx).%bzkOEp0| :෦m)$YT ;wsbưZp[ /*.k =~چʫFnKUx6n#vN0$oNZUGan[I,; ota&źt^-]HB6a,` 0Jζ:C>]#$~h) DE< ۔.-9,r\[RZh_u`CȐ%*Hf?Wb D'D>L*5<#ԣ:1F tJ@_+7|VWfrS%s)p >eJ~G3Sy^n Pz -9r+g1tN`gp>` 0Y=xlo"np9py,.nMңE:nfaEyD 1a)$V7SGVͯY[k{M:p_\<AlV@bNa 3áE63LvcZX.}4C㛪-6Ds1SuV2#? aIICfnwAe[ٝNVm`f)[`IO@ԥeL:!jul(Jg& fgo4M#v#җbq1N \JE꽂I|ˆf R$i>*gφ`84S`PVUF} ߓoiI%U?zUIV؊qJh@Ll -R9ס5:˒t(m;MBSpo|,ۓt:SD>ˁЯsmn8[#p8%EhLMOCgtBQYRTu{ԙ/m.!T'h _DVƧb}وmQQ!F2 P/z;V>Uetx>{Ĵ endstream endobj 306 0 obj <> stream x\mo6 A藳VIܥ{Exکeo3CR^(9eiyf#yz!e,B/$M~zX ]1/SAzW_[Ц_ϻh'VDg*f!3Ad dg")dKdD XĒn0A(&2#Y"Zw-*$Ab&s3H]CT`A:t[.'%=E.31[gͷwk8\seA&\RtjgeQ,\&a,W3wt9aV/, m©(|RLJ*Bl0Z!-^C~v5zc3r%da5XCX<ۀhU)Ӌw "o$YyɌ!4A)*)P>c?fxo_->Y|AߨU ^+l[©q%EտO,l_jf=*F @BP09?Ðq#Au%?O xn sYo/:gD3X$H/`LԚ 5U?)ɮ(f;">ls&P:TmY洠0aBnd"|% .Z⑄^kߥч< !3jK<[uJqr;!8E7]KXN>X,ͼrRV͔|2?fQAl,} 4Yx_v`!&Q_xµm?r:ӬWAw _C+4.*I\*n1x wI'CDQM0%ͧ=:Y2o.`2AȘxxoJ0 ӹBJґR_0B^:1u0'} prF5aX u o}ȔOfS1[R!Wx*nT6x\p|Rlsa0@pGb4 v)Id5ޡ¼nni`V m.̕ݝjq׸/KT_0wX := gGu'f q{5UBD00=-׵-Q`[pM$5 ᆴH,}2V/]kjuͧ!>uF 0Yi E7Zs@ݧp \ o衳=Q,$ z^cݰ尵s\Ck )@9$n帡o$K.oHiF<8Q ::Ԁ)bQ4(:P|ˮ&^04ơ*-@‰.zX-Eѥj J% :*؂Tu"é$RQ'Ȥed n(rd_*=xmN(Lˆ埜Q8|,hj>v>d+V XZ}GQT2SuJL[6b+tt5=opxu*@Q$gS3xQ{m>qRPSo_1`tdQ]k6Ɖ͎n|e?*GӸթ(ha圙́N7IDQڈUg-{bv6S;#)~[47 rzW-8a_~نFRKh> Xatlw8@8^Ip _}S$p bi x2,s#^1W3k@ vPˈ[:^tya3NXWGVf <)!ml;zomN}6|ynr`o fg_a|kN?v+b,o&;9ٌt+<_B!ljH4QTX#-* 6,h,Ī#cS([i[(Q0+I2< -S-~ƧBǷ>‚NշA75+Q ~6ܕi 4l\ت ZԜv V5 CaSJ?ϘeoKX*QH=`wZ^V٢^.DUZq[TTҘne)zziAtl`NSz2VsvQ>֛βA z6pGn5+"Anz{&ý}L A3˶y(`k $NOz#ͪHSkFeM,NYU4ĪNc;`{EdۆtQQ$%Vgbixn?H_PΖbo&'^CEodx;L7{vd5ʸd +$\[ e=-`xVż]jgSScV-cjp"iveoEcmdZt)9k,cA-X՝0n~ |F%r +r[=&*,M{&2$ jۺw ٖi O~6kC͢ mUFό/y%W[fJP$iW}J|!nZzK0Prt* kCzP^.%](JKY$>FD/HzuaRUo<S/*V#uiќ94퍴) -YM?j %sBCs&LL<Rch6JWQ鬏~a)1m\iy5W`52Ln8᣼ioHgvzF7kTԗ5RHEw2l*Q2$%(^Ŕ:R\İT^DE endstream endobj 307 0 obj <> endobj 308 0 obj <> endobj 309 0 obj <> endobj 310 0 obj [ 311 0 R] endobj 311 0 obj <> endobj 312 0 obj <> endobj 313 0 obj <> endobj 314 0 obj <> stream x[m۸Ν")8lE\rM|MXhmKko,;̐7۱ `Ggy|s0*==[<<})<Ι/ :^[TLGGuWl|yxӿ'Nֆhb45[}6| ߡ P(2g""b Mz3A*,HJIȢUT 0A8vqfa;ƪvvRruC K:lOhq0Q]墡P(XvҎhO`lbu#}_]W($Ż PE~xT8e PN_]=w'zjڦcd g<-[gT8}oƆw471k]} Bަ \SMi/$+\$Wa3n\dD|hE%!Y#[@ry ք#;m0M`d&@D3GMtE~'NᯛqI)W]G`dd0{wB3.CmR̆ˆ\WB3 8^ ++ !@U˦!>UґH%N cns;wh?9£ C̸oѿ#G8C [m27Ӧvx#ˆ_O_b̥qF ̽~d8-5YXnv@*. b1HZDơqf`Y $8hxFU]&$i))0it8arE6fł6k<} `۸*?nND?r΄p'޷Բ'C{M @.hwbkqI?7v@r2܏ oi^Jd̹az|V?۲#Pf~EIxpI<dБUmփ7j[E-T&K@aLH*8Wd,\ƌ'g U.i[NC{x, *+.r ZFx_X$Tc.EYXJ1G u.@PU=cG3W gp}s\8 d+ңXF rvQgs q^SJ6weI;M]lp|LVs+/g-yw vW͟)'hCI cBJ\(qY(fh~g+Ɍ0 xfOLcs d6G?J=1 q+ÑL F9Q==UѢR'3i4}SSSގʖEg W f J]Jf%ϒ[ן(yw %AHn+YE\vr KJC:ǫX WF! Zv/t08`Rp`ec5t-oBОa;U.MP{Rļy F@sշQ@`†QJ㰜.$No"tz~[Uϒ Y6g7 :G*HA,mYD)Kue\%͑y9ZdXA2ێ_q$FSbVeIQek`P &m*pdhXI~h1/?>`?eb 3\ߪCLi`QfHvlIiVCQPBhW%;BWo0!!Yאr5hHC5v55~/՗={qt #[r kAW;OE|6xÞ& 8P-c0<T> stream xZ_s6B$6m'i_;&CSQV_>.@JŖLKⷋG~:=Y$O V$gӓ/ ,WŇty“R3C̔}L:X3;?=y&?NO9=Y֎h ϥN蚗Iox2)(O 3Q&b6M}x3A*aL$+"0^Z*ax@^aNH.);H=2绣ǮWcgX T!DnQf2tZ-nZ`4)4̪tP!諕xhsaF3U~ AX,EV=/jF|T)sO"o>>&2!FE vh$![Yr=װu⨓3 Lٻ9^Fǹ3%f-FJ0yyy߉DEpu]3zUf@%Q"x% P P xMnح7[L}>pUda*ʛ44}7< ioC4sډr4ָ^IWϲq~'5aFCCYyWTA@zA%)6P=mOr<=mvVrY7I+wշ4>J^7QI.R}[[s30^ˏXˈ /b9/eUc$̓i3|l$^ ƍ,~Mi|j2K`s| ~<þFB8}"-u kwzU/Sɴ \n*$iߞP/諯h^dzG X w>hc"̟Ϗ3 gۆ-q pVKhy#:"Hr%e~? %G!&Zɫ-vCV[(뭧YtiܽKay }o7[F2BEYiiI h%I_oG~Pᘀ90LDf߇P[GoTPHs|OtYI'Dڈ _33"AX&"T>Z8Th> stream xZMo8 ЋTS ,z(-bpm1(CYTAqHtӟG83h`b:-+ݯ!Wl~5` ӀUcONWtr6m:tUЬ2ȥfDl 7܄UvYA8x]=P01L JYT{TBJRv`e,Sی{U*㧭BؐRB5^Q6jg*+66ⰹ Yn6yQDAF&ɞ.(U=JمeJIā-Jotq\.I3Y>٪+UQ.7fy:" WN`@X^qBc+XXd_:"dւ%^2tFɯZEQQrfUC  !Bg='_kWy%.28B^ʆrlqH )` eᆲrؓ# OчkzH ލ:!eR馓&R됉P)ұQg1> stream x][o9~Gk$X-̜x8X, GVo/-RMV)-?EWUl6guUQUg?~{\ QgpJVߴU7.?7\?j??Z~cE Dڕ~-%D_W tں}#VE+Jj\ YuػDNTi4k>fZT ~>h{ 4@묰bͿ.Y4MWqQ1qM#QD̑Kմ}b{VZ(yO~fiXMJ|GD򝺯F;0?J p7;Xf=^[Va >N*WA˕ZD*OWn*7z`M gй0Dq}]ھ~\+!|x{bs,^=Ol'͡U$4k${O=#=WbLu#|K\gt5J?atVf;m1pp~z`(}[>;u}?{w _0 '07 k4ԛh/~Dpu  5^~zǾ0⮾ݗ? ߝq:4NYSw.L >86{_ॾ͡OЯqm߉m{ϗ8I򘙯vi57HX7kec>#zF2R 9 bC\; ~j zb[ZR*Te{+{b@t& A!TA iq+'Y!Ɛ^qq 5% +@Ƕ±ܟY-Y<&RQG Ml]BBa,d#:%|C#Rn%+v+)YWram9$iT|[!.hg?A8ݔLX*ZAbtcJUA܂)yAS<&M˧ŢMbmZǗF`Ar\򐜗4Ɠt}Ev-6-~4Ate T,TɦuȈ &S l&_-TMɎWWl6_`JF)T*lTL0UPXKEBD3|K4(l \:F4˜" xtAA5ܾkT yB%Bc9 A!Z MTCF}u*$$ bȦxJ%dM<%%iPɉq :,*(ha!=Kp{$hsqAal0S!/])ly>&ʁ1B8(̂ fʂ7GxߘhQ(҆\s `2*́M9pAS|؉OW߯~ni'4Lg3{Ihb[=Ose}x[{?r)yjP{΀ǽwtv:_N}ٮnsm:(NߨI0\]Ѕ}a jZy'.u?G҃RPBO0%ĜaV ]j'F]OIJdbĀ64DԈl|>rIoqHO敏$H.Rb"5:1zQHKFF5<ɶq"R@5j϶Uu GEaG[hQ3N֣8Xμsͩ?pb'Q JDM̬3ep 8x!IqPHcI%x 4=Px99Eezz^r Q2ԼJ@!ߒrۊC$ɐLfjf X>.i*U$ɪn.1)[XLBZ KEMQZz3Na|o(N1wvMcn:y{ِO"%{zH>MƘ=:GF"[2R:ȕ޻Ų.n+M~eCs e"'Iw'3Oܖ1mY5 8S@LcA`i;lN7Ɋۯ>[<92ȬvzXS|݌eQl;'QnGAYySh;6b#oT[&%fķ<,}ªʊ jf b =Aշ]$@!3Y ]-xmV"Z`ޒSR:zгqab((^,.^Ȇx~z(X/|0a)գ,e4IRbRl'xR[ND$mNGց& jk)I#]|޹H.4(=}2>dl0*Yk!NSɬ5 cY+:}HmV֪I,2(뱂\UL]d.u%Pi)9xU^KiT3oE= @? 0F5: ^e!{? Bz ȟ "!xH9.d""j* S鯚">(bN#<_@?Ù^> (dLIXM> C>N\S{8% %7<˸|l2XFuW6×~' bC4'Z;_C݊7Z$ڡRJ٫2v2JHlVA; {+BLEoܶ/T ϻ)e;n:Aj|cEׄe7ĔPGoVCjp7 ʿ^ҿi8Am3 } ,>8~ bjX'jT6䕋~f[i he/xgsX>mu=}:,%բz,dnYf|*/yzKǠ_?@(!1'}_d' 6_^2ĀjaD9 "Ðlw; n ;~>ݴ-Sy$ڸ Ѩ@2?씊^⳩.+٧U 1D-a P|U+,F3ZKm4|8tpٖ O݅wrHMSQL|V bR) 7DƗAYb: |.m*U; bt]֬@ nc1mJZ36퐻srHP-њEǓ 3FtE̠n@n5E?⬅D{N?wqحnv~ϴjo _= ?0+(q~5oM,:Y0\ZKeXV{.bWF,ˉ5i{ u _ JEEҔL4{f3ʔxC(e`/2Iܮ73H>zىkZいBxE_uQut^XJF!Y]>LďBW&S-Tˬ'|פ)혡ho}F{=~ڍ^wqaᘅ}jTzсr> rb+dct2Q~)ුyR=)_- ,ӍxV2HLv&l`|7i}i0oT,s"Љ,odK=lG$}O+~ o eүʴ|i0ZmB1ЂH7Żs->s`q\6煽dzaBG7:2D1;e\t]5_6m%".:5 ) U-v$\ k6]$v~ Λ*~3]FCwjl endstream endobj 318 0 obj <> stream x\oܸn*y|SlqFkĸf~]gwΐzJd-,#p3_(chj,϶󳿽g:?YYbeY"c2]9B :'P*Ԁ E[u.a %\8(n?GpNBN p)N%8bc 6v nn]r/s-@?_+gtj+e8 9s.(Ѽ@⧏[?LAK(uH2WnMON4*~D%.ݗo O1d,D6ēdby/#Ď ",rΨI{XwF(xp|:rγL'ӌ Ъ&MQbU&  Rٵ&k1w>9 <Oe_M.7]8QZfEHZEBLzn(bGcǏv/ј9TL eˢ Z z#iu@TJF U5EN%Pߋu_.E|H$/dP0f(aE`(\o~Ka8}0n9̳ nY/pEDH8h ǵsT3@8ao4Jd60 =r*tm %WGx$]#T8Iʼn~CkkI F/&B ze ܽwɥ1IvCGbSyƢgĹ')嘈 zzL*.jUg{`vJ >d)Lp.KZp[vY݂A7@B`l׊SjO mX=X_{stC%t@X`y=t޾8ܾc06q8cq>Z>]̍BNevq9C;e?iǓ 3gM=3*9Ljl}%AN1 ql_ Id{n n/#jƪh wI Z;>78}S8@0Dcf^_~i!\4K[ZÃ}uBb :XSb;6' Wm)bE0TB&W?T풼ҏ#ڡxV.'Z*ąa{,ac Ku_MUGQtJK-Wru9")9iޟUORQ;֗4zg*nҳh˜;ID4w5IžZZݬ+ _)ZMv醇l[! lFq|ZsO?zťȽ~sֵ Tך\$T4ʽ- 5 fXDk5]EgN,Aٝ 3#V+߸a0X-1_yQg q7VV650'ms#J\N/ξ۵}l7;|9c:F9 rjAH<`hJ zz(6)Gp5r6hd}>9#r9PѻߥdALyvBڧWz }a~B&Q=eBL^w+c`˛׶0R3أo {"ⓔhQ$=A b#追#} endstream endobj 319 0 obj <> stream xv}#cĝ>Mg{I>4}%+9 .EBvPڜƥ3ׯB_Ů{_,6_/++yAj*2R^\~P/n{sqKׯU,^\a^YжӥY%ԂY-_p+Uᯑl,7%[U^ԲlZg7_x ؋k&4v3RRhnW^JR$z1$C,p拫տ &@a%ʡӟwKCR=uؗ ufv;OB삄G8׻vO=18ڭ%iG|2s(:i{?XYvŒs,֨f GRM>,}0CT퓣mP3R>;Ё5*6v% o^U,5˜R 1J`V|zKTxF CSޮG?P. I%ٕ%]QGo~c7}04.b<vʂ`F[Z|ů| 5|:]_w4[GF6`)gi`y<j0 MB\od( >*rƾ mn_9=`[$KUpJN46*.Sv6Z?Ko NGCWp>1.1С'.9S> S>)gR)+>Y `kx~*eT yɃ+|`AYz98~ܞðL^Y8)z3O5fL*|O;=Y%J.܀Χ$D "r-($ oSa Z([o37"r9K3H/mZt$e_ Gy *ko,P!BɨusV୿N#YR7Aȑ]8f L$ ǫi3eaU.]Errm6HQ}AzYwޏ>^W߂?="sDi&3_mw;Qz --cU9@ۅt|l^Lp2ppu%K#HY2d3P 1zBB2zWd ۼg0  ci#3ըRa]MCH;dXOui.ΊO2$;yӝ_Y1#t|2hڗq&.14qC,>x@s[n^SkC1>ڶ0Mﰌ|"L%Q$ՄqydjcGU5 @RPt6b}+oF`Pvn /q[UT;$ڻx+/TlLg\o$H4 \i0pju/ ‘/=%E5xo-o)M[v3*o%!R.ko*#TU664",z{^~'vպ2.=AQJY(DhRmjpތ "݆24ȓk4S @nSOE?R7!\`mDڔMjڱ}ژ44ShV)ipcb #ЂK> uK}Wr^̌{Yup*ES̚'Q^(O.㾷Q ƾڎCk,f Q-U(?7hj}d+tڼ\ 2CwU#izڀvËkBu{W?uQ a*E G_#Ps`} - IA0_6Ӱ:okY~35x 7[,M4|<=fP 4t4b=P:(:s\xz7B3<=*!@{ >┟.|߸fHiأL~e }3@,ޞU~O7cƜa< U? Ę(+6L?0 ݩļs#V2gt<t| *ȝK BkV3(ޔfjZ19B$KJW`)<U@F Z8$=2?ǧDu@Gf˚{9+OmAl ȍxgw`#>_G~_vnDnjq#R)Yw8Irڞqi}_&19Da;] EXT`YMh<hgg,+UҤrd79 *S9AA]k%2EO$fJgF9Tɲ)]@^=reKx'f!-`p|WFߍ`7RIqL'`j.ת2X^HSvksWxnbK%DJH'ⲯe| YyAۖMĶlagG xl^ xq@t:3꣮I|F5z/U?h@˟rB/XŀlpkUʧ/fD-QBR/e7}>Mh+ -0O2O'eSVIZ<©R%JL*KGcXNrFtJ[ɞ<36>:i*F8i$Z+DG%2}pо}.μ߻]չ1W .`9.7NYJ+4v3l<75ejD2K;'A@x͟.,38ﲁB& &‰ڞ|ؕq<:% ֳ{9g4 8Y0"3cR((iR|ýDVe`F`21A#θē>>~o& g܊~BV߂$D8ZF; N0Rg_n'B(is˳(M>;C94R&3",9Lݐgڰu2yŝŧ'{c޹),AiƮL#ҥ;yil8rXG ־*<*ZcڀP$o/MIvi={͢c%Wڠm~EE} \te÷~ps|ٛV4pBrcʲ枷Ҁ7Nr-J{×ΑA۸<[{KF7 N 6n;O <^)[.އ=M,wv.mMpĶ<&[K-2.?G  s9{V=h"N̝廦|JЙSz)`LHG<@yo@]9`y>N^۪ endstream endobj 320 0 obj <> stream x]s۸3|31J|mzwrKTQ)磨=Е2w^K+&6+Ox*VWLE+`FӴ"A0,?VR1a"~qdGK^zXfEztJq;NKaj.R-/d,dS^IǦ1q5w̩Ad*|Txjs cqAۍ3Lcx*@" VCR`#dcL 6,G9} b-T7u8ŏAh);+Xotx>q 3NKAwqWʂ}.ac`F\0<_t_~\I=jA0Mҕd83 SHVQ+9xȽ\"?x[r=y\)5:+Mi&W1s|9dYe''P+Wxi)*>LߗGQt>:fcnla~ xCZ^R(v{HwH\:7qqm2QXiL;挀t&yӜn|$sH[xiJc֓nhR_,t[x<Ĵmq 1=ǰ~!VYUND0"dȲe04w\iQ9YL,nd g@>?l95%wJ67+r$Y>dI6+'Ri,*m3&@]Fr^13'lɸy1nH)e^܆8h+5.6KjLE5,g\ 9'K-bPc7aSm vlC<.a mʁo#Kpv8$f@3}C.4_!BxSWww{I1w<+Є>\EDgLo7DŁ0LF0%;(Y|BOsL Myoιohyxr+G"*d/k1>6^Y 4!Oh?X B8go1[.&/}%*Х.a! kT"_$&PЮˠA#|Օ&1qC];,b/9#BrC,kT/QcMWZwB}T۾~j l~[U ' hBrٽrȧh*[3aG-Paܕ&8" 'h T0=+T^~8#MBɪu.~jDm5vqǃ$jvx]};Tɋ#YLێi0{Z Jg3g9ljAhM,h ܻIK^.#McN~6QX4m0h6MFKUK{ J{TG[&k@ʟmo'N2$d[p?Gb?l?ۍn1}?+%{AVY4L`#pC(0x0 lV R 4Ǵs'5uq$.H?}Cƀu~uCM1%Li9ePȿ]pID;NOH4D\{ endstream endobj 321 0 obj <> stream x[s7}fjL&mԝ{hMHr/@.C m%3QH ?l>T?*|jˊ_ϊӓ+(%(/OO(U-$i!2G{)0gq~ӓE{qӓ`ƟOO><N t"t#R-6dBˊ0SAlAQ | S+dB8Slf E3QNT,y"zZhW^X:aZ1˹M-/JoKؕgbn;2牗+b'rBG_U [Y7;? 20X#G9i#W?͆hfĨn< zt(0 GP>\oΈ鴖3D))Ə`tg<3II?Do7`(-&1א닎?@ .HW _Θk<)eދUTӴwEU1 DԊ?šU1ʀAr jkkC944R|JIM)0y*p}붬&Ad?iCM7y&[=Ja1B%TiBZ"x?;[4h >lcP?J{E?D~È9 NG$uřdz$*z@\A'mSeڎJ2 L>fcEe>p| hgw:$\͇"gDXY󴊵Mޖo<𴾄,^@6ޛ^\dh(>=q9 < wUo؟ lkC=[뷰~T2gSr,ٟhQGXS#G:)a Xo rQLX1bl:YuDc26i&vvhWڙJějm?6BGᠱQ&;b"F nAhsT68~gx 4~suSv~3^0E-b=.ٰ8f^ӈړ ":p& K}o=w~!u\;km,W3I@!c+:pc4G#ҏ4< <"xDxDP_շum JW &_ ϸ2NT03{T"3CAEc L |ǁ#S]KН-r?Do7C0#5}wQ㋋N@Gԣ]%pbpWGK5gnQ.53N~;W$yl|H8bX8rǙZs,7mv{Ycq̊>H*^N=x}[O~x[Ŗo񜠣V6k{ֵ)4KB~D*?v(bvMω0#=+s91ch b)iDǖ?l&Rp '2pc jNX6D_ƹsXSR_NS.L(1Ox]WTR> stream xXKs6kFG3o iOuK@I4 JD ]`~]i:Uh`t[M'?̧~sM'*ƙ/4揨wαdt`lt3x3<5fQJjI{+hg8S`tXvw!-a4f V/-(Z TLatJ/ṵ2`v5yRրjhcŶwry=x3߅W,,ЫqhI:N󝋢_#ּO3Y/gWAc@ 6/CbD y==?:g9#u|\X뒫CIGt 8xiuJ8V*N'iɀN;Inz k<"@ þ{)) {GĐ!vb'h'tn.}i'<bj b_)6T:MC&&<-ұBlfD> ۻ H| @AFgv5j|1>urI+cac֡{ovͰ_(Coðm9X{#2$1uNlA2Zzoov endstream endobj 323 0 obj <> stream xr*˧ᖅ/Ovb;JRR99Fԣ%Ù*_@ra=8@7xz .,oaDNO&OO??=ˏ"e*9:=%<)50T(29p?/\/~tz"I|z|ӓ@g* =Rr>1 1P"%&c*HI%ɤ !~^cY[*Z@m0Mfݠ+ mo++rBmF H,xa%71z0>`fJ `Z7g|1di(V6`W]vFuj\6+ 8d3-~b4~ )$n'Q*xoP=-k;k}'pf!5{ UxiJJ:Q/r!梛,'պ Z|k _\l;k]&?4 w]3xPY0CKDD v Bf[ /!Y,rYUufLZbdвp.~ιOȜ?E*D7JjWA[Fܖ#у$eޘ#x 'I|RZ>z?ڤu#HYR鶔k4ilFe Ŕ1S$c% 0!g%3. fLslpɌR]- 8H.3UʳP^f]d`ņT6R/FITcڮDN2lD'^iyA;N4/t zGpު1#Ia@{Us+-Xq-:?DgCZOWqWP2wCa*`b_v (/ƔOtX.f0O 9R ETiÆ\b4 Jw$WfHPVf~_D$q}jv3a,s d;Ϝۘ&Ө}fպSuf?A0f<^ %+"}eb2I94҈!.J|Ec`SWkڕ@?Ҵ.u öo?(qdW+iqMwN* lQy*'V[:}Il~X;WJ" ?G,("w /BAȳ Iܧ~ZԼtJ4mF MISw5fM K[};}#z1Q6s^Rb(%EQ_LpX⢲eꖪP\;f|) RުXafY\V脄cַ[R(@Mo]19$J, BO o#<EɘH P$ou'*'A􄮇4烮A%ũ8zMy!03Op@-~/F?  s:Ot(OGχN0;ENY]?d3w ZwtffVCPvuEq[A¶1"BƋW#D< 9*p~(-|Sl,̮w9fG ڰ5IRk܇̆yM$NhC@:2 EPHPτ9@š$%A/3H,H hc`c. ^ yƙΏsECPHXJy"+CUox _~wx] 6[D^$" DΧxNU/K ܺ̆h+ ,h_߶ۺ?xxasx87_cer?v <P"(8ʅ7Ku)<]:Xn(Pk[!}%^ bv|^]OvFu)U.r+Q2/@DKm}Ox6,9.{j+SNA\jd~#ʹZ FHbn]%*w FuK(932DE"GZ /Im (3͸< s cVf r%53 Ȧ0vC7oױ>QUꘗUƊ2vl6ذj2Ȇ TUI+zGOej;3@tsS|e71+-_iJbq<҉yb9f(z`E[)HcA < endstream endobj 324 0 obj <> stream xrF]U<*k2}ڊKQGMڤ=T* 1wg!+^Y 췋jq~WJuuus~&W xaWW_|u5[ү~TտϾߜ}:J:"]F,+2 Lop WE.tLTp&}5 z!X&ĝ|+//42I^$P:RxY]~Hޑk\?ݎV"Fւ#/A˳]`&EfZOfid  S9b?՗zX&) :GoXgǁp}JaŅbqoˢ<I\٣7'K5a!;qܧW>I׆;i2xitNH(=4dF+;g)?~ue?u;^sDVĄ lj}taʲ)KJe p}4{:FDpQi}߅xH'оq%(@e'FюܺQ4\GbkHRe S X]D,immѻG2DIs5<n߻I9%$*/&ߵrXt+Bw TV+`NWPf?64(ȯw\.uAX:񂺨K; 6씂q {8zC~ rfhAT>Q,$ ʀV`B=%$RahBiKZΗ-|y΢ښQLTeɇ{*Hd])FgcO?=>0Qt['Ld7Nfq켺M/*HOnrIG bzs~ ,OX"hVz;$o*rOQ=Q0(,y0w`ʙ**S-x]'!9,dž^@p.bIraMHH:tƀ ޔ'2_&*2sv_A)9/۴fktz?K-l #a_]Iʚ&JZd`(`{%4ߣV~boP4"?,8;ο '5&yx|_Ϭ˯?5L׌u[<~v^MN A{Q=Rjs4l۽AQv`jg_VN8-`%b{pchF㘠rPr7U:䫟D \l>~k_r ɋ -rߢոaq8|6y7N@iܷOP tޝ.X)DRDa( %ŅvŖ@N"vx󹫅!ǎ_u+髻:?8 `=44xZx+we (\ !.Q..rKM} Z恙RA9`bҮS@^<ߐ¿C#:qxvcZȕW1٥G^@GLgfhYu<馓g:P!,!^ʇW_ YF줄eTV 9.!p\pS9f_qvw?y7f endstream endobj 325 0 obj <> stream x]۸ vv&QŇ^Owyz]s8^ٵn HDjԶ @J}~ _+dVd[2^=|Q~BfBΎO>@Wd"k\O.Ɏ&;|k6Ύs QUPef>F 1@_ tˢk-kТu.,rdLȼ*m!SZ€Yӣ۫T:x3ܠIu2hdvm&ERwۛ禖i-V Z>˸s=?QzނOr^6gs5;WYTwSmR:@*:[8)rUБָpd"k=8ces_](/:xG"3jȒUr)a @6F펒Qj0j=iy"b.Ggʷxiy/Ыs-@G>t o9gk^o-{p|+ n]\ W.:'^=7NK }]΅ [-fN7@F(lK'T/Pws-~&54OYUuM+[;:Ӥ;-׫g>GZ,V`z 'j. ;@wh0 ѳHv+zfe=hq(ƐifXp^pFwgǡGe!^ϲrU+!IKKrO~[ʻ9snGdoF{!IXXCbie'KdQbr$ ʞ8(UYP>$C2$xXӘ(ClCS :O:&pIQ#KcnPJ§h1 fA\=O 엧1,k3өPSɑ#K1ШF8RaOPR#$DէeW<+8Y(xrdH:Tmxr钀Tmv, gK$c՗VmZ}}Nv*tIr\S2ZhɾTEWT$Qz>ljY**nMOA<=46|D*=di46h>6_KC)9׆6RbRVt"di0}eP= `%cLJKdhbG#Gxh](D, ZܵNu/?[aeJBMBJ7L)GiaїY ʁU)6aZ>av|X 3)Nb'`&G8iYa)`Y4Rrth=\Džn;Y9XMghe'+X.Pﻌj'$W|$D|جiYYg' Ty5D4 8YlIJʼn4è>x BЙ:3pHacs}'#àOQܨwCw\q;5Sc&OT{iStO~܄g 13'Bi5qT萲9L'|ݹIՁ,Y/mDið^}+NuH 9mg kBָyt?#=RFmL2מN4zȎS6OT^Xך^p,L^Et-/`2isB[it*~q]nl ř {5q/sݵ1خ&w >Iܬ5kFNvuR9 2̫Zd|j'yo:/\KCd#Ws1Fg'm YҞ|h)q-khkREn' []`7 ,/]bϧ wEޔ}}'l K5(bV߰<@aƌ m+iuitۼƻKGBLbHX/5:==XHzF%s->Ë˃NdvZٴuZHPGCnx4qwIԋO2uƷ1A5zZܑruα-p-pbȬ_vص)Smyv<؄v;P̫Mؠi,NX'hv :tiIQwe,5a'>6MY -^{/W\ףWޓA \5ӸjB`4%}z rG yѣC |%7TsT0HZۭogF[iwݚuB[/0ww1.G#w֓շos}0TuOA60˯H5#;/ħ+%۪(zSeT=vkv]YZ hM<Uۭ֙>`h>m迵`fVɁ ̯%6F >,Hg?-=TµȕT-2l?.Rg /~ endstream endobj 326 0 obj <> stream x[o 7agX}>nr"9}aoq&kgN$k7@d33D~DIJoDYY>=^sV 2ՌçJiflv~zg-]ћ o?gſ==':TRg̭|ddc4[)m@ -*ƳJL*2.ó R Cd Yv"#TLagH_Q;Β[],˅iqa4ߑU<ڴR9>!A\6[^*gl SBWׅW#U=N(s*&Ԥ8z.^%s`Y |r&% ѽ +",5#ڄ]1Vܥ5͆zfƱ9?bvCl]hL]0GXegƏBs|~; 0ƀ+XUg>>[Clƍ0@2v%K`\Y֒)9n&PsPJ@KjWهR2xSS_8c2G㑰LFq75`gN'oϯ7.Fc^j]Ƈu9Q,vQ .;o0m?/ %4a]m!$tuM V+_ 3HX'Xm^˒fv:ܲ~ONnQ^Ѿ T S 54c=i 6@!Üؤ8#P4 Q<'ک@Sq>C%i#3C4X r93 q99,Ug4ؑu{&ͤm5f 1k6xԤ=Ar5Uv] 0)cSta N_|mJ@2>9jW!{4ރ <GZ輧W-xT7EI$&Jb铆@/u*>Uc}|3>s`d2pc {VkK>3)~U/BQ;F忳zdm@]W~=1!(Ef5f)Mm2 vEʽ:Js1]NFT{ؤQ"ta;C0((nKd\ !QѤgMbPZ+=AZ݈[ZƇ% FS=/7]!Y,+ExO i?(X(;G)G0_4i^+R"`K/ʹCs→=b< E={G7}PT2VTFu]%+usjKg$OҞ g;N}U-7GxٶNj4S}Ujfݡ #_/ k\r~jmsF8GC$αEj{Y18NcG1H0AJ&Z854ZโG muëpo$AT[BQ []|?xTkkq 5`)CaKtQ!3{! Թs#T d{ m{<%Iu B>yKK.A CbmRA4YY]wWun>,ia# kDQ_4Qou@*~XOZXD;~E<DF8NM_ifR~lC=Ŷi.Cڿf\ 2bz|'f}q?"tqp) X<&AS y̕Ū{H[5.Sk$ '09jq?"q*dB>弘9xz1ڸngw?[oJCh:Y,% 7|.) $`fVg^q~G r*GWK۲wsted PU _QdPw'.~+ShD)ez;wJJ䗈bu>Fa@ N endstream endobj 327 0 obj <> stream x]s63|3J|gڴnskoE?z@ ʦ!KfbX,vK8=)H eY) ӓȦ'\|q2JI! pEFR MZHWf 3oƿ}z ];ӓ;Q;R2ϴ䔶mD ~jA9P!&4Ӳ JALFQzQ!A(,WT_ "p0 _D;,2`!v]q読u脠v<,NPN/-+ nF9L/]."!Fhiѣ ϨB &B(Xm8?e|f0_Z'8TI7=Iajc20 >Nc)ozD)=$E>͢tvFrxW[:"^-&r /tf\%ra$@7n>chF恰-2&&5۝õT@-M/>o(6[ pzʩ.).=g[lH(ÜpjdzaMF  zQ6Djp>,<װ3| lO\2b4 OJP;ӠRM %r:A'/(Sw&_WvMvrc{㋋94IMqRϘސ:;#pI+Vl|b Va5rADiHu=A9 ZNgvJ,^֛ϩ| uzPJ_.ۖZMPp ZhS EiM ^.RT o}iZSe?3)7Ĥ]k4Чn$giBR| #{P1=̈́."jvG$n7k[5;MY暞9WJw ș^6lZse)6rML ir{S}2l6j7{ `c uki:o|vTܠT-p#8Ga! n!*ӈt;i1MMi}{*(Uy,HEk<b#;bB#&*-̬gdҤ,$XM+beu~&Jpi k67;>`FCm{q X,0[QڲȚfX"=i16Q;Q_0?ù"Ii~HCٲ&[^(Mp رOw8쾪qr-1:5+ )/J6gbv^R/#4\=kyXYƛτg vKyf|@X d4 45 _^-7l<*+*lgCCSa)Lv; ; kGڲdM5юJ6Nǽ]n9qIU+ ^+LI?R:5`_@쟄b__LkR6-#K!S^쨩 2)n~gKeF>AJeFLM5^3:$N;#ivso'Y8ZOH?3?#:{Pqy($]# endstream endobj 328 0 obj <> stream x\s۸UM7IrIå$\b+\ӿ $E%HNLdⷠ>,9IHÃ>Jn<~)Y|i“L3d5%K.frAWyqA2WrÃÃkvLǎTꄾLr2 1'sB xbuDd hzQ r Cl Ukwe-TL"}qTG$8Jl@Xfm͊뮜ZםRCwa dEfSX<4 | fz0/ZNs,:㺁vM!pJY3,ۂeMر 7dEhw 5 Tƪhbx,,*uP_!_KDuwCOa3\Qe-G_PZdO!I#dAr`k=Hw_CS8، (XNH8C!d0nri2>wn>v94rLwZPKCK`<7K)S?6h`7}< 2`~s#GkcAb6/}ss:Fx gt?@yjE+^&™ ܧ)F0ۊv/i!c/ Qb]5D݀KT(20vc}{Id$z頩QM^z[uj8d^ZzXHcl46R kRf|N.D,lm^:t)M)ۦ` `R*Prmf+`lj!zq,'_qj1x%P ޵'ǪxnelG)פK=}z]F=~q.˂[eSșALOEIo/.8nK̴C6zCY5/F/JOBqS|1ޫ2C)hR~ 8Y$iU=މ&6V3rS\UirZBU/\=V/Z/W>VNZo5tW(s L9V;f #cCOП/ʢH7m.#[q:T&( t Y@Ӝ^g1Oe (:n.5%bZ'0:ү:y`䁎:y@ "P# "l{BzEyBuRpUn6i!s9_v +v k]W}mW,5X r~~还P+L/LOA_G/JKh[;d:?ܳWQXt}Ů~ q|+}~R7A^,‰BYA<5Mizݤx2ICrSjžxF/^bĭ54!)uˬ=/%J\xIѻ!CURIѶ0-[?+z^7r*H ?a%dZNiBULOɋvuv(zTнQ+><'l*S 7UiV&jS9EIf|¿a4F cd!Qv-:c=$uw#c겊‰ᰱ/ FA؆Yi:_yqM|eSI DF81ŷki7|K @V$`yd9{ *X/Jy a/T:j TQvU> stream xX[o6~7G)X8NvOf%2݃89#[8j s>wQ BY.HVNǣlD[lIMޕEn,cqFk8:7P[Z))~?<ܴZYa=+@g6;˅pz;q9Mv ԑs~y>emI}.[<#wp`XS\ ߄rvFru Wi  cѧRUũy4lPY/Fᛑb_>N7FY%yΈih4Vy$`ו(dV0!nvZ"^SBz-hl,oq0[a8_G0Ԯ%uHG{}i.Stq n+Pd<6r-i!|JL?6E>\^˿Y-%ݕ柉KOIz$ت^ڐ[bIIǔ~'pZy3%f7oY:0H_LgH1^pcک co17-~)_zLbcpjI(wg2dKK?XNIƫЏţـ]^1a6.{ -b'>.bs2=drsğR~v˓mP<%V3zX =T24~i.XDZ8g -&2"E|HӲ$8t`58aJOY`v:?hF eGZ-V qIp\`B;yw endstream endobj 330 0 obj <> stream x]s]3?ܧԉv<(4E}t,!qﻻui5̄&p{{{'9񿒋$O |R$oϓ_NO{-Ypy“B3 K\na䒞ӓi;9ɏϧ'Ef\ꄾBr>3 1'B xbuD hv#A(aLJ`c!旖) #8r']B$g0=N=2IšuX,+"mEjSiLl&̤dX,یsy [e\[~tdqj^RdL ܲ*P\\I+QMIjαm\@]\?eV>I HH狈ttOc #u>adr:bjQ!ɢM%"+;U~†TF[3 |"/$w[|q[@i3ZU^n}'@5$R)\ڔT7oxųO۫7Bw?[?8 t^;}؂2$9j˹ \(U)$phhKRy¾%-Coo).Bp܊|L9G@ׯ鎹Ӓ 4]~KFVKA[1I:hn2n_]=˸U/NN[ѡD4\2-qNn&O" ;ޏ]6ߌmz_wbڭX^oQ%ׅ{]ZuƭCOxɣ_21y͒E=晢,s^lTJ-ҚD7*jDϕn(>mBtF?n4ɽzhݐsU٘0حs|y8zrwa[юiN#^VsL`Z0iK^.6\KZaџ;p !rl bgk zʈ>8!6sܩ JܸD{DC 67XWLX1=rYA%,R8^5fܒ +#~xaָ U7{ѸdEw~x6~p gaKPVhk0`0IMQҐրUV sDaXB FKdp~O-4\q`J۲, ipq@k Q W2 ^ؾK_r8 t_JFwǘWAMTv0WL$19ЃYx>ɥӸ(!u}ۿ}]Ri9+ 'l{xHCH/*uK yN;ߴÕᯇMBi}q;o'BV_ýv )7aHwҥ,S4F0!sI]RdmdRo_,\a{Dw<ޙ]oF2c0m#/ g0.)ࢴ(p72bYn\! J.+Ms/-U4=d ('rMC b a{cӼ=jTǷ%M'q1R"D,&"]koYSA/АSnNeW<ΩQ;@z}[' rxh|``_qy sf Y .2 2Hv] <e fdHeI-5]myݽL>|篑 $e[3ab}PMҡŬ;.Ɋ~9*-vn?)`+lѻ-îdõ|WF3>c}YՁҨ:RsD\:0Xױ4bfģbuUuy ~l Ĵv`Cr!Y1rP` 0a/OJ *~R D1{O uW]?s8:G1+I2!0W >Fl&Aw &=(:;JB&]eOlj eGOy@'C[QB4)fXQF~>mv*ᮮ)"\ y+L:!U[ߞ2Sھˎo^/SdVX+FB봐Lh]}k+ˍѳy~#:V2*b$.&u 1 Sb./&;Q6s0+!,dErIzE ~<>{@~Gq4rNir(Ir4ZL~ZehEb?R endstream endobj 331 0 obj <> stream x]s]3X(8u;ule""eq%7̄q۽>%qƣ$K1'2:8>bD,TV*U~|E3~DFg;>fNBi5c=I,X%~Sɢ5Px(UI̳(.HkR) 6}XցK K|/lbȝW2éKx;b[kIbzq0?Y21li.'-orTOh6͔1DN.n9er2TMV˩l:ۏPLl^Wxr ۅg_$hЋH؀%qFbJ%Ч,0Fg"vQfgQ$0q ***IQŵ87шO~7l9*V~u4.wx J64wJ_mK 1MD12|ZAVvb ՙUݷT/X8U`ГXfXa ;4ภԘ 4dS5/Mn9 !NIn3U[zr| y+? {Ƶ8 D`?8sv Alj~NB"Jc5h4#^Qzn^F&w5%2EW3rsg2-)D SPv[HDid@He&LR:3&rЉI=4LBދ'YAVp`(M'"s1iqqlS-K @3$wWy)p \Q^706oVb| )qT̽& V$Nj7WȩtV ڱJT*XÌ"VRd`Jt FtY⑘a MiQ;w*Vʭ{Uﴡ3Pl0_Ϛ xӔ){-5GoزskIScyPi,!8UbZr?QxҭZ}ɊpM14xPMB ePlZqB :o#hYzgE$3JUVe+:Kf9 ܫ$ҍLE!J72SJRt_Ff06in[?kw[+NjYv}wJ7RLʓHeHQ%NbEr8˷;@;ʃ4\ƠM*h`T L#I&9T9GJ fk+ԩzHR6:GMaYt)2GoӃ8g?<A9 pj${(|ZwcIyQey[}UG)XG]ۚ[CT L, gf5ASdsFru5q2aQEYyԊ xnYKRحq(R- Pt1C2]A 7&9iChc?ے%dƋk@R2l ̈́Mlh&Efx{6RmvH(' {c˞.Vkb#kRc!KRD͎1ZRzM*Rv@xr:@Ng])0T BObEEnr[4IF*u2g`FOpU~RrƊȶ NZwy*ԞUݿ˫=JD`ò%HLux OR"c|+yKJNN;oE#|]l {6(n#ÀUp-eGAdy[*~EK!qb>JN.QUCˤ3X"k?n{gjy)5ٺ|&sWPf;_gl qZwy+94wJV+Vu?r%OzʾcA*;XFGq?$yT_N6' <򟁚 Xp|/Qڒ}@JL1юW UuZN*O[P%hǭr|5^Ő1|DgBm:F}>RhWC?H1c܏,/k/2# $?[̨c+ט]u (i|pPY=uoG #s´;g_/ؕA1TA탍aJ,HiWfAhJUM!t\, 8rpXMMj,^Mf+-b0dPE5"f`."̖alY1Ȏ> stream x[Ks6J ]xPNYoG9(Ch4kH#qǦE ux| IN$ϒ?ώR$L%gG貄'V3r }M0frEOxI}{|%ީ=щ2<:{n%=әkx.Or1aK`FSg$H% IdRDvxiA^aNV$g_&v:lbeX?oG*~R~:8sېRb _6NdLt6)\eH6xrɺajS!Ff́x2fIsPGR̂f fnpp FMܿ!*.ի͞@ Yv׽ 0B;[OCu pf;h ʹ迯Kf;ew;4~7쿧MarʪcJ{q%ڌѐ0N 0nZl7Jqc_.!`fIQY)״Q(;Z D?wޕࡀv!\,4@i3(c4L A{.yn6- ˔7xv7`w65A'wV! nldM}3\o9_V&ung_C$ޢ^ ^ޛ|dp#ax#J\ZJjZ]-AUqkFyc X{k!A8DkE `MHD;Vќ\19ߥpN<wpjpUK j=wc]3\ŮZ1biN8LB(p `EsBZ4H:ӦAyDN;gzc*gtk} jys7ꣲ:ڟ6;@OEDha7s:Lhmv; )z*Or ߐ-/r 2ߩ O(Eo)wr$"|_B{E4`sll:YXiCKOKj th,p%0_*Эx}A"m{w^;IvbN۫eK ]p[0e.fx]P鲬,p *pk`HH̦~+#l2Wx 09r/ (Mޙ;X7+Њ26td]"V],/6"j>"Wh/%Wmߔծ)%D|8! !_B^-v99p=ڼ%Pf=BCsebV$ubqʜ'/`ngiv[dS B 2Qor#QD=N~u'VFR[C+Fe#b 3x$f2O(;f}Mi0 Uus0?Dk5׷LJgx~橎5nv$#;Щ}%U#Kra셆?CcǑJ,3ޥQ·C6Hu{cA]&bg}4i aq:Tl`(PDʁ%M j˭k=˚bm 闌UТ) ݭN)+SEmnS7⧰XC]d,N>* Lgjq ~G4yoާAO2ͩ:HΪ-U/Q?[luhj \F:=xZ܆fˢ Q1cBDP*U~0J/qэ_WU(3j`]rB,aI8ń[ؐI;σ<h ǸD endstream endobj 333 0 obj <>/F 4/Dest[ 64 0 R/XYZ 82 721 0] >> endobj 334 0 obj <> stream x\Ks6JǡKB' ZqR$Cz4zly(H R`$>9nt7 ! ӔEI3,ڮ,Z|{zx (%N(%2I( IT~eEcF.}x"xxF|sxyrjKtlM38 Th \H2!,2AtDQt;VMTL2,6"zT~yI.AyQEDJtۂ鞤vX(ӊRNJ4]lDPi/c66>X-VQ\"x>s]T,7|fEnJ>FL$$3昂9CL204LIih±#gh^]ʐ=T` `bx[& f3zQ fݬlm3Id6Ti$W޳Vٿ>o7GH5THW" BFm>Uf7J׷Ҿ`]M80Gfm."})JJћqh7CI`Q*Ef3WYȫhF6''M+?#?)_O_[=j7 ?%A+<|2B^a$\6O\k9||,U5_[,)]ML_)y('a"фt$'ČѼK# 2olƘV7@OQ̲Eñ̆4V@M'(3MZ:cv*+Sl1eakkKziIj4W`$(Բ4Fm,Ka0E2ޭYc9 <Gq~2v [_ OgǘypF DFVvyRg.ڥHߟ| `ky0`XB$( z.3] &j yY߬Տh{+1n fthLqh2CNHי)W`m"VmHb[..E1ae4b< /:6ϫ80hR{?FJim>&X O} /0,;ANzoN~_bPt[Ȃ(?_Q5oz9|رU6o)FLZδF8T{gqɭq*c@m"$a3{7]f v21Xgljd"xY̋jtRbk dS8eƿ*Sޚ ἻQdZ RܚQqN0OuznJk@G'3OHݶnzm% m$m+\ݶR$wiݬlFj//Umo#266?޹m%R9F; aȢ9w 1$|qw'5azk, j 쯎B6 0As'Za^5i~5-#^T2Љ9%+B ;PGu?I4%i:_~U4!|V.h@pDuֹxKduF6Jre\k"ފd"ahw/E\W"]2b脍 +tTVSFJ+jTˤdGmjZV]ބT H(MϴˉhScN;%tuJwyQ_r<q^yUc,<}uE1@fuA} L nKz y}ܞ)q(aV[;[8+R/*Y+85K3gő98;ڌ{% *KI#13^\ciQm8istRe-lxxx835: dύ;/:+n93VC0PHPZ&}+~' oȧhȩg*,M3CtfE_RjWp,ڳg6 <9[ݺ+fGTDRvsmÑ}I;afgE.Z4Y^1Nb#o FvPޭ–.(w0+NP5d7;,>fфYРN5V_MH1aBt7k@vs^i2zh޽W]\(jXiHIO-&CP`JTCB_Fp }Reޅ PIKju^^E_pS`+6[0Vur!l .]V~3Qi ؔqlm/`{VtfAd?~c endstream endobj 335 0 obj <>/F 4/Dest[ 64 0 R/XYZ 82 721 0] >> endobj 336 0 obj <> stream x]s۸3|31$vZ?:16XҁXTu/9D1: T!ƍCMOcAn %B2 +*v#Wp`)/w4&q 6NKtA 7PK:̵9E hT4N¥7/%ڦ XFC;%7Iet4Ip4M3t}eeu9'2=#AUSt[FCr [(DHK+tIUl_3Dd\')f#"zۤZO[/_*x<ɝ?x&jy$$X;Ԗ V |D3}̦0cSG`Vx004"`X m0s#7h C vI;`AezE&xEqǡ^xWdtȳ~قR\ڤuqN6ަ}].6]v3{< b${FQ:# m|$I(?Q~xGnDJVtB;}C?1I~lWe%o^ i >? UqM" uB2,%IaMC\`QR>.K@Cŏ4Qk?A CNjR]X'qe6!l_(!Ƭ&֞E[ }'o|+<0Kt jZjG>9A!3}PXDq Cn@0"'rV]ˆ"-nWqyKD2ၽ endstream endobj 337 0 obj <> stream xYݏFaml߻UR }*..}gfm'9ɑ &;p !Y,<]l=bpSɄfp .cy|ֳ ={ٻ%ѧP~z6IX7><_ DHeE J+i Lƥg^kGȔE25nFT2Js/ %LPK%O$J4,ucmkJdW6Z Zqnt9tK. 2Z^:Y#Mr6N2dd<:p}*Y6wFtWR^B W|UA=<KPbn Kޖv(OVۆl}ų/.VՅ$@ m2 hGe-/ 7~Kho߹_w~_ݭ__ȃBVj!@M=&F꒵Å Xi}Lթe|^Rcn3}|T:&vi$*TB_JQMO[#>$A.h"V*2f vjX'*szдsP2TBCI뛋< αrgѐ[=l$|/#+&^C0(HG.o4RRsAFSIR.\3}s(W/gѵhY轇} cw_fwFY"r.]yrO0 <]Hs`N3 *V_?xl:>lMߦ?(W8!k'UĐ īz;$XhvKZxQAna`r~Ϩg?p:+l]D(O، ~*pӶOCZ]rTRJ|d7xf8!03{³Syfx\$>y`D}> 7oUaXAԫQKדzB,kWkb\@b2vYK$ijYG]Pb wfr" `H/#ݯ2G `l45\^rzn77 XbO\.'+R3A`EWʲϹ ִYEY91Wt> stream x]s6>JG|$sOmzK]d:iII,W?(m7s),~bvzb<'ɻ7''L..OOe K/jb[J\,i8R0^hvk5;)YZuBKTyZ\4lhy;L֫9d~&go9=/ ͙n.o>l)8sV>҃`&&}0J*XI* ]U4k=j%Ϋي.Qqou&>i?/g E}>lP~m%/F\(Fv$n T! @)\,QRQR kb~\;:p0r 덙e6]MGLl's4s[O(P8 &iYI(R_0>Wzz2uM6N6MX[.I (|4'p DE^\Äh5*WL ëzdP ;N'߷H\sՕ|kv8nY10Y2dZJ/n킛 YX"n,%!<;l>o~Kmڡ+pIKANgEukV(Ôab̈́15u|XA{wF<~k,ڼ3+kz O)L1[2Q}9[l쓶>D>^O8%Z澤 \/fO:Ϥ|7,7 - Քc\>EGS+ļvaں}H(>Glv.ľv&8N%LT|I⃙ҮԔg GKrRM;/<9PpujV`f֠c>@0?9 LrTG Æ`YArHEIkROe/ `:ҡVpӅ׌)kEfY[l*Yz5uHX.t@]5 !!RM=HQzœk<->L j0L2\tzn5NoWk${f$Wiģ)x嶒\jD9r}eG?d;g6YV~{$)X;`珰! - 2$#rj)F u ^U˩}>ΎG ȼHs ʴ n#BB$ND=z\p˩L;Q Ҵ"{9kp $?GSt3CcE }o~OeBβ홧Ex7MT?EϊL!J{^0wY<<@&WSn?~. m ~JnI omx9x窹外b6Uȇ x&3 m7U2wz?wHvLGOhCtZc|^cMxj?zxf &5`D'خ!Ԧm,7 whڶ)+F*Ob  8~^OafȞnjr^L91>LIϐ1M: ӉEXQ.\ȏvX{YF{|KL)sryTڄbo2Pm3ANJe*E.Eau#zAV rT.9QY0UCE(>TYB!Lpۯˈ#=˘ܣ!Z6~7`1dž.'; bd '^bbVSrH8qd^j;}XE=B}fL|DKPȥ35`r]?.]a]&v,QU1U$2YV =M,yM&Ҥ|~/M_wt&`8V #Vc_m1,=§\1Dp/h'+  4BVTv>L #,Y#l^-K{ϡhYT)-DqO xTv.V 7-2ڴ~?1z#=0rbS"vuzNN*=T{R#~2+Q;GW g2-sͥM~S)Cskv2Dt^N:sdHW}c/9JzNb.qKb\z/RTEbcD 0Si3d9w)_pKt}$,6_ږ4oJ3>ʶLk"-Wޏ4Flכ1T1P T4DGiO.@EݵKon|r|<Q*CH+ -8hܨWc)jCMvpj,Z9{V/v6cq[a8i1kvh$# 4zv]J=P\$Бv D N3dy+MVj 4E[V|燴v X> "^ ym>nDA(8fgI2 3 HjXn/TD0-7_!PbKcă8Hkn\R6HK$@5K"%WMKZ;C)F?caG!8"mY ql l0"NQW$+QCߘk>#Hٸ4j EɃ1$A1aC{"ob~H1'$ QűDښv+/vƱ1 bGs-dqt%N(I8q8N}CzCC\1pO]Mhct x-W pY+K*<7n*p&) Y.]"ӵ s܌sk1lÍ&i(PhUp3X> iDb Pš# pJ/v1 G'DOODP3N&yq(,Ah0rhr\5Ah=rqAù1AⰁd*/l1 F&DMO$v647x>Nwϥ28q9*Ҡi.PA\59VNy ,GE ƾA,+(qwsHX:㘲.2`Ltq:' 92 "jf Źa0)*-MV-M&-4Q+c 18>CKkWaTd_<&Qet{6o?%=Lh9yt/ڤ!IrEf2d͊dlf(эuBV[붻l/Few899x!ztiƕ䏇% 2ֻWg& 4]B5Li<",.ڵl(=S[̝rxivob8[|Mmо]uv'W }0#c{"͊5MoaYiZ{Ot[w0o굤qZW;>?'ռ endstream endobj 339 0 obj <> stream x\KHwDmTiv6ALV?6n6~3%RInJ)L,"4Rd]{,~MI3.e I<%pK<E2t/ޙ\o~{y~~L?&=7>?:=1Td,O5)!Y@4|JN5HSDYJJME|  $kȊUx : Β4-Ok!uc.Rͷ*[ZÎs*>daSIriO'lR^Lf9 |0.'wm;f]]|Iiz9Q!ېfB+ժ2SXx"ЊKJn6o.PvţLC@33yPuF?gR ,cƈq=;lm<͋-tzE{{pܬ/k#e(pPw0XI.hh iIP(|7c)7|9 #*f؂ M9J2XPx|WIK/qPn6f9p^\}et}z~%RSpE<$E-('gv,qoԻd|W~]!xTE"|ě`($,}DQ좄/:%qL}58Ct4phzjL[1MT>~0/] $ .]rPZWTh+Z pTt+YY>ڌ󾴷I{Ѽѩۥ3et3XeKw1iG~se/5_@i4X0c/aHWBėB#j .>mŲMkwsG cA^kT,0'1uQ/5[#qם-2Y^Uu]颌 p&1i7O1+7_樛4$Ҧߥj+t22E|Gel=_n.K?c{fѻ@`cc,kMϦuh,'mGW8t p-vj\]Z&ˁ2Um?0yAJ3q8J1i&3 >| r72@1$TR^Lf9j< i98kkc)mxȺTO= @-d.<+B`enDQ`Gzqh-H2Ý`4.h;qg#5"qƱCtox`Ok;4{>pJ@,ɇ."9} p> 7b{ði z=jgE!gzAn['__lπ},Σ9轍3 U`y3ۙA3 ~8`IAV)W(bB 2{ 1H =kf|܋j"Zv8Vrujp叺bKwX襉d }턣. aTiዖ-oV3'W2/ɧ902ʥz]InWN_ &1"ڍmH Jԗ`~s WkdۭMH}Y925zkW=#Z9~݌RՃc/BC&oc!T0E-<%6zgBKO#%ziaQ:3ZJ{sP_yJյq3484 գ{qا%! %joa Q!_q|Xًʜ (z ]~B2#`wH Ǐ\[C#Ы 67WUnff?ýKQ?z+n ^CB٥a$Q/X;n7tGW{Qq94v_3`kOP / "Ʊ.b%Uqޡŧ1Vl1D ,<ם ~B`j~6$kۆbkzրS0'M?Jo]zzt9fjwIopS[f@ߏpЈbq08uW`[h(xJ-oYZTFUyv kv4ަk 2[x*GBBgYM;Y&=Z ؁+1hl-?ZQ.3}cl*??b' endstream endobj 340 0 obj <> stream x]_s۸L S&io<%q禓˃"ӲDIrr.@?H$w{Phb ,~X,vb($E'ϗgx"JỊ3 tqD#%[)D н~/$~.:?{ =9?mphKRI'"2T%v$ވ%FkB(1a*R2"y4dDsCX龋LxE&D8KXt9?Ix 撤㶤bsqNpBg+тʗQ\[~z,dWS]NhON-u7i:}vu}y*'٦~ >ېDbF5cƂUD4)Xdu*\=Ȑ7hf|c<:<-,Yˆ#8`fl "TCL{BTyo{DmyhۈTH*G,D1:AfBFwm.ݷvry17NH=reܜۜR# #ϧZR<Л:؅.$0J/5PNЩYN;y \A۴+XroEoxurjqE%:WT?i7{N6/ 2ý멲"klG N+ӝ ,x} H|@VaxV(4ͥY-R1y[5 vn5YҵHԭ@i z1gϋ]/sLg&UYEVct9 R:;0cA^^lW@i\F r5{ng-.KtãɰirΔ}x0O"|4vG3v%G6v APe@n- hA2.H`LUl)|lEhfu޻S㰄$4.=>M`=`S$%R}PUtp N|z)ZVqrTZh-[U,JI1o#olhѼK# tjK m8:O[( k;0/1U3cey4-RN%x7G0bqw@Egы\/xЍk]aSsgU 13OW l6eޔ;hX '$ b#<M;h5: 5I<0ky0(gfᐊJgV9-fa%U󖏇'ln6lAwԵ8DfdBbƳIx]e(q"t a14HgvEӑK$D%>&GclkYP,~3f|61B, [NV9k z A7yjm\C96B ^كBxE.fs^g1үOoo@Tk,M@8ї@nּ؊>.C) \ 33{HbP\hj ^ {ykw;Y!EmI,~}* nPɖWyCm{X&ۋbµSODZcly߁x(p dtWKWfUH\kH Y2?@Wt2 XYpmToBO-C??ԞWfow+4j={ۭf7,8x|*=Xx 08t,I`wAxvx|₢t}S^T[z'mVX3[ͶEqvo3F7DE~xX~ Z|'t1y r@gۻKdZgYAAt9ك Q`|-bp*ǔda%HGԄkSP,$c.c&)x!;(2d7Q$l fX7vfՠLpM3p{Y=͹5꒲[]GR];(Ԛ3E)816$dX~z@uTI ˴)6G՛d-=KSU0ЕTE%~Pjcme$ H@6f${n&rgMg,gf.2ۚ3Gg`闀2ABN% ' !f1{=3 LٵQ>;d TRf ÉֆzfRg0}ܳo68K*ː ?m-PLzv9)DIf1UfN^pW")8hX%7Qn7{\;=dv3ü?CT47d+(dJN`" l,I"/x2@x2pٌ.("t &u grU_$wC#t/H]eoKC!Be4+)by(KC~ vǃi͍e/Vo򢇢nMl"gc!BGmwy`3\ FY.C.I26k\v)궋U_ ^UȘ){^zU4dQD3Ri\D3hXEhFr"aش̽]Yk"{i`0*1Dptx%lKs& 8>B U#//ZuC6Z6MSsxTʮoRi2yT$]}3> >}a2x%ogz^CT=X`^eOo.5X`u@=dѓ=R D=<كRy1Oz&~1X/%Oݓ _=C,x H 63i$NQܩ  endstream endobj 341 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 342 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 343 0 obj <> stream x\ms6~錘(5wL/Mz:wMMEcɑɿ]/Dڙ$Ч㣌dg(KDQ,?IG;;>K(%O.(e M n).-V'W+xgreLy$ILq|Sj't$rssJ;3mDdd VMӉ$)cO*%(Ť%)έ_"&ITlv>Ŏ)撨n;UMqNGoVnQt. -|LOIqzIz'N=^p#ܱew)ݳ돩3]PC Ҍhh P4Qe@S椄4b&}5nWSKMivEV+D H &$"˶EUnHD3$Z>Bлĸ"ڥHۭNL:1u[5.0a^-ҲRKF40Bmo HsaC^:ihqWhhЈINDi]M2_ [``H670i 䄢Hy_ƣ" fT<rޫݭ xm oB `(n5: ^aK`KjMXBR"n֛ae,nS~TFeRKXL){X=dͽ zMA/(F kAOpyY^DaԬ--Sz@7c#rmkPĉ ǁ{JK{xv|g6kSQP&zf{ ޥUꃮml9.'Lmu[l!69e`K¾.QWwK׋ԍ,Ee!=<4L.LObu ,/C Hcv~kmWX?<`}|6`ɽlU* FW]4,ï,*p#[i< a`4&.) B72VFc ETY|0\]1H1~uX";r ʴsH0_n,^#6\?Јs{` `\ث)WHa]Fc/]5ov*_`J]`L'BaubJu,gGi{ h=+z~^'SI\D~ȵ>i#){F$sYGuKbbI%׺/n@[X ' :3FG奰C^X#&f^c57i(SXX<Pp;7YsmWe%fEܶBMH5s0\#\]s!rFeʍ"٘{`p#r7\L8a|Q;cxyj&e#;5#U :r:SPu'UУh3G=rLOdz[@ dT'fDB;0npE(^tO0aqӥf"垝K-3IvV04 ^9tӇITZT zN WSL.d\bvK1F g[%Q6o _2y厭&Ϫ$7?zY-doe4r:wFӑQ~٢Uze}Y~e>I*+^7tw I` d$b1 ¹xX憓1I1]2Msϣ*M\.Jz,{7Meˊfտȳ\V˪Cg6.,[zowUn[i5R{ 90|ƨZ]+#*be endstream endobj 344 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 345 0 obj <> stream x[Ys~w)!islRfg[Yd,ytt7 AyhV2U#SZ_r?Eg>K+Yu|˫lr|_މs_ëRL2n:Ȇ.~|zp|eht4e37IЍRlZd<+ l5~ &5JZmlW!S(G3qNFd_R7,4J]n+N\pg1lq-XP fS9q}7lx ~[gxC!PyàOSYSiҜYpX h J MV =EjŦ~g։b`:E0><-H) ?1Y&jCgjpG0n;mE ~w蒙F(=WLtED/~_J SBeXTGeFR>3!S !ƵEOmtlq LBʸ0d#{l0R0%VKkͷrx鉴ix®ѩ& Hq`ptI98>{-yQGMɹ:Glx(qmu1Z7T|Ve<|wF<rPzX Ȭ1zwɧgKxDF:vnRa"u֖J2^WAJ]43#Ӭ\H3+̳^Sfu]T֦]=';8`}8U*䲯n](oÿK3[D;i ul"[rhx5S.3`EkαIJ{X6䙐[3䦋.y9즋7N;6t-0H4iOjI *% 7v-F~5# p^ ?327\!~O\x`kr]Mr靆-ɡkJj|^^ҙO7`1iBA䠹ΤV^ `t4T?'q۸x r?h>rhɸ"v{hK+\'SZ|9vВ '!x4q~!5>|I`@M[AL'D(Jdp¯ôҲ[Q.QIz Yǿ&tZK^Xo tJRehmn+, iK^7Df7jY"(>ig '!*%mۀn4 obf}L]7RXp[q[2!ʤ:h\Jud{Бo ވ v#V S.pfwaN6eΙ|v()52;M?fCI 14E ˊ\ |&N|@=s|rY}]޺ٞ^u4Ahur~) ;\a_F5uFFI)zyrLpzGd=_ tgeGޏ{.>qzh_0Ż}=>hiAroJH`^4^aꆟΏNwu<}ɟR =NS=~jɳq#KWM4C XkzS{?cB}ު$QSmuZX\AơA8IIXExKSOͶփHx`EtlBYi]R06 4)CD˸< U`**x.w(r[v@ Ewt;@tUw҅ц2{6Rk]SO=V?gn^Mulf a\jrql層Yurf5*^}ޓwhG^U൝KZ 5TC#^jU) ߵS7eNMN]X?B]}?Ψf5wYX]#,=x@ϷjnWÛ[$ݷ%M_Eߧ 7@>wD=2[}>e h)U-Yx#,zY]F(%ml=ifp{P> endobj 347 0 obj <> endobj 348 0 obj <> stream xr]Uy*KF T6Z{㔲+EQ&mk =PF7OG I,J"fbz|I4;>џ^R^(ODeu]/a|~E==>qjb)pgqJ{6",%4JeBXe2yI1 b1eиBTX-`% _E1QN\ҌEF Y),!@z6ݚ'tM˿C8 # /`ա*2Mvk}>RYCIĔNM=qxr6`6b0حFYl1fA Q8nNm —U8jZHakt8)-I}AQǗYI@ZG}uU1UKym tWyb:(EsE0K"BPm!;+#9Єf縫/^0Lu^5j>4L $%4g0)(cLO,$en:WW,Kx [(-}8MwE$i"9˯β2M8E<s A"s ˠí7 %%Qr6B!6r_j{K뿜e vgR+P@ ͪIN]Ïb`F}\[f¢U#i/Ԕ䖕qX5֕tJyXqEk> 5v*uo񇩉%zdج, _4_¢\ڇ}clD?CYtϳb ?ƅ/Mesj~ě˱ RBB+8IKdu FIHn4ȗΟj/HY0($IeA>K<+ةŏ-G0zf=0)Nbiȉɜ*e4B6Xdlo:F0pSA2"rjH,} ֕ޡ(,r^OhЀ+|q{krRe2IGnTtqJE Z/@r4cܝ'aZ0&5&//ٗfrZlޡqtDYu}yԴkr$@B/pݙwNDLfY__m{teܩ^+f{;B |$tnBv$x&!tvQCLfmb^\f nx0R,_c Fe #ἹefOL9nl¾?LHglЗ :.'Eea:;+|V7GvkJ4Y/Kz!| 鏵~+ȥSW6 KݏUժ'TWkZ&m;jq -VnQ5"ktx42Ġ$ɩkhoNa9VkPXVlu;ɷ&=/ 2\Gͪ[+m5Rlp;>v|iYԷsa2#ٶ4EZ];nXuQK1l\΋#eqyS\*}Sx4wk@+LV h?c K3AA@]1`1g`e*L^[GSBJ࿶{6CtL!: ~–ǒ{Duu}G ԞڎefIߟvQK_Iտ endstream endobj 349 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 350 0 obj <> endobj 351 0 obj [ 352 0 R] endobj 352 0 obj <> endobj 353 0 obj <> endobj 354 0 obj <> endobj 355 0 obj <> stream x\msX(ށs;i]'MGƎ:N%Q/ML$$wHtPG]bJ(W0Lç)x;'<=lQn+VBD杖 FujAkR h"`xq1AKooJDޖ/l6BcSgR+e4nE*f 3܌Q*f^-:WDفa`:Gv%vh(ד?Bb)Ye-w +Qze]pt!;coo(8K0\8A)-%8}.G!ޑڊ! eYy|* mf. [a ~wuWޠ06[O_`D .^o:R1 -3O/e8έ-UH3̍.K.jzgH-R1b [ S/0f#"b&~OQB4װ ~Ћ^/gy\?yBZ}B1R␦H!*܊!Wt_;,x1X {K#(Ql<ѽZ (f EN*cDݛkAi}Zr /JT'wpLIXOցu[arAh]@Bs߶Ѿ; 'J_?'7M?B-.'wmQ哬.]{3,} MoaHS!/~ H5hrHwk_E9sEg-#FA& ējaT&:¼.sH\c8~Wp]ay> P, >~C !1q/f/^gn9zc_=^׳E{{X˫YI]%$i$%mXl0U пT 3u42nR,(9 (bi^ޯ5CG޾__` pNq)" raq,Jzz>W)7GتbkUiQڞQlU}fjS CZ1K Kq{8(6&+LQ!cϖ=^ zgZZĖqr"MlT_}Zs\M採C߼fr!!ek PGܶkw [u'V̼>lJ̱Zُ4#]a~o5[%%?:8L@֣~)XAG+S[ʌ̵[+S`I"⭾[ G[}a`X+3N/7Əҽxr|}GL~Tcڇ  b#,N;eWGJ9̚oe#^G=) X of6[mf~r~zw oL} + nRvK9l[wryBY@[˵{ ۺGB7x:Ԏ#J-hze; x=╣HK!  Ʀ;Fs4PgMi=RQ-t㩚 /:xyfIxd+sކPv2/B{#{[_oG@31]$M6T /H҄7$&nc^\ կL iP_&p[Zo?4#Z-BEA.i|@]םmzV#9 )Є-?_gcDDd8ơNa]aξ^J~Vڅ9abs 42q̴Si;()atL6}3'M?N endstream endobj 356 0 obj <> stream xr]U<:"<70*KĖJ+IJf"es ,.v1w7fO?E ++G9yEyTq8V%*KSgoWufso^J [)^ZT%/*JQ*mEi4!0iR[ӏ4T›E&)pŷi: 2e5w .֡Sc4YmHm|U\]n뛭.jVxy>?/4n˥[ zҪC҂XYVu.AܠqYzFݜ6HgQ Lk)TLplT]5T0h'0fzg;B?5{Ѹ,p*e?9K?1eUS  VMEcNɍENM eyG_.!~,%̨j'iz=S:ZRz2qbX0AAWdAw3J (/hKWNo7 KzWiP 8.UT?XJuΦ Xmv|HQ_@7y"ב6-E1|oo9 ݷ7_/H!>@ A'%4$+#q r+KiȼyŽg0;/7AOzB#1 DiFMfܱ\hkh MȳZ;A39B5KRNG89/ivPVQ}2H{(4_A|8{E|]6(\X=*݇-W݂K۟oބxv 7џ? KF]ѝfcnה}S~7#%JX6[6I/Jc90Ӡ{{,FW  3;H{1y.05aR7Iw{ @=u>/`;Ty[lbK1ek\%<B ny`Ŏ(+EY([cjq Et-Œ- 6.ƠJ>$hrs[Wpj鍏:d- Mw.p֋qP[7Mj k6T&ŤţVr5P5XFUci&p@Ր*`̌pjK5P~Nn8 ijRC!Ԃ2X.^K iՌm _f5jP&'d׌˾,LlY-TmS[jΦ+T/V@V5.)>w%''*<.l^z./Ywe$=~]E)(t'[xEZbưVPQ5$!Rs7bCρO8ǓAB~י M4ѱPMr$<5t4@8 ֌Xfޥ`+)ٸq9uateם%gTm^"| 7S^PW׍EtjXub/.#Hk@u-ۻwmV21mIX_bUXy|L I5{u4Mdj.oé_qMd`5c/.z~ʦNִ6MPk}A|.8Q qjlqHPH _HL/MJH ۚ<[D#-\!ϔZ UU}hUL|H!Dz<\xP =~.w*F&Y}8ҚZ# 8.e Xb}VVlx@B L\!1@A7Z(A )Gj5/Ưw_6ވlD;|̓+u&MK.(9m4Yuց+'% Ɗ߅wa|ոֽp90WBִqb[%tBߍm+!7)]oy[!Ӈz`@] ]ƉTkuI!g5xNYeϾ'QHhqƖs%xRK6q\uqY} y2# $ q'V=fqD#U()kT| =͂ nh8IG*:6+9!Z@{!N0 iy)ojǢa#1Af=5S;4Wuw;U{$92OMn/߶qz endstream endobj 357 0 obj <>/F 4/A<>>> endobj 358 0 obj <> stream x[Ks7Ja3S$M#WV(ɱMƤl}̋3(jk t'IIJ3eeU'??ɖ'_|(%/OO(*I(NaZ`ȁB", Kh/%Vu:iOXVc8"/9NA1Ol>K3<+|7 LҶX5)9~,t6C98<8w3:lbwk/*zPH 5MT7P+S t ȍ?ᶂT.(v㔋 m~DwI~0eP8G0 s~13Lh똎`~4m3 TͅT5D[]y6Y6M:ַf6fQa7`}blKE  nMOôZQon8 Vii'|@UͲg+lDo09nP07'm_f?05n6-rf[Wרľq4p#dd 9U@o-|͇[oí6` nu:܁)NJZYJACXhJF]ds,@h׆;T:£Z`r(4AcY!wrX9P~C-*U#U Ȇb{ ȺT)&҄ݮߓP^x.]*z<?HwuwзJ56*=wkBRtӍb}bXڎvSU.[zzu1_jW@~lfW`N+`=_>إɐdUEOHbSmgh]_p' ]}݃#IPz<JLX6L$T ~C7X4Yu JcLDz'6\-ؕ2]8q[[#,/.NDDgq֩%1PqOGPij4Mq $ۆI1T*_`$hlBmJ%[[MMhP# ǾHX@@$T1 ,#m̀u3d$u_QF(2T{ ?ґ|=c縍&19,;(O$ endstream endobj 359 0 obj <> stream x\_s64F 53is;yhA۽XRD)jnwAHP6 )~hXbo%?,?͓(3Dhv|I9et](OKLʣ[]]gtEtGߏ~}*cFtsy}c&yQIx1K(LG}$yKRc,˺VŰKkIə XB,qTz,Gc8|h|"Go)gZOGBm1c5*ʖ@6komLÂ,'@AI51S ZRi&↘l9G^a} 43N||6.ipdhxN󯚍d7ړy+Q`y~o_2m7k޿Meῌ$;,$UCtANPHwW1*7ҾvGT+I~c(sss݌R1͕P6R0gZP6]F;u&.4Bgdv8 ldt̂No_!DDgg? ƭ֨=ԏ\.;* K 1&)\Fɾɾ\qn(&1O6]p3({ѧVBd%pQLCA5U +4e (P\[p\ 쩰εk lbxCua}˜{ "Xb/}݋M0N22\n4|dˏsXC1_׷2 2n„I;lH^yrǯIr *JJk lXjcO;!DtvX*Peyl5Xa#`L6@xJ$Q86Q=$%4Lq_A䘟Q @jGCM@9$'mL"M5)6)Q8EMIβo . LpH:NLۖpSSb`*!ʵDP}4Ns_1W,VVc] Or!p(`GcLBd,6PK0lO|ßG?u9( ׇ3t(58cO E6HkOy56-I5_C8/^ntv(T$"N|5(RWhZ,GSU#ֳ4󓎂_K֧A&\;W=@Ed*k1 8N\59VBN.m#=Im",*&w'/mfWG8!h>Ϲ+Lzgs W5햢Ju z{Xz̯,Bu1SAXZO Yomu-Ĝp\ӛ1WFHXWNJ\p;EfzxGy%Il3rrKbp2/X*So:C]k:YJjJE!]ٓS5*i`W/pR> O#-F Srq2%X 9bsͽki0S`~@5k4K3ԋ"\g FN.XP~jp!@%=,!sl65|J*KF j[2/27JbPoAJ]睥1Lx=0堌]";PjH< \?.?U5 ἡg={i6662'dSZEx_m FwДSt$©v|8iNV7! 1X< *fod2_ؒ +ٮx'lva˶gЌmbz="%YJny)t`J]? Y|G&2iQ#єjg۪-Uo- <}k}4K7A7IMc4#!A!t+8^ts^v B<9UDRT5:5/"‡/M #"Tj.P6ZЫ&8T<|M Y x Δ>uڃu΃nnhMݔ6QJ֤T$ApC[k#sc0[2p?s{L%3ɒe X9E/ŅU ØL'=L7uo1c7U%Kzjm36ݠяNST$3o tÆ=93&-`  +01J ;} +'gLotK[gV%\W8x\Ga>xk܉q@f$Y=-NΜWKJ)d4#]j'VtvN)`SbzB;)W)3(1M4@]#g)>`b ꬼr#a~AԙI"ē+{-S@ɭ`dW`rDv)8p\)DG7*S·F[ ]1$ V1ъm$A4UY2oU;_ Mk}AKB Zb^]*jL4ebD4D!VKRkH*b-)2نUCjwV YpqkDeZy$[ NBO"z04`fkQ=i׊|aʉt+o.税?O HWMpMӢ,]vp Y\n],Vv!K罶:iFF:yҗ> endobj 361 0 obj <> endobj 362 0 obj <> stream x]s6>JGAn 5Jv HPsf"QĂX,?,v㣘/IG)|<ѯ_E㣗㣿I"Y,8Q[Z*f9.W~7G?';>iCtbR 51Sq Zh \D3i$2',UT⫲JR")i).E嗗I $ɋ8J'^,&F2iIjetwQ1͕Ckw>d~DuHm4D1|\\:ѧ뱂r=_)wv̅0NGŪ%XW6gӳ83ktvӘ' qE-}"V d}1w.'2L仨B@V$S|8+5)($6zzY@&u?6LYXtZ$}4MXL%V`1y>Dzv<닚 ۉLt< %`Ar[d'5|VG~6cРĞEKXid=$MQ3ǔd xTm 90K07g2V;(L8NtLs '/" ʚI:6`o=QID]ܗe$9'!Tm\D W59|.U`+8E5RhTbfG%O0`6. Lp z).;|6!@vr=SMn|)'\ztTdžKU&8. e#Sc-KuiC%&M25\ߊ!iUZe<#Bڸ>\{‡2)0{3 Fcg]MBhJk (x񧇤?*}mT=:!h} @Y ~Í ' ݯUZ/MDӴɠ3"byM+7!++&:x/]./Q%*XTXC$%޼>Z2ߒem؆Dp ܥ6ONA?MAorٴ[>KCrvnnSӵ1l'\_)w_nGG9);5wj[>VU8^UYk(BNXAn H:o=syg"| .̻0ɽ]y ɊY[ϦBO#xzj=Ջ$,}8 P2ɓ|Qihq0^!Ib65W..&19p6(}:4;*Lr`2nZۃ/οU%yD͹]]"~`xz\2leyrq*E$ٲEQʩ=hst˞0zXSP u4@ukW?5V(JHCnGaU)z0 Jz$^⪲kt%*F?!V8ק3$/YW֚΋eRP lu `é)vֽ[/iAv " \,*~ 5` QbʪY^G, 0i !KØ,n+X)\*:37 ,qp$tD5Q[/g=X2J̋;:v; o D@mfB'˭ctY[(q:G'ʥ}y2$׈f;f`gfߺƏ%;\ܼ&)0Ws/o2\3?"Ihzxж4^CN&3g]&ɑW>uVV]9@mi-UR2>s 5`6Rd1`}GEqp_mk/G=mv_h |O9{o+ۡ:}5yo)+ G/M#%Sb {N׹zLeNO,+ZzFT<"lpߨ͘OZ?!0w@V4դXNrZ7YXio#86@/*4Q0 a|A]  O ׵Ror`HXe\]/{2;M`]{HpUm)xIvOx?rp<6<Ĩ8 +}b"9dwր(Y9GǛ) ~P\@L^iP˛ZA{i䰷b$׸:ŌzM&oH$qveϵڒ\jhUVO3lr2*]@hמ kiݲ5|N%ja3v7 v:\2XߺRxF+vX<meU=(-Y]S"+z49`>C/BGcUf#,h1!UA4YQfMapSi>c%q͙%ZPb3{;"JXUq[ǰywcmXWaQT rUb(fHڱ\ȗlv.sԗC> Z3o5tY/\ZYGR R輰r#T*sghAgb4 8ƵDS8MKR?WJ,x['!)_*[%Hr95'_P8r‹O9ܖ`1S9 2=<3/zh`DI4.kef3#|HoJ; Bݯr;MpW<Ž5O_dОvgGx Rvja4p>< V8ieQϬZ[vAUsݟ҈1>\~H Rp9{9htP5[8Ryj\\؜ƀ*==.aEB+gOUtT>s> k#f0>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 364 0 obj <> stream xZ[o9~Dn t/`4%] )˿s$錓H syW 8IE4콾GGO9aV^ U(OF*-9rG/-y_Üs`MA'0筪~Ҭ6 JHF`2bTE%VRGZaڋ bFJ/2}HRBRax1!:W,'7Xjjvv%[Iɨc=pF,mpjw[𸸜MrY*7߮#|}W%acqn+樓){!U]3t`.MUE8FECY-.(zۚPûZ1h'Xۄ}U\ *ҕ`_*wfS >"ʡ?Z?WT 7~Xg|o5vП^_rM~.!%~`%J z w(+j±d/X爯4_Qi#i{Gw7 (qAxQhCwS~?EWl 6. {}VP}V',AoPϰ<=;윶eBC%[z&SkgS`MQz\n36L˂."H쎄wHΞLvZGIȨ Z[qXbd!smSrcB oіrѿp.2Zs2' %fšBZx:vvS*',r%6kY/3.ahvNl ֬sHldIl)9G-AgҭncdIמ̏\9nяJCobU?fVSܑO:a>,Yk;4aN"?aK,ಸ@fҡEMThQlw4X$!?lO'@qK 뻿yп_^Y TrHȟwJ[ !ZâqEU)1naH( w@{SUqyN5ǖ &x,84K3l8aӫg-Vdq5a&cYЇ%4=%g(>[L|#x!F8"yZgk1lRFS:^"vњƾdW8?fU֝g u=n5&pz[^aƮڿ>pٓxћw[X$50?TCFzw *Q5 /phe;֊ʇ,FU!foī/8č!1 KqXL $8|kfվcXԗsتܥqL+&)Av4 } |`&l`ptIv?)(n=)yc>;nO5pc6eNNE2_J^]lv&z(:_|p%U)ss*2Ts*i|<2Ɗ ,2P 3qķ9 G CA",ĕ#ȷ%4iU,vbSlLe\Hh5Lꊺ1&XئMu{j݂`O4m]ѸCАH^a,d6qLf}ݱ?I1Fl&4=rBk(Yp?ko~nb endstream endobj 365 0 obj <>/F 4/A<>>> endobj 366 0 obj <> stream xksgJf,:ܥfl9Nݱۦqi?PIbc4IU:]<3yX =~>z\$i_SdSdyǣ'oE9KU4I&4 }C\ma䊞 ы&?fK[c Tꄾ\r2 1f(l - )y+V$\LӰ˯"%20 ,oAKKőL.y.&J(UL-)O% Ldu3-lzCݗg)-?owP}4Q&\ibjXa5gaHԈ ]h S5Y&WLHD2Y/T¨ _NsV.jI`6~˅'ksɄR0NG2ST/P`;4?^1Sч7e\k,M >"M  TARo_4ͨS.2Fh5cO9c+OWP-`c9ͫ_nqWЩj]ƕ>7Z0iEluVƥVP)hcBvv'AXFnNKz 8?k q,|SjrZ.K]jpܫh eV,M]DNXнPNDR̂i+TMH^x-N6GkD:tJ*`]4qa3MEA%<26VziSoL@7jqF6PaTglCU+tXyљdn 䗢)uwtpyR4Ԇ.XE%v!r%y;v.ٷ hWgf b=) o!p0Ng83mr~>xe rWn9G obۚhU0^{믍.L[U|- rZOHt@;nT]ᱮl/t[hWAأ ]:-륝_/XAYADqeLXM-nJߕU }Nrr59\چ)B ]rC sEqtx=U>.+{WsV~Y|~oMԺ(Ww1Qx!,k\ ;1nMU2ͤ4V[zA-ɥ=2/G#`z/E3~y58,](F!xwbe=9{")C!$ǖ{<ǔTH^tvW\8ʡ}Rx/y鬩?I缥vjW~= &e#::$u}Zlyu;"+49[]n1ó鼎Sޒ\u5bpN1L)ʢ F ˋɂb̫ :d1 OQKj ߿=IS5Z]8c?'mJJuĺB;ȆbtwmC|y* 9+ںFY{̂dSQfkua) 3yH cuY} 0"mWl~}O88 sYw:NoKc7("= YGas[x'mP8ڀ8Y@+|zvtB bCxE"Ӕ'1,,+)f`. ƊN-Pɼ K6j4ְ`LrL1WE,.WWl ݊v{zXyN?-2h (dmxWX։Zg|i56 lb˴ެgz VQQ=A(ӄUcT2UCAk_kݵzysS\ |=/xUU/_3 ޅx޽roFx7[bg;6fpF =v}v9:dDGcn)2вc񍪽=c9r@,Ȱ\38YNaMSX[+ |_? ^y%~p9R ?ˈ +"J^*mQCxrcyG)־w̔ Ch:?.{`H&V:`5.p*Smn?Ynb:觐~ oo^FEg06c@S ZoIu@Z7ZgU!hPM AD+3 T=SQc ۇCTֳ~z&F,vGSz<$ -#`5S9jgjUΙVXrT܇VR|kÑ'%1UOѡ8^g H]RV=+H_рTFEٜ e엝f0ٓ Pٯ`c(V:tKCb趴<6U]Dy֙ endstream endobj 367 0 obj <>/F 4/A<>>> endobj 368 0 obj <>/F 4/A<>>> endobj 369 0 obj <> endobj 370 0 obj [ 371 0 R] endobj 371 0 obj <> endobj 372 0 obj <> endobj 373 0 obj <> endobj 374 0 obj <> stream xSMk0 t ,ž.c,C١RX5i~@!)-k Fg{ϙD@ $AAm ggw Pj($xC6N:bV.*@ۦ0sӍ~KTP.D#= endstream endobj 375 0 obj <> stream xY[o6~7G9"%qo6lk؃"ˎVJ-;w!)ɖe'@]sx$1B%t+VM'H&^L'p,\@W4O2vpo?dllI-ZoO f?O'?L'_ϊE%"5oBG<ݸM`kB˔ ˌe&$O4M[B% R[,cN %MJIv]| T2Է V ODŊ܈#x l\XIu_/J-3lU*Lj _ {?:s?jQ"L]8vݭixJ |miaQc*1FLr Ec0|ReQ/Z`s[m`Usd㑇,6G \ #|]xjg3,%:CҮ(/'R;@ֈ &D#9&Hr\)yW] yPg07ܔ ֦-FW`-zM-m! -fNpWm̖Q%bh\/ʦqVy-jV` \/-m8̓3s;RJX?CX8|b!. KdoԘRCy N' N#,c45~NQ3ǣ6&5D 필W 1y1 bg@m>ړ v{a(DpIL$V~pɨiuQYąYmx9&k̎tIql"ybEJ<6@}t+ׄv{S@}nVT@ҋ_V~/ ]tqc$R - 9\YbNUzH;]YSzo%j'gy(߇2z .`@`t{#Zh{+mwcApJA*>o1I+ϻ!}sw{ Q*[\ Lyw=}v/8v6!몄bc|D]JS1#)ߵ۾PFCzoF噙+sID mXw.lBkMR3޼zmzP\,( TC=:M?;-r \ި6U?ƿbs%뼳z8y*0ܨ| /*TdMy|t=*.!ϔ'fǶ 7=.M$ou"0G`_4=N endstream endobj 376 0 obj <> stream x]o8 >E_>rmqpqح"POKSr]/,7Cj~x\Dq"ZL,<9<qb\p#qefIit>Kfo>?Co;RGtSy }$tQcXUWE pNب$V 0XyLRPw?s:3y 7LB*u67T\s&)Q>oM"!=5]J;u$Q:i@6sEg/0*Q>)Bn~>s9Z ooNc.W;nda 'Ɯ^ЦwNT!/k< Ǻ0qy#wϿ:ߍ7oǑHGW,[(]QHF-l 3rpW ve .:% (.[K02#Cn "@k-n6Un¸ҍѢ}d)ECrɺiHVNN&FW4Ռ:Hꨦ9LqN+XjfQbr2.]¦ndU͇LR&D2sSxyx|7p.I^8PLLꄴ`5oU;H.-LqHUq<ڃó+5ాQ cB}Y!Et/,DwlDt_Ȟá<;:zC)/`H٣c`98WTۊo&n'$kM׼P1č.64Hfe%x&\4yd%XRQS7:/+0& ]q0.fqė㿅,[Jo"y㨢Hu/abY$Tږ|=a` JIDҚP(>ֻqz)lN*+,\%Q[Dq騃*1xDޑ.EƜw>l ߺGp0M.ڝ4u -NsPL}Sd9O'l`>! }Y( /-> stream x\s۸<%>IO6M$Ybɱ.oLA.HK`waIBg' Nӓ"ӓ7'{ c4_Bep+\3r6ɍe_ߟӓӓvLgKD(bY&O٨J4|B2d8>vlB#[*el4?ĖRBRڋZ,bs$vXj]9;)5l۰Œjeݦ2zD('Y峘h!Y U whn/oc-=[&bzК[0AͰ$]QP ttm~p&|@ o_* Z n5\?CMSH۲PrEbu/ #u>XrRN ՜HД&JOqN_@5 z( FZPw'N믅_ZC)YMi 5fiq(Rc'r8[R؆im}f-|Vre6XKCE WnLwK7r-"|O= @hIDo.t $EnjE`u?_Rol ~ly *,֟p p)1$8~@߂D?p6٤\հN{!m@P)vu,͙^KEv@\ai n+wLS h'"@{i݄.` O0>߿~mi+Kwp3YψEn~]!43XZx"i L5.6^^`,qS=4#2^Y,Y{wC@@@`I&Jl{ 3&# P5J|j`FP%K*+p^(16ǃP&(D)5]b7xZSQQz@{u†7*т'eUroAe2>P/{0ѝ]$v A )sFH0R]EpkyOJCvEo7q>8iSD51COATk#dMSO(4IJGI$DO6Wiدީn"toA_y7ы6iKw~oo cPu6G}+ 9*eud)Xy&Sh۩yO*d*LnI=/"ptt%2?gbSc)A,X ]\Q%EA 1bk]j壘*ZɦE0+T 㒊D8 LfdqK~4Q Jţ>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 379 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 380 0 obj <> stream xk1Lpi/i-p(.0k>zc4zMzyGHH:NORIh4HV/&ӓW'x-Ypi“,LJ%3Y.R-?Nd5=TOjzn&U9jfUMy y5vdFl\ x43^Br3e*e9$LsDf d5 .fT!Qs+k d(K{C@)S:j N YF?CѾ1"vxFmdg gyk hv h4_X=ۮyQBίp+Ȋu-A .I9DNtO˂).&%^ŖzZm>nS olvnc3M.:ּi `vӮJ֍%Lh?Հ4uZg-ڮvm^ေЋ PXO=຋J(XbɭtS?LJMsxhZr8Q~ ۦ6VJTY"eD(E/4]^O-MEj|VF7b}$aB*d @o ,8 6q:!x>("s.2ۖSI\SiZ6ѮD|vz=0Ϸ 8R\Z̒ =)J٠ {fa~U۫\)A(놜fGL!*rZ%G8+4mgrbv5cY #%q#NY/;q;/P?aA~tJ`.5An78j5?kW)K_L %;rP͵fA"yMa{L(k/\(9O.?ԛK;w:U c;ZIM{V5ްÍww2ʏ>y$- xg`vL0ʲb4\1}pхe48؝"HÁՏ"50χt.o*m}ꃡlŔs7c76 r7gW![l;v3 U ~.!CH)t1Y1# VEHo5j)9m.}= k)ͪ”3I:bU#S"w?3(e:OҽB5.xBZܡո+E.NTƭt\Jmi%gʌVz[.yߑJO}_K&N4_=[.%rn>0Wj(I8 }gMƏrX[Y=  Ҧz@.S֮r@y<]G6u4i-ĵVfDu)Fr5ViDwzc @8jqhߒ",Ͻ0hִuMUT^:J F`;iȨ]3{>ΓjH zm*㴜IR ?|B=81 [Vhu;'!VQqҎ~G^ |8aknk6Pnjzu |k "\Z_'7Ǒ(2ʼl}KF7plVDͱ!j"j#yNYhӜi L Z^6gIǃ:ӶOqbߚJPFH !bOGq33EkD׫A>c;8{d{Y,bՁBP/˘Hu[Ȯ%)x!{O)6hmuXxxVg [-ߥҚ-#OR"AsT`k;cj N,ռC/փUmd1k@%MeSf}x=뙞pvzGvfm}6H=4 Pedl2m n0~X\LE uē3\xt-B <_7@×2ŎnTJ36̱X֋"btK_QZᔍӟ>0JwiKKl`UksUA/@C4(_s@tk gj`2ژ9 уR2@NtgCjjK!g1@fFEWZKאQG j6LE#"2Ld,J8gJ(bos,<*.$ʱq6l6:z endstream endobj 381 0 obj <> stream xْ6}(0gY4wtkOGQ;XꈮLmL G{B(1&2و hzEDB`2AT)Mf:Payi—E(&҉KnDts㎤Chš+T)ř=&KZR^[˫-Yola.5y<\_dhllyjnU!r{8ʵdUȵYZ`8 DO,w黶v~#gI>.vxq?7 Exlni(›u$Z=Ӂ ؞cIWa'J&1@B  @XIR0' d;@Ćɮ T 놊QAEWHT?z[z!%2q! &ݨkcXhM#S Kf:oFكNn8[#Z0R0nmY"" .pS3T$ DR\9j \%މOOtOޮ-!o*70?O#I,n܋`JfH5)p⧡q[) f%+E\(HoSZY&}|Ǥ_r:]>bXʿ cb95>u(dgXX {,GURD+a9CUǢf[aIoɞ0>>n wbr5L~62ct oA o~@HNғ=%ԞL'N(/{9qCGU6870\?-bWm~Y`mY /ŷxs::uX;y4b=IX|׆8̈.D_DA ?N,J`3T|&I U@JvI*`Xj v;vuaj#Ĝ9 Yb rJhns~ƶvK3s(h a Aܮ]]K$=乊 Lޤ̫͜6H,@uXl&~֯ڤZUJ;x[ x@[F&+= '6G{$G(ZW'΍aKh.tfO-&aB88t$5Zp凯F{{ *:@DR\;aDvwyEELZeB]ɟBybLblA2J> YPv OcSF`, EHiw`a{{ܕ 6Z.7#,W`?+˞I'{,MC\< g"-ted_u^ ]Y4i'p~ظUjP90xaouU^l)u-"e{}u@j :_cUKC49u|xx7# _^b&=ZnjʚG OwPSwj{iLܔ-w([iD 1sw){)v>_Ht[σXxhΖ^)VƔb!Dk<</vͱVPVnIg*t1<+](gXbg&[~rq~z).kExSG'V3??mHϟk?v.RpT54!7"g!<9JRΐd nSY <[T;/pMlxHJh.Lq& YE Pj -Nso ?PE~)p/cx)DHȣ ˆ\吭SaI"vwG5!xtBDVc7h ɭ@&H6 P:v,bǀgm +fxS%Llr,6: r }e:y+dSBoc֙C& F6_*6eYfoh[UGHiKI& b=FS]@\hà,8g OԧEr.A)&R}j޵8BFNmqӴk܇=_Մ)H)a&L˱ t d3 oj6d)vM`],CY#r(@R.u`w%l;S|{`$' ~Awe[zsUðv 5ƣ9TT2cdwk< A6t#೅κ9IE4߶>RSV弄"E{U aĝd1?*bV82zXU8g.T2 bR6)8^EPØ +;vqK*~ Z㙂d'ԆfUpv  ,$^aMNJ 5.݇ Ug_X) O+ʰ"ŃIVl-7Եl\*wN_<FF v[SuF'7Gx&]'NFA)( <7E@O]O gC23 endstream endobj 382 0 obj <>/F 4/Dest[ 97 0 R/XYZ 82 252 0] >> endobj 383 0 obj <> stream x\s7}25oLڛ&͵צV"Y+))L |>=I eY)Ԇe俯ӓOOe\dק'f$~$oEv9~z{zaqzQ֎Q)s焃lD > LiVd &(i~U3A*,WH */0< (v2\%-Xv~a&1aUڴ:]bq#]T\./nf7s٧rN5~=-W0f%-ࣜS>[yJ|bDHA5`^5@t8p58uWWFQrRqG]:詡X2Ec3>#s7z8}BBvfc'0uj 3Id~zdf9)O3RqgX7\[_ 8Ȕ.cAV" e%U@"p>C2*~Z\,1k(L)zM;[J-= 36x6I-S+0q;Olb4.֫RsR Zilsl 3̍ٳ-"JNrN7ȼӏlxqNrF<#Gx?B$| Oo󇄲d5&'3Lyk%گ`&+"Z7yDɞgT?7ol6Y@ LS§QPg7oʥ`PC9fzJE2fI?Igɽ:$[C.c'qbbLҡNSҞ>&BTF11fp(UgFD;xIU)A \MnܿzZʥL#$`6o}1{+w@Zf  ;]>͋i&ȴ@9hf,j#.*{B¬b5/P q:%Ehhm$%3Qo:r9,X!~x(, d"P0t 0I:T)0Jh&|Ksc7_hʫ wr[f jM=IC `"LV0A1 B{|:e&*v~eTzʖMBL";Lў #pn5)"a *_RFp?Rh9Ѿ0~^|*֑ 7g43;(: D9#{A^KPa:2n_ cm6cǝϏozhdULP! e0p-GHvIWo#TLuׅ(M#uZ>)D"4Ga#T+TdGg:r~ad*Eb1E{45V,%ϡfg~zEJ_h'Ea,JOK{:ҶCR5j5$y1~@:GQ!+l'qQj#Dqjn,1j7kj7NсaCQTб9V;\30]>mV6k1ؔhs-d x8MxE7/n~iJ;9 ڶ >qp_HdΞL;r![٠^ZY+ %# a+4YaZ˫!+ .Y<4hjA+Vмr9VfتZU EhZ" TGBƴ8EA1 Ap +H:v}:M$R`TQ شYfVp6fxPe};aٜ(lM6 re&yNEXeki> s,>`alX8e0gP0l믆ie,Dqg_7^_-Xs9BLqP< \G+TOEDžybU%Se2XÕ-ASvn8Q a EnVe\(Ԏwk3rF>%o d'=M,_y|EFJ@p U n׃4d~kSh1I/ \ $|D; ]k Ǫ+ ߬LبRĕ҉RPl)Oeޮ?k'PŘPvb$p7ָbQ4WYsn8@┓wqGlQ׿nUs_xPMվPrUG&ܷjmI=ky~假{#t!y R]ヷXNR4{„?Pr}S89(ySݢ뵞<@i#vi@ ;O+>"|>d8NG/ kF_}'|_ 4щ2{6z=1юoG,FsuI7)$LB&^`EuA&@#6H^v{\ S)ȹuZ endstream endobj 384 0 obj <>/F 4/Dest[ 97 0 R/XYZ 82 252 0] >> endobj 385 0 obj <> stream x[Ks6 {G)Ӱ[ܞڙ}u}nN<:{׎ɿ/@JdRb33HHoIF32N2j,'b:̧_N_p$9Ne\QTT^~ $ɖO/O I"'N'aɷQўsi E=c=U,A eĨZ8 8 ׎Mhd3R:}ly+l/%$8Hg/fbhd9''g;Oxŋ\Iɨe=[X-a5 2Z~NervVVשN早MeuHY\u/XI'W0RL$ˎSW1K 5cF-8) JA1!M(8i9L21ǷE"oWΜcmc;0$ 1!Y}-Ÿ*3n{5HRf_e[tƏK]м3>HK*t_O/8~ BJs+pM +Qz U m9ʴż:nU[_.af QRiV(-%8|3X?ԡ4# SMe)<>AU6n3WN(h#KGι;sH11y)tޓw֎l((Ծ=8T5:bgJC%/QvExYw_`x VPmW)S;(oQ{O!a}|Oջi5O?{mr|ke2t:,xO V4`D åm©m  Tl9æYe!T2!QVȍ":R/y9\Ek@ym%={.~ W\ I|.XW؁]αܦy^s+ k^8ߝyZK*7t;7V*}=6p=G[ZE?_'79vw`h8jێWh8/Ҫ;4feoL۰6r̰mn.63[!6Üj㚁zEcc(-"`=RHbLPwfDHbvS8؂a+<;mR^9(S5<_N/ L lQz^!.d؎L L8f;p8}sZAQI69;/s\#~Y_\)WW$۩voVG6ʣiu]"]c} zF~Ž *fX+6ێ9oBAВEG v> stream x[s }=-^riw9up,ӱ;Hr: `L153)\`,-,)sBY̜d_?Lj9?2rʴ6g{k>`Lۻ,7[{ϣ=ӥ"Uѵȕ=)W7L -̸`IYcBrk豛 %6e-Ӛ\&{ 4@0%[[ձiY܎WZ/Nk11lq3<M(lhSu%v1Q^|n.n.1{_ld0HZl;F@nqHX.k9?%LHiFynΫ n 05@:xsUtIH\^RԶ%.!{V$\D/bKtddGY W֝U!кF/*0Gڻf*Pz8%4T  G>dJDϺxx`9 [L[q\aysOQEL!R.n=& p  )w9,<:d,M Wyv' nʑzF.ћ< Dd, VMak1Kl.1- #_J"sh:Ӑx21vJZHYe/+>mnfns^0-)aզ{nJ?f)]ZFIܡRo~5C췕bB4nvYjKX`й2V/)Ahd{tdlFD,'jխ xlS.B>$B}X71rqGSg* :""~>l=jMW݌"nn]d~FsƝ7IhTwj?!`~{U[ azBѓUv 1{ B\/C8'|?Ym$tSMܳ* 5޷B|Z^Ő&%Era% }LVEFkgw.ga .PI4R͛*@Q4󼣤xgh*;/:!D5䫃.U*sO7qU? :pI=ҩ|f\xE[Tj:"s"\_Ȩf%g-I^b( a 19XӬtpP@Ij.D՛ -ߍ05#@ P3a9* ,Q^N>I=\Sѻ[.Mla˜44=nkSo<ɉ}rޠtg+#T]T.+Iȗ{:0ޠiS]yr:nك z±p4D,4"֙νPj;ʼi ?0<ŜDZ"_'h#xU WzbEi,"r4p= rC4xd"xDiVeY!Kr!??F/嗾 0ƀC2tcO1Pfc_~]CR3tnu$h9\c93l~߭jzAn5ޭkoU\q^Ê׊ReqjA8t[kJ`hiT xﮬjꞇduzĎt¦zڰ wH?=Ѝ8I9V1Kx^d(AQDhtv'H SJ-#:`vP<; _&XiW4#T.^TLٗV*W_ *H.mʗ#2@j9?Cjڦ?Ci" endstream endobj 387 0 obj <>/F 4/Dest[ 101 0 R/XYZ 82 652 0] >> endobj 388 0 obj <>/F 4/Dest[ 101 0 R/XYZ 82 652 0] >> endobj 389 0 obj <> stream x\Ks7Jan&]+ dOxJ%~j(+S2)~̋3(u)hth`$%eU[VlV'xYOO~8?=돬8:=+ ZI(|$_)gq>bӓ7ӓ=̣-,{j8pЍR؀iB -KLaeDIwJr0pVC0C% / E3QNgR,u`ۛ/Z/NJ,0>ZJi[/6[rnojsL7wsZή\njMjy%6=#XSwЌ{G ҠH'kȷ{_~\һXlv~ffוjEӵg7g5ɹ́_+ L\IDM4(ʏÖ.+/]]" 7=Wy. z*^_l_т*Jj߻p,ξln0A 7Gx_17\M?3(,%,*வT2XaKKͨo w)"[kk͡C0k:|>A Xkj

VXV8g/izȘCJET*NQ=fԡDTs(L`qQ6 yV[ZxWlq4Nk}`ijkdLt);2k [b_C'YZY'uZ-X~|{!);S3@ZSQ|*H:(6`,$%a~{{ : SBλjeS`4JƩh~>*pQ)\qGEyV@rTxzڇ2UO+Y|{|!)>;7T<'jڣIQ IfE_l(g$p_ DP- (MD^(|Zd,q!qvLSMnKm^!+Q8O+HoOPC<$Bu'qJE ՘tb\0`4,rbh>lbPV< WRM6yFlzv,DUqEc.SzȈ24|+qbNl ;-eCR{UFӐUq15ۃ]gMhz86]؇mEA1)QqQn~lsCxl/'8uY3>É޺X{,} W( _`̝78ڧ߲ 3٦<:p Ye)!SC2k˓aEF#~o E@O&w?mJk`WeG6pg=~)Qʑp`΁F9֭lkn;7܉ϫ.[,,\.,7׈\/4q>JyS|Llj+"hlؙ;d -&WY|Ys,V&ӁۨOpt. (^`9m[q)]|,CڡjQ-繻]>톞PwN[Bf=e>x}t5҃jzD3y0M_H[>`BuWtU^,3;b.];z~)֝tA:-"1/.BMH+eŘA=E]U9gF夊<\OPJ'')DdWᰈD$EcA~X'^]_b^?7~}Å$Z?. CJ ,.-arc! j?t4]Obsqva_/CO~rZՋvQ,UU[֑XNoF-zLMx)PCge M@fŬz+lB]ŒlZ櫲u(󬳻5$ZnE$b t c(`EY, @u |(ICG#E, 7z# Dub(=Q 3UQ{(̬Lb[TU]@{&YM5MVS 6s; vH{#c4V#:bv+W};- ,TP{īvڅg|}/:驅wQN,x0D?AbZyT!r{DfvŦ3Gs|FM&h/#4 endstream endobj 390 0 obj <>/F 4/Dest[ 103 0 R/XYZ 82 600 0] >> endobj 391 0 obj <>/F 4/Dest[ 103 0 R/XYZ 82 600 0] >> endobj 392 0 obj <> stream x[s6>J%MM'MS}hA7H?D(Jj=c.b?~^_$KYg ڲlEXF)Ev_HB#-$Q&}׿~cf?[I6_v뫗0W_{L7KќS) و\Lif2#(#J> S+dB8]lח|N_DQ;1&y[V鄠u[I4ܦNnTNb $5.)uKlj+%VT^[Vunn.n}>R.wէ/yzj[7鍝,@nǸ$mKs991Y8v!_a6W|,kՏl)eU6T{*9 D4ikUrF8O7v5۠3II&\DRmOE4CQkg,*Y^TYJ*_kB͉0 48$Zs0Kߑ1lh4)ê%v"c[1BCϝݝ7 |pdjMLsF} 2rqQ\B0bR:y@jݔ2L 7vbd06Rdx?B_a9~|9T(pQ>ITnL!>e~E)woВ#uB@9$B Q~] U1Y~¶LjAMN>m$UOE*>r`J43}t到X]@BS+7BnUijWQR0>La.?JUX˄ \VZ˛RⲼ *WvA,5)mћ,NcI!+4wrv@e A#g, )bH`;^.>ug܌$66=Vϋe_U65ޑAZ!6hB 6 q@m%թq. X^WbQݞ1.j]b6[#5{\8֍oga4`Dd% XZaP.AOC >yR Vik K&c+: MeF5 avtr{bsηsz.PV G[`/ +Xg9O mLoYg. a%{4oƌЇ#_(r@!¼xv#nA@ȜђjT h|),@tdhɱ΍# [Abb@twoG޾__-s]?s?IQ<8xDs'XmTSdve=ޖ%y0SzP_Xz1a5QO/|}!S3 b:8x4WBzLۋ$Or#d" Ÿ) Y@<xP$HQ9tgϧ t U:#BZq!=8vLC9z1҈ =!OX'_Jb kTWc,i@=x^Uy]H]%w*p:p&܊OI< |WsGNeLwzUXkڡ83XʅsW~ ߼7[(PowƳpԧ;}ƃ &qჍ.0(L[Yz!.2e[~S -~C]۟0n>`PbyLOR%G<5OT{|C(1K(s? endstream endobj 393 0 obj <> stream xYKs6kFGHOmI餎Y[J(۝,dSpAw}u<*hqR qTxG?G߽1ZHrv91+#VQTT[rv|>[r5ɕ_ƣǣ#Xxut4+"YXAFUa4 PPF*(JT+?\\{6HזcTd wZ,'gL鎧,55r;Q qR2X;WK8E [˧M-?2N&*̾T%>*OYIg%0Mf09Yq~*樓1u{̭ޝJ`JxQjNAZm`` PXHz$iܪLZ- kt˦?x~(2ZtDA<&+,d?[G0ҀǡN2Z_S[[d;Av4OnΎٜZm(=68HRIs"ac%JIX}JBʴGm\5Z9u Kzhlzݻ%k8Ts,v>~. ఱJCnb Z8 &ԑ uyM r U8_ yqmъIp0γb3`_HtuevvI>f?t&p3Ӝ,rj_)$Y7ة +b5>-P7\mR 7z p—r@6)\ -v! vKZ Ĥ* =iEkRuLpԏ\؊*O*S2pU~r4y)'cu61IY6xm z GxbhpzcEb kVyj^_Us#l+h+~O}#C8+yGu$]4v]%=-ͭ/x3u9y9oB`)A6M% }=]ൖ7a4%,c`c~h DrLTrer|0prW9p d:0Aa5a}A(# a-d05<O`bM,Y\a3;,b L- NtओX0 1' :\j/*|82ă%Yđ3H2ÅԹup*ec2$DUr[0Xy*ܾ'hi9i.bYX#fOŰi|},:_$'2\SU4s|H 4"A*}q9! a)L(I]8%$Q&Z(U0>#33aO endstream endobj 394 0 obj <> stream x]o8=@{ O{O^En?]DnrHvfHQ-vd:@mYq=C*OO Z?8)Oc9YT'|Cf'^5'B 0R*\wJi sO}wzaDƿOO^?|މy( f`hi$# BqC1$0NrM Hk&4)`k>J|_ Đ;WJN..?p0RSӏ#.֣QzرX,aUMSZ[ތh6Y4|6~h1>vGQ#w8R! &9\:,=x,2F|/S24AZaʌPa*Nջw֬|%H2CLh"7f|2) %thCbo֩آ %GwoUnu=Ҭ-ۚ8(BiiK+ E@鼦eQ%{ ZSs|d--ub8ØE1\@WqO+;܌b091w{Atn\rxx^QS揎{\ƂJ L 0\Ct4h#(h26-eʶZnR>c35v\q5S6ภycmP@gd{ǩ\36Ȧ{Ld XR8\, ?R`g$Pfu{ eq3Zsꍛx"n`Vk5U!QyMwtpVa!uA_],\`uWï+Tf7݅%U⁈M<6& yw*U3 u8QeG698 E(T\KqιQ&rH}=zEw=kz<¦揎{ME1գZ!xކ,r]o;@w<ȺTyB[aTɋ#XIƖTۛA0*|Oڸo@+]{Ls(Mn8^٠gP`A&gcpf$EQ+*ݺmg9w x턽 =wY3:[ R0L2\v!8&ɶ;~aϕlj1he?_{_sc'6[I8Dam0)cMVܩ|DDT6эȦG%ն>EO9ԧS7OJ U]^w\R]'w,( ey_7IKh2-1IM/Ox%8]4OH&:%xsGRfv3I6L:jQ5ɒ? ?^7㉒?#Ϋ,$V`:QSEti֮Ͳ'w)2kaPmoaۢ} a"7 &6wq&kp;#ex:z<ΟPI#4<͖&=4 g;s >/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 396 0 obj <> stream x[7?[U йK^($ ky k4b}lC&#IfU;50=_feUQ??Ǐo?z{Ju=G:C?MvGG_򕣯x?s_ѯl(Qf8,(;uC?UŠN|mJw|?6 *=.23d",U}^ .RaL*L~J5wߞfR؎ݴۭZ93YݖnR崡<~<~p8ߍ=ӻofy.:gk.vӴbAڊP3 gs_ܙg{!|NOHXMIj~?qxff? 诌&_V-ILߍFR~ Ty{(o~9/{_?Yw7rZ joOh:+uia8F0 q(ˑ/ Kگ~;5wVͤoSd=q˓#'?'VO 5bXjM_ϕ[h޼ZdQOq(Nr^a^= |7'A}^q a2,Nǿؒ:mlB 08EzUVV~F*="u,ZBc*}VvY%+y IGi]8x Bϫ; GfC†= >zE'AUΨΝ}NG/0od>Y(Cifěx&Wޤ"uAƘG>NM:I A27~d8<62jB-=aC8  6fl?/}Mk?|8Wx lF'f؄uz͛()xSROuV\R:(!a-sj1NNcƂ`u< ,zO>c\:R 8</c7jH~eO֤4(jz^ 9|76^u4 8Mx qrj" " '`u% 6YxyK=?#3Jb. !o3K r| Y dim|G`ΟE2/Nu^+ tn>!)6\Z d𑶏il0Ћ;+e# UPT8(zzMz\@!9\: S)}VL2=}}x.M.GO{\m z "HG4v?~IvG𑹱ކlVt# UPTS5k'KP+p[>Xǣg8FKϛ#uv\~b.`GaQgy}3"{6d_|rq5K[@tPZ\8z)58LSC%݇~|@$u $*ID&빵 YM6\xgkHba$u۸Hl`yT+?Hh6q0MxLx(Wˆ"uQ4D*dŚ )R"*Dps$C2Ec9v:d4wjkH$rmʐѨ½8 "VןE҃ FS|jn_Wo/L&ܽ-G#ya# UQT8('#<ΠgX#5yֈAdݠAK!B!& MP&*M0$#QkWK$z#Ќq,m # UQT8),C(i0*[CH#ȘD_K\Y;6.! \B2>ƆKg^ekfyTux2G?~up:NI>f)kxA'WB"uA/JՋI/Juj=P3G 9m)mCu,v SQjSqG?۫7J:f9+so4IEpoZ K{ip dA=$ ?.xS8XD2+Jb. K~(dkO֟ TAH>2}bGd ?A R崕ARfPdmDiŧ:ĠBX*1h#J`XK vsg|e!tz:AٰfdIm66 Z=pY8 Y⡅B"6D_8?qV e!$ 6f(aPY(BYWBf!4\` Ճ 8\*]9D,e,fݙ& յ'O* $l>1hg!BA\B!HPQdBB4j*ײP,niC@# @ 1 $c޻G@cu2 GODNV QhZs(Ak)r)@ʂzJ] Ǡ0\=OƊ҆CݏA a /PD#Z'ME2++l, CQ„\!*P*P`QY4E4!$I_%̑HbQB "!$c1dՃ5 ݾx' ejm 4 YʚCQ\!*P*P[}CW7dI7d^l7?ss77@qX1TcL俭Sk(ҮPT}t @Q#p$I8f]σ(aBQB¡((N."{B"{,J=*ә\d<Ѝ HzdnQ1&=.AYMd6ýt `ȉǐ(H1۳(aH Q)LT (έj4JS _u{LjHTH؟P?)@"( sNE۴(aiڦQ)MK6-\*ʂ<\$2Ffv,k20vhD"(Hd4KKmz $ldho 'Mx?:dNl?Ad[8D: `ʥPUPq!3u ϟi ,d?2#+J#b?Hg:>Yuz2Z'<9Y#DyСD: `ʥP#P!Fh wdXCh4a,,;2ڑm)DֱvÎyu ƀ FqG?ȞɬЎL:fU8%LuPR8R0eAGIqdDd< hday{C٬. " \B2CC0^Tם'q2ڇW6͋0!$eDDT GT F8,nɒnɌ- 2գQ'F OΡ^vz0E rNELEqn eA=% LEֱ4nz4Fa4!mHqzlXI9-L3"6DD_hX$ID&I'Q0)~&>IppDp8JP8ՙTL̤Yov}MSi$5b4$CS85l;L"Z -&bp8/祢Kk)r)hriv&&YCLu<꽑4<NB?+J?b662AKI].ih'4 RksI脰$eSeR a$ @ZʂzZJ$Q4LEQ$rt#Qt\IB*B|B A@ݏ# p R\lרܭBpLz!;]N t[[5< xwAH=1y6!;\).gjg?/}OkGf#e{% rD *JA-s (Uv3d<͎1$sbp#92:Q-v 2 G ?T8FqrQtsvUv9o3,^ /]X??ngz*(5?So=^z)$fw> stream x\o7bo߻[w5ù,;)Β#俿%)\ҢR  G*_// RKYVd ڲlϛluyˋ2JI! |EF3# SZHLv|?a kf _^6fVxyuPg\\f35pЍBQ m@ 4a&3،2M)rl\!1,fZ\q{I.EL.aⷙ-K'X(嶼ŕ℠s-h -?r=W&˯l4lܶlsZbELu b1.4Ě@dB!UxCPNBtb G{"kV6;HqAV Q+Ÿe]ԃH$x_40?et&4=у:GĴo(ד^?@nwm!XE +cxNb,rCQ:8| b ߂+ 垆hOFi0HΈ`Zs(G!ޑ%-f)<>Af. Q(h#y\;tioH?Wb)=' _o9eҎjQ(Tt<8{T2 1Z`ȜRW?c\{Y:2Џ;SNlXr1TwA5m ? U4-ZNGSk/G`#!X}rk`i&@űNV6g0Sx{0";K,+6PW:+-?&$΂Y+},vE>v:iBuƋUgz`(>:zEQ'Z_! -C^m1j+:OVekCk<2_%.V /{9$ajSǶ<8.GZ8$;\+ v.T0f#:Lla@I[w>0n0Na3E]1ԞJ} mxkB=Cbtr1H) JKiZ"]^ҷheJGG+]BEA 㱍&OD@=iEAϩg>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 399 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 400 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 401 0 obj <> stream xZo67Rp7ٽh6q4CvRHɒ,Jd TuGxtR9IA4JK*@/~AJ-p8=8cb4V B>v(ӱj.Jqk_p. Q4LFriJ^7٧r:q נ-, e'OHP̕9*E bdh; `nZ7$|ϓ\f@W9+UnLѓZy,ᡫ23^yXޢzWK4vmg&,+h ʼ?or&w r۾=PAW{oDS-A.i*%$+Ra+5pCiÂpO;j%`5Oc{ F`*y,ޢ` beѕ;5)\O%uoV],z/놾ks%6=#=SucPٗ }^܅9ɿxX{ r@j֗ԫkXmqnNg/d`뜙Z/CR;3 \72Ab ,8U& ʡA:vP"L'#QG)z,ϠˀrLt3 @hX^; udyߏfՔ Z;b>py-~H3\#/yBFiKEWzϮ .FW2Ȅzas jZ0"{D z񸠱H$Q@btLd xoH@W(tjB_* I#م*a)S@^=yyUAG&wKrKŐ8ZX?JEзW9փMKB\nf,:1k6g3>)#:.A¡w*ĩ"݀ 1cM1W"J݇-%ʙR { Z}RbmBUB:V2Djm£RKlFf:s!5.>Dw򴪑t>T+"x+ [e%XGe"  `jVn4oja >5=I㭬zڃ":ׂB&\܃yHSvV-ǔ^H%wm]tj. ~8t[CE#:<)aֳ]eGxɑ% Up;uec->ћ_\8%^kz!b$?GI/+'@TTEd0V0AӗNLPk}_tE?OFQU%DQL4B#,p:Yڍ2Z)"`L}'m ]d endstream endobj 402 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 403 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 404 0 obj <> stream x]]D}iE-@.|h& $Y w]Uv{2H0>quꊯ柅)봌ݻۛ=|vw{/ǎ~/7Lㆎu$d}^joOۛ/vegfX?\k`;BSϺI8w藎c|H jTƕMBX`6| 6(8^^/fLt:sl(VDPT-fхutB~apr]vU^޾w/??/bsNdKHE5:ÍEU3̆rՖlo}D,Wcty+_߾z`~{s锏3ު|3  ZF?~VϒRѨ/2'3@.Cx@\'9x͏m}_OB\? uB>T#)t]1_Bv\7u}e>´,acd/f!ɟ&24ѫdֶ~V;u2q`:C/ypeS dCs82-.'<5go Gu[) -IR{8dF6'h0RŘKcc]Hc}@r `t1'b3L*0*ѮVʤW7zSSMݦ/x`\Vq7ji E;:׷u97gui:E܂tܥ#ݥ%Rf FYrYZLwsqYy1SnPs}ͣ^T?nnș g!:4fǀ"Rٞ#@WP2ױ;M b"  y*EDAu5*l__K ^?\}:'cCӴ6be_l/Ӷ 2luv-z+TWZw%<J`{[z%piSÄ-I5xGBzBg$ ׭xwH`# Hh3cFfl H8z ZӼۢBtڣQ&->(@!sszj܅ 7sVԟ$OBL6e Z7b/&|E$h3@NseQM@T=EISI] ggsNgR'gO]mIG t .k >Lecn21KσPdgIKeKQ\˗b}qd>Rz[Qfp4%uSߡq|w5α+l9MYӜl79( '+ l8IVOr10@A-"{ Cbz*U >|>~a˙w'bӖ.<&? %{Gy: zG}ڊǎߘ%JN~Sl3$;lA͇&)HcGz胉;lӶRqJ&qh3a5hm L&ݱZ-2}BxnM,KhفËAs7$ҏ`Ŋ ~j[4N6x:ڇ `>^Rd U)>}7۰I J~}J&}M{ő_MuicҙuW(aJMSE*0exJ7!)a@=*a(J c\W c w!BF #b!laB' GU* ]ċH2C d q  #N+6a@o%Y/d6l^(^HCH'jH&8퀸ej!DKZL1 ˏEG:&[}G=kc˙w;>/j7xz] jx @w}4<>97phbʐ l1a b;H` 4H tkxp] ɦ^Q`0J[%`rvڱ8ϖ,m"}B n$9CRN28GX2(g5PY#dKo nNbϓ듟퍠hM >E+~~{7 Dv̤1m|qsލG,H{YɗbC7B+5w=Pnځm$k{ i@&H(NQ-9uejmG ~z,4$*}IB*<9=3;pD|ke)QGO ,C q[z`֐a-9'iԷ6: z Qs,_S %#oy2Z# nl81g _S9Apg#\e!8mp'F6ŷ/.-dU$\YD[Ȫ)ˌ@?2:9ͫml(|;9`x(>D&~Z _Aw߆+4)|%Fq = L.KS wU_X3" \B}61:梓FI eJ+{-;ZFQLrS FKi'*827W(cb^4Pr^+6KCe6L'T&i26'pGپH+;0g5s3Eh&MCcN)^ Gh/ LhޙP=ף9n#93.aWOy;j] 3㠮v Uz`ױpۏqԏmn%Ʀݨ*X`8ֶqnX@޹J+3צn׭#/l95v01YY8l"HXi eɬbQF"E P' K#Y; [μQ5P  @t6iyC}{eBBN` :IMae[R !Ǐ@d.&-U3hw5`*oPA^(( 'G 7GV$0:YK2t )KVa7[E4 C¿bªjI9"BPϢWٺ7ia\&:RGۤś`V"EۀQ͵j?%3h_?ܼq Ļ[7 9'BU/M0CZLH\K5mcX-l 88|aK U/`!pæQ:n8Yf.%aE7e2> stream x\o.@}$h{iд(jGmmDžȌ+&eRr=Ab&s;.$%)+BkY]X}su~?RR3 teAZ _UBUW,ޛO}EWqٷ0OY֖R)ZrYKA6"K"dIX]Ԃ2y 2d\!Y%!L"GTq}I.aEQMS*i͊4ucH;oe'%ԱY\,!%hW.c6Z-bamT/nVnBRMI^S#>WKiybZ%̘Ғ::CdvD>GKEX4O/9˙&X;-&f)<|lwwzq}*n6ϫZn7݌2SE#Ե2ς6$8 UD0@FIDI*ָOY*]xI81&+`d N@\+ul#b-ofI2D[$r%+"cWbF`\=ƍvܣL3TZ׏&rXݘ93GDdE80l0d; INE7jve49( r 5)g˚>d e0ٗЈv89Tq+ۛ29nvmLъ(/ŎaՇ ,q,hRdy@(WQLÃ&'G4u4)B$3fhy2;l1(p!-$f8|.UFBujC*Se~ a|%A,ZNܣ,'xewǞݏ0-h0TƼd3cw# ԵDagIRk&꤉[B$i)DSCDQ@e$FJ$YX] y?r'gY=*˃+c>V#҅8 NΎ'`N%I$;x,%ƭ%J[ <٘aՆ%Iia/[FiY<-ݦGźƶFmNzҖŲ!ՒPjspr PHأ{+nf;=,F=skZ3fce@5n̎a8Cp'ύ;n8'{oq>7__swjq]J  JbeZAB&i^x䓳/XU n[GbcIvFH0ul w-218@1"AN) pw-n"Sm֐<'q =ǵ$b I*~r' `7cfS sfIwqۗv7dfҜ7euys ȸNU)W&OyjF {SosjCYuNIsu9DM'MY|/;kx%jT\$Q[R-fuF2(37KPW-UqEOfCWdCJDQ"\-CJ9 T$V 9Cb#fF"MSiy*U#~*MLFjt`?b6|qeR@S_&E g,%Ra{{(_7 p1+`)6"I9636lbܬ G۰s㎿ۺX9>aUf}n8A9GK935'ќDd!1ڱ$6s;O*PyvDv<&izJcur8OYSlurJsɢOpfCZs;e8x8&ƍ7-,&b""fqƑLPpe~}윻bffg<(aT?֝kݹI/0mne+ ӯĖSǖ8`;)- Ė#8 gIaN=\ʚ{߀]o+}GÌE*|h*T>sGJUj,;*~9c\a:SԆ҇>n䡏(sP%}ZSqс_ww |;1RD0N [sN6=g6 5Ʊvwk?uhh K;:q>%(,iS/|Mtl8V\:^_HY7H=inUX#ߪ E9aTiϕ1rrbǩØ\?>o endstream endobj 406 0 obj <> stream xko6{<f۞P a}Hk`M\=~HgNl.Zc"ŗH㣂s"Y|]}vv|W"*;{}|x4*͌?ބ|G/aħGGIGӈex!uLoLV2Y]02ϸ`F^TDK& Ybc>4奥b _TG1qNNdgHjaeJ$W6S3{q4-5W0Z>ܬoԬ6rutd3 =+y}\5 p`Y t :N4qkYmʑ.{"?+Vױ(R`dhQ VɄuaՃ PdWx3/Q-L%Ru.O«nh|GOKwUeO'`&LQj10^ ax j\t-Ky [H&aD⥚8PZZ }뽻/FC)j  xTqbm3W`D*ȨRyPn p} !a l^†XqlYxq{,W'̹\X%:~Fuq}7 G?m wB &j%hVQBvL{I$ 緗-ޮD 6wG,%d>X#g+ǨA9ӎF șv4OaЩ`X"a~+~g9_8lFy+XV;k8g 3Lj[FGܲJ'5).hGɭ,ӗiL Jȉb0 q/I8=Y8'a_E_ sY1ٱ) :c J;6IbXj@aVdlth1'XhYw:AuTVʊ(.. L:N~ԩ9`7eU,;C8%NsVIhRܐӽ*%\VPNU]eR?9tӚcȤYJ9 rYs8gCN.Y(y:*hMxX&UkQۛv#T dt@iE(,/u}!D1k1<0c0ubQ4)Ucy*!ƼM[sσ8Og{_e:j#:7X]O("\^CDڰLq7~Sra^[ zsE^4m$/BuQ!M oƋt?#EPHBc_M,zy^Tt \΃E:? +d*bB_a,T_,O}.!+{SDŽ:. ^Cj\GXGRC:C2^Ira*YDN]nt N{qjꛐb<a^#(Q: 9=Q3P7jFwVa 6Pl*AG2'(pbmVE*Bi MW*ǦM x8z[=ބg7UЃM \7ҽ ktF^`%qƐvMw ҄X-LzcS=`X5U0~:4K*kX<"&|Psm`~vy}?dbb<'.!-'h?PR+!|uPߟ<- 2 endstream endobj 407 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 408 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 650 0] >> endobj 409 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 410 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 329 0] >> endobj 411 0 obj <> stream x\o67A+fo1kACI$M38Wv *lg83OU㢨 WDq:?E>?/D9Tq]U֌-43uq .{/W|S\9Qց2P^I]߼'+&A6+Wxq Rha/Z1WpLJO& Y$sָOlhBhҎ;kDF0 Ql>@ֻzyvh3ˆDr K,>5AJ7+XzR-^/ pԀ% (1B9j(O 1KOW慯\|f4=&A)TFq=7?ooKSD%!$ nJ߯K&㙳'CFKgd?YMWi( 44[$?LM-z"iOӘ+̲+8"Ιt岕x[ PmWv+8

kbŸxo,9%-*b'b瞏s3:߬I/t$m?]]c#(tyGZ{=ǝ+X< 9ㅆbuO -}3b}~`|!XӓG^Hr_mAؘMνiLjjlUq"N9 X~_WXĂFV3hP&Z5ԭ:F)/WX.5_9'PTl.?l .2nT:ekV9:83c)Ae450 xxÿ1yôϏw;e|ʝbB,FHv@ \}7Pwk*Avtkfo&OiΌ<f|bo(xD(xf\[h(pы҅juF *':2ˊiS| SGF1<]ko55? uIzT'꣥Cgk&Dlj꘭܃0UKfW4h=Ar(eQ%윺#vb/-OIu&(x xΆRS mc~E`:/ |$s#x8 teIPc@$DyQ*?#:`sR)PX J,V ӜR%r2W`*Yu@VqH U{j~;Y*QWq*+R%Xm){Bb-4*/̑*is) TYfVz͟< endstream endobj 412 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 413 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 414 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 415 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 416 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 417 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 418 0 obj <> stream x\o 7aw:֤O59w]Nv^|PkjRERI||T\dEfiKny/D9+Tvvu|āx4U]p;xg*O?YeoG፯>dNԙ;}$tainA -,.shfTx2i* ;"s#*Z_Z*3tP^_Q;;]Y=~avhVzj;8+:BFfwfSY^m?fS:H7IyJEI1NJ}5 歬p`Y \\:v[{#W١ \ bFV|j4[[=G bvWAvv+vܨ?^WL0GjUe ֞#fRMDwƅ2yse_0.!`IxrQiw3j%4WJh)m[ }S__1&.Qꉶ~1 YΈh` rk1!v/ka1Q.٢\\߾{):jux n}Z\lr/]tCA±{+Qι^G_r.W&ԯcw|~ tyz*L)#/e rsoc7Ta,`Ixp{ΉO5To\1lDl!O/TieD'F?0,g@T<#"L4:*)7yF˲SEf2]i%3I3\?tJӴGRͫG.;˙I{ѲK0xYt]i\?}]n 6TR*TB+`vyD ]#{Wi@뽳ue}aG}I8V c5>GY7 y*؂ gep"-w y\/2!7AE GJan}6cKlI RfJҞ4dwX[LШXmgDJlR+8.\30mu77mm5~qԼ e-GE~!7]pHy.9^K 4ed5uȧ!~&,x MϼoݧW lSbU. 67/?`" /{+(Kxn.qftп*R*K&piAd,O~%kxy`H&-ht' W6Ġ&| Ԥyړ@M&-\W$C^񯦎lw&U J@ vz5 ]h,x65a]d j"zDUm}OSyM=XU~I6b(ഺyMRd-TS>nڝplw)v|J1k7os/%=dgHma(M?  b9)ׇ"KZ>N"B ޛI /ځJ5T-,5ʹr̈nJyHy,>E[\wBwFu :nD϶7xqټ-dׇP>&=aӃ(}>!T!\4&9Eг6! K\o`)efX`>&z9A~E ˓84~]' Jr3'# v(6έNq縶(ɫ:enfVeLx\Fp/i5ЗY0xd"~SsJlL!l=vxH=C{bETLa>"Dg6B%h* %qݳMTor.C/EnMb1 .;'!w~(K!0!a<#n-rG:oa Ȓ݊n{OVO7OO7bC ms1~hZz1~ °g!qw]E{Kbb5T]ec4rG8UG&M3 HPqc*9^zའL_ `nŴ;D k g 2UMw[0&1-TZ<,5 :')I/|rlst!ݟ'/%!d8Lî~BO4Շm]kx@>=: -!LYG }QoҐ1 l L# ;!M9YQ2>fi29`N1oajo'QF endstream endobj 419 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 420 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 421 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 650 0] >> endobj 422 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 650 0] >> endobj 423 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 650 0] >> endobj 424 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 650 0] >> endobj 425 0 obj <> stream xrɑwDzuӥ3qxwzޱ/8 QHJ)ЕL1VQ#!uUÿAUjnЫ/_zTU廗/+J:Tmq?ԯ]0>?oV.w(@UjӬcfue[ju\4ԪkJVJmn *ziAYIsLUWcle KAdgRzuyӶgg Z g5%-v>wqoyp<~ض[^dz$}F `KvfӴ똕SwՀ]Je:p;?&n/{e{v ʞՠ{[Υ]L?{\n/z ~:<'eZ:ߗ>\>;Rv6BLyu VسWOklm6֪LmSS*oo14 N|w'iӿW|{r;KSߎ{2m)%9UKr=~ʟ\+v3Ӯ3j={v.T+RL^Uܿ=쵇w~ǰ_vHv~ټ G} Tv(|B2~T_Aln!A?@aiG@qCyU%$2uaS\ kϒԫ!W_ӎ ;T~_5h ~wooe!7lTFFY4xyWO~{Ѹ"-ᑫ4X|^s_uw]=<ϝ(ۦs3}zXƭǷ] _CZ&Q2:?5nΛZכ8 jHr>ҙ>@ga$gS#95=ld%9 u~/OzH<:#e((bSŽԇ꜑~I찧Y&d)eWaх6l]`㥆P;wӻF}7];ԳQAtD_c:Ba홍{v*Q6QYZR,YT/)8`wuƲ %/q?7DՉ]nS\sCtϨl/T={̀ն]n@VsHwUmG4ۅQ$4d!yB@umvp;BQ( )S 353ڙDQ#^숈񀂹ѧ `t/|ISdLɄ%cJ-/Tl+#b$cMq6vYop;ťBK()s UQQ"%(&&Rc` n-HBW(JJ #IőUP,qMvOj =/ Ñ4]yq|MpDGB?&|nnn[( %B#e aB) ʅRЅ/(O$ggxı mzr&r+qJ]k2Q+C U BS$0qD}*hJYd+JK'Ogv›~SV{BrbPd,T18ǔyLujOfaTjAF)ax{`"d~p'i:Nc Pp*Cq U BS$0o*n/VABVJ0]%!! Uj Ny5\}]2m%M $d^żB ,(˫D9L,īԂWȫG;墄VFT 3JQ$*0PB*QREA }HMv2FKUk_5%C'3]۝dΤ|M$<.r҃{pU1&C C1[Q2N:f/ғYZI4xO.)4grJ:{P % b;PP*4ER Vb$ddeJQ2RȳL DӧVŸB,(+ӻO;SK5OYpZJq4/ '…^p;i*RY? LqT(Fq88gBU6; M%9{F*QPEA d=AN ˺e8SSb885̩DPTМuBbExJ7A>R2wRwbH"e,ǝY.ET;!xN`"T@F(at (O\n#榜F =唴CL9*z)6EM9i+A^P< "xqqO:p|#{u4 2Ա4L'HŎ)0Q* Ô4>rjiTuOJg$0ǫ,F ]J%ԨKYJaR* ʥTХTIL)ExV5aSVx~8,ĻSÒ%#!=eh7K-jcW tž*0+ C0z43sJ`TPd(ě%xy\r{i]oP'o7Woپ9%X0t+西@ 3US)qiLj8H#v>kd< BeQn?}냬DZc =',?Z'NR& ' ?鋳  endstream endobj 426 0 obj <> stream x]sUpS9KrR:'T8ɵE9"c;o6TE&w_v0|QW5o6Y}6ǹ9?}̘.X]}fΦ2a:huz:<6ŷg]_؈}bj/zUl֘#jؙEߌ9j3TC$j'k]Yci۫o?й2LZ^oχqRK x<][ufs9x[8Su[^݇p~îN_uzj\gh3mda~tR\d`̇v]츴H}AdLOVOw_}Lm|G1=δw}l[=zsfc4ƜW}Cb۝B" rC~H?0|[?vH}6'O׈];VS5'Ld?S}%o3jm%wٚoڪg6A찃0M`_F jz^C19䩯>>~o[}[ܸO˝Oꛡ{ܷؗ[|HFǝ|A|d-B*C>BF\8cr{EoJv1Cծڿ]n){Kt=h9&H^ߊt'w1gدe#̷ <._E{%=hԴ}w:hM5 ~Cg!!nC]u~f/,sK|aYt{՟M!ߝ%œnviy#=x4r ݓ>r_`6f3f v-,v̜4P5*Sm?Z:f9}uyd~[ěIl O|6<:>tBѵDĿn/ P>y%uO.Z]'$f%[ž3Y ɊƜ-[ulk^^wFrf8W]S9CUmSppt ϶k'oݫἣR CǶ\9~Lvx9lyk-It^ ҧA m16g=h#{d? Jȗ؛jjD{K胱=ƇB6]շߏ<*|p5"Y`aCVd!-$pDKL@u[l]ϛJ*uE2* ܊2 1TOZ%$ ;0& "sC 6fa< IWJ]cO~6BnpW#{A!=@PHX( Y e׵A|HuC`k~ʲ0@* 0Y 0(haH0@*~ۦA 7 = f`ЈnBlb4  Ba񙀠0 P74?"LK`!r Z!=ϗ KR%|ЏC5͏ eBر!ބ%ѿ{ZWV#CkmK{jjx-,${<,2Xw /x $d©2j4'K*ՇZؑҐZbv竎<_u,!ت#UG7Yz@L&z\؞|EkwktC*ǹmҭ/(|z{~Ob :nP՘ }k,̨ݺ .nؼC=6nW)9e/#ZѸލD47s$ &9s~c?>e1kHhj# PHB/YHX-bHUT QJHx _|DB蓅ZBkERY*4|-h98yH<^r?^SsZ!u(6 ĉ9즉pr o1ˬڜPxEcg:"nWH9"A$>ŒKOpc1134P5څ#* UTA+b(XQ؊*4H,Axd*$)⻊Dϟ>3胞ʪk!|,6-:M7yIm5ZB2 kCy5ć K'p%"wܾt8'XP * 0R "Rvb -ke$q|?e__ .\c 8 *\ce@CXyv1 6~/":C}CN c:7JM=9G5‚: ¡޲#Ɛk, HJ&7'OH,T%S!XaAas %F|C}'z * w쎧섗cX+0*B(\ 7<T`K5z@LL7m3u?M,o[ИFg I5hB2v0s164 ?n_QEsdۚ;ŭb}tuke[#rH/YHRw\u??Úzr/9M '[?8|QHgIi Ve^"Te)ʼJK* pU2|U竲%[*b>9~( yvtv^Ƶ!ïWplLG( YMdasnb^y9Z9Fz,w#./ȶf?`&r3ώEʶ(``6!fT_I یTE?;K)=tX%T>ٖ\9m)NKua.({ {Clݏ$o }Wcn`Ίy0+Y1fKhV,³by(~V74XEJWr Mx~։i`<owt7cnJoZ>$i硚СmF]S=! %%GkGKW-.چ(_ڞu)}̆ *3~{;cY#L}yP8T*TY,R%¥J-UBKX<8 ,8 U  e26&C79.sm|&O4kCzofsKSއ-H a(Mm5lRʛnxX'0)c"w@iR횻wl()|.Q&H Ea8.svMϮ;;,Ek Z dFVf +*Bή-ϳkYnvk0d@u2頇-qfŴM-= ar58rak7Jj tt$ؚq> On@ `e Ic0WpR{wq~Y:l3r0ݭ`\x«\,.B(< IP,A '׀ oF>d`=K~VPQ[$Ǫ1SҢ dG+СmΝqa7ku9NՃS6G9Rd(\7OZwdv*;!0ٖ4 AkʰGw%R=XB 0P<|CURzlK*[s{wtV(>A5=2/dy'YRx @NsƅT )W X,!NPy(Ay eHC;<[s'|Э ~gN6I9RdK 9?ywZ;;>؆s?=:``vDy؁](slksK9CE(vkshw~"+=Od-!؉\OdutP@̘914|WR3ق)ͨ=ȵa$H"Rn%ޘTe(0%7c&yD͛گ?=H/"PAR ݍTD&&?& oo$H0L8&AaY0 LP>=${<=&^"#Ł*%D #÷;B<Ϯd!B®4ݘ'k ǛHڱ%(Dr^Dr &GЛǓYG4~9r?:r(rrlMxm͓t6(ܐ^"ar. {=C] &Hq 9J b #C$u;r ;.C5:x0B~H"J3 5@y 0Bڹ%B5ܐ!"[g1>=${<=,p!=؝^mNqY݊^UZI/Y݊!T;krZbv'%xno{?f"܃!>8Q-|h ,HA~ٽUcq6p}k5f%;Tsrt'+K MQ 1P@G!a߅YHq =Jb #CΖ l JB– ~3\` DnBdJMAE~ꘫ 7>U!}N:XR$&D&g7_)AuȨnr 20Gr"F.?5 u.>BW蠫H4K CC`xEpE"ģ·0_h,ȂF0WH%b4ĭ-wCOt:Ya,Pa^m<#/ċ9>,Ow3ծh̩7aq :' ˜-xm( le<Bp+"F0/a,v F0@o^vOC V/T2 _^{ħ;0JU@´΁| n27:>(2{>l̼'|нr%>Cn|8݄a@jp%B͐aʆ y(pp <(Rj$h\t 20:fniUXSc+ráCzUSM*;a{ԝuTӦ pIc#A/4f3bM*_a<5A5DFU5K!Fo焍n]5%EG0ݺEݡ(yw"̍TƟ,->~|-Jg',vԬp0%lCc7~}{pֵ3:<(2U퍙n9!.j>nveSìO.U@ [|lq _E[th@8d$ p2ŧYe,Kickf:fag¼vg?$ JciaS{ב6ܤ4 5sa%Ge_.h FtDP%LؚX@u\O?X<(lC~?At O..ܽq{~s7w&/,QaO"ۍ?Oݓ:Mr#F`Kq Jb q/C `i%R]/Aj -D;;,{z3D z-F2W$0PgiF |nNK@o@ ҏP-ĝoFI W/NTdvK)[3Yn*t3R6C1B-TGB Z[ = @0xCb[-lIJ\DSC J6?\?:wmܝހDD8/vTH1á_BݨWPf&*߽]tuCcclH.  ā„Ӳ8 0 b HV|, ߮G⯭nX4t}2qd>JL%^4x[rQ_3}oy]Qd yoO endstream endobj 427 0 obj <> stream x[sF]:y*`[ԩެO%Vr.}P(Q-)˷?3 [f 8(_\5j{쿿X]?zTQϔ+WjՅ.nu}[}>W_}~Z6\g? ^xFUrUW)u,*ƾFVEBں,tLѯ.}Cҍ30kqCf W]˗4) RuzuitL=.ipVM^H3\;NrM[^nz]mMe0{x?fIzZEo09Xj!ڲ-nLkK3=`kiզ^f^6]RI~rIpaO^k<%f>SYUV^oUBuĕ?6/u^7U+x~o_,qk"爤=.vZ-ݝ7z ||>>,SBVSÛ**WhU鮳ȎM&slwۗ_:y=(_1H4֠qwSΚ[LAd>gAA$J@!]I\FD%GDEDfC S#΄U+":۹woݭFUk "ZwQL11WhZӢwږE^GȽ)Jyߩjd8>rf[G1eUVLoBYѨ3(lFIIGI-R0R8)R)\*P4hf*f&"0ERTnD/CPf<#2SD|gcvvFj @ξ{7$,b}%.s V*{׍$'FS" V0ӥHk?hzd|Yj=e$rLiZ6lGBEEMz5ñyѯG=w(^iL[&Spx 2 2 S!Ht# эua4ߎPf768y86e)9IB(OGn0U(V(i@Hn ]IbN\ͭH\w" IMND qPfW ΕJ F4cR 8YFPꢭrR \B%zxy4 iFt%(F+@TKgL%~.f5@aZg]j!ML)K7gg`_ 2 PTG6"nDF?T#F$D4"+\H|lDBӵIݣIE%ʌJS͑\a  SK`ʌ&JŒ y!eʮh{qRs=h;S!C'0Ӄ3p7yx~[1(<+H]ᝇO<~ d4/$NK q jՄ4QRPR1( H K`ʌQ0i#W=#F$=EƞS)r"”8ʌFHT !&P ˩#zoBu N#ut>x]:RUBf >;szT׺=5#愗r29;؀K9Q 4'z'R=2NHb{N,q5w\N@$!< ʌDT l_Nq"z9M(N2PN''R''|"Mo*RPeabiI;Lp;9땟*X-J*\]U.\"h(WK A, YD=Z劝] nDJ@iG%y*Hpzp2X%x94MV@( 聬>O0'Imp显M'K!#Xsi)r?_\)CiLJd¤D F4yR*(X׃]a?|+={MGQl,M?n]+VLWBT8{f D*pZZxI obD"iBiҎdё6#YUw'ϊ;nlNxd+5}5D*U ݩ\^ۏv$?L-GC"$$(#ae Q0ʌ ZDb0&nJIQ#_ id|1CY%zGR=2Hb{, ~9S @"LF^Cxn܋2)d)Z_Dݨ'-b&̨WCzy+fkDzWW yGr|ktz&WxB۱z3~S^iלv$Vr"㯧bpzW2]ބEVL/2JzERWh/"ދ$N^${Uf<[:LH[X/XH30PZ9LϾjт*Fei/r8[Jĩȫt+ L% 7gg?^`kB7ucm!_ Oz!xյ10ƪF TI6mF?To&D6+\M;ی&q6 4M{>ONF/0PjKxh\ eO:lɴ4NJWMm6pN6LuӋPfRpDn ">#݃ D_f8(3YX 6U~c?6h?^V /mW|Z`BVtˑH"Zrdçh9rN#!ZZ'%H;Ț-t[ U. `iG_{j /Y2YtmVBlskuKfpa+8@@iG,Kly*P7frN> sn*._k=jzf`œG?䉻bNGIԉ{pEwxGN:uR0nA@oOy{PP5Xطdm]=ݥJ깎ޚlEKdN]]ڻ_KJxy{T} Ody|`-{!S_x; >y >j~WVhD]W乕[̜@^x߻]ϓ{ֈ ~5n܃٠?'jwg{IqoP|DQ<))r0=]hV.TN Dn3Im&n)<=32"HRX|3FѤL ݈+٤jߌ DN׸TGhwn3^ǨUYzH@@lEрB@`]nfIބYSGITmڜkO+1 `X`21&Qˁf.oV̨0o#ii7T,GUYWPIMakJ)G?p~'J4iש_}Y'_\Ken~Cne6NY{{omZ`&G9m7/6a|=rCn]m ٷ~F%qm/f{fҲ+o{V[pʦ k` k}oޯj{Ϻ~"Rjx(]_^ f OUf7vq'HVЎ´86h=nwvP@e8]8"J!)1pMy,dÃ},n5a77uJ;h{u{?~diV%Vm'SAM۹n2 iz nsRʴInŀٕud,?O&e?0'Vd}ˍߛmḙv`wU|ŧy) C'K y{; wn/fs"PaKA:m;bӛmq77*M]f7,7> stream x]s637Ok&tӇ8i$G ) i2c$b Yf2ddWM9?vu~yXd\Ĩ\Td6e c&tgg,g0gFQ;JLgRi%Kv@yʒ\e)7MOnHkr) 5|@L%vŐM ,⏅Niޏ*_ZNJZÎ)`a$9Ħ,(˫^l.(},{YmaQ̦VeӭUe\0bWЄK&c(\,s뿀1 XB=6c|QvɤE; Gwhw)s- J߹Z_xuC"!nS|:3 bƒM$H念'ㆦc7H1~ؗƣ)JiAu xWN!#4,`oSkP.0i.`^tmP?9"mF6VK&a }`!MGr=|8T._BE5>]_]9L+T9] arظe]^9ah“8';)3oO4әI^IՏ„vZ׎ yq X$֚o.v·c:0ЇpnYɶ`@T-5G5(/:˟,F_!-Ev|^,й23 Lv;d 7@T~BK.~|9`$'h0WҺ^xG0A`?<5AG"dfNX*ߔUh yJ]aQyҨ|Ma;ⷁZZƩ""ڱ+o+xrO ջ׍+q4݃`ʝ& =Cd9̹ѩ rxbݭA[1Tii5j) EЂuې(*\:MĚZ( k>CxuC!;8^E[ ajUjU>Q0w.V`  *_\:XN ݥcPq*.4!5=d\`x}TopPbHTC<0Ab$~D6WamPis>amv kŎ6ap %<5kL^OR|Q[Fr"<3\6!rPq?=7FuKK+%Bz?F1R( d0›q==N$68 N| dxARj02™QO Rx\ܛ!ͫ8KŐ۹3 GZʤ*Ov@8'- XCB}JF5v2cMC *x VY2) R,O-=88{Q;~]RauZUs * [x31UT&̈́i4~q}j& !ܑFf5 @*Qon-t8mS.bq^OO t~}15kj97]jf^b x/8c?"L d09&6$_(S pffH|WK\.{\SJ!,YB:ٝI3&/oUU_)=2*;[T֭nvȱm7'w`\ ,yk@w ?cq@ՒfuΪy(սC_1 ei>H`nzN(t^C ڊF;Xܖ";:\HwpSGz qJN/rm]QLhH( :RC4g L'-}Vj)av9X'BN.@?#m\q;1]F))0w-h_(h+Udotڙ[{v|a ٓGa X=?mf>Rq ,Ed61-i|f~MoИ!e,%YYQ zO]@<ނ `nFXΣ|I&1:KS͵2izS'+dy@ Əd=uAY"eO,`>Z&{EK1}؄O.VX -[<2n* endstream endobj 429 0 obj <> stream xr* 9`ؖKKt<,0Xi5Kٮ4{{9o'IhU<6'*Y|{qzWy9drquz.KxR*Q!erqp߿-L鮲wߟH&8=f䷽ й<*߼OgLmLe#PPˤJxδ׮rH*&4R`o)rI|^/lȝWԬ;ADkIY'1`a$(N9j7\,MަzNPz.[xێy(^J)c!c%)]JGꖕbEK$w̪)~$C%*.yyz.l7m>hmf n08ax*g7n[Ѹ`{_2Q753E*]_HPJ>DGC^AW9BLW]2~0//XW0,ŭi0r [ ș̻*?`YOCCUoYc Np= h4='/#=ڦ[ ԈvJ I8͐"2L9_N͵50""%G_hCrO@#ţ*WUBWI •Gd&bq̺,"̌,IRoHz >="MD:?@8RNJK|z`KjNK.ȏ2A43tAZq)Ɖ zuR΋7i7}3q,;%܎|87I{y뺆 =yW4IZZKܶxCo~E^lփ$xd;Άm+z96tr0X,[D`-NDN,x_։eI 7b@H QvO7kˣ3N2z}]M7˪d?3s3&d8Z.!t *|nNN>c@}dsn:h2x8ǞmdQ:jB fw\u}`f%̦JuWs_q{ٵ|Ǩ{r~8) "j1:~I*\ Ja ORb@h_1.,cEn<\U`Xw4&^.HUg=<}_Bd;yfƒM"~rtFP=j&3̧VCY!ce+ O1ژYV@;HֹuD  1Z0RSW_#82C1yimZRTpw7' v]>'[~U{tۅޘ3;jĬjWkc ջܺ=0<"J\'zK­FljebQ|Y`@%׷GE{ģ17,G7X?QoSј3jC<ٚ@jn D{]pWxKꁝ~n+xb`sM-u6§Q+T(3^D js!Љ C/0^21C* I K'5oбS`zs,P?"_XbPCܨ? P*=^->t:j ty]>X7dfG p-F@xT?g˫M$T?8{a Xi)MMs \O0V,tf f5oOvևƂ3 ʬϧgD^C4@>4s7Emed։ ʖ!rZ'ȁqk%V_v z/nR9B%4g-fn{"tL*7̕cfܦpf1D ve\3lL V!Dc.B ^ +4Iw6MkVl%py2eUs!yDK-qӕq_vm&'Eԭ EѴGbyF?dTlT;pF8+BDţhwN#Avm!c={ "];HTrxdT`Ytwelҁr ~i&-K"3l((Bǝ<;naϙ_ݮ^DZmh]]љ͊nz2Wv6gd""( 8D6p8jG-ŗ/kԇXU/%sz(/UgCMȰTz*Y9EOh2Es':fXAcDяB`'>fXQO<1B\'>o!#´J_41ҼbƝ|1Br:G7MuI<`18ES?ymAYS . Pns_;]1vˡfو"Ѷ,;u뽉#+uW ׎M첶%E`Gr<*gDy<%~2̘0]w]x&Կu.p0>h`gK>?r#8YAl xz| 0J#~f%+ ?'l endstream endobj 430 0 obj <>/F 4/Dest[ 128 0 R/XYZ 82 318 0] >> endobj 431 0 obj <>/F 4/Dest[ 128 0 R/XYZ 82 318 0] >> endobj 432 0 obj <>/F 4/Dest[ 128 0 R/XYZ 82 318 0] >> endobj 433 0 obj <> stream x]s63|: A=כ\=(2:#n_"A%2$s͌X`JOOR?E& ^ -uuzW䛳ӓ , 4I3 3U&gwer%}ӷ'?͒ߜ|܉=7PY{^f,X*x-$O@E. Ɠ"O(R2pTN.rHJ(R`g1rWI&q2L/lȝwK-|!xR1h :)9|&K=Hm|=j빚.P\6̀I#'i"gȦiBJR--AŊHZϘUSԷjI}%*6ybq % e8('肌 ^rFAAiMIt}S }Oe}@(*s/ֻ -}OcŬq=Ϯ<7A:,"(Y~ό$1g?-o#eUD@_y?" R5r.kdZ=u \YDB3_g[Nzz4?n=Lߣ)Z7r)̖!H7?M%"ϊDJ.sr@k\[l# Y?B))/ qաd%x'?$H~عa~4w&9-,;%9Τ3WtD.ey-Ԉ}f}'1|o|5F+ ssQ4ߟG/r*t OdC }Y S/PFR>M,[.t @gS ~$8)pҳU ޮ~eҟTL Ds<AHw7f=`OGRq6ce~_lqCbvv؜st#K$x-s/s jY|O} 4U7T)EpטvU+9x5>آbFro=SaI+&K"/zmt{6HQ5赛LsJl3t$@ u;]c%Y"=dp(Zە'Z's-[IngAр|A*tn@t(| mF >gNC-1tSbѡl斻^b%/軘) (Z[X[f=#Γ;omo+H}5eí3*3\Әw$r5W>I_^aυן- fWگ 1Ma?=#7–0&VكꙀK%ٴsa2?6o #0Zqjfa RsMJ@! _6 =+ty l9&bJmH=\NF' 1RcA^A>Tރ:.64h8$CFÉPKJsQbX6=D#|ju/0~ܤ(^v3NAC41Ȕf;)ɸަjM1h!/g:Lk檽%qŊFD霥0)c>/T޿Xv4/\nHjr;MXӃeʫze*+TxpK)DSqKGU % ;oPLU\4>/F 4/Dest[ 128 0 R/XYZ 82 318 0] >> endobj 435 0 obj <>/F 4/Dest[ 128 0 R/XYZ 82 318 0] >> endobj 436 0 obj <> stream xYKoF #[{7=@08VC҃PX%E}gfz+40Erfw^<*^ $ Wl1}?y+l2UL0oWNn=߻+Ϯװ'ލG V&?Go`tat/ t㦲puZha9Sq<0!5l\&Ɲ|+/4׸h@7 C+l2X8k]VT&Qւǰ&RY^ߖX\ 4=^n9yx9unx TVy4b13 Ӱߨ(K;{ѡz}ZX!]Z '0v{"m5O|UNR"9*v jpy]~*XZϭxtx>/輷xwf8V83<#byUy#/Ust <)Qt\])T.nݣj[5Sp*h#sFS׈=jgbugGYnzaaο($oq\m(0;v"x`&(]$`B-Q;LQvec4.b|s =Bb\> 4Vn6:ŚZMMCqYkUTgIc#ۖal7`]n9, tU)nG^7hi8 b6d1p6 OK l8. `'EҜʀ5ؒm$Y3n?4C!` 8> stream x]s۸3S#>IO}%]hrRǢ#JI_@R8243VH|bX?=)X,Y-V?eӓo/NO^dBe㊌gfJ[*`ެ<+w/'? :w /WӅRlXhQ2`*l3- 8J& +姆U{R1a"zq$GdK^b[^=J=2.ցS3'aqNT>7]vfL*_OYCgLR(X3:E ֔5rA˼{5>^wYMm_eq,E!PuCr5;cvUPҠXg*t'-o@zۮqR[vqj3Kc7~b?6 n ) W3.op0q1Z>ꍛ5_:h`=7/o ;LKgpX5i٬#=oZYx ^˓Ȕ aG{UoctI;/<6 ,0#)4<^> xKP,H2vl H-ר"!yhV3OJs H2*&(8臈wi')Qdve: l U @d m Ջ;GKT#jdPN&v׷ VE7t tRt{`esN*C?Tڑ-gH{6^Arџ,Ċ ͎DBQܨNO *>.'}o2"-pH%VMPIfBhl]3a?0nG٭~͌\YGU{aA~'9;cZ0%Lm.9nDcD4fkUϸhЯ>v[ ?{m F#U#Y|-V(xÑzKء@ qw4oʞ a;Otu/=]K;* BڏBH`$Q (O;9#\]'<'pp@a#X1M.е=7?py7qAKެ\J1*fc,!*%+tD'LWϮ=s%سqjgZCcV͑Ԗi[aFܜeZL_%,*b `V7 Q,5JN(4r{9,eE mLa\./_}3_᪅Ĵ#Ils}wlCɒ5J$T:9OtUr2Y3KذĐZǩ0 {dg5:4d C|Y]l,Cb(*Yȹ^e3/lx߇dŌ.veul( 6. eq1 R:Ld݅SKPI,L;V`XϏ%W4c .ᵥ21JpVǷkeޮID=./۾ ީ.f)u!4;E1߭b?GjK uItb]ާL"U1ܜ |&k=Wkb| ֆ %J:01lN_w!ч_J@VbR.^{}h썒'CނZ:*18}6pD6&~*2)_KT hXy} tYlK$&T#[t)'l/)XeXay;KvQÈpROc\. TФqA'EI ]-FU%)a1UuMOeDFn-:sT$]K.\-=5G5v9VpI 'aѓ=*;2pssq&#P>+4qQs&lN ]+q/uSapw?p\:T cyjeDj8zx,X8 $qCrɽSz\-z0d}s;:jP33þɠU=O/yR+_p9GiW+Ni2j^a ;/LJ" nHS9=F0&=Q0D ]ޭ&qV rwMUVRæ>2^q8گwJzW4mO-@aϓQAHpEr ㏡zSUQ3'ޞQ x{o~dlj2DvpuBvb"qO*OK\(ϻѫD^J2d{3w֢O7tΙr# 6s2WOݗ(f+C2(W|ijxJzNE>r?KEѕ ß@g{3]!=dII tjkLC|M}Ba$+wzmgE~&<<€Ġ1G˙ mn/19KR.1y{1mBh{J/2_K0b;焀r\>O 0 endstream endobj 438 0 obj <> stream xZo7r98')6UCڢdgӧ;8}gf(/yKK|v8ԧ㣔縈u"ZGDGg㣿sh:?>@F<4p*LM,Zg+?>5Gӿ}zrkO4TRG4伃>edc:5i ꔉ,shZ6SmT4Hf"-]dUTLbX^:j3Mڳ6V}ⷫ\S3;bqǜږ¦;Z0~/ޱ,3Om2J& Dqf;,CK@zx` ѶC,G6LdүM RѷW_B\mhN-u Fa9QyԿm tv`S~u43p<7L׿_BB[72RU" >72>e8[4ϓS/PK8˘A`Wz<( `˾O3m# L} GJ%#=]X6pG}r.CVg2Ձdm^7"SJ\'R/qtxLT\\$&ο42`N1lWr Hq9ppn(7?ș<ȣ8QF 74.x$dլG]ı~6) 68fU@|0ADF`*ze6Lږ4Y\ O{@qq w6b#Ov(+2 `ИB쳋<*ƒ=|-;$>h#-ZutX@~8@75;gczGrF\ނ f#H ՞n7P.SDğՕ @(ѽ?`$*.&MB%)'"%)5TK8YuDьdaʟer=_' iTT~[^\hv}-揫X4s{ptwjYHH4OwmC4_QcoWۺīGp2'ЧAC..ir]b%qsS5f* gdx֙OzrYM Z%M 7ݬ~+G"74UyAK'r:.ַ -}r<-H9K|CxknQ+p1kpjnZkoyÈ `)V"B51GMj9Gal\|.JGUgXB&a1k1'$/U/jYpi4a,提{r95.HcdKivFTb1RɄd̍ g#ʴFM\6ծ&+Y. =$BFD*SR2KcaZzD{yy>* ؝5@AI+k`j~uK?T@0 j2!wJC۝~_u) TOo)x|[J7 Ͳ75 檌rEeyN\@1MƱ֣&v#%hb jaCj6 ՖuD?i oP@ӟW8w$> stream x]ےq}߈~ӴB .,46%sٝݙڣweхdɞ̃DDUWm?vכ=^__r'Dׯ;F5{~ܽ;wW?^?W2/kzPhUŨX2ܚ-vE'F솮mu3l doaؠf`c)h&YQ^x1tE9}3,-s.sh&50VCc.i6Zs/o݇}q}|iF_ٚ3bU`[ȕ -4?p&>BO{^¡;#4M^^4Cm/Wؘ~zxym v|`,>CK7~g>nL^<{]/g~<- hCqqp@p_]_Gdk32Do?$/3њ쭇y7`ĝ;s/׸nh|@ s[c~qwLm>ʽZu)$j%IH-ƲSybh+ӓjiFU >T0hs@AqNE#83W)DddkrEUL 'cπc q]_?\ܵ(6n.a%*uGA *5Z!huCVShuƈjT 5>\xuf&dڢ۬;i/ZB v% 3v% |IEKwRtMΕ&ݴI4jSfiE\^ Z?Dmw?vdjpoA]IPO FGL vǩz:Zio 6z VaY#dgN&!Y55YNUl:^96}Ow{ѻvhuANͤքc) 9?7qV =*]NcԊg"8&KI[K{]S(ޠz\G{nJqJ\\ T B "l]TэxH& J_(IŢo9VwTḇض_a)9CK͂p5Z7 Yp9ѩUsπ+)E44%=Ej~.q1GTij.B5]p- Ig(sNPe{{g*H 02^l',E fBbEw2݄$/00t|MX Ϲp β8עjnފh|37 cu{R OLkId*;Pojv6|h5>wWwd8Tx(bj]L=(JbZt L7E܉Up{KtM!  Zpv2mF lMxza+\(-8V=&abA!gx@\z뼭+yI5Z.BDD&^*=.:cDY^3B\:GV^SV2E9bMxtźkjJcEw6u;tC#FWqSpMx.Tjt֗=RLO#U2UڈX(=.:cDYV3B\::jN&+zzEb ZݵmlJ^9XzXjGPk`^ -˧U ܐ]VvqPRLEV=vP]k&ߗOXde]@T+I} ɐ0uCY_'FT}-5M*P ;i`h0+ n5@O]kyxhҮ՛y,gO/*9GK]*I,~J\+CX+C*kOcȋ{̿#L>=Pi {pmC|0ʣ*Ȫ<1roiR!.qDϦ'Dų陙0~"giK I(_8^ݥսwE&1Bv`هFv)<=NkFȻֲ}=LM}qcqpO-IEb]I(wAo.RhooĈoooT 6QGQ'#xiNVnsDCXxHl*B]3c霟 c!iU ,[su[\(sfD߃ӦH=8mO[)ܰ]O{3=/RyѷvlIqa з *pro,d/B fHz g*YY)ȅԲt\Tk_]M Ws ڏΪ䌡bWyakT~Ar0e.A $[S!8'9n%NϺgE vZD;)'o9s~{xqiM̍qpxp`22" V xpp{;yM;r g9r$|v3Ζܕ$}v"z{p ƧwF0q|C~$` n( n+|w& ;!IhySǎ/8٥K$M{1$Ҟp%Ҟ3ש06s`wAvӰJp:<ݖRtVA{uNHua֣vG*`+ eZq(x!&?eQ!բLCmmg'O}泓ܳ ~%af'1lv2f'y(+]UM!a?L+}[t]p7yٝ}%35- l5Ul-g™"X`(!FN.Txyt}'ZYiA; ƧȕFt`;7R(i_ߙAWS \ɮvu4*0z:{c.=vaTkXzz(D/UluD1)ݖ8%sCVEglKORt;¤~COɵ.)"bgBYS0>eglKJ >i L:!9d;loOPe<+pJiNyLHyaR>!SEρHed+ iLT1&qM,s%?pNt8u8G(̇s|<*d)u}'Sf3J@ endstream endobj 440 0 obj <> stream x][۶},ej4Ni^>Ȳىhw@\H(PgYG?R??} J׶߾n>'_!uëOk*Ru&꣖ZvGMW]߫2k}jO|J铟 AI0QI)nhzm9NmMV45}Eh-/l@QaL\cnJK0^s"&٩,IGV2.0u;*&&I$K`iZ/]mݖoNls|a+7aG-asy<gZKyW4_T2ڄ x(Uݨ(uI]UBUZSm^S sc(5d%ŤtuNu+_mO[SW^]-i6un>@ FUэ(Z-SפM }tWU׌w4XՇ#L}ߝtReúThYj]Kҙ\da %f&:IQ@צ['Z'Ƿ6Q%RPwiaTAHB9}$K`Hn؈fgHvio~=ԢrBQ!t,1ֲ2Z*&8M6/vQWP]iWo_| 6Aن:>.*l844nmɗ|2xM&e6-&@DPU+CNsqǛQC$P0. $lܲKekeCgR{(nf(k#[aq`y jFUr{ZmZv 4.*&] qٝ+dig᪾$H#-]G BYF.XzfX00LBT]֦8k%zD7`Y?"t.CYN&S%~3eVE 0_ZQwlJEfZ%MayTY$jn ٔk3#B²earho:YC9\Cի_TA%A-bQԜD[[1CCe/͏fLnw,=z`Ӈwm7\ [.}*%3GRNF~%ȉwkml:4bF̕" CF|v"ah\Qe@j@%@B,wH^wz0e{2^*7<6v}y'rܾS/PWe6]C!Px7,_N4"f~}eM={lI]%ѯw~dlŚଃl}?RͦŽs1A9鹘$9M+ *\'gY3\p : 0x׹Fa̡cf:U iWiD C%\5]N`w]l6w#@| H$eY^<~Au#s6Rㆠ)f@+$=v0iMOd7bIC2=璜b!m-b檦Fezd.=GáӀ8jLPFw~3o/LϮLz.?+BT}pf Li"s *`Wƈ9iX0?ݬB0,ȭaujf+p7*~ 9ƚkmӛJax&ݸK~'ux2M¼u,k{x6W%eqƄhCtf uW*8j4*3xAwTkWa|cRPfOvV#L5.EHF^Rzs*,$pS<{K`(4# Vvs'T)JnN3s9YNv rb!y)m>!d f{A]Nv,=Q!)Ke,`uZd(>"\^B4NK0E@^jSa.AR϶,~BezyғRJ꒐3( _|N#L <=]H1;u9"_L"2m%&!kf]˓@)UǎpCt(UFP*& 0X^B0Sbkb>{.:cy@|QsRcl @ (w$k`1H@t1pQ堘i'>dNn=,C>nHwlqp߸X֝Hqkfęhom,'V@j\S'S~驿Ӡ ʞFܥN&2黄K_N.IRšD, ߫Ns# r۔-q|5`j5v5p);B|S*<PAU3WkTKU3ב"Qm_}Uq Ƀ~KRHJ %ɟ &%Cl f _ɈTN띫ɦ[N77ҴHPv*?F4ARJKjW~@fsJ@Ry!sƁRH/0z+]Κ`=޺\T^3vG6*.j&-2EgF; 9VPX^^BH,,#/q%(-]?n?/ #ũ_f1@"-A1 (\[|Q%Jp,p|0ʥ>>R4fy(a/mbI7I(N0Fzx:# endstream endobj 441 0 obj <> stream x]]۸}w"b.MΛqRޚLb'1هv[mwU[=3oZ?% 8~~z77RU#!@ʲޥ5M$O@=2[/}6zUlT8z߄p2\e(+b4ߤST_ܩoĉԲ ^5_\6!-+;W.yc]&Œw}yb Hڂ+-M,;FdcC* 6dKq/g"U:!AW>ؑަM3/{>#Ԇce$:vq'$̬G)„ՑDP >*FrZ XHN80B2WЅsja=2-qJ0Z1Z-iɚ`)ӒRycL &L$a2'afuN 8ΕGVQDsQ2d(E#'%<#`#GF3kɨѩ#ɅAHwK'OQ#.aȐ emE?tl} dJgc[(ҟ5/4R?(DE* 6*cCBDs6 ~QwJkG{%@>?DbL(ÀYqS3Gsur+7m] C^ Y 7Nˍ%@UfIwƒ8ƒ"KZ%C#eBX2Y2,IE:3s$U9ձSd JuU#bfuL&)dwǏ4cKF,°~=;rxrd hc[(514R&G :/Πr^VJ((Qjj~I`뗤YvFb~fQ\MUXPͧUʉ")8tKSoaŷG8zg^@[_}ڋcc#'P99c~w}^b0}j51MS7M.t/y*k| [bs]YU?L&RP^`c5V4G2Y:5酩%k*p&֘LۍE/ش`1qqDg58B?I %q&F"ULR&X[߳`yp:G)i-$`:ZzEY:O&33U1 sfxl/uugE?h٫"g%\YNt'FovDyB<;Q^ ̂ e1-YК`,)Up@-|q/Z4 j(V<(YG4]|ڿ;)u7L!EF a?vUDfVa"Ҡ&$ī" -skEZS% S##$BGpF#.V)bIddcd[(5(4R&#|f%Y<^dd\A!ՉH0?'pO^$Fdd P"CvuI1:1 &=UqܵUʫ٩e9ߓ-O{@hn@(vՠd'a#dgcd[(5.4R&;ZbP\U6M'U]vafucf;Zd6`jPR 3S]0:T1Jkinqgwxnrk<Q19[LszSqb E&ͅF4g#UtxQTQ0{0:Q3bs۰lm#hJGcEiϺfVa2s ^-a6:U#( :[lوU"*3 򜓬IIQBOKs+GdL)5Jh6iȰ`ЃKfLP6&'F# 6 Т%U (ˈ` [B~~^pMFq&4ޘx3> J'h"& -0iЯFf'x܆$Yxv#w  2*fo=6T\ U)t)fFT2Dvue<8SGWMHh)LhE-ʻw]vuM1VءٓޅC"ա`WCpWɬԞ<ӦB͝ 1IQe&!*Dm%O0gēG_=XL|aVwgt :K_9<+'<'ξn p?9,}rhi.ie1;+YMʭo*U@a\2%ǣuy{O }QZaR+Kl-&5KZl2 huqC鰻\tպY}* biFUeU-l5HP'l\8>P§"GLh׋ӄsdATz c  Jur2/xs0^wcqGabܾ~WˠXDPLr(Z/A8`Ly)}oVk4"谇(=X<Ӡ{}~|l[X:|ԟ\żkɽ?|4i3\y!_اZk='lafufv|zUOm|Cu]O]]>Ih2{NA7 "zzB=riT=Ygur:„WF<1'LL[ɋ{aFZ!K6=}ּ1}l׏׺M?zƸS!+ ^aŎOOS^8I-cJwrD}S;` ;'X/n|xSN}z?ݩ֞uh+~-$[+pō5Ml7֪"n駭*&4hDDl<`i@:Aͪ↎g)uI4#@ču3s&vf,nrm M6.x*8E&p3rKjha-1Iqȼ*UN 0+6/c KN,sԢ4+D*pbaoI7F(%g 64 7Sd nm6&i3w^4&}.(!aUQ8XuƠ-ˠg>}/"[_&5LECv*(rQ]=ՀmY &6Afr„XE51 m*RceWv)-4-@[Ü\40jjP6Nkj:ר[~Q mQv#zPe]'AejW])ƼGʦ] ]o''R32%`zTsYg ɼBpN5ɥak~Q KJw HYr5bjݮ \$d Y'^pYz>'Ę84/|Õj.ÚֵG \`n66@6;A郫Im,I5jGp˩TI9}h/O*')9^Z REP\0>Wчt)3׏E5 YU ]5+x02jE2 ܜr&JA$%WDrZ\)Tr@+]A҅x8tm.PBꂋ EՄH[EPe<Ε J\Ҧ /Nu\{x2ePe|qjkB)_ȃ7@}q1I`WYt8y'a-ƞj'tnmTD{Yq.gUݴs2/>r,Q-7g5wlK֪񦂬1VB58?pLM+S6~I??T(\ ͫ8(^rO;2,.Oj&|EUvh6"z0 n*JDL>"0%ٷ)iY*ʑ6/c ub`HbDG,7}p!H[\f}“jWJ7VWڃ[>adLQy4]1xʣ'+b&`ZUTeƪ^+?ǢiCD*!uZEHBDo[,'F^LbuqISaOLx[zuVJvx~t6es`N&R0T@*6pDUVM^TދW. }A&'6IJ5cfdw Շ68AV࠙zg~Ԯ_B# {aH!~+*o9Þ)Z_ṁ xr9\5oEgxS97y^ɿT7a1K^'PV%%3_|F`R0+qo_ہ/I<ϸZrew@N,Z`_ks-1x0I(Ib_ZiQ#Ll4((ʣF%ID#,τTDr}p ZY wyq+~dD@*m)x$L&XE Ԭ.RE )'vI|N\hbe:(bjE]e.&!j~ |#*&CO~ǡCQ:{鐔a e2,C%I e@{t1+ dL5*lF4 q&P 5c-I|yԗWFyƥj)O8᜹$d~g눧T/N endstream endobj 442 0 obj <> stream xMsB3G\v(⃝MD")OtMUQF/wA]_/^ivwxVׇߝ\ Qၰz%V][ +ӴVgÝ~O?Ym:{3ڋJZ+ZtJ}])[[kUTbeںݪk~%d[gJj'Sdip~NMT~c뗀6 RtruvtN=-q+3wtFTiR諾eC *3$ҝaݶ\\^ofq7_Q~9 WWvMA~u?Vͧ| _\; QwSۍ]W;xu ¦"5siAwtn:U^_\\PT&zYbi!g[tkDB {6ErDZɪQ[W}G-03%5dԨҊՔ.N~ o~{?-y8`~N§횪ۣJ6şۚ>J?31|%V1}? Lkr5%mwQJz%k,"#'K>椬p{.{W?::OT/CZEd3U'RnUFs,i[FWS'O7ZmF x=7'>=Q `Uv==8_b{dŧs\q:Ϊ%p\?~40lS*{A|(CqCmÊ|&jڪȞzhRFYrM[..*^\Ϩ:QNpd$(m80Y%j5.)^־w#q.3Wi*3[q:@q0DP8R(QoS n*I07*uS$T۷A7:]y[)k+HsS QjK'321b`5+n~O׷;  eRW>UYP EC5j}UT4: \i^o|~ʜbY(J)S$Tʩ#^PeT4'V@#S\j8 tf8=$< Ӕ#2)Lb"H@ȵhsJ 8iSՆ&I{x㖓̾38gv$>ҶP-tOR)H.ު碌I jz1I%Q <0ҷ96MclK.u35MA4E48OS *"CRIUp78eA8% nZUufLju%#哻Xxq ~=rWeop~*;]AarATGV*gpfeXpցzY.籌,%_n.2ǘ;X i Ȳ1#-Vxl|reA\I#Qhn5 (nݥ5WPB/7\%K4t(Bjpa2PMT9(NV p KA>;w(^QGQv* Q~;AT RFoTy"gINTƝ %?rE_߬X] ~a ^裘K+QFܤBu$[3D!Pɫ!bjXSSK9N}^Vfapsq:Bv V9BV! +)OeAO% Dd4t.4OwoaP~4=(BjXa2YTfYࢩ+} hK&~Kv`s?^)#_WqK1z/B/mV^YIڬZDX6 |>a1p_ݧeB13E R ՑJ[u ua *%^z|qpР Gq[q:n bb(PP }+h7TTF":LF#LIVt:;t X?2l0^ןn 0C֟3kk<8$q0wB*Bݕ[]Ew$&&%z@7x}<H]Ã>A!RSd$d 0@l*^a~xĖej1iV &$a^Bذa!nR(Ԇ!6, 6,ipV7,$ϭ Ȧl*vfH1MR:bAɫe7+"lXdeK}6w4smƀe4y AB3d!nR(Ԑ!,˂2˒eĖ:eW@'8,nwFZ{m{"U=`r^`&N`濁6eJQ,q/4XrK"VȼY,ABa KK Yܳ8\KmB\Hb:A)] G9քݢxttvFo~k)PS=9lt;/}{9փ}9]׹Y}ſ~%> stream x]ko6nALkŇ^>`;Imdmi^c[ƞnKP&2 FsyyN`ef{?4brY*O;U<-p\%Vo?lowL{{k?[B !U ?FAG>K -ͳ}%wL)Jc 7i>?>R Qy遵rZBCÌ/Dʎ"Jٓi%:2TG Skž_33,# k hA%-|H>Gf)? 2'dhbK)BbԗoiƷkN 7g,S3se'eK]K{#8//ld>kcOuRiT_4+EQ Ta4#"*%)3a<uB,WJӣދyy*ҋÆn@DcLw G&y/6_/"ò KM7OouHq5&\2QZb(KlM!Ȋh5I'ZoX\V f/=fXKΓh쵪qSYB\@BeZ\t5e_ 1~̈́ds ۤ*G5ZC^:pf\/SkiR1JI_9eP5sv] @(v7ku\@/QZ˚z: ]u0 ~($`quHU}H>`}_Opmds9ϷbΎT*^AA3ānIg:2\\+I6w [}gk)4S!Z@E;YV-5쌗ZöbV'RX$Gy()3팂qxw 9,`(7~9󲃕-j |pBf ]TN. wP`H ;(!Xt"A j0Ć7fw v}oW@)tqbV;b r8VHh'v5#]IHԑ1N;޴YGKa)㺮PuNE7Q6+` Sᆯ1Ri,t( Pk0]Rj 둳*Qv+ܑ{+fZ3x7+zcB?4#}IH Lt3阴;9$N+MNbPrI :*kc4G%5bdfROXY|܈)|vxAzO;%=^5N] ӯr- E7AIo5#JJTی/AI8B׽ $2x=#5Qe0ӣHp%='6Q=]OopS=RkY`^VzS _3[?xS0'9"q_Ć]`1@EgpE+љjŽh(xuQ|6'íc{a8/aƴ15]'$!OHf &$a9-ep$԰*{SpdNp%sOlػzN'e¼͏څBkyFjUsa'Eü$Dӌt!1t3$l\I+38W}).ͱzH{,$0#z;W {$J 4c>nD:_eۣ5Ye-bPU( ~QŰ=fx='mҥAgκ;"ix7S]ЀSQoZC{X #4##t3:BG Ǝ,C5DT!C[C$M#$LtcoWkzkgQo?5w$13G\b= UL2x`3 G#ϸ0FxRv}ϛ[' Rpy;g,]g`mKV|fUNgu,s*1c9"3L)+pW }h0_bZO޼xj@#Lct\ B߀߀W&u{F;΂݃c'_4V T]GTL Cl/^'3 gHqqFyQMq"ayBgEJQn*:4EFljZ%tgOsY>^¶!{bY M[L)ZPƘM -,W0n"̉58:Dg_F&8|W*G \GA7ISHt a߲ xsʃ]NȐO *ÍfS@uZ|YaAhg?Pi pe %CD[ȂpByZwV},4M "ۂ9ѻ<ϦœZ?8IFP L^/?TG$4 O`;!  Ov1+ؐcObC2e<$m S8cvS%A$2[O<.OW+Ѧi.ʔ&Pt |t9b7K]|:D_|NZlc⵲í*ְ=f-ˠVG.*8hl*?Kx|x^pvH|޷,`9xW^E0|;#T<3x?&ljğw*|SY.f.&Wi^F"!|ُ`ܭǸү }$dÄx5x5<\wP]ûGvr3Won 5=T,cfq7Q0C}w-_@mr'ՄP/ 1_t{אDxY͋SKal耽%B1T DC TBabG(d1r%f%yQܫd NbCxx[R`Q.v$w\! az5k/>a&ymj5߁O ~y+OE>^L(n[6n܎kuGHܶ a lMycC܂yz*?Ԟ!IwNM Pϋ /mw4Dy BP/U wn$r>B!P <{5 wF;DrNl {9ʽ9N W栘fPD $zg,< I?M "݂0f.)Q$_mOBba{a(3b1櫖A$Z[8K+Dߊ׻kEh &t!t9g^+B]7ChSH /2waX[L< -!vgגn.MpB0buyJlډZk;Z#^B`uy: XRQ("U*Ӎ~*ȅ B> stream x[Ǒofm˻^,;!x SÑuBdO#ELVO[;~Fx2ힿdǼ{z֥>cyZ3-b#iwӻ.X5_RwW{m23?&DRn+jՍ y<7!+۸IOAtܘȌYwzWod?o?\udF1f6ỽs@HO> ':olyjͥ]=?32i&ZcS9hӯm:,M=@-ș%Ϡ60G}lwSU?]/:mzNUю9ҵ5u7 mXNmE};}g<6Ud=!JQ^~X[fgX?-i}'ʋߘlf̷(6-8<^2끒)p8̵:5hyƞi%rG?&bAh<[-:u2o !vbZז̬Ff)jx1̴Aˍ j;#I^K5ii(*Q*ƁrE%N/~YA0t&aGiؑo̹NX/OLaگ[G=aaWEuXV \Ȗ3߰f'fn< %3.ҎI'"2h=i<#L>eOPdfN wxnpmŒv;:?vt'Ka;pPGD`;:_ؑr(Q^DEQ;-hH]-B_*tW"%H%*gt,xXey |*a; e22Kد fc%Vԧ7'9U{//AOF{/f!9^Ơ/+F^[-LJ&yJ?L廮"#ʼdTTD,nKLXj:YA\deh>l/[٩qx8o=ߏvsyjִJzC[077aˎ& &,F0WO0^m" 0E2@z?|u?+BQJ=PJY?4^YH/JLfWf] /?'eN67/ GQ}\8@ P(xrWqo8BvqY}P kZ[@gvȌ{%[1$YFey<̲Df>؊AM K';/gG9T$ar<bXQ1(WOmoQ-z(u[Hꈖ!Eo+˧}j 'X관JSjX:p:)CԂC2XYEt*K6m3x &2L/Oݏ/>wl+]sgQw(̲&ut.Ɓg\n"("ō}l(ҵ BO,DCqa,bnH%0df9pmqVrÆ$G1 DIV\#BaS ט"c7qI෹H%bFl=7%dUdB3AK42K[(C N o.V=9ljzuRa>:bbϟ\='ʅۮLay BTJ@ ]I[@M!L@+@rh=sց(qݳ֡0a pap[՘oq.8l&.#*sM`.?3u9 K,uH&.5G4G*:KlN]fj|  PxǟA%Qg%Ca2.Ɓm+2hx (m];֣9@$N7.?9u; ĝ+u@%.E0g*:JjL&]fiz ҕ PhDI=-Y-.Ɓs5:vܻƃ8:e/!}!ċdB T"R{ػ Szȭr $! @+ rɑO79%YZ `K9Wc#QFe_JF]~p~Z"7q$s,K fco(遷J*wP'#/3eG}VkD?펤_GWYn-L s?%Y (̲04"b?Wd?^`$ iߑDk]dP&% @Qh#PSFuO,fd(N(Ί)L&Exh RH& ]pxDkd,]@a$q1btW9V/7C (E~ 5H%p*B627HBYjL`j0 {EiNUR> b ̔Bρ A0ҷfKP3%J`3Ä5|3/+F7I8D2@|ow^ @y?їwQғoS O%2{%3{e6T1 i {N`/@"v-* F b/ob{]=WcB?rEG:[IlJ^j5zen$7z.!Ƚ`=Ҝ||.:})3'}62@g||d= zK Q \uA YV|D̓.zz$z%^$/y6"w w}e=V)عLRT22Cf<8m(arϜ1O Y/sz|k {ppa_׶tv_W3+Sx>6 lZlH$[jnM6tQѓV H*x|QJeܛ//<\$~?.~.nߙ@G;~Nh1pyw\oyRiwF橩@Al: &,&@DNfYM[1!;cO[3 ^2 iqFq.Kr07Ru48fXL_Hڦ23+"`9E ^\ҼcphR*nm> stream x\[o~GhXNy;ibö(\Il,Rrd#ye9 VGCr~X<EUZ//o//ZJw誂N3̸边qY܇_YQV~wy?ˋБ*R^I]{$ I*^l -,p ftx d U*O-/-S28t %w]9ޑi0Jk6)ř qCF |eSץm+9{˼r-T,gh}44+AY&*+;ܖWn>̷\4WcZ? _MENބLm֏_!wuNl e$Oo[-wM>$h1"27z;>QHkuF3 Ǧ/v4Q.Ar;ߋP=s,/< <ܔ>7>5RO[^ (0UrB =dg C:SH9q w eTKo|ME=$=ֈf˜51#'; 䙵|iIb@`gʷLyrUv;~{=e9zs%=sbCA|ewkRHEN|Fu"5RsWr̞PFV+Nm3Cf>fhwYD8U,;b`Fʽ6#F۳˥- vgPQD-:5GvH:dOiMf2/A7o$Q8u>z쟯;yk$_CfjGѰgEZC7/K1Mr$@P!rǐUi)(zKMZd /OM Ÿ#󖇹7c$MD(E5EnY;N=HzF ¢f%ѬR;N%1Qq'ăt^Lё9PkQ]Ι ?r>rIifdcׄrHD>K'1,锻 ;=ʨV43WT&_-lHMO^&p_&!e>[N|eqM/s| PޠONB OIHӝ-5&ÀobX$s|!wܦ&-b23F5r Q@h[ endstream endobj 446 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 447 0 obj <>/F 4/Dest[ 149 0 R/XYZ 82 222 0] >> endobj 448 0 obj <>/F 4/Dest[ 149 0 R/XYZ 82 222 0] >> endobj 449 0 obj <>/F 4/Dest[ 149 0 R/XYZ 82 222 0] >> endobj 450 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 451 0 obj <>/F 4/Dest[ 149 0 R/XYZ 82 222 0] >> endobj 452 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 453 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 454 0 obj <>/F 4/Dest[ 149 0 R/XYZ 82 222 0] >> endobj 455 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 123 0] >> endobj 456 0 obj <>/F 4/Dest[ 149 0 R/XYZ 82 222 0] >> endobj 457 0 obj <> stream x]monkr_VksEimq+Ŗ䳜^}wvwZ3y8\R?UezƋhka}~o߿ce%˛3pU.utSm޾EOq?q~3Im@հJԅf`,Jl+QdŃmɊJ,nq$⍆`8j>T_//H/nbuqS˦lA:׵NJV,)YQfcthy]B,jqy!꽻WYUeʪ&e&AU+]TRy^|,/XX_7e[*ȳ;CH jzQ]YT-k'R,+vV#7I`}f~ѕif1:{fށW@eT=A# -)n70sua}Bb1?r$⭝9ū D^[PZ/H7tk~+}۝|hqg^!E);w&JԢe'RD5BUV)ٺPTrC|[lT3e5dBd+ţǨ(a]w;4InCo7j5_FN?-gvQE|$zQ, VϜ}^yr+W= :^}a$zڒ3*wBID }癿wnֹ\g8<~aEOܘikP~U㗮zyߡqwV\SUUkZ'P=Dԉxke'XQe%e_ôw{gnOŞW߾Q/K53&0]0bN:aNPOܤ_浤!]SIC ~lHq7oU^7RCiUO*>eĜ>jGkUWHO5/k1sb4%!`<lO`-l;F,4ap:HD#y+0zNgBlX ɫq5|譓.;JfCb_\F/.%CT֝ekEvMť%A+6fڇh蒼?(wv0elvK16 7fW9R]YFH$5DU²#D +=X^-d݉2%)sU);xiAtgtv`Ρ7[xXRMMC3NG7|lcrBtY=F8҄De42z7y-弆Ҙo҂b|lzH9 M:BI^8E)ɴ.QzAF]OϾHAUàrv!ł Ż`eeCHаd#ѪFj@&Y,Y튅0\dhL;Xȳ \3JIiAޠǛrv?], QΉ^,8:9B6J*O+2uBAH2X@qtFQ BbaG'ģ T@,of4[(0p.om<  f F4)WA)v*>Ol> {nԐM |}+k "mȚl}@r@1o{ұǒjH.r`KI\9%1dZu,**{zzSUeOO9VJ2T%|#JxCdD%<Q 3 lx]f (Z!සU> stream xێRka ![)E9C/6gd U5UU<]|Yu>.?{?}*/BL3auE\63 Ui.~Ͼ.nm^Ͼyqy՟?Z_Y$TM QϓMf^Uo6 #I\V3Orlz/BN?щSd^ɶBΗQzh/$\v.*2ucLko񬐻Ԓ;ŴJ:zdb2y\lB|'ⷧՋݗ7OBCM_޺Eʈ}u+V}>y"V5[=[>\ &T ӭtk#'3KI-\۴v*O4P\#q-Ƣފ#w7?o޽}S/_L}uޙx'L×O"#[h+e{3=Ϗ6 -д֓Mh:rjǏK3a_~[נpYFidW߂٬3 kMt4ˮ=UV*ֱ}u횰' d;ͼy|ia覆No=ƗOJ3ɽjA3եcgOPY@? h?ަ+mm!Ɛ6Kd尉^ЂTG̵&B+jRdlzc-UМ^R"0^{x;BJkF 7 RFڧxTHj0\]F=Wk^v`ՈZl_[PƲR*Y9m `6[$Al#!АI!hAMVvts/,UGn$ A^鎠[}>`% "E޲+VǪ#X>-paU($a2GL=AQV6.$㩲W# ц뫵;G#buvKJ+Hyaw>bLŸ)A8\$+3O_:2Ylepم=]Zj})x:ʊV[q0ǒ# cH R$!d5~!*<^}WwI̋9Cl,j9g^U#_0C23aaF*faS1nJP{a$YqH fP& mepV;KKh;&`FAulk܃<O*yt [7RT;#++3$dbG*;l*M)wg pwebenjC2<)\+a+ gwT9r6e Y{ʪW2S$.IGK05u:NMl*RSoC:i=^X? Xc.a72PW䨻Lp4p*X x:Vl foAycLŸ)C)wSjY+YC2E9ϡ61Vx"{P 2P#_̪dӎw YJrpHRVZcHqKf nbpæbܔ*WI ɊCƪ;@S .OFo L*5W%;1r_:jUP# , qS`DDf5hHc69= ')Q]yOJ;3\QWH#_4C2zهc._IfR1F7%=48,}(c!q!1V8d[{-m0ZZ%;m;ɠ#Ng|p99F*faS!nO{)$Gi$kGpz5p+h"OB*xBntE V2"  !̈*WڿNaT،D8/W@_]X2ʷ endstream endobj 459 0 obj <> stream xo vUE1 MZ]# n)-CߗԐ%yW3dCҗ2˦/|'=>7_R]?^^~x|PF_e:eeydt_]/?bb^~?g_>>|tyw||Qͪjn0uS?˨.M^:uYet7OObUzele8(|N&raF ƽ_ʶI\R1}ǹ[yZI7T5rYlʚqſǧojxQ>|o?ݏ꾪&uXԭ|?~|\3BZiy@vgZӍ[3[Wf[s̊BAʍ|wj3@]9O~ڸFmd[|ٶ5ULS?\ &=wӈBpSH_CN =ƵƧAc͜ZtVΛ1}+AmN))!|bAyH|R_\m\ʄdz߶*ehh'~翼ޮ@C]7`2XPêܹy Rq"~$a Rjڧ? ԞRq* fu($L$R&*B,/{D1 8dC$d)eIJry [cc~m4 &ɸA05M$&*K `iH8u- 8mb?G[cF[ űR7fz \ϐ#VQR"&XA uK~ HT^-;:`rƆ~朎$g=e-ck~u̴&"nsuB[EYalGk>x$v xF~fUnW@ GK:*,ŜZ%8r9kk)qIJv^"+KdI:IƗHU0`D a r"PnX",HHo]D"_,hk`K2VֶDULod.H()UEH%2KCA%2//@r ǰi~uګO 7Ҕ5lպ2נ2f.2 lOG`/ axv*{!({D#lC'mUs5ft%٥݋ccno̵&A'0Je$Ҏ0Ҝ [ -8^4$~ *0C2ټZa֘ad¬ielԭ$ 8_%9]eN$Ɏ0ɜ ; ' dHǤ oP!&9ZS:ʒl1 @$[#q* 3;Y {YLTp(_t5FdqFm?GZcFZ]黷ƶ֘i`MrQWC2NZEI4`BHi8[T$pXqXAӫ9ZS:ҒU-1$~uiyb'02Qp(_tY?ChDЍ}(㘙srƌ$c=e-c[~o̴p&!hZ{BH0e! LT2- *{Y8^2 9{qzs!)eIJvyvX_3MI2niPa(*?V$&*K `iHs^ XDHfc)s ri*ZO6?Ej0nNq; ܜ FBEt֥֡ǰ(eyI qږx\-mkIzbkMr%8h%;|_&ǁ|қAM4&b͛#6ל1foi_RW.Y_;dHdt:ZEQ^zLXD64&+CK=%KskAXCh:ƥeH9/kL(K^Stm^`d:SQ3*WEAѰE^@5[!pNPD15/20}_kBmk>5|P!{N:W[TܶS+&4z_*`BȕX8{s+o\C\m޷$ je.=}`kBm’o78,6{Vd-^Q4=aK$%*m+/DѯU/:Ne['_Ԝ񕤼~ۇUt5ʴ%ɸyA'0իs]"W]! ¡|!_A iQTf@(m9f֌X1E<`&J-7=}tDZT=gZSfK21UQOP6"rr%Kg IXfB+"Q}քUgXVLlI*BcTC v & qJW2`ˏQ$Y!C!l(!)g endstream endobj 460 0 obj <> stream x]ܶ˝V}]:Mq^MpܵI;/CR!;5s8Kq_no~V!_>~7d'D?02jc?-Fҽdbvg{滻7_MM'ĠnY,J~蕩ÛPwhzxOz\UXU*h^yuĬ{GZ'g1FH2ҝ dLkFc)֤ڼP_^49WFR׵m -M #^@n8]>*)`S?jWq6QeRgl15> 58,bZ܋]IksJ5MH}}<4===^.rR "S%۱|ɪt,5EE ;;e6®F .(C5Q;,g "Ԣ,ǀjKpJp3̼]R9Zeдx* TIeŸI" 5ncAfȔ(+wd滟ߜ%=??_OW^Y—_ #'vAvT؎Pn`GQ8A&ߍț -k^4ftfd<7'ߚ<<{a]Xŧܾ\ "%F-Eq.(AA|4"e .$Q7C/*:Qx֔$93/!v=?Wc)b"{diTQˌ}$WB+b|uOsvA4jQs?WAZ-0j(J2SS=!) vDXA2|j3vB )N^ A* OH1%xNK乭;mՈeU~4xh*J hivMP$J#\& MbG <]:,iMIR[n5_UMc9bݖxr#ءd xz*REl$SNHLp(_7)LH^gA&e,Jr֌DR,|q73zqb2wr_<XjJQ0S@HPCq<IX?@?:"LoN(JR0fj,E,jc(!JzUu"'aEN)bBi^ ^5Qz2} ƌ$cq `tJĪ;}Q.ֈGЊ"" F(Au(l/D1.xt%)њB5#(oFPǓTQT I" &)$! u3 `FHAfd QYHt& -Ci+E"wOEQ,?˃:')5xjMpJRdO^ثѾD<]d'{hd x*zR)I0K! dT K8F&jbdQcFGQ3%1]w\nD!PEIQ+ fjG< aԎTuva{yj${sU4"c R^iڜJS#^<= ׮EH!rX':vYI0ЉH8v#Tv]Pv"1o)Ak/,y- ^na8'Ԝuo z㇓ЇA?ƻZg|n+mؿ{_D|iK?zs)[t7v陸yTS׼$`emj5g/#tK'nAnT-Pn-}Z=]ۇ̔Pc6-`r3:L2rXJ=uj;;3!%jJ MWB$nx{v8SnLpMF(g]`+ʛ`15J:<)M'hw֔$e]U(H2$Urm$;I6q$]bS$e}&>CCHeXRv#$9R}ƌ$cme0r;\!PEIQ* 0q@b @4Be Wоx!5(I;3ZqfFDx/:X'aP HŠBAh킲 "z^dRcFRqwj4Vn? rd> stream xZKs6G1e#drJjwfgou=-9kQ}h{j!яMJX .$":W뫟ﮯ "Y"+tIģ\1CTL>;6m議o~]E^_v՗7Yyyr~>a)T7<:JdGJȣ\"iEsLJh"K5eRa9|B5/J&q1,/j⨝OsUr=_c,5XŰs5gyT(m,W6]y:ƷJDWM* V9j]>AI,9 \EߖQol yyB)Dȿ6H1ްt1sbU>zvږ4S$ cV}-z۷M 7 zhy!S uW7..5`SSMK1 5W1fW|vcm[LoyA=Tgeulɀv$d<}?uu khC)ܪqm _ch?8 "<aE5O+H$W & ";xGW-/{7C`2rQC̨\Q&xPMl;%N/`g',QL08~5 oȃ'5ږ(W~Vlӵ]{r"W)]{9'hXB1)&̽O @rFR֯ѐu}rM6d&Ñ+o~!CXQ/A>0.N(0+(RuK󯭃& \GiP}-o>rT,c=G74w@kZ8j6=W.`2UhN3=jОltFsD^Km-6X0Wo>.]QAK`yґe|#ySѐfU7^y7-h) MCgd-$e29S~./ 8&ZZѧ9 aRuz{ q`r3(0ڪmTAJ%$/}&"X&:O9|@IVW>ճm-3Ƌ9]B Mo 2RB3%4,;R߂%r r1hWi&L #XZBkKzmYS SmG EUNp8I;B9S{ R4{n[^d:*耔ױX,a|Zw<=9(lzA)`D%ϏrrD3]ɹBPYux$5&[{4(Ɩr\/ G9vCƕA=o#5UY/QP e@Px|n֤;ո0?Ɨ4 \] za~Ϗ^0R^0ԲS!^aNt5{cGP!b18Z ,m2a4c d j/<]v뗞qezk)l1k졌uX8R[Fx*tțNdo5 6^LqK_d,#uʹ7̀K +grƓf;awV@D=l{|vqxwW = 3,1cLãslʕA[W>n%Hr3Uօ 9?\EgҼL "3z4|pG0MxhSv+`w4~M.|TYnf&r 4`Bo],%̣9qz+$7j6;Mw gհ9.Rw{Mh兀n~빉#yY筼, <հ YAu$2j`Ι>%iUPJ(ȧxȇ z(֏1PܣzXLf1Z*q!6 cDK~S,swzsim6>Or%Xb}2#Β\Ba29zy$7"5*cŬK^u v6if|+x8,yj4> stream JFIF``C   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQK" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (k/j gv S)(QU̚*Λh,qJikp)((((((((((((((((N&׷֯qn'KB?Zs t ~u*qnɖ$Z( (((((vKrubBԗzh$ՑwTJ׶mpF %QEPEPEPEPEPEPEPEPEPV'um#`!u&He#vQɴ>8'U~w?'6(E;i$/2^?y'$}=+^{k-c0:OH4Cב%RN3ٌZ-D0yOŨ3CݠHn0# NJ*QHx+#`U4xJQf}5ױNjTUŅQVfQEQES7GFhedbHF)ۨE8F1QԁQEQEQEQEHaSy8a]":(Š((((( .@rހuF4-;K;̟f=+mΗYI5QUGOZ ozם.U{iZFPU AYA89֊ʰ##qz&s~+^8]',`ȿ^{^^{]*+%bðnp81t~g3EWyQ@SFڊXmz;xb|V1> Q3qDWӮwy7޿8θSbwa!JUU td{C)ŮgxL U%Gdzi<3„Hlr5ڍm.zчb+׫TW\8"{t,wH?5ч.W94̷GQE@QEQEQEQEQEQEQEWSXbk)\2`fj|!nkdqcUTaT*Ay*qRUco%Jq69dR}HQ_Id|ٓ#hP+_dݟqf WeQE瞈QEQEpƸ;gC?v4QEQEQEQEQEww>%ojہcZs& jSy+YGgOT 򾣩BLq/Wh%ʖ1P<|~ug+W#j\G"<[_?v>7Y݉& a$־_ P[&v(TŠ(  ;c%A"kXNUa\g5 A5׹eu[r>*vsŮH5E3Ms(֕S(ʌm+SR<^ (- S<˭ B>pǨSw;|jO<=}kN\Z8'WI^iWjmuEWxAEPEPEPEPEPEPEP]_>2yL98WMv]uفG=^GpG IE{]XQ-(u/P@$9*ՒܺxԛjWrۄ؟H';ٔjP~eG}=Ms>t[{ȄHZRIjïaԱ2p,at9yVciQLAEPEPEPC7Y{IGֺdetaGq^qSyuf8$D?^ |g2|LH6e-Į䊆5i$th:nEW9QEQEz #Y@cƒS= [>XnL*k%ŸD+݅rlUR8 C2$p{2\X.x3 t%tyؿ4r߽\7ʹKĎ;ɒSaE^GC EtQ@Q@Q@,'́K('%"Y+aЃ+v91XWZK?ڨ$yX)?:97sgH>.$ZxBRi[Qeg[aoXiw䬓ޡƸfv,Y$IEpSj*ՕGyQZQ@d1¸uH1>kg+VJzu]*{ IZ~Wނ# 5#ta+S<޴:Hpq]Ugx Nw~uiv]m'V y5#cءӜs׵}'pvF?=yΡr]}P;^Fgc՘mythƒ=jUQ[EPEPEPEPEPEPEP]7/ X#`v9jhtgΌkUE2# ݞ18P頯?3I]2}"y+]e$Dt0Ļ%LǠ 5ēQej6|S!Q\5JI=i+ϫ?i7.J (((((((((kX́ʁҬKq 8f3sRIkY)K,BVu°4Iuomx5'ZN=)뵁y_i2GCI\،OJ:Un (((((((((Wwy]ʻU8ʰ5T#>1я-pbpJc $ATX~`Jc;Z\ZfOLVK={ r'gSAsJYz55-+= ((((((((((P t((((((((((((((((((((J(((((()@ EPEPEPEPEPEPEPEPEPEPO7U5,pLv>m?݋Ov=OQ9rEÞJ% *7!f {hmbADKEyҩ)N J}'OR1i`~o!>xp(:Q*+__.|JN?ڲ+ьJ..(B(((((((((((((( mu,pFwȜ%c?_M\u4bwPPE "U mq Cڢ JEr5gSj~%_ibO;}X5鬪Qe#MoM:msd>һhUeÈGc6(((+wMIG"pG@+W "uP:m?g F jIm.I3[DzQάQ\|ʭk7x\ArrQԫQ^\߉1M F,ZUV(Ä(((((((+WIẅ' qzUnx}e oJUωMz] y[9zU$% g؂%?Z .i-@i:5Z3^][Ǔ\ԵypJͳhF9ld"]#|4vE1]Eq.]VI鞿J\]S#B:]ZgL6SbMXuj[T9X֚A6aEV&EPEP]j;XgGZA^>x@cNv7#Ӑ@ lsrsjەuR%YPkalNsY3Fb$A"Qԧ|,eQXQ@Q@Q@Z>k+`maKC^yVlǵzyZ£a4w^I5lǨɮlftƱU!Suq%)˹ɦK#+I#nv9$4IAyV(L(  9_ֺ*t E#]5z?'O)4* =EiT7܀$\ч~5uEu؏bd4Z#!㱧?pT7yP;<`<(SRVgYus &i׿Ҹ_WS)!F%Ρ {oP0T*TT5{u (9Š((((((( foϮ1)>T5jn9Q\ l1g9Dvd;+>a;\t]qr)rS:&FN ͩn.%̕61b>B\ Š(4 ( ( ( ( ( ( ( (:]-۴c-r^$ɩ^IWKc̖ muW,6DL?8vԧ})-+I$Vcԯ#'cs9$ψcBTQEraEPEPEPEPEPEPEPEP63ϯ5Wtb:pjzk1?s벆"4ňJ:+7dFgqg?l`S^H@ >VGn_q{qr%}ELTgSJR^( ( ( ( ( ( ( ( ( +gFmWա'+JV$iOTrWS'(Z_Q#;-Eu?A?2"O Bڭ$2-fFsZ#Z8UjٿG 7+.Jٿ\UB "7eiNj|&U(ΟEEVAE]lP V"̟ȮxjcWJf9j+Z-|5~&__9j+Z[P6O:T֔uبɨ^ ? ?!y5??)s|-p4^ehDrI@Q@̙`3^ ?Q^ ? ?Q^ ? ?Q^χVzƗ5 o6H>V#V*k \ @MEz*k \ X2-4Uiʱur Jh(4+!;wiN˖;UQ-|?~dEt}FoQ]O"̟ȣh?OQQ]5`X&@.r ~%|R4&=P*U)ٿG 7+RmJR0H(xb\=̐c sQ^ ? ?Q^ ? ?Q^_֚-)8eP k?"XSF΢NٿG 7+?RkJ&f]cN@?֨WBiIمQLAEPEPEPEPEPEPW?A[?A[xOgQEtPE#6T_3iKpf=OEWŸy!;_ Կ'w]B5ۃݞ~;hO4J+J+>17(<f*P?7!YW~gQE'xDКopעM@5Q@?+{_uQEQEs~ogэ]%s~ogэ]%YE??Wm\OşS5xQ@v>@}w~eEW|QE#ZכbZCfR>'sQE枩 ֒W|W|\B;D9!mG/@EPEP+AzoaRA^aT;#,(;1_V-mxF[+_}%Š( Š((((((7ukȫi<ɜZR6^U(|*i5V G/n5&s{M_3iKVҗeľ h˷VLDnnN{Wa5<4;:*ڵ?5?Gڵ?5?_*v>^AN?k>թйߵ@.K##[*Tk NPox\EWilx_BͿvxanVŵ2ygq =k5?ƽ|ztNڞ6;V^h+ E'п߱4y ][(C\LUЅ^5?Ƴȵ$&ik#s$u泫*rJ]-hԋqfJ.W?TQwB~##\?WQwB~2}&Ʌpc7<4E-}C:bfO`08ZX6Կ⪣ Kere8v;*+o@MKO*X6Կ⪽Z̾󲢸X6Կo@MKO*e?p{Z̾[cWI^\[hA"u+3JHQJڷ?(_XkVfI\OşS5iQwB~[.>ł]P_=[̸E Ѹh袊+\uvP}$m*=ȔϧZT::R傻E'п߱4y ^1}NE'п߱4y G0}N5y+R0xKhShqAӵn}SsSk5y%W)]cN4фݙ~OOOO>K'o~֒ OUu|<C.D9)۲i+7 5/??`RSSWi2ʊ`RS 5/?=i2FU+,Mb&9)_FSOOןQY5v_}SsSk4}SsSk5*v;~K2X◕Ar[Km!ۘeGZȯVj 3ǨӛkQEdQ@Q@Q@Q@Q@Q@_onon?qǐQErXWsAc?κpƉˍ(>d(O iB[$BZG!Ы}]QEz|HP/]Gď5g-rQEQEQEQEQEQEQEO<&VaxO<&V}1>gyQ](U9V} WuB5}|wP?#@h>?{MxŸ{i(_%jF-tB+P_1h(#\?WW\O (OF9j}Ez5zn~oQEzQEu?QK+q"?_ Q_+-q?QOOWgEMHgQEW*9JJ_'/w@Q@Q@ܟRS]%srJOEtQE#iM ?] hH(#B(da*I?%B n,GeQ\'xWď5g-r|HP/@Q@Q@Q@Q@Q@Q@Q@q<*V)@y!XnojJR[2\"EۿEXmM {2]βBC P'R4?u _Cۺ!Ƴ(-}5Eݝ݋3'$ZmQE-Ťm&17*qowY?}Zh-}5Ehn?dqC>w,mf`{&Q@ۺ!ƏgYPAk7W7 .%@1W,qP@Q@JۿE5&{nohmM W<=m75^99#ع[D".v3(wY?}%ۺ!Ƣ v+0Ϯ PEPVMF/*3Q@ۺ!ƏgYPAkwY?}w[S7F I63ڟZk>-}4n?Ϣ ( |SK &)2zb3L叶ۿEW<=m75^99#؟E6Q)x#gwY?}oqƇAkwY?}I<\\LJ^F,5PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP endstream endobj 463 0 obj <> stream xy`E'GII3mzErT_KS@.AnDTD^_Q9BJA(r^@ifMI~yhl}nf-nq[-nq[/>I;8_^(~_va=-~c) ٩׭[;%Gѕ+Y?p܋X~[_<ӓޞSb_bf?xKnׯ0s2s[ϩ6n'ٶ([9yw *sS'SL]ss]oӖ?^5?~DjB$ـws xӶʬ~֫g&#)y7; .~d_eFʚ@gxWLCw̙-J|Ӗub_ |3hտ;^=><?OL)4'{^4>pm J>q1a6BI{\JQ\9h[z^V槽wYx;BkµҪ6 lkĦޑ- ^eW< gCȟ[%\ԴI)Yhuo[|_ϑX -=(ɼ-[4}uAY~_ ^b eu ^*י[k=׹H}"3dgЖgVzp:ʪyR[QCա``΅qm |FlHMz`g/SX~P>lOi%ؖ=YoC#J'SSlJԼ{Ǻf}QZ ~v}اF37;G6$?^v~;@bMǜӏFY^ɆHO+C'ƃEL}m -tuH(A~WR(ǪeiHҼ3Hwk^Q*~xS8{=/ne[{u8Hk,k%\6mV/ż :ǏO ] n+(/Dž>!U Ԫ[Yo$(ɭ$oaIV(8,E޿܏U!d)5C X Q\tXH7vr_lQtj|)ص r#,?|jRl]p"_u/?i P^t/ ҐeWYfWE]pKPKes?I)qIiG?j{̽;m yH'SC?,+QL}ozd1Ka.4eU*׳R ώr t Ri\cٹU'Oڳa=Uz%%%g6q,jo Y2۲D^킵DX;F[i9'a*y^@aF, {ݘ?6υi?9]II_G68+5}[!> (G덎A'V*9[룿;7JnqLwG-nq[HC /o&>%4sVh.cl Bj7bK,je4c 99:n<4a L`]jnSahlQV̓ |o쑓i1b<H 57XNƟٜFox@b<  o&O/頛3Dp0Et`9/3e7NaF`4whcFɍč%' {IqkQ %.ҵ(u"HrJ& @R}H:VH O4.WFL"%?JZ1d*ݗf.6xW)bJ3gܕn73|)wI|E'Իj5խz3 J+lC;J<OOONz"Qb!V/(4['LQDdoź4W{WoDvsx2x''NwRaaz2w<ƽ E)s1'>6IB2;enćExz|aL<$*902WjlBKQz2յ)J 敦4ةI]Ls9м`4 XQ VK.3Ӻ3/EgzN'͕F0 {{*lKN{A[9ƀ2ƻ`°:e5E wgӉ3B-*e+yxx\+0Z'@F"zZ6_7,7U P `zYxau\O9oc~4D#UV3_Is ;R=?yUl;io<#T {{6j##a:`q0!PiQOI3!ػ7:P"VJN1Ruݏ~G =>c^i$q JʱWBj\J[9x-"uLQg{S".zsDiA) ҡ5lP"_b[MQe}&n%4I R$͑Fm*r+S+B1*:zzWX啊v^٦4SՌEPG-jq&o܄i38WOq}!)~`Go?#1yg@MwBҺ]_29DbP*~ l(E!EFi'~@2q,Eo?}`Ju3iAgbɨ:˝7'aohkP @eOvfRI(jãJm+Jev爯Xkr[JUO ١4,^#PJ@&N8I6UsJXu +^ f(զC3?$(KgJ7fd#n>83hvX %b[j8T kެQ:Myma PzٮLR /JinRv y~nc_<𨶽Rui i.2nV=}ԡJ$rs͔d0x{XuR"Ł) ׄL7J68)T, 4JIWR0]<1m/2v?}qoyWAww`e5DBsnP1kM0қ:GiZ:vaw9S2Lx f~:|FIRٕ:c?bWR|LWt6fa ˼2ݫ5=xlw//F9敌521=tOGJ! z0e^ OX.{͚XRIq8 { mqRFi5%/`smcOk5JQRkHR ˨xxb~.k@7~:,:MiZ]^Me,D e(!Y vֺ%(6>!klG?.0m rl/%bh(4*y'~A&]|4KPIQ7?.e%U ǠN냳\ċk6EȽ|X܋̽ўAR`*LW|ʼ7RěXǺ%4sRg|G%-@ԡn%^!c%ة`)s+2/e{ Jcx Ci2~ 15&d62rJcJ v2%ƉՄ'%IQb4ėf.:(ec(Eś ⬯x@)\QjdQZzc(mv#.>M%ݹQj6$&&& =#*Xc(86 SzwPFPxa(PbqP]IW0tPUmkjhGM0;ʢsb,绣z $ٽHw!ҵֿGq?!mGA&hr#tjvo#.0_FP;_#όPW.+.$BC\C)s%]:ivTc2ꪁGTpJ.576~<f9 1hn!Vٍ!!nPWrr3<$$>X:j E(37#cecYpϠ8\Iͽ{ 6t}ARī7qF4A* `{pp\RIUT!L!cʐNP #? w܌2FBcıy l5S5 ʚd-')eph>YKhbqfaH ޽p .b+ 㡴gJu_4S2>9?ibUЉ6oO2#G+ eppex{ tp`HWY$%r#G(J%1+GZ mf)Jy499>>;>Ѽ䕬joАc(MQg-Cg5帢;lFR s7Jn̊qFw$>>|3X=R,ʣy͛lЛ{ə8dvk`dVl ~-nq[-nq[-nq[-nqKSq Su>J)ěé*0i2/[fYuoX+ʴ6_^f;ts{n<4'{i4sh*67)p`qt8 ~ѻ7ͻE04s#OurTF. 7X=8 ̽f'q=8W{piR+aqFIFɍ=JHZ$-}.A)8TjR5kZ( PR$~HUbX"- <4C;Y_ 5Lay1zWCE{㗂3-%]*U(BCGUϊadw_P†)buQ幝[ˬ3͔ϓ10wLRJ\dۄJ+"\+v'{wOGw,Hփu:TMdl7 Z~xU_\a[2l$GrQJ?WRE<0(Īw(*4@]Mdt]^^LO2ڬtBL'x\qIѼ/zĤf :ڜ_NqbCՌ9޳~g4G33.zWZK1fW]AclĺaMQJ>;Wz9鮍$="7oDss6 AMQzxM2tSBo"sEɗg'_E9R dg'ҢA)`U?̒Q"j&ÓIa*j"1~4.J99xV3^xD#JIn=~o*Kk4o_^fR`(֏a mG Ã$i%X'E+DXUcݏf.',4 Lx Hs{м7Cf16y'UP ۭQe@sT0-i 5CQfh]SO T0`C.϶w$9uq>@a-%y4c^Ql;7wt0Qj_':""~Fˋ!`؄3w~>&;[Ew}M.+6 94Xn >hvSu{gR1Qj}|JyEiROyz [LEʹsJ`MS (Wb_k\Z-JEqC[V8J'!JlXB ;W&Nưq!=L ?tz|_H/XrԼ݉Sw$"ʈ߆ {=r_66~Բ>o7Jy[B!x">e0 ͍v M 6O.WwT'^TRrdw`9oSL[Y4wچK@Q:S+%2scvS( -5S(@(ɩJ7V7ߛE1,Ll̘1xafsN_9 ^ zazn G"N R \I?wРp_Qw^P/˰2|3[PRgiЍT̑EDE ɴ2F9Yf4Qq='0ݚj7 bAo>=\E͛'0P1Q}t)@؛ t0},D+onk3y 8yRYXGPj+AzGk++5G5vcˑ999222_9$kvr.]㤼FAx?jÆQ=z<o3"ϕbڙ3g.[|0NQTz |8˗.l3.<|JQkOIqƾ}iG 22{,(@3Κ9JeWfkf~z4cfSZwň'W-]Of2zjwt @* }&($z`7QNv~V (Aׯ6k}Yt>>hHų񽒄(%?̋dK%O0CoLC(5k($Y>jo7C*1!؋h1i4ҮXCe5b(vc%Yj:JYC)_7 _DBˆ#tje 'f+/]яޙDQqكe9[.<8<^RӲ4M#,M,5/,^TCSPA@EECwgYf!3~yWJI5(]X(McZJ[e%(PAJ.D}P?y,R>JǨFuӍ$^^xcp c(D)Ms/7a n>J87Keh,(ݢv=(u>OH҅VcP1PKtϥ>]\؆Űt bl14-nٲeP?nڄ[Q3,j{:BY(d*?DE%޴z Mo_dz:1#tQM'Ƙ"w'#_T4VJ/`p6,};)J؍k,!f|jfY8|CmӅ*d~  c!U^&PO#`mj6:`W>C|k&k/49,/1Ds@t>G9UQqTgOexq%|Ϋ1afOh{YF0 WZ\eBJl M@vz\@ݵ8 ?Cmj#1zr1b/[HBʊFBȠ"߯7O(dO)l]][)Jf'f9&wSa5}uG]O+O?,N=1Ec>Gl'pPnYPs=Ք(KG5RQEem(%NkH9WDMFQh%8ߦE:JUNNvMW8{xwD-ڝPSW8yv?j.*أݚ'ytf7tIUF39Ja*7ϛ^6H Jc|F[[Ҿ h1u%^@4PCCc&$tr: (%=]oMK@|Pf@^*ooH_ 2F( |DIQ&Ja PJʼn&J]C 7 WG㡄J`ԑx(Dػg?B)qH81> "Nҹy6ŻnSTJNg0a׋NCxotPOz(>Biw>rQ n`^,|R%X(6%k?W@XpOU~tn}~h#mEOξ]ٝ WcҩMGF),( =BO*P ^~RI(>L[]xފB։KXTӧ..Px6\,R$f.7Bm Vr4dGp])oB@!gͦ6]fyTo~Y-l+iՖ9w7ELGf.@7y֊-s2NZÁ'shke-yHY,a?'ơ8Fv=q۲%p]GZIq~p\IR:cŕ3J𘎘8Ḓ׵vtpH#ޜ'Qĺkĕ{-Iqu@Oז6Rv]9ݿ!먬(/=BiʯR(eVɾhD~%18R tE#wP9]9⯿^6ynȻ͒n랎G4%NjT.(ژ/NXPJ{|}(u;I%{6/Uk YEm6|<ծ NE^WR֏U GՕB)-OV5PӲgQ{u|PvG>^bA)6@/](uHjnַuyiPZ#\Rl|t.-bA4Uo7' 1g^)PIoF),<[F=-cE\]rQzSPMskwpl($VPYcdahWf'ZD^`E)=6H9(ݑ%aE)$,EC -6Ş_)9Q?(_Zoaii)ّ5TmE) VfdVVRK(`",-mV= B N&CܴنL.R7OoZ?⋨|iC@짞,fay(:p/ wd=%{~iB;GBnֻݑRvys81?v-$ɷ⟶M_^jwF)P :uYxD)&+JOs{JuGۂ׭ ڶ+(E(dq^7U b+O>z6=^Rդ =lj."2rmZ0me3>/{t@ uǏqv;'Gpn:{3.p`@T}Qw#~+Qu- J([~P++UqV谰-8,.2ht9~=yѴrt$ YJLh{p;]Np< FmF%2&Jk@QRYUUY^;APro;s#ֿaE~h\QAPrw+ҭܜ+{>n.VT?x9 mNQx8U7n Q$bT%wQl?1{JGl$YS'ҋm:tP:@W&2͘N/J0t21.gL5ec N=ύWri#{4LOPyjM-D"1WR&܎B h\6Ȧ  Auf4C Zll+dKJG;;(E %oQ2~DEGd)][ST+5e͑mthY3U=m {t[e1l +]vkff:ĕ4:8ȯnw8nOuLE41ƻIi}ckt9v+ *\ r)R܏DH"44J= ~=CD8,ҫ֡5RߵPZhdQ9|%;Pjw4 W"P:U"Qb8aA),PJk}ݼJ5?^Bi,(6MCuT"AC%H$:|,> 2#hJvAw' -Ȧ L&rwGh;""i=5]66eZ*Dj=B>Q\,A%51ؑ% ջKT]=;d#[ Mw+rK wc}(dGV:h j3i5˼Œ_ ٱlj7: 59FJsWb+cf~%&p7-_)%vSuј>9<BC$04J]70JvjePZ7J FK; W5W ҎJAQ*x7ݲQ8i&J8'D gy(a H 0NZ$JI^jA(I ?\Aлw;/?#A9w%):TV[55^#ep=QGI_Ȃl=zBqv|8`<3F(v2͟Dgf aR-Gݤ fԂPȉٽ>Yɥ g6DP(fgkQ<"q7)cG%5 +0 *Xn\#seqYaaa<@:G&J秄_7/lWNCթER0ĖO@ t5˴p +>FE%5 x?\@1Yћ?'R[mZs߿oY'̫d߅wcf['8u x]gt/dk@׭r{Wܖ@vPÉjw6wcJDpO+](ՋTKB ڌx%t=iHi-%y o1y? =t@g`2t`2̆pZJxP}BA K%"(au9PWW= (aՠQh,p%"(42 .Qw )%лw}c],& @` | JFIwhj9 D0ڑ?RhtSTrXsTr@\4k;Sj&c(=3ޯ(˓C Y /3MAw!LR ziEK$%S{+l0(a4TE x?LBGxQxP-s| R }h!A1$6y=R)wLLL^T{\G(<G ~ ZǠJ"(1rQZ7}Ƀ4J5m'KR[yO\'$(ҿ%ٗ/HNۘ[>lIʭ$'%x{N\4t_[J,lL@,I$6FH,FpjQKmhvyCA K-%ݢQ %,J:e1BA K%$+QtUJX"(A K%|t["ͅ^eSoFI# J㿚s]+pZJ- WiSK.`KʜO$<?w]G},VUJXj(u)537:(Sg e; ;TkpZJog.*9cŋ'WmJFܓ TUJXj(w~Ll=)8[ q Bɳ Ӏi"Z!\V_=ol 2OKB`h+X+*P1 ߟ15SҐW^y'б8ߑVW= (aUSbfK#a0x0[0OfW>/1Dt'qxѭ U@s/""l]0ȋn?A1gK"""""" v% endstream endobj 464 0 obj <> stream xk6*:Q(龥w5 Eq(dYdo$EH G|p3d>ބAry7#\woo"O 퍀y', tq̻?oeޮ=r׻װno>&htdzeѷȤ#@nA*Mc$JIDA(P -~aH4pZ4~lZ65MDAaALH&"U(ycp\ap .Erih J\Hlxu?/SaF>DAOa5J :\}}?Y}Eeqy}:z]CxD`ǵ`w&W<0=b xK'g\T+־/7oy*}8ᮏҧ:"wo_*(jW=?W9Ojk <F"QA2݌pT&j-NjqKh?X,)M\Q)/ĪF8cq4 lrȱn% kD*MYIܪ(`gDmu[=&$8=kh):Mkቤ֐\#.k+[U p4|Cp =푒|r_ G )iĖ1@iX@!+dI^,X4MQ pW܆6YO#g5YR+kZm#7PeDX0lGc hA3p)lц0jvΠ[Z֠G<3 }Yy:-By 0g2)@'Tn[{ AlqQhGlI,GAWPKB,)@$g2UZ;2G+/}Z8U%W'R-%;O?Zw cL1t&fmPIB69&~ggk/:j234߉< r9ub 1[{މލg}V`EXgE".50NœK=<d<O ^B=Y̬fKycY?3Gio&$[GJ6n\i/xXMR4 (zQ/oϛL`L Yp3^(ZBl,k1Aӈ' AtjeCum.!Y1TxHd>]l:٘7, VLQvF''ANzIL0I{/I6tbp1JNoQaP() 5dt6kyu{6}E* 65Œťuî6 ,p;ą:Q T{.*0„XFs-!lݎs"Uvl[:I´L'4* ҫ6l_l(/CJu~cFYD_׺6#s)•G#K4 ?&q"{Y&1O0I1I -Bu8Ҽ'5u&M\,iڢDyU\͑7$`ٚBFV߱e Jj ';b>+ NN%\ך0T(>`О^.M0PJ^I \FvM;νSZ&܈KgZУ (30|&}a I@ތ=}$HIʓLz}s?Jm7Vd'%}(ޱEq, Wv,e}`Ɓ܆\6S(l~q'<"/9b`lo2> stream xko}\HQ.\E& jeZ~]V+_hMCr83~HUBFiwQh^^Exwsy{ *F"*D@WD >f*O(otˋ`\^٭hPZYQ['$ܒA ࡍO~V`4R"M#Yь"NBXՋOmA7fkj-VCH?p{5.̜}tZ@HEwR[ I=OQf6!dFÕCCw%D*I'D9NZ==/bwn.#nk t57NF753ق=;g2P%#uVf ?{ez*Mw4UW9ӫe3WMWqT- '4-%ye+W^ {5m FUw$py\3ף2qx=D^wH< ^vq2U&y>9ohWSLnbGPbX``ghKsc6j4:9Txl[0_8;DOn0vK)-Ƹ/+'g;,̧t"  pަ7U[/4 < pЖhcJ \|Tt55 !('-3*.nB; .e#ϑQeqc esK> ,MOA\NA.vY=tVa{:GL ]$/QLNVi5W"Ey{8u`: ;# <3lC5v{/ /w( l٩5޹kκ|\-촡;FKXe"%HCN@TqI&gBaKlG)v[sw&Ȧ%Pf4-e"-gܨIYވ'>V&J}wk71~#ǫؙg ;e26Ē~R >A&) BX=3w%je~ڊ$Ց[dnc;t+2b|*x8|[bW:Xdyz vKsFč/N?iCMg6L4jdy"݁ϡ:0Ջ{҄`8ZLJZ'Ӆ7v;yWE ,jo8)Nޛ~i!~^`>ymSJgjZpaNNs`̾TlZv6 mj# N@~ۜi7s 16ScU*)ǹ!-^iu`k;$*xRխ(ɹsN0 R\7E7l0 " f 9( vLR^"-joĻ(jrzRI|έ"GGsMYwY¾>l}E |U)(Q`"`,sfdfbބ{d Kl6GB6Og#6ޅĝ%N'ɣID `Ko5x6.v4 "p%Sl)WfjhfZ,_zH~JD hG <ո3/}U6D?)459αSXt*\3oJqz D0j ),5-WgaA6,SX9ƳQ&@ZDžj]#%Z-PJbL?iPTbTjPw= KqTUE5T7\F^v]u=ʕy7(3l@! endstream endobj 466 0 obj <> stream xZo6RsDQ~,Cum>{PlKd'$ZDNyo,Dw.fg_^rvjv˻ ɮV3t,D\j t?lO|}7}v85;CњhXGn<N`5h ,,<~|8y"S稛~DB@A>c;D\^\c>^ dD6Ogأ2PGBR<QDUf _2#Vkx:Vi'qYyF^<%.n}8+yy%M=5 1.%߂ʿ '3mWh%'nm zZ dAQY9bGi]7s3]yA\saogV,dpsWBp )Pܜ4^JK&Ea(!K8l ҔU!FFCڭo7%xO( y8Po`iQCwj=l0(Ui*Z1뮛z>tݓ шyOt8/֏%$Id6 G `% K S0*{_3(𣺆冖x9 EZ-Dg\;]Y,MGHbB[C+E u\*_uˢr TA60F mQPF%Uri+ms% [i=5 ;ymCǺصb1 E$76$v0Gʻ7rDVRIhfO8n{n0XR-4MxmR?8T 4nuэbv]W(&l W'c.Hgc*=rZM"oOUjgI l}G>m"6Mdl$y|I3xpa>&a As|(8]H?0q\﷨cikE +b7-G)Qih"oĤ- Kừ+w!tŚ#VY6r(D`K+v-Y 3I~+b(aAw-L6pvOqi[q=12I2ՙ:R(B[S{Ix<6meO'WNoHch_xDvv@ ø߾ľ|A`w"AL: p0$L3ڔ=I}jk]$J$N%5em\M\l:ptIu(;`rѨ!}WCuoY<¢tB P SiYe&1X$@njٲisVƐ Ľ-MϖtO(*C1ṇǪݳ>pׅT{S1F\ endstream endobj 467 0 obj <> endobj 468 0 obj <> endobj 469 0 obj <> stream JFIFHH ExifMM*bj(1r2iHHAdobe Photoshop 7.02004:10:15 18:18:26O( nHHJFIFHH Adobe_CMAdobed            c"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%9yYo2sj/ID׻1QhSFCKxx:8~j?ñq'kޏ(t?96}hZ[Qw1P%!ga*}ck_hsnnPq]\}F13uP϶V+vEOO~=?6пt=k,p}mps6Pc`k3P!ٶs_}OkNSӻa84;{}dڭ!pCōx n퍀c65%6RI$I%)$IJI$SU׳10C1 fX\BDi빿ZLALm4d[~ψy}tga,nC]nG~kYn+갓cOӱ+r'cGv#tƿ#$e80[C*kzSWswSmif;=-{Wz=v'E I$RI$I%)$IJI$SU}ayx]C`2Su.ȱ]Mez\Pױrl"]ӞjƱůwǸ;uL$_ b Sknc2I{\.tF̪:͕WMO}^e5}?S]ͧPK $|s`,ʭs|nXqV??Ic^ H fJ4]lj,/Mz#,WsnN+tQlSY򱡟T"$RI$I$TI%)R˷fC[UՑԟx1ȅ'6Un&ͦyF׼Nʕ'":ʻ zQ;b 5K⎩o '@RI #"j]u[bLkw;%IS'rk [97ll|LwGb;j;SGdI?TI%)bu#A[kηEu! I=K9ɬisS\Z[äj[1Z!!zqpi-j>#P=Ē4۩eն4= +UmbLCuۓz[] w=ó37-?gG9,uq oQ_7r@=78X7kkVuoncϨKoݩ\3{=m}'q;-&Sps)#jmxzTI%)sَۏ.c]s}4{$tbes>wo5 Y9兮~caX][ZH1V!$z.q_ Gҫ4)yAy[]&~u#wA+ KK#\Sض֏غ5O/TX=$scpӺp/=7.kKO__U_0EY9ɭ۳ֆoO40Z\6n$ kǧk 8mgOi kk7?a kC-z{=5W.tP q@tgt2M}{uesw{VP I;Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQO" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 궚\BK0OD, <^VI9դR6z tj<ͫi0OW+{q̪ F:MSLxwT2!s>5ӣӞM>B4VcYr޽:\€619L8yގ6]r@qhMi$E"JPqz]CHxmY)KUˈާyvxARFIBeA!!ailz{="x$}Eg{ N]VyWL%]B9GbEOUuG1ր;:/4E様s2qP[މJ7írHv4_%/\qs֟-bU,Mw] ;v0N WS q o1*䎄-WctKQGRAFFsabE`C,[jH.[p9(((((((((((((((((+fH@M$HԱ}|gHΚMZY +CM-n$eF%:6y$12ǥe:J(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@a^kjFp=Ǩ|gcpGRh | ȼm վ[?vQ?[FUw ٨vq@tHF*! WeKQC#5nH0}Nrۈ^ʹHzGdL$fhJJ(PIRd4RjΜsW5Fjc(*jԝj FWڧ#ښG+E%NG5.(𜛴ܐk]?eO3($(((((((((((*dR[ۻ5nowRy Z~9>p{Z>Ԡ+?N$E:t[/ʬA[sQUA3ZG>H*5h-ȆHG'ZQ` ng8LAJ)3HM!4&Z UjsW[5NNbFU4 jvH;SDDSYxHer1[gD+f2Ttgԭ ;`zQH(((((((((((((((' bݶ%ڀi٨ᩀLM!ɧLc@M0#c5#Z'=sLdnsPJ!#'1LE0ҵ1\n8vH+ޚWڀ "#e_:=ev_3IJε*DQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzhU7@ qO L RPZMF[ސ0 j&4٨ &nE< 0qOP229JE4i1RM0S MFڧeȠ K\CC+KÒz"zJjAQ@((((((((((((((n[5rss'@ Mn{њqja4KRPiCLc!I֐ "wIҀ##ښW?Jad{sM"ZMޘ4Y?} 3k <%bRQE((4Rf4QI3@ E&is@Q@Q@Q@Q@Q@Q@Q@Q@Q@`s;zޮ~O-74Q:SvJZi▐i1ޝt;S{tiiM[5CSuXV+bIF #bcԴɽ<&z̲۫c!~C]r88j^.pX:=>Ee6nX(]JrSXy r!pJJXrxi.^ʬl$jccc)aINd |⋦H/b- $3ycm''OD* }j97^D F$"AҸ Wm6"4[\)XF+QwܪQiRQEQEQEQEQEQEQEQE~R}ok~_O5ޚ)?){tZ(@٤ :u4ҒE7CKI@iq@0M8M4M8i=:U]__*IE'\~TQHAEPEP&B O##v0Ni gRױ擶y3]\5!2țG_ӯ([jo){Z8ol嵸]0FykӡFkh$eqy9R|ɎxD-I&Cr@1U\kW'Zy(2vƀ95/Nk;u:i$SrSFNuQL(((((((xX=krCX^hP FihtފSHy4&qI׽/@ ҙޜi:iM8!;ӉC6i!M4ƚzRu4LahXYC'gV+'óyv6#Z" ( ( (bݵ7Wh7)2LWpz|ei"'v%ixq^s4> 2)9QJJwkŋ|\ux퐖gǡre$u;mŖ#Q~<jM|kO]I ZXq*Q}pE&Gm?9@VkʥJ  ֮_fWSDkJD=( (((((ţα+gQ8o^HE1 Ғ'j=裭vwTubG8sKZk^uٮw[ @A'>6oAY -!HcR=cڪ>{%POfC&Գ$63n%/n4ihL4C@ ښzSR5HiH ˶hˑ룮7IlNeR((**jByaf`[Bs1v lqץjy1VkgW@"1젓 FIX8[7?!_u{W; p%=7 :YXSu55{k!]+PMBXA'ҝ&p ϵ^xIg#$tq+%~`}jP# (ɲH&U9B :Ny-Q]$Q@Q@Q@Q@Q@O?ZǭmT/ՓTb PwG^(GQլkM!X1@iJ Ť6[:*0F3ݩ(&8gkxxܖHsߓU F)$) yw1?Avh4]n-y>时)zSOO^L4qwH=i !bi>nh8`y"\K H:2\]v7EST4h@QE-%&}[[qp"nv=p^8O AyzD$UYHV=)P0srN77I6iMe/[v sAS%cl}aMaާprcE]^Nzz[" PiΪ} EYF! ZykMxCt^KchTӕI=*aMJ0o5dqhcddŠ(QEQEQEQEQEBWl֞Hǹr*R \★7.hx%&x:P{QA A&M&SM4'Z:fkti)CIA␞iJcS41-7<q|֏D^ _R袊 ( ((:@! omԼPW[Ch& Qܹ z/^\ti88e7ttz^Rlơb+˸cX-kR6a23>$KdBn&#Ǿ1ϵvTW'ζlkΚ "8}leG]cQʷte[y:.1њʷte[y:.6h5o˷΋im6T\ -ȵꋁtgHTcu9OcwF?F`9rpi{G=Ǎ{ѧdϲ\,0(&}R.T\ @U  Z ( ()j:]#7H1=pA4Kbd3:c4 OJԢ2Rk]/#3wq۞;R;d2 K4_x ;j@ֺ.h [0J!.e*XrĂG9f5C/$˓sc8zպ(.UAhT,T'U'j=vZEil!B"dS@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@ endstream endobj 470 0 obj <> stream xn6nc+Q$cdƋ=jiu;|}AR̨wqKTXUE"W4J eˋ_v]^|CI)=\^HK"FHʵY=܏ѦцJo(otˋ]^!ifL&D, %|"&L\\42M""*(#дoJ3SZ`~ A(-4N %QL*eFwo2ILtGZarNLNk)J9!gK "rU_(֫a_~ 1cgRLuPf['ԔMt{X _̔42poJ`#]-A'˄:- l:6m,1V4~Be X*Ҿ4ԫz @uucY쟚^pPnm"[ %sqU=s7?OB Z#1K1۝a@/9Peۺ ߀E*|_3OIVmcbab+}|桩Y!eN; %bHj@RyG5 ywPgwxZ;#jP[HqaA}JZ\\c o1Xg'N/%XGZ7J zhƣa7#~ZX5d[i1?X(H{Y/&{”sf{"BF\*mW)HW7q=;D;|NqJg\&D!CKI,3(|{s ig$Mk?=]vlG=za|YR9lAo9dżE` vfSܐK#3]ӻF$ӗ {>77vhSe7ق!E|֋)0#ܟbT ^po4ڏXVn'8bVU՜ ptIJPPޤ(S_8f(!'!+e`{/71Ҙ _ivی"g;$}׺@(.`('T՟ (J`a",wz\̜H'}!_KLg|5-%nElad0J<(Ӛw׵d.dGJ0|jv_uR>G^K?/SX,`ObTawWPlj*įllՊ~ K~:2;j+B"P. ruaJD]-`g3W}egV9.Շ%Go$28nh@yOsBhE2bA^ݟ*dզrYg6t^]"_WQwq a,S66<?ͳG <%J-9^ϊ$:6rPEDV3v:*lee D\.SH9\/:JQ9B풄r%{ t9a)c_+6Xtq!EF{Q k'@2p5RP3tJC SvGEL䠫p3EIPxW֩]y}?B Y&(v5جG,3lU d9]LS޲BS |QuR,tV|:3mۄe?~"vMkCn5gģ@Ouu.WoјZURΉr#!]y$-0㄀oRhuv|.PȠY }82<)Aɮ)\A|?N ݕ@JgV7Jjw:W1mdqA֏4p R/4­Vo!ewkrD,T07kqԟvÌv9J8кAaQjM$9l `ߴ ([03" 5u8LfuUmbw@ QR,j2_YF C5xCaN}z\/YsB]< !nuZB+B 礖;j` ,p}F'8]lUutmrM®KVtKk/~G 2[7~M~O$7 ~Cf0^6?#gE1EjTo) Apcę/AY~ˎw țԃ1Θ8 [c| +o_>?N;n>ٺt?$ V%?`A67_qFJnNԆ(QlqɞYzO 7F/`A (<ܕG2چI9i&Fǝ3]̦sⳜ/U.wL%_9#g¸%p#XCbKS  I9kҽ<+xUTIT [<ۍ4O߼$AXɕL3>PNS8r!*MמH|yr%Ҩ}d}QI%!:R$.05&SB z0*.ng$u Lse+%%/$$<% %e$M)JRR?_IN endstream endobj 471 0 obj <> stream xZo7n?J[.};{-p&iZZYvTg܇Y5@,-w87>]^D49ID7c+//~T c4ayy]D$ej(&y(Sx'|ӏMˋ?//>(Z]kE\2}DZQZSH*#g$4',i$ B a~,Q &31-Yo,mEBa]jqB0s| ^XSn(욫O I$Sc_R5,Z?AQLBv0ͲZfL$H`y3c\?{+Hq7\qIȘgo+g⒢򔞯4A'ae7|;P!3I=#Ca].EN:cP8x &7Czb\tҸ)SV ?ue]eH-4"QpQi<`n_K'4)6keEuI3*X0E9CJ;i3s@Gf%{:7D/|I jL{P{M?8X:VzBg˜AI;[)o.x{ Fc0"EbZ}2QlWDјeN Nr\bڇNh $\_:nO0oFcR;1G}[1pOl P|߇Ʋ3@V5d(ejkX$lD>}BXp ! $ZP)JǍ5}T!8M#kHn)!W`Y㉆APwjXdSmE-BQ_uSQ&6%Y7.tRzREdqKYI 敤FsdϨ:k~՞]W`:(7|wIrtsD>`_)'sYnuoәǜc Ji 4Z~ ~wt#օʓ;E&iO_awe Wk~\c綇.;(aՒv+}llvN jvsة),F޽W?*D!wS|R&rYҝHv to1GbY:Rд3,wʥ/)˟ag'Ο& ) d]J ya7)l'90{6ea#CaJ?*]񳂈@#J*\]c݄Ls }ޑKLr;~?:qdpSஸ86mk- _A7ڠjZ:U :,HUі uPXecH-mwa&s@ [Ac+yzwC0= J,+Y XP &- ֱe{W1%$|g,3N+\'RNc弲ӕBl'v `E~ a\hNjmV3"tkWb *<D6%FB uCGԫSq^b1jkNt1`뱒a]$.Kb,ykQXvNH> kM{S`}oMև6ػUZ+c3 >'{yJETSqH5'~NWGbq$ԵN'C?8x;5y?{pW;4;P>Mt^} xt!dpurϋrĖ'4NOo.s]a#<1\0A%[IxSwDo'eXG>/ExtGState<>>>/BBox[ 0 0 234.46 56.374] /Matrix[ 0.30709 0 0 1.2772 0 0] /Filter/FlateDecode/Length 534>> stream x=k1*i-0;'6 NHe+C }kWdG [-<#3zq8㰿 h?J1j~ {#~~h}<~ou0. vc˴]f?Q*y wNN[=)ωq HPq;p(R .R NPGK`4#x4\*Aå4\* JsTK%hTK%8W$ߡ;coDTrlhS7' hJ/O%;W3ҵmݦnnD>\ڼ|g Y})pS+gq.MolsS&P Aq8CᆏLf``$_ϖH!zh%*Y!57.[˘meS "֭ Dh RqS9'J "NXoi!-MG}&; endstream endobj 473 0 obj <> endobj 474 0 obj <> endobj 475 0 obj <> endobj 476 0 obj <> endobj 477 0 obj <> stream x[ێ5}_ig"ۗE4n.ABh HI q]%ڧ}l3;>>?{{{~v??i f_fv7w{^_nُnS쉷ٻk] .u +(9AƳD7hzY\'zft z`lP*%Pxi *K@D^ w?n\E4ʰ7{*.>Zt`Nq i-fGC%]H NÇ̵޿nu7;3ߠU=%)}v n pG̣4[T a 6H);< d購 ݿ!u4ݢ9^`OB_p ȋ#Q8T呗QIg[p|Cv(G[Շ߮o/ncu5W$T$":W qIz({Zzg$3pz?*|4twn\>$|5jDBk|V2sQbĎh}@0ZDд|6_LNr,ק& ю$zPd2|f{~\<{G~|8ge~< { >1_MϿ̵}Zg2)۝)`z]t-lXӁA/Jӷ؜Yr˂<qPB!-@f?!)Jm2R$Jd۫ BNDJQ I\[|`ܛoy?zwmwSe1Wj\GPlR#jLjq+!+v6+# kQ; ^WթJcelR8nUFaYylN3"}M0&d])X[f`ZߛTŸub5)Et,-ÔaYCU> stream xZoFn?A>{-n!9\HA%[hL9zYrIJ"DT 6əof_x~9.$23u"ZN~~egg/E9KTt=;?DӶX xȹ=c.r ``ZHWŗjo7?WCIJ&1`ejR7S`ZP{^7B>n tyV%}xȒe%8`%~^$)ӊis XE?) -$"6lt<3 Dꇬ088ݠ'H~!Ƶ|ÀEgvG(%z<[bI+>fMO&'kP{h:0z#8- >,(oVUH]+ZXB$-fR(UYڄ稝MGPnBnJP"VEitqn { a N=rsX[~'W)z?3xAs{?M̪?Aօxh )` 4+J2*|+,gYXQHۏ-EذEi4ӓkl7We&/h;3ߎok=L$e珀,]:R3Un0<0{w2 q8Y]T*Tڟ*F@)<@de9sעG(2Z gBvڹ JJƠ_2Uh}GaMNöNu; ?d`X"AFKIM*Lڒ/s_~!@,MY0:5-S"!u~1Ka3QFB',2^I˘"őF_I)KڒJM3mxhO5+|W@T6kr28/Crh@VÜg5}ƶ90-, ~ F*R[\ʔ9ڔQ{_&hF# 7w{زmBpfؖ3Fz怀 =Fr3ZXKRB/b(Ie@{/?s*pP$:2ƒg8~B|:_PӒ }HJsz-[O mtDN9Ǹ~Bup^6s~ag$3HM$7v6:B_N5L?) 8t?LO4K!1<n]7wV:R˥Yy`yk3k)m+[#4 f56 ~'Pv??ǖxvDbM2>lbYyG{rߝW)Q6/Xy2e$H{L6?R2ɦ&eyRwpډL9v/T ++V&oQc'}J @e᦭*0Y3f̘mHn~ W-,HIїSjrm_xQ%|e%9u\{&g>/F 4/A<>>> endobj 480 0 obj <> stream x\oFn?A>I\ZIb˱r,II4E"i;,χeQ⿆Ь$V VzxvxhFHQ]*. Ygg:9Sc>|xvdg8<LJE$U+!ڣK0^p.^D:jIj]4ܳn,0_oU4;hHcbZ ʥxˋ/nW79!{A]FaeǰRVEb賲Q{b7r׋{dSE|4*Ȑd J q% H@a"RsPV)Up4`5&MLˢ.Ad<˅JN K@fzR|ȨQ0"ܼXsW"q#rBPY Uԏ&rhӨ޲)ܸ"rHQa2NE9H6 rj7^_=ϥ~._9yn;{WqQ HK@5  ״BFEA$" Ti+')~Dհ^8 ʛP0a#C["آ+EKbi,Gcӡ P8 a\;'/?g/~w?ᗘe"t RSrE@${eN a0y(1PxMYJj8%wyJ"%;EJ~2a#? YdbdNqR Ő2I2 `dI(NÙ'E6mh* kqCJX DѢIRpq ¶L({ uPq%BPs1FhS$i՝$>㔲r pċ`WHgH,#?Ll$Kl2:9McDQ@{J=]8WE-sNvDUi`~ZѲT5i'jڶM,[Mf.x/$;wfɽHƝSDtN4#ZgWBDϮ!ڳKX9q\8Qn) =%Ia5?vzx׽q/~˧u&İj*KB{"#cKwF̵#S8;txYJHwoe$F $qxi +G;W$],tO @PNiNՔA5MR3k]膁%T~pW#Lwi!/.QKܦ2: l*کR{7cJD%-MS"pƆ3elp;a>&Fk0IȆ%R~rG#27$M$$$$MOx4I:d{؈$mp82UY ԪD#$ݒ@̆bn[B3wj8YqA,X$),IX6I M:–<"#HzǞ3@l7yq}ݓ`ռfl["߾#Svp/QdI vT X7U'vt\~`!Ș \h"DaWKA$ *ki~D|6zQ EMHu4I{yfI/Niθ rJ Ȫ5oCE*C?aڼy2LޯrBwc^I4eGGb%Y@^ͦGx_;M,%ޭ~VE-=n9`#[ 1bUU `s?/2nvœEyrZnNI÷LЉK&:OآH$BA B~LZW3lrz3_pkpn˛|P e,铽I=7l/@滼5N6 ;xqR-3k6F&Hz5 Fjʖ:"K3'3W[ΆȎ!j8D]ڟlnv3UY=k i'*okuXXc#@Vٳ) _G`]CMata>vk|X1>{f4n#Zmyw~uY e:X_7:(uvw^'t#1ݬfh*3.JlDq鐎.k*}~~ج\tБZ[Rys^ֿ&d :tŇ5v0ί,{p#.mlίgy]h٠u F*Q}g1r'"<= q\en vr򓂊VnRֲ;nz]YGi|\"i3qZax E>&-S9 ASBx: S=&">P&M2 קi/!.fK(]t~tqv 65 Ux Ȍe1ؤ>^M2{ a;O]XD'[cX9Sv_NMAӀQ'0# ̨˼-M,]ccۭ֗qloͫ5rT!ދl]YCTxĦcewn-ML0B4oma 9ZESU|sy(.[$1#˦ԏ 6*JJ2[1MzHqn{Tu~aINZFŅn\\}u[&ͷg`1,-W3e9#|4kIRQ~:ܩ=1#'6||j0H7p""ތ.Na7Wٰ9]笻ym4E꺐߂mAI'~'>!R 0[GxPA(& endstream endobj 481 0 obj <> stream x\Ys6~W. K\<-Umkl+vuFCyF~!AY#TEUsэFFwe,ÿ$Krx/*F|y|^ҦӉLꄾRr>?cxc:P$ !5t~Ġj$qtDD.|sBdaB3]<_o%+Grn`Yk_{_M_T*KT/8Dk$@e"-b<=/ͦߝ׮ +~I&aDU77Q* eAK/|h˃=5 CTvb1`mB%fby89S. Kp{IXŲ1wQ=ds0$hk Wĵؓ-%ZB#O-J{MMX6x=aCϾKy fojRY>Zvfߥ ;?!+i˟{$ЯROq zn # " "o7h3ꂈ4gH:Dkyrtu!,la'c9䠔ԁϸ-tJA& TɘJi8TPۈh=9Y}_LfqO%׏FVGΚov7f T8㟟)T' qXyTU%Šg.CXsx_g9:,4cjsG-QOW;fHGkn(y/"HMGDMra/)cF<`R,yQ*k7rQ]$#]V P1Ў`tKoz.Ngs}^>hq ם4FAX٫=U䑐U #ILBCtV9zC]cTѱݐe˄ M_Zz]&y=LUD/ 5L@[\e'!ݩ)sgXUL ~7aL+ԋgwqx8żВ:8M`:'xۅe姍}34]n NF/Q[~[s]b2$G!6 {F#Qq&0Iz@|=-C/d&R_ܞ}UAE{ 0Eٓoݵe嘻Vӄ:nY*OwZs !` !2g(ͫ);0;4yۻtJP@F#U%4s:m~"=Sn{Oahg 6Zu [|^Oj褝7Y"{@a Pl'qsc{Fh9\n q]5/qZ5WR<3)AGt~2a/1Pc/@JLy"qSijߥ{ψJ2^){tL^֫ɦq|6Of9i=3Hʼ9Tј,8AOBߡ_z 2ǭ݌0N;od}u4W,+_)Zzq#-1!Mvc. Vur>CݢK]2U})j8vm|#D^:E`$hf{I|dz->1YpQ8*HR-n9j/Mo_uuZuAyLpOI)BegiB2QeõNO$|fTVx](T_«<ʴ}nD~תsx)ӼKy0 Mtqv11Zvmuwѳ o('qN*)Ƶyr[l^ܢ.C0]fyK)3D `Z vwִ-Ľ3äX֛36ˈ s!ӯ)hb&<ǜg0Mv}G"aN3u:X9AWߤxY;+;''2G1> umQDC l߇Pޖx;trj*q{`dkjs+S7Mji]`>+}M;;-.EE3m8BMnm&4Ű8o.S{g8Ac9zeL>`ҟKP{ qX*0q8-˜ qXemks̸/N/]a8w{S5v&#uzAjbzb۞ cU@ms~C^xwع}>۪1t'Ehff ؙ|DvQZ)YHPr 'pNAv =@xW5^}P[k}5:;ERx ecz D剘!z1'VpD+E$@j,dcfp1Mʙ N]^mi!|92MOgsZC?1̕I<׆UtWN\̦l^"+ OZ<)ᥘz/`̓ݭJvw)=}_\Fe! WG;0`g9&J*YP1EDgއoAHSj^h6@+q;|_@57~)3!+2L1nvE1#c|>@hMãOD#\}YXdTw)u\L\]~' endstream endobj 482 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 483 0 obj <> stream x\o8AXE^EmSCP8qi3%RL'X` ԑ͑f83q83㣌d/,:gOя'GJI&# tYB# D~~o <3GgIķG_FY;gJь^S)وjA[B2MheFI yBQvdTLY2L a "3=*$Dp&Ip԰dqc,|{VqJ:vBPuBKErє˺M-gb.W)-I^23bi2_ҙ$`=p)PN DJD֖xAg|F.\e ?(1fi*W0Q _J%[]N˭q&4 8'ww_nB;[a-qE g"m *gL֋U9}U-a/c3N8Vc17CrM';L ysb~O2. ӕ DEVUuB~F?)hap:uK[T`5G(ixCqw;u0qg=x+"0ķژ A,s9{oO,hR Gb%ɒ;`ݹTQzcg wJ|pd/@:8  14g|SpEa=xFZ!u. ګ eB-nuVzN1uji~8 aM8;(3>hBlOB8PGBqǿt_!?^%zwx+4Dá5BK珐Fc،B'g1BbHlL[)3$J9yzܟG ҴRuBAU ]8#OkF6m(?O+sL7.rJ y;s[L,0*+4ew*ȾZep#"ƈZ}UST"ic08C5aW5:duRc)KqZ&"W9DGRCE1D CL;`*]TPj뢗oH= ҴKu3Hc"*qCG ְ~fSS%& WqKB#و!{s4sAth>DmHF:j!qڡ2o <ܔQ<ݕчn蹨ufPU:g@F!Ds 'Qph#~:Cw4;8"FHBy.Ķugkk.:f:?TWozh?KlU;G..յeU%ʢ nA؝,0+BQӯi>{Ϯ6 Lw<.Uަfಚyr sT)_*e-z¼ͱYyusJ}Ԕdsě2n^֧oVv.eo$Ϋdn%j7_:dh;6Vu1iqIƅIN9vѡ rȏBm!ށH6{P֕/]_nVb[Jtxm\WQ>$ؒ%qO&zashP{<20f@a<#Rob2yMOxctO?|z7ct$ Qs8om2Ǹv WN,M1a:]+%O4g*erӛ^ M+˨D+ͨ*"i)Ln_;\vXg oW4mgvj_DP5BZt\py%gusp< EQ6d9#5 cVR Qco nx` ܷ"ќ{Udկ/=7D2ox?*&#QNTQ`mDHF;֞Vm޹Β {xp7{x?Hㄚˊ q endstream endobj 484 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 485 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 486 0 obj <> stream x=k6 ?]ŗ(ؓv$rC3Ό?IQT,rb=RX,֋~^S7'jV}ʞV7~[uuޓъk*Ru&n⃂UWU8wWo}s?W{gI% N:FHM>%'ՍBPYJ][{@V$C5\ˋHVVzH8¼en+еID%`ixf"6V[ޯjnV4+H_iIhůLffH뙑=KOJY4l> z$I?h_@ (<94K}]` F2XBkĶ;ɟ?^o#^t-VeaS!Ѐ6F#Jͤ@d2m%`iNU(/GU <]-IUWjntodTda^9ik.y}4}_/e~Mv |IQ7GiֻМwC9KA葫!a*QɈn@F >m-Y+J!Elj,M3Ԣ38U}:K <ũئdN_S Ed W-q4*cQ_Ü5 E|! |Qԥ"+j,}Zw6x;|F|[56J+?,t:,ض0@$sHT;7I˩T?k>T0ou\МVKt2EVk&c:z5م2Nf_Bj$g_ö,s(ζZ0EA6_AVk&uIjB0k0Oo㍊P+5kxJ1$Ԁ$m0$FPaDBB) ^LrKM҉MdH0wM`hc0U"ATA2pjyaeDQ' PJ ]qO<_CĮ\(cݤDꪛpW{'}^=LuX#"IH @ND w > u>2d):hV~!cܷ7@eM!6Mk,ӚF [J 8c 3`<-dmu:Op$d߀PTO>xfbf+bKxe=y?{Fltϲ`t/<]*" e*]Ak{䫴J8s3qCY$C IE#fÈ@"f M;u,ɠpy#š\J+|uȗ5/$-KMF…,˛@|8ΕjjEug,8mh @N?3V?‰ϻ&TZúJ\68 Lm/;VOED壍,N±.x%yD9xl4stq,6.? ^~a@cyi@pjLM A50n$TI0MmFxxI17BJHqIgR?|a\nuOf < .Bɚ0+ 3f7aFa{0緷&hMȱsھ 7N_';+ )p~1'n%堂z]olqFyCyq(evPⰞ0 -j{RN2q q{W\8Wه䴔ٽAeKX#@:Ba)PJ2)SP _PoiW,~{"mڪ\(fՠ j&Qv)f)SK OF$OmBpErILmqLUAc ]oVy@gͤv:(S]gvUo.ݴ-qK{3@g2n؂nxă3ƍb% C~r$L*/IZb ؛Kz> 袺7v-Anj;j& }ۻp۰ivk ~5;BeOÇs#d+f4[L퍛qY%o߰BT)LH!E8q#9db ; ::*3L @*$MΕ@FƎ Mqn7s+m|2 ~1umYefbSjQTe +=43AL}:%`yœ}i8CBH|ռtq| ^yCTx?qFIHӛ .5]f穥S8LtR);gof@`1 V%cWHOyʴ֢2M柭3>x?u01d۱VEvl.%kJ!-/n?Οx~? ]?Cn60If:˃hN^7u=SGJL\֕jj.Muv/BzO@os oLyдekV10+ 7b2Kiqn:}rl177kfjCե;(7{ClQq*_! ,G  6o,GQ9\"=Fx<0n=JIKzAxR Dχ-a*U]7il?lya.o[?LNop7k{;IWcv/ץT6}r' t1'ZsO_x`עC_#9i`.O>Y<-P[gLyƋΌrxy#Z1 zΈXTx=ǡB9FXHEgڵ5\.P Ips[8|aNZjgعROZ "2Kl4bL5SY@XB+B>NY;rJ7=eM7nBxV|3-# gVlhpyލ5n.]O|r̆Y'oS.Ig g2TxQو*ش,UN5Dxrq O--|\: )ـ O G4CEtz+sspߔ+'p@iS+ȃaIE92?WN7|9ʩ{v#e orEZѽp) IRMq/Ȑf@@,'3&!f!M0Ӆ(xZ7%=HQץR]rc<=  p) F}6 endstream endobj 487 0 obj <> stream x]s۸>J71J|H>&m;},ˎDYM.eS ft:YXr.YbrőĊau~o_.VDXE7gGf~Jf&.?ݺlg̢˟Ͼ7~8?m/kOt wJ;c&A6cHEx蘉4Jh79ƑIdR.EEKK> (/j⨝{S].ٴ+Òn-xvi=;8CO!R2eZWrny˛m>l/l7P-sfa3?-&YEة' 'qE 8a'pY| D69t׏@}^.P/ d/?]0P4z}\/?Γٷ0ǿ D3@`{؎aܘ қ>غ +8t eN9&m1qSj1>Y]8zٯpְ>^`osg?Q?.Hƀu2Q#jg}}٫p)`O&{`W fcM :rX"]2("N8QF/^]}\ԼaN V]jkpC\X= ‰#E %o7n.IQHZCH|0 yhQ  94Hh@$%vsKB@a8r,hA?$Iރw$A1HOb'tzH"@E'|_J-c39%q@\72r04&K2#b<>PT4PCR"Aoc&OP46Z>F(h$^_#t*oY\GJRhY pqА3X|o? kq J:G9) uՀTSNEoRΒC5_DAi_K]GT<*Z2TNGJTz˖l/:21rsd_Q)3mF]'[e7],3yp; :yz&b -p@sMSCbwo, ,TK( TuBT.s_Vh1[/,:: \ Le#d$ax׉ 5lK9k:OU17;wvShsrKL+ħW͝uܲapMw.Y3\4@(kqCF]y<Ցn7auaӭs<^{ hkic&w~@n'wm%aƧ]@0ڮu6'N.NO?õ D\ëq/YG@^M ] 3G 7 z~i:\BWTSzS8PלsĎ.6[tlՐXhfjZ?z%VU9n~`= 6&VѧM6'e};2>>9rtU\-GZbӓ}/$Iuq0 ?eJ4Xh1 {{ί ,V[SQ,!l^攽ܬ=чJ0#ľ\݄p<8gSKN:BȁFwfdNc# ߷{ܷ[㗐w¸9l)L ap}M]ϮqߒcqtP,ge d0yӳgj/ 9Fu03 KuP#J0&-|a .\˞vEL^ks3Rt{||vokL~~OzaL\X2Ib:Tb3/D'{Hw2'[I7QL&x v:-8rlbagz2ntjtSD;}4uhLJGǙ1CtzlB 2)G1ЌG@*xZ O[0ee妍J5¢L(]>ëz `4&kn\DQ"`z(K"n{7M [2mpx % XُDS*lŚsnIo dx$d7*)/:O6tczl8W~܆.-Ս6݌]SQñMYAu4\n7aKTRB/ȶ~PVpp7×|Nt:xٴ o!}%7fB7d~fC k~]?A TOl@ZE>QH/T'|mWO<<1%mZ7ݝ \[ϒv 5aU᯺ Uأ^us.`|{sl%,mD7]_f9V9sQSCQFt9daxL|V endstream endobj 488 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 489 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 490 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 491 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 492 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 493 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 494 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 495 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 496 0 obj <> stream x\K۸Oũ B< :8d+mm%);YCLʖzlj뷻RHP6irX8D7_?U2Wpdk^d]^_&Y^_^_[p2LW貄'V3?J3c'M70grO w$w2磬ѭ2<:J{3&A63\d Rh3:c&V"M-n*&H% IdRDؘvR17 QM*tnRMXXűL)Y{%daL\6[cj&uޚ6Uuz+'edV)OxtwP!Xɘ%G3 ng%>x|+"|~fu(@kw] Vn3憿Oo9gIR,*7P/.rk\h=oFvW+&qgk7^_#=.8J*Q9Ǖh3_CQqS nXi{WP޿`]B^$0R0j {LyQد2xP[8E)$eƁUe蜶uehpPn,Lus؁+0YA8jg ~cz7g%Fr[N y;$C!_@揩/o?{<$|NWjDJnoƋCkn`Ŭi?!$==8tkGz!WmnFbT=[3Z? ʆиS4c   ?>(<h40H咕C4OM+ѲN{•D TtUG6e  R3#2u%{##.SM7ݹϋj`LysoVs mj'%]i%-& %r&$9PIh K' ˍ ɦkJfaȿAHʇ-\MzvxIvP *VF hrA +d+'2Hl ]`u#8l3TmM&WFv־Hh[&i%͂30Mՠ_T~n@+ JT/t ֎ɵC\!C21BAX `nѵpd =}"Inp?@wm (Jq(oCӘ'tN4t4nz|jic ܠejUT?%\X;GHz8H3.-XGjJt֯&u|I XQ#axŎeZi=ƣOmqaB>BR<=5,l>3C4&` s-wngVCK嶬Orn0m,9L>ă"桟!!н!_ |Vxs.sfLH3,<Ϙ(]BxYEdxDߎ->?L+Ǚ~D90& 0x;LtMWn_̮V{EU<]1SHlTMaM#B`c<jk`[$$Fu? N= +G:ǥWo'm=]ǍxM N\z|_Z w^&Kit2AchoK؀[ dBTł,Y ݀,4Γ?yRa2w9y.' ]>[Q|&y&/~FKZ~@u/>"Lm$> stream x[Ys8~wEW%n=5nUfd>bI1_? "%Q ä*4E4F_7ӓe"W[dZ,韞Gp2NO8e Or8?I'Wӓ/;vDLy.9@1 1Zœ)pe<:c"OrŊ f4vwA*aL$JaMdUTL"yqG$8K?Y&F!#ōSosȺR2gZ7"éTƟSOMsRz;|0NtO2[a,j^Bu.dLP I4geG|wCͤh ur(P(Lz]c)bX{;x(Y5UZާw}N2tdPi tOֹC ˂U7CNU{eHM -4yw=Rd]|[9-3aW l_(p0:6!NMA3 Kbjr O[X'+_*y I&Gfk"R0%ۢxDOMmcEX'Q8L^p BNE0JlƏnArm`>9As=, s)q$I8vӡ\} ]OClG|T52Gx_{&$$߭ay _5xIQ0Pa#j]; 3t*"g%%9kAQ}u5m4m3 _XB_g A2 'D"f_Gò)3&AGp&EC u߅r˴ ,w4,eJA <_^Y/c¬̾ =ket=B҆XKbKhЬ=@9 99K ;Tb>Y0TK(+@Zdp7oI߶E0c%ocOh94$k ,]Cq x- FG\?j=.eaظZɕS14 rOlRP VC"*QBa&V:k?jU@:`ڝwSVޏXJ9D~0/TokwrQ#ސUo/|jz pUEy*l5K^; H3*u6{:FJm#:LAg@i9[Fis468cwV?//?sP4(ݼa3pE ).qZ ]Y ~~SN0s T@:7A<!{#>ovD|? qcPeK35ƭXERD6**bg/>1LWDDILir8>¨Wh!59kvyX>錼hf|1ܧ?fDpp\O9(=|(sC&~JJjɼ*Mrs oܵkC+*B!B&W b t(10a ݣu!Da{7rKW 뇫-r 3 "Cd697} qEu`-ʏUM_NȾ8(2ZMe[d$00hI9{EϬCU>߫wnރ !;7xL hxV atV.0'PU %V'gf +t3Lg7Ŷ0>u|_bl̈́d6֕_YOG #-j*,P¤>_@slѐp++%<8—洽LaV-ߍ;:>Lf儊QtS^TBGtW415BP wa!kE_`Yk_^/S*M01Z we7H+11ndED'mk@b}{LY> stream x]ms|+.8^әMSw8qi;N'CQV"ed߻B3{{oN,5/uDW[:vVK n$/b( Gɫ";0@3/\COj/K)՗?hq3V2j|*Fi9\K\?cQ"rV"UԠys /U^‡XOP+P"vHU(a^j0IZ D` M8!=NFʽB2YvKN#ڹ?=?n4o-.WdE&@5ǑH5D_c~C*iF䦿2F{uvEYyc U`yJx7Q* A~]կayucM&v St( Pb(L`,a!\qjmLhj-B 0uŪ|=+NIP|N$1a^4 G YCa9Q˟W0u{_dO/_-WYEBb3 V5(ߡ" =~~a__Po_)f8T9CGYȤn33yWpƹ?MB Tb3v} |~4q6J4@0vPc'vc=]!9 h#I%f'/aSZ+"!/! L#!Vu}d5/tcE Ѣ 1 +>2LCk2.WeK9Xd!ʔ| [,au%.Ӯ&{4mcK4qh'ޣ`-)*?AGai l2%\biak͔%rVG6tH_}OO PB0X>dž_ik2%ǯG)b0ՏLf*%)Dۆ30P7c=]XsƏeyK>aǃeil2%DzC;$,УɪD'NG *>󮚐(')8S:6ky%e.pw)B1дoP$0 y3N]tzA[H:7һsc 2 b ^`}vNSa:X{6a-.G-r}G߻k$גS.)znni'Oiq2%<b Hu:Xs;sxǣI۲&[p`'4;cNW|w"bGi(ƨsNP ΝF QncC~6>g|un4UMR~ܙ RU1Q,!xDZޟ MѹPl8[Nnߋx#|~ -h$xRԌulHIeq}peyiBBeYJB%hf'Kg1˜wti6 :Yr?AGBX" K|h\:zZl'#(_S)H!C>\E-a@КC|t3S(bc&@\^61BLD`ۍ⼙<8p:B,\J>&#8Q'[422YKst}|0s0un=sQXeubK؄Z"N(Xjȶe55GQ5(L`>,\~#ϱkGN<lTӳ>j!E^ʺ`2 >xp"UR Ï9AN QkH/7٘G^PQ[-7 Zl5KD\8*uavT=FKtaJFkhtBmLJn5'd&L(v6igM6GUꕥ{M}٧&tށwE>){21wIpz4 U@ڔBteڧEwL]u  PUdpI2f3fm06vz~h.n{'̦`v!e;7񢌛t umBO)W`L^Ro6 /UV ˹ߵ2)MH䘐10'!>b٧MIc֢QN |xI 0[vEcA5Ag^Cڬ(مwZzy~9Γߠ}<7 j;wzM7y.b wyevw!@h~LQ\ g=MhbRa\fr+* ahdPTŻсZ&$1l(EFbA wy'|rŸ:FieZgrSWb ŔBfMme͵@7i=kxdeO%nf#sp~o.0qY˘4 i&tevvW~Rߺ4I|vu@] OqwMsc63sXzX*\hra+׋mG[.vٻEpҮ^Al cy+Em )1[a8cJoyduydYmՋuJʬzu|Pޤ 5 `JSLM!|!֝u횈~&MN-fY[M "-Έmw5dO]@;B %D\Xu 9[LC)dzm'{ˢg::o1rPǓDj  v/Ӎ8B1CTɏZQ%~䶨+S9Aq̜. *aI%ɠ68#LVLDv~13.>hvm9p.c 2d´fNG/Cotm;Pu7̥kl2)ur;P :$gvKmˆ6e~_Kr )$޼d5bRRB1Jb+EBU,Zܱd?^!sz@i5ڥR^"tu~셋٥qlK2L6빤4Ek;M5sEkXsg>Tex et\M endstream endobj 499 0 obj <> stream x[m6~L(gwjKJU$؅];cuN@(O0P-Y]jJ ,`w&fC}#3 1PjZ)•'2 t_ al/Pp%b<,>5+t)TI~}UIj6)JOKo=յF86&{ v ~^S!2zP"P``BrP|-숡IXYؼhxվ$z0e)Ꭺ#/t}M>@ 5qkXu dþ*=YbeE2~Tڗ*^8CQ֣q)XemueY'f|$UHTg.4?Oh yZذZ2ZAn/Ky}O%  7ܬɧ6lRqc2)@f1MURl`;n[۫ǵBmX\}$mltž LEv[u9v蜭ۯpgHL*v8Z- h)(`Dѓp]awDTpsQpQ#$}Dq0@1S6hpMi"wN &H5{`Ql5LDSι j*~*k:s NS56ȊQ;_(7pNw\xU 3UZ@6xpAh&y8OpB@ajmR }l:;bp=3+lkes]YnZ3!׼#>"|n%ݍ^fsWtO1 q3;"0[P.fLئړB V$T\vlTL؎S(MoGm(lnHC< {W;Eg#>=_iao# ωmןaQ^Ƨ '~{~n_~,اIK)qEJBZiKۅ *"*Cv^xes̷/g2N`PH1n*焉&jUܣ 8Uڌ,dB6F*1Y`T1緮ܡ*1~ endstream endobj 500 0 obj <> endobj 501 0 obj <> endobj 502 0 obj <> stream x]K6OVNRʃ% 'V&;Τlmi4#N &$@я ,e)W,I~u%ٿLg:?epR\ݞq&<)HK"zzT$wkh3}s~$;khvm*]Z9OJ)@SiZdTL3hH ʄg,Wu'X+˩ȱ*zU+zRB2/ őM(y%W_&0{W '%g%`s钢`JtX}TM|RE>L/d5rd})#{;DKV{A $ *-KkH{ Ja4ͪnw7'l)Tpi4W8G`^8 Tѓ˩r>yLy6!y[MiV0T%ѱմҦ vkKR-jlRSZ_kA(GP=\kdO Mhjk\fHڝ+<zC4Cnt䚁,rL$4bCt`ӂ޹ +^'\{2[yN"?-=7q^ˋ@@yBuQ@AjÎ:mѴu$GHjRw;?AG-&pFwwD.cAwݝUڨ{<ɁϨst)x-:cIy3nPvSKR@r2&v D\qvTi8ƣ^dg4::ylhDG|]6a"ꂎApw^qGV(Y!=6]7ⵧahkvPhR%+5PTeYVҼןU]o`uǃү +=l:p[R&o ZrufO[KʢtW#|qU/$F/=1 Vh>kzɞ[дD)M*bRPaVDs( aJ2 doG(saO) כكIJy⫏(!=]Lulu Ieꤳ")8pʝM3*M^nVhtV\T9e4ɥ.Ucҫ>s51ޥL{C\qE(5wtں`/4/)B|v>"r_tsӓm^X2L~qOĠaFr@ u[D.Qhz V '% {T&F߅xψQ?OHNww|Q+o%NZpa zR{֮G}ϩ;RUMVnE]f5jH&$J?-Ѧcܒ)"PtsH7&i(Eh0Yde҈E\[ի͑:^?~`ƀt3/E?  #Zr3qLA8g9Iu_;$Ȕ;"F fΤKL(yC@0:! +^q."P󙃭\:±cR\8=̝S]6 B,;lcvYe2g5hĠ7Ns*GO wcB^-9:_ ~*8GT-;sj+.a^P 4g#q`8\W:Zw͗9 v_La^ #AqH"c0pCPG]ufGcT΃C jL'Ӻ[AqL.!<0kNՐS߅ѱxy[uw @a"9k"GPGM'qCܼYG5VA^&^? tB˳u/&0Ed'/^S1<n4VˡE]"ᴉ_"HS\n8D<~/ ,"͘T!FAߕu|`Y6@V`_Et77<*p3]iw0~舸JY2}Y * /:|hMpf;1xmx4Ac)FjٜkGX޵3~Zaf u.EP@fqWtH b J%~\xAHY/b~r\`_ 8|A˛R} L*\vJ N/__ГzʹxNW1#vEQ,|VA endstream endobj 503 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 504 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 505 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 506 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 507 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 508 0 obj <> stream x]Y6~|],q''snY#gcgLAy,SBhth4'),+2ڰl<=ӓ=e tEFR ?i!*O@23KT߾?=y3߲NO_q#kGt-5-9 O-h)$ӄfZY)(#J?L)Ki!,aCde*/x3 (v2%-Yvx3Tg` '%(6dq/MTm.gY~fLͯs*f* ?6='qPut(x' aUA X@AJkL{Q+#ϨBTo/4P=X21T<)Խ@[/XW/GH RB[?.!tt:5Q:$}C] mmwG hm`EtIjl^R%LzU'J+_ǭ**]A]#Etv^E!9#5)ogF}Dٌ8@R`as(EZi8 773\b |y>S/`ꮖ lYd_lc2BD@y90gd;.9w9L 'e;'_%T΍ǽtҠqC/B!dT=&`Ј$g$`d0˿?gz]B!OaBI4G [XovHۣ@4!i'`vޕo9IX Y̔򖚇qT+Gz$!>P(V7ר;?I$.8Tk,xE~H?SF}+jj j^TV޳ czm|1U΋f+H' EI4s(*|vʛo2)=$4>ѴiB0DPW:05|B<*ʯ0p'%΀1}D uqy~4 `g 2Ts8v+djt+HLq+,xllJ)M]f|^;=P/0nd00XܱbU/&szv0kZFM#ƣ%7ʖϏ>F %3lhi>WxTpV.ܽõn?-J c ׻mֽw/+ \2] po1=>n{u ;jwX:꜇cSM , "BFT~h |}>Mnn~\ٰ!%QQ)Sb)R81 Ds@xPE7W-Y.ȫ@0Ci ǚ/(z7P| tm:"E Ic6]o (T <#:IM1`*J\mrTZ1`65-ek8+Ŝ}x&bm"¨X7a ;0窱h:\|gl9hR.d1(W[ait(y6vWxr)\D%nt a"]`ÉCNj\7>cfXX(w֫ 0z,=, ۸BЁ|DEwq9l2WSpk8 c4iEC!tbP`qSGQ9zj`?C{=5"F۶F;{EPD A-UN1Xa Snǯb%HͲEF2HvI]"J T^&7Juv_6h^4 {8T0>Xv@c ;..U l2RjP F5Ql` -֔-1 mQFM#-7d7dz~!1YԯN&pݾo<@MBAaQ=ݪga_Ū (}^%\ܕL.áVT S Z{N)-cusz ̸^B݉ _.. ћG)n 7suսUܽԡfFFq u{zE>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 510 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 511 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 512 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 513 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 514 0 obj <> stream x\s8L=ڝ O{On;^?ͤ}p7֞ԗ%ʉLu&,B 诧'9"3։l8=y [<:?=/"*;xz.xVhU";tO^̮ ߞ\Lӓӓ;Y{3Oex.uF׼LlL>2Y3Qdb.M}|P2A*aL$Ja>Cח)|P/j⨝ G /&<UXB߽;)ř= Y\.% uS.2`/?MdLVlzf&35YOdr5|)t4;TLĮr`frV)Z0E2¼ói ,/ZP( 4mjw]w%+i3#E__WW:gIR(%v.Br]hwa]||^1Y ms>e ց8mkl0N11nzn4_4ݻk/s$ Qiw3j7Ly\qW CP=5]F;u%.4YmiY St'cT1lY60й8 HX.&)WOp[\l=u˩,p[ܼ_ݳ92)9|AH) 9.(nR[Rj(fmPS cx4C (qr1\?{Nle fG\MP`:ݾ{CWj~C{M{o0c0{ %PUڽZ(Azsy DhzcZh1DR f9oT}S^x0]7 fZO}~SLgx t֋h1J @Kdehf2~Ɇ% heFF2Rc6rtl^<5 L2Ld"p%/Ȳd}igӮ1Ҏ6w{rf?,5Tk <{Y%Y4͔5G ԣWpY>7^AWO!;?4Ǎot.Wq\| |@ _F+VȎ0tKH x?#N+̃+%a2sKb>ϙ` ;d.#`ջa+`ft5bj )|o:^=x=X.Cs;M Bchߪ+gq*9Yt0v j'4R&Qn~$TA0lngۃ4 YQO: dG *c4R /!(pgt$/Nƫ4'x`1 xa_˪o׭ y,igK{_$}%r_.6 +lBV}-(}PD/q][~UB̷, >NÎPW'o {wSOa9ܛڷwQ\5ǽI;!:7ERljy¸ wxX?iCD dhWQU(^_EU=`j*0c^&W(M*8O pwk>^Uq1}җrj ԡ7n(M[G۽Z+Rbur} j|e(¨y^6&EEvg\Ka#-W;&ַC`vWAXf7}U#8x_@-WFQn@*O>O٤SLCYԏEd8N_bTթt=yI0ptVȮ竱GF} -YcҏtJ03.3tjz>A_c&íʬ]i@ք #P}ģ3 M) 9=.MXOe nT/b}֓X 0ݨtM7ZSN"6-pvF&{Y-YB;| p?Ҟ&r $׽,=~y; 5aDMǂ8aa(3iU6|@Dx然1-8-&+ջWڭ ,,o{ ZoiڞF+CBsfcs,=tp0d>,1͐1bD'Ҝoܟʷ=i1nC$m).K%pH>LⵣX *j(nweGm;k% \= S5tPgr} I4 H4@,K(yUg 3U hTſ,6Ejϫ2YJs@3$BGu}|>ߑ8#`Ϲ oچ)m-@KZgWE ;g]ٰ^Rö h`hk:Ը m;UɾH>|r ":H^XnKW4:"q*܈>'htDht7F[|Nx1$2(tt0ҟ09U}q1G;`.pq}^!I?aow1FX[tAF ֳN;m&B8ȣ endstream endobj 515 0 obj <> stream x[Ks8Gr*o S9z[TC2bWŲ#ə !P([590@71N i'ߑ?/3'Bg ˆU'#Ֆ\/o,^Ørկ_f$\'罬,PiVE; BHFV 2bTA%VRGZn מLh$3Rz­l*/%$:H/jbd˫+tOUq0 ޺~~R2؀BCK KږNe/>:[|M>*l̙]DzuOsND쫮V֛SFXX0@f+ A !~=D1.BjhPkjND qW8©[0@[j:SEzУFI3]q۴x1Wൽ(фNTAx+9լ%pSY3|p<#ZFn˒6[/[9nNsʮc-Д|豮H[-7O꽙cO@hd 6 ]O?U(GZ/z9oD( (eatnQP`iJ>6S:p>A.r󛜙~@(ſAoIj]D[v~҅oLa3Rc"|>"zVm]|Q(`Fi]=DZkBۗPIuf⮡@_%(f$sƳ29D`clXq<)865f{q_U,X=nHΊg/n3>  xv.;{hrZʏ1]V4tQ0 Z< =cw]2Ga}+C1Z{BБמ8 V?v BU'?6jVRS@@o콫\*x [2,I*BFۿ}u*\ZnD&f Ӫ/˼e_G"I~{3N'ù<6 endstream endobj 516 0 obj <> stream x]Ks6#ă9{flM6SHreyݱH&ﷻAOPUSA&h|ho'1/"# &vuzϣɟOOx-"Ytqģ4an0F@i~U_}}z,+xӓDgJX&}伃>fdcI(mAD#LQXqtB]}^0A*Lj$3Ja]diʯD*ax@8v"%OEtycR8Kxw'VX~EZ~Jq;U%QLwv8Eīˢ[7ߡ!W%}was\ϒهU.zwUm[MB3#I=N9KVSִ[YK[Rv+4]Vtb;rc_4OgwO/nK2\]mO2͒XZ@w| Gw߅t"]E0E8#9 8:((][ptȱ^U>o_|'|^NplxUY]تƚ}|N0%Kh ]-KrC;_a_CTՀ,>VcYlIGRGV rK8H}p^LыhFB^ kdۀ@(2:I"%Y[b4)f:55Jϱ(.pAXCRT1co[Ap*޻urcUBP}?,68 994hz`h&h„6ohd(hЄDyG:9'$%xx[Ap*|?`d n~P4UtՄ ^o:p$c&"F T5Fm Lʆ,iӳk/*c$˲VTX[*T|[r:n ^7 ) )֥? y(売w[ #Zܮ C~^+щF&?H޵e,8KGbx2_)(g6 nGGp)e>BƥT_qY>R3bbO9"/&&?Tϛїw//OJ-Vd>m=RӖ6$`aR&MFҎ%ϼ,ӷv6w,ovy%cEHz^V:ˁRM|y ǠYa)]^3[?K9@K^#tDb`Q^\UM ($b!Ðq#ʣGRlXDZe[ 8n4`U͇`os<"yE4X+,hrө;9xÐrr/My"@ѲCE; =BOU͇w&D~D,$):%AO&h?Qx-qf”'=xcİ3 PQ,)}:5"oU{]}$u1Ō4Z>h(TQ1p+BCE9|$+1I 1S3$ I5#$ 4T2ҧVx,x=!WzH#q=!i`* ;cNE;í 8 e|t~oǕx;}4ui=Z TIwjf&HrbֈSQmz'k=o2zO%]qr"^ xTbSbzi>/Vc\OcÈgd3 źB7.ޅ|G= QNXD(y`A}(/HhjLk"o\sG\n-tVh/䘧FFvGt4\.7*0eQCm()EW } S8U#h^F\&y,7e:!ib`f7axl8~Tw>,<^iC'yu*~GYx}"Yxj7q)ga4q3q}GYx}JYxdYx TY_Oۡ3?mYT8,5,n>Q'Yގc,cc, ?G endstream endobj 517 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 518 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 519 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 520 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 521 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 522 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 523 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 524 0 obj <> stream x\Ys8~wCS&gԖ,N,9\n ɦ [Th|h|  f1yők'bzxO?',zqģL1?R1EP,XB}ׇstÃWÃ6L-c"3yG X5ze DTGxy1Ƅpvg#H]!3!P;5UV]~ J? QƴbSTI4ϖC Fq LK,g$2xScXO< ٧P,Y)qvKQO S%I~EwT 쮲 #L*XQ2 ?''͝]Bfu)K._~,Q2aVay[ s0w/oc,@ dOSg"RZ̐k->zSW-ED16(6 `yx1pF' fG̞ԝ2nc@P _\>LVqa- n m.',lAV3SN# k}o"S m0核2R9GWr},\:ʸ1\̢i^|JX1-\1m.FTLVAz<Z`:D^)&UuLRL4M47 :&ku Q4cކ󂁁@P=rPqN^r5Yθ+: KɜO]7} { P39zJ~ ;\w(V ; Eԃƃ( h[w>PBX{K,(ò:WZrv ;Tgq%=F/;k*^@RȡLg QAM|bEރO"%v 9 Q3eƷQ(P|,t Ǵ;0(1ʇL}*$?渭fRj-f+]~{v*NAPkZCUP5**hSթ%p?EQ%EهE@ɢ3Ӟd812wwP%Pɼ"RHWyD2nV$C΍m+vinT *qgL?^#u`+CPvQ j,wBEQk׸=ԉ(pr{DrC ԛx^P-Kx0 AiSA2&Ǭ(?AnV#n̛hBoƷd%bJF*9A|+i/Tz9ބ S'?(9iQ.i^\:FzW< HC"OplҐ/ b? RXw u=x# +C }Eyy}ܖHKu'(_&WmfX5qߺ:5Nyܑk%szDi*ԏҶPOE1V8TS|Aݫ%b5Ͻ*պ*u*J3+O\.@H2碾PP|u{H󥖏eN&Wao51*:u6 +H큌*P?R2 cޢ4> 4N[I>~+AkԙGq;;\/ !K*ǼycCNUNtVv<씙ʳ&(j*ugST۝[yx Yq,pY[}S$yyĩI(ɐgyrVӝ&x))gG>t[7(TfHS$O!uCZ9<ϙ\4yM8(pL0؅ ivQ1 <4g+/85a,G2E&-bc:1Mg>b4ꍾ>c7δ6^.*I0 n)ĸ^l2C@笨Cr_ ml̴3vuNWyg )hi~DJ h)`F&txSށ)dG'=2|Bk̩ҙrHΜ?CV)!j(~l.e']u0U`qFМ0 OG`@,ό=w v.N " !+#&O+>/o1 hBd2] LӀuor9u~dp /${^[>MfY'>O<Ku&ƙJى!17&%O|'|.tGU[G>yF?ZɪҺAg\Z qהȃIx6-]]ƸfdtHy9R]p9'4@Ma:L~>GSf!y] Mk%ד6"hg(з&9hk,$:G!2(bǽp:x7N_ د{hIZ;Fʄh2g"fPyo0٥CMgaN'&Z,a)v(Z޹<ȷZ^UCa"2=pa^G$Bl,ԥoG5 E'XrMw%|XUPbb5FB\_-qSas"o[N X7 \<_&{IhԃCxUg2=Uc5C')GʐO #i 7V*gw jbRjZIJV+&`pFntVGqhY-e,i0>j矻=`NG_>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 526 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 527 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 528 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 529 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 530 0 obj <> stream x[Y5~ߪzXet!){@^{%PdfnuK}|t~hrv~#2??{:>?{h._N)eHEuAƷMAV0'rO6<=??{;"_dُ0O[E{ ϥY.qTnTF2-7r RHj T+7Q)vlB#16c+:\q{)!0@:{14C\%+8OߎXn;2 W:˓Qz [\/n%e8a$Bnq:G$BH_ena댉ь=\xYg,p/.3O֫;l݊Yjelݽ dZJ$,TE[wNo_/ >gv4wCW(pE^Mp0J7ḵK? {|X?SV nqp ć>l'a jv;yUX`AҖ߲;v31:~7.fTpw֪Ĭ:2w~V6\)4c,d5؞fL//Q\V)l7j?,V{ f_ZP;&:I>˛+wf MKD{dߓ87* dxf6ˊlzP3Mf73K%oCp WT(*\9PBhniX0At'̂Q=@ҍn Zpn8A"E:DQ(utuXL4vE {+\QU F]Т3>J/d?Jȓ닎B*/*yw/-eKYXZMa*IkPsv L^2!D|KZzL^ǬŬу&5fh(ړ닎Buٱa-V&"$l 5l ;uKy=Ot 5= P(E% Jqr{lLR2JP{Z-x{?%Ny|j.C.1eN8)1{h:\Ͷ{» wu鬷C,59 æɱ> stream x]Ks$ J3|)/rhTvcyw]=ʿ7@vϫm/ 'h'JմyX'_~)Ek tm#`…=н>4׏gs_oNO~X47==3x~z(t&:TN6 Z}+4&ll P FF*lKd!7&t_" *Z^Vaf$yID48JTsqBv CH軈~pz;K`vR J<I,Jo{1O&HO-.9u0@hC2-E?pdjɩ6i 'k ?R?dޡw=LΠfY il,Rf?A).١c$}KںȴDy~\E _߀(.ނ~BBu~ۿWNNE4秳rsʆvxu{K*=Wl:3޴g#< A;=Foq[uWrl\p8ICg2P@';t3{.TkOt4B}xشc46Nljjk{ !h~vb k (\ŝnqę#nkiH#iStHg)]MvϑKQfLXkk]Z=>ރ{nis;?8ۏfnt2(׷KL{L`?,cv{Ǔ+,^:գ6 qtð$JV XX_(YQWU5Q%xx("f4Y넫"Ej /~em9`pI%Ǝ4,c,C~{ PC=?4|~TcI ,i ~ie@S#ƯBV`f '[P"*kyYׄ5Nhjx="MKh[2x<0"&g 4-Chޤ 10G^n7)y`pD*ⅴAXf$?,4^H12VX#7bat2*|C^NHJ~HhRz> _t销2C*%<])D]/lg!- !9!|7X!8c>^C|՞ҳC_QDz)Qf)gAqWѶ77/%T+CBlBZg*E_8VA!)P΃!atP(dTn˻ ˝!=lb}&K{ʞUHD2}[ZKImc^ƯRBc+HUD[(1E g endstream endobj 532 0 obj <> stream xZKs6{G1#ěHOI1m8@˔&QJ|$$G@S?4?8I,㣿ѓSN$0)ꌌ,aNr~׏GoF$9>z3:>':TBw2}JFUj$#KBqC1*<#0NrMLkG&4)ag!GJ|^^ :d'ɛcg8K{so]bũU[VR+Cz#;o<;Mpm dV;|m8ڄ=@s <;; 5rZE\/v;[T\QmyxſZF7.h{?8^/ȶk1cq%D(yeb:pW?]AQ>Tzq *`FKaAk/dL6 SθO\xڸ{Sp[bⰻ|/1i֗͞ 1Е鋜d5{gsq=|dFGꤦ$ӄFuƼO $z?^ӗgE40)'Ly X (OĂ"$<4ˀP2`8$ԘwUt{,و Kq=Ēm4X%bIܜ55{I0]抇XSopёq 3J1Gv{ q>/Q *+Q}$`7j9qՕ9|(݆Oh5|*fF~!d;a v ZC'7;nV1+~C-{Jbwgkn `.Sj6; Jx &{HM`BaɶqoCYm)"IB][PNS/VMeǬC%vl4zl--m4ue(&f4ʶ#xOb^\`GuU9>,6 .w >}ܝ-L14r!F#T!d$hfBg蕙7` na6vĬh{ʁNXj8:y7;o9zFN1w!dV1KWl]p^8?7|B-ߕfK[ 㨊9+sǷgrvY;Dڣ?T|%(/5yXn|Vۡ#=h]vFWpo'˜J~GԫLAq3CE(M=,&݀C9M7H<._U@hHB[1p?.* _/>\ n q1z^fuM1_.!sVT ۏFushC ȱK!}VX^?_|2Ziڏ? sp=ʯ!up'i4u@@=0l 83Qe>/0?m O|@v 9f/-_btaD !TT{ZزBt+I:[7EA)*Wi yE g_o_EKsR| E\kaSjlH-I!FI@Jib,ج.M]B>Rfݔ e"$d)Tv6t~vXc[ o-o̪px{YybRx^`T:F kJ[Agxk009/K׼U(qשB̨ >ÛI1d=8|h~}0=˹~ώw7T2ALS*#[b#Dg$``9tQPaDuwC FI endstream endobj 533 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 534 0 obj <>/F 4/Dest[ 145 0 R/XYZ 82 721 0] >> endobj 535 0 obj <> stream xko6}-HQЦi4Mm9,?.j_3CVڑn>@\HiѐBA(d"X?>98|8й9abN o1 ,E<ǐEAѠV-K0@0d.QYdêMmv $80IYdqY8:6jv35_I;^JRFT-߭yԀv =/kGQsQCmyt [MSJFTg65Z T ,4˒sncQL}*X8q-Kdfj[caB8иèGws6aDjqn(NE/Q Cj?̰?L'~RAZwF@# |wC:|Ouȑ+x$Ef8`И?۱xk~n/_Pgu!޸(uT:3t@ X3ymJpa en$yNpmsm, ~۾g=) .rwM#(6~i9~Y5*|foeeɶVYN 3ů(j?66F6 Pk$1XU+a̋B#xq1Wd;X())oKaʲ@Dcxl[>?Eμ9E#@:p,)2.0Cх\/<r$a veHa 3?5'ZaMθr~q߰#wσ+v9ys>%:q cV12iQYbBI²qwG7d Q;eJ@.7clO#E=I_uY'© |MstLDa~ݢG;,H}Ou" 1!G&SXȓFhuG969EQWO뼵Zxʲ(NxT(Ro<"C:GvÅw%xc!IQ\&w}q]vXvL:.%qJFENϥwcH)#*NQD˩ae=0^?vS=|QI(-6TG~;cgPjUʖ2Ҏfpk ]s2}tgSG$1~o*w|eL@o{̣9=ȲO6Q 嫩im#f)OS0gdiݑ)]kƽE3\~rL8Pp0C `8@ѧc=7Gnّ\} o儏As !}8XJiy渇 ;K:2:صi>]_q>}> >/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 537 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 538 0 obj <> stream x]s۸>J%> Ow%5Lnɑ^ӿ E)P3΃BKb,$M |fN$/яgGz-Y#ti[3нh ޙ+9>mr|ї=ѩ2<:kn%-) өLd Rh1d:e&V1p._LJ"2pmdA֗)|P/j⨝{ɭHΦ8 UX»[97+S3[-daEMp {y7Vty}3۱QOh÷9~,ǧr4sl- '99Y l0`yYq %+plDu7[m*x%+蹩3+LE_ʫS,\$u (9v.fZLێwavl`{bv?7|~G2c(0cOc!a@c"+b8n4On /0S$QYQiw3j7Jh)3})  SS] NhNV@g4ˁ^h`D\L?#N3t)w1=) jrC{X!9lvroJb.ǜ> j1}o#)Nt7>gn> ^q<Ɯ|w1o"f@.Q,Ӽ(u-U_ Awr_:'էTvrNzTdUG rM֨ò^:KKX|]1DSp nst%o(ʌ%mF$8BOIލK'dlc \_QHZPj.Iv!Ks`qV?CS,0ҖSS(I$~tQ}>%8͇6jC# tš,qjm #/ןh2*6lIŬzo -""(qɄ?/+GX1]^OQk. QR Q@-{PJn©/ y>o`c;D˷cT \ U{GESN8 䆥!E5OӖМT|+_V:k UI")e &FH6zlݬhޑyϩ8$QL*u`$mj 4`> f2F KK8KJL" rh[-(y4Ďl ! ,ХЬPܒo0R+Q[?`ڔ:%G{DUkYp6ic0vFl=6+ j;udJ =5=A6,8!>۩[i,l,F05mOxq^Ck@7Nc22u#v]SE2]oIӉ_{dقn4!eF#3řhz7JLpɅ9 D{6BR/ TD'ӞFZ\Rz_S&4_ǻx;$F {-aI}{.e!]EaRvFWe`rA6 [moOf~(Kw Ak2Zf\p#,t/2>tq&Uo4ɔ'=ЙHb"_BG̖*!,~2M6f'Oƒ-&0煟>, ( Tx"NLL 3>1gsy ^r=1QrP=ZPD"3rǜUAFjZO+@/J/KpW@e1͆^GpLpi*oR,]O4!=rx` (qwv뼹&%|q2kYG)U}3$Tp+\1!#":_ VYnzF}Yjl?\NT HUK]L-V(auȍab~?pg1Q0k!p҈ *Śv BWqd1Oh}GMwXI+ɫ~]_}igO; ZZ kOWt(Nb >k|bky uQ6 "ja |ۋC?Nc]4~~Gz'n:9XUfzgQ%UYRJmwv<:SZ#*RTL~8u{8ISKK#CE6tSGTS^5c&n (mRԓWxG?yvhΑJAp#Reg(0k;m]Q0TázIa1`BN 6jKS"xOGZՕ/QZQkP7mPy2;*3p}CSBw@k")C֬DzEWݻlhejIQKF^iq14oq-X P|TdS+X t#~j*X=4Pj5'|^Zt`5{+Xfۋ_:P~,X Z|Jj@F`5 <.X t4~jQ V'Rj@FhgOj{QwU݊:q2ٜx87,;J0),=P]l:6,EYleN" endstream endobj 539 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 540 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 541 0 obj <>/F 4/Dest[ 168 0 R/XYZ 82 721 0] >> endobj 542 0 obj <>/F 4/Dest[ 172 0 R/XYZ 82 194 0] >> endobj 543 0 obj <> stream xkovEJ&-m\QI?ȻwX^w|i%})gKC΋3á9?KDJΒY?MϾ~~oә"ѳgdt&b40JO?=?{ #~~˳蒡rlFϲPR'BDh9{YdrfDŬТT}v!A4'0#њ02ƏMH&ԙ*e/K;u%݋=y KKJ* W7WpRx,ys.H۞okCS搠/y/Ee)J=0~HϠY!EK d%RE(P$#S-%"sFD67drLjd8u5oEayYR4}/3h(Rѿz-`f2?.rx[AS /*K;y|ڂrƏq7kx/} t[{#`,?|~6q7Om5 =|\-LG|~!e^ľUˇM M@,̼\YkJ / d0t$%mRf BZ-NE^IJ`0u"hd ZYz.R }J,g2QW>@%]aS9-J 9-,照< x#i'InsML"_1 xe'j`=(iƲSo kv,&9i".:s|8W( kIs|e0/N"UX3wlBے62X.w [L#6KshY,#ܺ^Q"iMW-Bc_fgK2pc9K(mP\$,K͏۝޾9)LcNV559Ln\ob4e٤V#Zd3DYY97YX߫:y1q*e7@2u9I(>/l^b+7H+E -E/Рmu{;IX/XZXhk`Z<) 47bf QvT>p*xor)Ή$1;//wz_l wtGn mDCgYr J> @ 0h5Sr-zF`\bJAgJ$f)Z9xЃfho!Meg($9ԁU)g RdR +>c~iʎDUY$Iq*55$Hu?:K R XB?anlT5+|\oYGJl`yd~Z^o߀+ T+SdtHIZC8:Co` b:X{F;Nz~x(;󘽟1c5d:v+DB%XHOk Mሄ|R0LJU*=GHڼCQptfD+*~@hi_82ߎwo16J1~t; 1io̪@{2LKQ߃<a^DqJ7Pʬ,|x* Gc0ߏt-Dw'(} &ԠEe"}&BJ!VW6M%Vic C*M+ʐ(K3&gy9UG>. OEGWNiR~2\%Ot,-l})2.P%_LhΎ\7np;!ȵZ0dsgTQK-ѩ[@KhP1ii6I|Z$ `kI@i YJ0L?5ca\/;}ExqiM :(NSr;xG)2c fuuN AxR2:M.#úO8|!T|:fl6mJQq>(  3쑝n'->N16ʆQ+HR@ b[J{ܵ/?!'w5pa'—ʯ~4LSnbԽa]@FI_zjh^Tx07B.%WJJLTR^kQu$Vwt'R`cLDBQkDH+a! e=`4Nw*@"}ez;^,!+㥧\rF0co{r$ f(l$.s#'!T]$A>(b7RlexQ7?P=8 G$Ū ,`/+pƝ?/9G}iq|ySO6@`B$>iٙ\F~>eo= xf2x{h5muȥ7^<pKxc3K%ԓU*m¤xVma/MVI g#n*Ŵm(;Tk ;rPƱ:y![Z5_)"LL)Iwџ)R'('Het*K;r:h~`a?1俓t={zkw/-u!UD Ns'xkE endstream endobj 544 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 545 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 546 0 obj <> stream x]s]3x pرtN4ӇYH쨿{ (QILvvorxP3\dE2"[6>:><[q p+2%R%uv| x~+3HO=;6K!4!Ƶ N}~)勳/࿅dFTs FXB)S_SDOMf NCtQ P^9W42)ޓre:شz)&i.'Wh:rB(' Z: C ˒0;Sj_@9V\+l O8E~Ix&דt ByػJH@aa\B Y}AB x/'ؑ%8=$}iggBiIY?!gFs6m$`ٌZa6ڦͪZj/B@Hl$bnK&a4 I!=L!!'5pw ,zq8m@|Tc[@ٌ~%)VjS~FbWsek˓&a/LLhNUrozYńAI0ivk +8XN cCkZT0NDYB}ze3ȚGPѽ!Kx[U@9փĶݰ2z},eJct8=6M{;7q3; T<+&3ys3q1+t(W&q "v* $cz估9c꾲ޗ D? n5, Z~Ebv 7q?x7 Y.R46ێYA1*ʺ;tbklʕ9Cpm64lNKf,uH^,j@%"Y 9ϋy@' xL,w̯/[ *k2 _.tkCdEQeϫ he]E̯Dj;gVEGtaƘ)ߠ/MW ? hGܫrW8`Y;D$[48p*s=`q9^{`ia:KXnhÌb $H5%5+S͍S X&YbPE"]Ѕ潰Z%:+ wؑjz}K> 1bzuݸa jYCjX8vx965_QOğk9or!GY6h'kG)VȎv e#B"EN/pjBSlW!܄Y;4˯YX !st(-2z:XYyywHBHЩx쒓9ϠSeetE.9,EȏP")ydXӲY/p'?ؤVW~Azrrh K"ӻ |ݫR0ѭ|_fTY+Gwz K#)Ȁr'WFxS J{NJLtiu<9&Xy^FW8c[j'S9C婂2Pdr5Xڮ'*kE2 ^'6^؝d<51.}N(&8ܼP/u穼ij~OwwLNS'D6q}TLR{ѝ|]r6OB8Oʊ|RԘVD!q4jiS݂7[\4slj3ǩj$$ˌNd6n{ܱ][8?R}R7J1~7įI{l|O"2iOkw}اCqj?9p|~;7?R1QvCJEǐ{m[t,JVЎnAd.%q6.H˺낻&Z|M'W5Tx#ns%’~G<BXAm,PN.X׸'Xtg+Bqn4nO^N*TVPc/ U+>y*J[ecVK0\ endstream endobj 547 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 548 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 549 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 550 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 551 0 obj <> stream x]s6=3zw6)ٙ6imss{zkbgd@R-QN*Ioz3ul$@txWpϬfyxÃ/ވs\$׌CS43yrrp'g̙ѯY2Or1^BJwK{S&6S"cMn7JqG'_.!`IQïi7rv;lh)(B8k8E) e(/64|2FAAM$\fBTgu91׳93h!܄6}PDtKtZ['ʘTcn9kw㹚oey971|{?GwzT70Fsa"E1~& -ni2);"Gs5{dZ9Vw :[[A;muՍ{òQ<$0ŽgнbF7ʆ3 ,hF7y$sYy~?G>a']l 7lf Q.Ѡ|OAț"N1 BQ/jqhAgqҢI00(/T0TCnK3 Zzn yw7ƫ=^x"O%b8cjQ^a]2k=/pDDpyda{1£6ASIyZb",BD+ٵ^ߢGv"*GS:+WEOD^r]8ukӡFPc]Ȭ}'ж 96g]@ އUip(sZL,񶭷eKܧ_nܙjYOj Y"tge iw-/أV*E tebko+ dQ+=؋]QAP]M틲FyM&D "Ǒd?–9*^ )}?i#͙ҡeo еĤt ҕWK`'U2 \ /4o>j]}soIre-(A=\,[Vڴ,ѩbOQ.oý49-C>o|[+oD+y񤎹>؛U\X] =YFĩh8sdD>^nwN>$^P:V2,2&b{]=$n{R=I19ݞT`cK=NBxԣ|8T7:4 jj)".{UPsg+?Ϲ{Ϸo}Yoʅ[RBunXAAхϾ`]Hl Xg Zw^/&v*lz>.% fO7A-+ak9U4.2kt<[ĢK{^2dcT[qĶ6{4kvlf?vl;R=m1a:eL,ӛʖY`ds "fH#sХ|Ms~^xڵWֈUW sd4 ֟` x]nƒXFx<5Y֎?l[-U24/'1Z-i=C5^:?01b-fQp5Xք};c l[+in3) LyJOC/g{@,w4KY umvT5t큪y@5ᗺAwrЍ!g"@?f<8E)F}\1sldظoEbD4`:Q++ \vʅϘXJe]u`JCF], s}%XJ(5!:EceTE}`lYUTj&*WEާve׿Xce_?3H4T?&*3k2TV)iX6&(g|qD ^zؽ]\\**MHG Oru"X u2۔N Ҵ {V"V!<ێDj%,ߒP-݉TLZl;۬"'OR:S1ܘA’ڈJj_~i+ѱRBZf6m<.4Uڥ+aO&-*h?p^Pg'T)Yʻ67X&SWB XSYI%*tm]{˻KX̂X8=X(ͺZWO$ G<-IYQˊUYQIˊzqN]V4N)( ʊ(}Ⲣ=✺(G!TV4^ Ê.1MYJf"ۭx"3Ui:@x8E+av/ZxI̤/ǻ> endobj 553 0 obj [ 554 0 R] endobj 554 0 obj <> endobj 555 0 obj <> endobj 556 0 obj <> endobj 557 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 558 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 559 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 560 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 561 0 obj <> stream xko~[ .wm.p-$~]gAR$} `w=3K}9>H4eI(5KV/gG~JI&# pYBB r!*}S\a|wGΒ?ߏ<>si tj͸L5-8\dXH2#H AtBQ\|«2|vfU4īD:$,*-,oR9^-EʻM,30C}r19_^#>QT-B(*ԃ O,'ں0e𜣹+m U#JH쳹 JwpE_&MMFi{MGU:s %~Y._܁6JFh n%ܿL >:: ewx uJR[Lw:lRjIU9o&4Ә=׏./g?̉>o]]fkL4+rT:2 G^y۞ >R#d|&31@CܱXgt , ʼؠ΂0xh`:7`$x+sj.*bDi_xIޢz\(r\ ZCfZ=Ik~戱oֲ.[$ܦBR` @F,b`fF!(Á }B:G@aq"Rށq.Xr2|AxclppAɣ߽7T!lj;nTآB|&8fm#:q{Kyn OjbHub?Yb:- 12i (ļm%_c8v\l̵Z^v8߄x$G4!N3Byh!kBH#cG5;\ 20m;^-vBߘ̰˓vP|b@zx_+@zѮ߷ l"h,z Ui=RY3 !eD աޥk566>}e+I/7?FT4U$c=jcj𭥽NlR6O0/C'޺Qbcfej! !h:h̀!$:f[.L4ϔ-fщQyBw)JeGǶKGnj.r 9Dkpg)f)VH`bxrJPebaC|f"aM0琄5Vv8La?54 X!qGF!;UҮbYUw'V8CPlw|Zt= pǂ8t$gD<q08m ѭq3KWdOȉnױd-#'{s\YMZcӥ[<8x.aoʑXN|m6aD䷫9 "hT0E io s7Z`k2O_``I5PtuƭGi[s(u]'# >\Nr՟99nwE)2ᖉXbk q,(ݦٌ\nm*fTiz is Z`pӕ&wLP{᷷_q^m f۵1>`i2X'x.] ; -<#5IVYRkLkGqiy=><Lj& pf{u3_S93eΗžk5=b66h{mN5?~1|ku*oviml涻Tf\N2畫4]CN^G& F@ ٬JOHd/@&j'9 0E j}Ko]0wZ6jQجm#av-ox!I ʺ0>u%wkNjk);"ta`s2f^Y 2m\Wv÷Wӷ#'ݡ`WĤ$>҉:#t_z:ZK ~&AeAQ5Sd} }o?БELoy,#sy;|nXs'u)j)s~vxę%hq|Bm OC}6|@g _KMHkdNt{>8XW?8nk1i9 p`Xao5w@y8;f<*q/)$wThk̍ɨvmһ=06LhlOZZNeul~C I$jf1Z5ޚ`m d۽di> stream x]ܶ *>%RѴn8t2ϩ:_|ER{Z!@B^<)ϊL߲?>vOxu񌱼Ջ' 芌e*u]Ͽ3{Ij'߭?_<zIֆPiV5c" [ Kɲ;B2gYWY%:c<׊{cT\HVJICdՈ*/%d.ax@v2%xvnX5Ry%<M'%kP)dqfy%rX{yV/֗rZpw>]_UGJ:O꼖1iZ: ;"c2kO%@5YskAU`x'$9gig9Q8Xsb]:"/l 0CksnaN! 39G#ݏ-xkMkfWrtOCt;ha7jv\wvOd~GJ 75a=\5c[kꞤ 9֧kcrnq"6rh9q茯~[ҳ܌wpm;58|=l.uli'lLO(7ˊn$x0ø!H[m1F1!éپCޠ|{ګ^njr;pg4#J܃ կ utތ q:ƠAlz֫+ύM_0kȼ dыx_yXP /k-rC !5>l2x(Z'?w8d8{>`,k}fn.6:^Cf\F7P#"ĀW RO4Y"U7*.hhDk1p xFkה @.}`"RSijuf ّTwB;Ilڭ= 5&sme]W&qrPSo]XuA:%VXt`:/]M23z5ޒ/:lcLPfB\L!z;.!#, ՗9=ase(a2ӱIX8űaqD3pu(];aȱpȱH'LZM@+ԭvmT l1zK +xZ;8[#Z%ƧcZBTlQYxZFK=A,!'}9I0-㘟 [mC>ځmO@!yqtB ߞ %mwLp4M&>sU'֮@E ;scvMp17Dr8>D7;hNi0J9ܗ>.G|S(M{M{ 8K6Ɔp)Gb)O|cY4c9t.Z\J> ~'cxOgIz|E_Fp[_*KECs*8t2 :p2)2HQd)BD2ɦCC<)lbɀ9OPiu%nXOf)PٕDm5v7ډ}&o- c]i܄cݴ'aݴ{cݨcvU|S,n # L{J 8$Itc.Er.2 Uڼy2P+!O<"4eR4|Ex Mn+HQNlGz&ihr\5ڏ&)1>7f:; e`#IHpC9`~<Nd2}{j5/kW%YFҒ$٤IȺΙ_ ?|c_}> L>L4%sDr&BX$6g2 Y4vgeY> !2E;&Kb4$rVqR[z#Ni YDc`dUP˃4^"K) H$ dGSA4j|lNE' cNKҢG1X? ( ETI(Jx4ʢAA(E6!|7"_<UJC)iDg22:a[d2$Jq lA$z >+MqNבBIi:/{xq\|6~?߬m_ ~ܱRVsRKTyX?~IZar['KFB+"aN~Ž$*'Lib6 :DJVZkUhh [_JI5ȑu#NllŐI~>WuceavUQ@D-PLׯL50yD۳ti(@}!p$,IjU,4Am=1َpF˽vPvM#>ow3tfMst|'ڿG\KS.\9 oms1PWEQOz N=p%TN&3K&øɶ rJG醧%Ύ^ٓ5~R?yOvWYAz75#aB%ȯU>~.L|l%==Qe&7["Qȼs+Wj(VSue!-fVߟކxq=s`}\a>n,%Ϳ8[Iv,łD4ۏtzFE1aRmDX ~*-\}֤W?} 2߯qH㓌?/e)v[́z+'HNYTyQ?ުCQ@UWi$F;%EV"bFvLG{A/^1ӨhߞXhTF/l74L1h`ߺ"r1%ڏ6m2\8/TGzjImQlo:;_%zw]8\M=nn;G|+ㅲZ_خ;kL力ǩ""d ^UccَVO OThLZ(m >!z*WYeI߶$ V![*x3_-\vkA4Wbs  hBQ-[ZJ[DlC h ǍYb0LMa+WL} ,Kh(IJ2ipUvx{PSI z},u8km\".iSvI֫mmޔ52jd-n%mJl)"ݹt|IޔqrqPځdI 5~D7љo;9 =P3K6]{_+n=.d7`s7Xh$omDlȖwV!m(pnЪ_87w'"Em'm w"mgޣ1Spzk{aps*\aKmvu_ Y:^=}d<$=kvmD!+a"f #!A\:u T~VG:ea̪eb`cϦ[ _3qV̙Ntm5AEN7ü} endstream endobj 563 0 obj <>/F 4/Dest[ 201 0 R/XYZ 82 543 0] >> endobj 564 0 obj <>/F 4/Dest[ 201 0 R/XYZ 82 456 0] >> endobj 565 0 obj <>/F 4/Dest[ 201 0 R/XYZ 82 456 0] >> endobj 566 0 obj <> stream x\o.@?xH]'Q'+N|P%rlwforIs,;>QBc_c>*h~omw70fso~d0GfE'K3*T揙S"@7O#Yv Z(nˌJ2ƉV'ڳ lFJ~RBۋZ'Y2˳_6v "aQys<)ql a%5#V \/r."7s J̟ #b8fh%oCAT%3 ) _@a*jʇg_->yq9 #J>9͓U<4JA N$o7rT:{R8kC2]NI; <0ry\z}c̨B`i ^wMbU9p,g-clr&7śM:91Rz}Q>OC§2"rU.s&7XortJ . 3{WeKP ցa =Ӏ l a^-x#l|{_1Y`v )~hXGĆ'y~|=cE:E˄PTT&;-X<>H:ĹōA1Y}4Yqk/oEhgj)@SEvP wݐha*fn0q 8/Io>`z)';d:01ҏ0Oy]rl, ,&eZ{S\q~arv/|Wfvs=:gn]Zta֞H婜!f+cBa*wGF!+WDWNj\!$Y&d ;d˔Lc vQ(aRE9& ttk,=%U3Hb 6f"XxÏ:{[`+sR~FO}cp}^]Qzu ~ޫd)n 5eJP"( Sto@(f5#DC)J`h$O'TLS vQujV[YUy`5mR1NHZfx3CYq"g\qU|(Ӽ/B.9GS6JUXMUC `B8ǵ* -3w 5qFSh-/CSYxZcvY U}U m^$N1$21fq} 7xEQJQmW?\˔j|!.#;<79)yBvY }r4bFVA<>s¼XJY?Ma Q}ɏa*]j7(u4CyJx zT0._|%)~3{kB6h4,Y}lo}S3| "xЎC:᱐QLK/t FLƗ>_%xLVP^DPHVd\i{/;|mʈHfUeÈ["A ϫۛ>oB?i^#hBPHh(+qJ@R P?¬UԲXa}hjݡɏ͡'`T=Qn=) ƞi%G'aH? . ||ᑆh|@CtI, b&Nc/*#vk 7N'~%98_?G/嗮5z11~EDpZ)&+;lΰx<z3T7UMzZ("nV-}ŪpKwİ }\˗R1r-bE٩Rbu҆NtЋ;J\CwwC5H!o0ϣO 4jdi>+o%x7Ě=(S/FӃ:+IB( ߃kM;=@I.kņRR>'GanΫ+ܲ$.sM|g{-4h4ѽ5j>׆U2#zkd=H@3嚫n-w\y ď*4xua籭X ++ a{i`>h`+mZH޼V(7z3cr/Ha/)僓trgvk{\8Uc1哷e[}ʀM"q׸d4zo摤IiEfr6[g@Ξ>&WsyPa|C8BeѬpp endstream endobj 567 0 obj <> stream x\Ks8R1xȞMTvj&=0K(%?xIP6ٳB t ?=II4eI(4K֋ӓ>I'/.NO%T$OO(Х MrI(ʄ$*O.}\fri~i$/xsz Z^֖R)rgsJ{SA6"Sߙ,#4dJX2gTL2,6#;Ta}I.PA}QTE$KbaBYQa%˹3.\OJ4Q]r52͗陘)M'|Nj'%|ͧOTے^)OrrBeG .&ZU蝖O-4#.3 鮴ݷQ4@Y-<,3u@=^br[‡y%Q) K` U17`3Fׁ;q:zH>XIPĒ%7)u7&V?j2=L%_yl&ySqU=b;ş#_P913-[ V lB[V:J7F$gS.oOxUfS\Tz*/Q)Yᰢi g:SXn m֘4"YB:M=c۬kX]k)G :+4b~6 ,##JХ/ŦԪuI"p=Ŏ4SIީ*%:%p߂LU<Nˈ~ ψ,.DJÍcDn;{j}E;lR ted? %Mhۜ [pƒA4Z#ZMV=Rk2ӵĕIo3A3^ p$/sݳ;ЌueR,*:4FfscdY37E&2>(g(eћx,TQ2S*p\ ~]r~b]71`{R]+2G㓅@7,5)vLY4`dyrpfdh(!>m_gT?pV!-7› tc7^0A t,&#E6h9d'mhbVXP38OH ȓg`٦iߒygb.Xz pkבȳ>?z`sB[H6hW w\VCT^&;ر.ǎ4;Ȅ`HQGStK#⫩9h2+Jj}^,bb4wZ2gBAǫ/&++ʗ/a",vnk76oU-m5HsQItv~zzLBePq@'#Y͗sԵu R`Ztٕiqjsf2d=.M`kL%C@c"s+̓_M3Z'1B)xO9x;3OxqQD(7wA<*\_.}}}9p6gBt: 5v#5!A8ang(CdrQEy;r 0!DD;+˄w2){eỶO</+}74q)X6)3j9Iaޅ;\ri2qhY-k/fP9桎šoOM@k"hPC2b*,(p wPB cx3-F*"F0<Ȇ 蠭9I=,Dغ<;HkTڸneJ`^#(%ؠ۳(Gk;v[n6lw#hUYgW>%foP?-jbuOD %j|]LmrMF9[UֹͫjpQyfj0f׷%§]ٌ+nm"WtbܽZ 񈫻03L< &pJ7sS醺Jk6[3,f_Aqնs#:5Rhq:I}影s(^qa 93OfRj,͜x˜C~,E?Ҿj>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 569 0 obj <> stream x[Ks8G25o"sLl60ك,ӏ[JTv EeIP(hݍg'p5Yu~dr~o9a\ݞ1+# n.]~,$w .H?r70/[Y{ OY!qY)/٨*4\ddR(n(#FƩV5ڑ dFJGؚPC51U㬣8Ks._m\OJF-QsrQmr9 r_lY-;4rl4[?rS8g,"{Uy>\1K UhA-ثsP\(M8L.bFܾE|anS<ʡŮ1 1^=.ٸUaV5kHq3Vq056U`:7.hy>:^?/(揎{o"଒>%JGcD[.|2m1.F_F 9BP3_5mF᠔5%8|ܕ"TSָK\i| mf ׽QFCθ7 cU.)ǽTGqJ!E`~&;݀XBNS,1]| 5+|N>c\.OY:a9>Ì)a~(7 ű[A_ׯr҉$Q#=H;)EX\?඿ tHTpN˧*gg2 %TBYbrWGsB! $"Bz-c ݌! =DGbZSs %jPUbC^-^," bh͆VP*kmNu/[ }C$r㨯@}C4wvqW tƱoK`xDFj),D&E%"\J<$TO w#.?.}VMy$qo q>3E0}8st DPh9LQt6z fA?'x:&90٨oq?T`XtDwd4pUNسjN&Ny5nt >ۧsH]/m*7 dwnAE^6/jVG7h`ښ1gYRBY+: lx{8EX̫F_&b|䴼+ y>|ש.?`X 6!={&gpE T:|>K Rv s\ K=o2+$0_Sqox w=O9q'[[ņJjwT 5w:8J h_.?.wI >e|(-Ƕ]§=AKJf_nVvI& UP;["O{H#Ÿ&Ƨ-t$|+ ( j7СKؤ< #ut-@VنǷbSٔ$TjywϳiWS endstream endobj 570 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 571 0 obj <> stream x[Ks6^! fk'-6o%іjd&%oﷻ$UbD4Ggdp5V"??傭Ͼ=?GɄQnEL4^8:e@ݗӓ>?g?ǟϞ^툮J݋T Cq$p5`hH3IeҘ[&$ u D48&}dij_yCL&ahH%);:N2޽;qq:yq,=a^](q|^A El:xT=*x\TJ6RU_5RP%2(cm)o?9o0! mܬhx ^m%ɇ mI;>bZ~S%çmY奈݋kxAx5d2L,*(\/!ẀHqds>u7k6Rq ]:J)#JUtPSP {x-2O` /^צ 'E2W\SH͜^+ bYR&xYPXDBJͱvl^f/$n2gee2D˵o4]if?4]!; 8[ؑV0\Rì u#ȷU*5!FzzWferlUʚr[G*6 ]N ;/2rSYqU7ɺg>Ұ@ϙ]wESn\c痼Zټ5buIۗ&pU֦^b(,D}E9H]^n(]1 &Ny Ç'Y"6U\<%wK; ZCn|T9zxUM*.6Ŧ+l!vGWJ4/q7byQn-0FgbX֘Py=b$C=ȑ4}^JiWv=e<1 :eBJ8]F+Ws&<,DrHXP$2XnXhKyv]& )+baW54#08/ԆvOKǩ cVlbDV=TejLS5>֢Zԋ4o;Bf`x_"]Mُ2X4e~(Eo6( zh˶9іw@eLy4Xz*#J5(35,Y[Dߑ﯃Drp}rvK1w%S|Q𮥤 M%[#i{vSs,iXH'duOQh6H FÙ7袆]޵Fh-Vcg>?I8]K<EO7X_"Utv:u'ln7?^9 4]1doR&xғRZܿ :<#< `MĎ>-i@-}_:<i߯0|d endstream endobj 572 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 440 0] >> endobj 573 0 obj <> stream x܉dy9(}) 9TPԡ!-x!(""gPJ+˲?y҄ml4io|&5y1h>~;<50PE#Mjvxdd7}g0n 7DqS\A΋;FAvKUE%1[%'߿B$z/@̡ Ѡ Ѡ Ѡ Ѡ Ѡ Ѡ Ѡ Ѡ Ѡ Ѡ Ѡ ԡ_u<6;O0[K೐zv$gg/Ҙgۛɜڱrބi4OIs ԴnVI+YTs~۵fInhvwR$}}w9+}ŷi5ڶ;ɺ[,/ظ}2G OJ/K 7$XFUlg>ЬeZz؎'N[Z?tqB_jo-x3ۦJ;qNj+% w_Uc}I}Ru-˪;_i^fI'?Kҧ_KYK _n>\\֯sSU9;Ʈ~s1ez̻O,nk&n*#^۶xڄy+wKnmaWI'ؑ}yK˲m7sI|J8yA,Pxwu~ev)c'%`4/L)J9˽.|J~+ Tlu})S.7^>nx.:o,e%u~2j5N?x@iq~Eo87^?_r;/|K|8A|[,+ݮCAmva_x0xrЯbfsBV# `F=5.h~׉{_yF<%t=Lѐ8-'-gou6N({>7o͊{F>w3)9_Flhu-e˧8:'gG3{sJ8f?8oHa8:'W:VJQan?~*sQA?A?A?7k֟/G#Mʦz ` ]N `in.D?4jzwXVjzc`uq'Y/%V\\ahЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏhЏh?b endstream endobj 574 0 obj <> stream xKqsmn(23`Zv,3P֬DrM-:SFV(ђ5Vd$}r4JijĆDlqTHHIb eCn(`&Y9pH %y0GAIx*aQ)<% " jA:tAt&dG Z hGw:Qw?d0vb <6{3*Bg."S1>O5'^>W.frKne5 GHYH 4.j fd@G ^309} .~KXC2Kt~^Z%?aOX+u+qMuTC2mN4n6ܑ߲.hi{C*,9Zq\_jPsY]m/;oT;y|1wp|ۮk^,kyvQ.8.P(^q\NeYam6jX,f`0zV0ZVT B.d2)D$I=) endstream endobj 575 0 obj <> stream x]s9=U衈n5#qO q{8b+u><aB cK-uݒr|TX."+ᳲ"I8>o/E9+Tvzq|xf4T)Jrsf_dG/`ƷG_v@'}Fr_0 1]Y)ZTg.0Qf\RӰ' Bd`RX ̴R1a"~qdGdJnDv:{?BX}%݉%/S3;rX.Km.R/'r<fr4y}&ydn12Rur [W)[* (+b'aҥ%enR)` >orXŋ%-65/&_vj0)qJ)\v Uf`sĿQY- ;f5: gxgpD\#Z-\+^E[r|Ly 9j7jDo,n] >e056w 4leɪvz~,:Y8_1l5P~-/(6\,O0T+}ZmPd`l?<}k"Wt|gTz[hoĺ:وv#BdBBӌV1ޫ,/3P Ԍk͖݃5ܒ"QF_+[dO\2rv/$m%)&YW 9JE~(%J'K+i@a߻1If$) jMC^=|4>6(0ƼF8 P#~"{Z@]$C]TI"MTc3`#Z=@4^{ts-4^%*TTnlLjxe0qcp4 .1o(b zksŌD-$gUu?j-u~NMVB:/ΐ6?Ǎh~EE u&y0:PMyӎv!o-jRKTvّiri@V0K`KBQ0E0߂zShL2&oL)t[jYT@g{=&ǜ}'@X^ N/ oIB"@K4KDԱFwA@лi~!u>RT۝Fiē[Y#afYյnKy K…a6KOtF3^lC &`I)=6!ZeW?LF<ǂ=XBr^b@Q/ƣJdO!]YXV\y9!og {ZԎ#u,vz@ά,hq'zR1(,uI۝[BmwN 7OȋMlY%eeTNe `M{cu[`w%OdM/q</on7kw+4Mb/)>0 8f{OeySٝZ$ To-5]mI9j:OV<^$R:*yc;w90EbO,,g{O ^||*gX061cg N/I|n]iȨD{#}%:UGVKlle_TQGRRvBkb I)q IY2T]mTt;Y7'^d$=~_Ř xdOݩuח.$yEE_BTMKq#苦wHODmvTɉ#nm/L#U鲯u׺G,zp_!~j4Im+Asp/{ېNoF ^֊YZѫqkDA(Im9>P^~R`^㋋mtd(C}Il_XwS6}ۜ੺۶;Ywil!GF 8v!ˆPX{#~ǜ•nnުgO-BV"}aI?P\?>D%u@9vaUn\>qj4 fK|+=r춯cy%^?jT<)5jdZK8fV~$Cռ F|l9ɪi#WbAYb= wǯZa߫k%o%nPx\OF>o)9 9ªϼzJqr1XRQBwNv}Hǐ&ۮ7?vݍq<$=oU^/itníItp6-h y؇_ ȋ`X,-%0ɇ[qysY endstream endobj 576 0 obj <>/F 4/Dest[ 209 0 R/XYZ 82 538 0] >> endobj 577 0 obj <> stream xv68J~5}Io&͢d[^b|g@P"EiN}Eb̾x(?azA_{d9:~~%)2;81‰Ӕ#45.'GNW'9 w>޽>Oo2ma.酩T-l@:%eem P\ |~U2~xJ` xV(qhmC)9 ni& }=uP!^|;@whyWH.:e9$TAN# t*GD'p,J7.FrLܛ*XW ` $~x*]ǎ^|CH;<FQp.e6rN PS`Ds(jMN6{L.6FP{Փ{>wBK&BP[W"; giמuC ƿſѡϏB\UgxOQwuQqdXgpY]^-!:x, <¶ 9g[I-r@0f`hQʀd~H= \ 4 : N!5 mbFԬgu5ann9*I[LC.Ggй T<428[3`:C^\A$.*I>@N ٍ\N? 6~@C\[MS/hNQf3ЇQ9eS`1&Uԕ0 Y-ik) 1PλA7xAϸC#OG8bl <=F){<%EDOrc´Qrx>[@H-̫CGdhx/y2'(:CS`Yl`a4,K̬׹DgI"h`iD#R%1f L"ң]ړx YY](r.QOѪ$" g3NK"3gYK"r8< *.t7%9ʲa7IDG݂D:P~irBtq endstream endobj 578 0 obj <>/F 4/Dest[ 209 0 R/XYZ 82 538 0] >> endobj 579 0 obj <> stream xrܸ]U>]8HΓ+qTojccÑm}opv$D7 b˸ _`]I<<ৗ"E*89?<.ɟ^|ފG2蚧IQZ` TB38b" RŲ DB`2A0KP~~R1/ őM*y*るxa0(\ >'\O)2>钙b1oEcy/^j,Ta`x9B)txnl1XB\X`9/p 3eGШreȀ+ˈ4ˌYM7hO[8W>L%K LNP""fKP3wWx {cS-ŏ {GR&SF8z:8'|w h Cos7M43$9'W-& drDlDgILI#=1Ԯo&*[muO:@ UA@#Iv UҲc3Vx6B ==8P@":t!??큕PxJX6]5B&*8MӨNj yJbIr7 ^pXWuT@PKgBڰRg EBUZ7%{G*QD;Wox;Ѵ2!t3F>(uYV$[qķ "YHuQp\Y5T䚋s0ΚMD6>Iʨo`$lG\Vy9eb~Eǒ4VtkYM3M7Ll$ znp_T1MiQ+]RS* [8vTE,KUA-[  LRJ/}.ŏ OtvfPyhgVP "c8OGCoǑ RG3>ǘ~;l81[Vt4.Y:x;nO2&qZ_힎@YUb Zdq,] 1.O2Í`Yl % *z]!˝>P,UoY6~P&#+ &k,C4cf>䠼W 7Z$p2B.ȏW!Z=kգo_UlkQ5]8h53Up+UM:bxWTǜB?ٜrU@J6_3 HzN;1Z3-wߜuH ?ޝ)W@}74?t ; ^8:ƺzܸ){)ؖY,?tp1LVp#~~#`&jB[gY6de P5Hu0mIHك!\S@;0LbzXVAN~Snsgm PK#<e>jv&&gi;"Dd2Lw56'g>FWOxhHcJB9X*#p҃ܞ6 g(6=l J4m" <2v<3(A Dgh4`?n΅,ܴCl>"V5=L1)&3Ab~H{8n/"G{X) P=zgza4⹶D?Btnuc#gYX۷u7=]uw'}GcG?bq<_#EZ"} H@jR ڝuP?ugF yY{ Ae\<€j3ϗ}#r6! K$a7sXVצ8 z[\ؓs>urߵ3ߋAɅr i~UJw?!N\2&H'VȴdƦnL" lF Q^?h endstream endobj 580 0 obj <> stream x]sܶ]3x$S %M\ם$ɜ$Jv+w:# DSRwv/>qR O8ٔG8>_9a,.(WF*-Y|o-œswM?>z3|| t4+"3 BHF62bTA%VRGZaTDk&4)=bk!4JK I%ˋJ*dq.c\Du$=H@Rn'% >hiT6_p|u~*osQLO8_DžtnjȊr&@-K5H#ffH1GL14hrYpzeIzZC{"?>ԓ94zSm'?rzZ˻0yX 6VķwVyd d /1Lr} l&.+ƬuZ],Ag^[l-7 l[_^/]yV^?߯̋_[}֛ ,>"PO[%Ji[Q}la5j1Pjv{x:P$H2O 6e3|rnh{ y4}̲8E0L+eՐla2~* &kP`#8HvCH?Ix5^Cv<2} CӋKSNp/ amgGq=F~FyV};1 f[PiL^PtJNI NʛysUyWNZp?K),Zi_s!< |?P'81_pn?AeɌFA{aJRC$3_»il / dÈj>k}4m@/[DHI.U)f:+,2og =x8x~&\VʞSSNaD45WS";O/B$5MFpv$0AGq&9목BQ^ |FZ*NA5*E<3f/Q-Uڇ\V%K|ܮ:f#fʺvB'TYר_V0El1uoo7LY@\cPB|2MjNJIyW7%zkJZtk]0T8hl<0{* &LiAmwE11Eeyh dly~h[0ј$ EmrMGAR#@DU}f~ |4~ӦC8AlΆ]vIVse+D/h[.#mmO*Y`R֎u4o`bPqPc3nGhIÇx{Y׵$ԋ_'K~T]uW- ̟ ;3Ѫ dPmHm0@ (fd]u(^)%9䠒ʗ{hY ,-fZ-2YO-,T/{}X]r>fԺ{)do)5ZG 'Ƙ%eva=5kkw?ۛjs9d3C39أzG xWac&Yh0>ױn c: !I㜨h]/s6 17< t>*St1~6  endstream endobj 581 0 obj <> stream x]۸}g? )OmzI.{Ӈ>xMڬ륿RdIwez77mf"DgPchj,6ߟe?]x38P##Evq pon/[zs~,]Q{Ҍ {V)@QTHm aQ"+$D+ BqF0#lM?VRB/ !r'Ug˟f (aA=x|p=>)l!%$rS˫\s9c.gs=#sRblyjl\9 X^]p#]$&H1K42IzdQ:\C{G˻rfVCI, &`vФꂡlr[r,6eΨnC˜DuYm=Zg9WQ^0᫜Ŷ@֗|f%*wl򹘭q67-ʐ2[a,= [~!8,t(;Ăpr7 wQPM2fLcpσKy}|+V3Üo%NfEcb* Jqo+jZAxsxܭ犨bCJtn\~t~E?0}؍e%I6 )I +*kɴE论Е>h/?W+w)Zu1ǃT)yUHڗba7Gx\ DSKST`;T%yIy /M >:?߷ߤLZdZN鼙4-mE. `SެK_G#kM vbdE-/]z"sxb"˩;~qG$;Tn(Zصm+?Pg vbe>f1z6Ēj/DmH~T~ W&ƄPEAɏU*,R%5$*UBQ╜qj8Zɉh_.Vk ?:5}xR%!Z=uROJa4V:AKUGP۴WջjmBv.|[:p4YQdZŝ5Z:dxU2C1?D?M [;W"L|O6uB<| / ɰpn1XB endstream endobj 582 0 obj <> stream x\_s6Ō#@%tNs=2mI$}])Mv;s1M b.Η㣌erdIŠdUY8>~z|"e*^q8|U(rL@$k3Ozu|$IL<>z#?>#:uT9ϤNy}$tóP^Ss+S$.ԣa-HV;x Ѵ!,Wa aq_UXD㆐_ #]$`y!1]>0Y0w1)S ;y4xaὉ+;`o<='eCI1]Cjgthsa1MIXpN#i@w8hB_bCܟ3EWp^Tog3 ?Nj{}蛳}Uj/G&}ŎJ9iXh!zjNa W;i9X UsUΤ?5쿧},:e-dt j5{HP;d|jJFPyrSm{8ie(\(3%aifN9Z&J"-\y[Ar~݊5٘=du#hQ i4̜D-(S=;q%Xٶ<4m+8N<8SWylcEE.[jEK̈/#28d}c{F]}>d$bIbvqŹzұmV:HڨaU`QQ}xF1b#F-Kx;*Y7s}(e.QKz|L#8Uf)=߹c=_6SDu}eP)E=$N;qa6`B]솁նS=TCU뀖Jsӑj뼓ܷ:pVx:eX!9;ǒj5[.>Z"=sU,gj*exub$طރeNE[Xwm[GSŦ޽v]preHȍgCr34$<\`7o&}~u&ZʪVڭCԛ-IæpVް@+Njr}f1<~,]9}gceh"$75^idϫ}ተJ&{1"-5Q>qܖ8KD yƂt@?x bvsy O_˄BsTŶk^‰^K.X14orE^q@16(=ҕ "D/~*0١;#;F"l15:_: endstream endobj 583 0 obj <> stream x\s۸>%S.ͥI?.q>(=$?Eee I,ȯg_E%~m.Mq~g?$Y˫3tYGVif\r7]i m&.ޜ:K%>?{ -r~ kOt ϤN;}$tf*l@ -,.q hvfT4Hf"Ncdn@֗) 鋣8j'^r'ů3.XBۣvjz~Jq܅,,Ӽ+9N/R={^T.ߧfہr&R<$ElnOYdeK@g?~@Y s@q)C22,ؘ<|G\nvHe(W酙o=\1iHA&fXe4a\sQRe4V:},vFMzQ0_e4ˎV+9 )gCuf1  .VrU5+ ?T^LG咹A`y]_0=|[JÝ ՞.6? ^o9vBc38kA8MS%gsʵ_BcJ;urҋ/ңR`QۂswoZ*k;ĐLx]Jj4Gmm=j2 Z[Z>' ӕꂂvoHͦ$Q{Vs|`U +?kBpDtEƇY ө [A \#}O߃oI$/݇և?D 3T 2?sfjl8 s?s Z,N h0+AceG{Km2o'BTs3tky;QM|"6O/IH 0w^:w26&O*̈́;J"sYCFtIxyՑ͗x"ifIXje˦LĖnP<^¼m 7uLvɺ܁ |92o*<֤7[&jqK`G2w&i ^Hp0eqϓ/wXq~X Ps.px 8? "Ю$hhFڏ>@ 55> n$!]ƩM@!.fīG,A;`{Pl4T->Fj\IMS5: 7+kkfGC xf&b4!{[:! bGar0􈛞ݏIA0o@Ĥc]ü>EǾ$jd 謭n6!/ ΖV4ux@ ~/8ԓO4cp c ?G}>fV.kQ/9U@yYUG3P^qP)P2X$(D9.=t5+ L-Xf`_a=WXIXp^a5O gs5D )ǓLüm;SZ&o ۖaI^*,L9}R#=|>oa>쫙rDIhI@PYTW3c̓>0j8k:?ޖ+x 1`#qwL}\ mq "@eNnwB-[ۨRc+G.LP3%>9D BwVQpUGSEk)X(|Ny͋!8a` !f`Y )1fyۇG sE5Ejt{d6Knf۾M)ǯu"G+:"/soқٺA ;G؟E2ݕ=چgd5Pԯӱmѯߩs_"6uەFt> stream x]s=3zvά-nws^$׌#43yrzxO Lҝ+>2J&9<8>}LϯRftӳš̒TC09HwuLQ5ul8K5Y\>kV=DDz}gI9O4Evy}3;9N~yX͒6 RY7****êbOXqqw ~?A+`16(J]ShtIK^tM*/(I$*0Arc8ÈИ`ǖ&\iEUsśyrf:l,Wۘ&N2CS.BHeb$hrT@f9л,;oi& /_J17e {EOzG@DcsG2=ۢݲnѡd}4nZT''ֽgӵ s>  tR>8$a,2 3 dv8Ϳ{ή&'/~%[`KɅZ.ցDps8 mghm}'ͧ( Ղy Y1rR#_ x5 -sQ : h؇k6 ߋåfBV҆PQm- $bb=MxubA~E< \' Gv8ۓ7@cvil;甋oE֟vűtϯLG 1'8)g lD!KN`RPx.$GxHgdԆ-.q60r7`mrHfim +hF}c,>H3"ٳ 6{=C]-lrqD$`^j;#ȤMcL]QLx"~XGi!{ҳIjzWچ+,m/ u;NNF5-w̾|_3p .n+#`^$\3>7'wim)@4ȥM m^n \y-ڃn^aR/6#/B1=_ ꚱ  : p\KqM)iLk8 CMǂ*xO,i"q 1V^R@@| dEIi+~:{(8H])XJQ­XmxgEwO])9.4Ri=1/OR[d'AMu [=++ #d),!/c~h/ݓmmѳI7QGjb%d .  ޞm[O۲xenјa((z0? lvpN߮) *Sd-j*{iڲpQJ{Bϧh)<ќ9i|jFvWbnͬQcG 0;"Rm&C1IoE/bRA5'_ȔrL/`Gjw\ e瘹Z֕fރtrՊ־7xSbֆf2x2L:%;H#t}`wBvFd0$if @kp0ڇncᴒ﯒Or^P^4yͣ ŴQpݽ-ՃzHa'!6͏ a/xy}8kH8Zn8%0Xg 6l x(&ba i'/F5vmƨ.C!cU< &5<0yZMF8!u0^\@Z[mD> stream x\s׌{$=zԎfvtb[i>RHqQ:T:gDd%\eazQUG|QL/FRWGʂN3̸ нO3Dw{{|Ӡk׭I2k$K&A6KV2^X]2 /`FkW/"ȤA2.u̵R1/ QMS(8K{#ּ~qr?8|BCKz4_ ozvxjpah m)g7)'i1fQ|r >~mSf4̫@m(+fa2+,-[j44ndu}7"U.'rʧ"K,Rx ֥̆ej6!GTv4.4Ӯm5z]2z?WLa~Csz|z0VU `Hcx&Døѧqa;~ %R2 =*>☶7VBs-Sb=V=5*KEtmi1lj^`h`ꉦ4t&tivtJZ"p)*l| [œC,)q4fp߻pWr1C]Nq[@t;G߾= AK~$(:)I"9Ԍ+CϹ(]")"튺5H[ҚW-.UH3 _X@Zޭˀ.{aK_YAFeoƘ o6”QOMq8Jx{Ep?a2&Lׇut xѭ5Z*AXlivxh[Gq\ ѡCcp2(μ 2JYi{K/0u?AM(:1 Pdsc|05C2cҹ˸[Un NR){Y$Y&NV{bD$NHq|M{Gl;X(Ė'3`dozCChЍY k"aThAb/ylpѵ+l ^^/ˀjڠ{1 C6gcO)ǤOדM|;KjxA0DJ`-b=뇏o̲qз% 2N)Q6kLcZ~f^J]^8S4c9wӐ$&ciJEqfpuߨq DU"Lk^",H,z)jPITeըc^F_Z2^3x 3ůX+R T?VQ{ 6kR֏7YxHsR2Sct6Bf:%Q¼X{ ూgB\.V[`?ºabڸMyFYo^~aͦ"b0[w 4UKWQX@DSKOڭK!jюZsmT-=߷LخrBsr|ҕȽ*g'rI3=;Rp_J>#7/ }vb^NvZ!;?r[be52Hpl`mAAڱ]֗IY^/^+:Rs۠W ,h`wM઩m(KqǪeq3ߢZi8 -SsvXz* }^ԭ益kgl̯T>g,[ F i93mCxI'0n磌o]ichnBy1I6cȌB2Q2 c%BJH068?^6 K͔O{ةBp&+)h= y*ؠ01e?!ÌYHki<_>8ő2J5t0;Ssuxoܞ[l%~\7aZx>eMH,h'4,Ģ\u'|? G͏w=WNI$bC=΢ױ>8|)g|b"aBS`b"}QL %*L endstream endobj 586 0 obj <> stream x\s۸>%H }J4}AzHr[]%S43V(a ,v~~&)3Gignx^Yts~jz~yXhzu~ƀ.XU\$н/3BLϓ(G4kC[ KTЧfK EJ#-1dnzA*Ȑ,k_^JDp$y1CD8Ky4ԳءX4`7υʕ#*i僤3_?lvf+F;Wj//G"ѝ~=Կݪ6GUF_a%$g81S_@̴I5e#}f.y8rХ,>ܜhGXJDZ1$)|ک. 3HcSv15|rI^]plL+7tPWV+rpt0,phf_+Zt821^bc-'XyD(09y "2؁#&3XH &4w=Jh;$1s;R|rڻV溉 - D&D w 0eOB")(e٫;Xr9o6$6_Hm>r ̏G[!EǗX>ܽOq9Z) [T}_ɮ&5W3`g1&GYo["X¦:vvk/b/͇<2 ̷d8dX{;0΃hQf @hCz,+ HC2A^&+ǹlzŸ-Ly=`H[K.ꖾQ/{G 3 t< dԻe\fu됳J"2L*1J"ÆLTN24)--Lͭ4.,r :'wWh\Mѝqޣŭq?<20 pT/$GX1t8hrcSV@;@֤u` hjG$jpk [a-MI Hc]gnK)/`M{Q*LB \j.QLtz *{A%wf%g㴊RNvsP9cV LV(V*:fuHe\r\]8ϴQT}@dwp(}TdĂ/SS]IX)w H^Ү`gNa!!Mt; 5JÆX-Dubo'O< PD&a]t@d}z)-3a2@yvEdj//TC~Z[fho!NAGCz/p=N$^Цa"ǏՄl` MŹ@ lPՂ?~E]L2V^.#2bR%\ ksА~juoPImUJ^B"F"s6e9"-DgF;6 Yhvk,c{\#p[ TPR1F Ys ~6$XdAn×,` M3X3%I)zaHQ@*e~@Q7)ql ޟYCA"1%M; y@>~ H@/ 侁T*g]֌nQY)8I2U"Yz+>-9>*8iL>Ϝ0IweB# 4!o;_LHc*]#z$d3|l{2lfp>X̿n 6AXl8?YJخK`•mى=nkGqvd @vo4_B ;iʔʐ*5a3̃zX5 ń endstream endobj 587 0 obj <> stream x\KsܸJǡjo98JahL[JY3<ߧG`Fn)hnt~Hʒ,QpՆ%_Wˋ?%L$貄&$^i!ʓ=нz'g>Y;xyz|sy kGt͸L=9 4ـiB-3$$%gJ&HŔ% ɴYޣ KrA~ /jGIs̗(=UXB߃{vqJ:~BPbBCA$me'/IUz-fJl6U3OTsBhMH$3R>Rf.y.@wo1@bDHȈ.6 .,3*Dʉ_/JD֖+3=YB`e,+_l0̴]f  ^JnNv&G?{vN{Ax>5@vdᯀeȈ8n )d~d*w ig?`\8УݥfԊkJiHΈ`ژ^zV pqUZ\(hh`#{k\{ Gl |;"l_=VɆpO Qyu!J_='j.Í "Zd>1PkgBȞ^l'nT剌4F ?8Uc(a+?L?2i;f(`b,>n"b+{}$0u"®п_lSwvVSO%(`9 |$ܾ/Rf%gEnZ;-ML\֡k;aLNB 4w_5Yȭ5[IIRn 7@EƆ nmp3<~&wHq|ſh ot, /od5-Ju%Fl jM߬XCTzRCq#53 NԄkUGWIt/lAow ~6S!Nf~ +HV{;njށ;>}c6)W n٣dJ;*/=˪~oo (xKAp':}Eau;8IƒPBs)PB!N :. %r{Z0I3nI=oP*^~O1;5@{' %&T,ž?:2wHvI|WSJ9!g9GiZBΩSB(41N6Hs:OE}o O冏AL<&1 I3SZ# 9Y qMDGegSQQu{85J?N1o䣘~\Jsj0| ͟Y0ڰatp2Do1yNi"29.X=Ϩ.; a"16gH8RyTr,A0LU8L,*؁);jbHcLj%U]1PhQ=z66NЁ,ÖKK r D+9#Y?r  SgBh=>vwUfv6[LLי*CL}'b=-0``e)EZ0\ej,X"HF=eNT+hI0׵טW]'ʅ"(%0Q9"iϲ}+5]URL8zcH>dW@cBY|ނ8i\1Sī2aMfV>uD95䃌s -@[Um_j[eRHvp,#+ܜG`GggxFo3_<{0ӌ~듪jJ 㫦\\صfѪnwE"'nFx&CeK-C3"TD+0c endstream endobj 588 0 obj <> stream x\ms۸~31JNg^'%CFi;m,%k%%S63Q$b]vrzRXʲ"S-˖?eӓOOeBdW'芌fF D޼7usf9=0_󿞞:=':T\f;5pB4[iB3- LfeDIwճrd\!nLGf:Tq}I.EQM*aÄrQa%˹c/K{Y\.ntS.897|\MäBmcR&YIߜr0 ,f ί $%VuRGMAW_v.sUo.D%|LNj61p'@ Ϊ BT" I"$W먗 rU,YӀ`%sHs͛j{u$g']9 v}zA21 ((W ; O8#؛րΞ;'l Qz\I0p ~"f-`uW6m=m3<NP? 0x|s 7ܹ{*J3VV%j$u KE Q Rx.l\LRk8@su0J EЛ=4}D0Iauqo4-֪ */q"i:K48 @wX F_8t\U@j2dVb~G_d1R s̝ԕ<W0mW_<•>ؘk58 JZ2ǒE;9ɛcS$rwMxHQ*_"` G=V+'Ьlop /$pN!::s,NW< ѼŽe2tqMQſ5l>mҨz FJ3G6wԾD$lz,U _$kۨ #.K=bٳ-EG|>,DW}l83TzqpHg[/$15tAh|6|];{QQFjhMLC"ELn0fjXtu鵨TS3 3PO>wg_Rf G@j0MqehHVMd4pOTր(Fblqח&柄{ گb}\k%8WtK*O˧3]8RvC=& )f :nʸ%ܣBQQDcX|lAPPTQ880Q1~q?.Вҡ޾~8;ƷPT=G;V=5-@8ŝ l< q$Q}'r 2ysDOCӐA֙"[#im`{ jE)KfyQ& nH=L'--S~~"BωPNQ.R#}t_'8* {'-rNYh"]Sv() HIOH\$h <\*rĦOشќ!NAsXN2% {I7irE'䛄 \!=x{.ӌ7h䱅3f#iPv뭕!,M$ptx!hTC)D;i8>hQA%Kxj=0jy,+o3Nw:]:_8Z.wѓy-խ-4a66oS 28Ƥ8GӘ|#[Cd"K;O(g#'+PkPmafzAhwW2CkzZxAU^6{y VC6;P"_N?G[#fHWu\Y2sXYU3|h S,5'> stream x]s73(e"4A)q;X}$K\+JvoWH/gP/hi/nVg<+gϾy 7~)戓)AݣfcF--C*h x9+y8t&&>ԲCFyjc+55Hаd~ζ\e<\%vh$<7Kq~K8;QzvUaڡ?OmA~vw 9_* rOȕLi!(x}(F!ރڌ)\*8@60(c4,#^-tyi8FC;%$|| 4uo4`xw=2),6WH9)aƓr>$)'Ύ%qƬCAAc66fZژuZZ3ކ_2Lq/-gj43RtMJzM}6½I0C(Awjwd{OdS5c)YB H%o#8PNǟ]A}:t.K7@i`G !b_]㸞ѼzڔGۛ5ۜ,S`s\-LhX ab4 f?DaS>v7}D(m++,aGLKIٱG`!HPt^jJj) уWNN9ݜVsX+PL TN*@.lj7U?~2,?mn\aM;e]zɡ6Uz+*Y|Fm5qrGzqd|?s3~Z#o+7ϽKdx̯k8#}D;K=4qhY?OrĮ尰zsMkvդS\ۮϦU wwmn.DM.W>BIFqKOHP 37%,W 9E6XL0^İ\osu8w#TU\aB%{^OۆT;nGNe8~~ˇ; i\m_r`5)#` p[{YdmwKvl>ƫoA27j>ئW^caPC4Psit!'a 9bMaeɆ}~]!' /sIxoӐ#!-!5%1R0TW$ϝR6ZH1PSF`4q$5<iTDcյSU͎ߣ$茦lެc(F+Ntf'9v( 򌤀 I9FÎ_~I`jR%,ťFʹr5P4VMX&kf-ڠ R<@2""h3yrfd#8;A#\YOȤ]tUm`GAWwzX[tW|BC$L>s(YZbJcԻU~LC%k,hxR4).gÉ<vR 9hy < a_%;"@ QXA;$D֓NP5zR]<9y!\ (:z;f0Vu Ůqdfie]hD%^]rhzEN$A̮HfpBlaF6؋236ٌ#B3eY8'LqկkhtT5f=P|[Jo#@8\kNSI%Ry[բBKU=0!EZJxlK*M|sJmgft|HoY^ B} Sśg=0=er=0e"ȁw9zL{CFL2Y)c@ 8 .g7Jp#?pVc繦Ӷ$v& gTfxz2WmD։ endstream endobj 590 0 obj <> stream x\[s۶~Ōw"}%NyH Kr6I6B"A$ifLQX,.wWxyQʲ"SpՆeeˋ\^|(%n./(JI(k܆N f06fH6&>q"v85_r g =uN{|vS{M^k;ތߌGr@'D~6!;,pVllB8gn=9l@̪a! J`-d5J=Htwj\HfxτVړG9D`KhlFBNJ!0T EP`eƛ<hC8t Ϫ9 d!ib(yRz6 = q赕k&G}b8z ^!zx3 }2;۰]wCs/C҄1^z0Yq4zT>RS_(MhY1"Ab(Fن͈,XZɊ ~(0ҿfl gU|o'K׍CoSȴȭ'ltm5]%M|4n?Ujja=s.&҉L0iի[dFGEj\ٚeXh V@q ,|xa3G1CCs(}QÔs#0Z5Yୖ -ný-L=*Sג8kL='մ7 P<f~n'=}9g}[;u?d(w eq߈[vD`3[DPl#EXtfsD|_$J֓^nLllӚxA@\MJT1LX0,~eh[Z;]]bl1zwW|$d O(>3u\ Y9=v9Z￯.V|oAvoh__#*7G uNRS~v"; q$lǩ"2O <툆nM/M#* uRC5EIP!.+S!?TVҾȦ,)%74曎%S.+thjpU_? :&I ZJ--$WD޽ℬH5YWqfN']hvS%ˁ\EPvhz0G5HED!G 1ٜp\p%DIEn%0lGBV8\c,leK^۴ /cIhmRI7hIPן6 Ϗ:*ו䨸WGCšBpXs32e4t۴NxS/M9 j} 8G޸+`rǏ1afNk*-}q=T5PXڶ@4Jx$OXxtNNc {#{bb:Įgh:AVpyDJsP:vPVUVbib%ϒr!T$Γ+圢V$5%Ozr] ,#˓mVD֓VO=̔3g*3~d e?} (K8@w:ZL3t||FmfSWz(*I!Q7vVp6$/"$M7[,:İʤ*VXg ? L:\X'pxIVWܚ1C(,4 endstream endobj 591 0 obj <> stream x\Ks7JaCr&ڊmn`@YEiw~yr3CJ4I?fPB?xB &?=dsztyz 0FL0 K2E|e":KW m|B'^Kůӓӓ/C{3/*qY&둧DnDQ FPE ϒL0NrvbB 6:RaDtx1!: ΒeSdʐB]ĂQ`3l.heBGc R'xW*~EOřH }( <4V le0iE {YÈ_J`fl+ڋ ӹvAyID67|~uvƂDg00S|4jх-GUg>P߾:~) 9/D@2/ƛ\P獵C%  ]Sx6]]ePTihス44N"aY}yOav>:*0)Vၾ`Ih :2|#>Å^O)́o-/nF >W#iDU`6UKmۢi{b!ڂWjn.Y: nn.,fJ̦Θ1GѡvV_ʡڲ:CjcR [uo5iX ecl%0>aڸᛔǧtU˭KXiw(q$./2ZmߘJ_}O۪Urr R\mt-SD:u9"bc.M1o3q3Kw7TM%N:]}(I™^s7AWtq9^< E:RPR{0`+Qev01Ks'.Ү&|L"UiP5zK}SxDgN u Y%KF[^ %7܄1ǗR"٬H^1Px?d ,1F.sG LkwU>Uw^1=6Qq'O|` †;e:Xx#ZqB`.dެ&^͍[b'~88O.AKҳ71-0qi9n}vYxrq w5_<~vtS<:ŌC^R 4 ^0^+fPnEs*X{1~aPW|t`o/Hvv 6[6CªZ͐V~DġEEK8 RNCN9 ʴRYRHh\L6%v(W;{XS`QsLXSL)r*Xs]=,?\HPD{uR0A]|FTKLWeR0o. {0 'JܑAFjSl@"SrI]d؅8}v%˫=Qmx c}H+'cdi8ǹj$oD6'5>Mot"b6" BO]^Ld2̴d^eu{lPEfº6efXf&!\4%Oo@!-z sn3UXs,ò5z4D+7!Wy#F?BWV`n?K+Q8x,(=a endstream endobj 592 0 obj <> stream x\[s ~>J]^Li4II'K^9S$]lf&$bIG)I,Ia|z|ϓ8>g,"9:>@&4ђP*(݇:^@ɵdG?8#:uT\&=՜pTk&h2.$M2-I(#JǮNA)KeBXF}dC|V^DQ: ΒjO~Q;md7^\7#FI|Y}Oc1::V#hn\̄8=sf阏)dor\\Hב#B u#%l/%. ]f *-.{ :|)7;ɶڙ$R<ݏUg9ѝp=5|~Cg2*ᯀeHFq&Rmch CC2nt]t ߔ= ^9mnFf/V?KyMmcn(4Ab. [9amʵB^n:e40' DQ&c45amdL}D5qb;ef1Mmk7oxSa\ݬ0A"Gdt]TX;h#蔲ћ1/6OجCZD\\rt,A9\uV`yā3Mz26nO1X2Z> F>U.uH0 Ѵt-Q`p/!D,g݉ٛ4P"d|uc1'O7Y SC$t U>P |~沃eV)躻/]MvKŞpf#0q-Ɔ ̚ 4gZe&5*3<ߦE%:\Y^XsIC32E æd/e&:/;=L#b; s$@R?PDq ) 㡁l";2\/azΚ*s(lM4AV# ;V#O6ǜ,mAݖdaK^Q O T6 T0eUI>3 5i>Y[0֤,!Migó$GbiZ*Zfn[.)q,Mݔ$$f ]f8k^ Zsob4SGF!O/heԶX^o=s>U٪7ۻ>$!i"dh Z%\U,-\e&!A2a9qxkw F)Xh|M~|n/eC۝~]sx~78{ۑK"w-d K@Ֆr}JǑ4M"Uvϧ*yrnyUX ,"xaJ?CB74.^>3oW2)H^i|g8C΁R2:!aUgOPaN%AY$˶g#ARԸX< F6ȼ);J j/ɞMJQ0]x Yg0kRNVz4$ᤴĢ:I;=rȍED)YZ)Ht(qZ=y6WU^d5ep3U%2W]2V=# ĂDРî2~^HCd&2dYPU>8]$5e|kE^bE'T //&1 .ҰwfO8ui-Mlx̏q*\~rۦA;~6~a((C+բ:t1bΕPyK&0By]Te% IPʈ78 Hgk5_W9>/S<&UeEomtpGj[xY p_"(V+;ᠣCLJF!.*F1^b2*C/Bu  3sgp& [xSO?^P=)q~.׊[xxSJx!.,0ng4api7^u!,^>/? >} * e *hl&jUXIv鴾w-uu'G_J2sҴF.j\Kdq\<+;gE}="W!<ZWXK6^I1t?O ex[n+Yh#Y/' [ xgxaH+Pm={ޑ!MyHİ=aM;EܕbyY]&KnJ@}rjD#ZM`:J!tߏ B>ߠ[HU2kwq:9So7Cw>^Rr]Yjk#E=n6L(#n&G>g}+W{X0fOa? endstream endobj 593 0 obj <> stream x[onq@ш7 \r\4H.>CRB?H;3Er%G4h;3۝' V࿊ \m%y}xϣlzxD9+Tvz~xxVjU2;tߖ.Oލ_~|;* 3伇`dc0pgsB xfuDUhv~ 0D& Y1|Y١J㥥b ;CExq#:Β";qYuڏ3{9w )Y{ YZ.Y)yS.8~I[]Eq59RR2"Est,c;~}{ok^x??;!Afqz0 B|dmhwp}^HłaU:y"l4JdH$NV9S 1&7_vp6Ex0ár`uϮ` guۜ]y0G\ ̵sL)%{5!h.‚7UkxŌl2-)(Gp:zznip̝0A=7ú0}k\ ,C8#G 7,04)βk:Q )@f<%4j%;ˀ>uzȆ`J+MdWt3!uvu?+l]\J!m-Ǔ-i+oVsB5(ꤡat$e0SSKtJ<2% X8+6Vj8Jbh6hufv;rڊPWj(F_SdlӹK]3٠EX˷scYy!**w! (ŠG!c>lj\I].Rdc"kMlR>ǗC;(J ׮ϝ CC-n Y{ J|q^Q z;B){$B|9[2?Ж‡H+ܱp;U!ت=mB77^LcO0`i/6aS29XҜ(j ?\O 6+h1r-ZOTx[#RԱtĎʜpz8ҧ'9e0VhR\_FN(y A6]7/xGi Z:<slp1-dQW @ډ9 G;FfORLma^хG~.T-9|z T FƫMFL(LZY}#N endstream endobj 594 0 obj <> stream x\mo7na>uF\^9N;h0RHƉFY7쮞%)d:=3wChxwsz7?/OOw.?=a:Mg(U#ྻ ɻM ɧjzP Bu5c Wd=XسnTCϧnﵲ_Q\[D| 6e/C71Nd.m2WT8}:}RްCvI6Ƥvrي[W|oslTFl,nDdQ(ZҋQ`dkcc:]7v?@=;o9c\?IC=bߥybȼ5àBI/PZB"5G2fZ g0bX%ΛbƎgL\d7MA({J;k8f䙌2v1q>+MXI(? ?"?k+9|K+~r^O[]]g18/Jk(X^\vĢ.n3&X0ii,sÑ:fb`Pq<&@SJ%@CB`6))\(3;qcDH Yqŀ-ksLr{αoOH7șg[ y%4X]A@Ef"~ l[7>ABV9lZl`me&%lk#uz-pCaۊ:0ŵ*՜iADh\i|1t>Ipe6b l}o+'c;I8,FoڔˌJ(ǫ[sn'B8 PApS߯rΉ 8D9Q\PD[qIsJ'E;©!VzX cFԅ v0d.:s%mHH8h*1|N%+d{IRPsWF&ϭ~_75{%LNI([ Cd3m4rAm Tr"Gy{@ ӣ$B'Z* vL|nUFu_۔u&5dϫ!0憕6J6tHZwאs &}bq j0BbK$ <SImjN.I-! ')"Pϒ(,cIXC6pu<g3WWcf^N62 yb-{rf Ub9E(N,Bk1ZC3j Ayԫ4*U&RxTPIJFiE(5NY7KpmdFvGjY0$ 3Ir}Q JTfQd\Txf@3c*R)ى$9z ޽ڎnf:㘙pGj! ֦ӞI; DT:Iˬ~HtDJrTJ%TSP)) $zJǫ))BȔ=ĂDL¦X$ζL::{/,Zi3 OrH9eDDʌU҂釘&r)q=QH='D"D1t"bg(X>L# kF4NW3P6e2T2+y,{CА0T9HPC5*(䜇g!05dkg%2.=V,Zg3|sH9]MQ623#y-{ Ff4X4ˡXP EQ$ZX9 ;r2 Ie]Ѹ&$ ^B%wo+.,*4Zk4LFQ<ʚ%k2)7j1i&G%O"R6 *r(*9TJQE%7<3+0HDN~'R81|A$pGy޳Ě$u'~Ls-մڟ<[¦49pyvN(^!(YߖLoO͇꒿:> H:`\juX>P Tɹ~0>,S/!:ZFޖE- ֩ePG-cIv>\^wc[ڴ%nz]b=7" W,yͧ+qz'MI'\ XD`TVScX͜QN1sw foMm> stream x\mo7na?JA[/siޥ5ph*iHvܯr_˕K!9(g99.<3iV=ʖGΏBd\eGgfnY)+"{:˕9>yMk㣏[L'\ꌮy!9ϙ٘ |ZųHe<:g \3]> 0& YQ}[KKQMa/y!xGU MBݽ-wŷ׷g(.lqL\d8jqMOd~~j&׫yO=;M0s*&X4dUl9?T&Ds6 {u&PiTMJunïk ;X߬I^\3lt/F2K ƻb *BUpLܛ]!z  ,.k*Y uV'kM9\< demV8i$-,jd!1lA#` BU JxȌ~.Y>=IW֬,: Gb)@\ڊ"oJk}wc ӠʏtIme1P~l:KVtG mƘgYT9,N6iA '*GO/R0%5X{9>t˂ U7JJ09 - ,>0]Q]y kkx7tnt.p2G̫%jx_?Wv˞^Ő7iJA㵨ga&a7 %r)9^  tGϨ*?O<ƫ"k3^zd8…*ǘ On8v1J4fU쥮"*m]tP\Bd,-lC,+۫_lLa SӐ%ێ8E+Ywig(V䀲]pð0b R?!1So!p(ѱJwoAHjvT&Dz܊{}[iv'oU?1"rjl~?D>t@rn &N ޮ_gSr&X 8? d“ ,sjT -/?:FB"H99֣mzɑv#5o/Atj'M5R(/9,m5yW8k%N:FOC!W E~~yλLTIdЅZS?gՄ \N;g:U\A!K߅D OP~=C֣ &mff:-`‡/`6vR'(Ae& ISXFXW봃l]-va{L+02Ns,>oa<ӓ'w&YM*J!9ˠb2 aT]')2bZˋ }0LRV0^' ("7t%m<^r[c y$`/B7f\Vլ?\#&^5) ̧-5<)<ڋt> w3ԫm(N*Z$(1&v({ 4[:K }?h)Or0p6fU"0v҃Yb"7x qTe-9 u{/PA1tTIM_\/0,^;>^/03 PQ0H;:àV{W{pAj,hC<΃$n+ e\Y7l:;18|~NOyQW-žzzy;/UqF縀n|[]v5S>_DOc 2d)"a" \z}4ӓı[`2S3o6G{&KCU\KsBSX\TM^XS?aH2vZGaiࣄ)o0=>B*b/H[{*^Q'S=5 B.Dɡd`G~`=9޷h-@E35.D~t6!9 H=XH9%↗nh]OpxGphDwyZ{0|Ptġ/chȹۻN7{F^ 5rkq_I/~x}r9ZÉrz$/+L{3ū6L&dz4ehK xt`E;XA8Ë|sp觬f`are=Og`zhU)> 7ȓ,Mʝ]*}OUn֬.gS"VY[9Uud_7z{\ۯ{W]+c"jJ J&A>"s#,S"=ۡMaCf{[Z#饫ORvRkB^D `s8[鲞—r1My0z%*~f&`.N8^I!-i,w=@QswMk7Yڡ<փ6Yk[lhNb~Lۍ4?lwh# ."dyIF뢥}"QrYZ+iH=5ڱha2 ǯ(7 endstream endobj 596 0 obj <> stream xksH{ѦȜ) G eٺ>G8_waI#8bLOŗ㣔r̊8>dq|/OE9KUr~y|/MxkV43yr ~}'V0f~YWd&9/0/vH'Tꄮy.9OژN |f'W@IS&$W&\0{$% IhR-`b #8r'U\$WDU Sؽ3wWnO),amt)MTOfdz"'ǩ,=Qkk74̪a];3225LDL)6a|7[^M>Mnw'~_a]BFU>5mW왲`Jgb48h8mi. 2v/X;Qn4|mEÇism TM~';JٔKwn={y1*ҌmՉl&)TVe ه)/$"X&oboj#Q+=DJp4hZ-~q0y4O7S{^7tS#HX<};"%<c0B&`' u021\pY x|}Ԩr{K9uqU\:t݁m W^JkK|\|~#d21;x1ZGoϊG\ay-L{Nnen1O#x<뺍wsg([[Ҭ\}'snU&᪲;Y9/ @WE57}ԤD7-0g`xk{1)]Kԁ m r>"x vTL-:9l1"ml[S Dh\iiq6HV1 aď{\h7~D |^0 uo|ZchȟʢGP6 />G&C(%ehbAT /ӝfg-Ŭ,_PW 1LrIL$lqިbaELEqQǑU丽췩i'c&oou3Ceh`F(HxKGY99/3h|G .ctʺJ+R)q/" Q]+% &k7|T!,g݅IQmR~Fx \R火Z([jprz)àޭa;wSkWV(*;xa=)]>=p ؜/#T({8 >qӇISh6ԍ:Á0i w αzDix>JW8ћJ,Vﴏ*@a9s2>t?cU1yN;,1I=n>{"AƽE֜&?8ɷJɿ=X+Ʃn?jK}n.9x3l񬞮;Ĭh8u}_8FWo_Z{ʠgqjJ4HVt{d!#iվchへ ?NZe. bV+* 1aC? ]nW 6=y*V GR;vQq{^M4"ShD&¾!FK8P+h`B4%%4Oojp~6>zrMSFVrd_+peUl`)rPϦ`ht6+a{ijJT i? ? ;WO|sn8{,1A0Y&̝fDFM(erGCokH>CUSF`4fjx8c6.:𭆪.d,Mg9 P2aJ2wm;T`[q9eβfKu MlmU1Ssl(UXU1hT7\j;ja^ vp$+DE8F]jPE7W4zIaeLV1YG([rY3Ʉ]{6wFRq K7, >UO|\j5cgY}ii$@a_ wU L3F6)9E{<0Ӫ!^RՎ+=+2uj2n_݂fD/Zpx4$Sc37[? endstream endobj 597 0 obj <> stream x\s۸>%)wݤ5opbӎDJ$9.Ol`XC K`b㣌dg)KD,Gz~:?>/,d"9:>@%41PI II?ݯoMr>k~=>sN~|z|}|ОS)qkj8=O-h.$ӄ&Zfbʈg HŔ# ɴ}P% oE1QNOI K/\P;62 }ܙ?^9~gC;h/Ң=hkͽI > 񻦶hw]tI`Aofkesp]9i j۔}fD!O2nEN 4Hj$O R/o) ϸ2Uz1Pg1zo]9W9Zl珃=wCsE*o/o;.g8O ty<^ GKYm}}(C! `M-X۲ٛUy6m܅U B(¤&nN'^Db~D H[VUƧ/+. ˸NGY p+'kLHof+lǫ-[Kim+ bER A~B_ڽ\4>"$ز:M9W%֪` *q0^"w8^!R=XI/r|{&A'ØI;|smyW h-k !vNb#];gx*JRp 4_v.7Kwx/3;a3b;z%kKc)nWwn'0#nX-Я$X@@#](oHyzbAh0P.>Jϑ 4ӱYr%h\@{9+ P.0^ޯpd`Go?_{@a!ڵ‚l#2d,o/<@)HhETĖu?e;੘`[cANgg0?APFcplopd (g9GɖL ~ P;L, }CNj,1YµOB ]'狾ֈ@Q krg7b m4d6{Gaú=2i[a@s% 2Xt4)9Ǹ!o?&t,xʪ=OfX5Eoᤴop `lmm$g瓒's3i|pYIK?UuQbyJFp{ ;U0DVe&>i̚k 4y>%Z/-r8 Njgչj$mfpTi&*5'/"$"覥BL ^eUi5a؜lQWM*GVemW'dVfb&U0~ ^DՏ`uӉ /TM[3L|R!QǢ+{#\aɻX|U+a0jQIK1#lI|<C<{WUճ߁K$~P񼟲FiZEU|Wu=* ᢁAױJR$+-R_rmYr̢+] ^/%-w7}]SW˪mJ^wnԳI.,uŸÿq8m8YqOLСHj%+ƝYų*'cq -JY6OKƋ^G̙ƽG84NK5mHMó#*_E~Dkuϐ8ggJw3yψߎ=ŧF߸Ug]YoQ!ܘMybο ŗ/QX@vaT5L\`0f:wx` GyO >+-P'3VX?h'? g" \c%!̰< :ֳǻvZ.wᄐl<{F˨0 t?,Hq ىG^c$dh]!TDyRgq6j=GF !f#0 D qv(2t_DprUvʳ+ #ڒ 0t00PcoO\0調 t%VQ5y!r!q!3x*>&iLOG1Q ա j>l|8 ܍t4r|WD>CCF`AJSc"JF|S2st KWamÓ_^֜M+ǽrGzMDSDWꤒF bd<0P5Ś^E'M(. endstream endobj 598 0 obj <> stream x\Y6~|\xOI6d+v&ddf<[-rFE@*OQGt_q//EUx\^xŗce% `EJʺ-Omq:;3uQ,[\[Ǥh]fPf`̃Jo#Y-oJV4*y[ Zn_X!ⵆaثkGćL S`+Yˋ &TIPW_H\'%+;1XX/ɻR^qJ,bS7,bdlQ,uJue'C*yM5@`2D);"8)RF#םv7dR-h{{,;.VPzL g]S\3z~܅J-[ogdt yd΍.$($ō~:Ӳ]lwYS.~FA\@ *?`+As쵽%qB9#Qec6rU-ju/&V`Yp}&TY"q&`6B\i{<>ۖQ}+xnFxU}!Ww6%=On <_[Sf߃3΁髷$JFvɅOCjnQykA=XqǸ(G:FC,Wգ5~`olV͗{߃RwCv jk^Z@MnqQ3T;myQԃAOŬуP lZ?6PrUW YUUvUa"1"J#Yˊz_+ڗUk&$Y.nfU)[c4\LF"k zitI*\"媫KSȿYp$aIP][J ]ۋ@g+AR{1 Fui*LpPld~u^RgpfYo~YC堳N.:O5sNLLAMhʶ W--ǖOVWC j!GsҖc8ziҌjat\C(N##=3 fHVoo`B)?B5%&QKu$pV`)c @ qxaK!YNlbHn/ ^ΏnUKpΑbsbY$HZov4`:"Z==3fr>湺U)&1HhZCH>dzP5Qr~Vtc>a.zj=KQ\++L#=_.[\sB_< qy> KQ\#wVzqN3Ll?\= ߩ<2*tjdX!ߡkJOc4ǥ<#=VJ_}3>"&YI{ H֫o^Y)d֑j,{ ]=3^QڄʭW]qWQ`i $yb GR{ƫAs+*\;Xdl fH%msr]qn%0tpKI鑡j &Hj, `'`Nd¬+kGqi#J3f8WCdO#D&a|:KSy6790ms7_pfGi/ 'KH59d걼j&DxX9m%mȊ1XU1$yb iGR3HᬧΒ;R 7Rٛb&]H5I KŮ.&@55$Bk$3NĊƽiR N=ǻ^--z%HQ:3ɘʄ6Uj&Iq?$Gbԍޑ0_V,qx':9c1;ъcMt;ǃ;#S8R;_xTE0VNh ;㉃zqpD g2G@40Ӄ%iπ>l&[03c}>+F|>#M0eSaGMƏwGǗw2lBCJ0 +Fc``7lT89*QUʑ>aҷy'aY'(,Me *5DIk|ϧը>B[u$pz2׏UOܵ|ez&(iQwa%Xٲ8 qc$xmBV+KU} , qiW-zN3"gUx![))1"&anJ8&H)z#\y0nL1cB[6a qF%H(}<@L !WԐxÃ8@X Aq<8%c\ua(% 1 VOe]Onk|a϶;𞟾0M57{u8ch2se, 6PK<7'ZsH<$qn,7dٓrt<*7MrQy*V< >(m>FtJ`%D\)U㣡4j<Go'BJRnA8uֻ; Cc".Տz'N4tVi\APR Cmd;+Mgw>y7oC՛i0þrKq?@Ͷ[x5OxE]jm1_[LOκE4j 5֟q!_db,e_HLȿUs)~m4)֦)r_VjO s}}ydcM'ORߡ|\5'ݛvy,W98*0Um?haY(=&E 1^wd5Bd`4YG+^AtUtLCEujoUe/LBlٗ>|+1h$v[<<ΤOН1hb52[V;p6`-¯@M&l曠\7eh<ط̧2}h@3T> F1Gc}+Wafqofɧh~دd"pyddtC P=9 ?.VG%"8~[s.6cyC00>Ŝё_@+\"EjNQz+UĄp?t [75^_ gX*r[lv3mz1HLf5-qùϻ͵W( endstream endobj 599 0 obj <> stream x]o6݀`M{ڰPMbRG R4vc%wGJd# ;}g2s\F \dg||A8L#drxe&#w<#7In+gC.^ÎgN4`Τ&g|F%F53p5pXͨH#\P듊b ѤA4Gll߇uRQa(&!xJ rp;:2{)wU K Gl JLV׷Ssx\Lv$uK;T^Q@M3]cBè+Yp%D,1Pc7\Ғ k4/~dS Fo Ctk9D1tƈS)7s,Iq|_K l* P{\K CKAh`˞RAm[tQNթ`UkS)+*,{`TC>z a'^gT9x$ L?Sǡy`H ^M^Ɩ^P0 cΰj8Zb1jRR:kx1la Ke44` RkRia4P;:j!WPyaYH(]wraYvX9,[>i icZ  "ɄU680М,AғM$Nm/E ]UV[ZmZ endstream endobj 600 0 obj <> stream x]s8=30^n;m{77{pmNc6EIE9覝+>,$M fV$w%ӓ:=9H8gJ^]pKqx)L^| }&s'W?z^AJ5%)@өL"c?RY C"ߏh5>Swc=zt2tO,fp zWlZ"Nx[,V;|6-*4N>HdUHҌYn D7~o;E+S/S{7Z6k1.nIB;s98;b̕ia9~"V8|Y;ϱɴ ŮLSh:-KdɭM0Y+~@٨ ,+#b(l7HYx%Q]le)붡+ h9=@υAWwKLr2\MDzD A1ɁV~K챠_CA˜4 I@Az}Lh2o[NɵWiBKE gibN] >ҍyX60gm%&LW-|M M)udI q0jH &!D5m2Ňĵ9&г[ks!jwFΙԶ,j6 {l;GsbS7-0܊C ccoƴ=C9[=cCBv2$mwbDBdԵOǔ(R$: 5hTGNSq60k[4 n{r񦭶pek(l5;j(Owo#ai0+e0D.k_@͚aWe ͑*Ը4Gj!UnWt9.pݸBMuua 2u32ßZfٍvu 5u.Y~ݿXukU歚JTJ4 nlU:JFZHt~h~z u?MGP=f36Y+ג% ,SK`Iã$Y2ZJS6WoF1?TP]<_U|٭;k0Oz0cL`s~8)~q ' nF ~ }D}^b%&=n3ߺJh)n6$L xW]7q6[D""ǯխ>u^1%m\z6)tpprS0"e~lqPZ,~m5m}CN_:n?TyGTxD}0 ]pJ*q ZMSP5u^-"kr}XWyۡPʷTU\ˬF8kXX#jO;7s;~|nX0L>v'>98{ڷ".3"!7Vd953UĦ7:Bq ={O_GKf;k}$dv1lB8;G7'gUaEL6G ?|zbᄵ2\i(&;M\Ԫh<N)xlc&P"t-SP-ZEٴJzW҃`Jh?r-VC?pa endstream endobj 601 0 obj <> stream xks8{f4\)m:vnRMmNH'2mgo3Q%$AAӓOSkYv3?=y([|qz3QJ ]|8=Wd4$* x?]'~>=y3w?NO~|:E:X\fVpB4*$+ JYVe :(i}xA, WV a[U=0$D`ch ("w2%Xv1}3jaH{p\x^v/n{|mjEh}D RE-AQeYHU('NQG/D֥\mǐ  ZX*/1eQ%lV0"EϘp3$w;8'U} «XAlYRLU{Iq&RN4C2ChUUv߾|ub o Ee/~N vL HΈ`MRz2-颏Dq.b(c4 #{#\sg:iSjwWT*"4Ke gYJ=j2[^%|vh+;0nl^9'.Qn tk+6C#9[:9㊎'qW;断5ED F"5洷@)R XUwܲ9І]nֺ''@54J=]#S#O + 7#/#vK 'Y^Ys1co|z =>̝>fO9-MqZ|M,/'7Hܼ_c;В3XD^?9~tI!wau:R@.dyˆ4e0P*,jIJrqٔcJ./ Ž\+" s7I 0O&Mr;,&2{[ܚ7#}&&#Pl]gGz >sQj=JAZSPWjߠ;H3o F3>_TS 7^2mk' lN09(NUTP"̋&i]trǸ 'f;jUQ汚fW]?xo~~p^IqىP:n[5 ]ÍMX1M ig7C$fF?`Wwؼ8GG5iϦdn60ñx<+*Q$>yT|S؃Sw0'xc@Oo)f"`A-櫩Ͱ{,7|lCX `0k9toșرZZx d~{7<1Cs2ʉcso^ m:+u=ŀnpÐ /:q10zNll =Kh%,60W+FH:я;rAr.ɗ40tjL1 M䳧jm>Y<~j "r"2=s85=Tp** 9vL]W"p3VoB9ao|-8<`-[+85 И<'lAA8xqBO8a ɉ#h`EcU(&J/E,Fڬ6 6k$Yڬj=mAV^]eb,[\(B=GF<&uWt:lhgBw8hCH]#RN b҅c~́Є~jniPmFkMaJH]kUЇLIʱTUG` yXhAa4XP^+M9P7p?uOdS6S˛-^//~6Fڲy$53vynmؔM6z8!n4keB 8XC4!0(VG`])cXpW ^b`G\G_de TǢqe Hp0sJ1:Y/`"L͏dbVWttc"FIhu/3?d~d t᝻ĕFBQTt. ɥR`_y'/4>x-UW*I/Aqg'H?1[zzeEg>fB(,~?b%VS<#JaǪ0HbI//'U>aLcq]/~2 endstream endobj 602 0 obj <> stream xZo6 ?=YVM!&b\4Cr:dH}Gi1d)x ,cK(ƣ?lh^B tdU=Gs6mLr3 .% )^ǽP@r[̊vG8ܳ:'ǖ,a?acݗv~YMF܂#ࣲ0̹5. 7yK]8}x=wu~g] 8{Z4e'p%]aZw=mvg/Xߜ;=5&p-$.y?!SqI\hVKŘ+eg1~-=ז 8ɆbTKp\mWBCdvgX1,)8HJ|^G $GhmeZdfLH* T֊'\8H}HIFLWE?a E}2 p o%)w)L{HTy\KݠlLb k>aasEEܽl߽s<+RS,Q{O$cAb4[ej5*a^/P&SzhUMT@Y5 g?#>%lk"5F䃘z-nGⓈO}LtH]Nc%Mp u;O~pɯd>_T} JDfhT+IrdGtC{0,hu]WIZ[_[X=zPGk1>ݫk7MBs 7[VשpK>#Kx{D|9z>"\sB_aC1r'tUdW{JUgtۡ{u1:3PUY,0SaUwU^t 06:̕O9NېyX1ûg]I@m3,w0Va4PyVeM>=&Ѓ!}M'1)_G]12LpG7Uy- 4jµ9t- =3 >=RTmQeD| u NȊQPX;?J UҬݐsD7eQ+"C/.:8zCu0_B 4ED {ީO璫֏#DC!\F,-ܿO&o{Hq˼IKgZtJ(CSG/omW"HYӓ*IJRܩSyixVFR1 endstream endobj 603 0 obj <> stream x\ms6~3x'r\ӛ\ҤIM,]d:鯿]|(%7uf"SĒ],]$#3%YSӓ_%ӓoߞ,d"y{uzBA.KhKB#t#2SMVdDˌ<1 eDIճbʊqbZ+x&'|_D; ZIsx7\_%{cϽqqC78d^\xȦ^6p|3Sf\nR9g)Wx%(^޻X"M o]bq~Hj!6:vF7E@ۺʈHn' aBC(=΅]ՃY͜䪧q$Cg+ Zbs7iiH|7%8tvkovm3Id>v߿:!:x#C+R$hTcb4kBa?U&JO2g_`cбΉ7}6mo^)-T=*Q\oڎWF}E_{q@XzK؍5R`s+7Mw?C3"% c׷EJl5@:ܴA8GヤR_ HUgg2"aXX= }ȳP7,g K4!m+ V9XmœGժ!fWAu@ܠ5Q^Tc a'{_DxŃ20#pJu۶qnlD0[tG|ulĺ3F~>z*͐WguryYKl?@~xeL!㧛h>AT%wD0C ɴSn&nfS%IGDt\憩`xHMp\stf_ 4}}n#80g9pC`^56(S&NVStxшp 'R|-,WJo ?#%1;SQvm[4r&v0ev0 ދ՛{>kD5w.[ e@= F,ÓɎ02Ah~ V)2(G"i m:h^ҐhƍK}aTW2p6TW"^Ea:@Pdv^m !i~oPozիZ9^kp]LZ#r'OMz_[7׊q/xȥ Nۀ~#10n?F.]6UsE4`a 6)S]KY_޴!TNSoȀd66!G܀ -7Mq5z_p+JoV8W^O\'tW\w9u"X?yE@Lo&GajVj͐tm?e/+ǐ 8|UZKD;-e3;u(]!҄rNtZpK+Dݍ軴.l*W,9;K좛ָsClb*'„<ȇK-Z;!jETcs "2- aRzɧ4BQdIw.kxxa i΁ޏS Y勇mQx徸W5WLW*fw<4̍&NAe4k?Ұ &[}sT~~[i8^>0xlw㚃MOƑpNƑnwܶX84=C`[Jp>ؠLkC NϸXqMilhNER5)a JZJT ݗ@cM.; lHmǩJf!_7F>>V/L ǪRU dwUa=1~)" uõ{>Pɴ1ghT;նK0/,7Fu# \ߔkLȇ`5f|pP6JaODqs`DtbsPJ@0G(zJSl`(}03F!FfD[*T.>_r%3GTHX,Am0$zRޯVöBokbz?NmA9A@l|5' w{V`q endstream endobj 604 0 obj <> stream xZmo6n"WݧX ٰ)! ǑeCwGJlr*nQ4@<_&g' L '|8 /^rM$  H(T*3ryrfd62ůWUDkrpz8x۵:wR%B2X|BFUJF)e$U $5qlbBX*5&5x)!ďibCte\"T ]Bۭ=7+QZy_/!u_~EhC?ba߰~X s,},>6 57& 5`fQSpT ,#iJ\P0k*|[ =o[?K2NM_z̊'gJ=H #E&GitW̹UUYzA{IEվp*[= zJ ItfP s,e8L _҆ YߡL 37;o¿`\# h}c_-%8|}jLjxlmMSƱbiNŀ^CC70-ƵoΠ{ 8wA~x2pGpA&K5"YS^إ9D1/A1bLG.2Jq/_# ֔:B69x!Mc4MOZt֦CHNYL @>@C#aA.l~fzB"fdÌ&̄M' ^Vv=%@GiD݄P$UݠbR!RzR@#0!"a!u@&Y15n'xۣ1Kkt߳+Uv2w9ݱl鍕CU]us!MlP Ơ&ޮap4B (&/p z^m,0Cd+,cŕ7̹r8btHe[^Vw". eGK%{͢b5%X9mv8Apr啳 h!S@ۛ/M \rHSȷD!5vclݬM,#AqTESbn(m,uՂS¶r}RUߑ+ulsw^a p3ׁ/n[l/Fz4Kv*?[l |}rPNV'n-',en=ږ~=nwHx" x3mX3{zVNi5B-#>rmw +q!jihYضj¹|f2>xA:\7p#-DU0΋/#%4w|we۟> yCs60C+#1\v"sxf KÓf'[jꭀa<$xX:E?eHPRޤ%o\bv\'.`ε/]H)`iPúEŎͧUrj,sr@}57Se}#oB^87G?ϿR endstream endobj 605 0 obj <> stream x\oHa|KnCnb>8fWdȉϿn c;U_?]X]GٗS{ eE {Q(!:s@6nr W[F:.39+4/zE5 rIKl"Ӛb+Z\q}ƗM&aJQHv9 #Z:lfe?_e\?ւC!a˥4lEم?gv.>3|2NoC dϦ!ӣ1>la 0䥎-؜`\4/-]nHnFݿUjeS0r+D268h.cs>6-j0#MJ1@mХy=LGtŋQz?J HJpVljݝ;Gc'-%D,-Fi?}?d %%\q#_5'V<9(`ZnweY<#TOqrNCY`^PmpFQC4:qtش|>' R-jp\_E帻2ɄyMon :Cr1Flxuʜ}[GXt}فoY )+`P*y`Ñ|^_*J+e3h@5݃d V  M{`Z M7 8XN E;rc(: \$$}: T[$>&TwC ]*0#%%Y+ h=rV8݊wkrp FwP.h @I`nrW-0J(y2>$N2<wq3NWhӪ%+s`q-KE@j@rÕ:GR$ʿ(׈+L e颛X($ݺ.\AdyaX<6w!p$YVx`h╴;bkR'F>E7p".r*@C_DʜP$k`^V9R:^{t4t"XVCl})˲e n5ZZcZqQZj5[.%7- ZxZ,e踠:'JƅQ0JJUxca|S˔fn4_d?]2"M'MBas[Q v7" $9f%h* BK0QˆХxZlJwָvσsVSLDʷlr;@Z2ΔutB2vgd{E@e{^gμ`6GWq(b]n86dUٮ2Bx3|WTNI 4LDoKmIm{}-\}=RɳCRKcE~F# GMkР&efI\\ ,x|V9r=@?G~k&l[Ӆ?ɼX;[ŎJ͵,q[[mO27΁~s<2aB~6=tZ G~rag(ݻ'}]Q]- t4lMfN^f idzlRM ٌSpU2ysDsEzNlZƈ*yQO7ٯyU\;&& I#|׍uZdˬyU n}U'mRť/jfOX3u[HRe\e ϓQ$_;4@4֑9QN32RQ<]ׇJ%ȗF"|WEAK16 ӲDoltxwhh itVAVĦO LP̱mq( ) endstream endobj 606 0 obj <> stream xZKs8j6hĞj yPdfEod{yG  ǶZVO|qR W8藗0F IN.G ˆU+#Ֆ܀ܫ\aLr\jpt9}pF|=8Wu) gV0Clp5XUPnƩVţZ JqńF1#\~mI;CM Cprr2>͘-WT;5%7蓒Qv8[v G>SE>uO:sx"(O]Inroɢ&N&vlA[Az`i 4F6bt4&M-oNhP=PFWҴh tlRaE-iCC}M!e;IG Q#֗e7#Doh$g"9ٟv7g,e yAMm ~E% 1mZ DQR+iki;"(ION8i,9jnp!%rےcLD URy*>C4ynr=kB)*\l=_av-v(zg %[뻫6-+}+#\/'ą7}E2LH& 18K .:tSM=?9M.K)OK)>MOg~w܅wӋjx.ͽLpptsZD9 *kDB+|1f9*:íן@j̇)6Y*!V0,,R궞7ok %P# \){Nm}ڐzS9MDib3Fbs:<Ͷ`WY蕐 -D;q< ,6!3;$Zucsۘ7!\e+Bp2?d/ns&7ȫ`NjTΗG G| >~3W9 [L?1jLl[.&1 endstream endobj 607 0 obj <> stream xr]U>UB'+yS[u$[ x p4\%nݍӓ,+2ҰlS,[O_RR^LKBQ)$Q:o-]_O,wvӓ`OO>NvHKтS)/ވ,\KA p!YIhVʂ0iALFQҾvu S+D++,/2 (t2%,XDue cRuK1˗5^^rq \ػu@:DZ!!F^gT2Qa8 %GUƚZ(dUnX,7xJ`fb3?lRutq; f2%\l\-*}mbV`Y݇05<7cHsJ~XK N yJB2DG%qs)_XDi'^,mD_;$ AqnVBtONDuNؖ8ckX3 IF.Q3ƹř*,TDx%%ǿ l? +' -H:VX!!x #Cf0O*6FHKCJBV %(OoJ}n{.'|kW+A4Z ^c*5 Okn &{BC䄟mk6b]kx:flڰ,oV8C q7cQތʒVM^4VkzjNV /bFJK )Ur,bXdДPx@(\ bYVr]-8s3t/10 ~C?'t2ȹ ěck=$pv!JRfb}Évb6I KcIp;$ۃ3ߟkY8'z~ߧ5#N_ d!_)޽[۰w&hoC x}q=xal8R?-3%,XǺ+|| 9+0yURrpLClʓt,IcSCy.ck|[uxW?/N(2,_o.LǍ+QhBV1Ԓ³'* s"MusBeoBi 1k+ JB""y mq/j0g@Sj R;JX_Ϗ4 &;fx: 7N]ViNi-Z;({oX(G <b8 +_ܥiN2HFC]_?m;-(xY?'e @o?]5gl lڗkK|vnٲBR(= `M#8,&P='sxx^a7dM8*{bwziQ,K]?Kl$+p 5]Sbl ~J={Ȥ3$j'?Ϡ:KZE,Sdcq::oL?h2 endstream endobj 608 0 obj <> stream xOK1|9:fɿo₇A-twm[Z†dͼ/N+<,2le[n;n,aZpGO=ݧpo Be+tZK'vgh>PPoЉ7&F$ޠM3kzv) s`G4N#b)/)YVˆ]sm뚷wu6> stream x\sܶ׌>=2J|SSn3[w::Y'MG  y$HL'X,ao')?CYVd ڰ:=Ivyz2JI!'f$ni!*eqmf_/,WvshɷɮSǥhefӒS:_Y(jAkB2MheAX2} r1eٸB6-el5?V\ꋢ(j'QҒe_Tʞv{͋OOJ P}r ]#rYéY.MT_˜/w=&_ҚsV`\j'('M|u[.|cS 졾 ̬`b +OB[5+葠k+fn_f;t&,GSg霔t k?JwE]0VsG"eBltҿf^~V1߂-]ɨGa1C9jj[RW؄im}e(?:h FщnD=\M+Ʀ_!r)W/g(TT[Kd,W!T̗ n{SnNRS壘GV*R]&2(`Rz(=SrӉ4eBX'!,]x`01u-W)E1@Ue,o :Xf)_\c = ٗ67.Ye>blZÖD`0 cGi$%E-_+"[TSd]2`ȰOӢCH/4Sp;׬ea6uWY^:Xg`d@kj 20`iyC$RA0aPdݤ3.]xO7n.v?RSEz?IXh}f6e6`_o./`_eB< r]VHs~>V-1~[ٖ[.Lxe+/xlegݠ6kY_b,~f/?%0gQ`thhp޷A%C lؤPWajc00kPWqTr(*~SC]t<`(ͯ#G~ mdU9FcN[K6[UՎciWLi'$erᷜj{vRv<C( IQ 4xzm .g=fXbJ;hX ,b\z?.oKi1YJהCLWabHl[tBH؞Æ`]<$5d1n fȤ 8;H^ښ&)0әcK%zH' .![>9*3~a`2iӜ0}o{qBލqی( CfHi4S ¨`/bAoooI*Eɰp*]@nq_B@Ͽǐ+[3q\9I%`wP#zi駄KRGK|Q<+˻W=I,b W C5'~_9P qe8%͹2oyܭQ͍wUi/ꉡj{).Sn7\ºAKMLs+87SƱȶNgD jEc1Up`|a+V<{&>z ƚxy[X[ :r p>mmNY_p~5WVrJ祵MN}měNjfS*)L 1%f Tݤs(HΑޏ]In*2V*$njKW!d j)"_z] '+j\Sָ2^=Kkj\Ԅy?BSzb5qq(ͯ#}~[ʰpo c9<`XXxa `q, >aA2وb*TX:B鬛חFz\7 i弲u~w}$a2%¹a٢ UEѾU,^6P*X#qK6=tu275bn٢l)+vm"P,ϒGy/$tXhgqIbb,qEjWG38Wm1Z}$:KWPB~5MLjma ׇc? u8+b_+P69HnsXkyrJ14#2~@0p;Ǡ}~|I3f u}$/e ;eڻWA7P==8Gpx'=Kn l}:[:S)~3zS`$4X:AuEY endstream endobj 610 0 obj <> stream xXKo7 qרc4hqCYAmd !zx+yq 3 gyPI+AlUO'\tl:'xf:09Ufw7>L)|z:y_O6e:y'^M'GEGe98 _qq]B-9=n.!%L`جRq.6KKm * L@atKp Цe$HYW%X$Ǣ .96yEe-)k`y{1 =U#I@W&+ 2;w˱$!#ED}wˀ&~ņjFXd{Dq.q>B8ƽl>Ê|/7dG3ΝUb yRȂ&ca'ٌoHFv&&WMqbW+y^E5O͛kB)T0,o`Ȗ7xV ߦYu< g^Ecv#グbK F32NI@>"VF|<^|sQ  endstream endobj 611 0 obj <> stream x\r#?19%d7NrAplgǒG<<}Ieː4$@7>4n_OOJV?EQ~Ū>=Y8=o>sV EOVif[U\\xI1WqӓNOe==Jr>@_2 1]+B xauDUT f4U| 0D& YYգJ㥥b +CExq#:W4zg` mrS3y YZ.S+)NЗTMTj2߬)/'8/BsǜJI1Γ,J͙2 %¤Ƒ1 !6r2 >[Zjn9Ӈ }$#6T%Ά11^a֨16[n ߦzRϨ\)/*.@Jq"ٔ+Hg |o۸G7(Ur3YߡHf^k"( ,/Tcl4 T;H 3\Atl' a%0EdAB 5DCP5!>nB4nƚ0e $ ɉ`"6UNH8<>VGk΄~7`nI 6Pyn7$C d!V"`tyC3/u Cwsku.禪uQp g θ6&?{_j6|[Eo6-!ndu:& =|?% @$D.ߥA'v?kj5IJ-Su24hdKQE01 YcdOe,ГOLYi]Ǎծ@X68Vq̉n= +`[BBXv(LJ#|v/a`UGc!_N0 n,Gg8=ph&rV +dJB0qa(az4Lr,n t5R_%vc}Hb?T\xTxSc'tϔQѶ†F 2 z5tL`J[N6z IR1F)-OAGk(uݗ|{SЙwUT$VҊ9#Px- )Gvf܂̻dZ21^+9U2%n*=a-Ƨ:b49/ߌ]%q06TׯЮv+ZIk$hMFlHXG$Tࡿ ЯҎ{$$ôz$} jdgqqfeTN;g5$QQg{[ߧdMyly A[8eP0I_W\1ݗ:u6&W.?!d/2FewOȝ1,+XKbDQ{ b,i=Dy1_טÜuނ6wXAH{fQ&oq%&A$;=S3"3vqu\!j'뱌7ytd<D2O'Orppߑ;OHe87<][Ӎl[Ub7J2ql;uݠeI/XeׇS(g̟xzv!ky1m$Ѷ 7Ptw^PZxt S~VKa|CTvaTؐT 4i)q/hre$xno嵲aV!0oa3 E̙*K<`Dg70/s$t1-86˂5ΥPTopRgpE XCQ3kdwمEf[gfeW\"aw O=jM ;][ek*xYe=Kw9/p);}rdVs*5_ٝpG/6N, H {5h/>F- +n endstream endobj 612 0 obj <> stream x]Y8~7Y,X܃هŸۋ}އru@*{ARJI$CJJ"@2#W<F:YNOmg/>?=F9ѓu/i!;eNo?:dN\/g?O7wz_ϟv-yE "H)J<ߩfIǝn$Ԃ鎞$3'#:{S? Ŕ Ĵ^p|N$Re{I.:v^D:'%53&16d"' xBҌAֈv'Ηo woxgΊYZ3T*fHɋ?z]vx>?|}p_UܿUVeRի|qQw$avp{;Hz {y~8z|C}so~potZ,bO 78=t1?@!=D|gWol w_uwO}7wӒޘw#(* 4?뷧OL_fȞw//N~ NowZVRe9$[% ?ݍ [fnہ)߇v'/݁_ϿA~WBɵ>? uE1^2lƹ}OrxD7;,Tw?dxCIU^?ַR>d{g7Rrgm=2o^yeJvF0;a{b"A 8|Ĝˍ44; iގq=$H `-:KDb [GXmhnھ J:7J~60A:K`vRHc2A!Awq qlّ~gG7AHmC/ԪSP< M}s9-q .ME`"nPa;jB[kR&z*aU4Gog=\AiB7f7I S$#"NGVLcn̙r'8so!5U h}PnūKL V3{E6e,71]\lfε@>O NOfu[vȒA>X-^*+ί J);az>H`yW:+X q3;g5rˮŊaN)cGDGDȎM G61 G6Io06$."Le2g&;답s⤛)f(l/o,m>c͖АsR)>F|.o@M+2moQo1}Pahni(2;i^&3øm:&3kYxmt'LΌ|ٰl30Em wT;4@;0]شAPnGa34hf I̐δ3[u7d 8C͖\[vGc@uhTwmߣݟMNnh>Bi.댶t9ar8?b?>w8Xň@גjl Ub5"2?tXF7U4ZH˙HŊT):X@-ӲL#n Wj{%Ϥ5-w<.X)r"k#y@ 0o_ nZ#,rG4ˎ nPP h jn'Wçpn ZץfyO%]<ʇn[ױ9%ürw?ѩ/gP!Z6p05c-M7--}!` % %\NK@Iܩ -%[Ƨ$O'@%h|rg$?'e|]BF1Bgh'ͥc tU#4 %5uVhnu>͐iL6-l%eYosn̢iQn@S$;ۢ$L1AB*`MB*BȐj 燃K#iWپd;-B َFh@H ,8˭Є' BSpĵ r#4A}|Vh.fhf`_ M P͏۶<ǬfsL 17cSD \z"J5p,Jz$ϫJ0^Uh>\VZO2j®JzJ*JopUb_ߌ? 쀯DVB/iߪ=0R"FaZ]\x s` 5 2tBˍ>f_`|Կ7:Sfܲ(rMFNq%R-UŕHI=44p˦BӈeY *35#3$@P4Eȃ̅BxK#/K *Tt ;LB!No>kX--aJX pˌ]Tu޳e؁^j^V eRfՂrYv7M"yܲ~W 7pFLrXX+ ; $FXw73Ͱ8$H6Ƅ-fua0:M%#36W3Q`s%{eҳ]١yek(牼#]@1;u]کv5l99j@n7 ׳#܄>ρr҈p4?? Gh#0[tG$YQ1(/m1`RF`гa+0#F`, ix|1X,fh)5a@P6*4LǶ2H }J=7c@NK@r5_%XFW!e )"}TڟW]7\I5.ʚRf25D 3+F ;j)F) {i+ wZ]Ъ7f62AV*H7 Q2gX;X;=M cΘ|-[2:sKyBMՂPj슄Z5XHzv]-;bsV-gjb-67_ʵZX YmWŶX͍X9,_"Z}H ZaoDjE zVR26bs+zہED\C`!Jx+kĖF៑J)u+P 4jX!Tt~r F+qDH1jL2Qq=/7kPw_$O+C uWx38?9wү,U]J,dҫr/Qq;./ aw\ w\.4J1DS\Ъ7f5oL]ޅώd,;TlWbʭ.pq8Y]s<6̭Ʋ,$ʭŊQn_cNfyk q̹s+z0GΞKQ{z(lvk t1>~16[ohKG1Dzʼnl>5bvXe)xEmVy: 'u`Ez٩qtA {hP\*w`ߝߏq1?T逌Fl1?~ud]OTD '"V 3_%`/5`H~"+' B~"E*UwW@X"{b){ PX" K;X);H!KٸNC(eZEca#mcdɧ2Lg2gh;QeM{D4˗qcBG+_x~̖ s=+G`!ȁCu`i5|58fv8}5z-Y_yŇT9' ҎX, vwދ΍Qj- hf!b f_R ?̹?X n(L6ȩ؍O`Ώ5b˱<{46)>8!㠑O󮯒Âur vk)FM+*3r%VY#",4rjc-!DG[w4UF]}^bX;_kaX]OۮA*SH ~OS(ܑM!n!o搱~RWnHZ#Kh6I#تQ.edM-(BL:Q4*fbu?))fjUsu^.\]+4Uk$ /ߥ$.>MjWhS):UUwWwUOH/ =n^{x#d ah[3hj%,I&ZL@Shm@\]YL8 ,XjIe<˒AZр72Y^r$VK4 QL{H;hvX;h~= ǝ8d|+z7/k/VG2342!O[{P{ȭo6yHJ7|]fyg8 a43`>rõ;EůM)tIdY#2ʽ󁧇lٰG̝c 6όNzLxl81r`Jn_%ͬ{."w6 t9c\d&­fy :Lp_/5*AEԯ<|~/wF{ヿطDwJ ,ʹ:)ghW%َ E rJ 8g B Bcfh#fP _]`6 #Ef;DtMZ!p/0e3}  ؀ߝ B=: Xwڻa}koBN`RBڲ 8}N&w_a/<vfTA M!aSoj If!i endstream endobj 613 0 obj <> endobj 614 0 obj [ 615 0 R] endobj 615 0 obj <> endobj 616 0 obj <> endobj 617 0 obj <> endobj 618 0 obj <> endobj 619 0 obj <> endobj 620 0 obj <> stream x\s# }sS67d:q&wyI5S\+J$3H"A$cHkD*NO~y<|syzoE9Trysz.Kxb5U436w?v s&ɕޝ%NO 3^|{*3zϭ|>cdc:3+@ -rƓ\gL*.͛ R Cd Y"=TL"}qTG$JnErx?Tg` srWmg(%davLɶ\d8\.S5{(R yHy6[;THv2@dm9XYfL#%+ m"|gS<^{B2:`j =l#Ó/baθLۑ緍˭qlxbҎ >e<cUgOJb!w`@"a8dz5?NsJu 7LŒjMۇQ+~TJ@Khϝ(e(UOC]5NSI(js:F$0 n4QFoiS=# V=QS2ڢ$ y$5w);#=Obsi}.>O 2bU$Q WQ{E_gV%@ Fb~ED2c"҉K ۬v|f\ \bxDJ`gX}>s ³QgWTŪox\y-yhHLZqa6C\'i!j 9Va.RYrY1š%|6$ɽ"7JΓQٴAM.՞y#3~MPel5RDQ1<; =J(;ѲaFt–XzNk*F*L#73Ӳ>5g)87!kF$hQVגǏۈ^$b"sLʱ|Hֵswy۪IXP⛱%ñ/6) b1O\{=ӗZ]Nx"Apܯ5Yo-qL[F4ϕ`)jOK*DܟՂBc/mbtSo"DۇN&DHNRO[wbI}+}E\?]>Vf=/eHJ,-k=rT_&%f(Z!s[\䪠 COW`?$Ţ.ȖbgUZ/_ Hjࠗ#  hm8fXڬtAڬB@d/m^Y+cp/m#r8؆~~xɿܺPuxz>q~8[/mJL BeZB|f]ܨ`Iu²`S^OU#XkQNyX VPQwlUH}(~=f0Չ~0=ܲ<ըJ|'QF Vg%U}^bKMPn uхg}b?X3_l6q luv"y';qwE슓2vxɢkA\> %~f<7J%r&fViE n4Bc0_6W3jnk\ojָFz U`|݌QH 3iMCCd_R'`,q(7uŒe=WEZ'~SeXXQ<ΏsJ- ->/F 4/Dest[ 258 0 R/XYZ 82 100 0] >> endobj 622 0 obj <>/F 4/Dest[ 258 0 R/XYZ 82 100 0] >> endobj 623 0 obj <>/F 4/Dest[ 258 0 R/XYZ 82 100 0] >> endobj 624 0 obj <> stream xko~r^/-ڠšh..!9L?zVAޙ]."e"Kgvu2$KjÒ]y~Wg3K(%H.o(e MrI(|$*O.<`~2gdKr?>ϒvHKьľ9t?#x#2SMvdDˌ<1 eDI+Oh\!"vCXayI.aEQL.iΒl (IX{@/W'%9ha4D._pj{ܮD)W8zRhVƅb(~FrkmY&g LQd8Doh>_,2BK}kXZrb]1N>-3Fth%~™;8x-DN-0a~7A!ul[ .0WΕ0(0{ ‰TQlvFe8]k>`}U?%>&b sXR/~OπXjx- ]]Ak.1D28.Xye+ۇXAGz@t0'+V+W;|0-ܬH3^l,0*oű4}ȿeMcv_Ģ1!388dxIJ9iLV (S/MX@\C>\3W[X;,>ңmK@PmkbX7!tl(:7FSu~mfyA7Xdr<7gH=&D/`Gxf>2ݠFR# 6Z^ljcj|Q؋w!NâcDXvm޸>\``H@t(^WȊ/A?⤃s>#?X]֗[mD:DBy,#QMqь.4ٽOh}p޽tb@,&$Nq3es~ R>w ys2=7Ov@`&]uhk2I 1]1 qfe_?100d]y *BժZ{Zi5*֠s%ȿWukN\)c;O[67+j˕ eÑX{7s7{kC:‡q`87cCW9k\_lym*lΪ5q|7MBvW-gEnDzP6ή/+*w hH᤿:y"ҤT=Nw"YDLcZ 38|Bm*Ͷ  ѶMM.aj{S*c^y#F*;~߭wʞ؏VTۈupELB)h[rJYHrzX@~,(I$wE)7Ylԯ@Q7j8Ź]đ-#X9*(LPa=net4&nơ12ЮMpO[ H>7߆[&2AR[9;jCZ krQq}e:y"n)>[WE[jarUKXXz6-s̕ϙ&ڰHѾʉ!H.q.^H;B34,Qcg)"WxKKl0QARp(TOu,ϓ{pSI0 :1u'2m,[z*.]gcqyy]qQ5ձRB)Wj y`#91!uB@1՘)$J_P,xn-+,濁y/esa_a?Sc8Mԓh=Or$GQ4Y/ųHFcjB'Ӱ7 SkhA scV^PZm23'ܢ uIc@=j7r{j=98n9$λH8$p-3lx<F⡄Ϡ0PC!qo*xXR 4Hx#?y,ĢsւrX|4nG*#̰I1k-OgG{|[j&11?cPNU٘sES-e9q:[{+UC`NʀUhzYW>{ǵsw6l/Ÿ8s 9R˯ >/F 4/Dest[ 258 0 R/XYZ 82 100 0] >> endobj 626 0 obj <> stream x\KsJar#]2xC6ɺ6Z,&)Gch8spЃn4_w=t~ eY)Ԇe?_d.#(%.o( I(BUd@]~3ۛl{vBo> vDJќ^ӂS و|jA=H!&42' ALFQ>v"0A*,WHcdE*/0< (v2%-Xv~vTug` }G9w A!K%!岆rfA X??o4_:9M I 1"%ET; G@Wh;7o 8nXR ,sTENdљw`[_J6vur@-VM7H/#< W_aoK6sEfWP@wK8ɲи*,GЃ _63 zIaB+89+V&<Ɵ(u:Xs9[)9ؐPvقhɜY$:O4NF[I@,ŧtjɀ5U`߁.11] @]a[(p8 pAK#ڭĮ݋ܠLYAS<$a5c[@/u&IM ܈"FS5'o[dE&Q(C"83R/v$8"LY+cN5e4%c; 3Gm68ea#Q~73c! H'x]!Dyݯ0.Yky,c#NQ@kw `;MpVIB"(Q8~hؘsMLz <ݜqX6Dz,ëP푳'4 ZV[1mG#4 i2HMl VFaFN-шُ!51/&uva\V3\k =VoEpݮGc[q5"mjDQ7ij#H(Ҟ@*WBGUNzly:\G`e}:d>GĈL|zߛ&L;!b/7iѰٹY;t_9ĠOTNN'7]\^~z`M*㛐ah>/F 4/Dest[ 262 0 R/XYZ 82 560 0] >> endobj 628 0 obj <> stream x\o9aэG".X\nmt{4NƲ[xH%K,, |Z'dgG{-2YGgf^Y)Oӿ }o.|,y| z|s|eht ϥIЍU<-gVLY˸`FSOJ!% IlV)blt?VR1"{q4Gd8J^3nA$=(7/^^9^R9>`R1%z l=Wr.A5|v3nZhS1-s=#QgL^H5h{/fyA'vu7d,S/'EdbznYAJYP6>!3zbGqɂxwWz=DXaFZ=M=IZܢS2&3>J#m-[Eb6zQz^2;}gZ7lYXL Y0Ŕ Fs&-͍K0aOwN_҂q  Ud@'xzKCKh`+ROנS}3G9*ip:.cUɖ7-.>C˹Qpʽݓ t+^#{yGxA? n~;X\689NBN=fOV%JKm`V_S|HҔv]=7MEˁflĭ/g# f(S,H3jv2gm-jv$Y;{L%dN>1I3'[Iu'r`DKs ,Jjn3s=[3^f1]@*J6Idjf82QOQ)t[&TEwU;6%gn:)6X. fR0c_X]bJTȘPAw) D정}tj\Q`̢LbyEb*ztX0i1Q'BQ;p Ed;Ff1LVl ABui\wJ&$oh2IY b#;I)H1c|2k4V ,r>~{=wx5٪r5_rnI bsY+FXa}Jy_OOsJh~y񇧜)gޕ4-Nl2x?~KON'tKALݶ6ӓ/E-'nvY2x5a"6NӨ %Usmx;KWT4<׺rd x7;ֆF! /#Ø賆VDuIz~PGʆYwt5,Q˧őt$<>r5Dorjz&g0[HJH"s}Rף\F$dшgWӛ!>'HlP*OVefiB >bc11_ν 274vAR'.vJ›톨aprg]{=*NVSUNVrRi(Mj?0=)P(M(*r<ai'J2W_TR0..k^^-o[G&~pfOa|G[ {WTzW\ >RϬ#1T=)%.0ad@B  {8L Pqu R[hZ[`r 79Ck_T;Հ5CiHH hb Cnt\Pe`%fp j@$6'H` GRB exbǡ/Ha~!1ހaF=.aD@Cj3pxӓho;|xV`c0"2̟c6&0`tF uE[M8>b\/'Le)b<\w qG6a|h3?PЬo+1bёcH0c4!5r MN!9M%T endstream endobj 629 0 obj <> stream x\s6> %%t:mN<(qXevH)HJg bw󳒔,+3ڲv}~Ev}~_RR2OZHLv~zc[3Ogox]_0og&E{R2spJKA7"KZLiYf2#(#Ja.bʱqlZؚ~\aph&p԰r6Ld sJ <-N/B낃 o-m8i!%VĴΓ G3ANP~M}*:_^_}|],L*Ֆh3WJb!FKbfqLC$A9Tl׍~fK 5=/bsR3U_lƒdlo1,ƍvdi>a@ݡ3I?EG}8jtqߪSiH"4j{Qeq+OeTniUUb a[aGX.^eCr0k͠5f zx;Үqۢ),(f*(Bv;aPLKB[alLC+ 4}B++O7+-|w~jmAt*z)/ ۨ?iɱKGn{gNGMIˁyce7mEjXEO`A8͙V Yq$6CavjI{]~TXeB.+U5ָ9Fգ)GJN:|hfKRWW;ȕ*g#n7+,Kc}~vߛlZXafx8 _n-_`pe^$Ӂ Ɉ I:ԓ08eNt㬵c^@e>rfE:ie7# [wZ/QQ\͉Gea~k|H,~  +sK _͖Kwd|$Mdl(L;Ed;Iq\f_L|_.;xj\?NwEO;ؓZꃝ+d V^~jø.,3[myyr!SPUd0#ےa駉E N_@84")MxKh iD~)Gn9 .O+bik#G>r<9 z<ДYP:9 Hbr<`q,i3x:tz5ʳsx Y *|ْ"XTZ9:Wo" P"+t:igTyUAo:-,)J) T*[CJA%27nIss+qHT~07խBğE5=֗?HUjz@;,XxvVſu;Kfj `֑DLA<t5]sBЍcWmxTG:1T4n}OAexS=Wo^ ҊjyB"R֯?Ktmܹu4@ s]]e HY2:B3b% 2 %EcQA˄bYIÆLcP4!|,1 endstream endobj 630 0 obj <> stream x[o7  }E֬-: f؇v\:4'ߏt/\tN1)"I-4Nj/Ãǧ_?c>Z*'#Ѷ8=gla s_.Z~xf|qxyt4B;~JFn$+.A aQp[XI\8{\\{6HW^JH"q0 ^ :Y^._ϘSM2{%w dı–K*Gh'\Wsf5gtnZ(戓)-֡ā)> D3j! UhiqK0Ab|bmJE/l1z6#1#[+% bhE{0wN`+m(?Iz9^aO҃9-q* mS0\cb4B>vٿk6Jח_.aRA(mx+״V hH^7rD=mx5~. H U:\:GQ FFG߽sbӺ񓹚y VUhr{Pn!_hfu^bC}Aof`ϋsb^.rh omTbWSp ʻs g ś7Ԕ сa&Z d"UX!6it51aD 5DfDLJp.Pg/s?E&$$X+̓C,rӉ$!v!xQvvfz`j'E1G:VqYUl7f^sU`YF.پ\٨wx0ͻH%) }c4,1'eqz gwə)l.t!nV>0tv0i(Mu~"` Գ ށ0Lro#%2"雵:Teqkq(kK6կڣ/7p5"]dM.!SKAR|(k>BZA>Рݬٷx5kH19b. 5.4\Xq7nSE.׼U ?ٷt2sAԮ.\s8`_4sR3;Vϥe忟KDHo\YTc&S# TO-N58 0رW>xE@ $B~ *18DȥtE4E1}wl;Z0ކq3(U aGaLTmCSFX,%^`kCYk :" 61E0ل6nOX0Ďp/V%Э`<-P8„E-+̎B |xB@yyB[E€,QUx:4"r,V9d|jy@9[*Fb=7 Ґ؇{i8$ɖNôyz9$^Ա{O|P1*_cL$sGQ?ty endstream endobj 631 0 obj <> stream x\s۸>%>I$iM>:>2-GHl <(.~X.v!X,I̭H{8 ,S,Ir)k{H.0frIoz{$IF|u#kGt ϤNIgx)Or1Q$b6M.j&H% IdRDPR1"8g ~p;PmXؽ;Ջ)ř=<,,Җ)ٔҗy&7e*A#5/)&8IeV袓1 g mAHϲt+4" n .Yh݋(U#=HNXحbZUlr{G; ?j`6fl]h+QdE,uoh_m܂𿂽'Xq&ڌѐ;0V 0n,d4(o?s_+y 7Lˆp67#*E`Jd68m]2H T9mzs1 .4QBtvi2R=!#>XuDh(;H@6.Ijf)7|e~-7a~)_+$|DnE?ڕl* t'`xpDQ`TT q("Lg| Ғ?5CX{geZ2Y Z!1 ;L\ob GaػG^z`3 e6jȃ6WwTM鑙LKebRGvq4x_$ [N[~ uspns@x!sR:#F}F̆qaEk!ʺ't"'sc񄔹b 9G>M xoڂVާ77wBoe2?`^rR`S4!w΀dpv Mq'Ύy0V]x`.,3\_; F=SdG >tEqE vZϺ}KyZ&STHmx`A53NQߧМ'wu:ƤJo3hty}!#u?!t9&޾V=GjE@*I} 鬂l3tU\ණʳ>#ۮ^vUUAiUs6htۮA30~ik/CmWw Ҋ) sJ^g6:lUY8>YxZ&ު=ieSUa /)4wLlHM9;57ÄV|r˫7 a|j'12cŽ <;(hv귥s;ToZ5 NC$m!vaW&WGya2o?i>(xf]U ň(f(x^O?x2X𖶠@Z@,9 Oo߬Ѡ$j!sYs\>U0B$A[g3z UpO-~ *'`> stream x\Ks6JGa' iM\J6`@)iiCYאH#̌9$nto0zyhʢ4Rp4Vſ_EחETD7҈F$^eBG<]CѭyŻ8J>Dz^іr)r{sJ'SA7"SLhZHe2%,rAtDQ4yA. WȖ a{O#.$D`ch (u"%YtxSFzd }OJkk Ay _/!58n\׉2ᕈC4^<-$D yԚᨂVk&Q55iG/6s$eyn&M/6 lRWݸ2qd ZlVc<fDFs@<TNq&LzΤl+x\$|\& ֆSPaWaq˸]%:%j|qLژF-ܕkpn'6Aʶ]CYmZ"ɭPϊ;R!$7&T,$(('N>'dž tCPS݉0l6wS"inJq `ma/Ӎ-Zy@g|>h:j糧"G6~#m3 x;8ިa̅G4BsUrq_0.@L"fL*2`mL44bىALék"~u^9/Z=Kª7W_>kRRg'4^hCh3-!̰ wnxRbBI'dkf/4ȳ}rteZ{i3ʤP:vm2(܄\ILYIrn9Vf[ի#p_RY V((cBeѝH ۊ,R kЍ- k;΍>Oos 83{זl+Gbe,0kcej=~F'o-,Ϡ\ w)yܾ 炕0Y*=&qC&*(Z+2GԢp3&2c1b E [ޯOHV*L _7O@י!u:[8}Gw}躟޴tkK~}]gBw %1Sj$bcYuW[o~h}e0zPzkB'AAri8k]՛4 jCN#2ӂ0}Bڰ'h?*3ګOH@;S%KP U1(vnP<}vLJ]n FÂ{gh6 OkE<2gc)Lخ)>=B;gy,Ϥ s<@ls8) 6KS2F&#sx? c^ wi"C ͡o{i c* =8ljb="N&mN!:=9OSHYw'=҃|Td> O{t8F$lq4v90fYN8 )\]3PL{gJC-('돣œ1̨3̋> stream x]s63|21$vniL;77M{h K],9p E%\dX`*_2?E%>s+ey~WoE9T2:?%<)4*W"܇_zk&o~M`ŏg_v@Lꄞy!9Ϙژ |'KB$ER(f.4U!0i,W+:Pa~i0A8#w%/D2rwXuf@ kb᫄)ř= y X.-Sr.R/Hr$ N7ˇrijtaqThnU!*ɘg mAHϲt+4r<\2h&Q+=хLYԣU62гLui0~Dr:rexbqv\n t10߸HjbZ?8d 3܂W9,mאk0V21n,g4;4ݷ$/ؗp3$ Qi0r {Lf~nmTOg= KحqZ Xaӱ bzvj,bK%$cƏ ne_bBof'pΪ^ 7RyVP N')NEŅK[d2x 3~6䮄-]X=HM4i8e4{9O4${='14>UdM "8$6)+dA:([\0`ԥJJ`KuIeqݨi?PSBP Wibe(HB)b9lG;rY ۦJCwmZdLSܵi!jˉZߵ3p/x50N}c-dY" .b QɈL#bѻTak } v'4A54=J)Xn_/з nZqGaL b!vӨ[hOB Uw+%m u7.P[<:5n&VۂҺ_mA)/D}Y+ㅏ*&򌧓{aJ%㘿V 8B 59+_]x5o"NI- ,GFF/&Mf*bV_6v9/+ 89աB%m5Ժ3QU:[-DuU_&&Ir: )InL|(-hyY ij,3b"S`܇vGhxxg1RCh d u(L#} 89 8u0R/MZjٺ>=F}JHQY.5D:Nplh g}W;*"2M5j~'1] PuI$$By桬}S2b1q&hLij l)j.7L^]rΩySr|0 ;\'w6gsW5LhBmq,8vB(`kVe]Lo"3puModIUf%%[Z-?n4了u)m.jO[|]o(}̫ʶWuKV&Hk$U3\xr.n--f\G +%B\n%`Bd/꓋_IIn__.QIvU*-k>T- ^B&/""3Bx:ݯs}Y.TF*AHU; tt׷? 1Y,C!y, endstream endobj 634 0 obj <> stream xZMs6{G2S7Ni&U١cwwwR( 4.)JV?EVf։lS$[8?gqJ-8*8|ef@U97ɅO^Yw'Y^k^J;$GK&7KOx/gVLTY˸`FӰ'ԤA5)?VR1axq dJ^lq2~$}h_vs=8sH@>E-Ҏ)X*_Յ/T~| ^(8Bsǜy1NdgeزHsGK@{f=BLh`fh pV5~}{1yIZB2|AS,Gy jb<Hrɪ^{q|}3[Uூs(mNk4'L"ƍLOSC3v]QW|\J&aFUGy1FŋCP Z ~uF!D')*`eR'v-vyRbn4Qb"]\S2To$mV /Y1\k/Kj&X_ChIJs]|7hSg7ˆ%l>M* ˉ!%&C3C]/>ph&s+Dq2c3 endstream endobj 635 0 obj <> stream x\KsG5B799m&3[d7a'ZNH^=fgק>D$HvUL@|hˋdWPdO]dY]^*_^OXB)Dr}wyAA/KhKB< z3OWPfroL./B?^^j4Zf\&pL4YiB-3$H(#J|%ŔQ մFUZ KrA> /n[Is\~PU\u\P%=Xs_l}sm}BPRIq15DYQ͟7*1K˪#2sK6)ѻS~QZ}]+H:/*Cn|~c=c[Sœo-c"*(򡡵8IYUgraa17w|pbjs ?L(Sː&~CXڻlfRsN#bHSTp"=%r5CgwҜ} wZLxx: T0hpM<(I{PMu8׽u'oaNװs7G Y\: 8ɊP31+R$֜xn1ÆХϡ_2d$3F8FGQe`ѹ+:v{ ;GPZ= HqsR}$GԇZ[y>/>>:D =,*4&Fٝ6dQ}s `*TqM#00\wqbGgX J;+lLRK;iZ޿UX(IOJZiN L"O0Dyih}0aD`C]r[PFXg)?(}m!:'T?9峟ߟה-*hP50D*Ji+9~)Q6-<̷tx< lH2w̾m̝%E=.3 #|-I"jjg [VU< Lw_7L]6a2)L^N.DlSRC-;"X LFS"0jfLG*)qa .v :>MXdJLSƛ=%S\Vv>ZCZ=:-k|N{OyjОNc.( 9 }kpX6S~5YVMcfk":)a?J\:&|l-`n/x&YzIRZ ==6($R#H:d"rKxHw ik@5иoQN?m4v_Ԥ\()N8#a>%`\i\eɊX7oG1<=Y l8ȳt sNE> stream x]۸}zYߤOwТ6-ɃwlR$^ΐԗ%JL{"kFpf8T]^PBOxF3 WSlUOy2xyf,0xd"f__m1G~eo?o./HK3*TS"7,[2(6D+ǫbqЄF4#Cl ߇f;Xqy)!ėPL ,݌a$K.^G Fn|9 \>j %ts1>Sb7iԂvPLQ0Ak|"oF?ZHWc$3mbicyvМAe?IǵY\D ^J!Ý,K(;<Qx$7(̴e&A Ù(=E_c.8*"t]F}:]SX'f[Pu1V F_Jq<8O A N$7Ea#:C Tq,u8S\'Ȩs&gKa$V[|i=A{6=|" &.3}j|_&gq/Ik&bƱ@DId)㍻E1Pٖ T5*F+PA^y&͇[AM(&) ޵Cמ-^P{xRa?hÚ]fnB:/X\h6ۇW``rd]9}o-yUnw)U"WC"3k2@?&2NDht@e0 C%"G?%?J+F^V` KFl c^w= >wnyqͪH0wr_=B4@B)5<ⴒ>0XcSKN Vz}o.PZ!tN*as_ X6u0+jjtgT$8`S~NX6y =wǻW 9]`VUAåpiwW êIB$(co$<ĢZo {HlZ`@Ul?iLCT@Y'ުiwíKk0E8˂b?7_ojѩ,0zA"OZ}^nyc2]f~Y^r`ܳmK!r1 CS5D[!wEG?X?2>Ȉ9aM1_k/|'*Du%;-+;IoFKovP[H!)ӵ X%O^3I] 'u8 {ű`CpCmR<§hΆ)^NatId:!YӄƅP_0]h0_S6?ňy:mٴU9Zl Ŋ58ZBiV li)xMB75d ?Wբ8*qwKX#{V ?X:Fh'dEhT'mI+lIOOږt߉4=-߮~(Tx3vyJ5>^L^ gt¼)]^l!Rqôҝmʏ3Ґt_UinyHG*5<^IՎRQ1\f1Y'昒EXNIHa!t5ܖߣ/Za;_(-:۔[ըӺ!>S Ň_L+l \Ąiѧ'mGx8O[N7$g> stream x\o7a˴0mr.!Ƀb(vDrl)gjHkJr;ΐ3P~zB ,-4|ˋ/_.y|z€(aHEtY\}_/賸qlӓb=әҌ UgV )QTç-7FQˢ\/ڱ lFJ~q$CL S(YɋfXTO "AɽyzyR2bـAva%"4rSre&w|/=X0?%7<]*5Ӹ( mZE֯DǧgbBcW#mai.Hƭ0\glQ[t*+4: e}K"TQkO/~ mǕ.,$a8klsЖ39/"L[ S~ߦ+ʿ`\ZQ#i;ɕQZ Jp"|,GCezGj R<>X6nYQ): Fdޮ U#7 ,noɦ=g>tN0a1" e&LO~̾w&_B+d^ aod_&|OWrd_ۧq8^bMXWj6e͡yxoͦĠ&hΦQH[5G FO;"k 69Ϋ51O@O|^:V7Smuj󱯎ĂÓ'-h8oŌmlh5s~0OMm I!N59Ķ4Ҏ~vU?߳T9{~}1{q,͗3)㎨2S7@?rȗ`i<|!g{*gyz嫌&XvfU]UR?]`tXӼ(BA֫i90EQ?) 5nuq/z 2ю}̆]~0.WԌ)DpnXz!6t&*p!U]y1bkz;O}Ԣ32Zik)|']d)'(幄?R*%yk_>3JiPAxN*k K A" L)l 8g”:?A:bNex^i\-:ҤJtNby;QW^Je7R.8KnFÅo }v \'=nkosHd>=]~2Lr,Gt*cC0<+Dٞ2W3HGN v8 )9d]&H7IXE Rj\ֆj\֕jQ;yhri[|ʨ7.nEB[IO{|r׷ͤ]:Q?A͟_݀1,-VBnEmŬ6rKOC^,È%|fB26&0ڋ~X |ȹMp"ҏMH GmL NfZ^uvq- V+`9bˈ1Q\.oʄĥnI-pp+OJšn嵤忕'!o%9zk-~_McV^3HMSG~=9>h-έ<) e!}GuXU: dx : 7Qe*aO3FpgD =|$yZF9QnGpqCQlwo1є 隭@>JKWu .y?3> stream xkox'Xӝ)i]#kԉtZɗX=Tߗ}JS>-C!9}=?KI eI(Ԇ%짋d}~ٟJI*3 xiBL De=!K0frgϳdgo`g_'I;Khebi)O ވL|jA p!&42%,K2ALBQ>v{QA,,WвVX^ "ax@XyQE$8Kjj(I{rO/^\GOJ c| - Mx{\Vs93\5~<>$5Ĉ}ĀSY{`o KeM. ʉP4iXdmO=63>uq`M ,-emjxsW^}?0I˵L] r%4ƒ[p&F{^I{>/gcN_ H8PpP1Y+"TtSen[!d'f7u1cVRN8(2Qw r`V?ɞyV`Am!LnQ7KÔ6ȠF<]G'/l=|+ |Nl V(sOBLj+f q0O^sJG]/0bWYpp?B]D,?GYQN 5t[< g^Yy68G?(D mBz+s=tc8m׫8fG JBT ,cN, @Bak1'@5kF| r8Wp>I7nw^=ַ4~cS-618Y)C Ĺu1>lkD6n-x*{HV{8e&IXlDFwa" :}bb K) 'ӣC %oŰK T1w`;iihT,8[_VhCC3aJtYZ, ? gh8ki=LaU-@eG*ū.3dyWۆY]9#{gz4%աF*,N+I-QnNUkQ_bƒŬSpO߫1T 5F9px~'bd(}]2Xw:V:; [h6R[9H!⏡|8S5<ⴶub`@.G׃Mn"Ri~ 25W$1qT@r\窝[5䙪[Yc\-)QЇYzU t>es+`A J\sEgW8& |,8gGGb_iWಎ#(--”Tg c0:haU'Pt$0m9dh37Gr*M*ע24i.iJVe~^~5NOԋU1f 16<8EĤX WeUS)u'7U̍*K#bD*|aa0QSz`{ aBXt)vy snӦgaح S%ŭl}_,2㳎[5=oU]+\4?]MM`YS.*Wh975Ł*4qȄ#ma2f?SCd!1-Ssn-{[KVN= P+޺9 -z8uKRa]|'\Esap>0]] 5:_X#znry:,tT:GQ+,߯឴e" '0ى־b^u60مo܂Nl|0?:h2|Hj$th6-u5fxyV~GDČ= *6uF Jך +U9k<.X +ّ1\]: ]/?ԩYU:j54 39DDpVf!B9Q:@e"x_PvqH{R5@ _N5_/H_) vDGV숆{^o^>Ό;];px~'/O)ah_ڳ˧r*74Vŝ@q(#ZUU'J:]J,Fוg< ]tƬS"QK>7Mա_1=~uJ/v=Tȿ߮|ҽp u+CWÍUߵGj<8RukIg`aiK#&n@qN^0SzUi{7DL7_X9B 8O뼆xZWIЛ r6)U_h6Ps<"<O Vewj,>֬U.-wI6k>|zoD|ci#g#k)^=T &-| 7jѤ s<\o1VV^v3[&|UFeeZEm}[׶Do3jqW1̽a?jK#@+r[sen\ͮIוQ,{["*#YG9:-H.s`Z9V˯qw!yLljKk͜b.*J.l^! 0I{^4ѫ L%zGj{)^e`6/Ы pW t^eHUƕPOdo'C;9ʮzk&,%o> stream x\ݏ۸_`=Z.+~S lчK|vwdԮMi r!g8?i^_5|j˪7OwWUFTwWVF ?i!2{Tztw6ܽyVz}gIўs)pYkj8# O-h-$ӄVZ6b+ʈM\L96M ;ݏW^ "14^D:V<Lud }J̋'KG ^BKtW/8_~쩖Eg,f30qzHj)=i78oޥ $x(ڴǷ*~go4]\Q\5/ _?ƫ ^,E:e*+(uHtg@Vљ$dOу0ΉOc{A'WT8TpP39/"TYܞݧ2~ {!35:1VN8(&yrk5:/p`Cw] Y@JaA{d@` n_!,9@1ǫ*쾦tMG÷ȹTSdzw+hS{ږ#SzOf|f!n4+ oaZ姈,Qp CL{9,nGVr}~A?M@SAo~ ӏcJtD)/aD2{0"G#:H6 VZkF󇝢#r:h#ؓOD1} ,nx `>a:!(`Zm5>/ֵ]!awEMCv f[+YE@TOB^ۂ8M 3ߡ*n+?R5ha2&zj97j幦1f߁/B֢]:xgsUS=Uؐ4pu8p:A4ck _`2jo- T07QH:jvJh%!/}f>+nNta98Vտ@ .AM Img22t%^d~nWLq9Xy O+P\ q܎/6EaPrR͕!\݋g=6[WliA{ w8*+`cɉ`H.g,Oу0)X!M9S$ϵ'Ǘl?A߃P';K = Se #D,nx]6'P=ogwv YɌ<;A܈'E6tNx|<~2Ǝ:Ёj\Y`w.TOpul`0ُG6Yiס9Ë ߨ nR;PFc %,~~ }A{RKA䟫VV:= աlX}@:%_;)?3 zP8u|2uBSxfIQǓrbgoriqъxU="8]paJ9? 3:Sq:!28 5|䯪ﻒo[p'`l)hf힤)&/<!m?|* tf> stream x]o8=@aECd.@n=6{ރ(in;~K%ʍC'+[p>8/9Eg>K]ddÃ^$<« "Uvz p?~Pe kfv~<XǞ!&''؟e}3+Ю2k*PPFm@bѥϭP6+GlB. v.@ ^4T4X.a~x&m7pÖ˝BFow8#7?:sq+k;_twgR78~Iq'B1 udPOH $edN9Y$C zRn9$`n?8sho:ƭa큠_qBc|{)I͓H^ 9Omu6QX7H__O mB {ht:JJ<;Sb#M?7rt4 ?0x(mTkMųa؛~8;5"'@2(18W)K e 9\`D{'-Hh r@Zh-Ӡܐ 3ں# SI`ǫ[Q $x3~Ojȅt: 8kcx.c1ư㨉3~Y;i*k08K}&- UTq]d@W *[5LX0 53eRȌPO u8>Ly;M.hF# 9T]Wq(Gy/o _i#U &}.;ɭIy^S`=~wZ|^R .Mbm3# #,E BhEJ7(:πfV6ًl"]^yttvc=פּ=0cZxQ  $ 1n3Uv4znu|'&i=9 ze- < K4sTzÂU #"7ZE %JgWwfl=( = [}di.^,-dci,ZeQgO[ toa !Hj4̱xٹ(3B\c.¸%`&S0)Prf`v]S P# m| "4X9.b-6%X,Ѯ,!FОF¯  dh5uh֗QF7σU_‡^ͽwad iH##ؑ_*/%Q=<r:>3_ zi<-Q>VWB?꘹#}m_YFӖXYM[GF)m#( T7:@Ь+;@yfDx.1 )}1H.K ^bQ$Uv2Z}};ju.ԯ?Cb2ϔ[VDy|{%^sۻWO66e*0 qT8.JsTExq ssptcB hHV\QX7? rGash0nn7D0@5 c[Zv.(ܯ-n 5~o?EMTDɋ)EɰWQ"4ؙ Ƽi6~奔xԓ.t3v%)Z`6tNm8+~ziQ4oT/`$KCِ\\/MX+X+"yU$Тh.^[AsQhBΘ~ʺ endstream endobj 641 0 obj <> stream x]s۸3|31&ҧ$mov.!w,;%NsͿ&(GD&%X. `s\dEf:mg|^\}Wq ]^q+2qxdf.?f}f7tgogYkv@?wht /蚗IU<ZX3 &ʬTe\0' % I`V)lu?VR1/ őL,y)z@Ǎ CBߣ#ŏW-O)!Cx)mqmge.goVxqxhS1[or9=Gd p~^pA@]9582KmYac3\՜#~ G.-3ёSNSR(t&dP E8!e`3eJFY u <(?pl ccw@s#EoZЮi{%09 2֢YAtUVcGiJAZ _۵TVT-`WWy2o7Yn$WL5R>/pq@ HT?h;g-a#pwwO˖Aš[rn [ܒJ};؅X̖pra0}lM8M?h.f}',aKtln 9Kwml Y??xvQ^וi5;n:tO0WZ緁w)1lM`sS0M QݨUVReۢ:gpE0% ` #^q2>t.+0h<%SƇ$uau\h([=;B}{Os/ 5KVގ5WoK0{/o-B:`XiIdJ 4%maԨ>A!Nq_S?M(OÁBx`h a:Me:W~1H#05upvb0>RW~R1Ӹ:kA̮J ܓ,,Т0溍 j /VvLDm|Y 7w) hM; %.gP/ |6$FdTA/^t=kj rFѐd<"AG+0IC{Eݤ՝iHSuaApGeHEYEnхO^HWa^T:U*ՇA56 Udj~4\}&jt)q+[bVh,bsՌ Q{ 5c'}u.uʏabH7/cVOcPw{{IYL@07<*X*8ZfuD @Z6PP4q/ 8ΈLxd܉v²I2yUFr4sYJ%w4uiH竃Zi2گ"ՅG[Zѭ G3M{mjA/р+)@)᩸f= RGu0*G+3pTPX0S,f. ]8:"4!qScN h+1 w(EzU Z) M璇'ImLM[n(RRqKʝ8 [_Q"A|qeo>~Gn>us|n>9 )> 5Hv2SG~DZ$v*<檎ZI(dT$"m{Z40M+*fP0_V?%A>j gcUG u4FW [|' (<1~UTFO$)Y_8 6nZb}&HGʤ(dGx541I endstream endobj 642 0 obj <> stream x[sܶ׌<] %Cęt&'cv.w$x 3f&4.ISK)2)OOOOvqz]NOK`6^sm e5.W%OO~_|IyO%3oi2iBHx(aoYvkV?eɹk˓.14ۥ7z28I:O E\ ^IIMNN?oH`S]wX78b¿)p}#P\㯡䠋 ] ޾P/jg&}˥wLgeu>Qt_U EnY?悫޶a/~jQ <{ 9]!-CǿŶ=] ~Kɕ(TIbR BN.-kRO.% ֞fp X[hYm ҆&w꤮wZ 0h<<1#Jm͌)~wN`(na{~TR8qW}LLK!1c,1\8ݖס+R4ˊ0,(ne#iyl̓7>}pOwӷ"wDhAQUX"`sD42$K|b@%x|g-*4:4g*>r9Y]DDŽ *B #DA-'a7J"B${,ͥo)Zܚc7o;tk恿bbOpaʾ]FZ[c#fiKǮ.r0iwI4T9M?+pXlr Ht#&*kFݾlQ+B<<8$L@AG5UJPMCˈA: Q:2[wRo U]TQG{&0!֮0U{.t[&bv#r&tޟ@syMHSEj#]!q%tu]kfD Đ02i^%t`;k[{E]YN×lv/iy*BBȗqΛ!VeXA\EU)S<" ~ 7eqB~!yL endstream endobj 643 0 obj <> stream x\o77aA[.nwqp=kofH7eG H:Ǚ >%, FI.h[E>?F$.8K"qx3T]A7覆>z*ӛfQ?g?B}zphSinj)g ''LlL& G[BH˄ygxʔf/ X+UTM(*vj"c6&D8KzF!ɑGbsk2 >cʴdEc8b9۔}Ƈz䐼`EcGY ?`5UV:','֠ؤIjrRBQ+N@؞H4KԊP*} odC2hn8 ghǁp9aa ʽT2hP.#r^Ll~bYAϢ lLsTϞ٦FWrc4㷇+'_04u4換ń [PzHqBM{]p2詨)JPãEY#"}*tV]2J0%!qnMACuɈd!Xݾvkk"U,8) 6M a@wW!!6$6C5ި)GmYg0œm\Y`v1&V;ZłڑTfaMDĦԳ6$6bk-㩢$wb6V.951şHEL?6S"Lj /2$ϧ&;&{"..j!{@!5W>r0RcUŜ@Kמ?kÊiuƘK &ǁʲnqXָR$lzhdҋWm@YGQ8צϋtӃ7JE4]+ckWaT@90C1;R!|!@g1LacQ7.6׮5Pծ7Ñ6;hlhv!sXWir9Ӆŀ*R&o "{D!aj=>xZb6QPy"N3C9ATh_J)W͖sL=4꒞QECu u9 /Әw4fэ*ͼq=yé4NB$⤄|L={<7UF{ΧWN_6^g@xS, #[I2K  TsY+ݵϔz:(ۜ 5f;v}$+ vlf:2oUyU uq,,Rj_&}.CuݷfLA0#ya!8ڵi m?EvJ7t:Aظ7-شVMᶿ]biGq9\t,vR%f*ی𪉀Am()DISR)\"|@A!5"M}sIqp t+(ث`2pu ސߐ)soT=<&4(ڕil&ޛm짓`'Wm5nh!/<`Xx \3I9[Ij|䍭Q^OpIB*q"Ҧ$cxNl-W{5MaƝXj̅,i/-R+ҚEF Ք޾8vεrϭCV5l?.$:Z=@ePЪFnn1납t0λ{ )>6{oj;W5FWPoN;]L3x*͊YHS2Wϖ.C@67slw8TT?Sp6\'[ g@TH} '{c(ӑk-}g 0[]h4(2QsT"?*Q{ endstream endobj 644 0 obj <> stream x\_s8LNEJ{On7v=}p'lcq?$rN6!@Ã%iD9U:y-qtx_ӈs]X^DG@C茾iIux ֡ P<YDy!8OXWI]YT tSg37R9ɔDX뾏P $> HG1qNE?M*:0$;rg]xnqxRry@nBK)՗wr7_eȸfZ'ağM%hJ25qSpmŴɟ@iS1am7 f7MKRhM +Ds݅hlm=XV <ݎo+:{boYa쟟-WUFyH+31Z3 NQHw52 U6D R왕VAi `&GY?NۛqL]A&R&yuq[ ˃jjvkEF1htN8ѫs0 M' *TNfg`IyKPV ,ds>q8'3 N~d5s_?O+7o+ps+ñ#RP15^!Fz<+VLI)Oh}Ⴓ|ka8 S0 4'@8am\35J?b'}&%tC#`cy-n\/bNBHŔ2D'xf5 j'@vs:.®ݣ`fŁYy*Nu}&e3 ȟQ"YtF+Sp$ 2]W~#$1jj!s~If|g^x^jkPk:6W ?-'&+6x=1wM(?LpgXZ0fjkftӳz25Yڬ !zRH1ed%S2>g6J|4Cx z9{@,ބՆs~lpOh)8X1,pRy @ pŠjҮ*3ug潱Wok6Żx[nNLơ񺙁那Y[E ыuK>5Fzj)|(OftX(UC|2?]">M 2.t2F6VǏKdjrR<{:ϖ4;쏌H8R$X"OrN:8+,*`x` l1]T gȐ..g >Z\\OmjK vkUh#nEk[@Y}GXFڭ5'%At?f-5n˓fF8H#pH1Wz4#> ݐڪ = &`+P׌,b1JyrDM d`XFT$g:#LKcUqYA[;$jXqhh#lg@IcOjKTG"x1 9P Nh:O"y]$9gF^+$+ɀ(#J&/_VK3(UU%|vI4BbrPXڣº2ދRNK#~ڸ,49D0^qx%~%T8=R`*i)cnbY2ZJy)]JY`_ y2JY0!e;cHj:U!S9rxc}U?7Hӈ! *1HȂ{ΪmNr 5B^)Ƌ2)'ʫ%˘kxK*~#ZԐxLBUe#a"CPQydzSXO w[ dylv M argYBdX89nRr4nL>-?OMV5 +p7D#y]<%gY $%+snu+k|I}A)BYB$ڟV_~"i LPJA'0Xw 89 ȊqklLo]XAKʔ,XVzCkcնl[H nsx^x,ȌDtn$֡xm JF玱Pks}v&9ydGq؛i`S 4@2tߑ;j땶wwo͂~ &9D}{֡;;-s3Atuxko-zIlc}quH_pAB}Wއa^e^#(7ICk% rkіْ,mWR[P[m^"lH3p 7 /wvaf- zZ++g[2\~ѷ k>דsW(S`zOgWrgW?WW;uhF0 LGዙRII _rR&AV,R&SʔeJ<_a2y ?Ǧ> stream x]s۸3|21J|t&NzsӇ$L\ѱkﻻ !CAgDK`X7$f1˸k!?=׋huzӓ?,V 8QI/}ݬa>e7'fStӓˆNONm,?fhc:6(=Z$GHT,M]p 0& %Jbc>痖)|P/lȝWS],?xuX0%;sg_|ns|Jq<OJ4I.R^~\}7aF˔.bc% o$iq ҕy  .Y)(j_(#(?{ Vnړ7i'$hcxűfN(-LϏ#diy/=L[}G#d *2)UO8D)R3 &(B$; 2M3_Ku '8Lˆ*/nM`Li!h)IߋQP@mYNCtQ`AF'tF$uhFdHI-_4=S.\s=lq$Giyb_V5inb >} y2+>|>.`p+7)$'+$z HɘBeND2m.yo3JK|droKkJʪĖ*Ubꮃ*qjÒI<=5 0^ &B&6 4YEjvR0q/Pk!5w{ HaY6΃ڈ6F_@?"xC@].Sf-yZ܁ڬ?>!_=\:9a۶Z#g:@vf ĽZ1=kzg5St*\y_@qT^8J3 FT*v憨kԙooBC(Vo9|%|>^mq2 3Զ,:,Լ/[ݕZbnC vB_CK]]`>!6B?D7k ->]'z~7)mJ?z]hyz _a|yG$a+Ww@mW\ lHCĥ}-< /9쓘 V}>[a qECW@AoIT9l]0`xXܙRI C:2Ƽ1Yw_Н[ᛐ>0zf?OxM3?Zw~2wսC5>!F*q/lY% ޾uO4uDs+Pԙ^>l{v[A;^]RJSAv$9gā>~ ^_## `1^e ]՜u#k)U]1X% 8/Qp+%9Bܱ(uT%q\snKn w)Pӝi~SR\s5$w[CyRpPc0- !bl?>ɘ,ZD2-4dRhw)q.eXrH6m)Rqjg6SJRj)S2~d>h3GP,w!>dX37Hª+XG#6zmYAPLlj]jAE&l%`Lxpc 97hr6^1_RjIͯ6E1qNa4e3{&d` H0^s:r}C>O8EeyVJV[NdeBylSW a; ٱ ‘ُi}={i?Jm -4 4 FikV LHވ#AVx.$ǍMǐ.iL82݅/1nd<׮)Y9UilCDE%Fi VU4 ҪIȤHcLnIۦƪRm 2V> stream x[sD L?7t~ 0W\iMG-;M6IKmKJJtyQy."3kW֗_]_^|8gʮ_^p+298\J3;n`6ˋYGv70ˋO#U2: IG &A7 V2Y]02ϸ`Fa_UBK& Yck167b L*  "aQDys<8| z)mBssxXr7O9L=chy0\7 "p]hkn6񵊢_9'+`ÈQtAFj\P b m`y .L3O(ѶLsR~@ ƓjbMOң#^9~孇pUqWe r\6D)B!v77k\UW/ELNʧ2BfRH&aFOey2:(KtLf=ԡ@N[0ŐLݲ9*w9JG(:7ʧ_!|_:r#) ׷wV9taȭAK{f:ƃtj۸_]nOo K+.oڰ_M?,za OoV!c)7{TiI(Z†-ql:Ulqv+DM&KYe^ U qw.W9N7% G3S/!6ݿ65=f f)n1 U80{#0ˊ)z4`zh1TkO%hu(J0S,r OT0S<xѲ.CwLU4o#ī1>O CUR߄A؄ޅx(!UC#6~ǜ'xxn?պZ(Wʯ@ d 7iw%z,LXU :Ox`ݣ> ȦtNWaUx8l"?H|6%+ŊtF%r%_m􋰓<ݝI,PZSIzg3a9q~Fd9.̠5WZHPk]U c4Sk5%EC]/xJQ4S*8WX\a vsͅkC$/j}Va\&lC-3óШ'}a% ;X<~$1*).r|D,49'W : BG쉽G+o N܎JnUAl3= L[!7Ϫ1H]՟!iaՆiO0*:`N>/F 4/Dest[ 142 0 R/XYZ 82 521 0] >> endobj 648 0 obj <>/F 4/Dest[ 142 0 R/XYZ 82 521 0] >> endobj 649 0 obj <> stream x[o8Avorz.vm{^GIh6vz3C}Z"زE8Ù9?_^,?Eg֋쩸oח^d\e׷gN3_Yqy粻5'_~zsy~]xyQс*pK=wIЍ*=ZX3s&\hzU%!6i*E\+n/-S0<^:Β;]/ϸ=S&D؃{~ *yJqAva륬f¶"x\>S1púg3bz3ϙ#Y!--$IV"6ZEկ!+9c|~gK7]\DƖ2 X u2`ndRhLcR~`KzGI?J/LϏߖ zʌ[3f!Daxܚj\X0o/P$Tq'Vs u0j$\T'OAKh޻r:( R8oi> HI=œ}\1t4}OΥJVJ6+5+9N;$.6/f9: d.H=92ݜ`Zy7s7o_gMI M*exi&Ic1R츆&9~?O9Aw j:nN`y:3mņr+ og#,7ޚ6 Ow53{c= #l" - }9BaT2! Fh,O%/ǃyMOC /ZTy6~@Tlp\c࢐@!I/d KYBؤEww@nrݎWV?,!1SDx`G G C(\gf W~!tJ`W ÞݬC1݀0)gUYdV08r"j,5@+$҆M 똔L `=4l+ ~ Boı0:H? 5AVT\{aPj(vCJAɀw< ,"J H#\ՁĔ?[^.jwp2)cr-\5 -ª.% ,3u8"&ЁƟD=8z^1SG%_VXyV6lrNVU%KT*ʺtTԩkƩ*=JJdDK͆/5~\i@WjA>]&<n]fU:0dwPvQ#7Vb[4@w 8aZׂU͖ :4ZChO4UxPK#[i} AiLv*ːnIoپSA, ԓfw0l#QmMug)eY=YvGlGr?Ϩ?q鬮=c꽮Ņ-Si ն[ NJ\P(HP">`a!+tیsG*'"FH@ˑ\!;IfqW\J}xK^_ PBH&o,lL3u%|vM:ND[Ի"?j endstream endobj 650 0 obj <> stream xko6e7ySRSk4E5vp^x׵73|HZ-%g%Gp^o9OEgE%_dÃoZd\eggf )[̮jh3_I6%;wOvm,Rr>gpc:7, - ƳBLYXq._NJ &)>PD/dH GKMv73g@RfhE_S5b*',G#nxh^JH'iD*Qk6m r:{U8N\IzP-! ʒTYBJN0eOPϮAcV5jH6=fr9=R唫QVK 0r9lÔ|]`P +~G U/l1[|-)t̖~?5 GAf l8F}d]υ5'):H[9w?-!]NVҽ.W{ sXC qس ~A=R)TpUvsn{N೙C9ۙj"棳_[z4JLuqJI@+!?zOl6#0nϒdsX z8A>PPb}R0MS&Le`S'#~=ڶ% !椑d]O7~Y2<:t1Hk,B)fd#R]O(Z-qs`e _ krRW(wz*M bK@Bf |< Xӕ*9h.E,Em  tPIf> JkNNBLWJ4Rb 6 /OK30g!&Dh!#HjJ2܄Xt]bK|BւEJY3Y omtEwޗi@ubUnWBgV@V# $8?Cϓ.L궢qC*fjYF4PlD Y ~`ꛨp8%_m +n o)}ǟ (;jSHWfegaV8xK{%Onݛ缷$TPkVDZB[r 5+JW`ֹ㡰 P^pE,T L |Ȫu3cEc=#,&ʑM{^o5.tO!  x1>.L0 0&}Ugw^/ ,iG*q*掃鬩NgC ]a1Dz2krzG6ȣ1moO֜QPgFmg!bR~vL³\4͎2z[p:k:f+(>"Cr W2kMm%L!QJi$I#/ʯFiGzTCu|R骜,p,{TUC΍C.0ɧȎde<>IlQDt% f{de5vdLXDTVaP+b.* Ca@s<ȆJyQn%"/)3L;z>5E^[H/ ɝ6{P.ecBn%a"(} [ Nytu8% ;3w0zD J?33+Nc7Ypfb:G>TM/t7M* 2Z=Mցö:>#?ޖ@95 8));R^h# D 2ൣ9 #P'ˎTSߔ,d.; \~RZPoN*ʯ\J2>ۢb70:{ nvZM^)c;S4}Aiڡ}M2i@3Ja6'j!AUw >H\lE/m=C7 ׶% %04c, w?% Abpl  /7/c gۚsv'kiD/d: 5tEW˕eNi\e:%:I[Qkjh/Sh1G> tͅ8=S ?Z9;7$E7y4ܞ޻%DF#hUZ;䘢zFR5kfb=Mu4gk4cA d }AKBVzNSM%HBjo*}[О0PkE6 L-%xv37AW;f~):lj._kYK0;r_ n\z ]sĆYt %Mf$ 9@^%Á+^q-/-~2|S^pJyd~Yv"\g:=v|Y: e4m޶G4 hN)m@۹iq.CV-~;šlkj.S7PiٹA0K:9xz3߯A0T` PZ",*M^O."Hni7wT`e# 2Z2`!n}v7$ %qYcKP]`@κ^.(vԢ:skֵ's#^GzN?Bݬ^[wkCBD8" n%&&uվmX //}OEY݅`te:Y7mbCz ݴ*>N:yET? [pD6b ]6 /]@&7ô4>%Ý޿XMl9{qsZь,^tB=Df d] endstream endobj 651 0 obj <> stream x]s8=3z:N{iwz۶ٹs8jNѽ@R(geδlB |z&)+HgVhYY4?=o/yX 4bQ?eR%:.?ofsF7~>=y7?NO^OO>Dm fP=\0&hKT3,Zg 2&ܢ1Nl1/-%8nz(? H8EQ]D2bL[( 'jeV:G)ajӓA9rc,'E,&H`"}-p Af,)lz LZr2Noc=~=Y$I*Qd SIX@)Uf:]C0m $NUɧ`",+u8MY'?; b%{S $ 4V`f:W\m *TQsEqthz5vPǷ`Ǔu\x1/Zs>)2h`="9KXtFz:ܝnY)\mr -OvVkb:|LUq>I1oMoQ#iyJ%{LًO_|NYnbX|0O3t߯ip\W8ZЦ5DۛRp4]sA}V+;}[yt@0 "E^l{Tv~W2Pnx >2ŹHI>@I@fXe{DlReehl+v-P1+kd;(1>GV5vJڙ/U6tapYM@BG(to1,bw@1!F&Ѓܑrć!67ƕs|OrM.؟Ɵ61o``shj3t>;`K]{\ƅ>|p[HM{bg[ibg$"6V6{jH?O{~@w 9~1X1y bVZL]qwwMF|75MѢPʺVrKsstmP):,~a$z (C+a;"]%aOyG1^*as?>58`Ed|*?46=-qQfNS\{qXO_㇜ASjv۶t/vI(ƓҪ WH>:`DbMH9̌&YT[`̦*ȳXo_d=mihXO\i"Z".lezvwGTeLVdfvsO|wPusO_*k6 ur<0fqku"I.?NZߣRN5VO7erUU| wRDX E{/WU}]~\)pnCa}[ #"#|rĮ /<}zԖ3 OS"0֡ejرǵfflj陹1\}In//)cw!`cgêgn`pU?62VC|EkC;I*X}p/.l%ukݲ7WݴDZմQNqmbMmZ-׊=lӪ;yzhQual.yziH%F6+xWmz Ajk!|ܢ0@áteArml]U(+T2 #Tz0МaDMcO2ɻi,O/|ߙA4>6}Xt($h8 endstream endobj 652 0 obj <> stream xZS6~hg8ղ~Y)L:i>@pGwiwwel$ec[+O+Qq"e 3p.e|<GǣR&O;%LLsde첀1%=xt:?GU&^ʈDjF"BO۸N \l VrNxLqDʍn/*%(ŬR$1.%Ս+ %&0Rv<;DZP=N3wjn뫜)%;yX]*M(px9Ut2%X;QQq;Y.≍s|V؈ |UP|Z8TmK (,-%dADKyb&Mʑ3 mx"#|kV`榩 2Iu:ڭzkL8&!^*ho'fm=\g=k/ΣvɳV2{7wϯ=JfU1_8mDia\!DÅqt5Oa+2`^i H.aDK5\2*o˾Unh^OQ-%shNGU:ޓs;tvT_,T<%&5cӱ1$!P`KfW`=8NSo/J^>^ۜYVY7Wtۮ4{DLL#!9e,t>wCHwZn2X*ZM k._Aݩ/&:I ')E(~./ږѹɳ\wWUsO#\. s!,t@{\,T]B0HAF;rfsYΙ )oqWH=owWs'W0IY[ <7_ Ӌ߼^}]%2[:O!x^FVPҫtFjK9<]l]=⯜0Tdz ۶QiAPxbM1Fy:b~{DQ*kDvr)Q4Kap1a˶1YeI| 7!+?IuhNIwO_W\gbCtX^B;+dIk%uGQJ <2R* endstream endobj 653 0 obj <> stream xXێ6}7dohAhbG^P[X6}gF[\kHx3g#}NT+A %?(?%xC<i#Nʺ^:󀦜*YS7MBPǜJ+*y~Ю8 yC-y}A"zK dyBn*V:L x'̈́" zE6UhDI`fEf+"Jf{>fFAZ!MМ>U}}?rr]"?ZM=gFrN4ޥ+6~dNY.˄9Ҙؖ&U͞b.qkqDBYy-_ eOC!f%t\:XE{v:c WpRbOHef@{R`b[;z&/V| ,c@LCY~#*w ]M[-z -ɟO$ z[PjXH'ؚJt XI` ="}T'8lwۼ{ |8l'W ((Tz>/F 4/A<>>> endobj 655 0 obj <> endobj 656 0 obj <> stream x}Sˎ0]: }AM\# \ ~JH$> stream x|w`&nX@L!@BRDC/! *H0tn Q "^^QQ, ** (" ɼ3ϳ˲~g93sDT ?'vЂQ :F!괝H;jT52? 2nj);N%:8sLdCD=rǍ.,Oe(yj]=巂ոISg,_":Q'*M ]G}D'(tU {'Zf-H)?IlioL䒩@|/ut}#S^%Ju7ꪱĬWn㴻1Y{v0=:٘3 iճ?Gn<#?XrQȧF5ͧhD:rGSieWC/ed|L4F6(4-B3Q-I4z^ҽpy[e_=\$z4;>Ƭ▒a9j](>  jNz\,6{tLHa7N׺~Q"@g 2`+(EiDnM6s䇨/EUp0 VWr8AQ`k##/",% .C> kpW B;>(& ^%rQġ| uN& ]t%݈ς3OWKe|}>/ ynLjm],vn9&t!l'u 9.0TɢC@SCty0$bOhwFq||>c>|QB#TCR7ZA?  m!_QJ`3ʜd";UQj&O7\Ki/v 7@?>q9gAHS"|B Ea\|@Y9qGn`Pr@Fvϖ}4ݨ;rF+deSdJɬ݆\%cj4<4x2YXfTsm௩h#4AZFUWsp1n(xj)˛(U7V>;AV25E7~1r?!D`5ۓ[gop޼EjoZՐ\Nޓ<B<Za#A;՟G#N UQcxOUkPq<q$=zNE8 (1?km4R{~Y`=w/]騱iA'զ7 #ֳX{|+zZG3wh+4#}'JObpgcκ[ Ym]g\}k/SzJ OpmR7BVFf" ]\Bw:/N V@kɴ6pǘM2Ps#G~w\>.h^o`%o7S\sWO&ޓ&JYdF|2_v8 ̡G;iwɣ B 50lj_Gݘ_/x zxݪ\4thmA!_pckּXԅAհ"].(lpRtv:Z;4eM1Wuj6& oFel} G0ۥ:oI`5y>C| `z^|?4dK<<'e+0!:h!ЎOEC'֨.Z{]<{"?Z!װ./N9rUďt]^+wBt,ҙoU18,XW"}}12<Хe^l}e8 UK-Db_:7);xUsP?/%]}wV_@g{But3Eb-@hnQgA^)qz`|g]Da jNeSGgB sgaL #]f9}gνboG1B烺f>(抂0tԜ YBa-0s Mg=Juatl[uR ^4`T@Y/SFp ~CW 2}OtB. S}:B/k:Zp}㑎u;\7DWO`M4oD177A'%k_F\#^n@ m>i}( l[fO??Q=@Gb_n=(~?36 Ѐ5M?a._zҎ!w9KCz8iR8δu8&@8@xqtRm6>.U/ @xKsp ՟?>Vt7J}({FcַӨt |w>| Btji@SǂB~ @էX4E|O (N}oa7ܓ@G]r25mݷ (86/@5(B `7v*AW6 <`Dbftբ9LպkB~^Z  YN]&=g֫(bݽ4h,_g]A `J_P--SlnaA]_xE_Duy6M8?r MS+&0sz/,mJܜMpkJyZ/f5էjAkCjݦEdo5;r&o 1&uxt4طP-UQj ?F)tR0l-Y*r 9QV#]4ʦCif}(4Pg[e,~,`p^УBt u@{@y ߡK)m~>Py8uxRU]k]km]fn[: ^M )Ukأ̓$) >+ q'%?Ye^l*ؔGޝoZUYn ,S9,DW˳0sMaj滢K],sg2S>gzt85scaMYYiD (_h}e84t7IP+^Җ:wl\ձ >g.;OZH{!0CՂ\z`G?u7MZ{.]B`;B^YP*ԛnX;uU^E73ܑ'y6 d=Џ~ /s~8S .7.v^2uTwһ'ПFtpRr8Gӻ} ~yD t>e}1B.?. }MVf]n^㝵/=" \K)Ii-N5^1W@ϐ=-F|\X4Q˗Ӎ5uF௅Uo'[ӝ66G;O`;_wP/ٺB/'|V \_p*eoZsg%}ь'U-*[oNo:/^~D2P[ n|"{է|62~z=l󗨏8R r-ߡYZm%,c2nM7M3})5tz- a/jmuC& m dq -;/6 -?O[T_6ַcD3nS[}/ h^C!)k ܊474%Зͳ  0S!f{G2rBۇ"j#VGÖI|Wt5hDޫe[13y(*es(S3IG'+@T=jw=YD{a`ߐ@3c -i1J>ϯ<~k dgņw:som(ncd:ޝr6>S[O z|cQMa/=nza;s-@wbꗀWl5:_ʿK hda>-RJU ߋfu1w5w;+=Le-L-1νe } p^L+k[aܗ˨E 0ALD#3qR4lU?=XH_!r`7cfq苹HUs<|qlYڨx؅@}i,^@7!Ҍwq' ?^qYPO8gJ+;?2͚Yn"|.=`~Љi5Fgc^"V:@q`$ .ae1?Z6t=5*D7$~_:X׆89DBrVzۚByc^@yb'z䄀eQsώ֣=Cˤ>4t p deVNslQ)-weW< s8iRi?ukOtPd`N7F`RpƜaHQם :+)ߤbs%~KٛR6״ߕ=N9ǶbuzzO^6{zT%`ӯP՜RQ&Uf. Jx?ꜜu]FH~|㠹͢;W6j=8orս=&C1Ӎ"y|%XZb(HGi^H]y#ˍAos!޾Qhf\Zb"3m5rsDi.=Pu>Fx{{xb̖ Z%iMW _/WAB5 j瓇/`g\gժǾ:~lێ/%l×%⢡5zy&jxTnᖦ-D1Q5j֪]n 6iܤi}ymh{e\|Bb:&_թsݺ'Qo̺ϵeA 3<7/7g*ϣMKg?oG?i=ѽ[ה.Jء}RĄ+^Ѧu+_XEfM4i԰AzuD׮UFTde Jexm F_>"0$EPi{~42NL)=Gb7y+E\frm&<͌o?k̂ WK@QpFo+.z ev+]\22}̂_oYX8(73ill^b_vJBwj9[hY_WT8"ׯquQoѬ#1(nzئzifx/{KKy ߼yEnfh4a}ߝ8? ZG&vp ?>rJ@Ǟ)1azWA\d떄>Q]RF#k4i%i0cb |ow ݰ^n~OGC|كsNf=gǧ^zTs\ZS]BG'hJB7]͋*)Υȹln?:6hCKK#ϋºSZfV#}h_6m8 0jIS]yh8 ҪQrX<6iӈn6mmɜu[:vql֨>Z[OMRҠ->g[Iӎwhkb-U,MDtvWv{MUI귶{kW;7IwUw[|iu)AGDc7DʳRDuΛ${$zq}<@l\@!QFںuibE5.I""WFUWx0*n 6Ux$V JDZ=ϯ#_%g]-bYBb,Cs+Ec{SVaT}iSKԘԺ=tʸO'{m-..x[24<ߑy^!3bsf64mzx&s0 yyb { ҹS*T~v:J5O5x1AFJעѡtǓr/PVJSexY)wځ؃u=0$Do0 A .`!/Z~Y^5b7KiIեݴrh[ԣ(jLt+m_?ߋ,q A{: j3,dRF{5.t- *}"ښ4g2ZKo4m9L>$Q +Ԇh ++Jr!W R_9nE^6-;h1F|WjZO/P%a9}A?/(b(f`=z^lBmG{&G1(1ޫ껪˫ߖd%OȳM5z4ri4j;-q=K~|:Hߠ"E#J\)E,A"_SLP,ebxDpOXďtΠ} O0oA%S΂GrOs <{m#n;|l^ЛnERԀMDրW2uÃm_VCSOI~&yϣ &Bd7<e0L(N')2ՒГ$Cd⾤Db'YzO8зXxqFtE{|n C8|sd{+x < mC۸.l;W~UM''8/|`d,cېz^mxy50t= <.X BCI.Jz~Xig< O.,3>LyYf!P H$q=Eً u(,yh":T=MDQ jv X|8Bm~zMyj&klp8c@!94r@$QP F>\ ' • =aږDBjTmŶ*Jvuu\&Wcw6;%%?۱6S6d","#fǃ_XaP ~m}X3;IWC41^J9Rα~c$8NmD${BG\SUɟywMmeM˚ۙښh-Nuq9Ƒ^t![PpUTtsZ6wpv?}V?w|4-6~=nEZ~ĨB WeW^y{;V?Yw`m'/9n5eh?8N9Lldysqq"x !CJC}" cfkRX8D4V [m&s0@='  @1DNt/v&ѡ`I3,;DTMJ qK318x-KL ? kʘX#ʊrj5-YoO?Y~rAG&&՚ވך-fjV!{s5EBH)ħ5AmeHQmV1XlToZdU30v/?~kxwtFAwhÌDAê"m3:^f6)^fP~[ kOz/gPw&8.ZUn!aM.J\+*݂rXXQY]~꘴y=qeM3v׽ho F:Wl|W _ Gbn0fLD̏K5_%xF"3X- W@^@pd@~N6vvGrK&O$4TDD O0E%%DQFjb/e?U!̜UAU'sWQp򕁸^V`FD^pa/7O -YO+[xC ޽l,N1S#5s=ؐX}:H纒} C#-a<@xp?XN5ʮMccw_-C34H2)V/;4CV+ )34)N ~w-&[ y3b`p1j[v9z^3ScHRFIiF$a,1GBq2j T(r-F,tM:eytY\Z~5"Ep4CKҸS.+O\pL\=\h 9<03a11ԋ=l/b9NOiweZDN%` ʂbnj8@pDgX1}͝r| WLӹg|1wɏ ^ztvUw}3wV{=LFFB7"z ޮl7QxNQHw+L;MM4@!E0F^"#/D(&]sQA)'xR7jRXTCgcpz|<5/6`C[84F ƴ)@FH@H- ӊ) ~K{%NWhOm)q ,*iMǠ s%kAJtemW_nݒ\I\c u@[Mr5ϊU6S^L]ajCoypP>VemVo9vghmc>Xݶks90YI6ʱ8YbځRL'$Zu$VYI/LkyyY4<u 1@$ಠ[du][}媞>#LuW'%,0[ "ے|}`NXQ=a6BڀFNvʭwfgee v+̬tvPa!22x\#Y ņ8Y(ʼqy󸼼8%-L)+QRW]Kaz.? = 'Ƚ.0zytWhJ@;t0?H=@e) Uzc~Ʀ+}W?1~YVKd W.^L>uO$7gddY=ո0Lv@Eg?32s/_U0bR! 2 r85k ;Ձxv(u)k4FZ@ ).,E 1 |gFL7N囍T 1dq'wv%?lA{[-XRs-_qwetL&E oȼA &D?QD &R $#x X^yNGRvvrw!mj/ytNN~܋=:V b1s'с!؞=I| ~ \Bj980rZ!fdyfM*S8Uj,6~n{  xiQYӒ.b zH%et0!4ؖͭd{bxeZb3L4i:#ȼYh srұ!'^e{ a,J4D6"R/͝+bĥFlPX"Ҁ1¸RhX=,{!(f[ MTy5+Tjc{J sL0 Y`nÛ~'|owg9wO}rտ!}%2'1O /?|'?  # G|pS P(gR,wA ^LHd P bRMJԂ&I'o0o`wgt/[Zl pt\7Nl8h"ۢc$djҜe4TXic x9zz:BizzPX 7[y#!kFT&NM] `pjud6sr< <\hA0^'ڪVqf2re)nd6gˊC<{5*L\,K vXːhq#ұ9FȮneQrpy?\wZc[ (|!)S |٧<_}aU:Gv<fbii#mbGA3/SQ&KAqټFQ%*pʛ#K9! |Wj&m~\ Z.X-.)F{CSmjMh.ݤɂGa2EIJH mQzcÅlb`SLH?<~9xmBՠUYrȂG]s"-C{ PO4caB  jlGoN#h`s0.b}VR:@ Ul-V0UWMm龹EtuiI;/|${+&j>fUΌ858N3EXIlDG\p~d¡È0 *KEZvis=rAonmV|φdlNf'Vd4ffpF3e{=D27B@ lV,(XgR/葜NY˃3^* G֙ZԬF̥fN_T.|޾Vkx2ӅJxQaZ[5w8ūNfѷ޶FS;wZ|˰޽;}^ fw+*1 ⠞ѸuYRՄ<#&!y=Gm5[B4ï|Smsw>ZC(@MV3Վ'h3l~VG'*_T*7YggMdI4f6U=v pQtD5E *S&ъݤ&!M8> Jr^5qH@-ӊ'rv,N!"8ӭ;2a]ʮXuzN^|CfE)UfXT^$w0be&K9^oT""c=hQlȬ7w.׆>eE{^M8\7>Is7=uzjzϮ~m)AЇA(|$$Ҟ j$[1>K.{F&=#)u$_<,{Do3rVaF<wA0$LiK.ԀTl!IOnLׅm"$q_lãF~a_<g5x/{N%x9*!G/xb\Γ󦾊Mb.yntϱqfgfՙa'VŒFU !O,E_:Kp0N!,ř\Y~/ qkGL;UfV P{6o\0Ϫ5o}8vMsh^/K {ضc0ۯϚcTQ=?wvdA]M'XuUp3|ٮ|\d-t/*:C.j|(AaSE29xoQapwӬT9%vZX"JŮ4\i. ȅ]ú(TJ (*)aY+<]bp_VE uT^A }>Y8rnI&0љf'O]f׺魏Yq1}3Gίz7š3~9w&wkS}5e2ktޏ:MH14@aK>"RUT9bUYLdҊu2NWLT\w PMiSaF,6bRqWj#|T7}2S57gv$f~I3檷/ 0$΄u ɬUjڒ+FϏYh^):;9tsoen=0g}36߯o>;,;];f˨~En^5vԿOlW>:UqCa߸9o^זS1(kDuC4ߪW7k_PɀJB,N'M.πFF ܈8*ّR<_gjvkR 3JHMA&$sܒ`2o~S92IBwށ8KJv!2)XbB \k.^LP"iU2A2df'eπyY¶ZǀZ Pk$z#6%u4@"N&SdǶi%^(yXsɳ/nynLzSZض ӎ41$Έp?r-r ?>]  Lلw6 l7Xo4hƣ K~ܨ'?m3OMxZmx[=>5uoN—^6EaKc_E_U}Mwt3If&LB2If$Hs+@8$0HDH8 " ~4J$oշ-vޢ3$HWMϑ_w(o*1#}~((T19׿4~j'lĄu(NݕiO®nQ|A?E|+LkЪ($)N0 IOd$EɂBQT(bN%ƈn'v_C5 :VFF}r,i|D>M|'1Jl$ɒnUe^E8hTr#A̎...l-Y6ߔ+P~juoEDGb,% C`2APu2q+cZY¹&ITU'qvB0Y?ߓ'>Lj=DNf- lk(6v1OwӰ $Р{?ݧq!ɑ?lv t'f~!OÖc#F%ǫ `JKNd۝wbڬa+̹E#TFLyA:VT ґܬP~!ee"+ǯBuB+z/H @ZBYb,9kM3 a|O| Ոi`d-D")-RT#7'[N\p!V YPE/5?1kpTgq掇*(utx^׶d3Uα̩9e=hڹk_QW(?ʼTrҦ'`SD;V":XyҧÔHnu$gn B [v~l>|_H x-5XAh")9I\{Xec`qq>Gd`z0 Ręqz*s '{̍w=%MG[w4-}:ĵ~smx={G=Ku.`&TRmXZG&%8anho7ˏr `b9`A36y"xUr$YBRmfEm:wBA•^\&J: |^`τooA=-Z}lᦆ']_/]o5//ٝwu zTF,FfD0m+љk9)q.ɑ9 9'I$֡ EzU`F2Y Sj57 ?Y%G}lm^s2(p s RQODߦ}#(@ m%yлGβM'Me-cWM~=vf"|mMけ{~GvJLx= $& 'J ǽC=X N3-|ZT[i^֩@7N"hp $rG"Za;~`[֦Woմ6&W]6Jc#_l!EVMwf鏎{75J *r)!ҩ]Gڣ)$2.wE3F#edžG¢ߏc{\pJLB`,3:`BcVHa"t&5{>-9w?LKPۂwDI[p6LcFc+=a1ihBԓ'—MbQt*Zf%&JaM@0Yg)v"l+\X}EO$%ɲV로 m&1 ,C&$!8M` qXR<EKV 8Z@7G% e!ѡ3rތXgȍDL8`xhj'1U'Kv6'!&בEr?LeN#>ъŃ`fLg c: e~&e3uC KS$skZHpNp\*0P^Mz;47: ]$jL?- ]AJBXdvn7 n#0@ĖD"bG^ ) ^rUH<[a)[*7E& "ǨaJ€\ĨafVVpȍV-dw8\?ͺ&c YY,ꅿ,+okp. WiՀM G~r\p/ ~l' Ưij:z6{Y)Ŝ7vX!QdؼrS2'w{G}\լCƦ?2w׷-ji=qz>7VO tn?-z*)J*BcPihG̭hirU$ʥb@!UJ+k2,d|C)IMAfb1h8u Fæ43^E۰j$>dm܃Ez~Rh@>񥪰 x+njHQ u0Q RZcyN/ٱ߻~甚=D-{7ڞ؆\)woI-+'lC6tkd8Y|g}VsFVvEkh#1zŭ/DPf/] +V4ߔmrЗonoUσkFv,quro?<YuRzNѓh5zzus,ӭSL.]l-t*+#,YA|&}/<w\' 7k BL)JJ|ʲiؤD%H| M^EA-DzxEn],ƃ|"NAޘU@e:g?e_{#Ss߈FUEgg>{뱧ϴmzEt>Ǝ5K1=$xfg) N?_c>jt^&6í{;3T2!vkBDHMQ}16˕5O6,[Ü$5$[! xHD=Q 1evM4kqY1 ņQ>]Gp3rQ"tKL &VL1Pn@䘎!5+!4/k!(P/>X5H^A r`JK*z{<+' :ͿX<3p;6|GMT4\@?غ1$^3D0V%OFǃgS-3-H;P{OXfqHs١ 30T&pKC55r 9?L$9x0sȡI)r\{UF)9b%.zMCXN֘҈XQD-) n$ǀ 8s{JvoڔΞ8/+tE+gm8~/wW3nxl`gؚw;d^, 6綺 .ԣE3/حLZ7ZwYKڟ_܎5 lbbv%Z*XN$nGoE-ş ̬Ds0>{ѾnL+H^IeW+zpO.<%'{\O7tYcGߢxw0x+[܂(5;P^lKޱ7ѳ|c6xLx;)|aۼ}; z5 qFn޼\LQhǍVv.1;T$ śT6ߊŜ-0|jVwCʞ:Ogmx[g0"1s" Ix7SoٴF!ʃڿPJ\ӽ4>EC٭;{M4+sqϥg%ύTzG}>v!x n1MVkˣ扂fiwNA#<RQ#Ÿ́YOa5lBNl'W!^OR =;K!b4$@kN`l*IJ0A/ ,|&q'N-a]QW|?@ LfIu;wqwzu|.|n|z#!d,cŦX̢(9]p{^8PX $j ۥf6{`?Z-;֠}@D-oP}ݨbk {oŦ' d?_5&=_5&|.WL+mP_')N!B_I($1 ! DZRYʼnC&T~'hXE3: %e-l] $7j_~!Z3U'V(igՔJu3*1|T]<&b9>R 3Yx^IYH[MGQkL6E4hmf4,Ić2=2X !Jr$̓QML'd 4*M8$d#X?#ȅ[{;fz_j#|Ož8 A O삲|XQr4]]| e Kg5XY6LS8 JDͬv o-.^ k2It;4QVYr$$p2e1a5 TN,6 a'_GCW)XۍA,LeҷOŹ-'ItXQ.|L¥/ȞgGRr1x,Ч܉ V[E , B݃45Nԅw8EM,̱Ze@TZ+ e|[i|.J1 xZ_BkWfdWS-Bx@hc8$!L4jt펊UNQP|*5aPGbs|1cUr g$ެ^5QPPlw8#Q*Vk -]R/Z_=騡n+uYs`Ϡn*@\t@1]vt^ kA 5ZiRyvglqF"Qɩ{3z TGFmЬl`-kb1;(șsH7%g:NiAx Ͳ:m.*Dt/y`0&5  6L)i/@Cdv]zk=ܓIqwTD ȯ:2,HPkJ/Ll$=>@> mM[MmPSU24Ψ7 9G D-?F3&_S,kSZo4Cy"LEubl<}?ZLK Z#l~s,Ox2L|T=l:徙n;[?P2+Q4q:.]L~4Myb̖Dmkq@7ieQ e+h?bEhWq_tG|4JRR"Ã(sEs~9vHQ;Hϻl#")`كA "p"3kU HEwj~SV2 A k.4]j,bqMUAM:V?t Z w krȅ“=J.<["ovaGp_8n~GNcNr\9Ύi2vE)`J,yU+HyI*4lj}ؕV!<=vA`-gefh$g%LObrH^^2ߨbKV3WRU+@be#Uqcއ)ļ?s?` [_^Gq+4W;5jHuH*IvIehSޗnyL'ꒃc988,_-5'jBLPH7k?Q7`'\}{_T):ڋM|άfhVUa֖<ԛP lA1!`'0Je{2s, 'Г }ߐWq@>>PXXy!@qQqFn@u?sסF6rtH !|C3U&v~h8畻ɺ%U3`I%t*ys&N(=͢t!ItD(`x*":`C ]pn 5xIO!BK󍝰 fr xG2,[crvB#3\4MPgU% i8Üf@S`fW-}ؐ(էvu!O@+Fx\F2]aH8aeP3fT ?0nV\-+FZWo?kBXf2{T%lx kzt hC+QĮ+K/Nci3aeFE30c7E^7]!y룷eoބemz-uGzx<]90#A`Cs_%xRҷ0!;VDj>3aժ["jR\,Io)R2k Bĥ~}(Q% #"d e܉e4XaVɥzL5yw]]swu/=Zv߭u4nmʩ#yعXŨ]fWVc [)9Aa/}^Y-ycU^}2r0y * loll''˗"HI#6.* Pt\Q=|53jvLiF]ו%E{ύ&o^XD"Lwv3 +`ۭX`^Wh@FX#e2b tDRp\I.J϶em ru[~؈M3`8 =*z]BqVTo g 䱶4ELӂ\1cj !Ǥ(4̗l틦Z=h} x[Ź,vHIlˋE&Ƕ'^lΦl,IlgYk(%'MS-\R(mi--ܶ)R;3v}{̙3ϿκyꊎޛPTgZa2k f4^S^P~qEetomKiE̍iu:[>hu *D٥{C%OzBD8Lțd(;˽5]dHUThw$f2yX7xu3rb'!#w֮>򗕝/u֔W6Mޓ{雗.cUcwG*ϋܨ15 }fE[}1Ald \j}9NS/wUTk>*)Fl@>0nx@O|М~jXyxUWYUz#g6uX{h䙍{࿇11WqH3H[86(+<=S*5RLvR=A1缼#Oنh} /0HnE"L iam, Hjo lج\Kp 3: |E(,lY5[RL<62rSXƥUk_wbQpViIӂHR^Zus署5yZt_˂ssJsU+-͛^^3*gͪ ZFGsl-g@F]hN3)+K_m蜅52CR 6q!ca=n=lCՃ~+ KX`bL=r<_c'= ~A=Blˎ?r{u5k'g͗mC^T72\k*9/nsñI->8A }H`'b\Ν4z"Vew4w2ͽ㳜3euO Bi~X=*.18>+gg}~'g4mHӟ'qVkq!{LLjLOr[v3`aρ3ӡ5zܰ-R<r d\0EPTZ67Qf=q:!qq"8x~\\'&̌DHODD?[:ϋS5Lm*!#9)ы 0 pจ!">,f8zHF8/kbsJY2V) 7낖-@[W_?FVicNڗ{] XdB*hFp ˼;hUCe'o;)/t?x2(Z/Gr ONH1D4?s~qoὯ<u_>߱lYα9ܙe킓讙{/5?Q:eA"D{iB{ZywK MOLNs$1 #r!ݬMd&Q2[(2"ivdD.=c48<z}~ə+Ot7\zDlnWH{B)0?1- Fr,=fh0Cf0L31m Mц` 2r.yRa?/-#!Y,Hw8ȟMU2l Fe`$!Q=dNVq_(*cGaOD\g ږGͻfnѩKwŷ sϟ13Zt?B'w׮J ιSY~ۆpHwhʊIr6BAgF? !LA"[}"0m l7[Ho'-ұo in4 d! 6dRE(Q7dv.?${ .S6ED"b?br83eZ4(i4b9[P"v}0*KZYڵJLom逾/~9ҝۋN}S |G!.Zjvp4"M4i(< C*X6%(\Rpq&M&0eQ<䙘JA@o FB$'.z P0^CoC#~H*=ml=m,ܖy|Q.d-?ho,ʀ<7$Aɐ a6a` HխګbYI,@Py2`,4ˇsM޴6LrF&3m'f贀7,*,uB8|~ho63,o4?̰0@ h4pauj .k "xѤ@.YK{KUɡD~k-;{u͞}=0fӉ{ʮW?j%_n[cȝxpۡo,p/;3ɖ5yiWHL.sSdYo$'D^#ԁOdFH=esDЊ"Z`IH%i^)uJ$$.&0$& ADZ&\4x=<<{e s $2@,ʂ)P~64|1EZ̝('L99p/ccr,IGP5&!ď ˜BZt%صKSB3| 6ݯB:՝˳wk59%=\:]=FW'2f0joF[ ٭-T` " WO$)KZ]up(fÌG~ 2Bi$,T'8' Htz%A;N 5ncN`b,HY*⩚_pn}RRJFxAaٕ^ _:z]+L3]D wׯoLmZ{ɭ YEww+{CŚ#ř? coQ/j4ZQa bU8%ǫ5f )Mh6{n]kIO(~˟M}=~ԱILV 0wE+ 1 OT`ܕ"ɑhgEF,7 SEWvfZ{Ԣ&G).cC+ 9zS f_ P ^ۄBE)h^)l|#y ?$x64Tl\1nOYYg\wfnjM誦]Kk7fI~ rQ~ܙʗֶZwmk%L垱c ۱7ځ96)e6Gf-h-N(OmKER)al Y hհ@ ujPCzaL@8Rke2BEuaBJkd]\8G:uvUT~}ˋNHn:u]󵻛*ӫ[J/oZ9v;&r5=o޽r㉕o9v7۾Wmɤū/hj!ԣ)f##=ZrsPo6%CORZfH6ÔcB!4".,40F; `s  vYx2$%'8)J&b$XV͖ YRuWpՁG *udt4 L2r3=L+9\ ́"VY8. /p3%L*`V* 0 bOm4NZ41tND//k((+p,:&/>XxaGȷ`ǜ\WwNuakcݕ[p @,a%Q)2€ tF}0N_Gr-cư?1}df H6ur2Ru>l2 gƞ4 i"V%ZM.D*yԸ:B6:Djx,nn)(5}7>c7c/k?:LYwUR'qaG K&k7Q6232R\' l [ ٩.V,Dw]NRӖv1v/Lr̈́q&l?P˃[oh1<շ ؽCOdJGMX1@m,\[Q04u:vPF)]lT#%v(Yr2* &L YSq M .j,`~2^xXfPoO=/!nԧߢ%{;_/uw_Z;VlDZKJerFmefb/b+XmHȹ_@bW?&ְ(Bj-qk4'W/GAM1`!779ll wO^ CFbdEކcvGwnEraiNG΁vI,pA۹.p´4EVRNBv!$NQ" t+=RfW3]sWDW1jnfQvhrN_پy[pvzmӻڿ'ڱ?tm_Z^zÙߵ<8mϹG??׊[OcUG=~5\&buF$F20=& a2}:Co`}d7i"G^=Ԍ*fIy_sa/}l.=tnec+xkݼZ+b5Y}Lb\Ak[1t8 u!( XR `! ffLf7Zoyj\dr#әa̮^eӜif3,3t3q96 . ȽKT[+LKF_|4ZQ;\`_KAhM%=^-˟[9v YSZҽy !? =8\,f)I\]Y>`:a^ 6~beŪa˔ ɢ[mwjGJVKFB,j&Oanb`b-_̰OK`CX-/%xSnoK T(z}3_e|&ƭ'>3q]Kl [Z;CTbtוAYd8{ܰ -n6P~:#k%7]h}|xM^MrDWg(pќ"(DNDi4L9|sRΤ;qw&*/A/"cQLKdu3ЏL/^LvCK#|5XS6eP'7guN1ڷ0{Vk^uf$'*3ž Sm͇v\*mf3-*nb :H=L!򞧋|9nE k"Rs>KM2j ƍ2lc2vm{l߈Lge߼Tyݸ?f" )le3ౘA2 j|e6#.͒4j|cXpI ?>NXGxvσ߷<às~`-Y͝M3|%˶O CK)EKc]m12]*Q qArS$h }Āhnl8+"[—YXuq j2` `Zwa$dy!Ế<n䙚V0.q9\LH ZJIJ "\fRmJrl9331Njjr؃Zb{ZlhC@:`u^B[:ɞ]fA8"ЍJ{\byDvj+ %ce\deyzoqCs#<2;jυOqxGJr&*%cJBf㴂K'חe0^2&g21j 4N+) t `iA;N#w ^x!%Z*Pm BGbGfzRa<lcv-"%# !IͰ %0F\U4#k;GOg42hTduG+M2CL+:\{:lrNm'ؤQ\#%fb~~vcpB{ha ~G槰at/93je-G`jdè=DE"Mu7DcG_6F4յ %NGq듎[y}Vj"`4= |-X+~#ÿB!ZESl<N5JjX6ccpx͑pj:M}Ңw/io-`}$0ݲQq0#cg߱V.aTͼYhP\I}7 ASHl?6k]/пbh1 4_[̿JxRsO%4$ؗTt:9fߧ8?st7s[<ٞ36ddޕ5%Qo{%?Ϲ/b7/yUy=B" |jjjj,,iy LQ8uwS'|IYUΠ)0)g+si Los^I9𯞀v'K7!nB~݄~ی 0C 6?d6-6Z3?m0Ƿ8e23ǵ0S3Ҝz9ĥoewr\N\f;ӄ& _6}5VB&2Gp-]Chb)y6KRq7࡝c?O Ņkp ]M1qyr:Wqjm/yjew7јnk-Ŝ cN;}o#$~3l$^KhfCwXohonXLs-b5hZSseΊ˾Jhc= ` MnbeO̿btX 1͏_nYU_^J)݈AvM~N\v4 ln}3R&Nn>;v"&Ĕ*vw\K[)w %Ǯh~8X۴Jv2MEUVړԱt_ƞx633ސіRхK7~wcljJ mfs.6331Ufi."I'yoormYΈVgcy؂CJyNX̟I )s2ItFjUW~XHWp%+$R\c B.鞓gFGpW t̬f:[LGrye:s3q\{qu3[iBMӼݙ^ӧiL;QC}RE-ܦVic]T/DpC{<, &:dy=K|WV;lLO8bߧn@OFF4J2Ď~wgcU= xWg W/2S|N6(_SfO%\+z==ţ4d*TwY6M-i`[\Ǩf.aGG_bOqc.8 q1xYxelw[UbLWA%Sm{Ҵy1pVK4^Htkb3B&hv|mVڶ؆M+[lր$k[>^!~MZe1uf_hN[alY**[C5ٚ`Ub]>K_\GUuWjj_:lǼ=DwYlqg!J,:vN%|%jqF(.I\u1!:ɧq^rC;b; x$E5GQ~ +D82-魋HG2ҙ{SD~_qLgIq?6a?`0OD3bq~ =$} =rc)ơ'ch}&QH)aOzDf'~@d݊}WC7>ttɫ#ǁFBXqDu5] I~xCznjsf8%ΈI0ޘ3#oOMAQ&!,iv~\}b_S^mUA@x2!ȁSt|QF`ՇTcR( "כEUP!`NQؓd&`4(+[|ĩMbUj!,4aKd4Aɐ{cJބ&u Hnp _k"UhYatx82x 2rS,q|N*^tK CI6F^J.əus$>ILTr*nN{g9htĎӾި5q`|{nX VxѪ~bDZ;vDc{ٰ1hUFkK\ùVmLn[@ͪawٶTZF)6SKXNQmZuvk`j6HVwR1'Nj6Y ֯޹4]Qo7k6&ִ̺(UmZmSԬmkSmpqxnnYm[dF:N5:),!@668f&8ײZx[h۱l ^:<*;-Wx)溺3sV|jv3>߁?z^ |_Ͽş_gg?5k)rfVܛr{]-QsGݧf>Z+YGJWZ>^<`Ď\~. 4>_ʯWHW}?)*/5Dџ=V|z؊)n/jMs˅G%2(,= _XzK/ҷ@!P\..b❠*%ЫUk5fM?/(-kK+GR׌B_~_΅ ]x(^g@?{r(.ז?e߃@R0 J(V.T.m+wU}wnxeeگ o_|(\|Fswh4fKƽ]Y-__.? 2-?W*诗jwq}2j'^m?-/@ p VK[q<`йT)-4_vA~k? endstream endobj 658 0 obj [ 0[ 750] 3[ 278 278 355] 8[ 889] 10[ 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278] 32[ 584] 36[ 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667] 53[ 722 667 611 722 667 944 667 667 611 278] 64[ 278] 66[ 556] 68[ 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334] 96[ 334] 158[ 365] 179[ 333 333] 182[ 222] ] endobj 659 0 obj [ 278 278 355 0 0 889 0 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 0 0 584 0 0 0 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 0 722 667 611 722 667 944 667 667 611 278 0 278 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 0 334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 365] endobj 660 0 obj <> stream xSn0>lLH$H8~%E*94 5wٵtgn zVժplOC,!XY[4yg&8=4Z+aӦllo]{3S@gk1lg|0ecsu+p 1Oh*o%E;v q"%bDڡLl:'| yQm{)*DHYqsC'\_:Nӽ42B'wz6%]ϟh|H{IzGS+l6cFqD"#IlRђ6W]_u,'8imfZyN%T endstream endobj 661 0 obj <> stream x| xյsIpHSd$%! P/j(BV( XNj@oA[AmJ-^[ENN>`I޳{NH!Щrܤ􌖣VL&R laS3vh^m4}U5og2=[ж}gGw"=z֍h~ES(FxCZJ^ I֨WEV #FohSw4KjSWG?C=#|?,_k&(=CLR, sK)Δ,B0PREn)CkG^iw?E=`00Ha$#A΋2p9.bo-6XQ6ý]4Bw aA nڈG_͠o{::g rv^RhKVyhcZ9fmG<(@UH:D0  $ս4@mI/Svh9&/y6Á: a…QZo$i>Y|w!z9_ZGi5GmO|KgL _9(n`3XC9MF=@{g ֢N?q7u"g$OF`\*O>qW @f:vIQV#:Pc9@Q@;pΨP&2ò)aC7!v66Yדl\&YRseơB ;e*D1s4ysPwV V2~aY}9!శsT▲¡N_ځ2K̙)[iFjL ѺP' hXaTG=ϓ&A?Nᾄ2~l?:sqҲОxNx)=C^T]iF|S@&b=O?񉃞\@xW:XTR2cAԆ^_y-ZG+w`/pBh*x?.°20c*m7Q^]{y'=qzO!ME"V ;6SFX<#c 04h'bmT6s.D;/yA^a~nZ CB g9:UP}8_=Gulm7f{(לO΀Dkv/o}ȟ$6y-6O&Ś )_ir< JNcF0 LMwS{QCy =Ms)mAa~G(JZZ~=:kAlKs{7R>W"}-ժ!{oQ> c|%ʕP>bm *:t(>|a:pF1 !>/ßh'|FDO3Y)6=Vm֮['C<F>Ozzn~n}`%> 52Ef`#['.\a$ZZ(_[羨>:Ā,3̻juBx{sḐgF4Հ^aFg<@[]NQS6Ӽz;2D)돠SSB dN:"5~jU}wژ_O3AH }n8 e/#Kj0ONqԉv s߀8ߌF0x2د>˨W=b;㌋{|_/ :thC{޺]r4Je̝Wcu)Y4a#O>F+.B Ga4f>FtoFI'ViW#Y+˛d _vo?E{A_/΀(8n@,l\?f)I|S⚩3P^hؙ={q ^`]Mٔhe~b&XKҡl;ʶ3ۯę!)}KU6@;u' F;Ch ]QXC~:@q4G^cYFkj ({-hl+wyC)ɴ1v%v@#w?KĻeϱg(!׼ཅLǡ&p@tkv+v(!@ާ)EkPq}u|m]EB-l }&?X5!Q.sb}&i.niΤ'<44}BuѼMgh$"$}Ygzui*QV` Mr!KZy>Wb~up*^;Pq'4_s/Zʑg-d>A#)T|w5U|V0r7m8FK7m{s?=jg]52g|:Ӕmv4cuy~)ΡsFlܾy<#[Bk~:Mľ9znWݼ8u_.^rl>ϠbD?"k s8:sYrW)^?g~φꟑ~3"Ƞ^+.o}ofNYȷzXjvuf1Jki8Ӭlw֝풊D(%gs= yF*zM^Ȼ\FCݭ${"ng6pM€t;ZԱ-)Y3B9n /t74 ™fqtWJn <ǕpUG>@xǫ1 u}lQMIϱY'?앭, =&bw{縬z@@ganmSv#t ֪%B~@O }ǯXS vcvpB_ccm"'p e7 }h.}:Ľ f6v]Jq'w'˩*_}c϶($MOmޅtLi֫$s 0\HFSz7RwO]&Gs{%w+BҀ1g ;L޺n}R.+"{t2cE=iuDj~vSĽ,=3zUϓ)ҡ|vۦbג!mJǎ  tP% 73#O(ęJ=Ȓg=)ߣY*d\~I_SgavB^`NTM6=5Ͼ3?1oa|V1 @E{!Y@%4_dj޳!!p;UZu gk^a~Su;~7]:{s!cGniSa2),kl빩ʕ޳\ŎC{q荒4BS˒zv'z\=5/?S1&I;|qos{  1 .+ ó!E?C>rtŋb=^=\!7i4 /l+~s\峇wAm4Cמ MQ;Px8e['4(q H;t?Ew U,߄pG[9M5P{{aIb,&.Gyv" ʕD]ZC:;% '&W"a{ ^9i"xYM1:|Bbj1mX7𿪺8O\cu7.>8 98Coi1:㱎_.{bu9v`R\4cH~á_;HWۢ=v=ׄɡyH{}?sOߩvwR;{:atC)icْ ۘ{$X^fK->9g?m`R]PW/jmFco5.;ۍr4wݹ4v_Ye9asu_w0t,q>jkiM0a::3Q>'m^_+WQ,tS}6o SlRDnϗ{s먀u-TfnӠoYǩĺHKf,A[*uJEі6(Imʫe}W[o:H}i| |w5{jޛ=%֦m=)t!C-bx`mEwhcv̳G4Z+cԅ]D迉Hij Ro;b0Fݾ} 3lu#eXwLj:}Rk'O!kB{?g/5i6PO~$; q)2"uib yxw}Nu!~h ;hF7VI78=ߝrՈP;BH K_*7k1CNh[*Sţ_aH.NoegʌЮ| c f}*54Cs>+s7aM6FG/ֱtʧQ[qBnzh//-~FЃE9ɫ/S=tyzz>škz@p90O%Oʧ~g^|p$?~ѿ_[i(Ped7p0!|Ӑoч/u\eD헨nN#ˀbRL|MQOy7cA`fbL[82oᘐ|?ͯ)|iFn.{͟;: e,8lWwelaKncvFY+YF gci#Ake7l-L;y|~ x1>p!Ycչ;X9X?5cO8]2l!45E[hsza6MsVJ5z=R7=Pv]d\{M7P^X^P1,cMn[ϱ`'Z9et޺\~K~_ؤwM3Yg Ǟ ߦ OsX9q }L|^km76`?R1߿v_RGm̱UyU޵Km"c=!87XƊ݁kC+`Ka]DbӰaZ|Vöѳ*akMX/y&M)r`zTI?uaORv _$%-N|{b϶HlXՠWRGvcntzF7:Gc8d>1 Cm83}5&ގ8Lxȅt~ȺwH:s`#47Z'Rz[p y½+BK;SA;!ӛ C( =By4v[cnqYʜt# [g!iCmhq73o/zVAfݪ)Y *s&|8yk6S~Iihťyo.TR14бξe4 71!j mF .zƀ ZD.IxR*A7]|؝Cc ?U:<&졾y<;ian&rgox ]Y 1{cCg益`+8<)Wϡ*5=15rTCfoZiօR>(mk{A'%/,WQLcrwhSKOb̪ |gWeAo qkc 9~TC{~'ʔ8ywz~-VA^4x?#kLqoљi`gNЍHS"+Z[&:b|s G%G˾5>~9f"Lg0Yc+ ;}nJ)Ab ynq Ƙ~l}N9J? P|G_ƳT--.^jlMt=b܅_ D۸x/R}^fk_˨ux}1?`9oBG2O-.K1wS1Ȣ؋VA$bq>y־?yCR؜o"aW)7QOCw4ڔ6'NK>Z! 4!Ovs3R}߭R^)W*=M5t|m|mCo>8Y;S~Z7g6yYy3D:;סWpGؼK1RTվr0٤iQ-bb[Ƶj&>!mI):w֭{2z_קo5= ȑ#â}13˓u)[F- |Wʦڟtk3m!ަ*j[!nwj#T,lm>LO'دK~~vbcrW,y"Q8(8QT`%+9I~:6MPE@?)Xt`}EϓDу"} g7 yQRzjmS698/1(-||3:SY)q/˚ @E nNrWL@g'o')v{C&!/%=gJ+\,v3:IAJ !(>5hb%i faWa`WO.B5E%:m&n$ =" `lJ /ڗC]:aP0""K .LR"ىTaD;I<҂j+ź3RF{3!Uh\68k3`v69 :EY=>\Nƌ8-۽zMnvvi]i0h]Ryj7_к@պԤK:u Jʬc2w|PӇ>۠Z{G.i' h5᝴xGt |Fi00E:Y 1Z뚇z5k?oA7E6~MsFz]gȲin6Iɨd,VZ+4_OE E) %V-2$S15caM'ES5):)5Zd T-0_. 9>[yT=KQ_(G >(4R&U=h4|Fo6XCM#-]:RutĴʨU_]HT*FZ^65&ժ%mS},"0(&\:EV @ W׀S^TSQ4zB=F㯫zTߪ/ z=њI4 y641Ia]>Ӂa8`3TjʓbP>tmR漤l?R [|[R ?޻.Hn#u-pGj<#x\:n2\U7?0%QzIf23IH8AAU G ,BA܈x! + Y]qUWEmϢdg&]M~]{aF̓ tJ.]Dw(po %S8ԏ~+> S>B`櫾k>?>A}ʴnX/EntX^3fDQ'[7 9I /szU$ ,Zsoϝ `{u~&#W>YC;t Ez=Ȇ_#0|cy6xXuTt$ !w:Qӑ!ۙ/h$y:]Ѩ u>`n:7Lt:o+͙zAZ}dDM 4zԅuCn0m` 3_B◬|2uwߠlQ؛i{PYn mX?xj.do6A>n1!#zP߃g!5 L3'' @~NB~.)%ZnXhAXLYCp8a\jS(V+qut)#NiT-%ũ2y'RI +)z8#' ع/}eEPs-  e!2,$KBV#D| >XƮVI4$N!UԐ9d'9 0fV>VwFry|fBAzq6cǨŞ^~V|8y,80N#>y:z QXKnF}Xo#OȎx|B>L`# 0>x3Eئc,#\G-<ަ?2/n)jZǶ>2ʹH.//Hf~ p^I|}|{1ޜqp E1{;j,Qv Í(0jnj 鼿QJog <R:c Ek1{6还Lܬj,ö]bHr|!" K//".bw" G75ajIBw}J6ʹXUQҽ.fM[DM䂐>MwKt0?K؏ET8Iڅ8?bwKf~+I#$}kao' {ȇ^hϳѨʼn$=A^b(?6/"%pA|jQ̣%hɣ0SM6bXF$F)!MHL݀.jN[>YB1{* %q& Hp2V$dcdiк*5Fԋ!v 56 Hq4FfV@Cf| 5ّMHt#}ۯ_v7xğF/d,HlJz~p籇_8~=-~BnN<B$Q8yNt9sx%b6+~a J?Za#ل6nh9 P[dh36IB#,0HbeQɌr /^vDoR/F+;eͶg0>N\D ' (-a"1 k"J?%b QI1@¶6RE`@W)ӛ8P DcQJ𦢘Vfy u&ZmDzTTT_`$bjTVWi5 WQZTط_ً팕,䙷`>3im1LaM.} &+>c⇦1AYb\d:o4D6DHhn10!JAK \U;"5Q]َ(f`wԯ/D"~ QeVr)o>֢>k˚{BdgR?.LE1Nv|=CMs(ى hUbU&^C{NZ=fPϒI~%\~%|dYBݯ(~11Z|rotl&Yߕl3S\Q(/(3ؙ],f<sY;:3ۙ={¾o OAp͑a K`kcy߶-^Ulg]8&;zl+[3f9Lo/|./w22E.YLwi&"?tWc)p$ ΦK%ݍmؤ’ )hخ^ŒTwwjNyk@q`$DB'kݰf 9 X#E٘^"}s193IGِjs|y 0UmE qrs!Gr^Sߴ_zbc;l{SK݋}} =,w *}\' %=ɿ6+w4Bn'+tjN[bt\΂zNm~S2sjKTM;5X`񢭽} bE]uV^Q|H9. /K-pK԰,-hd%1֯@G or يڋ o3yjDҒe<וDe^Ix|ϵ$W/ZOW{CzrOƱcfs{nGz.7]nuS}|1Иq NhNd;+HM'tq3ZR:իQ 3NTj+BbSPwZli_kT@רbT<+"Veմq yNrsCx7ڹmr5gg:mVvkS3_:ƙS(D_L*bylj9؛,R @4H銱[1-RbDtE6 銜Fg&MtELWtŘpL+rL4143aod7Z]1KL -3Lp1&0 f .[c8Rح)wffrFbâhY% sJ2+JAf>TjFMW * S f~V{h5t;=8]UPuS/F/Eڵ[{#j rĉw5Sq9S΄i4Y3GrsN>GS]>$?d຤0]YHC)NLb).P^ε3;铿:}9^ Sc.\|zm!7[5⪬G$δ895ێtiNM+G'(U #J88Țl X@d zWt;ɷѯK滚_qM6طqxNaN=qT~bKzs8J47f_wAΐ B0{5 X,NŜˢs~^/pF[(2懳SG i&ciɻJO^ɫSuQpl[}Ԁ`i7DyLo'嚥;ջ+xJCw*7p1ڭ)ҹtJbeW}kO(N:pv,]n9j Xz:e]9N,~QLxEr~w}$+Kw}AatV_Yꁞ=ah rX&,6ԚXz aְҴڼN}Č=..¼ʮ]:CUW`⠳I u uٴ0zj<\K/m&MDDқ*zح{kXyro:gGy.~Ik 3 4ÅƘa+$qfQ-uYJ@w ~衻E݂- 3P7`_zy{0~e9k6:{뷎]+g'o}gS'0?0nUSg[}9Quԯ߿eI/:ʞaS=ώ~IWK:.FI>v}z3QVfh}hQxF_|siH8,7"Gu3taJ%n׫ vyGgBlٹK37e>ٗy<Ka5<ED[Z*${ΙF$;[x J$pd/%ËT))R<߀Rav*k!)Yi8H5 jXΓ\ C~lxl7cP P1 &]c51w>W|<hӿWę^ޕ Y^m減Vz2.}'@yuENo꺟),n?ܲ߷e?*ξw_| 4 2!{5Xz&D) ##y ^L]Ϳcſ[N:`z RpH?z)DKrGq صZV{j{f=2~ӷO1ast3.ZZ+X" OdңLe P9}A#6TҸƭ&4lpλ qcaWOtΪCKό,֕-8~9nj?P=]R*FAGF-B/;!%%)nJq'J8V1]h"zLo޿j;|emApMr; 6|hma iym Fۦ^Usr|yk:/t1,I1/T^NzQ9tP[3hݵe3՜w/ \ xA'T 4:DU0MOhzj.bXê|pB")jU*0;0;Z4t\RѨJ$(fT6'uJ yyYqv=u&j+Q&NOX#Nhj6c/Θ/L ȘyYO?g{'+V C ܅BS1BΘ/ sB"^ݭDbelzADq%".o ]9!-Z}i-@ 3&)c=ݳx@"]rԑ?d먞_E1:@?i%!#Ufxc1qL⩗UxW^o{g_^(2d6$|MYAlpc3]V:HD [}ٵ̧+1` ~`F ]Jgб`.ÏϿgN J.Lm0x xQ&J^EG"q^d$b!j!h(ͦحna \σ8 4  &9| 8£Gq=;l~ZZS}h$mW-`ӷF28H{\UǺ7f13N܍"$=?#3XU-V edRG?!P27dG lIn_XP8A8FCA'3z6ư@{6 R_Cxaxc"SKfq=mD\7?âUSb by bF|T>tWE6sP(΅@-o ʖAiLMu8,)"X])O.)Q(AD1@:;ҹa9pCo~W2ProlieȖ%[K{% Ata e%ġ\NzdY%E6,L㈯Fr]0Gsjo.rY wMd'!R)f%Ry ]FZ.5Je2E0)u6\~W[ 2d:V;N'ЦIG a33KY UgD y w 'i:F>Qٸ FPDIڙYSIqSErm 走\ ) k^g,psvo ߁(\rx(Ś)n$ϹfD;k9M)xoQp-ƜUAU*umGߓj#)n"䎑%X" .MSxTlYtىOk6cI0.Bgb 惓"<|\9!$ZIĻ4 BP&"v7Q},A![/ 7$@PF0dF%0v@6X>EHZ& . rBi kGq K#X9NcgZW:~&ulv5CK;;hCFQ8B-S{dsE]O-ɕY^ 2jQD0嶢{%Zo B h}܂$d'^Eﲿ4*,L4=^"#̳#05z 9q>}gn`.<;rob4md7 kJ`͞/T25Gw7Mq681|3 .er#sWKNq֚{rWbwCee:g(,m_ʆה&$)tD4]2; WqތDM:0r7teu1<]yB@; r'p\~?_ش50? oF򃅏'3t]4 .r_yrz:'q-͕ώϮX.]1 1|H#Y& ֲ,i5W~'B|@XEC!0 MN{xt=zЃQZOQ<`8^Y k%1J7FB.$'W9T3Cf&M d)wOߗ JW>xW0Nƪ 4'n+Ftev5d! C`M/IaGg:)]c>^-`>l8,|"tE?gVgoApI+aGv =X8P@/.j|oA!HU[<& Yز勅+LȖ'$N&"218F]FuUT5qQ.{+G=~ޜ6lZ|y~e+j׻v@}:}ґ-]^v)_ < ?/ .2s v.$Qbvx3p1%KksLqαL$"?T_dgNV)Esؤ֧m:k?b<dȼMk&[E_$ +қF3`B"P֍YQWG|tD! 6e\u }_+O%}DX[*x~Yg3#s9?xPM%Ϲc8nhK 3fGHϊ*JMyht{CFĄr:֯r ]VBGA[ C0s3&U5ΖMgG'OJN:GgW*q O!Rv*$re"Rv*j5I*5X9)5nn`h"Md]y~&@ꅯ|Oo?l%쿞.ϵ٭Ofǁs:o_-|8_y3VM20Ԣ^dnmhzkyc՟R=B} H9&wΩ29UTfa EZO셫VkN.``u2m?sm:־߱+(Ȍ0ӄk]ϰG\BA7^D!Co:=,FPX= oN?QBON%S'!YݑSb =>yO+3ݦ"C1x#aB g'RPBg*5R] 7`%u=gnۻOs=dJD(l ' fG8S v9°z̉"M K4]L@I^U}ɾa$H=+!-/9Aҩ!$kO"KbE{u Wu,T+ {{n"Ǖv2P=GLέ[ŸzA !+I\qA SfuB' ;ζ]gwXww 6[x֚D`֕;C ߷;Μ[ѫΘKVAGx橳Ɖa)Ap98H+~ n>b$X=l˿] Q_?ˑ-4vHmJ58P|=pX(֑1F%H g M @ O *86I`FOwBmVph xE_2`^im+M!K1EUAbBb.Q C“,HjKD줻6Db&^ re#O]U|[؇lys~o \vϟy)ۢOEHCrˡsb67F0rEqU O9)b90C/34q8Yc4y$Ãkhv!ZjsPǝu:ZXYhf2ya6ӷ)+"(!Kf[SpK$!m!Fv s8%-Q0$d  Ih|Á 0妛V/w W`6zXAV ;"HdA0{;BYXA)CJ"#ۗqv\M(cpp _3}nKm/!+ D\ $<<æY͙O?~h/OtV6%) =m_R;t7I oBQC6Q^즜eT{;4*d~{U,Z}?l-wUa)&\ 0ltf,X=)7Aޯo}n$4+$@wa҇*t*,enjūR!fℒ τxZ8V; q9lam!L<”1ߡ&\c!5\[fձHsڼL]Z~zWͣϪjgB? zwI~?7N91H@y031dGLe:2k>+^l Nx\UkVm6Oh/hhmBv4^Sg]U-4zmڑӴ2: R:1BΘ|[VӾjr4k /K^]sGLy*ĉ ;]+d$q'=^&GI)㏝$8dǒpUxx>BzΛ{߲]NؕKʒ>Xec}vwnʂl/>@*XQ,fW焤uY5ݹ} |TyϾo/L&$d",`4EQ"SAQQVVrť.%amU.x'* V09g 9̙9'TE-!/3KZU&oUըz K @X 8a!>-bOQe U>4>u/}67F.ɥ(< -F( 68B^pJ,~ &:;wg']-P &/@+ >ܥzG89Z)a}fŌ93 L"$b4)$$2UOh㣓6m=E>;]=&0bXR*EaQudy,@[Rٿ1Fn5E#o{,dZ곰\%KŕMė Oւ K'/99=^8?}}Mj~u}$nRQdhج(I2Ѵ`ҦɦҲ@A֪&9? a9FZ#cMR,j>*ALkhݤ!-!;V򸝘ۊі>(76k<1 Bi`!WyXUS !f#\ӛI 1H!3֌Ӗ9C)!O)o7_rqOSji 85,TAU(\/~6 {HGu{){<'P(*hk3qwyW a6~r ]ֺ%d$Nby'O41k 6adBH(B!)0 ܛr28/b^] b|J+ҙJ8D% /UJTW > X`Îѣ-K=OvRU$S~htI { (Q2aMa%WcJvx# аv-*`"!RRp2 ݒX-nAu[ ²+*"zcw:wAڽK[~r 5BEJ>|2%KF6XݡL L  #ƺӫO;n}Fabq]SUS]PuU[׸@_bQ>rR׬2 Kr1.~fHVo b^Qi>sujӟ]^+ן?kͫ09;߼h~P燏 t#},տd|߾["OQsje~vGH><}F λ5&>C$ŋfB1?@~zR4/љiA7*u IB^D,(_KȀ6EdÒk2N@Qsj ؅Xn\Œ^'vPS?~|-su%, I:)vZ2&&'7Y4EZt}BDKU4`&gZwi.@0_{QHs^ mC@Ii'=潴O䌄>g^܆(Y>n`7>d4f=˺qz.[b5X)4Y_i~=K2a;vx<í9 =+iȱRY ( kcV˨>-Ohy/\;m渘q,LXe-N iXmX -/Qn!]N;^-z*RmPD\6Q𯪦GH$sI߽Ty$S8ZZ֙ aQ+r I\ {j%UH,C ުw;0ƻFM̴Ohg-g?.8aq=n^JVsϖo. ch;3vU>!t+c.sL|6CvI6/@1!N ϲ˷K0;'727{OxiUB^Onm;P'=*'>?&ec&pHwAͻ2^,c9R(@#q,Er"yB|t[cG@ೱz`J*-%-:n, ɠ?)$ bq UTB\5 gcz&4)=Bʭ 4 4և-SN^V!t'CKq4s8X!o`KxwK6Wycc8-U2%J>bX~g*N8}t:yl\{cd\7ʱ4IX`1 RT\t}?sQJSfLv2# .~ <;AwS{v@ɸV._j:\{ 9L["p:"Щ jZ z6t(ஙV nh+@k^+*7F}+ Ȁey7ǹVue=y<ǻ3c0uf;;捂c]l$YZSȐm^/1RQ\ gKq~N^~>K랸Å2偆ӯ}x5:|=}L~ᗱ:k[Eh˶Hk>2r Tް9N㧋E~xX[Ih[|9Þ_-7{kkE55EQD9""uswLciV p)f5)݄0\<^OA< &:A@` YJ$$91=BB}&+9kx$ Xdq40=›d4&Rdy꥚$Mr[iX'HJJps˸$y 6+Rؘ;0Y@R# Z Խ Eo⾏Ge[ZVyx U"~Һl*DZ'3L+)KgHs˳ؤ9sRċ%RuyMlij0 Uˎfl,DITs_bT,IM '0T"PC=22eG^(l*xeUro5\[!Ub@Jj[ D_$yD'Q~(0^9Ͱ‹̴8SyQ*(9+W=| @@[rA`çw0'ԠfaHfYLa=5顫ٳ䆏oxU7,^>ȱΝ4|yjko֛\3}d1sIѯk)tnJϠoRHWbFb}J5Ԛ<+tVjNhN婅}ٟ򟩟qtN-D:6lz:^L)IħohZ8VY*1-ԘBr" hc,4 B/R߀п )G4\ 4Ǐ]wbEq N}Q}BulaEa}/Ý' {kJC&z1YƆ2u'_}WbZȒO% B2d՜E~,pmMwi@ k|ܔ_5`xɿņ$KU]Cfn&5Tadۀ2!b;9ɬ'lҀ?z2(q!1H`^mq&N(< ΥvF~nK).ARB.DPBꎹSwRe5nL Ӳ)JR; o*i^r՚*SN2f \|n؀3PXv-$S~)PR[[1>^I$ "b`7n<:dAkq-kVƣݓOi[_omR_fI4ڔՇ߸uWuZu<|ڙnrUW+BrM5 ?籴=Jеʎ)c˴-Ztj0ї@R51TԔ FF1CڷoTeo*)ҔrOX/v6AaC1D jHJ˓I6YJx^rK()+IRpR2$k M.L z ӝ3,fkFz7Y5Ei&ֺؔoAQgz SǠ#/|myN۶qd Yo?.c{5[MZ3k.VĦ^e4P"RxxR07 `^ja##pQJt7~H|T1 [d8ю$"ZlCEl)GGwʛ^=O~ٶh*e5GS!h*L'\󌋧Kb&T1 ,2oІlA!f򆆴|R7RE}vKy6G&v3=F?Z!îsy ) =2!b15w@QXm@WtRѡb %ϷTu?@I&̃π5pqoXuZb0i'3L2Н#|Gp螺z4 gQ3o\l毘wͯ-O0X.lW )uB!qp*z[WaQt°y9U5w0ߕLbSF_2hlVlUZܮS:m:Qkz>4=:ϞYl/-įnnKu}#K_׆ͯãJ;X4SqqeWa&.NC-C#aEC_Pi3M7_MtV_'QlǦ/_i{:crԔLނkd jRGd&_!k ]U dH/~2"nJC=q P,S#kI28^/9 ãmks:[#;dڜ SbyY0d&nέo(.^&6o9=fr5>Y6fšbUϙ5F[? k׬3!Kw*_ag[8zA^mb#a^ q8^j2;P|6JOϖq4\./H-}.^ktLEĂ!\#nFZi$^mw z$Ӣ,U/ŋhS]w c[#}EQI,@F;m;BO?sPCWRmmP7u5J1S \YE'E0! 53 Wb7 )b:Պ$^=\K7U$$;Pu [܇SMF-:Ѳ%U26w0.#Hąu]X-Uz/f u7-A_<ĈC7_|%#5gA:omjF+zkƛh]Рf\ )sI|-3{nR PR4~+q% >nnɇ{u6PRYe莂b]ãUUtNolt!i$$,A!@ ILB=Eq%0d2=:DfxGI[ 3u:U9w=ֽ{ia,Ɔp1Bf:ت#a?c_8ns_uAR(aJXaI63 a|ޤa:ţF_yEGu{U_aofdtԎ5+q<јOO쏎g˄/4nёv0QQq"5AǮ~˓3ѽ$@'%łjץxFөQ5IMC ^HQ`Ȏ*XGZTS#dE鏤IBFuF\wy enw4Ӆ~O8!uۅm≼tG+7~7e7|EȼGuqU!%|F66dҲ0O+Qjiz!+;X\Abe๑tSffzFzZjaSBXyS)g'Pdeu8:"6>+9ᄠbҝoR2!6w'N 7=Ə0liP" oq}Ā‘},4ܤLDR``zZi_D֑bz|Ƈ_Oך\( \`'"oI::$2dcVZ]Yc PA`#` BBVAAhxɁ4֒- M`Ifq4۩ǐ= }DN_Czzބ_{> ?F/ƮmJ.x\qߝR6(5hqa'9i`3L$lY=K < ߎ!P/йG?'x{Z}6 h|?Af<q }V&dg4΍&x@i|a= 2%J۝v3Iۇ~) =Q0q b`#0‘,NJ;_K40>)BRGh %l~ 2)9I+HB?Z~s.u}) XB(镌շ{ q ʐj<LF!idƲmƞ=w351~']g!6lėF??oćCFmk5F /pPc*Ae&[TZ%b05U TE~-gx04jU+\M;BT01`-F}C3*8I]DGMBkE +B薃N=qu[Lù (=>*Pj>V^x/r˯M0OO#~وnjgόx/׈7xȈz[;KJ /{*5a_, ,ƨ@-RՖbS1&#LKVOjP^,ĮIC-9VY&Jn-d']ge6S.$MOc~7P`%,:1P7[%j׭c%dZ++V 5+/(k<x8 P^-vɏEf\ObB;NpzZQQ(Q&Oa l~S \|$Dlh7y7pAzc"X0H $T>&hcRCw _G[ҸYSb@ |qK{e,B"B%р9# FYxYlѰ֒q}>XҷIUSDV0--%u}z탚U!bJ*>'W9@g~ ||>BrͩMc3' ><<-vŔDFEH밨% xĞ%7I04 P/:QϣO +8usyXF>Jꗀ~&ΰ*+nxNĤ{>`z ?%>JH'_vR>X0::vʪO`(afOxʗ Dϧ9{±yt E1U6Yvo%Ю jaa@ZVqpiIm<tz3u8Yo%dr*K!G%qc-0/ʅS>nPnP]/=WpnV8.@h?o% Ti Zh朸[q#1Q8&gв)*FXY4IJ;zyƲ&=w> mQc|8BQ77}yp1~Tbj tCX& c y6˶;͞^c/qdhe.p}t\.ݱ7")%Myf rΨXb: ghQ aa 6EԂ42iHJi|MfБB҈~0I @@ <ꊎKѹnk˥CnƼ.)^8ơw3Ab˞K@%[v4P-j=0  9r3W  %xo8 g7o|v>H<~#? FF:FP ;O,e-Q24MA=-CkѥȼU&͘|UAѢ%)ɝ|q|(P&ݯH@VeQ>]ɩ'aHnyif+1LxD%4%ϙln/:- ϚUD{"roR/6AT泘MaQsNC({? Pmoammh8ϕtQzx`Ecc^ - ?9hZ$g7c*C@Vnj?FAnm0=1dkxB"Vɡr99:Ϊ ¾␸tF/"6F g[}oQo0y'ɫ`8;O݈? MtmyČřT! *؜N%\>ƒˌ|n4 uEqLQEAvscf<2k⊎fvCd_%`Vjd/V^4ev[BNZdmRMVTD4} f &ICv Bdc 0?dYF bH{%$e 4bď=2;VN2ZG`Ǻ7K$ٱlx8vvnX4S1|ԨN1ں,`ۜZК ua .!X+T$F"6i;Ν/ƁOfS.\~rВmN.+*8vޮM/WYy卛޾F;]z믽#!՝vV!)0AEL' |;Dre181v<|2zr/)H/ z6 ,YH$mPJȈQ*SgLWg? 6q񄍲d9H%`|DԵĽQdOmG/2\fbPѼ]7f%U?ehgϫ?N+WsʋY׍5;feeNZ>"+I5R X<+7aؔr`[6KoKPMf3 Pjmjئ2gatf|\ժ-l#I-L`̌6X ip&juY:H%i\FBcWyC}t\鳭PT3ζ8P8IvU99Ҕ*QNDƺ'dt)XW~}w=;mA6.{Y| u l Kwz{y}%Z:Dw_J~:SAu x*IQ ](*1ZeQ6 3ׯğsyrq7O'D q(e#2a2y֧)P=PyP lfXb-FXf:B];`)1t.,gFޖDmUG Nt9IzvЖ 7D(tMX}2(Oz/W.oQйnVo|i6U?E@v\#?ݸunpmɍ~nr'uRomEw:q - >q &E4P\ T(Ygq uYjm2@ dvh5I@>A}E#JAiwfa^_xOx~4A'^;6q3?B\|cM4GϽe419JTe⿛nΐ>)B3q88N:!ߧpȱ:pEs:{QjTrEq%9qGq{t=;M:?Q}|*{ܧ 1VQP4 )'&@F%B :@8ePV\|3䈋awV.'71ubdB=}9wf8X ]dr0@l !ikr iBʌ;oUw^IuL2kܡڗMwcMiZ{̼5 kNɵ% S2fjo +ﲶ2a0f)ck gI88AC[|Pkdoj+Y_ߢga h!?v;` Q1 fه:'v:Iq4ŲV p&-cwpA )k%@zڨ)}>)@R`6 .Zgvoߟ+V>v/=l H>$h.47"干uv4T囡OQs; Z*"Ǜ‚I"VTe8F hlTܲ]hܜ94ମ9!i/b*:϶L=7>] Mj#%E͑QaY6n(uCY<ڪmx4QrX&)e:\X}ST=R]@nicǸ{lx|?}4O4j䂱)Qro?P~.C~$iV!I9*FPHJ!HԀ~iqwafT )^;gMUŝqzsDLrz5E,JI)c9+wqd=4^jjOv1MJD6%Ν;ώeg>I6fF#U N+v@/8B9 |#^/wO9ɐg )LHc'+afDeM8R#!`g]wkJ`u {@j~.PlzWǀz;?w% }sBpiEAt%kc3 [2,cJ. @u S@<БIP;F;L8̸A M3ea G%ђ#kBBBX>ҹ.N9yI<}Dq ]\;{zڧ{:=_DU%V#n 3!-mO5;'3~#??^n9ռl1΄_S4?v3/։/CF6$WG׃wKW|L3 pJY '%GX˭8S5~XԲ۟?_v#3.7faiYs;XYU5V}kYs7іaE i8P6Ea#wb>>pJaR #ziM{i"ȷuwwFʶRԞFHZm)^lKAc 1r1(M%Xj=fBX U 篈Q"-{ͿaR#6`FN'ވ.ARPZΡCTeI *Db )q֔ |7d zy\xxqM0Ah^$. pvY6.(ӔMJ܀a2{IM5x@MISej)[N8j[/{\e;T鏴l{>[CPe )c8A&!G#[ؒ ZG/ɒmَ9J$?"v8~%?b%~!˱ KǶYrڄJ CiK)}4ۯBE.) M)rHpo(;>^g?^_k8Gu6mӖan(› Gif |d;j;i{ƭad3DgYl˲0CZjQ 'J9m/lfHS"5~6~Kҡgn4|''"K_<|5l;GoCGs}5X_h/O< Ԃ'7-oN5 varh,wDyVlZs7~6 o&Ny5ZkM}u_M%Y\xM'ؠayqtX ԍ8Fg>Dha}5_Ws!N#O&~t2;}Lb"y^ *;.$!Wc=:º䞘,)4K#7dCܘՓE\mJ{=uv>x?b ps\Ex $` "6E,!/ȳ%o:m]M_ӻ=uxIg3MOl;r}_>)1ܲ6P g"|OMdoΑ<v-flC YE)jt4ȳ&p?ՙهCkjw=Kz#G{&w}͖Vy͎RX:|c->\WbPo'[̸Ɍ;9n"=. d#9m6<@xlmmY!.j[[o(-,o,_7[= n0,)߲ZIN05]/^gf6Nmbߩs竹NR2temŁb2?On°e R /+[MJD*5 uEpl45i ,<~u{X}[goz܆ag; O;<[ګW_y]/9 Rkal\ Ra2V؁55vq`D؀!tb3ƒtG0cG'D^r={X6 lE~ R<&V?XC\giUDk6N~VyEgL/EHڶo)۠7٠ zW?#C fI=uXΥJkfkl.1l^WЏM>]lD)S$ĻlhىJ< 1[/¼: j#n)>Cue9-&rnڊm53}zjs盵HC\.OgT.Oڬ^f]g ah6d#="/gnQ yz b[-gΘ`U|3H~ls:yQ\d`"^\dԭLyBbg7 ڕ8(^1Z R8e5ߤ뛍ֵ*>v= +#eñ\fih5H8`ޟ(?h幒=|: L&ns(Ԉh +l& }A99ye<@Lz|x(BtO.7wѷ̬skHʽ|~-.sOs<փʪܓ' VU/\@pPj/,x 19!,;>ۜj8j!Hgc'e8KDGi,7W~3w{yp\TM͞CY҇UL9QOefg %Ʒ!UնeyOmo?[Xch"At+&͞_4!/+7?$,2+p=HނN*JބaGƴ^ Y)\lYev1% XV|2%Jhy=kن=P&|`dbMYy](Sȏ-~+㒥uPz=+JiNt9J_4K."VIz}-_oU%&VX;۬J;Bkj3q}6 @]s7l K_+ +NgqĪT*\%pVk%HeV:}M"ūʟQ'{61/!z,6,,貒}^Ѱ`R/TmW.ͪ]R{5M`U˲\kV&VdmX:9WU=ꗮU+no{so{6n r`iYiM}vs;xƆΚOr#)GI~V ~ vo&ȯI'e|le[y"ϥ<%U7}HfF7W\wq9՘˪7E6 Ǵ;7dOfȴ'\kgr_+gWZ%G|Eo~byD6Z m+gJ}OTg_VVC:Pݮ5545mkbW}=mqǒΎk6];t6}CzJ=}ߧ+F|t#޾iۉmN+#ͤ=982tJ<-ɤtC&etz\Imt[}`l}\q RT"٥UR^m<>݉&N> xyٝuͮ`g7֩M) OOwO߹Gђhkx -OHgi6 l537s̱/|}扙μ< Ki_;6m&eR&eR&N&BqDܢ-foP,vDZf{C ͧQ% Ph hQ yGuJІl^u4MؐwBc2߯i/+4|Zқ)iΫASuhI ֡.?ov9Kog hFY~ZFa-%*LʴLiud eZP5hr\e eZP fyFg/P&F)m9jtci2]_2z)KYVgYmcef ~w)h{JobQPZɻ2'ʒz _LiX*1)YܹR]݊ #ʙz߃Potg:tCK\*ףlUJ|jg0i߃ 9 J=lL!^ն-h%[iCQt?RعUŝm1v#|_r` ;lEK-L{aj3RͼW>riQۦ˒jCƈ%Y>XR\( *P\X[S[/z&%/ %#G@8T%;01n)*Ef$h0HciVBڦ;`x"}m#R5ub ¾]9<{(3t>ሸ10 AQꄡS1G|z#z$iNag:}1H}:id$h&,tq?uPpNTʶK>LZψQ3-t@x0*KL6Wx6 {P:a 4_j:Rpz10|BsJuj`L s@k< (P;1od R4Bd,6\]-fӒ? G&]5ܡ8~%E F\~^nTKkDG: #10]&NK:؂l5. Hi?:dAN}/ϓoww.a.Eut/IG;@s /p#>0c@9{瀾;;>EXUZ8UFU ԝЯWtzhzGգ@oS_qu,{7">>M@csd0!l1!Pl wdC?"O l,2Z1.7!Xn9Vی?Yk@:9k| r6rΙ8MGIeR!bRB>> lg3˹ᜃ9`Ӝ;r ?Μcܕ$ 9AV'>Xw-XS;WjAWv39Q| ~rk}@{C@ Q ۊSkf:CI)@b[BC!H(Ӝ endstream endobj 662 0 obj [ 0[ 750] 3[ 278 278 355 556] 8[ 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278] 66[ 556] 68[ 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334] 138[ 737 737] 158[ 365] 177[ 556] 179[ 333 333 222 222] 507[ 668] ] endobj 663 0 obj [ 278 278 355 556 0 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 0 334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737 0 0 0 0 737 0 0 0 0 0 0 0 0 0 0 0 365] endobj 664 0 obj <> stream x}n0E|"e"!@E*{H YghR,uweT71 l#:兜NL _|+qRe8vr8ƒ S',kYoAM,Ihs_u%~7k59b aԍӨxY`GβJ짤:1 QGwH#O 8 mt sM-uĿU]ɐM@N-h,nF/9MR \O(oBױM1SAWUDAX :k{7n1îӃv*j endstream endobj 665 0 obj <> stream x| xU{M2@rCHdHH|C QPHD%WL &`2FHؖ-TŁOmE2|gps!<x{{^rQ>4*3>9ͼK3Z0’]G^d-9m<[zKfܻۈ2/CfR>k|8b@h$q N37n gδ3\(E%+[Hﹷx^Z,$ǐ_|[Lu3^'G dyfWsK1}^ 7wu5Y}5%tw֓:0=ӾWiDz5ԍt7]xqc_sHCTJnD )rrĪAr˹DYT#MWZJ3CSOf -l8;=o;߯i qTya&:-kJmt)_bUߢm.2sAPW> I@x;GГtq,g.Eܓz(k{7;hie\ p?5Mc%# -_2&\"Q_- #u|h%_ʁIhO_ +n@!QG &hO&QoԣN_t}|L\3ਟlXsiS׹0P9B.u\/) hǨQ; PKT`\rhO%ZgNJ|MzpwQ %HYgxuF`%N@GX0G+az q[?42X[0NQJV'Nyͣ<^ 7(iXa\}c.IsguM |yRLUn{(M}J2-SGCOد%RgT2g0b ei௡"Tp`-|ν49 v]GB NXG:Q( >?Ym[d^Z//Z/zzriN@rvx -q3ْHı4m mM 8<Gw h5 o1w"9es;\6ԟ$bNOl'o^"M.`B] uQN <|~ggzRHmJ=_G?@>_I>;+@RDWRwC!]1w.Gyΰ)s d?!|?Jn@`6Ga # sX u,Z}!z2lrZ=;C)=O-z6uapZ6PNP,Cq"_q5+Ez?uk[6s6ER18nziF ;o?-z *&tV}h%ѕD^%<˻w@8fb5T w >Z-ve#,+d~?]si wl_]aKA{@.!3 3r2 >?K,NasB=MS?{ ^*6ߛ 86E qy6!hزfQRaoC) ʶ3ۯl; yrܪ$R1V#{{B~۲!X,oa Ŝ;`- 4{nfmbMO/c$f.,ёX4vky#k:uFJe^. 7eXøA%?_{=f#`X`星Ֆ!p׏7:Sg#]f(@s1o˔Mc5_gqD͠G7#"mD~Sl m&d@_\d` [CZ+/s/wقQb.P4kw '1/YW+zH3Y-јcOAhOgiWev;u |}07k6㬻!y~C wGg\gԯ[Egbv6G>ͅ좍eB\imyFlK\/ Le nG332 h|> l&q2Slę%m8 ѤqhWUe1Ľ&mQm:J jnh|&mu^FcDln'n烓촮m<}}fP@zo؇e.ʷp#m-Z^>ьd} ̇Vl@ys, [;'y!6:G0 <$}Hܫ t:_ Ja͇3!e{s+4!lVz<E"(ZKĚ̘ |GfZa|x2^V4̦P8g$qyFo3vwx+ug݀ۅ̐%hn@aUJwN'z;}kZcػԞ^~I?6]?v}()ʹQ{ym&ג΃&~+hvT}#ːak_73=4OԖ. %!tkn_tg:(I9`̘d{pwFM-H&x Rh1>߳mGRyEͳ~&[kl+gi܎̦ ߽w9MP݉͞zS6<.|scCsEZ)oΛs$oz=颉s Wxcp?ϱĘ\1r/~ || T5~pf'˰ky^ owPף(Q\D9=ϰnG]P?e˗ AN] Lv)p3~mQU] e \y^9Q l<&ҥ*gPFIw:.k.8;ͰiPFzP]D4s E=6w0rLVs |y`ߓK|;WSޖ:#({4=pus_.{b~KνpG{sē|s,N9bomN+O~cͶsZi<[$ByՒu3.4L=gx)icݒ ۘԶ G; h;,mxwkz[k?N%FSo9_s}v|mhG6Wf@M."ϔc~3(a Ӿy8s9vv|9ę(ڴs!4V̵SYJާ9(X@y ) gĹ tAVգEDZwF\s6_:{;KoF. m&R?H%xNP,2=*eP SG,rzzC˴h= ,7l'mPCyE6?$mQWhz~oQQ4$ؼd6nrwlZ4,qnvAɨSP+y 8Y7:smi$jd"M<49]~jy`Ɣm-x~E!+,;tnZ5!vxF_~ R -Q&Ycfcf) _~ac~1g,D Z&|x^nyОˀNh {b"dz__~З }uIzDIguhz(l˦bjaf-)#$sTA;%il006lřA6֥1[71MuỦ;̷̷!MG}ؗR8vԻu`MD\ƺ84PΛ}w¦oY(L|ק(wbp&jAXqFHވ??C8ovÿBhnӾ2wjhgī(\}<\ #KI ~SMԟ^q8K3([]COo A75hC4S&"/%NGiE¸~ȣh= |r~5:X_ uR+8´E,i C}w(k`"⬤XkJ W 8XuT f5l8)Oh p77:0GvVir:S8Zm 'if>gh{Wv-ms/=1GJYV')w&]%03]A3zv;~7vn+K`?̧'PDټc$fRKW5&kͻ?+_}Q^O'3SYرM+/u3.ξS 9OS)෇<7Me! y%0_#XT5p6k"$ݲU6.<K!,7nܥkDꞜ#g}?`6ȸu2ocƎ;!/w6Z5B%h<18nﰜl! п_޽zHIحkη$w뉉>*2"]6a[th,8eNMU8".K(i q#G&?~>2y D2OÔ^k֧t=hPRgDwdxgcGg/c̲ÑݞfqI'+h7!J(j|qG"↳>5~Da/klވQI>G> &P(Ƨ Qg׆={kVuԂn͋ '|.e7;nWȼUz2(lD,{ʖy|5ccc3?yW((@+Ј=(My$?xEz&\+~q#8n/(nX̲ 5e>@lUdwYK#WBPw#f9 ؊9vbgDYl>+_}tZQt)QRNO̞>-uE>J) `(^Ǵ;s rMJЭ`隗WKP2'7TV(+(+kN)+ϗ(;t<ʗ"eUh؞8{'sc*^W8a{:!.ofgU8ae:UK%*i{$\vU0UP(ȋ|^͊ک5R+ugڅ7'M#xHW1ҚN) P_P[]w)MkJ^uW"ջUUm3kS'I-=B;r8xgwx=Z4U.+KI[2Pt~< h' 0UݮnʈA!д09&BPo2DTV5\Q ŧ(^4O&µq[IQTcizPԍpP r__m:u7ͭNs-jS@A$ϬJ!0:8$ՍJ|: pm9U|V,"r}0c%Ѡ@EBuH>TmC]-W#)J$_b3sT8] IB0bTjTx^˫|˫mR_VQ CRj 5ɮjZ\F5,1сVOdt_2JkPS[ƶ h-3:}L 3EC,R"$&-HX8:qQxEuBTJKP;S !epSe2UcWCcH.u!UOjզ O8:uNݧFh4A!,YxU"Yxuԡ/ssWW.QPЏ/tU1{ }SU\Y嵪n/UԴxwʫ(v}UeẒ7@Yk KdW~;*EUL^ҙPE/+9򂲓"twUB$BW't =sʼ1҂gy HTI3V֪IEAO>B{Ԕm'ޓIs+cyZUٗ< cUZ__ԉP)>+%Et]*@AKRX&*?!B&%(G 8JG 8JQQ"J0G8 QQp@p(YG8G8,,pd /8+8  HG 8R"8Rpp#Epxpxpxnpnp[pEGG-8jQ+8jQ Zehr,GrTQQr,GrTV}h jx(5o5`^8|'8|G%8*Q)8*Q Jp/ienu 383"2 Hh!jM^Ҵ˖Yy/sh[inmM]DIj[mm K[Lk"3u=>?9{99yxn#!+p , 6Ri{.ރnҠKPAA?.@>Jl.05PBf(r 5q:dm?-oY΁dikɮ%{\{Q6X@w Rm-0hKv)--x"1>Z $hvmo PKv΅@\f=5 1Rfo8-RZF|᱈ P8qÚ{w7qƀjÓ4wp3иRvfNd=}ᬽM<#d0ŷZo`pojtuh\o;DYdj3X˧}\hXߒPabA ܬ6%mءJgB.eJ~R,;elͲ*˲(3HNnwi!,9ql'6u ]hU7泵mXlNȬ*T5yXM_\jOۅ#p<҄6K&0c}#kaqpjZ_aFںͅ Q_ռo'6bUX9ۨu6uVh9frf`O*x3XD <@;ՂFj11m4tfAUV.o06&}F qё5$I&XƗhsMr fUpƥo}ifA93]K6f4鳚3gU6/ͬ/~Y 1jBݮ7Y-C!2WַF6cՕBge:>Vn>V9"Xn_KF#oHVbR.Kې)Tlάh@.@-+ߌ^:<֎ݲeGf$ZU5_[\ǡҬM5_m7uK%-_|-Wcc|^5#T՜[[Ex58A!](ZKQNTs Y/ijT"ս[o w-[(ZIp lmI0nP}h>6 _euK >X荗k{ȸh<$qv񵠑w VZhGFيYr-T[KjA/qV|s؃!ۉb H' MDc16!~*0=߇WƷumt8'x4ODh 2Anwv#x<<G{`d+CFe>~?_o0KߵI%z'rZI#G|Gڟ YLQ9 cCX 2UBM!.ę\RZ-)9z ؕIK@Ϡa 8B ^w)p5߀gx ~?ï `DCԒdYM֐nxwG4:NS0t)] }nG1z=jkdK&fsaC@(\|Vq$JCZC[y.Nǹ>$~d;Ifp\Ȁ3:ԂV|"Tu[ $fwbZ&㷷P ;bo+_4a[»$v5ZO&edy"| b8 G;pߋK2!qZş# +x,>4¥ fa}jC`E_BߣXFM+>ĭ^l, /#tQ`IO귰gؿ%aehth @!8g7`K Aǣh&ޣUwx>@#2GxC񃠇W}8 > va8= Ь nB/XA( B#;^7JӠχ@7΀:10`|}" ­pe&X\o|Ҡ `:AqA`*${t= # E1[,{Q)XJ'lG?~jET&h>.>B&^iJ\`1kP~p S֌bp̊{&[(Uy>v  Ib7(SJL#NAD N7rgbeeձ2cEGTO;.j | |tw;)B&RTA6'a*5iʷ9px[ $r83؞4dgzmSMVw}eq~I,H!^з=u3d$p$[MfV*)yBSf΍VC=34 -r9S%BGV^~VT_O¿}ޫ_S7peM3F#flVYu ԅOqjɊDrBK 5X}fE)#\Ɂ1^)aH%p.s)(t<?IV)e%4U'+C/|V9;[c5B^^C $\fcdnc'O2Ӫ[viպO"OrԻ꽓|s\s}r))*C-cXq2ڲUy#i9N&~|hq~7qsg9]aۈM3$dt@i# P/\̸0Kbf䰗 M/Jr`u~pMQO֧n?w~5|rX0 MҔA+k[ Xh#7f2:?IT53>9GL1{½mIE%1l{gW८ hӞN:c{ ى2! 3Vg(CJN gٖL85=5BmV63盉yKt\6`:틈ߥ5V \',b, n>m(GE(V@G)fj/eT@~ȿܡ4OIK<'ZϑQum!BP2]Æ `#0 nhq8 `:.Lb+f͑S,}UE٫\X/<\?Yޝ~/_uFy X%Ȃ>J~KbCZmbŲXeeeem̢ETEBf҆_Ѽ%S0!,B$a9 'p$aދP-WӆKYFX5xpՀA[h V@ᦀ-lD<|f% zS\E)dil޽}'>Kxq S [vmlKc=,X7:?*NG3tt8HZVSM1xjc[,L,>nI2%d-&ZI=bS;ojc%lVfwIGSS>khN"|( /~lRo7 8jm7P Bymp$Dk.ƀ*Ȳ!e+RvUZT J6` vV-k]Ӻד8fߋ#|W;׭_C~G^x=H<2!mFyѳU*޺=iuPRH%Eꨴ/q!M#8ÒiOrqmY| pD)GB6\Ӻc̅aY4cMR܉1c7 o7a z >%Mx, M@ C@gqe̦Q'~sGsسK7gk~7{??\XĒݷ Pz=/}?b.mVM^l:FdnzI @6A%3H)b1Q}`&fT5_MӬb@dB1{ KsA"p:K-:zfbOz븀,pwiitaLUvRB a<*; 4ғC,:P LE[507jvQ*L4ou t%U"a% ZS`CLOGʼZˀ` `( YL f\L=Vܪ /la,ܬm+C*rNΉsGEJKE%J rfTQ=]'tSJNJ^UЯ4 LwÐI]GRSSJJbTW%8,jPY6> rA3s|0T"D̷[,z0GE/* H@L`ɂ ʪ͛V"DkVQ"cT/ɇtq0 PA QtMK"6wlOx !Hy{CF79eek|3/v+aF!(MU q$uqȆ Px@a屽wo4ݷq*_5Ǻ |&PYX~2R1gP Ԥ)$%%93I'gaDҲE"VdDyZiyskʓyy$/ HRyuK\ m8,c](͏6!MJ|yKFi i,ߕģzht]0A.`L\.#J%CfRG$\ʎ5z O˹\_ucgSV]=MSg>lL˂rU!__*n6=~R2 /Hw6yk3zR!Use`@WШ/R:,A6 w[&!kk_gG q"wU/mxdfuUSmƆmZ; Qf9X[S$l|R;ziKk/{qv)}jwS~ y0(,Io@~EBweBo>n'iS|G[~^ >CL+u*uerSKSǸ]s\Biд5i &Lrf'{'w LYiI(p vb(" /Cϲsm3 A8nE}VM\rs/ĎS2fjY#޳馪\{b9r4yfjB+e^ @ GP(˂4JULH*Jƨo)h2ŏyz:#c;Z O`Z ?S+*E2@_yE.~Ab~Z$|7|oW E{QȒr|XTfz2JLA#b X(74ʜ_o#dfiۋbr; 7zX~B}j}1ULs:r9oN?yi L6fK {{m~n颟kwv'W8gUMNږĵ-5F TD|~?)/O{TlS}jߒ ,3㓷4"}|==Be3C 0BRVg}:bwFҨy:?EO|;~聑$X䵯NSǞx{~_/ <50ADQs'b,$ˀNAGPAfofs--C r/f!bw\؀kph2knx 7%H\~o9蝱B{0)??8!nEwzZOGkfAHrj 0^X.t O&l4( =jF]vp{'u 16Pp~~4 d-~T"v:UU2pVȪȊ 1>-$ɒ$RĨĨAJ*5,2dIfmdf0F9%P˒d&nQ9w_nx"(8l/ߤ.K-{uyEΆ0hd zĚYV)vVx+Zr]XYz?D7)UvU_GE^VP2bjxZ?) ,.79#V'A - ׮ŚA?|pÏHu W`c[WQ; ЕwQ# ^П^&No`. cv [3hP()WUÆ4Bz\J K9BTI$I1&s,VuY^P{vr^umf;Ǥ}WOSjY,VW*!u=Lȭl2G]HbR%bJz|RJn5&W2\X%#*B,UG| (U̒T(Zͅ/˖W,,YfMKOkv~`)LH*9v#e=dõ0ɊR"&U- tC͌3(">+aK+Ev20S ÐZ;!,JLe L~a, PЍ8{/$!{WvH챆XCmT.ػy eInЗ$x.QeXRu<`KޣB獵Ώf+/,0$XL5BECSeE\T˅BI$S* /e|ƌϘG5fofsMMa" _/+}:o +?OI.83,&O$] tS8jd*dF{MrS1+ya*h!(MIn&=""S?͗t\#nNM$8L"#I:0LFM ֣ *HTiɖ"iѤ$II&iR5%V!GS1eji7.AH6;~Rc<$DF6&n6O2KV&݋ENicqطGQ9s>;{e$IH B AbK,6U@TVhx`%AT[/iRZi(bM&{f6/aw9yy,dYݽٻɷ))! nIO#r5F2jD[ˣѮ(⨞bTZs~WOڗρ U YCFэM4uK\&=n5}Z4o߾;3޼a>l.+shhht(> J}Av2p8vh)zu2x(Z՝zoRs"cϳ 0NyL0t-ODG>u׾G~oҕS{7|#/ؼTy/y1@ln`vxwwUycɻ9"Q$FPuF儥`bë W667v([]O ]5v]Y pMg|!D:]ǩ^<@jVb9i 1ےJҸio9rGm[KQZ*E.9"Reiz_ ctF4nlb@ɴnQbUdlގ|Ђ.7'C55oAh*jDkKõ1j̹Q&ףRm1;̇~v Ƥ}z` 7!jiE 3g[kS *תؕFtdWtoG]>(&O˓(Ldw='.D*gkuY|sz,]8; '.y{OnNK?o]smc+^Vw5xI_'Tt.>YiWIӆ>!4.sF2|bnq*cI5'sKK6x{+TaQP8;;1;ϓ#ё%qK?&\'Z6$7i Ik͉= yOɐ !5F(]D˂8x/f"T e)aj8efԊA]h:DR @6$SQf}:֛.{C#{9 cq9+fOgVOGtKݮȜd j'`<"ы2ퟻ= hn7={pkVNzSá5V҇2o<^NT8N&%O&dZf`x֟dW}ހXEQP,{{/֍xyQ@0YsԊо7nky<>,w٩ W?嶿Jvu6[Rv;~p~ČhgW TrrSGxb@ LQ$F2/P%C7Shq'a:K7G:r!tLٳ_-C,/ob0 :8i8Y.[m=!|gxESU`#JL{]G#vy3cHWhDpX2t4Ć#Go9z.LdYTl0*gzo7 #^dlf4Ͼ5wykPUxι?9z4_宵hQ:#q mh+~lvSW洊+b|2aYcڴڪ jC2jpa|ݛMM[!h$ㄐ^:=t a0V*B!Ⴊ--`9Mm{\9-B,i+D]@;6R{FF4d3l)U T 8͝=вݡj@' VEBpPzfrh 0ʘIL>~)}%rr˯3os<~|,IOsO?Q'=5"" B;NAU?DFG&<_yW w>g 2H VZ3@+E.;T c|e 7F"K D+QT5OCX,'+$ py##UX {Q!#t8UcQHph`K888  EU?ַRZ[`@ 囍r,rؑgAML-6E"" #*7w*t_ 08^9V~jDdLS~ەvM!=<c0 (%|vIʢ 1R!7zr|/-wd';WD++ aE Hz ;^Qb wq86D` Ce&Z,&p7)(҉љL?<=c?c*e:D ¥!ɕalZqY1+BB1t9vϛ >b tMRA؋/i-gJQp@8rF^Z,Wb@i"0zX,p3ы_ƈ81!tHt|h;v1)ogNزe|B0GnHeq\p6ͅ'(.C?pOC=b%hEg;T ",GX:SDp xt@.~k&c,r`yÇRG9̖p^2 %yn\BVDRR8Pd69YtLJxf84ƒfU3Vcb~>XւzIZtUh ߌAh߉Df.xZWLE6nV5yAb]cB=;pE9O |T@qŃK:@K~udPzP sL\P'LURRmc^w e;S>%L:BX,Ȕ%?rIcCSm% BE^ Qy^?͗rx~?«/fqxhȌR8eŸRU:ًEhtb jOҼQએp6ދo<@UGP׬^Zca^ptJ,J\[EUUV ʢl+X4WG4+(,BU+`:[lӰNX & 4[\*c|wEuAChvn5Ÿ%:t&vPpL~Q\3Ʀf|TdI[oFJ]`<ؑ;eMsѕc?/Y0*]Cf]O/ ݛ$V0 [1t݄cR5ŋa75<`eY YcR[|y~0WW OuRҤ5y.< <$ɪ&09K£(NFBTa6?SL']z{;f}2S u)FreCi6[k1-Vu\:yĞ4mD[_2+3٩[n[d̓W)+rpOf-GlVB1{3:5աmxJwggg|gy8844c0xw&ȮV:7rCOòHaOoQ+¬Ϲhad3Ka 1>{ ^EqBO, &WϜЂdˉ֎u:3˪p<NiFFq|{Vu57s>3/}:f{:e?{ #A*C\vs1ҝsrm[v0gx_64mPBI2ZPB9t2-vb(\;cH;ie.Vv]nw·|Uc8TU[x|VtW4|զKٸJwXX~ءGvC'B`+^a4*I;yy7,^4OYOhWcYKM+p >:}/> PwՁA7 ?C,r[h$63nVk8vQ|^vӽDqp+G>ۈ* .+]H qМY7|CaOj{F>h:.8H}Da &wUӶ{yk^p/;I:q-; %Pxe9K"H^e1\x H-q[|cg$(8_noG#7?h^u4jb#l!cjYsM]7>~ x3rc r"y1}~.% $:HRB'BGC~䧧:),UՋfK "v"bhO {1]~LVv[J ԝn7Ӵt]ݴ껩I_T[]$ռa_赳>8N־9Z4^nU[>z9P'JTXM“+9od~|g]g= ZBiՈ&T0:Rji?? pZ;\(ݖ YbB|+/)riGW|B0ė)p:) F2SUw*yy'|g83֗>&2n;:,l,)k˴W48`8W p::p2@s2x5(FKPS=j^e'.^uݛ.1=WN^[A /nɇO0~62NTjDꗠK\@_!I\1^Z{.b䤃eI>"DɈgJh@zOg v "7Yn S> XKٙEcXSSP}`Y+)zzӑv͊'c/j< So2x/gau Nm[,c$7q,NitTzSB⊤Vi8wN*iLs@d,@̴l1^%!1߯y ,adDzI}>fEh.eՃ5YYkүey0! A\>"df 36~ $a(7!/ 4q9Ջ,l>3̚9(s5s侰D."fxրO۬)E-Z0vi4)QH~5fl0lj(#u.{#<,;^`*ʚ>*z8^8Q6e!nE".W:RPJ`zN=v []hR/n4H*ZזTRi&mXi5mLG<ٴ1lEGi֙.JwY&KW$*s0l_Yw=3@l/]+f+24,'(`ZsK^;ml|[7=Z k;=a(da؉KG'I'Λ7wѷrVƝ G4hpV̙mOP\*^`ks W*F)?c6`t/pmRt|5M=Tt 7=5R1rpi #9dک7fQpweǬ"\q"ڵߧ~2;mƔOIKϗ>*pNvq+} Nj/Mf~Ⱥ,+TtD 87Ml>v 0{{ P'7+N\.cpP|_ށb[ooa+N܅;W'~]xN;dW~53ŃYVd# Tm!UDw~.~Eѝa>*s8)]vFL~8hBU>jLRrw"k6lS쿻[7|{&k?y}=O?ܳQU_ }w1Qa]Z[W0 7h i"}lɗk=@.]4rY^ڢ#=\dä3t?ӑv]nCmQ-c3QrP;?yΦHGc^??辽;}#ð5?an@s6&p/p,u,wYERq:Kj/^i pr)#R\"Rx{/rsu&nIXƝV\}Nl[gZB3l vm LӾc^tGĘq9km 6$]I5.|ф*Hju 5)oJX:d]|RL\vvmbZɳڙ_k*{}01i7$ImtonHV,դ.i,gc(Nj8V ̹xPKD")'UWyWWvS&''N%pW'qOfFAQȏ>S%ƛK#͖GX=;#PT1(WqU8M ގT9ʬC>}[F~&iGxc|.A3HFL.h*. /"4*an;%m?Z:"k9v xOQ} [F\v/o'xB 3yVTYzyNVZ&/1Dt*]liCPB@*Da ߾j>s?~RKע*c)܂_7*2+-?t w9KB_A۴ ?){e1ȫ\9 ~p{(^d%A n'   >DF㣿 sPB`'/4Ȧyzn^/}{1^K7o(kN5?1e:Je A?mq~rnZc}Wąo> ӂW`͵t-(LR͹f "W;t} C2sH .#pkk+J|u&:gd+KǛ ~ 'ى'I9$S"3̿;JQA9HuOMGꧬ(G򩭸 _4F e"RRUKTjZ~ ;nrdBHL&~+d&RFJrZpKd<"LV2JnJ^nd6&iQ}yý#'~|NNp'WW wV8#}%QGAʫ|U;гa]/Y@MQÌa1/o  GS8QBIx|=`XC!}(l *TlBNaXБaޯZ-tlF;gY+Jg Od =;>{1,CGqE9srz95O?,c OPaZmqgۅ>zG8q&AaƉSP$)ƢB#&lWgr9K˓Le"N璜| ^^a< k,I)HH$ ur.!q*2U>ՕED9hDK,6{7,:ȿ|JA>wU͞(Ynj,z}N?f MiDcXa?Dj$i4{3::VPqĊ*d+u^Ahqؔwe0.吇v=:_sfz5loxh1]4 7*LWk4Eh!T >e`(R [gazFQ06x[E!Fk `-*Bm"apiz<n3`N=\;XQ3vy~c (m(cEIsIk=3tIW`A9p_%\hO9ݯp2DʸF,OVun#9<"PkʩZI(OW&{'%%\UΌ'WeͭrZRe0RTU]]3|DSj k!꫆#%WK+JmClul[@Qg6iD >wG|{ya16آs^_` r"[7?}+u8[v(p4$ lgYo:W_nz馗_u}E?OzGRm˖is_4)<⺦P˵#/[_+^x~;p஻qɝ%ӯ4$çr SN:㴓[^M҉֤VeͱX_FitF V$ZivC82.i纗ϚPI4yy3_v/k\HJ|C(vFd>sKPo 'Kyr,:5l}J9D,2> [QFO_cy5QG8r0\ad:v/mڷƷJ(}/WƦ#qCh\\Φ x0v\Wp'I;%]DUn.]]t-@'Yp! zt*S8Fr 6K#5!pNb;ܫț3M|Rei" h5Ndza.}n).tfVζu(gƊX70g|V&ʆ 8{i3ﲻEOۗB%Gx'{x9i󢳘Q)'MW\ ֜q:9@DG.m%BFCCw~HQk.8z9Dw@9yM6gYٸj4d6ِK~YO$⳦wCe%_zd"R~mʯSͦuo[ǽM&7ү/D,@1:&biߙ\z6P4 4MEH1f‘f"{!@чm/l<ʴvS4$>"Id% _b rVVgZ{V4%(v/K[K: >%Tmx+<97SiƑB )tAUt eD;cEĻiMwHw$ANQ"S*ܴ[n_!I>xZTh{f#N%yfh :cPk g&l:L'qsn. `pY OBh:5u&zZ*zPh@+ 9Bhl_JN?78,`+On#7L3`U0$EEgXSxٮ/=b%K7ȼ !s6m4g1-WL_T9mK&C%wnY Sms6|af3FhQUp& 44&ܗ^%tuPdVK=ͺr|ԃm+vU]5l۲h_݊_xF8ZU0=ֶGejw5I4"j>bJ(Ñ>r⢎}Sn\5wTmԬQU땒\!_k0BxxH{J4PO/ >_~4hj&XLRJ?Hç,q O_*K 75@ ci+VkEZXŔL7Hn; m)?ßJX?Lf3tԗ_r/#%xI7ޡƗV*Ok4ekv 45DѫE*΅rvw[kh$@ɉw 4(Cn9[}%`t$%rpD*sDz HޒYKNf‰rKfs2]H#qnvM9%98W\\6L&m(NU"e\NNqqYXa3fѦTK6+6)L]z;Q 2~J{1?WkC701i(*EZzX{~|8ٿ+$Ƥ@A/QoyvtNqIV'h9z:о : -0m4 6N,Ks.hNFt+t~3g޽iѩ Łit}fǸNs{͙?/3%P:ys[玶`I崵]RViwil{ MilAت9Zqܷ9{\85WkI#&=)_&pT%?sqp˔"JSjZSq뽊2`5tYV3~k!Y״h͟0kQ25or-&#k~O.K o(u*o$;Gq< ZoЬh&ZJ5J7 $sDXsE]UzThPQYYA{24 8 *>@ wf̍Utݓ['<X1zly?U8eήZc^Eo,slZP]Ϩm\<*0ѰJmX'"YG42ρ*-= ! 8]#!_TdfhWaâL*HW'Nj`=N8)q cm %, ,?WQOR"ğ^-4Kwj3LcqAfԉO>wIOԓOYVbeGZ$TҀi得s xXrukyUZ9x~o]uř;f7zLboAHbA,4iaL*Fݽ o|lv6ȧ)w"$爏C4f9!\,0k |=_;ң*^ ]kxAZ.x0:8(Ooۃ7h1F:ΧtVs c#T;?M vE(jiO <)%Ytf}(o ,Ue?,Hi `򸑟2U\'s\l c4df#us G*tkAjyPmGnA4T"^.:qH*DQL[oËl8aa#6l#X^g̢ 8A1+X _`007љzR(6/\Jk>GOhZUDI\we TG*_j|Z:IǪZ r2=zG;=-U]>N{o"T f'xM<831SSԦ)n)&Q~Rcma(Sl,͊JjJ[ƴwʖ"էoV&}[L|˛;wuKULX^_l|yIwOl{uhҤCo^۱=n5cҒi;cK8jGhDڣ=>Y8rl9H=nڵ*6. 4l|^T %&.onb`xX>R٭SLґjTBnٜF9^~\CUH9 p7pCٍ8n>_6.5'V W 5?u 8-{('e2RVg0 ҧ>6 YWjXØdv[%/[o]۪}:;2]q ++ Tέ[u{5\PRO>T٪UWw ǍaEd+\^oK[vZ`k8d P"w9ĘRPPiwZA7Ynm ){Ж%Y iA-*jEÄwpO^cت'I|\ہQrKa[.SauIDNޱpW:j@ZrǫKkDBm!h?hoztW +m[ٴ%CV-sBԤʱ 7rCGt̖6K/͙:2n7fӦWy̋U4dJ+bZX~FSͽr-ҏs{ϝp9<HYbMlA9C|qbK1)VS(_gQF_ֿP6* l@UY9:}[V1<9fuÕL:=[ϴ׎8sgIW wYZ+KFNVg-/VcZ]j[4XcE 1HcՖ#`멐?с@ח-]hӼ3s疨Ǭ0 d1X/4R:/5WV#0|%H~(MAn#qi\Gβ[r%C2J[0!· Q^{9~9pŌq~FǻN?oH;9MIKUw;)R6l3fqEŸ]{+5-qmL&lH^H_8iᢃɤmYdbɀjeh3d~c01e z-뵢hT& /=E4A5gWsfY ;A:(NQ Y5N֗w3'rZl=u|ĭt-i$>#It Oȼy/Q:@m@/H#D+#/v~tBwgwL8Pv97c5&xwɍR/\ P* _`Vtp ׂ^ Y }juLH4>:u!Nl>ъDfpL?tqͦ&RmNRs3ν~O@kB~Z 夵*LOqX pj| Zt[5yt "Z곇7Ѥ!;Q{ d0gMUv7sMjNQe AjixcvO㑬  ,S(7x:,w_fqG8 ?x߀sߥ=-roB֑bO(]vEy&39B!)Ec3M#4#ZaOS !ϫYHW;yr'g+w*$W!Cyd|'Ts;i: TRT+yNV"_X*Kf\mD5A^SҀ"2i"Jk;%xN,[otB8[|9`u\f+m^] 4Ƅ)nz5rec/v49[-09ߵ{;58@ousṢECZKrUPj/ҷB;AAtݬe?S97*8}_=R(~ԋ>[/#(|RMAK"VY68~σ҈.68_.cGw\+ -p4.BÙVo6qu~(X3Võ>wCPGK,M]4^_&ʇeSz3^εqVVʊ2 )4iڒ4,"d;J6w5n .å)C/B<0 סޠmzV?v<%3:/90C\(ؾt0[giԀ.:` xac>= ^a(kIH|EZ|¯݋``.PJQ6Q謑l>5.({6<z3-e+M!6,1Jnϓyܗ'cws"|ߜ(Ms&tO{3M< )6 IϘ\G\fW))Clu[zXpE3`5l.Bl2>׵-f޺/nkXA<7wLq6q=ҽq?76汎=u~P=J鞞Ȉu:WVu}OMWOP=-Ʊ~"[K6\(ù[[yhlב O/ zճCG⎡S{Z(dUz%iAmA49v9*G/=Ghr {~ly%8%\-2@9iƴ掶ƹ)1#ܷ !ܔ/ ]r¯~p{'}dl>S5-gvgY?(r qdeUeˏ{}vsF /̫:b2ES~Ģƾ9`#k#Tk93x*tNtD{b#OVlqy}M޺7t 5O?m1LsYK762 iVZ]c[ b9Kd \% A]s:xK/OpN2k4AG@+r+gM?_gpkhsZ>L$c4S»\2V5\<uz޻KU$OB3 8ϖqZ[˘YhipbEşˑZsh2ʸ1^7!#i^YfphGE.(K-3QZZ_< [ge!Ο@vb cDIfxDE3쳴>`^c H\G,3#?}2[/,' Qi|^HeB0==|[*_ƿfd4\+MCۖ hi["j\Q6\9e"3jaUiOA[;h٫f]C{nӢM1Yu~܏MKut4U+Zr#YZ׈56 8uCt,pG~䫢` 50V3tEKrnulC7^-,N狳(K8~D)Es6+g0ՕW$sB3b!S泋LY,,JOCl1_)CKn>WNB+x"e VYe/[ZX)gbT΁y42G 9 Ne |ZLg39U2/[1 27[͗FT1Lru9_ɥE 3Qb!WI)EKhXme U̓?9*Mc7MfpS:aΆ ~C^oޣ\}B? }~J=~{x3՝oo2z;w|.|>}~-qMH?c74;7.!{YO*aYx g9<}%;yY@ؑX6ء؍ŎŮ nsOHGdL!t0jʟqӗ?q֬Ȯ;uiQ<+h _QH~IDF>C> A'W/E:DԋՋU}:zV=~JTz?@SԷ5\%bNl-[@Ǿ΀~`zEv CCG@4>D8 yxt5z) x8'A*;OŻoߥDw'~/v}Wztף{~ gMMܦ$]àI/s_ -WvwuJ$yQ2=qɫA_>$_~,'ohwɳMW@KHɿ;GW"O ? W/~e~55DRc5ԧAߴz<1%˔#W(ё\#{G熑@8{ys#c #/+Uhl4CCJt4>z 8 mQn􁱻1t1Ό=DǾ9F>yTAf?@ D3q<HHq=XĈy\HΝ;A!q݉{Aߗ""HEN'~sO>?SO私6a{ .drBqf\ endstream endobj 666 0 obj [ 0[ 750] 3[ 278] 11[ 333 333 389 584 278 333 278 278 556 556 556] 23[ 556 556 556 556] 29[ 333] 31[ 584] 33[ 584] 36[ 722 722 722 722 667 611 778 722 278] 46[ 722 611 833 722 778 667] 53[ 722 667 611 722 667 944 667 667] 66[ 556] 68[ 556 611 556 611 556 333 611 611 278] 78[ 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500] 138[ 737] 179[ 500 500] 507[ 719] ] endobj 667 0 obj [ 278 0 0 0 0 0 0 0 333 333 389 584 278 333 278 278 556 556 556 0 556 556 556 556 0 0 333 0 584 0 584 0 0 722 722 722 722 667 611 778 722 278 0 722 611 833 722 778 667 0 722 667 611 722 667 944 667 667 0 0 0 0 0 556 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737] endobj 668 0 obj [ 226] endobj 669 0 obj <> stream x}|U97-S23!6 3$!0$H@ 3BB(`{誸b (Xւ]uu*9{7yy{wH~0sC&,~}'F/ƸƔk4_3k̘vewOUǘֿfl;lxlgcѾ:Ø5@{V7=釐.E:qQcMKjkn}n jV7-#Q޻sd/wEY/3Ec};,otO(߼# al 0ygwk KgkQ#}ndS19|x[ZK],nqofA+|s9Su~ 3Z4ٝX}mT)v(:U}:ggi=M cYQ7)^;E[/Fu'z_`ߛ v݇+g}?_/k'LW>o3ڟS>bz[Kb7znѼjvٗ_م?wb,fc g.b,f1Yb,f1k3c,f1Yb,f1Yw6zb,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,f1s f1?m:@2 eHA)f($ec=VǖmE޸: ~y7c6i$]OTuz53ϵק\E~x'RDޖnWͦK[,E}.\{A-ob>:܃ QPGVzA[mQ"i# Vmї ;l)y *J's\!*sWRUGW6[ys`,|#V6 oҼMK!5ѱGj b)|s8? k`ZV%Z-XfյZR/oY[u)uPR 9JяpR %!va6x+ܾpW鯨w{}'j0SJb,Bqb?r2X.-)Vt0ow3Y OvPJF,UT-U~KhYaSp=GFEzyKtFF[T\D&e f4XoMV~ 1617B[.~R )f>d˄R=XpeңSlW[[];SVvsMK. O T~gnvWଖ#k^u^[{0\V8??b[Ԋu5 l7}$Rv?<=7O@<"pzde{&*uԼ HxEB4 V޽'XZ3g>j;9Aڃxv('(K3JDK9{"" AS0.hUl T"E8vZT[=ZKS%[QRZsQKCx ))!)b{bHq)EDv)R'ŽR#R.)~-ŝRl)n6)~%ŭR"6)n&)n):))*) ).2).).")JE h)6KIR/py嵇k.=\^{py嵇k.=\^{pyˤ.?\py.?\py.?\py.?\py.=\^{pym.o;\vBt(EKs"݇Z)u6Hw+hEHHF hJBDȹ41Lh1YDDtF$ hQ#|Hz)RuDDj͡z)5h&QQ%QD3BDӉM%B4hD DǀǂFG@exP)Q HADTo8iDèP!Th0 Xj?Q?X>Q%C Mԋ('5MEmfzP>"/u' J'rE&RR"i@DIt%QDvrوg!2QHdN#S@:" 8ӈwӊaR[o")ALR&+R_">#9?%DS(!@$'zC6[TwzH#3@JW^&zE*r>OѳDP=MΧ$zh?ozhѣ|AD{:nJ=@t?.bP$4N&^{&AtW$ Zh;At;mD"mD7Sc7Q+7@y]Gt-5TjJ]Et%w9rѥw Dm%B%/TD6mj@G\@m@q@1?;ZOzg@gRDV j!ZNM/K#Zjl1\DDtBTh>QZyD5DDsРgSfͤAWQӕ ө3A!je:4DS"AHx¤H#@"TdH"| F"gy$q=, TI<TIl$FG~QjXY J4$[0qVEUW@4 O%Eb`}#Nq6z.=QMԋ!IMqY$S=M5V.~i;󆭟uk&ϫl+/l|> <V1r\8cZEDݶ-cdp;f(R|@E4Su=xn+A;:o+3^ \nyl贩IAQa!A`/v@h}=.vv6W-6f&Fz:Zj*J r2Rb"`+h.6nD+8sq9?8sq9?8|8bG 1#p8bG 1#p8bG 1#p8bG 1#pq9?8gs}q9>8?w[݁_˻\̝̄&Ǝ]~_Lf r֊l+=fk6v5 oG8;SY1yб;}|HuyOx:_坎cfڔ ?y/]; ڮxӱm?e*6bY5X#[95ElZl@j.J!hD%XZ _ˣ)TK`𵚝ְZ.JE-XʜՔdl`jfvO.8؅l "v'.ץ2+ؕ*v SWkMfw%<7kJ>Ğd{}m.k1k4#r^9l7t1ߪ㳵cckt5v2:VhD+NK0'FD+v\:c*v#N-*ԭФntWMnҿb۱5%J?~(E'SPϰgsRϧz^aopKS|e/?dlc6_N5}smuNt\!*b[c%uglW,pѷn5/#ʩȊ6]>?PធĆwr0/n1&yIЮSlҊ1N{mӪ';-g{f?՜f]|ٌR1^s_0 9h%%ٖ/ə %!V KH.r(joYtZ26RN4E˒KxU<,]I8LH!`J&cT+#=ѢMo7cwofJ_-iEvw7kjVn+f3 XkiMqpzGީn.l[S?yp34ciJb0..:P1vst [SoӻoB6kE=0cANCƴ=Hbff"w=4t% +(-mSoe[~W+d EvqL|snnH9YuI5#.Ѩo)`,]BQ`gQrN]7nI.}79՛`T]`ǩǮU TO1;LJE^ FQÇVgPpqS=b(OwfPo| `AV'fd3+]g==xou"R1kK %E6EˊNQ3O< b]"uW.}ɕ {fK4aӪϟ7c~,lw\ʋO͈IP-]vlx֗]>Do0ӴT=@{S_UwRo8!-xrHD" P$bBу{lDPɏh[+根Rӭ-y*elA팟 Fh(…YVL5w5uw5i18C('%;ܥfkޕ]=XLOvԵ3kޥs'm=)ؓqw+-*1wZg*jZ5aƄ Z_UwPKY}IOK`p$'$ D_2!qئ|}ՍrZ Rw`́t3uq߷dyz|6Ql;e*v6AOnlTz9-}ZuuYTW[Xдn|iAAMY)cr/\.RRDj]{=9-k^{^'Egҳo,U | ӃWߤ"Sw*6_3|1#8i6F ,5f| ecǖa1njP_>f1gyA;&β ǎ-</Lz Ikʀ;Ҙ1Fx*mloQ^::_V6VY#Te^[6*NVJo @5QHdYҲh rb66[M3Nzޘ14Ĝ,8}zJ:ڏe韝S3,9=U3f>xXfT:ltuյbgˍo9p׿D?3.]Ew?ay"DI/FOS&J|Kc$J$J$J\Ry>Q%Q%Q%Q VLDIDIDIDIDIDIDIDIDIDIDIDS(XF%VbsHcuPn^ȵѓq^7ĵI,'y=n7S^7듊y=lNQ.`ʺbnusvDrr~8=1 qFrS뼞D2$-7MBsL>ܜ[fT ^(#A #Y+vVꊝ.NFR7ĵ+vVꊝbgY+vVꊝz*͑b27j𯋅H៛D *⅚J"u< #n@'JBZ]Z`DJz&Y}P@mdm#.#cVn V#AVy0Ar٩y=ñ5_X Ǎd k%kT 8K?d~e_B Qu^3 VeG`uvɎ>N@j]M8_=97fM8gms_CGpN'z"enlO湱u0&,"XRL.}'>Q{?%(.yva Q/h5{(^:[r8Ѧ~S)gYG% 빀zJx}xQBk{GA~?Õ6)CujW0xj)J(E4bYi?FW]UJpTVԻ(Q̉wG e&Û>D|?ߙѣ'xzK0nVfkf#Q+ڊ;cǺDs1m4ԞbM\pa,ËvmB }V&Žw0Z fQm.;C.ЌC.y3>EFd|݃Q]v9vrqyߊ\J$}C J9NJ_ynݎz x؋vf7/N~V2_#R4h rljqƨfӀui%]1XoY5D٘UQru:fk+q͊Zx5`3*r>m #_UU PAUmSi+MгWڂ֫6cm@npUNUjU > MΆbMmJUh&ݨB=:ކXR▘Ԣ*GS)Ne>DZQF>w\0WM^-/42͟ei^G(#rU  o_"W|ቄe+ u%rjj=ꑛ.ko%7{]:dG b}d6v z:p̅֩_rLoXŏva|F r8rdp=䒻NWHx\Vpî%:]N)V ;B [ tE^_󶇼la? nmzo##> ^(W';!+.#et\a9Ux#0#lÝv:x0ɰ+`(}@Π~9l AX voLq͋@g\W̗9",w 6UћFa-!oYelZ  ْ2l@2s\go8RP4`Y.=Y] Ğ3]`^ *538`#.C^xP;+D`^\hCzJPf3X52톾V':lYiz_?8OwrRai,ppp$u(>]3:Mhb/DŽŗ;L@;ֳ+gJW$bd2/(+pgEmKRS[Aew 27UnA׀?yOX!ZYxuA], o5r/.Ad/raJpK=@EȎAWʸpg*2DlЏ^g.J[\"7ۚk-ʷշ5MoAV:Cn+gȷ7V[ۛm5--rMP_mU ӫȓ_c\pa&MȇiaMU[9uUomdc rsjzCMnnknjaZR3nFhkڀ[*p頽 jjaR*55T@ЬrrC2,~UV9{5(6VWM0_%WZȖQj ƺVRc+m- &z4 ЯFZV0~zK͠.5 0V /\ Ye6Y?( A3gh@A:$>;Φ9dy' +vžfdKOMEE*oKOKC*Eݥ@ -ʳz"Taɓ@'hdok@$&5dAdAڧjdّ ;$jQ-  kAb*hd;d Ad M>KRdz׃&$cRҼe5 "$I:-"$IHoڴ))YHJylc6CYed #D }_ $!1&!_Mzhj,+ )IEV,YdEĨ|E&A4c,a|RSj0ߕCY% yKĔ`|-%UHl*TnU[=I$-N2s_jW$d.2 ٰH=Ȇ4S6P0PpraQQ~bœ+7?nNMRM|8 ytOJTC_ Bj =;܋NKJ+Cv\[ސ*Oq"C.o2[{yҨI*ГXS怞¤# t@=ekIV-nZ [Zeq d(1/|oF_1r79)K˜mYO~1ty"y,`O6#e:^ĹѤr-T\GښAjE&P&zAd.r K2r?y3OrwHG< ; ~$"~o$#!Z{fjPnq'Ô DIAf6ę>WgJ;яAq) վ×q##E܏؏4sG;]No1wC<1LJ9ЬC4!!f! G,F, 1E8 цx;,Dgv<1d #.C\q=&ĭ;w!E܏S!/b>05 vE!،݈O iTh Éi9^NBEl@!ގ8 щ8' |%+!nF{!@>وnDbqB%WlW@ ,f+7~ 9\:]ABpo7~Q?B.O[EW VYMrYVd#S!{h\v=}w/ j۲ G9m)d^!y8-oFȫn|ːQ2+tt)u u_zMk:SoJ@ lx_|ro@6M> c2{|[ޏv݇ `d*j" G!A>jS0l(]p;txӿ g;@COW#w9\eo9W\ƚ@֟E2/ dEP$ג뮀 ԝERDF\5o;d.Yw~ܥ 빒=Gxl"!v_G $ g}a\. ŢMlCbqY%OI! ʥɒMjBbiY%ޒN̺ :nnnnn]$}X?^_]԰ӰppᬑK7~¤HҒ5 W)$LLͦ٦i5{)ڔwJwҔM)r"ɜg_1NRǧ֥RWnJ=zi;Bw'1%2D,,,{r& LMoKww/M_pz_ጂ֌fusڍspRȧy-d"7Vxcs{g#܉:>>7bNWq0gG'5)59QV#K Wpe4c-N?7PͩkpxIԫn|@Gj8"FQ=Z޳Z=QzM]}k6%x}[j-%VIg˔qA僻q'8=>PRz~gw u\~49ܫ䘎c#`┟ ½cJ|rApngƿoc7#dlj<5Ĉu??U.)}qZ瞚CBd>YL^E/E-GxD<-pDž#<|/%%(G}j ~|̳ŗ9#c˯p^q:SO߫< 獯-x ymNwy| _ =czxߥ7ju9|}@{cjhC1u^8u~o^i~&NoVEU7)mQ}[=Sݓٷ} *k-j[5{Zx{'6h~z}'4'v:NV57I?s?RǖemχhTa:U}ޢ56V5z3%^|y|3lHQRxgkCjs_VKRͿ7_ * ~~5S * ! Ho4; 4O)oV&Q͛ռEBF#f1>3CgQyU+A5k-5?\_k55kj~fk~#jr5o=_/ij~t* Cj~ʇ_>T#V ߦ>Sj8M'_Oi*EԼ}Ӧj~z?{Kjj~jj~sj&h9tBuS[<5jxWO2h9I'A/~6OrC!a Ļ4}:>ȝNB=%HHVU)Gj:6!fB -fAJ%ӕA޻o7IPD4יm@-WH%:i?=4?!GQ~ AXI]H[@68wr\dT[Pw}҈OIsj4jx5>9O'/ fB1MLfU%sy XmቄWXb`-) dP,%Lr:2! rB|[X.,' *Ÿjp|O7_4V4f.ubE|^F|_)$2@]d#>q8<&~S\HK% ^^[q'-K䠔 ^4VKJjT/ tz!]z0Fߡz0Nև }KAߣ7,n4M4skyTg;SWP&IIjzdk4zNJ#)#!KKP:2i)-h:ZʦcX)V )<:ND:Q*7ӛB:NttՒLht5EgIé:kkzh'픊hR1]HC{i/핾DwJVzKEH%t]&tTFC#r5t4kqt]'Utt@7HFQn t3,D-DnLmt;.};It')UG#dssBj诤Zkki OKu1TOKSoo[INFO/5g3R}>+5??H󒍾H_ZK%L_WR}!FߧKӓ4;izZ*=C"ʹ fYFYFI_ZJٖіђ22NjL|YrY&[&KjKZj%R'ͱLLZ-li:-6MJbꞚ]DD⒣$"$, "ID@D3H """"9IN ~]w޹gTg:Էz [O>>/ڻ m(rDGD$fm.Rn m]nkm+v mݷܷD7M=7Er]ĻnWvsn﻽ޢ#}ݾ/(wuNJAxw؝Nd;՝*b;ӝ)sݹb;ߝ/F ݅SwXtK(wLvW+wRuW8wFw׹_ VwfbZ9]b舘mm:bv+阎:N+>t:DgRQgtN&IЛfޢz*6JojCkNSջ.NֻzW~_lAIևŗ>*6cJ'}J_3تs}A_E}Q|/b{̈X(;bXX|bsb!bJic,M,ʼn=bo,>/b b,S,8,ƲDzCp,w,IIHL ~B32yb -v =vM0c1B1$O YyV\<Xiln6lallm|| l&CL1S ʢ@ZUeEoMet*U. 2$* U~TAUUU2bRj5#qjU(&IP^MQSAE5C̀JjO9jTV:9՝"N sc;SN!TDR9 8Xv2%2"é##|e>+3Wf_"|E&L+2Wd4_"3|Ef+2Wd|_"ð#IQE"}E>Y+Wd |+W _U2}eY+Wd&_/}E+V_o|E"h#E6|+W;_"+WG_ݾ"{|E92|e9+q_"'}ENF$EH9/*rW䜯y_ "?\+rW__}E\W䆯M_۾"돕{2+c _3ER*)r)ތwDMh%^mk$:EwyP|$b8&8%N38'΋ gqQ\U\עq.vD Q%j-DK0DkB-EHH) t]D7pDD1Ҋ[\ƣF1#n0rz-#,'4dNNvc7*!#xCoHod0⍌Fhd>دwk126"e؆cD e6[[erD1]sI|)6*ķx/KF41 ;C##ZSo#8*ʌ+!>wboȘ~*H;יBV7oG;9S}sq Znyy )>X.Ih)`; G ń0XЊ|K`),>Gհ:Xf#l/a3|[k76wGa7쁽m80ZpN)8 g,کp~޳ Z_*\܀p np=*uy=^?_ !7yޔ7/ނ5ox;:|"??q~i~y~AXg~Q̯_*Ư ~b ! a","9QGD#X4/EG/~b%ƊbL,+bNߋK(v=b'8$#(m1v?co0q8n0Nq8o\0~6.Wq͸nf0nqόidEYI>)+˧dYUVO겆)䳲|N֑ue=Y_>/_ 䋲|I6eT6/|׫j#d;|C)-Q&N2Ev]۲+){weo#ߗ}e?_~ ?r$?'r*rTh9Fx9ANd9ENs\9OΗ BH.%r\&sR~!Wr\+r(7/f"[7rVn{S wnG~y@ayD?ciKW};nf߰oڷ]s#1s9tN93Ys޹\t.9+/ίUs͹tn9ߝ;]^,ʣ"jDh(*h$jEFUԍh,&6MMf&DD3Gf>}<-=#:&:6:.:>:!:1:):9:%:5:-:=:#:3ub~]['pth%'p|!^߅#bH1NPp)oɿ!vV, FIM˴XASkKC?N3,.u_~έiZں զtiw5/%_yKmV 0a ZmܩQ}M'j cor5m݃CxȌ%ݿj>,T-Uo;?VF/W& x"$ f ^/KUxi4Y,Pk(re2n zֿO4l![LG} }iMrϡDNk-zQxƇk^2 ~aoY/&xHmHnmF^Hd<"0yMqOI9N'$8N&'y}>VU?]o}oWU?>۹zoq XmVߟbMXK^eBֆ5:coPucá2A}/;Oݡ߅=>0̇p%(>Yi`q0]I0C`($*:vQ#uwpΌ1o^7 K0oXbcBGBᡑ,ghth 憖ҡeͬrhKh͚C#9 wX=z4[!lM8w8 `ŅWlKd$ڻǶ++o••ضppml{f&.\/\~}nnv_a?ۄ۰#b}VsjifV2;jX)ff57fN3L2y|f~Y,d6.#l;̎'vg'IvfgYvg aM7-q[.޿f" zJq% izΏyRU-b|YP_6=߁R\z&JCq+-W=Y'=,WF [GSw{cE@6C@n gϡP!(G[~@{~J`uJM? Юh2ҼQj[m,d@[J]E,ǠԢy ARuˢvE]i]q|k!h YYYa.a槖@?8 mV?E:@thFV{H]4'YkV!ugwP\ -2A}l.!E.a%ocHz!֋֋0s.eCYc fg Z 1G+ hD?xc0}>G}s?J_XE#`554XG/6ѯ`;:04Ip .b+0@KR/J,<8Ov\6~+ݕxC=2A@=(CHzGf{Xk*yGM2IA4XV\3! ; C!P$;&;!;d9d!&;PZCqdґ@v(#0W+Qt=3ʒXaVUbY<-kR0Alu"l[6ljsu8.wx3l< -ΒP|T7DՍYIRT7enP2+KusVWXy[-YE[TaUnիdR=23fFVöWiÎWT+ׄ]5w1x50i.2O[-~_ylދ `لIJ)+e3V˗Y,3#mŰlcْ=e+V {SXxcaٞ=eV˷XM,Ggja9ƌMrӛƎvXcm y K,X Gc0 ܩIn0 Sa.,UǶ.8'0uAI8ֳX*Ȋ28Zh!b[a+ģPݘͥ GuS6flB_a~-l խx51Wc+zu8 kQ}'ǩTg&PMD=7zn TiԋөfPͤG8OG'3xFR<O$3 ALg=C;sAaKOc-xoVXO^'#hP]ic_ ,f6,'}0GxBㄷ: #!cq'"kgޟuxޟ,XZqxk5њdMXSR6XM֗f+kMq%LRR-uǺkݳhڟC0{=iJ {^cڇ1}>c//tNıqu9NAS)u9ŝ'NIS)u9 NESyJ9*JҪ8uCTTʤ+9(sM;jGlۡOƬ1+r@2;Ms1H,46<҅~ Q;w0::l^փP0_ Obξjb~!_EGoN~;^*+_#GY&1 H:f磖?G-G F2tWovd~xQ[H)z8D?]OMLC33gz ԟԟ?2@:zѪz)8e4N9SCcLj8Y@#٤,i${wvtuUo!JN36t3,Ѣ~(V/) ˼8 Xva2o]<-t6 @ֹqI~.1euY'u N-] 꺺.KN7M!=mw?؊EkڴN*yWsC}mQڅC|.ۀ- SDKg{a*au8uE\ W|w+jCD L}F"Ad9|]C7\^? }N]c%~g໽ϩk` B͇-e&-K1bQCpy2{=* $] ZZ7*C9oEٚrl;Ɖ!0F3??;̹wIᇖ{`9L{/eKJ\=Da0yO_S?O֋%3){Ck3I?V&aQQ_Gwvup'> ucGH!=@4q6#flHDBHӯ;;Aw;xu=!~W@=գTN}+*d :_dzsdH O IGx&fBX1G N5K2a~gE1C6RbrAٱ̮s`C2Fs%hOLҘu14f~iIẆ7uMx:΄ ۔o&Ѣ4R9f 5Oym\D/梛!ℸkF+1Xbl7Θd7km>xsӼ JM ]&-9@N~y5¹•)M4*fa-c߭VA#bku ]nmb>Nf88휾Dg˹ GFD~]K ϡ*WFRYe/G|@N${ HI$'H."$7DrH$"IH"y$/DH>" D  R @ )H`"RH)L0RH"E(DH1"ň D) OyRH "%$DJH)" DJ) e!R&@)Kl#RH)O<RH""D*H%"T 'DHC" 4 DiDFҘHc")DH3"͈4 Di y+҂H "-%DZȫD^%j&ҚHiC 6ҖH["mvDD^'zIM"oH{"퉴D: t$1@:DSI! t&9@BKMm"o;D!Nt'ҝHAғHO"=]"y7@zMw!҇HK/ҏH?"?D" D "2(@>&1d0D'D>!I !2ȐJd(20"d8D"#DF c!2&@Kdl#2ȸOd<2"d"D&$"L D& SL!2%@JdjL'2Ad2L"3dYDfl"9D s%27@Gd^'2Y@dB" dEDb",ψ|FYBd %R"KdeDr"ˉ,DVY J"+ "_"@VYEdU&YCd 5Z"kduDz"뉬'!?e$VP64cSflJЌM)G36iƦTj4cSflZhvy33! Y B9u I#ӧwIU,{W3NXeY%.˒D@%#Dz."DAIDD $ _UasPӧCuuտa?+}~b+c|qn+ /^`= 6gCs&a| "]T~L(?k)Ә2=2)DQeLPFz!嗸#ȕz-r r0r(׹ő:DJ-\-㫰ٴBv+oHm8r\l/oEygyK@y I,o (u!:Rg/eI[}SV0e%S(R96PF9_B(^)cY(m5|inMcb AFQqb).l(D}[lz[|}Xd᧡մ/T᧼[跑b |!ZoџZt!jsL!z Qbu(KW9j~'qF}m4ޖم.h)*ڊB!QG, ň1I Fos_ F;: HA-Dz!=c݂"٧ [(͙JfOd?Vnʼ:Lb}ΒM{V$wpY ՘9' v5t}yqy_u@Q>=q3VECo<9tkh8g%~D:#}.Q[8geVr#lXYIQԆVF8c%]ZDJ ^m)/h ^mc9DOE]*);Y>Fџ,8H;EV}(pՉ(jWAo|@?8Eox}4+h[hE,zO%G)oe*%aJKZ(14Y WTla{qk7!8mbpvٸM.EKV_Ƚ(ks8,|%4\3= e+?-߳?r1y?Η[l˃EWX_3PEdvmB3c]9:B8OrH?L=hזS6jbo) -_, Q 5U Q@j QCb,9jGLBԆw[j6/먀&<߲,k^v«@*`]#p!ތcO`OdO .@y,e?F n-%݈ЪýI5t+@hTh4K(9K{ͭPg%[iz^bX;ˉН! =и8w; V߯8D/xs$.DWr\U)C[J~\."ָ.GCY߃·WWt$2ŧt`MQLA!KNLU3SzDQ0i4qU\ cˮ= *=XR[iK~.ZV$WI*,I}VMaɎ'@+z"hhm >Mϩ|6l$Q!JPINK^Q28Cg yK%K}v([G?GQcp[G&ݷ͡طz^#bo1zEv:ׯuU-ޏػniVFԨ+TCµ9"oB=el7-so}PK||+ 9v^"/ZZZz#fhEhehUhuhMhmкۡwBB66yUj^uWӫxuV)pOگuhhXЈK ݍz0wèQ+ߡG./,&kUlC]+JM_k[4.`9Dr!#RL.o7 RV%m ߕ& TJP*IQɪ* )*SUY**V9*WUVyWUujUuzujZjڨjF;]nuF{u&'d樹5O֩mڠU7[^~T?CY[:ctWFnMN_ou RҭuVug=XC0}G@M?gY9=5RjFWmzޡ?;gz\_=zާWI1%L)iL)nJ Sd&˔3MSd&4;޻GVSRf9uH/wC)eTF@uP7Akuzt^T ڤ uD;uNѺO.&.tsMx%i3_[U>kL%S >69&>1UL>lVvovz soGoD"gr#<|I,W5@.r\"˟UqyBS<#*PBYjjp5Bݡƫ 5AMTsy5[T+JJVkZڣ}K_}AuZQg ]Y*:_Wtu]CԵtm]GR7W醺oշz{}Sz^bhLlb Fmc\ꦆ{[}mvqó\g9gr=F%ȧT9MN33Y9S~!ȽrR_kyP~#GWquBTSN%u.uiL]Vgr+J:[\QԽto}E}=J֏z''d~ܣ>ӧi}F5`LĘXgMjyoO0s$5A ~6m{s ,gZT\%Ns +ȷ~~,*OI^mHI 9S2N&!eqEd'!"R,)KCH`3se*C)kAiYWփ2kdS('C\J5w {gRbj8.{d/zOz 9=[-'#e8@3'!8ax_#.wX{-S/^᣾C3#m.\uOYɔUQ7")k|FZ>( 6=hڳ-V܈'Ƣ L=s YʾP}AP}`hLh ٠ܮn70Qѹ2jld:G6tP;B;?אPg [s,9؄*D(gCWQ~D64q#t f *ZcZc'i'{^3č3L 0A1aD2HaF$:r\Z‰ %< e> h\}8(# B 8jƁZqP0;evUf}f?424BS3a1G9aN@ksڜ6, u[;`B{;ގNv]:bvb@o;Nt4bgY.ov6+ەaoWvu EFxvya X/pʏoUú;ӛRg/u@G} N9&m*K@ 45heqoI^"A7,ۚyQShn3q>fC zoPꆸf՝QDw_auƉd7-"BnQ0FH8rmṞ[RtK"ŏt+9[٭"*Uj"ǭ:n]Qŭ^) ݫEuDtu;)q)IYJr-*[XjU(BBQjB***x*QPZ2*V UDB U$h=f#~d Ċ(@yO@/=Zh%3ݵh IPEQTMҦL̐(AeeY2uE YuEmYe yTGZ %y閲 -N{9Vl?doFyE,ٌҌxANTEܛC=)Лqoiσp~a1y Ly9 nwήt:+invK\7Wp|q[ݭ!zڢ[ϭ'nvW[Fn#׽m*.6*zz;Š")E Rc(*UlUV!ZEIVQUDG* ũU[Imp&B?ۗQ!6^cr_2Ǚ܉ȩ~>-= PBvy;TM<5!+ Q_$}V$ E)^A=\iJJt&dmM681ŴGFYx9K$_B~ i mG$ !8cC# =(c6S$25۔Gp]dlLD _S/wR>5ODkn5>\9`a,I1fgtihGKB%i<,ʓ(σK D5_PR}tuZ<Y<'u' qC6CW y*zZ|U)89[9[9[(ume{ cAkQ{Zד0zZRPh`..\*g|<+g ,.*.Ee~\?WV=µ5m̺>6A0q݉̓c8SlޥXlb;>GlO>m!.ZB ?/A|N(f`ϒ)]QRqVe jZ:`j3C!꩏(j ij8)u WuN2:](t9Y:[-PAңPG+1GYVf.10!:kfyڮs M&h<9CXZ±%/f{$ѾyĘ K(߶JmfGkE*,]&3q0Qwc?7vSً}k)O~gucW#ȍz)ڱz9[pH#L PPPbr gw8s*Tt8KY g89Aɏb gX>VڹƖ<]"+]bz<ey.ƒbI,Ɇ%fI.[ ֛!1h q.N.:P!2ˇ<5@+xD5̃5~!+P_ FS UGqFF e{K`#wMo]xw`kq,ԮUv vaZuiQ֥$$)Yg֙6cR'K{;PCչ!~jl(Zv.geG]T0̻P>HuwvO՞9h}:y7M~B~T;֕ЮQ%U)y=U]ՀUO]֕i,"~`\ƴFd9~v`#'bպl71/#{Z15~QQ7ڟ'o j-&-<'5[HzPnP(=$Y,?u@mo7s8JfC1lJpN Itvv 9xP)AS{tZkA iPZN?v83OB<[ m i?+ QQO6gtwp "ga~E/18j6hgYmBf}/>O_/8H?/!8L?//Kqx)N/i8CĉC^ZqK+xi%/$⥕b%I-V{ĕY]gX=[=Qz&8_液.Q zGD31h9Z@԰2AKZ'1)!Vq_pɩW:\SLx ]߻eMʩr蝓>v"{I쩧H8A=ִE7> >@CX h0`]%T *Jt\1M\SL;\+O;Sqpp,+^7R#q8FhAoC3͙QtĬ"^X;=ěψn5'ުFo5 "ڢ\ 1m@^i&zعPγA&zq_g@=Ϟ엡:bP^d/jooS߷7CcD5VSe1hIOc(' 8Iru1ZO'P='"^1i PIy<<< [y[[%[-߮k_jh7đ\o_u׵[٭W0ƿ1~7h}5\ţṃm£mʣmƣmmǣmϣȣ̣37SdXjKR`aű΂8xńH _;;\^77= Y'P[RXױ6zf'U8={?~Np;y6LM?b>cg1ګV-˜5cv{QqaF?^W cFK%7̛\ƒy r)06 ȭWq`@n}>{?(9v88?T@0dj2/X㼴؇9{:i?ri㌅T}vRc{rhG!Goaw F hlylô}D=N9oT q>!ezÖ́sc~mimuqsd6_ȽGjq6H@r_#2ڎb:N"X~)fpD s39[qݐrsbW BůL.Gf82S#3U92S#392S#3592Sˮc_z4xXk̕(MQkSd1Gfpd\ˑf1gpj͝rN9huBKZ9^К#6m8bӖ#68b77Б0tb܅yO8DSխ SyŅgsA8Kg>Eq)AVRBv=]ZZ\kw]X>\^T}h>IK1/i>=0?ސ.j<_)aJK)cNj=Gzc0L,XzKF9h^+h;A}I`8k`a |Feo#CD.̙U͙UÙU3gV=άpfgVS9Z38ΙҜY-ÙLάfqs ٛG8rZ% \EyrTfSO>[;@|əp,MT5SK0Q8&8fqV-qKƢZqh-^=7?BSQ}pRP2QE&[-pݒ.ugrY\wyCj)y/V֕j%ֺCZwcS N-o.R tu~#Oӑ B[[zEQvs3IGN}.[yh/hc Jycsjك+\.ycVe+ gJ/ot+~ƩGK#\xRyQLO͑ GG?r%>{q lgoelXXS-6s=нwA]s{]$rjϝ8Ûɧ(#T6q\6 V7zQr6R{"#A{8~V}nUgiظjq_7Qmeފu ^U;Mth-. g\ʟk|0 48`5`(2h=Id4 Ѥ>΋co * M3<`.lE1zjh+n#81Ub8j%X)VUji[#1s|k)Oqr"w-4rv{ҟs7sC\2|L9E)?3%r}u}%WbxK|%~9z.KlWm.KlGz)Ǣ(ۙr<)'(2de'S~|ƔSQ]L9E͔QȔ((>(E)qQL|Ôsbĕ,Ÿ_G\}Wr VT_2%)X:#WJIVys|>abA>7E YǸlCFpu'Zw;H+Ur X ^d]t4⏍KZ$(',8S;ɝwLqgp3ݙ WWkkE"%R(z>:Mh]䕏Ķ|!b9Mt(Z=tL?Gz4e%K8nǻ[x`?Q{!oJ^˓i,3'xO=}fl z+`G'p:|lڃ'>=xiރ{Ry^K=x<Ͻ9Cq, 샞Q EkY6ߚW/|f|zvO=FG"=ĸ'ĺ!sOg hXEޙGQl}{fPL"aGְUv "k6 $,!EDdS!(",*reUQDDķ?EW|?s'tw>UuSE_*u*6VAԥK$2xQzr4F8ڍcU~Dkfث}1_{1χ #8FW #Jbt\$FǕ W at\Fz׀aIք5%-Xs֜d,bq,fYw҆%Җa}H;֏%,N/0^; xxtIAtA7#20nFea]6FЍ D7w ʑEP^eGY0E1E)EiEYE$F VH*)X#kbI-Q_P#a`}g41)953 At U br#҆H;)t{81w%I I?VI'}D;{w#L?{k5r' ?Ja\qr77%BKBK7ų j@YgAEԃJ1:f<ߚ[ p=ԏFvGooƨ+MPWZ< u JGG#11HA]IC]2ue$J&(ԕ,ԕQWE]DalF$sc$2\2bDLl[Pn-@Zuktn%t.:tn5t%F&й2Lz&m 7]Ί7ab]uUY^ ]+.lݘ#b>Z\_frm  φOOOOO3{l!"DyD9b?T68R=Lm0Qaꠇ>hZh[$߶4 J' ++ RR^Hڂ6 uqH]Ro!`9`9aSP)vvĻoo+ӈݵYed,=oow}{|\{k|x\óΌ +r}2Ia-lν{;dI~>?A<%=xfߵomw Ըc-r|s១~0Ms eHWM_u>L|x^v #ķ[nw5Bc{ڇ>sv\;׮DwarwWգr5U`}'a}R=O_7;]n}~D?/Wk3FQ(kT6juhlt7~Fndxc1Әk,4+:cf47CƗIqp9<(((vputttu;9RَyE<+͎]ݎ#o'WYqZHgEg5g]g3ϙLspf99sS3󜋜˝y5]νC/'W\r|WiWyW5W+55̕ZZsq::::B!C ,eHGy`2(d;Ke&6`o0Qsa/8>F1R 1JH)b E 1JQR@H)b]$stG,p> GQq8;1yv:;g8pv:wX(Dv!v5Hner0R3Q20,.( #TDKU8J\8'D={O Bfe`.(srrrrr֏Ϛf!C5 .-bq\V | IlRrT R{SC8!uCHQ)7HG8!uv5p,8Le|p\xp) _WCn}nE.}K_E.} 7.<\2**kԚЍЍ3Q201P@n T1ۉv",0  յյյյqmrEq2D[aʖDƨ*[.-*D@!]guoW˯#HssWt&0Zp2|\5>%zo^i&; (Ѵ~ӏd$,d)#kzI>$1rBsWJ5ZQ-BG{ :D(@,W)bNR\Neve+I\iq~'\;\ ]_ ST8IsU8Q9uT8_!nb/VU8^HX"{*%EMBXv$IY2IdZ$:H%K&IY2Ih3%,$X2Ih`$)K&Y1Rb9pPJHɐ"R$CdHl]R$CdH ))Rb R 䖂!MQ=C*NELN٩8;gTibI){j0;$Pw!%44,iYfe`.({4ճ%M,igISPqP\i(r܇"=#tf(p U*t{=].1 (+2`'e&bY8. eaa",HQ)7HG+h{|GG Kg$,(ő#.9tF*Kgt2K&rD.%d"8n\xp% e.*Lˍ5hmjM6t#,0.sAJ7nd+VѸh\{4b 0p20=Z]{huʞJRS`O%d {*킬ݲK!2+BBVu"7=&#bbY"u2wrX'3k7`eʀ-y V73aps94GYX} q`MBW̵H:BMZrm€?[>r%G$L i;=(!tHng;^ OiKs}yY/bJyS6@j!klң ՖP?Ņ&nhj[* jۤZA}? {5}`2Q{-ÙF`M?_,'j\kNIL7;qf0p$/'$4}H|".QQ)^V&rBMh ݘgEb^Q''/;E 7;jև1/} +gkV/B !N:V/cfM||S?n#2xeQ{W<~5xsدgVGnfoՋKΎ"$.G]i|?EjKO/bz9ЙLqwthz-G+J VhKӆ46h ښ&4&!t(͠#(0}N)t*Agѹt]@Et1]Jg GL_ku&}now??#/1~J?)z%9Z^;5{{iW4vB ݩ;Cw{vq.MG^Z/M $hm&ng?g?@8:ɤss8G8G3әI|$-IiiZiYZ4FFӊ"heZش*J"h5Z5iMR֦=CJz6 HIڈ6"hcژMiSR6IYڊ"޴7iRIyDH:&iM#h:M':T4TY4OqOǓ4t2Lj\Kjt:Mgҙ$ΡsH8}ԥ|R>A IҀ>E" 42MOY,iBWҕ)]EWfy}t7B?8!]^t>ҝIz =!z'IO37=Gϑz^ uE'׵BeKz C؅]?PthiLKu}.k^`EMsȷ͐ GPa:;,psw#%/7e xN6zE^MG4i1z'CzzhбB/޼Vpzk~RVpy =[pr=&Vł([_ܰ%-6[6[;a+]pSWZPUW G^OhCChZ-DVo+ڵzGѮu;vMk=]&@} qA$L3H= : :xB>E Hʆn JBzD LG'!\l^^C&׺7OAA}}>>Jp5-y;}}lsq!m/a.;f}aaȡ2aqZiZz9jrQ S3$Fn E J*1Tdثs(ր%{#NtOgmMi%ZɳqD&j俭)[`*Xuz`} $! GKFF'KB=<=q|9 jI¿#csOs!c[O[↼alɣZ,VVUӢZ3Ah`mrlmX{F{N[жi;=~vBX7ҩTY!,Zm(%i=j}1^F)k5<3FUQhb4cR1H81Dc1Әg,2yc8f|c6.Wr9|EHF`"X V` &X Fu`=>l6`) l[`-lv;`ƃ>`??8&` Ct03Q`08 'p8Ng3Ylp8|p) \> >> Usjp "| \  7Mfp n$hih]D{@*z:'Gxzzz<}H O?@R˓I%u==CHCPO 'M=#=fўѤg33xrȃI)ggYYA=y$Hj弗?x/{^{k7o'yOzOyO{x槝^-Vvkng߲ |P$Jzy{xzy~{ܻCG=yz?~@ nh7vnn4-7CKr%U _JjZe96>{<GcWqp7!~?\!M`39x7JiO3Yx^#`&8 ѿy0zs`%2X V5~dş|>-hx:}"x=gqP1]{&G)8R%} Nt31BRPpF߲kgg`KJ)>|W!e68G^7ԗAo/ _A&ތ}rxi[ vӽH)p7 _P3{fï%DN-rXNe [[zpol+*fVUɪlUYե(;Jz~(3jcYV\lZ]8npED(Q$FDx#|wkƩ.iYE-\*aZ5zV=\j!׷[DH)U9v_rPĂOLQ+x˗i +y_ş{xW!}Z?=+kHB3]8yS|1J:KZO3s\a'sMs i%SUҢZ%'*ܯOUx@ݠwUxHUxDGo*JU Q*Q aչX1 Cahm)V+U<֋U|Xu.g ~S8|XXufR ~J`ͱ{k$V+Uʰ-l ){ tXV+*`uX]Ʒ|EG*#G+OUg #Lc:39KaY(sK?ü” g~f2Ƹ}>bo? } M =J+R"X1VJ{YIVfeXYvd!VUbhv?ƪ&j(>faL+id )7^R5g(=(yf~LkBJxwo )*R$ܜ`N45sIdskN5Ls9ۜcεJ7HI<i.22K̥2s ^>bH\wp'w^HnƋpʋrr69[/.=m{yI^exY~415w<͏=v#(|4q>Ol>oRȓx2O|,} +^>'"rvȤ渚f.֌5g-%kZ6-kڳY" fCXҥ_.6`#Y&Ų,fcX6="ZbY'@vle9L̦zxޱX֗c6%$&}|Met6C|l6<6-`OI1R[m-c,[V<=Ǟg [^b70*[65`o͢%}mevaﲝol;{/؇#1e}}h#(;ƾ`_q5}NIvJzcg9v^zc߳KvȮU]L6wv=>'?6{?'A~G ;}>m}o6ʧz%J(wW{37 HAD/Xk_&_mXWt]_-$#ZH!ZA"iXߠ|5H`E[?+&I{%Yop]WO 7wBkuoBZ?-Y вmh6W[(އVhuhC%މj}e\֮=TL/UZz}RowֻpX " ^A`xX, ˀeH XVk`.lFV`kƀX v`O>`__?Wk/@4@蔼;uztztzt;`+;w """F Fb\5C5D4 nE{A4Hb*RT*Je2TɲTJ2d2j n][[qgU~}y^>)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t> N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi NAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVN**:lCp$}ѰH8xx<~O$x*< Ng3Yx.<~~N‹98~N_p ΄\˾6!{# {]s >N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mu:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:=g[GCaݽ-XSy;tAA5k* K egߵXpĖּUr#vwrmCgmh;θ>*S:)gk?GlyXqc{ܝDhyύ#*߽߽Gd/_㽌Z{{1`/׶Z.h, W¯,#oq6\ oҾޖ}li[ǖ}liЖ{ Q_|W)ppK͂.nˏ@R Xj?Ͻ{ϳ]ME@am齂{ڇU>gN9{[;LbfWS^S;D}oQE:S";#nIqܬ*m]m?Ӆ3~g'tDp~ECWKzU֔\?YRp9|nۋdrc9z8kRN.?rm)}Ӌ..>w+u]+K~SRdZJRG/2nۻ;g\/zm:6e׿-W?]8R΁C8{a\Wٯ޳*?rDF(7pbT8ihs&&CWG{Lhfeg}Dþ=;r?WY?7\pl׏v:Ow%I?W9碍7i[/.]W5~"v?)o|<&_T29>3>/_OgƳkxE:^Xxg'VwfejolʉIwIezQf9Bn#dq#d{D9B-Gr,bl^qXr,blQIS9nrl-GWq[c8zYG2(f]>YuYuy4.wuˬG2f]>Yfq̺A%:.:,y<ٚ<}?$(ɿߊFFTO9j$)^Aw*ѰNS4;hDgx琨؟QR<>]nθαbo&ox+y۝(vZT4:b:ueVqD?hWwD?~"UO[q%n#''ψω//3+9x~8^qo;7?<:m/~=_UWFUFWTWR\9r^eJʴrr؂p8 G <&(8 c88 O$x*< Ngx.4^ /tx)/3 Ex% _W߀o?÷~vncXUXQ_Eâ:3 cCGѡD3(i>5Ok4 /0˱!s;fr99\>ܞ־::zn=SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNu: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: AAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVֿӳͨo^3[#A߄G;yڱs}OO=qɵN3} g|q_|O?S~/zMpږ/y+G|P~~`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+U<μoMxt4>0͈Dhy*Zm_xK:RpiG .븂w._ѱ+W{j_ZpCp?e=}> np㏱)ſDQ~ZwPUr]ʒʊJZTʞʷ*ߩ|O+T~Yy+oVj:ڮ&ձ'V'UO]=%+WUZzKuQuYueǪd7߮~ꏫ?oUT}Vj#knm\mBGjgΩ]P66veڜڼڪښچZ^RVQ]fj?گk^_ՇGG׏R\?~^}J57֗WWַַwԿUNZX5v#im81qzO7.iLo\Ѹ [+77nhxL`vp < Gq8 8NdQx:<x&< ?ρg"x1,~Ntx)/3 Ex% _Wÿ0vI\ΌZOHp  &$`B &$`B &$`B &$`B &$`B &$O'ALH0!LH0!LH0!LH0!Hp 'p ēO΁8΃7›x+6;.w. W{*x/\  \ pnfaf4ph Thní $,;p|/=%;(")")%!DQ(e2Jt~e2Vt+]Ɗ.cEXe2Vt+}Cv yg QqE^MNMKZhfrBrvtkrNdv_^FHh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6HhrL^ m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m4 kuzx Mfx · Bx\op \ ;rx\+=pp |z87` 30|nMp3| áB=[I5 >ç3Y>w. _{`FBI6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#'m$F(6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6*GsFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFC_p^7po[|.Evp.wnW{jx>Zp|0GF(7Ǡ98o-t-q>_Sp;|>;sp'|/EmHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6bOFJ)mB}F6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF8n{mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdil8^ \8o7[p>\"x;\ KR û x7\ p5kp-\A>S#p#|nc T8p |nO'6g p7|eYF6,mdi#KYF6,mdi#KYF6,mdi#KYF66lhF6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rQ9^9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9h+>΁8΃7›x+6;.w. W{*x/\  \ pnfaf40Z8=[I5 >ç3Y>w. _{`F6r6rmh#G9F6rmh#G9F6rmh#G9F6rmޣmh#(Ǻ0MCS}O>R_k}oQ?F6,hF6ф&l4a MhF6ф&l4a MhF6ф&l4a MhF6yc Mh{te5=ӵ>jzBOic>k zQ/iW]soM۷]M;%;~vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vl8wE;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6v\XJW]tnЍI7ݪtНKwݫ>ݯzD1='zF9=^zE57zG=>:х9MZ:>g\_K}w^?GS;6vlvvގ;6vlرccƎ;6vlرccƎ;6v4cرc[ڒ~6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6ޯcFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +RWj]ku Q7fݢ[unSwnݣ{[ݧCzXQ=SzZY=^KzYU[z[]>GX'taS}O>R_k}oQ?FFh```````````````````````````#sFFFd%llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll4S碍V|պF:]tnͺE6ݮ;tݺG귺O=ѣzL =ѳzN^ѫzM ѻzO}Niw-D3}/F;}~ҩrFFFFFFFFFFFFFFFFFFFFFFFFFFFFfrFK6بQgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨m٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6lhaW*]ktA7&ݬ[tnCw.ݭ{t~tЃzH=ГzJO=^ЋzI/ЛzKo>ЇHD.B'Ts}/7V{Nm٨/ڨQgF:u6l٨QgF:u6l٨QgF:u6l٨QgF懍:u6K6ZFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFӻs-ڨببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببhaW*]ktA7&ݬ[tnCw.ݭ{t~tЃzH=ГzJO=^ЋzI/ЛzKo>ЇHDv]XO>B_+}oA?'ڨبmTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTldfبببld 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`FMcF 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`FV|պF:]tnͺE6ݮ;tݺG귺O=ѣzL =ѳzN^ѫzM ѻzO}Nihj҅yO>R_k}oQ?LFcF 6l4h`F 6l4h`F 6l4h`F 62'l4hlߘk89N~4??.2{?Z{矟[9[/j'iMowg~mvg~>_~t?̗s_,_~gs4?r}{׸/Ͽ;?5~6g3/\vv>|6w˿]=}y?f-Ƨ3_=X՟}=s5_n6ms2=[rf + endstream endobj 670 0 obj <> stream x]QMo +8nnnbL\&%@ZtH޼yTM(0yp/0r R4BrxD]&czON.P "oVj{z|{f^Dٱn9z_bӈӵLqL GӪzl:I"SSQv&Ft9G΢@2U~DuM^YeX>[맏cS6A5 endstream endobj 671 0 obj <> stream xz x[ՙνWM-|/gsbbyKN`',dKDTI%@S g@) P(e of ao^C-I=?s$Dm[7bw8Uwc,$W|~@r$_!`· vPևxq#"1U"p+:OO>JU0| ca-{#vAx5 Gn ~6sr~&c;;?ޯ`%?×uFP/dNkse]nrde9 Thg([ fބXtc)l2-0.Xd \>ްl̼I Kh{I9\ ʹ{܄o=G(-}E8{\ƭcd6v{Tq;^>+r;"80#qxUtOjS:-VBKGHw#6S[AAZ<UGQd;43o=]6އKWoXYp6pJ*/}_-+)5`wݞv*BNS/꧎꧆SNԵM5)~R?U*ҧR &C!`4 :h0Go+ٻ<]gbz&zv@ENi{w3it@>׭D3+)$=Yu}+=߶w} 2Ծ\B՞}}`kjLݘR]W.^YKm/@= ۍ)b) ?~*/Ѽ>r}w6{Y/ޗDTuSu‚aSIMeݶ<6eBt \AvAVhIHjʾJZi B Ds}3nPnQ%v.nr, D*`P/s&w.r ѯ(1s` |`H_'>A~#>Bހel=L #\ڿ_/ÿB6J)'G-Ѝ6, iUm8?#V+Gr5 | Gќw?ha7O sDcf[z !R$۝O6R\J4_ExG n{pK܎0VA[`/ZwF00ï]l!DB[ N&ɍdɃY!/!%g*ӭQ? )=MZ^haGτjQ=1,JϊsH 6J>>>+Z8)RgfX9~l_6ۇ=`XU#O5| `pBI- N%ir Iz9}:FoWqzLDf"K, #£BD8)Dzq?!!HIla.U[E:Ä}4'&2 % B{i<=EbHa-#Hגkى ]uap5"naqB |*Ti4)̒Oa;Hw$&O'bn(sbZNOG"Qd=!fvoA6.$ 7[ѺYHs+l$O̥! e%|5(ɦ̦6ѧK{xp-xqpqD\Oݸqo!~6uz~ICNr͉ӋنuY  s hlm`wmM]%ؒbSY8] ' k EmϘkM9gO0JWݘ:Ui:wzih=HRRkkd5u+US KzuͶ&6YMdH\Ѳe˖?65Yv;~gp?d߲+E`b5bԁHqF>NxtQG  y83Fh(N/i滸I'GYMgO99PoðIw[+廭YARYc 'ד:4Bw9g_t}>9E( i\1<$bgs=k[)O#xr]O:dedb"3gLgXIdX-cuCGk=zZۘK61Yɏ+,,P B QJ~Is`6[̬,3,4#h6L[YMD2gP[iI"mZ]Z L(b4%gԾbi:N^X6\au, ϬgeRR,rg2,V]:eUbP fP4{6x[\Y͎"s,?$^۵El'kU̳OoxB]_VM;ZE)\rj\%&UW @"%9B,DJYc"D\~նuY*m-RczIqrqaIZIqBY1$cW_TL,& RW XuspUτ=ռ"$8'+~q9~ c-KYZtV=%|}m ;.o_\[+ ֎~^:D/m}'Y)d=~7}]ă8{x9[^\y+sEB_?CN=){btJ+ Ơ Z1K_Mfo#V -$gy fQBt5:ĽγloTخxHI% (m#D-E-[*;[,ogyfE!Pzl`H|ˣ&ހ )(.H^aO(HPv={٠$&a,)BO ~S |*@wɐ"1/b*v>ڐAE)AнxnގsQf;tjSLJ'kN] ?K>˴+Ex !~[u07"`},: HxAgT.v_Qr/Ԑ7"ܪ5yrg ]+0rӭyc@ZeG ʻ\C^5C^mt,BC}CXrɭu32$o{ܞ< THP rk\ #˵[v~OHeu){}㮀C AhCAC8B1OC!W 㞐[VQr)ߠ<vꕃ!׈+(,蒷yd[ :m+b,HȃNnS\ߋ!\rǎ`<#r0jɃC!zm||:ҊRlа6b61&ʰcE,dW@WLUw(zZF Dwhyd~W` >dDPj PŞjudV[x`{e3:]E}# S.ЖErp9k9e ,YTdm(󠖐k:}#^\=5*,Kt7dh.yDrȄF1>nπm|M >8t0 *xa&p4$_L77x/wC#>NaaZxQ8qyiA~?r2»@ILZH^ESȈ"VW?&gb;A>rӅc;/=@Ǹs˭EB BeAk8{s C0,R;.^5(cbb)̍?Fbtiyd؊ r\zX7Gb ! TZp'>y|Q nͬp~/Չ#r2 z h8 U(b(stYNC<.|\F2KXfdn{oX\5Ls<,ېs,\_,Ӭveخ (ĵƲǭ jv/S5c^,,fI]*$yxWJa~\6lYQj80aB[FAq5?V^ֵDk> _;jU,wrĚE\j|o,sz`,~^_üCu܎z>`W#@"U >{qt|DVUZU4jAυ*kWb6ykߋzKŞx9TtJRc6|.Jw.[o.ڰ'1_B\;ɏ;Y?ieU-}Z] ٜ툖E+ģEwG:ϿlT_<᨜f~6?񸖝\8|Z],^}=RwfYRGi!C@%/=/NȐ\xgJЃ{ endstream endobj 672 0 obj [ 0[ 600] 32[ 549] 74[ 411] 120[ 460] 152[ 250] 170[ 384 384 384] 186[ 384 384 384] ] endobj 673 0 obj [ 278 0 0 0 0 0 0 0 333 333 0 0 0 333 278 0 556 556 556 0 0 556 556 556 0 556 333 0 0 0 0 0 0 722 722 722 722 667 611 778 0 278 0 722 611 833 722 778 667 0 722 667 611 722 667 944 0 667 0 0 0 0 0 556 0 556 611 556 611 556 333 611 611 278 278 0 278 889 611 611 611 0 389 556 333 611 556 778 556 556] endobj 674 0 obj <> stream x|y@Ey ݋DA%J*${ViQea޾eYyWr.~̙33\I!FҩxXNB_HԂ3 W,"J|HnٞqL?N:ڙ5Sv%J~ Θ?g?̛RT8=@$4~-Fk];p^q F~&=3f9`.R.ѳ g뻠zhR|]lq}wn N`q_{_x`|~Z?HbzdTۢӷ3&B$?@C)-mF), 48< ji S'RN Kd]O} rkt)h=6ujѼ1vD#yО'-JOR#eǁ0imSMGXrI{SIKh0jGۍ]T|$!oZ. v[6҆V{' 3$Kǁ}2L:z$=LgtKE{#W|#F"/M[8D}&Ax,#.M? c\*Ǒ7G]?wZ4Ec?t!|йEC t`~X 㓊.(2WChD^A~-22 Y`YsPBOk= y@Y+m43# EJG@ǾuK(Eo??zae9unrEp?YRq25 P^wLx"i eβ(D=!{{^(V:t1@cQG|9o'ÇWvSFp6f1F^^q PWK8WkRmp:G} wb]GQfwǣ帒(IV ZGQ!~~ =:GR>e=tt*tzTjlYأ/s7MsT|{e}g uk#y=9 O}x/vZypnf8֬kh|[]t-}L/*g,q¹X8GTj%ioQT,Ϣa=˲83ϺX~ҏB̿)ܻ^\'I8 (A.1Y5]2*2ŧxFr,P'iiO`\˕௡U, Q ?_֝ÍocosV֏7#Vs>cF<ݮӛH/B'7ѝa42#U|۹+fO^oCl{e`;YCڋ>]TcDX 8i4ю+ЎJ: zX-t3y/ӟľО Rh6ѿFO ^w [N[!P#֒oh/Gꕔ j/~BJ6) T2$ZgIC=؀[1Y.RXA2O]~es'=2O>)׋r?4i o`y68 fzXjEX=nAGOGGROmBOPy6G<Ч3MiW(74;S2;=Zig32!-`:_2ywiuQL40Ϯ_٠Rg:K/zf(Tq@07-eȡ}s =~0ދ~C3YPQ@.KWZ>{`gyߖt=ddW'K"ƍؗ=V >bmkb HY*CbוН[&5ae& )&KiLroZO{+p_`jfc>yvZUf AYZzC2YZ7iU}w $vЯ@Y t1ᤷ3MG ]H ww/qztE˪g/8Gң/"@r̃%WAsæ#1ny/Fbp-{w@1v>@Kh쿂Z@#lνh߉ 4֏)҇*UlA8[{EdjtޏXoؿeRH3L">_Q*4G6 _5Ygke_h%]j3s؍}x5kq'iQ>@~45[?ǔ|3Ai\w o`ǭАVw>Ez'۳Rh[Z*-;9=ΰ }ty~s1 :~[tWOc|Lѳho݃3<t4loRc ԍ z uاuu=|yo:ƱU0luw_썝X~B#OA>֍(bD+hw+T|j"v ŸMLi6{ɐ ľ|DEmVN|4?HmoWn(޵}Z嵓/^˵*Q>"iJ[tӀ]8[/rYх.hhw"ՆmԹ4{XDk%pEVX!nc"0>p͑}ًXpx:l ,Y|_I|B{o})|?峒s$EvHE 2AZ^ClPU 7snmsK'n% 2?7Yp O 'yk-I>Kxy>G?#4%2 fZ<Yb|JQ'.IV&'1\*P@{.қSjgӞz6>!+4MoIUz!xNO"teS6Ooѿ-#![jrhr %iW~4z Q5|dzx|kIvejSSGVm:O>gHo]M'kIL3{ %2ZS m5vP#*xO( ~>~71d`Su3@;D By 7I@1 }#tzw)=Ϥ|~u*}/y T: Y>'z WݽKoλ{gwP~mIgAY\z1]εס30uDy0?IyWwmcnn3K=_әƘc0y9A[_5|R9^׋w!S'q|Kۯ3Lj@ї5|`X <RR`ߐ~[ 9W8r||8ya0frcxL'<} c_A`[mC$@l 9S ?^\zsmCu1ksKpe|~e؃1Fciu,W)^2ux@/\->s)-0ֲKNvSiOsstobfENA@Q] IveN%==$ϋ$WQ2NL> J'aC Jp:1^O鯄i~{ܔB'Ō 8Q`8 +  xbs\oqGy('cųzg& _2<ώ{hBd%j 9K9u Powu8e)}JˋdY9ެ<f<'f'9! /4n?G;Y#G7{Ti@g`iAiaX2 nҴ⌂WwF.G'(}*VxۇWsFm !qȼJUQ R+̓}Yʉp,J%#\]&jd+jN  hX94p9Ie3o+i#uG..D) h6$jGn-_ˣ~yUf;wЧ W o4ASCzJZٿf 2Z9&E=pfd]is586VhwЩjWU)/iYgap|ڠwhhpdj7)ԠD&tilMǠ`,qxH )Q`d F;w{p0 `JO\թ7ર)Z&*DL dLY,*$Gmbҗ'WK/9 uS w|?G z(Ws*>&d#g#̍4eE/_AKagg-uR,Ik2NKbRT9T< `OŀJ8e0 \,Ij"bD$b`1Ҝ0N/UKKM_Q~2r9o{݁;f'6D9tC զqMzؤM$&q6d6I+I 4I34IC4I8GX[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[X[Xgb՘IdMΌ>qe ]8 bm@]@Wy)!tеU(Q26 Mڮ@Sĭ~7)JPl\Io()>0\ \W@/T~PԦLBU+M|/- Q靖 ox-z0ʎ@&UvL c se#juqUwG$2. mpYeǕ0MU77b%mMqJj]t[n-nX\K>7]ӱZU|uZS s2+ek0H^'ɈE9qŨ ]ܳ5ȝ]w qqV+1hW!՝9 _NGi,g;ч_/}!C/wpwj0WY%YeYe7Xe˭,*`XeYe殦pW#WW2]Kuy8~~s3.*-p(.SS3-KI'gU[bW|ߕ=&BQTΉ5?VBalT4FFãs[#ٿFOٱڨS9"4ߤ|8g?A۠,whe-hD;<y|vY;r4rI>uK LܒQ ULdWoe/T3KA<۔ hQeo0Z>X > > > >X > >>>>>>؏J{Qiϭu8>{*>X>>>> >>>>vcWTsI ɧx3fY7+%l Z"%H^'qv8y36P?|] |S33wz4iBiZR(V{U,A*<H"c}Z\SnRwATQ *қ(Isozss3w dC*9nSN|9&\F|ON^$ T2<2HH?MߏW+]/}s΋;~v%gwmS}2&Ճ*-pN͠et:']G[F1-a+v.wsp}#%o7-ш[IHb]H>K^!COAd0 FE0^X2xޢ)V+tJGy!?WkR!>FHwKkI-?O)㖸#/ŏauw 1Y<i#7uO>l$xyȭp%nQ\+1 Ͱ^7ކw# >[8J ͤtBg]NWНȓݴ~@ ~el,dOvv߄?mD$]HxlBG} g~0ٕGVm̤ A8ۍ>U a(Fw&̧D'N[x-v)!߲kb[3 tMrdf!}Ux^Ţp3c$Mdt!?>oM 0`nVk̟`>K/,z&/uP kWȠt=X N'){E^*LFVKЎ~ψE4rf?џYT4>'ppd4J@U; ޵mu{e:܏z*LԱKS np GB q}T#'8r1R- [~;*i!3K;FyYg;}!Y@iYB6^<~~$RsLD1bQs@,=G:mۧh}u;Ftr|M+/ D~%a&Vf]̂*F#rE*Fihr˸7v]VBYa:kݪKUT4FYa9vB,d cq 0I3X3m3j%t-1emFC? ]eeX|V+%J2UDDX}xwYipƙ|Ps4X T&H>$b GP6l)h3r 6CM w 8w*:\¬7~YkMK%.J1 L{)Q#2aCUT@Hj.\lDg'\R!2 Dg;|sEzdӊ o'5t&k:98-'װ4,$lk55 ;:뻡.Yt@{`"~ª_uݓހ/x?&O[!^1|Q5ՆNhnܠ d9 vԔSt7DctD%[T)^Jf=~h-{_=9Oza^bTt3]Sld*j P!m;"/A]$?ѿ)YHzD۶Rz ?duM6<, ͐A4k̩p֑@dĀHD;ʱ$1O@7)* +*X)PL;|m8VzG,clg\"3 Rws RM̍J-ɝ5%wΑymc1&.))*xeE沂?~$ (Ӟ_avDdyK|sLf缱ӧkoE扩/roȆ~&\Hi-8cXKTuLj8³DM!t'8颦65xCO*6n>šlrLnL7mݽ!)X:)Bta:PXG=u@FgI`~W DzxLt_ss=*Ben)Ț~[G>Y87gL5-5;=<Z&O~?p/,3<jԓC|%FHcu@99ٓ)׫wKԕ'/YYW W(&u+̹?'e{0Ռս庥B-!I!iRt!N=_7,"Q\^ÓQv.0uFJR),e+}U$s`Ąhb4D@I\RVB/n0e3kN">HJjs4T-,?6OV}WK]& S6jg1[<<8oBkǮ6n}գ7 ]}dWM31`Rap.kdzF r翝;;*ڂVdƚQCpBLX ;3q3YlhХmEs'UBzVxVL8#$d w4% >z" D-@ZO/5s{gC1мӧ}ͻD.Q},[Fl:wzz@]>v4)ijT򗦏֩WnR+{=){zb_*_R훩ܤRAp`R&d^>N XYʦjXY|4A>Km03Zb;&dNJ[<啄:cYSIKe`Ѐb1E2 \2E.,]'cw'\:0|/N>.l.F@D0 TYΧH|SbJҦcQ:Dۉ.## QcA+g_K G3]6öyFn;jXjcX2ԢhU0հDhd9CѼ[ΠR evZĢ=PT1aeB}7E Kt?X3n6D3ZEAJ7ԎċTe:]/n1_)zYWʒY5(֢ tHfX=4DuAf][֙;ٙP؋̇aUj=QAё]Dw!","&]YXZӖ/-W^ Z\k yt7۪B!^Gh8/JUuѶ(z{XZpb@hX|u:]F; F68#r[$D{6Nh1H5ҧh _ICI&2Wi>_t{*,Qb_+Sa/|dL&8;+3E3#B{KF.~烻\08#2 [Oi.Z-KvSSPes;+.+tM>?r⇤A60+~?W˵zϗCRlmY)rNrRg+ր:u$PLI&a*v**DRiRsMP0wۻ`{BVܗ=s=󺗩'W''iYf>Ⱥe2XJo ']$DVRa qׄZSZ;Sv:[0E1dV J,:paP"h3LZ_$,F!3@/ 4T FhL8~OJqC !RZx-FM'pNkF$m-4'Eq0)4! ڵ˥fkS5Y). .UkKLO3,-eݢt,0]΄HӖ.AXw9忡ɋ0pvx` | asךkךG~diBQyyG/ycX_Nk@|÷\feerz"ZT5FQ8AvZ,UZDiq/c>SnZтh*Vt:/q[3l_ŭ S7v-gxX;`Ռ2Q{_! -}}CbAMp8aNpCԞfO39}0 DЮoE]RkNZr^r5"H{ mM-RFr_vfr_T$}KJ VK,i=LKG%.MuR$Pƺ%%>/P'b;<}*pߵc| mOC@+" -0Tt|K-3 9͋6_\S 7xw 6]Bn:AFИy0[tŮbwB@ G fBJGѪ6V=:zeb4wbc`q ;˻HG_Y(\`6xiufnz^ϊaCv1-=YBRu-`F pUrՋa4VuBuȗ˕j]٫~ۿRQS\R϶K2rnveI VB0X0.%a;TcdX,S,+ES-Z *T&KdM3K0ynЭ"w5[)W q7_;_@S2,ߜIgGYs]LihHL6-l/a'>R+@8^R$6 $<5 06_LpNz~2"Yc 0N*Z=4!II6ʬ&L.[n kb*6Js˯@1)X *Fc>1E]EE2As)z9UXȝ0W>lm9͖MlÔ ,eͦ-"9Z-P#Y rRUYeU[}Ͳݺ&-m$[Ms6ynC2Fu&߬b[$ߣ,Rj[F2KܬʕPŶTE.٪ nUE SSՆɆT`Sft; ӹN6:Ґ?hF'a0 QF+,,u8V!𭀅(l0|XY(kEیH ž_ķ8g|:ܑy.rm6̯G0rG  7t _guqCsqSZ%E8FWX/ͣdNh24;0O@dfg'*i"4x EJuꗂΣ+%trTQQ>Ţ~(S v=I.P射.V(kȓ?u(-jNi"I%k4B2@ʌepQe"!BU(g .`_Y FـE;98L$1*Ƴވ~Қ4Oo49Y?YWْ.IFt Q%hEx-=[eh&́mbznFU(՟vgJu5>]o{zw>ںV$?sz Ʌ%~[Kito{ śʝ:\'JRLGojAMHe{Nfcbeh+=ɵFIQe{oj+Tk=ϓYjTӂF6 +\E@4(^_L ''fib WQ934e gw~յӼh]_kZ>gsWЕϼjN0ƏzF}RS NOٗ2 ؞FKIߜK@P zS)Q19RWr[~V҂"ML4hP z@ŗ:}*ׅ1TH{rPE= ;M4L{⛆baU/z#u3̳]V B#"> 4nV)!'!Kq[t 6iR=+xL WiRikH `bܮZ^a_XZ-u.Aw/3}fj_7E<'Wd‰Ҏ"I|: scYZ4*NLGmSȄp&dF3^/dCĜfAύza. 3~|&mLdy"Y,1=62 csך-bp巘[ΪȽ~~lvtQj=-?,?[@O2:*TfTQƭ(J׈u)՞=/F_q}Ohh Ƀ [edx& PUxvրş*aWs#F;<ޛ7QKE{EH E;1g8!a̻ܷ }M.I -س8ƍM7ܜ:/rm|GB-kqbr[Íìk}&*N3qM)}kqsm`[`wr 8mrc~'y$S 6RX*zL]\1{[KN`KPOA,YAq:5#K"@HsΆdO?4l&Zsuά[MyW`byع`y҇lu{݌-Syzk4&ɜ!9=*]bMt))kjһe@y rp>⬜)$\D&q4pCNJdS .ӰK $jK\?g Eg0 ~p/@jQX}* jSpMd XEr<ϩϧ=~ۈ &Ʀ,UQ< 9.|1%C+F_MTOF/: !6mꀊU ~Tw5~.ԫT?).u];XƢc0uCCs6fc&W; 6U0#3,zl}g ':mO 48_7_x|,ERN t@.1ܚ:Ըm8M+#f\X yjK Lk`noPvW0`0WCJ.tSk'(d+WQzg}Ґ$hǢ1x );"^RYޛ07N{| B :Ј!C F M3 > bJc*0MT(n|U m֥a9ZvN#ZKRL[mtR\.e 0Dnke* &H[;Ɋ j;Ϡk13DxI㊺a<7l.#&G6if䧸KZQK b͋XO˞ל+ow$~ّoiDyr/Oۮl]_SKVSKj Ak2 =K]CܭdFXTŵb6GCSYh'#'-W_/)&m?+0xM¼Ѕ*(QRd%3]⠷FV{T +*v; +mskI2m ź42 t L*xY{u؍N`i4~ HVdQ* X nŏ#=!+Iֵ[Fׂ:V(&uY^l,Mҟ;C2*q3GXpVzɃhFKUq`d_00,;KZ;:ǻa H*p0 ܽ,mG"9`X&'O ?>>>6O`qglْҋD YwXVvGѧBg_Eਜ90pHw'EuCE"WXbt}qN$Ө,:u` 9G8)fbl0ۡv+l8@V!Y̴3Qf'rj@FaQb E$\Zv9.tpb, @NPf=TXnދ ,'JyğN3M+hlH(q@oБ(XtlГr&L /?x&q_zH׬Q5uycG&O{~CpCkKK:'^3I\\3ĻsT?)}aa @2L6l \iYvgÉya& 3MȲ<OD y!-+ 3A&6 IOJɾ-IDvԦ힥>Ͼ=k!]oM*qICCclp9!K0^I6 XRt7-$y =(d3yMiоm棳6P򶅧>v9]s׌|ÿH{[~ކ(}+쭡/t8ca:Ëb+u6%Do{21y,0 2(((|ϥÜJ+ f%l?әn2{=cbRp?'-(V"R0;#IPfX4CrmFu=[^0J|[7yi~CUUl)o&֞֌y>]7.rN)V"c*uojpjdYDL>7&)s΀wY/ӖZ$ ӕ!u- /!0 [>ރ7)a:IAHS%]m4A?=gIfbH/2`ࣤWZq,Őޠ?VUC"D_pƳu}.VsYz7LV{ƦogC,ԋh6>b> N[J+_1,g)AO(͛eDqٜ{C?(*+[IŃIabV-i+eֲGgW״wCb|TR8'KAw!r>М۲~#c[ gäV\4@TæBʈzȂzn6:i15")tw (SvJ->*A.m?7 sV2' b|=® ]' #ۋɑ& >]NSENve/ǡ R2 W2X^p~)(/h; A#́t_!gRLw・]8Sb`l4EAQ9.$i^,q~kpN 9o!#ӱ_Ɖ[Oo+4 M+"ӤG}-ziLtr&쒺~D7j ˤjS˥I<Ζ&q;U**  //yFuD80N1AcH>zy7}p&(p[ !*@,mmfCzL;8w) ۉkpߍFP%#@ĸ9JW}eϟ2O#MɌK)ن0Icl'uq_Ïa8eU+J4IG|؞8:5 k{/ tI>[|w-v|4C6lF! 䗌<7Gn.&5Kd6sFVOʜuQḳcWWbA4tݣ@4[tfQ+X٣Sնtlz>[PGz'v& uJ` ծd%`R lS;AOɧ@#k lDkޗ8 Kanڼ#'N>6!>yP۫zz)2ge{jW\ ;z[[VQb.Hfa ^ԋm8K|07IkkYQQTPB]usbJX uW-{6Yy{ 4w\G': } SLp;_K1Ⳏ!P"o@'V 4Ćt4>oc ^1Vht%L LIy/\8JkNB9bg]!2]zP%558R #բ΍n NT`,cɀ$:6 ˛,6|GmFCc Xp ^ X^wrǧLj&`21:iWƧ%A &ŀy.9,ZBvy'ڿ7UwuĪUvg>4`߮V:^r+1IA7_~UY177q۸& O(s e5E P;ʹ-#aP\*)r\+7=7# /V VEzyARmT[ՙ9ƜfTlV7-iҷگǶTkFGzGf[~p@gHٛq {_}ޣi#Gcه ς3ig"__f)|^*BK Bij^ QB4mGIDL_FF&,,cdd@,/$ϓbȵŞ:䁞N{Gg dC0{ƙ^OZ b^#3 _ _,8k|e}}c&١)dSZ!PHy`Iޤ@\H.ȑ4|D>|EڢJc'@0Hɮi0(*> B@Q`H 9( BRմSTdTdjmu&4Kkg`hCX \ǘ~iNU*~aOz)kmgY[NڞzB[?Vwl<Eoݼ'\9v̤Nؗ_G7+*s{i^ UsL uG.~CQV4TmM Deub2.h2hFH*QIrxV2ީ*Q$ k | s|'~"w; h"`Kb+bڟXe;]AQ1S?Ck(&:_o<ۈG/qAK7_wѥP?H$-;-Zyϱ$L,&Gl \pM&",n 5"~hhncug qq9~$R,cxymyttTC4 >֙|:uFs( bs8 :=ഷm6vD6uKPV'T9q: ] _m[:͞=CYG3R" ᶍ}r=QX^[fN$W>8w4H"Hng@7db܁az8)E1%g@܍.iC5q?IlaLz;&)N:;#`.0(u ˮ} Ňy\#%#5#9Y ʕjucڧg5Q{ssr'U:79fXynհ\gp~mZ60'ڼ5#^зZG0CWlψɏM |@V`]p `YBn[v1y&8E @e`I䆝bNwF5JQ;Zu\tȬ&)53P :a%]u&]:flEENV5$;ZIF%uTUO5}  湯v|"aq. >Bn.hpS(Ky]bsVwei}q$]Z3кoI9};eDf,#gCׯ4r\Ft|4?l_~5=-w^8mn#O)>#x%y  ` {*i± yx`~Y*{NS$ON'<~ <{>B^_6_ wӔ(nZ ?7LZl⛄&"\uY2񌶈>)k!c:zJSHzaZSoEiE..TrR;h/x|82}ۈ ESg<>wֽOW-d >-9.I}SeH4IK}rW(H A(vdr> e C pNֳH[Y{^ L8lz4nX? F}M]E dRFy% iJ0=߰@,]ePUiʹ0qZe 8$aK5 v9;XDAJ7`S=ATR/Oj; M"kIaKȰfp$ZX7u^

H^c 2.]8ڲeC q U":۵Y,бͲ ImH^{3QSTC*YfP;'lL6MChpy+9`mViRE6'x7#S4)F@WXص>k4[Sܺ {y`PeqR9 `>Jy<'mx=x\Dte!h,TpZV'6:NsHAi>PSN]`v:L)VJ9lf0:< 30%i#Hq{y< qPv5}8=Ld,f͸[ѓ4q&Now{='Z׉o$PM?O@˵,;#C '=>9~t-wN!_/BrѧSup;}>^[hA/ɳ/WׄrB~[mF<&;%>LF\+cŸ4 MW$O*CRjP0!PZj&j", 뜨@|@djQ$ʊjQPމ]HuW6 0Ijh$i' x/|->bCGS} }]Fih[o(ڰZ˿I*{X< {ɞ!/k+Zrqɀ "viKREaŹ|5{vq9*4,y5o6Q\̜ޜ%ИQkWvq3(2ӽ&RS^֜8(9V՛\ 9 1a 0Ŭ?(,v V%C:6ǥx~-%n3ȇUcnJ߶1k`܉9}r @Sfam[l.} xTչZ1מGfd2;If2d2!ᑄ@ < @*hE@Z[k[VZ:}6ч{O&Azz=;bvk{Y5M(wN%+d@BviҴ~_kθQwtz6{ ) 5UxC:|3+F^wx_) Z;ĺKeE<3;4vUyܮKm2 a`KPz?+B\ eךZ^CӲq㪌w?dxXpȧ'&7Κc;).Xq#GqWlsY–R-:o4ĝF#Wi3lwhd rclzV[#8 *p&O%MYi:m6jb;Div\}{3*p4̫:X\ UpwolvC/ 0>έZAfVF^$ :Ԉн"|{%KVᭅ_\nNC(K|@-""|XW_&`0h{eB @Lz8("ןRDg~u(_\;%?)**BGHyGD4 %R^aq,`;v"TyRXMG ~!%ވD߆ e]pOcs: ATTJh-2HFxh5ôlBȪ0L׊"p,v)8k1mO,^}*hOs䳼Õb'g lGh#.c7APFeteViD6L `X)'9(S0N;r#ಕ9?#?f٣'ί ?gv Q׋Aoz=d'ݛcu 3g~( 2 R"B0 #AʷC1U$K %N/*X?~S6'R{]ۛt5{^^7{nX YYi _:jn6>lsJ{9qB e`G<8Ѓgzv,-y^| ;pZPdAHK ] h%$ɸY,4*G >{ϝC/t_ZVfqSGnIΚp] {OR<1 ^y/OҐ40uX$!CoǹQ<ݻmscs08.k._wj,nnytyB{CqԿg7g~9AGmJEG*Ϻ;yY3fZDrmUkkm]r1Eԏ6ǥE$;] ~..ۆщHhސĎ;vS}{4-xkhZuW^GfM˛r碗6-(fE-ǮX伛t}m0zp鹅_ڼd?-d[*1rw]C \QȪ-\O.["+" Zvw~tzBq*,.b%b"*f?%|ld%F: F_ d{Ѱlaha rT6KGn#oḱ۞iy-\cTqѥ-Cm{xT$+X'fW8BYBk.Xk9 ۰ #tIYƐu`ΝD"$uPk$umP69OFV;8 8-{i׵_?T1 vԒݿvM+ΟQ鹹KorZOxL**Łzvj7Ll6UQ /GDI fGk"؁,LdM#CJ8%bSx'2e4'qO ,VfRxbc-Li{ִ=7-xx$e^n͂+;{޴ʝIV qUnZ1#7o鍃Ńbw bAgko5>qАx 8E)%`[F|̲^9ETHߐ0O*&TŐU9G sYMi/2~0E/paSf?UR39Կ6U3vcx.òZ ڂ`t Fh4zdX#'$"BF bp뒏mn4KsGřx3ʏ?f_TMXUF:t:zK10؋ N03x5輺^paa^A{,F11Nz~bK+6u^i m*,1Fcȡ{ 2|hgG<7-p+/0M@mBg$TҎ07TקpFs1K 0*L,Og*UgUGU=ɋHs|ygγyl^J%9/oS"sita2a5HUDd`jƩ 2 '8_:8t{OPknܲnmcВ~374Iya=7:viޛ_?gm,=\${Fw{}u5`~I(ǞY=| ⷛArPϷO1>' _N<6$јx%D DI/?%%_f#3l]G.Y WdDtd#oJ|Z=?iZvѽ tIOКn˷uTo=_nԱ2tܮ.b'ؚ7PAPXdam!C&L $^eȖ6|`6B!D>ꀝL@X&$"JN嚚Xxt683 p+))޼)4qRFDu|шFt;8mnͺh%fToKqQ}TU=f(=bƵ5gcMKYƨa*Pq0 7ianl oйLk18lj<"t1I> O@d5 :VCv_8J9ّƒ룸઒O\r<[EŁ~gpXzR*𿁄M0z1sOL"ӄR"d&d2%J H+f@l[}q[N#o,lFʇcm]SLeJ u0 kˀ^tnK:$r^Ma&kZ8C/cjZ!{|h3|Jrn佳}--WY+dȧҘTN/pWLap"wVT+1ANIy<~8EE3cK&?S̗tFucB2 3dhNMUT .yҝ~"qץhI#li[se7F]ko'YOlGV^8ܴz*THʗQ$hw9^Ǘ+Y`T C+AE &|Ш"հ#U1SO9<2$U~>*UX0NobM/%O72ɢ`ܥ.~$+K?Uɽ?F>=5d-eqbrf ms"C-#Mb0 C0~lr6 &kOii5XH~(7MύܲuhNvyzvF$[*,g*:-hD hxF%6ȡu&JCXn4lhDdߑa h5F\9 r jTHIA:sӘ0թҗ+X2Ko:ƃ7Mg[*ұ.cG5x NL[A~ d%)V& Hǔ.Z"ʳ`5۩~4st||ѠD:\\a55y6d0\m}&܄ La+͸ƌ.d46aKv`#h/Y$ v@a*{ڱ=1utj`xf6u!yKFlqoH˾[_3 ~]n9qzvnwp۞i[AID/lrD] BuH6{Զ _F)Hf_Rۿ-6g㕵e/|ӱYpac .[kMzm=h]*̀@Ml(ʆyeiAG"vk`2ˤ,TJy.dJA "7 ?p M"U# ũm#uSukBYwM:)=GuaqEFfqEʷ.yK6 -lݹ¹zZ[JN3s7(sĕ_3 ɳy|MD{@vnOa~;^Q&-|6lD4'IVRٟ#.V s$$yAXBH hɳXק[1yV&ǵtaSgW@C ,|9j7v>ekL)BD( :aB2kgMZ/i:lYj,m#}rN rev!LO1fN# 3S{u|~!d#o$[x0m<Ɉy'ÃhV=fAns;尛ar,Rb4uF}'7-EF$hS`aYXp͌sGa7pw&c2yu썱Gpf`x~f&9ǘ=O~0ìH(E7t(ȋZk|ҟIQ}})5|j׏!I3(O Pv(`|\fU7_B?ǫU(3R(&Qz${܄0k=(} _6~=R++I^9j%n颥NV-=żbRw96^0ϱ7U'QpCv -{  26 rW"J&lq%}i`eDW}fɤ4=k=_/efy[={YNnwmJZ^ٞ~GF,=*8{4gwǹ? {oJ -]Jp pt1]Lt1]Lt1]L:ZSR<-J飲eA,C ¡f jDiBhcT1UUK΋>X^\},uĮRSUf|gjs 9=8}ͨ@n?=oYMOսRsH${&b.TK}Y2 KE7Ky1)0 ̡<|_5G^Ơ$ѡT`=2S`O `c;R` "JS` XʓQBZƵZ }dW`g03P`;P`Y/RXK~Oai';]l3@dQ`2,_e˰/2eXeGX ař}B{C Ka# Fa%`U`%RBW*09_Da R`PAh \@W ;|V; ̡q > |iRVtoiC$xR`T'ȴJn0 !_79 {QT0R8C7|+`Wn.̤5eT*(NDzhMJ{֬,(4Qu$2ʳ-I~zd@GpLHiՄPwA_~=Ғ T m"TFhI?a8A;Y9jzO S*ez([VRt~3ۀ7qD)Tq|"&ytvQ zdg. ڣַ^lbTOpMtxMD[f2 P{?D{K{S4-YB[ +cҫxmIYYAE[(H⠎ɺs5Tz:=픏I9ހD gzS0G_6B߱ l{(ǫdŻ!jq>;?LGdG#IP-ˣHտEtjrmL#qk,8;HPcR.QI-~h.[J}F[!ڸ$<͇}Cki6v mJ=rl8nVPg MO1]$j=@ ڟ΄h{[x6(Τ<"-6gF4G. bLJm+eZ)2V2Ȉ is)6 F(]B=rt1^3Bm3MP%Kj6p`-kLe\RZ̻|LL8rnҘMsKHi@ecj˩&Z3)ŋ@W^N)٦jcDnE-_HB{{WUOM}87InwEى3u0vv smf2̌cҿBH|~{lj0aG%ytvc ڒL*2M|.~#bo5"l{( w#!qzOU7z?-!U^̚Z}?`RNWFiR04dF'"JE5#X\Xmy£ %OĝJ'e3\J"nG{otƝӑk2N\-I6o鲈bVcfLZG;5]K#~HuӗiM"t1=ĹG(g2LiWi=!N`DR'n" =D>v"к1 D' ĵcLDcܪ)82gIoIġe3VF}x6aJ =2 i_JrN6y31ƳvG?uA!CK"y#Z=9 z)T8# d<} E6;OaYWT!A]VExI28"呿2 8` ӫ"fX{\½qԘ|U'FɨNmr*yrbE.ԍNߍz1VQ 'F q^AnKdLJ';}̈~dY┷V[K"Oñ|4>wO[9 7~|;n+4$b˴/=˭P p(7,J lHP:42M ieĨ/O`0F(*l*:81UOCm1I`Qp DJv+-2םp4bq`uɛ&IpU-j66ZWL"IN㲽n3eb1]jlYߥKv}Lg٤CvͶg+uIkWo`/j+DVmYNKsͮ٭2mح:܀PMeWvjC;viA:-֖Uo-C+Ⱥ jVZM2w`4w{ڢjns͂eZJUJʹʴnnՀGe]Z L|WZvnT2tZGCMLc7  'F4[f,|Ӵزn5jI78v#J"͜\Or&0m{i/fǩ 97D9Пo뫸%5&geY_Oߪ?Kr?+߽J%1:?+=-ir2? tuNuOr_V\PU 'wĹT ճ<Ѹpּ{)3) .Q8WXdR ~= &Nmew*›K="z4'{w>@o˜û0kLڻGMGL4CʮՎf_sFvW.k^2qJ?~Xai3{eI^.2ɧЬ_^/iW5=|y/_/_7i95]/ }ZCЋ"%} o7A-Wx~[?#-o|r~x/@ߚ{paMu}wrŋŊ׋T};п/ +KJO`mt4K~>h2WJ?}c>?w3ڇיXE53 +P5^4ח fрFqA43Ư#.vQn|asTPpOCO~F> endstream endobj 675 0 obj [ 586] endobj 676 0 obj <> stream x |wf2,@!x'L$!NVBa3$HH¢o t\^ z^Qh-Z[VZj+>$hs?ߛsy7 M1*) iB;cikBh=k+r*v%+honzNڇi[m*xTh1^.\9vZNOz׶5=a !MbkŞk+[.XBdلx˲]d45x'GJ{?I;i}iD a-D-uފ!*Đw{En;7x7|TU'H[kGg`h`kx[{CץcG6c¯_k/wuS iDMźSN@cOeOߗcHaee"na҄׮ f{%ߖDeQ%&*)Ő/, ګ5B'% 驰 ɔ"_/oۆ? >|6 w_ĸ۶>o~6 _/|6|v'!o|v| _k5| _?K,hEԷM;SbEhw!t> ]ܪk9h=}#jÅp߼w^rq?]}w.`͛:;7nXrƵ uޚ֬^rzyUeEҥK,*^XpuGE"33DwdQߞWN{YudO+R x}u*XZT,*w-ZYQTkBcߒWQ/Lէ@C͢ӆ]N(껅5~wb..Mw%5y\E44:{bD-RգW+Κ"f K_鮭uYtj__q%jӼdW <$ge.mײn|E5[*Z4K^M;UENpʆX.5jS]ϘvXc4#Flƈ;8F2fO4g;#&jxqGweXȮp׃D OfWfFAeI˪^A$j˦5 j9& .g!鎋t-Adդ Ib@Sk:Wa S\ ? 骫rkkҹt %+rXS5[6_7{?ՐrF#v9kf_Kz]^͕mh Œt|[$I%N/y뼲L!W~ϊ0&tzP]+wqb\S]wvΓ)Yi"3#:"s>n-Emyz_kշU,Sߚ ![¸dgǠ(UuK'i}&9R9' ~|ͦPPJ M6ⷥIU'%[<)^Wqqx]u^Y{tᬮ(,2[Zh'~*)Z[[R;RgYSC/ٓ\eϗWZ!( JZeKmX'ʫ"s&2i~{BO[@~NoZ[ -a%Ua pTZQ烍d[Xp_9GZMUp,8cNj/L ,-r"O}zӚnLv(XVV/ N W?\lL[FbP:Q?l*PԅUro6ã/K3ѣʮ<FOH;R ߆ pt\cƪ5rlROqKJbOp)5%;FrR3Krp (̝(Pз;R+RXMD.|IH/wYi]Cɓ^oIEr-Sw+Wr8u *_TOB\ vA <8w6<$-;tGy6EHL&ۏ5GNFuT;Zb, A֪6מ[Q^Qy5Ғ$JnvKKҝf48(Q唳iizUR1*w<b\1xr깉=}ir@_ }.8i0)/(\wn=ݥ縳syssfWFYS3SVMI'gTOeTfDIX>&J?kX}RB@`'RԔ.=%it*x}p=y^ԣu}T@8rl|@O +Gϋ߲r%F&/Y1";rxvLe'3$;2,VyZYmԲEPOlG5RpGz,auôE@"t_O-<rnMsٕWהW .)-Yt.wyq-a.ДgK3uЯ 8m"ev!'Dݠ'xZ<&yZJ<"~)D4FOfRnỌ>qM4q֜C#<3ђs/]^ou/cgx]V?0/`8$r_<̜7Nku-m,{^8(B&m*8YEX7v"4KC8EzVz֔)S6t=]ĭQٱfDxiYY\#e͘>eϜ ?Ƕ0lۻ.kE"ox"8-VⴤS~CSԷE ?"q)6 tѣ֍mow8lCnZg 7̚&$5lbGaùe_~3w^vm9rjO5iqZrε8Yw-ԱЛ0},6dݰ )cbb1{`69§k#G 6={*< FIrʹ-1޻?5]yL^1:e^\*k^iW|H[têC[n_HX#w-Hv #ёf[:ۈv-@Gabg>\3oy󫪴ǭO:-$kuw ؀o­)DްF[T}&[hŽp.9j{4fF#`)339Lem̩Ǐ_Oq?k?;{_=|Q{=|go״iKBƗ|TkQUD&Ey&i^ۅMȿ]fY/&ך#0-bx׼|qymy>8' kHƘmyIa:Bi/QbyzH1Ӽ*f؃vZy Ə6PtByqED&~IlBym Lbkp$,ohnl,-W EYCol綶ԋ,1US,͢NVсq.ԧf69S(Pzf汮^Z|}Vsv؄/+ʖs8GK1rZ:2OQ0tlbB=S!"{׫ϧO&G܁lTM ]mS;7+&WST k[Tg4GfxˈDys3N6wȲeUښU]:U=j7(g˾VW;3 "vצt}ژl34mݦYjLUvnQUA 3zֆ|ZqkSzPx,7s*R[Nu|S9o6)f\Ӣ&2ߒ&.i7ljWkWLT Յ<~]S8Rk==[*ハ{~jPqi5? M*k6`4zT~}%GZL`4(KH{kFl#$ -ʿ-!:CƫM&Ʃ\,%|/U1#!\NϏu6U'·ĭh+!BFVZgM#^uj|Uy^Beɒ.PZ5٦rYӮt e\9FIi )*7׃)t{FdْCSX+cXVzU$BN(b0sjLj0Q;9$iRh2% 7̓AiZv5I&[^}wꭧ27|PgmC {+1֪\kmW#͡:S2a}Wϯɞ3G xۡV]YlTY g0lUO8}K{>4wb掲sȻ݆jԯQ*U˘o gu뛷 İKFkmYo׏՚5%ľ/c[/vzŌYo :Q8^eC2 z3/x?/V;o3,׿l=FbAyn~gqСd2VeZu4ո4W-jUcD9ȃӮoW3:婴` t}̒~A +jM~ϕWA$ CmD>qnPw9-އm293ͬ_#WIǗߧ?ղ5߉̘d\V~Na,nqn}B<|Rc܏r^I#}{= "xGl0n7`;BV7w5{W=krTkR*tfF 2|S~jN>`o7<U,:B5킯 uuꮰAOl~ܷ9Ncnfd~{3Zͧ3zڔZ۪P64oRdŗFN4+Z:ϲ;WTIeQ16ްv>Y:V&B_3ר7Au>zJSglЖ71Xz^>"g.WB,ejl!}NhOo>=QnWZεԸTT*]2>np*NՖE_.@T= Vf)݋OY<"Jz/3[*]I[ K+ݵU ՎA*C9J?C!%,4-QI꙰U9j2>gDÎ|%ʇB _ F$ .eo9cvU(+N '_.ReK(^-M, ;$U˕%AiSEDZP`b/Q+ y i_s?q E£D./ [ؖg"h4mDy*V2~صdNBFH{0p1?ڥ%f B]t&*UY9*! U.6-ã`+M. Y`} a ?]ZXB=rugt%rU5s_3U3'hħ8ݼ/!mh%kd#-ȥȍD*xy 8dR""W!ȣ BXEnǑ9<->@|dBG~,ݎT#"#/ E Κg7Op8$d2~؆`g9!"|h}$anTQj4̍^#!LE!= B^b(CvE }9%0ֆ\"f{kL!œ0'9#W\Y5G0`7=q817q<ȃ6ơ+$#p$3_F"ߊx> {G0/}F#؛O`xag!x rDt'# IK$N"nI؝Ip+αcs,EXtE85m:qO'v2D;; ,&dbL_Axi<8N'">dcxO \)]`)O"`_Si:HŇTpHŇT|HTlKŶTlKŇTlKÇ4֤48G'x:uy"1ȻI`1 =$,tl 2]Lp$vp-ebS&\τ?LtMr2~M)O*L%Ngw fYi1ȂY)Y5m%dcW6k:맳f.Sg~4f v3s&9= V33 YԼ6^f6fcl9rj~\ .sum>K F“s@{`cB9CmɡPGrП9#\r\pϥ\KLsYK s1ؔ\xw BMǟ|˧]@ K!] е] l-"]EĽh k!u9o-GcJJJث3]ѵNX.Ԗ%_ 3Ke)8RoJK)9Tm)y[ 2_=2p[nm[~2r8SY/'GPqd^g[kȕ\/ؿ_VUsUco5\0 _IDJ$е [WUpp^j8j[ /5طo G=; /12 Ղy-RcjvY7FS#9H6b5 g6a{6g3Hn&0{›&D_ &Wvg7~&gvSoo7-363>ʚ[!2wa8Z{^R{/g^xg{i/ {^g/}w؇>ruxfRmz_~}u; X| +w~~lnɜ]ͻyx<jy7~͹r7>K7Ĺz;=_ ğsփu{g=^z/vK|}{ܹycG @?`+!σ=ϩ'?C!;v/C`o0ׇ0p0vN,qq8>' _aׯ֯X`$q{ ܟ>Mx|~ c?`3 ~>ϒbbsyys_` x_ _/ϋ":^xz ,^| _oEoe2920y^aW+z;;<|^55 k)uly^G{{ 潁moN;ě~ n@)65mrԳwcw៸xS{G|y<ޣ}>>{OL7rcȟ՟CЇԁ#B}DL>gGԲcx16|)/ ,`'{O'yjΧ\2g9|S+8>Nn}A/5yDh4d r#lvAD>l(T!#Oʿ0f/E!?E -<B7 هw8c1Y[ -ba|8| x$GA" -ʁE]܎Zxw!";_0z ۡY߾ #&6bB2 >#f:Hx9N#%I!iZb¼$t'o$=ױ`:ڸxSopՏBhp2!\$4|t{ v -}wcDx: >O+g -=ŔdB3B Z~d m2L) m*8 wdmB~)?Y1fn&dn&bYgFi6}!œ8lj4!:^!V9K 2kAD|ָ%rЕ\k^2<|˃$C>W{ p*B,!`-3Es,wbbQ|LhXEKS &ˈ2TFΖ1 ˰ef99U>!_++wVJG%*TUԏÇjj^5U<乇xJZ[ɺU<*^ Vk2}k<;;j6RKx7`Zr]bs'wZ1qz7{fN|:vMpy3>n-`u. Y{!~u_u}Eb jbb㰙4@-MRʐKygv~}d-M RB IH !q:b 8 ccK`lldayIY $gk^{r9sOd  pBJc7b$?Oa <[ _+ԟmoo`g^|}&{{c9J1bmp/Bvl?߭w+3|ߗ@KoG};;eXWk5:oon{<{ PQߋ^#w0~w1=_r!N??0A~8W@a>1GQFc8?OO@ `ՀOA?|m>πI 72 d^GxKzK-2mRhN KaI UcH.:ׂ>8rd"Òt@ޅ+W7ϝ{SQi0g7u)%n2(%q#kzAF ܀gER6ܢ-Ub 6\-+ae}-xށ9nj%7˄B41}”)S2mE._|X[o/cO?Y_!9vt|˖-e"zv2U&8_gŅNi}}]]ݞVYS/75Yʂ4hz۫NR) _"2EQ<-s2*4uԻ[z= ,4*+Oo~wlA-:9ɞ`OvPNev^wM縒EfXi-%wu*ZBcꙔQQtM/)Je!Ip8obBLDe>ܴA JmcMi(uPZdͪUtb&pd^zEﻇ)"ɚrx3#k5z}KOޱ6b0gcw0;v;vT3ˆxDZDq[7mڴV1c(=Xel 0V}^|QqZGhg1qtg'bƉQ~J {V~^KsFF3]?ό7̋'KBtfaf1ׅslw$=*7,E ;VuB-uF߿u-Ŭ EvFGT[Cg+mڤZ2WRrtϠs^$a`ak Kڳ,:{u)axf1/yQŞ `$#X3WŖ}@2PJX7]ḄzM3'T=@挪k`Ho\{i٫jk֬W'~O(v|2=ɺugP x+%3R ;pPֽBaPTZxt؄ R-DZM\4мd蝺h, V 6ّd6?sx]L[uҥӧ/.Z$yG,:=|/8CDGIʕER葊2@rWlolae:yܔYGRuմ m2b l!-I UkpA;2CS-1eRf@,u<ʉ܌#VOqݸ/ʩdvji!K4]A.FϚuPl~bܭyy>_ Tm>u]d{UMlenj[RSTۢ A\ ^ |fyۉQm1|_}ݷ>'(Tuǻ6/Lȝj$yDCt]ٳ++6nS䫬r wENz$dg 5`v$Cw Id yX;LV`^ P5,[pUƆ[hF[rmm}`۱X@\AE{/T% M/W+KM?.IIF(e$-oy߼_'}HTJ&RBy=Z>ʠŐfSE=8Oj ila[y۴;`&}^L7;v9ZVص@pz.76cB ď~BOhxec!%VUBp/Ⳃ{ԩ m,?~<: 8" S]ϞCA{aPwYv.G$4t5ɛ6:qB ߝgSMǡ|@F<_;o bt-n>֍0jʔ)eس\i:.(0k\vYx֒&,b*S?)"۝p'X >/mk q3m޽T  ~,~WdIgӵo'u/vx2F7b)($S\zQ̙%Edibtv>|9X#=ڽ۷5k|Qfb1yy?prsefMԔoٸOU,cGNr?XQT 39rVh;c3IуJʁhByP虿ZDHY#;[n;-:TWe v(rR,߁]vO2g֣yWAh_YYYCl8,@Α3{%Gqa=z:Au*%:V-..MĞaCnaU]u&쵥2Kzj0յz n C=PEY95x[F|V~GVBB6p]d_@PW'y}m֏{ۑյG{رx}O3_U)Nw*rJܗW} 6o-9aHh8ܟ'YMzA\ t%w&c8-NKl;B3`r=֋'d]>=nD tUؙ.k;ɬ(;ŏ{g㱵5=zYcǎ=oQvwj ީh+r?&&E/=W=zB`ڏ. SgY> ش'9=}p2n~E eFYz* qylΝcטmX[KOh?pN@x&]ĸ]}b,߁=5]ɒl,ܩ]K]QE;56sr(ϙrgh)]bHc/k)))5"^X.׽z Sٻ{&te5+O}NuUMOWɏ^~יugDVVc\ڡn |XaΥ@MMM ӫqp<ҡu8fzQ2xM  ve&?o$<1e߾}4zs c6x/RncYWMVk+ms93fdӘd" L֛?/^P| N\Ǿ_2;wݦɩ]jZmوQu9XˈǪߴQ1ؒ1c%ESSG 8%}- bAQKD̰ H̦,rВcw֮]񔰉wz|յ6+no_+=9QzƷ~ZLdx̢/3sS-aK~'G#Y 4Y$ۼcp<ٲ9ٞH"Mq:VjollEȶXH4NJe^_VP3dZ\2ԕn6miNC[2jekqq1}5@i`DzSUs.5z# Bi|󊵬reTzPV&s].+J߁}Fp«8/U2*}[ d[bq i4eY7Դʂw=N7bć\JLf6%~ә44(ٔخoUJo}YA2 Vo/'MTfI;e}}2X%f?.kƌ`Qr˖²e[6( Qpm`2SM2MR8S2v U|=+.2h\gFf|g`-Bs /p7'_Nv ^(=%k3Ӆвz8fraĦ W~~LmmՄyBQт,/a,7-z+"k{F/,m ٤gn^XXQ$sXɓb%~.sf) ;w*ټM=}iSC%n)>,q!:xSq17RR,5Kk-JAP)"5hG>n],ZTaQuNV=Y^n4䏧'rRUX<Ҫ]Saڠf:Ϭ/d:qF 0^f)y<9KC4}}"%g')Y)uj&r$|G mkTvZb<_@n짾AbK\O6Vo"1; g 3J*\UuDkzؚC}K;'Ȓ=:-Iokzsot" Vɺ>Qt<&C <^/KǽD0hD0vvfAI#}ؕ[\s sg5?銌,,,W`ѢBk>>r4FrsKS>W.a_/C h350O>DCcܲf-E/^an|Ii0ϊRK#3-E O'L㰈[ǯTWXl7һ82R7:.eo5a;GpnG: r7Źy {7,;Ϳ6n6MS&[{'8VFi``v-W r(0k :X&^c U p_x.@_?CK[_&2u5| ;*y 9dM}Sէ!n=b;K'>-.έ޼DWJl) +17s>r9J4E eeYE_9żw}l5=\3#Jfwl;uҥ 'ady1O/%00 S@( r"9]!Tf}(`ua޲Lx!V "{0SL`!pvThjz\)tk{?Ñ6,Vʧ MjId?Ʀ&A`URL3zV9OnۖRl@+U"3c'=O˙ (ZK4QBSp(VqI!Tv2+sS4< x)X &F.#C{%4:23;$ J4A<5wp*sxcV#9d5F Eg54:H]a 7n5dH gqCB|ؖ @߼M3V~Aˁpjh\-=My]fܜ@{)|y\J7͛_YuV\n==P"r"b@?$ ?^yaL#.!Ckc&ƾBsvT_DDQ'WYғnhEv@غ-6'Rrޡ\s׮]oyP#/B5Zi4Mg t_wJtħJ\=Y\`k][6Ᏸ$aXzDžVʼY&ٔwdfvtHN ϝ>AC]]yO6{6 xwUzXke*_{!5- 胏fe Oww(JW+*@)%oآt8U%,с,sJ=ק?[38Fl`?*ǏF'Hٲq)M s-[Qܪoxlzm[lw+Jb]rGMG+5&8Pe8AkLOG) п~Xj)Pp|W>E46r&S#<d 24kG.>jɀDbc".qS6)F_jCEEhO5MwޱdY򘳠58'ܖ7,Oq4cQ4L)oM7[Cq&#yP4[5z+N+9 }]gY^EaJM@(B/8N[zVN;2t{dI}*NbupfeZ^˧3{d[|az0>?#s`ˢakduLMOg ٗ~s(z=bf\2٥xfE_!wUp$;899 4+3eYfBTL<0Ǐg|AWZPݻY%K?/}wsǏrk$O]\> %ëKXU4LZ4#INV(IFҰJn錺1o5=W1{k=:--U(E5輘`Kr: e6)iu +i xC6.f5JuwW}yi5fE9ů]WqUҘKG3Ԅ.;pS^]6L<;: l5wthJS~܂bC[x VƮ,;UFAnnnzWLM;> rZfZ"+^74}-}nݚ@*W2 '"Σ-,\'%E8q,5;`%qkGbb:Pv&#ÉNiTXC(Guv9EF'`ҙSNQE}jNwϼe˖;PPCݵje.Ȧ\E2| ojomn֭o4b94>QCO=CD8a"nI47ը'`jO6A5TRj Ga>T gj52eRp`ÆMMT0C55baL8K/}-3Ѝ-3암g.\F[+\ F^j]]e*}䡇]/ --NoQm$ho5lj౯PVaJi6s"7őVq&(#Fs( 37/M@)չ/\Yva ˖-s>89ܥkis`0W԰)uЩh<WJcR]] $[V&yɓ ed.q:G )8iRg'Yن;%tIgFFIvDŽh*:ue=NqcޅO?S[R+*Q ͒ZtmmʕUըsIx|WA5VMrŽшVXzseN=}5cD(_y:_c9}HdG8[ v'Ʈ@mm(f%(r \`TJV΃[3A8ʳJH1E@W+,(4PI,44%KK)N¥ ! $*{du`4VkZZ j4œtR6YeĠ3> X %9c,4"Ыv;Mo ad@y[ЯЫ7`d:_G$5Z\yMP?QTQ^Ε>+ÖNF -*q÷h#? _C~0g%POf$ЯdCqqqF!"`DFqxӍSh>IjP1ŭqm֡zUt hW_FB[<| xCa޼*"^@}QFYYI\Zge&seh\3߀t. f̽ƀb.ߍ9o3c ('Qz/q]c A{$DIU4VmBuQI<&zVH-`εa6"z닶pώ 8FBJ3)W-QKT7ޜ>Xbsxv]H}$̘LC!y>٘#+NPz$XGI;C3EJKL/C[:"KNtiUYWJq4%߲-YIѨwfX`u r6F֭Ch22I;;E>@WzQ*8]敗իs)OΘl ax:~*|'`8CKv8vZ"'JgC[GE߿ &!ݒ2 0Uw2O{A±8Sh}"}1[vu:tJe]*yeSZ~%ضoG5 y>ʷ/Muӟ0:KT򊩠j9yd(4b9lj01k+8OZ:86gR9e|*iF.mURƓxtylnlL{;ʖ+U2tI$^وI.EAÛ s|iQwN- jɲ 5x@\68z{1* yk Gn0[)ZG/~[T-e뿩Ɂ=SL߼.,]zLi+hvk_?D8vs&ytUWWZ&ϠCV"k}I"[%֍6oF>Kwոj]t%.]]kw]7Q=裹7篂<$D@hUNrѪ ) [/eMf􉃃A19{FAEWY<"s Z_Q9߬6q$r$-z?Wy[e} qOUUTvt訬~ug jrWT# b(:XM7dsցo|.BtyH(KEvP)FG##YS]X +'8e-zpZ/Y S!}kd_[􀲨@\#NgphBO/*$O-OC#ʭENߐwȷш8MHy:Ddd  .͏hfN-gr%ǸRRm5143Tx'-nWeU/1:11#$7jÆ K W-ZhмH(KXf9ϔ`L9u{,#'rwQ{`܁J pdd}=~IH۸`$}Y0NtymLVƍ)f*hfu3 2zfWW%,ݵִ Y+yehNE k?ͧXXvrwsZ\0ŋmE y&/9zܹ177s5sO6CGEhfVµFwk*K՜ xEm}˔E3 q6޸qe1[Hb'f&9)o\ҜώUTWsp]Us7f*쿫'pm"jfTh-dfބLq1 5~[p!W EIR7DIFۊ.Y/G#އ$3oD$_݄B`P) Cǡm86"̉4Y ѢZYz؉RiG,A1H9Ů].a&Pӷ0754z/E\vV?r?Ɣ+Yj,v7H0vex}ퟶ8jy;Dq22]bRf٢j@,R'MI# h-U Y^ƒc4nd`FcQJXY@֢҈kQ* b|996`4907:k1cl1R]/d%[،4DBNu=c:'4 BN(R.+ґvhQ, XvLd%:3B11gA;mxP;&PygUZOy|܃^m!tr%a0&D1\!p|7A|S-;O&R@wʾٕϠq_DLh,$mI2c5#XZoQ j t{ڇVߎ}ơCKnC(ڸw+^=ܡ>?pϏ?3셲(%nF{Ɗ 3Bw2N4ˑBߓ!Aa6gxA<(i*;;=n˖-^-l߸f,.MoyiFHe=iFr9. 5)s1 `v+OkKS&x4!ͷ#sd-Yt;%ߪ4#G)Ny %%z)DJO0Hx7N2Q>9ҟ$;1Zk֥# SkǾ3Y6Iv[,l޽Q)?rfĄdJi@"OʂdRo k2$ jNoߋZ imv;}x J+rI#Ə32_աqUW'Ĭ+Y\d/`௛+djQ+i)C(?8@iN 7Mlz'̓]"KEN$$?s`y͏=G~`dYAW>oطax|Y IXsTZi_N*|,v =LA**EE&lYkʡlkݺSC Z씛f%np/%5w;?I&J "p$Ү݃А54Q9,UŦT =̥)?{pv+n~!IO=pٰ[*jϱkXI@۵b*y4$b=FSؽ!-)0|=h;zJ!C j-E4c~"GG*-"kqi{u.G3z[Gےe# ƶ0 {J7Ii{v۳Z'iioI8$!=$!%i 'dGd[xll26=s35ڏo{CX|EY*Rٜ%Vhےa%^? r?_(Q  ζGrbb1y8%0䋏vRV`@W}_OmFGk պ+~wBPt FL32qqQKF _V>M0Hzwl}eǾ0qߑ?IR&BۗU0\ D0. .P9 Ǯquh{{!Q$]-e{<( 1>'3.LM_aШ5X8Ĵеӥ!ݶWa)rѣ OJ.43+**hdݎ}7aNL;;;kr)A`YR`eW΂olذ"< /;vaܘ1o6Bx\˶"HhlQXȟ Ϯ@Q*':+9_؄{OQLYw}gvEvjub?ƊTWv qaV{R2amJn č;`N ֚<@?U1OߙK4YSg%F?bT?HMd'g4T/Q/w%R_Cjpht*cy"SwX7ܕiøQ8+P1T4 1/"e{b֭68Xa‡`7=S@KC*[ꠎ1[[K\9vtOh9ޟ8 Ɂ[Ybԛb5û^ )ai|+>QkI*fbJm EK2 53R G7uq̫T |Wo-B:`b6^37H"7F鮋O;X7ˑ5YM> dd2.eEL"&O0Ŋ+ T/,2RBRѫW;S2-`8n(JJsARw;txoh1+F3 1s&tqd׋*s G9.MaN~&lv&fǩc@UL?&2F1 0Z{DФņɰb1[GPA i؏au@רI:fuOU2cF o Yx0YO>y;_~XjU5ĒNdQۭk U1VWbIDxKc',|ݡ:G tc3`L/'%]bׯaB"<.~lthh` QLN4r뜒!r.!j7hB]I>̋SX,En70E.\N/FvYHkDɪhinfSBOUZ*fI߼y6جcv7(߇mqY$%<Xɩ`Y< $G~#rJ:h׉Ğ2gW;|ߟ^^,x>A3g`;Zζ"yc=i"ř:} qy{4}L O,#,Az5ih`T&Rf>'FLo<-`_ apgnjpa~Y[$c nv>U"2'ضM.fTXʼnUd>%%&-X;WA77f:f:TK"yZ{PT˗D<2O$^W\k^XVgţ+jVᒍ.W~ n~d W8-&˲Ke ;蜽!&YjgA\@5_NFنHFYB(.d נpsIR& _ ᰡعw&:JBɕ4vUIFuĉs[Mt烂As(T\IR*t @VQ,'vɣvULإXȯwd\߽;ħDN zק-erT2H2Hkk̤wz5;HSČ0xj}4ydj19Ie<rM |czWVB|RJrԩIL1Nhοo߾Cian>y{ؙ"#W\%β\a8~=`elbϚ EȪUKcC$_$m:I u齼YͷUiX`cN&@10фr͸f ]Y!]hЂۅЉBѫ'",(~&jT#g9qº`A%`!,3,W3Dܐ&W5`Bn|ꙟ>b)|$E@q}Ju$\UFqJ ^xOuʲ"kCev`4IZ7K[ZC8Bu~L*qNh?]#h [X˭阳Vs{IPrk#%UvJ/ 7jp0Lr!]괇;3֨aU|_K_ oty햼%OR5V+/d=3ȴZsO }wnD3W]Dݜ|)b'I+Z*֭K_'k 0'f-tiZ-Zdu}~42SS-f-AyW0_B&w `$݁: :Ꚑ\c Oot~ e8uRTuDrYvOf;Hx:o `-#`EU3iv~*@ǏODD]$R\LoǬa͕]Hʕ+KOJ熆_P\ hm6 UHrJ.HV+.R2+u=g9p3(`vQDÇ=|Q/:=dŤRyRTTē+|ݎAYQZbq1 vn\jkZ>u3zt9DbY.';,gՓ THƴk2jj yPxB$'.Ԟ_cj%2b/: >zd0%:|UU`o 赔d%^gM2P!=ۡgV+LwTѨ*G1,];5Cp+üe>uz")h(=~؅8x7i$ Êo8P\efLߋyT ~lg¶㨏謺 3tb?Cqin~S@$v™tn%xci '?}pfase5L51ؼؙYzRf.= z),pO"W$;gtg "#NUT`rN# 㤫όs‰ %f#99$U\ƻGO#Gե%8'3g.;f&NJ|$Bn _Ğ's$ށI(Q'~6Jj؂d:-$[dmvLϊ58^L7  ~Lyu|tӈړ:o)yj8BgS+fhZ7Lj6l77qjtɰjuq J'7:@ D|*AZaZa:z;Ms5B̔$Ff<-j'`yXzӝxkv}d\Z_G%uJ54d?I_Y@ lP$n[R@aꎏ)f3 EN;p 0\qF|]Quce.fF7{Wxv'I.((HZ[;E]okHMAX.\X}#O=T͹>eEOhDNɰu[-<3;^_G3;&+ M9"Q%KgJ/%=ݚf7G-Ip{dN>:tH UBz~/R4̶=wB{_߲eSz.+ݗ,鎊e7n\w -[[}wɭ˩=~WEУ?5;OӮ 4JC=So{!Zt)T- 7@HK-0q*z.Z?2c dԪܟBv])΁eI쮏2?."4'}v[`b 0DdlMhHokNsH/?oO:}k LO4fh[6_Bf@J]Νx}gN_ M#փ$WY͵>:ɲf" f10͸΢nzTr> YHa1_|[ȧ5PNߢ\ q( ሇ} Df$-;vzc19XLTβɹE% cWI=g旖E(Y_<9$UOq($%-gB5235g89A67رEdL"aCIdF0[N}6:rO(5r/ Y("D9NEߧ\&'G*!%K ;wwH2t-c3~"hyD |A0X}0+w6i?|W篐6;Wb?Aiw̖hJU.Qɵzmzkj?10'[ZkkPSv/\z;E?^whh/sy?77M雗^~*+U7S䓅 L?>񭼼o߹O|Wֳ'Oölۤ6%j$!d`m%n+!.VBBR,~8RvB!h!YO+HԞ kZ">`Jfcx,ti^m :=#n.Y1OA*cU{qs+c1Wͨit׮]/QvI- d;:hasn%~)6F'H+MAZ8ϭ#e3'er 9,qVW#U:A0+C _֚5_c딴Pcc@(C$gϞ2~{|tdʿEh)H|Wl⊥v/{ۼhC{oʻh5OZunHTgp<}9fRbs͆ zzzsn|'8,qbԁ_mD'r܍Ѫ8x_tg2ͪz{g N>}K_n:AwCN5Yy9u||o7%ON%gw`xي}}}}==Օ==7e5O'Hhnu<{п‚iC"+L< QEhe}t"M L䆆=;:5M1c{#A"&|M;2ȍ;xݕd9~#bfR~I| $D$R@D+Y+HgzƈƁjRK)RmO2~=J#cOWߑUTkX$Lvz|4DC޿?t8NOHcw4 q2wgıޤv5==5ؘQOLQ$<0`!Tad%N[4H-(uX =:s(,ୢB[v"H1`^Q+|[HVJW9$Dm6%ߙ >`8V}b7J8#V-=4Z c#cb( z+#8"jR"cRÈ-7UŠ'MMu'OROT` JcP@dLEǴ5\;2 9Syo1_LmsnVMtvNRgv))v" q],`獐=CT~pb֗tvN 9c)0a_S{P2bS=_WLU("4FafׄDcn)ohd&*_dDl$[7I4 n;%Xpt+'h,z->DO5p'~#skB: Њן,?3IikkMMML8 (\2))sL_~rj:? uW?)T:Z {`d /qѬ}7\h|}Rom8ơEH3CiM)nA翎kcǩYt*)FV$1jXӴD#2I\"9^S..h瓒9$o`svZ!-q2q*bqџDb:^HTu7H&f u#3ɫ *V+=]wN(Xo 37cffI$3Ө[Gx JWL/RKfQ.u+תh4H+ ~~CO<'T'vh[o`{VC9s,8wj}i[L7shԞ9rݝ{ESlRbvE41١t:uwGh#nk[6us*itzsrNLљJUUJ4ٜƥ㜥PlΓiMb\|ϏȢrD8[zpRp=jOXӰrL\T ŢkZXx{m6,M7o]M[miv'RR&2`Sq0OF{˓De7` =6&WTa" !a/K#Ǿ\Z/?hjy=γKBҧUAzVy8|1ܨŁJKr CzB5MtF+??ъ aN32af~"AEx%4J`fxC= 3?DqQ[1VTţd+ j8x}d׮KP?a_|㐨!>z@-jH (Qxɭ6J%[ȷݚoIVX1%w_JJH)!7Of -G7Wի>BT*^}$HF:òSP|ɲyM a4}BH M"sao˴_eS!&)G$2Kȴ6 Rsohi]zLrؚZl'kUZ_ک0,A4@u~ eiNQ?_췻T<97T&Ih ~kg뽘Wd\\<ZZZ eajZJJZ&DN/sAam'hfy>uNgd(+##GIYee c鮳O77;JTn&_7[vI@L:m3Ċ_6mߐbݢ,IC;ȼׯ]i+sս%e[x !!&t) l7anJn_tVWW0y|ۤC;l.}LC:i2KPBLa[ dm=aytzsy .Kcÿ|g^tW`ŝw޹^y5Xa~-4vj'7p= WPf^|w4YWVՂh/WBPkQX[F[Σ]n27xR[-եnj]I~$1:ؑ?k3:q. \ b[_k3u*Yd=k#whZ< kOO5ahCVPpH[oۡ 21 jjґ̴/b]1WwmS_A\ᝰ3-:D}\QqR>;`eu Y뇹",ZEuׄ -B ^\SUeH'|3>8Hnu49rx pEnT3~{v?#F 6ÉY^Y?9]ɻ-f-O%U}/U 0e4dM}:uKHu8wGvErG= opկ-Sh <ƕ[E"܎ wvءٗ^ݣihX9isZnwgnϲvhޖ`-O^IZt5Pxp$4/"/dHV,gYA([xL(sNKv,O4 51'CE%b?%go\de)?P9}7 Uy4=7fkZqmEyaYo'h7wfخ*^(N$[mT+&5̻OpL8y1c~%g旱KӢMnJG_a]bP =iM: d0>%8ȵ*Z^{}ڭ[H耤)^|q@)ۗ_|,ϕ 7"l+ěKlZ@#u*18d,Lr力VDߊLK!Gij0v4 |G? H4CMf,uv&Αg &+}>&+EK[ߵU<&B hF(B3Lj_/+Ҷ>/OF&tlv]/B&mE@WLjmbzY,WպeKꭷ8ȍmKkն !.\ИQwb2ftcIFdp?7bcp#;hgR\oN9C]QOZXz.B'ݲeYV7hHܶMlƸ(ȝ/:xd2ᜭY̎$7[S ,Ⱦe{СٚؖGJZ2y~s/65~饳۷ξIJyrDAŷkM<|I4qi{<*}`W Iڱ?3X_d|ܱq}+X꒓d|*F)W涚c^(u5@tb⽂<.uO&ۮ'JB"O*7@ܪhҧ4}O9&';-n;Z[]p,7LO"l9]5dZ,.e+S Y1?#/pTsnlxRA߫WjV S[՜,a$~0F:Հ003_T2R>L){=kӚ91|~sʙD=p8]k/WWFԜ/ TQbq \2ӳX$[}zgU-~pߺW1SYP+ckTg 5~XWԌ Hz@ņW 5Z T)A Jkࡗ^zHoWD / Dž9|Ps:+s:{`N?X"T$O_ (K(]U9 O<D4i*(-Imrzq IK*5сM6lMG_ؔYc:54ujϟW9xi> S\U՞{2 :hA.=n`R?.ykG~#\H:]d8 2Y\1gP11.TG6 tS+Q96ҧ -P}>JƳ:4[ƁOA4ԐyL}%}2Q)8=H\]@a >H|,\v'ɡdӦ‚q9hdH#mhC{E}ՐEhh7fh[)v4¾jXk Z Ngel,̟4??_N')ܟO4ֶ3-1>kTxm\>'4=22-¿)@Zѳ?0 01;uIޛDC ڴaTIcueW*iE__h,e)BCt䎾;+:MB!uZ/!i=qS_JuY2/CHZD SL -[>D 8I("/P_kThu%XT$~ " Wh!5}\{ w-͒1%ě&bKԯQIXHFY(A#ubUtL? 1X@ 3X;CFD@`0^;V%s CD]š4 $Ů JAB!;X(AcP- jw(w>~F,(ZϠ=ZMT@<6ῇ uىD3_KŸzS[=Dx 7r\}g{|ٽe"bF|U*b!OUp}\E+G/q)QUrz\>'sTIK"=_0*6x"*=ij@vV2n*'Ъ4^p"x"F+[?./# #ou4 '6n< }=*Sq446+|M$~9Q.oc֙|lA4ǧL(j0UCr ]z gP H1 TɛC}؃$ bi8Yd Rc,+T&Ktz6ɋH*Gw ~cOSRcO]`~z9oΈ9ޯ{Owb#3 8no=@ `M07Zw?o:~^x#,y~'/BXtN ,./CF24,<0g7(ѱ%@Oؠa3:kpu%I9]IV@.cs+:ё¢fl଒(t4tP! ]$dߚ~jԀe$B udW2J54!IJɀD(  : F/,&uXTLhn ƩV=Y*:&ު)[MAN–Tuv^b֑f|޷oRF|}J_u9q(a+a#< zg![Fՙ|WRV5CVt 8 ^ q6X?b7mWGiɂ 9M$cJI`0uΑ~Ϋ HPdQ62RHtlWi/6YkQA) 2suH8<#†!d~RM;ZE"ӑ;-/Q|NeQ5fP#Li֐oyP"Hp9ri!ihGRD "HDy8L8mG&2> ځ$Xs"Oo}n|oA{5 RB5 :Y t3˳ $:Qu/A:$*7BGq)lj⬣CDgM.& pX`f$[WhPP%`8+~'ۙξyT Ch'(m'_ } T+|9 Ws! bs33D/Cpgc ROt D\=ѠOOÆE)7WOd~4wt̑iС\ &ѬbZϰ2rH~{|F [)RsZ,'攡"s,'rlyhD]ͦGO4Ӏ4 0{CUMM% },YXY-[T$9zէQ'HLf%&3GrF$H[Y]DQѰEd3Y)HM HFlJj25c.<(Ѫ{Qz%պuovud?JghGٌy/-V2H|`*[K?%@?%|e $#~B~U]o6׸j[6ۘz`mt YH/ŝPY___  Fw! ˪5Ms6y'̲~6VM퉹tZFg+bKժ$Ҋ3*^.U1_w`=VPf{;h,XpV`>*|KTН2;|>tRؓN񐴰&pz81<-'5ngm36QJpS`OCc jdD`5eNl}Ç>\t^([Q {O6⿃GAUjwWWiYt>% 2b2rAjz=ФlOm}6ͩ{-DK(9WI S#=aՌ-a"H y+w_ dYMZ\ Jkj͜END<9]q3HOO$;DyVkt9໳juUIj)ȒB9 ho4 nvW{ma2 Œ̜}.³,bR*9Vqz|8C|zsEqQXdw}Уxl7~ K*G^O+O a'x+ҥ[z{`>^JALkńD"C|q:W5UQq > ׊]:"T-2]q'Hؘ\\^^򎍍LOOKDekl̉7d|+Rc"'@UUUy"WɂxSEx|dljZ,lq3izfvbBW+'gf8ev[uEEcW6-Y\.y*55u%pIw4;;{:u}._tȘ ڳ"E󵡡!dblo](,0 <4+ʬ N<|99v}/k2p&ZH#iS^>G1;R5Vo}[)y~eӲzs /xoqдs'}Ua={JU%NԷͲ}5蘔`,"J"/,[:;Y:(5`u P~jCw}SSS*;y@XB(b/F襀7?ALh\{TxZxn2(èk}ԍbwOءBԑ6XU 766nY0_gy&xg -3j̍V]IY[ҥKɊT8AC T ګZӂ"&ʛ-v@'lPjdkx L6xJt,j1 JT\[ڄZAJU%9 UeJ@C$jteG6R+PH%Ν[ [?MNbrױZ%S jԧ ݔ;:Y\K :;;^"w2M+i>a-!a^vURtBxOY x ,_^v&˼h+T㾾 E^e9ޫSSbjR:m^\I,a7bW[#aZ5Nv,/#f3ZFL^u+µDR?Ng6@i 3V %~WLKZh;Uة@8rɒ)kivue+)`_XwcK+(#OIٺu"jLF ;L\`n@uJQ I`Rr+PZfj~fx"@&X]:`NLeW`Y-ʜ<=, L^dJ,IRG\s{љ٥KI!UxSEJ?0%ʅ?ʲͪ8RHDz]aFJg.(DV~r`=͝]\8ԕĶx=_yMZ]Jd6t/M % 'ozF^S|M1 /.c)ܯ?)˜L4bDb/?گO ϴ* ,yA",\cպ^̱cǞ`"Ho': ɫWRUxʨq˱q8(ވ9Z>BJRdu؇8lE6KEtTi+~ SQ4" Gn6=G6RI=?7@J&ױS$tƈ ה) -V z/Gc'GQ:/HLM2F1B-Xt,X ?V\. YicwF^xuZT42cTq\V(C6ƈ웪H:QG p?ųxf{jz yjPz9 [q\6R@Ydi;`S,6[QZ/Ў_s ڵ Ӟ-0X\.vRh;l9%в+DYPAA54r;^6/Lų.Fcq?r'4?WHYJKK5Cxk2nEҸô[d R؜r]oR*yU(&Gd-c <7C.\&k33}mɒ台% Fl@|G_JBMRVRͣy]guF#c'ܻVnkJByNniB> _(6O-zϣdIe@Y3sf}g}#G7 %L9ﶎ b73fK:ayv#bJN*$T7:8zJ.cvp3Ĕ IX 云X »!$Kޣ!/-C.P! v"1Gbi/](Ր:,hB~SNd6 3_xcxI^'߼ 10b0@u+ MccD:]ALeyU{Fd=Wh@g' k4m6H;HヽkJH aa.ۭ. BuIiX)@S A@/u~ cgo!1tlz1F9m AY_(Zȯˣ蟶W kAt2EM?hsAٹ`a8;mfW VY:( A$FS0S٭Cӓ*PF>*k($N! cndsH6Ɉ/H`5e>K2‹;Ixc! (+wOܣe~,03N䡣e᜜06ˋ5Fa3яD0| ɴ!`r,j`Ϟ=< Mԡ(=ttttvPf`@)6&hFFqy!O\ReCCr{BBB  ]0!9i ֦ ͙ȽTXJMuq~QobNp8szY_dh.ơ!3~ [jgҙb~߯ o|N 0شo`?@a#,k"_yh~;^<߇nT*P$;IE)uJ NnJQG& ЌY,ClrA>fm m ;%<h*}a&#Pt@y$?AX֛L&r 2}7P^mC=T6 jU>&WXl]| Prfoԡ[ie_{*hZs'O`~ȭYN>MK/ڞXEN>yKcLG~<†}1\5A3=Zlwګ0U dQř!SAoaסAB2RA:\gCp~}Ȃ#a"Dj%)0),Óp\? tB~vl%pSJ_BY~ z{slab)!%q!0UTqDS嘤S rRKZLz6~ل'WXlaZ4gyo;y*GCi;tTWiP8Je޽0rOݻ)lM\q 0dzn/zY|S\U:t4"k)-Q@h|˫Jy ϊ"=3BNaצAӈ]QӣӍmz|gqI*U!kˌ=xn7BY2Hmăs8$KIW:c. ?R0 M=7S4W&~'4ηAZjպY<}tѼ?`4UT׮uءC4V])@5=)F3Wdʕ'HXt ʬ吗kv77=&o8TUbΡOӊc5[C 0@&~SF(mWr =ZEqj|)2>n{[[T)vxC^~_X#4~Tx@p/nI(=Ҏ6#eN6NlcNBTm)$ +FK)oL{w,[Mԩ9sLԩ=$fbP݆l>,iՠD~eͫWcdЬQ]K`k ٖ.lΝ)}>~<'{ ,,x<%qPA027,hPB)gA3ǽ1fX0XGR%˞\zRڍ1?]2Ξ @j #څ@9xeL^ZLf$~6oZ?Ǧ㤝gq;.I?5qMA/|u?A$Y ' b!C W:atٵkpp l=ٳ b99<*{7}c͑J{w߼ dpdrdTaFeo@_{0]iie[ux\X,׺x͋]EZ3 )6*ѿ%'xQcձj ]u$Jy0Ė,߅9[yYΝ;7_?~אC~_ ﹧kgEj// E-m6wyGVi F!2Gy9?:2ueA(4ϕ/r;ek(cA6CzM2tvùN=֭V1ح74¾( ^6&W:QP}ClA ē޷|- O|؋(Ld\9k`k^6h8!Gﲀ9V&$ # ^f+lٲeǯ~z4߬?qx}'d8wXzS5P1\ #dG.uIՈ\.dj PYwߝb2}Ç]⊊gϞ Fyzkr2^4DSi_э~2aM}`?;.T6[_yIy9슞~٣ŗmQvX-fc(t-Tڒ7 /;PTf1`Gٹ`G gԃbR Mh.?3<&ȷKoYӟ? ,dWl޼*I2ZP /5fedXv'cǎ59<0b1 )?M0gn*jooס`>>XVq~gQ/WxLIeh!~<ۼy[sևwwwԖիW/[Xk0FVyرٚ٠ܶΫ,QJS d WI^ἱ2VYTWOD:FΑ9 x)]$$Xa;Ͳ? Yhݸ1- p3Gqaz} |./Esv: ;,l1 d|.%~C/joP2FW-|)hP:_N2k~, ˲ %+ݹsۊC:+K98ÔQH72*a !ߌ C{QzMu+ h!Ċ GƆ [ a?νWs},.oym+\G4?<|W^ݳf-ZyʕVTؓ*gwlv|{6: UOjl=|-ЈʝiP*qȱ>½#ιYe^}]H;"z pq<nQVeV>! C0l.*Q1f^mN?{ꔷ[ e 3ͫ*Hd2٦M2&…KzC8!|g[WTTXZ/Fza4*DAAAZ9dZ`pp~ftt|8֚Jml&⮭֯W.D}}道\8.kc쇱b?qaôհ}цXc=ȍlY~VkpiͿؙ}-jtpL+* o9 hrσhc.բeg3˗/7)?mmzF|uMfs.88Z/"wyl6jHSc!-E-7 ƄcY9 C,?XV**ߣ 9mWW1_m)ܶmN 4VxOq4-we1d/D;1Fϒ u]9rJ@k}25[Rf6(Q}zCAN-L"=cw?`r0JE!' +T2%o/z>v.}SWY ,hw K=\2ZVhg  q79~%كv^|j] Gp>)%T=QȇuW,_BMVf|cc3|4_igNWWz$DB<,㕯2*mmؾᨚo6$x9b3׋s}z/]u7_~`Ν?_|hs^:p:6< LhF E"1z%VBRge޸t;:/?fos3`W1(N[!֗s\S~2 lie6?]G[:|t55|"@^GU _kYgd=`/'9 <8ko )eYy!SfÚ|RQF;J gAbZPh/נ)A'h61Vu/ $*QR_P_b+ơ⛃͓y z=vNc*rRZf0P 5 8%[J{*f(pAew MǍf( PI^*(ҶEF'(JjZV9jY9ݶTWTaC;*Hd|J͹s?&zplR:篽 -obP*iiGBVqL-1@ZQ(sx\N`ز9>]]WȄP (O)7YRN~1vJq)o֒K##B\{GP ;fGסHTsV3#{fU6oͷ(ۖn⧻t+$X??ǥUXÖ/ϻm9&f nx*荥zбc{e#~ٴ 1L\ԀE}vp҇=77Lx0`j^%4Z:AL ~1H,AkAD̓B 2f8"7PĂd%MpB^{T>_?(G뤸: ʂOpxC<ŋ9Ra?y2-ڹ UZۡmm-+ 4}7O?Gy{lّYI+yb8Jp;fY1QW}'N ܣL0[X4 )j<${[RzK ʛo^g+A --bH#@.Ċ@X, Ԇ`̓>Bu鲊,>6$ZmW4of-sf%֍ ?ynO&4462I>6ʐl˖ŦR` fUT+>[kmHar8@Ӯ`&< 3@d(C@b&CR SǷu2m0E869jLm>.q3cAM8bȤ4s[Mw/KIǒdpǒOl ԉaCo>W ` F8?q~z\)+s8FYYPI\].>q.79ب$?C ]':q}VUMWX5Yc`(IP]$|OFn ذ҃?t&tGh%qtPC#GB$ӕ3?y81v$5{4{g pq}uf}'!b\3G^%h}@Ϧ)"=a}&'q篼$򲑉}LLib3Yx&LYi}gi{<^>DDa; P0ӥ&Fa{j8hqZ (ג(siq~ɭ%u?į/~wNy7)ax̌>1>Kmgf_ 23xq2gO%.|f}6m ?6i"z!CýӶ1D4?f<'Kٴ1xGxIMד[s<_4ˉR3Eٟi3Sd`IytX lH 4҈/dϣS#>0}$X,)֮fSc덷:β`M2t}ӌ\y3x.sLObi{"XSd%(#ltƩGיe4}-9:L!c n}T3k)L.J<1Z+IE;OU c83Mah-50K$i~ek?N᛿vIpL3^6)W*ZKpZOX4c̒}i -ُi1ME[icїُ"+sHWR#M̙ pd>̓WI3?3iM.1ul:};þ|>{'t;2qiƬNQ: ӗ8(~&y}gƯIrfXvq"ICZʹ?&c1R}POcH3Y`?a~Lzb~LuvIB2A?~9k_O=A[6zz"2EGJLůo>r9tR<2w?I8?}e$V#Q~i?LT}$K8h%}ө4ET4hcqvH%m}>CHǟ)kPlI'%=339qb)?? /kf$k̗y}&'|Y_/r+uQ?w$LgwL982rR{3bL?#K:42Q6.E|cb}t'B*t#Mod|OHbRgMm◒İ}uO6={d|5?Sw?6#"3Chkwֳ' gϘFwg| gd|+iiѝ/4NFd~;si|Y+ 7|_/ @)8Y*Z7F]$8@ a͚L*pw ;~`5:](rȜ-xJ!$ s\ +^➀@8dLNʈV Px8ڊm sVxNg4&[Jڙgoyy al$v뚛^gY#ST a[,-~sjZ{f3De"eQ w)>x饗F5]} wwww 2Jg+AE1/Np-xqXւ)0͝J_ȸ_@=*A'WNYc?ِ2Vp##PO9r E H𘖖87qLK# I̽! L3Dc s_k_S(>c&ؿʞn#[^+aƊ!!q+NT>g?} ⯭0Zz:xW^ك{)jL{Xz[NH(0o :? NFBsM?IK>@tCJ:w\MP\( tχhޘHE> 0~z--RY1E-e1 =|d0d%%Ke n Ye5fHQP  q(qUPȣ/{Cݛ{|||ì(1"6Xae<$Kゕz{{a nQ^oWW,ś]v4uuua(|p|^Bp8hJ"Iд zb0/-/#X@aȬ3\^߹MZA$MILWd-UR'7NG'޽;,]@S 4%d+Ek0\q jF -p'ᣵ2#-LN"AH TCwWܪ?wsa3pSSV[^miHNSu=[JS3J.}ʦ>Z/T.LDyj!eeZjӾɍx0KUTֹ՚ƅI0HN4`},BDUp\bHD"VNM׋v~5taQ(D[[[Pפ-pP0447nllt /`c{1;T0P9PiFd>W4YHO`c͒Ch>e(ؒıg_&MyZ2Wߜjbb-_C~ZMp_]}5*; g Z'=qWk+v?*+ه0ܹs%Ʉ@Nb,|xgFerq:{L)GC>o⸘?K=eG]s*d\a'WWboqgffp^^ Z<M)_]) _WPrZ[| vr~]xb_KFSgׇl)$>T rGtXzߵռѧqixl R{&0jޏ65596ХӨŸ> stream x]j0 ~ Cqà#eúlJfXl8}e/t0 d]:g#yc:C4€u,X.zVAHm8wnAY\"mpx5~dk?8P#zWfSgXq;1B74rj~j:Oߩaߊ}awU W"ΓwsMD o9 endstream endobj 678 0 obj <> stream x: xř3V~o96IVQ8l۱?pNᕴKZc Z+uᖴw򆀒@ MI^(핆mӃ/w}JrpNf矙3+aP6LW]g~^ƮO,`ZY@@lң[P~?˒{_oZ@m@^~zhz_DPJ*`TP MŠ @&$S~ B$3F3ȇP'?˾_!ݹWy޷Zy>t4iT%BoͤVF(c?B3?H#1c^̄=[zDω޴TPP&hǢk tС?^t{O7K}dG{|g Cgv޴{;EXG"bY;y*g׶^;p/1R (.vddZ1X]*m1c3o^='_rm7͞re>=O2R91G!N P5&96E:\JW1J@F_XN 1,!KY]./_NeZf>al\WZ?L 86;Ǥ;57Dyq_iܽϏAzx~[/_1+;uv+yVFqk<ib͓y5Q|5~lbFl`zָY5X kLYݗA3P'PP CPG>Bf^P0҇Xkaìy55X5+Y#5U?zwz7> (ԧ%1uiiMx{00~0~0 a|@+>aWXb]l XK"k5ϚcͶfZӭVjrV8|ճw_.1ӷ^7;x^ھ82lo-%x;JU^uuǞGp]TX@F{`tq:Zt.i_4?uvfB=lEڮbQ.#// µڋo,=nB1 DT2Uj/2M}V{q>ù3P"z7|2T5f4CGw;PmtdOBfGhi9t W(w;Ag4z7 .;~HVpcW@ه'nd3oWѿ'v 8'R!e `k @,s @Ur8w31YFඛ jكKPex;I< =[ Z'|)y Ӗ½V 6Gj QZRu[g]O P> ܃GqtG&{3u!hg"Wn;AǾr>?Ԭ@z=ܳrG| #60fz͌q(4aHEpjd f$a(Ϣ砜F%r@%!NJnA  ˏ!gኸʄ|\}{<(ȘBo'3$-Ӵڴƴt5~t6X32s2hgCx=#|'z =,$?!Ą~-=._cZh oE_Qn9:]p> Nr>A|#^,5oE *bu3|;A>p ?¦÷ 2rMOL»>מ[fϵnM#V6&?l9#g@9P+z]aX2 K .;o⒲*K%ۓ\ÑJnv".eiay+g.)[jiDbiEtaUnNl\88h:Eu555ٜ3Lkn *k$ NQ[350.ʇj++_  @Q!}'V; xw ?MƎ~Qvq^ͯW:eWef<7ge/ذȶamfVU}d0ǿ1 u?O֛ӹgǪnL87'UrUdf87.XJ~! NmGW+4+[KW~q1MpMGK]m^v_e'(ʥxI]15JK GGKF޹Suoa;rMښAI5Zj& YU[K7kA؊l<1 [Hf+,ŀDoncQLAȻU0bpU&iL.(V]=װ_kezm9kkk˫V_9[==!VqEzܷMMSVؓ6vv:n&T(mlsO޹s}mEC"-UC@M`^wU+ef._Qfkh\ܺbM-[ٞbly/=V˦]gk6ɿK6[Y8x沥}$>M*~w/K?$B,gi[}ΔWXd֥ J"pgv>ѕ~79/g]Ÿbɛ,!i%45 q4}fj>68≩}o8p;py~nyJ,T4N-ic2Cβ6(ܝ4D>\4=N6"1[[Skr칂y'?5N_a/a9eE;w;hZx0[ u@A<~YL!j1{ld\vsur^4؎A+~;mS7Mq7M\>j33 .6?#"/ ʛJ e_e;6na uGuؔcFa ʵuX@-E:lEp)؍g,_M!z ) cV.د/i+r@X\Cҳ  *!)䏳>3^'j(i:-UE QʣQJY t|kjn5Yr= 49 Kq^'J%d~M6$ k.'*!E eE䨨 v kPhQJ R!0^pTH,LdT@5)W> a# %Uۜ"a5jNqHyTI!jwfq|OSvO (AnX{:ANQzD{#28mZ=;L%%uT%䣶}D=x$H)$J>B<ٙJ(QQr1lP!.XJ Ndk 3ߑN`@g2LF"^%Qpϣ=0헽C.Yb*%)%(  d lأ \D ADE55Rhrȫhx^ԫI0 {6c 0" ZOS=pvl&e@hC Vnj`]j@&1:0xjIA*3,Ib\AD9l!:GYUI4w^g`8@6I 7"GY)da֧h-Dc"l'.ISh K(g82fHVF uD3$s3z0(A9)^َha`C i>8vABNj`<8qKO MFDw 5 *-%Z u3 I[v('1QjT6vgyA 0`a=T \uT- Pj!XRb`1 5`hq&V!ѴKv&(HT"0[͘ NG)D 3{#TD.ih~/HXkRaQq'WMƽp~ PL 1Tlx>+#';/c Dvֽ#fURiKgs.)jK1u"4KS锍hRS}ޯCDޑ2$`& ͌s<坺Ax$ln RhJ>0B ,taQrCH,Js9Sb65ZBL/h=jtAՄ!c$joeJCǍI/vv˲~~/X0ǩ|tMjz$:,'815e:W&e&֝9.Oދ9|l#!{ޥ]UgRʽث"ܗrK4V]/uaQӭxnLvYwEy.6ˮ$J͈!7@qS#Bf輻$΄ZKs݂I.9 һQikYqg ?IU8u`gɖԜm4†i~P "7u kJ5p?Zy>[Xd+)Ls ~Kɖ2͎ͷjbܳ]bx';rԯ΁"某nIKb;X.L/b4:m )>{u~>úד,Je~oHջkN^)P ᾏ&$iJ?~Nb2yE4 $.ڒtT"㋭$|d@BgoКK;;GO+UITԄS%`5l$qLm=YþG* .Bnԓw(\u *AjL5$LcDOv ]rްNjΰAOO(-#[&I݈E2¯'Qѥ(ۊғ?/`>DWHT!+ 8.)V A6E$X` endstream endobj 679 0 obj [ 0[ 500] 198[ 979] ] endobj 680 0 obj [ 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600] endobj 681 0 obj <> stream x{ \e9\ #2x#LD3WKjR]R?um+3L3KM[v+m) ">yssw &0:GQs Wbvyw"JF٫ ۞ &걊(p'=VFdDpp͋?ؙQ|/a}PXT5{1oYwYǫN EQqQ? m+߹uDkʐgWS1f978Իe[*w쏝D^#׀Rps;32K #5Ev|<t4&[j&KvQ YT^ ΢RT|yU 0!MzbH7i4DN3O ̳l)/ɕnb0{NilX.+=t̟ɜIvn>L9lHz(>4*A(&rL%{۰TE;%Hi,BETA@]x/LXRKa5fZut l燄Dr/g.6np.hU+tNM5}_aR2;[~rMUHZk|&N8 P>fb (J: Ɗ$z^R0VnvaNu1Poc˱Oˌs\p3MFa FcWMbV~8q"ǂ ˱É@]8ǑH~!= Z=BkU x)jek\#}G'>| )԰\j.ñv8NLIρ7$SK-8 ;{ZK ӳGO?M\BK?~Q5R/݃Շ]0%3cm\~rq~PZ+)-5>uL*0\8&NCx<"K4 Xa-t(N^hT|JE@jTb\[(p+ZaEU,*2:J3n]pw ֻ |5q4r'%Z$Obb#iI:ѝu?zK}4.i|[0Hxw%WALp¥A!fnOVtxjXH~c:=Kh+Nyjѿ2%]gpVPc[Q3=+xq'~ߠBŧa)~xO_y4ۏ/9h=O|ɡ8wPhƏgm\KQM)@`YKْO@>@S~GC͐V"acOA-?_xMrUѐ zz:@ڷ?~вWoWśyDE^ڴm}|1|[~ڂ{Ox]֛i^7eX|ghπAM$@ r8 <JL}`9i܉Z9&_ PɥT>~#*l\nxM<+AԧЛX#ۼzupn#;!q|#kKM ESAa0Z[ߊ_sJB^ks\gq4]BB?GC.R8 0%;Cn0֌ܪHrHo)m"7ka[ Jb-G@>~b6E;\#k_[ *f˹^ !>m;&D/D n2<߈hh<|vꮴ7)M^D/\kxNr+DHpEVJ{AѰ>tcPPXTH @s@ G\۩,AJ{)VRFQ&|/! ;osʙ: +낰im=^ T_mM{}VEJ|G*p]vRҟ^Ut7`)`=p͠`KJ yPzz2kim)ϒp`Cȝgva0A#] Ԗ&#92 6na" [yKhe/B.P-6(pø'Rn][dg89GAˣɽ>w15]z7?G??É ̷Lf\u#z﷛E!׍8ck85Kwv8>Aaq$No$!GGup;Ox(Σu:+t'tw@*|:,K{XJ\qvp0}\zuw]>LEuzR,sn"XɒS]u;~"߯?)z+7N"L Nii \.5(,ߡj G@EJCoE+$l'DhNTy a-/+״z˯x[oplPqߕ6'< O}.É%TX^D8e8l?֡*pG?ܝ4X E/LuӰCqGwW3_ zq,vXkF Now[-ⅶMb <\E҂(FQo]øyz ޥGj&%֖-noP\]{ߢ".]X5VY@"=C<(ɟRh~_qkga,vԍ>h`|ğIEus[mMK]4`o[<+o=͡AE4K*O \cnyJc3JYZ{/4R;h0a88@XBNG=z+* SOl6]=p+6V) fqS*XAj4@ W7lABW\kW>c&Q'6?ί"|B&MXʏowzPj޿Ti+l ;;FCigxv8Mx`-ybXiQ3'n mXK!7 ^~k_ 1kl;?~[-(YxnSX|UFb篶htQsCjfٵ}@xmW=ă Eo^|+0.B^Z'Ch)nlW@?]mY).BMtuk=~x<[:Uy%9ݷw=wꚙ9=-5#nKJvL>:*2`5QRfyTǰa2(GAy2 ECl㱕f+[rznoKwKK\̰8l[O]}RJT5*ݎ|l! j 1\]pP#2(3ꂂ F먮A" s(wx:8 Rk%dJamE:tXt Zy*:_1AO Xׇ1vT򞚩vRD:ĊQEv XF9la h~mDU3S]Ϝ,m?UwupD$9@YZo.PFnFnh ڋ 0:67^IPhkd7)x5.s!ۦz4D_Jll܉&jV ڄU}1FoDFoTPξ|M1$rRm<$OHڗ[;TU+FZST8JUrsT:Gs|if T.Cm6:d6BEZ$m2^P_8ąhxukÑG< yՆ'u˭F~ XC>֔"ɒӪd #@Md-rÍ1ܨq9A DہݚKхV.\مqx\ڴ ˀ&~XWf2ƲU,4/N+-QOLrXֈ]hmSˁ[;fָEFQ}qG7{dL[KsI@I}#@I4# H?M P@ LlcRYF(IG.}6!닀|uɊs&cd6 aJ#LҒEЗnIU"0˗^*X  it@2pZ"Ns `5~}U8}N1{z2Q\i*ܮ[TVa;~RIoN }dRCBK&^?)tȤЬI < = ]  ͍C?BeVa&C^fHߞtޠs}ҝ3;YBR7 oI7dI4@v3 5030=0-m4[asl0f<8vJ1:"]J[x\;͂F'J+csgNy~h X&`DRa8O_gaC1Ɠ,+R<% lȢ Ҁo$%R٧N+9q9" :/?qY_8C& ki!('F-72*-i cdyPM~vdCy~#eڑM#[vl"#oD.vuuv@fmf\fj3F󶱷jx쪍=UmC_lӊÍ4O-RXY*N+F>?*ljE+2ߓȷՍXrugȯ%%uKܕ## ;w~tR ȹnzkkk{Kq=LKaxNcy=nYn) 7(2s3seLVIWl=a7?嫲81 fo<_7͓ݨb7o<(=(,fYjmm޼Nu͗[R 02k4#yI^p0ZɆ |#0$EH_G 8O>&@ARa148<=Mn G1Ҙ\Ji=J8}KԏfMy6/Կrݴm|ebbZOt#v1)…^6Ŝat3~[Tz]SJcGݘ^㨌ﱂLT {TEz`2Xxce:B9ft40S9T@Sՠ)+&jM511v1-EtVgN&Dm`-h|N{qv]XkMp6tޥ{e~O⥼O,?_ PӴ_50G1ou$l u8%ׅ38Nj,7^7> @ع4&`ՋNCA}N4HcyV&7zqLsj sM77l qHo̓L0ybc,.`NZq!K`'X&5[z}Cͳ744z#[ $iSߟW 9Ap'r7㹄˸p5Ӽ >{A'w.q@g5§ݦ=[ >R/KLdḃ.^4Ѧך67j^JO`cqi7f`K~xkp?x8I[=+i:okx^ϯ[6ǧ[X}WH81{xTlW-^@'2navNz{>V_aLLMMLo 5|/}Hn4KpRq, f*ybl=1`d ,cGD6AOBh|_-&D={N[[mNxE'?Q. 4'd.fPn ރB;<Pk[<avfgUb8~{C7=%x &;-㹠F?IfL {+Te`* idz 4g@R!I LHi"],{ymq-?F6iijrIޭg="a%Dɦ<}e|*>5Q炅90,5?ÿ ,8h9QW SgZΞݻA-j4-w>={ĴT@)ċ"6"2V,kes.25Mēq]:.:3\d$~[Vfjw8ѠOPxbq$tķCB oO<<~^nȻ[σv. 6]\N`!lؘx1wkhI"sHDqyQ[9<<)\w $r %%Ω)֤޲0G>=zc 6n6tkpB{`q':Gŵ&tMa,9LOvm0V;ZlD,lDkb4@V;81OLhMeѱcBv_OM]feQ!Դlkbo47츤)isvK3:JsGO[nڙP >q&w [bwLMӣQQGNG}Gu%Gaw<N8oB$e.MUnSWKm4-pƑi`d8\ֹWd ed +=#_n"65d٘|PC{\uIO5Do'&'m)بȸȨXبئ qLƭˡmW. ûTui ؔ&dsb,$d&$&'$;!1ݶd{t"GIl5ҊfHXv:5p PmBŹA#9o]ݻzbz:X3i.BOƿ)bܩCzJi2I-_,QRcz裋jI}rŋ;^?|hC%%3.:M(Kon=uj떏?mׂ.)#c-~+8i8xpRT33n nBhxT7TQBGz@ B "kŲе/6ZV]uwܛP+{̜9}̝Ćs2vhϲjo2312ožMV.ano\l0^S7 _nceCӏww`w8mWWuN;>>dn޽{%aCx _n}o>X==e:w;DߵF---[;ǺD5֟PcY360Gp?H!d^Bf jA=2 rpa iF#<.>ntLJ gX3ZKki-ZZKki-ZZKki-y1m-ZZKkO `XB,tE-f`a&fi?#9z83< bng4lu8ra-, 2C >}5 0~ p 0s4lYa#,Xc9ۥѰ 9EF,kSH,˼ rZy`Cml`7AY4Lِ)R0eC fP6`ʆLِ)R0eC tv TO~3([([BP.ض zƎApċV! k ?BXO~c=^zZ]Vb8 !VLi2LZ"g(Uڥ0(8m`S SaZjJAK .||2@])X T:>NzPG]- D 4X @+-2u:A;Hʓlc z`Y)^1R0VZJYZW֑qrd۞h<0H} YqqԮ-~J T+DrJiY#BX P"g޿G0^?r\J pH+Ζ 8`-P4R1kL0ElCRAj WH-#JR*_Jt/&xqH&E;~BH?}p)4MD&(OE"mѧl`,@<$oZDMX~<,j7"QM|{9/H\3Q$F#,XxIB՗E_?vV!@:_ J܏vDž$+4eJT H#U}pL5'դj)-,\Y(II)J4L/bL_"}=x'I*sRCA>!4 H$ @ @j42RKJk|,E ^,*K h,،kXE4$HJ`@.KpJ zwWbF!Ci͡*-9pS'R5ˁc r@*.Г0Ų  vܢ(|\E5*ھY[ hb(p(J2Hz"Ta@`%%B Մ8Lܢ`fht@ا@+2XXhSdR(2mj+RYr]j]({rRiTIJ"*|@:;PC /O/M4F"8\:AӐCHXͧ)4eja F & |XFT`ҁT@ghc`+Q0W&FD^ (HV"xDDg XRl-.3řH" J)?|/j `^qpkeRoHKEJM"!/VHyN"(KB4a8yհ/P\M (@_VԄ,IC[ QZ( 4(QɁ0$" Qd)$m51~MTrCHR 2H8ɔMBw D@\)LR"0yW-.3yh<^S2⣢N<w¸t!0da(7-)|<>)51>'G&G'`\r XWLD)8dH@bI8PE' 8xL0ҌDyx*/LOt~j dcKtRtpmxt8^b"bK|)Y8! #dhP*2xIh4*P#4Z̸ho0>%,*hf 98/М`D "%GSTf(.n%*h `}d kQ' 4"GOX J J dl Gn`b>%7Bc^ݵ!;#=/kLOfD%wud0v\ƒC Л, 9kFنvt׎c;L@*(\k6IIB.nΡ\7KH\ GG< A;Yq/ ~ʥog}dx ؟Uɰ@)6f66-; Ta$Uׁ-wk^V}'t{p?Gi'uMRkߺ{186 <7:S^#3{DncJl]os~HX?rNBGM۽e:cbC읹ۥ.N9Rq z>>:,[Usb=O{?eܯ\}RT=T}Պ9k~Yso3W9)8&І7,cY\ ,RL[6'L AXD[hvdY2mxJ53br]gbBmID’x"ۍ bfx))JrOgΤHCt; ?AD;HՓL8a`NUW5~!2 B;v Ǝ_~d>Z>bEH [}WԾ@2 AۍF$"[9N&>:ۛfQZZ%/iks($qaiUCD'do]M.sȒ'w ykp,'Ƭ,oዃ~ t]Ӷfxoeo܁.>M'fһ禟"㷭k`r wיVuN3>Tyfg)W\(TNR}pdG#byr`v& Yfh{Ɣ-9F64<\OgI6v?zpcU?sA}%Y)W]r_$* ȜHLdW1o&~AeM| Jby%J)=p &{T5VyeԲo4ԬyQ(C}SV.Mq3!ꖸOVq:=c<1{麂yy|bѯ '9ydB:??_TcɎaO5<׶]|U {7hͱz~)Oxmwۃ鹙w;_tƀޣN۸.kF#|4kѓOOG&.yfqbYo?`ճ :\%gۮ. '$-.~856NXk}ӯ^br gM6 >Eb< bC2c +7 X,Ý{q|Er Bk\89kq +we8bQ13 B GWY&JbodWBJdM1$` {o}ZRjԝfm?˹):V ݖz5߿ ԅ ۻw;퀕W*]uT;lF]_ŤiƷzOGT9 _vrSw.Nf "#Ow3׍]Ra!iW ]_~^TV78?;m>iKȎlmR#╫ݩ;ec+޲Q:𧘱Üj\{gC{&q|a n/9$AP6jWBՁ/{(ȏ-ܷnj˳M3jIռq3^)5y\mSⲅQ@2kP_aThQS7񊨤XTee'uϸJ7fm֩ƶG9prӜ)gɻ~ˆLsfoѥJ|/?:y9ӕ]mkV v~K+ZyMvcKwM?n|ѯT픾-p|ф3r9ZڳM%>&ŧO-M`>dA?{ޣJ}+ǃq$εv?,w ?6@*b KdZ~m"+jp?)ALYp֛mezAv<9n- pc=p{z٧ ziIXosW\Yn zr.`sU}{ۜbmTPP+'y!v<6aGƤ#7w*dFMl?L<Øv o7zr1O8[[ewV.g^6Y#Vp&5Tժ.bGu]M 7 b11J˯oTϐ(,{w}^2.E*lXƍ'Ytkb+yu]#  ̛Ρ./1TKfʼWx{.]+viݒLd,/+_-veo{ݲy#bJsdܽ~?  *N|[afVQ,\{:j]{^o ?l_ DAVz9_97~6:q}@ nw??@8TVK?Z\xNެl ^e-Ul镲#30Fܸ{{oAv`p}WxoT>kGGm]VSddАcS:2_7ִ.v|"b;J5ov\skQ9#&Y7nyjթ?Hz~mwKnO16Rjq,{${q^nVVf`{& xŶ{fE54†uaʨ)Yƹ#/)łU/5?ذкmM y/d@:zޓ"OSAWKӕ1CXY:q]j+F/zc`"zV5ٺ=a .B bLHFN{2180kM c8e_ck[˪r<uE.9>?L\y-ժ5v5Ux2egͮ)͜ʐ?eXroU[x;.w7&%vJrcݰ\c9݋D Xx X8yF'!Q&F/)aV^6l=?u;2}ekM63:Cux4B2I߰As'{Y)_攷f&][\߅77FҠq rp9:1k֤{Oi:}NF$ZİNl`#Jт)g,^'NZ;9@Et侢H'E*M]}e-8uDoz^n1ؤcY–{ok7Pwmۯ 0[W)xR3m)^tӍZ=IHaj̥[f> stream x} |T;nlBd{77&%GB$'@E-PڠBG[Z-7ЀFU(Z@}O|̞93眙93̹3Q2:;'bKmi_YmDUukԡ ׈=Hdڢ+V3j% .^~Qi{DW2,l] ZƐ)W6KVjqil;[ׅ6MWuٚ }u5|J¾+[W,qDׄi]Bsޒ[I4A-s5gj?6?sK|O~Skd2C_=PGsltj_~ad7 NWlC ׉1dH!r2]z"ER2S$Y|tեYSjTz^Png#nHX8F۔bj*c:ki3y(ej/-QB(D! Q;|m×ck(;Qhh܌B(D! QB(D! QB(D! Q?iѿۆ(D? ]n (D! Q8(Q2U(_cQ(D! QB1slD %vԂz q>B h4yAeR~o0?~_,0 )4YscjM_[*l^zΎ+W,b%-l4k@K*Ɩ=jd鈒~_qQ ?/7ǓeUװΌt=-eHr-1c1K Uim„"QZhѢ`_-zfF3 d6* :Mjj;k7S6lEFαVYZׯ[]RzbkEbJ]aq(H,VghuzV+,йu8v uVӮU^CjatSn6Q>xh Z/kykPŸ}1*:OiBw9}|-`}蒧߄%lb,isYg1*!BNpZzV-^ւѭӌPFF@(eԩݳ5^Ԃ=)=c}oz@MXRTcK,kOB`!zaa9Q2Eaƹue"m"AWUXҬaNcDp u J_Ti鶕ouc _;99sٲA5xqQYTOҵN Fmk܇w6T͑Jm|ޠ.IYIjtkޢ=U$҆-)YC0"o5L۬u mìjsJMz36 >^[2[ 6CjS FJ]/;׳4Njd}f 0^LXK6  rr/2/`9Gj5;"Y=Uwwwt4զuͼ o bKXyQ&$ z{f5g3 kiޠy5ּS{VK JUh=v̹lx#89$1:ؓ YJ+ 50쥐d1D]T6F1j"<[dc}rD8-g"yHlBr CTf5bGcJ +"X!pBw,q9{ Ǻzf jvAS`P#x4mGȡQ-@KqN0‹F,m l-v6G5(3h$n4 1VA OUb(gtm{kӭ/\^ ^?֗9A9VM O.7؂=^jo{]cjsD-^h&I{Qp~6 CK1Qm -,lz36+"VA#iDi힉tfDE 5u`#Mt٬[LC覜Zc"q YyC\cuDo:1 jY{8kb%ղnx^^બJǨH;t( JN@%+ z /9 ̒w)\` 9 ;¨1BoAQɑX(wʋ+.9Qek(1rN6@윒 ?#hlȚTdL!P7!VswM@>4{ع @+Wp7pm ˠ?>@A] ];QOct;~{5ڭ;0j*(݆mX9H=%+"uuȭ^{zN,XrWc&gu6FtFlFlĪjZۀ*cWc_GA>VX($mMeɏj\2Qrͯ`7یpfۆӆa%Nr||u3v 50GADpM I#9(5m#O 0p0ˣOpjVԬYuX: mU`#@q?}NMsVmӁ|糝l[> TTV%''o:y&4Y?c|t_74#PzFĪ^X6 'r]n>`%pp>PA=5(L\H1C#UMAA4#_G~Oi]϶F;.`%p>K|?r(HsGHJ€ux,*je#Wyv a$O'Y>ɚGUf@\u_uZ5ʊ&j&|Rֿr[~m]^2-Rljm7IFsYvY縬]*+at6aF9t_bm"<>ZB. ¡*Px3AQf-P1WU*MEOl"=>`*],Bj4` }7T؆Q*\QBcCV l yB$%NIX2yp y9HPhU+c5!m8HQQ1+JE&iN4%[)ˠv-z1s1q%v(7߰= ^*c\/jcC> IlCWb.vH34HwTuA=亶QagC,\Uc*0X Ur=M'L= 0bSF65>($3[(41gǚG̪y9ӜbI, xKb1Ydd!KJ_h+L11"MzS\[Eчaf5ӓaV>gxtK=DMnlV3\T6;@1曝n|s0vjhS31XgAi*kA2{σ{!8Vf6F>^ba⋤J)H !lCmeIP AZ/e 5bdC UWۓQzMJ' ő1jj06ʖ 58F ;'htOFgBJG@39/<s11cu":pA?V/Yo[ y-ZB`e= /}켥-hjOk? qVCu{ kC:6{ߦƹj66jX5q'jc5 g0546X:XsYJq-V:{dqLxyzV[BTTUT%DؤB 9vdE6jniի׬ڵ^k: l^^|TW遖 ́QywZ#cv.qvk 4lUT!uTlZboa'?R4?#kS֬Y{LBpYCYkl 0w-(>fjXm1j?&tM|+.|B zSmq;qn7650)o M-NSii)fiYj85kS\fFjXkT늋uqcu zzkc| j@~{?e{:ZA^Y2uQΜuS#[:ȟ WKx ^i*kDڻyQ`w֬zIخ'zŻ굴z5@dpWfk= BL&0ӸQ]1§+HX>ʇuA$vAt '/pkhġȥrw KW)^y=f?=ߤ{G?!a!zn!ꗊyTʡKh*BUz ay  䕞f᥉4n{1qH >Q^m 6P,ml8.q0|jl+t5 g]2N .j;qC#,F&QJ\k4t^`?/Xһ5ҦłCNsWxOГGvJKSDVmUiО)U26`V7Ir-ySKptSn2cX?4ؐϖ=XMk|$xoUMeҪ1\9r!5e]TH4tDZEZ[/N1z~EoaR^݂t'{=ΞbϲwI,{o[J~'1EB'WȳK)ť)K'LNSɴtii܈SF/a~3V+)U Tn`MX14/_( 7Y7_ʯ/x-=ƲK)& =һgT6KdKWU*_|kT.]O\Q^&U>* #7HыRi 5˥)Zur{t#+࿔& $9[\*c{qϰatNm G۬G~6Y%+!f6)5J'&0am`;gaMELC4ynGlQו-{x! ?͓rTB7_6)BJ>himH c/Co`WOy$!2 nAZ@P.jگBӘHVEϠ 7 aȼ-;0˞l zҏa8_C b=Bmx mSp=MvXZ^(2+=]4L"/7Ҙ˔5GKfI(D! QҐ8o9pqGn&|٦gѸ2Kpƹ8gMCԄ;V7p^|a7HWׁs: wpBߎ8?^)7>:@?]qn? 9zgE?A&gwNWGq>-IS2q[o6H駸B}Oq5~FqO1 v99g*>r*QF6!ZrbfО>t'>a[CPʶ@Zil@"vgǓ|ǩxl񍌗:1!Ę99*+42,5$-5EnҲ-i6|UUU@̨<=**1͸E},oCa|[7,"ӧdNd,,tk^b~b7'_.lcovvyǛb&rw4#Mos/6e#%Jα>}쿓n,K^?/ypqGҏL`,h[f*iSWwOHt9cY˙*v9Yiqk63ͭ]\fw8#X'=vc>nHOK1 ߟg_ Ig{[wM%I -QMLËomyPTfe,KW$( , ;a޼Z9gKdVp$9ledq‡2|1 28g 9|<&=M"KzfM fydXzXWy%ʤd{,)Ş6bD{䈒ѣF&h#݌S,)oČןigg$4d]N4hig>מ^w)UWuszNZ6 Om rQ*_~l6)ϓLDe"uhZũ}IR?drC/-̃744P jC]blC1 RӐxb̅|xBo{!VgɰmF2Zǹh9 M\ZjjJm60EPUNLD. cr&W, 0f޼C* _[\(oT.^_u$z&,vyѱcg!_gJJ`(Ņ*iuP00?]c_ ˜+Ȥb )`H?隴?[?-Qudx,(ѝ,8Qlh5]/tq%zMȰi޾g|fYzmgٴ%ː+x^ye /~dQ5MDUU#z ڜ"ko}Vzb2\,}ŚQu)LNiI}%ٝft Iabg;lR`1~@2y~L6n8Ci=߆AVKПZ.hcml􇃶H-TqpQ.n~08'gK7ΚuYUTt+lY=yB6 )Sͮ(.͙~qGIVj[T_}͆Q%W.KN1[2uas7,;w(+68'k9T;tx|>CCIe(h1_^cR,/rAjgG7R]73,Yf?lvl}y'e[lcil +ktF$-4@N i6Mr4HCzZi% ;}x[3w߽{{3%oo}z~`~s,.)-} s{>?p!Bl=n:( ^Go:~BS$ .;H~tƽ½*žRP|mؼɶgkpnt{LjM"Ij;'q`KSwWaoOsCgGG`ݶ@YX6X~u7 pB=Oϳ;}m\vv2(5-NGNtunDnmK6d:߼o:iωs^`w;zzDoԱݍ==C#{ņvtigEOLȁ؞!w2{PXnƒ`֠>Ӻ5t@/\9s`O\|a0jl"d=̧fF<+ eci0xo4>ܳmz@WG/Xnw@hd76rm=~Q,|/wRluW.u>X*V;(bau[*VUbX*VUNU޷e*VF?}YYjX*VUbOrLKbPataa' l# l'%SO=Y)8_xn.oͿ\;1@Z"oX"޶v۪dHcIs۴񲌃AFn1^l+6 jx q`O!c:zl{A /70c!ǜCmU2C9s9r9nxqCNfۀ qcU;ƁVf@❀[[G۫wc_n^쬒 |q?["1쨲Q5VcU{%A%I! .,5ǖQQv%LdP6")`MwWFII-@BV%s09N 衠W*IN9<-['!#6Bh߅< 8:R!{2ΖB٧$~ִ\ɞE䂒3P_3UF&j}z4Sl eEн }ul)Tn# 61vTCnc% c2xE,0V`` = B2d%Ȥ闌VgtыKʧG;FEE?2}2Z({=cTs3d4%gHY2KX.υJ0VA>X.BQ 5rO^dѻ P^8m+֙Ћ+;AQpE^oP1,21@<3t޲e3foe(3y'\i1S,gmdf{f/*}+g,r3SZYc-a.猸{ggVq6U޸"#h+rȤo]ރXwƛjic@1G*8w3W-a^͎(LfǫW~wfrw-~vU*1z(R!l*˭^@[c*cYpd66>;3p6;Dz^yZ+Q8<2w F>m-fVӫG&3 rZq-QMk\T g4.eP 5,*\kZHڒ)->A6 9I9R-tֳ̨􌺐USr#҂VS -We]\ZiMҘRr8-( UtZI,oi6ӥFIp X 5OxOi4b5-_G6 JzQPAZ%mMI1$Zʼnw(U;~lʠ=l+b*ddjAr: eQj6p"Bt&?CYd|.IA"N^qHFǼ4ra&NĢhNƢ Jq4TE#LT$1: h,49Jt&HFGbKg#0N'`Td:9B b8TxO}񙋉dNcch<gb>85 Gt,<`8hIa6xao4O37FTe"Yz>:p":OA=zQ p-jZaHŖH8fYj!>e . /❔y|OɥGǥJ?LzJwO鴞l>)ѳ[O˭򭫹ļɎzjn=5=5q0JRs.[v6a; ǣ+x׫E%gu5qB~'/ܒ 5=rKcr1E{n%P{#(Ή+D߈DE "IK|Xj&"I)I!CD~Az"؊"l%;lwqfu!yP7XwHu'cDGO|~Ed/.KW쫀o{~ ?[ǀq(r'wyDqs Nng/>gww~ uO:o/:/;_!7oǀ)IDhzS*@]MDpy\|5fDpn7}?_q5$OZw?MOMA^$bw &`M~B$Kg7==о׳xɳ8r-'ZDjg[bDljh"ه9nDwHqёc w8~~pq7/9|~u| Y׌^;%d~O6cOAmplw׸EW$Z4 endstream endobj 684 0 obj [ 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 556 556 0 0 0 0 0 0 0 0 444 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 389 0 0 0 667] endobj 685 0 obj <> stream x| xS,[%KkɋJĘbf $@([ҦC)iBnY )"IR/m4K%%u&̕!7}>̙9sf͙,rȗ(Zb=9(›?0n+KV^}^Vhc,_d- P/:X_W-Er;֕鼥+֬ bw߰pN}>`I)+[id|ǣo5_nyW0=+WD@7^a}r7.^/_[`t.pQiӏS`z|fha(^)\BױMX+,Alw@znMIPðf 4iL8EuWØnܙl%Q<lf")5$7p^?@畟vԿZGfa5$ew( _[ZẸ ^I]#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B#4B* 1$<:=MTyBrŔezAΨGhFn;I{S9"j$lV>loFhFh"6sf 0F6+J(a6,nVXL\FD __IEk~OFʿs!:0s_[-o]yrCѵ5+cHEyYiIq ?̓~]9NGvݖaMMFC^(nZ|PW\IǗ4/t}(j\'R|kʨ4唦|QX}uPWRk|W%_̞ځ;N_|Pq3~,kq.mI%zfhhJ`Ĩcq8 z3v*[9R3A[/O;Ki xzXU&)S-㣁 +, I鈳0wl8*g6ul4ͺ[|<ݽxjǥ~vvbX[[|e}>ԠK-\u/&v_ۅô^KWN=CR;tO[ߗ#r.))ffǒ>1/,Tukvq: 4Q-aO:$(, GR'RE iM]Z.㚠Uu_/h/G98. /pBׄ }Wӕ%7%GJNLbe8~?_ `"ujG*^qs.d9[/\,%!|9+][m-Kk$d/NMڦtw mیRQcq[Ssu3582OtB?Zɋ:=BQ_k5>vPBRWņ _}YvXѶ 嵢n|]*u8wl麰 wug'b)ER#ۧ;gtRBva^G-*\ʅ< h#^W2V5WPjza*_X)5PHmHaaBHS)am=Xy@Kjfhq)MYhUUt+M?>^ }--9<\ނH E6Q؃~? x8ʎxߛVK%zǎTJEJ"7X>FOYCAT_Ait0a 3V+CZ1z~ Ob}W vi\Gvc=z"- B0:(NQ7gI$ -v-~o%)-Rފ@V>'SL\{vNc8Oq'LfBl賾И1v+wP&psG}Ҩ|a=n9VC E'>>|>>|y37I=fj!:ޞiϐ!QYNr67j@sz Ü(p9 n9,?  du6f KA8앖cp֘F7 DFn bފ rK!OUkAp0\L>$#~R&W+%>ݽ LF'?TlJPrHeU`B@Bj%OxQU\-~?xOqf1 БnaTEJLDצutU]@zޢ7 z^Tz{B9!Ӯrx(q+!C)\qkmƫm 2->*OrUG!wvBh[.%//i,gAیNT0#A^67qFpsy}S!>t m;{=(ζ9tFKs?YgG?iZq9imڈj)-j-)5KZ3Hj3׳OliEUGX T}ʔNP9u TSڜCUC<C=l))I;h*{o*{/fMxi,>MN4<ۺ^A1[GH.{n0(gZGjMq-ths8\݄bpVIcI#B8, g97c# gYQ K#.ku!;ٲ?l5k׮^f-',7˞P]͝a|6'm", t-l\: צ"X7#ITU('ռ09M(ys`8 '얞(W$y<֖cZj˃͝ e iW(5hK?z }I nO%VT؏Oț0$7C!0d>AYwCy sR>g~ x]M\6[P߆]@'򮒄#xԑl v)"FaS0@i'$p O`MR d@y ,FREB죡n}&)%cX|'M k9ӝp/셗e"uiO ܀=; ȕdM' ʵJrKWc;hyסqt!s)#a&2tKWJ)c_gRv\YxNY"= ri (ۀVO4lmp;~,%kot3Gʶ]Ÿ&18$t! W.\'gp>q&%;H9Hv$}C8yKr8A(rtQq0r=ƕz^ww&5d3FɝdOo%=v/{/DjvhNh'MVpt6;9\X\c/go_96&:B"xz-dy(~%٠ّ %;R4 Fc;̓%t;p1\"su6,'L\r5OMdy|/b' л*v{YRP4FM]ǻOvvnnQ+CEC/ 4%o%*MG'ʀSb߾>|ip5:X18ރѝӸQ19D*/dY@dn%$N!%:yEN;C$gi&2ZM8:N b#0=BU-}~@,Wgs8#Cvbggqn\# AVFpBSHsfgFrӾ= tuStzu ]ܥ"1RH^2szC^ N-pngAR7;`ޝ7>HAZ4Q ByoT;x ӆ:*oAܭ\wb~ [I=t ]E,gVDۈSc^0mc`d;.Wi=R qEr p>l{vz@yAla^N/‹_gطt;9(hdC.#>< ,fk@ҿ o۴f31M$!zxK|ي~koDC.@'4LƲrHߓ؛ԍ -kx"1uἋ(řr9wN|];p$3rkN>;mv!8h߈F9L t)`7SaOic^O2O{p/]70[!dőTjAJju DF8k5g)K+~.^ M~^>T Ǡܟb@r8ce (0ܭOwvc HӲ&|bZGHp9ɛ{3ʹ~>Фͧ}L]CE93,N˴yT+B*(ȉ%Y|[Zp]]\qݤrv8XН|nWƨj^Qg%!gx!Fmu[mwҔAte@|W@&̏2K2DpqeFGϫ q46Xg$5(_5w.%*> C1$1 u$[B9w$fm\Th$w]H!U,)R\_]uz6&FNcrr4,|{}^nIx;7kϲYRP^Zea[@  #hlʔ9V{b-2Ğ Rǖ.̧cUٕ|Ln+p\6@v匚p~r$p,a&q'lP /sä2*HjufmU!,{#;ɫ)6FjG?rYdw͓Inl"iOt>H̳6|ěv RSh ͯ/ Omj幤 @" ۗC AxuvS,2K3J8w#J%ozsK<򰐇Pzi9P=&wԠW Vɰ{BB Y=PWgz?=騙ثq*JP fs=P14dx2b'jk ^rqR۞.).D]6[n(xr(%%"nW'\.M\`'j^əld|-]݁v(&e([3bl2 93&qs.1bA":Bi󹩧 fP %LqhYZۄR18S2Wa'[so@',4kϨ_1âj W훘-}ݡiδ bElLZjL6 }M5h&;&4u:-oYa|]0[p*7D79k^d3{uFgW;Y%>F9<&pd;YP_Xjt8ʴª|mVyJSnyaM,ifyPBJ =%5UAV(cġ@2-͛]h.TKN[,qfi2FyLRY큀?ݢ?BLs(!)$]BxQͲ)_ /_gрΪm7W#N<'lFUgA1,&/_rmX-/woJ>rO8WpNٽl?c25&ČԜ.HF&tk `̜e!`"Uii)?b*Br~Д<DI~O?*ok55+ d Ħbsa7jMo91g'rgN=6!Ga =Y5ăD#h'_IubOx0e+?%.(=l1#/^¿qSNl; PR3‹9+ yf!,U%Uj1A;Y;O{Vت}Xhhs óUxdMr>8xA]c}qnʈ mqxGATNW9=jT'"jSυ̼K|J⭰;#+r 2S`yښE߿Mkv?)jl}qk؍Y{ݻܾO|0Cs'hK쁜Si@obʘQD1 .22چYfFjcUF,Vy/y;8DJ !BVILNT5p}9X9F0[/ymePMKhMy][%ٙ W(m!t5 ^oMMFblVH0o3rdbn&WaϛI6efQzWڎ]Pn[hnΩ9luȣ7LU'\nQ?ܠ:Hjc<`< wn)(Ƌ߼%$aUWkKX *VZr3̙)ȁbo7Ok|㚪IF)=t_Q9ҥ=vi1\YJ?o$QUdJQIhJwŝGwԁFH ]&o2uRFj>N%4vF|%+U?įaװ/kjMamcJ~LϢrv#oə:xƫ wvz R&s{*?Y1Ɋa2%m$qm{5XV-) Nm_ݒ՜&hn8{U=uƏ|,9骲0}U]ؓ^"Ě&xQleez e<\EG~Eg.ɠuu  } oNF{hkGTT͠ OjZfDbXc-62PrJSk*4Hs'O7ob~b9~$d\a=l~]y"%+ kO-iqg97_sj^ߞ3CUSD8 RcZC1 'UeMF MNi,Uܜg㖆G +us [S]z|M!ž ǡū;7fBRO"gkDn\|KA#wWXC>O AQ~hU4 UI0'/;x(KPX5*t}%]AO)qCJbN>%Gbt<ͰJ$s Z AWD7+HY i'tN%q#B9"Xd*uS~!pK7S8w4ŢesGR7cCSޫct٭ uV\.6d}u)Gz>yN_7쓫T^໓UQ z4Zyo {֔H0(9 ]"1(VG Mqi0C3;a35#9nf:U1a)IW]}d&;٧IC )k{{GmꚐ^ic:lw^&M/i8_a5^$Yt)N+J 20^ B݆ln&ۤ=nE6+6>hy L̉Djơa5R4uFlޢj66#2C X^E^c2k$օa.\!Po*ոY+v#0Y&:{.̙3GІYNŠ%%P͝ךpnh4~5E'e&utG\R #Z7rs œ;0: v:Twˣ"r?'ZEHd]ʍ.Aߥ6_Ĭ^^/u}j4x=>2`eNѯC=3T"7WAՠk:%Gʑ{[8lOT{<`4+Fi:;aԇaMٽ5`7{Fy:@iĈOQ.(NTs& o$5b" ]|n^Rя ^}¥#s8ee{F|T*Е SXԴ11(6s=bforG\4v>]LcUbSmm߰WzJLU樯Vn5maBk١frCYꁢ%qpNk{<@O^wت<`3K=@s6(*Up \~}eXTͦX6Pr'buT6֣G.=YWZe_-cďr{L!5+hW0s62evNz"P=ߌ\=t\1aMq/;^7D6~i>Tߎ =2Z<ȘIȹwGfEݨ؍ݨ=Վ>ӎl 5!_z.8'Okm(k[mHlOX?ce'N-{g%2U.%Js TrFwF{A^mFqI4z6 /P}G+g՛5:w]ίj>ƢC0aIUN[ FOEwi1G)R4q~x| ieϑ[f-^ͳfW1VW5xb㭮_Ah6Z;^Mu QRǾe0k9WH# YisƢ3<2 { 0tǐ(D 5@=>zHN5Zz-׌qhhp=?7?77;<22u̬.\q} >BNg2 ǍBn.\a?RY.'b+m#ٹх߾!w;a #%YZI{ d%VB mRۼ2~?'|&_PB(To<|jNÞ$9b{m%l#OljƮI%sѯ&&hVLNwϨCAWރFѐWָ `Ֆ`iЇ.VEQmj:OÇlJǣMOp?/FvGytQL~៓7>5n~h=]2ޢ=EcRj%G7ˑOnvegHk_ x}b寸<ўn_ajÑ|$Ht!b0Deet6?o5k?+;4wHC{ܾl&/b<%}"cB)m]i,VH9I ڬ;A&Fsaݪ|@>@)T.t%b1GG#T{cE9V@QW_f÷'i]Lru{h JnґN9*5{N'e"C\Z[ܞFkulxae!ܰߢUǎQ_ꭴYΎ#bA+µ7k[GhՆCGcإ؟#14Ck!U }>mF0Q:(jF:̭2UELSZ5l+(,ɸQY]ζ"5u6ɡ]""wxe4YSÆbbخT)k9~CZDRjJB`NQ/4hio:Jx muUUUʧ3u~dߥtٱeUp2ZĜ:Y?׭s^;浶NuI;{; B9г6z&wsaM3)Fmmݶvnmmݶvnmm.l$M?*7 bԴW}ӝywMägvnmm6aƹ3_vaXܑ,S~)ZĄؿh1cb@K:vC̱M>2kh9sxTU"ߕF */FL2}@sLP_%"Ơ ) 1'Zʴl1&Ztr)E++* ۞EM_c 4`bhNi@ dhiiii.WRZAd $ c J+_'ȢA3#".CJ_h)&CRZ C6 tMc&e.2' WkstDt203}s|YWYxc#ˡ4f3B/üy |03 +p9\=N1ݼ3!4pXM< sTJW7e"8oYfz4Eb< )*/YQ>`M}nbBYf $Hg+VTi*V65%_UU@a% fY`E$WDHq;GӅ#vtՋV!Gob[xnm9oeƙ`[oQ]S7–z5ˀ , W-|S~/ OUxDCAA]Oh>@^uP)yyg)"$S?A11(n41埥֝+q+C46,yV 3ҊӔ *{i>/MQxzf7em^oYx#?ohs %Q8Nqs1̎ O-R)y,k^;?P"̦_Lo\W6 |XsOPZ#aUW^*&1hEDd6CFxV6GeA3[KP.H"[N9L+R 2,R"NQͤ)BONlf"в4"9ҸZMCAhFE_%k݊Vn;vlߴT,͙Bزe%||F479j^߼d-/ zQ Bc i?v"' yMKI3[xMTv[NWg#[5mQio[d] 2;e| ~4sn [ ^UcKڪf+t>Ogݼnx  ˯z%+dM]n%#W,n;m靣=Rn4;mz ǥ?Rl@ed+s 1-w"?C%(eQ< 4\kR§ɶ0Sv>JciAh)PQ.3kϤA=Ї!p= :DP?;@sc ^ߔ1\;DGd}жl r¿N 1OPI)z)3" ڒT7J0z6Zƶqۉ!zk/_MW6t9FpCStT'x|Bz/Y'?ȶn_Kɪ[ϥt7BP落uofÏh]OgP~9_ى^ TV\cdd|vqe'`'D!M`rbp<5NZ˛_RX\iD㹣l& sr QfJF\ܗ// #Ɉ &{,I^^>JJ\! dBx 33.́c 4 42%MM޹dAL.M#Y[[dipSCWsyҽB՗n/N raDD^gr=KYYV5⼫S0f!k.wxwiZa 2yt- ٙb?̛xz:,-o@#.CCleR[ij:s-W!Ps"p^ o)<>;qs,Tuõ/ L0bsxbIo`'SGRxd  o`{@pG = 'ӉL&X Xw?\vv LLp0 L;h@1zh`<cޱ`O'F(xn8s!P!xjk-=A5N>?;D:=o7(}s]y}r>}{99v?,v,O,yyyy|L~ sssv[?x%<}=h?.U|ZD mW"EIQ(!;<7@uH}[ΣLi5[*Ro7:븊i{ϻ \ ~96t;|: K!}}LKg{2>O boad8..f? }쯁X6!N Nyqs~\ }K- ЯV/":Yd aGd@_"-{ ^ײ;ٿ: 33H>!?a@'臕c_g8忩 ?Z c(ƿ PSx(W",% &$64ϐfxeX4Z7rc2v1mZESV[Q' yU;+P?_*Jo&a:>%9~םKBabwrf endstream endobj 686 0 obj [ 278 500 0 0 0 0 500] endobj 687 0 obj <> stream x} |ŵowdde& ! yHx&h*KRb[Eز.譩Z+}jVmiiV6 zϽg9g33g3QB {KBݿf5]k۷jE+OV#}|uMD-%lܱOGw('vUʿ]%qZnEY%HݴM11o5~mc_okYh n꾮?lWC?ڦU[?}{ӪPob]X Qi߿eUpէ?E Jm5w]#+߱[H—~Q䯧>T ٮ,D2ɰnv2?]{I3iHIG8U9O R4ev'dQ?NF8h5d*&**)>dxX2ICYV6bb1K'[J9ZV(Ga:-i7kI(DsZY["**7#Їj_t H@$ Y`ŎO$  Ff$  H@$  H@$  H@$  H@ī4BT2|@V)_Z]2r/MG$  H@FcX8$v" "M6H}TCi%m1E޿~~8>WSqg#.rIf-Ϻ"d6^/۽u`oڸakVXjÌN:zr$wbegRw^Ҝ  [z55%9b6*Z֠. R}Jֻ!L k^iւv_d6++] ?׬kQ|a'7-|ƈ7wq+.2h-Zp`3JInқV%WVPr )!7R7bS%7Kҽ2ܾr*+¬W >31Lɨ&lj ju5G QOГR_}MgXtdλ$ lrCZ4 nv^uI0wC6tab u݁0ۍ 5٦xV-R\  E;\)*hBK:uW )hp_˿RSY1dˈwPZX$zyd%3emѥ~e#}CXI6Md4 N +. amӵ;JI䶽C2*gɥx O ' # gʊQmѷ݁:/:û'$ƒ ;iz{=0JEMN ^\15zNRznjY[fm޶py mے+RqK+aōc-Z)Ve]p6| g5u c!0TLtʲɘ+f &!aZkdo ~6+k/%[%@uO/gcn%`$3M.}č-Fƙnhb6>ly4(e܏㻳<=ǬrZ/)Ȭ4{~&նCtl%dZ"~ǿJEgLT䌊 ΆqM/^@lk#pKK? hHcR)(g* Hм9s,2eZ<2c/ q_DZc/K" 1~𻑖cbo? "㜶qk@P vbwoHP&n79놈K77n@@ T;/T ى^7 ߊ6AG' A)xxI>R$[3\jx\FW戮DOv]5* VD/})X l*7RuW& Ӝ.K٥*fv aJfJQz6uݢG@m~@]&@S?3JHـ'?"tإCi:*5 LkGڟ`i@p.RVHYau6P P>_AП5l.2/?(ف_X/ܽwyO{~b^߼]hld8U-H~A0<[x( 6 ? 6WU\17t2& @M^8 ~@ُ@a6aS|CGyޱ|: ~JϋewA~a"#,WᏈ uRre33,FOŠZCA?iZ͵~}serj.)G (-\d95I~mЫ ZvYeO.f*WeaMmй-8rZ9SF+P;48:$ex49gf"8 bFH, }`33N v.Rr٘fs=CςˑyDiEj7gs ?/RуZ؁Z?OFD*NCH'>7Op6f5T¥m/dXQFY- YVeM}X SQ3,"(ti TlpKDuvqpzG9ڷ؜!82QǝOD҈s"jɊ(gGC0l9;<\UԡPﯯt~A_׍tyc ڄ/:P19ePQ?YoqB<- rN*JW|(QXÕG5S2m VsyyyyҬ̅lKfIZ-ɢX,)G~gmIfR$UK*ޔfX=,d6j[23<5y–u1vG0o%R!:Fyw|饶-|n1ZϴS{C挌 1y^43|wH x,x[x"Z~|s")g7.Q1K&͆XQ16f-Cqiya&^V @Y>Nab KTbFadV(nTT7 S պ;NF=n0a} &Ø _ fl啽뼠޲  پ.zʗǾ+ Uz6^֛eIPUsݢw7vE]TWӮ(l,I@ۤYWME3Y[{琅faepfFsWW'Ng@ll*,RJ_؎rglg3Cu͗>[$ٶunu-n -a9x?e½|AOsT TwCyAū{rAũ;rAeNy_׫qq}Ż/>\lk:XlLd[-͆ɭdC]I0?i0Iؒ$_?=I^!+BFEuwH HQæ )Y|&4Mw4iaKR|)if em̦fgJrSfg)/il,^܏ԁ* ͠Q)*[eQ4HRnh?J/,6Ice{!}=[ ?<4VE twV!ߪ?omAx>B$6^:kc6¾!цXv,'X&P'gC0v;eo3UvN^PΧ[.~ >qTSGQbjluYsyg.L(~ho*4&[彘LkϡmWQq-Jpek&>/>~o=ȇ1nbW|M<%~$pB*Rer}{SmQתԧLSô9afc7vE\#ny6f+Xvѯ:c&DlwYXHbVcKX8:n;_o_)9l +b>ф*@ܬ OFfqs쟩NNISN,:U} =ԩT:W3l^:#wcxUJŽ{3l3ϒ=~΢?$dx*F+̭l*^ H鄨{g0w.(}+.^=Yo>!wl̳/ ZD>R 㘃vJrƒ,e|ۅ"c/\ZmaeP"5)-ؙ .O?,HFaL/zTk ;fot6Y<]zpΨy8u{ c(vsl}1v caE G &Σ=طgK؏No!| P b?G1ziDE#4yj>k8N؃1'Kyf{ SbQVsO 5~{o$  H@ rp߲v)QO73mddzߤ+Õa yJb>"t4R^=|JL&"N.x7mO~CbcVR[?:ٯo;w33pI>FZ$kc$ {C2&[Қ)rsBR^,%lmimT>p]!?%Oͪ홚[SYQW0EdG~~C]ݤџ+u'1|i>C3W?gG1+[\sքOE8 N x}?DYI9μ݅v7ߢN`&)ȏQg洳_we0cn 񘺖lTB?>D-Z"#Ze̤*ri@R4CV`X*廏qx=X]\m|n1L5c%zIq 7q<.t99)4ݝRj&CNSANC,70$ӖC I2 nt Z֣U՚5hԲ3br39mYT[^)SdTf{v~9=} kjgy&_OLOͲ\_'Lv՗'<4TWkɯ5T-ZKv}Ҿw/ =;Pn3^:SU/yg9y,Ի>oٟ`u_Zӑ*֜WDU̝K9.t|[׹.Ϩbی`мZLnD~յ@ڲSXjZ-,ڼhđ<_v-P.?ٽ")?%0*^'mf/Xd' Aey>lL9USȭTq1ʑF_h---Nk[oi6]V[n^-s/l;Z"///*s3H]Rۃ=9vZQqJ8oOeVlc 3w,頩Rd"(7YJsShmFf&R@ kH] ר(6r4 "g#[?)wde۝doȼMۈ?'-`Q&r"Z_E"^LA1)بLffK)\j4;qac4a2y's`9 t빆3~1FgͪʫLwS )rNt%fy&J^9 Y4\c(%vR-ЮV'oԮ~a1&ZR3e56+jv"[RcUT8ER\8Y3ss3\&k_%lVibӮ?saKplA3jm9ޡ83ׂRb)sZkQ@nMP+4Iy5 l#LIr|t#.|Q(Rqmpm&O,sOL6[ud[^dKfŖm5vҳFTI2h9eia)Smh&Lsʙ 3Ct8=-vڞ(zj?A)WvXhWͬbkZuem5iD\Gã_V-g0\e]O'ǟxpjA}SK?wdMmծ.lVwk+֭:{w|{m Zgoq e[P q{~]7i+ ;;c90ap=jYO]J8F+@(ۊe|^ăYqg?q;}z c3w ]~|JB 6ksM6k샤Pb-aZ 0'KmEy PM{m m!ZFo`20 =~D5 pw5 ^;'|cӵ{ԟ')@?* $T3OޫN 8:OZ/ӆ#u|u ;:dѽ9:)]˛c!/s;H1Tt#}>^GZө2D~@W ]:`~ۄMٚ1̂P_zCL;M!T`/v%&QŽ{m&]{.Зfe;H~fmyc#6hX|a▇}3|'އoX *0ek>5u'{ϝ#S'\?- pc4 )&POh."ՕӤl'sѾ68f=!AbWrglgu{}YZc.l(֙.3Ϯ1{&GIAlV޶ֈCahB?u2sϵٷ~qYbH [Uw6755OƹE]7Fa2jܸN/~%"O٪A.WTқ)]nmVjZkYUPEhZgf/ 7!H jvYAZ-BkcVcJ+뭅UU[:kk]n^k.fg-2pg]<9tvuqsJl -2Wnȑ=ܱEZn>߱~gWZܺW|Ct?]Uu=faꍇĪwo{*ӽU67eT|D='^vsqlkWQWmڳ˨/4thhsR{8/l15XhY~drPή=8.nn[Zw uTh?:?H*-\y)-+۹g({F+Vf*jZ;כ m_g54t4QZQ}vQKǎ*SQgN }һZ]__NԦwj^_aRDSOe2[{8=ZrtRj7?m:jF8tVr|#LwWkNOI*'TMiܻױowOIs`GRVVm҂m5ENfk.t@߻x'"E18=}+wN @\[(!BC"׋P\AxNK@3 i0-(Zt9ZF|I*{~së\jV45jvWS}݇#}AOk˶2kewYB6,?GxNԚrvOI۱^S^};SJ&s>)]D[+Rԧ/^4m[K;^ߑȗ|,ަFKKKKKKKK-S=Sv_\ ӥP/%)e|ɗ|ɗ|ɗ|ɗZ!}?/A;k"LIIiVVQ  !4-9#bBՃ m4Oz 5?ДKM-u*He & !1֒]1:RQ/ ]@J(Q+~khKHk} i-i?C&nShC1iCV匑1iC1iC1iE ssZUHr{ %H[lH]څtIRQrڷ\YJ\KY36>[ 6ȯYːnH5H#~H$%1Y%qlZh~ @{GCD06{)Ě>4BJdZƑ{M{0a:tuXFҍoaKze:<2r-B+]Ib#"QGOLє*D}ymx,è"Ǡ=m (b K8B"K&G:WH˰= -xƂY=x $j 02⃱KdZJPZE}ߖ?mG R\0ˠL!Ɍ=V',wwN)O>J\[|_ZjaGny(aE6L"(`Y ăs:S^ 2s;I/ص^^r-e}k 73UT kz4л%,Nu.i;[Q)P=7&̐=%q^|FGщc=s8Ox<:2l >81r.يic*ѓV17ꅹ2]ls#! Z. i^|v@CYR&7&0zVbR3F࢚ʾUrǔLW2X&d>|$wQ9kGd#$3[XO9]A`W;2C6GBfvgqB0#{h}nq`Dϩ<)K6+ћ bii>&>Û3|5vJ{{fD/},ϸ&29-@RZ@_*vw es _sڏe+'yphS$og-2Pw[X!%V}IQ|)-mKaGk7`]&!Ϝ%a g7Ǧ~ÛN˕=me&m|U3u)Cxޒ-nVzej9c\"ЩXEbq\zvL4Ur$ᕯj;RroCf _zɲ攍+d[)z_x \ĢID?wGF{Ԧ`adQ BFL*vC#0 q2\Ǡ>9n0?\75;>҇G ne1-âzc0K[({,YFÍRypŴdPw+.A~\~c9I]yD^փ=s+*ҎC/F 튮8!ۈ煒ʅ4Y{$׏;8DM'=֋VP*`Q gUŗm#vS؟%R8dk `͏Ŗ>cSnB'32+KNyImseI{5D\K G݅p&3+_sXWGW/Jl4V%D Eۙ+ab*|RRJBh KQ? ƖS,[Y0_M9f|H|X(^[P_ 'Y$|,"` ”aL er"(|j%r4$%X3o8(E.$&-Ibd0sq #vxIJ1X[ DZJBR q/So3 $Xh8qqI$_h<19pGXptσ쬍Mш B$€ S7IʬĒx$ Ǣv6[fKU 8ڼb,)Bd,`ha 8dq)N*"3`D+87##N< -S:([Y s$[E`d9ĝ.-},YeMfٮ9Áå݀F.gxB°JJZVNaPl%B P:1X ˩8qHj1R$Q2>0n4rWE"1tj $AX4i#4-R>SR(h%愑Gh[$`ͅBCeġIL{cs(7D8( f-$L=@btV`QbsQJ3M޼\@2 ?BX$ 'pi7h&Tf($ðl c+"oq7n\tw$ ~*y%d +`q l) o /BE X`=̃7/ xR .(4 (bl:0XNDA bQ`*`Y?1dŎI9;d?2(xSb6Dn G_> 2Aʁ~)xs3$ 5 uMy# F\c6>\c3gl>$16؀glyc1y V$g6 @յgl1Ojjj'<2{Dx)m6a=Fթ:Vk/cxN"~A$?]0>?y(?3Nȹ:}Tn?D,){͕X:j"` 騃y+[s3yr7p>BQo(|Z4П>g9@!Kk@^*ED!@{}x=ė~E|質$*EDղjTǀ@RIoSj6."wk ո5_Ռ=zZ3 J߭IYfk5$fq?9_"Te헉E~gyBu/^\0SBĂk F"M&@o}@O#Ii"3[+@N;_տ k =B 7< cD0l4j+hb<!,ЇMWj D0͙Uu}>izڿkzGM@˳gw󓄚O_#_+3 `~"/Y-Ph,ТE$EeVVh`YzhE> stream x̜ @yeFDAbp%T\"DMedrfmE͔kvoپܬl練VV&90>g}~ΔB(\Lw\v(Y||'7ak"Kg93"[ 9"!&" jδR/BD>OÅ-,0&~7y3w.Zƀ~O>cjf<%Tj!b3.%p;gV+KyxdC'*YuiB%[9gyͿs.ӷkO 1[G5A 30%jO"U~#60#8`a ]<ȵ3>']JCE؂F]fVEX,Ym*Ca!a CB+t:[Ss A Tu_l{TS]x!`- f `  AJG;Iad1[fİ6|O2>KǟDڇʼOG /ʷFa-Ǫm$yhbSHi+?Rd(Jx Grp(ފaJB+ԓkIDOLW[<~qI[FOi/g/CҌQq9w]UO.Aʦ}~M:ڴыm?3NŬ20?8 Հ5 VPE*^V6Z}?tV7.ix{LCwi}G-_)- /h-^WMT&^QgJ ^OXN}h[>~J:\KT(ʦyӚtWٺUԚk`UƞkI ZuX~0wHC#ԆՆ۴dU6=.`"eZȊT9!uu91"e+1wjK5~y&v3[*O+ժggjf:teoR>*TT,=bVsKr;)*WjzѸڣBAu:o= kPmN}Oc߈O9cʛP7IxNs)OI~Fw!y|>7s^?՝J)=λPX)n+̣߽W98aږFZgG 0BL Mt"%Ay-VbT;9[gg5ߣ~*so_`Շh_i%l]_h|BŃ ֪򥙭ﳩ=nPΨX2g`vF Rv((aO{̖sxZ*efzۭV?] -~kb_{ܫz/}VrLSIϷ«s|%Q!@Z9)1<Qv/Fh WL~T{@=ݦZ5f'gIYu;~nUǨ旹}:63]34?}xָ 5[意8J8R%fr@JSm$1e'ՖA jS O(F:v$S 4G}'vn64}c)*.ŏFsgLYVK}z賺L+zc(mǴ_2Zl"<\ψǡk;dCr/8=ϖ|]^ƶɖvc|;)[ڥ$ͳ zf-k}тrǞ9QFZ"D{?N;KCSGLqh,QéQJ.Wσ>JFklɚһ!fw&֙y4#h^3kH&X3^5W'MYǦi¹ wަGbmB5amn zmX_.nAmަ/[o##'XphZi> k}J7Q[{wtm%=l]N.e&֙{?;AGگOzx:XcXikӞzi4 eW |w:/75=hҐ0O{oUZD_Z?l-kk [VEg8u=zٺ]\P4|(N?Xn0^M;Dߛ~~;b.S/a] S0m|\}͖TEΫZΧ: UFlgE7txߏCL~J{[_STaLz80z s稶<5,Fg,>lݣu?wVS\B[ ׹U/nyp5p&=ZmWKL9t J2K{,bC$ W /rhvjJX9Rr&G|yk<!49E&{R!!P+K+e3FCu@qh E\ϊ!m|'gܬffd/^u/6 qcC:A-?eDK͛{sfϚY3cӪ*+N9{&MyYcnj=rDV;cCL?c𠁩)}zH` )drJ^+77ܮ2xyz9:YjEsӍUmb9%;}.Ց.g,ng,a9"HH@ gv\HW:9 kKG"}D}h0X^9piF3 A*y쑎bOYy9ϧ2k}k]L-M pUMxmeHTkˮ!5PJolo -h$]ڟ ڷh2hIIUli&k[l(!ꗐ@e-]aSLu4wjR(uH" YCZKտqS}ֿDCkQ:5r$D=L5o*◕S3{9WGBD%ƌrʛ=̮-\m"Ics #)=k=URGgH|.Oe1 n`J#S̓a+ނ3WP]z4k#BG]T [\ QHUDo_^vxn863r_4@PvrHLݙl3E"net#˻Q.q;Y9/#܏+^Zp+bd2 ;LFյŴ'5\x p80򆹲?3?0dgΦeԅs#gt6|= :'`vM%oH17((2*(PڠŘ:CD A!*ȱ Dr2eboqs~5^: A7J-v#īIBP6QaY17RP8J^BPyH!f7o.`u@Aղ%EzCR!BP@bPq1r]"voJï)UFSYjnlE",Th+ {#GaaqӲATp;F}>X;h?'0QEqm[9I}FX޵OѢXN5ޜٴy,֎qaO1 }l> Ίb"YkY_$ڸkCK*wfwgab *PZk1V;5: iw颋xQNju4i;=S1ؑaNimN-ZT;yg%%AFT[HNpFqĐDSJ33ܠV$l劒xy:5ȸ kĞ@,(uFѼn*vz=Vєԡ;CO.c qatwdN nlO[u~9"ĽCiض1hUCRBҧfm4i7mƯE?k6~ƏAq@k;m>mƷ6J_j m|ϴ6hm|[j@k=mw6ƛxCkc6^NmW6^ƋxAk9m<xFvm<6xLjc6wml#آhF6ؤ6ڸ_q6koڸWwk.mic6mܡXڸ]iVmܢڸY7iFmܠq6jq6kjm\eڸRKDk/ڸLjc6.EXژڸP1K3QژQiڨF6*Q(F6hgӆg@|1G,Y>d',ﳼ.;,ofC!7X^gNWY^ay%Y^`y9gYv<,O<$,<(6ƆLY<²e3KK=eFYbyY6Dzo,r7],u,Xֲɲ,XVr˭,`&Yn`:\R; r rYbYr%R+X,f/,\ʲY.bYȲe><,\2e6,,5,3XR2e*KK)XerK K1slI,E,Y Y XYX&grX1,YrYFddŒf`2e(3YYh42e@,i Yg_T,KRCD,iMғK"KwK7gCxXNm`҅%%3K',,X,Q,,, Qc!a,,!,,A,,,&`,͠ W ? 8߁` ߀WK|>{'c >{]x; -&xvN*x ^/9,ہ{Ӹ>OcQ 4l >bjl!`D^pX]k` 4U gǯ+6p+7p}XmuU麸1.Fj\F܄8[|ljlFm]XYf{BZ:!bb _Xop9^ܛXHWw~7pW㩗bor/:qjX海[]ݩYcv-G@$;jN]1Ę;:l=ާo-gN|*J.rSmSSSE~isGI;oIIsuˤ͝;O$|s.ހ1oy sgYN<7~6COx[MxU x^/sY<SIx<@#; [flp?np` Jp; n+&p#\\ ,,+p9 \IEbpX)灹B03A A5@%`*(` 8 &s@1$P&0ch@&p 0  0 ~/H)3sSuZ' !jl'WsEMo`q0W,ub.^@y<` ۰CD |7__4O닱尀e"w}g'D`{-u" _lxߴFơ JtP#@'s8 qD,Yb!/ T\%=>zX߫U\'7 ՈyzX\(E_ JJw>[{{qh5'VC%7xHl(,~GwI]1ZqX=*EJj|15*b1jHuj˭6R.WXnAk l%JAZ:PX~\ckGk ?^ns?j b"Q}jjEpG6(Ib,j'fv |ω+U^/MT+nKVw{q@BA_̥~JFOuNDogfs۱^TKSsP*6@|cM7;ieԴӻڕA50 Mقl.[O1ci]Æm_8̌~ӛ>xTKێ|hY~o11"ALZׇы`GFAt ;l/-) OdHwcO:#bpj=t#:/i\=?tN?hp=\g,ydvs7 @gi15kE~Ru_3*/,ךC5)ΪusIx"HZ4wy0A>l'59%YoYab7z?;Vo屷uXΘ^.N)l)9}C1Cynjj"7t4Fcsd(>)SXfI![j 굮;:X}:ڱ鎾N\mۼI-Y9N-';,õ7 'kh- MRgH*VtY+Paa@P-9a;vY- a;lH}{ `)7R+P}gpl:]M 2D]IGqQBN$BryA>^p6^;p%t0lF~qP\5%mЛ^RޅTo2N.l_R?KYAHI>EItZHm֡C_)gge}٣ٙϼgv޾gQo-( |#lWέώ0547rܳ\95֥ڑ+W.?Y*u1uj_9K)xoʢ xNEpc#M8sU*+\SSG&3<_+3=&/?}\{܉_q2WHK,sXb%XI菤K,K,C_/SBȤɿa"ɐߓO/BБ/JxI2 8&Tq\N8 ^u7!諀e!HRcEҥLF#t:2I+'Ctwg8I;!&}JnL)WC&!*o8CN쫉O9s>9|r|rts>9|r1c'ǜw%eRmgx!>l Wad\Y&qTI xfр5령3E ,0*lZAG[]>U^EpJ&zP X- -s,ӷKFI)irhdu&`\GߞE{`D)G_]zZBVȀ Z0xflW@Y_kۋ%r!23AX.#yoYDlAYnY $0=kcw|Z1s^. ~Dy0"3|̹kҎ!P5⹎y pNT||{F`be4' {sl׺ Zn 8bj^ֹ.uTm߷fNk{Eۯ`X\/ >U&F`xP;8GqdFٌ0M k6;̶1CY0WiTE󬓱*uߡRy>oj;8xj`:v.[j-gw +;Sӧ* > stream x]Mj0 >L(3Ȣ?4[I lgWv*A~ґO8VNԩmڻrD%TӀ~qIх~ei繗_c)A23#;'OQ?ҟ~p"P5T UUHSh t/{\-]%OA #xۚboO endstream endobj 691 0 obj <> stream x} |TչޓyO&/`8&F&L @3yB!$!fL2 IHzcjshO; jRokjskc_kL={Zo}[kgH<)Թ" jg!chQS?DcDghמ%o"տECD'^s Ѿw5/%y;<(EQhO9'>xѽC Dĵ %rЍ迍 LJJXVٙو?:?y,{)[vH/gcg"DsSBRZ dWe D^ KOyl[md!.K9DO~QPdHkd8unǘ[TjqB؃*cj1a9-|4k$}^+h/)οlVqh]b,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,9YnCƕ;PO|]N1VA ̴7;oyo;48}z];?ֱcH֖-M7_Ѷuݚի*WX쒥K]\|QQ ysdgy3=naY3,,1*aZ~m ˹3c}ڼXg'FV=tk%4p:;4.cH %h!M*n-| XIə陚>~(0,rtĴZ*UpTxġ)/uu\`,Bq {[٫j WM;{;qa9 ϩm9pܧeYeX{>9Qߧf"qݿ=7H$ 'ak`J~&|Qgn5q0.t=$tLǕHǂhF^[ŃZ ẺA2УκH@wZX0ZÞtꓝ*נ4[ը=֕_I"yQM34K7&!ulJԠdz! DCPmHt&Sc]ALoؐĬM55}Ok8Ѽl|3Ȋ$M&!XNaO񀗩=Q[#>V` 16}_rOԅ6]o因pi=Ǔ=y[yX'53Y+O>9946CzS.$̑#F.%g7YڏDTov-D* ta)z0ڛ0OsS7$3K <>ֵIO~ / f\U=}ƄsvVRxݲe!1&2~!ڏ8UTN 7h_ M v#A%i$'*q^uO)zO8ɭfic:wmC%'$:2N5a%l .-'MrvF.fql)66nt1puo:m.0qD5pI -R=XsЇu|Ƃ51v0DBE vλX|H a`ZӅb?Mj뒳 c6s5G?^AA}~Ș4#-|bC4=#B4$ȷD")QaIK9#Bj#W! QywD1 ky y֘yμ?"$5?hc)4YBH}~/vZƴpSDgR}cHA k4gӫ8Jgp5X ODgf-l'CzB:5=cH\8u=Xw󍏵6vG4[J X5;$ hcu#עAA XD}\z5Z\e2-E|H";X&2 5GanAP|hb$ wݩ90çS[B3:%:;عF"uP~2EkιBݚ/ NP+!&H\ j喻wl SbJ+;{?B%4g8mgS݂HN=Q*Q1  N: EXpP(#|>5cbAu[w"ix ,Jd'6JQw[')~"QZpB#oE HgrF=6{B tf*>hMI8؋osWϚwCɼ #||4VRȇӇIce[OZ>8vx+Ugpyq LUlUhd뫘b{'U۪ ^\{!\z+2(*\;qLg-T`D2\X&g>ʶӛ$̾mr^}d^xNxbDd!C!ADny`DiQ^aEXBD<κy1*'NuN7(.'ڶ`ru9l3 /np%zW9ba"'Bsf"#(M '[J2湥~D+!rBW;jVF^x\&r.`ux^'Q 2IE/$%vK춗س//14ϳ۞g>ώ?ϛ^bx_dC/*W>Ŝ߭ĞU9O\\VP'MCcOhN:8>քt'~u7Þ̊W 1 S ۇAD س+»0lgGF8W&(Q] 4v?]r8:mhHn7w,In?[_bbs{Z?wj}Z`r0.'ڟ[5¹յ2> q {M3G&L** z7i )KHҴܕR*UMM6-Zóf|NYhkӟ^P_山5n7[ſ H!Q|FF5^˨ⵯn7< hg똖[߫B#0JҺ(ΣS_2m;J+_|7V~{l{4H#9RudyWUິReUmMUWW2Yy_|V .{u[}sQ\>˫ea[GWT6"$;722zy^v^pͧ,9,tkg9;曆u}ГyMqߨ?Aiz,{+ tamu~FO=!2]ߒK:Fح|'ՠ>6JԏPش(WIۤOI *] F=v`fQ%$}g`?5H7tC3,HS5 {3@* 2bߢ(>+kc&J|}vZV57=x̺A >̚[Eޥ"}h|| ѥŮc6ٽsچ: x#cԋl;lͷv\_f([~H=N.?wV}$CR_'zR.Y duzBOu )1zvS=)˒bN%$wZQ "nwjvCN'xhڥP)jG_7K.Y uaί*ԥDsى,|-=eݰ|J:+[%˕22ʨDzUv@Tt yɯ:Q^z˜WD蓡{qeT/$bmRZip JNeap[Wp支3C풒\,WVJŪnZQN̬6)[jiYH0&'9YxMʥ߅\.i5e8K\9fp338v8_\5{2=MɒvO6ҁ{,>#|9֩鷅t3|}M-O'}򂂗N~X U~tP692 7uune$:")uLtdϰK0uYn&WU_oYmyV@3 f{jbMS[,WZm+ݮpcG}OH3a'O@B)93kN"U 5w"ELVe*uIUU'BoAn+V]yG;ju d˷g5Zx`Yg3(UxZm™6Jx%VZb}lIi󆾲Pq[K%|oQvߗds/vZ7|-ٗbwci+1^hj_%|{I'cO~-^rq^Ǝ];kzz9S[_F[Tv㿧J;jVլf5YjVլf5YjVլf5YjVլf*f5Yd_UQdE$؋q[D`kI\Ryi#+i<ʗmH[i4mNeNVNC,.G]Nsv4\fs;MxN};,O̥\O 1 |c[\itWҖM4HôO.hL 9@1܇)&%ˏʏ:"JR\@SuoFp`JBڐGA%詆~1s?.k<169})Z+\nxU}etӕzzAHʮV-էGCéQ6r KU1>v {^ZDSXŅQQiN;}b܀j1>.8vvLUC$*#"}ߌԣ8c҇#B+p/x% xČ\+u=`}9-d ݖsl=xn킜~1wHʖCS]EsQ+z0j{y|`%“1AaUTd~P{3ڟ˺!1B[R È*Fr4InN^p[KDT9ߐ%"b! nCJhG!/QGu =>;Fzғʚ!юaL7%F}E$5|Z[Ն}bo@r:|L@x֚;t]%mXQ>?趌{=zEge w*OQh&p~S?Gǧ 3<,xC~^:Z Os;W<=;KDtnj\|j(N5N{ JEdq/GԐbc#)%?KƤ uA*w*9qqgLع5VH ]φ1K/vf,Yˈu22N}l )/Ew}ƞ3l71;Ox#"? _o(i>Ӧ~A?D؅ĸ$wvͽv'y{Y93'R2%b Wq]BqbK2}?cXjD|Dɵ=;z'윞ƻGcT'ަt4;s/ѝv~Ȟ1aA[< b9wq^$O%O?+GBWay:lT~x[9?ju^pl,(MӆVu\"+ę|[yh}5*ڼ v1G=f!rP7YolEb7ۄQF|5m]MY8[F1cRjuFo5d7 y\>Rz6V q\f-4(Z&ͺ m|?mF׏3VU &hEo8)6cdExvhXGVXý}P|9)5KsپBpUZ͢GVZExofaٳ^!2^pU [R W>4M%ꇬ]J{ZՒ|F|(*΢d5 R|/JY_%er)b}idt5ů\Gzmty3ovxDMWGJ=%jupu]kD7Y]D|6ݤFbziRt[/J'?w,nK%gg9<'77oNz$cSʕreJ7pLǕ]eU WRr~@yAA/)O_>ʫ)~]=VoZ~A7$[~kWay;v˟z$[e#Iַ5u$퇁?Q 7߲OsJYَlz mm$;;:>8|eп (_u|Xs^?~:;Iv8Og9<4^秀O~v:ໜsu$z\_uI]G:w-ܭ$wwpO2&1'/cx=${VyVYY|' zS\ndzx3 _ 3%y*əem!՜άNhVIYYPU)Q!Vzi)Fr#ol w~%QyhQ> ׬)q8c?nXy%֟̊f9)ȥ#s$HqHL_E endstream endobj 692 0 obj [ 0[ 1000] ] endobj 693 0 obj <> stream xTM0+|Vp"EHCM{z HA9מ!$RVEug[kӇ>V}:rqc]ZOu |964%޻B_[u$qv:-ׄh}ZtܓU4Ц%vwe!(bQb ( D9%ETzD D,G$1p:UjKӸD.lQ.%^"VCQ0*YZX<esQ׾ Ń#1s$RԈi$8"n#<1ANNa3^䧟˱_Dg2EzPPw]<.x1k8ב,)}+WCJ8]%T U> stream x} |SU$]&)MAu}M[mR(K[6, S7( >̠ǙZt,Kuԟ?gFf)nu{_R 2wg9{ι瞻fd+2ǎ^ubz弁5l?QT;m@.5Y5!r+o]Ѳ:F|Ssv`ޖwKV<жK?m-<,7+nGCa +:. bgg |UkK͵f\r`>}E[G_.tʖmc8?iݴkБGYW%f/$arOۄ`߻$ˆ:LЮ O ˠa/g‚} g f~7!l##?gP"C+r1 }y?jmWVF {wa=T|_KW"ZG6eϳԥߤX}"E(Bп7o–u"E3 O&{=e#`P}3| ҏe_}>gP)]#E(BP"E(BйH D<:¶l?0mmUa]䫟஁9ϝ埆 mN9(Fڄ!}X}mn1?V'O1eAogy]9U#IxnC"v=ys!|6uo[f:7gWOnZS8߶':,eX;6M *ԡ\7 +L;Q&_#tEATa}1wV+ɏP"E(BP"E(BP#GdE(BP"E(BP"E(BLG#4$Syt~@175A6BA)̀, nʾ~*{WZ|5mhdƂ 㱜Q }OCŶCZܓ#yoW(@bfēwbC59LrYz@a0lAX!-[,ib!- mX i K m膴ʼnv8 vHE iwXio^3YsX9!Wb 8rnd?a1VAg] 4TWHe'*ԷRĐū0ԠмMȫ @Yq&d t(@]ձnիVX~ᲥKZ-`ys}sf7Ϛ8czݴSj*+ʽe=&K& 9c23ҥ4=5eh19fM$7q}lLtNx@.)eJR_KUɮgT ^tHfR4ꔄn|L0}3D{"d4%mlvH|Q+Q2g*fϴ{@1գ! 7S]F(q76+)wNR;3IԭOR o+`nJ@2VƎPcS! *dB,3g6A*9G ˤRh:Ԉ:A{BuNy;6RlA0tĢ%D_J'vseVS,SHU7u:wo,bamPN}mQ`;/> Z7+| :tQޤ&l obN4#褟a2!~ HeGģV̲b@7eGE>Xm[j`p]ٍ 5zY85&ǻŮt.Z_8;8?X 2_Fz= u;W{* ZW?sۥ Q3.p(I2- V.j1teTML@lR Bsi1꼣آ/كF] Ob^߸ܺ*^*''P6'D5FuuỊkȟoU}~sTk${Ml\$MR['hhl)&;fVgkN0NUE=8$G0ОՏ{8-O'^C^qw萿e"8r5gqtwB߸>kE,-M͡(EۚJrfp>8J^6\ɶsԈX^ԬY=+{j8eHt`^' S4|,')d!5+' &%'TӂH8^C2yrMJ,(sD(C0:5`W㴚^h.vդlŐ1k|,Zpa+hOV4.u <2نn mPu`xE.ʃI *KL'k(#.LTZ 9—4^JY)~ፂ!FEBj؈%PKJ*q\NXYo~H}ҾEJ-NWǃt-A^{jqKĞ除FQm$A)\X}&6*g,-m;F&VK$6.;(ke 2FA<}"d;^Mv6-D_LSiʇQ7+JVXv[va;*ke4G~vr4{*׋2)"OEnЎ [GVĺy"v;?F{ae |V> + +ɰ~X9Vʟʱr4 +oaPXy%V^ +/JX9Vvʎ +[ʖ9 +sÊ/4RV2- +JnX+1c?dO1~g]Ə1~#fO~22 O3$O0c?~ƻ=a|7;oc<5w1{K;YjW2E70^x-Qn,o!D!f!"V!6 C܍؇x  w񩰓v"v#DE!)DZ]X kua.ՅVZ]}(DB.DB.DB.*[Se+iNM/|C_RP7СSC!݇E!)!ë=zQ1cYp`m\3zBpl M Qc&17pV{'"2,BB~1Ϳu(:BvW$2يȖBvD•&w\`dK'm]k%^VT!8JjgL~!:2r8$<'a=!7MPjwߓ~{{RӤTߗ"cƄGE1lLHiB7:5mjC<YJMTb~$#xpL(n%=}^/"o^#Oz5Ϋ܏idtN{(Ngۉ| m7| onG+oo5SOIpg/&"ͻ8vKfz 1*LigZ|#MI LقN5!\ @Iezyd/mH^"{tfu=n*4 ¦k-s3}ƑFX|db2o85`ᰎđwA\A+,*)q81޾ɓ}}yz<_Ot? VU-Kf])؆uoV#_k9q$/xR#ɧv I xA{[w74z*K<8o&$߄_l@+W뱉o 2Rvy br5"5_EjHq"b)Z.oYx[>7̬Y9.W6Iq1%5ΞjIy&z:J?p0\3O < 6=- \ l \ l\XXhj9WwN͵sU9`bAs0U_~Ly>xZ`'YNq4{W?n%*/!aQm?=7=oj? !/KXڇF`7&̅0.`u {B+bD!s|~w|Ћ-ӰRG{:|wE!: 3`#|[ Fi >ڠnCwi(Gġߒ6r;N+.?\7?o@;V&؁s::z8{q>$n-0)ߤ lǺϤ=8;0bp^d,u 8~˞VZWUZy3,uv{p)lYG^WJiJlp7C$}d, `M*y` @%I}{wAtxfy@$b ܇ "8 IFeK1na}4mB(}~gF)wZk~ k1w-+\Zľnw.oub+YR;z<+"8G4oqS5F zOO' #`=oD~9Yr;}CkИ5kwx# /|P ZM0~7]Rh=\a& ӣj}y!ܬf._As&l/[oYEYc!g\?07vBVh3">>$Yt񩝲 #].(d3lN*.sۆ<ћtV3 za)2蟗#sB g8J"sa ~)1Lx.ACkͲF[.t皢u;͚hf4cOBriԤ&:*4ݦϏKi n!E/Ƀ}?!eʪƷTIC.~|)Ai],LƽU&+is[Ĵl>{7դAOH%SI*ɽZtaLp$Vplj:Fhv XjX7֋L.((;FW8*R&dqRZfQ!]|V /i- Rx5$m\|ܣ7-XqJg敫s'L2˜]6rlRlar{{g^M{蘘WO?^6Xο+rM_hʊrFQ8YG; &b1єjrNL7}o1M,v9MY14&2#==QQ1nEW4qcI4& Fc+vޡCX#zLX6尩藑x86SmvPv"4M#^` `QTYtcNTu]Xw-#ݵiVeFEtEg:х3OhJ楜 l9`V&UQZu}64ѩ>ԲQy gB}9mU;Rp^@uݍs7VeNMgݖ%U.^PS$kԴ9;矷avy[|Osɛ]DO2dj:noxުD] 8P-:Yt6b%HN;&vla;,7s +2&y!?0:й= m_`ͻKwLX2#̈I:Zq%G#}ғO/3a=w-Z fxOӉ=sXLk\֫/`RrK7>9uU}5,_y2Fu6nq, }Jb-io͒* _LQ\cZkLQQY$+wRp t5)l3b5\eF΄U9XޫM SElZLv0r86u&\zsؙ>" LM/ǽ;O+gh\S_7y|}FrvB`+Ca͏굒UX>쭊6HML:ag.8pt !-?ϥZxkg˼nbu֖L9$75dg\2L՗?&ߐQ>7ɛϟp-+'OͧL:! ol[R4)|G^Qz oH7Y,$n\ijU˦,0rLcDg4K~//mxK/-ő턳 SY79\d-IJ%mڛ^iop^?Z{2!43)yvn .qz@lz{2rg%LfK2d $B ( (EE pH*ji5P[Ui}ZV\*Jn~ܙxI2=}s%9€+&˖ [ysR^yy2V(_ƌ+1 {' & #DBOc3U];P7929n|THkRWǸ2jN`IPZ܊-r?G8x݆gE>61h1/[ V g ƬXef+`ZB0vh\o0eːr&+MdEw^Z@\G;n-w|:7S+>|lҍx?'?bW%&/#`#LCXhoՅD +=fQ9\d$t~#1'gdI,~QBA\P9E!TcZ"7s?><H5!w5M).Kv#ɛ}{MSf 7tQ#԰bVQtT\'%&.Y2Ӌ {+ÉŰRjjpBYUtP$AZ}k)岽SŊNy̕9,qE_[Q1>:FHu )Q!R/"FUemwv q :v7 bA}.*C>8$Kt[h+ XdkWtqPW/!*ʰ&lK 1"vNVvwPH1q1xDAd̶z<{sÝ ?ox\l77А69A͇:b6y.ړdMJLz<2~ԞH*.Ob7d)Wz]UbuG̙Ot\~w/ED}Jn=)DZK̒1!azQ9"?Da<%Y9s0Vd%;3姍F4IcR3chT;fhBSV4:'mFZ):nSD殁;&DZLy+}CYf"QOrzVV.ƀP@kou~ 4ڐ|E'>e }Nx~b+x{+~_+(GF"dD]r1U `L# G ;ugjrV, rTT=q" ˻#D,c f{B2) f յ˗Քg5Nh]',OB<p"3qnr><ʳ;*&\4+ Á{HS"?a4*k pOe__QS.5GN xvCV$#nƀ7f*?E}/37 .1a |+2:htG, BX T!A97hgp]j{dvFH. z0aX)kuZ^H}BD elLf6y>{~xbPz{rG]ڛ&Λq ҕyF\j>{dNW}4hJ؄Rh -^ъsr֢%]E"񊽄@hߢR ^a0}qD!ٙXDlʈ!w'q>ԡ A=<(N#Y}g^k^Dگo[[{?uϛhIrj@߱DtY;DXΏ=2D[5z ժ<Ab=@Ɔz>'^2XK5>Bo`sH4 v-MO+ۦO;hҖtA l.EN@+-ve0`g)DZ@OBKńNol3X9=p.uXF#K==MCܗo{Y*-18*C+#׻(dU.V(A=.L#٢Z[cGqTM*Wo|,^l D@ܗ˹oxW>ZK!B9̰X4:EHZd DQZxLL !R[sp#dœ2^) )grS^|,F1rX>eÿ6Z̶Ʌ).( !M$@NLKL~l:^d&nJ)S~? f: w&6(O1Bl"G&x6 ͹dJc%qCxvӱU^oE]pŒ/v>(Cܟ mM~AwiY.3WCf@Uًm; elzaSi}zrObH5<*RXVWu*sHd3Y{5pa 1!q*۪u_Z=ljD/ /_98g[1nP!<AxZdz,.)ݬ'O󫨻ЕDUTc V_ qxr#}o \uEja_ tsOqm)95`smYtj"U( YQUu:f43$)z!FbpX*۹os3+8!*7:ķQyغxfv7@ytRR*jߓ.m (-PWK2G翋%3kN!2Y/?0 Bi},VO ߋod;ݛ|}l2ߒʎ/5y`,U6j/{BC.aeY@[w&> 0k,UTFo=ۂ pt7?*< /A46?yhtl=k'c9_gpGJ0 +S ; u/weשXRw\^g*LIt*~.(٧rkԄ0Ýdu:4Ad[KVl`[;m?ʽ6iTmoxbG9>ؾ1awظTQh.TZFV=XήńN'b;W-GvsI˳m 5F2FF`LeS Tzb|xU,q ,BJ1sT&deq'`Yl1/TF{ȧlm2{zȬ!4/b{ϋ`6Կ0bi7C}c wga@j4U-gQb8KDH@"0Ǜ3 L0;RY~ֵ|bDos}E3s{yF%*BᎦήivCoE^ =<@&VciRapw"8%H NE`Bka= M\y.'h8<{zCa|_"w ho$yF%08}a̪儉6&bHP et!-F̡ iyC#g\߆z?>u.mk]]A6tzZ f&T;iۼweS{;E +xPd|-U,jl_±I\il|*/ *B ѥrDav@.Ä́hOcs?L :=L'$r{9T0 )RȜv]V_K|7Lk*|EIGy.*z^+GT(7?}=iD&O "L5LR$=؄ǮHWI~)H0 uyH}ĖKwC,(ǟu{R_7QGJS[T+-$j7ߦff'5XOn8v佣cѱQejef&D|7QN nĢ*Vf=H$XP0b]ve{aJ jrOӅ;>}*Fx7 By<`.DC/ !VQn~gܩ1-*Yʳx*'2K<EvG ;N^ ޖ|LȭUN /ـJ.V+MDXRaR&Dؕ ?4}^zC}(QLK A/AW\(A_ b_Bƭ|O"b܈6ǥs۬TrNđ-9#K!IG>% |Z ؅(!~Qų :ǒ6,iZ2+[~//8ug7\}ĕ'wr5=02QS$e bgR06=tpFl6GXb1t$Q4m#/ī/*p!@/3LCDOJ1:O VHmE 3w;h  b~r%Xk?('/!D_kf/-rr g1*$F|e ½ǶZ}V2xyT j|6j{B۱ǥV)(at]fPqYUQBGq 4/߲M!o$wCXHi)%{VmV7Fꐹ0cAq)M^DNin%MZpqydOt1'üoӺ^+JE+u" A ݨ3 /jTlyC5Goت+onhdO^jG[+ZĂyHTo`!639ֶx=۟Gܤ~y}#|@m Xsj̶;hZ D{y(jT83g-e'ƎofO5KˆKrժuݽRGYezc&W-sj{v<MO5Wx_[~,sbq HU*`?"%hE&L02p](ܖu=?z]X$Pz{k>"QOC;aX>ks9=z}Ex;b^=];(|d~ E2}n웲Y$̸"XnpwTU#6?plvQ(YQ}-`n=;Q<99ce bوNFcuFvwnz jdf_rY;NK:Gm[h7Z;!k랱m2c' ?^Z4k3[&_E]5Pf$;{! e6m^ecD?!,/2ƍ2B|E:3$ g~OYUdEgU盦'&9N֛4~h ' 2+d FϗcjSŤT^%&e( /ϠgP<P01PJ b- hMΚO Qؒj)LjLcԙ ӯW0`&J#Zv]RD"Mǹڒ30m6Z'iҜz,DgM|zо$B'__юNucʲ\ñ1z&ż/,zU#.~nٶUPeD,:jjЉQ߯_ab4RDpC:; C9CARkU^oQ#.a-&ٜɮڞ8iP׏v>v08ж6+־]}guÖ@UZH\4{ %2zdwG1%ܤX)+:/}PV+2bOrۃvH&SRX(p}67T;gmbj5t!P4Η%p!x7_(!~&T1)1u頁m[smZ<&5:Rs2s6OH*z͟MM{_* ZT*G{~t^aoXK~M<C1b4.-K<t$׶CYaߎv"P8vݬX9"kkhV͖ʇiVxC itHq`ȦQY5(:U\|NAxq p0pF}{Gfq`_$ p@ᤀzcms^I e"I `{`S FIԥ}e[+gY&]|Y~8wY*G`YƝ*#:N51'n|L>BX%6J6Hj1HbdXX&'Y:]E )>$?GҐD?`6Ѩ3  e ڊ?*CxrÀ|0Ondrz;3pcA LIIYCHOinLk<^s˳֜9l}%d&uoEk\[Oy^]^|O5.*<(UKd Þs0C5*C6ed@&S{Sݼ NQ%$EFg+R4~pxEk60+B #*q6d_YrrnIU2h_ɖjŭj)ⶑw>9L{,&xHM$f 4a tn#~g|w>%EOmo߃)qxyx&!ɽ" plLVh, R!7oܺǁ^zM#%NnA )?g ϪP_}3'I 2ty |#.Lۮp,]Q7v5[<'<x7>bcNTY}H欽הSr I(0RauXáڡARKPHwp84Cj8zR`^ 8?3&(+1h,w4e v+DZ!"|q]ik/NZVOhgqȸVY0lhbщr n\ k *%luZ*]1YTJuiRz{r۫ڢ&Iy0퟽pah/1Ay9%U8ndr`Z+9-#uվ!C;APe sEԉ1cdAୁo"xF{JZ1Y&͜v<٫Eb2LrFO)^qax6vZg[#bk^Y;b_RD\J^˓,* AhISʾ4]u}ȱĞM# df} ~NN(בRrӘ9FN&?biumgn ]+VbH_e]m]`ɪkToWHeJ)۸nnEMt|?*DO;) 6##땴\)(y L6ىeTKs^_Tf2Lɿ+NPhWl(֜z-SYQtټJ(~"Ed&aJvc JԪQtզ"/јacai)/mFk[A}.88Ϟ ;r +I 6z,Q4z1 Qѧg]|,P=A\K0[ 9%M%K4e׷T+I+QÕ͘範r{CM9U\ն-9ҹE }5pߛQ9O9eNJ2P^5<&X'Af!a6Li%/˕_bY@V3DI1KZ}ո-I|rFb˪Ks^^\YY(Z 5f^qu [̦y 52B-Z[۞e]:ǒlh.1$s2Hu:X4X]\O7$&ʶ1ϣ2X^G2i2B ISljRbRj)-#RhW\98ݤbNeYeeWikuFj՚5sS.5ٛl3cRcuJr~MUl62ضeeUk-eeKnTMKTisnxxE*pzc[)bnW7]x`iaE\`/ 4m?63==Tjr 50}+OQR,MdV"rbu5;UlXu,VMYs cM-֚+/33JU`=hWR u9^w㚕.*6eJ `ziӸ7P * Ca=`╰+~Du6ÛC"+⋏JazTёMf$fF\}EY5fT3wZz'V'%'vX䢪g 1?)11Ϊ20\Jr尜o\T|B0- =al?4p*k>I*Wӳ}Nf-vW|=n$"X.g;q0!*hb_oZß@V0L:n}Q3p-%f9eH뒃d#?NL3sΝC/a2SLg߷]OXlk v}b0&޴q~ wiQ!R (1( {â03bc$cI/aG,gmI>xIx(ױ;hPAiTTa4:{$y''5 nI0kDXusd/eh,h8:9ѦGh.LyI QF,M]b{ċʤ9qNqZ#$9¦&_wژţ1ͤwZj2FK"v)-^>HG(?L߫ߨ:2 rɇˍ yҎrbR{'r&ϔߚΑߚ/zk4iNM٢*^.^նκpOY䩍6W|׶!¶/./9ni_4'kӟ?),m^Y[ț&Uͪ˯G9&{`@tYx.+b+))O?n̘i)πXn4WO flIզjKN9-Y _Wו37=:;wZ)|>r+ۖ.8Za:_RyՃ㮮mzǟK0ۓgiqc^5vyż`yލ][ŗwll \\ ǪY4c9Kˋ=3f"i(G7O]25(Zmq"Zj3{k-׷ȾyXKF%N[ƟGfn-ןÛ**^gGsOCzE;nK?=uMÞmco}ԸaO!#MrP~KײI\ݐWڷ:6]ōuG+C^;1ֽ3_=̗=%.}ǻ7o`x5Nڔ" gQ=7~&lq=ؼS(WqxGrb":֨L7a*B󽛿*Ty1Ƃ+k[d9mv٩߰e5o4&uͳ/pw/ϳʖ=,*qͺ.+o" *F$BT.0N Z2}sПH,ʔܖdods?!9|9fuV#ZE̢Ł}];楲O<%>j'ӫ2/ջnM7l%vcO& zf$>,;X7gS}˗ӷ7Zw-?h`\uZ.pYRTnBEϋ0Bഓ N+d|f7EvZ 2ѱ  Q1JNfSZ1{a8޺֩cC{z徱=;v֬~bةnY7<8`ݴqlg? lKq䟂f>9JNpvCFjI*~"yQ"N|S$~견~uTF\+:%bʋ?x ɢϬ[OϵjϽ\jVwg{[w]vebIի3gx[==~^Rޚ-畤yAsHQ.5r&$FiGrGr\\/.WoMk~rSf2oX.ҭ?\tu&!#A"ⶅcmgm%\\Ox9e+4 Y-<8~ 46(g}:.6V]9-QIWɞ!A.|ɩ.,CchjAEJ,'cL玑\4Ǝ!8sn2SG硅eDuv]qQQxq22egZ1nF5)uTn?BvIQgIgOxUT0U1bMΚԾjEӜ g9sJjl,0mp%̰XRK^4mZϨ*kIyCK_yrGG~_1=>"S~ٔWU[tX-3vms3ްYo#wrn9J9by[>FMv̛LF96؇09QNF0Ǥgrh؃+[ثrݨGٯWHE_1~z3Q;iwE!А±]ag`טs֤Q.Dzo/1<Ȧ@rLd{Ϲ:ɻC, 3a(g+N++X/yg.,`pum]c {o]<+VE()AR"0[ w[w7 =iJ1=dD9I d2$=3køyF|_leY̱d:55jd,D<yg^%fU|f 7jp&)<:v~ f~50=?Fiq&kj5KT4Q#x\|Wck'࿈{Ś<kH@x3B̯Z)$ݐҿ/BZ.BJwDG Ȱ+&H~s2SJh6VPZp ٤7P#B;cw=WҾcqSo))S4EcJ } $XxSkI3Kz7L檋hDɊ))))oGoO>C(eNzSm#BJׄFȑCLg3mzBJ陿 3!d*B[X6VPnM|-E^ߐ7o`mk iZE#-ޖEmT#SMMMMhhhhhhhhhhhy05H](1 7bU\y2 2rCv@rYe*Fs*QjmrYP7r93=(+2F:l ~\fQJ.sQux(/ we%eJevH\֢irYMhE.PEܕ 2RYY*K8Ke gEՑpRYY*K8Ke g,,%T@-ȅ:yQ~֢ ԇ|@nxD]pg- %P;຋# rtm;e.NAy]p/(kA n#*ԂB;k#}Eü.^wANQ~Y-" h ^v'd~^ {MKPCR%oE9u=b^_/_WmH} Ry>whϽpz*cW9]Rr\6l0R 5G4xpd};(Ғm{(>TJ(S[Lb*Ap7I?³>МtШۈ-P)*gSȇm* $P ցHQ b5ziVhM$v^F9d~@[^SBA-GS|w>jkz敭@x-R#q6>&>#G"1'{GD~94Jq"$&(tR<Im+DMrIQS 1_u^wMgšqP6 H&Ⱥ)lu.Ji ՇhnڢHz-ECRܣ ኌV4 7 ˣ'bC)QIȭ’%:i/%d"#d.>ғ^o qxZ'#kqn'FSAg )ңQydv14Qq-;tȳQxNsV=1K16HD\zdFHop+PׄA8GA%@"Β}ԞњO%L11 F ʣmQ,h_("4ٻNؤ&JL P Rɒgsħ[IH+GUIw<;b/py D9i䢶8I3+$:E@Mx=\4B25ХN<=*NZ\~o6(}^#z[{ 8ήHar-`O/sT(ᚮ~G_/x gnGnwz{}(nzASXvyKhsB{]΀zS~+!^zz#(zk)~PpCŀf{.lr9>AW'\8\~ ۀk-NP 8;݃B zmz~&'KJDO ^zR\:@ i {Nw?V[p tt[j @ rp;;:`tIž>'Q PIf.?A`t;{*4X%J-'rlNLC"x`p^8lT/ (TRopwήN9U 8e ^'u(+$qHSH.P.XĥEqO0))( s1q TvZp@TUzMME>h|&BL;N ܎A[=A'{]A{{/x^ $p02A[i@vDi6B!}` |WDlA:R8|:?`) yR] %05=ZC|wד֏wF#Ϫk}}qqPr>?fd(݌[Q=5R; l lуnEmUaKtRAIiZdxz$rAn]rܵ 7r@M ^(=r_o_/ZrAe gdLdr+A\ r׀n[A- N0=r_oA'9[r w9]rN~q[r6r] r{Ac *}ZrK@\nC䦂\ȝrWn@A 0}r?_qk ^r :{d( . r] =rA svVnø.n;roOܗ@q*5Ri~DK5߆ VUv˭Bq]|ja9 |PmO! 2a;RabCB! h4  X_cfB8)9(wIB*ծݸZ;G Uqq;ρ]u Z#FaYkP&V *h7ޟyz%UcvLJpA!YP; Lc 0`B ! Q%%f& Vj_XPtC۷oтL𓨩jھ}{SC}-@qUw戒C/\ԓ $@1^)U>GtNCP&1lQ%ݙg K@aja ;N??:d1<*cxUT= ~50 :%M7T!oѱXOX~R5dܚ(bch1aT"a.NIA="l`As0a:5]|`CM aXCl"h`Fwр+qPiDXFH2@oO\!>-CMc.46zOUVg] ggnOԫ^#THQmHj5/g##''>ga~Rkf!3JV}ꗟ,b8(pzKbah\$vS^ESJF5ol-/ \xaܠ-'"G_fYv[T[2|*_uw2v|H=Zw&/$8Ta~wvRf>^IUGkY˺)KҨEDDED~R-O?>l{ϽIssϜs9sy3cu1 KA8l 3y,Y̸!{?g~V-ށ* ƣ+EWiO=ާ!$gx|v: ~+Rb'Mrlv` vּF\$h"3̍KǨ"Jj1#Wdlī\ V n'b1׊>&tr*"ixk%*xwo:/W5w uS}VGxu$cne+EI$?s;x4a }-yTS:d;`ԲHqaϧyͯzŻ\/U67k]cziN"IяC󴶹Yec I?$ݚSfߩCfH-NK мå,O"pꇼ?4I:$?{a,3H9Ϝ<9X ,FQl"f͞Ϟ]vf͙Ξ/fg,<Ϫfdwb"5\!.4[u yy@ژÍ=Rv67Rq{W;)>{H'({.9j%˻hVJ;5GF_(Nϒ,{H!g99ZyNJ¾i&s\vs'ξׄ>=ZongN!_/Jtg o@ƆqvuIfPI;Jh]ΓM9A)klBO> < e$q #%dSnkgFN3#"Űepg̀z_No~=>_W*w.mWmm{&||/>9f%ܟ_~\'"QW&}K"~˼%.|[J3sX[*Fnc73=}>c3xxXxxeLMM\9xJY3gϲ cӬw!ؗjs:l0s9b{v\5?c^3ܼm )0UE!B9uƍ{?44vZacW%j0qu:usP}&U`Nun2kǬٵN5v={}쁼y'ٶPYh&A(m 0mAM?B=)kg 6hh_CoYmh4D3sLKc0sL$_PVP_K n+=lY*.8Rp^}!Ea)Ug h•lԫPm P??-$9`E}QoQh9UE/zhgޢEX"ZbdbذCbت*F,gᗓ'>7 ?ߚtɡ5? ៓a<؛ +Jk%.A(A/ن(A<\5;?k9;^SDҚRW(LkJ(GK!W)JSo*rTej/Z֩SDmSϦBש g,T-aʰ^eй P5)CEC(Щ<\#.ˁ[VdT`m*` hȳЩ:U@ bŅʬJYY]9x}Un|rJ|*VUU"jAb 6UmBU*4Ŵ&44ƴ6L2iXiР4m5h5зv5W\_5G+^7O_=_tt RWs_ tyfyT~5gg`ò]fn33ˌCOgo-E|bZBZZ{WZE\–g3;gҾ1vi3aϙۙl4Fdu]o{u:YYa4jc7 {,gzzzi=~CԃW=lP F7@E 7 5hp/ Ñ0_xEma,|(|" /5f5Ÿ{4W#rco5^jʒ7A&ح 6kDPpMf{f%l9yWg/vg>Y3\Ž7ofռh35yNpNQ靃s뜵s69Osޚ}KN$oi[,mMioye[Rl i9rӚZ ᭔[{Szۊ[7>ҺuW0POEӾnCmqȅmurG:4sb >mmy퐳l/nG6h]T}oh}{w!zkbH#Qց=X;X߁;zwqzvwVt;;v.;DֹydO'>Ȥ 9#3GGVE|+2A`ȑmB. wuw-Bnœ]îumz 9 ܅u]nw~wEw[wwn~~ʺo뾣{н{{bt[ԏݺ$9O7ydl=zjz=z{V#lA`=eQ; ߉Fۢ&\Qw}(#Dꅨ3zP3.gbX}Ŋ|2͏A-=1\;`6'bc!v4KŰ'"/B^m3.꽥O5mf$@-o^d^d^5WTsIe;)F^3WTsoMos&Qx;;Q}1 <6ϞWB@e>\25Ml,ϊkq%}N\>%N?n<;?;n2"<ܘ3ףCN\ڷ?ubW Qfx啅 hVOk88.Qꀺ)=$O\#|?AWSF:1coq~8Oo~%)]T+? -Gۄ$H\Jci(nh%ZP[p/cLjwl\~sS68K0\u&5N_Z.uk䏽'9,0t/ȆޗV"v)w~y"$^#edt` _c$|trz4xBeHt(#--`hPZN+(e^p K]!$ا4f֋$DǡZ+k|Щ_];}hyra91.gn/.X+J`Ҋ1D+%EA>*@zTQZI^jA-ǩ.KlR.{NS $< PO5;š12=K~t4NѼ*D>hbT2EԖũZDTuP9N"dX(%kz~ذ;zwGXH|3iS7*GA@<$R}QmGץXGY\Z'ΠKEKkz]"_nTH?/22!||Izz*.թKJ4G\s'5]sT׻tu.1'x&& y'x{?(Bxx'F`yzTY-Q+3񼽗|(?iB/Qy8z1ZZcu8A:[‰)sʗŞǥGlk͂l=i6(4 =jЪ*g@zK.v n!NVIvYq+L+: Cbnt"Ҷ_t[I[ v]iMYݞp"列(F8$Mv|>(LS)XEt\D%#K>_"jtLl59V C"c A|c"?e=r5(sYEcQvH#SZ,\wɫ5% ZvtʕnL/WQFK[oЎ6V?+GW*B][Uݕ RչVydׁiWܼQj5WnT_$$:/Su:dgՕLߧRՂ^ y7F 0)"#Q*B)Y+YJYITfi" P50Qg%z>٧zAGVjJM8ܫu<|b#!pn"!Z 'xeʢ!l@g1jcؠG`<'SXI^g{mrp,yf1_Y%:ՋG=Fw"ߙCKiCi>0}s/ɒ-Cbmw8"q=消9vd.SU@PgbUZL2]EvX%;kPnU:~.Rc&wou]P׾2.RJ?fZv@>cQI^[<\dJRd<{LJyQt @ƭ/)BJn$Dg3(12{ I^MGGh2UCy[Fq.u#yE]rR|a_w)"LC9a4ii-9T6:c4K܊ڕkWjO\Zide,vY>f&<w%:yy5٤בC'IJz?QUܗ׋,]fzÚAmYMdc a@"(R YR.~OiϢãqU>}vT[oEt#as4H5:Tܦ\[fM,'`=.ywk*zmQnUm)Lben[Z42Vk UճnƿCj;TUŃ {Q3M`bdUZ i۵q},$~ D8vTɌSk;EλD)ڨ IPI1y#Zag{# chvFC7ӐxTWXɫo?=iwZFSobhqe,apS5yU= *.$ޜrfXm;,\WE-csI]UQvI~f1ē!~/d $|k<߃v\+Hl"qK='(0j/-v zUψGќ2s|\K=#^n e?Z빮k凌IyeW>%CBCsZ)ܜic{4sN=OԒz.`R왐+}I=["`%̕Ϡ+Tnܜ^fSD+\k@5eʓOn48)^"N5k8j8{|NEf+%'|ynXNBѺ-գg*4;^QT]?At> 2IÌS)3 ՎRjC-겘ܖ"z }*s{]꩜4KgItLf{˸Oݻ{IR$w4Q Qz.|#uMc^cKjYjF[!s8!JZJz!YJFF˻YKc.|ԧL*uIr^m.L~z=^M`.I4ko(:a].J+~'KGTs%/$͔=ĩ] _zI ԟ1[=i@ی(%+,)3)WUÉ)k9aF1:h9O+NYȀ(%nreV&y=?AvX4OsVv3|ow^VnqE_oo]0}fy<n1i@NCE3|Y%YY Vfڜ3@'ef~$Ps*r͹7g{Ϋ9#Vz:bCvh.=l׀3gǻf93̛͛߼ټ͇̇Y;,||e,0$| } 3gy^e 3?nO?%``{ ~ ^~ 4`,>l}''='`? .`{Q`3TM˽Za\t T954#1Zgb ? z,ouʍ?V̖? AԫA} UGPg g p8 ν ĭ6뫅};=>s~}-ܯo0~4~1?/d؇h2yo~h6گfv @ܞ.ͽǞZ-`+ `=뛁f} ݾM3mzw;Xz$ ; &xo!x? _ﭚ}4iŮ ]=-]]OV jk;NH;G%_-ߖ?Ϭ~+"2tZU/NyںGqoԅ :}Fc&t߀O |j|> >wi>55C.>YSe ]c\x w/H_59 ]xvxwxx_+3oѼLDoxw_B^J‚& NYbJ1q2.%sE|>s63||n|^|9GOum~d_{w_ߋ3!Ou ׁoӞ M ig }|:;jic?w31{5 |d w!Z;&_v-gNcjZ!`v=4,=˅}Ӂ]{ƞ.]c4f}$wm6hs@ki3=M{VBF+< s;QҷFh>gh-c?)ø`\\GWu߁HVBD˱]WȂ~a6|۞EۛiiӴvڠͅŃx,"b!9/ <~7o"_EӞ,,|7){=Jsi/и̴?: endstream endobj 695 0 obj [ 0[ 658] 3[ 220] 137[ 494] 142[ 271] 145[ 531] 481[ 205] 484[ 205] 512[ 490] 882[ 554 554 554] 887[ 554] 1499[ 483] 1829[ 597] 1850[ 645 603] 1853[ 557 539 460 580 496 550] 1863[ 552] 1872[ 395] 1876[ 532] 2869[ 579] 2878[ 728 728] 3025[ 688] 3030[ 505 639] 3038[ 605] 3082[ 593] 3397[ 747 747] 3404[ 747] 3407[ 749 749] 3410[ 749] 3436[ 494] 3440[ 494] 4666[ 415 415] ] endobj 696 0 obj [ 220] endobj 697 0 obj <> stream Microsoft® Word 2021 Marti Maria Microsoft® Word 20212026-04-19T17:51:50+02:002026-04-19T17:51:50+02:00 uuid:1731E961-6E56-4E65-9289-D62221F03A93uuid:1731E961-6E56-4E65-9289-D62221F03A93 endstream endobj 698 0 obj <> endobj 699 0 obj <<61E93117566E654E9289D62221F03A93>] /Filter/FlateDecode/Length 2181>> stream x%y~s~;3c\pL&Xt؊"wȽ!.Ru#bd_1Bʖ^ox>9~?󛨨G>4DE(6wxE0E>Į" #k>t:]vCY5`POH(d4 d!.> C[02 O{oaDxI\ 'FMx1,Wb`_a\]^g`09;&)0 L]O).k 0>^aCxܹ0o } K+z3,P.-Uw7X ˦r]hEyw t/qc`|Vw g'BGVIlUjʼn\%(-mؕ.No`v~z ؿ,pobcc6JZ8 9UN?+6*]8-8W֋#pA;b>\ҋJ4j%pEpUu{M_}Ms8\n̄ZO**Rt__&ᮊ䞂z_{@hA s`w4 xN SS2&Dq1E@\ &~ ?MQf 4+ xl+(צ y>Uf=w`\Mֲ e,*$U0p[h,V*]J'l5[]gdZ~Z_k~Q[(-*?҂Z [к,vz'1OKrإ;kpu&hע즜cv3BeI\IؽwA}L v#T;~fO&'.Yt>{Q%c"(_;Է?/!f&{so&#}. {4q'XTp:n`zrbu9ejBeSG:uR%} 8f}q:'`qOVC N.s:Ѩ gfX:k Q,mA;Wn>pQc"`@q@Ќ(Й d0uFdn709 F`T%A /0zd ,[-QgnF&gnr5hLuxr{ܧdn5JFwH_Atǖoøh+l:uK1YPA]*ܵik)Z̨.'#I,p/ -#{`zro& bD<`FҋhA_WwrY{嫉1PA@xwK|jY^3<61E93117566E654E9289D62221F03A93>] >> startxref 1196575 %%EOF xref 0 0 trailer <<61E93117566E654E9289D62221F03A93>] /Prev 1196575/XRefStm 1194189>> startxref 1210737 %%EOFlcms2-2.19.1/doc/LittleCMS2.19 Plugin API.pdf0000644000175000017500000254025215176573557017060 0ustar martimarti%PDF-1.7 % 1 0 obj <> endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 5 0 R/Group<>/Tabs/S>> endobj 4 0 obj <>/F 4/A<>>> endobj 5 0 obj <> stream xWn0 ;h3+[C; ;YH6H{ѲS,Z$GoL~P±Q$>yjgǧ(xbxgȋ@umybk.^_M*n>٧Jo,I9ސ?Y+|3',i6͓flYb54^5 Y ~<ٗ &! *қʚq4X''DG#e-*":X^K*~dIL-W20bW`~,aƁ[0Xݏ ّD*ljڙD'W LDSoy hΣ%$ߐD6^L{ec,mhj; U](m8FԎ*-~* %ێ$'a@b\%t^/E7Vwɶdŷ_[0;QD|?J ƿ U Bb3+c@TR@ e96 JT`OBZIhQȚp0IqW c\侢cH'vƣ͠GM􇏌Igq3¸TIeOA1ƿ-c?M4AMy0ޘkE*iwt St(bՋO(_>vP Z endstream endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> stream xy\U?s?w," **.Yh8fk|p\!rIr+ w%w47_~1收U;]waX>G~Y!5^ХK<::UVAqVw>w#G^C^^ѣG_}6m(=X^hfhpByyyh4++e˖Jv cEEE|gyFIT׫W,RRR2l0𧈈{JLJCj]x;,<0ғƫϟ7*В0&&F@c陙)Zeee)=Khth\ɤ\h4 =3FiӦtMUHNNVz~_ՕGJȑ#]pŋ:-Z'Y̘1C IoڴI 57d4#WZݽ{wgΜְ0/~!Yƍ򊧧g^oݺhVh}-??޼y6aݱc{nZn~iHHHe&Ms=u7cX>,1ಳU*UeڵwNn޼iZN<<<'1hѢj:ȑ#Bq FsN)VXX8mڴơ7ODWՂ@Jd)w…Gyf}.e _pKR>޿on[ju5"߿rh2\Rh4~">}/МqWZZRJ_nڴID?# G_p3v~pÆ W^yEDeeeywܽ{SWC%n׮]+jĉ.77ۇ~8//OD +]x=u֭P\ѣn۵kwut j=}$gy^p9R3gtwvZ1T\\OէfꫯHGsJ#11>M&)qwE| y{{_tIDe0>qWPPnD;v`juVV^x_pKO<呏?n2j܆ D]|-yxx={Vh ]~UVvHnբ?t.҄-kMRedd'NsoEppp~~$7o^1 l2w͛ [5/4=Z9jn߾k/++Dwm߾}ͮhj*WPPm@.믅kvh֭['.~cA JHHF}Mjt:qUp8cƌQ [Hr~~~HHH~hڵKtO:eRD;v<={vNF={D5gȈfŋӧ CNV맟~*:hy7Nh 0jGpTFFFG{Rt .ʣ{V-)f.11QPGFFV޶m۟YJ_ Dj}H̬|ғFm߾}܍7zQ˓7Ξ=ۮ];gݣ>*o>|I&JO ̘1Cƀ۱chTzNݻWt+//_`ZVzBWTT4zhg'J$=n߾ݷo_g'VtR~9sCJ!`- (!ꑶg$&hdgM6j?Qz?s 4h 7hvW> [}Ӯλgi[?lT=z*绾j F,شjңz`m;=YZnhy<>c)$M/^(1׬Y땞 4_ZNy=n6yJP$9KlvGQ+ɓx^&lo 5_au찳G[p W499apKm{zz󢣭fXh#zT4~"?NdL2Sn3B#o3G?>~. dڰatrrr㕞 9Fg}厙2[*?Ed\1) !!_jlv\uYƩTdDu[vbe`$նmۯZz={6<<\ـD ]zIV` )tx"2Lת)dQ8lLwgge>lvv۷o;<halTFR\E*2G+$HӮ1er5gԑ}3LK-om_jF-^X>sVBieV c9NqGJἫ71$aS\p'4x[V9"=*̟?_ ;h5|o\E Y݃Oxqy^3WOGt/ɸO]pHpukРAnݒ+;w,_<88X陁2^/:Iۚs3d3.yqq!^2)a~kj-m}bpFqʕ2\> ..N]t͹"")*8t/5# ?6>#ZbnO_Kɸ\rǗȼ-NSɸ]|RNm8hm[?PVM쪇I6&O[8ljqݻHh8q"11d2)=ch !n5^mxX2v*F \Pʮwyv* sg)G\pyN`e\soU ^gL?R+)XhLOO/..vvUokJ$34靲v٣Mmïˤq~(1mOdܤ~:ʹF!mdv'&Q jzԨQ4n\nUl޼sJ_ hX<.lZiKh,>GWm--hEfIHUϐgʈ5S&>&먖TsEoWX=LѣDZcǔJ:%󼌖o-'nb?'sx\˳w\"8RHgŕV;"KE;&.6Q Sii%%%۷W@DlY NjuJ9.Sd''b kb!Q>R[⵶nJgZu{Q@|*>gu-mgxK,LС7%9s\6g8B>)B˒q~*I@5999J(}U^p%չ`smǕq}Hd.g528$n-YEdɸ-q/!@f)))J'_R]$4P_\YQzuq>'a ){j?|Dʸ6iz/.d@mik6 Z$d Rn%n $AJ;_EV_ʕq}9UJ5 ȮwCh:ugϞ%%%r˗'8o{En5m08Z&c49#o"#!{ $enZޭ T*;?233V+=077W1cW{98jYʍ # Yĭ +~,WƩTB۷}"t6$ѝ;wFQ~+Kn M: EܖE*y/R;+v}V@MR绷,[`i٬Y8ȑ#m-{O[pRųp"ߝYt3J%9KAYg'Ť%$2f{sUъ׿ I1Ν+ݻK/i4 HMMp999M6Ud4{~{ƙ{s4AI<9KK6$7g Y3ϦwgmfGxdSOO>G'=^{5voe *Ϣ]CPQɫ\ħ8'cJg)O—WR{ĉjߒɓ|lJ06]3w4ȋ3o {`m#۪2Lg=ͩ8⪌kUѰ͔-2Q́\jutttJJJZZڴi |ZbDZQd*!ϥe-y{U2t.θJf=yf_ _Ϸl=c}t AzMe0wd5͓ GK+2{lm *~Ia rN,S**TLY͛mbz٩F ]r%㢶j KGp%W"A4}.K쿜AK񌫊!*vTf?qvWLc&=h)w\d b 䚍p<%WW$} WX g&g\J&GqҜFҩWaȠn_s0^ F@ԉ=:,5#zE3#g)hrqg\OtMƧ+=R1L+1y"KƑ)7Lsq@Yqr 4f[wUV+h)w*9KC8O=HûPu`\G#ce\2 (jri%ۃ3KJ~1{=JN2fΓ_%rgGTQ{YTz3ӹѺe8j Iqx;#^DŽ:l"S~s>}g5ϨͦGlIѲfAܯ<"8!wזlbG'2f۩EO ?KxoZq\N #ycNmUy  oQIBJd͸Z3y^ıÞ5#k F&NL-'l̸?&HغK]54 ߉GSg+yr^h%cƵV|'JYB#ѣCjKUx\egQR :?|^Z_sYʳ+3MFɸ$О8[k;O6Jsڗcb'9h0b Zϵ6 M:;)lկķCgd s,{ѓx?D;c[cai:6vq?te^iѵZglHFy_u9쌌'ϳg(2JD3fC T;0˜S9@ ᱡpsUa٠o76~i>f}۴#7 6䭓j爝q:c)ΐ>dqOwq`PihqcygKL$4]EySb|^tj ]뜔qT"[]}&Pg7=SL [ml4o(bj86;Ve-NSqZק,4*2wd-Yx8ȭy*qTYÑdev_*^nI|ch%ti[ON#eqK#s"oU4Fת1(vs--EAKfˢp!oU:3֫|滷8^-F4GnغKO.bMSFdq#3*FwvSn]:q^o cm3EeȘnC_۰qf}ƶ=t)70#.Ÿ^1|Ⱦj){?$ȗ~vTv\ݤ~16>JxJq endstream endobj 13 0 obj <> stream xw`Eǯ' H $`AAQ,"`,(MitD@PQBl)Co! !-3~Jngff;q8lllllllXx=kbP£k%֡[ oL_I+Jbvl,Qe^/5e-{Oz|]UkrmώhC^x 06"OE*$u ALf jv l,^ISf7d܉ja8ivSl$p&^f]8KfM~[hcasٗO޴_{۵HS-fOf:ˊ^|Mj  _ 3}7{Lʃ-㢂ͮzҸeckRDm G=~{wRAz5]Nm6R>ϞqjJ p w46(üImj_hz?1zm 2*:ppH;vY2F,{۵nM FGK##I./q2|ɖW8GaXFK2wwqx(w)c-Sdj*R4.YzrwERXEK2H4gI{NҴϞ7ZYN/Y"2e2,'􂴈0wu80Q xK?bԋf^N>?؈W"Zz ܝ=Nͳ[n?gκMKÀ6=,ti)(zj^t@i>mZ ^"f%߿*eWRYldA5iӒc_ tRSwFr#棤rpZr,? rh)s2$ɠ5F-9?{J#FK=}ZjOO^~hRɳ RwhngMt.GҋBKx-}ܱ,Ɨz"4jZG f+"_8\o%m#騢ír$VyMgr=Ƴak b |V?  S j)}FpB1e(6o~,/D/|6a|Cd?,ExZYAuiM9rn/{R^m):3742WRWk:s?Fs $r%N$T1x7M|qphKrM-ǥ:Ғ3x hF..eʂ璛y8-+:r7'peZK|Rށ]obVV)ή۱vkrBC<ZwaM \;@@D-<(snQHRK` mX_Kau|C0&SlFUo>@K%B55d% .'\E o;;KJhi#xߑ*25 [ ܴ$̈Z2kR3DVMYߐ*2W Z7-)SWݿMHR`SΈNi'W c%MKṉO)6c/M"]]ML(yI:gG0I7-⿐E90Mꛀ1K+-CpMZx^F3KDt9"nZ`E݊~Ȑ$".1b 4 ~҉\h OOL2ˊ̗T 2,aZG%o%UvPP:ŌQL MZ~Hhl8.E|Zj{٘.܉Lx# #ǡit#^.Q+ :yH„U^Dz|b- yOtdÃe5ㆈLxeRϠNnWI0L&p Z!B(D`4GU갡CIb}92*]K9䚀, >D!g|/ISZe) +P?qUHati%r$A N{[_П40z!uPcz;ֵ1޻% N6&Z6 If|$ʅs$ FO}ydʆ+ȝ) 55ζ֗H\8#$gh%f }@;k):L aÅkИ 8HJUlL<:&|S܊56\%)z8qp9|H@96@+T7@ lKj+HRbP5>EL;$t8"KNg*N) [8מC +\ j|T?$KzѤu`Zӧtg/z fHx4{ONgBŀaYف]YUq3YﮬT1PǯB区ǟˆW;'$=:Nug\n)-.Bggπ5KNfE$A0E^{0szZ LU {bM.o:J;^v`m5UR$ @0n+|C]vB"BW~H»Jw̒Ag$P4Qԡބca~r?e".1N6M\Lyp%>\R4l/1](j5K9*q Ɣqr' Y %hB]DTfDԒc1ܲD=PmZZxUk?KCs5g.R5~EM ؊em鑵FN6 fhƾɘ1fcZwĂ~lh\%о7(a%k1 ~\|䓇-k)d/Z01khI{WKi\<>?,hM6߸%պ"$r #![i.1s(ђuP]du{A2Zr.EPplvQikZP+K1]ZG~P-UaG8eT?i|^\GHB$ũJk}{=S FKbe}ՁcT".INJX3<6W_c k)Rq2C ˬxTR F$U0OV.X{ÆרfhFKڤbn8rR U:6;@^"7Egzfl.vPCIivR rĨBHJpvwl[H F=q;m=݈$9| *Zr 8 'jR^'CJ {)ƁnjXru܄xkvqQ o!j1#b@NKUC<k=  -W1Jxc࿁RjO@]Q1!kӻe0zd1pPNK`^KNiZφqS97 "X g-&5o@ (r6MDֶMD`E? ɦKŝِBt nfTxdz͑,CI̹rNYW`.|}nf&9 7ݒ7} k%@Zr<㿖^k)f K .g"WgW\&ԋ' h6g~Nkj1&]RHy&a4Qhb`]9y9R AG|#O}0 J.b>UZ.ג#_4qMk8 L-,?³OQir劾cߕ]ir;u~*0>sVY3%WKe$>0[vygw`|ay9ߤUe*_QSQ|Z㔐ۏG*sRNwHt\|b""rEo}U;24>x_`VoA2kF?MqC40o_ph)jۍ*4/_BGkd\Uvx"eK|chqF6jX_ԷK ;D}x&i7Lpace17m1L];mťX",\Y=NlWVbS.{zf7D&Lqhc0ȓaBW']6WB& =Lѐr_{ʺdcrضrƨ{⫚jcE(8|v7!]8}M?}^> endobj 15 0 obj [ 16 0 R] endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 23 0 R 28 0 R 30 0 R 33 0 R 35 0 R 37 0 R 38 0 R 40 0 R 41 0 R 44 0 R 47 0 R 50 0 R 51 0 R 53 0 R 56 0 R 60 0 R 64 0 R 67 0 R 71 0 R 73 0 R 76 0 R 77 0 R 80 0 R 83 0 R 88 0 R 93 0 R 96 0 R 98 0 R 101 0 R 102 0 R 104 0 R] /MediaBox[ 0 0 612 792] /Contents 20 0 R/Group<>/Tabs/S>> endobj 20 0 obj <> stream x͝Msteg1_oc˱>ZVҒ͏oL`@L$@ۃӓZKUUCΫj՝ZתRԦ:{z"鸺Ukik:bMY]W>Z+OO>>iG>B9aՊتFx[9[ Vm%hlW[D1 ǘp?屮VU{gЧLأ 秷g^&9uF usOWfݼ kX79%zVI2Я}S(4kCSPeh9 ?>>[kt]p/\$E㕐OƉ92!͉z+6-־:;;O)R =!E)7%E#ʖU0YC0C6i^% V=1t{5of@@h8WHQrf{5C7}>rv‹nIYv@@V8Q xeeH$۴#aA-`hcsӾdĨ5=VJ~ PI;c;%9 nZ\݁)}pK z.2$;T3$ X6H@%E.m#g 94mi Ӻݔ[j" 92ijٔqk(j(jCS2G&Ӽw 14Vδӊ.{毹 pSQa+fVns0dkda6EŽ`t #e X<Ҙ+:mh$R"q}$R6x`D|$}.s |hko*[R86ڧ"a!۬`A"ëFn#<0GF`ԣuC0&5¶X-7ӗfqrvqf~{fr֌L`ߔmJ7j/ZsB%TX,TdvJ {nLH@i @P{3q/ޮ$z#mVq>FEw6LMNt㎆r}rT;ds4H_))Ҥ )2ȼ.=aE93<q 2VhaQUP9:<tk;n"*'HSRdit*cxFf/ f{a֚#ftO}mح TamF4ۤb\5IFw=0!EqI%)xFf/Pܑ-y1۟38p#wʜoxc_azs&ޚv'ɭ,. r4P; [ yXC&N qkV4Eɗc!1% 0(ϿUzj5RI?9Mҏ24=!E9%EFUZ)|8J# 9L\t;-d ("3֠ss$QXssB8!EZX-Lţ35_(@բvba_^v=w- \֒ޱgIK-lTtnLk t+QAt>Z:&#^S?2 r W"?SʯBy;͆Rkx.4vLɾDyΌ ɷ YmA~2l}=pp$l< ~㤡6 UxBx=9,Igi(0䔾{7,BQd@g՟:o#` }2h%팺ք}&G-=i.rDZצW_Lcp.AdT2vz>Jg㇗F^8t"> endobj 22 0 obj <> endobj 23 0 obj <>/F 4/Dest[ 25 0 R/XYZ 82 721 0] >> endobj 24 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 107 0 R 109 0 R 111 0 R 114 0 R 116 0 R 118 0 R 122 0 R 123 0 R 127 0 R 131 0 R] /MediaBox[ 0 0 612 792] /Contents 106 0 R/Group<>/Tabs/S>> endobj 25 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 133 0 R/Group<>/Tabs/S>> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>/F 4/Dest[ 29 0 R/XYZ 82 721 0] >> endobj 29 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 140 0 R/Group<>/Tabs/S>> endobj 30 0 obj <>/F 4/Dest[ 32 0 R/XYZ 82 721 0] >> endobj 31 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 143 0 R/Group<>/Tabs/S>> endobj 32 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 144 0 R/Group<>/Tabs/S>> endobj 33 0 obj <>/F 4/Dest[ 34 0 R/XYZ 82 721 0] >> endobj 34 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 145 0 R/Group<>/Tabs/S>> endobj 35 0 obj <>/F 4/Dest[ 36 0 R/XYZ 82 721 0] >> endobj 36 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 146 0 R/Group<>/Tabs/S>> endobj 37 0 obj <>/F 4/Dest[ 36 0 R/XYZ 86 442 0] >> endobj 38 0 obj <>/F 4/Dest[ 39 0 R/XYZ 82 721 0] >> endobj 39 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 147 0 R/Group<>/Tabs/S>> endobj 40 0 obj <>/F 4/Dest[ 39 0 R/XYZ 82 476 0] >> endobj 41 0 obj <>/F 4/Dest[ 43 0 R/XYZ 82 721 0] >> endobj 42 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 148 0 R/Group<>/Tabs/S>> endobj 43 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 149 0 R/Group<>/Tabs/S>> endobj 44 0 obj <>/F 4/Dest[ 46 0 R/XYZ 82 721 0] >> endobj 45 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 150 0 R/Group<>/Tabs/S>> endobj 46 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 151 0 R/Group<>/Tabs/S>> endobj 47 0 obj <>/F 4/Dest[ 49 0 R/XYZ 82 721 0] >> endobj 48 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 152 0 R/Group<>/Tabs/S>> endobj 49 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 153 0 R/Group<>/Tabs/S>> endobj 50 0 obj <>/F 4/Dest[ 49 0 R/XYZ 82 534 0] >> endobj 51 0 obj <>/F 4/Dest[ 52 0 R/XYZ 82 721 0] >> endobj 52 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 154 0 R/Group<>/Tabs/S>> endobj 53 0 obj <>/F 4/Dest[ 55 0 R/XYZ 82 721 0] >> endobj 54 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 155 0 R/Group<>/Tabs/S>> endobj 55 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 156 0 R/Group<>/Tabs/S>> endobj 56 0 obj <>/F 4/Dest[ 59 0 R/XYZ 82 721 0] >> endobj 57 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 157 0 R/Group<>/Tabs/S>> endobj 58 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 158 0 R/Group<>/Tabs/S>> endobj 59 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 164 0 R/Group<>/Tabs/S>> endobj 60 0 obj <>/F 4/Dest[ 63 0 R/XYZ 82 721 0] >> endobj 61 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 165 0 R/Group<>/Tabs/S>> endobj 62 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 166 0 R/Group<>/Tabs/S>> endobj 63 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 167 0 R/Group<>/Tabs/S>> endobj 64 0 obj <>/F 4/Dest[ 66 0 R/XYZ 82 721 0] >> endobj 65 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 173 0 R/Group<>/Tabs/S>> endobj 66 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 174 0 R/Group<>/Tabs/S>> endobj 67 0 obj <>/F 4/Dest[ 70 0 R/XYZ 82 721 0] >> endobj 68 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 175 0 R/Group<>/Tabs/S>> endobj 69 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 176 0 R/Group<>/Tabs/S>> endobj 70 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 177 0 R/Group<>/Tabs/S>> endobj 71 0 obj <>/F 4/Dest[ 72 0 R/XYZ 82 721 0] >> endobj 72 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 178 0 R/Group<>/Tabs/S>> endobj 73 0 obj <>/F 4/Dest[ 75 0 R/XYZ 82 721 0] >> endobj 74 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 179 0 R/Group<>/Tabs/S>> endobj 75 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 180 0 R/Group<>/Tabs/S>> endobj 76 0 obj <>/F 4/Dest[ 75 0 R/XYZ 82 622 0] >> endobj 77 0 obj <>/F 4/Dest[ 79 0 R/XYZ 82 721 0] >> endobj 78 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 181 0 R/Group<>/Tabs/S>> endobj 79 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 187 0 R/Group<>/Tabs/S>> endobj 80 0 obj <>/F 4/Dest[ 82 0 R/XYZ 82 721 0] >> endobj 81 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 190 0 R/Group<>/Tabs/S>> endobj 82 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 191 0 R/Group<>/Tabs/S>> endobj 83 0 obj <>/F 4/Dest[ 87 0 R/XYZ 82 721 0] >> endobj 84 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 192 0 R/Group<>/Tabs/S>> endobj 85 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 193 0 R/Group<>/Tabs/S>> endobj 86 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 194 0 R/Group<>/Tabs/S>> endobj 87 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 195 0 R/Group<>/Tabs/S>> endobj 88 0 obj <>/F 4/Dest[ 92 0 R/XYZ 82 721 0] >> endobj 89 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 196 0 R/Group<>/Tabs/S>> endobj 90 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 197 0 R/Group<>/Tabs/S>> endobj 91 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 198 0 R/Group<>/Tabs/S>> endobj 92 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 199 0 R/Group<>/Tabs/S>> endobj 93 0 obj <>/F 4/Dest[ 95 0 R/XYZ 82 721 0] >> endobj 94 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 200 0 R/Group<>/Tabs/S>> endobj 95 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 201 0 R/Group<>/Tabs/S>> endobj 96 0 obj <>/F 4/Dest[ 97 0 R/XYZ 82 721 0] >> endobj 97 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 204 0 R/Group<>/Tabs/S>> endobj 98 0 obj <>/F 4/Dest[ 100 0 R/XYZ 82 721 0] >> endobj 99 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 205 0 R/Group<>/Tabs/S>> endobj 100 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 208 0 R/Group<>/Tabs/S>> endobj 101 0 obj <>/F 4/Dest[ 100 0 R/XYZ 82 702 0] >> endobj 102 0 obj <>/F 4/Dest[ 103 0 R/XYZ 82 721 0] >> endobj 103 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 209 0 R/Group<>/Tabs/S>> endobj 104 0 obj <>/F 4/Dest[ 105 0 R/XYZ 82 721 0] >> endobj 105 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 210 0 R/Group<>/Tabs/S>> endobj 106 0 obj <> stream x͚ߏ6ߑT%'ZNEéf9.[]8a,NI Y8qGAJ8<Ħ~{!V[%def<lW Jyc bzbt۳wѧB듦?R 椭J AΦKo^[[eRR=iHE&64#o/3f*eQ63dLҬ[qJPWvߗSve(6D?J]w5]ueJ,DMl=;`PP4ş-^[rO;AJv.4}wCU +%bM7sgQ8vyqt/C^y]*S!x)Ҩ!)2pA)/`xw'ٴ9a;gs~8"HGj.K_| _}sO҃sNW.dyCׂ"CqQh\1ÃtHk$lW,'M.">'#q9K4'8I8PCRdP{hz}Ǐ&Ё%\[?V'i,6ele > Y3Z|{!:2Jv3'Uh9E=$EE=.[Fe]<`gsLJ#1?zR2WeXʜKg:ߦuΕQyCWJ]PCRQ!)2}R cXVc |vLT!;b*'36sydHi`E endstream endobj 107 0 obj <>/F 4/Dest[ 108 0 R/XYZ 82 721 0] >> endobj 108 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 211 0 R/Group<>/Tabs/S>> endobj 109 0 obj <>/F 4/Dest[ 110 0 R/XYZ 82 721 0] >> endobj 110 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 212 0 R/Group<>/Tabs/S>> endobj 111 0 obj <>/F 4/Dest[ 113 0 R/XYZ 82 721 0] >> endobj 112 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 213 0 R/Group<>/Tabs/S>> endobj 113 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 214 0 R/Group<>/Tabs/S>> endobj 114 0 obj <>/F 4/Dest[ 115 0 R/XYZ 82 721 0] >> endobj 115 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 216 0 R] /MediaBox[ 0 0 612 792] /Contents 215 0 R/Group<>/Tabs/S>> endobj 116 0 obj <>/F 4/Dest[ 117 0 R/XYZ 82 721 0] >> endobj 117 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 217 0 R/Group<>/Tabs/S>> endobj 118 0 obj <>/F 4/Dest[ 121 0 R/XYZ 82 721 0] >> endobj 119 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 218 0 R/Group<>/Tabs/S>> endobj 120 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 219 0 R/Group<>/Tabs/S>> endobj 121 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 220 0 R/Group<>/Tabs/S>> endobj 122 0 obj <>/F 4/Dest[ 121 0 R/XYZ 82 638 0] >> endobj 123 0 obj <>/F 4/Dest[ 126 0 R/XYZ 82 693 0] >> endobj 124 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 221 0 R/Group<>/Tabs/S>> endobj 125 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 222 0 R/Group<>/Tabs/S>> endobj 126 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 223 0 R/Group<>/Tabs/S>> endobj 127 0 obj <>/F 4/Dest[ 130 0 R/XYZ 82 721 0] >> endobj 128 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 224 0 R/Group<>/Tabs/S>> endobj 129 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 225 0 R/Group<>/Tabs/S>> endobj 130 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 226 0 R/Group<>/Tabs/S>> endobj 131 0 obj <>/F 4/Dest[ 132 0 R/XYZ 82 721 0] >> endobj 132 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 227 0 R/Group<>/Tabs/S>> endobj 133 0 obj <> stream xn]ا>In k'^8=Mђpv;קy̨{k׌K3du]rJ,,*}-^^}ZeRd$3VHT+\]?º-53oUٻY6wv>?A+46w02[rYasʬ4̤ңW[U\hEު4VaxɖZگf)Zgs2N x/lRϺm}uXYʤ0rTdRBzPBK.4HQ_g ?(Z\EGk1됋t~@h]=c6{Ӯdϥ >\P-7eK; AX5"5@Nqpo\~H_A?j.ߤTAyIE/ tų$X›o㐶F*!FQh[ +SIN>B4B *W^WGԭj6H }h4(Ay@,c?PY[ X+,WF7D&J#u%.ᵲͻb4 iJ Rx.B2jLB/AϽE>Lk|TzmxTE%Tr39gLkNmI1rVc⌨և`xT"hR S81VJBh+ыx1lV5+DO[7{NTbk<[ByEyŧ|1lX\$M$nF>adu6Ō \ k0 # 7  ! er:LnEQ0S|@iu)\\1%T(8QCI.0Fy*:0p^0E:V|4eQ]2S6>4s]4o3][d`Mz^:Ȯ؆?좰 8/;V;Ŗts"?EaAVq8`'ڔmls NfT2&\m.ܩl0 rácw=&=pv3׶Ф3kcК'-iu9rs?ԑ![*8U0S{@*4:p^of`njWC.:vz}hם :pJ@ef5J33s~e<q?RZc7{295iaqu'w>e0N1&0No~B4h,$=nDӈ0B@ד8;ԪRDpn(Nsk%!&Ng'$ U2D%0L]|tL%q:Qp]{o\fc8`[dᴒ ;T= P'f>$]qs~ה@7F-RqzBWRAT{he{18>oIgC7ƝsdPV.E GVӴQiA&># Y@/jjs{ Ȝ5G;t:*/dFI!|Nn }l*㩑)pA/q}0,a빣FΦ3P>L$x/ 9^ >|gO+tqҘխL z⻰ `e=TWx DyMY1Do\zЮ*^*vMcHhk<|E79$񾤙igRܞQN1HEAqxŘ3Ѫ$Xw+q@:j܌PM*i,Q"´sÓ/b\,/ܘMhwoV*k+惈 endstream endobj 134 0 obj <> endobj 135 0 obj [ 136 0 R] endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> stream JFIF``C   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ejzg@7dd[70n=jSmyHG\=ֽj7>9#OZ{4v}?{'ǡմ۩|{id?'\8<+ci<23G#~(((((渆4#PVbHp?@u1/%osι6~`Qg AơfKw_J33O+ȝkPbd?ߑ~LH] ZDx2p9i5m"Jdȇg?0jS\&-Qo@ $4yo||e??]UV1cRO=YQEQEQEQA8{T<0[d~b6/-3\ʱ{@;juMcP֟gfR=@迩VXK\f3=vYc1?aJa X$͙L3cX`Ga}Uy{i'$Ra@ΆqK{|[ۀ 5,.d##=5w|sZ!gb|sϸ?J`i;&m* ' #Y ٮswgcoGqooY:sknrpWI[ 8"{3H~S@hEB ( ( ǽ՝{m?kHl7܌w=YQ ¨>sԮ urO2JjBcktφUQ#qy]1BR `pr1KkkoeWm7{w0Zdc[yLJZ]Ok{ra@-uVIT}Ǣk}Yw˜mGWH bE򡷎(`mP1糽ת :Kq;W'j{ u5mdW#1#PV}p#|7u^ZXyEWߕzt彻~TWL6cu$#ڐkS 6ɻ;TIbqW4]"Zڼ9 'wxCMqn_jUCĝ=t5<1Fzj2=2ؠ;sI:HeأHXP* uSZLZ)2)hu,E=ĞZ3rpI'6 -ғvsʶ/-,eu:Yjqh!}3@Iq\)ufqKտ{Gi)i%0F=zҧtج;aG=Yy^P}y,}ZKo2Y8`&vTV?ù!}>cIi ;4m-$R{9,jJKlGq?P[b\a}}v*?ޑad!]#jeABṀiSx?To}]SIɠ 'Թ✗r>QTyֵ(X*qIE4 (,5i*&[*Bhk%kڥTU(2>V" Ԓ١o*`1ZP>ATZ;9 o!e۹T/^sO521\ոcNdҀ0RqAգK@ D0:(((((&-QEQEQEQEQEQE endstream endobj 140 0 obj <> stream x]s۸3|2 J|H;Itr&M>2xjK>ɾ}wIeӐ/3R(bboG9"3߅٦:>ϋlu|/?s\ԌíBif~\f[3_,7;?`ƏGE!$c:7](m`b- :+tDhzMErA0"bϑm=nLS*#Z/çg!`q2Lmh:׳%|.|f7Ws3Idؒ #Ubl*N8_zns~/֛~T+xӫeVTY_ y Kq& [XʀȜլ' B1>G[1J Z܀`sJ)!]0]NͦbO%gErJuf:Qj D Ӊo()Bz\Y-vI))M7O)q? gLui!5#!`q"B%*Bl`#XW2o ^p UoS՛tc8S4s9%@)mBWaNǵЖغ'ax Zh=β-0#솦l!ݭptŠUBVL,[ `B(+k̓bN%}VPng]Sh(RfSeI;>yj%Q4iS+i8;) 1T}_Fverd0qFŞs‚΂@.II mjԏKA(7B@@L+qߍ{w  |4Həvs8MA4c0.g \A8 b ߓ PtU!^c=6cWr&`-0FpL[]a`u m~_cq"!S[+u Q+9.x'uNxqbsY*"9_Sbk g 91@ cpFˆev<(!ڂQk WZ[f=J<QsKKy\wDt*NKd\i ?\˾74&exh\F&_ƶݮGfs~(v4sfY.crIX:xx}(Up'Z{/ QA+'z;ޑz.P:j0Wb.&e81Вt-֜#ΨXq^2pe9"xEa\lƲX 6uK- xeYȪ^'Cg4LxJєC<|@p r,늒Eĉ{b 6ϖkd|H>}yۑ/ 9MZZwdIQx9 =+ƥh)INr]1Ec)HxlA?y׊ TM  XTܜtܜ%DEr'Y`SJU:qp+kA䃂;,{+Z+T t?Նͽ޺=Jn 7iEFW8Um`t*9<]<\r_:&?'rQb^AW~'HU . ,) t-&`Z-hYl(,-ڠ:+3~Åt{E?D4&YK`GnF%UAuBx :)[}gxfGF#xCp1u}(3ūfk<[JL_Vw<ǗY!ob ``wS&WX^.wZQ5O7C;αt<,}فVSHI|D a $&z!jI]6+: Q4[} bJ2osp!@|XXfH'<"zg!|̱YAh LG$9e\> endobj 142 0 obj <> endobj 143 0 obj <> stream xZo67AVpHmm؀Ͱf^|kݑ,Y:9uh@K<;OqkD^e仟E9+Tvy;p+2Y8<*ff{ݭa߹xf:0ߦ`ƋAH!Ӆkx06ٌ fZHi'jM<*zZ*&exAs\65վlO_mO)sh2Lml].As5,<17Uz-xc7xrulM@;*;%oy 7 f}|> \VY`b0d1bc=LDW8eCV|+xPb [uQl%GTԊ9<f;B3mG?4Gq >9^ca^񋈆gUWe ܽmQ*'Ѕ;$}ZB2 l5){t~+E!*uՊSָO\Fif,}fQPCبڌ|uWz e`|s4s/a_?c, #"s"1IU1s}VocƧ, OÚ,,Lad2F  Aٌ`PtHa1L"4E EP ;lu9׳B$A3;AI#imHx3>c4/4Ǎ f$ʡ}*[-nC%/1.f"^d !xD y9{8%C-To~=B7`k꨾1τI;BR8dԬpvX=4%[E$aݨWU~}$=շ)54ږND/0&0K y"D.,$<"&^,i H%#Ib,Vn ,+$y<_U)mYa(XhyH NAOx#]@)f[TbU3X4MR5xZVv^0.5<1RXE}$"H. r#cGa(a_Q(i[;;R߿͕c[W+(ks/mdqOSʍSRE N'TiQ\^5E8RnYn{aG!?.!xHк!m:n%ǒ$Kh#y0}9:MvR"E`cSYJTfĮeBNb6U% -D [5.u-BmЧH+VaRuBIۧG0IdR$;p3!صM1HNXsRTrtaI\R9XOWkt5膞ngnP?e] p92u'?nl~r<: #?0byp~jeN&ּin`_{ iuDp~7OvZlY4,#poqۥU}I/AwjG&DIK&w?i'XC2-uz|pBSMu7"Q-y^)Bm^X7uG#$ݠAp2ZrC}IuWOj!5]yG8UK`\:?4#a&Y3YY({NWlit#Sz@>a g۴#Y|X J#׵D3aѡ pG)3}5 q2FAǸ0p^ endstream endobj 144 0 obj <> stream x\moܸnAWÅ"z@KkQb#cE{gHDiK^<#}==IH eQ)L ӓ֧''{"JI"˛ tID#- [D~n)~:=F?ߟ|e)8#2Q =Bǒ)bdʄ0iAtDQZ$pei%jt aOqԍ68f~%|vTqC旋 EXڔھ0\w𱾍9Hy&_bxhH1&8 M$9`/7;<?g|?>e1zSL>:BC[G^,WZfy@ uh 3ҔH!#Tm!R{'Ǩ!u [>f1e2bPa@@: ;y@v!Wæz 8{ CuvX,O8-Zg` -U)_/3nn›OM^/T/VT" Z'r _×҄Tw u.RCnMBSϰK~i;sK'MN01)GTK 67I8p99hCQ"@p*,R%8gg߶o<TDHxvhM:f9@fa0 9.`Pn 5,t5c7IیVN+vAC eo ;<_*XƩ~M|\ (MQ{qu/n햌n2,0uVU x*(S0eGuƘQJ*lU~ *C}VY?`!T$vHC Lf{ر;O^du?e~|U)S7Y MkAMjN9K`~J[8jD;T8wn Ҵ28v!9̿"VJ!o{nn  N?*w`6ޞյ-˙Sdr?\k̹= 쮔2G2*6c._5z}}.%>f9@Kf_1 1(I퇮}h:1trSXBcGYPU?HΒPɶy" J{/7?4eG#UuwT_=9BU׻Y"iއ:b0INxH>U@϶;h^gAKk<ɈcAQ$GFQyWɘQgn|nn/Sܯd MgP;S6_0\H4f@Zҫs]ew`u5rxmV5 3+lLýơTΠ5CO5Wt endstream endobj 145 0 obj <> stream xko" 2ϻmZ)4E4uX#mwfv@4y;w3;3;;qz \L܊ɺ<=䛋ӓ?+&LM.NO8e>)4p)Wbrq p߽.&8K*DަdEV7𱼞ILMt{ǝ#ɰ2FYbl*N{|x=;̺o]9^8%(p pgY&Wsˬ۫&ɤ&0ZyKjyc]}eb,0%j K%oWz̙kθ%qrՙ\,~~y>j*t7N7[ =0<Õ%]~. }5;Qڛ+0Iamnp/[2pgi#\Au,ZhԜ T1BbiQY~~ӏO83SJ &(c?θ6 ޴v֐b SnkKDHI2`Ae"*nXRKFܙ)pQ$\H(슨!J)pY)1x7sjZy ࢏(X{ÉVld E޷)c$ s 1p;l䦚,VЇ4vsc%X:FuBݒ \=ڋR E%#yXbO ݡؔn#'Cԩd JHQ"U:iMlnmo0]sH cu"o h+[ M |s9ZN1 GMHW값`.43`Oۨ6}/_|Jr{\ XC0]jca #n2q\Ȱ ňm=@M$/&ڂװ+f_ s!< Ux 8S9'˜oRs)6U*,h (ܠSg~]1^e)yHQK6CT'BjbncOq5=?4_u||oʍ۴ϖ^"sL*^MK+gZ{2jÏ0DK%:˪`HGc/M*'OzM0%*e*WDAaNFddA,F'Rdg&Zb,)g8 34E҉@(θ|5 l!JM]ʭ tXpە*3]P-|9y]9" m+S-EŶ㓅šn"s, O9tJ|w!.8s9 }Tɱ=8qV}LC0HbX9VJC g<ۦSq&CkђvNmD s&al1MB>qN_JO){x)S$*,G5dcf8ZpZxpfN)i!j R&/S'qkPL|9^M}:Z~EUHWŜŕʢ],(W8xYa05._#,$+%:eYYg~y, I-'hg{a* #Y3<1 ҌSu ao{%RWwuMOOOHY69hq"z8n0@"2lc6 8売 _jɋ!.j9j6=T8x 4 ̃kW]oLV!4*RäsI{j<A:oݡ͌yp, z:;~K_GH u"a_,OD' x(f=@y`zOHW~9/pt Zx?(1 UޖKiY:Fr{Gia>%zdȽƴMAݭK%rZWfr4it ŽV43eX;a:IflîR<cELt/[g)OCS3/1 t kj _@PqHHvNizSq(ႁA݂R PA1 AtNU <HjWdbqK#{ΫP*4I[7~Z Ͳ&8'7H޴>대# yn9Ϻa9HkÔs!ik!">H{g`3G (q]qf Iu!l7)d̃|3hw TA遶j=_| endstream endobj 146 0 obj <> stream x]f?#f|,6gb;$sN<ĝO;NRDɎ `w!q)Gtꙓ%b4If;_fQ󳯠~=G.Qid:VӐIxKscIx1`~w颹SX{YCͶwy"HqLAl4: 1[>ڌ}?oIs?-T xӫN;(<H~u6Q5|w%BRjasz@(9F'8$MO D'2;E|Q߭WG Xټ GgyS YN&."Ebjy؄Op3j' Wqi%S٬Yل``0M}k1STk a[k)M\\ eedG ~-20 W+gʇML$3!Sq5(nUɬ VbFpYIPYGn$$QUJ̪$fz =˛|RʀeU <>3¶ևZJN" ϡ Kt6CTp:g?$)Sփ9^zsy@vT!By:Q Gz_1}\_ O ^@#BڇQ963l{ u* A`w/yJsmzـ˯s G9v $FExN1ȼ<9QДeaJ0ɬ⒜ / >@QPGbr—v[?P=o6[Fz;;߬ <7‹0"_HsDe2| +D!BO&MU8E(@3M aS~TusdHoB.`(|<¦5QzǧQcDŽ=`HQ0|*WEbQ{"\u/2#8o,qa=GA~d^!:2iAzӜIԻJF s$M> 90ĺc(b0V7?A*(bl/NAXǨ%v}zطa"?J@g#yHBȣ7+#v-5Rك4 _QY#(|tA ӫD2afJ5>ǰml.yᚣcy䛹[ϼq8SR=f}fu,g,xT^`Ƞ>Ll.gJ@-E~#S&itoI6*{,MSF0+H6 3ُٴ' ~MR=̻Kc.NЄ}L{BbjЃȔ=#b7 o(i+ǣn̘Ac`"l*Y:P a&;vO !HI})^@$oP>L$8RXBOCF*hA #29uٜԂ-)OaQyRˀU"'+!Qj iMKK;(Mf=@QF< `'Tke!(LBuN&JeXaHu:#+baB ᡜ߃ѦREv*]!K1VJR/j0kjUT+|zy zY~O%H.,S@tsg@E2$BLM0fXsH 1M$?TTxJi:A9dNq-; A6e0F(緶`ӘnL&ؚ&ڲ, n<:>]sRXq-ɍ;峿a9-xv[loԜX'lƭe!yoAOCWIl"~j^31j?jKexrIVBHte^ܢt.oP;;_/{n `[v8 "{xR8ʮP끋 N72#:dVD"ab۫$VpzӇümoW&= kοي@2Zr7"d ,%ئasH!FDczSgaKHڐKgȰ}ca5&xMK؁Wu뇉׃ I6ᆶ#TD ) ̥QeXI:=DbL܃hecVN-ov e`W )!ݝLbn`ݠ ܅ RoW~JI)AkjH :G wdc;t**+nބ;J -!4zD+/^՜kR͛Ұ}ijȵ ~@1pD>w$(u -p->/2ywKI.I_)2ɅUڏgGV.) .6~uɦ25iXueJ}%﹙M"i$;b}&k# K8Iބ,  . X#aO/D4@56Fִ#:j,4 wQ20rSڑ3ܹ`}]&IDdIgzTnbRh4;86I&\N%}õQdx" endstream endobj 147 0 obj <> stream xko6P)y|Sj M-.צzכ(PJZQkRvdM#΃p{qW¯+dr3j_~dOOD&ӆ<9LN(~{&ٿ}؈ B(@ Hn``#-+L g2OrDHf =z61. FY~PaL&-xLR8 L~kb=X.mSE.҃rL:ty&;PrvuŚvĈ:DI `th I)PumAJ~R,(H?`c7dWx}.).'ْcO.6OEE(5+h\v;ZtF(Ǭ Ѳ%ӽDY'LXwzQd5f%>xCܞc j0q0kgyEr0$4es$?!@+cXVgNj(k kf r5` <p J焿^T't c3L05q$@ߖH :]x'[hdG؀9R0+w( ;mwcG#!D且͑rS?B=c݆ 1uك(:SUY&hziWIAiA"V 2*̪? ´be~M:uj!51Treh-ų Yd VLrGڈ5X$Kܝp@=ffzLw*L|џ1wHbq5VTzRbZ!e2)ϥB\yQjz9Xhw/Pẹ E7kZ,g7YL|`0?|tGgT-1'qk1mhģS;< Ն9T/#ڪ2k$ ;l$@FBi4R~VIh%}W}L覢k~8dJ. V/(32$CVi* su?7Ӷ r1 }6 M:@$n]T3QZ0U1_A  m94`#tوn 4fKKɹBǍ(c澴ӣd$e74v֫4}^m.@5gQ-[}Tޏ6l}<vucL-m\!]9~p!a9;V]| Vց1 t}$kLUWJXa_0#O/w\J]"""^OB.٪; UJ`,LZ啲qy72U}ݭ 9w,q4 -3RAu-t5TIuuW|8 U$~MlH"~b.'ixXVXq2X;79\1#"=|] QAJ/TUX*q[U$U\f| ]?%yIĉ2B+?(cߓy:+b~FYs3<(w bQ/h>0S1@~&ȿCß-#HrxFEMT$7#1.#Ȇd%71|?+] a Q>ʯ4 uB{Uq%h?3r̍#;PzrpJ2X-{ nA'zU|QMk,):f6-B]^wÉ@hXbr<3r|ka38 YL ﲕ ʢhCYC ˶{C2 [ݪ{<,tJ/Dssou endstream endobj 148 0 obj <> stream x\]w۸}9|f&ɶ>A+ˎXR,9u;/R"1)fsI  ħ"/_xVd ^uͳٿg:?+129?c+2Ue+-\U=྿ݚO/lPOI!\^ ^d\re"UVɼUi~z):/e0ҀZC_ s1@36fP7VjˌNO3,U.UN=V֞,YO<~I)r~~}۹u/a~!f93,gNNsdu^˘c4*1*׎ "4u]]—_?wXOt'LUb|;! 5aoGY2Ul~Y=[=m!S@tY]be#+mޱ笚]N.\1_&?/ 9?MhG*e6tF m99!h8Lrv#^00׳zF^+W [jA&!hA4U;Mȃ2$UPQloz~!rl7~!l]t+sbBC*fȌ[POq7cak{H7ol?جkU&5W~/8lku0Ŵ\eSު1rK>D,7b &eT}YrӎRtoB ;|+g>8}_6 ,G޺B;t Ctvp zz_]7Gnli~o7Yg0pgSveE'6Eʘ!YVɜ1kvQi\uf:d7--+vC="_g0.+:0?2/2;nhB8L|lq;|77r@b"1;#oGMn'΢e-pݥ+L.6FZCÐKF+#6JtS]Lu#~N9E.t̐7A?3=4 9!Ruf,jvp7ry(МcC\X3!ˮLG9\ rDH\=YPCO-D %Z)Չ9rvB-$rF}R'_JLTSNSaQ p3yU)iq Bf%N 0k޶JNx2JġDNyDv7j*pۙ  .!V( > ޺S''Flx8YhZa!N Y;$8(Oz%B_o:=> =ߍkЊpee_|X\7C^!&ihP [022|#<R]Da7m!׆8WĸeUhFX{ض_ٕn,4ym6e.nYMN3iPCMm=vOnօ@nGJn'œ0}Q%QAdQƅ@b(s((JC`WpO_<30h2H4nvJ}^ش)!ʦB)QFHE֑82\iRu\w4:G@xT}<)jH`if3'߬aQۍ[~^fqr@b`۾fLB1 Ř 2f/x. ^;1H~$vJ1&KKϡS1ʑ)W(Ε%e8WW6%DB$I:PF+m ]⺒8W֕\<3qK3&0OYi/qveh>9kwև^NCTz ,7;-4D@dKx8*O\Cqi!o@ :')N0E:EM Q B2ZFʈS6A Nƹ 42)9)X@Yt>@_~{@7pq4h.T'Jf'Vu*C~NQQu ):)E"pO_;]7MH3I=E#L3ƏiB<؆^RkIDIdzjqLl 輝8WOP%qi-8n+fSZlt `GLCRlR4ivhŦėNZlIqcȵURl87!95ޖc=rRs|Z6-6۠rXg"`П ?)&@H pԟ$,IşEI9%FԡKc ӹИ*I94ss|$]3 )1IXRcJȉXU9uQAh*ИEjDI>n)Jc6%Qӵ@Tc4&q1%iIT>7*Ms}LszoQX/ф8q}h&>' Ksi'ǻD%i]p='?\['KP_8uFi@#*5:VrPLuRMItMW-@TuMЪuZuR4*>膤Ǐs' 3 n3ûK|t?!%V<Țc{wfqu&0oaB9MiRLT&75)iˮݡ677/QALxãzOXC@'ȯe܁a: endstream endobj 149 0 obj <> stream x]mo8^A*U| >=lz6%qv$Sn:8g3gHAO1I ɢy~8yɏI$=˔U5\zKq^0)ܩѽU&38>$@S/WFԘմH%*PN:'UCVi r"%\?]Ŷ>,d; JJ^n5byvvƥoPR+*եYQ*"_By8T>:J;R&2&Y|\T. {*u᫪(fL9  oJYm豉J_H̪vhO(%?ckuچ3&"ƒ-^Lg)۸@}Fo"g^$jE ?Q3J:39%55/1\6 {6xy 2A\Fyꌊi2Os4Әa^9k덉̯#z%/kYz k3Bˬت49i:8bHS Q**x c;$*$%t5GդL8ԡjYjXE^-:F%^tbp[h(׊1 6=EѶ~TjCsjkH:l5 "?De LJ2f0c"puBB83XNjF*K_wLdaO8t"󡙞b>rCYDa]ˌӥ"fR8q<č3y}RN#]#>X : ~>5X4b-0EՄhg(iQȯ[]ݦG4S}qc\w%"08~B9Q5N4OG;orqؕ TO*3^'4wnlKMv9dxc8<%Qp9q2vOx\ xb} I*5GԊRY-ziXҶ\ tҘq\|}{1KvLv p%Du@?\4劦OmċBfR S&MX*&,jA*ȢS:my:C4}):s`WhйK1-;W bOڅvi RC p'Ut,E|ƾo (R¶Bamc~`@,x _ϯ/`q/r!ih-YdRnLe, dR񬬢G6Fv5B;|T5a{|;=~U ~hmp@ E<9VX0!:i1EK u;FV pT4Kz|7"n{|G^c4%=۴Qݟ` X-"B 9Ѭcگ^l^{1 R9N뫷&BzC.?=BΗ8%h-[OԽ+v243=<Ӗ3D7O%.|Nh.adz;gá\bJYcxԌF7`Ej[8Uqh0u#-&sЫ;!6Pm\AtЖlFc<06Gj=]?cfZ^DD/p~^h.az{1 OͨqZ~z5l.pby/xyU^Y+Ϧ+Kj{L=,-@!qX=,pd4OB iۘo ,^9@?HG5V2>#]>F]Ž j.[%ѧ{ Q;qAEv_eߚi4@-y1J6ܺ|IYHhb̳J}++Z1osiG,y݂Fikn'NG]?cdR*3R̡)[Y`718Z2JPcU"2$j܋:r?i^UWxUpsc Sі觪1_9hqsOÉmkE Y$ŎK 7yAԌ*FݙbYYX>؎tȖ(DӷDweth߻i)h'Qq{3^+ '46A)V*nnTFcw&[pMX$ > ']쿌 \ٻ Si.9Neo(~ 9y G M7lyB4}C ahd\ngcGcCI~E4+anhYYhf Q~y nVJfw8//iFiWpD5|blk-V!1I+ƀ0VKF׏A~MQP($gzV]&/QZ1Ht |]Ub7 w-y78ȐpuVy'},NK㭏x[߸myC4}գ{pIGVݯqt'v9-ݵ?.e8Ɩ/ ;2 Y][mI1M %Hӷ[Agʸ Wmw]KPf0kv-QTl 3Mm-~LL m3FM.=c OP1C߽vhAoP/TM-+Qc-Kd-uoY[hMeRT"~k!DzH5 M;rN"Lيz nT(2|e@с͸ni~* l+_Q)PaEq vu6=ݤG,itL,xwf~n 4D7ssTY E{ ؜( z3X gt(]q5%{u.=6\ȅ!(Wu<:. w2p &&@+dgK8C Ayw}]g)GzWtءǖ=^9*2# В+i[Vi;,iTs"PQ;OݳGѷ9,xdt3h"[Pٙ=Pv(QⱵS{X}֘\C<>$ɧjX_5f" c>_\^yI2( WUL5n+2JpSe(JҜ9dbmDd,A 3~Ux q*3ܠ湦L.=Qa99诅=|h" 9C:Y5F!uF}cNH۳7tuA// TŔ9 I[S<^<6kN۰]ͱ%ZcQ?>OmxNP>+cFNlz}yRJ}Bk.tk}9 T߆ֳx\0QPh+$>ڜ~8h:m)xcӚ| dOx<n>rh ne}n qL?^WfPKc.2T릔x^ ^k%u;CݚZbjtKmSAv_9aNyHP*ǼCMQkzLP '7)AyC PBs ڲY+~tbۄ늞1{Z`dt[FDkx#_ endstream endobj 150 0 obj <> stream x][o6~G{hūmfXc;AvI{!-RJL<xsxx(RgY_x%~'$Wg'Le K 2K"ZgLndg@ߞ[.U\d +R%R^$LT+z Uxfh&IDQWB$Pm&+xr5~đ1: ?+OJCrC!=tLNvK%o"S *[;5B&ωkK-+p=D)SQPOl96-~)_uYyf(mY%7YNI"à6  iC F*&kJ q#r\! b 4Œ='"hԅu3ͯ`~ O,`+GL/wFj0ƍ^v#Qe,*SnH*o}7=dN^f- B`@#oU9s/+Bޠ 75UG_[n$b$xSF6o[r85;[/)wXd}M}ɸw$|awk?X0 @Y@{1=d Dwkųca׈D`t`Fd!߲H1EcLs4IH,s7U9J9}L׎wg+90 z8ߢPSj˲7ؙV:F9UqLlB4&wZAfw^_~oW3QëA:g.KSo3.3eųK, !VٳK$Qpz>6Cfϟ .Ekq<t<fqR  NB4-@ujDmW"#ˊuئbg&"i[*Wi!1m)c[;_# H fS}D2~@'MYݏ@7&e*TRd%x;qO"TEW ,.[Œ%V!+@iOrm|WƷW+A2)o4 % #EfEch4"{00̛[F䵁" Q;k>b "fkz3{D,-x/20u? Ҵ}2Tg-5C*Bgibb0xW :]5&<,++~Y*g6Epd2'=*MW-DXF|/b?$mKA2L2m8"Ю70}ND$l4xu8<94}Gq~݃KgLٶx:-X#zLenc'& Ti6ʇ} *t!Vw!cx6 s?Uxn.v!qIޔ6<I315h*7@n.QQӪOGE.^'{ǘ HvfXE˔1eB*C9@Ҷ,QѠXCyhU/'1Y(YF ltzfvMSn 0cNTT#OTp6M,1Uy Ѵ#ШX} 2"Pq*Z90.3""9˜޽x& `LoR⪀!c,Re' *7ѕ? &8y3Ȫ؟AHqK2X $)64Gɰy{lSNk4nN?3Yp^6* ?ۙ>Z]"Dvo.WĨ2{\i[+f9 $:fOuJ_-W>kikvFv3xnAΖSHE>9Nu2Wͥ*7I:ec@H!lGe>xb w5}8wå4-SDPyA]A iZh}D5<×Y13*<oNNl+$*$!vs ײLk3NÎ"fgs|y6g'@T @F7h.2>S` o2n 9e\q"j a*M,Cu ˸Ee%a a { *N%z NīA7V( i9fe#㒿7Y ~\4b3!pI] (vb/vC$mʨ3Lڈ ^o.$ ^9VU gj*G3oa6ssٷ>34P]65yY$8q&vA@ppUۉZfha`̎}$r5'ր;H MR:c|IgAn3ND7V iwBj}fhÖ$y4&n8L^V~Hڸ-vETr1dDSdu ?pw$j<4/z3Rk) n_5WHm;yi=}ՖKVFܛ6Okk;\oHڇ毰6 ^F9ݡN_L=T wqTrR_ Um;T?kjO9Ĝwf-/]W5ߛ~H̦d#=5IHDgyV9ЬS̍KmS~fpVX+͖;{cY'iˇq}gfe"3A1/%ΆI}`Ar&e>nRu@؂T@n+/[6!4t+_V3{kNQIQZV?ك*[OCԥ_J]lGV ;+t~Cs|i74G>ܙ+{NtTC6V6صKZ?4.A:^swz(a173쥵;ĜjЬ4zi!:]ljy7'eEXn h ?l[?ЧњӔc%u~J5Wz4 endstream endobj 151 0 obj <> stream xn$]? ,,I]0*YN.wu`dEw}}~"I\+oϢ~9cEVJddH"cNj Vͧ4t!* KePd?$96Z$˟\NVaed9xBfJ㓒3gȑ]y^zߦ<[ҋ|ݤ>-/9&iYjEllH*LTܭcVL0E)CUZAqW9*lHUOmihw T.64T-Ԁ \l{8S9yrD~9S!`9^; g%2& mnW9A0TCw*E{@ޔssU24WJ0'4*wyAh؂hv,wͿLyeo0tC\4~p!hKp $فDU,fF]$1 ɿy`L&@/_]f"4>C1 X+#ƭƑ/~Y C\ҋjFޘ_]٨,"&pQOo&ADUKfzh|Q7]g<ۚ>-&L@sjww ֋tVS4k5R4NvcsfxliPz({)ww`?XYO9*I¡'MҖaMr`b^_,?8υA/Y@]_ljX^{>+ 5\wVqo]m꧍˼CgCFsWi7I9] % %|I`TrKyKz< SE=Ar cKB:r (V%[ᱤˑzߎ[7-kMLT9rs?Jmoܘ%nHfqr} ]g=](N,N;/dVCΘBB^` |yxOoAޥ_hWfۯ-*ۏa%*/̖zsrrIԟ;WxԢTT]?j$rx4l\ (IˑHȶ[ۗ"в":2Qwk:DLF?ɨxF_Z)Gg/XDW-<(Vi@S'mݹ@yI|Zuň;w%<%V&9֓Fm hVȱ0XE̍;Q|Yf9F7 *jW'–Iݒ'*,RuKz6nDq èjyR:K5 ='#ڲrBu68OԜÇڏfit^Q6=G:ݤ^5yޒI3^bBB >P4pT5`rnK{ҖTqW4B]QbVxtNV LrMN;[>6{۞"׮\X$6WjL|ey2t,5nLtx8$6E7Z@XKB %Vb`"0k!`Xh^dMY n@@E.Rj:ˠ̜ iNCR0F0ou+-k+a y+jFq]ېxpM-`V])Owf~$p&b?G+xSep%4 j)y1O"Ob NI0­Ui(F֓) *Q6JQ~: !E91SA45ft&@4NؤSY&&|PPsPv=#6Qp1r@D9h},yGcQGabE9}֥ƐG45)ߏ^dkTv_M1#M\ݾ읗oyӼUM?t uKgL:w:4:<ɮL5:Dbn{wǁ?PTcOЯZ~KŢo-9.zsݚ߯OVyF"us > stream xko4nO.ܤtz6IRfI{r 4@hvؙٙzx\$ib3")~y,;94V+aL6lL6`Ie Â2=c V (.*ac7/Hd>L.`U7ŋ40c}wHZ}5J[= ѵznvh[76-v 8]Տ# .2Ս^/\\@ɋ")Is4YMɫ8`#5T!S+E't70o hˑ}Y1 gVp>8xҳA,f 4*#}յ!Ңqڢ0] \EUٜN]H@tA"46X+H3P% [Mє#VQ3Zhh%K!yiv= kH+ ʯKv <:њ\pJ譬0kno%%upQ}~|T$0(.Dne Ȃ'JbOR4L=0c3m/]، LwsSEci߂;DL5˺MTfi<gС2Ʈ&VvM3_C)~)P/x)P,g5E %a@k<}u,EnGUh=Tr Mn`:wgX{9W<Ku&a%2,]X[e,@!)"~t׷L0n\0M=Uk5ä t>YIFG-R~nC"m6_XxU ĸY⛒Kz"wL[ŷf.a)Lɒq)Ԉ2ӬIS0^vSr'g*OWCuNCd5] hZ@aո@LιÄ+ 6wOZ4,6 vLf޻:٧Att&cuG&Ҁ@gpQwӜTTWSp=\El6LK )r\&6h)׻Mgƥ6h8 յ׉x2 hVQ@4^`U Z BǼ WyB&/m t:[gjv 7^>*=ۭ$ynowO٧\6",$]W}ӌU LLLLTF짾JGQRt^]DqoZZso"1FzMyW0@_oMb2Ƴhb oT&L!PU o%N%ڈ#Z͂\+ sxZn'Qo1KDJKxӥz<M`BjdbhBflp256-뭶U[s7adWfr<#bz1I<{+Wrm,NȼaH; 0JgyT@a1&*> stream xn݀bm]Em}pCQh[-)T}gvyT!esݙٙQ__e$?$K-Kv$뫿\_=K(%Hn(e M$i!23}$<;[}%W`ŏWGQDMvdXhf#I(#JO߸%$c+#PkK.Ï6En9F Kn38 PDӈU8,L`բAҹyJ.vS*g / 9<I2da!汱#)NcsV!3b0LN JN=zBUu/U:Wh;0=9C5a_&QI })/$%6 2eڇWe݅ZF6ɐ"ɛxHy$K>ۣ{8Swhw) >I] d@Oe9KuK9aL)l`:#|JAT!Ch :N`앖ٺRՄFx9b6-iQS/sݹ(/؝!/[k\ab;G̣nlo3l-*7{J1w$†(bjxDCA(!Z@YPx1y٧G#ڪ9Ř`&>U8k [ލn1H_̗ ȔE(w9.h^>y{Zd ";rIW9i7I ̝(ævϐ?aꎩbA -r,!)"/ߺf`U63;>KW֚puo%l-p H@b j,-bmӦNֳ@!:&V2N۬|d0Er_c5,# Xt2&ǐ/[+)u{-iv$%m?S@h ]|ĨxQ>L`0B uC|LvP @ӭ⻌ZYTtaW6,]ϩ| B6D{R~oU5RAYi:Yo(jZ<:﫪<>|4%j93Pkހ10fTO~~4L϶zx⃁Gn- a%O0&,ev: cr]v4upQzlkn0ܔ[iYz.sAb9x|Jcƒbޡpi΃FY$mD( ?K:E\o~6.96fk׳Vn4mŲh8{@ɺn@)Ƥ]^L!j+FJE5/;''3?-֝'ܐay]'xĄXD>>W"3b8V"!1BTOhRTі, 诙]@P'ch x=PV򰩆Zc%1gJ 7:$ˬM0M4o&jiJpEG93VtҺǼiRP5TI *Tu @Gc0P"񿉆)u%Dm`m+!S{E&G?mA> stream x\o6 >Z'|"n6(\byp %Z/YJSY[kof(||˸ I&e~|ۛ`~|㣿,R(AK,N'Sܭ}o?]L28OpǏGw17Q_qfѧg9bn讚]4J'j2_!&DNE('Lq,]QR2ķ6U6:hT<̽kX>,~JT(D"M 3E8 O  rW9܆ 0-3|3z) 9p!@L)PT(yKDRX 7a:)afE}OaLb 4+dwнF~x~H!{&/O3EȥMp?LEQz&Bߑ*fO2Ɲ}AϜcV<-6!#j먩al\"%K97@( bS;t"ZYƫ 1~}Oyf!ĭDb ԣ; Œ,BX<Vm"xQSd,n@ hL`fas{0Z+<\̟(P׍H>Iuo<&5Do.]4$c*Ū{蔭gԗcAXcAnq m6oK >" xtB$+<%֐ \<]f14-i׸-:*I_gE70Lﰒ?5;%MOCg]g݅݀HfZ[rվNrpr|᝜3m)G &ymbmțC2Mn +o }qjվNjpj|᝚d/ʇS?fLzm.άiYs@(cx̄?u,._xgf"S&ӧ#.㫾+TW9 A貟B#$ ^/#UęސlPzfH h2_ ;-O{/|ޡǐI4}ra|"<\d{)`%]4 *Hi^1K)]w/_Q9f]Em˯0;w=@?'ۄ7tm34ٞph=Q_utN q{F7ԣbىgĀ˾H[DAyIZhŷC5O /}-j~ݵmdײfz1CdvfGΎ"M| Q)K99Sw;l])/|Ii_i^BPT p{e1(i$mvs@IL)YXSi6J ݪRgX(vj5 K\?aRW[:{PĹt9 wCR-; "cmVA7D| #QEtwΉ/Kq lVtʉ5>_x76S@+pdw{WXN{kOuP(Yirwuc+H <զ#J$Bl z%Lu(U@}BءMVyFoQd.H1r(&͵m鿇XSٯ{'HV[Wf9Ş)x "MJM&,C}5T ) 2cj3s0J\ p-1W6{ eJcrqA8M칷&ZKe ۍ9vQ;uYv(psQk< y!SGeٗ endstream endobj 155 0 obj <> stream x]o6n>Ǘ(+E Iqk+ )Q%)Gpo{PeM˫TW*w{ h*]_5&JWgK]^3S[Ѭbd/C@s ~6U+USSu%DO=0yC(7H¸(+GP AsjKFqJ7|k$ŚDtR}Ԏo^2ʥQ<-Z3"dkSȪN0z]Փ>Bp#8d5g²]W;cCsPB o෇!8kD[f6DZC{M B~U RhóPGM/A-jA(H&mD]d C.#ʙ`7gI@o ȬN-M{l >*B KGn3f-PRMGfJ@XG0c5iF:],BLq|yxG.j-26Y$`~B>+3-z REZI <Ɇ6< V NH N7\rB]@v1?50ݠMSVkwr LPIgWI/VJ_bY %.(g?ÝtI3>/m96{ bkk'eI,c0nrg4.ZTrT]l!:9,9\ EX\+)Rɢ{&GL1ZAuJLZMmȫ\cj/$ctDA*]wsJ,@q41l#Sŏ8&.q!D\JaÎJl(`ho<7656}ܾDjs",s0",>(G]Pz)i֦G@d,rGڔQg.2=Rdx!+~H8hsvH3WHҝ,pt[MNYxWg)biG E)Sfgn@$nH{< z'y;1&JJh.&x;#ˣDCh|_R87??]"hk8(8vEOp@q7AKZON{2TήPWO\[s]BsJh !buJ\t'Q~#lD\YK[G/S|Q߼V2e.]Jj0=.L$cM6דM.k!>4Đ5U;E6P*G2#l~no||wv0<v+`Yit_,aϵ0c&E&pq'bԢ&ΎPp@tiR[53C#t :9.Pbg5?=c<@Q΋nhn^ľ]tP3RQe @G`Ńk5)ucƺ}+0b+ث랬!;jJ(>]asV1|_U_%&2]n\tyO <\ђ/}aK_2.H;J6kNqs<= N\0D ZGtLJ#`+Zo d\$0F)!dY s#_Ň^='͘3 .%}G>#aShWFXz"*-TkCdm"cJ\vl'EfJ|v_nY/4#l-'bB!9#,>%o݁a m\ q8d,͍[[+羳FnT R9VdW8+m5j9C5]ӫK?X&.R,ZxOSz%mݶ[Nx,mc,k^sYڽ5Zm ܓWBf",/OYhNh?2蘲{ޭ-"Z[e endstream endobj 156 0 obj <> stream x\o.@c`oowIQNE؉p"iYD*D(wf{9j@4y;w>~==X .,1i ܮNOi>=yqvzǗ"e*9{wz.KxkU<9ϓ-<3pW'odSrӓ/oNO~ RH`tf*ƒ0Љy+'\0ݭ>u²L8irD?* nPNjs6y\$g)/z?2La=3{~]y~JqV{<,.,4)t~;=Wjezngez9"j;Y.\Li̲\d}N .i5 ][I+1M·; spίWn_.;3sVY0.^`u[} (O?PEFF=p4Xq!LL_{܃%d}1>B C궤Aq[0@GKV"f׈N{Dܛ @2j6k3 ku YR ƣ+V wjٮHTK+H5[+ow8K/ I7x%<=H́oڬ`'wyCK1w%'^hŤI/ͮ4fv.#ݱFf\74sppx /K,1q못޾=75|w.[;q ~6{{%UP\ߎ*UY`i0J$rC3B3O^?N4JQt@cYbT~EzR*1ˣuyR=^w]ߝ)2&<w*Wu_ OWXp՘/>JYYWUdݔCS ֥$_^>k>P\a~ Ooâ&r3IXE@@R#$qMhvq{y Z+ڃ9 %e\vagRW0v^v`1$QA3K eڡLS`8?!q{|3{L[x]{, 17W+qtj6AZS 9 ^/7dK+uSE ӤZ07%#ƚJn8yO~1+t}QkrzԮiI; ina2Cᆶ7.o)a `3!#s$Fht+2Tc{^rA&3i7}xqC" 4`*Hc=3 X5Į z!iG5 ehzl0l?Bv,շ\2¥(^$!D_ !rq&#g엸h;aΗGp%d9PQغ=4m ]1v*9Ǣ!ㄐaB2"9Ke9-z@znk |hE+d >@cD'HX` .& Ist,h8 fr,1 9oC_~=r AUQ.(HB6(hL67JKO$jm#QSI\xtl}@Q %/q[eBX`G5P#JM*=A"v R>tHV5Ǒl"G &C2S@^8U#H6FӶ7THsܸ"?0:<][߿ c{M1lb9Ɏ])UsNgRѵJUF*r}j@\w`n}Ҽyd ( |,۱9.Ei5OކעH܇4ļUXPa.ORVL-|7%k¶o׻5W])Hv:aF9)0*&*`}?uR(}ӪrLLoehej,QV!tr7P$FE_^V"TӺ.F5ì 1G3՟ 8=z~nA7SݓDFe\?'P|HZB%JxQ8psK /f6TfTN!I8IfKi&rdFn& 4*HeEiF5NTJ1֚Qr8M]qA+TњE;xb|7Q9 %P sG+sE:S-GDchmKC=wEg<ܯmXFXkF6Ʊ6NZݹA>Ga 9f;Y!7wS Hs 3I'CAG~% <2czk686Wyx840<'Ӻ~Zz;F&Q'jwDNLKnqPlG4 yӉb D5FjSvL< kQ4q.Q!օ_jFH5Uqo8VFUW̝0~|NkL3j[WQnT +y>BՑ#jd?󿑰# endstream endobj 157 0 obj <> stream xY[o6~7Gh8N&h: 밶Pv4X-v.;R[2.P>YVx独ƣNE9+Uvv1q+3984Yq}r.Vڻs__ǣ0B@ pL~ °JgVL)2. e iHFPoI篥b;CE8m͎`n܉l9̟ Sfxg=^WO)*>O%+̈́EvBtQ.o*d~U|au^poVeNM o.wy2'bF&Td)WMrU<;9;-\ZGPK)pV@ rh\;)`:s=$Oc-\ \h5e~˿w89v ӵ$,UlkT%tRTD0!XyJ ֛v\K>\ۺzvG Vy&I{[Ob<\P ² P %]dfh- Ӄ5>^SR܄:cm_oݾ&GأP8^”7鶤p2tpc6!=aw 葸!.+/²%E endstream endobj 158 0 obj <> stream x]o7nàE,Ӧ͢ zxwQA!+l|IJA}i$3pҠm3׻;P/hqAqspc^0F,wwтV}-NPgq\γIQ>/5N?"vDQ ?dT&NFQma%D+j i'ZU\%$e3T,/g&mh>D7վ dı-CK8EXrLg垜K&&tURMfJ&7WEtԓ UQC,ɺ|vnfGq,%VofzD1dА\g `fIQ"u)#j|XHpjҫkh8Nf+ו >`0P"mQ ߣկ+[Jp"J 9{gJ`f_62VžM `" ͥ(GyC-ĎC?5ѾG_W f_G*(={X@(xf >J21dv(lmSZSP~ YZ4hCkTd ó6ymNAP+WjkCR4mk) iN)c)MN/J1CW _.3"O0)y ˷g(%J8iBUmMq$HڮEZ)RA⸥$mKq2L S;.GA?jl} YMy"fh¶G6DȄfg8Z<~UŴVZF'9GW ]4/'~uw 5?Fc/~W Ft;4sArOM(ʓkAOo=ݞ{v2 Ƈt8|{9Y ]$mG~S vu-èɤM=8_8PgV:5]`>>vOxt+AΎ+UjL7jCGyxh|`1.BXK!X3BJD`D45 iÏIbǃ3}\GRA>F(|8|$mPCRIԨ c}S)uHM:FӉND \+uܒ7h@b̗ʺ d$@R8YȒ"iQ"DXF:%ڒM!ј0 է`铞P9Lpiuc1$НiQKTgЍG.ϓze OѬ)GI>=|p]04}N2{ BۢiI",2Z;F5U?D8NѴ5n -8jQhI;D ysڥc7vd O+KJ "ܓ?d %N}LoMyhō69% |ɅJh{IR FpGvn A+qpRSy?@(J{WS\xoחsC"~;)8r u0_1eq)6B] XGC]wt|D-=qခX vfxgiU Tg>4Z뺲0k쬾tڬ4zvE0;zj Ң1)Ix|YZj.S$}}ᑁ <S4m qȰi? |L ʭ.[p\3|??zDH"T7|@a4`7 i1oQ߈2}7ͨNp@(#uS)6pL"5De+ǁی>1e~9wp@ElS X$q`d4n1:^;ŷؿ~rs{8h šTA/- <@n,ڐ6r喰cew gF8a h)GIOGq-_iRmp |4y0o/6`):,[LJeI6rcZ=[mMq'Hږjwr[@4Ϛ{9( `W.NDh*zw:ܦkjP*OUI]_zw{,_NAH03RMg$7f QIœB_{xZ.?Pv2}|:ϫP4 _,V>X>&rZև;ץ]GLfU߻^ʮz${YNsh-XWy8@3r* &\^4mm*\=1p.R 5:j#v8B 3PfuO^ⵠWGopɜ,\24ȸYiv[,53f(asd(1n7:;<oOnD1쓀C,]_,8zK q.8H2<3"s%ʞ śb ٽ'S`=l jo)e-|P@*0qs,XSVq^BۭD\v?Fݐ;`Ÿ2'+ZorQ2ќ|idܛdeqry [JLHߓߎל4~+VD ]!X}zݳ%l5љww3"'-:_jU1qO7rN}k=Ta}Y!,-fL]%T$9 uS4?_1,#s|a~ՃmTIi:R+Ec) IitխlP ߞ漸MkCW 0f#H&!4颮|qF 7!c> endobj 160 0 obj [ 161 0 R] endobj 161 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> stream xn݀o1˹niMvwA8Dr$;Q{rDB6@ds8~Q0䉆d5?>dq|tzy|s029>b',)UV!U(k3yOWzq|6M&I.~|f|}|yk.SBd+3B/Rfex=zMx`&I@w8> H! MN7Vr6~ΤGWⓒec0?]L&]dϗ&'" Dڏ9^:D;ۏHY}DF6rC6aɌHv` @FL%@Ն{5 <WpA10>E F k-{RdK P1dd/O7\c0эpcKI^Ϲ}dx(}fńɔt"5|Pi;-'e},A-Wm6D߯p8T7>LNvH`mQ__j=z?UWUfң剭,ƹXٜe&NJ1'V?aP\x4mHem?k^,t*xrJF DW6/hӏpS W7`ono\W W* ,YI눺P ^_U5!;nOލ_2tv[ 5$\# k䅷h8yH_Y噗׊x8 X:&"`WG4@x(6(a(E9e<6FtRSp%r0"׽٫n]*//˒ʼq,MKehZ4{/r;^WZm}ai:] %.P8[{}fZ|N>ǽEE~)l$4frm{7Z]r~B`#J1=uꮷXLW&tl'2W=/i-~ V&~˕?pLZnBklH ژjIWxs3G̙ɊdA\$ 7?aXnva}6Ç[hi/b{TMѓ{S\QWOz%ʙWxޯxz>$n[ 4EmA Z4sgC[W0SK3M0O?򼻞'MLuԥɯᖠ^-HXn^+z,eԠgZj4 ʺBƅdBz(ജ|EFoF%-uI_ȝaW Ao rspЭƠC`/>֐i˩7޹XF p8XIRWn)2]kAuk*VolX:GKkזz{e#cv;Чq1a^ntvf6n19 st2W %ò]K$Lrl´-hs^^&g8xQɋan9L L7M33|C } xPE#'l@x'<wl,N=^?8F(DN5T 9jqc(B9.{bz}N1EpkpWD 8V )]585U1?KB{-&Fb~t!u 'E]B}?&%4뤚*{0<ǖXoYpܕ¸[eJ^ #31:fsPX _By@*ryeͥ-Q41n\0a\@p.Vmps̗JDq>[z^r$8:}ח tR,[ "5"1JfJ}1QLQ*[1)ѳB0m O,hj*zD˻fnj h22tRCd;2(Y H@Us #fSQQieߏ(~R<c.}cOKI YۜM=|T|ua"6Z<`ʣ4rNSx64ɇ-<bo!{LkjDB~ v+-B>/[Y̶ {0n㽘T6H waEola /![W i0f8'OPA7 PM7)oI9ӪB뜸f^U +b:nOѻ7uB;9}üOdc"7cqHPmfvaf)饍Yƍ5vM1&>W|K XcDrL/=Qי๢N,gI%Lc{NH!KBg}u!ϗCp>םݷ{ ÷|/+atųoXaIaDwGƶ;3l=H;C#^iC4{]=u~lr|9PmQ_M31:pݕNqw1mLWf XɈZ2VW]sk($_:H]sdx}>\Ts}^A)l {ښn| B0WZ"l .1 hzYCG ? endstream endobj 165 0 obj <> stream x]ܶ~eȱST|H8H$}i?Fw1Eΐ%D;8YYqfqf8Խ=>*Y\ea೪Eq9>??TՌíJiflq>fxfqb8g'Go'~c4Y)^\Ã0EK&lahӋGZTFGQJ˯b ?PN~bs8ٸBȁu Sfず}X#Y/%jd/7]D.^jvy/]Mzqw9~LbV< ni5ޛ#yuEsDcMfvYZo+R2m7b`6NJ!X(?Z̮9"R0%WumJb#^{Đ{lD2D=rMm0S7ΰ~Y9~\?;c`=['p-Ϧ0>J4̟~龖aSB=$-mMH"J"LNwO\c ){ g GOň"\5:Jv/eƌ=p ][뺮Ra ;^t'iWՑkOY'2ܔ0uTJV o+@sܶ?/&[}ȁy@?c 8;;b7Oc"̖wҶDm8VkwRL{BVr$-^I[ӶVCPyUt0+4dzId CC֏x)Yc2Xu uOKja{ \L qŸ,]eҽXV7 _߽>NF Z0e%RX,Մ ^r%>)ͪ/=k6gu6KQZm8=S%E_E- dVnj}s'e,#iŽ42Q'fE8L{NjTkN[r$14){sA07 Mtk!ԡ6}liJ6%(#Gŗ7/%-nPI R9  !AJJ&|iuzXKH`J Y C+Y0YseLj9Qf&򐁪CQyɠi7IОIhMH1 sBT]8;p7QB d'ÜΥ,Bf.g~xbEKXiMs:kr SVBW FH"to)0>)Viqw]-xftzDdhkXyupr^Fz։ytѵp+(ñ&+!wK#S7v:eN3)SLI(- [oRգsYeAd$պY焝SOM)tI`zՔgo0#ynGY(d-B˷c>o0$)1P]]oBo{mnnn7eZyqǃ]ǣ5-_rNaN/n(eM1-ڬWr)΄Ƴ[FP,iD؊㺨-'H$ ='7;Apfw:vE6LW '+ƃRV]PuXql#ƺI֝:ݺB:oރ杄q~fM7LJ~|9Hbk¨aV@5MOO~ƂUg;~= 99I 8W6g3[&$Wxdvq%i~KYԡv,aszu5N R+痾v5TM*dZܰ\vUX/H;`jXu-TbhNgs$:*6[UP5cǫS_%-iJxn>(`:*KS Fw.D)Lh4y*IwJn[~v"/l B|UWjkJyxz:GŲ)]”4MqI4n)bٟ-?;~W{\"G)LJtu#k>:оT_,C* daAdhD9:~K#ԤCYtCs3$~xނ?vp{W"2oR(,NJ{{rDOS3ɓӵ!'KCfkj/tN&S$8TV2D=yjsECg`hu5ٞx]!qP39łJ>Y!?1 R-֫-18ؚ2=uI,G!gb5O~kkȒ:삅KdlG!2eO|VRG&:K/[WQI-ؒ!Eߥ"LoKJ[gHcPCノ5Ť8#ݫa:F213 4ӱph9kfuT+H+^p~ȍ1w1 hgpI&*e=D<)>K P!v;^AU(F||KfH$Jά٘ sR'6z4o6Dɏ 7sx]{^ɃL)7>(/-c +^U endstream endobj 166 0 obj <> stream x\oܸ7A} ͊"{õk}&H`^ !%$刊ak>8^IJg(LgeXvlޟXF))E6;ߣWf4ӒPT If']=3Կ=˳E6#wQO8"K%X2E*Y3-(#J?=oo-YEJfy<2un?o0cah6EkCjr&,'X("n[nvrK0CeB!c^P_},^eٖ))ˊhS04$ni6Fdil^%lH $$%jK#o˿R)/nX<h33i2*P2 ZA~y|{jU]؄{UB7 ;dgnf41l@ xMh/-^&k41Q?Tˋ75y:%` 7k/!` ҕ#W).Z{yՆѢ}npHYĭZe~*$/J%ATEQ1R[G45ֹCe5KC4K¬ $f<ނg3=N gx@m _C#%RqfOGO#Ǩ.膴1 ̓QShLaî7a)0. ErB8}o"^<^1,{`\;,w % &"$J!k$XR(QvCCIĻ~(27HWmK8A\=[.7)S .t- DOC$GsF"L!$f]CHL?pQ]NƓeLDϋ2 ;2]y,Rj;t5lу<KpF[&8PnTo/fU>bczQh|D* J"!No.S}KL!~QLT.2b 8q<6w~c^chNI#'H#^l~ ñhdXJRi<lx. O@Ju8h3\kiB<0J9 c;2sVd/6X26 (i).N)wfhil?jL2)fه0UPg/ssUҧf3lQlW) gY6TrqKXtw#k:pXmΰ `јY'Y­ &k% $pMOK? F[&[.`,2/S%+{*]\8jwr5j.0\qE3VnBT0nit6+{ x[FKUbLadUilF {hi_ 2!۵fvQOw/$N$nΧxvu‚$erq #7~i ccC&Qrl-Qy[de` dMjJO<&{=b{, yI< s'aWFWpq Txn&'D6{"lϬ0?{]P/z7Z@-cut?y sI9Y~iNG,JƲL)퓱Q'i_3\T >$Tӈ܄ީ%K eӝr 1;m,- p uvvP!c72]gB}m=D1bKuL#G)hK]Wb -im^ziy:Wϗ2 /.Nr#i^d,>^5LȏQ3Śu(T\Zeaf8_:? uC vF@Uy=/Ѿ\$C«!"dX4ދ_Ew|U"dzvQ*&ۚGZۺ|]!v 'h } endstream endobj 167 0 obj <> stream xk6veE%Mru{CZW@{M;RDIkʗΐ#;>I4-'YdW dTVFUHBQ (8o "?*arJ\ QoH*[8%λZ93k tB(,I' $)UH=Ҍ;聠`|/)421Urr^D`iQ$ˇ*BՄg E%C{w/͊2 7 Geb$"K@JsPͦQ٦ŀ20MJ=}pWᰯD@|_9r0يK<=t,_c1mJUBI㈾s*.}FeR #}F^nr\CR94jC!/Kd!C,Cn;Z7eDgE:;F*R#6Ik'Am^R "d;\D2muby=Ζ3^OuZRTkM KFv{&; NrBrY7M+||" |dLU41д.-uOBD2VM a-MI_rf6n/$C0|X[:rY|UFZF>G;B^—&aʴ{=moICeg&,݃o;}0~p&;gHح_ogMyo$k,UvSLX7ƛf&a3>3: X`{:u` ӈL OLaDff<c0 ̋]9fse!0OP)H)w'uozb3oS4't6ßzh?|>$q+lopq4eaܳ7Õ>ݺKiO,Ӯcse/m0צygllf8l" ^)?t]DGM@ÍSI-`Zюӊ(o˫H)_ CڝziF~/mAS)KӰpvRLZpVWWp?T^5vwg\~}|h4.杉̀+'P3M,=4MD,&7GH] K_ 3{[w([jR 7-.LWL,w~rH8ɗqDPεUi~]b]bj9[H7sNJ>_FĤJ۵jf6 ѱTX|6 JI:( w 8s—0Ic؏6cu3?Vt RNHeT%RgDΏy XXƥ ӚJsF@|uS[2&OX{˺½h"փD[NA9@Yc[np:C]eB"DX֎?Z5.0m͹IxЍ1AOQ _Q_ qz3SQׯS1s  $|Q;&z*,LKOa)e`c se%:e#wy"A5R^3<< BO'ЉLva!"e-fDHGl +R{=yhQo<7Ɵ4j]cZUaѪ~. .V!>c#B0̄rg7D趔 endstream endobj 168 0 obj <> endobj 169 0 obj [ 170 0 R] endobj 170 0 obj <> endobj 171 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> stream xY[kF~_0)s%JfKL)ۭn| 3#i]i$[V93f`0bh Ňzx^.I)Sd}\p1‰ӔÐUGW{ޑ$p狻YF?4[.nzMCsT3G8Z5QS.ыA20 aTT s cbN,(qʴ>JsW*SS[12xPU#>2;8ӚYj,Lm h ܲ^uZAӛ'7gԙ#[P/+ο% [=0Ccp|L`=x-Q*j60(w8~+~{Z)B 0Qt~/E "`w~4I3ɨA1 eE,sf:Nu/u~sN$w9}~ w 1s |tis^hKw~,cc/\JcXnD` [1i~v($w;>\Ыŝ}6i2:y`J.;<'pl:mϲ?Li#s$"!*PT:`&Z϶7ϙ03cp[Z@I QWS&joQ{s(7{{VEIT-z(p^޽-<;xHK+UBT.)iYO| < endstream endobj 174 0 obj <> stream xَH3%Jn6 $> L˞NOUhKT_Tg1tXb؟//r㿊, 5ˋ_6]_^"*g<+5(͊2ߕٺ15Uˋl??_^|~!yFlkQJgFLYXq M~KCkaX.F(iPqTL"9͑ xȮg8bU0U #se)Y8]*LȐ.7\a~ef՜+ J깜migwu40#*52x06W!61WR1>UI~TH~GaH4ޢ"?*Jj5^dsx^H@KhOjw?5^&Θ9*_X_^AfB U˩R`LzvD ] `QItV1l0DA{J0Xb^o~UZ<^L ג2F ra|c8 t3ʋ kb{Cg(g6 &!"`(DGADvQ'4 aJӛ(ScAl٢ua Fc7aA}ї6\=S2pg.-[{"ԛ=wqŰ cu}R|FtTMrf>Df'eYRd:A?)J2SNy(NxԒ3_0Ae"LzT23(h30%_X{o K~vB\TI?y[B[9+B8C= dM44J1 cOW+T3F$ds[x&-S:|U@c+IY,=*%+y[ n.*F (57DŽ8AsVkM[m`Hl&@H#F`N db*f66&X9O~e 2}BEGFK \^.@`)-CLֱ l*&M\'^i6V}v# 6]qTJ~įHT~E]U"܁ oB8g*{$n }ʰjѫ*L~q9Ml:uSt5c%)ijd& lh=b 69Wq}᡺v]Gئ#P hF ^aaPRy&(}( UvN[ ܃uЃ:l93vmu=wM!mKo9j7T]Ç}Ѭ nU?4v,s' $`Qle[+r42% -!]lg?mIb*6d-Bs&eL~)cbUUzVV+mq|W-nEy[SYa %Th*A=r MN 5 tz}&ɹ nz yDqqW8i{;`G#j)-wE^;olP&m_^\eݵiT w󮿑K妢@5 3f; XӇxkf)!x@DT_#n7[ #X!λNq(u$Q5ɋ:rIlA3}Tap14ItyR^H'(Ckg~9fƻYؾ;LAlPxn~O%Ha"*o-(Bo , w˥GH-~He1<,?)A[H̙<5fWJ &LZU3tnh x‘x;5%"^ ~D$> stream x]Ysܸ~Wg\+8~fx+-?)x4]%[G'4@i׻U; χ5?CYUW~*êLJbV!JH]~UWgWՙɴ?|xjV^rxÃI?ܒ#M-n$TS+-(#qz]ano pSՑjV/_͘^|7B! l AfΗ)a|ȗNjU#5i5²z$fs>;?lu97>lMuԊ(ţ<)b&礋l4&Z5j{_][_Ώfy}3AVn 8Jpߑn\d)C4:U4r84P̈́>of̚n,j"Xbn[ gν1SZ>rHZgX");;ycR̨)i:3/Ϻo/A!>N{ϟSG[SnO1H U~"$BoAث7^V5tAlj` `oL)B=ua{BI|zxFlݨ|F R=8(&fJ;G,/vy#ÎL4[k0ޙ`4۩ D)o$aSALKF[Y9c> j kGP_ϻWγszg7lbpMe$ĉ0mhzl%.NLkGA imВ>/e_\oWtqw`;H– 6igQzq=1% [Ar!8{ (#;k5T i vh-C*aȟ,XA_,!5w೺6G@ ˯NaW8n{ńD: D)Pg1C>^O2enBYkzPz}=Hx5^@Y ṱm}2LݐnUzP&[䍫7 ˩jMf>p=7uЋ]ATemщl0ohD%1%.[A>T5Q0y2, g:#!_W mXy?y1x)w:M[W߹<#AfK|`O䂩94p7&_3LF4F<$Fl@[[1 bf+OTmݡc1 wy+tM6 v,M4%5% C\s"Y2װ^f!_gcj-:Ũv7zz U-PgfҠ 1> 0! hLrR 4vF*̷3;z7x.)6 V}5kq{NOY]M)OF4OĔE 2%{=cR]..\32ͦJC^*N3\͕^jlN˶iC lhk[d>\3#vVў1k͇,ͥ9&A*$gH8 Gm<_ |%5'^#!J+p72M8 V$nގĘ\Kˮz%@Uދtݥ ;FE45 xj=D {G{LYŸ}*L P [߷Rn&Qvϫ0>,Q8$P3XqX 1 wC1+o^[~͙k -|+QlTqƪ=8[I j8Ό}Gȃ8a4' Ԝ1tm.dWg,OHlMO'++MJӐN?]g,d ݄bn(%Qf$drw1> stream x]mo6nAme<]C^6͋~h};ׇA͐v$刴˱yvw|jêΏ{7;}*JI# rMEV _i!jw 틶:{Vg'OOuݝpg;uD6 >%X2ElkV(itZ2Mfe2 ~Tx ?aSmuc-O~11i"BmWaf'%npDC 8x\Y ꁘ7s-gڸ\نQ6Pr+ۮ"D6"yv͆VڐVmz^x)f2@X)2A˨7EkiZVk6D]V\DUšJBۮYvo!T{\GAԽ;_=9W3_zv}0dNjg>:oUM-vQ9)e>f-$MpCm cF"6D߈vD@AYio,!Ͷ8[e(8A ==tKЈURF ]R߶FiO3&V#cQDXp K, KtZbn_ YJx/_ÜLw0Q NV/gm~^l&BA :=D1prj^"LP+rDOmnj꜄ #,?7AFÔ! B}%8Q1K}ʚxlq :gh;'";8^N1, 2GjDܚ2#5v~IuSӚJG=6g34m^ n}k׹ikJ7죓wW@OǸu+vs&ݒڬ *iGǿ.pb1(`v#z?:Gܸ%>nISs!!<7*T1&S=U8R0m wا9 vgT)RuiEi ݘǏ.h+' 1<s$r& L1f )IKu?ȈCs#"`c)eHDDT'.t2fv%٥;Vk~NC>iFo^UY~I #QrV$@&G<9LvÜ2G8%&G 8R@jk/ ;\Z9bP+k1^)sֹ|FѺ#a68 $"-TD`S#JWl['c^1_Vl/ѳ\Eo"HHHoXܻq& C{dx"a(i#TQH޲YiRxg}RNGT {|W1&\%{LSByzP{Dy^-{nc91鎯BgbrE!&_6<&V8RL.pD1SIg /Ly2+XZXA(a(GD|KI&,1KyIj6^5[R}=?]ld1TV}{d_,Ynd]pպKxrd8#chGFDď XFo]f]22[aLZ"c[עI=l~Z<- N7H=bT7Xg$V ''V[{i.qn9볙HYb[Kj(.Wȍ2=܆,Um:<tYʑFx#HLƧ1Qhpbۋ),L`pcs7 TR]CZ6--%LuKj*Xg]rXR}/@=*W{fO[+꽾rXgc70Ge0QSPJ+[_'ow Ok<'纕sF@ KaSsoT׬IL懡=1A\pJV\d,w}C綡o8+'˸.bngGƒ翬k.&op&F}0FDcRj+f+q& s hR\4~CsR<|F7$ \1\:7S8zڝڵWRO|-t'g𝬾4)E OF4AhD|h?@'Xk4@U蘋kF^r6 . tQE$ㄉu(_?Y .6ą|jrRinFcZ?hS_;2/jW/x@(Xx&bA-HCs#">a~ޞΛr+ 7q=>f}oqD:e{8 S%,ĦFǰ?anlY#<3XAô1S W߿ uC Y*g}ϮFe"fR,qJNa ^MJ@3:KP,Hf1 e+cWD'G1 ״c&*Cs#"iIRI_?o^D%Ӱߡ9L1b`D!4ۑკ"(㇉( qڈV'8ݣ5#RD$M3@5tFቓ#L?8Aa%|Ju?ڬU߷143DVDo ;u0몦ٜz)#Q)oh´Ԋ T\zNݷNmOPZ1B/-X 'Nos1vYQT7} ӍoB endstream endobj 177 0 obj <> stream x]Ys~Wü-鲑9ڧ8dm+\:b5T֮T{ENQTV$?4 ӓ"3 +ߟeӓg'x-2YtyƳR3J3Sfg@û2م{gûNOOӓW7'_~1[(ƒ09eV*Vf\0WϟGkQ\8irDFE믥b _PNjs6{Rdgh~ce2Ìws)ř8KiՑA/dYO6&?7frwcDyJA"57Hantn'\s W8(`Zd!1Hud6rl^eS|^`9dq̻pQ gdDt UHVϽ1vep[3]J=|8r2%.(;.zR%d##(>L0#0}pJElrI+\#h[^&VkPw˩N(S#h/dɄݢ栲,S{4> b`0xb~oIv RL34gxo3t)JY&#Vi,9WuSx%u􅞬+7|lܮQk%ڂ 1nqX.op _v>-76߀:W+; RLXRw2uB,²PI)%Ӓb䢽hbɷf 488_*! md M4h^ɃEsV0)Ͻ 488|0ws1~&˿z\u1)M2 $Jǭ,/A+@CYԦE0mY2,  4l?_7[2%O7&PN*d 'm[bЗ`ZyV;|cPgz8#墥 ,8k:w^oHx7 [@Fg.Aw.VN+FѶ kAϚXڞjyYvAHlۀpp ߃%ΌR+W ~fn;݂RW`;7k7E׏X@jʬ[ʡew]<K(L86̂WyTpfػ6zpD: TT0G)6P0c/[?';3SSVVc$5o35A#[4Mtӛh؅1d?*ʹWe# =i1OfMfmםl|oK,:凥be.2[.G˴m]7]%\WywZcCchOfPR@DZ$+ xqBRQlʲ(iK& 5[7Gߏ5MUs;d4tDHѣ2^f$V=|lmi~ 2uE0xp?FoaNO)R>f1~IytQȕ  1{3p$cqLKg7ڝwB9.mP/}S;2}G-AH NԏvQcfRӈ،G1Fӷ&s>ZƟkJlC{WB8tVTqŰ'p!#v]Ld ӹv緲tcH+2ɱ,KIoo@'-zD6zc9EnS{ndOv4Β%Rä)p2FHGlVKO )Oy'#R}9sͥus7; w0kT ^[,)q>nT;[ބzL!`( 6Vlu߽CzBu1FTxdTm#o;\+srFv~\n%ͷ~ b`YE#f}?5M`KW6br":^i7Xxb <^W8ݓ{DW8U-765.FK~s'I`u ʲ/Oi2:0AYxVk@~?L 􂃐r.56VEAqZBdz3dAK> stream x\ݓ۶(z|(A>%Nq|>=D)I(5At:(N3"OvE4J"ڤѺNjhqyşޤ,]([ZfL>J3o(?Ff|wy wH!Zh gb&t4rLeM%)E4?ʯ&$Kax@mt<'7#;?TL~3[~WccrL8S|%GM9mKOm:z(YYD neEB"8gÌ'ZF$Gīouvn꬐Haj\oY|v1̗p%3:c@&9IOJkfi邘٩@8ip*Σŵ2Ձ>7 Q>"36OqRY| w9\4DXVt$mLL{hcSGd&i8%ANC4rm\ '!׵-εxR5]M/ ؋G=єfJ=FpsA^kU+LTGQH/ G99(+TmR;`[$l}-.LkBhvз8qK̫r6_/C3`vmSޝvܭHȝ77B$3A3aVpC~n~=<բ]oٌB%sTzoV [Er,1jٸ+w/G6Ҿv7!&2ٶ׫iGq`{>¿h>G̏]HQ:$=MԂPkۗ؍4MՂq_ݦ2( 6p jnLx3}-%a 0!9"Њ =RS0 bWp􀃞w+, ꢶE`P4WjTL,s۳=gQܖ*pzm2:_vw=MVj!F9ds!j1qjǭ}& ]s˄F77+O &2߉="g؝q$|Lf=tUmi{N'i=j!iY,A'j' k2 Db97Ϙ^k<FO~e""z_`- Rt\6`{ܫhɮ8"d6 ܤ,. 5/ǛzNXؚ [{})"קW/jn-[ҹi4FgVK,pP6ɶE^>s<<$H`D-OtJMp}OWhWd2<27x_yu km|թT~9|8Y6vqh- ?ɤ}ZP0&ƧƉu3R,kJX8᭠g&YuF r 6O\M}BY/? 0KЕl-5ɺA%jGTONU[st}5e5X:%^Y/˺j)x9 TAD gpgrŃ{V9PGz;\eP X.-Wqnʂ¥ڞ܁`0W0 wIoyx,gLkv\nSov˖;\%Aq0}>v6Cy4{;w xD*uLXhu`3{^u{6z'LVEۡSnELa5?-`H-`C6mFxl׋S7},Hqh] lsUnB])۬ڕ ^j~Yݞߵw$C} @.mvݣr; _Je y66p=W!ƒ2> gT79u>~# endstream endobj 179 0 obj <> stream x]ms{.qdUI[~5dؤBR=I{wJpR bݽg^%3'473/_1Ber~y|Ā&,ap+<9|O_ޙ\_eL.=7~w|Sg!∢f%kxd'$y8>z}myej_%$0< fm2XΓT=͇,5p{fvuʓأ_.4VWC.&S.儱t?sv۫= Eь'4vipKåY$(j,K6xJ@3JrW֓LAutǺT&p;2)r'"3$jrk̀14 j# z~S*9X*zJdпš'7ސ4K!305پ` 85 FKU98uB&Sn_OTz-\% zKƔĨ)(؇o@]]0aWRcdvї/kIVP^9H1ܾqN@Z#kL1 Uw İV  W;,OJ:c23siK; gEƪj6xuGґO ĸC7PWd}1@|R1c|EaUH{W,&T@`;y]seDGv d ^>Po)LA;^]a͟T@Ni#iTgr" .$KW2вLwo*3.;/&9bWe؅Ԉ7|^<9h:,'.|A%+o^Mb!Mb,xiX+^+#p2o_O(rh 2!vd9aY9P~)?D,{ЈݣٕS׋Yln V_DL(o \WPk~B-VDZ53~x5 WUdVHiS?.[h6o@h,}8%wߡY*.b-҆S 8k3+]}E.*˻KMOO y -8AнEpP/\fG;W]Yd7 %oxne[,$cthC Wo57L ꉝ@Bp ZGY$& <|QɅ2*61G!v`h1Z`p`ŠguxP Wut(T;54puͣ;t 72E²"; *z B<-'87JiԸFmE!se$ϝĴ4Ejy֍tV7Љq=Iu^LY<,'xS wýv`Bį]O{A6xq t&(ڻO}xM 8(45oc"aY$7;'I&@(bY"{Ĥ5N&*%.b#g7mI+% h-p<:ڤ~@p[>nu\n#D9 0tMwO-\rJؙI;!c>wv,in(&$S}p9Ѕ_SH)BF=Q2\z=ڲOZLyb -fi-e]lnXdarK?Tإ(cyUkM[˝Eg2W􀃇xZ ŭ\m^憓|1Bۚ!6ԶXB") Pnqf'ٜ]R=-_UٶYnmGy9FYjjj7X u+q =yהIMDj>@=U!dž39==/ޠ^A=F'G Q:vjM;tH)$=m߁XtɊ6!8OTءΠ7gQ)*z֣JbFKr Xxsn/n2l3O\Ǟg%2m1IPzu]v(kLew@YxVRxsFYtM4x'8ѭKbrlZ!`,:[݊hvC<-D܌x83p nQh.J$b;*=JRu ?%\jo*N?{Ĕ,Hi?^0ڠk+5s[ة%o’[ȅZRR },lz09N0g.ײdobi{r܆qŠQF3^KmK8+HXݬLqP.SQ5E%ٯQrѳwj /|?nM-ީ`]+~s;hX#vW 1hr8,Hԭ3wzӼ\X.ٝCьܺ4Xڬʸ2DYfߡxB6mhNu1b0xm^gfe[Mx +MU?M_Ŭ`9m6noj=1 _hyqymq?-=Wk{×~p+;aOX»j;pڬTPb'&63fV ae8#TnNh^|D"\Q}r 8)^+7v{]nw?^tn7Ίe,\緥# ^8юÛ.C 5gBUuǚRW;e Ak< є?{Uv7cCWzYBbϺXPZ\r?#B7aW+m\"w`R Ka endstream endobj 180 0 obj <> stream x]o7n~]>~#9P%"mb˵f\+YU@Ւp X_!UG) ݗg??nϾ*a+:[>n΅)B\sifW>b6/ի8Xc72En>4y}p__ͥ7Pa4\ӗr.Ae;4QO2B/R$v=ereAx^7 Kڵe$*/b۷kN:9I-}mp|*7ƽXs{C? j{cLP hB k">o J'ҞYe8fwX]1P%E.Cl]pJDCh@v"ꥵ7N'I0dQ3[TT, |D(D9K2aC-mfՋ ;? xnV11y.dp. NCؒqds mt*GL?o;n uFJi3\Kn94`[+|NPi, tRp#~eAe;D7B*i}ؾL-?FCIO[n+Xoqݞb&,@*I긬GTQYS t5M[$ !HsR8h9M:o˶/i* u,ٴFʍ Ek;"T-%-V3FY!Tv 1HdsQD #hH-r]Z0TQѢPCJVhe0vgK@1FR%s@+mWB> ny`y}x=vmqbrS@BC,(jЮk2@*=iJwʄU/ퟪߪh%jE*U?-elhS*HfV\WjUT slPd68FcQr[iZˌSqr>|WB.dkC4,NhBx`"a-`_|a>E7~'hn|O1o$)ݸ4ku,Z4os_l[|JʕFj(ώ$XRT趀pa#A)M޵BN9xyJz ) Ä2!)#.8pE[9k܎ $0XF7ys${>,.4x.)"B| w26溶V5̇3VD*h͕$^Zy'9嘞!:_嘨D& #(̎]+@vaDtA:,`~y<:9`H)PX nW6Ύl )|k_^3Ti)`81H=hӹ@xgr1~P{#qIY%[ɊݫheӁ)\L:Dߴ R(=Wp3Ɉ<> 'xp.X6Nd~e#5w)ȌD}qGxmIr :Æ&`4Dz{BO+))$JEּQlɍm0P$EQ􆧪i^V5_ˀRhr񪂿ЩC*z*WNi:c)fa0A`<=9Xܔ&jV/ '?j@Q'ЇcM1wN=32 |H2K {YX`q-𧻓6>*Q;^`lÄRJ 4aeS$®49P'ufZGN\>܁>"`n#^F}47Ah*@7ESVAe t S](ihO6lv^~ .(~ͥ>U2Rq!aqa@\^hVۅ˪?ϖa!T,X)tEVRn8(x/o=Lx6ÕKJlfv΁]x`tVrAJM,8Uކ >erVʞnZUT?8l&,cMGh,ZgShܥ–J?,6|H;UWKSt5ONW $e!Bl8/CٲAAzH)!0INBdkyi=P*C;L% 4A,4}WRr2Ƙ"cPGxr=v> stream x[o6n}^iѡ%>nZqR;2 wGʲ%Q)q$݉x|p@ xF3 l1~;w'Ox2;y;0 E<2R]d'Ηfvlyt88eYvpp->~E5|ɲ4&VeFQ‹'ZW7r#㑎i+! Ǘgh6Ck1 LOGBnYMD݂bIɈe;[X/ A\Ms1-|MbؠN ,|FIdw}Auڰx>S"ה9j $`Dͮ5!h+ +J|uTPsUJd?VAGKziC N$hX[ܛûQN&!1UDῨ"3Z0b|ћv!7 tpg/ zj7˜|yc3挍.-՛Ջ\n߱pe C7V I VwfJt>MG ѐ58 O]~4YЙΧmDˤ"?s`q zš3 D}H+nlE_!V 446cs{Rcz]6W3 GBTI)]8h>N(RcYJH|ΝҜQ_i|PbKou3Cn2*zʈԓhN_Ae&?ehS#X9M~sD9sD2G>sDr9`QUD @[z"[3MF}g6}mgvm ɭnfmUDET1ZPw"Yv?灭"ƧX( c@f)SPԧG_y*_m_zb\AEӊۘ!F\z~qs|s'!a:2: 7QMĐEk۸~Us](Qi>V%Aɹsغ0u>.F7QHv*A{ ޡC:S0>_TGSuOfJ&8<9SgloóRetW?8VVXa{Jb/KP'檩ZkJ`a?Ιڤ| ‡\ic79u#˼ڙ6͐D ?5Ne=b糝v0͖gngŅT%okc K`;W5=|4<2Wb)Keɘ t,l0pU5'"V+n^Ҧȟ`㋕uql,.cU?vɍ[ F=ng%*M!iT+Pmɖ#kven6R|rGnS^ 6AGEdWLfV ì`N L a=UĖqSH$)pPrzQAjU"HXB# d"% /!G1J&}_-mSЮ/n=YI 8<$ endstream endobj 182 0 obj <> endobj 183 0 obj [ 184 0 R] endobj 184 0 obj <> endobj 185 0 obj <> endobj 186 0 obj <> endobj 187 0 obj <> stream x]oF݀*0PIC{6:FflR{C{gfw)RҶJ*$w3;3?du~v8?۫/+OJJ>ǀz!t8Il嬺IŬnљ d <.Þ]E{ D pR\%->m{uZ H'7XYiq$+x`MopY;34ktQlI|٘rKKI =A&m\]_׫xe- "^WWW]હj&u1YbI~Ձ"7ZHCݢ4t?c"4Gu I -o=3\PW"Y]۷gM}`[\ȓ>. ϝL3B8Ry-,=#ͨd3GDd.JV& pH0SWlgtZ ϵfe4+/Ϗ}9a0nP'xK@H rx}n8(OH3w)˴LޟXsLB{TCҕ-TU4ء"GT6m芚rj/oq卫 #z\1)9GGg BD}_ tB+txG}@XCs Y2IY I(/"'LaZb6)І0h@}sT+{/tTkAMY7xu{~ȤTՎAcN$v-U ΡL<>꧀'6cfyG\]yZ6O@V4Z#4rp#D1 „bלb%Нma#0f6 ˃?LLǁ,XNal}O,ޏxrɲ= G4 dD7)cYRS),Y.fBb{g89mnx':0&'mu6u:)J⿼EU'M8]D >+J U?Tm]aUOaJ<%}V{<n\c34@ +mG ϶XkFb;FL]x6;7Z]!NG4(Xsl6hok}rQ kfNDD"/Ry:vCZrr8M Q.)͊0Rv*SHr<ĩ,C0SD0Wtq:T5oAKƳ7YRՋǥne8NЈZL2 } K싟쳁43{pw0sz䆙88trG>c=b!q&9鰌o聮o v}){>=ၞh]IÚ:i `%rmϦ"'?k4r WmpVhpx>i* qv:6'\khYMl -vb?n[] HKXVj`xΨ(CQTm̒'gFPw8u!>:W]YYPh FNԫ%Dt@w^?R4*PDȌï$1?%dD1kݜ_weI l׎ kVwbt(6_lmYK1 3 tЎH%`4 &~u|j' ~P} HaEs|٘q@8X1.\NuOݤĮ%2.I=J LƎ1?JnDG ._rn.Q[B.fRLKwh)h~05:/53htQtu#wK> endobj 189 0 obj <> endobj 190 0 obj <> stream x\Yo8~7yYH[[@qffr8C0z >g2oI]&%[p,HWbAr$ > ͒ƫtsƏXBiNDvsIhRʜBR!dd~yQ&K(3964kscJ|3.Dg!hrKr-BI)2,WҼv-Yfh24Fo"g2 L)6bk,?|rqʅZx-JV4tM !KhE&l&qrO1T|m B> T+v'{qSR2rqHR>FolyFyL8<dg2=ad ۬OCW!2&/d)X׼d hW>:/TA.P̍ӎޤK @\^V>8DL]`X;|>>Pjot"}%mNV뺂k 7VN I@{DMrQڏJ .AC!9kPh]ޘ"tE&JLB$Wo^2]\Fhey,)9[k8EHdhj!]֬cƯOg>ojE3ⶱ$ukάZ3\g%\kStmRؐH,p\[7~ @߬-0|0֮g0"N2ïh- y\oGV/`$T-*ZWXFp t+96'*U^j|;m5Ҏo;iXoP|=?7^ZgMj Q`/sQ `9Z8Ǽ© t4N+0~jp6y{HY&zmeRr*z+`&ӓ%*ǧ`ʔ*%o=|gRLD` duG#ˊ"#l:f邋9\~Ml6cMc4 c|1GXY^ZK^:s1u;; =gCKWU,4yۻ5RW1Z*{>9~h8% d8%A@ԇA2pjh !&C,>yi 6Qڏƚku~k!֤69yCD>^<&뙄H13J^FGoD1 ^ߦ {e$|LS:?3th faUA\ 1hHXhއ*>L_.fDT7T Ayg1Yr'A]@U\ HFU*b`!x{V!jR}5AmѠ1bN ח^Ed{;5@ؖɆW!q0aW:?0h 6g*(s3 R؀ܼpymqѿoBvcU%:*U`gղ;f[ %9]6_V^U 橌O0UWį,؏x@Z~[0 tw0{F"oE tAK$6g*H ܓWl_-STgejETUAx:"]F]E<~ ]hɐ.ĝw|rp\d{" 4;EiʝJc|t{ &o*- sT " hGrYcp Qu֋Yq\QaܛN]+ǸXcYzb4r-Q&5t Z'306+z+&ss&:1" ;f[A,GkŬw`c[&Ġ]zY2[FMW@]L!8ǘe7qc8,&p€S1v"ѿ>Tj?; rS6sdxܥ{kZ$+{O8`FVg4,[Iv0-N`\\?*э}kj~q*vqxii1D#j1Z k͙Prmv+g\>&2(%=='>#d{h ɒ`[2ddKc(vQ!㘋\x1@b#m5MiV&=U:/o7v PM}UC{{_N;ax z@J>@U)s2"g+W}M\mɨr:njE0:0ޖ%4oѫu_$] 2o'(t#PWT +e<*Y)E_ZY9S W;dzٍ,/y~k "!5: tڙlǭ#=/~ZjNhl?' Dk]Gk7l t4"'[oeZ;fo[;،K qt`m70QMd:+)Vg~o/ʘ;ߑMtѨW=F&);K&UNis$$Diں^)R+BVe㈴ZpkWZǮul6{64rh[zU` w.ފwS!'s,o&8/v(7gs:s|S+[T+yl[j\=0:8;gҬzFs0{Rsݛ,<~-ܳ$Ʉ(?~/vMR05C{j.Җ .&< CyU\ؤbRR4vlJr*Y<FO&g{vP0wU1Y ޠ53Kw 94Gci~Bߩ)@)<\ª9jY?jRZ߹=^zm~pt]|_|hgcs x.)ᬂCgJ =1NJcKL4 endstream endobj 191 0 obj <> stream xْ}(mM$?+gEXo"۞}~q~12>?cWd,+U*evn*h3;:?{Ȗ?f??ZI"t*4ɲ{hXq[UJV jZq`&I@_ s>D?CRXɳۅ0=ʟX\a=6;|a>)Yn?d6W/?\nX-nmozzZT!sѫ\6$wF ,2rP4Ael&nVraNRmiz~`~XW(]?$ =\/&"% ])AS<+-'߭bG˜];m['hA}DQ"׼7~]ѴY~;R/*ڣ{ĔEGAD"%Leru_!D?xm '~)[5*`uOJ@Sz2@/V.7K&u{͇  +.$Dkb|Aι>ADW܋]B9`}uB)cS lQ#(5I0J߽\fQgg0jygEx @O(? p1DW;T]> oWKMDcut+>{pWocz,ht|R TKR+0 4zxcS"j J y&]` ۭ*ҤvsmT#dE#qDֱGv}Lٮ$KTU$./}:@g^|q O dCҡnu/ޣڦCϑfUa ˨ N݃ն|xnu77?:N灉=ҙBRaEq2!Q'R{ȭY\BԴppJu~뎪§k!T.! Y%Dsb%b"ۘjJÝS삮uC7h ?Zv36g66KvNxITMQ4GEHGY3Ysn aXj+wj)mg&} /vH0*‹jp65,D,w+(F&݉ݍfd7i]'u59֑&^k$b&DTdu[}Q֤r%jO@4g p9SR1s Kk1ˮ:a$_W.O AXg̓Niڼ1(HM bˠU]<%J($'{ޞOI^Bq*s*K\ tp*94Ȝ׿`.6󑆇i7X̀ݾE@uw,/E&]dfidT~C9fXʒ~ս~@<@Jpk1zTc6jlƶS+}4yx38/*ǧjE WC7KYp0ʷ1s0F&IA4wCtr_ {s_¿_!?K`w -%Hx8y5E*r kAZ0yh F|{`SdǺҭ f)Dlt8YT)8jʷx#S; gPzj[pFm4_;s &jk0̜BOHp[̗-d8񻻙В(lؒ =QYR;FѬjt,4I++H)!"1#.kBiK^=խNEuk:[G@-jL]9U_9kvTfЮS(I|R()WAy`[&qTQh1#i4,yR QuGuC6.jEy\ U4rTn-c[EA{fWGS@7nw, aN[vVWԍy~qcByכQU%ef,Uoec&XWOy]ٜw!Xnү )P9 D_[os'Bt>Lt2t+Hr!EcI?Q&ܼ8K:]EG3ZH8\,*EP[$I[d9#"RG n3&aPl%n[7 )teSPʻe -ȷz ks5eT0 *$upj KI1O&/ ?@anF^஫yBfD>qv6`ּ.tM:n yrި6h4s$M&R5hw8U7G1TVn9 v೉,7e^bq*G%vHw EΘM@>9^G%yQ2Bk.2SxlA4$t'#ZfZ⸖6R?Rfa<['I[X;;`X7 x}RsSVIA0'R=J`dZ5yDu%.`x]8u% gs]LSan;G8K2mlYia>NU 5Ud/ D:TIl7oi3|hk iIxy>l*ɹ;<~ȅ9ݸWoZsŒ}G\e]#=WTp]TYxz/ݚyOE{jS[]%~4ۜ4Ѷk?)D0 g,0l|qA$">[̣pN B_)6 endstream endobj 192 0 obj <> stream x]o7݀þ bvntEi\C{([v%WӦ73\7W4*p9~z)J§+T^E<= H)R\ޜHK䙐3yryp߾˓ ̙_E׷'?%'<=f|{zNoB:>&ΔE,*Or#D*a3zM)'RE0!Oӟi#> _"M΁63(?a=6{|a<>c(?_ȊH~vnw3gn5ޭfl<yq%e.svd0* ] nPE!HZ*rR+jE  }K3+-ԢRj&T%8s]B)f!Ta\1:jYHՀ0 cG`qmLdKѸ{}>:7BcG8}w-m+@XMbsI HIfј+B򲃿o÷sarW 4BFpI| ӊ,OxE/D4f0NQ4i>`(l#  3Ww3{v} !iʶB;<9jLϯ'"GafȽ=,_`dr;`=F mO\_81sq-i/ٹ={8+?nRNl?֤۫(U5mQL^YX jC/ SL2^hR9)<|k)@k鱄R,эhEl43)P\BvqP.-X%qEOE|T6{ɻ&BPm~A -V:tbfe&2\3Ul!ⴐ:4B= SYzVmF5jK5E [E߈'ax$?i(]9Yv`$ϔpcx5΢d}d{9:I䢮djk֦0tGƈh/Qf)`DIqY,v# JkFXYoPO\Qt^S;a], xb[6a"<8D;Q?Y^-yPA#}{Y 3F7{Prwck>& iՅB}zSݝQ4_R~>>we6IBMt=toG^9N_%ߩxJ[4طoO3vU?x2|XU=ty 摓c:ȭ?=djt-;S†АS8#SpL}i"Ϊ#U }Uq4֯,o6T&!j'7\S Ol{/^P v/ Cfsֱ~ 75F!;c%ƒL(#;/a_x>Kv1VH2|鞫+^c%v}Fdr%s^{O\|S)'A]m9˽hJ> stream xZo67ARp7XEn. (vwGJdJR[ Dxw#v E:xf'%1baDڶ]nT%;b=(OsN3~)yYdL :dyte҆Hl!£;Y4'F=5w˺sOzy 84QށU?<7.0 ;pE-0DD6K BCr 2Cf.30ơjPCgK m5Ʋwݬ&Ae֙  ( ~DMρOKTJ(}ѿi!ChK`' .9'9q4;p#ҥp<8YސKO:LM}t0~> stream x\[s:~OUϛ'Eud (VBC:5g0!U,}%cόd'T1-u% ʒ,Q\[Iηnog $- |YB- GD L)no?ῶ@>v6 984Gd74%S$a:т2-~V-YN2fy<25_rAOQm&,9"[|XB67ff^W=!(1t=irYb+ɄlӓLN''xRD Oi"5TnLnɍP44#Zd"/3F[<nnuEC¯ 6^P2`DrH Cà2P] ϯ_>2^O%|:_K[3 ܺ}kRgfKi0K` 8W= yݣPM uF#ưSpdgfBiN*ӷ)\_B1 EYb \AŷF_GCxGCAzȁ?%*UP%r J25Tpa 3D?Qs-8$>G_^\MtT4r R+k>M:3,s( }Tkzj+,!?J"Lإ­qq]b&ؿP^a i]82y[ww@;LyM,mBt~rvp'|zqy][ %0F/UPh0z~Xeu-@ۥ }S8o'13v>SPyB ULh&\Gњh֣,#5G,82Z$æjGh}er"TQ5CH˒`1D9f)=3I{^iI\ӥḞ>J}n${.ҶT MKA1m3a=> n5v}lH~89?x?8*3Cx_0tبa@F ĚF B1r.cW$xVp=B+KObg8?4oh?4mk'p!Ade5WܾD};8r.0;.!6UtR3+%i_4 --U#GRR{sJN{l \{sI,mh txj[kLK6O ?<-, 8v~vݐq^dNc`t񇺚u!6Y exdwDt y T+)w@jx^6kes>LыÛ nm7袁xvך6)d#すsrTWԝ9|9sCp f>]<BP`i;CP2Lyo>[đ"{z<cM!BɈZnD! °q焥X-᝱tg50Vm,li,%zm)NMLkm' +0P)Qdפ1bo6/$3&2Mfg)pB~b`H~dO|M)2iR0Q!pu qIbiWXh *af6z 낈^.tQKWxSx ,x;B)F(&Z8ܕ@J\yn!]ߋ׽?`Ot jz`,Qjh(5,c?0M[:}uOֿpƋu2a;ia D>spQխ.OYC:u C[CSS_u) >zC1E9L遘iT!GB4o0Vm,qeX"tK¾t$, Ek٭]:ԡ~}xMO:e VbmR3Hs SxI.#imwu69I?Y>p.2.U%ٻbiYCYSIcsj|d/.mWU> e%^oIq5݊ |]${9OА< ,[Hخ_xFk|/kN42'oo!MYKq^}GJAj2(>l%>ۣ.ed{o]Ȗ@([fe(mb=6@ԶoR3kl]WҲSJ[VsMZ>k[wq,2ȝe3F[UKUZ++ǽԼ-Zf/mEڽKe,:)݋pwZF1h('SEjȞ9`lhk7f̦ endstream endobj 195 0 obj <> stream x\[o~7#Ɇ{O=Ms"(zz98e Kd1Ki(wsٙo|9?+H eY)Ԇe/ُg߲RR]Ѭ%-$Qevqt?Rf3,.z~'/F ,|jA5L,"FfZY)HQF޼SKI, WFXQ\7 OQmf@7Zbq9q"B 3 k A؇,.ie/m.fsif+1{u˜69Zfvsf۞VNdTWɹitO`eN' /_=V"bDLA'+X&)41.@d,kᯌ 8BWqpһln .߇[HJJzN}]JzY=俍{ns(LM'j6 g'5aw`jd(QK4jJsj@0_S^t=O|I%\ns~{[N'à PS& )d*>Znq?=\C;_T>{'CUmU3b`pGUcd2sz1 VdEIxQSd-ǞE!IbRfYl^i@=ʪg$y t9-ǭo©.\U͜  |ċAGuat@NFNe [O߼)xE93Jڋw)ݞ("ׇ7ց(2LI %ؤoct2r;(; *!7(/h2#?u3B.:L!hV^{ϓavKqF;2mFKL\#$#*v!M"1nv^̂zmLd 0q;EٌѸJ0z֕h)Xw6Vǐ6KWB/%-rKD(_@r7M9Bjb>OB,[)wo_pgnv} kC:8tlQb.a^c$,)S%SOJp Ic j'٢}";I,0KejO(Pi1Ѥ>F[xRoI}iF & koop/@x쪣h|В W@phS(@@ БqAA ! r8; 1nƒ4o ͒*UDu{[`it0'ywRңY:-;uþC:F]ׂ:BinjՅq* 7)I(G?`M(u NVvdmk%J"m~$Abyt9z8OGH:!$u9Uj)M&f3Z=[m^`zƼՒhxaS]a G գmZ3tE}b+*\ZWrz)%o5Fs:"|V3vG--|56Cc^P1_  X k>Wk1)Z[WߒTXh1Hj <$R "%[u|EZT. nlIc^M_ݕ݈v+ζ>u[}tE\o:lŨ&<_}#s05_<Œ}a5w b$e/>n @9U-("\Ό+QݑXx r=߬Vρ5hC9JxK K A) / i* II^UBuyg-)?b-R&Mq=LvL K5e"x!4H^ ua\4Qr}e&`tk(X}1B9N /xbwYLi)Ӝ2o*idC{5xQxPI}:\ޗ|+/=ǬgF_vr_ /ҲLpJmp8ezYY&1i9s> W^ 4.~E{ @rhÎ֕sayG 9']^kvۙ\Ρ%Ӷ49b s(N4M̕#j56n]1wV[h#vqk^r-%m<+X<66`:mKZl-} fgp]ضe_|>n3H]26*mg4HeiGZX݃ZaNODq&©!@-$G(!UB_Ax*4tw8黦>kBp޶?^ņ՛ "z?ѽ _c#Bf ݺiPCn0W_^vK 5;:/ $F'> N6X#(}O}e-Yq}WI.]hםɤ'MODHS|ޟuZmUPi lɄlGDH > stream xZ[o6~7G)X8.vOvvm=- GQ.Cc'H!mڙC+ds#7ANr3%y KfpQ2Rdt6PPx$HFW}Afrnp!MOH|;T98#2WpՂ&3,"F&ZI!HPFYђi3Õ#~\a%St1F k?LPD͊չr [.qӵցOe&/Iv,^f1OǓ MgI`d*]a Z{]RhL2? 8 '|Zcq #Bo,# 1KWEP5EdKtE T>C"9d|Qe59ڔV1Qr?kdڇWZ^iibyL'Zbp8!0Xv|rXO+^F[5UcJv~"]KSLPjFd3~|i0n+ l 2xkM]I8v ;7W2E.[㐜(V6,6̖20- X@%[X\G] hݾJhN ݖP w"2C=Q&S;GT,N;!}7߹Y?8H+#趦W 3hPh62Iwl,Y4<..獈8.;W"$P"!X]GgRqÐ__|z!VϽ ͡(扆&U&pg iB՛ Y؅G_DѓI +KD-}6!oiPڌ$:fz Z'`rtyObO17@k$ O +,xpݮx%|!Gx2҂¡؀Q:dMP ;Цa^˧@[Hی@$pc :#CAL+<[`p9pccAןnX]]p:*]^x8p0)zmoUԎCm3n؇;QZ2GD~0&G(GקĄBb6+Bik S*8.x4>pA>^LDXMMtusa> J qڽ#1k95\;ɪ\@r;,-=Ų'ک *"Vr}W7qsw ̸Q#y0(+Heb{<|ҮƷ8@g׸_Er9ONYKxQϓ(>q_@pM֥m*]&<4t|UAXZe|* ذ)C_l |g'q #w h#z"Ɋ\rBTRHfa#{efS04^466V);g56wY%Ϝ@"/}, o*$1hG0^3ᤪ[ryB> stream x[mo8RC>&Uk:!(St*ZmAje@~3vtNJD͌yyflOO;P䉂kaXM;ѣCPJrvF&Z ! _lgt&d)rgua8"sBdKI!st eDIlv-YArfy<2uߍ˯0l ՟MA7Y2Blho`P0OJ b.l~8ͺ\H/2i'پHoy:g<(M"3%,EI+'+~ g`yFK}O'syrXRC d3 )P }sP !hQ0'Wj0^ؓS/JfQ'!>_Ww?X?F j .d%7$gDU}_JgbKj0kt& q TRCς# GU? L8^e4wykpslLnҏ5.1TʋFip jjgྫ+n0\Oౝ0I]cNjltK9BПJl8_d8*M*|wYFf'J1Y }Itnb-:$,h{Glk-ãWؿÂiPiVc}4. ^(/xk&xE]Â^/CK[!g\V{͆Ajj+Ke:=5=CgT=s~9.HS AGG^cJ0?tWO;^MO9GuZ0W /.jy`iX 7]> stream x\mo7naU}yI. νIQ(I$GZ7Crߴ"W1 r3|8pzzRʲ"S Vӓ_dӓ'^RR "Y) GZH ̮Pgve$.~:=AտuD ~ *L#3- ʬ(#JW?GN_@lesY{f2Z۾s=g;_{+;LE٧o&̷7戡胵]fH*[8۬#K{$`%iAn *Կ 27hw5^f_-E߯+x?G떖z|=fcUEg/n-xΞ ^/r5 vyD6h6$&_]=fqO-))y{Fz2oz.q'Xݭo AVͲ!aRKC5hPCܣ_`5c0E~*(v U6|HeCu:LVA51VI7}Y݉RY[玍7ƍwoVU%YE4.KxX+Q滕& =nP.<t¥.|F<,.,"BUmBxl,zs>9Msm HK6YI\ؿ ZC#$+whIMbEABәŌjWSuQ%e1,fLn¤ٔI3*ՃH!uK4+RJ"eOћ=q㒵]PU jq{\Ӎ$B8+yF`'p867ddÖM%#T)=#PSC8#"#¡]GB;&. AUN/8fI|(O{Mn4#Hֆ@OqN8b$Bc*!G:q+" !h% !͒D*gUzU]^%`d:h Sbs"J '!8{4.ۮ_T vYYugx;{eTK1͔1] M춤a՚[yk9,"RÛ8{<6}T)UL¶EW1#p/m^Eכz#cKqkyqqC[28<@5.RytwMyxtMslHВh6dqd zx8Ǎ2] ,8zwmB =Ow)0p) }T]߃#Y]""Rx8ZCFs ܛ\?t K:- $\4c,Ryt9Y]H7Dm-cE^: T_GL-Hcn")\\10\֖"-HT$d£;3E,n!: Zе=6ZCJ諥*HR- dE]? e-+,}"{˭_upDƞD>zMuxʏZz,Y-s~J[KwJNPSa[gPKC0L+"ydh{T\j"tUt1 bQp"&`iꉅTe=Ԕ72a 0 υhA,`wݞ؈=FN4w.浭;~3X"vwYLJoA~|[?˔g&U>G+ny'LWD O@q.z)nSNq2]`3ě9Agٵ#ĀB)(:|G@w endstream endobj 200 0 obj <> stream x[Yo6~7G)Y&QN$.l h!%ji/)9Yjf9p|ӒYʪR-.ֻ;/Ug;|UVTPk+ZI(lwݨgAW-huK-a22꟏Вi2Õici\i% OQmV{5:\ǗȎLg|s FDH{d3)I+->6@ {Ȱ 2DfXY`Z8 @a:?@W^| /ev_2[J\ f^I 4dXHT)41fDl8{a'gP&P0(bMIC'C#8[URkYd=&{i9"IQR#|9;uKRkٽn VeXulSVGK ?4bڗtsCsazqC_7:E9FA|&uMD)Ɯx>0lBz!d- ,S~6H>d:*rŒilȰ+VzJ mĭ\gOl-ޢ:B)]Gev7]29KTYK,7o CSbYrf=߲*qgY2<98kM^puޟU!<)`PNd}ľƾ,OAJ:OYBnFEX299RV9RYR~IKrRR.ŀPp<YvJg. 8O)f3l\ u tQNee: InN.UQT.#otz&sd:*rs:3ɱ 77-QEMDҁF,Ol-%QR4%wqʰĖr.%9Smki\Wv]c˞^o, i׷&0Ap+״͎tz&irc}_NHT5-5ցڋw쏵E?ZNq @No%^[(j? Ol:R2">6B7j8 p݅֫ lǢq% ~`+_ZˤI)13}|@'&Har]XT&-Ӧ )w[ؙ&zD|GyO1zc'VB)zqiUf'L708 9~ɤۆ긔S zp&U1J wg]|Z ^ebp endstream endobj 201 0 obj <> stream x]oFn.hzwHE?EʊmԶ\Qj,.eiBjG;ξYb/"#I&g٫E9Ut](ՌW̤=}.s3x,] _Y1L6Pe:JtDhgT HC4Fn 1@Q96ck hOEt|?SI1V)qO͖_i+O)2GЎ$kE~P\s7׳nv=]uT*U'..BsKc 7lC~~3?Ae%^8C e &&k2 XXlbg~ʷ[?amoO<ɘ<^'CGT2~&l:Z.R~\;AxQЁ/BUR,phW"6BQN.YrxQ`r6Z oskgpl;P[9巏؍鳎hH&*?.hb+Mt]F?"LlV 6O]݌: R5æ$u T#a`Ԝ8ٝ8-l_߃B82bRQ|@9ږnQh),KLRaKEmbY ͵V $<Ֆu2]#l%52]̞#;{`&r=~i _6d*R@^;F !Uh58U͇/M]#M^AM_72Q}-1q!Gެ/JY 'pNŨ"mb~]nGi>N:5(O5Hq]UwOՅ)}ޠH5Оd=TXj^CQLDrw'yڄgX=Mcݼ9%[bJA;]9'&NA:-.NL$5i$eF ΈJgrj-!)z.*/h+4jʨiQɿ\A} IFC$ 9Ԡ'U5kSͅUbk.CҶ);Ϧ~MV**K2D߱so,+lNKO WKCTxYp:[Uv6IR;["z[,NyUYKU5/tU萠|4-m4*4BV`"SO рs9@s@\_ iI)̍Y/Epfj%.|v)5uΥfW7y%UNkaa}gcPQMA"6]Y;AG҆DSFMޣT:RInF{P~+ouUX`e7ྫWlur֥X]Ǽ4m63V?fhO!~\V_V_+(y=ƴyCn.>Ϣf5q-&^yj~".k=[J~C B]O N!iGX:^@|TMY񝚪ݚ5%lh̘S{K)f\I[L >UV}B=q-멷#s2`tXh.$$iO_0,sדμU`5ǼODD ؊V*zɯ*.4{ :%*\ ^T+ioOӀ{xIH+Lavd͢Տw|rsH3-dJ`rP6B^c*ŭ=UKVSύ!KVZ¹]1Ymw-RZ!>W9jqGkHiJ"X64V~[}කnj?m7[!MgxƲ%M/,Q__@?. -n1WS Jj ؗD[?QD  2xLxJ Za DaJ@ľBݼvPaHPM 1GUsxHpoMZhÂ揃p1!C 2p1.9N ~ Z-ZmE B53hD v.TICg%% aȔ-LѢȄKf9% Is@$fq݁!!Y a9 Ba "!LN Sr2%G r,d2$iأ_,+p8 ԅC΀xCx;v1bۉ!eCm 2Z*S\p)4e8ɦ*sr(G6P,6F6<NC "oq,xiXP?^5K!:ѯ1_Cr*? 2Vc_|<YjBeΨQi(I8QFQuӕ}$mMα4=iΏ{|sy[*׎o/*C,ΆۋïrsO@ m%D3YH,3FS!hU;=$thK*+ګrh+ZK"~sAXC=Q@xEs_-qjYLbj0wjHj C^tHdL?IJ endstream endobj 202 0 obj <> endobj 203 0 obj <> endobj 204 0 obj <> stream xZ[o6~7G+X8&.mڡp'ډ/w)ʒ,ʎKg1$z74q~d9~?#pN$ခ\N12x! !7+ܸ;[=^H<<_ w{U@  Ւ%LxA"Zb$5qZ(ZqMsdDdMT%$2 f-9ߘd<}=f/S, *n;aB>)#v:(2m&F Yfb%[b3ӌ1}F |ډޗV Ak2(ck$55Pva]I>A@n1Vp2p\Jq 0[xUcTo5j᙮3 ;h6犂Ta !sjIa4B +a%ܼYޮ~`(M٭ƽ ~9ùGðlc+Lƽ:7.EޏLq_?/eUB3$ . -(TáUtWVsBհܤ?g7\PZs_`jq7Ůj- U4^*[,(2>huEiWg U3+\d̠s= NjfY \f˾]ja Op(ټ43v~nVWԣ#zזUvc#N t mFF u}7 m vP\wJ=%zD '%nN֫$PժWŇϰO5+au hCamE} eŎqa7V=O~' wk횸:[ov2{k@C-HfջYoVpv_z'αZLMֳ+M'@5kxG`F'!S'6]|K~9BsRu,vGȑ ߠ%N5ĔCK=,( xQ5u1 pnt~dQ՘S2:ۂ]յV:C*6O,d#+BYZڹ8L~``/pד_/JjQB%oŰ06]Ӭ6stm,: K͕Gd0VnE1NQj:Yɬ-oacfϘŚ ‚EXRDNETeïf=KLն.qݾ `?}.O,4TUr3T2>>akjlҤ5&AfdRwɃ%5x%o.ZBF?&QB*ʽ&eN/UeꤵÃ@&[2NWP281bNn̳Ds<} 7`7MKL☜PA /`wkLg0g#p=&>bvz&^=$Q>9 &ħ> stream x]F?H~K(*hP>G.G>wfv89Zrgvckg~r,I,HVzrtrprL/'g'f^J3S&=|R&װgYYd$_&g?Ž'g~1,OVY:gLJʄ f4-C[kQ\4kŰ@(mrR$Tٞ_FX0រ=8|@A @!R";$S&>VٹL7ٹ~Mzkx?8wf:]uO{_ƦYbY8d"a./" YH(_ou-_sO\_ %HbQ>L%}0ZsIi"S}? wjvpw{p.G{@\BTA7# ?Na'TbJ(𪂣$ ,c@ k!P{IjU`ف{Z n}amX-8mG*8.XGE1GNkÄ^#d/T_.|z]3.][2.0qKzA Du?D43!wtt/ ·xJZo!MVʀsN@ZByƅn3wɢŊ􇬌d #J<#X2vs.9T = c8ArW"#X -L- >aN#! ,<҈KgN |$ Je>EcW/ceUӝS;d +d 49bgk"!T e%+F! |PJ *9yOƾ $W5!$o|>[NݧMNsX/ÄH;@gtؠ `ؠ. g.A-iőz8&0giFJFʗ5TY3u`?wkzIA7X ?5ʋn82ݻQ`53ՠi#nuX5ONuы֨#=^52#4R`35Z x.Jc ,Ji)06hSy{tܠj* !4 N*,M T]8PF4UQiA4Y X}YcFRCT8xI<8ߟD$[=\/te?~iYTQ4QjPL>&Qv$eh\j <fGMX-6iu55Bs;8V)C5kh/ Hxoe\L89Lgی<]P.+ )V}yIO<xC$W1E:MWjMz1rD sB 3WS:etr˨6N֫~W`x7h kzAfU@r]DoWG}Ds:z:S;4.f`&?`MӁٞ65}́%F,vB|݁Yd`todAypQdE3]}[|\zl*GʂĜ1B(ӎ=MBJBJY՟?ZGۄ] mUC {;X̚ endstream endobj 206 0 obj <> endobj 207 0 obj <> endobj 208 0 obj <> stream x\mon%#pwO@K $'+Dr(kޙ]")HK5@ ;<;ӓs噁֋l1==,<8=y8g.>p398\J3㲋@>.ߞe_V֯B;sa^gVL)2.gZX@#MQݨhTLp sT9Ɲ.&oG:00eo9+*S3; -p;jiG8[ZyjnpPp-WsPw1>csrF?4‹iWDS̃G**s|yA| VbBt$+¦-iP.("g܀efh ,>6 5r$8զG[:ߝ+Q׌.(`2¹_<~]_ήhXk^2mblDk'^D#sx}96谞.ӄBH1d F1Z9{}!eC{:^^$_q2vT{MM#t8C&*RzL-}$MЦ5}e>fr])3wR'޲> 6wwv P%nLԏ7cwu⶯QpeN;دGL 0zH `(̡cfz8/XdM[595~mv=g>H4i 9oajI~7I8 &.wcp[ ~ GH1n)F̳ѪhI7{<6~ɜY}v}Oұw3:{c{b6Nn󒙞4p`እ0 (zHU+2c0@<'M }֝F\|g-7RKB (9Ό-~ͣboB*i".o|GR1RI4X*BŃK$O݌&s3ȣN ~tLNGzb >*}C[]c5=fHiogڗ{OB0Nc#!z4͌j9*1?`{~!9_H-^ygHw囤 ߍS9z݃stWMdv֍y0 b{H)W;|P)rLaiΪ/Ȫ!b{Ƅp!!#èIy'+G&\6]7A+nt$L{i~yTn0:N3AMh[VVuhTLSyX@S'N^B N1_*b@!Vo(T4P!iI|-"z7_' {:M\_CL0)jݮWڍ$;_+ITokN~7yH/t>*P5z; w*.7UfҼ:OJߔZ1+OenvwtU[pXg[& endstream endobj 209 0 obj <> stream xݝm۶~<>x'ONjdܞsu:YvII43H’X@/ }:>*Y9.0:Qܬ~~T\}}v|sQpJU=> W4U8owpwZg=;}ک%$c4*^0ꒉ .ҷ^F/Pkϱk[@x%W ͷj~be2q[n ?ƈv)]Z|X-oV/-$6:J{Uq{5Tfy"wKmrOtw-1(awHgB^WKo~Tw{_>kV}Y|=KVya žBxT`Arjj e7hW[)Or?Wm "tQ.S)0Uiʁ3~Wy4/ٸ.oݞ*Ɨ#.>A?UMQ˱=G 5 S}=X-ܶ2)K1yDu(kݓ":wUiE}=\b[ ^7ҎUlƛ=ċK^JxK-8@Hn&H| Um6d1ۀHkZ. ?>+׺&LƵמ3ozl CpPZifY'd 5,\WfF 3Ֆ@+W@:tU`ki AW|S(13kd);Dpqev:$5I7䒼\\` mtH6 V"S.sIS-354q ϼ*cNnpgV;=AFmP c&7jPՈ"u1 iVIc@MCҬcd4ߡxߔ ]Z`EQŔ#ܔ `0ƺ6({~JH-n0 rA5(Ssu.2kHlH.  ĄJ /+q1+&LqKOݛ@SSztLL4}\6)R;!RA 4GB(\$L~8%@+ '&A@m Em@kJ:tĢ}ȋ8^'4vYBEhjߧcbY1)Xv;ݒwK~kю7hVm5s #Gm1=cV4\5G2GJn**V1! 5wY*w{))3[:RbrH[oߚ&u9}PA[8"/7izPq[ܮ>O>, S_>"|`?| \-^+^{}^]`נ@/XB8j@[*b B/WX-O8$ \ %nC7ʲ2,hoڦp]N ezS +C\3wgT_Qá!:/2XH5Ҝ6VxB˶ٲ_v;$> $S\^I50e)E7c4ևrF5!.&'dDkkY5a2|Ɣ>9K薙x彌K9!3%SW8f'\#El1FZe$q-5P]&iLC@3u;tdҸ2tCfJ $H4Q6AFƣm1)QT3+E&LFјRs%|D ͔$.,lI܏h9ĭ=F}%qUzm4@i[Lt@Srv񽬘]&jLCҜ!,2qeKw:d|]!,+&&F}[>0THDThL]&iL) ɓߡ:fKw^wGbwN {m&:M* р52mXt@OP^b ŢpjfvM 14B3gܫ̑m1DeKPYDޥ&}0h&Tq`fh*MlĽi @Q:m!޲_-]&CvL郷=h9K91AixᏤ*<4Ptg$(3Q60Z{d;$g(Ү+*-=t DݎGUr.Z S0Wicap`BEשvOm(iƯa8!Ef LXmcypZ }1B}[Q2eGK%BϖsO\sι&is b *CY,BNbYI,2rPfi4͈ƓBA86Y4[/kb=׀+"\<)smk@0QCmގ9~K4G >L(QkWF%PԸ?50,>,ewrϵ?qU8>4eQ'5I8hz&ߊw[ endstream endobj 210 0 obj <> stream x[Yo7~ byS&imlyH@QdEl9"3䮴]RL1$9Pq4pQq5< ?cbr60+" >2Rm%н< ,;W{99f8(i$+8UE ԳG~i i'j,U\%$8&H?Cj[A7fy1)~&R39*zY\.a:k?K9Ryd+&vL3.*V PwY԰'c9z ^eH1GI{yNyjwB;xY&؎_ϋռewqqmk~|oK-~GEgT8SYhQ he*!Fpjv(|sXjtJJ Z=ƽaҺE7V0;rmq KtIM&Z+erme#d{.VkSϯ<|Y )K00\A駍@w%|@*#3ZB_a0|'rsۈA\a,|%Dl>kh . )-$mEȘ>PCс4IP]aCmŇ2fU66GMs?%^ǑB xS'MnK=8MO>iFa' h lC.%v 14xx doDWY~$1&If BR6`5 j~/K $az-;pGh1:\_f endstream endobj 211 0 obj <> stream x\mona? fdZp%qq.E8^,9k;C.]ig%8j9p8/Ϯb\Ua~~RL(8g*ί8U/fnYq-}sX|_FE/G/`G~1]m/fy]X]1 +`FWOZXV@#MQnTZ*&p2LPAjsԶ8ݸ/#-74ߏ2Lnf^E~Jqy=v!R\TO_oXcO li)'4)n7घMAYy"GA#,yEI;t!n|d9ts='n4Y<4BqvCzpX-Zf~2_mD^=Xď'dQ(P2n0K|m \ @&]g$0d|uܵW=fMV1o(wDلٺ!VI0 SdmC^ 񉚿mH-, :eŔ;xuBK0h`w&IrD놡mq Kl >X_$gnɵRmJc19\i)6DMo/Ii=!?/K.G.oPNj`6zRDcZFdﰁ%絰JC9Pֿo0&lRKpl~O`L]\a\gt0)r8u <=$#<\V[v(\#:C8IcBW oPVo.SoF\eĽY'HT^{oRe6 ZjJg4ܓ4zH֓-to,'idbS~r7/B+9F o1#q\o޿!0^;xeF%C)21(pFTUfHfò` q)u`u`3 stϲޕwh!ڎÇ4}V#n1,4A& 6 aX-"'S0oTXvMXO g^R%bb*bd:\ F_&CO{K.+,B97d嘐|ߔvwEZIC.3ߖt͂#p?ū ZKibRbOV}+yP`B\IL$F6^󯷎 4_0'aZ?r5PyrrVZN 5m95IOCrFp U-Sml\ӭ`/M LPR ?T|T%B'~4xM\S3lL%ࠂ%w%qAJkP3Uo#FAa#ifCje5* ׃b?I+*P7 $ѼR!q<ݶؓD;BJ7nj6N G $T~% NwZ+ٴhz`sI ha%qKi%S$uBF BIAC _"$dxPAβ<6DG:})f9:  4>Yȫ]\'cuˆC$csA{xGKp(AzuSr1"wۉk{-$AHQ*X Bd&8ҴYU? >(+c-ZO)q"!w1E)}%'k 8xӌ;$!Bnأ~æ5:ͩ#ջu|ⷮ-8Rp|WxY9Q]A`2U2דM&A>Vζu*g: ™۟]o Iݬ B[@%U//oZ6_mlmۮF8< #1I{L(ۙپLJt]eL㗇 Q2\+FޯbIWgtRÏ9E秶^ G7cKqL8d†`t 'FigSu~㐏c(tST|> stream x[Ksa3.X>"IR%QKU.\n{g,VF~=?+Y<Y^dٿ˖g:?˥8gʮn8ЕϜfYqn`6Yawg_gYC . |Zų5,a^gVL)2.awai-,+E&Ш@[~7*Z-8&?G9j]n܉}H+Ôf<2sůUO)<.d\Jtޗ+(T~_vd#*^Ӭ݁qꮋ o >P iWDa;қɘ/ "t7 ʕ 1qysV0r}Y6\ܭO Zt=0Gf,- Cbµ3 %ӮV }\9nbیj̪JM/*CSll]ڐJ$18 WC.2n߸.K+[fe<<5\0J*GΎ˃OUf@Qd Q mٞiXQ!}B,rG#Ajz@%DV޻I9*놡mq KIMJV\˦`r7!=oUN~ty_|Re(+<|Zi$ w5Ewei\>K(x-zO CN,Y<{༖-pn"wLjQGݠ=w|( 5!wiS RJ?WbJdO+ cLn?]/Yd$OSG%LjBxMhLV EZѫtIj#)B_O ;>pqZB~[7-r b #\ːA!ma v\$}>cL>&+(ꕺxJVuf 2@=)fvƍa`Pd2p%$d8U>uRx>p\0v5|H`[X^>逆&ډH{/}ēDSRˁ(b3h_NGNho`yk(do+#aZ?r${Jyt 6HᘿE̐5I! ^[YeM68Diݱ6{P!] l8/pu2 nچ!9Ak?)6i}z}b]u2')yE5>-:KABNz+!#`TV>sJMJut70[/\Ҏ7  0g cv8jo##Qm]0) GDѶz!6vJCաmPZ'w pjmKvpG](Q="*t-Za^~npٶ}\$X7!&$2"،(&I:38 g7G!'*Xl;qG&.cQIRN(e:$J& .$;8.mZ%+ f¼0jO`K0ۗ}XUmfOOF-Q=%SRX&qpؓu)cJӰ`d<_ =n_=fĄY[ gƷ`ODC=Y?+9DF[{EiU/g*ce7NQT!fޞ꒡K^!ɐ!@1{ !wp[IaOJÜ0R 4DJ(ĸ눧nv08 ߈u#NQAe(h REQVXǶ5F솠-@[4Uh?4K ]= )կ R͟0.-ʦp<5Eod7Pk'9.cR^RLE3J * H:᫣B(5$xl6 m SR;=|x2)Dq5)prH@z,ƽ2 &W]9nWN|ەwJB;ÔI,eHϡNd9qH"YsO FLݾYR endstream endobj 213 0 obj <> stream xYKo8Q*SM}==E(nN8hPTlYj{`%͐߼g< s fp^E9͆_38Bp`9 ?Y86"߻Mx&7 3^s0Z€cNc\aͫp x <*0mWZ-ڌTПڜe#ԍ;W3[ ( 2sWS8--o \ewV5NUhK۬Oݢ3\QE>cn'#_,JI]Ϫ 7٤ML~O8*u4%n]q]cJ&!̰ʆآ|#(f ]w(˨OP5@v|De%x5$=1\N΍ՠ8 1+> stream x[nF}7hT}7 4C$b˩Xvdߙ]"E)+9"Sយ̡~N V?EVd>b6:4N^N.2Y "ӌ-43.;\̾ovtygN@F'??8 Vlkaי.s ftx4te2jo'EۯbT&`w";<֦e〕at9UsFK x 렜?s5[k4 `,-;IYO]~uww ./ss2Q»iWFa=V7{pvhG* {t9{'f<}Nj"Z;_,oz Zqr?[X0`.[n ΌsL"ԯtK:[ќس猻 \doP1X OaӺaIʏj`9lv=GjB<^=oj&ƑO7(NUf@U mYYXfeC(nEY0G^ZݐDz޻E*=膦bh LLtU3*\J#O"~ ̈́i쾢z`eFP\\o޿=r!Cy1>mV7_g܍ө),gVO K}KA9n6˹I2uXz9/ G`+嗴+EqM'st\6%u4={RHסC :JD҂@r2b'M!JkMw~Q^t'T\4䡽' ٭d3OxAٳRyLKE!왆?8 &W3_- l?3xKMBřж|:f8(%-1{)#0Aї*~t!)0a=Fa`[!P7&!<Mkȍ%?TXfZ ]\ =1{|`iª|q /0p][qO;_5$1P{įby=a~f> \[`5/e 5/_W G,u?}ըJ8d9jNzeLe8x V\DPxx8[gCbt $V:tIMB-fǦ?@(d}pmbft1%!=ȏvkQ$D`ywg#w+VO.IM@C8Ԉ#fa9o[d:W)'=?c l:?~ endstream endobj 215 0 obj <> stream x]mo8 An){mrK4E{(I6vj'뿿(Ӓ8R+y<|ݝ$N2J> -|wݣhlw/e$DrwG]b y]݋7et}շ;O׻;_{EFYgDƙcEEIJJqѣu&8DDa?oX"-hldE Vyn-7y/(O`g=u-lyH /PyC4C[@9>ErQSG'=2Cجg"EB:tshO/kvZSAG-_~i~;-7 o/.+jYM4Vq8R2UmXG.4Ej@eUҞ!W))MΧz|h>=}<}}9yvy>ݗ#!+$UӯwTHЕLB *ϣTrdi-vǩVaL FcU;PN5fʫ*ۢPE BIb6$[Y*LLXcȻTdKU[NIĉcYA#CՋTl* x>ЍQC@oK o$o U/Z/Ɖ1P`s,L9@jJaat0$N|:^ti:N 8q;y$~QG NS(!I(azQGzQ2NAcQb9(1$J&VSr[Π!q.QCPP$) pMǥc/Xh%"ﴴbBzPO81,vB)RsŐp`aXM! Xl9dpQ%@ϱt%y:>tpT}h|)1l'Xtr5?: IqupGՋ2z2/QڈBRPaARpT iyA2N@R3 p"a@1.g@8qY'=8 {R1zqf.@ EH=Jѥ # Ҧ¦UhI9wEN7p#sL'5tjiRSp$ ,o`7z8^dGԅ؏SHӲC!8FToWÑQ{m= T31dj~2 Lw8q pdxR apK#Y$A~99z|NE,u,^dqdjiTz5RA˝xee9d2$&VSY5,Ɖ;,Yi6Y/K|zJ {ùWS^n^ύ*45JuE,^dqdji) kN2j~dY AGĝL!#ELdGyӺ2IO ɳ]C>0JqD2zqő⪡YZg»aL 7 NKB!qP96Uplc%r`0 q4ND&͉}78^ĉH̱d}kj9b2 sCnfʣ s5sI3х9Ux?6~̱4ND,Y/ʡƍu[e{:vi㴔CK^LK F.)k(WEkÇWEëUSd5rE 2c$6eEdu(uqhdZT׺,mYqF0ދHwEz:ax6&_OM MBAHIK6In`ޡH2ΡEqAe[ L`=6WKttܞe6azdQRude51uެ쯊geW򫪣4.[{E,4[n">S ]vzLƅ@K P*^M R[VZ_/67$]DOg4dmm_#MX' FQMv]O"lw%Y,m6#IhgE!([f;"m_\w]ᦶn;;4cI@tg{kұCڢ7m8eMCBѴ0~ p8== !JM߽ՑV]w]nz lw0Lnǝ!Q{^<`- 4=.f(-Ocm'Yجis:J(07Q-G8FgX0޳'q±Oğb8&2=AD"Oi=y;͛]o]lռ2$[oS<*IyS|A(|Hܢ}AIhh yFC5δ}\Am/@ڔיV$4H!ưa1k0g+|8˿9[a븖ChSGt|J(AI=IU!U(=Kxܭ1UBih!(GapqiωZ _Ƈ=si2)9m7xfOw3>NW"Ɠ9p*fh}ogul~QWynէTˀqRqVL h 'ڡ͟ƘFFGp Ґ$y>+Nǹ*/ ;ҬJgUŸ0DH|E_D%2~4qRm^ش9xHk<7d|qk6ȨTfN@xyF#FeRĹ9 Eĵ|G^To1C&Hsif҂$t\ zyMXEկoA2HY׀I9[p^^,`c?@/LЩ./bdqFM. jykHwxVͲn5)1Lfo\qg*'x= փK[wEglEf5*u2WߗwƱC4?&qwcvb[q]9b=@f?»jm7r6uD>_,A+>/F 4/Dest[ 115 0 R/XYZ 82 484 0] >> endobj 217 0 obj <> stream x[[o6~G)h8.vO2V`qeKNds~<=)hYIA4|ɢ:=NO8=N$W' H(TTb t\%I7}{z.#ӓaŷ'w~QUh4,V KRJZƩVnՙ[ZqC hv4ߏ*r ӟ %+9TqR3QzY\.a:k l\fr;x$[ 41穹4ccn@Yno"?]aOe ~A#N,bZ:#=E,''tˌLG3躚&".(g%-١>8T 9 B+/KE^:RIIxb $]2ʎ^2_V#ĤF sg}khʙOs|r'͐g;jZrBafiHStlVNIvy; "o]@t!mIC2Q16B#Zm;MuǠ+ |rfr1a!,F>\ a#WMмLII\-FPUtgvy ҍ i_f+˂I8[|38c eV 0 6qb\|?lPnϏ5eCdž߸ѸroC k,)!L 1 !q\@2m> 5簬PkޏIDJ@5[kKGUd45.c[n. rUgYom]YagwWĸ'_|cȬPMk:̠?f\ a$U 2g Ӑ,{z%e>,|SC,OܣBUW:lA}Fr2NA^VX.҉%JNy pEtXrTt%T2c[>HVͰ"H6" uSIC%@Jj։m; {Jz}@Xa묲noBCN 19n 딪e=^KA9C`բ Vը dyOhi%M@صW fܦvχIPL-mLO`t`5F8%Kʻ|_-M+0:Gd͂U!ѼL&ψ j(>WԨ54!wW=>J]tS侎!St\ ZؘB4"F( `iY"Lv=wV2!Գ yipd>?2ĪM+5qιU) Rǿ9':Aq,'aX-갚ТBbM4}|* cø,MՔu~` Ch5e)6i^C gcV*{fםYKi_ah%j >uzBH#KohRVQ]"WMD[aO}K`k=}mMMKdҽP\ Rڙūb jHׯ7v9QzZ$ޅpw=#Km )?+yp/ k$^?=@=@Dp֭ǓB4ڊͻ 扼̆q|>3fXjFHm:c]ݮ{` n:mG&%<J#ޝlIԁ~ìƫS2ZXCtS)} uOɇ|+Q>-㧽 \s endstream endobj 218 0 obj <> stream x\on?JA徹O=lvгX53CP63ٙݝoH><(YEYNÃߞ882ȁvS9]|sZ/s_HhXKglJPńE-Jj+w@yvH8B?i Y7)`Qi=rl3Ty~UQ)Jrט '+k%v:.)_r"#J#'r9'G*g[#f oypaq[Yq)_Y)k .|mh; 9C8ʕz]I jg~p-wZ?3Ʉ|Npr2 rby+Exf.6l22ޖn4:[ivbX Rs5=QjVfl #Z T+8fb-=b"+|m{5A_WKdylzRMc/x0p;/C2.+6HM[ H f&;5A笉eU+鬝M鷕iiJ|?%](LU _iZ׉JDYoZOhmR0֦DZ6%EN'^H&[m(?.ڤi<3q7i[MQr+&%1fxtn2%Kfl%[XPҢA=I\qN ӱupZYL=@PX؛f_Ma jW{'ho~R/bcr'߬26-6 dJ%%5NcPrͬ%a|3%o~CG~ zoH@ B -5{HC*.:pےɆK?V@ǫN*`,oH컍!5^sTa zl5\Mh,hfi 3IXהtwZzJ'p6Svm:=3W hxb9 5g}ksT5/ 9:ׯv;99{Ie F; EE.m[ʦ>LnyFB(.X϶Twmb/*bEJ񎡃>}oS+r&^`wAyG _|WslË$\Kg/~YÌ4uim"+|ɀah%wv҈9f+w5wA_W'd:MmwC7}h!ޒ븟cL'o,m)B3F@b|ci4FmN^U5&|>=|O5\>Zn2ߓU+%?] endstream endobj 219 0 obj <> stream xiOG%,9*=H!*0 lM[̬Ƙiޛwe Z/ȴ~#~ SEN8rrx;r9=exu ~%x<1$Z6PՌ GpA{ak-,e"HpT@vXk@b PAjsԖ @79}, kh4Pe7վ{l-@ R_J]^6D lirs2뻸}dv{}=u@ҀO84›iW]5ÁQƨ e!BR1GA-)D-7\Ҕ)-bUà]Oh3AvdҪWWRv 4h]C~x|%3|(r _2] h!]B p;";5Sů0]ó{yp̴e!s)~r(g4h¹~Cɧ 3VJ(?cZMTl+-*< M8-($Xļ#1PPcfXk#UhCum!ŴZF;y 9#f5ɪug$MCe9y޴KsdFi#w"'hآt`? Y#%1anr(Q +(J @!!†æ Tj͐HjG*kdÁ)ẎhA9aҡZI%Ju0x?T}C\u03A E|/3a۽kC xmv:sU#DM~aϱO7?k,kNj.pFu}`/q0Be6 QQW lQ]Mpf g_4ӈLjW.q72jMRmWɳy5C6rN5Z wΫfSxJfß߾pT5]Yx5ƇK; GǶN,) cqDuN3S8'߾-xc B&EbSќLyOepEr¨b'c  endstream endobj 220 0 obj <> stream x]o]>w.?t" R AɃ'ie)nݝ ivk,pfHvz8.419<'?H֧'=?=W"ᜥ*9>=&3œX ÜN22aM`FW_X*<4FyVAR1/ ϑm&g"9|0+ÔFsWUg8]JM׃r_ůKؽIh2=e.\'}>,b40&gjB"s*FѠ:4F:38S(=Oˏxad?%߮3CB]S@G 8&jCYt#v Fav42Jb ^jٲo~%m/\yd4+E$ C6y6_ w5% 2  #vI2͇1菁=<TV1cb}SC.0w tvwa:6hJۓYΟn+ܵi$zӋzUnSAȱp-N)t)Z6õ{&^'r9֮d)KGG)GxPo3pYʬvZg)rX3 7P`YD HDuq]/< Be_45x)R @Zz'saPMA잦=c?A\@!\qf gδf X0oV8Wzu E,v!~Q6MV`aƬo6?t@t((mGJۃ:@Pe`eTX,Ee彺Ԗ Vt;ø^bAs'0Ӕj^s0`J2̂+̏?g׆~͵͘`f3R3#T ?n]2\ KʺLK<N4q8Ӌ ڷ1C죧GVb[I2 Wc=GH>2G`s$um"+[} A>_erlBGiN&ɨ6=P \cw;c\:61.w4EP߅$&I5X]%sbhfJC;dGN{BWWLj3 X 8?jO[?x9Hӎ;T{_ oo޸ QO.K2_yVB1ۑh 1=\NXtd@ƣ#M?cё `:&i`:˜2 e,sQ':ƌo L>]RnXq^Z'!N#QYg~-G׷U.2Sƭ/>첳;Fby`ufg0_*!wBzN(LwvjLP9qa`bp" *.D/h|Ug^z>͚_X=c{['"[P]Y7t}Pٺ^ZYA% ;< 8' %PU5.{p`]ý#b3p #W!D"^x %3bOڴ\rss q}.:;-ğ|Ay?#;Z(FbG)Ĉz^!f:x>FoO4àJ0?ힵ9[ b}ϙoAk[ xHg !4J+>):%l[QNDSB̕ROQ~ Oc`ݮnCYzW>)˙=y ERESKH½$tȝe)acu$nm#㌡Ǵ>t)[NF{q/s#{vte} }Ms4Q9]QJx^>@4X uPO+XoҴWVc}&z,V?1#Y>☍|X~h[Úk^x)"H7pa:!O8AD(j-&5䈃>j#BçIppq~& $C|jX`!:J Ѩ+j` 6(8P\CeVGL1ջ핿=oMp}96[ڵV dǏV Ɨ6DdGɭL_^)C."+5Xs ź N2cZ-p /0HDv,[Ʉ!jk SWC-~O)a&C \ڧe0= ` endstream endobj 221 0 obj <> stream x\oF7Qo߻9〤ICqCs(Yq{HD̒D塕͐؝*X~(^]}*)?I Y+$|.ןYܥ_?1):?{w|{~e/['lY,V9mm%T(J8.pnmJ<%nF(.0IjKԶdPS=͟l0ngUgQ6Z.r-WZ]NVw=k<ր-={ɍH ϟԓe'f>A#,QDCI_*Ҧ*+`J[ZjfS*TWx M$dž VXT}jaնi c0I\[CmcC}q]kדz#tݟɴ~{o#,VS C%DM;fREKеC}iYiaP'5Q`Fm1r424MYqng,O~Z7U[7Qt#֍}kro<=` K. м z27H@o Q)R?<ɣNwPRX#rQ>X/(?/ARJcʓ^l@B&*Xߍkm9__;N]eF\?a)CTxx$bEwֻ_Qw%Fd煶lީ $XN lR^ O7:hsȁ!]9Jin@Wær6BÄD7Xm%kZCH[3EZ퓷Lt:fDmHt9_ִryH|>WS--I&8bT t)pgf1lY^ɬ`\ 6Q$!1E@qXq6ĠiC0N zoQɋ'6 ~FSn9+eU~yq2ʥf;r_Q Jb+,dTh])>J>MgR7+Ompa`>JH)5lcsw(8Yqx@/llG~ZE|A^#ŚHw%'~- ՠ8uVHmo#W h"qu{J rg=̦u[G >JD<{`p*4%v2gPp+8\H6&=_|/X\9lcVęM0}a.~=V^G` 75vc`-> z ʺuE(3C&g5~:jKݟ+&` G$$n%^ a$k~6Sbg{X m(?kM6+Ka3B\>R`i3i]Uq`AйT^Ra<=u)Xa%"<#*+f] sLi#\vMuNhǔ&~ɰtTnU.N+j㰨gh,GY` 6ʘzژEKCdIL!uԘClόq2ڿ5֏~}g̢ vw1:|Qͷv$kt6iGp2^Yl]'6 !be:.嵐fQ/_jґYF-"9jR̰#~u bH3ШA!lzж߼+ٍ>}iĻT7~C&9n1=0Ҝ[a2~m׷dާۊ;ʶRgs]iKG 6t,%?們b5 [LP7 C093N?BmHCuہOm| vx{J>]zBt+W]"w>UK?v BjkK|#g lڨBY hFMUAQ/] FOD26C?i6\5m0̂Dwb^|tL` XЇ{.^iǨf'uzm8}~gWn?+q > stream xYKoF #i[{7=S#9$E!ɴ"lJB.Y.eQRB4 ORPPiLi&hǐTǖ ޖ/l1hh"Z4ĠBZc Ua|5 R)Gct זm!m8<]@M?7%v(oM=~qh JCN CM>%FcL;!tlDysBP&mh$>LFkrPŠ?7ٗra=mV]@OFSq#<㋴xhaI@o(Ai[*F@OO k2'y)1 endstream endobj 223 0 obj <> stream x\mo.@B&a.v쨵tIvKNK;tq;/3;pG+"+2֋l>>Ivs|t~q|'"*xs|āx4p*͌.]7_~".r|F|~|aRs U& n?s\T-:ib4̫Fa`E|qX%$3ފssu̹ Sty3ma6:ts#JfF12DdT9)"j/ͪ9d6R9v5,EY@M{C`9+RXG;_[H{(pFOP<*|>H(" mIUP~P[KoN˷ Ы8aA7tjv*ks+P'j:oF3--K/RM*u pܴW%=X SbsrŷI Vr0v$?sߪ=Na_=́%><QZ:* B voPwEq.~+SwRGK¯KȥH~GKz@0P5KwLY#GhPtēJzMa6`O1Z x&e䬾FoC{wwΕ*) r]-'@rԛ+A=4gRƼ`M%GDWq˻= uKGI4@mYkb?XYša> FD@}7Pl)MyK;(0w1$S,<_c es9^K A>=3T68a&2i{E :f 4&~n\.9#5(7MONv4pS檽4?w?8*j!(z''jQѻ/Mp|`DչCAYqCUTyr%C X'u%M%W_ @չ w҆n .ՓpWJϠ}Pzy|o^BJQHBEeKX3MU|3[t|vV^<їQWCOod[DPUQQR g'VyQGN;[/Z~Px3`Ŗ(md*NΜI~?`qy^3W ).qqE;s34=mր.= nB^?ճ빃9yjfT#2`͡U\ZV\Te%@ ZpIK-X/ _ vx U$ou TXuj0n[@1Qx{nNòc5~=u]Oܿlo7BWC'fZ>W C%DI;FpB@_aJ,аL>7̩j%CG=ZV|Diw>4Rm>r54i?4z,a})nR2lfSK6vԳ`7'S W˹ӻh*jTiLs)gbN(Ih"`-0WZkFtu-pYZ(`n*g[灥ES7[ yu%Ә{}{k\[o0DKѱ,kla:_n8b̂(Tg^Pbj]EqT)80%f (uX/>/Q%z] \86`gRQRH 'ϳ3gH*ծaʭF*xs0}\g0#/s'7 ey@TZA/nxd,ϗomKϸ͛m`%?9}[}&cR_j\1ln=]^4!q 洹]b HD)*!$v @˂0$(9;}{fy/ߧ%˧- ??O㔷џv/N(f[V #lc$}טͩ ~lC T.fyClE*,GBc ,[sOC U8hH>H`ݏRӔ@{n&)7LE)Lbd{LG?ҾG)p2LV3/X~hK=u٩vF紵oՌ)),bm"`Nx4hΧ1yz'8BK8G7S9g.Ƙb\o$LøY#TJ,zalwϗ\Æ䒐e`y6]&xbJ{nL|vJGH$m >]O eYW ɰl̉B.IvoAvGAf-Γ)I^[B*q78kGA} ac 7QRV2W-MScFDQ__ïr>|Կgi%~U7F*Iah~`ĂLY. PDoyx|}\䃒6&$= *Ɗ#.a]_cE 7 ^dͲzML?k}Ɨْ$򹏏+/?k>ð8{^6:#o$11P+yA@5|3,KU IS3rJڤۤ99Eq~0;;E'cXc cΟ7|hDz"]`iH;xEsET#qEpEŅ`N_r ̋f9X"&Q>^~7srwŵhR_4'$w !K˘"MtiL[ōI.~L '(L2Ac5~=uE7K4i~S3-yHӥ\b"BB!}+iY5CE.({efsb#1&bv(6اS_UٞʰNm ᡘ,(tmVÖ&wѿm (x#u#F(#ƃfZ(KahsTm_'* bV~Nҟy ؾd hӴ7D~6C}Ɨ&b6^ƽ#4Ø^ewA8G%; K$=hse٣X^-KIy?ývtT}r$%.;LBq Xv~y_O0J-'@i aN].5Ԏv1ꎛF$+=)e.:'_ !PH2IoZF%">HcS69P@&gPprX1)y#S[y>/,QJ%*G-Zn`K\/ב<*qѤa (Sk(-?tRߝ\[€u˄?AQy.cmӦgC?)7 yiωN.[ʕvF<}:)*5;擢_!<)j cp 1_3@?8Q'$[j0k~,gͩJ0 ￀u endstream endobj 225 0 obj <> stream xZYo7~]!fy.i)Th8k7-ْ,w]ljd# =C* x.# ǣ'd6}7A)Sdz=qc)WVij߻_Yž&|ۻ dxvB_ 8U,`c- Xͨp)zR&4GǕ_KE.*Qmڒ3Ѝ;AW1_ UcU9li|W-uxӱ+aҦ`r2Sh_@Y>AEy&Ui'gޠ~,zz6F]H- 9 j1M!j|IR!;; ڧ 4e/- )VXyajlH70DTh sƲ{tHG@POJ7!K?@zVE䡠&vfzn$zZN&tSy& 9ǠJl[K9 ѰoV]@iOFRu#<*5I7j݈7(̟.<`%>p?`yq( `+yYyUrYa]'6Guu Xd3lDMuWb~-SBHOOd@_l]!4ijY )9 )sL(㳨f=1 ">Mr*/5t*X:},<h'Jd%%6)=l:#39 5d7vX7Y#qt;٬d Md.=+ 4žai6HS>whzGɩlenaz,Ʋ!WL2DֆfxJ<C㭗Y D?±V|ZMBfUA.\.@+gu:¥9БTA5SբW-a@^,sT&3KR(zkz?d< ɤ <xxo 'bEpöu'T9eNa0cΡF>I+7V_HiQ_@A/ %0.'y}j$o` Qzp+GPM/˜ݚho|WGm5a6eXf| h?Sx^s &+x¸ G`jftz8bjh+89V1Ukchjdg}=& 7݂R/I62ee[PS@z |sfNy24iIY6 K`680`ax:=\0_2u0&9o/kGǓ1Sxu.'WYLsq(wZ:hгW\ܝ endstream endobj 226 0 obj <> stream x[o8AVotw-{YC{88d.f('6h i38z~e\DIdD*Z/,Q_(Ռ'43ity|?; 3|,]r~O׽?"qL'ZţX 2Y0Fbi3^QZX⑆x1Z*&14P4~8S].>͌80eUs)YG6^J@s֋A9j%ֳGU`K{Z4O- p !ml`N.o.Fg,S>FÓ|VdfF}>IQ$HyQ̯ ;ˣbvk|\lo7A¯>;Z &L 5)X2I  D1~?g<)?l2-%|kq{ fDi}Żi]֑㷷]/7Cܷ1ewE>4Dj$o PzXṠ1q_w.^7c49:"ߡa <*Yl8V--Z ϋ`As$CA|xq]ƥXCv"FۃˀQ]0s`` if'ART'4$`;Avc&xqQ7eMteIj,<-Mariޡey`93rǖb^{rNO+ nb/q! =3ƧS*eb(a9l~ NXӁ+'+OUm 詙{;zMuN*( 6>:w]NtlH>0` KZ첪Cm` q6t`a0>?ƁPQ "J Ƕ.u«3$eR$`QKwR,#8,IClݢbI~zD^[DzPTYٓ#VA1BNI@i ݱLJM?SJ'glo $O焨dR{*@IAxzF2 h:;O \>A |\}50I{xҒ07hAq$BM}?8G6 ًLt}R m^)2qȇ]t (F=bmmVvUߕ.tj.e ح^2`p>dm#U6Z)@XsvУh-%z*cn/Lr ie8l^>2ʹSEv)\P>FIn䄩%'4%8A4;lZLDUkȫ*'Si T*['R)`ص0>]SV!B(\ppS,۲:a*NimrGo*:ҕ2z] jjYS*ѲKNU5G"dNqz\2R=rv7p\:x}fCKQhX_ǽQ~E: <݅ڛZa 1Y)Krhb,ʪFtu%dU5Yݛ uzi+/%^1i} :aI4VPӚ·E&UHoј)y}X"A#. h 屮޻x$w"lvNVpd>z)-k^WS5~c5Ym=M]w 9,lOO`!+8 Gv] fA/`Rk^eo6[:s{*䅈D4u`Xq _CF6蝃?!_~|ujE?P@5 TRXHs:bl 'I7rѭ&ݦD~ZIT\mu {`LdqqCx"S\ςfl ZF˼*] |ڐ镸Qr ks#j żhTv Sԗ՟J+EU.+(jHctn1F4]@̙gq.KʇE1g?sڟo8Y.Wn?/@+I߰\) { q U`= ~J_TJl>&\rGúC9=F9E!qOJ$ endstream endobj 227 0 obj <> stream xZYo8~7Gh) 0"nCh*Q4~g,bڦXHspo:d,ÿ$K \B$7tﳤN^L' ,Sta]ja(W|uo>伅=sz*ӛSKNN?L'_K@5W<0I3&lb hzmE2Ak5 UaTL"9QdV$'O;ae2wug)YG#|)C鴩g2]\ݪ|̯y baT5?dp:*dY g` D5?^!G2mf*f1++xX(G0p&O{ㄇ@[4ّr4*q%Ʉx3.sD' =JH l "pAEI0kE0b Lgu3jG1LB j%רf\_0^Ф/ w^qnu\ Uz_M%\EOXAt)`,*SHԋr B+K\AvA0PU=*]Fd$/ eKtK|"?ф#K-DOR"KȄ,~{]!,.ps+3P nTѸt{xi!A19F(2e>j.Q9ݰgHZ#ci1M54qF#Vsܚ |ukE `sk ƯQ/93d/ڿFA,C٪ ^ԲR5>JwD0(9ݠ `*vElDԮAڍ`|ZK|SJ m^+e`\ȼ.qKFz!1= -(˛[,H]Ǹo|/ɺnK5?6s f%KƕFWar#u!\OQ*v-x X{?-|^l=9U m6LCG!BZyӕJq]BsM9x BLd}|'cA4ZXz\= ]1>`†:{:nL͘iFG Z}MHQulqi}ݭђPy}|c`&;s .j[{W3mkXgW;; 7^jϣhOۊ!j&{L"+j{!1!.N$=B! ^DcCE #8rYWhn`tE?g9GW+WfW&Ct@Yߑ~7"egluK<>p > endobj 229 0 obj <> stream xen0E /ETBH4>T "cg̤iZ2aUuxbGـ]i<[ ^3sKw!|ʡ5,f F; @mDDD{*L`ZR &RӔ^nD_roNKJې7HQe[ZQ]b_"-Q,C5\/͢ZY) endstream endobj 230 0 obj <> stream x|w`TvPBu7,  H)$& .SxA0XPTDi*nBDDE(EDlςdߙ{wYV.=S̜93sHQ ToPRDb,RGN,(uN}7ru}*2DEc&>MDV1f^rkD1DwcG@u 8 5[ b)ӗ-C( F쪽3Ѿ&D &L/t#GM)x3$q}yL#NsEfo1Q&q_]f ğ5kcC>1ΒF?U})=rO9ŒB>`jU4(MI4Vv5"QJ&Gdj&+KnS M"40ՐDo%'݋[UD(O#_0iJ)#9bCQ([qJO6гyޔNv 4|ˌb:(n_@ rY#ba=4*?D{nnDxqn:C4DHu 6P r@_F<Rpk ԽHozAE+-s "uht0|܏.vӵbt#? h?]S! cX">ՐcAX2ZDjuiIFsOߑϰe 9'e慡RO@Ҁ^hc4&qC5 i䳐9C(SkF(< @Ch(1g~QUgrjmiNZG\.h@_)N){<ޟ=ZA\=4~^~s^(O1c+xWAէ\Uvr [i i*3[~бP:c:a&v'WH㶖`ۀNozηD*nMP8ޜ/w n;As6(}eo@Ga=q?fX WaJOcgξ[H Xm[ƶg\Akj/SvJ10m+b/]N%lqpBH;.hL O>9ḩPy\os]*~~zMl#ݨC~r/_C>U{O19Mo,nj[(Y/˙Ka_`s(=nMPܫ 1^ U.Jdֲ~uayw5("I,E~zQyGҦUBhC!t- \yf ~": PJU]n 4͠5H|iFc{ȯ@d"n?j8Wt0Ȧg?A" wJFxpX,Fϐd#>˺'N/~Ur`?2 h+4GYz33@QEP`o=˼7~#*;OO~5A:6+ra^Uh۱ @({ nz"vR<]|΍ǶÎ|l--b+0NY:_g.ay#qݡ|]?cR2µ0ף[~'G7\_$ˍُ~)uDZk)cElѬ9\7|$s&@9w{2֘swt蜋q!F]}|1hkb(8c.K-LCKAxa%dB7 IcL6W4--P>MgɾU1Ei[ݵngw -lҡѪ3May]lIŘqY(E=0jd6@2c4A=q&ިl5ChF*,0[:>5V1h61H?8|l;麕&iy3ˏ6F7ZuPoԅA4V⌮Kk{pև^|v,3`ճ }d8  fг"?`} X  ehpw ۹G8[zyÁLt-7 ҙ {^DK]JK [Tp wÁBKsp e ts> Zm}#1<"2QΧ/3b[k4Fz,(l׀Y3TqvV@vs(_u[5itA Fx"h4hKNBmVE |Җѿs UHA>.YeS_2H*z#XHͬӮ4wy] 9^W{I7Ki`KWK6Il l+({0]r %kFj]nO_TKgnSv"ǣ쿨 ۤ+e:S:| 3G>ˢn=IMYnG^u|].UZ%W.WQ6"{"YF;<!-9#^J3'@إ6[S(}7cw`|_횀bS([5hg eSG&u?qDlVF;jkFUyR309 Աc4(?+ \җ}9o]|!@{b~pM- zjF h#@e`݋rF;B>Ch,uO hw%MD{w݃rl_wm#|^3V;Dz^C10.e:d %c&qNy zm#l~F*Q.098'=xPUps:vmlXځvOVf[^㝽/="]K(IGh O5^юWΐ?-F|RX4A˓Ӎ=uBSUo0&[!6 |6vs7]UmUN,Z{u)3ssc2]?zy˃\=K;ڢ`,siv>қ |"2Pkn f|" jLnu";/S/IXZC34Sۄ @$=oI%|3} 1tvmra/*m.uAF ?t?N-/65?%OTW7շc@ӵCnRk }W,i^M%) 7@o+f=B~ )6|-=i9\ ]/06?Gy x1@GNi1PF QzWG~)IQ=iSXjZ"Cb5QL9 ]v;}4T>S Mr|/y xz޴?GC"mse#`~o%hx'ܽYRGo*{wC,X_E}3XIǞwwwW/ZZlw,5N#4ݽYTb\RNPf]<a+ejݪqXSwfO2?),/oc|E5{X~ؗalߎf &O8>XŞ0I.7&56k|,e W(oJV2\ , E@p(9Br ;"<.W(X ~Pn5X#g/3{(T<1ٞ5AɲRy2qF'l ̿$O(#z`J6cf9NGT9Ceq~6(vc>xZ?|L3q%6n,庬؟hFQc^=/\ D- t́FRi^*x_++c؛!q?Hom:S+{TmpI`:ؿTηu; rx1Q_Pg#Wwsx ڮJ`nyz]~zTuQ7=Mt$1n\WoKº==y.q֘-3}P:set !7ݏ).k&yw=c?$5]~WyKˠ7f%\{uz|ׅ/XSU3:SkjQ6Hs=u("xMc~m7+۳|Yi d|7a>c^Gc63:=g}hNLENma'<D 6lc幯OyإLQD~{;NYR[RgbE/}_z$1+\溝޶&A;lŜ-z/3OQ񔲕{ÎB{q1:gz._nJi/JvQ9Y=/ϰ~eeTb>3*hXDh Bʆo+0-EݠF}J ET[c|k S3Q6 ƺaQ}4Td"~Gߥr)+Z'}N9ϾbUj=zk|8Kا_)-s#Gc*浯@{rv;B{Q{4YNϾ{Z;깃='1ӌBy|5>Xᡴ E1t{)ߑ:;/7@WGX#Ӎs&9G5ATSuR7Lz5mmImmMfxӼӛkiUJ@U*21"BWT&t*5R:7ed2X2@NfFH'_OxBwf;[䞊h_WX0<ǯrṇ1磨vzzIf8/GKJzO ͍\ԁZˬ,4}bLa+vF29%[2>ҨOgĖ7j ;eLo_?/ IY]*8cs4o sʢk٣YVV=40*BC)X"PwБB%#SO@)!a?"=$ sy2-0oO]RX-&r ?>zJDB*!1aZWQ풄1Y]\F#cǽ4q9%|ȩ7sr}PԊw ]N.~Q2٣Ay9̒|gl_SyN_'=Go9!rÃɩ7Z⟥4*Gs#ccb yK)r#K/ZVZ༒ dY%%r7WM[+)h\؟uO.:1VtjԳ' (KlƾhpN&e-͋Vjʉr\s+҈\C% A*H4BӢZpZ0윴46np9Ù9Yn"G5Ww4?uozھJPty 3-wqjG-m==No?@G2[w@yL{iilYݦ]l6nΜwqxh>Z[ OߚMR;\],.[Q5whk(פE"v?K;ݣFC*{E$[=ɭy~So?;I*~-ߓdZmJ8 ="-Ay6!ʯ,Qi{< `V\/O"$P/EuSڵib֪-N"WK>`x☀aj58WV(uU*J.7%֣XT<#4Œu%aidiZyS-ϨXW甹g.OEGuW^au+=~!h'GwIV5$]cc64HS:q8^\LwHkHʬ;6HƉd ED8-D?r!  )ꗅUœYI S#8I`Z5N~yUڗD:?iOp=e- *W$jZ&^bxk~IQͣTDBhɢڴPZ&u(R:Nw"K܆m1e@ڢG]kƘ2Lhrעzԉ42=Yw'.XIAhy-5WMꯛC#B(ƁFE#^㱪~kL޼JoGt~Ch-^1F֗/@ ԇP>ͦ;0b+L[Sj/;SYqX EKq%q qVsiZ[Q_o2ǭ(Zf˱r\%w/0jMQpx4E]Ihm ‚s~_D ^th1AL~*i7ijmZ, QlWEU)UTU-kr[0yKh"(|-hq#=O~|+:D_c"uEB\-E("OS @,bxLfHOK|,N3 Yjj%jmmVm^ԶO@;}Ӿ~kum{7It}>W߈|S?lFk#xx͌2cYֵVkUa}]\]s]w7Q9VG!K򖼼e_ڦI%m(6}S( NDUDBAEP7  *.3㸀3:Zܗřy==2=ǯx+udވԇfGh5Iq3u} ?1nނB$Cf ORx>GIJe\6ȳ7p6݀6FEd8G0ߐv\8I'q~I4I|?] vBF?6xW:8TG@Or38G'FN"EBSH sceڃp3,B; G-t8'h݃^_p 9x}אT=Iʽ@w\v'inW+UuM3r D`!=(0Vd{n6 |(0(t"R%$&!Xb<㏸\#ww9U<|*ET($݈璸";ً$y("MyD*1ZHԥN8p:CPƣ_Q;z쎰9%¹8\ !(GA$$Qh44 W Tum6GuY;DڎvG(HL*|<7lC?Й=v uua7ml>lGXDf<- (G4f*s87j =œy<9a>J0QQ8"u$(/L;NmC5RSڦ#{5;֞1~z4f7fiNX Ŝ?ާ`O?cȊ*5cV"ȡ&_$Xt%~ uŬ{QUYU! Vۖy nxwV}T~7!ܵ^CUj3^o݂XU~u5EȰPP]$N׵i2D>*7ݶ|5pMv}c>x::[1fIT(ȘXTD5yQx15Evq"5a/\+ TNɯIU 6DuY<_ {9<¢ A + bQeU7=7wk択-?waKj._~;޾{]ǽ%>]jM=pxFk|)dn $yXs 3I|)6[cjtFy+; Ǝ䭝nXKI2N&Dv҇yxc?``2m6T,$ܻN)cs[~lJ2%vc= ;v}IG@i#Lr2T/~/gR=5@-"o|g'u}G4-JHvYq?;D]_Q+aR(/Ri"|?3C ,/Ȫ@kgg`+3ъqRQHcn*SQ^U/ fᾹ_3~GO}ǟ6_tьK$*[SoSkfcQ W$S|[C:e@UhIb2 jp<|9hͲ܊00>URsT(RfIHXbFI2i B VY&pl=iY朝ľڛ1$fX{)U50nrf,7Ǹ {򅋣gXol!`aѶ jMvYq%"[~ VڪZ$r23D p+jYf¦$n㒄ϛ%031( nLɻm1doU V?NimL$TF[^ 8P"ٴ( b@ag W 1B/I=[Hl8r<|!R'z_-]CN=Pw/nTԅޡ[$7Y{f/[;@^kQTUV 9. X 8[֚u֞ 5Ը [쌌$)59I%8erLu $VgXI!L{EEՠ <@Y\:bfI8ea$tv ߷57}Jމޟ3!?ܠ6zx:~Qdr74m5J&n.-=3=t[Wρx́]M|,fPT+i!W"4aSh&Z^JvK+qTD=)r}FxcIr׸tmgqktTv&tFD+άH@}UFF,#PyvzvGO־G'vt+ucZ0nؚ!,7{sn9Ւgf7k_C~w'X'KV8Ld*p"~"!EKoȥOKN~e {_}[[tݒG]wʋ\n+_2-,]3fEC8c]ǿ=97ޖB .p ʫ,C8C8+v C$YbwtI+Pw4N tX6H_AAoц&KfLVET$DQ! )$XANUW4$>YEL3;b~j*`i4ю!B e.FV7֣ѣQTLBDp3B)Ŵ^5WM3CV}2}|;V^+tlEֆ2ع١:f93-t;e>XvFsriarѢ"ee(G9%$٨Y%(i$̑VLv$P(ZlcEh_jZ\rW` K!vt`2`ą,trotXA 0 Ct3l'~cIoYpkpR^ѳ~f%{=ְ":|]/u9b CYhsFv56N*=Dc|.)tըCBS.ۯ:le\iLQ*S)'&tekzJ@Xg[=*ю[ȁ%J1 LP$쪳2\[>|W8})gZǭN~4tŽ=~q}Ǿ;o`8eC!tV "Aea[HXYٹ2\8|G qV %1yP튚=yxv(i`0|#mU ߜڰ@A@ FQ0͗/|v/~Z_>xT~,6l[ݰKӥAG_~5 ޚ Q~D""&3YN2  DQ.0KᨌLa$`!I|9&εR ;tmaSwN$-fdt D C%@ ./4:<ҙ>[}P:r =U\.D+hE~8r$ҥ(;onQ}3JlQqZ,Q/>į漓4a#1F؞H]H&OB:?o߾oIF=|#VVaFNAqrk I?C}fԧN%}GoH{ g\΋?Zc$@ՀV+Չgh ~V['YTHR/0/jhVZ:U3v pYtDX" [diQ'EQK & SػJ$j22[# .`rN*N]Q"^eK; .tzc4a{Ad܊ W̗5 ͍"/pY:`!HtCEᾫq+?7,,*~az- QW?uzřϞ[n Ї=A(mE$*E;]ʞsQjngs d@X_ަPi%H 5R'¢*KV\u#n~jƎ]ozx&L6Οdحu ~7ww_!u  zQ>N=.9LM1˩aY>Ss |7E*UL +dM/n7PEmYS~vȲ{ ܒK  B&f8 H&G]Xg*6vCϘ9t}w.1%#u<Owp?_/-w #gܶl;X=hۗ|o}#R7^}(Y{SxºCd%/]~rG͌+|\|-?)q_9*ƭ{xƐFF/~}5ErD_^1jJC}vCSFzVEpJJ LX$4y\ xŬld΋^EI>ײ[icډ- a PI 4@e|)_Gv_Pw~0[)|eKħz2ԋv'p=ĺ7ӭ ^<OD -B{ɋC+U v27di, &2`yf tYY̟ffXTYQ$GjNP EU @$oHR%- !An Kw!ohU΀p $~P+Tެ\0Hh) TמmDg̝ۻ!CG?1>//eu}O I!+ZZV ʌ2*5L |b&]uƓ'GEWWm#"Rz\bg:c5O@.quٝD:X_Brud js?Z.W[㕤 cU*viYdi@q61W;,&Kld1䌋o28Ejplph_qU`BnzL□u+U%r Z`LAvOFVMdYД~8XGAYO9}j;=CiChψL1&LGȜ͆GMGkol"l b4\NԧH9[Q"|$?{| A1V;cQAkcgIDIqTVdp5%bF0$RAY,TH?dUiotq*ݩbv&@&KuQl?2uf%1 єĽa 0Qz60Xd'm<^)$1g7܏1k1JԤ58,Fph9{>#f֙Hl׃ c>/S<^{n&w}UrP^L)9kPf6M s%2W-P*F1괘X2-\/uBsy.mPa%-X +m FEH+qTs4x?¾*sܛܛ&钤iӕ4iB!-PP(вD *:SEQwgF|3Kwνi):+nIs<] >jI_|e_Xo">ҧbRT#'&WvTV1f p/3Cɳ_nyĔsűΎ}8Fti`C6wss6OҶ;YMRqGGgY>}y_ՖΎO2/ή8E4&;6ߩZ,I6gc o rjV)lѳlxV*=b6`.Tr< f#!Hk?KgIx2UX6U7Kb4lͽ_LsRTc}Ԭ0Zq;ݏ@ئԦ3 }* 8m aɥ'n}T?pyFOvĵ_?7uOdm߳zl}STvb~NUj/L;`:t,hVZ|/)?n`XӞϏiF]燈O[FK KNL77I4!bB\CVavF ٫ t6:*ŀo۝䧗iZ4|2;aӂɛo߾sxh&/8zdy+e3ADQDg6SxJ✒=# 8j+0B^h!TrL#e6F;oi^3K݋{R=l^f>b=0_1A_ 1eZل$um$ORXE-8%!J>wkO$<,)Z<~X6s8y41ܲ]/~sߞ!> c^u7?/axIIHerr.wړ7T*2lЀyesȖC N#j:Cr0&@@@y,(BD6-OLvmo!ƯjD.–IFB!I25IqN"! 0%!mmvy[Khi3xcCy?O?۳ 3M7Fxe%#]c>^y~oݰ^ 8Ս-Nk8TċP5vuM "aachX::lg_3fai#-!юuB o2DَjʊyJE~ e1qHb,.iQAAp0[!I+}кydZQ>oq=Idְ"'}IQNJzo`q9*`är1[< &%vhh'OZmYCF5GvWiD!B"Y8:E "'iuRqL1>{BP*<|2JszH?+v֌\4(ȱw@֏chv _k SDar˗oOPd hj ${'8hEЄ1rHW4*Yg1c"O!sRlϪY+jZ[$:&wDɸ\7c#)?M8&tL f 53.'$cH0 oxɐ'?)OX&K=X`&UF8 n}刏Q&z1>H?p< TzZeNe^xdԍ&9X "D#Έdc#~I].±E+#ɲƴLZ%bD4Py `pX@ Eф5Y+f5̋P[B dv4MBd< ި77r1;ŷ111}1T kv7av10|u$ o㙳߭_'W&Zug (njlR>Ls ˄1ADе;)=ﰀ0-XA`"S, !bzM+~(.Iq1XBpkE+n"qΗRa`m6<2dIe4׊r/@Pʕ$ 323^G3[n'fxYd,[$bQ*ͼ.lC8.\ 9^ً ^, 㓽vFo3q= u%ϱ=fIgsyyێCVݻ01ףYp8޲1eeɇm#><"2YmtX{}-u nO܅^ωT;D]獨=RE%^K|im(Gc Ԋ: k-/Zc=;r*X9PHQRZ ?aʿz`R <"ؗ#V e|Ro 8Aqn6ێE_Q70V 5(N0(nSZcڳKgw}^H,{Ѝ ybzgӰgpN,2i{&5>QY]eG1pھ޳.Ť{iFB}ŭ .߆|^<3X%)LO_M~vw|hِy{n/{G?tͣC9kZ:pu 8.XZ-PŒR,e>)x%%H<A~5dzx5JЯ`":Y»4w}Յ)ROXp4;Wil "Y\*~dKy|W- O^4z6ܣs'|tgMy<5nM:|z#QLg~TY\ٚAeJH{CAT bf?(!gua3 eYvS,-IxHy"K22A5H(E,,ZYƋ[TeYB ;V7Oڑ|E]|3q*Q=iYRpC{}t=<8䕓Ƀϝskeyk߂ꑥ7l^w`e*z0e u=Om1iVtަb(h,; 'eDnSi;P%9AdJH2 Gsrl?J\5kX5`{]A x lEn)xfnH6NM>O9 +#>5v|RL:չG~MzM*?i,0["ZͫY~IYjj1~m$K|/P\1Tq*0e&g2Rg*Ω6 ako14RW"vaOG *" >#砜5%;?}7Еe{/q|ы E{R+&{/zR!?L@nc@uPmRYM,TvmvNFtү]f/jyܷl'3fΈPAzw8s4gy}iiS>32mM&-70sxv`ռڼ|PzOW+W=zO\iujd#M4 DÊ;(:  IBGBH.> s "-{Ć̂ě*mq2h_IMKDo/ o 9cd6yiJ*[|kV-uVs'h.Ơwh,VG8H(L&I2y$qX;fdYH"^-EYEn! BI,ÎY>!j黁%/A:0T=tRtJtE~N2$|zGP_.3 /v kw(m4"VZ 7 )x%K3K`GɑtiqVa"JCs퉛5x)LS;8N9KIund"+D`EIt4PfYs$Q8 g M$4,z80q07B!lU jugK{" UZ<&xĶ+ʢYE!sY%l%[_Et~T÷^ C7Q붢"bFz\V 2A! Mua%Zra f6E+-$VHy[i1җ(Egϴ/ $(dMm'KZK @G![ [e&lHQeąsTglj:9a@ap.N0T2hpX2i=U3h|!6]aA !³hE˅^e:2P+6gBjvyAa :2'lջpa fKKݠ^\X=bmxR]znig1Dg`L"bU\?jе:T5L|z?h5k*D"@rꁇQ'{>A+= UY4$)7ןcn܀eYLKU ͇Q;lG `H{b&O~; l#(hcbwEzj"TƊ?h[ (6>IC>d ^9ng [B[5cOz }u }djhO`Q_+.tH(h/k0 Hq {A<:iPlҫ`riFX<-|4mOafnt.%,DDQex`iډ`Z:@P]O,Y$Z3>r-0X!gTt3k 5. ^,Aㄷl?EpZރac'杻1׻G^jtCK;gL=xfY$.sp g9n9U(^>1*vn < ܠB;Ж=ܱb:<~DojjZ_P Yt" {CՎGWVu>ysκC{3reز%pH4/:V߶b#sjE8o3&z2f`c(kp\B`%euw5qUW͙=q0Z(@/(;jLeٕ>yꎎycF޷Vz^e͞陹n̙QYTP\jk+C^&PHzY-4L.~k!,_7{,orSg[ꬤ}s߻>{_D"%?ÃÃU2Z^ FS1!M\)- /ג͏+1|(w߆Ãx_ԓ[\i,1_/) _MI_|J~HI_?אlW *U?@( "vU9}jH̊[+ bpoii + oK)F}/7;}oox0$̃ C-;rr6YqH䡆Mɱ˲ry&=]LUQC &}[:ZFE־ݎed!(oL LJ]W!ft ԤPx@V1* GTc*Kݢ~eSwWԼwNɊ %]|hĹ{>77?x:1Y!v";DV,+Bbc!6]CY4ÁCƦǏ^ZYE-oZz@G1 qP0g*ȁ1c!ػY G9p>֍ywA q*ʇq`2UáZ?"NBgKI[&$S?nby{g*%ZR'!æ6/ 7WWhD;ׯd综fUN^8mxlaBGv$Nz8_R$;ZLpF0gM@Wv4l!mj44\Q>!ER D8F"Rp)&Abct%kEkvy؛N%?Й?Yiǂ++FI* uS+[w$ىrјY<"sv:Dl!sƯ>a3s5'>MOu6@wauP\ޓ,I-~COdN~~}s+.r꞉]xrHF@>b8m~.l,0 (V|+a A`84}Gw4}}ȜgV;xmpʗ;|k|]QC3m熮zw#2}LEQ "kTʲMLzqHfdk^kFJ3R,Y- T(ٌ|"0^xRi!9IS1-ݱZOEjoX-ZgD`ũbCMO#E5jmk_uo #r WEx^i-je؋KJ$ڬfR9/[e| E7!s[&:lNE/o:sf,Y}nY^Y,ٖK$-rɖ8N(KV^-PJn IiBi@A-_@}Z33l޾w_Kg`ymyMiIvnnhĚҴ\jg e h]%U2wPDh*HE("y|H|I%uY+zC{q"d+ƶ΃#qꫮD?uZ24%ҔY\FQ;ih{^fٺ+f͈^\q$(ܰǔ lr<7N` uXBfJ%;[0Q2o sC IfZ/"GFC=ސ{5VY`5[bEh+DHq}s+D,{'3:V#J%qޤ%` 4rRc$RVQy-6ъr޸Flޛ~8wO̤>Zju2 l7wrqXd,)LHq\S)4*" d%M_ٻ{ۯ}t^1t?=;;W\}|߶籏5;};a[3wnG{ST|$ģ-qHޠex3x<11њ`2%0l&4L`B&-I0M|b2׬W:D <ğ'X %ƱqݕUE#yF@ƃZkCźᮺĻN~}O~Cw}gaĝ O3M\́TJƤD %S<r,K)YFOV'_(I輈1r[S<[DgF,N(xIy9b#ݠ{&q49ƎejLL ׮@eNsX4Jsm~0/ ɗTdbO=x8xUy'f8cMע-,].G)¸'d)9ٴ1%"=&֔ ^!LV 2b^[JR26~yX7dY=ZM֢֚\=c6AϘ2N3^?z &'$4k:b[ ހG'4WR9V3=Z`i645kE u )5FF0TjgrCyTa椛|F#m"=9CWoe}T7uR/_'n*O9`6jYY-e+*Li)LeE Xu2rBH(Sku:7S!L!>=M+ u f5%a%U)c j*w X4 }\EYm+'dWnLI&mMGF9˻F\3z5qYrlfP{=_??ﶸ[ uMV9L5rvB{x:nFYYx>x&ޘr(ɈqXjԧF-j!40!TPk9UH=2D}ab%xd=':;ٮԠ9dM~xz;*{>c-O]5x}pd]ΆGu9 ;nn v,F#W}wW}ֺwl]>kͮ}#mE~.-ɿJW,} N709lyX9#9JBP(oTJ4 ڮj P RÀgM獜2) lY1 >k%ԝ"T5AJ]VޫBkg 5aӵ7|J㴦P9nf!lyU%%U?f͓6Xn8aE>_ gеi4V`|یf,V2MkfӘmYi[^ED9.8RH|dbc?e^$䬅hwa=C[l[8uvͥDWkNKղCٹ|κ5ֵXs s!l+,@9?,9Hס?$XpQQY`xyȔT)7OJs ބ;.,wu`᪲S;]]0zs34}/ڸ3u[O>rs5# y8>\Ts[lJ,=|'4p|:Pn8&lّړaa x5xV}D9tEs,eRVcHǘF3i6n;]eke"J `Buucyd7O<}w7~cw|3m+e$`e;K i[7 ZőNe 5 Km R0Kކby)tȆb1F{?gY߈_f[|$xv<ŌF%E*kIPLNX&ZM^̈́UئPM Rhp9h(8ĆR0F ׾psYϽǖ/.~E5̍I·KیdaIhM$Kфm (|Sr&i9Y1ڗjց8%G03tڅF7Pv6^TɽK7qb6Ш$:޺ܵ{sp]M'seY}>d>,Qwn^K/ބj^$24 U8Yÿj B2|f.igBo5҇sSsۅvŸ:=VWeTJ6#FزD`O1"NDgq 5 L9_6)ALވRabJJIIJJ^C}&%1K!DXLCҮ61EOɛuqBѲ՞u49q붢덩֖->8XBN1u%K+:,鸚_y{gg]x[]<U\- f3]AXBtP4$ s!sσ1X&Y1ŏa$mMh Ч)1!v-:EsZdjBn!iPS\t՛@}Ca p3+`P,Zxc*|%e6S8ɧ &w(N\cE_y,{Q`La<&{r"4# cA#~/Ǎ$RJ"> F&Q!DA0`VֈUZj.k$׾,r4:4$[N! #.>MG=c3{A& zť1q .e Ho0Z Kx7\om?j.>xoAκ-Zz>>^87Li׋z*Y<[Okd9ڟNd:TSWkP{gtG N^T)2]ʖӰVyܤ¼Bwa!Wh6tf|L@D^0̛fC*D Z֒g M`7(s5q){D,iˆuۯ8Xڗov4)P#!;ϗ[4 9\ t򬂝Xa$x #V-W;ӎaLL1I0!eduYchkObRlF#jl&ORnGIpЃ '܄JT"k$tHfp׼r{zMνuOgP@<߷(n-IX4p37i\ u eHUulK A5@:YP؂,cNAgQ~|u|K<ϛ:XMڐֶ݆mLT5 ټ@WV N<++⫳[ j1˙!6y!o(r|d"V,qKlV(CŅ@^=<ʨe5Nviܵg%Y:_yg`͕Uuy5\Cu먧{Ӗ jK]?eAn+"$HmL7*q^Cr8ҭ㘀N`c֚t}3;rCghIU[]a3 zU(0V}sK^M~A| cunPDKA,奻qz>yyYORZI 4"\@s44Q+0]IѢ1^p㬆L K4bgE _r,;։qc bA1QlKKEZX=%U)Mp/uÂSZSݏ7߅w,䑺|mLOw`@W,3Ҏ=ůCQ3CY ugP<ԑ Xs(&!D{#&VgXY Na_ϲ(ZGjx9 qH%,9`a 3Pg㾎ށ: BDexʠdL{2wEȌ3Ĺx=Ưks\ ?) =7IEͪh8uioP_?Z1Xix4Ԓ;!*ik^JߑQ̻}y\P {-Ŗ%ֻsݹOʿ@O6]"X #]IOEۊ^^Mi5մVjZMi5մh*XMǓu5?|R:em~H/gSiyxJio@ )d~q'r\VZB򯎏9&q͎U XԼ];^:C]o?YqmgmXz64lPpcï79/6~Mq HbiG$i5t$z-|$i #W,}C~HʳLZsL*~A+ W2<fb)aN(ꥼN)UB:w>w-$\䙊.qPn(_sLfɝ4ru7<ǘJN/JyR~͗qJy2:cR>.}\ _d|J L0^d<3MK*yrma3I`zl·ZQR AI7t0,#nj@~P#D/gˏ\06 Fy#nFRR; 0"8:(SgB`zjHRb98 S2 #_r5cA -Vrhu|v--Pz~ Dr[o:(> Pg-Ed,<&"tFn%=+[/8c# ´F!Q|*-~R4f//]־<[ՏDL%ac|NGg5PBL%)Hk|Tz3;YSG?Yeb);F Sm4S4G*&e*]&/ooO癦P}GQҵ=M1´p\ɛCJ"8"Q0u(k$'DymyVb rlijΥh6'a:5EG'}h-K.6Vd RٗMKa aD%Lmcj<l^?b*ʞgT>E'(֦,Bհ}2 FQ)E-=oG{%@omv3-p5޲C[{fJ ET_@95HP>N>z+q-@&hcnf Җ=tN(oԎh~&VjZh|i  CNg!넫Mut<?"pH(d&^~ z.mšE\2]UlG3 : ErQQhk9j膞^J=D3mb%rbCJh NkЮ~Čv>J%}6Qu+M$^P =  ҍ 6;"3MBT8cxiFhIP`68Ⅿ'fޠ&x ?]+^g;:Ra tQo ]AL3xp3 c\X/NyB{S `@X$֋`\c/byg_dJgnT Bod"0 ل͞p7}HL*f|X [ϼ0 Zb!F^OkF}iMGjG=!a ayJgaF)7"L#a@Hy@ln0l&GfGSBHjLsᣠ3 F' #c(,af t0|ΆAGMf;5Xy9a  fNGDn,05" & {Bkt t}YoM{G}{ 8^FʠNI%T,B02̥uR#Ei!dp"N^Rr/rBezm& Q%^5eFmXtgd VQ.AW(jgd9۱ yBhG4)L!qBdh^*zpvœ/x{{1Q Q騤HU `5]DdP\P^Q?DBowKߠ- {ڛB l`{_[w-z\]}[յUl[6{{ssGڻ:ۻZF n4ȄP^2X .]}[mBK{_u ]=}Mas^7L vw,NwWf2=BoN{(|Mݛ mn(ltd8 j ͮNWQzh3 67-\𿩯6/um\= -=0!zISϒUX/exEןgbÆ-m]pp7w=|7>cb)I˄ yIJv|({I~կs&\#ebs܅M5'f)[pʢZiݶv.lm׃*薗L%ׁ8{:ɋ,Ө|FpMP$説: ¸Q=oWr7 uu HZ"2aQg=%)fF 5:A9 endstream endobj 231 0 obj [ 0[ 750] 3[ 278] 11[ 333 333 389] 15[ 278 333 278 278 556 556 556 556 556 556 556] 27[ 556] 29[ 278] 36[ 667 667 722 722 667 611] 43[ 722 278] 47[ 556 833 722 778 667] 53[ 722 667 611 722 667 944] 62[ 278] 64[ 278] 68[ 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500] 181[ 222 222] ] endobj 232 0 obj [ 278 0 0 0 0 0 0 0 333 333 389 0 278 333 278 278 556 556 556 556 556 556 556 0 556 0 278 0 0 0 0 0 0 667 667 722 722 667 611 0 722 278 0 0 556 833 722 778 667 0 722 667 611 722 667 944 0 0 0 278 0 278 0 0 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500] endobj 233 0 obj <> stream x}ۊ0}\v/9i)Pm ^u]ao1c~|3a>QUO)Tk.:rsNIQ?qMp:t=ԉ*'i^d+8.@WLVqjtzi_A:aH (M׬}j ['9amb_C [Ͱ)ktԬGBT1;u*L[0nJ9 Q TGTU:ؼSvw3L< :\,FTU\Z%2O5o-|ء[ؚ<< T`=yؓ8=^<᥼V9n>)/czoBs×b6X.2׹x#i,~@9"ѶO:zn3_6nq+W65~> endstream endobj 234 0 obj <> stream x| xs@ '!A)$@@@P0OUXATro TѶB[JUVӯ"!h{<x^{^{8!KqR[Z9HТK6g>D4Srr5o?@T:h֒ nB4KF nҥD>0~%e} ^m_9 D4%'H8KZ?} ˖kۍbRve1Z%ꑳdVWڈx.߷diْU|D4uQTz2;^5+oN]k[݁K;?!cix4}wۣ)#?^fǩ)4RA3h5 մ5ʃdlB6H62u?9aLqe^6\;ATebY-x[JdIBP ݬ/X`ԘBJ{g ei)΋y ` F؏9/X ؘb]B}4 N]zO ߅|5:Q_N<ͽ "a[At)0嬕ˬ-(3X:ƃ9h&P5qk'Ai%p Kґ(g"_GW|Q@"YO q!x2kaO{eq=~/e|a/NlThi%,P5' kkO1G@5(n)+EΡ](Ȝ Fi?, 0z" Aڠz&zR/8qM ieq܇4H9aS˨Q;)#<g}ЙӖ0{e9!I-zLa=XZSZvqR;9(lRsXG"tq(. |׋iU`>"}"Ƃ5 &jD?ZVjo^༽X/T~BaMeaTi^t=(Xq;{O7z4O!M,E"v ;6SBXv<#c 04ci'.6#b3s.D/yA6b%MZݴ:Z}h u@+GF9ph{n ?^Jf1 =/)P9#l=z">?AmB#e[m/ jn ;l~Cڡ0/;]/`)-?FpzXS(]KmF?b~K[(-z5cޜ:kAlKs'7Q>"}-*!{S> c|9ʕPޥBm j:tC(>|a:pFr1!>h'|FBOأXI6}v H)OZG9. 뽕=,p@zӛ*} j&a&N\8+Èk |iaӣ>`0[ 71~M5!|1#x >rmѼX`|=Ebm/S3L d͝t DkLǵ!zfÑ<K3x /~4A G.ۇKa>{q{C4E~}ϵ8xֆCϳ.lv4۲l? QRv,%jP~eۙW>_%׍pݪ|I[h ^H: {] !c4ņ*֮(u5л_;Я5ѭִ?bMMp? ?z-N~gw1 m^f4o~.qY[{ 5~(xowxp|~Qv8:5t'tF;k0wytӔ5(8>z>߶./+"mDiC[υ}>zAR@ P ,tƚUz~ pـ t 4QGA0Aog|  >Ϻd.䊳4z~~Ͼߋ3Z4(+&8tِ%V<+2?:8aw9 e3Y2Ozehq~.l {<>΋ >w~+FR-6jJ=y5SJx?>l:Ӕmv4cuys~.ΡslԾy<#[Ck~:M¾9znWݼ8u_.]rl>Ϡ~P(3 puX2HR)`=9>C0W qwZ{D9  f!^;r@`Q@@Y;aХc dqYw'Z,έ;?pE%}|Q4Jz;yTǰ7W:W{>fI_eW2%,W~ `_mMC жS L⼵u :k/= ]uP?Yo7h^.}m["_LDIu w\ep}o("Z³צ4FWUK>|_ t (FH(DO`+{g"Ҟ]<u{zm~wNNVPE!aD#M }`϶'MOĺVwޅTc~w4 U9Hgok.1I {ɧFT{ƣ:u={!)3coy7`܄>)wNO=:bE=RiMDkn~vSSĽ,=3Ҍ Jv{Ps`{1FkurZo%vcGl yF:spgQاxLM%O(dIڳh{h&7_$(3Z}n!ƷE'Q2f8=5Ͼ 31oa|V1!e^݆ a_`%jZxM`x>XN; O{Ng~Y;}-!9W# f/50ѯ+mVy*Cy.؛2_1MXvmrξ"pNyb=oh]x?m5azh%q0Reߏw%e|:{eoX-6~O/m#xj/NW3G62oo{56FCo9\/ukY!] ,KZ#؃LIC׉3vy)>s|6vZnϕws(u-TfnӠoJY'ĺHKfLA[*uJ&EЖ 6(IMmʫf}W6R_u8jx?-Լ7{JMzRB>[?E4d/Ir>ІBgsyzywXS~wo)+#6Hqw{_9<Ξ>7}=ΰ!iaEb#ꀎ=ˬ/%? o]lB=MXb7$'hx Wnn5E539եo_Bm~qu"c(bu,hmҖaF{^ޤ HwzHC^:g1y@SJ02!O}WX$|d} }x G8wx_㪏}s7 5-ܷ~!ڽnB@𘈱2 ui>yd2RH31 ~7I4Oz=L i"CCu<r<%E %Ҕ_eyB,s2VG' ϼL;lMc(= v%Hprbb4?m>{- ߆i1<߯GazKk0V [= :SC:u.chkNS_=?f#4i.RדQn2u%@O h'E%Kx#4mkue3>Ґ Нv3 AW]471 uM~t:guNh}g} J4mN=+Oc>}w¦xs>^2*ľw+1c9 SazòڻxS눦XgO;a-go@5Z*drRXWP~,l7dwl6o皃ho) \+QcJe۳!UyRϱè:'KXHIH/ַjZ/]>Bdz-9CdZ˩#C;1 s7_to ~o#b1y2r}TG}5&ގ8Lx؅T~ȺHs{ۇ;$]YnAz`OjN=Pƭ|a|{8B9%ГKen?nA |i}(57~&|fMgimfk@ !-eOѽ++aG?M#OAnLqpcOXa> TWr{= BhQf+E^sD_Vl} xH&Uixr^l(Q[oontf^v6|hnq:Ϸ|It*P3nɡiC=4ԜvX\fhBe?NPvO<}#rȨڶmg =@Ѝ. tc Ň ޴QC1cXeCcCYËAfjalANpg(߸Ch7sz) Ҿ3rYT=Hg܉}>A_J-|BLºP xJ¿' &dl{QR¼w7Lَw'ZnotM;y6:I3ŽEgm v9K7#M jo>܀5ˬo7:>]ȿ1igb ߥ 7#s^Y|StViO jcse'+^k(pij?3 rMD5֠9m.39/ujouveRCkkM%.ԏ5~To r/ ƥ_ oʐ& Y{ͫE.& ֡2Z$߀=z q<߷ȻtOxcmi3 cIIg_|}w#hŰ9D®zMo-}(m߳imퟵ)-S4t}WKJ&Awvz~E鰒Uef"|qvd_/˷w[ؤo w2 E|mCwX!kN{[us?kL:Oe!ƒFSo4-mzozFW) lԸIӨf1[Ķl:M|v|cRr]t#gZzzۯAgRVvΈrGq&N7ej~A7<|6`&3Lzv3Zl-K/Z`sf*yS)yǍ1tA׷ z-kΝ:;$ڷk&u-4jڤq4tMU[?L. #_ⰀA9}E"~ JaT}hPnl/JWNȇ{}Do ܉n='T|[P\eeݻQed#8l_R*{@J&`*Ɵg1A-)48~B~vV|bbAnAexfjGT˭nG몣ifQJRiV\u4KAYV׺΋cWks} *|ce SAЉ'P ?B>n n_?CL" M@&ޖXզMa&CYm+[P`m2|qcwnfwle(h$Q.]'zVa A_Ѧ~U֏% EFR O>R,C̤诈,'!QCve ǘ!߻{[UIGѷR}5GнcJҒPMF|"}-K)gehKj8h8\*eV5*35 Gc[39JUE؇BʁF+*+ *jD SZâ튒EE?Ju;&I#k۩;^DsRْHS Ⱦ2f QB!P%eNJyâ2e9RrXy( sPB(_|#E&Xӂ9$Ԕj`$H GF qƠHoKD?胶FJѶ R2%([[T,餍o 6FV!W۲ vSRƎS]䊵2~ec+ LBbM&"x.XAMs+ձ)*r٥H+-T~4,WM%D鳧o 8wNțÀVhy)$D",;#%`ͨ?r˟i /J{Y\RH* qs}E"e:;4@}`>Yo380 y->>U\gdy{yMR| Ť$FA3y_/.cnvevEpi$QD_0fWIƛR1_&MgOKA}9>1F #8!)7yB)vb(UN-)AU?Dr㕉b]@qIнx΍Y4Y.vQ50;B ^ cFO^9yհFZ7vvh]ih*]B`rמ׺9@պTK8uU LȨcbӣu|PۇF- =£}7Pjlͱ>`1 81Z;m/!zX'-yЄ(} X>[V4",jDL֪^UZA[.ŶwM{pjMo`ӬQvv6ͦ1IL#RkFK𭨿(EڮRP5Sdh1;&otR4USRդYHR?JP~bǨl,}۰\:Cݭ>P`P | 9{Rߢ( fۀSYqqVy)ϒw&&7zC}o‘* I*^:bZW $*# zNj/CURįuՠ }) ۇT_ % P9 2|G>$2pzxVjW3TOǩz%A_V EAO=j@!'o@So=1&LA%; f?LFPUB^B*P=K2C}<`0\ۖf$o|^J~a+upW_ nK_Ʌ3qWَE?ߌ} |Tؽd7 @㑃G6ֲԀQo`` ¨`"Hˈǃ,`w￳#D7s[Rɦ#!nx< y9׿%$@_Ƽ)Pٚ +@@{@bП1B+/Xz0f+GcNz(PwJ']7v4فв܀~cfzBO ݀ P4IUʟ9,DlA@o47WZBƕ`vM E5rd28 j0 5+8EKRyr"e65(4:H:rPxl:y{Ҙ(8szV2rȘ,2Q 6F.c' /%C?{~C д-+_L=8(vnxٞ;D-_L|^Z ӢũRJRyI|>-VKbjuqF&MbeX!s?`"̋X1Z2B&eXHҵDxd`_"B>;g;_<_#jRdI7ȯ>9DZR8Yr"^YOnCCF]+w6O$|rV Ό&#psb1D>V2r3,ĄĦcȋmH&G[_QV| [4 d!jHJ9&""mpF Rv|1q&;a(4[Jqֺ4x#0/$. r B~XsE%& HޙO~E"B.IfH%'ۗs}p}b(\&!A&(t>}-$l?3ȝ('OPP3=͞^~gV| 4y,0C^G_=yz2@ggi!AXC6x`7l]B/ۦc,#\S4dEY \e[he i!r.ϊŗ_$ |gO$.-oI|F8pE1{jk Qv()0>*/꼿 GQJog O!3XEMa]-x4[!e}>K/A F2W\^̢q!žkO2ÃL {qa{|>YE"(Z0X@SUVH+Na#-qa,,[PJ2t#O aDa)@[-mz:Paz]dԲ7C {?M_eU6!u~q" Ipm)+1_2 1Zaā! PsnF''Ԡ;#HciCN621K=1ܝxAtۮ_vxw#d'2T&6& v;vylvo׳Oɭ!P<2%/"&Gp=d&-͌߉r،Rh1zNX)@6oCىv-> ELPhݮ9(3B; $Sv̈ӗ"hgb3J*^S~l{0'eM$?pЈ،>L$Fqud~I_D4!*)ƁBTPN*;UxI1Ìr!JʑE) ;bZI ԑhڡcyRYYv Y ԨϏ$k;2_'+-vQia3ok>Lf^&sc朼1^/(1I NEQ27 Q"`Ft4VbY%a{Ypڨ.XlgO`wTTԿD"~ QiV o-Em}>֏5…W3 w FMVVdZzk͠n%JJs,A$_QA<6zDԩ؞'I9=KKsqa@W=^9 (-͑.@yqVޒV}CO?'Hf6WM&0)~+b4e ^E% f1\ H5zjEٝ%$#cƤ=t6V?p,ȼ^0Ul4E=.Dً 0_n2 ]S{h} 2׬}/v}GT~Ϣ¾Mæo-fSokq=rӸ}3PB 1Z(@]K(D6 nQw~JPa?QdmhGTmFIE &E_#>B>бv :ؼ6:<' 9iU0z0۝NrjN7-!Shx..eF/@h{8*cϐ!s]-咱.` \B3H!,xKV=G :ptPqG4=@86LGyɎFHSؕi9.Slnà',)C%>irUX-xeϲeׄ *KBDkӊQ}l =&4&L6n fs jdJ&\mQfƚ?O$MJ )R$=PMzv;/@LČ_ W̶!X ,/CͰʍ0,s-ѡA8G?8tT'"E|5b/oAyS8 L]a51x,\]R1R:۹a|u-j]$Z'Q #J!kԝy6[@yܺFt**,J R!+Ve]Ŵq W]sˊov9L5sjNͽcC[_~fVm|h.3eZ*֬S|}ӱLD@h ׼ĜwR-)@Ĵ'coIĴocIdCؐ.il0tѤ\!])]0 )?U;&gw67- ́EEd)&P-G )_HfrJb􎃢hY%dL2"k9%rCvF,BU,Vk 6{p/wzN՝z1z)jЧkFB=}#ӂ᫣`BVVTDEDeLf-œOEr~bD̂Qb 1 iW'(Pl/vڙU韟</)/oz1 {k\fD*3#tiN#]pSC!nICePHSWFDT+aLO28tEH ;pn- nbslgb/X"KX8jٷq^{6;Z10,zo;Av4o_3)~o=t_FEzWbƖvn¼ʮ:7`⠳Huu DmZQĦڨ-ҦK/odbtVs4Q4QJzwzvknxrtώZ]E.Im 3B c~vAXGߩ]XGp^֌Â/9zH:,H`A'+{ ]2+NW74 0gsoz]k_Go_3wwZ7-cV򗘿9;?tO\sb6 cgZ9eUU[F᡽Ij[V)4лѷ_Ւ;y/BI/>v}_1 =QVfh}hQ8F|si[ uǿZgĕpIKvVn?*ސ6b`-gwy2g.\ܘppgO̯=—k=xyeoΌNzlhHn2TS7:SR 5֖kmE_䥭 evN["WY+[&6gpzjkt(I2 tO}&é'|T|]_Ẏ},=eOnx`ɷϽ}E5YlQ}?/0ϟ#?_ě_}6C>D>;oa+HJQEAŰPFːs㾬CMnDLnVߡ6Vv% }CoJ[,74I!WʔjeҪ|&*sN$VGrŨ3QRn(  첥^lljᓱ5KNԷ& MU(ޅMԶI?0H࿯4_53P7D50hM^4Q} vwP'^^gU.v ( ^𿪀i<[A3]$qLQR܏pNB; FNrCQ&I=wwl.M7yK|E,?qe_ʒm18[8G6/rی},];s(h,,(&p< ZP.*IB&+i|.)F OI H '6n2m*)j Oɼμk;m{ F >6tu^MI#[Hc^imѽ ITV*X96vvX:{ľ'^O|VAf'hI%X賥g BB>+,@cb3q8?)GX `NuѨw_PU`fV!($Sv%7xRTFU$'%R b3DV% oX E 'dABe|g'T_yBr$ii/p+0E9YB:@`(h.Fi|i*3JPmo5W¡p  tlCu??p ե cwl Jfǟ^z}K'Nk^7qO$FdjSȱIAyfIbRx0[SY))B)2",x/UVf⿡Dh5eBW )[c4vYh- %sr3v_3CӹCb+?URYj46";26dlnAyxܛ)¨94thHS 85H|coZCCOY7tz~}Zsݣ@,t&C0( ~ZpRIN [W% Iϔ%]-dPưw!N |p q 5[:P; vTٔRp$Eg,T;Hd(SVqwy2#?ţH攬QVeZ&[Sk4itqQ5[q {6I124ڐI$8~.;bXQt3FM0׼y9'~&*]Ge} Q=揀Hr݀ >Gϻƃo|[OO헤'l r3ԷvUgǸ'^5v=m!yij; S'VN҃XeiQ T¦yg3XCF2PSSVU edd6[͖C}\᫰!WTR;nuLrŞr!V68ksDM@jU[ŭ  @8-]kCeq 7ԁ sW1A' Cyw hDa<]*Q3R(`]qyZ#IZ_K;78ZgH:{+ꔵ5Fk]>"yGԃzilzGf \CѬS.r3oٗqdfvvUioEZgeP9uu*?}H9BFq4yGi8%lBxwz뗱~&(+X\aq1+IA BVh4@gl)?HmA"uN?d9 ^e9:@͵gEQg-EߑUnti hH1;i~3oz/`ڪџ jٻئȐ= x $]=)/S DXi} &_,w! k}ճ72׳`>X zt+)yCǂg>A>=-~gm푂4Z(EI$f+X!R$ @V (fNq,x]ncgvxB!z5}TC!$ݐh-r#Pg/Faiꧭ nD{&뭓g 8Hkr}vZC3ZELIiw܈`bXxL$Wu,݁"CyOl@y<%jW`]Πge1Ga#nq hOflq; 4@y[ xrR ͡_84>G@dXJ &*M]~yXl}[l踴}h}uDγA~tC8}v(; "bTR-4G)I zL)&~ZDYJ2Gt*D.rW7??"g۷m3xcƏs.P^~O7G42d˒Sx6 Jd{T9@IIfN6,4J ߍ&[a2)lu9om)oOB>$RΗ)VXGbԅ 5h(Ln`j1|z!s}m*ȐDmMBz& ?96HAAQqHA9I? BA%IM3"qf ہLt8]t^s!9ٚ29?)9N $0 zRQ_m$[t^&5Z$Bnκu~=EMprb}E =?Gd! b e*a$(,9h .= tJ 1{(~=Q1D:@,1ch/jt8l`*a|v8Ϙ[_^lb7F$IfR|`=_s*xċxzyqT{x^yPN2MLc!Y9#7D(BFg Y,3K7p$,%tEnf0nFILZa:\ & f<_xҖ/ěK?77y^M/ϕQzXo+} uGwn6f $"–&[K fV؊rhd5mMEToUoղ0\W.8SNÑ`C4P(pyI}.֎vJZpU:vf.8okih)xŢU9)W$?Adn_} #֤ LmUem)3Evneԓ?>> hEljdLպ#,Sj̶ٙ5aonpA|AP5/5z){VٟlD@٢<+),P=gKqie!>L2P$y1:iLHhE~ ϮZ{B/{accF঳@ey-}y# #:"nhI+[hZ8OZWWn"Zrʘd)׭l62:iE=Id[weihkX w"9m@}tv+>&e똿^GҳO_z=k{ s-\r_1:m`ۻ[^(={75@f ]\MLJ_4EU+?MY d˓m xHc&=όV>NԵ^wY}tLDjR'ˋW.կ>k)tf !3q/kb($ olspJW=g!NԄ(]YDY^bmyy$By_<p(쯡HmK=w_~=]} ?{42Kݙ͜pQ2?t2c=?bGEjV|T]E]a.W2xDGUԊ\RAty4-!G gg0 nOg'WQw2/J̫ίfGzD#,qThȴ\-fЀNMs!"mN+Y,Ț82= `SwBŎ u%#)w*l sf?)_+&0L3"H|l3XoJo(D{I$Nj4IL)&=n>0gl޲6_8s㑯aXP~25kR鋻7;z1Ϯ Ȓ ^8s鯯n 紴[?uO04y[p-T.ee 2 $b6 -qK9UM.M|lD >!O$QzkC{ G))#Kv포I/%K1V]xBΊTg>/"0A7?Lf0ُu^sb` TD`$5B/n}'TB!Z ѡ% T0)u:SdG*[Oq4zJe)82a$C9x#aB rNΤصk$@ >{MǮvˡ =S~B9Mo'P"f]8p0;kL145*$|^69`B,e'xtA s}x'AƭY!E=_VsCDk8O"KbEmz5|--BL zVjR)uueOSJ( m"ܹOK؀ > dE>II .(]}S`Ю/fNc56v˲>{%5.2UeV7֏s+#pFJGLE53{}=z ʂoMKK " Z0^-Uc/mg|w4! toC貈VeP z#U WCT0О5=>ϫ-<+S0ѯQa[ T`f<5٪LXLXk>57ߜgw wg4Abh$le[ccSS33s*u6y9:$cga`K BG'!#+i?i+AALQ,^a@Y $V LEAO  @=K["bLi| Q"8J; MāD t Ehd:ac^WQ !ċ@UAl#6U)*Gj{9tFSlkYYpgMUDMAй#+~GV&[@ _295{tҫu|8Pz P7ӿ<0)ޘZrG\>IO" 2*G|umDnIaʢ㽫D~;)b؍`F@H f2DO&)s_28'm&Uw_ ua_.aiF-kNdSd|SH^b 0˄s"2 a篗ng+›[.mÑCx+ xW}peVV`$cm SGA *#E$3Xf?5D0FxE-{*"z1 RƜΑ,'r()9%I9i Y:r@!a% Ah٢"dKDBVeYIQIsD86x彀2 7( 5jB{qP^XGrXҙո@Ȋ+:QET-HN&~4`!qoeZl2.i%Plk}pЫtO6Ҍ`plЀ7ɎVsiSҪq"- ʶP 䤂$P[W3d#HR6n(J%T/[`C{sEa<e)t5 41'@jbZztG Wui3vʅm<_Pczz+: vG뽢:&~ ~Gߩ $|87͑ ؙpؚgcf2Ǎ)]+9ߤV45FS5ܜX.h &]Y{@iS :~;в,bA64-N/,'1t\@<.:9N QG`<ܤ\8Nk Ƹga0dp5;^#s8x<3SƏ! \hku6^-}:qNcՋ yRiߖA>G7 ^O֪nk&GپBSyuVqB(* E2dd9dhH=7~Ha4^AQs9)26D2ɹ?x\^tYΗTOl3Er5 cq9^'̈́e+r|;iY#BopN"&9߃t 5Y:3YǮ:n¹o Z_{ťo\w/: 1\l<| 5̝'\yB@SZGvX=7̶OuQt\9G^3 9C&v;e۫WxK5U[-z|hQ(b2az~~趪]#? sHmқvf;ٳطgcqI&fʑ$U+ꂕyClr8}[2Yr+egQ^EǬ$_ ˄>   G+aJ#].Rk! X 9B 28 ,^p7 8*01w8@bE. Giw!m psox7^| ْnDi?yؒF.zG)$[+tcI@12ohA^c͓*ǚ'R_$)cG)'Ow{GGFep)HY+ik?CZ^__:@fΎ#PRS(uy8zt<籹^3@Mu"+l_˗Q9Wm%2eBIBB4eQM0$**[ZEEr W*5ZԢ|(|sfN9̜39y?.h ';ˇ'>l6,scTQ]e'Q2! N{|dخ<0>500X蔙XJ\}ɲ9w},wb{䞙jB{E@ Wo[{Y,)W$2VaM+eȹ1HdHN"ՒJmlR&W g߂IUJt JJ3(*#y,p# ^,DІIU{٭SK!e6z (WRa"e` YE i!xpk xvP.7<ĤGisٞNssVqWwO!F7baKs$6θ(HqvGNhE#~n@}I߂DT CAdKJlI`c xmnC^ЫQ ;uܺ?sș-д1zzJi#o"6_suw]h^qv+KPY5_E ;&o#GiW=:C[@(2}VOn#x o܆fd="M"uY 9*ʎHPc4-J"XB!}v,P I/AW&(q{GbL<]GDPRrN8TQD_/][I0"%) nx*Q zXP#Uհu CFaZ d@zj"dYl7!}(?oŊB v@YS#**wƍ+.pwޡ~҅WOg_w4K('ޝϖ$_#JP)V4])(Pkj*/;Ҋu5j檎qU3JfT̩]SsXeT G쫌8lI9=KeL)4exŊJwR.!☗NI1F~ 4I3>(Ie`$sO=X.nh  A=DqR4EPՂBzJ8~% 8r[2l="Au^JtLB q0B*ki^c@Pac; zKXdhVe{9pߗ98ɋ/};7?N:हPuO uSݱսEg|~3Êw v3JS/swl]Bp iΈ˩Dd>`=kV>7.8aϰ4l0;BRU@s:档ȃ1вYЪ<Іy tnzhC+N JkdS= %Yy9$C|LǒE8E#x(֥6Tjj -q38n0xbKc +5B s AB3R:éu1gg! )MǐTNELF猹<l,sOR2G<;RPZLHHSXH#A;7rcfՖ}`eF`~'Dqe6LᎺ0=fp 7BoMDK(ٳH-E6>4wpK  x] x2qUo٬ʹnOL+o3XA>蚶'>IZr~4g{ GY| g}_NP|,Rȷ`~(|4<_M6*\Xճռ Tc cU~V)JXI#[o$d?Oٍv%a$_ȇ K›;a:L{ATa84뺊guyog“C?vfObwv K c8t/AD^Dƀ&!xY"!sQYqc%yvr^Ze bCT`rbD^w] |mf[);zvW}kw>P_(oֻ%LrYO$HVeE $%P[%.*yVhVlPZO8q@P2XFgLnӗ3ϤrdT04`\52"*)?$]bH'1[%-sRT ^LK6DJ4BIN&ъt) B^ /N]x͠… -a0"_xA* :uxjgU 6b8 $ 0ڭm~zjm+Vg^~hڴGoɝyҶ3ַo||(W0, YMN$oَ@Gdbd]b&:Ʀff7?g Ud Mxy&9Q/"Ǿ#5@+h\T!Fb  %5k6[b/пk8п )t;H}8nԖ.Ӝ= uϪh*;r,pp}.h;v찾݀sf@1{В*R4=54;aY'/9~mӃ%Yy˶+nݒO'ZmݻR}?]sAC0ietN_O/Y^P|$, Q\4>yޫcy_1X,٬v؛&~_{@> kN$?U1W2ۋJhKJf-#Tu}O?㪫ϿW=S1cv vkXOco< jl_YJa t.ХC'FN_&\"-,WJxTXSQCk>11rfY,e@X . t_Z˫g]e{,B~ɚ'귊[*V_K+]g%\%*0s "\%PwY:H"MT[EH .StDDlaH"8iND! ˏ:`W6 Ijg-*" jqs7CHkDD#/m@oo鰽Eb"DIwF]2֜U^(p펷c]jWUۀxѽ齝Q]J*Ȏka;'i!"/tc3YaE?DK:24r!!ѸLcZn02ҩ;&RTMq)r ( BE@lvp!qVI8Āz-61;/z%,0TQ[dxІ:H"1TaIoԣ_f͚ݻ}=Mypr?|dǓjH Q: ^;ESPLx1ٌ |A i^18,dAO! Px c!u"t::7Nх'VtɇB?B'PlEy BH -7 'qAirardXɅT\9L~b&J몢)?MߠXcvzݬ M9WQRlTui3 `U_e.IӦ=:}40mcg@.: "9眮28d0|!|xC O< {п^|VzIRʠ(^lª xjk4J;(kZ4M֡vpLh2T)IKC>q.j#;vkX} K0-|$}=(%DfVRTy\[+DvŒ*p ʅ܏I}{hX?)y K@LܡB.m\١cH5X>*PLnC=6z&3&X⢈"Fsv5 ruh@oBFr7Li"׾ܢ1:+c "rpíW  UR %aJT5^%i#ȓ&hqk /ƕ.DY)魠U' SY`9)L9~p'X)< 'L43B+CRcȒPy ޼ld ( 1Uh62HZFE* 8XRe Rg= %u9! vL!CE`Lr"KDYQD@w Ivp_Ag@RL y%|*Ki[څm. æػc{c]VF{Ehw/BbPĆValhƒ@%+sS)}~57\żGTO Ҥ 45#K lʄ`Ej.JDiH[,ژ+WW_CiO476PU,' 0 z$I&IFyѨtčc%kfD䵓ȹ䔇ןOMAGԾ 7>4D4E\hG(pNfHmHjA \v_5*F`!6^z*7F^2|8>u/U}2G/<*DkD2DT$S%R|%ɤ<]zj⽧/\|_e6=oenS ]F ˎZ?3Igּ0LWTό|zVzNٓy=AF׏[xozDny֌TW1#1_WUҒ,:R'Dm]]$В$6O]AFuD-$J8y]/N Ga#2tpx2;rÃ=Fp"]= _xuI U:/m4*NbMGS痍/! ^B"S5%.!bLBz`uǬ@s]]تjjji᭒" :B(iD㙮F.JiҞ8Zn6er0 >TVA9$So>܆? 1ޯ5[m c=3?9aΦ.ϖq `;{=k`ၻݺ%3π̖n˙/K:f~ƞ'3cG}wzN;ӐNBH-  IbK !BV3 KQ4oQ@0z8K7q{Nu' z?u:UTη:hXGX` ߞT?6m6Ջv לl~/B!Mz J2% ] 1}=9-|J"SIL#@<&lQ+ 5ό =DQl~2yt(͏gwQc&b^Tn&M4hbehvl|m/rܵ>ݷn7y7ɯ~miUS=x&l/ILb@g8Ml.0ڊu K`;ɗpyO_2q XIMh2 $hfw˳p,\:wVz13µJdAJe iy̿lF /pPk*Ae&[TZ%b05U~#gx0J4jU8qKj"*a=u7IT}M{Z@$ڻ]&7jmmRIJd!:hXZ0w߰3y 7֒r˼̟dM ˸d ˯L0#~ňǍ'Ox/׈766#nLx0#VdgFJM@8AO1F%m P[JIfJUcLXC@ HaG' H3(_Y NQQF Ix ?z3y GN V,q}F;˙?( y|> e~n)pIz .6aP"Nr%ḑO=2| .ro#9jKLge?/ `9S9ۋ<Ѿ<%v JFH'B4-z\$=&c,Hր]|\=T7+=^/iNS󨸞FF@?ggX[^WVAj͐ڇ#?W4ýHLz;FAH-\;B q}rD{iSQvMUVS $'KQh ɞte15u6Y \v_1Ï&|]g0SkYzEmM CYI~G=IZm  19"yJTHmi=j B!SDa $P_`XEq hP4P/bUpV8.Hd>-fKIIR[Fz()g6#Ia$E(\5Uf2ddQeOpc|x}#ڒZ+$6&;IhôhiM_<-42"ڇb(WbfkMt#MVAVݤxu4 o\̂jd^s^H{eOJQxmrfOm \q,j(%v dA)lY8˴+$i*P^G/ Sϒ D2/0%N\]pajiKz(!V 5s2ypշTq 0^9g/#uug|]=fFό55uP'^,?2"s.39X\`:%UF&FGVc=SL4![ MZ ؆/DARaf7?詈;ݩS⎌)so;rKƖI3aa/8tZwX-"KJ&Li- mbʠ59?cER^-- /эu(#tD87fIҥ׹>$ɀ#%7>{F-(m.۷N۳R~[^:nm{8XJ⊮ћ _ " F `-QoS0i-fwbߕ0<SO=KdClmě,!pY rTvO!nP="_[=!;!vHdJh/Ar憣]@h0 똾DG'3 g9YXn{9ijVV7jվ3{8a%NZ.2LVV4Rf0f K#gvJB$2/R.aA0m} 4aċGdiWO| _ownkԔ4ϱWޮ4æZQHXXZ 0Je[8x:`Zw@Qf4N!yQ0:`/@* :aCq1Qu%z&y%֣M,,e1BL4 4ax7 kk4d/-~tIYkkګ<>Yѹ0RYZIbݹ0'{ 5UAI$H%3"D<[F–BG`{.,6 a4sl6` ] U@=ZMH*n]lkZm$6iC StZF.ˆ*q;]iZ]ti:cșGHvThp%>:@{ruRէm0e8AR8/aVkUo9tO:&*Ov-:ϝKsm;Fؼ wt vkgn@Wܞ].`8ٌK`vaJa&_zf0P'i'hFN}XMN gu 8&3dHVIr^W-{2n`'^ z3kO_ n^ʫ@ʸ` =?_Ļܽg+{*72W,zWxIUL+,&2sTwѰ.ah!c@3W. (s9ER !chN2P6z2>fgVC^ ^X NXf+l1j3l5#tv:5PlW.I4Tܦw/4am%b-`Гs'7K1HP,#jVobR蘙|Z7Fw`{+6^/;vo|͏>vg#4][?ytn|0wX/yk+X]܅PiJj4`Q6i\yR@ȓ]b u[jm2D nvj5N{>Q_2 $tv܍x,]#~,/>vLNoo>|sϟpM3(RM\{WGyqϽoqtEأ^2:;,9ILl͗)Aok)qt!gr}b<{>V"Qlfz\M'q M: &}߁=ov[GS:cvua8hAM G ܚ 2 ҠAa\PQݣ+LIcw1NV.'7 uft 3ܒ#QàӛLNH !K!*d_{Mݑ.d9nY떑WLs{wU kȻt Kt1g϶L˨+O. \)6{XWw_S}U#ﹰWu)cF*ͦO)^0ΗװwApɵ?r-A' #[Pg o+TX]UPC C> 0q|8a&8f?r\ e`tV l8ɇLd Tu KS~iSi$lv; Vs-ïz$lc{|̫w1߾XȚ ǚ LWſ:H{({񦧖^yNH_{7Tu}˷^=O'K##Cͱq[raM.d+gyPnĄa2"ۣ.we"ZRtf(d":}?^~ː럳UMzH[*'m_57M4t윴Ws[]>13!_ &,=waYЪ]4P:Nk~FuNO'`$d/Cy9kѺ=D So[Eĸ-?2;F_=j_P̢Iĸ\n9r'/(']p4O /.DI 5Ļ>$ϸc1v=mhKlw|HQ \t B/Ȼ9FH&rⱋ0σ 3&H$ Й.viZIPvչ- ?+q{ -Y/(.voCM6ap>{8BM&3A s*=БP;&;̱+̸Q K3ea+g%͒#~GnfܐŃO1w4n# LlL4z_D.Kit2$~+?>|$jB&jneg[1޻?aNx`su JȔ4.<h(IGE#h~ṘO{[3ztc /ճ=N柰kiݹ\{;,o‡ZF,_x!Jv F% F>}`4KK5p#6q/};V,^HiN,7Qx 9B "d x.#XjBd%/]=)1"𵨢5{a]eelr]_Y CRDTstLM !aScLfu,l=0%[M ߚuZfq${̘5O7z[w6;}{&\zI+7ˣ( #*ZcjP!TФNN5^m$Em9+\w@os@r zN3':Q*}]"RF+lZI k\tu58PV#4\f^7K|C-Vr?&1o%\@+`8fb5銪jgog[=c5Ҝbp=FgKb̿*30 mPJP,f5{{zyu^zo5Lz xeš܂S})[PnHsc ]vVUU|T}>l7OS̹`];.7)gNg+Zy;7&SMn'G2T0Nc1^֥ZCkEHPChG.a]x]=IXߕ} B OďG,_y`AMK!%QI (Y6\% pQ*A-HxɇrBH! rB%HP9z3+I:ﲭGŷ&μF.'yqb.XV9+8IJ2ѶA Xt BJ 1rz ܄Mg.+[x0C EJHS4^CiX46-G2^unA*R݁QA2l=H&Dλ?w}xt<9ZGhQ}DZ33^{g+m}xa#+dHˉ>9ƜZ`|˜U6Ԇ$OsK[eOɽXp^O3(5&g !4`[T , $׾=ʌd`t&W0JP)A)ɠ3󌧞}yj8 brro^+A`Hш3!DL!! IXFᢩ6Eq.s H4e:=aC1I!5lg%s 9e@l<ۋMLb'1o<љ9 s.\cݍKvg=nJں=@@~`jdF6"xI!)ZL&N&un'M93.i-k{7&l'i4&M46=!l'Nͩrn=w^ )aC4H{S"թ0#dsgG }cfNSA L*[7V<13th9@ Ua)ǏB=u w%r#\5s[wMn5#w `_RÍP=jGg \k/VmV i3O{r"^zN'@.?b<6 UMˋh : U޲2LZuz# .#fmFZVkN q&)'vP͍o%~u{+uҫ gُYn*K©=b ># Rz ]FP6wUj?'<5 ֙u׋ !Qj7oYy{Ep\cY~?„U/tVj]T[)OV Q.Db/5LجךJ5 rW_rcֵNF7OG?:/mnRk7 ѫ>DX{[aC :{[i;Vͭ>D*+\ N谉^Q6Q2U⫪n,Zd[ێ//b M+TʕV؊xkۆPk{Prܼj> *]ڍț*;ں9Glڳ'p+pwt _Z.޻sjkO'nY!YrRNnXCtv}ǮMe%]5Um5EpF-%+-+Wm 2B4{%mj z>Ҡ7?SzZz݃EQ]9'\QqHSY\d).):ZGxk1-.Y fh<h@%gJPr2xs&Nrt(7Y2[ru T+,3b[qTKMgI=auΥZf[lqel]0Ed_'c|ijQQi_1E˛?uOHJ^|%\*h L_e>ַS'a;9f<}igs~^ߢaQଢ଼B9Do)12*7@G-VGإ@kVXrr `h1=xA:>-%E:]@@-%9 Uђ|GM+~"$}b?z.h-^  BgִsVI_b)iW'Gi11˕o:#:4YB@*Er/̸T0|N:< 7SN?Mgػ즾8GW=87K͆Ụ kVni3Lr^frQg)[s@f`mٌ+ <TnavW)lgrSђU|;j'Ov/YSm9s=YOq !O~,aJxL˵v=^qumhg@C&ׯgۦq웫W/9ֱ[GjU+סudu5:]ǽ7Pϙ(b 8-ڍX ==Pw-Dw)=)]]7=;gJ IP*G b}cAG΅)vܵY?rX[P{B_֜]GUjsZ8CyFkF|3HR{iykvjRٽ|SYwX^h+9p%*i~#-krUW|h襥dI]ɋ>eEir*..%]5^E>ہ5?ltƺk[ZS}32ںmo7~?re^w{OmpfpE{nOCOy_ғAO5>DN?phIHcLʤdϤLʤLʤLʤLʤLʤLʤ.IK̤x&eG9Թ;ڹl硝eiW㮝^/}%_ү|}|C>o]3n?#itBznbĭߘ,sjjh {6ٿimӯ B׆~53s< 9<tٲng1 5ͱX(?v4v[}b?{㣔ߎ8L{IIt(ZVe eZPe eZHk#c(22Mƭ'ZPe eڐgB:7Mӭք><ѵ"&[m=@nBڒ־m%iwe(KYfy]eE fUXqCپI(=HS2/ƹD1>~۔8aQkK9cG0U, QGس>!}͢X=?wYmHP3ƛ@~^i1,mI(cMB NyYd2zfx 1U:}z>X=P&I ̐^,D25*=cLx@"kc9݆6ǔuF{Ce?q,UTe lוp*R|da=?{>+"m(k:$ cda#RbZ}K:hEoפaU&h9 7lgn*gfiݪ^ Q>|A)!lޒ=n +8")+U2Da8PJu\/j /[,$fǙGu5`AL.{?mH\`>gZxmfqpsSW|ԕl9eq8Ͽǣq0rG68v@nVK[=PrP %UbHBO: qyxq=DbAZʁ6 u hoZ/г-B f>-X%{ a2 -)1_lZL?:ja#M&CX"LR,4c~oÓh'=`XtS/n}XC>1.mmiHIh4&"]$ߜ; QV,&"?&M Q@&1 BH鋋Q)6L$b >L}")uH OD+),MY C ,UH84'Vkdߥ5Vv53&nM XvD:R i,Rp( ,F'C!D@\(j@bf6SR(Q>99s0|An0B j8p*U'TO%Ѷ:)l NR Gbu,W-/Q܋ag16a?SZO2D&W Cel0 21n@^1 1=)_llfVQ.FaD(>M8V0|xF@ğA 2Ռ"k!e:y5 Hl>pvl01Ŋͦ^!NeٌWLPA"fMSB@I0(>X'B%J:0<. ΫƥE#חfh' W^84qxkH lwu;*l;0==&nsmst<2o"n~X|\0w@dV.ctBֱxS8x]]}88rn`v{< t{ DvȈC>=_ǵ+u;p4slsʢ>&v;[kxH@̌YX񦺎6q 1@z< = s;e. jqG 9tv:y%gq2G piIR7<,zzממ.?/oho瞹瞹瞹~lN{{ٽ5hE'\iOBV&l6µZ`ctyOv[`8!g-Q峚'zI\7 Gl&lb!%&M>_"muΜa:儻P&'<_t %&O}  !tRz@ MM@, -Y f5f#|f[ځޠ&TԀ\MhfhfG5@ivS:IW3 C\ QeIh@컲}Zᴛ#ZN{?o_Ӿ r@JX,s.U]kz@I@߫1H;_ֽ #om@u {<^OTտoN'PPLxCa;#@_r{pyj,6θ¸*&(0vi1?1 +CWC?Bɛ&P`o2eΤ1탒P1t |g|Pa3|7o!V)x#ApjQ-ଽX h}Z?\'QuypJ{0Wk}L{ wo(G@tup п~ KZd(TIC1CYs endstream endobj 235 0 obj [ 0[ 750] 3[ 278 278 355 556] 9[ 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556] 36[ 667 667 722 722 667 611 778 722 278] 46[ 667 556 833 722 778 667] 53[ 722 667 611 722 667 944 667 667 611 278] 64[ 278] 66[ 556] 68[ 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334] 138[ 737 737] 179[ 333 333] 182[ 222] ] endobj 236 0 obj [ 278 278 355 556 0 0 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 0 667 667 722 722 667 611 778 722 278 0 667 556 833 722 778 667 0 722 667 611 722 667 944 667 667 611 278 0 278 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737 0 0 0 0 737] endobj 237 0 obj [ 278 0 0 0 0 0 722 0 333 333 389 0 278 333 278 278 556 556 556 556 556 0 556 0 556 0 333 0 0 0 0 0 0 722 722 722 722 667 611 0 0 278 0 0 611 833 722 778 667 0 722 667 611 722 667 944 667 667 0 333 0 333 0 556 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737] endobj 238 0 obj <> stream x| xU{9I !%!! !D @@I aT[TR@,+R$ 5V[DE ʒs愛l=|ww杙wfY%ćFecƧ{1**=<⹽Dk.xQ8t]njDw7f _=ufIQ#3zq*3v׉nsδvXGT7(~]E K#W箒yEjCX*%Ҥ.+3wم>D|!/TyqF4kJ\.⿭'gz2]/uj Mn:"75ȿVVԝTR@S(|#QXU}_9@Nr97:{ hJkSifh iͬm3*C`GiK~;Z}J2S Mt&#n6v.E}Lg^B<`+$ tv )'0 BYǝy~V x7 |VPϣ[c<4V0QZ4_y@R\)op`QWF,F`aT¿f+9R#4AMF$z4 \u8 -+a. S{:(i(ڥh|?(A }(f̯@c ;P!m~Gڋ<"Ѯ{X>m~#H[rF2Pfn+OCcE߁6}xxe!LB䵃Tey ְ@?N>X+tuuyPxݪ 嘹 H&KtBZn<^YXgl*tz׹S~qg eD-C1UÄLգYlºDŽ~uMc$ 1Bס6ۢCgzZGc4Z}F;]E֕Ƹj3r x7  m'(mzTu8;NrrT 4+)?dž;P>ppZ ȋvJ@x~wW#:Zzx4F|AGQ# %HYgxuFb$>C7X0G+5!ztzz~zHym]-(k]y99^ԏ y0M3 rٯV0Fg77s1|]|mѹaM2OZ뢽:i6(_yb >;h*}UwhODNwji5dQ_µ4Dmǜ"~vhZ-Ns xPMB<3P[qy#chFOF[p GHL]7a~ %=4[:X.-s?ey:/qa鬣MKDXt9XGPaOAǟ{BZpV̦pv6y>ukbPEH2'!c sI=J7gF0 Lm3>J fW<_cmt9 ֦~()T kJ?cDԯiX:HuoJ*VM#'sVD4Y# 7x([_w :҉27G0(MAje'ՃnyY9WOԓH?vHhXe%*ckhcɖ|VŎe@6ii h2QI֋F5U/`(g8p9W vwQ?9=qHzj 7>zKlry ;;/9H;Ԧdݯu40J?*ڿ a8@;ju(ў[' Dx@AWzs)?[lieh!=zecIWʽr')Kˁ,ǯس3R#hPgemh} 81q'fk>Zü_^/`3PT 60̞K&`ltV/c @]=>ت`&$+D`)y@t+\7*ITK`ޣ ysO`[f%v XB08`~zX˂5͞[cXFkYçKƧHt`?MZ~5O:o#h01 /^iMs?a\'^+=˞x0~,0Njs̏j8ƛ0 Ӧ Hg`5\"vSX!@aT0vX͗(hJsä́(w55(V\ ;ݵlkQ!`.P kw '0/YKzH3Y-јcOq>8NB9ƣ;KPns}Xzgw -S4cy\ (Me|qԇr:ֺeta(;qv" tk%ꆮ-mjٖ[r/ahF2~y^>q`^] 6k<׊9wU;_|Cm a!`xIb?W/u}?GÖ7N\Y̭lsX5jZA *Csi~;/k^3c&3`wA \[hUza{[at&Q3IƛQte7}w֝.vn2C^V&'W)I9GZm1.R'#oiYB)b>@{zH']Jr콻~ zPR>i:Lq%߷&~+hvT}#ʐak_73=4OԖ. .tkn_ g[(EYd̘d{pw%FM%v 7UW|?!2rBcfyF,$?Fg:зs#|voltJq&nWhzc/`~oZUh1'}`b$Il?$j7aZ'͗{, ,WIXVȶ{p`{A!4%l)}8{B%G[+ތ8torwJc4Vk7/~3΃AhG)Vqa9πZTПb~l1z/DE$` Ҝ 7{iUZ߱zP•7!꩜Ap !i㸡"]reJjtg \ጌ e,9ЅL79NS cO[z~#h5[w=שs-I#HCS'?:'Q[ ~>G<7ǂ*;~+Nށ1l;(Ӱ%Ir.*g]x]8LC*zs&^6-i K 7We=aH`l[2ooO]뾨Mո#Tn4)w0Mܗi'W؆yhn(GntD1R\'X.P<Fx(P{K`'3W>/rخ.U<'!8wVpN;Ɗs<]41 <85/[YѰ lď))֜%LxbR)9HPoɡjZ{xmsb+!Gᵏ߭!]zS/m@Sv!G`|_?셃n}Ehدy}wS9(œ}ž@9ܷ'ĦS,ubtm qRta;rR:n.wr?-b7$I.Uu5ƥ?}ܤ^Š\IFǤ&!3҅N\>g |_U-~sXy MV!2|kS@#_=i M)4Uӕc e;Ǵ. ]`s=muQ(%[ޗgaS9= =@ki`|q߂>tFִ#Y;$ZwB\s_:HհoF.m/&Q_p%x,2="eP jlY!7,e1D; i@o{8 | Y&p9?jN2ڠ򊶳mnOI6 @D`ﱢ#h2Ieys?*ؠY.9휃4Q/ԡբn2m~&dg@?6/ hSdauuV*ިDs+(ơXxNξ `slvn o =byG=KU#.E^ ׬^ZG5K.} ]<`XtHI~'dz ZBC+׈9񖳘PǮc@-A۲ҾK7g0K;Opދyk-no t6::PͺA=ǩ멘FHUGTw˝JԕsCvRIs@H]'ԟF$,JISutW>ֽ Og3ϳCX[K<#:QNVpy!U㢯~}[fgN! \7Mh9źCa/MAԬy qj&4,-ER4tLHS.][Jj={ӷ_ &/ aY7q[iM/8imMjck;47;dۧWiSS%'uҹM ;ybcڷhڦu+wH͛ ݩ2 =B?|x2PP (qP$4NE)VJoCJ3&'y2==Վc^9,ZG jnw\<3y|BO/kanO$ fpƗqmf= Z@(_TL_d0&dg+HN92OQP_HW2D1>=gb<6ܳ'|Evm^_\49ߧpaE3F<-/_Ռς^%!< E@#Ai>(5ZY+;<3(DDh}qQQ޽f-Eezs|C Jz"$'qvOhQ'\"9FkhYK? L@xԩ/i} p#|A>g;SAqH ;YOT ׵KV#}  JRGhۢ)h8^ llJt-)ScDŽrL^M~Qa>Wbwx̙}DX#Ǐ;1ߓY^(vdN#߷!N|m2hEhUB)'7$fO~sPb O]8,&Oc6\\fRwmH*9˃ea*/ϊdUeS=ss奙vVGV3 X6vױlnLr+Q8`OGŬ r {<졑yzD&ZDsдj s[%XԧUkVN!eY;.ĸ9f)l*qǓFFN:1VLv O V}^ tw>,^rT*y]UF4o5hPA+û5kC'?Vv@݉wVr*4A{ hJwA+]V@x x!N `]ZEF!hY/>L@Ϣ.e j?#gO7P8i>L@k+ⶒnUtǺӃ-)X侾-fCUH4o[};'P+:jٮR|derwф#[~9^A |: pUm9W|WUlBr%0cŠ1@B q!H>D ΈNW) tͯli3S48CIB0bUjTz^˪|*ai/"UR yI FTH[\A5s,сV[dtw%2Jof(q Rc}N}@7W%ٯ>&r(~ZZLIR#֧BJFj'Jp= rZ9z=U{꣈yiRETKf DjƽM@hTUPK,u,y˴!/ssWW6"m~JRUD43VB]_RZ]pvhnjLeX/=~VXlPp#))Gwg%}ۢfrʻLk)'Sz .EٯJ`8T^Š{A{{=Z*[seW+HGlti W`*v}E ẒAYk苒`W~|RUْEUL^ԙ<_I/;%򼲓twebBW%v ُʳʼӃsHTA1>ؽje77ݦ&&nS= dO6O[Y )WY>Q=Xp>p>pG8*G8*Q%KҾv$mi6tKKm)]R`Z0BQ T@7pTAPJR Hݷq#yNJ|HnsD (9(KC 2Z6 tʤQI@Lz;j3m..C&]&Li2J+]`̀r -Pxtd%()YT'mvJ%atT"bE)Q+Sʹ`Z:^wP@2B-;[ "R;#p.ޙJ\i= 7(Ji {XJ:%Z># SPvAirR(PBɂr}>A(PҠĆ:߰!.Ց]d_GuZl=r١/  ;" < ;*mj1Zm 4ԡ ֹ0P1YOeFFIyke"j'@vC O{D; ŀStU;8иRTy{h;{f g6iyCCd C mV-zL[]ҮYpCF;DV%+̱q?aG_Ģg5V Fq@^ގ,vkFU 5rh%zoȁ[#R[vȨBDxI5i8TYf˼Fcn8_lx_-_{,UKpB55%IfV7µ (5R1]&b>? HPW!H**, o9|Ҏ|3}&K;ӳx38F!]ÛV#t£fŨ ]_ښ:T{]iG~E.7->S>sV~ 6aS^]/ v@_XEJFoXCX'ϯ-+.OB7J56k Ÿ!z| +`?P2:=x(B(42ڀh|Wt_Dg,Eը }C vWa>#Q2=zFMDwAUF_G^U,FgGoH)GO_jDϠ aPFc}C"[IHt3ZC;л؉' m<݀Ÿleh:ڏކwζ ӍP諐*>_ "wF0:t7z@P=a??!,~؉h,HN@Vt}@_q@#4|-ߋ/7[%2dQo! ANwGȣ0A>'_@i mOvE?_3; <6ձi, +S(\. ۅWb8G\ VFn cntve@2ӀݰDE ^r<Z<_]x ~oO`0"ARI,DV5A %}y2͠A:tz3a1]NWd;=AO>Xd6elv+i#|(΋Db8_.~%R4QZ+},}//88ŧ:8 l >>aAXzЊQ.q>D<,?)꬝]Vme/x&mf]k$pM*E8x[ѣF=e\WU"4aXi;oO_^ }c`XЗ9t S`(XY`eFAV>z$AR8-CB݀*'?ѡaeh;^2-v,\', ;0*YFoяX!-MB-;^50E] '@n;q zbaFa|j4Z ލ;ڹ08\COjOC_&_C.T)׏h*#m,k5#;QNs3AC  1&D (\oFf"AIWaM.6Ը 5-dOg0H7 HBU 6D$0"UbFY BRp;h?S`ﯨTC5 ͑Ȃ 2.tO{ YG`$l)n2YHTݣ @irH RDu[<^D9 "vG!zT a= ˝i_?ӄpEc{}LSa`/TQk|+cVc \R^aÂq-YFNc{m܃= vELn-FhrF8ca Z&aEDŢE%fL-L췫jHjMW_3=]dCuh.p_$}rp-lNiItYo-ƅyYXkZsMbP&¿  xOZ04gjLF a}X1#ap\"LS'X^ՏknUUe[>mEht5zhs\s5%Jm</Qڶ)wוm+vMhYNWMi$^6$z 'ZQ0\;|3=rCGI8{9(4ƜnQR<)$%l:pfR!=RGq3H+qvRVI+(1l{멗556̓,kg.waQuWh6Ϳ-߾4J+)Jgzᚤwm6-q/&~#IjC ''4 1QnaݶFl6 㵄śЖ"p 2k˶[{` .{ mE۩[3AWoR܋<@6BS\ T 'deJO*u](2ABDY.]xUIֆ㮷߼#whF?eëݼjۓ^0g[W\q8U󿚍lK귕+V5hh*ٰ\,٦۶޴)*$A$dl]%D XSzldwE 7ց K[!WqVk t+vH7dnb jio*hAAp v`<~j^㴱gϜG32`X@2Sq d#[Z5F6a\܎q{zGlIBھ̵AtN{Ti)-ަ姑4u%P u k,0K\KY՛uz2| `+fx`X@i9ĉ&x:ytmh8{W8_yj L<5rq#^sfc_z,YCDض@iEY&8xV§§k/I\ek-A#cѕ֛l\5m=~6h[vې { J^pO=kFF=GAg<.P^]&q.wтԕ5 4+sHNyH9mtΟNW*Ku8[Kz]a]MEAp>̋)F`_pMffҐp2K>ч'\ˆ|'Q7q fz6N]qnM{j泟|[r={'Mv3##uǒw+R"㟷qD0^tͤxgꊦe%$1h!X}!VAdLi=D H`uoss"+*ּzV$մ[kMFQ$u~|hQxJ+#{kIFwĵF}>u %^=4ϋ5kv1%-IseZR])HڙD3ҳ ?1 #@\)&'{'hCK\@ԝM̛ oe<ٟWꕘGp]Ρ/_@g1gb*$EWvʓxdu4B 6뢬_]cZ rAq w4l KKd2#m$\k2᧖\a7l8sZsŐw`gk^BM3>bΡfL؛Ƌ2!߸U'T]Yµx'{k][[cTRr9]-Br K RrrBr`K)G$lTޡoX*;GiA"wL^4==qz(fFvosƷ6p( t  }xM*&'s5湄䒔5) AspX&8'{LY +Ӱ?| (؉(A>fa2 DΈh=J|f5shw_l#fTTT?jНx8=wήثSرc85OL-h>R$gNMN0BY=eA$P2NElm6$1O0#32WJ} OV/Ԋ `|6)mkhܯP%2e:WQo)/Wp,9T89FADm=yK:оC}~pc "-XW˫W(bLv8r9ޜA8t6Yfnc܋{߲i~GSE?6]k2kn╚x17H\|o9Bw0<7YszD-t `ddT%&!A& + 3iE2aQD{= 27p}n, d-~X"v:UU2pVȪȊ*w}zP%I9GAtҜ{ V|ZU0Nq`iXDAיzGv¨_.Ѓ*gB#x?9p(~薎 Vc Ѝ@i:؉ZĽaD٘W;#W"q(_p>8,0, 'DC!1]ꩫ6O_? WLbGvmwzsWo^^¼zR~+FŶ2[=}rJZymcgCX#RI(xb0 VV)lpn>,lU69^sք9ۅvf4C}T'0,~Sxp ;3;LSiw9rGeYK^ZQU]GOTjZSz,Ș?ٟv  X*P2]g(U d*;%5ty}tہ{w.45Uեڣ}zY>ztZFAмbOFQ4PsZ>~prJmH2/_ɣmF :${m7V8ޖ͑/d%ja<‘ 2[k0<{]MբZ|/u ״Z9@CˆޱX:^ 8YoL<.?K.CK0gRՙgɮ@%2>bZFMAЎu`j[׭IA~r孓+A{޸AEk=t+ff&]#]Lmyuu6SRvV}r' 3 EY^'*JR5KRt$%#J~H e^Jn}N֌;psOgeg1Jb6g:e(Z@Oӧ\^ *ܩDADDIT8{9W4UE JܒD7(5){9f;]a WÇ$FA6HA?R~3Ts”L4D˪@{WuPi<և<'_3EaqM+Yu(!rΆðH*WI ffCd9m-oS ҜVq/cdf")"q1\Vkl/JWxF%w_IwSVZMȧ(!)b?e_w!8UJPP8gU5" qB6!U̯Ȧ"=E>$x/Fn׽!^Ce@ 3@3{I!\w;8Je9 7J="K DE#QT5OCX,'+$ py#1#$U R!^Ay:QQPPpZ%B\K`hȲ G?SepMsb9&93z褦Sq&#H>Cvxf! 0IZ2S9IXIdKzL#w([ЃVnUzPy=J!JQRȢܝABn S5n>C&?Z #?@ɯ7 cWVŠ31(v'Dq0m0 xMt-G i/ЭL*nR(Q)Q3AK_~xzzT3b}RBqȣ0D6ͼ,,O5X4%Q]jmAÇ2~nLΆ78S=c/2+BK8V a9y#d^#X {+T "LQO4A4(!H"VuG":[B ѐ_NQAbC|9`ԋ:=<&2%BʆB*Ymf[s.1,v|F&ۂk= z-A_/fZ8W_|Q#ôb=="SKdFSyWig. .B"aesbz>p2^|>"<: f](#bTe*.Ġ"U2jhFeZaNp,>%~j?2{옉 )砡 i˟VDPg>df_S[Yj৬aARSe=><@KjF%0bMY!Z8~zpI~d3-4ړUiJ0IADTnet @:/EWQ-6N(,<мg5q-'tXR:@k!5. ?##خѾrum^I _K㿎5mlIů^OJv(2ʼܫweuYֲL$uvlF oCaIPm`T2DRv&NL F՝a)bLlUWͪ ؊η.Zl,VjC ~/ s[\f5_E)Ďlw<7a IRUx)?/=Dу&|< m??zZV ^"W93v7״z?Ulka[ES`8\X&D32M@v:k/pnwt eD ($k x>S^v8@XmbYdq;̒(ʇjd؛/j͞I<7-t%PxeaUS4QewoO6ΰ1˻jFv?r9ʋs/C蒊?wqh]nY=ai| XW5ruDYDb{}Nq6qP (`F/UǜڇoZ /~-vl^fVo3 `'o$&@EEK:FպF(J[p x{=ɖ- Su5N+֤5JPs~ي)媖@1}nsFңV[Zn9@jGf,Ga3/h)hcWB ȗ)P) 6D#!2SUs+Dw % Pg/g~^|ϖ2|4㖽^-^,|_͛RYjcÉ(s+x1R:{+Bv!Ž7Yx퍩1˜odmO.RP L|u}O>d!zڎP-HE"wH8W9;9 nf=FXAeWIQңř2wř{8P$}^3l^t‹A5Ky<;?*$okF ĺBSΘ鎧OѮ>#bμ*t:o݇G_ݰamimsǔe}D4N^%%KoJH\*n*hX09ӴXq|tϳpΥ!G~ I~hH4׺un>%פ,`yXR#x3>%d 6~%l#۹Va(&i/ 4qE,5fL hj(%u({)<{,;Zfc*ʚ>-vz82_B6BDp8pAA2%IS_DKzqn\I2k/äL"V ;Gq*^H4SEˤ`"Q+V֝|)k u!4MK(y)?,3]9uƕz*umSe㣗h)v$5s7}OΞ3gxOGMkq<I$ scvw -G`fhs 6W*FIc6`t_mTmt|5M=Tt rc y!$t$k/Y;4 [(…O/ӼfQD۟x͏h\Vlg>Kt\+%uue~YsHǹc{WT&qFd*~:D"xjPk#ös=Hڇh >θ[+YrN_7E7pCp&w~75O'?]fV}$7veZ֝ 7war!rJ.,g}ۆf'(hD:5sӞSK-ɓZJU.W=sm@߼3`}]uګm3N6}zg磔\} d"#zg` nVG;%0b'x6*Ol>ON2mP{HS !(~Mrkgmb&y1ߨLfcŅxq*YVvu˜SBq\Cug沛{הo>T\օ6<\da?cO/(Ч@zXs\"0Syy*aJ0*c1"[t ߘ| 5wLմ|(kFY5 ȏI(ǥnMťR9BnX֣3L#kqSlQLϏ[yuoo&NUg5L^!}Cr`o~ԯWd6KkeP!C94Λ 9I,Nk Ot/|]W0ݯժ>ݫRU*L^`#T2UwJo -$ѯN~aU/SZPzM}kނ)MkkCK|dˢ W>6Ŗ A/`}^r{߅=(J,:vg[9g@zM=ύMU 6w{vxv{VO^ϛ8?(3$!m:97q:\lMX0(>Fz<Ļ=I3qU?p$H":!"?S@+ >j ~$kx6c_T,~r1+ڄхft RT ·~*({PEFDzA&fij(ʪؐpUE>"ьp *%La*)H AxFtZ] #E$ϥZZ;E+2O9zy)YkBWXrWDj5BXTӝ_6N4s;]+iV@t 1^mߡӾ}ÇBkL%`Dc`LUtD #+3<N 3>\H\HHSUMqGBekI$~ 7aaB8")2QL8`JI.)u$S](52Dn0YZ,'˸ryYOq:CC.5591ߑSi|JJ)JTAφ4DgiyT}l_" azJ q菤zFΰ\6#$-!Eg9EjjTt ֬T+гC;/,{es`p/}|ޕETx-B+8Q_0cI(~n$J XM(ӂTBB!c d2ʳIV\//G+&.D5$HU^n$t:y'9@^OI?LWufBgr+ˆg͍,Gu8&;/P}e%yk>{*VOq mvTc5^U :aYx;-Oig6?/Hw)?gCH 2Uf15tIgR*XZyEtVUڸ]+hm0v~N`Rhqz͘I.YusRi=#4{F8\fı牦xf cqy&@d\]nxF>cMz 6h}%D & 6E&W.r9L.˵g@ S2;9nB4fCőlf:H0̀2}3009f_Qʸ͠: 4?!oc$" >t46óJkxdD-)aӣJ&1-kyZ2.hz-[X:%Oz c!hQL]3mt~yzy5tN@N(g+{qN u㜳FÒ9EL{\ȬE3s6ҝ{ nA|&$!dhC4\4XF}u!*h@8 3AbМ\-n(5 kUlh4"}AWӲ;*"sLaug_T_hܞ˝-&F:C59۝s@Ѫ06/a^,1_thOQq$jFc_Z eXvnu#-| o{v~i9Y1|DWF|m>'e .*X&ďq`/D)`@̿c`9SZR vG;61'5JlXyCkT;6R%qh,U%8 k*Ž"<~~oHʯ>'ȿ3rt j7E}h=O< EGx"a=7>Cy !gG㹈]zNoVSC*Qou5xYQm:.ڋr$0[jyt ,E*u2*N?kܬ;lIL۳sfS5z|Üv7ovm, #F0mj^QWJ<ъ֤(f9C~29꼸?UbB0ͽÞl~~ChM%'&iYJR׎f椑 ɓ_S^'vWUr׮ϛ&WWtc=Yv|Ϣa+ElG#SRVNoV|{J۟>}W;*O P|} X[׫].mHKYPƯL{0α Bx} 8?fʆхyl,h[-b̑e9Ǹjqyɉ_'?ZF`C ɋU)>Z y.S [* iUItd.eѡ%fy:vNv|UmFy7%ħ4%:jŒ\%>m{+Arh (֥V+?Oiqz~$i)B_Rąw,q1I?KN^> 3GbJ yE˕RºJI\b(nwA%Dt OO.t9[J_cerBiV( 0V$`*p +(B dK2UM݆h0 XG?QBnnoT]B,q'9_> oL QɉK `ԯEo!deXRMuvغG ~RtpECj{'-ln-2|"3[׶6wvlh)*kBB$ `O.q0 U)RN_-Ao,+!Fslp3},翁w̷ 14s].y ג!w8lybah)٤(O *)AD@PTІ@PAt82&> ď*'uV揙2'19:ݸ:DʂscצgMyY(ʱW )klGՖH~CWTi_3LfPL>p\:Ԟ;YX&Ҋ.{N% *8d 3PFЈef@adg$L?@م纱k .4u/^!{gNF& #c c%'6n,(s2b䭧6y.k|jNwM>Qg^H5ZlpY8AY d83ZL GXH%i&)T#32,ԌN&٩aX)GPVw}sTh%^QSet&*sgW{XvD5F₱:V%}9?( }z(^VKSiQ.punu7 c EIO3:V*' <.TWgVdB~ݼ߶ib`iGA3\+&„"ļTs8PG{Bd5< Q7 3W%h[ NA n-JB%\ SRRtg"ZBsc'U]ύZRłj,ʱh:̷VJqtRʄp`"&l-r,J+KM@B/bFG3 Al-4j`;+SjUl/{N(JO E.&~]` '[+H9 e>v8ƲP"x( ޿3#DDaX3XswgF?a?Omq\$MnRil6 f T?KtZP#1TRTjJ7ֶ߾ c.]^:rWht9{ӎ{mee'wnPRp~Օl4H05X$ehdv[ UѨtIYJ%mKkvՙޡ\i畽c FTLqdk G>T ٪Ȃ:˔N`Oٵ#o \fF٨7J7G`AFadlFs^RPPa[fHxPphbUAx ZDz3v˳ ^:) zh[65n[^-ӏ&FۇXө+$"VV[\^)%B,D;]~/ yn>-^ŝ`'#^srV.7U!w2Y쯒Am *>FGbJ{GF{ @߰xG:wQ1)Bم !P-K8Qdz;ҐyRݾ]y0~lK%>d҉ '${+7u4mAɬ ̝CtF=BRqxڄҟU==tp22+IO37?b^+MAZN7g2z?tE" EHN5|A}UqA-cYzwcêY֢)]M~dN}ϐ&cA-w2G?}Bg9#A}@8]D5*BP RT6+JeR-'C.B3+BB( `][`ev+CHZ% Q C0|]k_yY0m$({7kbܜ9Lun+3OOA"|7nrYFugڛZKXt+*AuHG:Ilz'( /L~oðć y/ŢZVpŐ/O.K1.:U!l>PJIFX2>q|2hj4 V@jx9%Y9{{3Vh> :#V 1{yR.J9i*UΨN7|JbdS%HvQZ @$kkebx9\k%*pGkp[Bt<9#gO-N}~J6*nG${949E6I~y3}+PV4sg aע9cX!NxB. 3AVW| Qgb>d9UT[e|8ɒJKA5ǭ̨!nmTX6V QbY3;]#Y,ݸZHJ(UUQgD'w@N6v ܰwUqiUM~m&MӮݴzBG[ܼ|NKt"܊ e‘ߒ2F`&ɑ,m#NETvIuzzf:!#톩F3blo9n]mv+{ bwD+ss˻蘝ߖkӂW]cg ׼gn//_WAɧj(-q}{óe5eo )|r Cזw o `G^~ME9g . > )C/bn -̅"Y<pB,%/X*4/9+yo2|UꭞX}iЪMMf[ͅKT+RpMڛj>p7up\W``~E!43~Wt`Ct\1M'TK6in1-Av򼘖B 1-C#G!w1@7KbZe%wfaiHb~DLĚ(T`~SLHi %HmJLKڂŴ #Gv1@Ȉ ތY:i: i t,:i).u,2: iA1 rr]fjZ#2d ByW8%h$ ;Q͌UBѴw4=ݳl'&qRuNq5A=11>5N;>x<1Qo$羬18S|CcG&:]B}m$o5&WNCޘbS#";91Tm,_՘Wrj5FN3ee=OhLz'ĕ5OD2KBsbE[ظ Wt}lmH_b,~jTX{vC;%h߇>HuM&pcЎz(k:/ d%우C:⪖}Zmh>ØПs! PLǨ:RVmrjAs=Cb$|.s{,a=$-JQ(+GfpL,XREFaOT[$rtU=%/Y]HcþCf#9㑎CR`edc:ܻa eisMJxuTu;qvO\PS}(U-70ǒW>s8y "'XoZﲝ{6[M ja>&3TxzZa{Tqœ&چZʮ1s0sgkë'\9F3գ+^/ѕ֧ǵ[XGEZ?ץH P$*{ǫgN. #UgUZ=w"6f$iY]33Gtny%<%Z;exUvp%Nq^ yG&Wy߲9&]Hc ZvYzG?d,r}_q@G)!VSy 3ϋQu, encr3ʷ[Z`2*a\Ys@+abt~2dr>s>Qkd#T蚙 }qncc':=S3&xux^(}fB&~;k5Z5(̡VZöڷT|hb듪?et/Q9\yt>z^;^E=ikzĀy{y Ozjf_戗!ьMc[Ax]Mhty9Z=̈$qSgW\5tG 2 J]"uFO[& " Sꖁ+m!-gC]K<MظޞPg>C |/-`НY\ IՂ AE<mvVgVe/" 7V%lxD K+GYXA8{ Ep\µPMaLkqJp|6Kr;K@SmȆW;,0 3 ]\Xӳ-ǜwj-@]H/OQk쟴D$M4?"&ƾfwLTlv@ܠƬ]3![&6]L+dӥ)&'a(!]mS-{ffHX7oϲGM;Ñrrmꎔˍ;T&]RaEh=rZt^m^PSW "\@ྍ=(ך#]U &բLwi.Ybe_AX`:F[/͆{͎ hɰ?zJC~DT {l嚑@=2(&zxB VYoYɍje\Xgr5rX_l%$r}GVVd#/ˆ,\٨j5YFX@_/m.˫r ?ED(W$Ԫ)[/Tkh斊b}ǐ+zt@iNnb~ʍFVe-+UX)yXE,l!kkRM6}W6vյ\ \*RL!|)W\7rn=ZYhn{]ÿzR0r(b`\X#BV':1J0\PZj9P{V\ȕFrTƛ.oЛLt$X0Ϗ )ڳsh__'K 9&S㏿WzMw叿͏͏9>}G:q)vk7ޱU~ x}~ѱ-Y5~}=KL7~̃ے'/%_I^H7f֏|L}xlĦw]{5W?a'b>C7j|}G2u W Y2n3<̿;M|E&:7&^~i⺈OtvBv x;NgO?+⧿2}">ɻDby{;MoM~/@?Bϋ/TBĦSI:1uBħRSᩇr7r7DlitiO?9Onx;׃U:` id3}% ӿF,i3ĵz-CeppH#M?'?m uYËE_ȼ ׯM| <l[`2{;z) endstream endobj 239 0 obj [ 226 0 0 0 0 0 0 0 0 0 0 0 0 306] endobj 240 0 obj <> stream x}|U97-S23!L2IfIB` =$)`ZBj@ `;d@ ],kAE׺־mWW)}΁_{]?o;1>tlrȲjƻ_K$qdƔѓ{j.}XN[۵TɘK,Z:ق N/3v{2:0f s+H!ݸhBF?aƦ%u)368iQ}s>F~#5m1:lE eYr5cK4MO(ty[-|u Ccsþei&&>'eiI4023:xp[ZK],Nla-A+s9SuA~3*}4E6)^Q>`}:ggh=Mc9Q+>;Ez>Q%7k_WLn_1_LgXӿ/q[ޔk'j؁g_~ͬ\GWS~>-nq[y=۟]~f-nq[Ό[-nq[-nqm|=)dOPUǪW0\K}}֥\o{)wiGV_)&fOݦK[߱㬚ٻs|1YԱm=6!_ nXNV[ ͻnf1(@Q&9>!T˗-]xQө,l\0~9gͬ O6uI'7vQe#GJ4lu';vŜ`2:UwyɭrGt.D|5Z1%C(9!*:Z;|ذ޾/|YΫTBo- T"4=AӺ\-aCG _5Hi5ehb. 6{6 ,myù&!m 3c#jNym}d2_XVP1jm>|mm=YZg03P7(+hlԣ}#k祉y 9obG R3 =~їCl)y( "JyT"E^*}莴k9F/̫k\(+y^ Ajcc-o+,@ b)Hr`$'`JJZ$4jb"e_֚2h+0r^gG6U~DRJ(孕#O=|_ Ua UbH8DvBiYXܘcU*J |FC˥%Ŋ&)BjNh=*?t>'bҖ}dרPO_yCYר>Xk?OEEa9Zf98)hFsUt"l2 `&Wwܴ)ՕjvR_D#[&RG.&G=FfDZ[ۘ#kB_z^UdR* E?{?g.PQ9|-ZB֥5Cp.Zc[*yO\Y#qG)l -SB|˴]"o^URZ3-yJ i^ExS$|"!ZI+bEi-]Ι3Igu \A!uuBbMqLwMI)*6S*\Qxvlg;=mhsn-m !.-()|-G}(֥!<>6pu+C'J]nW/ڪ֚*=X *ysad)%_B~y bZ@ ƉdNgMM;;W,+# A9cQn@ ܣ"-u,\)sU\QdL$-$Z@ 8oTV$-Uxh*:"lt`HĐKmsŃ Zn,(}c*AI2Zj|G,!Ob.AdbXjf$AG}:6 َ=2 d}ftU}L43M FZ2";bSշ(M"Zbm!Q܊yGHh-p!v̳ U 6iV+|lGYs*9uNor mS&5 ࢣ}UR)Ud􆰫)b;J&ED{[SR!露]ۤU[YJq7JM^뤸VkZR+\ˤTKKqJq[8_h\)HYMR#py嵇k.=\^{py嵇k.=\^{py˥.?\py.?\py.?\py.?\py.=\^{pym.o;\vB+Yý3G\)uV4kRgfYA( 5DG3GVG3KAN#ZIy+(Lˢ#AK-"NfN!ZHHh~4 @z:yDD5DsPٔE4dDaDӈM!L4h"DF=c@cFG=cA*qgTMn&UFJG~'QjXYJ4$[(uVEՠ7ԏJ: Nq6 P|zBo 5֋'5Gԃ(('M6S~jGx^&Q((- rGs@Q\P (QUpR9DD6"+PI39LDF"SI9U"P}W^=b>~{||  k9'G &6z? =;H &TkW5y_z_Ad z_^"y-> }ʶmw=<:#Ce˽X+v~EN/ ޻-kwYzﴬn Œ[&Թr롯m]B[Wwp9pp)p Ի]d<{ywۼ9ލjw/n %|fx]xua:nYY7n붯{k](`^^>cUWw+|аiWu+WXm%߾+V:VVl-#uC#[垬 phrbYxIx%OA-7n__Tn^+uEµE5Es*^WT+֪ɨ:hz8}zxZєS“&'?h\xqEc*cX#×:D_&fSGzB<_ytCS#-YUگ'Dhsne#E2UFm2GV iSh"U9+=WNbsӮ=ћD5wp)ӦlN^ax-J2ɢ,%!K~a3b9Ӽ"}#UWdPxw J-͂Ǚ-k%9B:W~gD+L`=X NVӀ X,E@p*p h@ 0f3j Nfa`:0 L&`<0 F (J ÁaP`P A@` @/'r ?@ d H@*d8``,HL0z@7*`;#ap;-77Ws3/'G{;77ׁ׀W?/s3''=ǁǀGG. @wnnnnn~ ln....~\ \\\lZs-f`pq9?8sq9?8sq9?_ p8bG 1#p8bG 1#p8bG 1#p8bG 1sq9>8gs}q9/VKwWnL{OZ3qq3šY 6{cbحw,c`_Sq~3X.Kt::8E%vC3kum>xʏtKA"lk56^qOm'VfYl6a=kd 13&-R󑚋R0>Vj [ ,g+JvB7R"o^Vk5;agl]sY5Zz59)6sjvϦ=Zy|Ÿ[K]o.eٕװkO^f׳gDeܠ) {fìьyRZpC::[1v1HWvQ܀ he 3q@؈(u6cޮs^9vkP'zJ_ή bV hmZfv 6MI&ϭзq`ٝ:*]EXl'V>v?k?c1gy=H8!yh>J?~(E'SPϰgsR{ϧzc/׸ %)>D61nln'>ض;Wu~ft\!*dJr/3̒Y#o;n5}r*3b6MdWD V>l!{]ee|ø(̇[q^%1<gq+%G9; ^gqA[ %oBՁMD%4&4. - `a*;5$'*Fc!н2G W tOT4߀Ae)j WDWYdAd8'Ө dnwz{';|4nUOvX+PVv_Fq.>PlF)E̻|44N1xxIa}RKx+[rTпXm},Z\g'BQzYJ*ϱdB AS7-ͤtW-dWVEMɾ4WN|%ݛfM7Yzj-8tlTuFKtQy'fJ$ttaKȘzo$eiwЌ+ɡ XɁ&hJ{~hB6kEs1>p8Ui}zdl}lCY$/oxnӈLz?|#맞`/6\!^΃"z+w EɺOF}\N%a钊9'+w pR\c7_j/ɨt a'W)$_Z7ɘnczx?kgTŨC]uxժ >'^_w7ӘZGbbFv1t;َg Z>56ZD*"{e?Um)C5XY1Z)2=zQOXcGYjjjJe5r2<~Ya.1`}&z93 3;]B]0|bnFLhWYAzǤ?3b39,Pާi;a _tP8A-xKrXDb P,bBlDP)X[+搹RãK%{vۑ8A?B+Q 5w6&;ʘqw@{SR@RspJRdV5:3Eu̺O7⹓6^7d­J*?)T# Aj50c†y+8Tm"V،GʧIΎ9I0~ɖ?f靝\)C+Frfr}\W!W'diDOeib 2BulӥKHzyâDkƴay!)5+5-& fj4o9,Izo ы?/C3xL"3bJFnAoIOQ>Y"aRҧKT2ttUUb'+xկ1p?Eߧ3?C9HKK%QE?]U~?.>P(.o\q+Q%Q%Q%Q.+J+JhDIDIDIDIDIDIDIDIDIDIDIDI/@((w8PbUq8^[9V u\;8=N!\_ID6u9&Lw\g*j0y 6`κbnuy]"V/x]''xwHn&5^O"i9V^7 1d2 _K$9^O1J9u2tIUuJ]RWuq2!bgY+vVꊝbgYP;ȤqPd"kU p9j~R w*Lpt½0rnntd :᪛•& >ɤzqT:PwBqޥd, c Ć:8 0a}8<.; Nv؜Z¨-d2vî:9*Le:qQ B^)ZNxm:uΏ ۻQM`Lfi5x=]+84v?ZxePLy8oP4T1d^9WpP: lu -|vpK)FpNʘ~5(a\z\\qp2Re-8'a0>V,ȯGG~|h WpT0ZjH6bDŶ> sV7o-FZGZ2~>ڶ%4|lzŸWsօ=Nwܓu 7D}ԍk<7c Y(+[%]yE4qN>~1F\+v5Yqωz~R1]ly5ڙ4\e Fs7wYnh$EF2@"PXԚ@JpЂ]yQ1z; {=Ձ+W=Y|h\sFtx?kw!bQRbH'qEZ jDyn>^];Fx B]` .iT^VƵ@h;/b^>S/GhڞQN" pEJ& <+T Zn6e.JfXsڏqљ*Py5Y)n/JsHI𤸸*Wfe WŘsr+9D^mÕq`E6jwB&.1bgkB W&Žw(Z eQm>vg!ڇ\f :EFd|KQYV9sqyފXJ$uC J9NJ_yn݁z xwX8wf7/.Wm[#_YU P!UmYSn+Mвgڂ֫6cm@nhVJUlU >NΎbMm[2JUh&ըB׊ݵ<ފXR8㖘Ԣ*GS)Ne2TCNurɑNr!oMp#/\\yC^6C @0^B^qty}}r7)#> ^(w!;.#ta9Yx#03l]:kxХɰ;`(}@ ƕ]A3"{r4&0G?X(ybOsTXrdg7,73r\B0%w0c\ {x$aSrȰ]X}(>G(YCO`0 LĖ#!c%fX<.;0}.nv9£a婡@ JJ|nG_mZ -J%`#vx>o8RT4`Yn#nY 3`>*]fqjG6 5p "nXYw@w}8ѨhFop W3bcmmMtXN3N^w]lGy'=\J[ec+#!SѾnB ya&,frzåC18LVU#A .7&tjBwVقxqtz۽sqJJ+ T榶0ǂGt/ŽyޠuB%+ɯ03qB9.$gf91ACs#'3*v4 ~y ,ɞAk`ovV\C380vGgrpBGJ2EGl0@*pA9 rٸ1}^SelWH9`Dl6޽Fh`7L(܉nf7.r/nAd/aHepKK̑mqcUe:ؐ󻼸&(.h` ¶߽|+o;V\GDClp K;.ej䖦[+5r}lojGU?&ZZ4U {ecLVl)\Xmknk״Mv~zsC} \ojQ]8Uਯ6l@U}M lz) 3mrm}k#:+U3*r {sSK _ 67a5p 75 Qur]SCu \RUNiQIU5TOՕ+`&Ŏb\[jW Z4[`X[[jlr3sB&5(0S˪hҥjaㅋS$>+ M|V@8y?%>3H|f 6'>7PnNⳃg>;))S+YWU?7JzUKX,xY))(rSSQ~ʧۗ+E@ u٬a%ɕk)poF:N>bRS48l/2jq9 ?ǁ| H ZBY|@FRpoF8/|H̀{_c~d2 &^>h &49$\^&A0鰶,$ J`o޼ٔ$[-PBY%I/$A?юtAp?k$IXOIf!&?4y PltK.]1#lYXoНtٰ^d?PBI6?׼`ɂRg2"$[6[]&xn(XDxM] &`2n[bXX[c ,i'jx'V>qbuSq`JCE7셻"gX]>zW62U}!MC PgoPG٤Q?|71:%90 -F6;F}F%DW[i' 3!iiɦvHL BN%MW w=v79-LB 6s:>$a'Ok䏂(Wd@f. ?!$ f0tdrQ"C`ߐOIa$/al>=b9J z E*&ol_AV3UHq)M-2IkOa!KXH!%ɷɿ3#+[ySpL8mnS*|r'YCv:m#~49FR|)kH2闐G~D'3e@ W$!^C&Z09wr&B*S܊-uC ! Hudi:ݭeee< 9; rod9to .14D4YG !!NDlD8q>"ĕAa 1v$D!V NF؊x;Dt%#.B\q5:č[<^#i;.="{BgWB|Cfт{#fцX8̓AqyB] 3Q&eg]툝~ňW""@|qħC[3:DsvMC"@,D!!N{:юxlDp3H "B\qg8\:E܏xaģ'O"x`YтhEx q"b5bb+Y툝~%+ n@܂Ӗm G܄qÈ{ᴃ# Iw½δ3 E đe)u#A C!.E\eg  g,NfC0gs]|o 9< f!87JF\h|T!gVUYA? ]|4BU4 We})W.\;_^y}KsdkY#_9m d^c  y8-oFȫn|+Q2+|t)u _~Mkt\r wM< r)la697 W>;!c 2|ޏvهላ`*j"5Q Qh"L",8/iW?2oρȗc*:^#k3O+ecM ." d%P$אk |]ERHF]5{J-|xߏd-Wwρfީc7x@r>~޳H%1P$v1$.׈[A9 $JHL"٥v)$-H[A9 ΢-׭mӽPo[E:me]Æw 8Xldl46LRڤI+Ĝfͥfsм||N!9+0"6-ٓܓ,ysɯ$JbZW,Д)SR|)S6N9C-n{}75#uZ+5>u{4kĴ`ڑmeNO?њ$ь2^80a;8|×?iϴeŇdix[7RCBF5_dVnjSB J#BÿܮiA5_fR?N}F|\ß鿲 yr eUSe&:sYK*Wsӵnt[ թeI5?m٤n˦4 wixͪ6>k5|48t (]Outsf͇ù=8 GJ*$R !m{ ep#6%9L${4ꡜrs:fN]9]*N7y7ys49t81SrohT[YmN?IeE6NovrV'ݜ|tYurz-szGur=N{p6qvRNW=/d8"!6RN&“xi'6rH`19@$~e/51-/節7 {65ڋk׷^ 6pwCQ$#edB;+ }szi_,~mhW{ۜ޹ǐ;mrWֺwsFݫe|Fr<_>{x,_.㈱~7^h/|oQ W,;{wٯiV|6Nwr=t%j9m഍vbX-#nj~8x5_mHOh-[Ԓo:>)*C$ e}R9~ =8S i(b?73{C:~UURLo4swF-7o~NC;Dwilޱu޹[OlzvN7rw6cl6>AȬKѮqv;?x NOqʟn~Sc'mT)g]0DHu~ď~aU"{!Nr=z7τv󈻛݇q瞷'=<=<2w>9]7n_q'c2v5Tb:矟~az8-K/pN%!,!/" "<"8QqxooGc>>\ _e_1W8e9)_y{Ԇ8o-ޜ~|qA U-r׼uQ ?}O|jߠ׫wJ~j5^s".RgB yj8y}gM}Umwj5gmkxq|j?]TB ?WdUe΍. Z?'O/,Q^<(Hj^~>T$B~ߪkT)hVS0NRfQ[|zFc|f>s7W(jK^j7H AO{(n4\GuejvVݾQ5_jVUƄ qY#DG{MSKὧ>QgP]?nP󟦩TLPij~n^W-SQ뷨vϩ_˛SM<5ϪgE ?\wjxu<8.+GL5 ZoD8G؈  k!ޥY,tRG \1rGg`?> DGhdJ,&fpƖS @bžJ!H H`S n:ȼe( D@? fG(;8@_<s5+hAеt o"|K'<%KFm@};x 4ߡOOQ#x9a <`&D4j&XUZi?1Nܖ7bܑ ZlJrX(Rva[ ]ddu!BV+}zAZgF8+%&eA -< d%f<1l&GFTl&#b79 _\ . *."ťRxxV\KȓV%rHJX*9iTM>zA'}OtCN;2[;Bޫ a}Xw뻅^ayrFs!dA8gIԈ}lJ+rGJ#*RdWѫTz5ZJkt:2h:ZFL, LZBK,:i9-VH9t</ tG'҉R>D'It2,SKVK2uUt6-.꒮ꑮSv.h@EN.n-W>zdw;n.˥J跤1>zTF5X:NGR@7H7Ѝt4nfY@-Mt+*M6+t;.M;t')M.>BПҟJUggR59TCA!__JSz@Ǥz8}\FM-LOJ 77t[[>CYN>OEB_󀓢ZX`ED$,9%dQA$""Ir$$IrJ]}}g>Sgӡ~UuΩݢګj/^QaQO]PD}uY]o"Q]UWEu] nfMn~-ݢ[-#Z݊[ɭ$Zʢ[ŭ"ںUݪ [Csk5śn-x˭on}&PttEm*:f"m6ݖnKmmݶm'srn{}}Gp$MvE/Evun7}^n/-}>+prGXwwNjO݉D1؝NSݩb;ݝ.3ݙb;ם+b](>wHwDrhwBqW+XwJs׸kxwnqii&fk1ԈZj)鈎ֶX:*jWb1bNS/tF,t:T2rQo+&I|7bޢVU6ZoC_zXw]bޣz'6بC}DQ}T|b>Oi}ZlgY>ϋ(~Зe-ƈ1ď1 bKqbsQb'VH_bRŤbbcb1iŞ87&>&^AQU]KO//~E7EbmvM0(b1B1$yf<X ilf6ln6l lm||d&Al&C*Ie*ʌ*iT6 Ҫ*ST.SyTH|  AUE z2PHSH}E5AjS5T j%s(FQPJQc0A5AMj5ʫijTP3 fY𬚣@%5O̓B*j1<%PE-SBjZ jS$"y 6Klj3/-7R[1oaPGm|ځ+j' .~=aC@W硡.A#uE]w;4Q5hN;OU)طLֈ5-X /7 ..އ�}3 oo71f̼lԇ  sٰVz;` SủtIKS+{d;GMO=&EzE69>Αv!lH_ɑ~d;G>BlR"&Gmg`Iv !JsperdES;FF|+3Wfh_1"c}EL+2Wd_i"}Ef+2Wd<_" |Ea;FƓ"SI"|E|+Wdr_~_WfW2|eVʬWdz_ "}EWdw"[|EYH,/*6_}E+N__|Ev+WdW9+sW戯̯"|E9+rWd+)C=迨_"|E\+rW䊯o"\+rW䦯-_;"w}EʃXP=TiR")rwDuh)Z QtŻyX|"b8*8)N8+Ή₸(.M.kb]mgqx`\5@h!x"I$AD$d.`n8bJFFBz}ţL?˟ԗ=k{!\L߇=̻λl8>08OwMBO1iKfL~c̅y0BX^ XKa,%`55ua6F6C=l`'>?Nvn{pa8g:SpΠ:\UWkW\pnmw܇U2k:.<7 y#ޘ7Mk7-xKފmx[ooy{ށO{^A~G(?Ə$?O3,? _/ ίk:o[6{> .0)BBE-Q[ E#T&D+b+E D_mG]$vN%v=b'8$#WQal4~1v=^c8`4#ƯQq8a4N3Yq޸`\4.+oUqݸa4n;]qx`FT(s|^V/Ȫ._5K|Y֒eYW"U(Ȇl,Ȧ5Lj6|Coʷ۲ ߑe$egE+⫛.{Ȟ|_>CWGc AS9X~&ȡr.GH9JcX9ND9INST9GΕ|@.b\"er\!+Wr\-ȯZNF$wr^n?mG]$wȟN%w=r'<$#WyT yRyVyQ^)o+ALN 9SΒ&V]nzZVCn{ڽvodlbڃOh{=g'Id{=՞fOg3Yl{=Ϟo/ڋ{^g7oM{{alw{_c }>g_ؿWku}Ӿe߶wpG8c:!s9tN93Ys޹\t.9+oUsݹtn9;]sy(Q3h8ZQ;DQu:MMEG 'OF3Ef>:OB?tM-8Qb4ITl"fEh{EcS=(ڋppX C)FqNP|;IŷΈeb98q(ad@Wi+`jStmPIvZEEù5nBt]g]Khɗzђ{F~q@ ̠FcdX^wjcDTѧɻZ!-dſwۛk~{kwwu|$2r^GzX~o0?5Uo*E"mmea%HD`fX[8/⥀ʼ2  Lk5Brk9Hu|(#qNb_XJ6-ekF&/>:E1b Yc51Zvqo("Q(1^ĸxY0ʇp%(>#R+baH+r GUk) IY/4eL6~fu޼idm6K`,C@DP94<4ecCBYV*,U mmguCBX~$t0t5|kzBoYLb+dY byنppAmX..-ppE5\9\~!~ aOp"n~nnDZͬ>՚ZI숕l%siǰif0dmn7ndw9gZ7>VӕFdcKd{]8FiT`Y_~wƾðWm>Ϟ SUd#wg53L03O'LSffi3ff7s9\fn3g7 Bfa3~ane~vdavʎc8;NS4;βs! C\7MqKw]qOeVt& 98| =wczoFUKbX_ŗMw×Kr_u'뤡JcCGc0 )In0 Sa.,UǶN8qؓⰯgTc7Ua5C&b[b-p|`s6bs6f6a6e 6c ɾ}-&ۜ}A[Be b3zk$Ldׄ"{/dxkl96oDjIrPM6F8ZnLjY^{cI4xZR<)G'IR<)p+F:sq a,HQmOIE2 ޕ6̆'_k/ڗ鄝c98QG9u9NAS)u98ŝNIS)u9 NEYrTT)JVꦺnAyWBhhbQ #b[c~ gQ@Хs1bXB B !uhyh9 ;Λ`vt:9YB1ęRx{:ËkP"M/SE6E:R"=_u4fS`Js-i?Z"5ԌH1 n4)^N~FdzUճzw|bY iƘnJ"Z$< y@KJ{C2/| &0.:sꜸ$L@՘2 D~um]bu& T[ִhM)Oe^5*~[2ӱ2j>_;q>|yl e9eySql|/L!L`4цSq^_ĥ}7|v = ط`(E&y> FsEc.aN5Vrlwvv֐y*Tl\k23> e_\>'cBջx}Wr^xlyM|[}uue3?ƙq_*yPWDZqԢYk;M"!8ƉX61u#CG,c1Xr&lDSk|C7ƜC L%8Ŏ^cֳ:<.kM-bE>QE4Pl}#(dT7ZcqfYlk1Ǜ+P()T2T'VhrhUhW貴dYV֗r\+ɫanNo  ߌT4t ̏lܵZVsFZIV"v Yvc81s:Nb4-}%>qtjtMt=/<* G2Z/~Y%)Od0DgD>#Y !2ȐJd(20"d8D"#DF c!2&@Kdl#2ȸOd<2"d"D&$"L D& SL!2%@JdjL'2Ad2L"3dYDfl"9D s%27@Gd^'2Y@dB" dEDb",/|AYBd %R"KdeDr"ˉ,DVY ZO!sV%$PBQ&JUP:\EDһvi"" "vФ9;+{>>g|>?g|1>85óf|Q>c'lbsC~Άa)la/pu[ "܏ie=80b >eSfFQf1(3LqHgs#g"g#gG"RRFEGΖDױ4RDzH味|;Vޱw-m_[3b}!6x[<[`HdyK @<+' ǠԅXKdsH`G)kBq2"BQpF?H˪IhG tkϧlXx4] ȿWCx`kD]ُXO&[M \,C, FrhEjE{`osE=w"p5Nh*}- k+Ƌ-h)*ڊ!Q[,pbĊלbjhGv =қH-@w[O$Tp 9#X[X`,-\EYi||s":\ s/8Əy Xn|g(;֗{KHy ԙpJ|oՎ?`uF|Σ]r뭤(zGZٔpJ<.E+P)A$FQ8^@3`8O%FQ EslualEZл7{4F"QU'2]}@d'(jogc`k4->s&8x ~)E .+k dE,\Q>qބ,sPqU7-hRp9Zd]Kz!u @)\ñ?d(qp!^98??E|ǹȟdx9?l|oͼ-uAʢZxǿ:)b\_G6C;c]9:B8OrHL"=hז_j&]RSiw[X.NCjq1_L)@8\ĿG8 Ԏwڙ&շ$Jwh䯣|*w*r|˲OiV{  ux3e>e|bpc#1Vб[%!Z=ܛݞ$BFưs{ ~QB˼%fWe.*%BZЃMM}b~2;W@c7\(U*z,/۫xU\Іz3H5 jַ L)rs#Sfb>SG̔Q.LwŇw=͆nm]mZ߭h?1gQf\NR- #t3Kۻط^Ro)zEv:ۯ5UMޏU5NCMQOI5MSjz]mRMEN}~PG1t@X tCH7MAߨ溅n[ֺnzC#Pz~V?yz~^/@;J^oЛzޥwޫ?gz>!>lRL1Sܔ0%M)jL)m2Liʚr`*&05ޛ[;cR9u]H#A)eTipn~ tSOKAMmA'u:oc1&ěSyoO0HLkɃL<6m893#D{.сKtg[??OI^mHI 9)'I("PˆR Yie،\%'jPR֐5!M֑u'2le F(/PQFT@=\J,\ӥsVMBI_7$G…7cdq=l?h9G2 }NqUuk_Ot}^1Ѯ_z)o0wqr5}Zfʚ(zl)i>:(7>ڴsjϞSH#Zpڟ\L0uMcx47Iz1/ $g,qW`We/cHq Eo~C+蹣1# ,Ou ue_6(̾`rhPh0a2 2\h.( LwtL<ϒ@*XoNЎX D(^ Wʧ*e-D5VvBTPiTu(zQ! QFĊm"Pqf([ UoA:bPPTB v5|X qa=sUP1JE?WW5Vc&9s!N#ƑP0$6Vf טf/\kϠ9hAswp9j'sS6gYhcΣPv,xd Cg]![Bw[SmK-vv&v] ە0ε`]#vo{]x{C0eXpƏ_Uú{ӗRog/AG| N9&m*A 45hqoA^"A7,ۚyQhnq>B zo Pu}\Ψ{/;HrD!7-" \[x%RnHw'2n(Vv nU7Od5ܚ[ۭ#ܫEU{6tn'Q+%.%Q4MIJQZ`KB!j SLBZZZZ*QPZ2*V< UȢVʘD7lcXNHXOBEp(i8G+dm_#}! J(I[ߓ! e:JPYuEE]Q]VG]QKFJ^2u ڣ$ylL6C;R:{Y,Gb܆mG,-(9ƈT@iDUĽ?mгކV8 K(s7|`3# 4&I[-*:ҕ븮tKn&nrlusn5rkn]ŽƽV6pncvv~K @{}R ߃*J 2cVQnUV!Zj% [EIVa(O*VNl$ 1l_jEa,^Vx~Lgl ODN3diaaOdD%ڔw; 2To ^u:H7n[A>@(Jz8HSCVʤ6&lSTb<(/y؃勨ߞOv(Jg\%uI(Su*t2YVEUIgAY}z4/hEh%ְ9*ȴ,gs9 Tp9ˠY-r>p>lg*d'Pw!|,z)s7-YCyQ"3]"z<'<aI$KdÒl$bMc- QИ@48L@T'˷RSBj""v͈6B?D F/wpAc(Z}#FB\##``G^&-Ff$u7GfM5smjW`*XXưv-̺4ui&peΔ3 LI)֓inԐu#(@z]gcBȳe{;Q>&|{ 䐇: xgt`ѐ4y/6X"J9-Ru0uƤ &#XロR7>o10kj^'DDkML_r2fujyFF?bx[!Y*_'lfy  ^w/ճYs<O'4zYȏ`Ѻ5*֕0ꐢꪫкR$?T[錟Kȃ yQ<3uߏOػȉX5-=-1G8ǰ8:?;1jxm]EwNQ󷝤N_ңYJ}>wC ^ {9T`<1:;':`BN"N2Jh@ITҜNIHwҰGNKڱ6N`v8h9=!՝>NsA-g3j;C&+3fZڡ@mudsMG}"x"OϨwm,z3/_3sx)/!x)/x)/1x)~&^Kqx)/9%NҊ#^Z KJ$^ZI-[9圶ڒoaG\{{N~Ճp 7koLen+E8[w4M4C,_Du+T7u:ќ|byޜ*xo|b{ױiTYUs.Ğz"{)i*2ikڢtfA4@C98_y;XW1U *WLkT;St\+lHA\$zu,,Z~`pfr(1ȡCƠ%| {#_i(bǢ[M6kQ[!fbV3+@<,;9vku gh.{9ԲW롞FO~~";z{}ߢC3tۧo>;('X))bh=^?Gm60{ag1C2"8*cxlxl%xlB16Ʀ6םmz}#lMírE"g>??Gt?UF;P? &#?'أ?;8/-!{~Ξ4A43qx&Q?j;1|sId1w%`OAW;?]#O4<a[_=~~']x7Erz^̅R2Q=Ö́sģ~m{imupqd.?Aa\m(Fd ==uRF,ORM~ifp> ⦻!eY8LyP/#_h_ӯ-&-őlpd GfrdžS#3582SӮm_z4xXk(MQkSd!Gfqd1GfLSјyhZAsSZ8u:iᴀVN/MشM;شw8t$X#waNĦ5TuB.³)ϠqC%{g>y\o "byXJK+Q k ˇKЋ 'i;Fe-"soH 5)aJ渕_=J3'[SI&^{OGa Xȁq5n xsJ"gv~} 9#9$2dq.2˥9G^&3336gVάzYMj1άj άj*gV8Z3Yu9ίǑN$`T}Ǯ 1?Q/m/!mK5] 5n`YsvМhz)c"1JJH+)iJ7n~+(Kj䃄z>9-xg9-\vpYl}*'Oȳ;@|Ιp,MEњg9G( ya88n %cr8؞?K[>A(CPDo"NR+Gnu3LZmQyk弗XZkݭvc>1ukPZo.Ғ/$ACG)g"(,= 狢1lgg;9y΢ rS2>ьCܿܜ- /9wwbu֑ 4~Y$4{/7fͷ!h^ڹ _2io̕G|\I_W,}ퟸ}rm~7lA)o r[M4{p%؃f3}̪cG`[Vj z.;oz{TMlxq}o,\<~C43SAs$GB9яȻve\ 9 !IY)EK}):Ł6ŴUƨMIԡalTO_rys#l<˯<]*=i`*I|=夼ğ+4C/7sc2Bz(XxO{<B3QMD1K͂5GAX-DJ:I:,A H * j 2>[/֯Op%9~V}nqDxlW}k X2oEٺU;K<<В[l/]a?!F\K5`ITXփAրh$,G8'1( @gS`>loEzkh+n#1],Ň8n%X)V%iFXcǭgr?^t~{\܍}ܷq?%r3XȔȳ\C.E%6qG\Jl[v.E%۸.q%吹|ܳ!s/ABA6@^mye됭oD;A;7<}Z< x6ӟ#O@_Na0XJ(d+^Hk}Xm;1Rɝ'eqOTD cw=Xjh8nKfhhXݖ Y.w@k%:zr$m#z[//FB=(H{H;{!-8†i/ / / /      ollll o        OB'CS ᩐ4@Hx&$|$<     {8|ܳg qϞݒs9RBg侁RQ|cHu00b3L0u1?CcM0?4 Cs-ު'=mM#poA!]Ɂd!WwEwE":\1.Kk"fZt2t2:;M LS;ŀx77|.“cῘweɈqGICQѣē&gѝmζL浈3=mWT;Վkg:zUX;=z>Pgc O?__+5F}]ߩ?GyxtQF1JeF g43ZFObdYF1֘`L7f2ychl1;>q8or\^swvwUutuŹZڻ:z\C\9ɮ9|J+u=î]]g]Mb2m0˚jfm3ln3;=;fn31f9ɜn1K|shn5;=~y | G P[ d{r_Fx)@E(JR>(RƄWgge)}T)}T)75!!.lW_F%llNk'!5 NRNRNRNRNµ@ %XcɑDƫx+G9.-*)`Zb7B1ii3 @c`-8>gSJe g w'k^;tvO{CvhZ_RZK02L<䓕d yl#~9&\4ʫٚXC5Zj59"wTȁYrhxG~J?YrhxAuJ`'+:W`=:N u|B@4'oOS.#j2Fdr@9$+M&L2Fdhd$+M&cfd& M&s24dɤ(LJ.\P"Eq.RE H)"Eq,=žJ\p.RЈRb R1T!MU3CNCJNi8; g4iR@1 P@;dwҧA%A5t,Yґ.̒ft5%],J,+ FQ`>g `&pp 0(KPg3T Uh##`Zv&xȄ }jHel@;@ h҈"'W74 U0=L= 9*g-CMg84hÑ  \ \ p WNJB)Y(% d,Ǎ .RT)Yk{қFd#L`PF%9J6rl(}j$= `&0x`P^{Hu#յG*}*YiNJsJ>rSTn T w>,Jʆ#Jԧ>ҧ>ҧCTҧ>|O+}*H}jҧVJZҧVJZJZJ%I}*_SJSJ$`/AOP'OC}k-|ޣ k^Vg2^g3"{ԙ(Z0MqL#nK1g׍/uEnxa_"_4^8׍xsx4^n(4^\8t|#9Bwsewa_lFB^6O~oG2*|S]p?,q]U\Dbu77D6ٛio7 ^HuEKf'YCKZ1YJPw( fu#!DnBE&Id BSH6U%VFF9i+~DK$lge]]\2D IwO4bҺ=LЭՔKYƉcEJBWNuY%IQB4bD?ISr]B&pVX)*yJ?n-.lO[eȨ/bʓy6@n;kGlYcՖXҡ/Ֆ>dubQ)|Lz"kd Fvi8ݟL3CCGUDfJeލ7:/$1W幁6V{o$dEwKĆd?IvTɝ?ChCCE?8?B"Y4#ˈDSDF+FCEYeXW+𼁉6$JOC!ƋFY} g4It| +X 8A82Qh)CWGzs9W??_nuzY\tv'uiu|;飝.j?_>; F+AlCZAhZVw&i]ZF mF[Dڏ&:t8AqQ:N :Ρ|.R4]Fy/WZFߠoҷ]7wO>~H?O!zgyzQZkӢ\.M3ggbnu6u[tD1z )Kzy<4Z-k%Qf?)b&I)f )j19F|fE$-IiiZhZX,-K-ON+ҊĦieЪ*h5RM&i-ZFCnh=R6 H)ڐ6$icژAҦ mA[;i/ڋI9ڟ'i2M&@:T4T4T0Rf,RflrCǐjt,K\KjЉt"A IR.H.!q)iHϐFt9]NtiBϑiF_/{j4WH !-:ҚN_'m&[rJv6Ҟn=@w$;IG"nt{҅{IW#~tA҃IOz"z$sy^訋ԒhJrzidZz'O(W(OZbܟަX\)D3d ,sqr\1b35tS"&}|WkME^~YizFdnU n"D7ޚ^5"OD]ny&D nny^,V*%be5[neh\)Eyٜk7U zuX=Vu:BŸLo&Ƶzk1ۋqAk].b\wZ/G QzIDvFh1h9'IRvLh7u]/S= tiTY!,NC6J)z>L)`L^_ Y)J~V_1\F5Q(m75F#vJF?# vJ$c1X`,5+M=c8i7.r]6EHXXXXXX XXXx:n`M`-`,`m``]`=`}``!1 )^`s` `K`+`k``[`;``;'`o`_~d` 0 f##csSӀӁ33.....>| p0,9+/W_ |*p p-pp=p57o7ߒH,i]xmmG*z;񣒷Ez&5}IMo7"$;;4>DxGzGއIK8xƛ%y'x'vީy~2ӛ}$_;%˾|?~]1߷Sӡ3s<^irZ;m}]vwiD UA!ag}_/߇By|N'i4r;MN_-OHS/8H irVV,mC}G?~x>pn࿀{?s?N}``!1 )hY8<< << << << 788 8>s'o|SX XXXx:Ưʧ'^ _o._uK_oN}RTJ~Kҥݞ;JYKT> 188\[V,V\hkђK9GF+c38K^?؟I?o)2Zb.pVL<ʗ7=+YQk0غm.۴v!i{(;ʎe3۱cbvq6?.mW+ڕv.]]z(7Jz>Vvk־ngv;hw;]vwLDL11Q1EbhLo/W8](0v)]Cƻe o![H)P_)ڡB '>/O3|_ ,?_+| voË %.JțGđR>d Y*q'BxH:M[{}~S뀌nXYXˬVzzzzZih^V[/[XZk:kzzzhm޴6[[ϭ//[W71:aNYu޺`]Zo;:w?FjS8!%L{hE_TKK>>>>>2,}4,UX7acao''ҧҧggI;am& ]&_'6_4^Ex'+t|hn0zjZ\ku0yH}~~E?F(zPCVȍB/=W~7S[E+zBѓRg=9E+zAыz 6]Kײ1m6O[kuڛ6mW;(ưA.33.Sty'^џj(U{iE)j+ZEѺSvSPtdEU?[ˊnRtJ |+]zE(]ݧzm@u0 CRQ #b~0RD+s^|!QY]V7Wsb;T1n:WQ`&R{D@W#\DrTvR? U>^.[?X?Z?YWaә\dnf#}0ʊ2/ U*!sDj>c>,b&a&c&02̄c+y Ê6VJR4aw?*JVawj:f5Y-+=;99;Iҿ% *:zqU$(DCAɇI~Q,.M-Q<$I5o=bZZ$+ϚlMZӬ k5˚HF/Kck5zܚo=a-Zk4 ANjMs<5G"}ϣM86wx /ƋKOv^ ޱ޵Y<]n_yxsH >gxG| xxy^Wxe^Wwj:5y-y^W\Nry;ޑwyU=xOދ'xoއW/=BQ<7xcބ79o[V5ox;('IO3L>Jߤ<'>P&yCP>Y!81N\Q"KM1>忏 \B.=U5`qŚ5g-XK֊fmX[vk'FlKgYņal8b#X6{少lưh֞:֑u~86g\&}MdXW1ug=XO9ޱXoևe~?KbL̦lL6f9l.gc&El1[–-gl{=Ǟg/HO`l{ثl [ֱl{`H&̶V6{˶=Cz c]1a#}Oا}ξ`_+5c߲(N3*.;v}.؏һ[.&?Ow1{7?{GbO~⇝/W1[s9rN;g9s|Gn=.! ߾r8!ZjxuQt_,) N4x7z"TZ$WYF;Io :Rb"`orXaűV15H0 DozK1qD揽sAʹZ{$S뫥gaZ6V< Mfk2ymx"ڨmնg=KݥG^zy^S7қmzWnb,, F)(@; +{Awo`#"QH^u!C?B ~DTDE`[|{F4Hb*RT*JR)7fS)+5$7W#ݸw_|Ι3}=OL~0؅Gh8 dx 'Sip28<φsgEbx </ep΄W+UjE8 ~ ^ -g6F0X5X\Ct)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N:mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mp Niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii Niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii NhTa a08#(x8p؅G1(x4$x2'Sip2< ςsSp ,^/é pNr8r.ۄ.{.{{d?w6doM;mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mp Nsq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sVN3g2O$]ߖo7Q}+,VD5Qc{я=F(n#|9!WJ5~~w!˭n7K[CK.a{/BptвԂ޺2}.𙥽g;kz꯲|eVӻWXeFXֻ?X}nwjZnJֻܲh3wSYQ6/CGS$&ty?co!3X]1RY_$7wo+z_W5a.Ϝ[沆a.k5wS뻣t_yhxhBt{ޫ8o%3@o$JkZ>}k-KG G G G G G h!T:hYjAo]{-.o3|fioٽ|45ۡ#vwrrGm^S9Ybu,]{,V>w`_y߫zG`=bθ[vq!7*Xv)5c#֟#V5wgp%9Ѽh~8Zsz)ǵxx<_kQk`_V@^uz=ΆK09\-mi/[˖li/[˖mg N_c_6K+x?Rj+}[;wW"x_mg,y菔CWaWX޲+, ˾o2*};Qo,;?MvOע_Fs.U[M7|hT(,{~jJ. K-mcN mϯwNszkZΜs6v,̄{_SﭾD}Q"HN)[R7+q{W7|瀷z{g6#~$/yT8nz}#ߟ8t=qnnM6gNd-{·soy"~9~{[ޖ'ʸe"n.k3qEsOo-V',ÿm̿weh3{ɥpo7p4*\a_vvُQm;06 N8)Ŭ6聉}&;y5:!YQʰo莜?}8c֍1dNvrc5~crY~ɹ?=NgϹhNxږˢ˯b#g)ǡHFۣ]$~y'u,Ǘ?Lόϋxa$^i1xK-Y~.fbeһ]Rn#dw=̏V~lGH?BG`9B#dy#dߏX#H?BsQ~l#dh?BˏmՖz-/GYپȏ_KYٞG~lO#d2?Bg}!{̶N+پʏ鯢?=˟?}M~,Gr#dM?Bv#d~,Gr#d?Bv#?Bvc?Bv+~V٭2 fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fYNfUj6YEI|=;wNy .WuƬuf]n0rY1pf]>Ye̺f]gf]ͬf]2̺2\D./mS>|MFu9u:GtΑ1;tw|į'r Q¿$R_-_ɛQ=s稑|NܩD:N=:촢CrFINgt:c;:ǖ777mUnrtکvjQ4 ʬ~"rsѷF?~,E7џJ܊Gq7OO?__OgWsyxq<^<oǻoƯߋ$y'uxo/_UWFUFWTWR\9r^eJʴL?OI򒟧08‘0x8l~8 .< Gqx,<N'SD8 O',x6< ? ?/K4x)/3p&^ W/YKexgg| ߆;ưQ_Eâ:3 cCGѡD3(i>5Ok< /0˱s;fr99\>ڞ־6:vtNg}Ct)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N:tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tNg8tYpN N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N NKpN+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+N+NY_fTׇ7Fo#~ޝ㧞Y>3{ָ_|O?US~ٳ/zsoLp/yŎG|X~~`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+U>μoMxt4>0͈Dhy2Z_|K:RriGK.븒wn_ѱ%%}_ X?2q5kZ~z2(|Fǟ`yDQ~ZPUrCʒʊʪʚJZXʖʶʎʷ*ߩ|O+U~Yy+oUj:ڮ&ձ'V'UO]=%+TRz[uQuYuGOT]s՝oT]nWVEWTߨvRkFkڸڄIΨSvamjmFڵ9yŵ嵕յ ګ~XI=_~[[W_ՇGG׏R\?~^}Ju֗WWƺַԷww׿UNZX5v#im81qz4.iLo\ٸM6lk\;"U p .wx/U |5p-\zLa qnO@@:XI>_[3p|> p|/]e~ݳs<<")")" F0]F.DQ(EXe2Vt+]Ɗ.cEXe Yp4,;:&Dϋƕ{]49F4-i%㣙 9Ur kp+|np;|/% wCFBI6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#'m$F(ч6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6Hi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHil8^o7›\8 op>\;"U p .wx/U |5p-\zLa qnO@s(phZ`7'|~ nmY|n/EwnHi#FJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mĞ6RHC6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF68n{mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdil8^o7›\8 op>\;"U p .wx/U |5p-\zLa qnO@s(Pvp | > g6,|>" _p7mdi#k#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYFCF6B}F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F~w6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rW|67Mp.o[mv8. p*\ KR û xW*|>WÇp=|087'9¡\I>_[3p|> p|/]e6r뵑mh#G9F6rmh#G9F6rmh#G9F6rmh#mh#GF>mTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTF~.zmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFmTFly$ ,]Yn s$,7hj}}{| 1h0x200Fm{s"l4FMl4FMl4FMl4FMl4FMl4FMl4FMl4FMl4F- ]tѵNݨtnѭMݩtѯuz@!=GzBO)=gzA/%W^zCo-w@#]]K>'Ts}/7V{uf%Ml4FMl4FMl4FMl4FMl4FMl4FMl4F捍&6hlo{/fk_Ab⇿GmzOsg zQ/?ؾ:W{M1ް}Som1~Ɏ߂;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;mɎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎW|UZZ]unMYVݦu][׺W~=#zTq='3zVy^+zUu7;zW}}N8硩]K>'Ts}/7V{ufƎmɎ/o.رccƎ;6vlرccƎ;6vlرccƎf;6vlFױd`````````````````````````````````````````````````````````````````````````````````_+u5Vzݠun-Uvݡ;u=}_A=cz\OI=sz^/E^kz]oM{z_C}6]ԮC}ЗJ_}~Џ:QQ,(((((((((((((((((((((((((((\QQQ|'}llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll4S璍W|UZZ]unMYVݦu][׺W~=#zTq='3zVy^+zUu7;zW}}N4tq}O>B_+}oA?FFdddddddddddddddddddddddddddd#FFFFlQgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨Qg=/٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨⊯ЕJW]tnЍI7ݪtНKwZ>ݯzD1='zF9=^zE57zG=>I.BD3}/F;}l٨/٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF懍:u6lFεdbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb_+u5Vzݠun-Uvݡ;u=}_A=cz\OI=sz^/E^kz]oM{z_C}6 MC}ЗJ_}~Џ:QQ-٨بببببببببببببببببببببببببب̰QQQ}'}l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4hv_K6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l+tպF:]tnͺE6ݮ;tݺGֽO=ѣzL =ѳzN^ѫzM ѻzO}tҦ]KW>ѧL }ѷN3+% 6l4h`F 6l4h`F 6l4h`F 6l4Ȝ`F[~c·fv;܏Xxgxa{~oaW>/?~2;6gͱ?s?pBj~4-[7xhag?w}p|5~ o^'l7?̯ZއݲW-\O{s~>O͹gܗz78?Z\WٱnoZmZ;α"oޟ˹r` endstream endobj 241 0 obj <> stream x]j0 ~ Cqv2aXpl%3,QC~:?[]; cѓc\aɓ:WM{Wn;$;j".78<0QWvȞ&8|^z5oTm(^LA9}N9>PK4ЄZhZ;5pv?<꺸CٕY 9')|~o' endstream endobj 242 0 obj <> stream x: xTՙ$!wc& τH&/@!$3Mf`LS"bDV?qժ֊XUjmwWn+-.ZLfso{O9s@`vTV}l'#ms($x~.x@z}Wռ#<}ޑ^9y'Gѭ8\5W^FBƒe(+Ʈ[ffHfϚio \]a[:$wd'ԫL)%5Fnݣۻ17*gfڎGހfiK6uYѴ`<FGdؤ3eh`%h@\l@ccPKtd H+BZ%Oi,QrdNpŒxԘQS o+@>\CMiLOjiZRBKD߈9EW2|IyP&  al+l -lD]=Yf-\7995욚^-c%?6sj(K0ovר$s|Kܲas<ڭŶs_>=A.> .gX[) cE XBU{M/(9KWaffZS:_1c^( \KQ9 2ٻaFvl:n7]95v7p븄G'rTI{3xDb#0&h)gLW9w&'s Tc5''Y?H8b̩,Lʩ-xm82rPaUڪ=8+|8WEXXII[ecarV{V?vD?֧sǮԏҏ-ՏYc|X>ِd0 F3p [)}F'Lt lhO_l9b P-\KGiQO:GR?Ĉ&@KgC%J[T}ۖqBۑr{1]a=Y=Dܞv;ե%L^t[KgWK3CA}>=v uQ(uQӳջZ:Dzj"vrm'=wfn!wGmG馣CQJjIq5Ӧ47ˎ&qh%=%稻uJq(!=K *jl t+ոjO5ZfM`[׸x5b.T%K sY?< xs4o:U^_^O`<զү_ayT2!9Qn Dox$pRNUīR\ 9x/,ț}z9#yr{,ѧ;z9j(Ƃ}sdUpB7 H&?@~7rI)rj!3r{HA ~sO^ˡeW[!L #\{9#dD "zqhN8`>| ~'B&9y9򟸪*a)ll߆"9^$33h?^~>"D#_#C4Zi|9Oym7us21Fw H݁p=ы{x#uM^!] Mߪo91G#h핰ߨG[pwQ׋YJVrNIn&'Õrqy|_nZ-8~䫑5K<0&脭 õ ۏm w<=x>j}4lVl$H i&ϑ?sbn)Wͭڹ>υ1Nƹi? !xANA~# "26xherK "=2=B џ6̪zrؾmc= = axyK*='_ 1rR񽌬ƶ4D%~ryv^N8;w57]s'SLJ~ 5'Nڄp0&<$<)LX!GQY].KXס uûI8?q8z'KLd~H~2rn3PK@_ha6%\;fnKwC8@:6|*q;s(?A>s;&FdtGbZ(2W-'\1wB Jk =̿fvȟM[#x&C^ׯG&':XIL& ډ'7H6F㞃O795؈½7'&ԁϦ>ggmNį=Qp`ԉN2c@xyzi\VGLPW;QKʊE|sOO%6΃$_x[xA:,;$~3&?Zi l[qq|x e_zOCGu$1b,YtQ~'\ K`zKy}}KR׮]QrK}bA74,zmkrn kk[^FDccD0p|BQl4F }!&F'ba.Mq'7OeΝx=c!HקĵAWU ^il19Œryaan.'/4&yaJ, rp[*[0liii(0-T 5͚.s4gp‚|ӳ:*2%Kyar)!esQ|jeUCYiz+}Z5Mubu" BbLUV$19-uѢEU˖.I\\ K̄S\.YMo,ؔں9ϯize^6Ɋ+ԉ\SX C ttъ~ߎ'H1,A¯xh|V,8"7ON->@*j R\-+}XQ%-ZCsjݙsgLgN0Aݺ3ugΘjkYҪY]Dwr.%95- E(mQZ$\dc]{v{Ce~jb<;mﶷO_̯};of \:|en1椴u[2dzw2_8vvE*<9UEh-;e볫Rby%iďb1B2ZCLFqߏkittGיh-,4&'/ȏ+ʇXux eUim[4rqE~{X M~s٣<[5X#3rs`?1>|DD_kp,Ts '/rv !.qB E/K}>`oap J P&':4yw5vq xDH`ği h'4tu .748z okp<7r [Y>R7>1D_'Gc=}PPjWJ`HqMtR͐RJ˲ h}volҦX**KuNBC}}=2HMǰgOZA7*Ww=A79<AӯVeXj;E!9~O J +#I%8p|}JȭaO-9P׫8ٔWwv+=}Q1}ʀ@CT6t;gHFRP ;sPAGyIih S{n'*)bGC0L)BnGłC!:<.~?qGЉ8JpNT:D4. l?H0 )^\oA_ZR=J؎>\ ut}A]]fJn%Z **63A{QJ1Fj 1[:blw#Y\ FMFhO/OaVWri=,LV!9 A8"c@Xl;jj:J?Q/cz=,>Mw*DeiCJ_IR,^sZE3#1ۣ5NfĴiOYC 0Q?2Mنk>7˲f֮5^VBLk4;m͔AxtW0cC;}?AEKc&iԙAME+8wϪꛛy}a6̚%έKf.+!q0(msL~:hz5^e.}xe;ͪ*.Qw*wڠb|~v60T`?Ne0a?~V!ͺfTnn+"@"Jexh8:~p 2I[6B5dR19?iTCt 1t6nZv@̌ѢL"Ss *fϼ8&{Q)sq',*apиS#P?I"fF/ym, },p7{<b: endstream endobj 243 0 obj [ 0[ 600] 120[ 460] ] endobj 244 0 obj [ 278 0 0 0 0 0 0 0 0 0 389 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 667 0 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 556 0 0 0 0 0 0 0 889 611 611 0 0 389 556 333 611] endobj 245 0 obj <> stream x| xTUp9w-7{/IN! H UBD3!*Kqc7Q8f\3C'ą.:n#<ef ݯ͛y?թSgsn:uNչVJX057xpնY8{˧v> *Xiy늯jH;.[2; ^N_NK_yee _\d(<`'n_Kc}MX*yQԎTN]p5<. \I.Mrh_Mki6¾g5g@ʀE xX)z,\ ,|!!1i'翣7D2a4T$a,`M{59OsL)1ҳOg|̯g2TQ˙~Ҙ|&?_Eţep`~)gleϺ?*jij ƌ.-U\TX?2/wDNvV zZoNINr9ĄؘhfMF,g5VO 5 ƍʾT1րj xZu6*q^N5©DSe9ٞ'Zɍ RO}A'@54^T嫚gɆnf}K1q,X3! 8}5Z!jf LXSzrX5wi|[UcRU@iӦ{:*pikeoK|v,znu EOǴF7P5ͮNꎃ):Tn%:nm0c:73Lٵ\3DM"_A3C4h"%Z2:AR\ZCkbtZvߑϯ=X#)Ajqt>B$墜A6÷D!F4:tjz{PKX=1RPsUk8?]kY}LV6}c glJBl͂L;"S}=5v^)^rm0Rx@H#M47j'jZ#UŚ"9PdY+4Z4I7NfW6M& t jtr/9|tN ~ZsG鼶Z:::j}ڎ֎K}ǫxUǒӫ DXɲTv*6O#i= YUkeSw*5y\kVUjVzM :OX z^D YN<(]JNxNP3DVG3 Ԣh-@>Ўiڎ!r*,07kVL͛x#m앒yO$zJ oUNhtBonN{ŚHq^iyF+'&.BQx>V~KȡaBl_ԋܭOz*דrT^[Uj'.\Ӆ-*ܑG4z W.ݍ^>sSp/~o Ek<6vݯRᣵ^?BhqaH]ѰnzJ~L_x}ԣVG2ez޲+c>pa+>G e2p#aFFuV cPNK[S=<==z3 ((06t@f;2*mY%Af66XghᕤJRP%ͲR_Jx%"J8@& o!nBp=aNBle?"3kwPQHxH1EirO%dSL"VDZ~[ә=3Ogvi`xwL_82ZAbړYXɏ!!#$#B! !q!1!1k7sPDDDDDDDDDDDDDDDDDDDUH-ri t'BvG.Ltaj n+ W $z5^sp"c{=> #"\O(^̶ L̶ҭ; 6Ƌvи$w(%BfDq@%ᛄW."IxaEbQd1Kp5v"G#R DD'Yl]O[,'c>A^t 1f3'aEG!0"z2ӓGdvOF #Apd{2QړYE!'wm!^uL?(`{m.efЀ;_d^~'#PMk3rϵjv~ػS6d/2FP5+2Pn{7uݭ~*ptĴz 1^D;_宦Wir+2UUAaԈ'Ec#Gt2kh'ӣQQArΥrtP̕;t3ML;8CA1X `0H ` ڍHY c5|lKMWJ? uyjުt6Ӈ RS#\qƅ|5@>O,#: &_ȏI:KY ˬ3,t;βdFX,|3dy5mS+~Rc*(idnQMd;Gܞan uYҤr% L0k/nGPu`SNEND65Y `1^W?nlR:leVM ^V" ˗-`YM5-@@ ݲ\C&qsh$:i d-j9=T)jP)dP)^P)XP)RP)LPɁUr*mJ{cI6\"Y*E**9tJaJYB%Rf&SoyJ; f5,'i* >Ҳ~p8tpCZ[!O+I]c l%ײ{ +5 'Y*xP`3A7l5_̆*ZɯO`"ƇWh08q"rvk8cW4ni~L |9lXϢī{ٰN5GHsg KzX`[Ź0XeQPO+I0?Ap*g(͂Ka3)F҉FI<&Xjhe*K\@|^/(Ûߠ C)Ȁ a \WÍ @Sih]k;op.+p%>O y0Va> |2}|%D BC@ʑ˳C> O 7o ~2\7`(Fny"M.#GpЂ.,8㕸x/ޏ/ĢY!^H$m7W בg7OE1VLzvq@|YUK"f1)( r\,$-m3  O,2Ёsߏc#DE؄kqFa6A˂_ l+QqJB@_.&t_཰"1p nZp YW6l;yբͣX'^:!mHƳ]˗eg3('VH@b/iW,:iGD.`cwɆLc#'ICDfˮx=qA<< N O=Ts4wٳ<]f !>#2Ȃ t&: ~gc%4=%&hLfWxg* t^(|,Nw;x@V GY<؊)2:J{`&n˱Xa <-(:pv&xFX**߯ѣE&ʶ1|BjQxI@p$ ƝSsTDXلSePNy$%#4J(>pRGwp7PyANmj:Lvf?X&t7$ӘE{&6ט\Q5ي%:n $.W\@+%ujp1~ /6i֫rTAG4I,\S}Fz=fB._9,˲ð`NdnF)=fkt! /C"16UhpÃ[8 bgt%ߓ`tĸȴbcl׶h0/Yޑ&LNՋ/b(EVFP @Clsw>ݠikb,[} e'cF`duFY 1l.\m~i03&w!&|]'aɿ>vA 76>o|vea~%}'I9}ɯ CCA| (?!h'B0P:{LT':ղ7\3."zq6L;N3a"Ʌ2& aqM[#RZKxB_m)ezb k} TcޥRJPijTb Y+%6(j5l.ds)eavTf~[yPpL%ܬ?n_R'IZޞf|?,^9iuGDs)ǕW*=J)+VJI=J)~-Ԥ^21b寇>'Ss❯/ &ՒW X{Ù![$^2hfqڷQF5[ ͳ˩[4P 6ka#v'U~Dtx : a,-.wp ^8 >u|ZOXMbc?8e?W>Cs5K08[11#v)vsq59%R'*D54YB>nfCSvn: O$55'9"kݩ<(RL1)z ش+g 6ۍN=,~h_ni(vIߐ$ M\rcR,іLgQ̌Jw1_U]l0E)3a&d3-37^!Q}>s_TJnèӗe=yjb==(bДE%UGk & pM;)|~ELJ>Qn];6PЗuTzVyj]{o8՘R0PH̚HrBbB7QP֋ks'ttKf]qjȸ5M _ .JՓ2کCsve&?+u\mQ .CWBWbg/R6\{,ѻ\eC6Z>^kTS ْvS&jSTwWhʮ>H2 UIe2xwf'e,a i)U{C~בz`(}DD儞;ZKjt&z=Xo~ T]ni ^ac tpԲ"{o+SǴICfzD_LQ}TVN^w;r1_HL[Q "['r1?[OekЎK[bhYi1LMO/*IHi (O~a7[^s--5%Doiϯ9rөؿy:Rж.o9{<|y߱j[XU>Abu1B$!ګ@R$摖H%Ҁt@:* R1Rtma()F΀/8*]`6"ʴ3 m#&C;.v,m%~w;ιl6!dMjR \j^<~κKŸ B9`$V]xMM[:2K(ZgsϹCtss s(8ucrgꔙkkU?{'-+n8E/L6ؙϝ{jOZfނ+~;ZƢ/xuvMy5M1]}7М^ V.ַV8W/vr:݃G_ϵrmi֨e,`l4dqX#F&d6#PXkt^o4!:!%Lޛ9䈫`JS< a\(;!OnX$*+h"IUc05QlhnTE5ˀRΛ:lm'4$?Lmۿջ\LMLFHon:`6qcu*u |ʲ[ p?)ͣƗ4j~/:^kȈd+O_,i [.οUn/gWWN _ }4^a>`ao3Q1㐃l0v`ڒťs1ʛ!vp cLK֢uer78\'v.Av.YJH&O:y,)˫@BC~|V+ǖWǚƉrI ]$ (4[h<۝hĖ9d$O?:8 2AL#i3#={ؐ~~J#^PEA!['m:[w^H}n\L}mp ?al▊;޹ݿɪ}WB ZܿU0|R/[\`$Bニhho3%}gFM_'MŖܒ jM`N}Ybii[[oZZwDˑ{r~\qCGM1ðehEb6B[Ɩc(Jf jrn)7ϖ˥ dEh6ss+rb;Fj9/UbHYi03TH̝e^ŹO2Oew¤"d[*p{š uT@r/XLJtp'Z^ÂfʲH*c /cc/alѷG c`&N! 3U̍'3Cxc & V3Ɯw=Rpm_{^E4>GCMede>/W#]ώ2\"jw~9\i-ړrEC{,҅Q󂉳j)C`] O ?%r'IӟD]{Xy'AQ:ޱT}WjzW%-훺&3我_j%K-Zq80&V'daIz *)B:ZUPLzuzSzFҿgLJ}{S;;]u0[pQhUZ93^1s3NQ~LM& PmM{͋g*\,6vk'n$*k~쏙M/x& `^zt}9]t}ͽz!)cBj,wu]\:XW%c#PT:H*ԩCu_Q37WO9*KHUcxe.V$$X􇜲V:9t+ȎHE%hbUD%%Xu9_[XH= fC]xQG?9uT*u}&ݔ_K0BLv8՝,ZC9hXɯm6!~<:n8nzb`mF|0@p3p ` /Q D0WסƢӕf[<bFayP49`v$g9ć1+'Aw#a} z}+|)1?qS:~m?8*$XW|iSP1 @G@5 ehỆ_4|^h-.*^m.WSP_\R tƵYN%}ъ}ͺNY/ڟ}#X)(,*.1Nlr;7;NIƋR-N,Re!+/9T:\{#Bѫ^%WJ*oȫ /qQ%dt+cāB BvWEF!"9{*q$8ts%ppJ)]aB"Mya`AڽI&^enhB InC.Y{%Jrvu;I|^㗸׵ܗWKjv޸\o4[,=o~wlXIu抗Bmgodc?vpfݻ{)w5wps<6!.eג(<"ojig*̋|Rx_^C5m7_opc31|u?ɫ|;,ɩkv9{Eukt] YD#EfVS 8IQ{s#^tWq:y֎g͢=, qcu۠=oBxª 4؎ת3tK!O('M( 4:?}."tEGY9~]eYq'd3ć⇗stV~NFaڸ L g$LT/O3㌭n^`m Y%)hw}!^zhyUJrV9p:9Ho/%;ʕ t_ ЏCGE8F 0G:P>JDMBx$o=XvSŗm.mZ8"rKE"_#SeEmEDOE/fwcRpy\ ]h@IA݉ R|xxS?r*Grt(u~3ϋgU՜9Ujk VW2l6`̴={_՜?O6H[*8KY[[ۀXG:S5ugukUFRx NޞS5'/3Uݪz5UkZMZ}y5&>VSܵ9rsP]XPsiemc^| 5諫+un.%^T;n& \\=J]keHnP&!hpx-,0uspcdx iP7Vv.m6[96ΘzI 1 ~[R -پ~~i]k6.·?qM+K Ncѻ^ܰm-MYVn,lnN}(k[j ZwwڏL|֐g!+CNTZ^* R *cHTAR51#8r 1^SKߎ Ӡ< `P 0&A/wÁ9#O[:錊-صzOSBԩ2}w]ph#3vqrϼ߈Xfl01ol :kV/!Ƞ%c$ -@ALWL~x!9sWwo:{8HC JpFe,diJ4jI\rb:Arco `Zcc"|d!IX 1=CW^߀<.} !.7' Z*d,49=d*MTXR$b,!F,.,5&o2FWc72M!i)۲ ց5zx,{JQ*H 2tVgc{x?Hו7*ʳ6t V 4X%d HaMc0%=Q cѫEg8L䱣G?1 ~Sk}}7ey uˣ\zO^svK0v{rKj@ZXl"-j1"N4yj:W~C/f7L,Z h ϛ  >]6}^_}2fag+ĩgO}v詗_.p/iyA4ZFAS_f+lV{z=.co0ylpe!=ƜScVkQÑKfL2%zR [ ldi,V^m z`fZp !!!rR[SoC`j4! `%>$kl+7>.5}/>77 L2sUb˃lݙɇK}(XwHJ< T b./7 x 'lk,#r2hlgJze:\BLq4ZN <xvI<4kd0jkXC6It?YކORJ;{+6y˃g}PpW#+*FsCH-gŚ.}xԱKv?aOFgY.X.'w. @7lCI%U\?"&۬7^0[̹i%XM%)4ya`tAX .`Q pwl k N=9XлEa,te画B [%;.0eEZS[QШTc0좊Ba.&ƹ(XZZ=EjgQ \?aRRC!QQ]h3$uXU9\Dy,[f-m{8PvBq4Ha_ 0B5^C#M[rPEߑ=gYG:[Vz*ke/8gU^x`W͍%q=vΒwݕ[(+nelE߭6\ RDd+0@Eb{Ybrh'^aP@ 0Z3,nz6jթ=^sԙQWB&6"42qt@)#[> IMÛos,f,O gފfiIe=Ig:KWL]\ƫGZ{տ[JEĬۛ/6,:7ٟT]JJ z)]0sf]NujB5~0uEs+)ڀ}zp 2'>cy̖2[fl-e̖2[fl-念=[f?Rٖ~Z)OV<(?vڝۜ9stm;d̖2[f/R#Fi-=#4P/_bv+4 C BNV"Ԝ5G B,>FZ_Ф"6*4vJ[k]NiԻ}?UhY SN d]d\_a\9OF>2?Do)4?Bi[b*˸>qJ M@i?7`Vh7"0a )r駴Oi}Z/GjP|ZQh>h5,4C}h:n+?, (#28(v ga8j+K=q UY(aaJ0n!}JpDpQ9>y\!at~⊤eRyY= &hP$Oc9DЉ)Q"vm%ZPFrmI@a!m)K"LyJпGF$N?2̔@(ũzι0U$Qޓؓ{(U ˦{yG iLPO[%Az5 IdYxؘ޳ɿA1_+l{iV%{~\iHDMk3iI7٨LraE$I}ԛi[j&Lb_h3=Fv"܌5o:YOi9s@/&沴U~|F4ב|AַlQeԖ ec av5Dpy2`Rhr>tA(Le+sN:~Dh`#d#Ym@4_[Di3:hl F: L3_7FK>wt͈nigMPT|Mf[^39u>NG˜GX[ +sCy*3HFScJEI%~=ݖ~TSg6=(q?l@A"96h;ex,G =͛cFsre&IdM)JX!Gsnk4HV:H{Hye^mGKl=̖f9ԑ%P^!׽TS< ڝO8Nn 4-E='g+}EmF]tfm mInUplVڑ;CpN.y\eNBp:WiZ_\]}/K)ݖsB8ZEHpvk 2mTp]r@F(>+DG?&ZH1XFo1;s \]Kgvs t EYHMJ%kj1J0Xt+|Z2uo)Mn=>Jo"Ndm,gkUN*QSKlRd,d)^ucODv*/iG^W4U\ )&5NZZ]CQiq<1Ocp`@mNJd4qQ4 eўDtTj%  K^7>+AHUR 9}Rgx`_ZnAiH$IFZKJS'EXox@RF6qTJGQ8 Qid0MHDkU`2:_JFRtGO4FVDcD p"'KG']9OsQ| "-8Rik7'앭&d`6rֵ)KVRg'6(zO'b&LENJ sk2IɑH#Ҏ.i&ji8.&OĒCO FD B(Ii(zvQpD"M|HUag($b:pܓɦp6 {F"vI2YSCĭyg"$M@n5"PQ;15# PŁ8q Gr#Q"&i(x.9Qtzbs` vSPI=$XwZ C*+P4 ≭ZnV K"I#ݜqp)-VA&M8#{k(9ArQkk" D|R_? 2+(.{A (a\vKA 'qbxHX@8MZi]^/E$rR@F@d?uXg8oT*VV(lZA霬CN M$( (LyNؤGb&_2I@#.C!N64i)ʥdNjj~&YlmڴHP*PZq&ZMl ڿB$ цB єBAp@Hr 7 oNi8!@r7̼43I]\Lr͛@o5ۡna0E%>ƵspOm~PDB=W(~c`-rq'Bhp0H SCv=7(RfBm^uz#2_ E ?ZAb lS}NPj-+ ,=Sg%^GPH [jxM(x9 ' CH H% ^#%|H=g,߈_AV$g{0H;UMK" ÜE]@V\G/7pMT;#'yEiꪔcKz%EM=MUrby?/e̟֦ym j4מ%, 娩vQdgUt^^Ό2F#jλY4gSϯpƝAa14C#ƈ2dؠ=#7N+Wvx3"[~Fh&9? j~jMlqGm3dvk.`WLʮjiWd?-m/3&wS||}=Lĝ#sK:jvn2pY*~%UBIS)}5u7-D&5 {tx/ ^^k͸b\! g< =B9>S2gK w½eㅷ1%9d:e '7`iDtj"pk~x x5 ܲXgZWKD+.Z<;e1*ש,-/3XN_a*[aox,~yl_`%OT4@dSux~l)sJHaaIA9`Εm endstream endobj 246 0 obj <> stream x}Sn0>q !ġ5H C}@p ݵy ٟ0L?D [EoUe!NJcĠBo^ulv*|9{a]3u`D`E|b][.dݚM$qZEDӂT/`a8ދFT#[" ؂$ay@h'IfxšJm'??;SoC(\κdyv)au3]A8 %0#{1S:C9aVcrX*K͆. endstream endobj 247 0 obj <> stream x= `TյfIfL2K e!d de K64"2,ѺJqb׶5XU~RZTZPj,sϽs}/ $!P[~{{H@7έ3+zW>kA@f.],ْqG܌^];ך?<r]yތu`k[}> k}筺dyʝuwhz3_<&aT+|h={/;S~_ꂮW.y^Wxm.Iz/F{Mrgk/8!jv}،MuR@anAKE|#s,ڎa18SOuNK?.4kfð> q`'lB'wcr=@U&9Q *^%yN8P-dkanv,~;;ij!)zx ga߂z\owŠ v&ƯsO VA )w?4߯" 7넞:Տ[x VB `,` p\Jχ%ʳ< Ok㮅mp֩v['CGLyXc6c ,C y@>_^N|A b 1A bBW#\+f8gny"6a42ҿQ 1A b 1A bgؗ ]p=[>N<|/h 8?N3Q?O:!O d1{_UP!};A7 *+,a0?8<8^W!PCס4މ:ܿ}B#l?Nxt+ѱ1Hsܤʚxޫ`\m/t{X l 3/ջ }cA b 1A b 1-[>/{1A b 1A b 1A b 1A b 1A bE_b|%A@3Uc2\O,g%5J y Xk`\ I1}}cFj(<'`1[bGBL i oO+C%͝s&]YQ^V*).rN-rs2 }JIbZj1$.>NQ#P@laZWRd+90)rF@r1JO5YxhoP,Hs:JnkC2$Vp X9blFC kf+Aq(z%*CڡG>ߙ 4|0瓠q@ZW@_WL͎W%WƁQb<.hgAC`X Ox8{lHrݤ<1QL:] *N0mmD@qGAǸaMɚU͢RrX BQ) +o[mCFX)yNwY =ʤE®=vų7؃X~R=] @O KXG:6;EńAI4KM6Vi1lWvp:($Ѓ V%q-8ޭvopun#hTv`K0ʀ%N:͆n6mljiC~Xu4H ';ĉgPRe0lC CƊ{B N3l Gog/,hsMMfUdR,%E6:úM "u8j<&6 :5IM-,{xsc+{u&s:F0(`Pod7J>og۟Ҹͧ=d[!NsIInYL>8%GHikՑ=ُ{-O'H!Iv7 ?TOE."q"Ox2bYC<1FeE=>1 :6dD}VzsR (B*;yk%V%!diE.@ϙ6F 'LvENFDGbOIgxXaǓwn  ؊_ώ8^=:诧G G\Zymiś3alwDT)Fvk6(Fmpq9li3}Bi\grdhPpy,/:zv+KQ蜃N+&ORɒCWv'؉H8^C2w oZ@6 [FXc5> {U^7Ϋ8$U A#OO8>[z ySkIJ-oL#fa/<9:3`uHer_O sApj/u*:ꫩ:WSF;=(~ O:@$>zeهB!Fr(sz}v<L~TT:8&M8˧hl%=EUٴ#/hJeR6ScӈX| i8. pV'^ kHf/F*!|╸Bzk+D|mTt8q4`l:lơRӟR7-C*]'4j%!kv':HKTca\^ڇB{K |@'p/*xhO&0u0M8sp c|q“}9|;TuέRt3Z3͗'u-)r>j%ѣjՈ3y8=Z"Rxyy=cF0(dơUQFrbKik<ml<ۨޱ N]@FzR\N!NNGk}v?|Dn_ީxNz'4t֝A@WQ=[bOL GQl$A)܈>.eY+Kݸ?{gwC n3ˎ2JCH vw%x]g΢W-u(ї>lZ򡣰a\5 o :MI \ ̫6GM:|G(h'쑟\ F?GQXTcT8DwfTx#*EQᅨ|Tx.*<~F;*\vD`T6GMQaqTX|Q#*G07*4E9Q<*EgT B\TD7Ĥ}w=1F2zѷ=蛌!F諌 0zѧ}'}}aFa'ctѽ݌ftVF~~Feު9>V蕌^2F[mft&Rjj` qR 7"^x'^GALTǿ#FTEO~zS!г!amMF,ABW/|#$xX6 =a,h#lb +nvDF\Q !=nX'K$]n/V"YIwOӿ.-uҺT%5܍p "P vnw z[`+"N 靈?F5݃6{ ޅvl{$v H(J4j \bTȯ.8"/fq1~wJghw[n ?{_WSíT{~٬ҫ(sr`De|߈;_-?.BNF_ELpg j会f,D);[!lZ6\3RGlxn LGهEb6,ߏ lq> =u#eWB#.AlAXyX$\(߯*,Y0j5fhD"Mz ֻUDhQv &[5(iP%Ϭ2{ؐs.hB `ru]zFN>-/p{FGxQDṜYeiHs%8e+gRqQt9"rq\<[-ojqqt8:\+.NJz [dbLFOSI%\ɈiVD<̣3##,rYg#Wɋx?LҙC~1ycxlD,.iB|ݍ`AA i? KQQIcJQ*S"R.9"yQmފ:j }a_Sr 6/d#}DGLNw{E6gf"Zo2*yKM/q^EJFoŝn"[U7n[neo-7|eyoJ0͜!DnI;7wrmWvۺwV{ݯ$rRLG.P6upGV@d3Q%'I;+CM*iG6-lq6#Bc w = `#mH#te5%%n4 ~Ζ՛߶4SOO IG{le &4f-=2܂qjxiw :P[Pkѷ :nUֱvV1q{߀JϘ+/U{UO}1 Jzk̆R}oۮA8;{=[ZüafWz;n\vؒo0>Wm$8+/o$l'fkk~"VmfsTj6s\Y]df(4`?QtI1ˉ!CJ̔ SS 28όDs7q:ZJ^'|34|/}A3Lq>~qEmp[-W@ޛo&-l& NybgN<{B]}{b *"A DD-9d{2='#zl1x2$zw C܁D܂qbE>vfĹMsS 5*x#p(/FO <x"XpO{wvv 6 \Xh 4fj3fM7{F`djA+/<5[F'el= H^8s8w-N`mWt񵌟YϬ=35L~"Џv)>] f̆p.>:Z~(M*h0}ނO`p7NhMX: /1z넕m{EGW,8ֈQZkEn[PAҕ lŶķ|p}Wsp3Z؁k7[j໸w$ np÷!R2!:<DǸ݃#?pͧ6%$f%,"1,GrfXp1fzy,ycc)'UW;x&ZObK[ $Eh#p/Yx#}I,Opo2v~#W$00Շ ~GFwɿkxV B4z2H^0|ygnʿZU*stx ^gqx^~~V 55B"-, U9XwU+w_UkUg{Ǫ*<6 x&U;BA)4yܼ(+.,- Jrȓ\D'~HIXNq$e)1"RVZUTeRF"]%9 l5Ke$ɑDP[3٢^|j!S`6kLדO>UT[,Ye9N[jjM,I:p1/jFTGAN$}S/˅?N=9nSToiVj+Kgfe~>! ]߭/O d^iQ7*D?OvNRjKNIՕdrP_\$zSOvv6lrX/*LRJ:g5;ʪRSd1MTr9eBꄂ.ΜW8]`S'n>ItߨOfn\MZU:;2mq)s荑*cά9|gCdN(ŏsd.(dQ,Lh47])Nw,ySy;Sz hI|)%%0TYpd(BuH;*'Q0 .l]7V]-T+-s*\`iDN.+gbx)CmNJ2^9S#z ݃_Vʝ訬smZ`Z41Q-K7ŕu}x6:0\oAǴ*rxMDq\.B PbLܼ=\B N49qhyÚ ؊aqkbU~|\HwZeqU'% Nx.647Ҍ(D$u>Sk(0 aW_*O =KAlL"s3p·J"y2a7'{\dصȈy6T4O,"1.[aМ$N mU؞" 3ts/)-_Xo֦d;Ѹ~v)sne*M^)tު UA8TL7[4k؉еw/ݘ#rXH(7N $ Ӝl̙ktuæGuտ+/on,{0ҿs=7tǨřV $@1͞ƧeO?2Yf9 *[~җ9FW߬Uq*B3K;q*^ИvOjj~ wt?#åg$Ѽ;yc .XЛqL ,YOC#+<#Á\EsU!K\\q_*ǿ~!eO*9\B~gnET/~G2q̆r{nk}%!OäBO\0gYU)ϝfbu6'-FRg6# V7 QEy9.jFNPѨi <{13ڜIff/p?f5m7ܚ;:(/ J ,dGttMq;sttP\_jN}IKULwH|K%I4z)sx^! ْ,>q/J1j<5:u `syՆǧՠGnϳ`p{b ^5nWYH^",-`7_5 VIN8Ъhe[  `rXV\qVEOt5ȣo˙mJH|2)9\?['bD"Ss{`7Lwvsgw4GD5x;J$QUz(f#뙈/$*$LTBR uuO!ZzDo*FEڠ&uP@q P[U/J& GLޑ5'zm`;[_" 1/B6\M,&rqBK{t{ I|;7Ϗ;`;>%A|s:ě@^(6p`2j=| 3,ّ5mUF#KIOLeEOa AB< @+{P&A]qN< V8ԪmUp ێӵLl_eD'grЀN$T+ q;X?^; u4aM_7t}a;]zZ+Oa-nSx5KfVMyfy[Uf"Gꆰ-#Q]4 ddt_\64Aa5<8/@d^`Č!ɋk /J1AhcZapI?tXsG_GJpRHJri:Jq&;E~FLFJ(szOlB 3'o# KV6*bسЪ١,;L22n  (h6GIHCj#"?fl =u%h0y"}lYj)+ W V.a/!p Ml:([!^\58${Yrk5yܤr@1DLa :#aM Jd-bKlu݃߼SfxN  :S5. RW[.Y^ꏨ⌫F䋨*"|P!PCD :DSN) '*V=ar;rؚ Qk\&"i5,S#*S27ʋ-;åʎUΜbo`+sz0~yOtti^5nimcՂbF1P" 2Gl9*#edҶPKS?w*rXtf)#w0)g]ꏠ܎!DIB8[y߇`hϕY"2[*75sh).ffqlz/Hڊ(2~P0!Ty.&hl)Y*N,!ŢZոPӣ"dZȂv.UXF%'J ˒*W7 NC id Yƒ<ۋR6GS˳|` EJ:X5Tra-Ŀ/Z~TQCm@(MZA*5*%a]77KFO/&NY2mn!I~vIS- Izg#֍ ImۤOAo "sde!z⁳ϣ9&z^H%yzI9H^BR$zٵ^-~5IazzI Hm&^9j!'cO,?՟[ Ј<ܱ8_sNM{xg=I>Io>+*e"$ [A9\8ӕ1 }a ;i.ћxO*Cƫߍ a9 Ó]})(lfnFA'͹\I[:=x '9P3Ys, r1%-eB4H\OD3^l;|>g34 Qf<^Q /%칼w!V.hT>#Y1V㊋wjdR<6WT23.3Т{P'eCJ6|>ronNZj&`TR*C0K*_y{~@/#\D Cn.h :Â' eb|' #4E">sr_ Â>a̙VIV+[CGyt[>* ud~})R`1RA= ͋[Nwuv3au\T*?nSa&6\ ͜U-Sg@>3}R_ӛ+>+ݏrmt3èbC/O.$ÕJ<1DkgO|@+絋wY}ÝNk(?mȎ^ku0~R]/~ VuW>|y}\'b5.ƶv8Gw,Gk2ŷY8 5R(^3'QԶ}rx.ՠ v}gc|ҞȈ.ll?#0}29S/av47]zZVqE"Zp%  [l›q AZh,*5g#us9YZ|lwzZ.yz{ɾGTB-;gss_b$_ gϪ6S@_v=dHFnjUl\qy׷Yj: }0>e؆fB,Ĕ `!r]-ұ @x}o{UdRWvIt!xu|ɳsQA CE玕) \1op"ֹq(؉kmT у:뭌dҿngb1x y/ݠ`Kۥ%c=="vK&:HV{ K2t8Ed*f=3Y$η+GJ_'ds]wЛhք1[=XΪMMBGt4J=ӍD&PoWWo2oFuw-U*:I|⭌ԣ_ #z)q2yM.wg#Ko~hG}=)UT˅;-s)MPڌNWH& j坓Oy/-1O\PJ~6fO\fjNYthѡ'T{W?ov`-]ZKƓRTDOK sFmlT <zBO.AxDCb1d[%o_Xlr-Z/jqZ/n^X̠z֙$&Vo]@"P "F_p|NǨ'5FKP)4eh0|3p8B&c&;!8N[t 8f7I("sXO'_ݲE*ێ8s7$d&vJD۸bQpFΏks^4Ѣ&B G(Q}3x(HMwLOr+%l{`셴4I(fWܱRIQhm|F\mR-\~h9m3|j{0iAVpmcw_= >Ѳ˗$[AN@kmL=v 8mQOYӀ2MA(NPmY+LQfs~ܥWH1RPv ADyd+I6`?T?l4 aU>1r$d!IJS@ ʭB .o1CFi~s5TYbi{O̤ϊd3o:JkX+~=욛0w?C&"G()kKk#,ˢ1/;nkB#(65Ѐ̯_kkg(S$?wpzwCK!+D3V9)ik6!%rVz`_+a|zUz _{+(\zKDڦm~h3g.nr(+:(ir/."x$-TԸ1Q &U$a{(=J^Y IRErh^:'9gcUMt?Z *Ĵ H2,N*vŎıL`vu%ǁ2NxϘ_FxhmWf ϬN%yI|Sbo =SHI@L& e07wh0޿?DZٺ-+$;|5xQP滒 %RlG6HjCA"\IdAw{Gh4D5F%l<4„6?q]R (E3gGzs]mMR YO5;cmHΈ;z$w\ʪc t8d PLM05Xln@tzڭH%6#HRU@}E꽵yS!0iLA\{s oZ,K=*+^:#~妑@gߜd-bt&Sy:\q`K5E*ɶ(@Nc6b? ڈĮ8# #;#(iU#ɥDձc=B5.Q gY~?gDpQؙim32xZ|!׿yґecf\=b]2Tz_&Z&C\dѝ(&bE?C e2]cB6 9"7t!muJ(#şD6<0mQ('G_늬^TINO~%֮\P(ވLCi T\0`kLyb) r S?A7=:zu8^2ohYNs_oQΞɩ!/b"^;'vW5ⵂV iM T9_EǴiAƃ^͛!>,K(qL)[X"cI[ćEM99@— 0w&zҤ(peVv$2y֋);׋{zV6ZhͲB4mm95P/ߝmTcMGuu^(нK痢=Vjy{JNGiH- ,L6ET}-I_pQbӖtgn֪<.6y?5:f̖ˆ;R\[_y?Z{.C.Ս}ΰ_ >˘Ggbھ45Uhڻ^F(C( E"{Qf?LM:Ls'{;FzUR2KJ!, ^G2k꽱V(wZ·7sK:SMg>x5.ί2*FASS3;U+W\4rx z-'/y<O=A=Oj`pÐXZH{/kjBmy} K>$yY,HG1e3l#nHl*4lWdiz>T8v/65.1GXJ Օ TW~Wf<7F,F4 Wqw@36@Kگn(,XQjE \AFc9wW~@_o\˯_4ڰlԨ] nvYBklőK>;eŃ\,뎚<2JXrE_7WcY475_Da=ѰLPVBuq: g8%KX,Ԓ.[:`,LOedYy{c#=ܕ>-;Sۯ±h/vS3:lkK:gC$RМ0aǩYsH)|te?C^ m(""e]S7f)NKi 2*+5*ڻt͚R퍴X+07: !1tRk K,?7Z"=ES#+A(/"v͚5"5R W\<!6VOgh挵,n$:2>Ƿg$JS܌P$jR;MXg Yb']N ֑RKmfY H0ȡgӒU Zv uƖ`!j3QY6|Fhm8o.8o𺡼CŎ'DO8> g fӞ ]?հ@f]Yd l͵2|n(Q1%e#ȍ_6\όXxIj¸G)5By^QN'H볤ugvI}@9@d` ~fT¸z)ϊM> C(Ot QK3F,Tԁt8x -[y@}93yppmc;SPKʹjbvLWڤTE:ҔWSfS ~nO-Zj:@Wߏ-ꀿT 4{~2Hק'Pr#t~g'1!>iksCĐܻRc.Ͱ74dXh- GYH_p:p,Y^|\0Q_6zñm;?b?%m|~55 .OL&~} xSםҽZ-[d}wF6$$fA K$HhM!iKZҔ04ieh&nl66%kJSMA~HIow|?956RNԪ5ə^4Ymd4&LZԌ)dY@x}rYbntOa-_)n/KO)]>XpF;SLIh7WHOԈᮬEzZ1jYѣ~teey="27*G؛Y6Ec'iE3?"VA3^*u4cZ)mEJ3RyܛݱL`,i!Hr[mTǹJ=/ʩX@](8HvU3)KUxU%Q)RMopVwզ0,Woe) wdd4VgEᚍ.U+|&ۘo%\FqXH"l佘O*P(кј0U-6/K8G9nfSxi.[{{nyMU=E M+#+;L39!ZAZ)iiB,Zf$]v#Z_c_U|>=vcz_3<캹ⓣ7]xŖ'5^Q·|~{+{5=6wI_mE–B;*E(,R ^ĽߑHMIE2LQmƽ$n4/~dsqtg?t/V:̩_;䨎x /$NQM*u2k0#L̄qpeJ҇ZקUK%#BlɉL#`"^KY;%AiO841Ʀ^*hf}Tz I[3nڰq{{>^7aS*qLmuGyyT Dx8)11qIGl'5r.yr|ԅejŽX{]h6*뇆Wgg.ʸbʒuWtzǎeΚ/osVU/]ZvUK^@BHWגǵgI3tȉrٹYd4r t1 h5ƽa7hDZg[_U[oGK4ֹ]Ym+;{ϕi/; sf."LR=)iҌn6F/H ˏڻg{f;bc{pN}̠3=\w!^r_jܥY_8wh'vpԨ>\ܭH?P~FV$͓q9bs[]ݔZ>Vyuǎk/>k?JL$Ù`4I5zI ajMQ v7I57J/"J^`xsǹ/ho*P{$Ҧu(B,$Q72pUzA H2.tkf`{K/Ҳ|rt䑦ЌtRE4 zr)MMqLi* 6'=_*#G^ J)JH|1򅈖WԩNQcjuOYToӛJ~ű%;$_/9ƛv>[K!s,<mǣ\pP& 9W_Fӏ̵9$$<[,碐%B W? s0 VE999-$sɯsbHٖ-U9994`K3iٗik>c>&`o MFƗ̟p_9 <Ҭ}Y[f? _䐫]pP@ N/[N/^GA;3ß g@wp||9999999997s0sB?U?N$/iYoP{V%b}!%:іpmIO6+&6Mmm&k$_vgmgIHPkщD,E[CkD[KYD[Q^#:b􋶞ZFD@,6|m(fR' $5VѶH$h'OI6 =63os=63oq8\ϼ\ϼ\ϼ\ϼ x ? l$a5J/ F6*ѾQ#Eu ?MI黁O ҧ t0=b}@?= t}ʇIDgE3l?ZlfN1g}7&uֹT*J63= :,$fkQ9g=evYl9UNSd0FmFIO?DW8pYlӦbd3܏kW]'G *6j(G(P'Z[/2o?40y*f390֡b VFM؈gtBԐLGQGmT!u(< 2;yR0vp FnMLg.[H(֣kbq튓ô/vfFDy "<"nZ3 8ohUDŽhUspkcrM]S!4sƴbVٙxq<x;ŴǸ/@\>Rt&3Fl!wNۤ%n@ee~6s3 #">;j?Rs7^ l~F1E`4s^yw [D}Kf;A94saPQ=l;Nv bIahLf:\P{@iT{cX]AWU^ Cjr܃1uk?q]Q+ aP,ӧQLOHuk= nR;n4@#U.l5 .ߠ0Rv~ۧC!{P~_Eh Hn`BدzM?n@ c+F\<Œ;Uu1p D~j Kf 7[v]a8?8 bѭ T K=`iXpRRC9hHq`Jf֡vQP0W )&Xc*fа;HY y;CA ؂zL1n@WVoc5hH2IZش u2-bfOx!Su7#~d)f@  4.9pj͕#xDW?tV 7­CqOѦsx=LӾpz*J]FOa*bv;AO(umuxZ 'L+w^xQ0HWp\xs @!ف86cQwϕxJT1tP(n:KZ0L£ QAiăUH p>58S{.T?K$A7 Ŗ*ЩAX {=c3xՠ{ T D%S4G#$R uяXm po0?)k?.w~\d⧤5 ۔V!w4ϑtq'/WpGHhndb˗ay[u tAwto;@n2fb&]8[{%@&?@w?OKK`&]?]BtAtW,Oнt O@MLڽqt烮tAw9! A^&~t_)[+toнt{ A8 t[$KekJAw讦qc0 I7Qo7ܹs&ξS-1h}NGtcl\'r,Fi3۩>SNwOUyu9[u>c$v~V+hZ#(^RB"fY2(N'Cv:21(jU0%{Rqxq\uK,9mɣ<ʹr|#tB;]]}HqO/YRRbec$<~@Fh05mIgBnK cL8*$^pd9I/ m;>wa\߅&dI<7W^dĸ,!z=CkɒWLպBHzVչIxIM:&)0FIghjt26Չ% q:aJ*$!^)L+Db=h 4çwoޥ.~b,f= !L`Ǧ|= ȒEٰ ӗ!p:EBf1l{陓[|bxʱɡ¾GEFj#pȫcؿ HDsK;1~ZiD_BqH隋e'euys)끻[܍1БQ<&z)x[%ɬD*Ǘe{ڇ+ NTaĄa%S+VtvJ+^Jj@!b&j֑l"Q'#`+vjbC[D6KmO? K'iN!Gats [RA)HxA!8^)G;.R0bsN;f睢Tyt-/2 .AeqQyڔ0k 6e;,Qڢ4Lwvtz7S1}ՍLC\fA+*Wc\t:Ns_\?yɸCTCxu?]1QLB1'kO+Z~.Q`531s奘ʏcvkҦ`e~y(_)RC![{?^gv.c~(dZ/b~\ɴ?R?C! @[=h&eV*t!#Ie (q>_ǙDn1S7Yb-aˋR "!$ @lN_v(4kLLhr λ ml3Nf;dY\?w6Kظgם-z o(oŵEZ5u=PQ 5Dٍ‎fyDX}Ӌnθ1Q|¥Db֚ ;>)1W3Cb&Lx+6? />OO8B֗ڧw.ΊyǦVA8hZ-Ub'ЛfxNC^ElWb%$J } 15(_A~΃fKIu(%|#ۅ5{u L \TQC~ܦ?iNs9E> M\6*U>]\t\:amA;![l;__;"ƨ D|E6 dI0~y_m=Kki9\O(Zw/'5 >!9}NsJؿLtb/|Z]9?paTf9U |TȻW؛ >$D ]N1wdžqv;%;{bu\OrSJ0M<[Dt/th"vǑ G ".^:zt 5{q{E՜D} 6'U+DfQOJerz~$IQާ16{Ns ԟq*AӧD)ko7g'[l}B5Vh 9i؅iޏ[8HI: j'={D%ҿ2K?~H OS駸9girYjH)S$Oɗ%O\YR1J"[:lUFrҌ6*jr e-]|VS>=HCZk~%$\:dH-鈭( &p;-ƹ`rj"ai#Z}vVk0s|-_#=[AYXMnI^]ǓO6VNL<"=hQXD'^+EA>QoE}5"2 wDdQD5P`$hOڈoAA'}xOҏP`M6+NVxjHc\h5z|59Y3; I6ZC$w*Q߄%6Q-POE 2@rmۖR-b[oXv jP^?M+E+JA$4>ҏ@ e 2c+(oM˙:50;uMz5 _,ӄmҬ((m#u(jdQ:iX' k=.! k 頟Wn1e:>J 2'b^ D D$} =GeK_E|ء{s;too@bi~}v {e2r23Z23 ~2 *ɀ_f"gB?LeB7LVḂG,̇·g bo>|. _˂e֝<1x:mƎٰe6vllȞ(ǖSr9)gK]9h^kB\\% ec=>| YsOO|STOTȬ"TDEP?T2-^fȾq @wy<&Cۀ< Sdʃ/7%ߖg}|*@l '+@.,]pr7 ZطQpW{ aP o!l[SIQYA"[]qS+B/u(9Ŏb^r_A[ _)K%KIZ򍒉R 蕜)ՕbRW JRz+K!K OKA k!ʰv {x- aNف#e2 Q?+G,F9Tr~[.#/mtx||Ӂ<]F*>V ,W^%rCJi%rW}+J:oU ǯUn~\uݪ~V~UնjzCz[WCjL5} u5UX` kg &~jZ{tjn-pkAl g]}ʺ ?&jؽuϱމ:/w LfzUtzW=k!B¢ܲk!wƅb ,BgṆL:P76of {7lxm< j8ۨi44FD'D ~v{5i㯈ZZM&Ѧ2o5rat݄4nB 4!5@ yIfZk3l.k\65iF6h6sA8}4ooռ>ٹHQ1 iq#-[ڂ=rC oeg b@ˑ-彖󭐳55u}+:ֺuV[ZO O[B[f kaͶڼmlBہ66Jۉ6 s۱^;rI{^{u{G{o;rS;loo/[o#×avX;t2CבڑA?%m|nǮ;xucG$:ۢWӀGU]y{o27!&"EL~RJAeZRlUDԈԲnJqE 0V@""c3{?7oh|2sϜs瞿{}OwuE5c5V߫V/F˪TC[ ^}GoNjhj\jB IzW ;Zz >TJ )3K>S)zi3$W,=L|BL 'A5-iX;ASMi!/ JHCNXSZ#A/W3暚5mJ$54 ry{ DW-Vbl;XE^UN\ၮ۠aYQ{PAzj#uN] 81a H]d5 d O~F53~Fy$Vb\ԨbƄ a=)yIX!O:i2՞"F,*d,[ke:f`~D? e6 y2(w C3soqoY?e8lsް[u._ իvBARn(=,g:R6؎VVƻۅ>_Oq6 k`aĞNeQU}VJY(b3I*SD\DT^,^߳'reL8+k ~׹~7wN_iKw~/jQ#M>vM^'_+Pb%=8\"Aay'Mn4Lݏn+6%,Jzݞ3`=*GxW37) lG\L3 `Q绗MhP`rh9Oq3NA<787}li76N~i onj1Ϙ Қ?/-xJ.GpjwW+TKjg%*^ 5̠,g#2px ):z<;8_@a.jE㒗j`n{X͗fב9LKЪMHHvYd aҩ4 b7+Ͷ il >oG%L#Jp8vhv 'riX \}7h*F]qRO:ʤW#>]JN锲h"v؈~9`bbmٹdb{1M@C ֚**!q))sFYyQW#eH^M}jvY &/Nx &d4x,&;y)e4Qr u2?Hw\%M-4iT=,2jO{n;_2/Ah)U#6ݥ3b:vަXw'>IKý>t1&ZLiGjk'N3xFJKk0F~wu%Z|]2a)%+@WaKj87]*Ѵ{vs Xs*%&~EҎVb ;$-*tH{(2~= `Z=*T`,no6TNf0.fxx=s,^Cbz8isB̭eY?&vYFTT[TnS@+K*e|QM=:6~!#2pckU+u û%Na6Z/Fۈ>] -%Nb6wWlw6yu{BUrUg}{7rz$uu;.uq_$#dIaArf8kVբw wؓe9x2ĽDĨOm}Vyr74zVg͝wfjMʵ%kG]j?k?Mhꜿ̭U^;gWJtEYO`ru`.pcFjq,Rו/<8J.NMNf]d-2JV j6N^*c!"S""U ˭PY%ըWRiYF u(Fa>=~k'<Wjrqu*~>\$;fCYG< 5n@bOr ff: 9*wLY^1{i6,v7; kX)tfVJ.FUaƑ4EΪ@2s":djQ8E"0S؇=<Yb4 {'ZG#"\}1Li-+U`LV̆JCƙoqjiFC}Jh^AVŞ9l宺zV]Supc2KJ9>9gn-O3_j0nѼskqޝJ1(e wW2žS9Zi})pW9>#ZK] UQp}.Q<ILx xxH}S1ߌ4].v"2>oD뉾[YB|u'S|.f#DеumM1$s`6 fy`EG""'"g  +XT]m)4 )\8• ]-&'?E./h]ѫEt(Ft8sή7[!! (FBI*ʉeʹfۚm&AAR`=d=D:j%1u[W NRjow0H?:N#>zJWUBg3 s8Cp%%2iwE>g?L~+Y Y^UVFg }DOIO{D !6o{S||w}w?}V[?t/Jo(rLE0(*a?Q,TXFP`1)f{3 g79X g-1!x@eވLHFeeɁ0jFy'(Zìޏ)c{euI\x,Ag8][ PeN6'G_ b}TemLߟ9:_g59Of^pނnHVO-| |~ |>+>*>ZQ|`ep8E1w#+;3oG}q[C3&o QhGNw8?>SMO3s!=ܹO  bOAgpdr7owP) {{`}{ =Da,=a$*3 cwIffmf_?@2Yl,;Y _/ؚ,|mPEg؝|o (C\.RwEx@'|^ڹLR;ƣ wԙ[i|ok &uŅ>bt'{)o9b~!\|kwZ $օhc@[TS)dҢh%k#smmU> stream x]j0 ~ Cqà#eúlJfXl8}e/t0 d]:g#yc:C4€u,X.zVAHm8wnAY\"mpx5~dk?8P#zWfSgXq;1B74rj~j:Oߩaߊ}awU W"ΓwsMD o9 endstream endobj 250 0 obj <> stream x: xř3V~o96IVQ8l۱?pNᕴKZc Z+uᖴw򆀒@ MI^(핆mӃ/w}JrpNf矙3+aP6LW]g~^ƮO,`ZY@@lң[P~?˒{_oZ@m@^~zhz_DPJ*`TP MŠ @&$S~ B$3F3ȇP'?˾_!ݹWy޷Zy>t4iT%BoͤVF(c?B3?H#1c^̄=[zDω޴TPP&hǢk tС?^t{O7K}dG{|g Cgv޴{;EXG"bY;y*g׶^;p/1R (.vddZ1X]*m1c3o^='_rm7͞re>=O2R91G!N P5&96E:\JW1J@F_XN 1,!KY]./_NeZf>al\WZ?L 86;Ǥ;57Dyq_iܽϏAzx~[/_1+;uv+yVFqk<ib͓y5Q|5~lbFl`zָY5X kLYݗA3P'PP CPG>Bf^P0҇Xkaìy55X5+Y#5U?zwz7> (ԧ%1uiiMx{00~0~0 a|@+>aWXb]l XK"k5ϚcͶfZӭVjrV8|ճw_.1ӷ^7;x^ھ82lo-%x;JU^uuǞGp]TX@F{`tq:Zt.i_4?uvfB=lEڮbQ.#// µڋo,=nB1 DT2Uj/2M}V{q>ù3P"z7|2T5f4CGw;PmtdOBfGhi9t W(w;Ag4z7 .;~HVpcW@ه'nd3oWѿ'v 8'R!e `k @,s @Ur8w31YFඛ jكKPex;I< =[ Z'|)y Ӗ½V 6Gj QZRu[g]O P> ܃GqtG&{3u!hg"Wn;AǾr>?Ԭ@z=ܳrG| #60fz͌q(4aHEpjd f$a(Ϣ砜F%r@%!NJnA  ˏ!gኸʄ|\}{<(ȘBo'3$-Ӵڴƴt5~t6X32s2hgCx=#|'z =,$?!Ą~-=._cZh oE_Qn9:]p> Nr>A|#^,5oE *bu3|;A>p ?¦÷ 2rMOL»>מ[fϵnM#V6&?l9#g@9P+z]aX2 K .;o⒲*K%ۓ\ÑJnv".eiay+g.)[jiDbiEtaUnNl\88h:Eu555ٜ3Lkn *k$ NQ[350.ʇj++_  @Q!}'V; xw ?MƎ~Qvq^ͯW:eWef<7ge/ذȶamfVU}d0ǿ1 u?O֛ӹgǪnL87'UrUdf87.XJ~! NmGW+4+[KW~q1MpMGK]m^v_e'(ʥxI]15JK GGKF޹Suoa;rMښAI5Zj& YU[K7kA؊l<1 [Hf+,ŀDoncQLAȻU0bpU&iL.(V]=װ_kezm9kkk˫V_9[==!VqEzܷMMSVؓ6vv:n&T(mlsO޹s}mEC"-UC@M`^wU+ef._Qfkh\ܺbM-[ٞbly/=V˦]gk6ɿK6[Y8x沥}$>M*~w/K?$B,gi[}ΔWXd֥ J"pgv>ѕ~79/g]Ÿbɛ,!i%45 q4}fj>68≩}o8p;py~nyJ,T4N-ic2Cβ6(ܝ4D>\4=N6"1[[Skr칂y'?5N_a/a9eE;w;hZx0[ u@A<~YL!j1{ld\vsur^4؎A+~;mS7Mq7M\>j33 .6?#"/ ʛJ e_e;6na uGuؔcFa ʵuX@-E:lEp)؍g,_M!z ) cV.د/i+r@X\Cҳ  *!)䏳>3^'j(i:-UE QʣQJY t|kjn5Yr= 49 Kq^'J%d~M6$ k.'*!E eE䨨 v kPhQJ R!0^pTH,LdT@5)W> a# %Uۜ"a5jNqHyTI!jwfq|OSvO (AnX{:ANQzD{#28mZ=;L%%uT%䣶}D=x$H)$J>B<ٙJ(QQr1lP!.XJ Ndk 3ߑN`@g2LF"^%Qpϣ=0헽C.Yb*%)%(  d lأ \D ADE55Rhrȫhx^ԫI0 {6c 0" ZOS=pvl&e@hC Vnj`]j@&1:0xjIA*3,Ib\AD9l!:GYUI4w^g`8@6I 7"GY)da֧h-Dc"l'.ISh K(g82fHVF uD3$s3z0(A9)^َha`C i>8vABNj`<8qKO MFDw 5 *-%Z u3 I[v('1QjT6vgyA 0`a=T \uT- Pj!XRb`1 5`hq&V!ѴKv&(HT"0[͘ NG)D 3{#TD.ih~/HXkRaQq'WMƽp~ PL 1Tlx>+#';/c Dvֽ#fURiKgs.)jK1u"4KS锍hRS}ޯCDޑ2$`& ͌s<坺Ax$ln RhJ>0B ,taQrCH,Js9Sb65ZBL/h=jtAՄ!c$joeJCǍI/vv˲~~/X0ǩ|tMjz$:,'815e:W&e&֝9.Oދ9|l#!{ޥ]UgRʽث"ܗrK4V]/uaQӭxnLvYwEy.6ˮ$J͈!7@qS#Bf輻$΄ZKs݂I.9 һQikYqg ?IU8u`gɖԜm4†i~P "7u kJ5p?Zy>[Xd+)Ls ~Kɖ2͎ͷjbܳ]bx';rԯ΁"某nIKb;X.L/b4:m )>{u~>úד,Je~oHջkN^)P ᾏ&$iJ?~Nb2yE4 $.ڒtT"㋭$|d@BgoКK;;GO+UITԄS%`5l$qLm=YþG* .Bnԓw(\u *AjL5$LcDOv ]rްNjΰAOO(-#[&I݈E2¯'Qѥ(ۊғ?/`>DWHT!+ 8.)V A6E$X` endstream endobj 251 0 obj [ 0[ 500] 198[ 979] ] endobj 252 0 obj [ 600] endobj 253 0 obj <> stream x{y|TUչ&kg tv4C A"CE.eQ:H'AMGEDuۈ3#$}<|~߭:UuQc&dʺ>PZV1z1sPhŒE*zDvVyS-#& 8 NAM5}_aP2;[~rMUH`|fN8[ P>b (J:,Ɗ$z^R0A^vaNuqPoleNy26 >c֫O+!̹^61{n*P$qD$N%b WaS@86;tG"FWQh0V) *2r1۟YwPJvǺ;TPڇ:sx= ސ4SO%/V\\ :k/pO=4sy+- ~g?7!܏n>)QLngD]JxBIi)!e~c&PBm}4uʓh 5ppJH.cݓq3\8yINrt eb-FRqn -hyW T(.ituvݱXzV ,^R<߂}Єv*Oԙ@[P/R7C{P( bf.vzoozv-<[ qV{ j_'3WzvW[Aq$?lfjL9bxc~gD>2̯ktQ@4?<͏)τfWq1c3r:ms1?99'{Y MQ~w<<{I0C>Ay)[ ih!wh J?w I>V5}+\U4<oN,_?_U6'Q@b6q'G_ 86ޓ*yfZzW-j'*GiZ!i+4 Pti/=N7B`p'pwVβ|/@s#iT@n(ϢS_ƈ 0ަ#|#/ ~^A߀^G?i>sڭT"lU@< PB8Q$)&0oC&|NHF< z]/~ThC@ebۻ3h%ygoߊoX/59ч9. G* ǂ@n֌kzܢHrIo)m"ka{ Jb-G@>~b6U;\#k_[ *z^ !>m;&/D n2߈hhE]Cio`SS^QOM^빶VH5GPetcQP Xsԛ1m Hӧʺ-Riٹ ]נ,C6BJ{)VRSF6R|/! V;osʙ:+낰im=^ T_M{'}VEJ|G*p]v#Rҟn* GۉfӋ%^e([f-T:>QYaulyH0.pNz+f;hQ5A>њz d$`gqW@!6"Lr+/p9-}qG=_f.qQ\}؍ B@w˅ dz@< H:#|qy4W^>TO69_c,N`Dv#tXN8N07@.`p]-z-a; `-neyr^^Y Z7yE췁kId ?r vy?# A"(L 8]I4S{*D%d`4KIn*W7W~A&Cz7 o1tZ;>-)V_Iͧzy^q,LHHc-dX#)F+:a]"V&>݌Hm.x4J =;4_+ #է-:̫vJO*%Kd;eJ R; ?!}jDm3G{ڢ<##KER'c3AH4 \ P IaPWo7g+qHMmEDؕ@$J@(׮ֈp TNV~_I=2t_[`3uQuޚV ȸ {¢vh.0xwiosN|P=9G} 5>}:l/|H.#("HXO/0CBKvNp;+?AwIXQ8Sy/­N`$/xfcm_tt.Ww #%uN;n0nnz^Bvw)оI-&o-y x[|30W7U޷輔Kj87VU'HJdǀ(_f.{197˨up9s]Xg| >'"a]ܞo[y|Z0XV}ʲ~Os$z0Xۥ+ !W'^17oM,h&d4G06m ,`U#=G=?CD@D' 6.8X;4xzE|)`Oy5Wӓt P t+! r ]V+0|Ө3"|B[w^a+?VݽA{ZS77C~i7p1J^:/ n8>E }e|L?fNCڢV@£nX|3(~!b gn J_έ],}ΩN,_Ya>*#jtPsCjfٵ3@x.R=̃0Eo^<go銧S $n&ͧNsƧ~h=g!UMnitaI~8;db;w sݫgݲ2]dvvmIN bc"#,a!Á&]Le6OZGOs %r)(P46[jf-gktdEL[9R5q%H[(yΫ(^ҡH`+*yV;+2.(` ږvyk4O͸oF3ɝ,2Ys_3QkZ9{8xiبª_+EE㦔 k|-*"ih3Yc|u)Ss`6aJ#LREFЗcnJU"0ۗ^ZX К] @ pZNs=`>58N1>볽>2QX<ህ*ܥ›UVa;aj蹩O }xjSCK:tjhFsrwNruqrvqEaL STha?_Ov3$oKިs}F3۽@Y|rwLoI7lQ4@v3-0+0#0=m4[asl0f;8vJ1:"]J[vL;͂F'J+Ep`Ͱy~h X&DQQxO?gQc1ޓ,t{}I}yݸKِED̙MťOI[JKrs#GZ A/t^~m3XճhBikL"PNM"G-,hdTZT#r 򠚂Ȇ&H#lGvD?.UFvI] vA͠+̾lfmco&,U{٫$6ئ 5+8h$_.2Ga%̳fIU4VlM'}~TZٌ*W6IGe'Q`zrY=QPG Kꖻ+ GG: JwutZ ʹ]zkkk{Kq=LCJaA` TV<2qN$Y  UYyYy R&¤O쫊_9ОUYPBs p/g oP[h1PY"BVN~J3K,pa"Rp1eZ$/bd>Ƒ?qbAoDI d'?d}Ka}}GycIoBY/~"78iL\B.n4vzLOUFf+1<ޓmKs_A9vN0J1m8:A7pW1M7gݍ1e8?KoyNѩcJafm~aCTFXA m#\*=*QN0T,hLM3f 2F3THi,ՠʩ'hS]͟50v1-t+SG>N&DD~4JAg̽yN~F,ѵCu+o-h7w^}숣Sy?W$>46W-' )̛H7gp}uLwSdj42WAh;vn!X2_Mӿ@%8^UoYrM^ל}l󞖘o[ c1^1RQ5LsU:GM0G'cù݌%Yz et˼- FocxK֑z7c7N swW>{xS :9E]/C86>V~mݢgQzL_n"k~Rܥy3i~[KAܖ5-/l645lq'GOcB'sǺGaa2T ze~w4+)(fa# Qܥݍ<>Ӆ'Liiiuӗ}:%^k7x xWxV~Yb l}y%`d ,cE6YOBhu"e溜b88mvDӵ-F}0eD(DyǃqvP[o&Yd'B/LB{zp 0OIGq.9Ǜy,ozJ^j"E y"oHEMg1t-TTqQS#E7^ >Gk2[bJK3_:up0/Vp-d59d Oeq/n9Yoȣ1T-CyS=O6o&d{Ŀ귆P1.{ڏFaon k9MAnk KCxn"0&N[?mq ky]ٰ#ǁo맯Wny'mG/Mǽ:^jN;;>`4ucii,-/zpC7, qCJ+!wZMOy%b}HjinD{U4>8pJxuDhސRqx({B2`}O4MV l=ɤ˄FA&$4!P=fmIHKNNϽ1<*Gs?~$Ȝ:D?O֠TJ' 4ӓIMI8~$1DDHpH=ÓEx(kHr,P%-%%5͚Gշg>}&7fn N"Kt||L5[,#X\`]ҝΌtkFcjMb2L!J&EdRN4:%ZLZ薝7-;;88DJ 1X&a%OO;@)ݝޥw;OxwϦF;ƚY[ީ.nmܱQ6M֓D:mձ_+6<3||DlߴNs:[>OxK-fy.v)>h>w9Zq.sxi3,̓"gdz´-"{ݜN XIؕ%tuE˖2GovrBBr2ly3)1!yK$Og.EEGFi_EE5g2n[8uѵ+LF,Ħl6e%1;.11>.%)(6%ôFhȰ"vRI(_|%wH+9!3^caK#mpvoڦ-sɃ͕Gr?B6q{t/N(t7!i)"O ƿ)a1G=4u/ U?i^=ZՍ|lٲc OoR@!N> <07pNa;JG **B葞$@ $1 ",׆{Yݵkw}Ñ{9;ifR+M]E#i,mp Cwst7 Xbu\up`{z{cuZ>ށapAR;)_^Sl5u6fVݻ7k3x7lf /V۾ p 3Ccp14I5{[+޶bcka ![% .4[/_&ՖN Q tիفCϩևPmn܂_RZ5ܿݼͳ%.s*(ٸzL6.M܎z{AH 7BYս]׎"+˫{Ws[=3m54ؓU8̲g; {[48wb)E 9EԔRDux~ #l}y`B-1oD"iJh^1$#2@WK'`/ ԅc&:X8:5)Lă`PX :RH| G&$HwE(F`i9))Q!r0WziZ{ʁڑy2۞hA)E0Dh ~S4YY8\HLB$ɧ%< /Dr[~%Г"L.7^V7қTM2 !VX)~Bm$h q bGj0&F!'%8EHHj M)Jݤi-4#{C}@#kE Q Bl n@j vʯzrd`6v-s$-#lZ R ғtVBJ*A^.Eֺs[xϷϢ&m ڼ e"Jҫ2T~ui ^(B9{P|A iL"FV><%qlm&iWV2c.p$hq`훼vzbR27{_.Z -9*7bVeiw&YIf~" @'c¯ XL/kym[4iHdz^Dƪ`/"cy)H*BI}ۂ: #Ze-2>}%hٍ*iuz6OuռiHkC&rD%-fj)|:"&W&[†U(JMݬǢӎdf:lKEl:}+_$Юx=Zdq(G;^bg]e]ɚuSZR\A*k;U6IB^*C؉("V^GFɔ%p@(y xxgd 48ڙ(P0ԆxpєF4M@EAoGppF$IC/MĢ,HK;\ Nk%WDQY"hq8r ps>?IM|Ɛ f~V>`o8F2&!b8!K4R!e%~h#_(R7w[s, $ +h>JZRDp7&c`.؈fZ$/\l-uƛ5i.kD 2I[rf OFPl$1Cbk AVWc#xiF:|(3UX\&W*X\+j\惱R+W0X%V|038qR\%+2> (1|W,RAJ| ɕ+IT"H1"J^-W]"PbHPK2'1qQX$0)ы*R""Z |"N D`j@$.( 1yuKJX]4^RN+UbOH  Rx89AŋjX4S+R ` X: v^$  ֤*$4%򢿐AR#"9ȨPuf?/A G>DA !AhrH/R[D@GP%$Rg%-.%3hR霨(3ڝXĒc0vR&Ibb}S<8) hILH$b`^R2XW8 R~2 8<,1Nb8$3 ec)l.b)iܔd^4 &qbJtbtP}Xt:h`8vB"Ns)\NlKNр3vDB4A $2(v";6JX.#.uzl?INbD&'RrMS38h&rxP!1dHFHh T5"xͼDE. cv-rFdI#RJ5= iyӋ8ϡo;kιιݶs}īmg;Ϻ 뵝wwwwmg-ϼi;n;n;;)@넶} =s[<[JN2&I|Xո)نJ VK8ްTj%[|6%N,X6[>ijR̪QF4W=Ng5m{nG/_WVt9eO-o/0B&nٶz]XyYg|[g$L.X2陚RWyhjU؆?oڿU :6ao!=Kw񘲸W?Y@W]BpSMOȅG3|(~6fp;>]W:n]/$Vէ]ox =~c9o7uiؙ~Jm]72!ewCi9y;b_lƀ5^N5lZpExnG'v2iQց p,rsI\ɅG~>^AGjdp}U|T%¡33ܴ R߈\W]u7S[lY$ f,nz8Zd'._Z=%9o3[Y,*}/3ixyUr|xy9%EڳK*%+ U)<_8WP,U䫋4<kv+p;<ӒR8,W9Y"#ٻ}m)?_}.̟fX߻GZ+e@{#KgܣɥSIdy82'5:NX/ !/o}o"d'ճ,v.x#V$apYIaJ M<$X:Ċ {o^cqp ýR7L蓺tV>UQQ[S+tc+$KaaP0 G_l7{ޟ|}2=sBMjf~8F{EH?Tfu?fj4XV9It_q|XweYCNν?v'7V[߯8ц]o^^p1]X%kLim_{YnM]=z/O?]k?4N4@߽Ϧ@Yo5%x-㒵 yKN*vj&G% 3vwJ :ٺ{罚^ 1ƌ2Oo3|F;/=8+ V\NUciW¾\>>ڱBn9pz޾̢-(oY"U5%worC`'ŏ'ۜ=ܖa-+,V36la }Ȃ~:sGW'qEZO{g+)./k5)cj,WFɁ;.  dmǥ:Av<9j qc=2{Zg˴DJoCcntqa;6lfoϓy[VJ 6{-g&m:iꎇwd nN.1r3!3R_8T%z1l1!m/80q.շK|ZAbgLuJęXk]n bv$l$jOnlLS͐((}G]ˑ['Ntݸ;sՐw&͚r.ZV;Z8iI z?JnO5n^~:%wж%|λ^vz=3|cű섃,\aTg!ǾMZڟ6DƎ)N~f̆?GIqG ʑߛd`ߩ(O+s:fm2nvҤgo{\8X{@<}rlѠEKZYМxVN|3l^3":'r 66Ă6"tyրfUp0]‑*z8e6 rfx0폳'^jv&O\,mޠ9<IGfy{K% #d5n ʫ0͙} /ں2!oƦ\utpTVpqwُ.Z\!D@vhgd}5k $22uGLtm{Zř+yg.]^}N{uQ;4(mWJԇ{KU.lu|pU%Uhd~Jڮ|cRcn.pPU5vQyqGkB Ѥ;VW_ڞdU~ثtp~W;X7Lzتŏ*ew9C;ǰk޸pjRr粭[{Y]ͮ2n{<׹.+Csh >cŗ\g*׏8Iyx).apLtNmъnb\%Q˕L7i?uYwGeyfZJm]XЍ eo x`pP_CvZSZܼvԹ3o&BߠgCFnx] +^vHcȃw(3c*Cʿ!~4}u^i^שڪh3}{]?.4KNNA|e0PGS7ʾY6tꨳ홼sG?3_WJ}{rM1~8`ðK)}_4_cnLߖ1xUJݛH(jeBK9yy?Gg~aAU߷|0dKh5ExSvnlΈxV{/cٵ_̡݄<*ʎs? xٶg_eЎauQ)]cbÜB^5E,/mw"E4`@Sf՜NsQhvBd[XT6iWjG壖/:GQG-FOZf5u|àxܘD__YB9%+VȪ:837E:ulM+~l#KvHh/U=^|)=cr]n7q KQ>~B;-VʚݟͦL\7FOqdح^̌_|'4cìn')@]EU;c.me7 L?дMȟ0#e=u֙Q-"Săd:voeOŽˁq \g䭦t&ZI M}+ԙl-|oYӆNbw#-ʸ6fo,~MPA.-=&#<8]q[6^ ?l2w2}(Kv }2M~)?d7D* 7PE;w/_s^݀ G9*ppB׈8 endstream endobj 254 0 obj [ 586 0 0 0 0 0 0 586 0 0 0 0 0 0 0 586 586 0 586 0 586 0 586 586 586 0 0 586 0 0 0 0 0 0 0 586 0 0 0 0 586 0 0 0 0 0 0 0 586 0 0 586 0 0 0 0 0 0 0 0 0 0 0 0 0 586 0 586 0 586 0 586 0 586 0 0 586 586 586 586 586 0 586 586 586 586 0 0 586 0 586] endobj 255 0 obj <> stream x| |T9Y3I&dc& d% B6fh&m@$FD*H)Ek_O}^MV/C( vxg,l͋J-Z@턎LJ^v3;m<G]΅?c*^E(wk{~cxisM5^ >ڀ'xzV7<M;K?!v(-"oG wTq]0O@?h㎒K+ң#*D*4n4t!^Z *ބ)؛{r[9 ".hCW]QU:/rq^3]'SHxJnw^ߓ޷ǝhF_^hƺ_3~߉ wj__g[!|Go<QcQ~}sz;-,5~.>U_εxīR~/Ťw!ˍ߯~]yo}ipۍ_5~_5~_5~__xϷD6ӷw#ȆTH2PQ!"T*u!'jCȍz:mFOzϐJO(Kۤ; "?A(YqQ<];&2; pDt'bmϣWf8K`Q_EK+ %2( Nqj8sqt#, `^7[]xB~羻~n[n޼iz7t]ujq6pU+ ukU_tIUeɢQQKI~j.GA5jj.K_f%RszlIBV>20 %u%˛RBOk~/B+C͊QÕʰEuYo3`ZQIՒnKfPjXZ A#j۵2Z/5;*qY~D3-Y/$ɯβ}~l1Z;h ;;tKp _N#Жtš ޱ|w5ف_Qo?a1 cA m#4$@K0X8AQvж } %xkc}FF(F6bSӲ~=Yˆ8t]%Mim:8YYKqfje~$}>E zL Mg '@kjnWmzW6ڤgI~[6K61`2zƒ%pd5`Nuv\88ܔϪtYʛaJr5Jf+T%cx@B^V쏲FEײ5X8iR&}.K xanw8fqKy@@/)D*@Vm 2kJR +lB$t{'m\ g'99q$\hi:FwTdoL߾*KY+@ҥVsTCep6}J -h 5 Zca 8-O2ZYȃN^Lf *.'INj{Q|7iBvuJHHsYD쐚',UڝĹHڭa@Ws _+@͒Oi(wGfc`1}_]I^Zm`DBOrѹ.f.;ˢAh!ѿMIs}VC]Ͱ,HF\v'%T1@]_cX Ok)VQ@4~.y q-(OU 굁WledY1=4e1]7ˈ@?,6 6!ℝ4SvPRTn=h(dxY{t">CKJ9NR\ ۵6VB4X5@|*_gEvj+qRAhY*4C5qaey,s8lO1jne 5h1/ [#55v=IMvYpPo^̞뭡 $&5&dTQtodV혳|ګ#1W&3U1sUq sU$}>Vǐ5dA<6+s ZCn3[V eQ0hn^63( o͔|볘l@-GRQY_Fl9h !# %Y%#kg6 m߼ɖT˚E)ԁ9|;[`G{ilЛt/G Yt[,P "ٛBtQRBU譝8@?FϣЋqF }&A5sy`/ 3f$$Zx xLh%:7k~~Lki#ehᓔv)thX wh.@-qy 7oc+Y?kfaHJB #Gs#pkxv㋁@m`,W6ؒh8OL֡ &ldbIIdNNvYՉ䤤Dvӄo:w{x=w븩G.rr^6='|'ިawEY"ľ_4_w yS56sDϔkpNJkўXVjw2@e|N\avNd!)1.9Qɣ,fL6|~Lځ{w&'^ >ak{Cz<ώ=.As~q6P%'U-_ZBZuBRRHQ 5Qd_jT'c_N{|κUSj1`NK+k?17 Y[Zf[NBԉQ:RPLa@SDU$j 0zvq]͙w=@t۶qG*V4 c=6ᴞ#O>y'ζϨ.d"YAQ-h#QIQa $>ѤW8F.|)\ގwx0W>cON80jKLQ'̞7:ժ$bG}.'k֬q B+(=t6U y_˩hWZ(˖dLDݘPEH;V+6IvSbSih7{+.jl?Jy.~OFڵh *Q`EWxHCVAJ0(u #j̋JS[/Sc!bTqH3zWqOL@k"#+nKY~`8 W^;/,xޓ}"ɤ*<m`&ے`dɬQ X7Y{&5, TĜYTmdHrj;+jUCOo_Tjx{.jZ+B{C'EM{ = nnw(ES]RM|ۏ>m7wotqb#:Ub- VD{O$ #,')*9cxUUWbN, KFI9zڄn>_ژw xxy'O?y>|Ss5aLBTcR= )j/lcb=1z4ߒ#k/,h\aJJ2g\T?[v]6&:q ̓g;zi!3pf@&'eؒY1qd4t9rScS܏Vt/$)m/OZeť~ iڲӢM^uQZ²)q'r-OJc/{h4D'1ΝfӅ#918sfA8ӽ0)wTo\ ? ܓxt' N Hh9T9ɉd`JcbPIlIE XIN<|u^߷~Vy7 :gҕ{xO8yғ8j|PB9(`X/DD!=K"`?˿T^CS/p9~營¯sMA"əP$S%pNѩlf͟Gږ뻜-q>:w 6>W`w&Iɜ2ǨuJ^0GCw$d$&g&[fâz\kx)wc {`G{򄼦stmUM.->/爦r 0sy zX77(+1oFk1/ܴrK(-:\@c굷^c'Wءu q' Bw<͖ALE [ $z&zcelR 3(+YK'&={ۉ_ݺw߷7p?k',н飳{ضwSxo m=Nh`:i:-GND?"2[o 񻉈!|. `QQA&&jw<ԆHRbrl'G-o߳v-h=~O>Ǧww޹g 7}gΞΕ{sS Vy z~ =57 zaZzB2L'y[) ~Ha0WZ| 0dAE(|;mEۋV.StlhMۥF:~.ҬxfEڽر]+*/Sݿ+ cþ2<'NH̄.cCH߾a ty;>㡙 VgS8߿s'e]Df!uk4Q\YLs璳$" iJ]Q}E̓N@]py8}`*EHR`bMu j^Sğr@_dKe!t_.j׵-U7t캫ul5?|NKX[w\hV]59k p [SIp[5nyf\&69m83ү3,~w#RI(e0S'jQ(AwhQVlms 'ݼcw'8ٝ[ͽv55557u|aP ꟅC]Ucp6]rm'FJdpvXy㍼Q9N^\|?>UtcIjmZn:je&+ӉM\^ \\hRjMHL[뒱m'CBPtE%"،^g%=!rn= s\Υb^茖M-ϱuA@@uԳZ=Ek~ z ;6b>/>j9W(/%BRGG)KF}nݕ|9«ڨ]'ѨYGgnk*x:i|\GY.\+[&]e?if[=!ƙ]T !=\j'ʞSDKὌڔ2:>&rFo(k=4o_ؖX3EoH[ڃ#Nj\)^?o ie%#]LVh=4fݔ/K}Rtй+!rJMĆ-tZrhV2T V*-* E_oĪ8e&GcRIh[JI#C%o+#@듹S|)vˑ91Iu6PZd,+8sm"8 g6M.z;gZhX;z0r~)0{.e\)Mၖ+"]!YƈqfЬW s9aa&[މe$uŝ XY2깃g[FXSHhSYWM0;Bm[H:#F]z a}:yϩDO9"VMD{.K5! SKe(\TDЎs-܅^\FkE=<,Q2FT4"{O߾ ){5>hg+2,H\{C.zUkG{uNȵfN;6+yM/il-fyHu*E W8e]k楶 MWﹲ׹0dZ:1Ǖ^LϑXQ~QvS-3ht)^qńr%硵>/E ÔF(F+VM1n5H9Y+%ssɗE%m뵡S /ôѨǯ-rz INhxs-> N40R- 3V@`\(.IDۤ[F`7vU&Ñ%mR_e^5"tqZa#ήV-zlpWR|\)RY.sZDuD03a*#5P2zFd|VSaRF9``hW=P!sDR:P]B{gd+zKKcr)AKR e֖6B%T+:R~l0_H T2.PJm%NK#tXBmEɞSD54RGݙEuցAgpQ qת1ƤֿM4M4i$/wKZXc$VRk!n1DAP1M?SΝs,;u /)m3Im1y-yrvVfz*ngV'Ӯ0SimC,e7^-Kj}s>S< ]c˽3ןKў}x4O_~WRޟɫug$)W̷]ߪbn#)?45Fm(? "@JB#x0F zđ80LA85BhG9I,Džx0Lף_~=k_p a0πnvDŽ0bF0 0w*{rH\2rƁ3p2E@ | ؔm !5 נ19A bNsLsL`N!sC]܅\ ]Ԍ$@53\3176e&<C0^B'_B@:,Ĩqn!ZZm+@ X{| Vd#;Ȉ`^vG`wq "o'ĜN ;;y'duBV'dEH'h3q팾ENG^(>b^4Gg6Eh] )Z!'cC̯ k1bХ+`}8]Jvc- G7|>tn ۺa[7|m;khwr4cXbs1)D\@N=>3'[{QW]/b @ȵr-1>'>ћXƯD|H6߇}qY!,; Ic$EK"&ؕd~C?L?:Cws5np59p77HAmkb`L~KKo2lxBRkl8:'_~戃B 5BoIGR)#^RKB{*ҏRk*qM%I%TlJEn*y:r ŸQp7h51;Yc5Yc:ǑcqG\Ʊ~b!~'3g<7&t1&"g"&DMi"&S!+ Yik9Xaoe#fÖa2f2qL Mdv2O!ק{S)3<oSm M6wS;FLi74i4rh:qy3` je&_τ?_I 1^5{,E"d6?H< 񟃬9:C!‡чч1}}s\K\y~#NG1<<8?1 '9ܜO/SjOQzƣ((> 1t>F>#'Fgp3l5?A잠NdΓ p x?OOӼ4qyN&_F3{va/~ d,={"zc1gәDG:Б,j.AoRoa[pmzwȑwX>w;d|y\N?`O_b,Ưb@}KKYy"=ټlr.^Mf2o6--C21ȳe2l<)|>e2gw9˩𵜞L3W l]ˇVv%k%.Vг`s9k{ `Zr{-s>&_?o~LެQuXG>O+ze@7O6wr7F|ڈ?g#l$(+u#~mMM&z9'n"闛u3vl&ɉ-8[ȝۊg 9>sl%dblc6l翑lLJvN}ov/S.8;b9;;'$w?]qy vnt&v#c7\Fwnⱇ|ڃ{j/>{}b|ù}RL<l;?Gvz?_C님_D܊E77 |~oG|CM+qx*&ϋ񩘾Qb+!%h R8)EW)JG)K>y^?'$NXOrO9rl)rdV N1QI+*|"vUm/'=I!gggcg&ϳ:痴_ 5tkn_]_5bZb6"uu;/O/QC`-9RK׍oWGLȳ:r\]&e26\ӆ;Mݍ|7{<7ssϫ'쫧}C;o \A7Wq^H6G#9Hm5'ا5MD/nG4fЌfίbU*ԫUj*u؂r8O k%7Z{+zZusZyZt'Ԁ$#Ɓ_ޓxO$$ O%`p IB!it`@&(X `@=Pn2xY!@^S`9@ a`XoV!DI=>m m6-Bl#U_$G 1 "B B !>!p83B ş؁xv\ dv!=#p3`^#q NpixD%n˄oi塚 @ Ӂ́A/ QQ7컗X݋"1B`Pb3 @E09;5#%R䥐˩Oב76EQ(jo4G3Mޏ;vj BqG=;gxi<PHX7ӆn6 '#g2L!SȥTN6SiԴڟixNHOK|}\~ǏB p[2'S2ˆvl 28X ѿU|{^9`'o`ϛ&o6w]c}f1zu?bRkld-#ygw%޿`*]GW3^؟k 1OtGz݀ 72xoV[SƟ19BXcv/O߅M7adE>d?!~_A?C?G+?c5ז :<θq1?'Kq㓌O2.r֗?_ImUQUԲ۝p>9l=^g|~j"{/1ĸq-:uZˬz7ݬo`_aȸq&͌Yַ0neʸRD$x4 4 *$1`l^;@ h*M)ҲN*]XCn-```~'8 M\ >*T0 , },<9Ʈ`L|nn C: Ev`kf zWLώ;De @! zI} [V)%v@_lr\\&Y|n#Ge'·5^{aѷ]rL{d1xaFJ)Mgl{iYe]g {GK4Sff̬gf~E"j{ֿu+7TykssMnԴU1$MC\uߕ;_E2en՝h=W8[fP~7Wbú+<oU#Z_.6q"ޮ+W@Kq"2TўKlꂾbA CT LvNQ)٦n[kWN81$mRrrNQdTV99"wwcK,V۷Fiv7ew)((9|6hhV$ՒU*/R-P$NK6 Wb5QTVDatt]]oxxT~~0yU~=Pw@@pX;+?W[zƾ8y&餉^46fCe4ebw;ugq]b=iӥWn޷Ñ#zGvrwc|QZZU 7B/L&ȇ}f >8s7cDE+y/YV93Y/,WL7,9G.J].FD=Un2+hrxձݻw;/45+]bq:aW] FPQFђ_ b=Qj^XjU7dRͦihIc֌?wEQIzwիB^rWY}I-KޮhQk?(,);5:wEѩڦ&YTwUfX-tFYRlRroIN d$eS WDFQWZg )*ں9Û6͒ t~oL=*Cۢhs^53gNעc=1X>\nUu#y'* SջS,\'(T9`QÇ+vnG:T^uh euD{8a~X tӻ.]*-J}eaӟ^ ed%u4jIӛl"Q֘Lkn(ؕKVa=ۯ(÷uwe~wo TS߮{f;"ƴB)7bSvI)&~:,uC>m|Vq˺ԭY2 ӝ,әEYC`1sr7u;c ҸѮNJ*,̔!l>jժ}E^׭3eɼ@xzKHxà Ru$\whYsS4vرcSƊ/w-?\oNi;}JN߿Tse<`@^6`+{X#nȁC48: T{7ҧz(U,LPY,k~)T-{).ɚ|yZcPrV\!:P}AnNɵh=鬪8ܱ!ޖvmk>ʗe TW͑#&SQQr Mtȑ*+ϑBx,-[,UcҮVejOIY1+Bލx2$H۾HZ$ZikĿ;cI= ]xƕj]j`6_.?-ݣr~t8盛ƺүKmٲŞufP~vղTZzMbߜ[S\Sc2֪LA> 5#tt޽=#_?qZg -&,UYYyTeyQQQqiXjVv͛͛SZǴrѮ]dYpDFuUIVxEuɞi|qҤ7nb׮ 8i|&)l=_ɪ;'//>Ƣ[7߭`Yc(.6쪏c?UU \vEU6Mѐ"EҪiռN0Bw9r%$( Ή"2R_3zQNXw}ULlޔ{&Njō-]Yvѣ ZwV=nPٮ;W=phOF{Z]ÎoÆ %E)>)5qzߛu69Fի4 J4۵go]vTkhk;w YXZ %rﶯt>wnӓ[KP:kꚚIz&o͛OT:gU 2SPr~&}@KegiF=y~bτVF"ZOK8m5| 7K~xtC.FI\e]$m UNKR+E9sl3/\WŋnV^by5Q,k^'prfxq0y3<]U."i$ Lywa\'ãW6"0YFVLߕ x ttó%HedvM0*N8:LSF01lذ|8ym0cN"A2Tկ7`qe"Mchʑ}͛y%-b,h]*[g]lrt8[,|inm'.d]+Z;&یaj[ v_%Fz\J+uA "S+`Ы2ceW+g3LB3 BaGԓET=SΟ?_F8$.:ҕaQ:g4$yH*`kI9tF1 &6СbWNQfxzAbMsJVy֨VΙ#Aaw Wؤ¤2K=29JR$[\17W9z=6ڎ\9rqVTf#44-{&qf޵}t$U* ㊅+c]ea{NMkjʢؐ3E,I ?F1Ù*\r,h\Ctpؕ ={=U4kՖAb# O(Gڼ EùfqKq~7cn't%TT};|2''HIN({ e(:K4Ԝ*%f"K]tW!F繈DHCUUC)kP{Q+[ JSw3i"6&xW mN+[}ƞ`a}$4i$D߼&Cv>jB-m˻vyneiuJu*ys-ĭ_i6]8KW u.SpL0Alb„ݪ1kJ|bΒ錝eqRe1p}c[.}we]JŅ>Kロ*s u{LQJ㵳 8ˉ…?G̕`mg\BS^},D~?,?5s}^լZ{y1veկDݸ( (_ݤ*>0 nԗ}ul]pHaUF!ΦLa{[e+/n.kW==m^nikͲ1OtvNcHe Clͦ(gG߻|,+*:uz-C=a"-gUkn:jժWzԇ0';AWOq *"!q|=[f>ZxɝЧ&/sy5m,rͺ(Z jFkRj0M|y|iߙY4i7_ZP|!!*Q5 "*#wf/Xygg3=ﹽQr1-uuu_g>drh]tLhhf= um֖-[ 1 -|nZjH ǨQxiصxp֦Ml8r$ުh@V*fxCH=EW5\Q,X`V~ɦOX6M%pKW9U}}` G*vDn)@@_rg68¦Xyx|@%ŰR6v2,f.`0sc<%DN xmY+Vp\)>{v%/-^%ؐ7TTҰ,55u˗?G̥YV3d+'[B #/677_F-AKEt],K'[9lR~ņ(AM,**J GA?::HVI? ݧ]lCo[OC(tbp5ۧ5B}N %Bݏ߼fuZ{ qz)!Ķ^Ԥh4#bvv|`(w 466y*ya $^Ø<!MՅXDgHBi]^YF3|vģ(O\ 7ħ s "^):nX5g- ef@劲[QnZer ^P&z@7j9SFXmmƌ$y|ǎuXW]JﰯFVTjoWu,?Ј,K`cfX  j;Շ_bzu3Qӧ1(FaYkryw HĀL28$Ղa^]k5sq0Yu5<1=F-b-vη:,>%>4XUAћh_"!v[,b+T}h{ - -woܧ _8|A{Nail̴9;]DR,--'j'z5G^b"=Fzt[;=SGٕ&vbGF9^;!L)hrĜ7%ވ xD+'_^^츁8tje|m`Zv<]e9M)B[oXA.8a2$_=T@ˣ2W 1%!l^UQDVS}a}nn>/膀v={8jٰyy7*fe9]ϸExƆq|{#hlfA%8iր`X¼څ3Ӱ:*|` _mn%K:EcxP}5q5"Zo׌wA@!o G%%O ʤW~]UU]]vA3͙>twB/'Β>3Qb*Uhh@Fs1MPH s'o~GUŲV5`pJkNtg" *lȆ1':;eHڴKJJ؋IIl~}&?Fkg-Ȁ禄093.lXfAO5I}WSټ@uNN528'OSZ9HɢX\<%QW_c [laAjjjl$RgekȘN7U)qۘc~MQa ޞ pf8,DɳIf[p.R%zS4%"[Yrxw<G0):wQUTo7oy /v$g9fwZ,8H2Ƈ)aRGs'?E$=om@v~ Ν;7!RbBŋg[< _wDC;92rJڙh|R`8z>+ "OWUX3Uū} m(g͚5^$3{+++gNVWy8 /ǧ\`i_~yek6c}6cYpn) X6{ɜjժYꯀWrHɓ#jMY.L `wG)@=/9 B L` kl])|آ{D8D;vZO,`CmL~9}Wߘs踻XtJzWZ;'& IQ;vG<2dDg'ȞJ!V&]ZNK+]ibT{G]1Xwˀܰđc$*)7?Jpwm xa! L/˞?g,3VZXjks|'tD$#/_`A4dX G)}tl̈H=tf q7Og 4d3sLScZ1'\!m߯xڂ. m"(Bd467 +] bj%hHEcc{T.h t IׁGOw(迠֒lBq(Vr)Tz?`!y n`UbP"ҩv2F٭27[$R^"UVOr ͳxcZ%d]*VI4V W8Šx׃6bT9kxmˊ64>`l^_A=໡zV 4θzERZ覊 ?>7#m+nŀ\..BvQ׉̨C+y#& MMRyxy埭A?-J+E%efw[4qUtC8޶[eLFڕ{$[JfMTP!$9I;Ÿ^xw:{0TjI$Ec"yo=Exܷq#3LKOqh,SGl6^#=}Vvvk[305~36#={Ї5i"`|X+[\MzmԪE#Io] C,AU*p^Oh[eS"hb5nܹsp unܦ&'1KHE6f5]"h;䯔ȉDA=2Ŗ6y4- D~GlT Tsc"8qw ep]vj}&UXeS*_U&asF=\rޥ=m~  DC3AV5]!9sr7gxh14tCB9俧&yc 6%… j"nj@Wc.{ [ s`5x8ǖU4]zzt֯Q}kDMb0E6?ٖ[&IŋF_PH/nQAp joB\LBxiWH0i2`D6\?ߛ?1 3љa}ڙAig>M0i_>c(v@M O_ii/)JCndBցDQ57O1/ssBCY{̤1eeZ@ycw&3̷ 6ɩDaHh4~3szoTWUt-n_$a}i|1=S6;YEHh罻,Fh5[:P̢oX2tyv@ 1[˞3?Ƃ|snV8va9pea6,.zAN8`\aCEE B9͞Ym3++mmCڢ1CH^ (_<݁M6Ba 6WRlJ*/OX0a޼yZVn޼Ѳ(CC/9r" `M_ .L;Մ|nָ* )Yd=S I֬yFT-45bQR1gW_me)s<*)G˜E˿*3Ny'_SΞ5-}xwj (?$$=rj#@lO~´]z+pNvTth[\eXS"s". \=PVa#)):p+YFJ l@pd_w7 QQaQQ+S`? *(ꄗ4@(0A/裍`f9 MmaE0 w?뿥­9jk+%:!rF9vw h3S)XP_2UH;jx8:S:H("bmT)q58&P#lik7Z$/O[e~Fj6?z=6٣7PsTK"UpR(RyD66R-TIܡi$YEz%%a_jxjE&+%h3̠ZX ʒ5̉z1!#U5!ybRLr]AQÝDpj8]kv${NlOOن~Wq|+W8 ;> x1scs .q :e0Lnjש4hԂ )3$%9'\ޕ+ݠ:6{o^;v|O`mIJiZN q&rǜc;βDZ+-I)(6u/'rԀS0߾VQ7w Sv3pӸo ǫjk>iaݍ~0@X$O3+X/x`lsNڍ -8h8ݍ`tOp{G`~}v~h5W^>UK~tZY:]1tK ]\\NY&O0/p5%hF\c44U4r' ϱoJU#r,+lBBh, rTh6G50B%$EaеK(5yhsV8 'ZZ`^2xVT( t沔 =?|n9wvt}3LAsrrJd85G~V9enkď}dϽ<4b=fC)z0YoI5NaV-Z0A-/'abn*E/7hb]5xʅt%ȡ}$CV}thh)ziXU?*v-Wvv兎^ Z*pHC]|\TO*X L7+Q%@o:q~k-ZShњDĉM/~5OC)eI7~yLby1^{vz֩x 4j7޸IMX| vW{tJ<v8ʃ\;9o=Ґ.XVF'jH/0 !Lfԃ8 {}=ōn<׼_:,DDu*]UUY2D4j)\ˤZf;XntZ73ȓ?ydz݄_iXãaQuZ^CٳT\ѡg%ii}&~cX@mm@D K?uFyh7rd\~ sda.  lfwMլOQYjfX2a6:{7Jr彳=~̡(jy|(VBF@'r.+Y&S?ϚM& >_OLIk(UgL]ZU^1ݪ(ˑ$wv T37 1UٶhV'%б999Q`U?POT!lG$h:`cۣ:E$;olLeЪXgeZZigtuowi;/;gj9v8vfvtVV+*FQCL}{';sw5|޿{RLۊNsم_G%d"7;*8 _rhE ;##pf+V4k4qfzyR'j -s:c`(ߵtuzXTMM-U:lNo>Qi&#h*urOτtc)q&m6QUCѠ1er]Տa8~+:8eܣ~ =P}]rꔷGhдm]@s^7`v8TZ[[/Q&--ԡ7vq'N%h~IQRc$9HsJ5erɏ^$Se_*h_RyL)ׯ mv@LdieX[N  tETʈ< jzSTԟw_h5- їGf`5J>\TWWWk :2ɅHf?G zɺu 8C_/&Ox Thva^ ML|,2± a =)`;vMLp!it$Ѥb>2 "kj̉`P L'{t<2 aTW8z@5҈lZ,rYںavɜ4yΒD5دnyВ2K1qD+ (f v\`mStws8RE3D  d#_BĞ%ĩX[GH 9M\}s<^?1 y{.x|;.$򿒶y`_K=^ u/]aw]R2fNŏ׭֓6d'MoxZ_=s=|gPxWl\[wb"&<ՠzs>1mKR/_$V1lK"3g>vgCg϶/lMlBC49s3 ts'5u Üp6#<69YTyN2SMNAp* l6ix96 ݷ^,ffqDT8MU[&F\vŋ[mo wue.n[WԀ-q]]f1:[61+&;yI*ϝ˿K2Nܕwr2t{MIQgJD&Shcb ia7nGo亂l%#6plFNdhJ k̠Rͩ7Lv(}x})J 3=uK%(F8K O%~ DSv%s ӧDGm􁶐.@ ` Yb{n'G,KF'YeDf5g$}JYjbgqh bɛEQeQ\0)EKŴE-bғ%%vw{;UM^2LkG5g-*x EFg9gJN IPƺZ?BlLՖʅ,Z:47 EXPiQ_vvF}5֨ĨBII b;>pL>'E8rcM-fy Wh չqf>0%uD`JWRB ];S{ đj =ߡNԡ)yO\ܔuPHt_bS)\Xh:z=M&a@jca0nOON6iFRi#w_Z~7Cw*"tCQ/T+r5.uܬ 9V(9|p{7>v@+nz 1!ɺUʊBZ%O!碑/Z%30wibzTEEEO6>##<}+jfUU pz]-?[6;ada4{ҌPO\մ=q#5`7)杨F3 YVK Hb9rXMIʸ}  tS޾}bS768i6SUdg~¤: n9ɇ*y0]E 2F>?(tY֝@xVwJ=>O}I(tdoA21Ӫ?-,n3_}U<̑F͛pW%I;Y\J|)}UMs!j<*9^s;=+HtopM{cI;ȓFNcdS-Y\|ŋY`[sysP)jM4j9C=-$VUuIyBx'PZzkN/G? +r )`ߐS_*e<|[}$/OiZAOVu+'ۺehD)jnuel V(_)+ 9…|3eGV|qyQo;ɻTԢQ:jq$:0,% xd @3fWY8v 8adk^S1ɨ@͟nc4s-;2+U___<\ܼˋqc&ěn񽖮k{hI_A9cyqWRȓou? ۷1Py GBLǨW&A*6}ӶwcTB5;z5:^jXjSY9bk˔57jk+"ΚLn1RF# /7~o9vt?ctUvŻdȇG'VN|gTTϗN?e#ˆY_Xcm>S|:0WW4*ZfAҩ;r:<"!R 4rp)<PbM9Q?F5,5l^KnK5XĨ7 R-5û \ \zHƻ*'r'(醋t 1MC*UCmɞ+HHuј:wn9F)FNf4JJl% 'Dbi+vOd'➚9Gב,L_? KU 37lIt~= !qgzr94g9@¢* ONٰ&ъ+T3^L<|IŠx?\m(oȴPbP|;ƨ/bCjO5=)g6.4ĻƬ{+̐'$1  H&t:>~6_gIfx\o,\s(jOIQ| 5!̇,(;8a Ք)ɔd"@S 1z;#`Ec?Bt M&SeYI,qh_O-cMEy5˝_[t|zo{kZxG..\q^Vr AH~ՌȨS>J.}u5&$ZXگ=?y挷?{0h4h'JS3̀1}-?pj59 ": rrc##xv`H`8 @+ݬ}{5R(:\Q+FA? Ǽs:?òcvBN S$eZȁV um"fNGqE"7ʺN՗u[X?NYw o d3G6xM#^@ͩ*4 k Lu@k5:2Wj8biB,vgWJiua$;7 N5oA4y?ʊQhc+11ʜqAC:eiPi}r!+ -FDzß?MUyly'U151YBڷr1r3afQ ukko=`SDe1`GdrYXYˉ[EDʶwO7aS3C L'1v o`N0Ly3,#= n;f b3zxH4^ձi@7WTa_fp KzJT#@όD]2isCmBSQSSO= @-9I!$/F.|.N]}WDY$ʠ\YYif@v5M1Sݻ7WP+qNhe4Hv.X˩꙳Vs{Mr#%Sv)b/ 77P D2eC} CȢE!(R`^$ |DuDBYvQwaix;5} I3A1f8|Iӄ%39r0 Ylسgg}b={x{ЅRkXM#Nyx8܀LF`cD3LiKa YDNHK0O FmAk?t(ȑCqӓ@,X@z:7KͿ֜=KYrwX˦[X%l`'XVK rAL˾8G2%z:w^dx(H9RNjjjt (<Αtlrj/WS1M7,;>rd !2:qE~<2:O0J{RҲZFf6vGB$"dQwM2+^O2-jLEKM|$SsN顪g!sqFCkKa`8cG.vv)T\MPulP''dwTV-z=lJ.﨡 ؅(4żc# (+!\ NߓK7}etU5u9xm+C$n¹vX4?xȤ]Lq3fhw&4&M.'qonR:Wa/ZH}b({ӄt0!bf91'm]e%^q#]t<%$:yT,\Lu_:lOgV݌x˰tgar9س2D0J֍p@UVLݲ:X -2L͋R0KE0"k`s۹guS1:Coь&o %n5@n o;T3T)Q(edA@ w\NQ|Qjaja+ htVnHR[e38uzB{G!>Aw_^ܘE(/ t-2;q}R}V6i6(-ɥsQ0%MIXC6>J:[ q1QF.kQuSqƍNŽח'}V;͍:;E;E`gHmd--ĵͫ^SO=U.fs;zرebQ}v;? af牐0mdgS43m)5X!x axL%IaA^_҄4\XeFF~Rd̶QT14?nٲdU\:{lܸ cٚy&eӍMĩ]ɅkInc[v)P68@ 'kIU{W1l.AfTA J;\z&H of|Y/'HlUi( `31i&.yf(ᓠ(AXLt2wV6ZgJ8+MLL7z':*\{98\LT\ҷ{7?̓,BU1~N!Z+hVqmm1jLt/ϗFL)uWG.CsNin~ J19BL2^nX>emǖ1AO;vtnII3~7<0ngEó2UOt(ND90%620I=0O 8lnp2UNQ_C*裏#q}*g<%%EMFmoM0~/6}x5!%;;;y{~^C'/U4]d{GL,uxczwwP'7y}*ײ׮]N檷҄v4;Jh?w~,?Jpj=ǩEo^+ӅzeWO\j^uj-<2㭙` 2#bbtgw3f[UTZkj_w4>IIIFkooGǙ'O~'3 @/HG% jj$+OMJ?]J^&/WTxr""M۷@7u]d},_[ƒm1(!Ymڼik;dͼIW{ktueLIjIRmt&$ 8[dac >^,Cpe}}.]Le׾ڏdww<^_o!Hʁ< !qI8;Y쐂Bɓ0gF'S݇l]y`!aD1=`As|8h>'ފIg"PmMUeHEv2 VΥQFQ>R@t-};[ͼa`)ꝥnghAF%nyhllkM/Kf(%h+ZBX)j>RwHܹcW[(b*SÚ晦c柢Z jf N"U1 Rn5\>[)}E,֯9Fco>\% ZLY7 hSkQFSԃw} ZGyIKz:^s?ժ܊"4K gA@ T-\"w5Q,Pz0`ַm5|3HUj{YxQ5+3dXHUUwB| ߢOabӌ66٦E?Ѵ?{go$O}:\Q_f?qe"'+i0\3ߓrȑ$7f`HO3#tԮ[ Ut]oᣏ<6oȖG_,;y29q)hOOK:h'As=3X&\>Ҧc&iֈmК;xِ-!oxdD8pp܏Qȗhwtv^ cU3.MaCT3M'ϻIXX?ZE[sx7S7*/\YOeNס̅]`B2OILݮTbH -$%nTݯO>=~<,^iT3'I*JUuvovΩJUSE:uFGUk5 JpV)W7`RO7v*%gΤkN&,'f"{4j"=w[VuY୩$/u3)Ͻ^|H:UViGh1nb. \ݑwu,J`agnXBy6fN߉]U!t9@̙XUrVdjG+7;5\ܹ)"fhգ@`@}Sͱm՜DLmlL9{ZgZpuoAk=օw|DhDi{7^4h=1y`XråJxm_bԶmҥxM! ƭRcAvD9v8:zA!239TjzYZS8 77*Y-?/YN/4&&EߖQ!XƦGǣ4(VƍKvWZiop-xSJSl|L_zTbvGIbֵH3$M*^1[~h'PdP:7%=Nʣٞ*mMtaAT*Ea_;[&[}9J?wr߼LF>Db`mݶ=hv/V` vڪq61WZs qᡕex\^="X. E7h1V7 eMgky#JQP~s%-ޛP,p{⿞ǪVVhE%WF Nri%pWo~mmm9gn7N+}z˷\،זJ`ƌ;ҚD;W?62)d4,Ֆ ^-$HVe'>y/y DZdtYsr"mTd$gLbwR8CTwg['/Cyt6+;O(I"aS+W*z}pl G.qZ`^Jg LѤ/6D;iMy¹Lim/}utj/*J!Uظ ַI40^JЂP{~\ps=Y&MJN45)<ZԤ:M3(Ft;Hl/ĔXbI^75Ry%܈ eo$&8Ewqm7Uï<ӯ}J7.lX3d/yt<v?y[o[SI%Gnp0TB'g5kBU-9w*Aqdg76TҒo?⣓J|EԠmcjecW?0&m.%N4ďD ~F;ױe~xu9~ x=t2o߯K8n *Z١$'֤J ZIɅ C{UuuHfe-;h**$wd1ON6WUU'N$OlRQƹVpri>0K5wQ5eҙZ/j1^hv ;.ji PQ9q:k +KnLW.ilY;:}oU 4e$4e[elFZuK|\")5s6_V/0Ƚ{j%}`UȔ'P–htK[V^]׮Knth Z:3Z3!hy<}~UBֶKt%Te<(>y5qkkYBYzєjӔt"Y ?+KB]._ eZ΅cɎbF d#e4Dgoci|0AoA=;H34/֤xF+9wCg[;h Z>-ݷX@d^*=V3gA)a*@o0 [5.;d2(`OVkʛ _;}oNg)x[!h#pΟ? 55{1ҥ5jYs>Tc\ J[E>Jd)̴Ʀ*30riҨ !7'ȌO"rFkt)͌>jNJjQY"[P @JUV>peАuj.M 72g.vm۴r1fK^\NԜ:e˩Dsi^raq:9(/7}Z.*]]=d-uh[W:_'e&o8{\ZV4Ɏ˥3ji牟'&wA'[U eE>A]i" %Me$S%|41e3o椤ǤcICǑpXC"p/),ɩyl^xj.DڵիW_5 b&Σ ׆o}6~l^pï̖Eެm]bNkS2N4/7:seh7hk8(XUbR/g hj,5v|%Ҙ[BW:K9=jTcyԔ@ЌbA/]“Ծ/iKKIjض=_lloي۶ŶX-w/mɇOQmݯ=Z|}=E'Wl'9ײ Arظ ai,w|p#{gR\omNnmC]ߪ꫟^Fbv$ ȖWGz.c![[%b;XJE8uؖ1vH x`ٗ[|bm?Nڕ xzYaҗܾPz͚5Cid"`?e^\znr3* "HTWNwNW‹SU\];As4O+\3փsI}Y8WsRH4Op܂|Yf #.WO Ч}W^ \?_>L+w<q71?nxDRQ?R\ΪETGfy# )ïrxx¹'p?>VēLJǣ P,^yF~k L}":g~,$,TX<U~X~Ь8pASz>`sU'U,"-o@ӆ8O+8&حfჂ5X)YܟkK4i m/A^ZIZ:8+z8/GLLLP%\âQsX"K=B.VXsKlzEwF XU9I!oekؠaYJp >"(:0E3{T馛eH;Iu$S0х `sim۶֭[Yj9*N9/,hxiı "uA^8pqTgāggzq ~ӊ%~su+[:qn7Wf}Tv^}w?R88~\?WӔ\U{:pQh[ˌ% bSۏ(Q:"Qx>4h!2bd>¨P$KU믴F1#>5ON-_hmz/%Lixd^`\C18j `iE  ~)O}(w7Í߅itz ˳7D5Ԡ㵐jn[; VxUx$:qfNY5nSNjsO\cW[dR7v.n2b |ޫ0z-w5›+'GG'MWX䬫dx>7F1*\ЦujCoC_O{s5tLyn,"{'&U77?3Ϩ#n]H}nm\,pG@\Ԝ<'5/_V Y2?2CZBl F-spR%шLJJ-o;(4â ndHI߂H*}M5f ä7f$"W@$1Ey"%Su UH`x:rTWE} ai3kf9%>UydH )HX!AUvxQU)@(ĿkZx=ɠ61N;7P#l73(cV!}#5P?g~3PI b9Иxɷ|Ux[-Sm5(\k+! GgLf=?I<|nbzػ"OxU+Rl^1us\j[U=\EtVp3k%S1Q*?9z-w5›tWI$_0*Vz=*֓40aiRB okK`xa=%Ȯ`2+7(6㥻U*g*±SN=̈́ѽR" v{/ߣJK*7XbohmUV>I$)Q.| # ɧ-R6 HIN;̻G9K'&ڔ.`F1 JUdM4"4(]$q">Yy`5(ۖ A6hY͵>MT*4?ڹUʄmayp--л*=əĒfu(R"H"h3ߚ5j4x)B T2KKZZBSbTDY4Bc [(=r6bR)0ۢ%[X{Zw XBViE-RzWSBJ؏5j;9_ӽ!{|޶nb~PMgP q(e5F荅٬gA)ʬQ))95Jȴ_k`g#6#Xwѝ,ΐDDؗT#rIb=l pT<6viآ)7͒PES^BU تq#VYW^1 `fFM#B>tRnY 0T&Խ]Hȝ^)ϔ$k@u| .A\[FNli؅4n삍b*""!Fk#OPo-Zb ЅE)D-,q uFR  |gX[& 'bntfI3` @0PKJ؟Z$t~tF7ۨcD])l blRG`b1֋陘 뙘T*Zz{g.;;mPt5UPcFƂ4 iFÿVkË8k5j({ ԅuߩm@<0A*јOX?'tlmۥAȌL/VNs:.Ytc.Jc.Acb b^h 30obd[j Ǡu2(b\|`pZ E"  <5a|ǐq# q$x lW/cՉr<t3Cvito8W;x4$;3;gxSjRp.aKx^J׋*aNs8XNp0t$0|z{h1hb Q N \MLkZfd|@Ma 'zL:voNGڂ~ <?l)|k ?xו`X2A'3̄/1+'H<эB݅rE!@.\PN~Twrpo^PsT3B*ZNʣr¨LM=4j2r %)H3ȣ/+'oyx4g9BF"'ztNWMm[6<42 ۖids 8j[%Զ(Hra"' 8&SG3Ena= d4Upm13htHҚQ#IoSŌ} =85J4ju#r]]N ǽZ6Zu Gvț5Of%4cHr\)=vжkIԤ.M}H33LҜL^& o8ggVuFY7YJt*9g/İ]0b_ Dqۥ5vIAqKK+0®be4-fhZE=f4S4S-ݑG@<"c'O4݅٧Y4?\E3ͫZsjuO21*5 ͳ)[0И[Va+F?cfacn?AZIh T)Iو\ha#%Vi :7q&[e8`n+Vb0`0v6YxwSϻ ӗ>h2Y g.3 8vd4{;<3<,Cn5P~f4 㧇tU9㝵]6߁_!A'X4B4w^=`ⴝSlcccN_*сSzD)-7?x0r-AѪ/6$׎GON-|6Ow'A{cǎ3#sNFmVY0K:^3dOm9Z:?ԑ}f++ # ;gWjf;>6vYH㓲annn>̀ 蹐iպY A۹`fl?} xוi4%!$aq0`JB<vS?nۿ_F#ckmhC'iJ'ǖJqE$'Ks+OD#ФWպڕ %#CY0Z2[wv NLFh;dU|('aOv+NJ:6ܱik zy E38>EP~8AK&M/hG`/<211*7;֗(Jkʭi;WW`.GXvj0$ZǦybpo0vkx k̂p_dMKw02D$+TTFA?p@7s,QHdX]%@)x6!堟&1"jH(܊^G%MB~qQ(xh~Ϡ/_I~Km\7JHKeܓ,M0hovCʥO4w r̀ )P(j8QxIgٵ66ޜ*B`c l6$íE~c1j0|<G{,]o" Y`iEe}3G g#V( ͂5v 0-f4@l >UB9Sᑴ:[c$WA+46 C+/98ffɋA:]]d.v<{yxؓ|ql5GTS!) [ZA-E+}uDhJ4]߹s'6co֨;mfI2UN[JfaYYV`"̓1KP}/ܲ6<.0b;vQ%)p5N 7޸ZqpYHQ0V!Ɣ0јxL?Vk> vuu BU7ïX|*fRcUUO+s]&>^G;q`Iu^m:vڵr<܂W{$j$7XA$ȴoʠo+0+`/|yN9$W l +AƖaɓkwZ%RtQHSԻfϊz]^ĵr}"Ā7u|xɽvەVKA&92NNZn^6-sacg/t VL(zNa&rQ9o!| l՝`>M'w(j!;w,7bl_ ~S8xP}?ӧbzKe< % ,vcؽ{rxg~s^L<#P˗/RTڵWnrj,,p= &12F+Vt l>'NJ,o+*o+*@*!cUA{RP5~MrZCB)Ǎ@Bt*hVtAEEEVT%IN]Qפ=$D,t.m>p<ѿ3Kh` ѪbK !>ð=aXB)b! &S|74*c<Wz#H (b{"tF LPLM/adxBꝙʠW'Apq`Xj2n4ٍ]s~Ǡj( xbFەՎ޲"ǕH7 =3D6Ŋ><%!}jTHg-,kqe=Q#طP.۴˫hZP$<MJ?iآE&a|Ӟ03&Is:PV2*i|]K^%:t⼆GCLePH舲2D_NMSPZDWȨKNnΐ4 ߸qc'7c&,'wO_lD@,1 ,")ʠa$(C$.\Iә=F\[B.GuT i#Z9VTzr._*'']2A3wPo-},`K&1\˙dq&IF[O ^.4 'ž5%3Ocgܑ3O飨,X#EF"1H/ESҩ)$M-:ܠ"m fԕn/M GKjmMR=ǥT@\_hWnrqWaA]~=:zѨ,q"TwSïk7K%]<@Yg9y?`%vHR׀bLȵk&w3vxٌ}c -giE>wj|:q ~gZhz?!8 = c8<]пHQޛP޶yCBҼ <[AdoXImnq0-*#t z$xLl`y3k(K/oAW{/JT.լ\}QrW %'-3{+=ӗCʐfCsD(~^p{5mA~1_k;,b핷y|]ڇӒ粅jѾ^լ k qk`NjDY,p/Yq tAYKjFvw!89*ջIY@TJdvLaF6~˄֬YzY1^UÇSέӫxmYG3@85-v:0Km>o&E2p{c6)4ϊD'*h>#˳ OLGZ}N*CRdQ"z{z[O>'4>fB8! & H7A|%7]8{V{]q-G~lrۈϧXÉ [@׾F?HNo7W3À 5K?2VM%Կ:7)( x13x|n٥-km56]'cW? A : qev vArqHDS۴ή` -kτB&Rl[ڷ/rϬқSu|7Sn q4=qI ;zj˓I˓wɐX.`qccc} ݾbE;zd+eڢX#ZjMzޢƎV`Y^!]k~ǽ%eND(ԄFRVX޾Jpdx+\q-47fi)<.#2QjQ3E:IPZVGU@~Qb/}~}l9/T i@l |O>q/pMٓY-β_YS TNe=&' T#(Z[Kk"r!6mf*gL [=XZ(lNXwf3<)/WWL>T2 -<-uJn"R~+sZv Y#%:o>+:Q8tSP>m_=|ڇf/{&P BJ}ڂEpRd?nm.ҠoMx}iJo%gKe/zUy䱭H&CdHFc,MJ8PlAnt7Bup1a{XmmuR|ۊl+CiIE\& 䇰Y~5y <<"1ZeH$oI5x"5&k@0VDo4 o\Rŋ^xGCyHLohhwL+jKD"}_6mcd(#x*ߢ{2!KB8,k .d}s4x/DΠYcǎ{ER1muHT@'T8ԕ(ѦDs&Ͷ~361ރxo)y ,. ]ћI[*%iӢ/q e6qKLz|f:YqMΦ"۷oBIDg=IgϞYk_:Bm]\*kbH?e.IamRyb;e<"1{]W{od02T5+ϝkheؑAxp^a^1]VdY4#h~tqoڂ+mv wS[Y8rHo}ᅭ٭K{1#--fs?[ܜ&',qOvn ry[gk*RwT t۷o׶;'b}?V@@ }y}"O!e zU{qswmEwxL (Q6`,9d[[׭sx- _O ,ȲIoX`AFra/+N2ś9œP84s#=Q3=D.Fhy_2!39vֿTJ[E*H0v.r-:lq ^sCK'ZȖJm-t/:CKՙ+"7pUCW _t}_/V^ 3?ktS%O7x#QUQ`9s zJJPG2X_?~3D>kUƍU|yO11Rlj>!p>&{i<[SNuΐT5j`XG}l2Oy晧8 p0_~UV_DŽMձ0)uJ1?(0WR$مƟv/95222d6lX8?///ֶaSMy Ud3s#ê9JHL ",dbcێ5:GzcMɮ;?K[D:df2G}0Ca ybppKjgj' ū[q &q;)Ի<me0TR,zI&*;HH(gtȫEr3%AKj+ā,I8yR5)f9nF7&TSlsZZ4T+^_|i@;$c'N/.nbX6e~k֏=O?S+U˖T+jjj 9EJL&ۺuݢHar<0NKmIuuxJΨ}A.mʇhr=y7DOTdLޏ=j͋؞̜zێ_[Ǐݶ-AJU>SW :~!.bjJ566n;;P~^Qa%"=v{sͲhwD‘:]ЍW>zA %چTxH|RЧ뮻̌mOil܌ }t+*-˺M ]Od ttnEq0_{poK sHlKWiY_[{F{7֮[bp9d+,Xv/_^cG]]ֺ:l$/^ JOuo_=z78l*ldӓX%O㶎IH P(Z=::y3s|>"B1R|aڳ*Svh&zFȪ aâqr<hi=ԞZl|BR/n'9?>}^]}{ӟ{。'u1s8W[!ޙ54R>} O׮OaNOs#0NȀOk`G *p :;充r&3UpVT@ljj 1l$m ł* 55ގeg5fvKЏx=y-pTUH1^!3*PeU}8.Bm8\>#frvS0s'ZWH}_ KqnbYs9&"$bZAqBϼyYtl)6ywNJ2)aVJWAJ:9 dz-V]$"TLi8Hi)IkcRdn@i:? B:3"2lR$I C᜼QÝ/Z6^Y+C%~_$GeHfX@1ёJuYyGLi !}^(sx^b Ç m"jm Y8w-Mw]VBX@ ^`bqMp CS:t&hv`.s37׹4q$6 !jLx  Fd'F_o_^W "f}|.Cg7ɡ7Q2آW+.O>Yr vbqx/`7m;DZzH9Xp0fǯ9nSG f X;#J\0G?|=RLmJ$T$I^yaHkxlt?͐Su *H-D8{T$J Uԡ'fshi)csڴߖ>wM {֍~f=g&k" GH?aو,-$Q0{(w x4Dn?먭-<'pNg۴-۷ T7V쥗Hf n&R[uPW M (e 9?>TP^c#CyA ץ~T@U,J#x]g=x 0Nkke Qѹs OhV^͘O9Tzy05yy/Uyvo[{PYUkpQ&5X.z5<;ܧ-aH+W| fB>8~D^0 s9CNxC& /\4fp1$'>I"aW 1c$Q'ě>JD$piUkS0,#>]/K &@kny<ϟy ħ++LWY3+a7ʕ|Y"J`?9\E5}߂[_|~_< 3ba$\ɑ[F E܍,~>>+<@ҵPnC݇ߖǤJ0kKLAET덴ai! b 3& A\ڹ&hDPP@8_EWU_UOA oYiJ[Ag lū0mbY+"A [[i+G HNuy{/jF.Vq]4ʙ%[Ƀ$k~.$_:G+?zNrU|Vğ!S-y1|?C^WŠdy,+2D#xr@KOMP]zɝC\/S%ww9]"VN#d5%2%F^## 6H?ae^Cz^g u4Oi3W9 w{W9WE_י jWLg ~FX%}%^U =zt4yS Yc!E}^eYL?K^sbMljWgv8:Ʀ>Qp+Yhl|?T&I3?{"22ҙY&UXH2?Q?Z o{kqdx~L`Nn,d;{S~1x3J!u =tãz,e+ggz쟏y N*'Rޓ9AC&I"k=X? jXR6ERa#z.t 7cgtY[ 6'^eFCz-*(﷦і@FrS(#Ύ]wjx$uIrQƮ3QxiY[I惦Ux֘_Uu_23?|>Kd_Sޔnj0ĪCЏᵊݤ<1sx-PFFj2 U'c#Y'G\Ǯ .XQe xYL]2Z:}YrGVCG'}!/nċ|\?M'Y?O,S?GA ds8WЎᑼ?v5uRI9R(Oun?kPҒJ@ngǏ1wbm*ѯq)/K:SqTW'Ej4N̿_g$a|^I3ƺx=ɋ31 =Ql~TZu猽=D>gG662RE(YcYR{PZm1$?mw4~$--25&XxvBq<[O̟PFgoߥ3ߊoVLH&kצ#Cӿ[7wJpxyOܓ ^Y|P34U5*|PV gRL I8_tnb7G~b7+ex=E .}'\8 t]|YN06>33[f c5fLuO-]Ve25آG6۾iSLq|\ͻھ u/߳F:9w9m yxB~EJܯ5k*t}UW k S=y:p~j$H @ ~tgJoŤm]PzL' Y1+n#1\niGcA>`ϒ0yvbLmʄ27czx+Ad f`fZJKͬFiĴG3`s0ՁguQ/?%5]Z~}CatS'A::wxvIW`:' YΏ"t b2oq{_~hF@H}&;cN''}d'>u!\N肾gv'O28t:[? A l+6f0{{=v*j0 EaɦL7o5\",o|ǎ! E93>p[0z{> IԻl2r4]R Dw7ܢȾh/! agcsܢSQ`qN@nkokcu%˒\%P{ƍk7>|ܕ7:Ӟa0Lf7ގL& OE>SٽdɊ+CL7k𶵵w0iT!zCs,Ⱥ±xBm߭@XXeg?sDZ!Wڼ뇾|fCmŴW>zz¿{1_=S8o3e^vlz N0 0o^]&?|'Eޝ{=&M&ڔQ/qrԀ`3Ϡ'gQ8]~;W_e#n@߽Z-=G/99sS}/kc:}{ *xtp)Z/B<ڠZhvE͝<2՝6XUS$x1#%ﴺ[15'?(?l/ѧr΀>C+nDmZy\%cqx?5Epǝ6l竹.5w$m&DT6"AG`<]QF3oEՀ +'NS=v endstream endobj 256 0 obj [ 586] endobj 257 0 obj <> stream x `T33BHL& K–%,d!B $&aq-.ܩR~~굷m'Tm@ VZ*޶ $o˜3],9BBL&7֋)V]O0aaOBXšI|J?cw 3BaOL ÎʚX5̼{@_͸k 1X;z>}Wlio !|~ہ~ ˃}=]%W~sZ= ̸#b>}{G}Gt!f'wxEw 1=fwY;;;^X:%Ħynh8Iх`@_C'yl=K'z{_{ߝ2h]X2.Es`^{nsQB8X_f +;BqR z-"B<ۉ yZNNլG#"l*,"[prH ">0t:Mhw4dD$-V_lSDݜZsOk?hzZ^mM]W _\Ԟk>hυM6E{8W _+|W _+|OY~W _+|}@ Bf{?=M"Fmb+D^- E@@?]w5:5ޭipL<_*f](T9)^iUjn{Yq/4I64H ]_qI!ܕSx}d}k+ٽkxh;.ӽv-[7yZ66756l^_UYQlb爑Xs4{C$~ߖY*Nx`.¢UaSצ&i3旇̖R/˦7NC+._|#šɸ;uDSzg.֎D8gc[1`Ksc4AC]wmZX2aT,q5m~GgZ|NJ5- yS}N&W𲈢v`È[;аQ~ǁƖ#RV`e!n5jrPv#4U} += u$#V,y-NT';9\+\Km^'Ac_W'=*p0,k#m$ ,)Z#-:G(Lu#;yepɲ[gSG5WJGrlvTkLZ} DC_|._C2>oϪ7~].(9]jo*t$RKG4mS|>GkhnXp$8^"YP!{ 3B,-c#?XY}.$RиBh4jPSWG#rtnY["Rm2Y=f߻C{dNFsdbLj,{wvEwޛ(ӛh5'QVԻ4Ui18WuR'KȖI2C㲦0j(Y`j 6WJFTtnˌe"_7B;z@@m6@@L#is{=$LIfƝWMO'NBA q-g`[j Bᙅ}+F,sA\`\,GyRx|:3Qƫa4![,_-`fQQC2ǏNGKBvpom*ͽ6\èD$k#R%tJlAlb-^yT9,U|G%ߦ[o9Ei@>˄J]m@\ ,-Y.9_$p_zsi@ߑryzo^@;wӻ[}aݻء-<_uA@2y~@ooʙ{rN-9}cv@oUo6 z܀!+赳5:#w$Uz#Wp/wun,^K;z / ݗ^WUJXQ/]X/gΙIϮjʚ3gDm˱ZOw<ͺ_2)%ydF!Z$i)[)5m覩Ħ)DO'>5ylb1M{M<1GxQMր)c$jF#UVv y}EӦ֖M;Ŭ*- -G&O -#6AOd6\ZZvh$;5jzf$"⏁@M"ImA:xY}0|8aqJ<5m~I?W58-j ;g1-v5b1ar.w#1mqB@8> zֈog{JX*վ OY]dA<OFB;J~yqQVOk5ݖfv<{uD}x\B؞'Db;!>:n0]D%[~4w8-qFvqaזq"r퉉"!Z F(> `a3y5ŵ4bɚҤEZ̅gMўStgB_Νkyjn͗o7Mf-]ۄ@@I:r=K fKiw7|s:"Es'-Slqȸȸ$і(CĂ $,Z\,oj^KӀBTo*mKẸssVٝ~Mmf]i{ě-o}cKwhE vm)KB$`HQ1Qbv;RUm%yyveZRr^n2Բ3XM4˕nti^nr՞JO}ZKG=u/%kEBl\Ϥ3HZ;otj}ڝǣ:w3Rv朷fT\^UZ"FGw/啤0 rtџ.2Ӧ'٦'N>)1fpc)mʕR:Tqgg\ϮGƚi|qsUNGssfݷ:rGz-.MydҤ{vk|KXZA")\)V#zB@e,P+-]ljsIn.Kgd%yӒ,ˢ9ӮÖGoJKl7wN{\T?zhɁgw%w^~$g/hqw47>rsm5z&Rx|{dL5^OHZLCGf"Ol[cf0u"D m'R$Dh#&XacEBg Xm.;<]/[ ];zU{WwP:+}~ŴE_ A0cŴŀ2Kk'rB!= ^.V[z}C[ʑWs%1> dXU]zaÆ^ ה(k< >mHFR65VܭzzCBM|27>ocֶP*߿k7kJ_()"iטe{L`"b~cgW) /FvϋVyl`ڈ7l=C&Gv:ÐSʙ|gĕQ*sˌY[wNeUc^CWT;oTjp1 cê%}94ΛAyA - +AHwSD9qRO9=}e>s'Ϭ!WOƗsaw+5gHٸ|^PKCO; 't(ϣ:kx"9Rnf?ӎ~.|F1.F4{4j"BWwD5v?k UQnQ3jqu(BϫFPk;qsSEڠP]=njT8͠7t6jޱJHN8QjO0rLw9|ja@qc e.]xȉ^QYvxY6pL8|'=Kttjr7[G cDXf&hO]1.wޒ;et=Qyo+kj|#lz5W7zf0ZH:+t婍%ZѤx<=¡x;T_X_/T(pkP+jF[VN(fl y5jд1PUӫ9[ O꟣횐e #ɹQ6PѮV#z(ʘ7l)U04*^lbz5*-FsePSKUjЬlqY`bi!oInPW p(OWRJM%jCqU?bԯDL6uʊRzKY_1BE[ӈnaX|%f*&Za BXU1ט>,yV҅lTWV*4P(SYZmj4.~l26D|\^*+({%԰!_绀VW.UOqSy7WBygSp7UOUHݩ.킿2h7uބ8mN6n doQ9[} zz :DhjzO@Aמa(zXXoY+ :)!l F@@O a_B~5Ȏ "jvB z:;e!mP A G>ѬAV,zƶCiP -! bOf K;гfvAH Sls`D<8 N x8ᄇNOg \]WXWze"?~&gnI^dS~ͺbO]Dd(l s6x{ sș9La.2x+Oy`=G|C, ZYHN.\JMi1r3C!jVf5c-PK>sRjѯbqڲ뱧_4g#Fl$&hO7s4As3K}#x06!Њ l%^[oj aC+y k+1mA-i+q[RrR\\iC6mM^gxg{ߋ/Kl#@NdvG'Iuj't.l#mu/=V=aܶe2쿌>lCn÷}ևowo;Gqw9|92/Ad ;1 a ].bn|vnd`v܃{q/q`ٕ~y1u5>_\ØCkZl<>>dÏN}lGaG:\c `{#~od59/_8}~7aMw3 =^wkoA[8so!nA׏"!|vJ^ފݷϭ$$$bݧ``Ý<wp7:MMC݃^`ÿ`,:~cwxg컟zv^>O__$v~Φ#G`101jW=Qϣ(y5ys◣԰`s쎂Qt8~Gzcǘ?1GGQ{A/J3g__鿨u_'^Gu|o77 tz} ކYϢYjY,qӼuV}NhtUYy;N@ EhEAGB>ꁾ($A@OA޾8E w#->.$&] !wmmBK =/)B<B^&i?Z6q{ tt( 1B̓b_*rSZoie>fџYmЋB$KاMuA9 .@' >@l7=ks O BZvIF6krXs|Xn ",E`xIu1s57b,ZLr6u/CGqU> "fåq|YO7_F,OJh' ׄV+LZD {WӊEf8zzBZn+ŪWa۪AjX|׀9.ښ{ |6"⳵o-xޢsw ^nMBl-By!~(JбyE9EV<BV1sZ1>/l+!Kȓr]KJ+eZSJ=(}2UFAwB7'i밽YD9RNޔSsѳL*г *WCzVbs%qRY{JVQ㪨;UU~b <֓!׃S55V#Ʀj|T N5`^C=tVP/kM-RjoE-X#:lCn 6a' vc[=| KsBkĞFr?7RߚMD7c86aO7o36c31ڌ/Fl$7Frg#y-P[r;D Ü=7uكo<ԙM&tDo"71V 4"~[g+uː?#7/e9_y#_d>ٰi6 # `Y =Vb#bQ}~z~z yq'IIS$ 4= |,r̳B׳a?ҟ~<t 1?M _9"1m46& Mʌ=~ 1eMD! ^ />=GzyEbow˨O^^y`W^^055y 11ȱ#9 ,;D __Xo?owo`77M`y k-׷Ϸ m66p-x?1$rg.+.rx]{øuuu:iy,y yI|>w?@{!C??_6 6`ޏOS?n>ρk3 ܛk3??m~ l[[V֧@ Xv̵n]///k_Ž_BW;_goA|w睟|][wuw{` LFq֥csq|2!ÖGGrM1Qcwy~/-JJa2=8! 䝅sw!9W ?ZWX5k![F]# x }o m6m跢oNs_; vsþĀy1gχsuG݈#&JP@#402Km&}bBK ل@; - |gZJW%tЂޏ49 Q֢E?@xƇb|Ƈ&tBGF ?A訵N't$ `$`c0G9? '@?àp?7'HGBQ?cJ)?9xA&jdz<+ &@w"EJ? IOB?t`M?`TY =eBg pqq;~0߁,gg }g ;BF}7wt9?Qs|.ߏIy?G>1A`_Bz!l"">Ʉo2/@A Xa%ՒdНvj t&?gV,̱, ˶2þO/ lւ7ٷ`lsA<٘a?| BߪAi `-x++;+JWBoi>lЏFߤtnMI7&ݤtnMI7&ݤЏ[6BiB?9п/&S~ ǿɄ~.=|Gr{I(!s+c>@Mor#Y)JKU}l [Ô39d$ybј'Xm[#bƒ f!gTwO&kkddN!fx9$( 4J1MITGK,6gmTcUU#gT Lgy?fkC>4 !wժV]uիs([}իxsS7I7H8~Q\Z^oGFVi'7 QӗΝ9:H.X/+棏>*?(8󲼼"rc>0>u$񑕕MMn_HPU6Lƙ*DJ<-(޴ >iwMK[@O>LW6\I-SD" [޼y/#!<@TQ'Nd5Z5(h7[FV=cƌ)Bĺ<xe^EXsg;Lqi:)KeٓPV`}B;#:D;ΟQI_C5)~d)k,͟~Sr2%ȑ%uv6#ƫI'\?bN3׮큕e$Y&ѽ'PK+!!rV`J]5B!cƐڰ#Fr$%׿uCXKw?xm`N+++kBZ.nBPccchƆ dff9W;V"ב#G|JsڵkZ$FJB`dXfkbm &ĉuMx&ę%!4:M8DI =s|4FFFa g>o[Ll*Ԅ0|… #yhf9 (f(ES-~'&il3^'oՁ.rM-nXqMUTJEȣk.Qa}5{~t_B*$S/^<@9ۉ%0w+C:*;V$6GR2->oԐh\Wpחc )u^&<\ŕ|}}NTRoUtK 7B ˯ÍvKu:]̐!_UWVTTPB]x{lBF؞ {إNR 7n\dTPWxrV[@Tf*B׃] ČPmߦMH#*ZZl6 (KCBBg m VaZѢ0w>,7|J|>ʘnH?Z$Glnj%e%bR6ZӇkѰ[_0mڴ)ieZ a4ͫӉKuCuuW|YJeZYM%j_ݩW:ãOwh'͝;7|{_'dt"7|3gTQm`m%-ҨJlAF9'&@& jZ7n>>xHFIb rZG$v#\%rvusF@"xr#q N87M_Pz>wiy|r5\.7H+ŀLxz."rKp=<x޲3Skך='\njTg U+l+wL&Ã'd:;AhCځ Z{:8_ PII."*+L*ҝ6XI6<ˌ$ ̱Ngb;Lt D(D$@|))F aZߦ!Y;QfffURGzl=P^Z)\M!?d:1)]AeSz}={nd͑{~2һw^RaXmэ~ݎ2Mqd#/}5=ҢH;dߓr&Ni/)^SW/#oXYUwԜ`(5٧6NQUUTgm8ad կKKPCizj+].vI%ujן!( e|h:G.Eg#{j?1$/\xkLJдÞn'Q:¡ ˡ QTV ]Ǻv{yDZ^i_qސ;&؉fpV9-eh2d;gzѢEd-e'N$,}F@_H|ve0No"Q\qJBJjӦiIuT+?Tqg62P🌍'|Ƽ-Zbmql#En{ʏ~ɕ i~(/yfYs&d-ZHߝt^E}d5a+dZOd,1~{̙3.I(*F1nwwQpr|w_\_G9ry:CąZrSq֭7?3sIp$isWL8$eyNYl@t8lV k .,#hIӑ{sFۈM&{O\.5'8nݶFJ0Km1Z\ƒSS5 {ie 1bJ(K)JBzC%ZZUzPՊDM4lyk޳+x,8ab2?I_Dγ;&trXPqBߺu5T&2]֙,hrRc>bxZ(p1Bq)\UP`L2hC^N8yrAQQWe{n2ųO;1iذ$ۥSkeҒӧO;뛛9+c1U6{Β%K L(؎ceX.Fkn*?_-R4(bZt8\I̐|ktw0ipObZgaYX_{d1ljGkVkCgr*KE6LR!Ոc"i8ɿh\DO^:~tԒ!tv2Ȏa*#ۚ`ieoIII!=߄Oc}(0]Yw3y霴9Dvc>mnp܁T~~o5X7̝u\11Q'd 9[۬UHJM(BPRlTqx"pv{Nݜ32HpH"6#i;v#7z=93g}̝zy,PP(촞..ڳ7eBEHTl┉ķu8g^ݽqFSbbn#; K=Zbݟ핕buH>2Di)ٲfQuLc$L)f JMM5Iabadh8ב?#8?v%pmW]r߁ ] bxt4Ub;&1 t26 {UÇup G0smPMi]/cgRwLU,C\w,|ٲe۶m;l!PNLVSw6v RhgL6Qѳ:izWg9u pհĤiiANN9ZjW'č[*k^(|:#pB~>@3'/2~ [I$VZeku{1Mi7,?332M$lY.T=U)HabRln*#INMtuQ=v,ry$;?elLjmW^yeO3k`}Y<{{f/3=Mmm/?W^j7s7o4xn١MRq0Lofq #7S4J)iD\\.8UQQ] >vp_m-wDR3L^U C3"M򦓇OW!|1/+cFʙFzHNBCC%O_~ǟ~IG#A/--g3| Jm99" YXF*ev䉒S:Y#kBXJ9zJ^]r.TUޗVJ`7~D[i{:O앭IVtUm3cdjnhIPnȩ`=KNE}U}|`^cE=h__֋>/5*Yaw.|gi.y>cz|U=-(SX@BPg&޳$saffOz.u*kjZ]juV>8HG58\]\wFIǠKM: edؒ/o?n/K,Dd&p1~Guot2ˡ\ofOzަ\}WV_+gQ=ΟkO8qby-y n~o?qE9[<¨3ME/\]pkkmuG=ZU)BCITH>>"K;xΨn'0Um 5DۥBݷoy֐2o^^dR|A&0rةSg&X]#wW5WKXۻЪYkȡfbA\@gɊkn|d} %}q% p24ZBAATjJq͝; ,y`vgiTM*m$RYv#|z9]v[K'*Kۻ% CWq=ĸI m!#nAehb/Z4b"xWquuu@oj+AQo}wX 62̙3H=YDm>JW"OWxE"YPPB!X勤pshP 2$lFj{(wqWNk4ZQz_:x$ym6/bBByx;/zX6yme]c3WT|ư(Ya徳鐍,Y^xvuN,iMb" &@ bvÿ#BErRqDEKKK;rF?<*[:515d$H N"(NDjۭd}M n_S78+" `$d2ϕJ*$5'5SI C{}/Zl*ZkZ,;80 ;^B`+,~DC|Ǖ=D|Ux)޳'kkv{ojjx/@ad=_4!_]ݳ'g1 * tB' Z٠/_{$LBT&Cd:c}$˅"&2*M O%|ibvSO=U~БG $4FªPЮmی,\9B?cm~i:-AB)>fl.0Yʧ̽N0oAlSF ^.YV\v׽+ dI'.o[۰*^Hrmt}'h8aiGPԬB[r2THp*19`l1i&odn QɅw] =yńV @veij@}q ~&ҼoCʡleݖgA/}c5m6kP­YwպsM#̤WG +-lIB .M~[/;9 3rzg D2޽Pv-Hȕ' XYJ   jdٯǤfGGY%(O_|ekw=555Νk˖yx<.[壗h8%HTc`/4VT}Y24E"IrnQ79rA 0Dԉ4EB"}3Tu\ˡ~e 5G0BW&ًIjp_㿒15wVUU7߹q1VECLEpLz6]hm;}1o36!{;;;=ohs.#e@WK޴cy>WȡC)<`:5aj݀f/4//pn 1:"qoָQ{eܮMMM_TTRII[Q39XYx^bq t.],0MmޚB$k`<[`0R*/fȮK|b'd:PUZ,P?n*jBHDH$B&$6OuրEP&n7:}.XB,BJvCT՗ dn":D(P#T L}lT-q^xa]dwGa #;>><"s#ViB>!f?<ذ we2nIj(;Q ql<9KW/R :Rna2NgK읽/C;;]nj\]N}?ۼy$}~TUe1I&6"~s}g?ڻ.D^o|?\qy^Ҳk+ 5sq_om-19s"jK-[ LZo;{l"|̈DeeЫM~|:ׁFZ[,sm]2=uiKs{XQ ^`"U~b"!' fe=V^^lͩ[vATizh ,*ZB.7;(~]1Ft{x&vp#-Ch~l@ n(nJ+b.r¤obQ8M:P ׬(---.3CG+MxęRH>VʉoM}Dwv~[ʕzȂE@q\[[t4hjh Ca[/DA|s…ZI 0sRQ tW%!RB5q^iiBUnYn].o u̎Ԍ '46Td|>GHvA_/S|_#9tFD&;޹$f#%.WvvvE'["@渏78 I&:fWޏ7BUuHBF@t:8/:ZTv˼q$""wkpIJ02w^+jp *+/׌CXWsrt$VUiÍNy l 8QVﵒCc i7~WUJ9=knq:TqyWN(q}D$2~b~Ν;aFS~z^Q1@b?.DD;A;*xsw \kjsA!&h56l6;UljO@ZFLBfNϘR/wəX, dtf2h D"2SɩP< sgWWkAfH;em)4(3!KyIq$Z' 8&dqa-}J_[1b !^HKv_ŕx&xtdvęFptIɪU5+rQ~Cb!1/#L9IB8]/$*l)c?#?"ɇlq`0Pc]tm6PWWK$8 {47qf޽INa!z:) .D&A^DBdRLyff&? LbfgGzzzFQa&SL&MR5t)Gⲥ3_L8e\yt'Q,߰ac>7O6Y :1>t̞O`t=wΤUd\Yg.Rp[z&8윜'V%A" )3|us/0{,}r.Y,d3\(A&Lٸ]鈰EYT42s%dL7Am `[ӴDqeBSd2X~ݰo߾P惏ouTi)Ͱ') A"p(T4GL ', l hba`rC]m|~rDI`FM ?V`"z+*K`I4i` o<n~BG8Uє0J`m%^:d%a,ylhs"P )<0. 9S>FMt?bjԼ<7B!j;O'ۈ̞y^D4 !Q7gc4G`㋏sO&Ҷꑢ,^_8bFbؘV"/U"fxTe/F=-3Z!SNu?u8GVqFAzaV I0˒f[@'p&G/]c|T(RT9ݥHsH[jȋ` B׈=xgVUC@WY0bXбӧOC1D""Tdd%i321J 'CĘ^lMEARŴ?k}/|!'G/u knj0 !5ö2L$q&8^~ЁϫS.6ԯHHݭ=݇.6"lŌXd=IZjUh&v$UzFX?9vG"xD~^cKeYYYKSSep,z4`s8Ө2[oѡ!kpp *MOOYdq EFF\.7VFn;N/r.KNc anltjoyt7m',⚨*$YH޴mb9aIXU.Fʀ}͝,#17kvB4 4Ϗ]LMȤFoVٞ^y8cVݗ3P5sėuŪd̄9K2ghMgTIO?wƵU>]~y߅`\=dQ%حlkb$eaވ.,k\H,`ll9Š_GY84&^0/نEwe}C`ȑ3!b0y෥\OI_L7_)$#B,H(gV%<" eG$E#qgk!Aj^Ss׮o\9sj ~ lCar/$Ϡ8ETם&7256-tCY净{5̡h@C͔.u (g K岣jidDQs#-> t_;~$tC=>j5 VE1#=vMUW.p9(YG҂4)HP9j玨 wLD1?y29r#G*c^./#|¾ˆXq Z$bhҦY ,@ `n`əU OϿ~&1ܛ"2@`?ڴb+ ^rct*TkRg7<8tvƱd qTl»2" Ggn|HK$_gXju\$U \$ ]~2 ZG~#y$rH)͋dBjS_xZr;Z`y\.sٲeYڻOd3744 ̋TnڨucNZJ/]tTձ!X;V_(Poy>G]}"BC#"$2g'_k9(iOV_ {-' I"`, ٛY(BIwbrK L*ӑ^Ozi+t zWuUW_~|)xj-9(7eLRDYpn)Jd|3_o{[݈{h0W |ONO:JAh1NJ́JhJa8@E)r:$}DYMFrD"xj/HUhHi5 F mŘ0| Sy<:8r%z7҂itHn;yfMºhݒ( 3%% a.]J܌ zpW/++KE]M'O!aáIPd7J^ti*gŪA|rQ8P,^X~bRLؔ?TsQQl%+QW ^΢ _|kdGta~~nY->{t_TPRP~G UbG\+hW~JtJ^0$/.PM>1RN KHoeWd'^vZRZP#91U#ܙlAG~AJs2r<(Gl)~eF="!:z-9_$SodwDK7)衇˒F'pLL٠Xi9 .5DMT5\-ĆI{ΥB*jTk۝q%EEE)RŦS (2;NJd~xlI++-6^š?Q?<3&wvֈ i>DuWT /wWܳCeb}R_w2ae\᤯~׮]D  CTFsF/L~ #ly҂IEy, #7;//(na#<DOWXX8MbJ!tCޢ5%%yi7luĉ RK,-n7Vg F~^G\}fn}O=/@lp%*+ )^AF b L]q2#;w -m<}@Xqoe@<^/q0[x*b>sɈ\Ar,_Tr"z'ۘ6ỌFXb.+YJ)5Dp1F= <5<9rSQhQ_<%Ly'~LA f.2d H@³+cΡ Mf| k-߆W}իsi{GWwW8.60Ǐ?w&293H %d:d_o7ˡOO^.^ywCÉ\|>PF=g_kD D?CW{}S7cÏ k0΃nP[':ۮd (2dG’\+tz+DC-.OEK@.eVb96v68uk~߿o_zel ݶ텟n$}];ZMyܡo2`FGBLRd$LD^^|{kڦ_ՎV@32 @* {i{h10xS=89DW$aFqRr{b354}c`"fTFo 4ҟ .6g("ʟ%IJ #[vf{bTf E-_XJ2]!`A1#,p'ӕhV~zvgI$#MOd'x S>{XRk}1tnIb+шq;X<|˖-eS0A{ޞ-egP0 LDpjb`g?E2|h$ P!SOZGq.s;K(RE)ğ~ɡCY Ycŋ2#[ʈO/):D[VFzFFbpFè^OٓnS xg,tE? yݱlBWweB$~?!q;nEG%mTŖ(r:րOx5c!oǎI`+1z"J,[ */4*Zݠ2>S u٥ B" lRY6QJ3]S mˋ j4tG)0wĠ] ,&/;';3W* s$,;/p+$K*l%27 )Y8Vu!@h:%+KCmmm-/־nG8"qp!|ٹ>|YEQVaHSIh }oo`LēΙ ^qߊLYT氺w3Dl@ fľ뭓Az0d>jO4P;䁎j m8tkmWv `C8)*aRwFIW`&EVk$rS%^A%5֮НOSj`%90 [*r4~˅ݟ./ODQUr(h:3ʱ{Zڃ,YC OqϧI5/C E5&1I& "+-qj-dפ3@ú$&;η*N\.|p3TP މdo bՋ;aX͍ ^ 7߲e a7ڦl6w7rZu:}|t;Om{0$*jm-fL|H<:m36|k_**n|;K"Bzk Gdtܧ/]4^8~ıyS%M?&G&XXBD񑘋R>w"&0fb۰Uwҥg?QMx #O,mng:9>`|8&3aXOBdwͳ/=e] uLgZj"ѮhpiRކ_[@AsMK' DR EhFݮQrKb6h-Q!q˞Ԓu3 >¤tS411YI&BHuh!r~LfMa>y|pb}o:gpeFkїuŦ%e$d(`5 5LuƭsgTYG-@3 (7''5O ^Xtxiћ Qr+W#@{&KΈL6B&)ؿLE%t_p|`\ޞ' oaY|Վ[ l&K#4 Ё@q{iҪUjj2B-'Opx<6ӌ? ayͣ;:Bdtz wTE~'ž^*'scZnƥFb{{&xB Y64d8?pkM# &ќ̷:tݚ%`X`[ù%.'/´g>uY'O-0چ-$(Ig`(w0 /_]ؤhwjJ^?!h_0CawnɊ*y[k{W-LOjpix_|Yu&AiZ%Uk}pE |HH" ݥ;e~[IAoZbMSuu 3@ Q58(F‘e@_SqIJ53rWuv,Z̴O -,.S~,Zԯ: v-[z!9H04e822Nv0=GW[v˺W682:22ʲ) س$)+?cX|b{7 {y)RA7ku%ZvWkxSmjggV759[D;.z jp` L: (qx7gry#\eL&I!=?N~ 7- rU'a1h%]U^&I 5xf/c5+N { 0GL\Bk<.lvY;G?av@l!n J y:[>> gi(inL&ԜzٓԼc'}_ض .||TZ8]4jXx@1&@:=$rth4~Q-~W,@L~F`ꥐCӃ=>7JE$:;;[tG.h4*CMw ue}aele`$egsp~E-k᱇$ cxg, BPQPSsE^4 8vҔ(j. :M/EZ^c,.xcP@"HiT[i"|gMx䅬XFLrSA[/D 9bCIT&3:*nӊ1Z5j$ 6yS wX %CXԴ*JމDD??}dD bLIN% xZҥ!x($MO= >xzLz#f%=5Dzgv7=X]WsLTQYq̌LDWn,dz˗*,*b)/]5D#R˻:k߁w"Sqs0JHK**<>_Iq*7O7+P(ӥT7k ,ABRM_&G2tp_"|{ @P ORp4p“v=Ez{a.zU]E`!<5&fV'Kt:F4؟A,r*qEvv~^J$J8yghl2 k$li4׷b\%>yB mZ"G  Z[B6M%v. Lz;ϩ҇g+} W'q(S׻{-^7*IVر>E\1sC08.{%V"/f $:uv]/laxU[EVIt,4L<^ʥ"?826}ƑGХR,oJm1 ;eA*&b#4v`THn0ЌTCLC11U,g? 63BP3CW:; R0KUC03ɽrƁ !'<Ɠ{ _2f(Olm5;!c,ܝ|pp:C|I>Wjコ+F$D\,K~aǯ(8;`ț꠿@oQrۻ::::{'l8N$ \J4N$8DokG')L`)y5`L᪫2G}c 1ؽ̛~{kDa?{M-U: tpܿ7{E퓩~{6S-LO_GGF8lnx߀#u #c+C HVnX_׮XmQ]HpZ|ИCĖ♗YZFZqlV GIףYYjp[+Gϭif|kV,^QSnU}T(`5<{z{zZܜ%9ef:OF54-v(F^J3{ 6`wܹ"~尚Z>/h۟~2j (. T4Q &zy'8p"]O:u!ZShv:tn(*] uЯfDHCJars-ӨdE3Q&- E2\]T\YY׷W;v* CH8AM+JP`2<46M0J#))L>QNib~Mc.C{{&b9tJ(8V T23441T*9~el4vFjȊT149q(Y X^bhhP9`;痖 yJyGϴ(#33;e`@yoٚ[930a46κ!Oto\S)޲4w3*2Xe2*D@]Q.'{o΁c}ʊܴ}~xoz;{t}N9]%E餔%އ2e@xlЀfɱ `sXm&>O{r^s~Ԩ!sJr8"2'G)nX$B!⫨YQ \JGL!CHB 6lf K7F[6FHy8Ӫ mIͦs>hmg}W,=fr5EvKl])_&k8rEMٔt&# ~Cx.\by26h2N Y;_z?ܣf8|IJQؘJo׺jikQMGF\Y~QRQ^X\\!!Ʉ7DbYhaq94^⨈M]rӫZG:3c}]-&cvO{˥cc(42Pv^ѣU6GFzyf^^^7>89=~\W +Z #0X.b|tرc}tIctHoͺb>p!*TKtmWתY8(n]/~{'h J,nbvUw` zet}?|b/ L7?7Lfo*̌ L@2/3iDePs͛i{(#,LrA(+t>L@,+-cSi2{*^f͚4^⪔1It2N#׭rX)bRYAF[]|-R$TUV(/^>MW|<,^fp%HGf{ ѨU8Zթ[WOa3cw<זztC{ŷ84:Mb96L: JlL*spW7knE:>Wm(.ospFڵX =N؃wޮE%ay$Go>Z|kJo)XwA|A<4~xv •S2+k6>fPO_ Ǩ_~eEEE&)毪Aa> 1[uv|h"7w{7 eǃ2jpb@dr<${UIƑ#GlY9Ǥ)2Zt~`NUE&gi@xvl'y[㇎bqmdgQÙM>qqq8`51l8FS*ϩs}<>H&Y3N5Hk]USQʒ~vSUW^|k/ˍ =1&;v䇍-G KP$TLX;/FJiZ0 #3K\V8;m@&K+ia(E0bX 0?WJ V?֭[ q+S`Dg.i3g\ɲQfin4BO "\o}8Ӥ!t✔/QG;b6KM9Nj+ EJ?%E9tD>'K`W>4HL|B¥D4N㤊س^* x$03|Y&0(Ikk15Ş27B<x;m?Ȧ}h,9iً N}dpcGfqyj$%]*\Em>bj*3ߠ3bI廾7;k>׿h ]Sk h||T+FQ 0dAQ~~T109G81U?咂LI|cBdRfgKb cSDI1a]Gӝm یs}7|ۍ/87` |UV[[¹-SEpTpjU+Z _h 5pL*{iǡMKL.# I$>"be2f5yFM_6JHO-M8 YAm>s; GB(rcpW,Baǩ"-G492)=mUaPk(C!4$)~y]6Kr|0)\Bw.Y܎V|F,Ҏo-u"@R wj^h{}JLv deksؽxw 0r="gڝ=xV,&qŒU+a xv5y;;wa m 5ZZZ._j3vJƃtY.e 4`0i]ޕ/^E[Ϫ&ǚ^5Y56>ηjS/Y7{Nw. &"so4- gnr|u|]sWce D}X{7R3?@,/I4f!䖮]SjI6? /^. IUToXzzVݑ'=Aa7~MMMЙZ XU+8`}ԝ *7ܿ&5`S.Z;vXIVd:|-㩴 qOFUUUp(E _i0(KA4"EbmNHb[[G0Yn< A{)RhڊǽHb˚8+Ly?ޏYt䗗IuQLK%%wu"%QQ` %sRE5HJ)nb=<7p78zY6s'$P%7WQ5NYٸɹyz~'$R<<akޚ̐CN\ƹ FqCQه~J/21B_ _-5UG[7tyi4H#G}E  68+y^Qxxh-[C bm;gX=u[M&ˌeڜS B^zôg;/KDa:43=('v^xOΌC"mYEf YUG^?o^d֔Z2J%x7|b,i}c@a̓2CmMaEZjWgSd0ae!@UVdT!TU;{%|䞷vf_뼩\zX+}k51~<7^ء|& \Ħ,_|lEH- G"w޿J?936:13pǎWbriTyRrjX Wu4bΏ\$n{ nwM{1ޫ0e7@Gڬ9f#ڡ@Z{ 2v{^|ˁ1d\Y隐e?ȃ\'n RuhZY q7zipzMz ! .Y* JҸ*#F03(%f%IńtU} v ;B W__]qdT_R}pI&}䝿ڹccs}>?8Ӄ[3Y0EB͝{[7 DC>G78 c͘RL8ރ陱 J.4X][[J96:?w~y "Jԩ =Wzh4@dl8􅕕UX4 ìf)ߗnGk׬_\PWo::nCʇ Nxȸ{3QN\wKgZ/O7yO=cLs08r>4\;~I0iiiBqʾK.:0iQ$גIicg7?YF6RQMKb ~ wcV1|TX/蛒Fx(]~.ZɥcftP'!Rx46@>?cqnWpE'wM)Q7A+w p_$8'7ӽzyWj_yjvS^Na]]]V P9Mtz..^Scc@@Ba$w8++kćqs Exg#f PDB44K{ wo޲eK"pݻwx7E >O;K;L@_>~/Ȫ}W_%9\89JA,--͔[Th3 ]FmIn|bi.lX[ȋ=zT$vNppƍ{' dg@/cP"~v=1}USS eG140WYAzv;нGKi9S˾;;`G v*},XS+;P*: dJp[ 5`Vw%E(gJKHHzvBuàJFykjNz,'T3Ĺ;.Wz:NW$hHn.u " ɵ 4p CvjizP 998 ݕqȤ/&gk5GxA~ZH([&^lORxES^|c$rE0JTŁsʼBCrVMCrsrx$>;#vdxwPXIiz͛c|MZ/IN 7;LbI>p5r?v$vu3 dcPWPkk6#b΋P `좲2$F@>;7S-tDZ[Uu5yM{\W=RJth"‘&`Q:lAgs%@` IkW^|\XC=T<1Y?ErFڞ{PS r5PԮovFldvH5K')LwJӌ-]D%i-RvieZEǏ>|xx$Y"3 Ms,퀂}f0*x-{xmwQ^ JHY̕$.UETkTYٮ>QMϠ `^'1]yk6} TP8Y%®?O}xi"yoih" r: s(/2C"߾}hϙ2fnNjtŊ|9LCMMMj.8B FeF1j+lZn,xuY'fclzٟO95cqP8g/=??5ɄV3)|h"@0 eb+;omh<9IJO>=6r1djU\)FʐVX`% a- rOIw\RMձra =8884ϣ{J0 Ʉ@F9B?C.*R]&Vm$x4 9D?2\3owx6n\g7xYE{Q݂EzzDzGOzdmd}$.@'\/plI cR!_d,[8wz\ Io rĸu(;d2BFii}zꩲ---G 5֠'t1O+|ǻ$r ԁ(r" I? P8Nӽl/B/~o4DF^'0O/5FF.j 8E{{{O!qaqM}}}m5}]XqjiЗ ~>o|_ײX3֡b_QcETN!@ęTպn#Kbb@AʬUӮ’U?tg&gesc]e移h=|, b" QR( ue_W/uF !_UN1jgT"bϑiu_%T 1+ffYpd+~VX&_;(p-v <===3`!ߨȲT;8lIG¢V,N"WM!}`zj\h.[QQQ 'h8#ߨ?/=Q 9igzf솩U'OR/EܮZZxJוXUcÃ][RR>.͙ʂC#$p몘(8AK2B6 4scZbb`ACл{dX-M3r|ku PXs |䆘P4,A9%b sC$g^#T|r eSΝ;v ]IJ i7K klZϡ*f:_JDЄ9rzc>z>-jJJJ$@eFjvx 1ax'Ɔa7Yj`0@Qu;kz>-U9{x7mZ#QYj_0AJ 0 u]H=Ddl ]mmKŗQ5)r+ j[?ԥ+tx-R t K]^(̈́g~<=fhuJ8÷eU ȒY$.+MB۲ 7?G[('QM3i}<ߤ 8|DUYUAu] 7Yw{dwTֺO:޲eKm㴵^j& y7~\}fPTql4,B&-`:3 G@ *9>،wLuuu`vOw_sd3~L_tMf̚F6//ε),O mN@X YB! 0gN47]`N(S/;\K{|\^ZfĭЀ j*i;DaPɦB@dzk!V=/w[Wxr"j3'#9|c931O0&1h C?HFJk{00 uf9t01-o4_םWZ>ە) $B[o%wȧfSsBF'S`t%yi9f5g 7mtcp} ^@ #TNB|144RʼniAfE-$|ww,J@xl63EʕKyCC'j1T`9NtӲ[J h$l ۽kt&G?RO4:{>Xn5,"<<1R^ZUC72WVVRXNc44d{δ! mK~-r?b \+) &9`+%ԸY R~'IprQ- RE8| O'&n2j9jwn:+mbŸPIAm0Ġl 3Le%!-OoIn2 1OVM/@!6I jfhV@ 4sB̵Ɋ{rssS{E-\C bsaTƦ>=cRKK3 ?gϾ_P}Mې忆)L^e %H!"BN@0߄7##A|Itno忞ד=jUǒ'qO`jgGI1WEz>MF$@P0>3222j- 2@*" **2b@Z-A9z)°HOM”17C5IOv-!}CJ2fƍ6#a+]$iLd@1O!= s[[[)IO7J ʤ~8󉈃'޳Ia 6Ok*@<VTTp(Mz"xȸz Q(l2DET}>xJq-¯kἠg"A?Xd/]qo6\}(+ꛥb@ U2KCu9DRN`dmE|,4fHUD[,.A Nd E]]f(2)^+ HnAC@;1]V=v㽣Ν:8<ꦓϟf8|q>{TjFhڐ.!2 %C1b|64!ϳH(9yBw/ zSطai~eةe-6;olWۂ' &"E.[2|U" kL3Y_^fBY FM T!4tH}+`gY,$/cˊ֔wCun$t60Ki֊h-+OLw!r1œg?[á$(5AY>X^,|3gRB.+RLKȚ/I ߆d,V ꐓPFXÈ F`",vH0,.$,*~ a®0'n%Z$)2.RH [祜pyEiW݇S.8ȷxYC:9%w~IO }fco\GD3zj^$T/8f19!AgdiL DD+ 4.4EEQ!Rs7ԸƁNޑ$whZH~Kjĩw$f}&u\ȨDO~m7yM_֤FFnhou0bEVOJ܅L ^YOvQfys"&3پ BK`hZN]}Xxg8ѽ,)%Ъ&E##cSl65%Ќ ?vR΂Co(ZxrFF]PTYxɷvّL0 ٥?Ha };U>--?z`۶;!FP=<"dʕf>aF <,++KFQzla&&ҚA}ѣ`s×~M >QXP7. ׃߲Wې8q[U=U3-tnJo],9sW$ORbmGUujHQxS/oJJWjYeˎ]Y Y  Kh!P^!@_д@ 6R $l8;lٲ/}f$ٖ9ѝ;s̙9s*J ;NTДAqFXS`d8(L[g&:t̄J{ w֭MLgW <'Z9]S'( =nG9iJܛ$Wcܨ>itbyq`fX20ښ{Yَ_<X{=|;GyM,{v\mxBD* KJKKjJknˑDV ݦWQ]M:ZvsNOKȸdF¾Q[[n"ik7.ߔџ>4l?={<]/88N F}d;-A`ʏ uE`MR8GbN\^lw(` Ae7l.;,@,@+! Jun*rd0a:>Rj׭蘒,P.L[ۭ{~mۛOu۷/,Gs|i{Ͷo-ȳ{tyX1 OO|x^.Ƴߤ7)$4/LPksW m19j4֭+Oh43oE֮M[ g )"yM:"|P^spt N3AJFmr(Q1z %j[79o&L,3]BF)(]R])5|N((GTLS=V6$O߸z@>Q'~}vAN:j4hH$z& cqK6xҎ ޸qDUɴѨ9/Ϝ4n.TM~{5˴*eEF.?i<7 ST>2vtWWIrRz?mpo /撴cM0U*<ʕ.Bxi}< L:N撜 +c@".()E%eeeeچkVE iqOX.ItЎ{Գ<% N m6d:Qv FxIx5lȞ 2:֚ `+{\)vkΞ=k>?vdwqE!rpX8,o, 1!&!Ɩh\RdOC a^ RYt>4^ ]|7G֮|yiqe'(ʦh|S{ za&=\\cVX`* ZH,]K}> Jsp Qcs ${J'd:j I0ICd>: ᅫ[dߡ]սy /w1~e~Ni7{=*={>i#߹p(2ӦEN7mQ/s~< hw⟘anG,-xh*zqoo:=v >XWgh^E&3RFp"Ɖ|hGmHmz~;eIL8@'&#Q3t SS&t.db!J$)Iv v _~56`}l^0ɓ-S4gL T~a3N$5OL1HRҜN'M@g|;O5 [ݾ-mNUrtՖ]vmta(2of|es  og+*R"*cǎj{k͛7/='Z#}B7zرo Y|p~urx'IDS,œ<(G|6?sVaڪ<*`49=nVH- /L Ksط40S[ǖB<-}1dc3/۵Ȕ$E˴tOZC)TϷ["'X+6_G`EӘ&a%LKPXʈ+KLTTW !L6ꏇQ<ӏxG{}Ș/v"huNMڼqtXZ50KģwjjJ P00a@)^ve]]]Mu}+ YY2^ .@2i^ġ(3Pǽ_Ti~NKRU?Q_7ϱ PK=2ᨹH;Y^h*pm7PMү;HŶbAM]QE:s>uESx#<>blzn^zOB= #ӣG- FVڙ\Zl.RA{,\(f#^-V9sX 5QڳgS Slړ9c? f~J16yi2s 8c\%x-{fu¹Χmlρ*I &)HJKKep>i 4ه$/`&A\|r^YQ2UhY ,v+ʗR-kܗ*Zv[+lFy9Q8VMm,5sgS`SU5sjf8Ut'̷%e B;]ؙ^Dpg{SY+:::Gk41rVB ]mğ̰%JJgiMz[cA"@q3{77?13$xёyRi9g @d.<- Q?_rR ((p޽{oT6HVkv}_KcLۏJ`:t輑U[[p1#+P$ˆZ#5Clvk!cFĂГ* '"h ºB2gy_$iGw&?io2ްEΑ=囵v>*+Q5@sN'{MΝ߬hTL/j*<sgB#J`n[JA:O;@y?S xB}_!pK"ad$M9N/8pOTU%q^86uKـ@.72Fk[O?_E9u'v-*mRRghtgXQi \(.DwiT$%!%a˹4P/ }ǀ$"7@hj_ KNls:d?Ȑ'Qi›]\VE=[X5;w~w'xOYζPy$ǪCՔiX$C>v_vHJRJO7\2Yށ)А :AT MqLHy|NRh4z_,!P*BiINi/ʲZ +%O=5Rke?p8l~~dE5,4 ~cɕ+]ɏohx.88:_P`ԋ-Dا'd˩'N\|].;rp7C'&z=#MoȓE''HȊJKϟ/M SU*0;?:%(طZhǎ1H4zuPr^%edf g䯰2m w]-$ҍbFd%妈͕e&vBJ ̜2:Yrͬ$ 3Ғs]=Y YLp[sg畵^)rw/N̚4&=AXbFL|ČU.]*SX2X&*KJ a8R).B.h]zh#.]łmٸoDC`gJd" աǘ.Dv4B=^ <Z1WV2~o--Īr=&"B7b*Xc5o0|[7S$JC,2vͯǸQ -{Bfj͘\^cq"^ iݻuKZIn?O8ibӎYpӒ5_Tn<էN'F1ipv3"织FRsuSk׮.URD"#|X9c1tS5EAS|r-I,_FG:߄Aٗ* u"V,ʵy{zu3a ϧ0y`ǃ`x9ܙ[9,ZG"XտEpCQXmGG-EOTIwPX}NBK3mCգa:*9\ 5+C ( 1;Ex)sE*5{le^X|\A, & z: #D;Hz̈́Tڄ.>Bd[2|iSrJQjx3ofnjg^_"]+M5__cawj_"LHhQzOfP&Ü'4/$^7i0+PbfkS!{g*0Y{:+SdOxlq88JZA4/e@:n-}gyUB'GMgmݢsegp8x"oeg(%ɿ Zs$8 CJH2b䨢ԁɡŻۈVRi6>6k?SvMʤkoPzՄ.~s4s{|?౽@(D犕9 * jju5>v`0G*6Psqܲnn=h4jKBQ<b']1Gf4.Q#5jr'}X=y4 1W }քl&VW,߼Y<I5mZ=0 (Z:#CnX"rdib)bUz :,wqG)(`gVQE7U$f^7}4  Q,:} iy/%t(_;uh1P8+I6H czY8LX#gFM UR=41섞ӿ&.YsJ"ARVNF>=a0sgeI1)rs_vߪʵ!b,_*3H&ڑ#MiJz' "|wo)6׏gu|I8<U(7ΡϡGKwtΏÇ;A%Dz% ܸ0\m=c.+cRZ M9!>Ŧ4u33Dg LV*1=&*)cm2 *9]Xw9svx$"R(GP[6O;x=0LaM!_ #D"O:F" mɓ]!{llslmևodgNRTAp9L8seׯy DAF#ttXں۷ c۱me}z"]*KNʥ)'WF纜.\T$NLNJ<&ɓ<Ɗs3X> +YLV DijE!d۶,e&r x(SD $Cb2CP5 ,օ% Z_{ȳ| {F+[*D~"aD (YKnRb(bnw*EH4!=ȣ"MxVqgʌ<N7Bl4㏻ 3EQ2N!"=x|?&->#wE"EE+^p+:{SSb"ʅB#2jzN~azXdh^(j@]+5^gK5DO@*Lk0jnXնL&٭yf a߱c|a񀱳l,kX |S =t lz62FH}~0݊4n5A<8Z H#ߢ\V~m!eOu29tЦ6/t g_1vBѽw-&k;=-i֧ƴ (k ^PT 7|7O ]djcw)2)sHDOK\LIQRri|qY/_X? s}$4~Əxz? cW2Lhy~Dqq2@S3Vж` m*™҆G`3m?dv%W arz2'UGO.W.Z]} H85b>Q?Ϋc= "R׵)>= [:ziktzʟ-?]nbmE+Gqv)]9y'['[.Gɗ+h_(!<T307 Y<2+=H<4rѝgYI2$Fb,G4ci<4[`mSgt <)/0U 5X|y+XbҼVHsH6F"a$:md4ux.Ok>Xm%aHHvRY = v%֦YXz CD~ vz<[p~ʪW#A할ݡ Jq8 TD%hRB6@Xl= 1cf:ru>m::m,S&YYrW1Mq4My[f3׹>.j׫LȎZfqYN = 68 LxCDŽRQDw('\T]* C GKԠV=. sYrq _<-P88AzuTA x IdjXpus:}mL7ӛ`8wDQZZD5/UD J~_*6l| & 7!~Dryd:Ð.H{ܪ#!OB+:l8@|Hu8%2f4 HMbIx@0CEPIyGVb? }W!ܷ>3׼뾷^|/f|~UR}ם7tNi 7vg*^ݕqrOc, -̯bϻ^\c69  [0X0¢ W-,ndVK6îW 쫻rڽ|IO(r zâH>m-;2dEvVRѤXn%N⇆Cր*ZC Oo-ZБv<{wz|gޚMnO}ݞ@&)ضۖZ: :a[UtC"Cn,^}$Ͷ@$0u\8-YnseJqE<o Z&Tmlh2H8Pw 'Ъ/6yEpouKKD7uhqΝk[K{ ؿI{= Rb-!Ɔ$*7'I~ihiWt[`+e#G)$WߡEw+¼mg֭u9uk[6_ww{c?Az #"kwm)TaKj@RuwG^TNC@\~&~'#Ik{IM] dGD4ɋl.$.7~[nNJBiI`̬}!1Y+2b\K=\֏1D|.%U0K1RqKx- }p,}" fh]R$`_aܥPWTKQ3,Fwt[]diٳ|{% |RuBߴuBߜ\7I t5)(҈LHRer4$Bg;$l )I:,bSRݍ^IhݯݙV.3 `r~yY(%}3#ey (Q{è}S^EI.%A ҙfyuS"B^o 3g-Eu5t 㪉/* Ozl㓡j# ,zz``L[Z]F3W_ f^ W*}$R%d{E^-~2.|<ɫq@C|aKFw5/oAXr"Cx|>I1JUPxD`0įN#r}IUO1jPO,?2q>.vϭˋ-az>b3V*}V3>$҃ϓ7->O0IĄduvi˛ "W:y>&3IT9j"ssX,Nz%PQ6rO N9sf8j\vmI?3\Unc/닆0)@}iĢjhƇ^o+n* T0Rl;A<˲t- +TMVMUL5`_o6NmrtB?\lQj/%ƤZ]0?5>.b.0[Z_,wiӣ!b,zQp _V=[x^D~K/zp,Cᆇj<誈ɞFxd[˯@^KN>|L_iVEQfﯽ/3dFЕM _U(<ЁoooPUUUjkG.D%%eLO"$jy BS kmVYTpiGMtCW\xOVM!|axep`xv8 j|X0;11q-jTV=w+  mւH[J*** Dz|F~D4)Ȓ=]Zk1hFFK(ASZ섣‹?^1h'Ľ.LeLeޘ|tmM]_xl) J˻7qzS9fg###W.?~p"š"s(h+Gknoh<*SQ KL 2P_n|O<خ7尺M`cOmmsիэPTKbaٌe2!eMy3qXt7$D޴O>y:0b EtvGQ'#qzc3`hZ=U4?o2pӜ**6aR0 61T4yXQQ_jlx̡y{]JF~{ ʸifl*,,U QmfƊ'﯎$g80ՐjINt4ISGΪmY%;dPml<0;+qD2Ԝ[03lfmUпJIb*8y򤪲Jʇ0_;QofVhkGu6E_j'21tC! ;'Uiq_8 <׮+TⅯľ*'6c!D;?I<0sZtٲ;-D;[Z>.ՖcΝ;_iclЇ>]G<:0RN^ U31Hkte ln0642!W]>邎o/`|`>M5 h1`+/c_7~in턭n͛G?N} /ڦ[#MoܸխW[*+r"Z A|>ѯ># Vmtj{crdQzpDF/ #S5455y?6l_  >G:Rܷ[n;^})ҁ='O~a po4q%r2Ž/b"6q=`kz7խClٹ{)D".'?9 loM~ǰoA¿=_|l3zEuOСC7'TJt!48ݜX˽([`?{|>_S׷=^s>ѵi{vO:~?444>_qrU9s8LPRRB$38w0e}hn6dZ zd۷m۶%w/g~x,q屈tۦ֠/ZMɄZw'Yhӑ U#6:Q9y"; Je049av!A|FڱTQu0ƕg>u׍{r@MB!wH}}K^p!fY:<[ ;wES\0QeeCC:?oWUÚ߼Zu:55O;EWZ]m×@ڥ &RߍIcƆjK976n[>oQ=z"3z\lldh|*Riјv8w.HqbR׀7˶$ T嗾򵖼,>{KPVå7Ev< zMp3#ѸVZ^ 05E IEE>\%BRSDP ?pA 9V{3WToq+|J^2uo T=LjQaA3lc3#8^ybi)gw%WNۈ3q}2n3]َ֑Po͋$[Oy;'0q0'<$Uv_oGGhǦ# ѱFjSTG_*Ue b&EqL21 O{ 8٘T0 '8cy9_. i=g7zRJDgTwH56ʻ(#v; E_ecf 9K/p -RK"p)j_|9}ᇟ¢uCjkku=E}X z%z[WCa9 T +8*D(=ƈ2jjk/өȞW(=`0(P۶=+K  Eu8(~H'r iqPx~شb3X-&Ȁ1,h|ў ^ۀߎ&Q9!LgeLiM@ 2,BΥNqn]/ֆMO4Xs*c^;LXQIcLH[j .)N8yG~CQ;u{hIQGHuh̯"pZ7Q=nbWV*J/GN'V hyanM&Y zbf^NfJ:7g:]$䝨Nc\IpX7,e K* ԱPh8葹u\kWL #Z CHUU-W Nn<@ye&U3r(M%`Z?8;А5eh4aNh _G?:hB\󩽼~$rKޘ%sss-G=:Gs_U4s2j.,yrw1 d21KqIUkF efĸG'xC}Seދߋߒ |./5Ą!L HX,8=* QtV X#5h⚽LE5`FX r]9QAUi)t33ctlzZ wѮlDK9I69䊶%@RYOi6;ZE%)U,Ѓ0-AV_Aѹ) Ħlo<>in$FX7һu'?y|\Bс V]("?& \)f` &RM+V~VJG ߽QfC) Jh3x0W #CVzޕAV]cq,xG.]ܯ{&mw'攰fo5H@BV ԔHD>2%ۇTW B?!/ 9@{P F rB`$W{0(dΟ8<ƽP(yX@G,))H a̸9c‹2.Mছq٧fw_",>}Аk6<#zu? Qx g.5Ʌ8._~m2))?|p1_+91dEEE200Jr_x+m&Vwoїzw"Gr쥗^:vWSLX$](D$*ɮIJV$43a}>:h !i -GE2/krAl"B_KAh##Z@bVr@Nwe6EVe+h T*ԣr˱mmi/NelI>*\ hOؓfV3c5հ2 T(4^ V_Ѿ:Vs}CRǪR1X4h&]~NUPAdց9 83O8D!D~#01ɪfʱ{ PdBLxFQ?W'tRT?㵢Yj޽s33FP_ gwёӇb>]} _߽sn ZF.tB 7ֈ'~#h] 8so~N 7 k8D ѣ]`C=t@ޔ0''pMNSS?^wn1`XԖkA9m `j=f*JA)F>I9_\Yl85%:/͏祻l2ΗbL*1v*];;':a ʐY0ZCVYF  -tҀvm)+S&=rE*+s}c3:Ʈ](ՂZF/$yQsSx@OkkMV'6dF(#*hV h5<6'guAT$[]vk](*0J*OCYs C~{- CpP ZLzjtk׳Rڵ^5(prxdr ~6s)I+`V-f2Ү x3`Oy$Zyfy9s@f&#_Ã}bNHQjQ㣹ht e^G]2+}UylOܼB.JɴhWjbsxYk7H'ly:]i@?=rs3&eӼ6T{F2' .^VC^ͿI[T/O*(CY?l<}b8΄|o?oaX\M_LffM(1gfe%c;U#㄂[lI:9qcfk-.CkiRQٳCLH$^*M  , {ѫ5;A ^ЂT1fXsIv4جtn:r>6O܃~_nW_2L~ݨsg,4k^uueeV*6x#1d[ruh?>žSHHטHO eCUervqMMV]g^>t'z^8Ȳ=dl. ^L=gIU-R59pJr046'pܜpۻz:/;wA!xDJb\\L'0qF Jr-~pS?vmdh5EL8n2n,?N-/I6rNg97AҎvd)E#1g&Yİ[H  l)VЧ/壚t޵K}j;9#c@CIw`Wwl鼙˳d/X,{u5MMMWM>g ;gQԹġ,OG\h0Xk5,Ί(z J.Ih5N;:)B")Q2$..b9LZqJp?9VD͝;;N7󳳳fO)p $}b:uov~ޮ1[Frf̄ ysӟ{<=hw6, L;Ӱ{YRZE}z؀ <ð+I˲:gz|v= 1p%FLVB8MI6Oo,8Lm,NۡKk蜞nQ׌Uԓԓ`$?JokϞ=JY#/opUcARzs\M7|Z@ 1dg>lf7ۄLAf. vxPy4: y@@J/g9>RD~¸9I k̭%{9\͜Á1Ki+T+ۈ_O&yX0l8 ~Odgm_I-.Y,pG`=<0\܂< p8M}t?c3 >r.*5MA/]ݻ5&N28퍗g_ijZ<غ<}eϲቩQ a7K(`/#LHN*٫-SDPV <)JZ}GNCePP*'$yѢn&ۻs 臨TRufwHV'YSSSkuuuhN/7ص,j],̇Fpw]W2:iqlc}3c3vizbt/A mibLqyZz)2SId [jU 6^R@mR1:sC.X+^Վ JIWY[rWf-Gm=--.Z]2=M){՗)jgeN%XXg"+/8jccE=ۡټoKEE+bszm^I`MMihjip8f0^=ѷ|㯇_9>՞1l6ɉy~2/iq-.#FOO\U@Y`#`sl6w 7C"A@ (/W{z= u>_~AԲ6e^%5qEE=iӲLoQ?mG7)s 9\[&RpgC- ]ɭ>H'$ޤT|YZ껒[}d'TJ%Iw<*[44H@Dr-)-xdww'&jiϝDYۅ(r) {=S\43/\XOxV^ߎEYm`HNOM]Wx7q-FٙdL ]&T#VK^3'P-6tE00s%m°mF׳s-7=5x=ŜԘ|=uk}=K˙#{髟9ĬOp>M4J,'1nk/Gb 3+mZkOD>?9~jdkSvHq `ȹ-Rf[Xy3g<#[I;`jwBҾ=;ᢝIZ]emw*mw!xB/%3 xzِss-tt割4=@$؉GXzyB!nnסٴИm+53G?B%#@.ߔpqtdX=ԓqO;j"lʹ띖 h[4ڋˈvEϥ-܄WPI[#E 5Vn3MXY(#WüHFjpY1?V+kf].mnjE.ֹ83͜ Nf2gvbПYV3tIi 7ң\ 7ƒM|ָvtaXŇiyG9uvtw7QQ*],avV#lnVCͫdUfzt·KsHZ9vYq㰜{yzkpZC)V4(Qw=9qk"QH&]N@T>'vHB_+;Wfr-IOU Ғl2:9  #GDǩGo_% _x1nc~KبmFm;Mudya7`ko)7zg vj蒑^,ad㇐Whh氙a@o"wq?'6OCƇ/ !hؐ8Oҥ}XDY" 8.X] Ke=M#ۊDֳ·1ֹ@'w`T4]h#=߀k9L߯C$o2{wy$ӿ{F :Њ(h8-4ǴI -uuu}Z-j<0ݼ#1-0蠧]NU=ȑNƬV똡hJ}X 5Hh2߮=رc QlJìL&K&33/Z,#+V`|݊x00`%+xO nX)ih[Q^jkخBQwŞ+|SsBRDE"?u;7l O.+κ>9uӥܿ (6|]tb>ʪKG{i.ӂAiVjpw7lyÇ>;apF+]fG3E,vTÏx<~ q:(*,,\9qh gy %޸+tPZT\d8eɭ=(OQ2rh+|鴈Vih4z% t@B#G~˗_x|G \c߻1߻qZ&< /?߂./y k諟 ϳv6B}13?|Xh>K}}q3?|"x^gط^d#Џ h˗3?|"ЏCGE?b!ea}BkXDžB[9jCD"ڇ!rI쵿D2qǮEm蜪7" 0Ý_hls_Eۏ17~~)a~8F8_ʳ0[?FhcO#.GZ!X]_at6VhyGDxŏwflCHW#o?mYv&ѴG>!ht'Q4Zd> [+4ZkC !=36_Ĕ_]F0\pa.yaƞٛGZ>{ٿ8t;J,p:Ȟ1Ƴux3dCrCu`3zaNPGFs{plcA1:;Oh Y ݨ菩E6EDbaPƞ=[G^r$7q 3?kR9l_1̟F\MgPG?mYp?DhϾgGfq'|$vw˰Fl?GFwko F5!HNݢٿ6&&| ;PS'C5-h xKY0E)wl^~%ٜQa[ivIQ YΌdڥ  5GZ]H啖-׮]3妧a{jz}x2<6Uq-f>shǏJHv5$!t`{Ϝts,dbmKMvı9yyBp]O0BuW`m>t2;ZXG{ .+wm7Ww|{rk^YvA3T2YoD72 `'JFA~ ys${׋Y:ǫV룎ٟJ|Uw~JJ*gG+fmd7&۷oߺ->ri~?_bB))-8妔W H;뷭]|kBdhU)֊{}&e'c6g_̅~_Y{PSW?7Mn<}8vUmngrf^.tfZvWw::]0yD#.I In~79*\H2,k Wz(h &=BǖGp(> 6_ *8䬄4W$ -)TĒ"hqHT2T *ۏ[,BܹG~K\$"0p]jt[׬}mv{IFX-BPZϔh`AHHu*U*o*+%\e8|.Aӻݖk3xs|ǥKR}G\|̝#el L͊fuҒ5J8/dݴ{9Q|f~ʕ+.{bF8sfh CRŋj [bmn6d-)ZVXy,eeۊr,wZn4N8E?~0:䟸w{Z,!lL Y&c\!A33ZZ.*L!r1fjX"1oMt +a/|̓zw~^ΨtҔ6VUn8hvLryxpYHwS[MԼ@xŌ8F4A[:<%XniZeQ^Dj*,4:ncV-_uۻPojjFb:8_Gc`ύe{'OSIwk_pXXݟ~#۷o{eչwns4HW_|}ݺqixHUhqg}v sc;\S{UT";/Ċ}՗}r%ɤZX6]k*|ѣmA:Zx(۲e!*30Kg"VxY~-ߔ.ݜgooq+m\Ξv>|nC.<=8p #I(鏉PŋK}GnR*HL%ᰄ4mҴ L@> x`%M|b']"m0(^W-l̞^K0NI(KJCD=ڞ 馦MnBcr;]c:4p@)M=v<`ٸ4dQ:T<5䤏ң?Et8pD۲%&ye |܆iڭ[$zR|}MNǞe4;r's!QנDTDݾAbGceMdNHg9ah&h =K3֫t&t?z}>ވuv4g8{J5)| )u:峤F)A0%Qs dC_轁\ ?Jybwe9ZZWϵ۪J@' (V_'-MG\8s-(BZZcs"3N m*b9;ږfO$"&:-~c\!1L԰~A.dCv'X?Vn<9@ @4)[ q5$̋`cAz: 91n#,.WYO )@zuifH.=#$U /Q$ yQ#9}$y&9,"uO*z<?fA/"AzWx}QL;GR3BdCЎT"tH tq.so> stream Microsoft® Word 2021 Marti Maria Microsoft® Word 20212026-04-19T17:54:55+02:002026-04-19T17:54:55+02:00 uuid:4EEAC571-911A-4AF6-B46D-CC04BAC5AE52uuid:4EEAC571-911A-4AF6-B46D-CC04BAC5AE52 endstream endobj 259 0 obj <> endobj 260 0 obj <<71C5EA4E1A91F64AB46DCC04BAC5AE52>] /Filter/FlateDecode/Length 792>> stream x%yLqW0G51,T;: WQYYcʱJl6G!fck!|=|>R5 f:X6nD8 c w/+_IM fZvW;7E&B]\GBlj!Bgx’H'#pXJ|(;h*6BnɀXq[X{X}֔Zmb6>@6$8ش 6ZRlmY]QJQS|H`"+to{#ȸ Cf! I~p,vB򐭽W m"WŐ{N=#g̈́BwAu\/pŀ6" 򕎫\wg(p.b)<kB땨;JBWq*EUT7z ώ]=y0L0jɈy cG|PBvf5^C)bztI=PLKyzLB1֤v|OOǙs/fXcqLAx DތM8J`&Sf:%lh TZ2$1͟\ m2hUV+`È D &VRV@mmBOREvm <CEb[[O4==Le$ qxzЈ8fAlUݠr:Zb.PK@m Bc endstream endobj xref 0 261 0000000000 65535 f 0000000017 00000 n 0000000118 00000 n 0000000663 00000 n 0000000974 00000 n 0000001118 00000 n 0000001921 00000 n 0000002097 00000 n 0000002357 00000 n 0000002410 00000 n 0000002463 00000 n 0000002634 00000 n 0000002886 00000 n 0000011071 00000 n 0000020115 00000 n 0000020248 00000 n 0000020278 00000 n 0000020439 00000 n 0000020513 00000 n 0000020765 00000 n 0000021266 00000 n 0000024528 00000 n 0000024704 00000 n 0000024961 00000 n 0000025074 00000 n 0000025426 00000 n 0000025747 00000 n 0000025917 00000 n 0000026158 00000 n 0000026268 00000 n 0000026560 00000 n 0000026670 00000 n 0000026941 00000 n 0000027213 00000 n 0000027325 00000 n 0000027617 00000 n 0000027729 00000 n 0000028010 00000 n 0000028123 00000 n 0000028236 00000 n 0000028528 00000 n 0000028641 00000 n 0000028754 00000 n 0000029036 00000 n 0000029307 00000 n 0000029420 00000 n 0000029701 00000 n 0000029972 00000 n 0000030085 00000 n 0000030356 00000 n 0000030618 00000 n 0000030731 00000 n 0000030844 00000 n 0000031115 00000 n 0000031228 00000 n 0000031499 00000 n 0000031780 00000 n 0000031893 00000 n 0000032174 00000 n 0000032466 00000 n 0000032737 00000 n 0000032850 00000 n 0000033111 00000 n 0000033382 00000 n 0000033664 00000 n 0000033776 00000 n 0000034037 00000 n 0000034308 00000 n 0000034420 00000 n 0000034681 00000 n 0000034952 00000 n 0000035214 00000 n 0000035327 00000 n 0000035609 00000 n 0000035722 00000 n 0000036003 00000 n 0000036285 00000 n 0000036398 00000 n 0000036511 00000 n 0000036794 00000 n 0000037097 00000 n 0000037210 00000 n 0000037481 00000 n 0000037752 00000 n 0000037865 00000 n 0000038147 00000 n 0000038408 00000 n 0000038689 00000 n 0000038960 00000 n 0000039073 00000 n 0000039334 00000 n 0000039606 00000 n 0000039858 00000 n 0000040129 00000 n 0000040242 00000 n 0000040494 00000 n 0000040787 00000 n 0000040900 00000 n 0000041182 00000 n 0000041296 00000 n 0000041602 00000 n 0000041874 00000 n 0000041989 00000 n 0000042104 00000 n 0000042387 00000 n 0000042502 00000 n 0000042785 00000 n 0000044093 00000 n 0000044207 00000 n 0000044501 00000 n 0000044615 00000 n 0000044898 00000 n 0000045013 00000 n 0000045296 00000 n 0000045589 00000 n 0000045704 00000 n 0000046016 00000 n 0000046131 00000 n 0000046414 00000 n 0000046529 00000 n 0000046812 00000 n 0000047105 00000 n 0000047388 00000 n 0000047504 00000 n 0000047620 00000 n 0000047904 00000 n 0000048177 00000 n 0000048470 00000 n 0000048585 00000 n 0000048879 00000 n 0000049162 00000 n 0000049445 00000 n 0000049560 00000 n 0000049842 00000 n 0000053044 00000 n 0000053180 00000 n 0000053212 00000 n 0000053377 00000 n 0000053452 00000 n 0000053693 00000 n 0000056477 00000 n 0000059805 00000 n 0000059989 00000 n 0000060255 00000 n 0000062306 00000 n 0000065240 00000 n 0000069410 00000 n 0000073211 00000 n 0000076329 00000 n 0000079972 00000 n 0000084941 00000 n 0000088908 00000 n 0000093044 00000 n 0000096212 00000 n 0000098910 00000 n 0000101869 00000 n 0000105683 00000 n 0000109651 00000 n 0000111552 00000 n 0000115073 00000 n 0000115212 00000 n 0000115244 00000 n 0000115412 00000 n 0000115487 00000 n 0000115734 00000 n 0000119188 00000 n 0000122829 00000 n 0000125983 00000 n 0000129450 00000 n 0000129592 00000 n 0000129624 00000 n 0000129795 00000 n 0000129870 00000 n 0000130132 00000 n 0000131374 00000 n 0000134621 00000 n 0000138045 00000 n 0000141489 00000 n 0000145069 00000 n 0000147956 00000 n 0000152060 00000 n 0000156368 00000 n 0000158481 00000 n 0000158626 00000 n 0000158658 00000 n 0000158832 00000 n 0000158907 00000 n 0000159154 00000 n 0000161927 00000 n 0000162109 00000 n 0000162356 00000 n 0000165737 00000 n 0000169910 00000 n 0000173614 00000 n 0000175283 00000 n 0000178624 00000 n 0000181591 00000 n 0000185072 00000 n 0000187120 00000 n 0000189318 00000 n 0000192031 00000 n 0000194376 00000 n 0000198251 00000 n 0000198435 00000 n 0000198686 00000 n 0000200818 00000 n 0000203046 00000 n 0000203232 00000 n 0000203489 00000 n 0000206532 00000 n 0000210016 00000 n 0000212083 00000 n 0000214782 00000 n 0000217231 00000 n 0000218538 00000 n 0000220940 00000 n 0000225393 00000 n 0000225510 00000 n 0000227943 00000 n 0000230933 00000 n 0000232562 00000 n 0000236047 00000 n 0000238735 00000 n 0000240165 00000 n 0000242928 00000 n 0000245927 00000 n 0000247459 00000 n 0000250410 00000 n 0000252313 00000 n 0000252539 00000 n 0000252933 00000 n 0000292052 00000 n 0000292427 00000 n 0000292761 00000 n 0000293227 00000 n 0000349233 00000 n 0000349697 00000 n 0000350183 00000 n 0000350625 00000 n 0000392634 00000 n 0000392690 00000 n 0000456190 00000 n 0000456492 00000 n 0000462616 00000 n 0000462660 00000 n 0000462886 00000 n 0000482745 00000 n 0000483204 00000 n 0000518423 00000 n 0000518696 00000 n 0000518998 00000 n 0000526107 00000 n 0000526151 00000 n 0000526179 00000 n 0000546136 00000 n 0000546402 00000 n 0000613690 00000 n 0000613718 00000 n 0000694930 00000 n 0000698075 00000 n 0000698121 00000 n trailer <<71C5EA4E1A91F64AB46DCC04BAC5AE52>] >> startxref 699117 %%EOF xref 0 0 trailer <<71C5EA4E1A91F64AB46DCC04BAC5AE52>] /Prev 699117/XRefStm 698121>> startxref 704498 %%EOFlcms2-2.19.1/doc/LittleCMS2.19 tutorial.pdf0000644000175000017500000234440415176573557017074 0ustar martimarti%PDF-1.7 % 1 0 obj <> endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 5 0 R/Group<>/Tabs/S>> endobj 4 0 obj <>/F 4/A<>>> endobj 5 0 obj <> stream xWMo0 .fU9 n-6`vv4 m'_,Mmub9 )==*rg `F%[MgGyvxy4I0`Rz.5[ ,ic5,i}.`FǛY9߆ѿylg[D4%ΟN},/}}m_AIn)Ƶ04Z$L$IȌ\Ρ62m Bd`[Oaoom- vR\.7 ?k 1E endstream endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> stream xy\U?s?w," **.Yh8fk|p\!rIr+ w%w47_~1收U;]waX>G~Y!5^ХK<::UVAqVw>w#G^C^^ѣG_}6m(=X^hfhpByyyh4++e˖Jv cEEE|gyFIT׫W,RRR2l0𧈈{JLJCj]x;,<0ғƫϟ7*В0&&F@c陙)Zeee)=Khth\ɤ\h4 =3FiӦtMUHNNVz~_ՕGJȑ#]pŋ:-Z'Y̘1C IoڴI 57d4#WZݽ{wgΜְ0/~!Yƍ򊧧g^oݺhVh}-??޼y6aݱc{nZn~iHHHe&Ms=u7cX>,1ಳU*UeڵwNn޼iZN<<<'1hѢj:ȑ#Bq FsN)VXX8mڴơ7ODWՂ@Jd)w…Gyf}.e _pKR>޿on[ju5"߿rh2\Rh4~">}/МqWZZRJ_nڴID?# G_p3v~pÆ W^yEDeeeywܽ{SWC%n׮]+jĉ.77ۇ~8//OD +]x=u֭P\ѣn۵kwut j=}$gy^p9R3gtwvZ1T\\OէfꫯHGsJ#11>M&)qwE| y{{_tIDe0>qWPPnD;v`juVV^x_pKO<呏?n2j܆ D]|-yxx={Vh ]~UVvHnբ?t.҄-kMRedd'NsoEppp~~$7o^1 l2w͛ [5/4=Z9jn߾k/++Dwm߾}ͮhj*WPPm@.믅kvh֭['.~cA JHHF}Mjt:qUp8cƌQ [Hr~~~HHH~hڵKtO:eRD;v<={vNF={D5gȈfŋӧ CNV맟~*:hy7Nh 0jGpTFFFG{Rt .ʣ{V-)f.11QPGFFV޶m۟YJ_ Dj}H̬|ғFm߾}܍7zQ˓7Ξ=ۮ];gݣ>*o>|I&JO ̘1Cƀ۱chTzNݻWt+//_`ZVzBWTT4zhg'J$=n߾ݷo_g'VtR~9sCJ!`- (!ꑶg$&hdgM6j?Qz?s 4h 7hvW> [}Ӯλgi[?lT=z*绾j F,شjңz`m;=YZnhy<>c)$M/^(1׬Y땞 4_ZNy=n6yJP$9KlvGQ+ɓx^&lo 5_au찳G[p W499apKm{zz󢣭fXh#zT4~"?NdL2Sn3B#o3G?>~. dڰatrrr㕞 9Fg}厙2[*?Ed\1) !!_jlv\uYƩTdDu[vbe`$նmۯZz={6<<\ـD ]zIV` )tx"2Lת)dQ8lLwgge>lvv۷o;<halTFR\E*2G+$HӮ1er5gԑ}3LK-om_jF-^X>sVBieV c9NqGJἫ71$aS\p'4x[V9"=*̟?_ ;h5|o\E Y݃Oxqy^3WOGt/ɸO]pHpukРAnݒ+;w,_<88X陁2^/:Iۚs3d3.yqq!^2)a~kj-m}bpFqʕ2\> ..N]t͹"")*8t/5# ?6>#ZbnO_Kɸ\rǗȼ-NSɸ]|RNm8hm[?PVM쪇I6&O[8ljqݻHh8q"11d2)=ch !n5^mxX2v*F \Pʮwyv* sg)G\pyN`e\soU ^gL?R+)XhLOO/..vvUokJ$34靲v٣Mmïˤq~(1mOdܤ~:ʹF!mdv'&Q jzԨQ4n\nUl޼sJ_ hX<.lZiKh,>GWm--hEfIHUϐgʈ5S&>&먖TsEoWX=LѣDZcǔJ:%󼌖o-'nb?'sx\˳w\"8RHgŕV;"KE;&.6Q Sii%%%۷W@DlY NjuJ9.Sd''b kb!Q>R[⵶nJgZu{Q@|*>gu-mgxK,LС7%9s\6g8B>)B˒q~*I@5999J(}U^p%չ`smǕq}Hd.g528$n-YEdɸ-q/!@f)))J'_R]$4P_\YQzuq>'a ){j?|Dʸ6iz/.d@mik6 Z$d Rn%n $AJ;_EV_ʕq}9UJ5 ȮwCh:ugϞ%%%r˗'8o{En5m08Z&c49#o"#!{ $enZޭ T*;?233V+=077W1cW{98jYʍ # Yĭ +~,WƩTB۷}"t6$ѝ;wFQ~+Kn M: EܖE*y/R;+v}V@MR绷,[`i٬Y8ȑ#m-{O[pRųp"ߝYt3J%9KAYg'Ť%$2f{sUъ׿ I1Ν+ݻK/i4 HMMp999M6Ud4{~{ƙ{s4AI<9KK6$7g Y3ϦwgmfGxdSOO>G'=^{5voe *Ϣ]CPQɫ\ħ8'cJg)O—WR{ĉjߒɓ|lJ06]3w4ȋ3o {`m#۪2Lg=ͩ8⪌kUѰ͔-2Q́\jutttJJJZZڴi |ZbDZQd*!ϥe-y{U2t.θJf=yf_ _Ϸl=c}t AzMe0wd5͓ GK+2{lm *~Ia rN,S**TLY͛mbz٩F ]r%㢶j KGp%W"A4}.K쿜AK񌫊!*vTf?qvWLc&=h)w\d b 䚍p<%WW$} WX g&g\J&GqҜFҩWaȠn_s0^ F@ԉ=:,5#zE3#g)hrqg\OtMƧ+=R1L+1y"KƑ)7Lsq@Yqr 4f[wUV+h)w*9KC8O=HûPu`\G#ce\2 (jri%ۃ3KJ~1{=JN2fΓ_%rgGTQ{YTz3ӹѺe8j Iqx;#^DŽ:l"S~s>}g5ϨͦGlIѲfAܯ<"8!wזlbG'2f۩EO ?KxoZq\N #ycNmUy  oQIBJd͸Z3y^ıÞ5#k F&NL-'l̸?&HغK]54 ߉GSg+yr^h%cƵV|'JYB#ѣCjKUx\egQR :?|^Z_sYʳ+3MFɸ$О8[k;O6Jsڗcb'9h0b Zϵ6 M:;)lկķCgd s,{ѓx?D;c[cai:6vq?te^iѵZglHFy_u9쌌'ϳg(2JD3fC T;0˜S9@ ᱡpsUa٠o76~i>f}۴#7 6䭓j爝q:c)ΐ>dqOwq`PihqcygKL$4]EySb|^tj ]뜔qT"[]}&Pg7=SL [ml4o(bj86;Ve-NSqZק,4*2wd-Yx8ȭy*qTYÑdev_*^nI|ch%ti[ON#eqK#s"oU4Fת1(vs--EAKfˢp!oU:3֫|滷8^-F4GnغKO.bMSFdq#3*FwvSn]:q^o cm3EeȘnC_۰qf}ƶ=t)70#.Ÿ^1|Ⱦj){?$ȗ~vTv\ݤ~16>JxJq endstream endobj 13 0 obj <> stream xw`Eǯ' H $`AAQ,"`,(MitD@PQBl)Co! !-3~Jngff;q8lllllllXx=kbP£k%֡[ oL_I+Jbvl,Qe^/5e-{Oz|]UkrmώhC^x 06"OE*$u ALf jv l,^ISf7d܉ja8ivSl$p&^f]8KfM~[hcasٗO޴_{۵HS-fOf:ˊ^|Mj  _ 3}7{Lʃ-㢂ͮzҸeckRDm G=~{wRAz5]Nm6R>ϞqjJ p w46(üImj_hz?1zm 2*:ppH;vY2F,{۵nM FGK##I./q2|ɖW8GaXFK2wwqx(w)c-Sdj*R4.YzrwERXEK2H4gI{NҴϞ7ZYN/Y"2e2,'􂴈0wu80Q xK?bԋf^N>?؈W"Zz ܝ=Nͳ[n?gκMKÀ6=,ti)(zj^t@i>mZ ^"f%߿*eWRYldA5iӒc_ tRSwFr#棤rpZr,? rh)s2$ɠ5F-9?{J#FK=}ZjOO^~hRɳ RwhngMt.GҋBKx-}ܱ,Ɨz"4jZG f+"_8\o%m#騢ír$VyMgr=Ƴak b |V?  S j)}FpB1e(6o~,/D/|6a|Cd?,ExZYAuiM9rn/{R^m):3742WRWk:s?Fs $r%N$T1x7M|qphKrM-ǥ:Ғ3x hF..eʂ璛y8-+:r7'peZK|Rށ]obVV)ή۱vkrBC<ZwaM \;@@D-<(snQHRK` mX_Kau|C0&SlFUo>@K%B55d% .'\E o;;KJhi#xߑ*25 [ ܴ$̈Z2kR3DVMYߐ*2W Z7-)SWݿMHR`SΈNi'W c%MKṉO)6c/M"]]ML(yI:gG0I7-⿐E90Mꛀ1K+-CpMZx^F3KDt9"nZ`E݊~Ȑ$".1b 4 ~҉\h OOL2ˊ̗T 2,aZG%o%UvPP:ŌQL MZ~Hhl8.E|Zj{٘.܉Lx# #ǡit#^.Q+ :yH„U^Dz|b- yOtdÃe5ㆈLxeRϠNnWI0L&p Z!B(D`4GU갡CIb}92*]K9䚀, >D!g|/ISZe) +P?qUHati%r$A N{[_П40z!uPcz;ֵ1޻% N6&Z6 If|$ʅs$ FO}ydʆ+ȝ) 55ζ֗H\8#$gh%f }@;k):L aÅkИ 8HJUlL<:&|S܊56\%)z8qp9|H@96@+T7@ lKj+HRbP5>EL;$t8"KNg*N) [8מC +\ j|T?$KzѤu`Zӧtg/z fHx4{ONgBŀaYف]YUq3YﮬT1PǯB区ǟˆW;'$=:Nug\n)-.Bggπ5KNfE$A0E^{0szZ LU {bM.o:J;^v`m5UR$ @0n+|C]vB"BW~H»Jw̒Ag$P4Qԡބca~r?e".1N6M\Lyp%>\R4l/1](j5K9*q Ɣqr' Y %hB]DTfDԒc1ܲD=PmZZxUk?KCs5g.R5~EM ؊em鑵FN6 fhƾɘ1fcZwĂ~lh\%о7(a%k1 ~\|䓇-k)d/Z01khI{WKi\<>?,hM6߸%պ"$r #![i.1s(ђuP]du{A2Zr.EPplvQikZP+K1]ZG~P-UaG8eT?i|^\GHB$ũJk}{=S FKbe}ՁcT".INJX3<6W_c k)Rq2C ˬxTR F$U0OV.X{ÆרfhFKڤbn8rR U:6;@^"7Egzfl.vPCIivR rĨBHJpvwl[H F=q;m=݈$9| *Zr 8 'jR^'CJ {)ƁnjXru܄xkvqQ o!j1#b@NKUC<k=  -W1Jxc࿁RjO@]Q1!kӻe0zd1pPNK`^KNiZφqS97 "X g-&5o@ (r6MDֶMD`E? ɦKŝِBt nfTxdz͑,CI̹rNYW`.|}nf&9 7ݒ7} k%@Zr<㿖^k)f K .g"WgW\&ԋ' h6g~Nkj1&]RHy&a4Qhb`]9y9R AG|#O}0 J.b>UZ.ג#_4qMk8 L-,?³OQir劾cߕ]ir;u~*0>sVY3%WKe$>0[vygw`|ay9ߤUe*_QSQ|Z㔐ۏG*sRNwHt\|b""rEo}U;24>x_`VoA2kF?MqC40o_ph)jۍ*4/_BGkd\Uvx"eK|chqF6jX_ԷK ;D}x&i7Lpace17m1L];mťX",\Y=NlWVbS.{zf7D&Lqhc0ȓaBW']6WB& =Lѐr_{ʺdcrضrƨ{⫚jcE(8|v7!]8}M?}^> endobj 15 0 obj [ 16 0 R] endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 23 0 R 28 0 R 30 0 R 32 0 R 33 0 R 35 0 R 36 0 R 37 0 R 38 0 R 40 0 R 42 0 R 44 0 R 45 0 R 48 0 R 49 0 R 52 0 R 53 0 R 54 0 R 55 0 R 57 0 R 59 0 R 60 0 R 61 0 R 64 0 R 67 0 R 69 0 R 74 0 R 77 0 R 80 0 R 82 0 R 84 0 R] /MediaBox[ 0 0 612 792] /Contents 20 0 R/Group<>/Tabs/S>> endobj 20 0 obj <> stream x͝Ms7#*a_&v+MThUIYQ~vc0H)F1g= Y-jIUUCS?U/򣪤.g+YVH3V4mu{k[]{VU^=?mRM[] >h:TdT MztFVwd*'j[9[ Vnxo>Nn1gbuQaL`0IӌZ&el 3FNFҺLu 酙6vr7ГTO77k7@)I)ANt'Eh9h·Oj.y4fn|fK~E?,VtsG-탪>8M©Cjh"Q¶)@o&eں.M p)"H"JRdHI%W & hTHL"A+H&A$Ȑ y9;4 EX00΀ ZִB3'A z9SgILIlh 9! D!RlI4)<EQ=B 5`Ѩng{i33E^8O *$J 9dN1C#qZv%)ҤْRd_9FxeEqChȶ)oDC?ӓ6GZ|(!:73%krF,I&EƕȐ"}A?<D(w@ j:=5-/l?IsIn,pmTU>|=m* 0rw?5i :>~d#nnZ]JFmwcF)jmI4)r$E٣G'=CJCϓY &x핺h,NI,Vtxp=g-O_0ِ7it;r y3o, E(Exd@YI DM)~ŭM>Y̆Φna3lp"8Ar>Վ˅vF( R'U zE科 }jmZw6+d,Ԇ2Ԇbƭ h h Oa/+@aāgs}hséЧI 4-P]: 3ʹVhW"M.I!EcgQYsEMPar\Jx {4s$)'9gr]\,>o5o*HQț RY=,ee3PdMܑ1bXӭ5.E]]M'xP$ҔI1C"EQ4 0Ex$eˀY $mc3$>3dY&! &jhe5) j Rqu0+@t2]5?LdS{imFC/8S4zLFNH74$HQ ў0Fxjd@[oDC"zx\s3c23rU7U6+[Zؔ:h2ngE-:W"MZ]"C"8eO[to (^jx Wn1zWߦuF> ?׊uU0*HQkϥqu0+@&@jxWW|L|.S\GJz,i}nN VﺛPQCcc%)Ҥv%)27Fxf@بY i=1Uw)Xt*( W33j[y9BWy9Cy;bm+/~W =& ЄO. C>˘qd2G E EHExf΀רk Q*x>g;'ѨFmjyB04~ř3570XN04'oxDŽ^EH%)ҤH˒=kG/q.{@y)J.e k^IXv+cB?_F)jeI4)jlI )Jc5@)}5(@P] \2_p^q|1~Ϯ);qH E-Iؗh EzE V(@Нx=v>߸c[LՒoU"YQ+? $ dH o8@N1)IBgT?e*ڎ{r&_sOB VFݏ Ea?_O!P943Z4h|3TyRc3O\αyOɁI.ng,0)^R"M]"޲ӼndLQgȄ?<ÐBw&sͰjd¶ja^goa=w{<{K>#5rg4?jHD!A$Ȑ #%{@Dz /:ڈ endstream endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <>/F 4/Dest[ 25 0 R/XYZ 82 721 0] >> endobj 24 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 88 0 R 89 0 R 91 0 R 93 0 R 95 0 R 96 0 R 98 0 R 100 0 R 101 0 R 102 0 R 104 0 R 107 0 R 110 0 R 111 0 R 112 0 R 113 0 R 115 0 R 116 0 R 117 0 R 119 0 R 121 0 R 122 0 R 125 0 R 128 0 R 132 0 R 133 0 R 134 0 R 135 0 R 137 0 R 139 0 R] /MediaBox[ 0 0 612 792] /Contents 87 0 R/Group<>/Tabs/S>> endobj 25 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 142 0 R/Group<>/Tabs/S>> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>/F 4/Dest[ 29 0 R/XYZ 82 721 0] >> endobj 29 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 147 0 R/Group<>/Tabs/S>> endobj 30 0 obj <>/F 4/Dest[ 31 0 R/XYZ 82 721 0] >> endobj 31 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 153 0 R/Group<>/Tabs/S>> endobj 32 0 obj <>/F 4/Dest[ 31 0 R/XYZ 82 609 0] >> endobj 33 0 obj <>/F 4/Dest[ 34 0 R/XYZ 82 721 0] >> endobj 34 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 154 0 R/Group<>/Tabs/S>> endobj 35 0 obj <>/F 4/Dest[ 34 0 R/XYZ 82 485 0] >> endobj 36 0 obj <>/F 4/Dest[ 34 0 R/XYZ 82 337 0] >> endobj 37 0 obj <>/F 4/Dest[ 34 0 R/XYZ 82 215 0] >> endobj 38 0 obj <>/F 4/Dest[ 39 0 R/XYZ 82 721 0] >> endobj 39 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 155 0 R/Group<>/Tabs/S>> endobj 40 0 obj <>/F 4/Dest[ 41 0 R/XYZ 82 721 0] >> endobj 41 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 156 0 R/Group<>/Tabs/S>> endobj 42 0 obj <>/F 4/Dest[ 43 0 R/XYZ 82 721 0] >> endobj 43 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 157 0 R/Group<>/Tabs/S>> endobj 44 0 obj <>/F 4/Dest[ 43 0 R/XYZ 82 288 0] >> endobj 45 0 obj <>/F 4/Dest[ 47 0 R/XYZ 82 721 0] >> endobj 46 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 158 0 R/Group<>/Tabs/S>> endobj 47 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 159 0 R/Group<>/Tabs/S>> endobj 48 0 obj <>/F 4/Dest[ 47 0 R/XYZ 82 485 0] >> endobj 49 0 obj <>/F 4/Dest[ 51 0 R/XYZ 82 721 0] >> endobj 50 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 160 0 R/Group<>/Tabs/S>> endobj 51 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 161 0 R/Group<>/Tabs/S>> endobj 52 0 obj <>/F 4/Dest[ 51 0 R/XYZ 82 567 0] >> endobj 53 0 obj <>/F 4/Dest[ 51 0 R/XYZ 82 358 0] >> endobj 54 0 obj <>/F 4/Dest[ 51 0 R/XYZ 82 195 0] >> endobj 55 0 obj <>/F 4/Dest[ 56 0 R/XYZ 82 721 0] >> endobj 56 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 162 0 R/Group<>/Tabs/S>> endobj 57 0 obj <>/F 4/Dest[ 58 0 R/XYZ 82 721 0] >> endobj 58 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 163 0 R/Group<>/Tabs/S>> endobj 59 0 obj <>/F 4/Dest[ 58 0 R/XYZ 82 651 0] >> endobj 60 0 obj <>/F 4/Dest[ 58 0 R/XYZ 82 277 0] >> endobj 61 0 obj <>/F 4/Dest[ 63 0 R/XYZ 82 721 0] >> endobj 62 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 164 0 R/Group<>/Tabs/S>> endobj 63 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 165 0 R/Group<>/Tabs/S>> endobj 64 0 obj <>/F 4/Dest[ 66 0 R/XYZ 82 721 0] >> endobj 65 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 167 0 R/Group<>/Tabs/S>> endobj 66 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 173 0 R/Group<>/Tabs/S>> endobj 67 0 obj <>/F 4/Dest[ 68 0 R/XYZ 82 599 0] >> endobj 68 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 174 0 R/Group<>/Tabs/S>> endobj 69 0 obj <>/F 4/Dest[ 73 0 R/XYZ 82 721 0] >> endobj 70 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 175 0 R/Group<>/Tabs/S>> endobj 71 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 176 0 R/Group<>/Tabs/S>> endobj 72 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 177 0 R/Group<>/Tabs/S>> endobj 73 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 178 0 R/Group<>/Tabs/S>> endobj 74 0 obj <>/F 4/Dest[ 76 0 R/XYZ 82 721 0] >> endobj 75 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 180 0 R/Group<>/Tabs/S>> endobj 76 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 181 0 R/Group<>/Tabs/S>> endobj 77 0 obj <>/F 4/Dest[ 79 0 R/XYZ 82 721 0] >> endobj 78 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 186 0 R/Group<>/Tabs/S>> endobj 79 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 188 0 R 190 0 R] /MediaBox[ 0 0 612 792] /Contents 187 0 R/Group<>/Tabs/S>> endobj 80 0 obj <>/F 4/Dest[ 81 0 R/XYZ 82 721 0] >> endobj 81 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 192 0 R/Group<>/Tabs/S>> endobj 82 0 obj <>/F 4/Dest[ 83 0 R/XYZ 82 721 0] >> endobj 83 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 193 0 R/Group<>/Tabs/S>> endobj 84 0 obj <>/F 4/Dest[ 86 0 R/XYZ 82 721 0] >> endobj 85 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 194 0 R/Group<>/Tabs/S>> endobj 86 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 195 0 R/Group<>/Tabs/S>> endobj 87 0 obj <> stream x͝Mst"cMRv*MBZVVL}n (Dc+RaٞgE^FY9jl۞Evs~_VfJ..]Wd*m5]C]̮U_??y]?iQ&Z+5 mʨlKmY*[e&olY/)#iȅ .kUd50aR<:}0(o3fܸ1c{@g;{ƨQ1xe㺌+s;3׳mVs={Xޯ7MUMޘ1%:i}dKqdغhf= O?-٧Wkr3WE7bpXNV卨<;!dor[4Y*%EUJL0T3l魪*"跪!_e,]nqwRQHiOn+cۿ|LKw˴o<.k~ m_0Xf;m.ןT{ Sj0"0tazD/)rUJ,)#6TgIXme 3K*@tncXћvt03/XLj4h9*!uJ4)RMJ )*^=,= ddy"c~L_s#o@NTc@"CՈ9"ML"q=8=^Xy’.s *-_]"wWBΘC]H6U^L&DFkt4!Ax&ŎIQ $UrjЂ_" 0" !W BHiII!E cRD z:@RF3 ,1k\?Q y0H\s9H.Y#&⒵yݤHʦȐ"{?D;2}ƒ LΫp#׶O+Vb"_RJ$aoׂRzL0 }ACq&%E? "K>5<ǤGSйhyF}dEĉ۱W-Iku^յaX))hh*“*z\zRJ*g RiL6sO#!ar@JqsaCY"Mt"CSQqtw#g )~-ے6;9S_ZӒgT˹RJ ^7 .^; :o4׊RdH1CH0 #F9 S24&`nwwV #ơkgunvZ:s]H"DŽRT=FpŏAa?o@yBPE5ɾݶ;Q~& sUΠPy}DJ!;B)E=QC8Ex(ENQ %x9$qG@tv>'{bnOm= 44icB|cB|=0=FE3^}5ij>ߊWjow峥s7\pT}w`s͆ Ixi1(ujFLHyhy)UU}5JZr$G2,XA{Y`:4)R*%EɹL*S*z|zJP |(3LV* Sj]_]9JoOirrP=n-e2a#rddȍjɭJI!E1"~Ht{(@sv{{(hVDž̢xY,&7͘R$$t7:lh"HJI!EMcGE 0Sm,˾f!h)fFBV-I "ߖg  yc>8l$O*%  %ŧȐ"u=!rg%B~ekWYh$)+GB?!hh"Z"(98!E=@H@Ge<MWTW_n:Y*^1 \Q9b蛹buk IB=&zXW44ai]Ɩ>cKGQt3*pA2aw%Xn׷:>]Fp&ŏӎIa3X&<1)>J,Ĥ}C1b$Kw΅Æ=~VT5n))Bl"CSOtu@&p"3L4_x/yíC.*o1Iˀ M#ɓRIQYȐ"uA=L=F3JBxl{ |l#zrl-iee:=!;S(ORKGZ:s^'Rh@ yG@89Mh Ic"dH!CfH(3ti<HA Ief__n*V4HΤOIG0H:sARs$p8/L][9yagmOLJ,I3WHcgW+_6w_&R)@#ACQY"Cόz@ p736(% Btk#AC.'/'/ΟOqitx@#PhDW)\LQŎ`H&f endstream endobj 88 0 obj <>/F 4/Dest[ 86 0 R/XYZ 82 702 0] >> endobj 89 0 obj <>/F 4/Dest[ 90 0 R/XYZ 82 328 0] >> endobj 90 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 196 0 R/Group<>/Tabs/S>> endobj 91 0 obj <>/F 4/Dest[ 92 0 R/XYZ 82 721 0] >> endobj 92 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 202 0 R/Group<>/Tabs/S>> endobj 93 0 obj <>/F 4/Dest[ 94 0 R/XYZ 82 721 0] >> endobj 94 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 203 0 R/Group<>/Tabs/S>> endobj 95 0 obj <>/F 4/Dest[ 94 0 R/XYZ 82 552 0] >> endobj 96 0 obj <>/F 4/Dest[ 97 0 R/XYZ 82 721 0] >> endobj 97 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 204 0 R/Group<>/Tabs/S>> endobj 98 0 obj <>/F 4/Dest[ 99 0 R/XYZ 82 721 0] >> endobj 99 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 210 0 R/Group<>/Tabs/S>> endobj 100 0 obj <>/F 4/Dest[ 99 0 R/XYZ 82 437 0] >> endobj 101 0 obj <>/F 4/Dest[ 99 0 R/XYZ 82 257 0] >> endobj 102 0 obj <>/F 4/Dest[ 103 0 R/XYZ 82 696 0] >> endobj 103 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 211 0 R/Group<>/Tabs/S>> endobj 104 0 obj <>/F 4/Dest[ 106 0 R/XYZ 82 721 0] >> endobj 105 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 212 0 R/Group<>/Tabs/S>> endobj 106 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 213 0 R/Group<>/Tabs/S>> endobj 107 0 obj <>/F 4/Dest[ 109 0 R/XYZ 82 721 0] >> endobj 108 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 214 0 R/Group<>/Tabs/S>> endobj 109 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 215 0 R/Group<>/Tabs/S>> endobj 110 0 obj <>/F 4/Dest[ 109 0 R/XYZ 82 580 0] >> endobj 111 0 obj <>/F 4/Dest[ 109 0 R/XYZ 82 456 0] >> endobj 112 0 obj <>/F 4/Dest[ 109 0 R/XYZ 82 290 0] >> endobj 113 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 721 0] >> endobj 114 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 216 0 R/Group<>/Tabs/S>> endobj 115 0 obj <>/F 4/Dest[ 114 0 R/XYZ 90 605 0] >> endobj 116 0 obj <>/F 4/Dest[ 114 0 R/XYZ 82 447 0] >> endobj 117 0 obj <>/F 4/Dest[ 118 0 R/XYZ 82 721 0] >> endobj 118 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 217 0 R/Group<>/Tabs/S>> endobj 119 0 obj <>/F 4/Dest[ 120 0 R/XYZ 82 721 0] >> endobj 120 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 219 0 R/Group<>/Tabs/S>> endobj 121 0 obj <>/F 4/Dest[ 120 0 R/XYZ 82 379 0] >> endobj 122 0 obj <>/F 4/Dest[ 124 0 R/XYZ 82 721 0] >> endobj 123 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 220 0 R/Group<>/Tabs/S>> endobj 124 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 226 0 R/Group<>/Tabs/S>> endobj 125 0 obj <>/F 4/Dest[ 127 0 R/XYZ 82 721 0] >> endobj 126 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 227 0 R/Group<>/Tabs/S>> endobj 127 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 229 0 R 230 0 R 231 0 R 232 0 R] /MediaBox[ 0 0 612 792] /Contents 228 0 R/Group<>/Tabs/S>> endobj 128 0 obj <>/F 4/Dest[ 131 0 R/XYZ 82 721 0] >> endobj 129 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 234 0 R/Group<>/Tabs/S>> endobj 130 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 235 0 R/Group<>/Tabs/S>> endobj 131 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 236 0 R/Group<>/Tabs/S>> endobj 132 0 obj <>/F 4/Dest[ 131 0 R/XYZ 82 654 0] >> endobj 133 0 obj <>/F 4/Dest[ 131 0 R/XYZ 82 571 0] >> endobj 134 0 obj <>/F 4/Dest[ 131 0 R/XYZ 82 430 0] >> endobj 135 0 obj <>/F 4/Dest[ 136 0 R/XYZ 82 534 0] >> endobj 136 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 237 0 R/Group<>/Tabs/S>> endobj 137 0 obj <>/F 4/Dest[ 138 0 R/XYZ 82 721 0] >> endobj 138 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 238 0 R/Group<>/Tabs/S>> endobj 139 0 obj <>/F 4/Dest[ 141 0 R/XYZ 82 721 0] >> endobj 140 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 241 0 R/Group<>/Tabs/S>> endobj 141 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 249 0 R/Group<>/Tabs/S>> endobj 142 0 obj <> stream x]s۸3|jL$on2;wҴtr}ir/u $"`2#YAb߻G9_E'J$dq|+pr}<>0/OxRjaP29y?+L.rW?}Hߎ^Šq+h7)iLʙ |'+Er:gLJ*p?>k8zU>$ԽưhiAUǘJLrZ1ͧLu{$  8 )żf {mwx<<&2Ʊh;8.܎ng2?Iz#sĤs|W>roڍ wpp8+bВ sp% DS5ۤΝoV,fdK[EݓI],"S@[\IDXD"*Ѓe"_F- et=ʊi4'z@] 7gū#@eɌ8x#t]! lߵS]<$ `cL|qZ3!ܰ@(PEW@79"(sPU=xn+g<=o-mDDLT($'>d"ȼD\DfZ) $hCnUD</apȻ"„I4*JuW Ȓc,HʽY?7ezxWQT;3AbZ|qk ض)v S 3z4D //,p+ 18lLӓq8ИO~%<*pN? I)]h ïml:Zh+]lbo@rn\ժalk5>s8<+L#yA Y漚 nbIe'.&v2NY\dq}Z!/B nËL) }=Pސ)v3' 5hp"': 6 KQh73f~ӑ u{gN?i 3XKWxR iuԤdlԂS)BwP)DjF_H]H@K:QͤPmڦ𶻺媙#sw䢅}  yQ+c$Gz N5I jnʇKj]|}qAy2#K&h7Q"F.goˣޢF6w0y>SԶ,eʛEq!b IH5ڊYỸ@<}>tL@/Epe v  _̭7>I8hX)gR`~@]éJڕ˜):\l3#+*US7}c9I}rPy/XU;C׍-+t97@{hmc<ʈ:*miH0r[Yd&ևˈ x<#S^P&ֶ[%8 ׎?vt30$ zA7,_¹<I헙70qқ_L7(,BWRkAaYyQ, n݊E̍*Vԏ/ l ߁Ĥ}Đ{=,Rۑz$%ŝHoľ/@U:0@'?N=LP19:7žᒉBML Sۀ|dGg]Hz,tI=پ s+{:M2=9` ҠOf\nT 5c2/^ɃW~srS @ x*giiNύ]īquuר)HE"]r\ #FA@g(\Q-8Mў/xspyQAb#^ >TP\IEOuN֦[?@}4l%)Ms]nP`˱.C>#Wk[֮%wc`fٶo%vGho9'%'g8jD'~_B\AD=06u+RkRӓROPD,TVZįLk_<ت³]7S]JS[sU**[?# AX" ,l`G6c!K4W1k> endobj 144 0 obj <> endobj 145 0 obj <> stream JFIF``ZExifMM*JQQQC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQjj" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ~b ¯Vc죓\5J49Ȼzžޝ}+[4RXPuv' "4Oq&\+=L[YFc4pDY^I' 7^9F}ˣ V١KZ3$!e#?JΝ.]^絉̥mtG\GxIt{׺-SEcsBš{j dkVP YC[>;Տ+G<.33~x @:Y!(#4<u.:OC%qץR-?uJ $fizv!=ys4.'P@4x埋-|{i,!g~Um=X:R GB)k3A.3dۍLd]q5gfkRM[I}g!#Ss/PGkF /)O7}f7>&&'B/Ry4qV{/ EU>Ox >Z=?B?*ᾕѲGtH?jNum}pZF< y3yt'DBS~4嚵u7ߞBw |' v79ѰϮj{KEc{օyegXڢ\)eo/ بEN=Ydx^jy};M3'~Z#3 wkY?11WaFCDҀ<4[?$)>k7v*dGQ~P+XN/֍WJw}KM@,2'g 5+sl;wG]Ns00նeg)ƪK8mBSy?juV+ԣ5R1j5)aW2ݟ)43>%8 F %^[G甈}*8|9uT[.da콿ʺ-JK1j%r)Qg[7d^ Y5 =y^CY^xđ[3?.h/l/4+.26"oèhf!O(r=A&M&HZ i 鑒Ve|| aYX9`'qZiΟoyp*O ""0H#^NM?rOj"K%bdt*T;_ 5^9_UBoo>!ݱ~ R\[ ִREé5?wQO-Vp.P5D9ӦG_S]7Ii4LC. x;un q GF8玝?CiwĺK9G</Gq5mγӵ_oO*6 dFװC\EY ,p5:viGge c S^yoY~ H&0ᕳΐ?u.mx {?5q?t786{wp(>cooQg|Aj-s0pH?!xxy5%Wt#?bx9W|Ovܒ&(Nscq BSԨG,fż pv}3ºkx(#H"`0+Q  'O }(aӖ˫+v xQmctĐ:E!`z|Jj i-bYaJ0"u9s# MY6Wj9Vkּ%?A J\/1uLi?$L~=+ȳE#C2pA+t]s'=h%~%jk Mfd Hf+ kԝ7.t+'慷G!_OV121ɓjh(+3kÚ֓+'Qq=};xI4Q)J?)n3{b[,HzxCNOeo('ĭCgm, ҽ;^&+KI9L %_\ yҽ hv j'I+(i:Mk{(v)9v',ՏRjU }XQE endstream endobj 146 0 obj <> stream JFIF``ZExifMM*JQQQC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQjj" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( =H=+7̖Gpv9Nk쎧Ydm;#79uE~UK'IשWQީpl?R<s:w:ܾb^:j5ۭB[}?MVB1 t5/4b9" _z/'rGN;sPU;)2Z(7[O) ʥy'Vpy60)gͧ5Di g!sW3# \e5ajB9j+?x Um#ѭr̍vY ?kO"#k [d;'?;m'ŭ ,LX 5 ZzRC˘y=ҷp>fy6WKPAzZ+VаmI3?)]gݤHd~\iJB"xh++|pR)`$r}]'OkPG }yz.6id7V'毊-+tT=O>o&tiM`j5GKPE2Fs)Q{xʻ,uyBPOHs+]ή(ep2GW xSJԴ81:dFԊk}oV5|gۧO`kc%sk:K_"dvHNaᱩm]GцG'Qu[YG!!I~N{kԑl<>ZGzRM$:ҿSD)lʅ*~-%Mmu$O?ujwev>ֵ~1ha5ufs~TK+cON sY[&{o~=^c$lUں+}05ګXrOqeE:U,k$lVSAi>YyO6's/NGڸ6NT-xϬ)ݬ~kWlCtaX+Uڜ峛@}?q Ԋg/}̢*PN&z6]#kG'"7v>P@%āU?ZAQk2V[8Ϧ]uW%q~8|/IA@IZ-*X!|sC7߯@d/AWQŘOG;gn=3Wt[ Bp?Χ#2:2Bvw4QҚwV7jVp C~½r2:W|Cꎿ"'P&d*hmYjJj/#$In%'뽫uKMr5qm%= ?*[pb&PHČ 2I-ƣ{fIm> Bc\:<="p0r͟^g,<ʼxOFo+vq^ I@cQIgI@|<|;-ZV&#c}#]OZvhA0^H,sYI}xQÊ4mP5uH|_*E'`gc53=~z]" hSp7j&<;,'n@@ bKOG_\"1@sG%//SbL{=1 WthJq* @Y߱D}zlkwºXXDTW;Ե.41?|G&Jʨ:8u}RWWwQ+E!AWTsH 0aEz˙ jCqլ 'tr/PkԼK}qm d_Se}7aCk<ФÕu+t]ss3'-h j#[`~"@l>%zWMh稒2~+ifu'us 61,>ԵϏxdk s둨b!֜$%4M ppHM[3_r:dY]Z-i#裏̚΅5+xHVOuУOXzZk'mHhI>5+G ӒXnm$qf9N{h {;rB.19}&GojH  tMJKq"ij(?ʋ [ GՏFg=fmoom~u R*[{+]>mHa^>b)QE endstream endobj 147 0 obj <> stream x[oFn?>("яK,&.J 2\7;ӓBeVd>]Uf?eӓW'xSfRBgWק'̼n9m={g7-3QGoOO~eNO o_2&rbR!$LaimڔN&sϼd)/^׽IMyj8VYi6/4I"wd`cӅ6#׉1i-E%'x-ti[ tDx!M~f2Wᮁ==JDSLr,D5e!GHšֽ-?6}{`ωg&]%}.aِC=i|*}|ͬÖzS،pe._!ekSp)e.[0{\`e%*4V<0;mK9áݢ壸,<7E]£%5>z4`3._s/Mj9,c$ԛ:ᒠxqu0G I4Iv|(uFNV7yGX)J3z\ۥpE ZEЦs` 3)|y6ޠ%a#gC=7R5E%|Z< +ct(q)\10MGc&#ˢՒ K`ضuݙH7pK jinʋ[yuP@kqKw\mVDxlm.t*#d[hYYaB* >5 wj搋O=-B&QtHN yDޑykB$Ƕ~ tƐFW 7'?+OPv5Wgwl ҧX[ͤ$kRa6GD]@Nu3hF0vE9%|HjTQX\ktF,l2E9#S$6U`Toi;_bAchlT İL0q2B* Rn뺂tצW1 LQ8an\`4 I5nH0ω&wtPaa/|01<:DC-]ǴI-Ӂ0l, !r6Q]).-8!?{@uA9f3z(]j2#*1(H?AFREP@$6/U -Ơ:-1ٳO8Rc-'@*%J0t'_ns+zS^i r9)JMqշ͟J@w)t,]XJ|ܹsݗaS۳k^0*2*9-NN1営[ ֔O'AN 2Bl_ńC |rJ܅8d~vheB72v܉95V7\c9rX!V*8smC5q1Z ųRTjB_^LQsq.5>{ ><\ a<7oYx/\ |E^e~vVI KL,S{,-% Fv~ހ2Z}WJ3cVXR8B\XJ- 3 OcR#NPJvBKo eA! -IQ4npԑ䢇9f>4 mFnxW9E,V͚Uݵ}mhH\=xIXc {`4KQikcF ]4g{R'XO`¹˱/xHռh>w| iW]v{1[^-Zd8~pѧqH>:=ԂRùlE+rWFCq6_l(+ϛXۻέ2rSyCU Шv}x`pǷ0/LcOpvJ%L 9&GM:BT>NˊS'9GC˞:/p>Ρ%%ĝ/[u/UPׁGX~$aQ1;ܞt s^p I#8i#@!_уrM"RO;Ua4ht\v蘧Y.T:N|Sxk1շ ]؏xS|EcL&EeYk[KXG8kޟ]L*M$BJ8ocf|< w+ݏNzZ=Cէ'/a A4_M="^NEUK\T;zJFH, endstream endobj 148 0 obj <> endobj 149 0 obj [ 150 0 R] endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> stream x]o݀ fOE`l+4MC҇V+{wfHJ]>^Ùp8ڏG%+"+3ٺ=>7џފsV2YJif}K]3'럾?>5ϊgz|㣏ϒ@Zr>T2 1]@Z:tDՊYqIpQ8!0f.T\LZ*&q1,P$&N(fO(_GLLp1:zJqf ,Η2)9TkƻD嫇ʼn̻e!Mp՞-*ɬ膐QݐFDkN[&^~n?nMqRw+t^׋&Ԝ:λ-p C&M\w8w>n+r+vQp_&-pvß mV&X!! Py-d]QD@>pos#2K:^&Gxa :F1%!pU+Q-:7 [\;"N U,rt `7拄%&Xn`|Bgv }Wʔk oOj`J)鉔l y;D(j윟n/Ljahp嘨c5p@܃|r)ۓ;,~_z#؞ u[7مDH-I7{ɒlC˙cS`5ͬ-"OiM"B{ zR:8b=qY==$`r?@~‡wt9n@<8O9♬ ^)>R(*%ͭ>'dbM2iAw6~.mP@HrHm&d1掙x: HonGKSFkD}vu 𗘘(4%]օa%vOwDCJ,B'tUjtBZ0acFq:=h2S>pCN3u[,RfEGi~{;pMӖ5|ZDdb#b4yݧd0.Γ~}8hk_Sd^ݪ, 7MCfULWhw,o@+W=x[5l߫"r+P?", %!Oyʥ*鉥rc$eU.,0pJ!L673{XaӊI gj lݼ?--Sb~1HCQiBVZ9n' H&S4ȯ XFvM(58=iLeS¼qc`Q!Mq T_c]Sb1\'¡Nx2s5;p`/}DJAt%»0BmȖO6IR0EՇ0]*Ԯ{*0!ˡ}>hulKr/*D- ҿ E7pRSxPp8Ø` BkVUb -BY6jPyH*Haqp ~q˝/kʺq9gtqQ _Jfv?(ϓU=TY pi5! Q;z|!<0}~v iق@%aƄ0wc5몔: *NXjWuHS;NK V촃o]u泛#Pdgt,[[v1]( bLN!1&FhK1]vhc]# ֶwbVZJpw0Wk('ҞtI\>@8^D:`Qa⍯P'@W6*ڄrPL7, RcWN2yV}Rk6;ЮY{4y,&24JJ±{*' s/R=M{qX O@od#<$+V~§sea:J7 ʣ$,r"4RUIV['aYK`*BӺ-ćC}Ol\&S^`,)<#F-]iyPVPο`U@C׈'Lop @Ap5!ςo7-,Gj]GK0䛛D;ķ yDY1JBXG 1 _!s0&Pߘ10e-ؿDo = 5of5ǜp8izyQ( qR1cH6W)+5+:I9!6sST輎j2-cFMgyzk*M3d=`ߡryc䅫>>swXj;3zͥj(t3?{G /lz61dp&m4#MIbuTL߲1j]2rt4@ə8:2݆훰NνQn}-~$zȆpowEjYs }%ۘvNД+ETC/Vӓ*ֿ߄Q~~V _ݵ^z yשS=gOB<@ +lOɵD=IW[k>>5Ȁh;[O$kJkZDm\oCn7B_cP@/.i`’a?CAp~8z8+aC-_*w`ZJ7)w{G y1Kĝbm[^BBs+/VM-۞u(J”K ̡Ӛ:Đ=v{Quӧ#iFb!nF.+~*{SSHulWL\-Ǥ|yWVxxa{?l>#!|6,{BX׿R__C endstream endobj 154 0 obj <> stream xksgO'%Cɍgs6LtnhۢNz?+?Ipt3bO,>Ea, <V_㣳㣯〱0~QL R!$ .߷`r/`Go`}CкS@X e` @8 #2 ,Dˀa"ë/؏ %:v u˓^n2I.BĐ:L%!Q(P2*xB0g4nnDw"ќx"F8>c>ڔy ;jրq3.P5]0ܺX*DiS~}k݀] V̐0?r)Ø?ω$â宩4 $9-$rAw9H$m%rDf/ +u*jj#ACQ_øn[ZWszUz>_ kQcobvG a-`K&o%L&NetYUԼ$=fŹ`]1G%q"F!KG K_Ab}Z3\ v1^i쀃$䎩$sN0Qc%%Y d`玹 #=>%zq2&3&yeŗ&` ŏ0Jꆜ>}@kVW G?vH@!$tٰPpL3BezıW4sUa8皨PiQk _!.@SUvI0J`ɨdr+eHP}5گ|,n0> էhT$nji& ( 4 Y7\ MRgS%Y[اӔD`iAVU26a8*( gvlvS^ojKtmO"C5f EyEiv/ ð|(X̜sw_`q/.w߿J6[)8}? FUx%R싵um/_f=`d,1w- 7AXa8.0A*?>-J$b=Ǟ]b=ZŒk~" )(le ߮qьeSOfo@O(h_>:љ!c4#,I Eg v%[-'{;0 'X*P< u>  (cU)J@+wL1{c!m!Us*ʵgat:2%F@AM)c"9Q (.`r>"^.Tzx⋜c͒dCW!]i怭+ڞZK+ 3UZ+3HLhXgڇe1g:.ƞ"һwTABUDo8-:0sB^y8vBȡUP֋fTx^4 jJg&vj'^bRENud&B)Sl#t"jcy6 GG2Zqq"QO G[NE Z^Z[YQ41Tr¡?^1d2 n@oԼ$Y0[E$#6lQ m͡ws*75֟Fat.n.LX?6z74ǥiUu?:;щzxC׌Lp, X(sbT}h,)xYm@-!Z%i،VȠ]362_I2ѵrp\r昡OW2fqBMfę<dWqNb`ҳ׼MwԚ|={Ot]*ēfN i;UW_M͞U6,D/_g#LyG̟(7Fȿ=}}U57kG7_1מx׍ Ln7Opע(d VMk `tCIk!OZϩؚ(Limcv֒G[kF jl7d<>PkA0v?G']{caZ;kKVU17ؘ]k0z.)T\Ueno8 ;#\-;-q@tįu)NpTk8J+]eTL ÷1,T{~1=? h놫{]Mw<*"ݍjy$Rz;]hURT3h->߬؁6!ac}AMnY܍RVnP* ba@k _䵀ǖ> stream x\moܸnAw]U|\ڢ\/.šlgw}A}PW|z3!C_Ϛ:Bh=?jw~vy}~+ZR7~~FTR&p墖~܏oU6]~i  n ?֣,lS÷AGt}-\T0d|ێͿk*A?bX[w1|oS{P6u#sQ6{yP?/Ja!"9ʛ.ѡ- U7٘: i-1wz=sA@꿆)0###!f8洑h+ Hbl4F!4f"rÝI2Z7dA2x뉫`9yXzSoM?͟rnUa O%oi* LiGNOCp^lB7z.H'Y]{VC*Et<:԰.a8 ūBB֒NvgPч.NL7[(\ Y[ ":.4Mh { 1f0$%1"`Dav 襛Z#ttt\щSǹt89Ɯ*~[(̯0\7h7MhQ ]#\%o 4 Y%?p(ث;i՝a 'G/"Xxyw̑|pz.=mz~4mW #]vCa?9>d A A}5+0gM Jl`v"V Jo"[={g&WޔzgIÞ'Y ՔO[B\AE3OKj4@>oz^MFTO(15Ȉ2P rH01+uMyM;bz4Wm͗ʒgKk vg!)mG|ɍArqx7Ɓ2-!DA(G A=mV}FP~@PF}&MkP>4ˀѠHJjP1AS<7ͅd):,KG hGԣaI=jh'Cd"CZ1I=ǫ0x,nPס֡e9l 1Ou_ZHT7a&pz y1\c$iv$bOx_wr6ΠL~TsER8a6>MmxU?1 p ˶_3 qY0mC1$u +}=bt2{j{+9]$9q3ORqZAʳq(l\xI: [CeT?O"5ZӺ 3LXãW}nT;LKi_ PGر,HN͋{Sb1okҺ\Z14NR4{!%k !Y#ƐT JǓ;*DTN@vɶ@ۂܾ } THчAbhx0WPjɏUBXڑv|p$ {@Z )C٢FIט2ǸC9Np)# #36qǓaN'PyF E5#!.I TB}^yaR[wY}g$dž}cHBx2/ǁҢ/m*K>\?v%Ok΁gQipŶPa iy1iٗ4%`gBz,7;%--" OӲ/i(ǕR,h21J{{iSYҍL=a=䦿<&މa0E` IaR2FG_ ICJ{&%\ JPph)E24ʓu(1rt YEBeYV]̲EdSi'1ƂejuNB,|?} ?ڝ71_-G6 )/a> stream x\_o8 ^݄'R$%bo\Ewm(ΡHS916Si=wRؤjzH3!)ʢ4+E'{"JIʣ4Q! " 螿);U=Q{;"MF D)ɀ!"R 9,'rVD'JD)궑rMI+$ׄ+l"S.[L"$ÇDQ:E _g<%\:3zMSlCCW&29qy&$u2:ӂEg=sEjjE=)L%-""X 2xiN1x`^ Y/}] h*o3g "]9Ya6_; Tdw2,#xreӄ\bmɪ•fSQ Μ{5dOy ,Jxd|:MLhbh]լO_֮T J[v UmNN%"%l4PXS.' vv8b\G 9;*KTYM{X3̼g%ȯ\47 Lϭ/fyI:Cy/c׫; 6,FLBv (`lQJ mP V'W$G%a$_ߞ5WbW;Z@yapz$N^-M}5xBdpBTqo#d]eP+պ5 Cbri$Z8@[W@Q h=$6hPK2E{d壱f苷!e dt +u_’>A5ğ"8I6T 4"'ߝ6}kb u8 # \nc߹Tޭ\^{z B|)-W-UYahX 3t!N~Dfpy&^˃j.^7KrRl,OIw7& Jܘl=ؘ0yj<9%T<(*ذ<׏Ajp5ſFc,Q;<^` _Uv2lfSK -P~"o"lPD¯7?ʧYҗ0C͊nzcL@5壱^, ),þ[XMGX>[X'B 例Lb\~F6鞾]kg wG4љmf_x*Ƥgs,]KBI~+[yoM+)9)6Ơ3V{@\&8Ww2[s.ⶶHleIlAh;O>K7). Fu[\[~O飙>. j)hO B)IP,ma *'vs[޳hl::V 2컅{壱ŕV: s&XR"*5hOOͫY@U= ϝH]ChLʃpZfzk}YA ̶ L/ L܋,`*gyP]o]n"f(F>|'9{0%]yW!õm z ÍæރC\C8Q~$2؂(4pGcP6M?2]L+ZnѲƠF\{FE5Qu>@wuEik =>=IYJh}ofS1> r· +j=|Ie> Qց%L_k؉9.Wp+2HGuɖs2'GvR_~H9 wkߖ k5(`2 =3Hpc|46ȥȐ2;yH,AeJf@M䃞tp0M7A+!W#T__|pd(GH<KFujVE{-ڂiO$̟D'671,WMWF)kNy=Ih&Kc#00fENC"A7Ii{L M > yF`%Y.p#c8Lf,3<QݼCWLf`0jU>#O]>3& x~a{jjSƆw⹠P5ᐭRl?#@#:ሷKYj,jw oC>.a 4pGcPv&8JA47tүG͇[]x_H19P5qC@GcC5SÅ7x]F~]=Ƈ1WV;C` 35pewkRS$-,*hQ3.e KV hrh+`z8Lo4{磱kӀZ* na5ah,a1 |ȨYlO3? $~HH_T3M[ƍMAA0GП] W޹c$>Tk $si#9lj+f~j9S:/mv2 m2δ1HIvO(eǴxmJ5V+Z endstream endobj 157 0 obj <> stream x]s63l^Jvb$ywLi:iK}Ih[[RE(r=cI~awÃ,d<" yɣysxp]49'ROJl_KBtX--"9q3` QplEyrMnCceG{N%=Z'J&Asfv M`R+RHT/r~_V J569g(Hof$Z\5QGb|,nگ~jYӌF9C ]]bLJOmMfA]550]`*ؚV{DdUb$ #ҴFOLCpWT}^ƣ)%m4r ~_:koɔ wąYYJE~^9>>쇓sɢK'iMNZED"ەG%>Ra @|8Mn5%HyY_ h02u eA,`L\#*RJ":9RMo޽/_AHAHtXO޺nz]fz9AK_ۖ0 /8"MC\iJ1& ya Ⱥd,͋)B&f?2Yo65f)Tٛ' Cy?cb""Vco(k1CB!4|: r /y@psltY 7i|$j:PvUj¬[mNj%l!ZNnDwp6~yn&Sj1~}Z17;߽OOT<8Шg%hE{c-Z4蜡݋zݠ-i'mlYt¬Iw\ MoZ7jS.ziҺ4 GW)3YJ7*#)UYqPث3gH$O j]Kl&?W/)JI=a"aIk[^rZ-]Q&Lpږu\EmSO'.SHj UNejW6E䮪c`w +`OLW>DkE/ |biԱqmHX-Lu@]$PB"*XATMkfd2E صQ "m=EQa Z>"<"/P1`.4+n }.ڐ{BN~Uybݹ7E``~'ZG"OX^Dwat;uO4N,\pq.QDF5TkDϢDev!y,=/j7zŐsr]#;cQ7?9>1vv OYmz/ >y4hɰcEMH@fe4PwPڒQ ǔ=0Rv)C~;"vd"&ő..G>:F8Ϭs#{@I,|V.;u и1kc[UC5%hhDA* SghF)u5o2L!ܵ[- ꦥoFg6MYwuWe[2-L6A9|igg!fӀMcD,SV} Hey|xh;(egWٱqmd#Nn9mT$7v|b$,f.][v栒Qx@%|ϹhQg~ڞ'NVn:BV?BCr$("4fKbXn3q 螎@ Eʫ n";5!z&cl3_6y5c=]6t:2"c~#p_]94\ٻ׵@jʞn{{+taNRnl}).ӯڅLVN)AM;><׸%!_b|q-hծs*(;Q qO7p= G&v+ 8ؙjpT?(A<.;0}Qn[ȸTNaA_هUWʺkNvY0s`3A,,,c'/a\Qz{">\5;eo IvOEd[dӞ =HwrLz-1S!,=7i\kQꚢp ̼LX{^A=xϋ9mb1x2mgm7YTz OCĆFvnpivk!W5\aEQA\{Pa<-ۙѨ^OlyҬЈh@_{Z}1 Sl Zy`nQX cyA\{PaA+IlPda! . Wvf 8:k:> stream x\moܸnaq_جHzi^kzW-Ǿګ=BRk[N%q~݉Drf,4Wrw_fݝ7G;?T3)EgG;袙eFHxj#lvt t>fO59Dw{|/;Am#kK4#2RE"MkRYj"YEnfRЋ\H'5 e&€AY<VexA$jGRf6s); zc3s]"=؆lX. 4ZDž.\uLf2 'Ssֹ0Wkqp]WJ A~)WWX#s!Qz '# w؏g"ק )O.|iaIW9T 3"O*Ee.y/A=_zW"oĔ,oR_m><Ju]|"HE'yxb],nHH6`iufBnZcA䖳y{ >%a5|ݵI s46=B _yɁ]}Hj&Bt#ʑ2i^6"xB7eц@ö}]Z,sU =NE*g˥[>%wU, @D 4iR܊糪܄z+\ۭ#.f54X[ͼJ{U79E#%hϼ~d7p|}ľ.-n-g씅sxp]Sٿ |N7+ps-T2Ъ?L'I8a'0[*ƵsNw!*d$鸷?A䏻' >FzxHML(ɆZhjЅH[Opqm=O8"8qW2!>چlD.x-R[}h y|:y4ŷVJXZ t?lc1[nG@BA8!!  Eza%.I+kQ,d V!*4)Hlc*I1FOh #ۈ$Q1?s~M^<׶QC 0mjP_ b A%бJlkYSi'p8YJ,4N1sR%8T~'܌*6kΞ縲6`_7@nGc{ <ͽxh}:JDoO7[F}nGh7Pc >U&BngqU 9 c(aaC]%ڈ1L2#ֲ^=ZD"'mSCȀI3JEj6cd1;qy ?|&R u%Ek9F7(_|Nn81fHܠ^G6:u?O| o ( ،(aF]%0ڈ1L2#ֲV|xT1T! PuCJU?~mPai?' iGQgM,Oz5}& _[Y.Bw٣)aUtE?vw8%^tMQn6ir¿r^í00N| k bXboog؅yeYoWk؛..n~'ԓ>~%!$q$ީpNM'JmH,}z&g{TP/b:i9OZY3%sƴa{¸;ipJ5a%8Y cVSY3ߵQ>\PtҘߟژ`(:wBuMYd.9)-6K0%E]Qe}@ n}530T7gUS?jٞfؔ,:pXd*vlP)$sӅ(NlR̈Vg-橑|绅̧Np%zA3{@6 9f5¥00^`zsڄ0JPUpxСf;X /w06pƏ+Uʴ-w_enqSyrT fz-2#m֩I)'>"xv(bwfW3CM9;O6bHlianŸb~خ.x ]yukl&hF3S̶秅 fZ73;\&&$ڸm(Cnܼ\{pL߻%!w.}âcA ÷ +tU/1Ys9em -<= )LbZ.:?(^ՒUn*r.h+p`x.ҦNs䜫Vb7M: %6aÌl-MJآJF]s*N3i,Tk|FzKӣ1 /M3BJ7jI[ɤVfM+WY1J"]i.7[:ط6ld"V7%tf ]/W:]G(yl/A[҅S2rIyw Z;syT_MX~,VBPgҕmGL~kJ.jZ }Z v&h#C2/[:/ ٝ1G$EAfPlfS% ]!R)M95k }“4K 7KgT\t r &L7.1椫L~%3)e4'/4\odz !2"j:?"|ƿBDق(+A[N:xtu7Gq$ Gr5ZNO+IJU.yT5Y7f,ȯsbǙ&䩳ޥN0+DGG?>wt%(5{7&gH%ɸ.G!!#{EJae]{6 'R_DQ-(jE|c4t+V8KΊ6)z௘Qf.Ggpr,04t'Aӡ\ p(E!> stream xkoF~;/{}HuGq/(C ˴%4QJ3|\)W. 2]㣔pIɺ<>z]8>?sü4IG,+["`(/㣏{AI M|`R$ tgxZ,IS&P iz;6 -CLvwVLZ*&exA8R#Q/Dr1};GV07,Gj4( |$=^Ǒeǧ7r1(- 31# xH4IGk)|918=Gvys.V+g>'OKWtV}!N۸8mߎwfh] 17OxX2Pȸi)f]+S-b2U@SԱ < J5|8>Wy`E2ZuF+B{%eseao yל.ӌA6u(6-#vbYĪwkלLV!ӊߴpOB6O9˲}(.6*XoJiutM0pjWNOb#[\x+xTR5]$چ%*qO+1AҹkJW8!D6-T1eXmy1RzxBmR,u:* \"Ǽ'-≞9`#yJbzѕ\`meUTo*zq{톌J D{{Zɨ a=6n/;'uE1 p3cC"h%"xל)CɟX{nߎ^rMMX ONy IS}$qLO Kt;sלtʬm#i4*> }M#5V4-5LJcMh.G,= Ю)m Ԍ B;|[ol4Rb  ~UIwVzge3;`9U l7Ps"Ӵ^¶p^+Ӝqh =ٮ֌.k_|/^(;G=+|J"eo"vetr"wO&!@MyrL0ty{9Y[t :vL^Ѝ_)XЯKh:gVomK|a8L>J{,f`B1H9Ks V@#Ks:pC lA v oz(*8u曲 U[M+/&4PIP[^e*jꦗc&)`>:1ϤY͸pOn b3$ec@kY߽r=7 Fv|f՜ә}H)%+toˉry ^#=I<,?\@w:#^/[H&b6Վ>XQxbEp>ޓm]RxZM.Za@^:<&9\uV NOe OQ^|/pһ1^߻x:QL1ӯTI |Cte\97 nדܙ7ͱE!&z>Ÿc(^he[8"zSaxB0Q0!@"m"KRii2W;'RDxffb0itbh:czIE.#*HGo< ,jM͕_yA2p f4&{S&_*fLLpD+cJ~<_HC'$UQba#ϟ8/?:9ҟ}L0`4,ԢHݾoȺ-\:OwtY?|}ժXPaw[5epm2׭@jTz8%ۨqJrs%۲RZkqZQg 峱!xWHx7jjem1VƂC7Ku#jDYoG7G3lbPi0XKp̖LaDo!,`ۊ*d99{'EMc5>]il&d 2Hf[j&k'ubMkYȦupw,]<|ګ,uSH$:<8O\&y'hrǎ4 p/n렋VOVR^p:C Gl|{xXE=pTVL[0iwq~uM;DeBYŬDe *@OU8UEsl~vGBg2@{>5+L|GOHx7[=no- >l0Hc`J h{<;_n* %۝la"R S-BR*nwR\w}(LVk ;` tyqXڷQ+ %M5"EXEM.s:gnO|їb3d.*6|;w#@J@)cWAY{3M2!@:K> stream x\mo8 A^ Hc&ahd'ˏ&ZڍLʻz+: _. EiVšPÑ-s;Bs h9KMޛJz-ʮd'нN>?wY4'J'4:^B`7Ym;ȦZ MDf aj]|  د9HǓ'Dĉwmo )=,LC1V6{hrE1K+W`|3d2Xf3hXxPꡋ(Jv׎2ՖfיS\Xv,mKlzQ =V'Y\`SnIʎF+ˏ~-3ڒ(u=G,4q|Ę%IF4?)W+ՑeiJ23VR++z%ʉR Z겁cO1G\ʝzA3e"iqsmjB܉}lo\z0d$*jJĜ ?f1j'0c>c >FYJɰ239ξAg:{l><0Iq$\&Ze-À%Fxr̫pD,aW F)'nYF#DGGDF0za.'ClǛcqiSub],>sXO`<0 3 E\8qs޾T ~Kc$2~?/ub, 4DŽ< {v?|DϹp1>}:3{}v~=:>07\gx3׺HA2't1|b#f6?(B5w`wD{tCs IPtZ̸Ǥ[5g]_er}sxS|Vq5bK)n{,o A>>պ^5vA &jjPG'1M. փ _PEQm 6J[FT_AGce..ު\%MI}ŷip -AcW20,.L->`D]mf6,f0J9fRL\Egk*"ԫl0` +/n зo?>-;~^ 9ɩ7,b&ժwb4vdTW}38I>.ZV-_"`a>^acm+n\7qc=Aa3UVLi8Mvmj:]Z{n<ƾ[5biLSaއG*!;9ADNDŽZ."[% ۇz*MLEabn4h(ɕNJT6*̴8OW'w5b:8UA|΁ָ/NQl`RH,3:`^k'ӺvTLFͱ]7ISwTz8}xfyI,7rjxFo7qx߆#>w~ bu]'{lKXp;j FG;`U4-V T,ȵXV|B4Mcr՛Tm*@wѰ8 J&.꓃/Ñ@x6~Vh :HeLJ rF},!'[d&P[=.p0팑#('/q%FR%.S=G!Ql)x[6rRe`[WO!!B">Uu=miRV|HSFMX,'i(h 5RFQSz}%g >)j }7+3, 4Isi=V|B4 cqz B# UՍj R/HW~i EVrsBiXy\̗r<`M1DG`MXX<'o-a 6h3B-f 4Z,}f9BXa^;ďʪ>MxTg GIc;ԛ T!@Ӭio`YUIP91A  K_ᰎٷߏOpa.po2=TLMLZF-vƛpU}q!&Ҽe7VU0Vi,<0Q dޞ-070YҼ=bKt8W~.!Vp ̞zp*ňϳ 736-Zج 4)э ǽQ> stream xksf02#~'uƍLt: jl&H;ʯGQfZ8w{~Yfb<ɒ'/ ci&yY’*O 2O*z JnzxgrCw}s~,+sxgm&%4UIY*`Ai,蜗i'eJ*>fZx]_r_Y>@#A!ѡUiدbC*Փ3ȁh=J&9oTR& <"X2CÚDh-/\nꭽvc]2X|Z?Yl߫1 dwB>y3'(YV IBg\< j [6[<~<́vz j"͂sY,f{DHU炧UF`[,xZbDB>֧0O57sDE PDepQw/uv;V#PId͔4neepW64ss74g=I#!x+A|hR=1QNYZ\(0 Q_[$βl/^7Ȅ8A/GksapYKY(sfqսw}z uffwu?&0r$RlmT4gpėx}LOӀ(3EFԐPvEZ2QI@? /b4]T\2xd)eZ9,HN"km%ҢJ(8 ~BkszIiD8#Sl!7Q$3¹Cٴ/^  ̊k4zhl0;"b@IQɼd MAP7MLNc eVY&!v("wV_9[XUh]I4Lo!4QnТCz6=ȭ KKDspdI~"&#6Kkm1. g fQ5!xD)~ӵN,;A:_gux7W̌{@K?F^RD?G1"Ę?VyC?Kftk\SȪ_x ^\^7j- YǓL&85:%ӡQ)׷Ι"4FU`8nhe/ƍf;Q-W˾Mhb\LddWLUBB4 O-$_XKKhfӴ ')75=u1hr,շVl6P$Z;N 3/Y<*WQ^аL!ީX/JpC>y!T~ī_ok 4vZepP/g XHNX  ?'<:Xaڋ|1x3-$poc,z7=IrׁܸR4i!BB "ysAic*rru_T"U,IR;UX>ĽRa7Ip=a̚ iMck~}8 ϞqyC#Wü3{Vh˫K{_uW `e8Œ+NoByEs+$x~Y?`D/wt  ]VtmÂ)c9&Ru5LAR=6gLEGQO%{QʈgF:%^D3Zժ#B^TD"L"<6gLydDAi񵏉 oM)hO LݿG&0!G؜1!JKX w:d{{h$BřY'g)4Stt,|Zs>g'ܦA1xl lBOH1xz^*- X|q9LWnCKS Sl~lPwSMOMiC7ӾpK1 0Zsens1@GzԆz'f)GQ[?=nx~ $oErP-jT[ܘ">)-սz>S0&Dhcm g rY ~ n8=qfDL^pł.Eai$8G%OQI--::sq<49ْ2zzO R r-EW;m~ 0'&k 5I87uQ;VfT&P:bm*3"*2e, y$иY=3\֝F&UygeDlkm[ҵ̮ik7ȶCbLbvS[Uz@K >0Sf<)QyD,hDz2^C`-M-!$| siJr0真⨑XvD Va4̨d@I*ztZbQPC^D[M0ݭt~κV]Ǥ7#VTӟP{,xik55WW!uXU Swy"y\7rPHf7\dΫOys2Xk"n*gYUhSS4s0U-%jïH+DZn~Nl;_[kU e꯽Zl MngQ-i~sHgڈ<.t}mӧ^Rl9G;`M4SrࡥD-GyfFN/~uVV` _PJlY8ABbSW5}4~rDp#{YK;e3[%kT0BFK[ D=DߞH__\_e ^ ns'(xY9ݵ3Tk<ћ+`F`w ga@B Цa^;%uĈ*'G`P{Xn%c̅J Tjgy%0R޲,Fp=<ڭ+^K]קhs>.@t`zObˢz6 6.\MES[lq5Ac`LFQj/> stream xY_o67G9߭0Ma[=(x-ײ%ٖ4Sxw<_PāOeXΆ^d8p@4ЂPR\p?foaL~?.AQPI KTk-" ӁĈ2"]8{y#rK$3rm&pbX(ZQjLC* <\x.u8{<֭)zp)SM4a:03#DQ4;v%sCy}O`»r8.V7YA 1KրT)N^[5~J9?/|yTln`6_8جe18^|kQIAT4埐ǽLD<鼪f6/H]$1Bu9{Ns q+S E tףD.AgߢQbsڡ4qdQRRK"i{Gשp5Ր79+pǭ&LIO4ʴ)ү]YmSg=!#xkH$j'$XO0pȇTS|l8~j;u>T{[{q vi8asZTV 9"kU_ {?Nur򫨉B Kz3;+g觬@~4j0-j]AYώ?pK*=7Ҵ&x D$4y/tBc,Fz[C F cT94hz 7&oۿy߇AUdGvhb53ҠE#!OjZ4o!\"ܒu#*xUbw q!& 'T&hE5Y TWU\&2y jJ5Ho"w`G #?Lׅ)VJlXuw 6]љ.mPlӨxǕ\$̗TPe6t.?(a_gigP7iLRtHV_~jƻMZPe=c!%(- Pٖ6j U ͇n;A}g|v;;(&Àw16=ADw٣Av G]S=u-Ib[T݋j]쵎UGn=K#8 65Bl:H4pvJWVJr_3N/G,{;N7+Wv!x=+)ܟ}Vܦ cp&?iC endstream endobj 163 0 obj <> stream xrF]UTȔ`.OrTj+d$&Hy_=C9 螞NO8?QoVhUmT|qz9]\0D,U`(*NzG7-3ܽ:=s]|zӓOς6"rĤ$P$VZ,NT$y˸Pqw<&iHq^J05Hgɤ~ L Ð(9Jr\oE&ӂz*@8|p.K D[]9r YEؑn_ enzCS33 KzݦMF|prSᨘ=5S!OoZe!ѱm*M[PiAQή1L/WcØY+ z[4j ٳ`㪈e]f1 VEewQ#Kem dy)j}&yP/^],WWtbv{feo;R{3؜G6@w ̆$N=nDA@߲I}H9c`kTTd8S?w#t߿W^5gKķ a"ΘwK<Ț(R@iw'$&IpE[֙+D|]|khDZ[c"`Tt0hKfPׂ>C*ubt\"ߐfFW1"%Zj$\8j1Gum{;y+[)ګҹZ۞ɝ526O({ pNi9%~k&ckе ?o@Whd y6KV)%'q p" wd(JyIE3!srGo@qFUd s=NsZ~n?ސEX<4ѐ^1`v0*{Q<)cS3-ҟ~MW8ǐ\'G =W Fgsރ0W^gUxa (;tj=ҏqe\ξACB^#F$C?K{Úk=׼2kΐ(`^bQ>R3?8at==lPI7 sp93&]}F|oˆᯫ{K)~tw9Cdy_υ6^ $˜Qݶh"dLX;=13o2{_ԙB,ۻcgt7g>? tݔtw]sr!$zed!q9;Lr]f4[kŬma0nY5+~?>Qr f<ܢ1 /P2gڡ4He j6ݞk6jvY]W^.J0쨎k}Y\ dv(7 |p3s/0BF3Le8;˰Yh29wlESiUc)JMn5FuP^0P @kDxa ̰T*. BkkFYM .‚6%2,tBO{&K"ZvE2Q`ӌʥԯL*< CwmdQ<Ŷ0tAUbA vz.ݛ4 ޠRkԊ|*LJʠPSIkՂ]  tx Sڦʘmh챚swB\Rv6d>Y֦{8[f>l(/Yz=3iY@E76Ok͒}*}{[?T l m8@K/q\!b#)Jㅮd74vmBxp̄U-mV |33{`<$ Ajm׀X nem/Ҷ39P>'yS.|huufmY!mZ䴧)MbsT" MkZ4=u ~}_&Ly4yP'_j&p@)i@ȪU'Q9c%ku"bH~n%i;( Q;V_Ƴ0Ie,AAv%t U|Ոb b2D1tՉD P]/@OK4Ĕ"8 ۧ0O; {[7F{΋&uzO٪kt)%j)Dki2'` Q}#!U"^@Pc4L&B@@$wxEG& aK\+4s.r*iy`LK%b9NQ;z ݑbDz%OZNMςk͂ۋ>|B5PjR. 'ilzD|i@װ}'sg${h?"LaD_=ciL({jhs!/,~]/ X;%F="+?R }YhRkȐ=]]j܂jX4ͪt Y@]1>IY%6>?O,ݧV:dԚMP#-}Ā&r5u@uGML7/V~ ~"hpgCA6 5԰,V0= g\ :չ+CS~)' r^ 1  ݙ6swӵ>H8I$]wC$1WVc\Zwxj̲_UH՟}M׃]4 ,M+ht(PWuL.!{%rRi?(`٦Èo·%,P_+d]D ;tidCFY!w})h1;Rժ *:w ^"Cot"ͣ]M\1,0{,(QnjrT|rIӫ|ZADփhHVR:mtVyA[V sX꞊`fL(z:Vx#L)F@j\R`Eqѩp;0K,c>]Yaw+` p3U*`tDVBv#l+>IGmU nVUW!Wwٸ:i}I:"u _y+zɈu7".{V24G "cщ+vxDͫu&ddGCyzs1J8eo?cd endstream endobj 164 0 obj <> stream x]o6w͊/=q\N&NEr6ul4S>$ lKH38$ģ)K_E&Kfm8xw'"ᜥ*98x.MxRhQ4ˊltO^ɇ5|3@w{r(79ş|em"|Q$t\dY\LIX.Xŋoݷ+"]deMVI|^P&ᨔ MߌxR~Utq5 ?פR|>BK 4Ep(y5VXWc=|g <[-//>?d3>G@hR~2j^RdܩO~-^'KPj|$Q E:l8,>] /xaYy2d=H1^!޿n%&,\q>:GFCԍY+"cG粠~>S3UbJ-QG!!rҡU3T>4xxP#-sUz6Y߀R+7+L&1@td=|Zl ש'5ksr~Qd˱x%#Z))y1{Er bm b-q /-`&NИ o`=^1X_cOяxp(&y709ݢ8߿t&3X~ Lt5˗H_]4MCLHԕ>+_ޡ.RZ{VR1UFwu360`0xE5Ɇ3;zU#gpl7+[p yJFiO _쀡Z i@GfișY&ݟX.KyT@;}Y(mVUY4M0 w?ixF]Omތp*+hVqfM'h ""$ X~$$HW&sͤREu ςX|Ӏh} II=:Wr5>w5IV,eYYip]7 H)h$cx kZ}gBaWؽj6~v4q |0j"ip]78x3͗wୋ7Y"M LPY GvM Vub6QYԴJT,g\8RebˇER7Zbe H, M # M62AeZغLd!ANIer-h,=3( LyP+1k YhGcZL&4Bsިh+zB&yk^X֕܈)ˢ>i$b2R(9@9\/7H[#[#MuH_~.SE5RGX3z+3GK R#[N/cWmY}qɪ' nyS$| ͧ0$/j_~T2KuBHyR(cs.N-%l?Y>/-eYwn>]n˱qƷKh.M[ZGT]z#+}sG(Dx(* ܼ{4Qeʲl1!GVAM)#=gJʍr<ҺB>jyq×4u%[iTs/jۢ7cjk/0fy߳5aڀysĉ8:@֬b 瘝k9=J-3&CL-\岌9+ VѴSO8*04ߚP;j ;nYTN&GU^t4 V*\4fyws4weq`8fqioDž 78 lCāL7c{8`:+ m{UU0Ze,)K%^ tBUa'T'Me|fH?ͨ:DM k nreelh1_0 +J<*'fߌ0,}XX$; @$?vs0M_B P @0@;i-8n&=UP|zď |AK2_C Uq0 [;Kp"LѐYG1;IumØ5:>T^ee[Ɩ./Ѣj^1d@W|XFnFf "e2eYC}_Fv<">G/=m̻ZmTsb#j;`=}V$G2@Qm(z[p4eNJ#CDg`PVT7cU;h7 tH#;Vdj8l:Hdtøn!7S"C'h{_1iKr95{ 4>DO>Β}Lr7x0_f()~=W<eU:BU\(t4QZ(l\ȪM,vK맋Dwx~t <'~?q{'J@f{C%:B#DMOJf&ryZ?aWdĨ e9Sh)bN2WBwPyP{UqpEk+2>4*c;vA) LĥInc&UFɵ2k@Ic8e҃{Qnx'-3׮߾sTmԕĕ^@1Ok*ClM|(&f]EGT໮NńjxlXHr=<[1n"$Sܢ:pvCl+M 9%'MiNٕQn6eɭy_H8(7s>[l03F]KM/Y>9XR.Z lpҜ5n(_^ {YcI6~`N] t c[ί'$OOnn> stream xko6_nU<)^@<;q"=Z+wIofH=v%6@X+#Γrvw?EDѴhtw篯D9KTtz.xiơ)U,: ƌ>ғOww>ww^ˆ?gI 5U<j-R( Y)fu3^"8i.3[YI|^P$&(hx㙈NF<ia:GцWS3{aL6]d.JjtWr4( mh泥{j4i4jnUC4A 7 Q>4-Gmq(M9;Mg=y vLǒ'^\*7)xRtmMxL0*#N"Өd48-%e<-Ou›1i/aZ37yf†{Y \&U%Q1v^(o-K =^rHm?.p&0~qě?kL,;@;a @NoAO&g4N];:*nj%:.jWbx{z&,fn`^y@d A֜2 FSN?\ lygR/\eڀ4Di?ye?B m?VO6RzHąϥՍ[!r ßB݄? `z#`oc. (k\vbLxӪiz=z!PJ΄D`H/Qt|N5DH0y!+&&|1Ngx9v!lŷ^F){ӂ 8HaUOӽ_k6%$IwQ2$@yX&%GABISA30) *::F :Gx& Pj7xcRpУl ^1r 1i ]֡DIc˛0_O|Kݾc{2so]'Y&t,ݑ!  .h>vqq?ܣ"q꽑'[3aYq` V،ٴ횐&H}T̮$@*4@FiFr5UPk*m ՒMmvl jKda7#2k827WIqzvߝAW,~y4rڐĊvhD0MY 9U) :_$]ZQ][MŦYDw;#yA5eQqJunLb%JCo0 IMղU>Z4W\9n*hvW]q꜡Y%IrQW1UgТp&їk_}SW!.5ՇU=߂F[NI{'w]isceTNUJyOjOe>e^k꼨2 WT=ʛ7Vh0d!iUޗ 7苺&Mz*<yW2LvR!j90$ ;`-n Ѵ¼s,ͶröB!ɆBA(s K`'%likQ(OP|tg@}%Lm%<#j< Wwp,Y܋5^!eoޣq*M#,1 ,;}pOs<m~8WDq+iGwrI%5nS`.kamˤ˾#)OmSV@\Jp0,C%&>I$]TPDjZT猶>] ,<` Hr$xd9&pȜ׹D>@AKSuV.D87Qu?p:^Zx z"'{8؁_#}|j ~ q)oA@Pا-\@P> stream JFIF``6ExifMM*&C   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( (QP <A.2 )وEc>!3N3xo%:v6PQ\xd$>olghUE Efj4 fIi[ݱ81AS\ SI}ԀZ( ( ( ( ( ( (t1,2v3Pkq bGwm'2/!x"/ kJt-q 9#e(?5)R"6Y^ t-BZ3=ߞ6'֊1i{n-y9RL>aj;y'֛,q}e;FNsؤf Nd3ڳb7 5k;[P$u|#T6 qٱBwr9[a#0fzkFʼj Y$|wV"Hd" ;أ[tSJoG_U }I\0E?i6krWl?CSigpUbeOK4;.'b\nN}*j) z5@<zUBAݛI7I+p~`]&:' S4?&=GI~ss۞f(((((k(u* \ Kü=I)$ж#Ӟpm;"ZDhDm Ē mϞQ:FU IkƠd5ʓmKq$2Py.~Wt㷈ܷ@]I9"'5%8$MVMr~TsKxc["0sOHK /~\P)[X H6վ;yYO k0Ij*;Zd%Lo2qSyv)熭 G5܊C1?o.Isڵt]O*sRckqofP~|cbE ?jҶF8Jd_5P#kTXĭPf*[֌qEk6"3fqmfƱGEXu;i^ 2ңު:D@wOzc%L60>K⾉Z3PNO \ދt.Z{Z~V=q;U^7WURb8ȥ{"Fn kHg.EQEQEQEU=Ru :kV=\8]I.5‹˲d/sK7kq&<qY8XoGC"v#exv 4/OޑPONσt9T 3;AR7^W$t[ F+׫B}NfE8iScyai(Bpf|d㸪&RwB+{m&B Z]Sţ퇕ۆtYOS՛/뉬,f Te+T'3̌;0A$]9u6<Ǘӆc}9Wz'mј%"̂}Aփ۸f&?s:ZD\:*n_OUH9Z,F꒒Y{hUm*~1k*9#Lѵs 8}[9ܐJW>쉬nK̃ 뎂n*p¯r.C,]y'C+ XТOy#n5mtOH9܄AQ2IeeyP4>jC$v2ve+JɍPIukp+{ֶ1XW#;j6&(;Uֱ/0˄#Q5-,k0c* (dO&@ʿ#0J gB2zDƣd墖 K?ʑ~` CQ'ۋq [p GGZ˴v-Pd3eK}wyo&m=z#O b+ぺ>ߝSBMzi?N\JgMZi 6}y7s0WLscubn xMxҧ/[y <9 4Z6|@Lzh)mFH'=j9_3Qoqe@blbXEWaF.UD 85[Om@nfA)|*ocF Qm:9.d}k^O۷c?`^;NT685j$ZK30ǯjWCFM{T'a,=+N;W*~nb-FS4Z+{ilf#'' (Ο22<67Y W]Y[I'MP2烜TUm܌qCɤ΋VH%3:o ?0b;Qe#<-pcF ~tRhsJ&e:w:I#MOK&bFҲZ5t N U`FEdO U†8٦dS.t6QI(rq oȿa]·VdPdBΣGKP?E=F+^ `C.XU>?ʺaVJAES (((J%dm (oϯ^X7B@>e['p+oو2IܟOi%?皉!My)gʏҨIv8iW=ZHv2/'pG7it? >RpKs֘iR:չ¢Mqn %F׎K["uVm-ql7͂ k2hg}M-un pqWM;C=R2;{>^o)Kp$QQD*|g(4EeZw1Au?-wL2r<a=w1o֌]g|`jPfiVOs7wX$P#UܵXm&H[2emI?|͑ۥ5g8^e_j>nmٹI9_l+PٍF:46٫BFA9V|Ci #A%_Wdmim(2HHkSڸ?Xk~쮥`NFJiߗSƧ>(9B((("R)PlUO3+ ;VA6JR` jsu$]{V1ֶ$eM2+.#=鈫,Jy+ڮnݒM0XUGFm V{mufpxsKC1+iBLg{T9*Y$:+3PrOIv5oݎ*8ByP ͅHĊqۧZ L #drGĖӼ$l%URzMi/#H-Jvַdhc{eG ӽVURXY\}!dr=Z)8m{VSЮU7G,CZ*. I~-c0@gZ嬏zP(jvrtxzo GN*ƪ&7#vv Q/$i qbqz)~-FsE4nZN.%o$u1]W)upNʹ*r;Jڛnqb~;*p((((( 0 KEeZ4y>WҫT.L{;Ciޫ;TO'ކ^+#UkmY#HH={Ӯy *>TgC%q5[Mռ508 x^ajTL1JDu5h#"Ǽ`7[܍(-Ðk^HdzI#5Vn#MwSjRr)h)i'?(Zq$_i!;A& ` WQ8Zdr[ֵҀYⱯ,aI#ex9~">f_ʲ`zS!BO|7a,,H<z]x]((ǡ=IB^\mEVAEPEPEPEPEPEPEP[En^i-(չP\[$ :`eӯYIF֔$ң])Ƣ呅gKa?5B+]Xao#YȋIi7X3t˺JVnEV5* waES((((((((9IkҲn-= mS]UԫAh5ʹ7p43t==ݣBw&J*MkrS}˟:ecz~>޺}7RbX߅z5$%FT  Gj[m6i,K<(;N:R7C N?i2QUGd1a kZ! K'&m\ubj(Š((((((((((<}ՙRdu( 50VݘZ KI1=jQB(UH(((((((((((((((( endstream endobj 167 0 obj <> stream x\oܸnudU$isbEqƝ}3Ç-w9(I$Q<4'z'/NOw1"X0K#Uy yRTн:[3@ߤE'KӓN""cUQdP.60u$ͣ2O^EHd19=zbF:&.+*:LbHS$ÇAbb(B6V#=nbQ$y5=h7|fK|BD y| /Y3/Fy,M-n|Q6৉v\|Z&ۑcd"DZҤ%"'2)L  tx@VãĽRz4ؼ`>{ ss!LD~ֿ{yJ)&1|(!SWO8tiN2CvY/Evy,dbfCel݁d~K;Px)&BPg]5PXiJ:޼n [\7 ~@zcƨXicefg8ԏ/A1-<^-x5Ό |ߟ/G٧_ Bx { MVp *# IN`N OUn+)@iUU"P1<lsH%7ϲV5%H"L75o{П/E0Fs4}0ܱm5XhƏ(Y'0$[Sʡ(L!:W%Gƒ\buz}].FO] 5I$?yOEEY75vG֤cť>[8}bo7iޯ1VZc$lX\תXԗD8uWf[iQiv!Z^z˯WPCؗ'b &bvspgWJ6؂CFsv#mm3**1޷=ͫJN64\<8ZtS[[[4#4i9!r iRw(F7 Bp[ *'_ WVPh#; P8~Z9-u#= Clo`pUpS9U8'‘)gtӱ11#s=3 Ŏ/3xCݽ_Akr<.e1 } tb*́lo^ :Z,?,G+jjg9r)Q)2)(\fQ)Wϒ|.VcU5B<*ajǨ$͑^8]73G,X!N3M~a1cЁ(ub[P`ԉ x}V6~ ^蕢p?͒2j"KDv,U9zD] \_giw#lU2Wm(~$*uvsPM8Nѱ; l"+ ɣC_(йyon!Ӧ<,Gt1sb"$8@/&N%Ks.!0"lwlw1{b g}4 zJ7C^Z%)˶,7ϦF ¬?9>9b>,oͯ=pX)+΃? SC=5̑Kq<;Ji}JS6. !IG7F Y<.{=JSI7*#ɾ [Ͱ͑KcL~An6D3%+26C0i״Tx5y_ zwEmGI)nuJ/YW Ba1]s/y(c֞P,:TMH|WTC򄶎5/y:bؤn4OU%S/&DU4Q+ա~U}w.=;F2Ϩ5_\=á_zM|7IP[G֫["#^DH2'[ؚNn}DyௐzHΖ 7 C?\;vמPP4.(TfO ۛgl#m9i\$Q H7a97Uˣ/ԫ`$my)|9@KpR~WSTK#T%~>>.";?q-Bq+f 5 ʹ-Vckiml[B+RI6dZ64Mt%vuc7NX7tX/r0odQ?]fW;Z$h( \ (J8>qq(XRAw,(C*G u2bɦKs;#sEN󬖸t~붎/LcrRq'kQ &^ojU&aPȪ|4_ KWJU1Ÿ]U͔?4XJ0ޱD9Bg!&ˤ*| 1.9p/+OQ W pv<)*xj"lmY׶rZ,4XlOu9G/d> endobj 169 0 obj [ 170 0 R] endobj 170 0 obj <> endobj 171 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> stream x\ms6N?tČ#@$כi4_Iܹ9,ӲϖHV"A:(_V%b]>v~><X4^Ek-Ã=O8gN/88\bQ΀ěޔ~׫ÃNqxs/#2, "%ZʋUD%iq"E7^>˟t\]!]I"0h#&]M*,ěIjJo<l$vc,#v k~I ?)9ӼE!%gW"d(y]ꇣɵF[?Qrqǫzqd<[zꧯïIjx}ps=-n"yb}W7hLbj ơtUJ]^\cOҿR!KMJCJ8AFzOoA'w%"™R;/P⡶izxpyg+|  w00r;rرvlslC5ͷ~0f;a ~ k7ni׾ud丟v)\yO3#yٸn{aH3dV^Xƈ~dc4WnЂaN5m|V0Mc#aбQ;$ ՞k9M6^^9 s1,MRqh\X+ø'|^ԡZdc2Ψ'Fڙ\O݆*K v>{h;c牐 v>?A ILE4߷X¨ JHs" nELXтkMqV^8Z;7`/LK,tc%p?Vlފ> "3%.^D"wlY7Œ_vLQV-E-!G#g,ތGjVhʽs=C/*ˈ +܆6Fi˼X*lN "14;\0_c+1mgY5 ~_Q-VhOqE@jIQL1PNS1VEygP pQvc1 @R HNE,F;OM;o5!(rL,]@<ƴpnYR̿ko37.k< qc|>T"<5ւŴH&.GPs'烾msUlQ k]8TBF)aH+su;LL$S]]i$-8N*4) *ژ6I 9 qX}2VA5FGA'9T K&8s w:_};qT??>q4YLGlWaXFŢAP좩C1 3ɟ2OCcX΁Fby;x4~G.K_^zJs&={ٽ UwWMݽB^2DYF|euԕ%%FRYҥdĤ]W{E<l֥ǰZCQzJ?(ͩn}ᷫa;GNC& |"~=9-0X+5Pʁ+7q[4瘔 vQ cCtRSv1'hqc\6^v`:b_[7X租=ٸ+ & h]4u ^]V`T܇H>Q ߜb,LF yy^ǽ稰`gex6[!taߝҸ!좩;$,*pv -EMbC M2lAeH+u:9F ~URHXT=TA-MUwh~93[Xm lj1F7M(_<@TuXSaG3eXAQf_AY@bK QřKLC';XMuV>mk0Y:?ާ`tJޗP-;q3_[ 0wkP725o[]ъuJ/кãv{HEcY)[,K:>/+J㕷9Qʏ% zTP(> stream x[Ys8~w+OԔ%.[W%MfYU0dml#J_OAJ"YN n4vz U\$YE%u{zwɟމszvz¡_ԌCS4P&LVٷ'_OO3䷯KHI`, œ5֢`N 1Q&bN`؏+'sW:u^a1i0@8JPsX/Er ~$V980ܖzJqVynaL!_.VK>LTNd,&:&9zm cfr^;Uy@+h˴6b$nRz-Hސd=nkP;sj"6 9~Y< m=ke,W//T JU}e 59V l\W^rY^p?5rU#Cuq^]p}_i?.LwVW|f̪!'āi9fv%͕LpVfHqVY45d_܈*LbW3OP_^p\"f7>NBW/|*A[V2]u= oBƬKU"O@p|*-Gh1tGiS/i.˸7] ZO ۰ ni:BGW8v;3kJXeQKn}8xdA2"`]sټe &"`H7M۶s|LѮm6 9M" y{hJ PE9DeE4NlAHd'@E$`4LRJTko"L,L󺼢*0aE+#QK2QӸz`a$gE lJrW:BDFfw2%.0k3?hckӓE?ZaRʌ57]5=#. l1@C [c)Ƥi ̭NSq%lQq Ho{6pф{4"z($UH^1aJQ0CjJJU )-&m v9xO..r*4+1E Ĕ 7#A7O^Lx,fJV!# J@SC=nKGx/- BxZ4mz7$ގ:2cqLDx"4_c"4a=Q ï֓ʈLuY*o\ %ǘr$wDPkl --ajS#l@l2SUS=5&B~?ҰCbIGהLIhey?/"*VȐ# !{in 6v9% ;/Fl?B} ;ڙbw"̣@2vӵ ӵK@UЛ ՁȪ?,z࣬DO/=kV~} ZZ=0Ujhvp?SQCN `fS/w (S\B/Cc,C2 i !]W;7uìL*:ϱm?.` 񪳇)8U8WdQm >#&y$Tk)nT4)Ŭ,\6M=Vja YT#{<v_7[ kMv*biqt g {l;JݶYh%5E=oQW;Z{:#A@Th8i{>1 ṕ}A˂._J^x9e?'6#v<2b-Ig*x%LQ!h&q$ZĬG${/P|S˨Ew1A*.Bk"5+dn;C^DeFeƝ/sCZ6׎QxQm 8ݙjHGnً Ut-@hNO)׮[fy ])*+p+nwکB[_rE𣹦C0lf"V>pT ."\?xDLr[+%(Y;/b܂tct]Ȇ*td7tߔu$g  ۘ\0CF-k'nO2c+ioXz6yrLH'ʓ{&)=hڈTz뚬MH^ꮁɢ})^`@232OdPI^B+5Zv LWGgwb$K )!aʤ$*ߊAe6KP"8Te,jxs># I4(bY/$jE@T!ԃemK>nlԖ*\ʱŢɨ/~+6{K u1e逪_謢2 '[^WXzwyb1eu BHwWqoP@gq@BgFU*D?l$3"nx)Q"/Rs<^~yiHx/$umRa"14?)\tŐ^n<5 ;z ^>Ǹ .S!wѭidDZ/]4>{h_%L\-gڸKlDur8W*eG61fߞ$k%S/ K;I}+v]~jo #9,: _/Pr" endstream endobj 175 0 obj <> stream x\[s~/G,yk$i$J;L_&芒c`/xjgW<`,d08>b@,HUȠ)*`vt?e}tG'`㣗DRXQ P>ɂ%V< #$* y2Tx+z$:#]K"l0#6հIbb(B Nan,lyyG@1q~Ɲj~R0c=؅lx\P.%rr[Ld~=U4B۲jzLI~cT, 394^GyadcY%4,adOdb)prnTF?+6ɛt9Ջ%|JǢI1=&^cϡ='DeJ2ƓO䕢*+Vn@gieFU],V'UӎD&CKmo%5Xq0{[cC!ل  _\:$)y4M ?ZfoKчFr sApJ\"6T_ԳG C['751xfQ`(f]ݰA(/KlCP&gKb(ꅌ 6xNe_@cr}{#Xcjh6-oan[9яxm#k) vvًܲYG,;T^Ecxa/qEFNj *;I}3:_0S!ʝzʸ>xG+<#$R ඤjfJ9M:w^eΟME@<')qDb2&e=2ڭ]Qس+<.R"M+U7믰C 0 4OMؚ1%pOǩ3cQy;5Fo1W^\Yq+z_ 0NWh!q7 NsAz5˥B!V.l V8]JYJ#7BkS$Gi'f*0+37%ft=:12,,V{ {#}p*t̙!~oѱv 8ޣjh>&C+\[1:HѷPډWM;19tNovԧua1ɡ'*@ɼ8 (@ôz9+jP=nfg\-h&`}PG_hHK3GF#$lhv>J 1j9),p}%>PELN 6ʯ΂%ډ;B#4]kG1.0r4ڧ0# 3 OO0;U|kjM Va/ V.Kh\җ ;R>M7[-$$MRNj7L|džqAeǤ>{Gi6RP%̈́>Y.)DgǤb5{L ٶ Aͬ|`ܿT`!fU GW%TZ[e"5v H9]j F6AQtZUȇPfQPcmPAsX@˚ys,A0#/oU,ǽ7,5J(&&Y4t73G‚GNNl@BB2 lf IEPլ$UYuVR$ir=-T 8S׷y#d?h02Jd ́YX0? O74]f}g^?t5rɳ&Aw$zjCk{+MnK]Wx1 :(F'xf)3.roݙ4ody ` ŔC+#ɈE>𹎽Ѱy\Ftebpzxz9abF1Dτ%f:Q(WZ)T(W023S *_Isp)+{0Kp!@s&dBX7*UaY#xU#>49N`cBPUGx:ZF餔Vx;`ݛ~_36; {TuUMT"gţ]{ uˁT 1LO 0'{yb'N;`a&gpdpgy5x"3: aWsfM jv7g|i<+x}wE&w :Kj l/6 gE?t<ܾ.__o?KRlѦ[o%hyRMy`#E+ Ȁ74^"|\mAb@Pa[rY\}zfx dD$U)qRd -ґ揩\0y&dzrV`xU,9XI]omKO &mh>mx`$Xf@ ]^R|yae,ܝD-ϞB9>'V 7v'Wx-6广FkU`FZKX!B k X0"BŃ0cB8:i9Ie{#Z7lg:ypy⛩uJsZg@ƉP4,hX?>kQ\ #m)= g(E0+^e?_G]wg0ey8#͍zFpNA1ׇ)Q./^}/:MnR=G|j7fEv"Dboo^yGD&hpNՍck36WenTvjZ=;Au*72"4FM߮DZw@; +T N#ȻW tdfC ^E;rZhqYZ~FcNI#9X.-aWA>l/6 kR3ϓ_(0Ӆäּ|BS}&_r'ÿ߸8X$8 V;y*0ړw,C%{xH}'mO? w q+VO/MW@v< cn= % qaISH D!EE]̶FoQByI^5HOIGϱOzޢa$CaBZy*;-*uj$FA%II'#mw Fe B hP4άr˙UYGi3gjC٠Pa2FB |d,b[o"M͉9"l,j2VB9f[zaCdX+ʛ< ̗IA{ hG6]dx^b\bE)ZBx|W`~;.+Ҍ4+z8ra)Iq]*,:%c?~ȩR8X) O"ط:<uZS{nj ?  6Xy%U8Jj[GDNلo6O-G@̼,a~7mɪUyr\N^߲SO~*r25 PN{9$?T槣>&? endstream endobj 176 0 obj <> stream xko~)p4$]ڢ@$IcA`EQtN;3 yӞwgg=C>? ,B/4Mu~+ou~DcA(3pǼ,\Zy2Pp@(~S ,Gi^AycQ+=71Apx|1TBnTvQ^'F=q2!IVpCqT>'Ș{@Ś8?ڕs#}=QR]ƿfރm} *J`o6k[ 2\~Q,Onۅ%O\yXgۛLhp ~WRR?ݜmEt^8WÄ{8ȃl?vg@miʁrpZͣ^ ,|Ё;;bAMdF^nђv% ńz6&ҪW) V)Yr-p$c>d'ÿ>qÙр{`+⮚tmDD"H/ Lb35~yҝFBpnDUS!'Z7֐~Z C>@S8+Fm MuV}9|DVy w:7(QF 5*եnoj6%YY x:-,.=An]hm(cRfQcpjH8  >iOIa0>QNd,C/n(2u9ֱx(Qf,?yɝxnu-e2itX"}N?~ ft X,xLTHabϑ,X5qҋnPLL#]Ct4i l%A6G] ;afKu:{ D {@*{ΣG@i$u6;͒wu:3ҫpy/QNߓW4bw b,JT$zI q\π=y|jqXDcAtx1cq{m4 ;Ӏ+Ϩ+4HCMM쉎v,.dlm!`V۝o2,o~Ç5SwC9!ЋRr/_Na×.;`8(QɖӘ}4j G1Dl?蜢&%.|>83̃ܪ;r.O⾈H"߽kL#Ӯv̅!~x:BEP' Iǡt@y&<\Oik_|A]zT Hײ:X5\Lt z}m֔Eь&r0ה0Iѵɬd(k]gѦXE]Q5~>pc;-R+P]̶Q@alo0k1^9b~'MIwDg9tE8e<WcT,焆`+~L Skj2ۡf_Laɀ1eQ$yvE $O2[.djd W=[8eױpY4(}$" %5Y|l|ff~YM#GxZҶZ8(2em jDr h :ZkFV4cM;JR7Yώi 3q(w 3,_MSmz;7B!)9Gl4YjMww$ïN"e(Ɩ:^6q9xو?UT)f`LY:`Zlm #VqA[Et(Fw: e(a:ns)z˰#9E@fG. ʏNQE Zۘ])[rI{uTu챁XJt\+QlxS9yOQ~ ?v@ d3,8I`9O& i^ E1w=IQbAvj;e*,1GBDi@p+fXe*{ݚ ,#Y\-Q[uS }.a"tNT`aXS'v]PC`T} ˮB1G GJ0>&G'@8{1 Kcq{9f!fO(%OccbTClup"ߤcwKSaXx褐DKGa_̠2v9<_ endstream endobj 177 0 obj <> stream x\_s۸F 4ƽ6ĝL'Y#ߜEG.W)  y&,o*NOBz NUӓOɋӓ?yPzW7'B{Y842fI]2c czIOߟ|?'ˆ?|d]yD3Q0ߩXQKEIbG,ś'H%щDaJvjd_$v8*;,Htc8f[ ͯYROJCrɈw"(yH>? bKж.n/r S r=&cS&#vx@X@Wې-[0@kPe˒;!IYDp9|u4up.Y~^y`CWlY F h^"n Rc4@*_zˀsa7f( ]a/"=NUn ҡ"k&*a|3@ ` S%ee +hh 5%A^׷h?B7gedޗ/bܴiU t:Vй0Ht6SqIHӞDP+\QԃX.OАp풊u|jy=r?NZ@ 2j*swzZE椿bVׯzog Xl6;Jle&Ի9V$:Bl 1[98ncXx>ݝ(-8+sP\"řE8ZP<3K+v]ԹП?K~iˑ~W &?OfmEWދ@H7PMg.Z$DhƹrtÙFwͼ>+Kto~A@T{bkVpҌpfWV:1.B/^4kx8fbj^J9%N«wz \0LKfW#t7͞o"B՚Shd*C@c Q"mfD,J͚rG.4Y9FXw%7`o_cwp_]-9"d`8yp(fx ςB]57L ѩǧTO ߫<qu o P>ġΞD20I= }W[\kHUc4۠CG UYtefYFw^~t*ýxB| z5ED܁\#^ . iƩFc48Ŵ8N%gBqq:.8(mUg=;tbq:-0tfe]:=uҗj,%>. 8{'H~!F&&5(@?.4p[~XHmZY*il3<Ŧ6eAɯ=ac-aڞ@ 1;HH @D;xzF&uk@Q 9݌-Gg>59gvvyA)k̨l*F ;./J'81 nڟ3)C OcXUA{nJOEB"> stream x\s6= %%oҦuܻJi$:]_"!1tY!bbg K𿜋(R46g^}JDDE7g%284YEk,-]_gQ_g/?}8Iu$#&!>HkaX#&(S,,Ûgc?L_*!0-O{Ťb ?P$&(hc㙈΄iUt6Nx0^=R|DKy/COm㹜e,g7\zi\h\ΣV GVJbXnW ¤4'[L 7q2Q ^ H6sSK3_^ qJsɄ855`ic@qdXWtXniXdp1~ss1>_[NQAx~@̼ LjPv$h32j H6MdQ{ а `F$X,o4E% oخ@goT, "g%,g8\dbaiLB,cxX] ᤟hC* M2ib3؁.rzMCm-3}f5}@ 8Пyx ,ɴuOR_lCμny* M2=&PeAGsp7"fwXJXo!2,1t9 Fv_6?8n]ۭnN8^S",Qnn|2Hq4JC㞒V-NKP,(B}r톖9ٲQg.xxUgLnoޑNgic5(!dzB"VZD aWHq 9ݫr RG`6+~﷭ϲBO |^a c!-݋bEm@ Vϧj"'͟bBJ6jޔqc{)- /&Kg;XEyiiߥsHOv0iRgY~Ls TNs3?kLD.%p1ܽ`ٚpJ$d# .!w:Tӗt5x*(,A>(~X6X,l֓|2X 8So0jU$j OAt³>}x.;M;m~@|,DŽ/'$K T<y2R-vjvtaxzSҥ`&ė գ%w`F~'#į;Gt>}8?\<q.ү7^bOK䄡3!],Mq} F% ~% U(P&)wL ĭpjSkQ+lܲ /I}\Y.^-adJxl%|R3&Ÿr$%H)!j_!Sl+rxq]k>4bgEBMi =jHJ[TVl^d)I۬ݶeϭgs&O*wf-fQG0sX%ԭÒ>'+*djʱTHЧ17Pn6.(yEW}2ǶصJ/Ք!ڔRiPSm֔.<#{\v;3~} PIRf_6|ض7Wz%%^AU\MLk⃲*fmxA5"[=M)"2L \9FKBII/iʇ%)p~P$-%vņ[=EΓ'p/'Rcw SaV-|t'jRㄖ]]=K WDj0X.fo$f){467E'z*ոOz3pz8N z%$#e2q:C^n%g `o9eBS)tb{-p#jG}1!J0Ldk[-חmA`e endstream endobj 179 0 obj <> stream JFIFExifMM*>b?rQQQz&u0`:pC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(Z`r#:U.H*-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEo$B.I]#Ѕn~MZ: ( ( *).8OBoeV1ݐEu-UVwZ'ޅRf q{2Z(aPAymq,C2;dPySSҸ >+>d.gbIW= cVi$ԉMGs3Efi::t%CHN( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( H![o$B7cVAN~@Q@j%MKq'u=*s֝s֩ou EW#9*F=%t ʷ TV(liu9:]ؘW5Gvzjψh9 {"]"z(ˏV2E;Yq`.rݔt־ŨCe%OH۪YrwkvuƧ~^]%FA V"@1ʇDyl&kN@sK@Q@Q@Q@5;׎t41 Umsne`p~5Е$^5IK50Cm-з@} Χ-Qjr3{RT25(_ݱ[<'h\)݂thGj"MoJB *S-QTmyy0FBë۽N|'c&e>FbK ^C} Q)m-"gr3’k6Ee&~$_$F͞"jO9 )U줷24hu ys1 s$'U YEqf?R(ROBQYQEQEQEQEQEQEQEQEQEQEo$B.I]#Ѕn~MZ: (dGI++'2C:TtQ\2ۻ ( E-6RHf'dSjSՏCA8!.r?AƵ4}V;IvuCQ}a}bB]QAk=ߑF.|Ԡ} C"nkf7ȯu;vQHihsyq4NSړv*1rvE̊\y1n(Wj>xxOz ơUB-YMB+]YaB=ø8Y5ԜF<hci61H$6i⵩1T˦!r#2,rB0YU孯vŖ7"T\1F)*V! c ?E 76 i#y1ÎVH9  aw6iwPqP5gg"b1FG#9kZk+.VǦǧQ FXU\nonhdS+|AF*+ݭEȶ9jw\i2],v:#[kSpA$.ss^u E'p+((((((((((-{x`*툂C*p_M>-D2>ld#B s=[Ν]]C#R29|>MԪcjҮYǖN=AETQEQEQEQEQEQEQEQEV\G ߬ȹ'tB u6?kunXJ{U߾QEgcVQE-KE Y>'lh>?X~">du(&HWN9ɡE%(V;h,UJ15q6%sN_}dʺHǞ-"7o Ul)ɥKt.dFwԎ:MܦYcyb9#)[6+-nTu_RV0ƩQ(mZ %yR5&70tm<>Byr̸Պ(}۸xcCc$RMiKe,y&U'{1Y DT@T ;SaEPEPEPEPEPEPEPEPEPX6rO+~RZ#%TX(QSbu??5\|I{g܇#̊Km2[w8EG4QG*F*G c$#fz汯o/.LQ.k?=-aFtqPsHn)7rssߊ=3֤ AKXn[_S.jϾ[1Ӵ4}V;I6ꆣFO8_Y7vtvʛ~Eѩm05 8N$C['}QME 4(()Quf8Y"X/2G,7?Jq璋-^jP[Xy <I87]Gmqi5˟,0 a0@8j]…C>`;Um&t{n2u{E4WvMP[(p}O&uSO#Č 6ۚεi-Yê\3~xrIqqḞΌ[:nJ[Ktm5w{`\ޞSs1'oI\%n +Q@Q@Q@Q@Q@Q@Q@Q@`xE?H!@_ScVANn~5R\5N- GQEKFZZJZA@"7{Ta4xQⳝfu~&=~D汀QE-&F_Nt凼ҢZhQWbOjdS5S8z J)k; a)RPЈ0FAi'k=L-_j"v*{ܧ;jjνs}CSW˃đ7U5[-ps4TL<}b;֖G}81̇l7T4BFoHKCd5`s:3LtU/b<CHَ@kNrj)*;`-E<[^g)5@(2 c,nAڦבGY {!/;UXDP+5*DZDwVZ!` RE2* qKEQEQEQEQEQEQEQEQEQEQEV\G ߬ȹ'tB u6?kqZGT+Hqb~$-4s KH)j)-%-CE#_-V~WjOmh w?R@\#:TRYX)E%-+ O !б#Vd韽)?AZIBHE7CQ͋+/ lS)#AiI{(C=:&]/'*3Mi;M=DuYAPNKހZ5,?"z+HU {=^\Krk) 0zkp;4(RK1I=X7QӤiE~#UKb"o[b!YeQy'k+M.p$b,2T'\)-˩yQ)_=1o5n}+ֳ4KfCO&hC (WrtU`; :RZ ((d@|jz6mu-^0bѨ=u+'<lJy! ~}mɹ\uk>Xp+ie9&$DlWa?.t4V~u%m<}kJ&uy {)N >e#\}ukW7Rd ]?Zo]qf:$jN޿K (m1Q\wzD&H1_lkNNu(^XiYzL); c^/>zUr\guVnW:+SMvcPɜA8ҙq$1[Q3 qޥaѿE`fsbKĹ[8Dʟ Z(QEV\G ߬ȹ'tB u6?kk}CW-ݤDڧԓiXP9sV}ԼeN'U39E8U>t=L"zush̎[I!J~jV iYrŻ5EŠ((ȹ'tBX6rO(v?kl)Vk9֕gL13zҞ>!hҊJ+SÅ-4RM u2y?uI)G^.(hijPHB&njmGV+NV1$1YZ$RGJԸnj@ pf@5!/0dNN2åB44?1ZFFơQ@“VFD: I(g "F{1Վ?Md[ChRoxqxE6mlQ#")1a$E\FFM9\Ct~/z~5`O }+CSP`@[1̜2p}fzH1u(DK/}?PyE8iq,^νW gm5lN#43}Oq 0vaÿև-9jk_sTmYv*Bk(/w-jE/r8 =z5h,Nտ4Dv- ydjj{OHp# B;.[̶IOQ]c*.XRn/Q3}^KWq_ʉޛz4H\GUiIk݌S :^.2^ߓ _'­l UP:SFIViMNqKE ( ( ( ( ( ( ( ( ( ( H![o$B7cVAN~@PvFbo)c]{4QElqQJ)- +vLkֿ{pS!(DL{j_QqKE0x1,ayf&$yFǟƐz!f8U'R^+}-"?qǡ*wa$5b|b?ѱ?mM.!R+6"͢Z)@ 6x4ڱq7՛i^">jcQ5JuT<*=@. W9[疋ٽGlwC: ;5ΐ MO_QV};X_}I?'ҵ+U :Q!%=)N[I%)0:|˙gfZgL#OAkoE!%AIP6ꆳ %K!.t=$5Մ:~CގsTWP#8&ꆶ|׶G=斀 ( ( ( ( ( ( ( ( ( H![o$B7cVAN~@Av3} OQ3 jqܙřQEuZm-!ڱtGypzpVVPҳ|>t[rG. 沙ghTQKYZV)VtSZɲ/F omm=#_p&}fc*!ēDM_Ak*0BUkz}UBӸ ֶE+@)HA$@TR Fpr;/56.:rݹ~Qb2$XXaTH)4jآ 8T4kSqRM#Hm.)@b䍢4FoQDƳq5CliQK#jF5#C2&FN !o} e]ZGFy0\$ f,'7+d_}EiF}&w#pOh yU ]V18Jjʺ"=*WEӗd,w+yd;H=-XQq$LyCX9`)vqk tE|??BLMb-F JIꦶ"y{Hih((((((((ȹ'tBX6rO(u?կS_PH*G-x$QObVG ZJQ@ .8%6NJ?*񍱨*>{8 eim]Wz$-QScZ(##Q@z)yO8ȏ)[=k$M_Dd=V~1ЫdV?Tkc1[[ŠȀ}IJ;$:һmm%jZzKI$[pLn)X:+)8TZR(CS! X@)qJXQ5HVN&cTMR5Dơ j=Dơ cQ=F&Fڥn2qWX.*׵E XMTѓjww0H>}@mCI^e3=[-Kb' 8YU>h$4 ȿ"Y˄;H= uZ&%^$S\9Y+yf.lC-}&j`s\é[LđU5W5bz)-QEQEQEQEQEQEQEo$B.I]#Ѕn~MZ: ((]LOCVWUkCRRcꟽtGUfk%ϛojfW9kzè.iZQIF`zV2ojPשA;[.|G4i^OkOd E7_iQT)Xpmts /95?uvA׫6A”R pb( AN66)E-KFLSjT1&F&6FơD#CSljMƨڜƣcPjӘljMQX`\"û`q<jXk=8#>dc[K:~k,*)EQPhwr>+=֏)'2[>ƪPS$ul50YӨ=$-ZR2# W1 "mJhynͶΣǡ(Vp|،NU^Ҟq LkuKo2?EHMnFHZ@ihQEQEQEQEQEQEV\G ߬ȹ'tB u6?k(fZS 0ޛ嬽PkC֥?,c[̷wo:͒nG4fIOi2v3R91ȩkCH+^c4X#_UP{r#Z P u٤kzl]=>{HH ek--9yl^EA]t;skBxZ @NӁRѬQ 4j i4mJ ;uCԬmHQq5HlӋS T,1"lT8jeYjMQ5FOej\MPj, CfQ5ƣf *'>E4wv2ҦfL{4r]WTSsauxqV/r0zIvF6j۷k;m/QǡC֡"$g[k1h]'ZWKwje^C[R#XZ[_Ѿj`s\ #;d^3MnG&Ev M;2z)- ( ( ( ( ( H![o$B7cVAN~@Q@ #zԬ浦eȪ <)lߐ3oD[3nU-r?_An-A 5VG dGPhY/:R{Z9>ob0~C{H#G )]")ZC?ʛc'8WPCkC _Tk,fVDEƧ.ɦ0pՏ4*l\<44QNHp54jZ6%v*-ئQ67T;O(00FZD2.%HZZZZĴ٩MMFؤ-L-PZB0-<0C!ejvjYkVejPLSce+d©f8k>{a؞֖dm6jr~5kO5'(^6]ClA"n6z?j >i%=]MJQJSeem`%Vmͅg1`kS?,AKsKhjV]UO wU b7z.3Zԥ AQNH]|SK6&-IF|D۩7T[7QtEl%<000KE<000KE<004KE-L-L-L-Rh<1UE,GRMdKv-2/3E{Pm"2Nz(k M}b?.=F[~zo>rTΧŢSbijAڭR 0FeL&pfȍeTljf2DUT&6nl;85j$qz6#[}U=zڝKh3U~gF05:3EHU5iٓQH - ( ( ( H![o$B7cVAN~@Q@5#֝Ed85]W0JWd?7YԦG|Wu?zHi_KFKuE\aRVImBJF_+JR9+ۑʣqW!DY6_ R MXNZ$cՏJz;qE^om=5d/xұK;8Ơ}j54إ6h/)6%/I/F|\5-ԛ:bQF9NBԜMZZZZZZZdwHG5-)jaj͓ZVڎҷk3 dV 5N= pIVqMJOq#u \w@Qe9[>iwιɬ%ŧZ<ŠH좧ha~'( *(6lj5'\RkABơQB!jaj\D)<040KF#S SKSKT$8044Ci M0Bin&4hvT]@[׌Vu&uWM*9cG$or/-.LOhT{el+JJ&Q^[@pN7$+"#nW*0dQEQEQEo$B.I]#Ѕn~MZ: ( (3!'KmM94u􋙇Xз\N6i5a5o{u<滬qf D 8V)s8;hL IۃkV4gBեɈ<>˻6Kd;FzL,d?4>e7ǭğ/6B[Ď ZѬ¼P*:̲ Qn_)Q)lwS6D۩wTwS"M7QtuSUSOUn8lIQTlRV>lU#eu?7wW|jX- 9HwZoMV[[M7ݣ8uIP@cU܀08}YFy9ŠLFoW[-T5{NH~k¡-Y\6PQ 2TBci=jokoh0vOY\t*{oȇxy#\mvԹliikqjijijajM$8440ZZi5 sQK;cVn=*@j )on8S,`Tq@ QQ@Q@Q@Q@`xE?H!@_ScVAN(( OKxfX*ŀ6Ċ;+s2Zۃ̳GVkloTF (5cp5iwRHnww,jX;([ɿ1(i[X56t%H~ӭFRwJ݊2`_W\#u~kbbE^4DP滂̲}M %Ql5$k/Y1_'ʿzA`׷ 1wuE˪nq'c~&_r>[1$q HQGe";=ߒju.:a-M-M-UnҪ/InoknNZAhEAo-"0B崃-LwNOXn_ PT>6vlm2Qr竱Ƭ՚FެRiIѲBM&a5 I&H PKwgi}^eVRDJ!,bzv+{?:tZw/;mZh0ǖV2Wב!?<09?iX9!mi5CS֯kY7s˫k]kB;ojЎڬoԎG''vQڬmW;T(Y 2j-;-QEQEQEQEQEV\G ߬ȹ'tB u6?k((|i&[N VVjωXs?>*%l*vӣ'3^̶@2JTZj@h%fΫiOEꭒ!+A^eĬmn=V5lmG=KIۨqNL"JnQTQ.7T[EE,GRM+D۩$!C$GRMe$cC+p X#7u ~g_5QtN0OcSq3OtM/gZFM&a44nI&H H( z%AřGҲKpr~&Z&h]8Qj7'ߝ:+(]ܚU;iixi[+~}kNiOjٴz4O">_8M 3?+H* Q*vՃcxeDQv;ojJbmYR;z *S" O Z((((((((Z~O(T<ڱr]im _diNZS**aZzMM=<\Ӝ#njN3Sҷ, 1};WAPPYH\Ҫ$3C>5@Umb LVG1]!JRK@ )qKEQEQEQEQEQEQEQEQEQEQEo$B.I]#Ѕn~MZ: ( }IyU/ ]y SJz _E> MquEUrJ#5.욧sVbto7P!~zf [o3}MM=۾7.7T[A,iL <=6cWj,^]oB{Ge4*՝E;dD^M7`yMMom $=Ij|{9K#1A V$ =ԹfE%dt We/Ume:in,95^]F#7ݏTss;8#D =XC?=" ~f-n?[Xhg`V-9k&f)L*dܲk޺ -" ZH({TrʭIu$ʐ,zՅ,Ujke*WbHU-$1[ 6(G't%YxnG\6ֺ M6 UQւ<(9֜fr+ @*LQY REQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEo$B.I]#Ѕn~MZ: ( MUUO5w$ԥ.+a͈^G>%e HTGA4i3Nñ o~*$©]f:CF@yQs5RJ6v|UDlJFjv2RBu~_mNҤK`"$ᰆ3nj\51'vEX-%>&$u8jhՕXNԲXZVZ=c*aTҊ2*gݟDH< ,|=o_޿%ET;\iݎ~qG;nEmI*VZIOdُiwj2i8?_kW5$J"[fG VRV) a{ܬFx~O EV QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV\G ߬ȹ'tB u6?k(d&:i|ۙ|]65fЯf܅^-WB%/#Hu-5Td>-fwa3^Z+%-1P3=u5k|5r>[Z]}kʭEiI_5 Bޗ+b3r; {U폥y|R(dq9<';S:%ӣ"zJҥ|2[PܻkJUg`lzpo'Z꓅5y00,lt+1QztzM Gܚ:ΐC2;Kl1O1Z u)n`*@(.%|)SX}ړAtg렪ZOn/ѝ-u67nFeKUnVd^㧧Y2ifQE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( H![o$B7cVAN~@Q@>4o i ,]渋j vi~Vr+zXk(FNm/a4yp!ɨŷ=+Iݲұ{U}vV;RvҬK@js")j|Q@mt[QOz(n(EPEPEPA_HHnn@r3P^-;A04;x܌ТsR^+HʎP#LYwRi.F{ySId)*9]:SCb԰3GwuO;mEi۲j*KlK HMi}ڱAtЮYdE`1 i~TXc観`42G-tR8j e3:MEwqZ,m1!]B}i.oa(_q\U2i쀳EE$V4<ƘcR h֗^D$ #+P_&7h7h|]>_&:+|]>_&7h7h|]>_&:+|]>_&7h7h|]>_&:+|]>_&7h7h|]>_&:+|]>_&7h5ZqjHG<ϮIIW?Q5r#Eݭu+],Mm-X_s~N:U, ҈=GM"[=$/ַ_1rkm+$F+f8$uFI}7K>Tpoq"ţǜf9\촖W?-g_ (byRM]rŝ $eBbq6+ ۑ~*>ŤhS]gU.R;ZYOV1ޒQO٘'ngמ6?dҲ4 \yezWj> JNo6Ѐ[C>FW Zqe=Hӌ.#Jv&JSm#]F'ݻ8f`tk>H"1m3`b'%QeNҽֿT6Zrzu!"9/̤*i)^3Ԡz5I$MW~'{ݛM-X_O}&6JY\](]žs9wgַ<64Q"yPB:6>+uzK/Um4a+5\G- XCu}o}7_Ojco[+a,ҸiYZ i{_ZK~-~r\$ 9AҲk(ۃ:Ք>,vJM Z1eA=HiƴbKQXQ؋- yq7{fqIg~ \D"XT%Oo5xT(Bk5kg{uo)1±Dz(*JϮ[3 N4)Fc nJ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (? endstream endobj 180 0 obj <> stream xmo6{fE=Mڵ.W Zvwv "OWvx4SLt-Ã:$&(o4?R= PLaU*5L x.L6]d.bbH~>Ө\3-lTlΓW q tb寰@&s, bhEgd\/8 uiBhދ $;"s3Yu9> 0M3+?X{mV _u[LعMF,"]^΃Y&EHU DV )FI! yqD0TKS~"., U˜CFrCx6w Hc]\5 ڄ,Sa HFyaW%|I^/y'׬žN.Er3 wX#AEn#E!"Т/eVS#PV䄗j W9>c1ĆcEkV(ֿ3hΪ¡ vEpfr,q>jC@qMV$$αu[C;Py9aq ~TF21xd4S:g̎K{SAM"S,3s2tV._S`ADGCzoB.7lhV]ȹuBr&*a~0SF˜]x8O%rOqӎiJ[gI`r' O%q!=V*f:~G0[U25M7d.uQm!ϋ2smH]x4S/j*D2_Y+[=hZb!":2mP)8=Hr^7݇1yM^]^^%t> stream xr6U_Bl#9w55MAQOw %oBy!&>_//RH ~R%[_^|}{y%'//%LBsK<+#}`d +7"nyy7ˋ_?1E*PS $\ Z<, +/5g^F8. 1Ըtx/ $P:n7QHv[d~"?Xe\ÈOayZ|J ^ylT\>]d.JU먪٦Yz* 9f?+byvgȜٚu J^m/ M)jKydِ42Q΂ +fۂ q(Y0n*xT9V?.Q5-U| UjjH9]zg0mm6;m_B K=26c l78֍$k%ʀf,~ )M*\r |0邎HLj2r QE3%R-эlq"jO^ƨ&i'L^~D.2Gȹ>kwRsQ>ؐMbe ^p?,>? ƣ3R66:RD/^xeٜw  LޘN#h@(!5KߟvmvK||BcbQōCtMHe7(-Meh dͽΓ@\ ;aM s v# }2vH[_ha7j{Q]ZZZq 0!qou#֓iݪ#PG- ӸcP]Cٜ_Z>q*2Sē~885 LڊAr'wLL%4y1hL663n3ff>Ѳ+Uz"~4kP59O2lհh@Ѱ}kӜԦ6]֯G@RD/ICKAeڐăڎ;`-.+:Kn\W+Dm;(C}˄&t~2 ūa920ses20"~/]Hs;OX *AJGm$=?z4O1/t?_@Kw C{J{ᾩF}Mhㆎ WW1.3f3]Ŏz?_ IhueF9E=m^܈f:ZPDT9ꉐŶzY_L-$FdrЍϧD[-^V7{έw8m$HE'U4daFMQS˨D߈xo"'>^3tG aa4הq_Mʁ2`*LmX(A endstream endobj 182 0 obj <>/Font<>/XObject<>>>/BBox[ 0 0 679.73 409.69] /Matrix[ 0.10592 0 0 0.17574 0 0] /Filter/FlateDecode/Length 6584>> stream x]]$q}_`<@7*;Hl/!%0SE/{XGT߹=o!o77o|ݾַXHp\3! rM"KRpL!Jpn 66tǦF†UIISPDI04^ڲWV8%ةip$jEb :U ma9ު|TV[[Q-gm)P'5fc^NjyzQ6pP]lM)u^ʖ̅d^ ; p4j9Eijmsa9RՎ!BHpkIz+d]GՒ$ĵ&q-פD0BP!pm'v[ivr]Y cؽ'.ܢ{5+{4+2rqZ/ZQ.9'&p:6]qj`֖Z0ZᜭnW<b9.e1ݤXKQˈSpNkRDŶ6ڲb:.Fqq1:.ԇqpvX>Q>KRT*ղ:a5R8'a@yO'"vpFjO3*v/e,+~'nn˝b0Ann Ms]wgCvp2=8.NM)RҔ0ؒؒ0֒ؒ0֒0ؒؔ0ؐ0B)a%a%a%a%!%a%a%a%a%!)a%a%a%a%a`IAlIAlIAlIAz BPS `K `K `K B`S `K `K `K B`S `K `K B`S `K `C BXK BXS `K `[ "2a7 y1+[׌66yӂ7QQq A9,I%rNq ?4b:zN%`<3KU|0/u/ʿq M9Y?{jث% 24^Ԓ qyf.`d rU-um*`Kʐ⽦ rg:Anqf6(r2Ԗ#pSrb^'.$"iXa6,N4Ʋ=*0'mxתNfmI9 (< B`^cZQYZ[At9?1r\]"(ܜ3`p5@D KzȻʕbr \@^˦[JHpW߀:F֛H` Qԙج$}kpRKQN;c "^'#=JϓJfaOSK0*ՒͻwI$nR<9P< AaÕYEp6qn}7p e=`u< s+kˊ,֬w[PxQ((S(L2_ +PRV)Q7&^Q X6$׻+Iz)rS'NWCV ':`zl(<^4>XjEpbcP0%7MĬ`};o$SPt䀝"8ްX:NN1o @e6Yr G+S@ $ZWrz+;]ʩzXr簶K9Hցy?rt8Mv]bŘ@>fQM^4l\=kd\9'{:/<;6'NJZc8E àrStgYT[wG2,LWwU_<]%_(=c")X& - [,(XlQ0֢`aEB` c_UҢ`aE` M ,5(XkQ0آ`!EX - , 6(XkQ0آ`aE26 - [, (XlQآ`aE` - , (XlQ0آ`aEBlQ0آ`aE`+XjR0آ`aE`& - [, (XlR0آ`aEB` Z,5)XlQ0,+G[0pF06 `l$!I`&  M[0 6`k0"aEC` - `l0 aEC` aE0`k0"aAX& -[0 6`k$aE` -Z0 `l0"aACX _0"aEC` c Z0 6`k$aE` -[05` 0`lLMC`& 0l$!ECX AM `l$!IC`&05 `l$!I3& aM06 `l P& M0`kP$!IC`& M0ݛ0\0`ep"EåK. WFlJ0$IMs-mpsmj)='cXNUkbkA^Á-AVuU+v}opqUu&,Y{A2j﹎<"aee8/ iRPkeZvr-TjwkJwc*]ۅ͗Ke+uxj&j75uUyb_) Q^vj/}D>*3A\b#eUxL( /`%\`2ae%2 L o+c,.Fb{w ݳo^1/=:9@@["i.)vB*V/CEΗaovsZ.,)V.K<+ +tv8UTԥetSfaQSE':U_UExMT4L;/?z&?13ߊ+whi~g`=~N{'%ᘺр<`1!C~_pًx~=ܘ w08Bu9W O01t;&-ΠT? W f(G~m='(N  {K.orpe6ECR1LO /"GHb(OrUF9Mҕ \ie1ku9\ {#|iNz EəO9Z 6ȱ_t"9~WS87"fYXXc\ĺwLDLı2:U~|'&0=q oX[{"%HGNC}$su.U l0D]ɵR!_ xIgc=` Lw32:ot˃R*9sIגX#63}~[K g[sgo_w463,tc?nawN,盧xO:s?4ן-YeRW0aVPyuV\ͱ}޴X?mZ1!̂VE[iKA5`@0H6`&}b (]H0az6Le6⅘ 5@?հ C} (2d>`#hj#m,xfp *>}w[YG0b)/./L 9jhHN3Y8>@D,ΝpYMVwj쓁1])vOg0RcEJ2຀h Vr@lp\Sirl?c:豅1u|j81 qPBQ0hq6TTѵy,m# ;S{v{?yN#3:e Fc "V#\e<|qjuhp)8?3 To0X2WD !m<wi`5x݀o^?30_ }m[z؀<GvԐ= pc!a5r^HKcCV!ޕ \↞|_puސб!#Q S N16.>ʑw/@}1p'c rM)\1dt:&2Q/ʥ2ms'P&xH6$0,rSbWlcC)Y/ً<-L:5fҮ7=Γl4`zJCt/wyĭD8V ǎO~]O,oVX(ԵQ_sW S7ؐ^æ˜{+m-X_?oRyڅ!bI/yB^蜎RfD e?2Ej쿏dC&q/ ~ ;02󆑌ցL+8\! 4Bи#E |*R25(^TmBPkr?viUE4. m zvsd\Fن|P ~>8!3׆J ʆ,xs>Kd@=mC vzf. lCQE6洛KCq?YF]ϪU`a#$#~·Ef^h چ[;v>kCr?vMaoK?6],vdi7hKr?v aiK?6]Ab6T"eCۅ0C?f}!)ڮ75P2si]g.$re92(!~B:9cBCeCb]~Kf VvSQ؍\\Os.?["3~]~Kf. lC]Zî <1ʆ D«]SOf HPvV9\Kr?PvG&x6\fن僇U,y. 7T鰙|0qm$6]}oKxn]g'zȏb<5.S$,2IqڹS7e4.x6 endstream endobj 183 0 obj <> stream xΡ0 İSgP<$IN@ !d!a; yK endstream endobj 184 0 obj <> stream xϱ <;+0tBp$kxB MW$C H佬^@>0r! endstream endobj 185 0 obj <> stream x10 @T,R ]3 <l!;Rr5S(JeE)f endstream endobj 186 0 obj <> stream xXr6}׌c=nc;iӴӡ)JeRN$ot!^Ξ]|ʀ,gdVd{l>?LJk6|&YlHl| r1V_hm8yt%HLJ!_(pH?g%+ "_1@Nj('5ɩP61ޗ(-.`DPbq/za ʆWZ +[xX_ja_D%- x/E^sk>R"ʛ [P,o2?.?[{v-I_ D-S?]\; ;? ae > 슇^a>3q,/.aLyLt`'-M/ps'x(O-s7^ZD\2-K|!CsDNfxCh wb5 =F)=nH-g S}414lWl ѥyE &E& >"Vh5yC$EJVp@E hVdwڭ«됲?[SRzs FmGډjT% ʗ5 +Y# GnL6]/K Xn|VSs#}*3vgwA\G0ɻ:U0b*N [`chDYoai(>iAӂ͹Zm*W%^^Ի=`Xg]]eIx\7Y\5؂CdP媋Z[n=AF cW@Hz*4!eMw#L֜y<SRJF{mS2v߱flktTYnЛ|d#NvZNh78$>/.$e.bA=2`A;`>J%9̧DEå1:ہqmn 4H )2xژa YH ?bBBíKx</mFF(SyŬ~yT70AX:v)z0*6#kJ>8iî S]B)UN5ڑєw]bQ}| vv }?> |ėDk/u}<>壘Q 9~nnEpo2Gbκ8BgC32}_ɰCd +>Z|Mt,uuUy},l5 lbUXkQKl'_[&bKĶnI + PǝVo]+0$"T:o@; endstream endobj 187 0 obj <> stream xrܶ]3GF %t&q,׉:j+{.H.+s+\p8Q,b*f g㣿@J|q|$a] 7BTHֽz \ҨWG wpKG!h(e2Oܳ( $LL` DlBAEaDj37%)SM ;-+Ul2 ~ hbDHdJh gBU eu*L4;RÏY6!M/+%E:LXn:zê"CxNkx^hS-#) N4~FcgHӧ8H/",AO /s[SFE"8`:J-`'oG^_NKiS4<̧39Uv)E"#|89,>fl5陲zVnk2,R$ [Ս'?(R|WӋH'W#{"UT UP8~}2 %Gr)ϕ:r ',pXA{p- IѢy{xjtN$ B~28SrO' vWM.iOM8 Vu ( gV.BzB q#dKfW%J>򫺝c1&Df j50XP63xxܨcy`lܦEԑS"i}~U+(JBpـ}x+xh0hqA"CAUhq9!iNvS)ab?;i6uCmn60`mg%ߡcqa{l֮SԄ|wr.hQRxLxH%*!M jg]Y'u3U%SǕ[_Xp,͘d[Co3+ܲkaaj,7 Y./o.tJ 3#s'˵*8-D\4rT!7=L H w"^w"TMDfԛ(i['v J1TדּRͭi}٢Aa# IdLCxZ*p0qI:taЬx2UQ]w$0K!Q'>IB"0&x<b9f=19XdU's &(_E;B%lw˸i긾H͒[n#e+ Y dhXS _;20h[L;Bk˾h=CF v3S_+ zGӜΠ1lOm~5jGJniDbt/p b\+|TgJ^6>1P!e-4zZ$)ճSMO\ql~!/چ[: ~=;AJqGHN$ῗw@+P١+vs Z3=:Oj<٢[@!*cR+eu@C[ Sƌa88RUB-NCzfH>9"b{kyIIuEi)7>!j'vZDx^XqA4Dt1yz0Ń#gB9@&ZH 7Rɂd7ZyTX1h#/IY&)Mxe݆t``C-gCu wy|bu6ʼn3(8o{ y6> ÿJ|B…:(5؞2 ]sj uDI&X ŏ@6D';e8M8KݽS4vFXRISaN iKʠ6/zK^\LkLs25gH狡Zt tJd&+[/qk`),n|'j (pgz Wxa9=Y/aɅ⍞/5Lm߸;E6{k ְK_)S39֡ʨpNY2J ~8at@j/i:55_KD!9TV[a(}-9W wGP߱BNB˦=C˓l[U rݴZ:Uby1~ۓPQuԽm̼Ml)tN̙o=M1#y>% @8X dA1@m-X G>?˓Y!!>NdFMy)0cpξnҗw[VUۛn_ o:-*swW߸.jnܹui}RϬ߆M,6K{;.mNņRpZIxMK{]ͳMFw:|x7\頷*+/smSn[4Y,RUkM{Mڋ(۾fϺӭI|G/~Řo)ß 8P<hPȰ3jPO髆S_#A޼t̷u즘KtquF?TP# U}$D($` 2F G3Yk2/7NR+I<0/4Fzu6o?H$( endstream endobj 188 0 obj <>/F 4/A<>>> endobj 189 0 obj <> stream JFIFC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?uh1+ =9$z]k|P?*OٴI?\vo<4?vӇ;&Ny{A?^ ջiun3Fd 48,!S:nnj`,?+IER|GSJd^C!P}yY'C-gfIYi5BI<&ԓKS׮P71-|{]7NcP?*d$̒mSg챋tA>8җ";;E45mtC9-|i=\ctSE\lS mcX%fm?LpzvzppHHЪ~?IT2ּ,,Y'"FHsTַGAګR]C 1HR2JקeC ZR< K=E5j.[8c*dSb sZEzΙğ614)Y5#˝i:({9Ȉ]utֲ4܍K P8H.J)TnO#⾶Hv5< nObEw][85]] vIԈ(lO XFI}2qj{#&xsyµL]9m!C6~&e6ܐ7n~Un\%EfM2n ^# 7^HUwX^jƢpێԵ^f eeڡ@wzTql.JukJ>frsޒ\LrXڪ|nx:d*[蝧 6F*#[9-6GQ:l'b \v9MkNRM뷌|ubq?G>F1r!mG2AFlujjU 12 @lЊV*dSA@"{Rs4ȅhf`UvfvC哖=cԞI[gV4am̗W{ 8)*EGXt’)#H'Ult.RRP 54u:[K;erx$ X/"OF;֠K!ɐsSj(Zx^ԹӠ[P2#H GҒ4# *I2ϙpO5MCnOIYjyͮywo}l<6QAx1`N+*3p8W/Y'#<+zS:K t52Oz4? NKHēMk>IQчojȗAr=+ZڥmwܬH\V k 9b:n;E2-!NQT:Q G, 'U`zUD.3Hэ>?요-D\h)} :Ŝ73 NWd:|`ʁae_~nS/FKsO-VlV"[Iz# _1O\ks-ʔ}cQcPr53|0Taj'ZS&EkW@7fې^hK`Cp'I~ަ|pvJ(ma[ +uc"kP6v1C7=ձj 2236~;Lų-Y$uc^r*M3' tA]:/ M;qjVNW\繁tj!YXE~,cJћIcHp>9ǡm*mHOO&S曏9槕>۹y_<VfʇQ:n(sРAu+^C BeFݸ$X֨^@Qy΋$#]{-㴅'# 彫Dߘ\\BxSWShm@`d(׊n>tz}}k𽜉2.ՅcN0(ķGIEr+BI -PMGPʫdX?fğIGZr%K[]\\äm J4T{e%[%Nb#9RF:{`ӤX[I1@cF?-j["}w)h-\Oe(l*}*wpPInѕG l-/m/8=j+V){יENDMEy$dPqEqvRB*9]CGы2­U7x-j񏳄D\\ `gʉ7 \Iw=L F"mqJ!QF6J5ڢӗjΨV.$rH<W+xA'KMj(\SSϿ^KkF% ruw"ٰ㚭m"ǐ@'VԮ_k1jBUZ\;pr1O-Tړ[%L9Kpd*rX~yl.Tsf\p qT2M-զݭXUvٙƥ閭$"h@@\$G VH. d†9?Qx"h.偾S{4DVg6sۚI%rbֵi=Ħhx%u'¦pvTgC5ϒFgXallHmڱ)ociT8ՍmO4p#Y[{f,1I 0J̲LЙ 1VI܎kI5pNy #?:G&k=DȝU"9 }ۙrczU{dL)'fV.5S["fFݒ[Yp1cgQ&Kȣ I?Y_rK?$Mj,.&@#[m2>f#C~^d|\jXIv3?"I\QqɁFdcR}ha F h>_3ioʅ9|679{m e\eK~58[?/fƚf~I-C\ cUm̊Kg󩡊o2^ Ɯf+! );P/$&>~Xi+$ GI~r>^GtWdet9-/vx1Z>nȪ#8zw@KՔ(ҋH)vuQEr]VEޣnnI%!IwWi|ap+2<j_e 5 JsņmO4ZiץZOWɬTгR&)9H~kՒew-1-I84V[H[X2;< VVظuOF9:KX9 s]5}ȃl^fߜt<ӕك$&VsAj(u#:S b3Zk$ɳnx68^Q4\UhVnhohpdKf'Nj}O9bOYVo0ȯ .8=ƚ,ĺݬ/D/>9ҋzZ)yq؀54~%!ʐp\YT ġ/.f`\1HxNR6\Adb1p0ĒmhqZZ_L8?_tRy3y(Xn1N«Zj'6cVI`+gpC+B=bʒ85O7;Y,.ߔSeOKđ6"^U+۱bzohr[8mYfS扣Rb^ޤM9v];B6P dA]4jTۻMVKk_Y=MU{.~STc*H0zsC-ȜA!6chP}ʦ$Y9M-Ӈ,sIۋqc .J-5]o!cFsIuǷ1?('d?} _֬fIs'jN28ȨTFdUH!glr=wK Sey'+]]H# J'((9Ia5,q0)%wN*4 +ȳ3G޹qߚȱ6NYu'yfa)4k^(vNWN 1`UT}1{ԨʬQCUEQ$HTl$FO5vIdiTer2C ,%f M9+kipN|0.G$P+%skD 2λ/"h(4;GS՝aK]3$*X}j;;혲(E`t9ys.xq~V8Df\'T)pLAwb8 dulM q]g[N :s.R}QGey6Lv厭{+~bQWmu ^[AjIh li%|$2o}*·jȬbr0)x9yU3Si4ڰ;0UjJn.V:)(Czc+LPN:}ѧ6 S2}Vĉǘ޺k;Y]:cf+#χvd*2Ҍ˚/#\[Xl#";b(cZgPH8D\*Y9FzBRrtH][F3)Yz}vIoz$ojs7ꤹ}>9xc')".(;V!>]"uQjD XzAO8oĿx)ڭǬ˲OʢRH,d`ơ7)5i</8'|.jsbO'Қ6!6ؚשO>{lӼ GVۆϡjvV[_pS?JɴrAp/u1֪ 8ޣrƎfo!|.?Y+)fI}d1@LVrN Hŝw#Q܇-X3DvͻX`< xћԮjݭN8QN*5Iŭd(M}KULݶ\ swG?QL5+kEi;ht6H]C.1V#[7M#gaRKY%oj(u8̲)v pm}[ 쨎цf_.ip:5_l[M,mx`1[ Ofguڳ+n:yZz2trJGysuO;5݈-qZs ađ$d;I:Vwhe"GF`[VDfV..҄Id#Ȓ6` jZgH֠dr0F0kKrF/jLfPH9 -MPG hu C ZqZpΗ@Oaؾ1qhnJ n9)$mD%.z~A*'ʼnG'9F*)(sS*@`YW S{.{JXS_FFd Do'HM[.dzHZřy漗]%ʅ:t[o}A, m#h)ӌ8}Vn<&%i< <S ZIgSK+7ol-nÿaϵiy4썂HBq iHa)fM0yo\'AV-㰆Dk@Ğ9I&6 o6Xc9Whu k%9aS Yثdsjf`A$rÄ8'Qin-c|taX'4\v2jq3L5V߁Z7\[GZH@zxlgUѤaRNjvʼn.w*(R7vMJ+$$m$,cj'}aHaiu:_=56sH'6M%m*>8+gͽ7!krevA;}L*2>n >ڼfIf3&q15Z;K7Qd@6ܮw 885N/ùQ2́)7TrBڌFَ{t5bvP}}qګ̅i=aw^j8-nk"Oird ؅s&[;TX쬭Ȥ}N8ͧa L 270jY4{&bdUe DAU^+)m7-e@6\i $,jGU*?tQEr$R>¬@?o~)Vhb}A~(ϲH?Y+gϤ“:|Z__>} Kf.o//RgXϕ_TQpPi\;__4Qp[>|kgϜ¬Eo/K_o~*\,Vϲ8?_Vhbu~)Vhv+}|kgϜYoYϤ“6|Zةc>V /U(V~)[D$n5=\,QE *vʭ&3P$tEu їI98@(Co"w8%UT uO70s* g?05Y`E3 bRy'zphZ*?>=޹1fD㝧hq,P=1dihRu ?ƽ3PT~qDN}SWxFzPU[kn#-u*(j*/:?##-l 5"D[9iQsu$}yH%JF1L " 84-Mu8{s@˨Zû͔.-pN=xc7gvxJ*1*3l8hrFq׭ME@V&(e! 4| q'%/$Ƞc$p?ZU678={PT/s pE/W=dFbG\E>( P}#M"Ig;XYx~l62;t D`D˘E}sVtԚig%|@YwysdItIvS}Niu95o99@hi{PB- d2#̍6BV wFY"ƨ!'<9$(pǶbXEȒP7H!Rvdt*2C/hsX >k4jPlDf6hi4bx1<$Tď1@MC4g\F.9z2ê<41y j\ŝ0yc럻QsIxʥV>08\X:~0<0߁ JG0/} s=MYǛ9j pGZVn\D˓3ހ/C :n-O£RS7*v |b Z& U rd;~t羹f1VPS+ֆ-7>w۷n?Tݶx2eÐ37֚YHL6*F!g9ѩEs;9XFAϘr,Yz ğ,nh`7٩-Fg1G ~L fb$ Mr+ 0aVBZRʊE\ghdQBe=N '^3V[XdT1eTpqU)mHu72H 2@l4ai4rP8L6swƏvu,e3r?\U{m@Hl"<7qH[eV*0* ^hɠ/1B(cA y~JH$ALf-E] BǷs׾ PUwK&$X(n (d79`Wǹm t#;<|T$i#Dp&mUSyId.@Bc`G^g)?g%b˄s1S9[pn=[w'I\y~dEe4D$%zRy,R4h=@>"eVV 0ڠz{Qcsҥ}KL9Dpbc<q=?JV,rT dVcOY B5¬Ⴏ@|pxRKgqO m2UrVMSKhKvX#d o) 62]  pKrYf)slUVR"I% &Kg4hYK9Hy]psށQit.ș nAA8b(RQ=MO{{ggo4"?O%!Uv=P#DlȬA88ǦZ]?SuE nL` (4`v!pI1)ڡUKVF<-@s@V]t/֌*O?QFm% TFxTW )mJ1 ӏ9˻b,H`vrhH薦b1S$9>"NlUmTmċkCzc\AVLoQ9[ܵQ(-̪pPyaǵIeGeԶ&A ::Ai@5;e>Q sMmCIUO'!#4U@ȑ˗\ۏ?%XrܐrONE]K2ǹW`f#&9pTI$$chj90V%>TZS#aX̧>3zsjG݇lF`,ۃF=jH..$S cr<V:>q$Jn\n'3*Ն# cirif'M 8njkK./Z8cۀ~lq4Ѣ(R k.(YA8^G\3tS_}87d^՛&[l;a\1; $S[h)O+1VV!pOt*v~O9%y]e'8 i0!U#'rzh5fHQwx@NN OC(m!+ݑŖ9'<-eA  ^8'6Gx.ei"a%N0?-ra O6 Z> 躐m`@H^t>~oQ]yFic᱐N2 ~5-lԠg.'xz[[ vR36@qr3PXu3bĈ3x^rzUm T{1cs)=1ͧв1.\\-ȡ{F%،?5X9r@<x|Vm+=cW,4ϲ]8ur. dd5("hP[opVb64<.zJn&/%-pOiYe< s@` v,ݧVo.ufHd7,2${H;٫ښ\\$^CǸpX1B)Z,f@͕+3TP}Ջ8N\qVV̶hR$W3{ lCXUo/>fA&۞1pON5Ki1oF:ϥKoK;D0Fc03K$w\^wdv8HSPXBK`wGY]0$R ]]T߸0R~v\`A@DK5r^PMIcu,ם~S a5ߖYT\A:g uٶh&U_9maA?p[d˳ؒN 䝧l)j69bIB<ý/yd\Jeݖ~; q_Τφ_+c΁6`GYx),Ub=2xz1jqBP`qo\犟Q{h!wa)ߩש/u4XH$[v?_jvO}rl8<҄ &oAT21A5֩q"y>G[o#qWZl9ܘ¯-ڥk n'6*NGuxp[n#f=APdPm8dP}Ƨg.|󷊙MI/4ʹV`sqO[DmW%\2'6t(8Rxg hXfR>f {W+GQ[žs~DNX ;yީ濒Xa\76W?P2#Œp <խ2mFh']6 `⫏$љ-`sId9U6κn+m@J(%r3^=>)FI   foͧ%[lo\s1֋5.䌴PX{Ojd>YnL C#s4w) ;mGSxDUX9?:Kݠ&EF{uy#f%Dc2Jٖ$,U;}v\~ު.`TU>;ff!Usayc#m-%2G5`lunIϽ'4vPY2ے[zU"ndr a5Q8ǪVJlΧrH@?wPtyi>]zҏi(jlluM-om>| D|噜H7v#Ҁ&_Wq rim!b i(͚ʀ8`}(um^8<ǯZtDB22"T ``E<,:s 6H2| ?&/i~APi>UБc7ġMʿ0?u"8ޫ|n#=(aHmnM@,p~_~4Mm!HZ9CDPPj8G .P?EKp2L#vҁ6`(ۊX =Kyl"mddǿ5PeGFT pg?XE" Ueo9<恳B( w֟kXGː>I~u5Ơ̜c`/8ߢZ-]y'z39g$u zhHĭ 8;oL ti@<ǁc]\:m 8d@ dsjE`.vC*>/F 4/A<>>> endobj 191 0 obj <> stream JFIFC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?) $$^q@(5*,yeQ֤R]db@r(Y1\S "p ME((((((((XڞǞ_m޸V6OJ%aŴ*n_:ch>iess y~Tu._?]f kV Y5>+mkԏv9ǹ}>+7_O?3HW7L,2@d{4%w2ZKK+NX :KHk6߻cZT\=.[ג\jzI גJbbN+GMץ?[#.qsNvD\tSU0&&Rݝt^ßkEyϷ3? ؼ'cҩ趚`KoU,#ca1vNsj'%|H=sV#l(Ry$ y|G.59RkdQ ;E\zneRs^)s^[GRŗ(V4fK361RjG٥zM勨r cɹ W?[emKvSI-Viy/lgub}_ K#3ֿ 2o 5kD|5?~;֫O]KX$^Lٹz涗64ʷ_^a]1lq^u Vv4TFp)aܹ7ˡWʖ9~۝_\~5mo}6J-{Lvf8aUS\m|ܴ{tc҉IL#t7m-M^2.0 GӞQҘ[w2)oQ5Q݄S(bZI#ц`2F{P{6df泿bFkȯ&wi;spNqסXb.%YyjSJ|\ .kl.uȌ^ݺ۟C2 >vA=ƭN?7^e-uӨ+$ .q.k&VWjN%TJ}G/TKfR8_˗WYu'!Z&axgRL!;Ú|6$e1㨤GjMV4tAGYxj%x\ټ|'=>Q{-ڤ= _nl-ey ,J U< H?Yw䵚)H3Q@K,\3qT+}T͵\S-fG5vJM>JnVJT>9z#/ \Oj_x3B>b>*f^IhWea]gG_!^rNֹ3J[w7;qsvWI6e#5|X-5OS|3i/9a]\?|+s, @"@y>ƌC^ZS?eW7.fkٿAqV_>K+6סW M[ge 0}8i>gtEϭv+ç:.}m㢶)!ZkFCN43o[ Gg֙gy(x0$qOݳx8SV]̙?\jo7;ozgڴ'SQMva7FkebcrO^b/.9h;l'E-ROҒ:բzE%ѐKm\c9Z5[h6;.wZTPɟeơms>ǨkDZoUfUb?i.+fm={?4Y-g]krO]Lֳ.|5^wLH%nfhgn<[7I>ZZ(nĮrFjә-viBa\c\OE&- '$+Yً7$5,^ҡ\Gmעml _FT~H["ǻʹf4 MM+@W$~5ږmۜGI<DnϕZX3N 4B\|2c3޻=> Z]Lm BHPѼ&t;7q,g޺XˉW91u5M77"Yi46h͸3[:rij%ׅkZY;㽹U:t]%'mki C m%=V)hJEA:גFw%1. v0ҼKW9kʄ?]RMèaE&h1qﭼR4d >)EƖ-!;EP0((LI\E-f(((vZ]l._msT (Yzp]%abp=R{HeIˡP8+-znh.t!@ "z/KEJ1&iNW |.23V׋4{ 'L{<` )|Ժzӌw;+=J<^p@ԼWc~|7 gn=Ofh3':)0MrQ5dzlOҥb}7m|iNGfJ?nY^G{ W3RȑxR"&_ɾ'vijE89MM.E'ݯ4֎<~7 ,kJmdde>(˖;(+5/Y?G3q\z,@5iRK/7~F6ۻ9k;m-4 O8s\ݜIiuhnw:s}-:lۜZ"}-vC>k RN 2Į[n`mq-eH0 ]֗n쑡@[8?z#yn:TJ;X;8 qXw^5mn ,JִuKD1cXM2^¢tHN;Vi[K[sOMMξ^3@CVm>eI4gZ/L$is&ߜt5oTeχH7ttBHNJ|1DZj}2t.]9Uۻ(.7Bȸ Di~Ϸn3 ؛Ö6q;'YXx]j𱐶F)bvh}~f시tN2|_Եjf^@tUΣU7D>xc_jF{۷\Md҂dɵn9Z~#ڤLKǙ?XUAu6MX𵷝_f:nRqƽF Y:O!'?v*+IosZ=\yncvdqnnv^xn[ D$ A#q>W[HdDNӚZȭ[QӾóqb[_xvwœ8owam.޺Yqt9eTPf1ң=NH"o];6y9 > km6Nw8"+ŧ_?ƶ|=O޼Z$`W#o' !(m&9f_׏o +{/^un$l8â?i?[4I{Jv֮}Z1'sZ_law͜ڷ<qG)b'Q{u|eh<iUS*ZV9]H8mN}C\\k|Z+m9W[dR;nI~3LJl|'=oʃIjks7yKg:oDq\07>J\_rnk7+\Zxudz]U{q( ɿ$zɮZw%49?Ωk /g9VMEYǜ8UNGy.#UQ'"i]CТ'ڟy,߻ٷ9]5ɷrv:%ԳLOf]&v峅ʵ_ôٔ[b+3Q1F)hbLQZ(-PbR@1 5O'y۰u:^iQ?*Qj) kM&!j8XT ]R7v$O52WV5?^{{ HީvgVWC}b 1KE&(-PbR@ 1KE%2IR$i$`,+/^-pj[CJkYn=R~UhW<gW}ҵyXKݛ)3Fj-U廷[c s+ETRfIOmszK\i]ؙf"RW%jwc28ݻ5 Qé -5CТ)`ǝ2G rނA\׎~ݿ1Ᏼ}a|6y}7 9u,TSE2'WPpJ⤪Ze}Eo۳bnД-4-4SY$OjuWI7eq7փC*tq"R GzGֻ7A8SCvطIFiqI"ȡ 5:clh~\vuМUrqrQI3HAYo&7^-pKtT79?VumN[XiגTTbA5S?iO>_[<= $"X,<\IZΤ䒅1czMj3XSԒLL9OPfXi,tzX?SQi5U8*uyWTSZwlgj \K3[$zy _R8ګ`T`Gz΁ ABs]<;#PRQX/dd|mke Ovg>+bAoӓ̈́#30>Ӛ륌=FU\ UZ3!ncm+m'm}"{no"Jݦ( .vک U2c$=^} Mw[EY?V]^H_Z;Z#.94:^;ԓ>i}b8,e8z~$?ix~X'qh&kYsF>fkzhɌ8}*Ňc@Lc/8ywxzrRUK|_GZ-~k1brr9xYfoyW2G~v3zW?~ hY`wߌ~J}Q*N (s F"~*早\iy23P\ϡ5:$ Wx@MI9S|S}6'&P2x5Ml魙 R.1px&0{s5k2rS}`dcFzסCpҶ߻*+;2b GM7Όz]f?;-/8ۙs\#C:4m]{8-'Pio'hjndq(ðz\>#7({xjwF/lYo&x`tr)VZFQvw8O?o5G5V>9V%v"3ā]g8<3bsO:Hxn#?.hyI9oi"<uƳ3B $p}u - :Yc?M.S%;'ƚk2QA˩3!Yg[7~QsŸHa2:v,#fԋM4[I.й7ӽib-4 S G7^K*FxtZi ,WS^=TqԹ5._#TQ "1mx^rsTo"l0to5޶Q޶ࢅy͎ W"9{tJB,*꡶UC}5ɳ1bcrO^icog)mdƛ4U3P~f-Vob G]MGSu <+;~b16CQ.ԍB@*B+<_c+MhnzttzUKwq~DKC=lmjy%1EIpUX~uvMI;Tn'IyZ_mL[go$c?JI.u|3vTVCpd6!F sYJ.ȗlZ$,j͞Xb؅ӃQ?QI7Ds/=*\+69cpJ_zot[W1oEmd³š# e7?f9:>[u8 BRٌ mUa VC9h+ƯWEYsƜ|5ɴjJW)˩+Ӎ}^gԞY$Bsz֤pYdԊ11qc$Rx֬kLڜ³HH_@OeqvS#*3q7c-wܟΪIk QQ:E:(JZ(YR%qғv ($I_7$ƢgL0ۑv?e&T@m~;U-hR IJV5[E 6OyPJaQ*^l* qP_ǔQ=q]J_^0I19)WPLQX{{RDT_=P0=?@3pnO[)V~ ƙF$LOқQi-nT=KCЏ׎Eijg+?8ٜHC7ؙJއE26ހf?g'bX50ξ~YVZ-޻4Do,o$sw5+)ʡ#?J;9d&$R0,.9c"׹PyIݹcֺkWo$d<= bH[it/n4q"I$+wv%޿yr[TT Cs{}hF9m쬻@Sϯz 컎~]޿sV2MU:\q$F7y1JNi-4vLz ]\2$LzO >_o+6ꎱ]35z]²Ʊzigr4]ؕm|G8ֳnlZI彎f8lPlI3VGm8ǰuKڽ»nSԥ14 fݵ ]f-L2s"X7*s&Jnꄪ?MHoG3q#d_?S|Hjd_?S|H?z쵯Z~,MVBE*^?([QPެ* }SN>G:y)<ٔ.1ƛ5.{Χ/SOMs665{L敥yanS\X~ſcc=ѵO;ysOWydkPAO#4ʰ5ΞKB]!̽W'l?9LhkT|ޙ%SǹOXh/~5cxĤByW~c٪տq󼩜X۝Ďo&Z\NdH.],vxWC;1jK"Uq5`7/<.Sf.spn-"+4R"hE L8j[lugYScϜɜm酪 h/xwib"-mqǖBh=E^0Aόc=K;Fq+u V8M1~qyo]F.4]YY[MeCNe++Ny2 Ϧjd8$5U 0=X Lq%Ɵm+^ H[1Fx(hTk 3/m2r=nlmo6)15jhAX<P `cղE E%+Oems[.߻PcB@ഷBAJNHDQ= xcAWPpj=w fgdwO |#wڠfQEa1)heI4)F0ji_ +Z4P[C\iW D֐c C6(Gi#Q%դ8V5Sp*Z(ZϸomG6OKH` t*-*yrƮ# ft?5>!W`)E@ᱷ)՟-vm 6⤢SLm-\ f`e>ē`3 .`v}rBb c^*4BQ@yiqu!UJFMEP(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE endstream endobj 192 0 obj <> stream x hAjDׯ_yJY>Qٱ~޾|7r&Dۻ/gbVL@QMfh͟ٶ1g[z7/_0-g_^x #?ԮьR 1(#LmdfV<">~MqR\|[^8[,y\˺nz0*= z~QcG%/ &B!ڊ_'Fb滅^-fP< AEi O/2[L_ک)&*'jSL)SV*Xa!`j(%v~];`WJhP:P>$_vs?, ñau-J;n V:x MO a.sk4vq򎰆BE,~D^'ZbI7 arJX).86(vCFU7LPU@+zԋ{"B@-B-DCGw˯!EQDOU+d TRS Pa#xƱ|-W<3&HhħtօδL<һ{Xrē(E@ѫm_Mb`r5,\ssdg?!5sAg3aٽoark}`(ǃ9X?0 [#8΢S {zȋEYemJZ#@oN'eEqVohPN,vlh{zc90cCƳcyj=#Ho87nV” k wV%DhYϖ6=l0PQRk%^ 54%eBcz_,_T)BUU^U\ 6a ~08A+ AtIKq9P0R-:%e{.us= \ %8pdPFbӮ*щn- 18>f gdՉ*q[^SrWb]ʊZE,U&QK& jtk#9vz<8a?]TZф^S ֯tkC«W~ѷO @jEDDe;n#G6izb0o1aBs~#eFj":ɣY&Xb5 UmI4=o%({-'[<2h8 x5kN ;:m}(."G5YaFV%"+m(^dh{@gzY /yr#Yh$ݵlO2H4j@k,vju*::2d[$7AQ{ k8uxk*Gk6)*aY滉PgP_$jp{CBDdraT&z9x>`I4%cPIFOm1lӉ$_L'uĺƃN=Fv 1ӏΌŢb t{{빣?dG ?dRqfR٢9|dgE$da`tOB7F?F\ C?VlNfHÝ3PCpܞL"1@BH>^y[ls^UzRnwooW\]h'@5);/KI ]e"('"lAf|p9c6BZFًFaa MMXPe1>xϕe#ܭG@Z>2'dz_gA{yVykRsG^C{-U?p/j?:J@ᆐGC3!=G)i3{:7DiLFLIEg2>/_) fS',Kw$ nHWbbrRefC$L2DOlOA֑oi%@|gGPqx,Y08ԪhH j.v/ 5#CCn:2#ȕWEN\M[0<\ )C38GH5sXhMwBVcZWMυ'?'jk OOjи ׳eo&߆D5ڲ>5gG=:Se'S@&cP^Vg7ȈOmXpzV L>Hp_!oϮB]PLإmkkfry&5 b!݈av>uav{k8<4*}?ǝJhP`Zpŕ`v8H: y|D8E sBgAf< 0Q} 11_﯋60 uzpO$}4f73'y 6IC?a%yqE5_iX;1u*x2~=Zd6'r0 c(nHSAHa8G1-SX"U(}w'9̤J U:?aVUo?k(.2ljQ7bvzi2+;B6g2RB9=S`\p98U>32є-܎MӁ;"ʔäHfM@+gcDen H~ːd [yel'R#MNB)1 | 35r2Dܒ)oD. }c9n Jwzng&(“:2^3萟2MzOgx*M50Q͈ N9#NkWG߄8zeF]V!&]u{ȴM`_nd1MյwShս+\.rCBYz.^ElaA6 DŽ 8Õ*O.Sstdg{!td/z1|Mȏ"qq&7aa1mDSpKTň8,Z>ʉ>|N/^tO!Av\M8c3MMK="6[b'iR?n\\LTTUiեab(ɘ+;TY٣^[j78y&yRZ;Y|ɜ0a49# e&b (Sr1<[vC]PӦ!p+"<*M߬)>q S8+L 3hef4aEoDpY^s(0һV,-eǍp+[ -uYssdSm5ٚ_St.8B!5jB kzuv_~㴭ZD#w82h2O.>_Ņ\ Oj|2 {?LW{b}[ل Ñ PGd}dlr}`c#mlb Hfvb/S"% smGY{hAL}o˄EHȌXԘb"Q9NF[5+GSLإB:բar>RVu&CH"O>,lm*bW SuX%X@ 𲌷Lޤ+Z `9pLTw|F=4d`J-8W"f?8x(Ƭo4P^0QK9U$c#\c%X| ŬXO& aM'i">MkV6+ʱ]iⰩLa/4TBS>, !+O,k|!.ߋ\An( ]=[g7Y;% K+~p'd[24BD՞TRC,r;|ѧE_H}-GnHi+-wYs8M>V81m@WdcHyT1a=trOp] Ё|o39vG|\ƛ@;f-Fw-ޥtzx$P5G3׸S:aAT#%yER.X^26ITwl!p{CT?-F^lWDbA-IT~ޭW'ޯ։OBD?Lߛk:5wPѻ1h+g=$ ygk?NyO+GSk Ѣ:YLʫm_y_=FrDC۹O{t ҁ^(' (1,;F1<Xx{JuOڔe7it)9 endstream endobj 193 0 obj <> stream xksG&VEԣLw{ngt]?(ne6/|ɲFĖEP?~&)U"(ϢʢmDׯޜ~wY$D+pi$R'nJ'y/We~hϯ_}=Dm"PH (iPHR:M2*URHdIol'\`XBIKH|P&Ȕh ce0eU84)SJ$8瀍ӥDt-nb).* uBqzETjzuRc'- ;Id!Qxx!Wzj'2do7棱(4~!wDy<˞Қy69F0[6 6,Кrkg~P\zmp"M/_q&.~:vx J-\|1FK/d|~`6YkQU }ZE^{"]С GΎ܅b6Csf6dY;ΏH LX`>Xd']S_F-_ٙx2Xy&qfCSUc>Tay۽6#0n59› hkX/c5~ގA?vޚ I&q_X H/8֙夫B0q@7XJes]d@ɫ;}{[ k.i޻cV_m1Yzzf>/]k wvΉ@9S Vv!fO)= r% efea TYHLГ#4w7h~IcZ6S~dpڽ;vUnN_#1ӸZHNjp9ˡ%ewhI 밀t-~Mt&p6R3ؕWҤQ*{sM剘[9tkX;yRˬLrq^@|HU_ "LQj`ca4DZmc7s)+_cx|)ѻ ZrG.Q]zM}K.fA܉d<}g]%Ge֍ySӛo ci"VM{*;g4*$zW.YnQ,dj˾x).)8mHjJ__m@&&IPND['μtbl%eZw,DErY*ѣ?ߎ7Pцsݜݨ2:tΉG̮B'RXA16V ^&X͵iPܠki{-K lǾ74XQ,"Z\B~Aζg5< /M,(R#:}E{3=4>k>eAns+5omԬ4p27rh1)c@!gjtp8j7DaV;XuQo7Hro\Pcqz -.UI:4>N 0Q-ţ߿$ܿ^QIwFƈ*<+ IŵUhJ{aUU Ҕ.@*+ÉYn{a> ?Y HUG G@ bxpe,觨aWσ41Ӊ˱*hNgMT@+_lN ~l-DY|ױc,fS0}_ wNG3bWog`|t_V:oS }dyK۰pJ/TˋOqk'La<ٔEN9>aǵOg /p <+՘=!zz5 <9T騑(i:rQ5GnL'>+?WOD2h:><Ԙc׸`ӆs: #:w]P(M(o|Ş 12>?#ŊlXBT'LM~3UԾʦBfΊxp{br޹,HMd '1ͲQY{3b=q m}Զ՝̛ 쥟&Dutˊ{:T&U]!3mZw&)PaLل>{;6saNe"1/]Qo4!;-7EX :Zʮ,+&EܵhTT9ТӞ?:]T{=`mUP|XuVv=el4ՓNMd uvdc=h 7W3\7<+d0%l!.|^ aMVXև:˫mԽW Tq}㽼?|z'0W1v3$vQU2 _;G'Ⱥ\u~HL-?N Z1㰾񺶞 Gu}BO(s k9d7/^6TPxtouQLݯ֒PRx>GڢA!I‘"OQh,d eNΜ%mZ;*aJԐǽqY竮:>cf%DZY( Og,ɯ0ppӌ2:=[cx_pZo T;:XYn'c=_4n{pռ/rb s!> stream xmo6wлJE)]9k!khuq73(JC^/p8?RÕ+kLDϦjyQ%="sΕNW{Q'3On4,z_AVLR QP^ ~6Hnt-.r]mn<u"]PUE)YvU0ex3PQFG`P2YrT^iã0)5J䭘GKyJ,Jp ̍2_3yvP*D^eeP)hf3R"P kzCsu9 2/0T\7a'͐4n:5j3([G`70UNkWo#"qn2!Oެayĥk\_践Yf5][On.3Q^sT]õS c).qyG5C,@4&h-[.Ŋ<7_(%9wZ`7$jZ"5ݼAi'Bد'rt j;;SY µmfyu5Q@op;Ipvnna 3yxD^<ŬZ.}w;u}thH nww7z' yCA5`ҝ_ǚ{~A&~h/m.)pk./znf. ȟ ТƆ_0b Q?@>Rz~Y"774C+[D }^{_v(lpT?xNit)ȦcCBSnpw{ װ^Q4ݾpQ.j&.l/k o3kMfٮd_+ӏޢJIS,Z<2H S*iaò,@O光/͟埫LO19Zb!;9;vY;ƽqx> 'E U >N* 2{˦c"vs„_Kǩ1c +(r2WM"Ky=:RuAK+D3t]$[jQ8Ő`~tf4js%OM]2)̈ˢʕxP⾊n&vTn:m UG$  +kƷ-|>9"k5˜dy$ͳcq?RDE~HP<2bb0 #}',#u 2O_q!/;Y*j!c+ ' 2hXV"FPP3JwR08X08J JUƱꂬTu$+G <3$p{, mDyTzg"1r 5st!0Ȕ"VD,#9:z轟y( ?XD ",ȣʋ<;,"!G "/"& "N w""" X])^Syx?,*"QyT{QgǢ1r|_J2X򗁒 "TЋ^EdAꂨ=R3|RW/-\ < XZҞiy̳ciD^K{(E/B}QQ}ƕ.DKƖDx鑀Y*G,VVeQeK]"}`m_j"TXa~XڞaѱW<K!r D70فN?`?G^.rw+U V#yv,V#w)(Xxҁ0Xn4H9`+^)WY^f:/UA5r%Sy7Q [#Z/[3 Y"=90\:tr` \:tr`QbS8PM@4ȼ<϶t)ImOt}v*sLM_; oc˪Ǟh[MQu66(-m?dHz/00X A2EQꂔU}({iw,ӧ=|G/aptyʲe=, h,3mZ"U`v,׃,#ae€ X}',XLQ` Xesc.7ز":Vjazk| F[A8Y90Ӧ," .}ϙi8s=93 /g& gNpwr&8X]3YGrvd٢gB}t6>˂H.q*H(ђ endstream endobj 195 0 obj <> stream x\onU -G{5;ɝܣ!w(~HrR_3"-Lwgg~3;3\^bɹ(4ѢY4;>+qb]q#eqhJfIݷor cF-߾{7ƿEg{ #ccԖ("2I[b&!>SţLEb:f"2rqM7^1wmX$K.^]4OjѰfhݭWhP3lXOMP a; Noȯ]bQVMɈf]xe4bE(xw\arVK$ شB[FVL͒<:R,iFL蓔6A 3'ƥCơMU8w# vlڨ眘,&nc\ڐ? NJL7`aRv-_RVhpFL^'\6oLPqv0dY$6UE"=y,/__#,h5Ap{saǒgbʏ:&B= :G*O4*nmoX'+X:Jki@ [K} 4~I;ʎt*fߌh 5cs/r8 5фk My9#2 :UF۩q&i Z;f=1 Z;N8]JKV ;v*qxRnƱ3 ,2 A&nNKzC7q~nJIČUG75 U͙-X&^) `2K1O"uIT@;"IIĉ!".Ö*{^ieruj&gXҙ_S6Hv&ˉrbs]&@7 nj5o#^KΚn5#יPOhTKvT=ghIM/\$⚶b<<\iz,E=$9`$-N|N9ys1 ]@= r2b7:BwnP}Lq2ԃъD*:`2t3R!Y'!A*I9fT'⩆%t '@bw ti1$꒘iީ`:xgYF'/"m8 x7FSHG7Kt E_93[8A|]|0Bd)J  jxL \8L q*cy .M+GlM(]Nwu6d|@I gF8h8U)^Znͩ̍"3b1wEbHFzjFjU[yu[6!WȫOR~-` s 9۪;Eh"˛MySL~o DT2-FDє1dȾQՔBuTA~V L$F11ͧ  T& as^Gޤ1_*㽩Iˀי$@򰣸ǐ@DfK0<\7sfLݲ,ʨ2 >lAŊϔW&|{i.eOUOW Y £ckEqUs4_K/^!z­}&9]L)sg#f<5K1gɌn=MݟN&D*|!P>ߍ>O1~Z=\..Mhyb>ì|Wu @q3$8)?4st`bqp5;)boO۰;Rف*5$|ͮ-.=T^dX]w{HZY I{.}*=t"m4\ySE-'i,)_¹`%Y~kI|,P$OCNqr<{pu |U!AO뼲DporRbޝubīsD 0mm?c0i@TtPvW@1{ѵ]Qa> oȜR=󛬝Wh*+Yc*S`Pk*Kps8*<+m,|,B4u9=QÝG et?Z`w"`oUKa9t_n|BTu#j{aޭU i1dE2 R9ejk8tnm<.nD^FTޗJ@bg [I!i9f]`p0d%6#18"7 WNsT#p%ߕ> stream xksgoR /x&6$i~eV'9뻻x!Be(H`],],, [|-}<>:Vd\e8*84J>~>Tޙ]ӝqw6ɦ>/Ɵ~WI 鼀 PkQ\gΙJ13.X+U"10S lR1đ;x%&Rm1uUt5xk6,>?R>钅9E鉚4i5|'zrjz"'O=^.\a A-@nYou0bu [~D~l`ʲyQ#{UN=!z=ܾx]Є||t%|K۽~ӾsMnphູrE-\؇릅HKOnj! ۜ841V/WS I1kLjgS5ÀhtX EݪY7M948_V7%нp2 /X{4_nnt䬔%d(5< k8a.g(N#TtS鵽$XDŽR1QphI_ PO %~,P8IQQ1ktí1ݢ2r3mXIhͥKF/*f]wUXf1>Vf"F[tn픣AI5bF{NTr5#cMI eC$qH Q*gz DH{Ykw,NQTBzPDK JBau"Bg (")}[ʩuZ'\3(eQ򥏆 LyDJ L" zAjU #t|d*5?Sx&GXe$ERg.si:.9Ɵs\Cه RC%5'59iQ&3'`у3'T93gf X]tfOwfMWiTL;WXͲʻSh$2EW.u@Ë-K.C%1]fTMg$D(zL̴A+ݧ ʥs+GF?"N\ Qv9,_vlz`T0ڄiK'tm{<06 Sd2xQH\Gfhw4桹$5>e›̔1D~4 ;݄ħXϪؠ?MODx˪pُ&\|2T!?i㵯ncV}sP/pogYݨ4/_ ɅTcQ(i˶8+޵՜v.$bn:З~ 8Td+q4e vhפvFwBV-{FH3GDq›Tg@'hС$OܶPTVBy7 A[NR@ .Y,| Okv{O?(@;-ѻ*O@DKnm&Yv[p DhC]BxaMg G7{?-\d @ 5=i0İhHaH%0 Xz7>mݣ_3xy@:GCZ1dX/U$tjŴNZ23s5 &n )¿sF2E)O!tʜVJ]Qۏ`[ gaTYS\!sY2msaXKWt޸r<݂OazR{~1ZIߴ&q֟ {0afV<ƛL5TqCF endstream endobj 197 0 obj <> endobj 198 0 obj [ 199 0 R] endobj 199 0 obj <> endobj 200 0 obj <> endobj 201 0 obj <> endobj 202 0 obj <> stream x[r6{%PEU뤉;i&nHPdL$%|"j,2g,Q!.xp"f1.8H55"(ˋOw,Y\ ӌéTid pe )?x?//?./ .Ax&9L€xM 0Eb:f" 2Ō` WU߈p2A\(胙IK$^ (#;I fpo<}(u pg6jJ=83S`qDRU4SapGOVad—yeެ Kc4v}ͲO{:aR>o$\}QLNv2iyh1*DsV߇1-qRyEo{ɣR̈C`Rߑ tt{-8zuW~#;.y x,!–L[jLN*2ROꉧMvפV34j\ҖbF-IdǭuBv0-ɦ\$ı~ S9 EN77IH%0[Jlvtš_AcKkCRcWIT^{q>Lz3SѓS'\4t/&nôJԄJK >)?ϫ r3L[K jsɵRPawx|Q׭U,L*;Ϯiv>H[ROX+%5zviv ƶޝ:TnzեVaG[c/RMpTUVo}qK.A y܁n2:dLZo!5#$?MϘ0wq6>Q `>v[.e> stream x\mo A@؇ +/Owr!$(8Jb4~v}g"%YҢ'#r8hfHӓgxő$*?=O䗫ӓ?K"Y,tqģL1R΢'2gtOw(+-ӓCDLp(fb*J`h,VQbdQ&QOVOoFLK" ]L$1qGDg07%H膀Xj7as*Iə{0_B Y/K_grohWuww1G=dEIZ jq|qS0#C+g ! C'X ctg| "5K6-4Ka?:]8ZȮ9an:WG@Q&G4Rd/Ar7:ٸx ^;zXD3^oǎ<'&Љsr3EA:ø:<[jYx2R4nP!Gnqݣ;=үji'cML%](;3b51ikBMf R`=rK$-A{1}܃ r O'=)S5I[rp9su|Cl2i 43|-V ȁ;'sa^ |)vΗOJN o]pڹֵԺ39ǻfpxX&BQ"dXaQ oO7 {t23EL2԰@\%,0Nf> x>&zD3b|N ]|- ' R&`V2?f<5s(Ad/pKЛ(7_۴ G8;$=58|BtY.(2 -Mة)khP tZHȉ9K tA?%9EX~(D*@UpEp= G.^ER<?2F)ӌq-iQFoodM ĘIe*Li!DaNMoJ`ɞuxLL:kJeW(~ -2aYx[5gv܆}}d̬~,MY*A=fHaI5KM5c$NBqnRQ`q ׁ5_Fgһft>w)U/Ҫ=!s+^Vr$Vӄ>@V(vTI 2 8*d <>ړuPUd`T8~IV-I4n ,|!&Ɏ@`I:QOk NxRբVozHbUأ#;spERaLoN %.o^n2WDȘt%P8-TM "˘,{>V,*P@|Լ=8S]|yZEm4}NS|Td8$nfE` 0[iL! ,0G'ImA3^Ookof~f@GpBM"Sg'GcϢ!=ނ6:@f*2( ˷.,%+d9Pئs6iڊkNb|8 '_"n_}K!IG ))=\A$ڿwqj@IRT-ZaEn K!NW:G|I;;/$zc(hK"ţEHm4uF}nK[r {~rn?'/)r)r9D| wE-ks] Q2UY TǮw4 yD#Q+=(~bJZq8[sy⼔` >)i4\M_-‡Hm)b2Ňoa[e@,^@XU[w0؀y endstream endobj 204 0 obj <> stream xksFgxĎr_|zI2M/7+q@KΑQ.%ȫ2 ,X,?YjƓ<)෬yl~*=??>%Or_1T*c*+=}J:3}|$I;6@ J06gT^o)YԊYRJfJ E/^~eF8& NW=c`u f22 M Ð))U<9>Xo͆gT㓒e5ǧ9"q1R}z*'*&+Id~ ].RO驘ǟ&e^ \Z bƧX24Qd`^!J5[ߠ!V^U$|ofv3.Us͓IdEQx\C؜.]܃Tx|lѭ}DjViR53 3l]X}GWMeOI~nSV (-=uM4'@L9YS&'ӡjd@* 溇hL21 _kR_6~Y]GeBx4*[*&eӁ5p;s$֘6W!XP=Cٞ'wKdh9oH¢]7Yj HTd\:+}ƕXa.={XLpD }]i>Őy&+civn7@(3ɽʺ>ҡLMcL=lA  zɴC';<mIxFS:%'?P/)P`=MO켹z7NOZ&Eܶ' nMQǠjWO=Y_5L^񌕏ɂgI `Dv=[ (`2P= dqHf1 Bvhv=|6*_!tNBj^~7vR,TBAiVejfyE<8a8d98H "z!Jh91:o-91]{,$ד׭ͼYjL{q9:;t 'p\@xd/ P{GH<j^/씩BxbBvV99 A2š:3o6l^D61lFqg$&qF\P*C$Č$`" g[!Oyd 6MEÛmysRk?8ZpB۔"WRe؎񵈎On]O".)!@D2SVgrXL`Sqm瑛W'fb V7ރ|4:ESIADPk`4Ȋ!En|PfsUČjHBK(hwqIV(t!oK̗XwDo1;ZhxNx,]>j΋b!D8Gt $.03h]N Ia?8Yuڄóީp AaExnF8kg36ꊹw!'4N0>Պ-Tya(Վ9BI 4&eUg2רaϸ !d ^/v@.oT:fu5G@Ν^&tªwJ6L6 ȪDesȔŽ̸Y<]]>mwxEJ kq Q9okqfd8R+u$1Z`}y /e!hS:mCLUɳFl6%r,ξ )y,2k,1mF^dZ G*1} "vݟ=?cլJzU&.sϬu@~~$K*ZtKz:.X[aS X]q*E.v`;'.<\$h|avڏ;fJ8VlѤ]dd&ɴl|Y axT>f̩2!B(cMV!DW^@%fzl96 #S(npK\ ԡd,z: sR`c@ $P-`~CY4׃}{x'̠D^ QYU)Z_]j~~b{P ,iX7Tn a˛/1{^tEEo~§/k|;+hs-{ۇ-vtfxț :0C٩y+ \@^ b}=xkVY2$n/oz|5ǫfNN@m$&(OB-a!t;pPKg!M' hh2):LН*./IY_*smvʗ5J6oor'ھK`e~|OZ-Gau;vPjUȮܩ8$ԣ# _նa-X=ݻ\Gr}{ؕ K0RH؁^4o\y.I2>YT?g,4-Y/YoST7YW?)e3ט)`n)$@SJm9tm݀ Ƨ`tlޞƓ2z&{Oa/b38ˌ1N)5FwbG%.+,8V"hLӦ6O٫X`Nu 87eAxD^Y턙 ^kҮ+GxxTQ"2%p-!f^0enksT&3%!ĝ?E[5_Q7}!sy+Z2D@*]2 2eV@xvA]+֎*#2SQ" e%<^m`TYwp{ন&76 |m \q"{4nQ튋kWw >X?ךo8zDIg |CyؤkT%UOM>bN >`[wHQ7$d^zG0(S..q 'ҩ8k,v΃oޟiUtc[sde`?(ϑr)!`jReD@O8ȖŬcx<@pm ˘x2b %pbтȽ9fMyD:2{]q'bw) ՞}c?K`K0Mڂ;w5!eDIYմ`+>$;7Ր05o)1cC')Uc0ڄAGs<^IA ѽy%JJj Wt;!S aLI.^NiTv@1CJ;V(:[F*DVIV5(SG}50EAso1,QO&ƣ3tvyeƂ>ٰ`Ruٚ9ӈ: @7žJpbkI䈅^!bRh^Щ(/ya Uy0,rJuM49r8 0ubA!8DƤx%XM7cO 3ɺ4 eP k&5@힩Q#WֿJb#C&hۅID(̱EGrWx endstream endobj 205 0 obj <> endobj 206 0 obj [ 207 0 R] endobj 207 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 210 0 obj <> stream xksgr_$wz؍t6M|$HgK(9I!^]3bX, $q4QiÃOyX\(W1GTqGwytUi{Ãϓh⯇o`|ۉErXP (VI d P+ʼn2,֬OK2K7"qRr6UXLb*&鱜Ex(;<)~yys;M'eULZ'm)4XϾ-䈒pw%Īdf}8\ul*Y ۊ?g( |P$;wFx [j8\ylЙ5:NYX͢h-nV2$LyE.z9U&k{l=ll-!@s Rq*^-@:ߠB0'\UxHRǚuІɝ\_ 6K8eb%9Z<"# mMDS IÎS@S#fҽv 1lɴRZi; ⠰57wa8Ҙx\ffNòpާÓ;xQ,fփVdhZ"4ʅL$oU٬4vdNswkA_٠@ʮ`**'b`[ly'U)+ǽRYpܷ6i&8~80}e]1rW ڗCU`ȸ_&x{'A(:?;e[Рp}ͪ4NR2W_ .bY=b$`Еۇ}Q${s:_I1$~r_o(D<@ɍ-(GY_݋@!k鶑j{ Y,Xt0 o1責*'h, ׆fmwA 8C)4ژvYP xu(L08M&~XjJ:n#RF|k4'<.l b#͠t0듊6̳Jt2ơ67by4yI̬(a֟w(!jI '툰آ9 \K)7&d6bdm I"ɱĿpɱ rl?aRfAgfOXW=Op(tkSaiT`"ԣSiIҎƬ5!2>aI ]EaZLwH\a yiJ`4Ki)kTbLڷCV;kzE&$:X N5$[\]3QOϰtv6pBnmhwsr͜%f^=O{|GnV^ζ{N6ׅm%i:y_)o]^bWz B$ O-Bb[vI М YQ_h#[T{07Ŭkn?*"t[ibbA"wp, wyT7KIM厃G\08eC?(S=6'U벘GKa3|.=Hq#D>&IK@ݨ(4(۬%j,Ǿmu.t"YTI.\p_fk9ey hZ=Rt Iip$ cuF w@Z4UⶬJkÖ?EB@ 4Dֵ&( y(W4Gri(M){qlWew&9X۲eMUs#WkMZsK*y [226VChRbdO!S /#Tl4`@!8cP&`L>it:6-!c'BQxk;;GbyXͲ F((L[H8ޛ TGbU"wRh=cOno**,Cce}2RrvRljX}8ɛ.9޲YX,Fs;@ 2sv\hG.C2jr;<|9*!w9: ^z\Q":Hg3,G|^%X=@ZZ{Txl&x+ɱM,aj:X&҂g?YuZhF]#DfcP&ڝ9M]ě\H#<؈SL7/g"ilZs'̐$0:yxR{iԆMة΅XH+7Tra; )6gN%~A(NWB98J,2(*6µ})%@Xb":p8C1hD Lŭ ج0lvIMJ@g*X(EƁ k\Jr;5F}!ۓuVMrȗ%P~"+#BBej辖zS~cj+D å ~9.Sck,~jVM 1G";@dx=`0}Ƹn1i6L*I2{iaFleCݴ]ash̬Su *,Ae ti3@z]XGt Рnnx;cqQh :< ([[@Cy.qڎc. 304.w5 TP k*M7"چB2¼Ci 8X$5_ {hv2Ϛ0_!**.Px^ \dtz˂&XT53fxc5ȯ,ivԚ0C%^پ4*)蝨6Ec`{;[zыL?)b5.֑-\/H~-ͷCv3G-q9>twFTQT;dCYqDtǺ b5ܩ`FxJG@У{W;ُɰ 3jh&3C\h!n;(7=qժ0%$𰰅tWzQJEa夗硠 -=aXwnO{}} 3O3294϶@NeF7`3T rF:2 5~] 3oaz`,~5e~+ᮿsت/5?U endstream endobj 211 0 obj <> stream x]s]3xR}q;c;qNi5}HĩE)Gݻ@GAB~EH4-+l&Y]^x'Lo//+3UJk\?2]LrW_^&ٿ\^|_ŧ/vƌ`ldP @(Wd@+^JJU$FJϵoqL8qђ 0IdbHDI^ܘTT=Թ2ܰ.2V̀8B*dQ<[SJ`}- T5PX[@9ǯ%"?{%RbXd2A3[W!;F2W@LBu#yMc`J3NKsE+5j.I15 ) t1nx}|eI$c +T9{`c$ʼn@\5-<$gjI?,3|ѽ%=+S9I)Cs(' l׏K9Jc,({}X9܂f|X_!6,3E xM+Ͻ$jԛǬLhHݓBϢ s'`!QW(}MI+z3D%rT [/@w(+KT0y!hGE$2sk>K9390[1,m6x=[sɄ-U/ [ޚExmۦE IznE f}> CEYEhnh|E7.|~`p7r9ox0r9r POT)0g9(Jxs* fbd^zxr r4(T.=CVq`'( x8z[? fl1x|qWʗQXuO]|E6j[?p:~6C_j|j GU_gҶ) Npxc1v0R۬i?EU8na1l0=m"&r\5׹B˶BϨ oŶY2I;b=L zFe6UၴpѦvw}|bۛ$Sh4Uȷ،v̦uIi$<խigyEs& :LV:'#MFh!5*͒3t%#!)Z`=vTPA*>:w%f0! 0kY)dp hj.?R~&Y3WQbHDA]\^D5)4jZԶIt& V=mqR|H&?eY=Dh=Ӭ-% _z~(?y]`hFOn\qTsw>k;ocf "4r?W!@]޺6滈UsUjq//:g @*7} ^qNK$}@1ilX΃e{#zHC-fB#'\FZo0}gIv 2BcmБki\62\Ti]7w3HUȜT10EƟ9)0D}gwg{,> *yʯ'FܿyfGӒQ.ډ'LUdDxkԅ$Wl#niЪrA}E/xO]?r?eULNS, lL2Wb[dS;j\.i V͌ưZ) Zv Z򴶹5Q',}y"~"}V˽%U|zΘK9,l8 [$v:UK:H/ Yy@A8E,WS`QDf^-&r!oRZ?[l\v.v"e"Νٮ[L? j;I4tOQQR91'\HiEF*muEiWAn87{ͺ5PXw?VmE- np-&0{\O,n!k`n *W青j,yLmTD)ap3>A @#zZȁhEz "_v](ޭ$Iklt( պKYe-y**=zO8YtXL l}z8QB`+;]e (>$ti@E߰Xp1us1? ͕{m1b,DCCгvMU j]8ݶjn|& h̨qc8os# #8̼DNH.ӸH #>f# e6#KOVz..9GfǢ )f8Z)H_3*Z`I5o{Jx5>hWS"WYYX{ e-2RSSMlbW@=6h d?K>}b)<`ׇsl?Dߴ>>g `sT-Zgo|l]VQ[ Z0.)n >7}ɵi>hzͭ$i-V/sqSjKΟv]^Pw}u6!Y>,Qf/AT 5`@s-M >16HB>YڬWލz+yܲfkHw[2=F(J?ங}+TXmxb -vMcd?E#Ēeq<@Gn9p]?w]*mjߵDf%B :bNM8lK]?V M;lfF~ogQsDZوc39q<ԧ :)# ,p^SHoUxםv?={Qa6ϋF60<>ru!@]-GlvmL{sHLu;30󃙑M@-Z^!OZrmVQW]l}onqG3nX=E>a8`ȡT?p]G7!}]߆Dԥjg}BJ\EZAK\wu~}תx> stream x\o.@?S nh7QqQNԣ{}f{svCŀ%\o3Ý}z" j2YY*{lNO~"[|s~z_U&e!Lv~uz"dB­ʔu=]wgvxo,Wv'? etZʑF0~VFf]eVP.sL–ū/RNN[l ƚvͦRBlL΀6TvmfĀAllQq4^i3Fǧ4eʺ0z{\^]-\lz|nr)f݀97REmQrg`'f/)0QB|#: KaI[#ȥ}DΏ#oRBSEnQ{߀N5^|p2ܼ*w ota#%6Ed$Ex\U(HFj0tg &~ǯo#ͺgQLOA w3>! GQ槮_@L" ';:ƉbzKF@rŠ v"9=)+J2`W , H6ʫ{B]0Rh`Q 8mm 9Aۄ.qEqzG{-رոd ܬЎf&qRE6,fyvւ28`l{$Ob0ԁu6t,C 8 t3{i|TU=p׮RmjW25kr:Gb Mb-q{Z٩S4>"J dD\3%C- c)c}L-#Q(WKqc0IedGs &JIRK=SA(`@SƖL=eLQ d 6;wJ-I%Ü2ީeOm~˭ƥ`5E0 ~$ >z CyН9.:$r@U ~Z(\jEUTBrѲ*j3^{(% ] RI gO{W4/. ң wìlq'P>ꑘҙSU%-]Mx nW|P7zw~ry' 1j..TӃQlI:j s!uј} Ѡ5ܢ?( '3-T&&lH͌πe.e[J~ZG/)m?cOA,1n栩4UDRBApfY½`e℮),?"J9V*JgYK- c,q@iZ H8Cq@Iʢhi'SkM 3mg$׭[8 w\7?n7h4\H, g:`@x#&[ 7_oPNK "p8QaĪ] g{7 6 s#C +qZhD1>x%l~Xsvw2 ۾P+<.Հ5'IZh~oTG)QL{q_C{ %/U0F_xnYWح5_ X),;Azz$Pp 2 {L X=7'c*@é)k/*ι~&lm e Ivx>Xb@_>ݭ_W[Y֘wu][W_chMTY>ךT" ZTZ!EcQӇPvAoύL5~V~Heoox-mLVT\ y^_G7Y$MK l˝.nk:KEQoU'ݭK+80(7n,`d<xhɇVh][8*@bI^麷=T( xoq3M_'u-W= y*u%lcUסMՉ8|\R.n <tt~݂1] U%7\\2aCҡ]#Z;oDo]9ۨؤ]>i&TI@a v@0QQXE8O幏, ?}8+e,`55Tux\ڦQmż"^`ˤO&Màw4m?zw5}< 8)qˍ$]$Jl8*gǶluHP{o=O7܌կg5Q'AFor&:W}!1~3ᾘ|C[ї 1D>>ҒzuxٮÉewX>q=&O lP"O(77M <߾f6Òb'?3U`*Y" 1\P'up/x{sjZKBp> stream x\YoF~7G16l€,3^`(>ֶί:H: l}w_UW5ӓ8_) $֧'?OO.OO}BD oNOY$(Y n[3Rpz,\ӓ_wj(fHhG),(bs)-L%ygAQR,I2x IR %7PR'S(ARG Q9MIpe&E@nb ϰRDi64I"Y"qRS(ga6a:{|YKs9 >s5?jRlD}Yt m{ַБح~׻0=eJ9A! cQDiRԡ_i}ڄD4 I̪;lQK#ym'X|YCÖ$l nၚ< 㮅 7feW. Ve@;8D*bPI-gf2zɚjh~Woy]i,*PvsfܘQHbȪji#Ro~-VGvTzE=J tAQz "PgZ͖)Z~ ‚Wl2“7 )llϡd␙j!: ɀd[ZoGjGC_l<4T Jj* !K?B%hY RN719b_ni7цuI^DB/pB^H; j^MUVk&jvUwL\3Dn -Єܕ^ZR rdqG1^yEZXadٷP: F`EJ50Je6I O. ԀVJ=HȎpLsDx۰kz5,2iWaCXqd3g=&1O}Wt$͎:Gi16 1%p֌:\?vf;$["i(7wւ}h |mF${}N; !)v<`ک•ǑL{wKlf|&yK+隍Akw h̶3\ky/ o ybo="dX~$s-%mCHaFamBܝ2E#, &ڪa }HNA+ =26efc9TX;1ޅzRqYӶYR(ܷ76s0ꡓifx.M?mb#D/vy}}򢛍|Ǥx/8}7qbVi&䄮ə|]0uRvw'5[;93f֌ f}٤е{(O./bK>_6;Eu6$N֏LS#Q0ÿ0+.dID1B8]`߁Cf>sx<nt5Jev^ui`Eɷ>MN.IPQl%6u[M>jwu ܹMmYg~KL HK|ۑ:@bsrKG`BGyߡĐf<=S_Å nXBt okolNsJN0"c &7ɚhؕPöك yhFR'x){ De2ʾnZYOYdLHKffd#S89R;YgȠ 6u9 ;Vij[#4Q^DqWWZIv?Z?f[`B:gsC5.ݶQNkVIsIE=Rx3~S$F?{}|8ԃonˣ+y'v.ˉ&|gǖDQrbI'gh꭛vO NϥQ6܇G?C 0S׮ɦUq:,jwQ!/^ mVIϬ n$E YŗCXzQ*⣹%J!) H)r,}Uvd;eEa#V|oc7۪Oqs^ Rҽ}vIuhnʭB2o?d,z!,̝2"3hyCͭ endstream endobj 214 0 obj <> stream x]o6݀ËEIM w> HڬVof!J촕\krF=C*%Q)K_go.^SDDFgGE8 2c./Etš ݕoq_ta}~)@Pg"gIYDYSMήp\\P=!Rٔ8&HbGpdJt ]n0!eED'%g%[J`"u1Z򟍌6Y|7i .f7mq]~sF'E zӏ4n6<mn i}?m0]KVʹ r,0IxdI7Z<)Hi?HwN|e[kOHH UFU-m_5ûWh8x>@NO3#-9n\,$?:L+*My<6HkBA%V;r$˲d٬F.ț L9D^|iS,oX6A(Fc VD*0sy RGU|ӝwth/'ƷIG,R+#vnh[O7-F'WLKYOhX"^HVТ0E ZiPI;j:6O05GtiK9W;üϝ6\ةv~Fa%X>˔Eb2CC1+00|u:y2imݾrPP>G$ #s606@g[Z ei7GqR9ɟ}֨0fҫS65KbJL2&VCݩCx0\? o+xK340NBp_DE@2.90{P0R4k8B%?D6$kx'x7 8S.Ɣ8*II1,R"Y!"?H/`̔ |Eiy],$ca7xUL}>z&E~m/T3RE9ig6;zkNE`}υu$>6 EXYəzj:}RHTBwbQ_E(YѼ'rx2,ky{3؀( Zx*zMf \=):i^˟Awm즴qft< cs8޹L+xLqMmNNkꂌ`O'TyO&U+a"eK=`W #rAl>_8d-}h<} *W&sS{wjrťS0 u2Kf]޵/ڂVtK8h4{P.fk.70X.{^Ū5(q]U7ڞKյ%(dX?q'H ~u<ϙ' <4.Ryh.<n;edWZ゚{rPJ׏ۮM=51~ݬ6n(`!)*+LM]°p\kF =,r' Z^d3x޹j}p+GyYƶË$xY wD-ОDmh͸-گAhR*D.Q$"MEmo0ƌ_3=Ve.X1C=g6mtGvKw]h[ތ<`+Q r e.GOE=ƃ~ԻBdCcK~A0d}Mmoh;Q ;4.ۭa(`ԅʀ'j:47YXF̀B70 ,k!s mzٵ8~ ٸSQ׹֡}ԧӃ"(nO&@`fT4[oj p(\j;JI}oB )|"abgg4h$c_Pm3vhR]{_5LuU 3Wzܣ;VQ!lZ, f64Q+j`w BƿHnM++aϙcPge#~ȶA nY#ZCҷ1\7{-)+Gnss%.)־CbbI15Kў ZP3L]3˳bd/fbDaj ?u1ia}cXKC3׹nȰ99M{%whp8]`m~Ai@r]z Hʐ&3X/lW`.n ?jlv(tXmn q7{e.5}HοB=^gmչ$}]8̀u6l0]> stream xnF] ðoBv7cCvCz8#[UoŖ91 lVwU]Oi⿜(469ſ7?cI*4bQCFDg#{5ftGo{U7Xe 4@PR dP+nTEF ϢL&O?I2- ` ,Cy6)!a$61CDkxbĠC,ui#iX|^,?l.y".].NKCVux=4Qb]֫ӇX8@XU1mتlD)qZcjFL)'$׿I/ASfpMYh_zgoyd/#nBH !LĠ՗H3`/3^\g P_7`Oetl=&xΞq26*j=ʘokbn ȚU1Dž^v^NuKōyeqBԶ}Tle}H l*C|njIDD/Tyk~NSy}b#>f Z~%@7WGc?$|M__xࡔZK$Bh!vچf!!-|ї]1:CDJ^ّ fa )"bAK̯.W)YIDYZ;P T>:YZ ^kDf;ŝ0$ j4\Gxl[낅f[ץ]M _'>ZP!q6M _=K5 ΰ߬ja[  mF4ޕH# s̎ pQPd肆exn q ^Op*ma4 ABPYZx󉈦#J ǚ.^1ܪEG>VĒZ&̱KHfcM ؜qH׭M]P>R4?:&Ez+k*u"BE\Ƒ%z1w\3'  [2)%EȜt#Ӎ@OuȦ+bgze09T۶g=$( 5P 2зMp=ekDOѼܰ5Y9"~h8|;>2-gW,Kcb#,ǻv,i~̠Gvr_8(P낎 r]r%fNHݒES܆Em#Xl"5 s[_v,M25%=lyb A1`o.×Dva.& ^JS5&TC8 H({(vt}owW%CKFwA&nlGSmb6:/.>TL&]m6nI+$6; WH >+>!S*08?Z!A?{ 쾩ܸv>,! wXgAL䫛*pGTWD)-$tj3-qrՁCGil/hqb_ B&_`bX` KVQ,bQEi:30;N2g[^t"Оa"8-H)[XF %oG})Y" P}[wF7Dff< *8]?F$8nMWd Jw:yPT/D~gܗQȑJ3<vffSa%zq:MjE]w_(m2,d5Dc$E8p'\sUaBZRӐ @ۮ0׆w{گv0eU'~`B{'Dy|8z2O1 Ey%4fm> (Ar/TSw$nh6$v xGVho{gnbTQ[EPW ]_4nUۉLђs>谷 e۹ ?E@M\JU/P h_{+T go,+ y" o:'S7(y JMǾr:fx̞>!,p8$=5PwZz;`ϖK{E|˳eo/(z(ޒ1ۏ4xl"D"Zi& = HW<}<%K^>LA=$}HtrdOtN endstream endobj 216 0 obj <> stream x[rܸ}WJB+[)sDփ.cKU=yt7xft#8D7&Qrq䉁‰d8>$YD9Ur.Oxb5pP\~6}&̕g?]Iv\'G_GM`J@9ӹBd (XBL*t3npR8' Ql9 IK$ 7( p JrƭH.Rz:̰2Laý!xKѥd_2.>e&d$zkwOKO9rq0t/F@.FyF@ZB"#N "/t*jgY? R?h{?wbgYs8#idBv,gvB;A5Q#ЦX ]/2y:~Ze\IfGf-Bn2^NB-y9˛'4 0;dnҎ)2tI}~Z`X 27>pάvX jR±  @p iezY$+J]Et|-'Z1BVj_6FKhz)w"P89 7ZKb0V&ـGZL90ѽt ^/7VA6;z 8aTf&wcs5t).O(#yfg ' Ywsq8ԾKf\Y/f@_>dkx 4ڞZ.U5{ȬK,^0ݒ 3%n(8l!>櫶pIDZ\K IKr95VC*G^ez.!+ny{$r;bOaCڊ:.Y:bMG`rG@gWGfx>}A-@Vo &]?=B I=υuɫeT \)צVͤkt[kb}HfKiz5mHs01kÉYY?5pSMiȻ 7x"Ky;?xM|k#a%;Ykȷx/yAͩ”l/uAIAܪ;x&gM{8;bb6z;ܝ^]$;8G=ʰ8/(z͏`Xf0b.eR.HqB28K_"\o P_"=Іh2lBSSGó7.oO,LóL@Ǔh_y]ӑT9VG~0I=m$#$a$ r69;I+vpG[d;$6UגS iѱQϚ0GGcGӸ㘉P9 -eh;N)c7*LF 949C6 LFp(ia i&~35%goC9'y9&t~q>Az"٥ZA"}<:+oC`!S7WP=D ]-9VnUE"9P5jmQx۟)TfcTR4+1T%\^gV@)b%4ݎEJXKctyDQ\~LnuOoo7(SFbNŁۥQ\+edo.zfă*j1[EVB"g]m8C͛~G>Qhp6鬓T3[V_GI(Z=ADŽ$Dޗ(ߕN)s)߆x~fџoa׸X'w zy%gH2;tLpJtVg+J )NjnbQzo71n.R/3[W,;~[=Vjؽ(Kfdxn0@:.fͦ2ZjX,&Bxu{x1Lxo?"+{̺oXV!6CEZ4fQ[|&vIh8gC{u{{1L{´wj.CZRUvˊU-*H_F`&znMstie[-Jnfދ<^V[Ŭ$e[v*j\ol*T]ثQ##V LS.6o 2UWI.~\}oY3gY|چ/֔ endstream endobj 217 0 obj <> stream xZmo6nA7>YWd؀5m>8&Rۯݑd˲SG.);=x,Qe[ݳ^Nƣo,Uj< F<2qʕf& ftMO?Qg4aV㠧)VfN4RO),Lj%f"xxdqU&2Σ,_&*'grK94TWW?mO[fUߞvQyhT}y̺*LS!7[pKrXgC W5u)2{[c,aEcXz)?="x|13$ L@@V93P$$ss}}[ W&[YAsH#R;AU j8a@X`Ou;h2-0J}0 tyS"ry Nz[C|Pk'%: S{$([ p N]+ + xZ56ԗ02tYi'qjv ma`zלD^G܎q3w\lt/ȋyQ^fDwJ E V;UoE8>]5}E6Eۛ!̇&p͢^C>1g!~,DpcһA hUcG\4sF]DWTD\]3pƹ; y%D[0qs-F_o$+}[lEb+r0Aw}H_1PJ 0Usz']6Wxkt:(06- Mm}Ye -hI] /XpVg4 Oq9:?w1UByx^lXΚD.qɤA-#dq}"އKwir}(kD(D7mP"KՀl'!iU&lbZ]Iޭkc>DD7|-zh.oLZmi/ \Z e/>v)po]L'eF[(# )JL M(í< `, \TRz)X/:Jl| }xl i)urkK=N*N6mWaZ#z7~oanL! |}O&6p:s:*0=݈Cw .p eWxVS| ~9p ߰(goh$UχKD e@atL31LAČ)^|EoSc jE*`5"t-tIp/Liֽ_Xm#wp`U%|@V;{2Z~Z6X="P3҉M; V*C^=|rRx|r\+k~L8o;F{=lfxʈ,gd~;O> R^`å*qxmh:>tТ}@:`: )QvUM NpZBͭo{%PSXmD'HhW+5vZTk݈qcw>;"^S̗5|`h^'|5 %īp۰E9j%G)v&OG ~W !Vӡ+<%9 )cD,+ endstream endobj 218 0 obj <> stream JFIF``ZExifMM*JQQQC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?tPkqsL!F)uQE:QEEϩD3@j\cQob6I$/#(p+ռP,W 4'?qZ{^y܌ ?( JwM[sЮK̬gTƖa-srt'Rrd(cb`jQ91zי‡xBHl^2T=:vŗ,C#ҺYUF_*rPZ)3JRUJ%!QH(S1@ !Rb#+R>CRCO֪;-Ӂ33MdSihh)h Z(%Te{RY/CKEU"XfRլ-'Elh9?pڿo.u#cS\!RbOE:z9X1z8jxUWnA tG7=u,KE l#t` km!HɫI#x}jGJGsN@hẋnx3Vܻi1:S1E.i)(I@ &)bE40Up*MUj 3NM@;4fJ()@KF(PKEC-ݼ?~QAɤ[5,!kc,3Q"u6˺y18d\xJ$ܫ^qusu74#UKgmin?UT >^sg;GֱnIR&+Ԭoo(UQVkc $Bہu|Qwh.ܧm*KԻ'jOn"x+O&: Jv)(PE;n)RP"B(2)jZB)o( 'zZJ:Kځ@ AKL-dHS{U֡$*f4Mg:羊T赝=ؾU8Z\:JFBYVQP{{էp\fvn؞P/ҊP斡9r99844#NPN={kF97*ǷkU)8!qX 䓒ttVSQ@UwCLJJu&(IHb6*;ZE-RR)h dG jV1aY+nv,ޤ5J:D\DG'loz`aH/9IT6QH%"RUy5KzVv@#rҹ7qVjK[-ۓK#$*򟼠Y0.1Ԍm3G0d'J67-`{#n(NWa[^6/4Au4vۨ:^ѱ>Qo`kΌ#+ȭ}.KQ<ӄHOZ={-k9f}^ZMlF?*(GIr0aNVHiƀ:hc;tSh0E!JC?rKU3WbR(5@%8 JpR@J(hTWq[/Q֓vW`NH\@֨jVmܷ$l/d* W,􉢇rOtp*FI#`^\<򢰻ԭ{V1`q>v˻9>>fVwc?7w#x z7`sh[^ZP˵0GqXh`=1~;TLM;ѫ'q1֫O"#$3PGr@1LطfMg68_ֻ}9^G0fBՋL+İ- @OZ&MINъZ())hF)ؤ⛊}%6_Q@+@QK@U ^;U@y5VP?v3K7,z[Dk_VK,Nۤlð)z}&BEWB}jy(k뎴$yx@8c\͕'YsTcwQjjC!$np}ҶsҺ@ geNrCQbӲ"캲dRrr8Pݽ )9棑!ViAN7bOiXq ; >Hfi2C a6.EoMCz|}qpπkԱذ͙46 eaZ!BJ硦cn0G&o w{`N5Kuk{`jZƷ>j#_I3 [ӧ(=NE62hh()i %*н)qKaih JZ(I `+ v 5q|ӒbZW|rJhZ؛FՎiV#c5˹enPTʂ3R^NO5_^gitC+Sn<ZɕN3񩥛{?@܏+-L&ձۦ^֞dמS MFq@k\ϗ"ʻ|ޠ:I^Gᚢ >* 8C%;rץIOUϧZ:zDrϽCJ75b`O8Ю4l\# pHB8=kӵ M*氓:)rtI ? ϥ3WԌV޳w8+ FPCv>oHWalWGk޵l-RBtf]ĮrM:ȹFR*,uyfʟB:YcCxޕG3Mn\+A i=iJuZC~ΩU۟ U*K (BQIJ(E(!Mq=k&IwFjje%v R*N-3cԚ.8=pTR`ZoU;BYUgb-NL2pjkdz¹}Gִm+hE1 G~9Nf,}xLOJM=SX_ ڥYvdUa@lRK;:?{T2jHm۞*\tzl 4dv`z~Ym6,cs?Ҳ\DZDY'9n%mueQGsxms ?욖 ١l.KM8C!䷹UB:wR{Mi{WtEȦ,Z{?pWD+J'QXO#r}k}X2Sk;(-&)RRLLS 7R@-4SRdIzzp$nskf ]tL/9_A6_ߥsԫepf0z%SR"q7s`QG+mN"eB STy7)9K{"0zNHȨjG$M n)5-70 nZAM-襌.Tޭ40wOQNp(Fbf2M\[Fi;inR؎33w5QޕnV2:Zq+ֹ+6S~XWgyܬ225{sC'Pr}=_spO]T{i*eA!lHWmRzf8*.dX5fQ3HP\^1YKVz(TUبAYMnz=Iq0g#zըvc$]44`GZrR o95F8>U=j 󴆧Mbj&56AokU s<0Z)N3ɭ jNI]G8i{ HM!n* #<VH˩g `j;vqq/]cW\'pJв]zxW q(\wgUp9Sڴ6UrUGzR =+.ᰧ&N݃X7d0E&fuk| ݞY#ztj( =OsVМp9uVnJ`WNU2ߘvG,y 1Y$=dwx#y{YSfŋ [!s6W I#$\F˰5X,sڲzo5ܴdc>j>^0h9* kʲ AZLʢ: a7oB$ GlgQB\ںJVmA(d88ȇSv9\]&o ´+o|+Ĩ׫J|WaԔV]ǻ~ΨU-ubyu=4ՙsq3}BT݉*%C.VT?q)udAy'{ SQgu .[STqOq׊wӑY[8JT4hm:]TZ7qڲqGZ\ʩ+dc@=*JHՕtJþ?Z6g;oD aw~±^|۽t^pdžu rux\ $gt`Mwe{I5ǜb3 ";-8/͌~QxL9%>uEEUkK9&EpԖVEV2i"Ek2H><*Xڔ8 tj̋ET=z`d73W89L1t#rJII< n y*M$* GeQ~nzի/٨(,sɩrSu;Hqn 벩Gjl#eF3X~!g!Q9;֝I{h&HIFN>'oVsUekkzgޝ8eЋ,^)sޜ$#P]*٩U|UOPEإ+*A& RՓn2s4l檆=c'S/U XCcҶv9/7 kpk53yw &ϵFQ+*̽MJ'EUUl,dڌ}3Y5uTt}ڼ5wi^5?֚ڈЇf@XZVrvN{P}늗qQ\}ӎim9 w_Oc&} t:#9湝1}u3:TmɦGL{šyC' zxbzb+fH.?:guDe8"+\T A.4"66bX@]P-HK(#RWQ09C&Uh^~f.@ʩ+T e$vIȤ'h?Fqg*-]:c95<{s$*-W 1ΣojO)[=94P]B#}*Ti+>=i`y'֘4-J\O>~~"d;7=㕽OV= VVVҭ ģ[^iN5GPs[SeaNk:$ͩFƷ+{lFp馴4[3Tj=Ed>^k*ykUY7rj)Յ7Pk]d/R>Qw&=F3#ҠiTgߖǵcIa&c5P˴'D1j!bo?zVܭOWw8'+Drg.s]E+1ӆ)ZZHR2;R唥dǹ]\G$aN1\ bRCe}YԤ3'J^ji$d] >Ԡ&Ɣ1$>4mNy*~AܦC 8Ͻk()QVzlsr3+qgB' hRjx)X9@Vb>d І7U|g Oj~6UW;S$LRmܠV\?``֢$,*Oj%g(*{V9ҳ<j͈h8L7?gLM'+B5/?zy6jiW/p a[Cb$$%k2kզ#utmSrč-9|jÒk.*5kGB4Oj8ޟ 1H ws\ν6\gkW<*"/@j$2.}Zg~Z/Ԋfd ҆P >LJ_`,O;{SoZJvzEzU$,{Tc $Qb,8U)iaN+NK#8o|Aީ˩\9-˩1\dd-ŊD7+T'[A>[3hKz5`E9ZM2|ӊR91ڧ_c$j8^x;Gƪ.O5[rcstgTvF@9P}E c`rTmVfʵYCyg#dn9yqT57UBG\>kLهQ0vck 7$a+M[ccP-LG33SR96Hk9D?= z8Uzf]dǸ3LV|{ B *(qElC/SK*#Z(T|׍XvU.;9TN鎟ZҖqT.,]yBOz)Vwb6#$% }VF5kC^ڷV,ڳ#jszUSu'f?C;w$ΈSw1]+[MҥɔON 7-v\b mJDVZMX" Hܚن@EGI yR{Kc bWGJǾ𽼙03ޙӪR|c s.l% pQpkmbV+Ԭ1JUki=,M#PNZ6'_?D+ڜ55fsƲjƦhe-‘\֎r+?*OƂEoZnFrF+"]Yכnlu+R`u#\HnMXj85Jq1;TVF;KDf>w&?ڊ%PɮY:fS2y;V"cۡtQgLp2L %)ۍ?#(J򬋈e@*jn$㌊t7!d$dH} MT3$iqC}8+.sԲ0.]4ּpϕ=Z%y;;"; IdݏA]UeWhZ#PzV bI:# 5 -RKP2y>ic+'-G[X)ɉ?rڗI9<|?gt"i*5w8]̈ `N}:>QqEsa9z榹ܦ[1Ux%8'fJ9眏B31b:SF%UgWz3BpʠsWSi)O#8~\JsWvOʋH~}>EKi!99WkBBqXzWʙIcwҺ^mVm5_jg'R7̈́2m=3kI#:؀Er);%;IjzV[j Fo=EiוoaL/CzV@ފN}h28lW95? ^c5VTmh z*596OUypҙnjy_qW`GNsj90P(1X7z4v:h5c,C % m[E`\̹v}%SNF}kSs|褒s#5"UYH6w{ ,vFֹe"P(?*dVӥAdsI&A7a FIzļ6OzڍF'ncZMUH(_S] QqZWhuZݗ-JЏPu2kz+ɨul vLU0jT *LR19⫤9>_j $]jomYU jUIYY#HlPaҾD!oG&VTSY7YZzZVx46DJ9⭫$j `w(2G秭w #|c dwW:=$nλOz|itklh?fG'r=|UuFZɕjN՝DfqZ_spݶ~ޕ짣j@~k:qSpҬV,f5BT9m=j 9i:?mvx}8 rڋg՚(Yc++E>qףR%5m9ndzQ4QǠoaQq m4՗uVc̿gō9=k^5ѱyfukl pa]"_y?՟Ҩ2:WUy pkxPOⶅNQ{;f ;bXU 08*0۽kqjs;t"Fz-UM04VWڼĂLJیdgw+*2ڴ2֣b 4>E1$t q~;P*8ܞ3mpOr3>&?z6x0娗Fh8edGBNMIkU\vOOGesƢ 2eA5 qwؿv!xe4CÞ.UvB$A5vZGm1Dbs5kvN x\T"o 1j eXЍǩpTM?I`+IR:.~V&KwSH󽴠R[20_A)Yjs$wڠcxUIYg۸ N)D+k](ڵE[hm AF2}jCN4[~#BsOެh6T=ͼO$~zѤJTg9#JYp* Ԍ݊sFGh1jmsI+Ϋ<޼池}*y]p3\r۱7WC# %N3]n=U}TTᶤصتe&YkFp0.r2i-aq <&:f~B+Ԝ>;]x?=p:ЪXVaʟ)$+Bʽs 趶h|~WaCU4=`;u_?Ӣh:('4O4LBQE)AWv q֬ѥpEbesFojg7I4a<԰\ k-yi61x1wZKGq 'r'5!(|s14[ҫx؎r kVd&3cZ2qV#886R+h i!g+zJHHNY0H*HWO.wKEN}j ڂGZBS*~q NMIm!(' sr VsBg =q\3M|&+|ڦI'a+1#i⥍$ܤ6G8䚧jep8Y8~f5 qQk?Q#-N&a_^]SaSz:V;"8}a*.zjFSҤCd {[li{m=zӼzUM5uRlI;gƹl,. ϨkZQiZ-`x&v'(VջPh%96588$0 E[~TǭgB>*w@>|ֲ*ƇvOj\1v1YăS}+ 1ܴ$%~:ʨ uq,I0\Um3}+ZiF\dVfB'+#: NzVhA+Dx˞ޣNĶ6Hb1[F"PvPyKvU֕M)~$BuO!\-i qW,.<6HRؚIX \[of~R{{WicuyR{U=gL +k2+Merȝkq66A1g"r=T^W&y5$de\_@ 5h[dnsU'r);BF<`Y{pz $`ӃsPv&8N29AkI֥ y:`W%伲'kkPs<0~U<0`5ArG͑&GecλML[t^{ F҂// =kV#'A]՘ܹەO9=^44M8 bbMŠpl9IR"3@#jJ) ktSR򧡤-XQU0ݏJ Eczo줶>摤r[+Dgu+ [ӝDՊLMS^rD>,owVí,E+tm"għ Gs&5p񓊙{fz։D6GQnUN:f4l;fd1+Չ2jkh%^odDԀR4p8ܵ0 ]dSVR0k)SR7k+HRlIްF?s: E7DN<}<*y\K.ڂG)$$ZnxUcH^ie;Vts[GGՅF|SZ$+G=mXŲKX ` D4KM4 'sk [Ifȥ"ҦfN⠠6Eju{W+A@VR?U,bCǙKsfq;G*:-_K]ñNGҮ l;nhUB3O闦)ÁpU/#DO?FbEV"|MŲNzf"#=9.nb.9zԲFwd3ZhS⩹,*ĈL3S$?uF7'fWV-ZLt`ջIj`ѵ ҷJ T V#:¹2σRuu@:ϱT wa#O{jY M) U+9&3sM'KbsHioiYi; i-V([݅i Wӡq--cA go-d䞔km<»c@Kښ)sTi`fx@W Ew~ 5Bð洆KqfU9X`CZ+2r³)8=KWլ&b3WwoMYڦ =G`ac})Y{̍p1ɨ$ OMåcսinN5A"\[;tzf L=j{[(3`+RK :JJڳ+k `mkj%T@0G U HhPiƚi8Q@cBE[uyڐFNPzS  (p~_RcZ 7 – mߕ*Ew"Y|}) *7 hmdZdA>QP=eˤVv?'OUԚ/Jk+<]\đ^*Uf1fѴj"sH ݏ zA>YQZlgTDqZ =* `׎_CM܁ ֛ԧv>=IFOҴFyd҈O;kEK3H"3sPrR7Jܶ$?z׵#Pf+?hJ*>i<knaq$SJ@'j ܷ`+`5N^yX<#8!"ƸQS jAִB)˜ ;j=fƝ1\P}kP[jyěV~M8CmG|6/+{ttɢ5 0JAbAOҜ)KMIKML wA!\[v:L߇Ǻ֐؉nU4̵2iC 9;ZGJLޡJ x ˞цv7<: 2Ǫ pv ?޺I/ܡXYw>e = e('jH`pi RQ?4Mbʿ+GҰtHʼndTBY}iWnK=j͞*ۉ@0*}HK"Tx֧aAQ.3ZRJPi%Sm[@7JA5mCҫ73+OJ]MmB>KtREk$2+FR1֭E"udV8;$ZHzx-8P1MJCҔiLZ)9BVsPמvXSj2))1ODE44qN.a]s@T) Jf{T;M(޽ҰLe~Tmir>Ɣ9EGDt6S4{T\}.P)7l zq #Ϯ9O/Rpf髡ݣ)|.:*T`#Ɯ;gN|)&C,}yqa*tETʣRd*%~/SûRԪ+pH)*eH*bEQ#GS!D$G8 Gaz֒ƸX:_+hh2,.8GZp^aӄ(zEs̏ö)Ē~?V` W(*TAMA'ԅOLoTʵ*4E-GAH@ir:StTP1R b)š)iԹ4fԆ E'@,8h󬅗DE F(Q@ &(h Q@KQ@ O E"=V)*-J(UZV) TQE1HQT!œShPE%TJ([-l-U2Lf)(!^hƕP I(NP<-<-S \TQ@jUQ@TT(TTE x( Z(?Ί)QET9?m+hlg"&Z*DQEiE#"mP!b)hP6(ZPQ@ O E U(EZWQL PfUW52( TT) SP/z(a:E%%PQE endstream endobj 219 0 obj <> stream xko~ i[\mz8^J,7c_I;u \ξ=tyREiᷬUo//um./wߩHJ4QU Me^]E讃1;zQ_//?]^|zqj2)GRDj-saB"-H*uI%tAWWvl9e*`0XOTdȰ3t M#) MV*z%A_7qEQO<gIǗM+ EbۤoQr{x^%79}r&e%9{"e|{VnEO-_$bxYĀqr߇0Dm<=-4 >,)_NajWoT5,uo"5r]gBLO]Lo$7oܭM㺁T0oCwoPu}q=`u@,NJ`WqN,?D]!W$ߴ2~B >Yvvk=F`yx ;lE̷@Yo木e55; v׎8H534(M7w5jxnOw"wtp>jA*+ 3pA`fumo'e^*ZRxhO1$)^P '#,(uZķ% 854=D镦+ː{m*U13SigF'2%vNIYL~.:5q6=k)U0q^Zm}IZϭok6A z>$=mCvkLjLt ʆamp4;7:c Be^xZ8F4P=fU*+,A)id;ۆ2*@)I%Q,Ẓ-PHJM`$pTၕc/3hhh»qWprH!]"sgu6WNTeL>ieMis͉7qa}O.Bp;Jn7Ωr u13ᩬ@\gy.Ndr9pFam>}R* U* J;G:Ӿ]0;M]OF:GyP& ".pFÅ =eq;4|4OOl@5Sn^2G*"pYmlt3p<!?l1LJ@-_%PNቇNmf|ׄ|(ː1TEVIQ6rMLTP e&#cF,224UUm?^ۏKo_V[׫}хSrö=>,)'LdJ Hze|9W4kT/;#yhp?':8Xh8cp㺓UP!!6TbA];$<eH={s 2/%qrN:/+Z0JQ`@DI4ڂԯWi䁞^)VaJ唄I V{hWe bp Td 8uPfM봦8u@G``灸Ӓ"U`ԜT.!%;jҡGjQ+;\r"ˉp>Kfz|tceqeҿmz>_!;vCEf ׸d`<\,zWTVƳ"9|R+}aMoNXY+0BnRWFw⪿7~~!0`9#fgZ@ n@@ޖS!BE]|T`&, PʫUOm @hg`~) T/\3JcϾ/kv\-Ї282Χkɧ6g֔!s Xjh/-~",,6pu?p1CxjO5]IZc0Ife=O"Dwjj*d5i(WX;RxTeR[N! Db |~Ǽ"p@eGf<ֳNRZLփ's쯃\坭p:N=wJRg0vˮC+kh" Ӟ,q9Z͛khBMY:,L=cۭɩZufFB~KXJ&Į/ J6HRw9 F^9; !~ mObcC]T~8Wx54K?4PTK.m5 =W=o_\]]{)ɋ.6PTao1`3G7اk?wlGԀa 'aR"j=O}]TGUaZRw;hf} {??qtap$悉``#׾Nc}B xoѷv[sct$!a5>"ÐW%ހ&T(F.* wUCs^%ؕqc*%o̕߿1FKZ7?:W bb|D0Log]ru47w0u27ՕøY.B]sAi<dp  endstream endobj 220 0 obj <> stream x\sܶbA"M;8NID~pDQVwտߤ#3if"Xv$bO3ā8=`sz( 8`AD >2Twdu mw'oWA/'ſD2XQ `(JbSɂt4 MgA&#G*W/\H$ tDX렏L6հ!#$11Cg06<iG@u,Udwas*5I"zaŢUwZmwAxV|IX3*6XEf@!c=b;H8#-SMW MGY2_-2TG),qZ(әӈT#=~]gHkΡ# 4zSnGߠH$j}2H2&tZP`'#$KnH* *Th T(4ϒ}6mxWwhiP*zX$tGހE |_P"A4kTX-}FbȟQs NZD YL(C:ܣ( -\#"L3#-~:ܓ|8E(Sڇ%uK~Ce2y~X_#~a`_I%e/MSXɊHm#Xu~O,`'~ DklZwdfS8:a4qsn6Iq~[wV*DHiƣ0 }"hLtVse1CnUSOv0b "'EJѪMT:ZFX*}e*?;7KW.0'"I#{sSw;W͛ dz4L/ Yj7{}N~LUbT65DZ1z!L6`ˤi6 CmJ1^Ke{-UU<nclHJ,7cQbar1|I-ٶHiAT,;ygV wnQ }BZ]D4\\b ڏXRH9SU>Nҽo77?2m2%^YH؀Ϋ4`T2ȿPȓ%^taE%f RG~dfD/Δ~Fn^-Y?Ci>!e7S#͵/ALfыE7N^bIf2mqCo|d{ZkAAiarWRdG݁'x~1⸖EˢLt*bFi &һ.|xE[~)فC'׬Êd FhJwvv2Bx_0|P-4ֱ-XM%bWlrЎ\B;o[;3F,Od躈~|"eiN04ҕEZ߄4Qr-Tb{LdoqzfTks-Ηg3OQ nP v/mc[+2ӑNcP=Cޯw1ΰ+lK3cQ-<%~-j4;prS: i#Qآ|>!iv"qiDz$e: fdTr4`/Нӄ©h} :;#$!dx?gBz"g\SC<"6cGCᦝƉ R Ed*y/kq^, [_XQxD$0$ K>3.1|'B9Y v ;,*K)ZĝJ>:$qʁw*yb'{3ȣ_M{_\#x%Yl,c'hZ")MP/H:*0:g 0Z5d`y!cEձhkȂW6ЬjLmW70 k@ z/nD]qͨhX!\:Ip\/tZI8Jcs! D$31r<^/4bB(MJ X&T;e!3Xshu(04Q|j r#9VQ|8?JD\ Y%ò::4kfIEJMqܓYB&jy$'#Φ>%C'vc$M@杺h9fK S264uG7jfQUI{lTYNc$\Dxrp]w펾rQ1j Xdq:t፴7S\>Fq7|t'03c ΁&rBMw"q\eOrG+hO IhM}Վ x*>:JӈZqԆ7w@r].c48~RT/X$Ť6|U>iIu14\$*?g\>˦x~un56}Enj6B4GCӀe|c4MhƀŐjZA8m̒w&)LDpHD(o<̉LEY2ј$ C rHYFK %'x>9.-ffX0 .}`rO,ty>7̝IWzXXQ&$UzX&xٝ'rz2'Q Rz`sjid;n´3IT>޷\R]3JOʣWŃy1yt&%]#<|Lv-/`.Kt;cJ< w7}p[bwEsA%fӂ.-y|e=W Myty:dd͇3:.Ae[;yl˒&_.sqe_1M%7/N^#|.?U+3%Z5+W֜>;[V,}.n)]a %n1D'A9̤It!~ݭ\z!TߔgAx5U]]*gM]\U݆r6S^^6#ڠ.<$Y wF-J%#.:N FZ6~o "F?;Jo`N_`n\'g;<]}϶T_/|ݱ݇> endobj 222 0 obj [ 223 0 R] endobj 223 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <> endobj 226 0 obj <> stream x\B>Y=~J.y\6Hۤ8xeٵ|tQ!zx{+M8H7x~G1Qq3S<ؖg?~t}~/yX] O"UL4ypWC)}u~,\-ǣCX.!# EI3, Ϣ8 $x2RIx&ocDty*LTbJ~ HC0JO3we%y%I"za$Q|.%B9b lBJ( b 6BC̪uGt1a*Rr^ٽH]rH,RZK$2N[{%V@PdD];,д#=5Y]}\#`_ UGV 4G\y rC@ ova>#B9{r XcyUU%bMzHY2ǽYV3eq <͢kh]J~Uham>kK(Z\buҴEBYZ=rYP yءr$֕8{4RXo@1Z[UtLVKXκAf M i~A%D?񄌷2U@0)KDºΑG pXSkQ=R6[!{u^~^lDS+N2D H_|JWh`H8\Wn.oqAJTR d=-QsAa,8gh1fԾnkVER`m8Hie}<ۑIڈS%VG/NꂞfrA;c/)TV2`7]d/#=YrՌ߉ULdr#o' 3Yj! LŤᨽu(#6mkICueZ>#tvlZ+ŲvߞTw.[D?(Ek3 /]J+m)ӄ;XdH zi gaM2ţHnw+Htڛ~Fٰe=\8nIԔ- `Js²ƪv XwVcƫTˬ=q~OdMa!-$%ty3۞|OqqsexZޱzCV0%/7"Dbk`]J EܪRGBkS,谰B/Xr<'I<&Wʞ&ϛ&0:۠ݔS6<`w 팈 @B6I4CzQLؓWv?7r|59˦h#{L\eFoȃ`ڛ<BclusBk-Mf&_DpܗP Ֆ,3z&PK}l4/4"&'Γ!BEdԺ;gzS?5Lҕݞ F\9p7Z.]7-1k x6XOs% {CT=R^qq7o6j]j n<g<Ѕ~-y" ĽZ`vLGpto  &8aPE*Y9,wժm+W\Yzm-5Y.ݰLܼ~wȢ Ӆ=tݘquT qRsˢOl1gRUu+|1L'4 ,h}};\V 9.@~[ |gl%d`gDr|F0B]DhrJBꤲ[YCQf+!i <ɔbE_;bz'[2`p0Wj" W:= {0U!^PBš/`?%m_?33uQw/' h_Q zj.q"5#{9:v,EaziSn2KYdC10ЯT,A#ԴQn)D]?/LAđɴg_=~Ec4mYӜ0$pѣ#$ZP5G1$3r^lGAJ㸻8J%J{'B{4|?).D鏋s2%G#?h endstream endobj 227 0 obj <> stream x\s۸HD<ǵŹ˹㦹ę2e8_%Ѝ3c `_¸8!F wVo9G@:#tÜX "0vg@]\eЦsEw{u|xrz|ѧ^ֆ!2 _@ B$sVZK?Q~wyH$щPaAYnSI |&ag}c1w'2Qae諸hh~j~R2?a Y\I?Jr\ Jx]dw AԑtR w1OQOd;؎w vo׋P-\ i+)hi2jx$$07˺UV'1&RmFAa,4ȸ0KE4(3WW|'Ssh?(uP{]oz_Pt+-DI?$Ck:6J=5Klh4^E+@64~w )w?x݀qE %=giWh.7J46*\sju[r}X#}pdA \G9$MjcUAF,WA^FSmt zDSMMar9ff'#bk@tXH^3_$X7OF-njT$>vl #SƸ 2>-hvKG bovPMW)ƍS(k~9ƢH;4v("Ppا' nKgE!yE%l_qҎˢ]4u\r+9.ao=IXv Q"yLtesv0Wx]4u9*Mܱck-SxXh}&l??xljD#Sc%GfQNಃˀ=?-~ 6ESSJp?{ %E(|홖`qCwקXc7 0W̡ ڊB]$uJU!$m*fOt#A`ljۓAIP`OLDu\,y#y0"5@eQ/hpTsU3Sc^WqҎˢ]4u\J@h;d n?^C~nݯuq'Xm((`U$%V# b MvXwx.::y'I%" N.}(Qu~"b@0?A:zHr`rMd*K0vS%*IƦ Ueߏ$*K mS>m$>-PiM`A eOԔőv9/˂]#ZD wo%#V_ M & }o:/Թw ̺tY/7kXi3\ݘ (d(\LoS{<ȅ4!5n/clR ׋/% ]~dtYz\ 0&o3t36Fy.㱨u0uaQּ?C\}̖/nY9r͞6P[ĚJ0բI.*<b<zB4ω#pµd{-,t$};Y_1:0R7I4Q 1rHg ֥4T7p HwR%BoU gpz z` YT0/;Acp1))d|C,Ȕ̊KP`?0qLqBM=3 `<<O5oNک>DuW}ڈU,xpn=8`__n7H*‡lA J,^hKqJZZV[< ir9K/E,Fm1vH8 Vlߌa $e{O[sD㮍t9w d N7hq: 6i66?I4( -xg2!1j{!hČx?+[K?z1=s܊ |^(ִ!!k2TW#2G3]^f.X7_.Y>c@9L^6EL:ܬ dd-0-Qי>\bwBAbڴfPDG`$A zSɴ8c08qw+L IOb`c&p*x L+v{lwmڙ~# }5w'?r:&ϚHV9<(Ģ,դx F ,F1d,#,XH6yHqf(BX=,S"hx`1l3x2"O!-]A1;9MIVZl#+v0C6Q5fCyjhT 'f^CV=/@U@h:d9DRaҗaNY$MI)Mwg&s{9hWOaĘ]"0r/p05Џ >]SxvY{=Ƿ0ίaOx C~q1tgIbEW=ך͂DrC&4'67uZ~D&%Lr7hKcy)Vfn'a/Nl?Y0}s.sTΑx5+ҙoΒvVyf20KϥYYcDKuiuٙorn8OP u=&0=%L2u/bওo.Q>.USb:d |m ~~L.ykFZ`6&;bMA.-*XP{gnjhM]*5n{m6:00ms\#w7% 01lk)c ƺ0k!_+ƨt endstream endobj 228 0 obj <> stream x\{Y>vl.RImR(tQ$E+>N>->a#쒳3CJ,$MrF$?OVg__}GpR\ݜqKФU"z~*Lnθ^L??} #p~Q֎(!2^H{R&A 9|jœ-΄fi,eH Lp܏t\̑M5L*&ax@8jRKx7^jb=YV3̆S3{q ٰ\*=˺\d.JM饚|;UtK9IEG?O$5$HN K`Q77dZ@AWS.Q+O+' iК2,cE}Ե;3WPz*'<᯼["^VRS2@"\?wKK]<9%߭`w>{=]w@Ac/Q(K[STrH5,t6(V_NIvj\bw5,gEl5&3͐> $ <)So_Qb z*Pz 4]yIWj{ݢFضRzcˇ7!7]y:]=@/|\J;L'lWq'K%NhgRzH)MCz!xDTqg ö8uD90b8/C*DSr/ g@ղ 1‐5#Q?xpYK4{~UA w99Y̘`W3J}F@zatuFeM5߷BACN3=ș} 7NG/!+ ׅCjLh\_(!uiJhZQ؈*y**FeHUuzXD6 *EqHEG \c>;" 7ӱLgq.&oa) ]$n` -0q[GقEDcAmt.Uz#haaW| ռ)jx\O7}XuajZMJAx[]Ag0_ehi)MK9F\ #*I`b> #r+B;靟dESCiL-\j+S TaLjj}C[%h*T h>82~e՜ b&3`5^b.1)E/G%zg1k%ccc>l;^i/H)ET_`#=+i~_d:#lņϒ>oSaHi1aiWgf|eY.k9tc1zRB貢 YDmZfXgrW6zTș]סlh*fO), 0 ?.v5ufj:6-ld^eVˢTbpssoI@OtTMc$V?#\یӊ006ʢu7!B'ʆօ6x Kju.qȥ\[q@V~X6*ė,S>FFe3?vD9XD;O3ܩ:KPܸ7-K"96{pcB][Q3*zOzDl Ή苭U>埄@(aiIub:5>'Q!3d#(ASѵSei84"x( PMmQŘ6R{XZܢʂ|HFV-K84;T\clA;JٕgZ9o`NZ^q1cW2!zm{X+i_W޻JW5`Vh+wu666ek9@!tX@]|)-VX/LjyWLwMplؓKzez;vEPtSQu Y7?N扛$Ǜw QE<@t}Ɉ>\klޕ`@[Z|WT?D@]jڊenC Xe5:GgߥS]KBB=}\tBP!NKr#!].\EɁ4 唋}PV.+CQKT-mc2m(3Rа1hC=,^|f-m0T>\.j$T>FKи3x&U,`U֔6XByB7ђVr!;\7Y pT@6XF|!_cLk}>za1##J."آ6-]pYs9mB_0k^!xYphNM #!0-Ҭ“Z]~-:a30#$Ml¹{:ʟO~'1ll1v>ʰ h]2)!}~8!rgݢ0'JY>MFet\q-Y=CooDOYw+6v(FaSL| ՟ǔ>ҔFB3`I 2)RuN9ԘpԺi9@-,1+W (;Qӗr= 8ԓ$]LsNM.I,NDi4fљС@9@4,ef2*Ũz"὞T[M@u4LT4xb,`)^-+'mOٻx-$y,?gI,b O`AqLcbIT,_2# G ϾֈSh?C4M"džh3]|B=, [ d0AǤ(1ox,pǵaJ )x"*!G5}qI?T>NS;)&UlRL7Ckyʘ_QWvO6̧; R,K=s/{OU9.uf endstream endobj 229 0 obj <>/F 4/A<>>> endobj 230 0 obj <>/F 4/A<>>> endobj 231 0 obj <>/F 4/A<>>> endobj 232 0 obj <>/F 4/A<>>> endobj 233 0 obj <> stream JFIF``ZExifMM*JQQQC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (U,TQZ֮OGO mQr>uo?B>[/FWr0̚奻b<Ҋ uc7C&I(Ioi';n/5NohI0l`gPEu7> a{y'~yj;̈́p~#Ϣ(((((((((((((((((<+e{c-dG# -j`D9kWmP~Y (,k$n+) (()du` \ (QEgz^uemos\/ݕ?~G?qEx֥:[bs?Uԫe#k<cFc?o25mHe%T,7N@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@XnVV'xz\C5VgZ {Hs9&0Zigur9?u4Q@Q@{6_#~1p~ڝ^;nŹ"X} 0Бu\Y,e(l8O7ۙA=@4Ugmq$q$ qӽehڅLv*&QC=-~xьyzg m1.Q/ >WOn98=پͭj2)I#M3ۄQrp4Z,vK(pѴ[#V#vᓸAJи˹99" eJ$$UVQǭE|cCtD%& #Z֚{Xe>"զ!Qʣz KO2/Cه=U(((((((((((Y\\O-}<)֮el?;?ֽJ$TUP[[kn[Ʊă 0IEQEQEQEQEQEQEQEQEQEQEQEU cH- r9GyPkZ=֍zmW*yA\z_KZr*êQ^KwE\G*ãb(Q@Q@Q@Q@Q@Q@Q@Q@Q@i<֢Y;"P.'P0UQܚhhbۮV7z X¨=jj((((((((((((((CAgLd޵hK{rvƢH΁S['L ?7(((((((*IY@v ^u ӡosL$qUQ }QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^15R-n2㢞#^Y"җX@=t~4R1VR#J((((((+>i~MvF}3p6^^Cm̒E^io6 G_ h(((((7Z\&c(X9NX"-HDD*$v'xHna+# z w IJ43uy;# UFbڟ-3cg;T>|QJ#sVϷTl5k떊9-dd%³]b`|c9jPwm,w(̰~?y5QEQEQEQEQEQEul~ѭ duzUr g|~`uPEPEPEPEPEPU$2eUifF*Bh8 j6Ӧ:=+ yt$bAu~u02۪~[Z+xd2䪱Xnݑ;cֺ:(2Eu~Yg=GMT~ǺHvhu"r--Wcn~}`1/M$jpΠN@vZ{*rsA %NUSj2Y߾l7cq{^QEQEQEQEQEQEQEA>&`Xc2+#aB>PEQEQEQEQEVτ"Og-)?ұ"D vHtQEQEQEQEQEQEQE#Ȱ;DwF+VmIԀi <qI[>$9-ʱyff% TEgc رٕDx/#=Y'do?/K^?>wJ[A4]*5ښey*φW6);=?EyQR.N. R[>T0fKMF*W]Xa%yG:0i`WuÂ? }&j[Dmhwslۮ-cc[5\֟!\##Bԁ,7]-z ( ( ( ( ( ( d񉠒&T"ExU-tWe((((Jk#D uItQEQEQEQEQEQEQEbx~;yTGĉop?гVut>|wi llv+ ['n-Ɯ fzɉǭi^3]l"b:mSA?ȯ\DFoqoZsk JbVÚҨ-,xXUFO\Tg6!0/ou.?OncF:@=⸛eu2rd71,Rk >Dx:c?5W3fvf[ovJ,(((((((=Kwx?jKt[هj*((((+gQbǻԏXkL[j b@EPEPEPEPEPEPEPw0Gum-trFbx\ FsVNdAq =ONH 3IKlnտtGqq[&d}윹VVs1m2˜ pc^z#VUԫ(e=A18Hb>jp9RSF?u:}r F Q |6A&=JkΎPOOAroէG 6ѝOOoH {R;h^F 2Y='Y#dSQcؑ}:BT (VXJs}9'jע((((((<$"?gg[j1adVGhh((((("M92D\sպ^y6DZ((((((r&? ~v}ouq r 8tS UUDT`0 u,rE;]>r+*M{-Ҍ㵺]2`䁌~#捖86Q곌~SKe?0_R!ʴЭfwNTˍ}qzբ(((((((+s|B:*`WQ^wCcc:((((((cLnJ$ïK!9P:KEPEPEPEPEP>`3mr$ڷK'tRqzi-VH4crQ U_0eh.-aGϭ(WŴ!eg`,A'ԃȠ eQHXj qy=|BɎr9S^5ͬ3+tJUO<{֨ 8cry56sMk/n$p{O@_L=r-uʡ}VCk<@9^Kh##]ڠ`1~gLܓ;#U8AOG gifX Z '$FA?M@Q@Q@Q@Q@Q@Q@Q@Q@ xƷ}]^g+$oG ^G;8ܧY&((((((X˦<|~O?bhڌVdoG)?*z)ME ;O(((((((((((((((+3Z<9i"_€8Ojm~f@S~b3brI9$PEPEPEPEPEPEPEPyZN;r2ԯ빯i-x\ea؊k1kZb.UeA-jQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWxZJBٵG{u9jtgIxG!~QEQEQEQEQEQEQEQEVM+q-eVewp_Zsm )USWxSOYJ~u?z2<),NrEQEQEQEQEQEQEQEQEQEQEQEQEVWu4M<4 ?;Ս[T,Z A^KO /`(w\\HdC5PEPEPEPEPEPEPEPEPEP]O.(-%Wrkn{yHeYNA+ȼ=s^x>רiZh.-$? ЊEPEPEPEPEPEPEPEPEPEPEPT5^G7O}>xĶ${8+5-BT{ ev6]k7尣uϢ(((((((((((*ō֝t64RǡW=3@񝦡 'ICS^['#l[l?唇d^V./U 79RI= mPEPEPEPEPEPEPEPE#2v dpsǍ-YL;ǿK4AK4j2~5x%[ia.j.ɉPrAz}9ݤvwb,rI4(((((((((((((((` ǝs|}Q-wtj|sWKgY_.K8$}Gj:UbI AE{6&֭8P 5mQB>ko*?*j+ӥO$ i+d_Q\z(i $H{(S"DcؼQ^gs^P [BK̑V5淪n7:T O8U4;"$a}KSM, ԵGUl];rpV}PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP endstream endobj 234 0 obj <> stream xZYo6~_`HF)"'vS9I\{}ɮvΐ:WKRE X+iFp曋ҧ$IF j>CO?s9>Ne-)[Tir$ʔW I"OtipꒉX6s60e4 $(D j$a*i<ߩF>&,_O+a[lb3j˯& jbJ!3XӜM$)hRog 7_eR7Awa%9oeRd/a:A*.>Kgy~D2C WPF42m4kʐTq"`%bm镌 2EuvT(Z[敁ݟJu8%rUBC;ЭC 0Fߛْ:V!LlGq$rI(jD1*yDH))W~w7?Og:7\Yt7@y>>\>:z sx -ڝ;Jwz=pka2VmgxT%8c?lk\ǯ5=OENY"& ӽ?Gy;BY"% ^yD#3Ͱ[٩2XqM'z&t-v[(SSHϚUm>-(I Mma:Z2HkMZ+#EiZ&򞾤= fQ`OJmh !˓hӚBWv"/'>9N(I3˅八3?>5Aޥi{cNRP3v,}cY\ՓkNsJ]Y?u8Oa7bㅳ4|/1ysLxh.xnixkJM%͹8xǎpIvܱ'B^V(.s+%y0 f)?҆N֔_wY@f),s$L#&A Fkos;znF6!J:!a U6aNm#2N*UA Ǜ;59y7{`f"n n5(B-l&{l[1T"9\T-Xytx9Wdo9< nqG (T$/Zm)B,]Pc{HhsXHϛx3 f%iqv?#b21`Y8;Wvnlǥk~v@H?ƃ+ nk: y9#ETX!dc*ˉWVM(+UV^E|SZ[=4aYGb:tv A[yU==Uq4iK*C\ڽfH(Fb#! n$tGsW7x>^E?=3XJOt3AA5=!(6b(Tj$wY.,@k'v^CiMb8bxq[Aܚn \aћaD. ;jS'S]ڵW0,N Uz(i:#q>n$bۥބ\L ,ӢW/o<4 4шo/0L`0DͦM/X4 endstream endobj 235 0 obj <> stream x͝ms6{:d䜗s&m4wĹ81{.v} &`53$ X..v!S)LoHqbW;yB Q͊W;X.$GXjGB>k\Y|4TQYT)^=y[uwhםRa԰Q!^ a]sҠ dH$}۠ѣ`FqujJ,k)C0xS}}nXՇM WF1^Mv1L2tTz[ɈG vgFl bW[3惄 {̰$ ԋ#ET|8GTf-d(n#BGfh̰ b:>JL"JL m Jfə=BkWMFj!' _,Budg}WNULJ"o͖/ K$@Id O.X]y&hT =sOwXzanozW=(Lstѕ̠%|&h LŧV9hveCFl nKX­VH;~ҩaLWJk3?D8:y$t<j2BuB0}ъ%ErKrcĈţ x1[+enԴ@vGOb2s0tN.cװ n&#FL..S^Q'f b:>o,9&MH}x J~:]n# ;x!-(NmgDOq kR MAɝ?Wo5㊊(TTzRonFwDy;;,mM톦n[>>:/vY9fy#sh۹|uK]ݞ> stream xZY~`Q}  vvdG%Ei>Eij.vUW}u5,a +(BDه~,Q$QLi>}Σ֌n鮰wD_+Q֖("2K%L@L'))Kt鄉<+tK5=x[":"]*" #+]a5ićEjJ7jD˞XLa9~JqV=xٰ\Je,+B.%|j>Vq C:IS/wu64/Xګg9I 8N D(?h>G*iW ¾ƛ4'[U`f{LojxOI}<Wt+RtWw{dN+x2Y"+2BզZ-`p^^**z_ۗВcx~>[؅:a3^I75(%%Ӕ803 *YOpJ+gqë[F. *=5-s0UcJeT:$+={/#A>Ĉt$ŜC ,F= V/+' 6g(IB`'"j@L=>Ąh^́sK9B.Ow<3!`t'nK-1SP" iJѶJ5C*oP 5Bz@/j6ʻXs Tya'ǙcHqJ!U̦9^_iM3Vp|6-{7fjl燫ƃ4$"8JPWHY.’P:\5u:Ung FlvVA=&PydAXQyO5iIFyd(0$aWL 4-]g\#ETk-%tF',:ӪfA-ڙzM C5q̌dJ3+`4%`Vy*C.&[О,b̬L:J^C22$ V=FA^ZC:T_O=ӱ󴵽Uk9K{-0.@hv}D҆5IZtc&3Qd+{ @6^9AbOaՊ3OrІ endstream endobj 237 0 obj <> stream xZmOGpUz{[EHB_ܦQT!& iߙٽ9QvgwvwesdOE2v>Kf`"e*\v8಄'N3MVif\2\݃|;&_Hmsש:q'9eLALg>TkaY3&\:M^>e#+I8g+ `,ݤbw8:%ظPmX]h}yH>85ۥeWtY2N0^Ԁpw{<4x͌3uᘰ]7+2`-+:9x?KÔiR49큺;Jg-׎i(`*W0H:@W1Ys:iYS& j`:tfz*kSMsf$8]㷄6>,6] _`:´n_~1@E^ׄij@d@"Dz*O\ -"z su-(WI*մa rT0i SvUQ؇0[r5UsC##[l pc^1ke XȈ?d цYdLoFX焐k)w~i!DK. !`I"m_(\6s[V7֋ЦTk} 9\t4\ā?֌wI2>5kD*>mlDfn-n,2[Zw-*ہ5ֺ=b!bSjGb5erڟzrݷ7| - pMvn;6Nv!ڮk,Xfjk Q>QV^{W8ԗn ,jov0g1"$CJ6Ib`S[|4E`cxp*yD8A)mh:MG[-m&r+v6,tLB8H YXve w4tVKx[ݲ.ogZ }L<ʹb mVJIv-}y៘ҧ տNAWêA_:Øtz$S)NHp꫈] .-L 6fyHRtP( % "홳!#q{.,6&/qC’5yOo E^fuU@)-(#ךNh>3mxҷ,h-!qkң*= Ts^ڼz@*#vX>͊yw2:%MJtN.=q7 llĬy?X oOɘVý 1'ʍ%c/C]Ck7|s<yoScc8GA5\^24 5S[než^gF|zAEXrQ4z_Bg;wH<~ArAG;?bn?%xwdh pnWqD`,8 < Ú/Rщk2OV  k3l{ 2xj\uCDzK60#Y\2"2;z8OM!"iCE@o"Ǹ=\c*Ѹ+|lZJ =G,|i433e*g*yczk> stream xko{}V|JBuܡCQ(lb,{_ߙC%9Y. H8p8㣜Wq噁Ϣٲ9>l~|tOD9U\ԌCU43enZ3RJ:ɦ>;ߞE2|(gb:7Y(-uV蜉2+t3^~F8N+"Xe٤b_#w82%;Rd_'Z:0]#͆S%`tɒ3St8)~z&>gqzWS.'Ӵ-W Trz"'wS=y\!y*5F C_\ rjLUV@& n*~?,մʀ5< %p)*6QM}w7QG( OٜJ[>Y\l 4-*Š=\}-~jn-Eƿ]+&x:WXA-yiGF]OyqԒ ӛA"dJF ms&s1ZEz6wCe=_ <9E?C/Oڲgim!Vz\Y~^[/_kN"DSttFM:`Hbٺ2ITC̋,yy\6m3_deb%~m wF: ,Tto rxlw^.۵Don#Rjz4|)Ro:Ő@MGn>,,c$42gt3%{.C#D%S _:?=-é7?sΥ-s[V`e$}ӷefXZ nƵς3i)Tqw4(4hga8MeG}ls=sohN&uf'x2i=“C(oF ZM*Fx'Y.(zowCU|n=%v$YUtVJGkJ.x8:q]Z=im$tuX띓#Šmn6 wƩ<ݪls?b'm\Oap:-0U"!Z Ŋ1Q+=όڲ9m^>v XФܮFL|#YARb ^B xR7h@=!|F05EyhiXUf T :r]B O9J`.>C8 2=h67>tf{WNk6T=84 &6tWzrB"[ >rt!jQ/{GVbћӽaU%alS a>'N,%*6aܲN(:tEYҩ+cdNL-y*_-v֬l̙n" fSF`a7" VW0Y6u&,j("'k%"o $!` x6h,UpZNPTJ}eYU+^Զf/۪';@6_㱁T)_TK{fq $?IΌyR2-jUbR3_ߑAw:_J@KiB5 _;km X`JlO+\_I> g/fxyNY. d: j[B{XTOvl*: X=GD􂼨<]U ;tm/|$֊%Ņ297kG0DVPza]fSa9 ƴY%_9D%K*0%"BGѱCnlnM*zKR ;gxnF[ؘ (_ӮKB*q ;j̦RiK&T*mXqH^<.h[30|m7/.Q%mꊠdW?T qFa~JkJ0O+N`LCٵOA|6Љżdܸ%9 pbʌ&Vn[8 ۻːaQVԏO 2] sG ]{Kpa{㞑BR<]ً'I&x=^FMF|2[0/"ǬR~0vlHT؅1?0~?A'e O@XY9ӜH0J cOEW+~jQ ܣ|( O endstream endobj 239 0 obj <>>>/BBox[ 0 0 243.92 175.57] /Matrix[ 0.29517 0 0 0.4101 0 0] /Filter/FlateDecode/Length 64>> stream x+*@02L, T53020THMLO521PpW endstream endobj 240 0 obj <> stream xO 0-L --´hB_m9Ǭ&x[,ba߿Bba&8i~O{v^~OC3KCt ӉN+0|I$(ϟ?$HdI=wz;u/I9a0bR,x/Ќ~II%RwAq/Ik>s X0| ǐlI}nvA8 qi|?nH@WB=FJ 0d%т$pԗ3-,dpHw/-s,q|b`Mﵨa$ Ϲ8qUCmfF 0s7I]AQGca,N$m?(߱1_ w/{G=HlF̤q zt:!]M=%99 [ L?dTiįul ` O -A dg#~O3xM&ow u?79dn8I#Z;K$Ơa;2aŽ6/"f27 Ae*dc ]ƃ6|uz=D{c?mW d27`0vz/Zc~G>)P=76_qXL69w:жK:ߚ c ~ /gĆ6V?,hꕰKO}EEw_&s@SSLfFֵ-k_<36A U#*`W+K1Q;)a;08Ɩg\!9]hC.+▧G aۄ _ƛ4l3#`ɉ~ -9'[<*x7D)9&tCi|qB۠'O/E3 x? OT#/| f@:+g6S:u5.1¡sy|b>\`>XogJ2*I|ū;CIoBrx>NaT^^Fj]ܣLyE$MΙ+0%. CH;a+TmqU`g>#q묦(G `Jj|Kp_ @Z(c3.nA"7NTGWy|X02-hvC0֙Zյ3#V_me`j%ui]Tp~Bp'^]o%\mB^=*Dp`B1O5ׯ_L$oʼn9_]&ۮ%V[6BI"Sƅ!/lv+g@t:7 ˋ:'s.DP|zMU2ڠ&D 1O,**ƯAmXSUtQi +.nJƶ4tEg<b=,5٣j1v z 3Y2Jk9|Lh!55Txᄝa|^'Bϟ?Za֚zp-NTLS@C=48\L  ^T*<5XI=忕AM4hb0"tC.˯V` h?na2yn-3/Î78 p׊ 5_ⴸ#ay,|TIgP|,HH޻sAͱ#=/znFUo!P7Ft8{V8:ɽk0ԭʰBky׸V涓#zz8[,ps}N k{ {_1mr5.Î@ Ό{ʏ$)3k|ȼSKQ#=WNI`1y1j7c5"Ԇ?qIMGJV4n:3Z'4<ɝduO)nnUڱS#sۻƅ5[> ]X݂l8nϲWIu֢JJ8'!_R\PJ`N3eK,{Į5^; S/.}Ucb=u,μG4' c{r5l]n:W4 vO2QZ$蠐Ɨk\Y?5‹ue>{~tCHkj 9VL$ۂ\NeDԎ'%\"x2?Qdž~+PG}Ț-j[ E=bJMGG^+dw`yDUڇ䩎mfoCZ2BURW5>*j)&-^rc뱆U,!@΁wI$,9xzAދN5^5[ꛗΆ_NиޮNvNoW(s6wҚyWvq7OH^N8BZ&L5{$2S ^|vq3nu0y6'xp;0AzmbWFls["w=&Z .y (1"*Cp2GKzԆTndˬA˳Ov@A6u e>4pÁWqb҆^kdlh# v+Me>4:HL7hۙe1b(a`y?#yUK|-J?idKWn6Q]6-zA Bj4$_)[,#Y;#sEGMUVkHD$A!/^[H!y5`GסWc+|wjj4ްB݆ٽASWǯcRاIHwyOzjj^4Ar`XqmF|̄"Ώ? %^QLҔc 61D{J܋Y8g>3?z?$W??!!OnϾzsUfJ4mL]~78"3UW}}=@Kn8νʾB>x\n6wO!A^+kEw9I,L^wqX^4WgT̻ .nq̍?l:=ĿA xl~~3Hucro<ƍJ?\ G?!Oey/sRSE_TgВBln N+˦)ş Mo ]'9~,Z)T5>+ًƗg.XsztglJB%go~ڷY,28|9@E|;pfIbΎp~VjN($5.Ub_+0-#|l޶>38Hm89lK W,svqE_!lqNH 4>+կxUj4;__W@d:8q=PQ>hJm-w.+F1|pÐvy'Wܚ/ϿίH{t鷹E #.v>A,hkX/4M^ ؗƗݰl9_xZ#7Wqa Uˊ؝W6wvZ}f70Ea#d!ylG)qmi˼J ɫ%e7X/eY;5 l3HU+ܤƸK4ޖS<$>Ȳ^3iH@tMZ25Dmɫ{xn9sN-'L6PiqY2w|me]6QKQ|V0^Y㋶5ǔeB;3]1eaoN^ ةs.nQܗ'|wZKˑU,R&VC5٩ F9Փ~ĸd\=yUiy@5̞ X=ɫ;RTY'6zA-P{MB}vɑ4ޙ_fe{fi|ĭ5'+Sʼd !s-\.eN6ɎrY[x6$GέVKe8vCnFՀ]k\ e+M$4[dshxc/}2ǽxR`~}}} Y㰜]k|Yi*9ǀ xe"c wAc t:!):TWq"Bd€Iu]6SZOTki_ib/Fk\6' oޞ *Vn>mwG/=AfPy5̛KLh|Nm< 34UvƗ$ڭfa9xE+M'i{:54%{T8.`lUu=@sLvow29q$7BSΕ)A>fFkra9RӓEQiT2T?Ϭd'?Yq3KwhhWL^ 8ƅY~kU"< I/"d]U-OtU k2lߜ\jC,B14uV!JV٠}4Nw KlBs-fN&_M^ 8 _m2xqvگj5W?NBiBN`U=I`[!4Հh`˩µcfjSᄁޠd e /TcKRHrqWO^ 8ƗU2ך(kܺo --ͬ8p$ǖQآ*D)&Z8;7@#BB{Ch\ +50H#W2V(yM ݐx"m򺕪j5U;ҸJ2GYƸ_E"Y5u֘jI凈+D:_)ɼ*޶. ϖQ_h|Pj4wXͰR_c̩- +[vEu@,LK1SqZG} B_Kg.Ď H2%,P8W7F9BS>?K)4|IAH.O+LdK%OS"ҳϐ8Ʃs&Jʔ{fS~n?bӮqmK~<Ф._OSOOj:*a;ޯB{yZ$(Pv{mwE>j|q1ve' ӫ|b E`aH>WҜϣWxиZ_Gq=5z {Q% _p$(@W:׭rgMr5 CIP4:Oˠ__z"Q՛8mS %^4U}}}mPgZ.Q\w~b|NG̑5<{:qd!re_=qIna@9,2s:6 ]%ɫ f?-'h|yg14hҊ{jѧ }nzX$UԄhi\k<2@y1&ߒ&柣<Ƞ#[(FuEEF`8ݍqajqiaē8/ZSOh)m;G v+K Txz2WxT4նNe`t?b٥Vϥ ֧?\ovXnEB6~&J[0 oP|7:5.om/jEPpL2 SЯqmStNe>MkG&j8IX;8O %:bө{>y y]{8uo>ѱiΕ;$e%I:*gAƑ*_~]xk-N6LjB~NUW%NKyyK8\[c5D_0øV6{.1~L]NԠ]z4Iߟ%Z(W ;W 3"ws23=[ҬqI򪐶%JZ ~HКЎ˫S`$2F1/Yԝmk޼4DvmuxBWs.#y0.|TztgpUJlFU*cZEo(+.:m$?"̃ČM?;wneg0$W8(at6HU'?E 66W^_4g'9x\ǎWPr0{Ҡ{a 4MAcōqğkcؖl}c.5/IE9+}C4ޙCi<&l$0A[>m#g0kVhpƯGt-Zw8%4ᒪ!"f1F> ߵC2G ۵z$* |1INaT6nI|VV gxr]P]/"<[}f#\2n ߓ*7' |1su{4l=xpaE9@w7Rr ůhX1 x\%5r_C=p@(>qFަrWPUݮp8Ƒ >`Ȓ/&ءq_C:9G;o>q0SHA@.cTC0T{0,㸻zv*Ar*4MCeTR"n>z=&(%^ISr!pqe^.ϩ6.(;;+ּo-8. 0te'dW%>BƗg|km|ok;9oP8)f zAT;+KryQ:'}\ꤠբmjbZ8e@ZAY|{;mNO)8{ĹIUlR=G K9܆uDw]Ydzrp9_INH^Sıj.ܚ cRAA],u g7c_$5~/8֔"ݶ!fkS&(\61|7Q-ǯwk rfr玾.0׋w"_WeWt\eK2 ɫL]_,-;Hm568L.EP Z;gp?+b#-!I xx^?#t>\{<́ʾF쏕,Œv :t:Ynd@9Sy ۭ*ګ+' ձ}s_܎3q`OE "xJ 4Cb>A!ao[!JaXՂ'WRdg_WgcWl1Ԕi=[|A*V q$qV5d:ydE~uig*"6IqxxaX3(Hb}'MG\6[,pNJTgRȞ2aɫfFTͨAct2=rK pLywF,DY gF88 [Oau=i3M1ڀIsjϤXC[%c~14128Xevw VVty]uW/c@' ~:`'V^ooߴ3rx\NEQT>2$sSqvYnُ^~#-Ԅ y~GY4nl%n|nZP3G0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0VmX`|&y^K2z\.=Ӡ$$v=rU#PbMbWPw3%|iWg5WƩ1P#6[4%ąҟ>c[gM?!mj'<6&#dAJ6 =c_zY |;}M9og&H}׸9fCv4$?s^/uCpƱw!#a&7~%_A8<| g2k)I6i7¶&SrOͶLrv+6 (1 endstream endobj 241 0 obj <> stream xWn@ ?Thg*jI@CICS==(K nȒXa O|Gr8y|_`i i~h> Q~ Bd$)F3} [O[y;=`xO7 p0bȗƷaN&o 4 " ` qN*ߌCp2.w`}j(-Lh':Ȣ! k=^F4Q3^6J*%(clo`q wr岩3qd{K~^n UNXZ/㔌@PySa/ `,cx/n.:-. z3~()K4a IA+r A`IW0Jr7=* j;Gɔ,ae*8T@MJ*&#[CvVeH(>7Z}&61aέ>%zG Zw$y5YN2eYU-yRw[WhIF,+5jµW4]@zT/3*=-E-|sYe~]J5Rq=,T\̫NH^̋<׶=Bt0zGYp A\I鼪ي B_b?d(Sm}FM]^p+d*q6-g#{XN~v[&kxz}ro'lρ òAPzO\r j\|agjnl&NׂiO}1owBKۨ;wh説.wmGD2`/R6v7}UK(ZLW ;IgI:/g endstream endobj 242 0 obj <> endobj 243 0 obj [ 244 0 R] endobj 244 0 obj <> endobj 245 0 obj <> endobj 246 0 obj <> endobj 247 0 obj <> stream xc` endstream endobj 248 0 obj <> stream xc`p·0L?L% endstream endobj 249 0 obj <> stream x[_sܶ׌cFmnә6LI㙼So@DqbP Ixy&i;)iLJX(%Z 9K(Q!YEc-VM,W{r7'dvwzD3g=ih‡*KRCKU`-V7:_u1@Yy$3:k9 wssgb's?5f6=op m4ݢXO=?J+hiؼ+7FK;]`Ov$SBk H#U+\~M:8Tn8KRsV[mȲNӤu k/tG3;Űy5yu:SXh&| (д yȓ&A3rm'3䄺 P3#p(g>.)q 6{G'Xm+jBqO8}v5Nh2nXnZ'M#x3PL"X{VRHJ>:vWMLo_qԌCumr vvZ} }?c d֬> pK?n04"$򚗪dЙh@W(m8D2_k2/|:H`< )zw} |ak>WO(YN64U6{Dntѽvo`Ngoppɾ796ouM@%6(urV>BSVqGc=4 kE},n-//<:9+  BT!E:iJK@fBL!d.t{jerKmªژR V76QSlԆ&džK5)$]J vAjE M=P ?VE]E:*\M~hu} y"٦\ +hžr I=QM>f。\‡gmmnmk!z<1sX ͑: umuwm3-:5YDgU4:ϗHhMēp2, i<wj:d1qA g ~榇:)몞9I _^j$Mk:6v鹗x?.PimoF[Wka.*3ې7Xׄ֜?kc"ځYE0 7ܷW,-}F13cL,p{j[JT0]& MS֭XaՋ vGΙ=MwQ3GM{[Җư;EL:FG@yi8.z/kʐ6Go0'Tn1i-Ʋfl3,dّ`Γ xMPڪ 4qhdW.2v!x4߳ۛ3H>^ vux#G!d՟ڵgxà̌Ad.D(;xg3=.l3>V7݃ ru"mʕBVKJ rj O3h?Atg5H:x<Q0yjY{Ó\|!( endstream endobj 250 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 251 0 R/Group<>/Tabs/S>> endobj 251 0 obj <> stream x\[s~׌ÎB&&M$YLdT5&nKB$j={>.(ghZ[^g{?}V]=93^1Fh*GTDpߘY~:f)ޢP`ƶ(QTõCъׄVpSI'Zgy#IqFK\+`ۨD`bH ZQ ԍ^NGlhXReI}yR2b{%"RҰ`FWc1:XۖbXSaiv&h[/%EZR'&6p36:=ތŬOԈe<D&G d(͗^ C|@ҵ|?C:a6pDG[Ί%Rh^  fdV58( H l@sqku7;/0flD:}s@-[,f'(pwK̑'hg=Lr ᯫ.qGq9n~}jkVAg쒠k[#K!ݘQ䳮*bd6'Yb(k3}Pbv>c \T֠!fa8ڍk]40Z؂ϝqwN-s<҄e7J1ZΐVof' y5bŤ0ޝkTF9[sW/?B_'vT=¡;)\.u &-^x@RcnG׺ =s37dRCiA&A!y%fD%owJaBcɚX[X0`qcuRXȺ!Z$aղpstW0s5_!կ6`'O`  vkf)['_f`vC[۫m ݉[o:$l&R:SmAKy< 0(e5$e#6LHl. _g O`"SLV+!tSS`ftWf(l5%u_DӲ'h h٣AH#~ Pԑ_0>zY>1(rή&%Ѭ_\kZ?ʵ<ε$&Zm FҰTz\Kk0m¿e6a0 &o8a:y0)LH]ޥeF:yX)Lh,Rak},l]ak  kUJ [ 5Bt#v7#{tP_VGG7a\IAؤ=&z6חȹxp#s>"]kOێ{w7*&zqr\nIfpχ LuϿ[ „lPVlaX ^ZnKrtk)*g:_~@韈$/ 4Оb ^\@'O8&4 'h`Տ'1@ (i]9c5GǍĄ2YSqz4ȹE\/`Sm$t#ng8hӜxo״zk:)~%F)HHZUlU5wZgu̜06ڼqu%*qh/qi?_0lg>n% y͈A$̈;Np)LC-oYyKk _Ү^"N`a W.RJ"OZln 3[A'Zajgc'O1 (i"5CKO-fn ~i(߭:xڮx8~?{NqƵAaLXO8a;y)LHXn*.#uQ[yQw'G Hh(f©`ޞCm, ݾ${'_4N)LH:KNT/;|ܩ`1fukYya;τ8:yw)L;M@ZJbBc_=Lqa…=[p.08h7Mߴ۠'h3pu# ]+Bp\ f '75ܞ[| qUgf{*ΔW{M7| 3l`[5ԒݧD3pf o.ƍy7ODݯ`zZe'O8&$I.,`ZO+xq@iu63.F'D 3q'NVi5x ~!ý{}%fo8=:y)LH&oM~'~XLi-K.,e2>ʹuU1q# endstream endobj 252 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 253 0 R/Group<>/Tabs/S>> endobj 253 0 obj <> stream x\s6LjcI>Ծ$J&t:MЉ,ɑ~ a mv].vr0NrXNOߟs%9>cFJE\*$3{$W&yoߋiF&"=uD,+c;r*@ r B2/hHrKRJjajeo`% WT'Maeb3[G^c) N~9}3[P"i<4r+EF0[z1aŔj G u8GI_OAO0tm"{cq&<'bwSa|;"Vm̕m[5r%ˑ*]rA!*'>iKC_vӎ5 ?ڋ_ڇfɈų'`:c<`qI OVcStʪ*kC+++ %eޢ,0F?bI#}t&@x0Wq}pD0A`]K.ヮ$hQ{$cA:70Qq3C2w aܵb<>4*^ВIu|r0狱R̯;uP%Xxq GpiOZk9 >LQ9f~fMv zEY cz<կ6$,^d_vk5=瞡Q٧Hn-YU`;CBKt|7%Yu#$cu3:<79>n`8#ejU`+G|Pξi#s!zV 5/7[&XȚ&zՁ+!Fl ϫi]mO-=USrc-wmrS@#&ሷ+<^[,t mB~^-]+ElA`aK00)kcm'a\vm޸\!D͆3KMWI# U0T[z1܈t 7*V>@#4ة_oCQ[,To8⃣7^u2[ Cd2+(*SC N`ic?}kz̸/#j]u#:=B .Jt;f4 endstream endobj 254 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 255 0 R/Group<>/Tabs/S>> endobj 255 0 obj <> stream x]o6n6fԣ~hMKs{u؉Rw{p8ˡN fVf8CRFi jhwwY<#krĿ|61k&FjVJqra֢LJ3*jR+h-gWOW2֔׹jRQ ?6?PVMA)dׂJi z{p&u)i÷&laTc,\:<*l(홹<-J~]3Dм U57rrK[\Hřkjb7n\΃T)*ϕH&fؓT{j@r|#0+-ɻkɧ=\E7pkeʒS?dT3ALq=eT(V1Ϻy3ѧ,Kӓ`i=$չZҞ;w3>h=~a2]\4O YZ2uHYFԱeBfh9pA>9M.ߟ"%|Ԃh: RDlmfLxk \7lN^5Gp 2\eƑ'W&t}ՄEBDMmRn@wFbi[r85[dxF3Gl@3 }8)J'Ĩ:--YWήAd,Wi% ^2ǫL꩸3@w`bNa;to1Lc;+̩-'Ax@_(0m’4.Ht+p) 'p%t2bŅlCކȽq6퇰փ-e)/od8@GGjd6 r⇕5eaxi᫟bO@l' &Kt3DL6nC9 ~{RtEhU9(aXtKCkl $,q |Xؔ{@Ћ D-8%P]6gG ~yqkJђDž5g0:5cײפXcK^k.[; k.:.d83`<`TUñDM<_؁~q|{N$nTnl镩yeak*x\(p*a` %V]`O ?c0Gz0VVRMF3k08 *ˌ*뼅V'~XYQ+Ke?( D_M#M )=q-E vE nm [ 85h[ VڇPX$L @{ELv;aa nTMFdeQ厉BW*DEB0 :BGa%imFV%巚]֘hg]!6 q C0:Ca)ε $KE?6 Mżl®u՛[nѓ8|ݿo}^)aud9A7a<>5| i_t:mϛ5x5)Ljd9$q7a<>xuÉV@G2yMڃU=;).Lg -7_븐Arv/]1xa]ڤnh S:[B;_ítUIVvy2BfB1[V% { mq*>:59X`,>8jqռKV nxњp}Q7"}Q-#"q MZe#vnXjHx2Ҝ kdgV1eS]V`ᰍ&4cąEaK&> Vڹ pfm~5Ma8 tO(U!2Zc@̓kn!xpxO[<6)mQz2_2x|1n dMo.1~Snj2}h0MBDž$ͲEr`"$c4aMeSKeOe >^r07 tr`y;'\N4VQ<.i.ZwG'NIQU0Xf 5/@G%{D&3Vz2)SE"oHcrkJC2$ؽ|p̓ݡO7#Xw =Xu;O~*\ψq._'ta?'ڿVpԳ u8 da t X^ZL <+k#x|e|#y`8̻݅WWAHc2hàh04F,[;2T8e2LL("(w(FUeΙװqeȘӌ}  2*=SNqck;~(Syva;0 endstream endobj 256 0 obj <> endobj 257 0 obj <> stream x]Pj0 +t'CM)MC#9+*03b$=01ac0I8o.&*-a_.=MA5 w!;]FWvȞf8}va j[p8ɠg_̂;}S|Rpk4ЌZhZW8[Kvꮸ~< y+(rOx+]}íq endstream endobj 258 0 obj <> stream x|w`&C )" ^P  ŀ 7 (MMP /x ( (" kA2첬{v>gf̜33ƏAu\HLDhnԼZmm#겓H?kD6Ǐ/0)%Adu0e3kL䟟1q\^+ES@׉}]Θb^ğL[~h~&SfFEC|?N7#[_ έyS=/iE3dKZ\N_x۸&J| {?>:~v7q]Lh>'&D~:KEuH~(\YME#IG(iWC/d|L9;4^6iZfڒhh^RpyۼiW=J$z>֬䖒a9j݃(> "jA{̑X, m=m-蔱*nu! Ht 7ˁ*gr^.#"a=4)?@}F=ƨcQG&Ax_DXK]|v-w}QN-`+^ErIĢ uN&# =t#݈π+OU鋨e|}>//{-Xc<7 Ӷ-Zکmvn7lwx3l'uy0Tꉢ.@ [OS*>!AQ($nNZ'vЋQ(eRP@Ñ*85 n'eH? { /Fys'Pb>Mjv`\|FYK9sGn`Pr@&ϖݨ;rV+deSdJɬ݆,%cj-4 <4'x2YXfT-m௙i# -Q9XnGZ5$-rMMRU}:(&;՟i5t8(Ls$ܬ-P?pvSFh4!s3yPJ^oDG/Xwx}p('B 0SX |)ԗQO' ] &\vdp!rt̅R5Ȕ,ϼ#+yoYXAGcAr*).T-XF>k$sZw.>/1OVux?8s~> qmQ۹AoJ4A}(Jfhw=&yO;R'ğ fGrM֛7)AOk{硚)O+{hcoh#꥟}j *0c={jKZ= X0}ej/ <27#M |ۂ>ڔwpYr5;<7N %(];˧]7(X;r5F׵ t|]@5Eds|U O``)@'vEc(}2b= Ƿ4z P~Ȁ;CptB/m2>'[kT}Sh~Fi)k&B$'mӣ{*-&CBja_ uϿC#o4HCیױVWRwiO.9'~j3Cz%q3%e2s>s9s `'CTA>Gc]4?{qO~@@Z&o/܃.\=ynU.q~:i/Hq81]k!}Yꟈ#](lptn(sG Ҍf+:5a_Aa=D| Զq `p/栢g?A vN{pX,EOd?Ȳ'^|?4dK<<'e++0W!:h!Ў{fkT/^ymXGUz.=t1x-kkXttЗAg[ d[n^;@!h+CtTӰo7d,*oOW/󞇽ЋB?f7jIgB9qeGbK/;j}ǒD~7nH )aplOn۸Hhq:rꊰrKe7 /췋4YA]isl*Hn}&@>w{2昳wuq!F]hc!}|>kb(8}K. CK{a%B/ cL7,֣.-P6MwɶU Eie[ Yoogw#tR!Q*ӶNayYtIE5~fȓA}0~hd6B^G+]{@?1ZJ>?&{nOU4lhY6NB:tBS\=4ż HVGwa}27Z2ZWiG7}L0p^`6x)p0>?D,ztYE!u1Qmzt2Phe8v 9G8]zeRÁL;Lۄ o3Jw)>.6oǥgT?[_@p>n϶jQ2# AY?70bFHut3gI ^sU5P ]5+uVpǺ$-PࠉW@~@Vu= ?egAQǹepylN@0 @R϶ tV6ʷ5 #sp<2+鴫6c]^sBj-u v t-zXM?[c&"ĺ{9hDe]A GaJK_Pޭ-R)lnaE]_xň_LuyMX9yMyV&=)՝RaYr\5oT jaΥTw'?TzvtJ\8uNQHW{=Sـ<F@/5 َb@{s|BA7P?we6?O(<:<*׳ZM[An9VoWawSJVhIIJ8O:5CrIszX՗:K' Po֛CSފ:F zh3A!Z$M;M D)l}'־.4[;BoKV#GzMV5Y X& ;Hs!FzHSd>}Zz<} 3>X~nl!Gyx # ~+j?Roul$R3l kBIw%|_t^kTɗQn.@>d,s@M::Y.$kRkq΢`>[Cgoan{odZCʣCvRLHyw}*Gk#Avc-9s}})ІIֻ1AG$0Q6 Oh9N&0A"7d-m*l*m~ *vS7IdnX#fR0rs+vRxزr9 ܉92;BkSo]u7 ٩wJ:+~f2ȝs/oE*rkDįqDRkҵr䝰u7>s1465xrD+s-%֚ wO9ց->gh~'l$2|^&suߴߣg9T|'~ xv [~ c VCVX nwW1"G̍% 0G;t7Yo\EN8U6,mR9ky*i*ߊO)kz)%,4nCif@?K_(ޓQ˝{ҴrxX%oΘY )M -]֨使"rfS{d1AFFf;ܭP!9uΥaWgް~~| -f}j$hct kIӄ>v [m֌Z]pDDo+r"FRjF*^zO{Kq]UzclB!]hv}1>DB:r6z˚NCyc^Ay'z䀞ePώ֧h=MK>0t p+dvd(DW}yyT%+yQAEڗhG߾.1BVH_iܽZ}G$LMͩl1vd"%A @?xhCN5L< iz =c?4&H0ለ+:QuoаQn xanvW'бSDҵ[R={RZzu!:F3z5M,[!rd,͗hQ]ZBcɲ^۬R:e\i8c1>sjhw ը~~2a!9Y\o3_㓂q_?5Ko9.b!cٓUo?KIrA QT!›gfGL R|6M =/_^ m9%%e`))y3JrK*dX7WC۠m()L h\̟qw61QjԷ' )KKd¾dxV&ܾeËVjʁ2\svXC(~  ʯ(Hm m۩9݈JXkHKEPyP,;է& +he{GoZx:=MPTyĔ mQ ;3-wm5uO]m#= Nu f@Gp7+mL)lY˦=l1ӭߖ>uac;mP}֨;7YvPuؓ\ݥ~Uo~_^|)|8RyDvCH)CDxVT)ݮz:<`nl?O&P.ElkԸ1^]wJزzqskQDH.!zPu**]*******sqp5psGkk#n6ܚ *є8֦XQL, W~b F7e+2)sa z9o?).%e]Gg <~m Y ;0MSehVrtrug]';9xr6Z-eo){[Wfoj";0bؒC<$;k/p=>-;;CArL}9%tT:|*t-3. 5>J-U+|*UJ,/AJQI]t7mQ0R|_ KZ!P15(ty|Q,Gh?QjN-C߫ V,( V wtXڵfY$Ȥzkw]jHzHcӓUX3S%-)4Lٷi.i3^s|XY`f>/ю"R/zhտhUt ,tּBoЇt~#x-N1A6ρ 4FP.ͣ;cL[]J/ Y~HMDq'IqqVsiݵzU_?o3f_Z5d;)'r%?Gz`Gc&hB`w5 UZ3~_DmYx1Ez.j7jyZmsPzL4cQd[MIwWU%krGЛyhe8ZAPfzVtFE%ƢZ$,1As"\UQͿī#qB?gZ ZiZ^Mkym'q{7Vz[~>F 7c3⍿gor>!y"+ʺlM*]kkk" J?ֹSɔL$ȐȕN *H UJ@ PAQ,"`AEA뺻e"bfϝ 0)9o}=Hϡ@+~X>Ż<%fl4n$A^5E O<:CvD=d&YY\ (iBw{m,f,8q݅kqA&P!6{ DW')$?WĈF w硩q#BMy_OB)t?ϑᨆDOr'89H;φ DY4AcgI $V2Kit:r!JP#):@WgC/p -xSkT-E=O圿S#GTK z炆,c1v! f:! s FO1+AK8<4\#BbzE-pVrYe Q>P H$%qD69Wx:AnǼv!J Q'jR Ts.:ak\e=ޢ7⎳';av p%k  r\W"rدW@ 'Ϛ <}I}0T/PkﮭiJ5*KRj3UZmة#!e (]q7N ϥ~.}%Yڊ"a0:1Pzi@ޝ-F10hjG'|9G:ZbGpނEd0rrLQ:N"܂>J' NrDNxʔRKW RnH rsiw Q%M )l\Cxf,b"xnuT|n&RsU3殴ܕU njsR'&oVͧD՜`c.YB$KM:At+l 1%^{a *L]3nj:=7er^5Snj7[teCf{ZUa欄'n -}X-~yMK0{Vm$6굄vdyspq"x#"JDtT.c 1ImFLMjN՘qc.E|_[*mZn(2Knꛐ3?9wR4udݔ󔐤`XU ~qPo:P<FЅzy*/+ U,Bܗr '`Y8i!Y&fx?y?so>>oG=u>jelܷh}Ae)7<;n &f.-Ž\F)S&E}I?7g?N @YjK`:C~ EM؈1`kԋ=L^K]͵}~jYVL 3*+.M۴\`֜kg:y]ٲ{[\]|gӿeG:CCLY~y7>6ooeӟ}XͳA/5g7xnRTϵW EJVaKn?4 -R׺FD %[ kP4D/]|8d0T []v*7$ ;ӏ;A-ue2gV+8+]zCg(c9ľK7bcY3lNMKj:`_|{[>6^ heh@O c?7n hfdwoQR MVa# R^H> MxkʲyK \rd ն93Tlmٱ~II%3YuVzՌ{C?\;;z z`FE=&wZ_}N|߭2aΩoϼa@mE u>^  |_N$2nЗO5R[TꨒM={$ P:{eUPI2= 30O48̈́f!$/F$X$Ҁt iOlY;1v&-iJ=F+wp8A\3D|U3 <+M:+pS2*.anYKWz=-{~/!G0e&!IkIg$f( 'WIxK@v 1p+[PJ&qN4"_Ȍk$A $l0rd6EAj|ȈIR\@4:DHA)fd) I|T3"PR$Ӗ+<1zy*g@E1>_ClS4ĝcMz8mj #zu4 Eנ-bEe\^ t@%9nGvNOւ@r=qˑh-Zo$%_E woTCN&iu[#Ҩ[pE \$TThUmpH ;!+.J9}Ɠدw|d[ۧ>:z^RpIO;ڱ7䧟vܝIϴjN$pur&#Q6ŀ;ez"9qBiVMLtrS]iH^//§?y `pTR/aQwwO ׉vj TѢYL̵1%M"r`bt(O+*L\s"Fq-G%*PFFUq+.C:cB{O^e*6s,+2=Ie4ռ:e5G'?+۳gMã&vY -ðtUц(f#@ R  7%UiNʛ0s;G%I|Wh&+a\Ե6h3ȶ<f&#l[WϺ(%$C)O`4EY=o43d%cev>cvgyJ{\(`81L<#u#ٛ{R϶l!_Qg>}pzWve!쿧xKb-G2Pv1aW.sڰx,6#7oud "Cjm>\N+ \/mtW'͔uٶ:l".:Ӷmr>v˳o4(}O UwjpfXD&,sYp8AF(O!!jr{<5fI%[46k(uN(>)jvXyb5C@1C0%q:xq&AByUuNs$K؜tNޫ%+'E:_/k׮kW.sl[_nD+0:w\B~I{.jS!{='#-G{ E4x_lS-?wexMfV;ͣ EfZieי|xua5X4[TdUծٰ3Bn2x&S@$P05atKm$j2&S_|F 3OdQ*z!g_d Bn>ݪ,{2F85Y;X+o>YnJٲ*8"-#d= ƸȲ-@6dVdu݄^W}9^MZHyW~>E뺇m' kmYYYu؉gdԪ!!O,$~Us UµaL:(ar +.~/lWFz'̚aj#qi۶zߘo6؋3N/?2p-c-i U;`L 2 HF{my voT0fqy9]vW۝z0+x͢saPU 0Љ"^ܖ$nwlB^?X KBBG |nN 8٬xuuԤ~gE,tҶs|âVxCv@Lwt:t:бLvmخs>y5Oc˱6>gY㷑ץnTOKxeȝy 7~ɏ8@=A,KloT>ÊbRΕK]T.{1zѬ"KAiyj1)%:.~Tss]wwQ}7 ~XlslĖ$e]N, UN&C5/;I=~O+π)_ΧǠH1c,UԦl76lWGQ!~/Ѫﷻ=8r`ɋ;uloqKxa6~YqܰiQ}|l =Q{4֙x}99_#l2 T6`jnd#yFt\npw GvUd$$qK \a~5N➍ )C8oDa9tOG*~`QySTm)pT:|^54gVh+ )˻0dSWN}2E#!9kEKKK:*ˋTEsMtdxNp1=t ^\_yDmFgR;\4d)?]J?eSGqZ8w5-W;XW߬uBJemZiRi 01PFʯyO.3ܸFYkc%L./Ucf8vX;cYߪq<LUXfSFFD B,&jv%%وSid" )95٨8-2ڬ)!:hff74cȌ=-!5lQ4&ERX7!bzTfH蘝8%b[ƍAMz?ckȱ_[p/R.ҡ|Hz)}`Sקx fu,~v,;u,(8ŧjČ `"$@,ʙMAjlTH3L0nx+eOF<PAE.OXʱU^QFR{.?+ QȎRxe$l(I,HxLTЕپf~L:( O3SM>y^Gک#vN׭X֯r'*B] mؘPDj,Jҍia.ޮDJ&jAH4F&Cg_4kg0Ahr}= Tq0Z4$[B4R̉Hk@(fhYtSmB-$ۄOљTނ39dSfe+KG :\:ɡgyHJ3U=?yӁa&ëͽ/Rן~How%K>Wѻ&9lգ^o3s;UwR>g\9}hqq|΢ظ?ttv-(Z> Z0߹U(TwpNu Øa6ϧBNH#f$# = EC*?FR{? Ljn\zMW쯆 ш)2=vd?Վ I5]]%]e4{LPE]mpY ~ nG%M]>~ `!C6t75ޅ}z࡭!K v?{4C%sLyHlpͩSȋG$^pro<Kzwrk#c- ! ̮X跌DfL̃rOfAj[){~N x ̜: YSϞُo7k#G+O|Nl3N.5kVG RWA0ʅ:1)ǃ_T0s^ZgLEّ[,F7Ⱑsa;A)x,8d# ʢlpbzsw{gnfK23$=2LBB沄} I aG 6@@@TdłگP"آb*~o_j[U{ν3!ؾd>Y3s63t{~ 89THxcZK?<- [1?u'O LCdJ# űI;\';)?U_tр.@YdNY"Aa>tPzri1pve{BI:/kV0櫘R5Y= 4HT 1ӵ{[U$qH;\FÌDUstxޛ/;Z˒+Q)gViMp"saj*3跔[(:l>AoI|d&/eTHaCkȺL[6[#e/ hq;VmD a $Ӫj )\l%%-[#&b0JF "5;j.kϥ?qk}8ΚU^n:gh9ʚ۶ޜG8,@ 04k5Gۗ=HhG%??QdlKvJT{h*5:N`ǖN+\$eMQ%h xd;l(t;3cjuvv=(8rYIC|]GH6. v!$dv~!V4ڦ?j[8[4'1kJI9Iĸ.QOngmZo8<@Aʄ4v-nBOAȵl?Z}k{{CS-#|㋇ݿ8Ƒ}/]0l'cIx䵐]QXMW?ʊQ4scucH]թ{Wsu}Yzڄdu݁Ӱ#o0]0+1G24"E>`/i8dl1FcZHn$#C!5W;Nq8z[FR}eʑޤd$h)QthQ>kB}E G\G߄ӶUmCo f3,$Yj.E8LA]hY*B Oy?ʟx04 )LJ\q>J3-ݡ\ZT{i^TyC~ hEoI܆N.AVkXL(GZVϺ7RzO h{{b(/9Y3#rl{ĉ8fv*hU-A /gtK7'}x򩴵Kʨ< $#3CL^Qg9dD4(+& P \HtU'9 [=s ؏#N M)yEFјP5Us$D1[S26?T8{ GG/%{$lJBJ^ yI/{ Lg/of!^脯ˋ)$%4Yꀠ3Ψ0鑨oۓԅ.?yՑOU'f!7 /t>9%MY4!ϊY5//=G)UPFr?jި7&Q;oeU&ŷLuӉboŚ]Ď:G"x2gn/Cځ3nʳqe,Nb:+ &g2>CO kS5)oRIZ9ppE}ZUI}S|Kz&@qX" )zfJ 3,Zk{, )؀z 6Hh?5.ױ`& ZXip$eH *_\e[}H—l^7`gZW0Si*M#ul!IF1D#O( b2n㕽z<^ʲL.j=c0Xe3oiE`']t7b=Cxo`GDkjA83Y'G $v1Kb=cJ0퇷X1d9Ռ1x<sG7LnްaՓ_9K̅hk»4?656Z'4Rf}..$E%~vRO,]9G yhntwtoI&fʁBvrBDT+B5؍F@TQ;C x fb3]FHuqUj v@+1ÛH5p*jHPjB"TnQ6Zc9Wm)cj|OO/uyպZ@ٰ[@^L=1Cx8+si&bMMgԻ=-)FUJ8I=S\<&9=}Ys2g{ܧuh/b1+S;,BaW#޿"(:/Q64+/l }n׊_D`7ص(>lꬵ?.#x- 4&۷rYZjʵYKi 52sNP~?H^i*gqk)(:fna <$H]9BJt(e:+`עDHB[ "ا?'i"RoRDTNJuuNJuduG~>l MbhԬ[@7Ÿ iWPssu#աhxȺ(_T<# >h6$A7vtĕb5Iβ.`e,dVS,fg \iv(>x5Bl3t›tn۪Z'|G1]4sN;⏎ wŴR 5d#C8 u's@قh&$bM&ަ#%VDctډ("~}o3-c~o|Z.a^io&EWB9fEWqKD(<*6G2 d0z=yd6L< i( afdYYO+o@̝AEn BZ0 </RǺZkߐ%ж0oîQR啫u! *rDxEMBw]Ye枾z)G6pH.}ս@ 0h( ~"EwMv^|-PZLSQJAu om]WY7L) uYI8$p"ea ׊hIhH'^ S,DSC-VT 'Iۦ( gsHwgc3gi$:3f.bnLyӲ'X r`xtQîis,? jC;V0r"_?P^8~8t|^yq1a**1*%T\Vs~_-_us^҆4& C{37aU?%K؁ju[;5Xm%mu'O1EI%K:XEYJ|L,Q#_~f O]|.zuƒa㿎c cAʪQv22_&\_=7D-L_8KZw÷FTdUaAF?ZE"Μbގ5^tlr{c>IXƢ%"3^> ^3َ@HI_DCS [5oޒqM#ܧЅ~]Ol^vW1L3m'RR e=dET A>'bwq]!wH<$ +<@V,x$IDQ4A/ƣtuI Qc]K15W\ oi k~Xs,?Ăw]?_ttI>^N+9lfEܻ(M(}d,y$$¨ˆ**b{Ef!}*$A-@ vb *RI_a^.pimkNIj0Ԥd'+!N<2'K>oK^g[Iރ>}EiHiAz54o Πp%c!GGqŲcV8c/l_)L:.Ϟ1tRU9ڶõk#5:usbepp87:ϳϣ>( J$ex,8hPM!ۘ\@) EZN'$9vM >&tgKehgIIy>ǡP1> .%T2B>Y6bgriۍYN֎1H0[Z9wJ Ũ#s rs5%SrͩW$H^iFf]rwԟAXσEP=HJ*~3rjfS-A#rh}/ ~)Ij@CR(l(BdYruq\ҷq0ew풶E AT5>lXPnɽYQ)7pX}?-pB4e2s$&.1Q4qP {zJ pfrzJ0MX=Bj)E@[ZmDV6\F2}ڿ.?BM0y9Md$!S [1Vlzˑm~' (%xUBk3hx 0d7XM'좱 S@';j?ZlVv55*^+f4&!ɪ,z@ ъ4ҹɉS&B*"bGDtLEȘErb T.Wmݮ7}I;cj>侵Mћ^oΣެۦ>1[zcGe(#"^]@wbd| @\`rJ&O :A%>+0O]].>˩Q1aLРv@6ۖ;=,bzX`6^։?;? 8gT *b Ȩ5TY,e2!l!LA9P{ eSrH9k[7dJ`uz|՚`QC!{=_ c M}e~szPG]ƣ]XDG< K}wW}UW>x>"bJK໥X-&c LE4xKO^a,4a53&t =i`(,x˙ٍԼLO,Yg<{ͯ׻GMm6{L4Wn77[?}]CYQd̓Zob$UΛ1\Ţ:_ec7nwnYvtGOբ NSo,P M/W}.$N]gDNehS^ㅝ X/J#\́3s1907 s] p@,bxU4Ѽ4T79 2X0&#cyc|԰gp}  gV=Wɪ8PH(F!MxLIo0d,̣+(\iFv34,"k&̃.\ *Tx#o悄h'dX'Q>XmPϺÊź%>1qaFIjl!+?7Uo Cv%Mx^C)ea %rqIIq103Y+J(Kp$@It#wՐ!5 80Y߹$\TrV+⋜NYBd0 ԕ"Pf~Z(yqF}CE5$o ymu$f+ɖsFOxyAW~''4>1d>y$e7|Kd(5vhk!iQSR7yw\RzM zI46N<ݙS^(CvH hC &MT^bFQ 5<҅q'9B̙'L*㇑"޾`pD$3^zbXi7/I%@Tj[d$P S"U,1q.ҫ DX U [?$èk崢so|/hHsmvp=_Zu/d! )X aA%C2RR±4 K> D:IK$ `xٍi|D g gm C+10V`~ M4yeH,zĈTM)?x?LR]׷uz`s|WUJA 6Y6h2$տ)n>RZ!l"J Lh,ےwGזw_,lK yKBDd[#ْ [2$LB6tҐ)+С˴c6maQsdQu=9?v?.Si2 [k7 _=-32 9Vrw k\1~[F֪{J !R aMִV iah1.]2"I={@.B͹2c9T:͝ wTPw* 33DjI)7$'Q))(W NV99*mLE19+t>65EQęU-IGDa$$^jv*r垼"9IyZ:߶ II;i Oxhec>!s6[K%k ۽5G˟|4Ь#1ڒ*Μ#s8 8QUEm*J4ZQMX=~4ސ)%!P 5Xʪ(C}~~ME}j1jX o!R~\Qzy0vi )&wmQ8cǿs`s].w7w.mo?6k}VwmVV≖.=u_?uZ߽;x痿m_XKlXhopkǃ0 jjqԊƭ{Hz&UݩSTTP@W} M%חxHnz/j5'px(.7.G-4.DK jy'I_Ǿ)ԲD'qU,/ *Q8+WXٶ`+*u1V^VNa8VAbPgTzM0IQ&u_<$EymLѕ]jd2IaJJ`uPbͼF?2ZZcҪćQEvj.ʢBF3WufA^ˬ5 S-)'S;G!̛yBT]T j@?/@@}aV._YdLSp`&vY܇6 7Ν]%5E4h^辴SCEqy ūӔW^ͮmdpq+kk; e,4p<:fcNCFdQ`( <1hh U`4@N5l3--# >1w]?IYX&5{SO4Gw~ydIuMQԱfޞ\p.p6ŝΓw]nch-L.kB5oMDmhtڣUT(3hAn)x]Z DKeQT^Gb&E@U"F\kwV0#/nG~m/zu]fy|?~k[O('g-uuܠTŨh,d.EFAF@c(bYUv\`\e͵7Gf7ЯS̿W%zv=jȃ ) T*U^I+iHP9J ]B KB&6wȚ?d_z`^c#t`ɹpQ'Ѹ mѢ1 ڬA4@?r3K.$lYcBAt r}0秲x3`{YClQضsCQ:ƛՙՙ =s,b=o?ZF[v_͟?Eo%*}sQYzZuTb܏Q#iDFt_<2[SkьZӢ/ XdSnq*MᐆCw(Ģ~X dghNH/C7MaKTjQyW@>(ui: HN]GH\! cjHHLLV{w>ͱ쥳)V :~=1s4sz7!GO 4҇(4C!乏455t*(OLJ +4~Žfdk {Q5BڗEFIڶTD VV{Ρs̖+gF0[de.*۶-/D[ n+`6g^yCf׌VyVѰOFn#26$=کA6 ̠4Tyoޛ:sb+ao^^%H9}on7Sk.ٰ;_O>}x33o~GGg;w[V3Wnz¿{njm;pwGG{@zU6*vhoH8}.6%'$zʨvAi}ӥ//1RZOFWTIi =S /ʙykc*6ivh|?ajbuC}M,&[lHLj i(-MJ2jE5jZ41QIB|BT*YbcP26tYϫ2H*KX Xe(aIbdo~Ԋ˿!߿CTߟ;53=ꪖy;u}ɞN92ڂy=Xd-ts5{n5WnF2Q(gdҡ$4QV62#W KqiZ yt^^3jm娴)w 4.jٜ%HHU82xl8^mC7^KRH"FbbO1GPZzo0m3Q|uU_oS+ՌjȹJ|;#m6JZ!:d {7NdK "o$;y;sܿ7^:c~+ܻ` aIcLR( ~@ʔ0B3XӒW!d~+ 9Ja":"y%!r)oADS#G_#I@- y3}rvKFK ڵ )4t@T7hVFOg9*pت>م{#eiچwG#aC 訕ZF8;Y(9 SD`vgHe/>Km,mZ .f#B}Mjí?d,A IzZH; 55ue&{p"p+{FRӉRK.QξBi~DnJ#~Fc%/*Q JXn\x=S=/m_8ʣ-%%tCˡRT*tY(K[ׯ7*)t!LQyԌ-JRYْ)Ch@(CUel^ZEmi@u -FeH6S,~iev9|L ڟ___5p%^="1t|`<W=CXIϪ"?RC#PRd?+o+Iຒmb +WNֺʔZڐQ;tt-v7;f-͹>cdkNbn)<_Y,lOYv{VfU)\\\qehٖvl{צrkEҚ#yٱ3o̰VTZ2y]F>h^5[2JIe?uX ]CO/0;kpePZ1xe{*ڮ>м->kyW\lC쳱qqwC 덯EN%:.#d_ʆԇӪwf̮J^uy-OfR̊zͲrZ%?.?%G-ݟ<~Q_䒧eKu+eRVJY)+eRV_8Vʿ{9R*FJ;r(DiRΐr蹢^-GR~Iʿ +FɶWJ^(rRJyl'*>6Y_]JUewUƪUoWYfKuu1M\;eʯeq[g^Wn )Hټnl̺PN?wT+.O>~TRaDiCK0C9$$= VP錌GIxTTS(j6Nc,wI~ I#3%40eH0CR:Ss`7H*QQ Jr$8FÏe`,}%RO#/J0?O`O%d# g%3TWW1,_E(/¢EX+ ^E(3XŻ&w-%^]f/:7}EY*.^Uސ`_}'H0(dh8 (G`#8wJ0Lq35< p6sP1=.$% x~UQWE_ŗ*/]T]T]^t^ATURc;(?僿5KMF8 ?]P%=JNM@)'ԍ!*H<޻Mz@i!P3PE`\yv> xK < $a(+@jJ 4$a\q S;h jq4 %|L\" j!h."p{™A9pɈ杄e=K{-(cà BE>%R,Xt~t~"`j l>ҿxQАe~\m-5K>S1:I`in%H̻eVNR5ѫ{h$\zCDy2gLEz{:?.,}L&&% 78ja G:vܓ]+DYCYKu-%pUH!|3Ip0 (+Yʁ"a2sٌĩ̩ 2{䙾T CEM8#^"/~qϯO2ȑ,"h $kh4>HGHZZ)ihԴA[GMP5y=hjġVGb pf'h#\\l=vvHPn!^PW mRL)z>bȈ2epRp|~<~3;t6Kډ0f(j'G_Nx$<4CȋPG.xaK-XGv(D([D.8pCdm'GDM5nT SmH{ȟ]l$"G6Q/n$]: KG 㞰4S+qIWKNd |-%+**1C\!W'&xwt,䝞'.cbZ=C 5s]?>ˬ|.xkbrou;vǷNx1o3 ޡ kF>~ ͸~棭o{|A>]C'Z A2ry'%\|(r{v;yȵ#W։g:=rP|~w8b}'#WUb7<iS5]##@7_;C^O ^"ښ|pzrr |}~A!,k\͇p y Ns/C|' Y"gY!hd` o09{z8$؊\#͌gQ^ĴL71{ DFu FhXO +02>=k @F yvam0?܋Ea(M=Mg31X0|Rw@y撘lr# ?1I? ~_e%䏅Bu_ɌwwJR|T =KSK" hͽ7ǛX~ Ƴ3{,Ǣ\4cbrd 5pd?9 3< X +(`P\vٹA?ln.ЈKt L>Ƹ[Gr4o)D=,ۏpu a /ة86]-@&Pw!cdi⟽nqCy]pOF%81(/<;]]w 6 3~Zh |/}/oG~FI!FŨ(Q31=LLL>L3?< sO)Ű?g op({{BS Ƚ7~SM!EbEP<YU=T6U#ŨTޮ<%;FRjb `UǪc6 ǩ{c{ՏOkohO@Z$3 y^non8r'H;ŝχG1m_Y?O}@/ RyY5Kx5Q͎ endstream endobj 259 0 obj [ 0[ 750] 3[ 278] 9[ 667 191] 13[ 389] 15[ 278 333 278 278 556 556 556 556] 25[ 556] 28[ 556 278] 31[ 584 584 584] 36[ 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667] 53[ 722 667 611 722 667 944] 60[ 667] 66[ 556] 68[ 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556] 85[ 333 500 278 556 500 722 500 500] 105[ 556] 138[ 737] 158[ 365] 179[ 333 333] ] endobj 260 0 obj [ 278 0 0 0 0 0 667 191 0 0 389 0 278 333 278 278 556 556 556 556 0 0 556 0 0 556 278 0 584 584 584 0 0 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 0 722 667 611 722 667 944 0 667 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 0 333 500 278 556 500 722 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737 0 0 0 0 0 0 0 0 0 0 0 365 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556] endobj 261 0 obj <> stream xSn0> HRCʡ5ؤHA9k> stream x| xUյ: IpIeB& 2AfPj!xPID75mVѶB[JUVӫ"90%ݵkpC EC+edur:2eʗR=hI"mT }7s7Q%K]4䑎D}Dm.__JŠU%mAOAs;0h^l Dc;/\RQqdMgQEU˵mF9)?-._TuxtNRj/XdrmD| _z}~L4um}uO{͎7K㽞}*Rg!x#DzjD1Cyij(2I#4VPXM[Cy( ɦZjSWG?Iô*~_CYW?4MQzF)٤XAK3R)YRTH(Ja̠bJ=c֕}t= !΋E;`(îʁiGڃe,r]FdZb̰΢CvCi;Q'ig6!AW l h1ច|;³&{=_ }WeQd`āZv VZ$rV!~4%܉R^>vgA3v#4j< @PhDonta6j@IUZO$uq4$m`^IW4=~ eYAڦ}ECwW3o(Ct+lA y騿?@:O7ߎqӀ`!3yܕMC}@x'ep~*pG3HzTB$IL+8À @/MW a0Y [xsf,I1. ,xs92P! 2{i<9r(;aZDkG+Yf?r>tDX[9AqKY_P/Bt.Dem4N_N{i9i1ah4{b,~Sνc:]?^#}uC9l1eqc/t^ce=V>"xӕMJbL%z6 3i~="ԨXP20{e֣kk6`X/VbI6: bg;~* 8qns ehڑb>"}"Ƃ3 &j?C?ZVjo^X/FLÚʔÌK<ֱ<=2b z퉟Q@O|sGzzE؝阻w!ۄB8Ͷ <_<g;l~#ڮ]ҏO00Z :XHG m5~;gP۞\6k4[6 z҂hؖMpoR}lZAޠHc|ݐʕPޣRmj:tx>|a:pN@ 1-!>ßh'|FL#O'T6MQ^`&jWЍn:q~r@rz.U(0~0a[Mopp= djk |ebӣAHX0oݐ70YO~21;xv>rmygm weAg(ǩ# t Dkǵ5fÑ돶R=θeGi hOa@ >gq͍ ;/G_ץdCFÎ<*ZIt `t?" wSov-CDgzazmvežyiv3/}`>`=?_nBNx/4/"F#CKY*g2yؽdg+Խpƿ5vfv?`.`b{b<¡YgaSe;mY(ؿ ;up(l+vqf`~x/FnU-@ $Vi|N1az kW4ֺFݯA_+Κstl+kڿCbM͒… p?Z~5:|W: be1b}^j}\6`rxh;Q>~|g5oi r=X?g_oę^E{ڊ{XCs:lAϕ_`0;C - ֆr,ϧx2S8?G~,F=Uh]M-kYyC["o%xoMi%M~YWyM<e&4e6oMz|_s(k|+oi"=5К>ES[sdwkՀc7/N]藳Ͼ3{cf\UJ?Gq?gLHst1 dP @Zkȷо73W5#zĹC`^cw :.4;Ĺu/}:nh/Ƌ6\~'6\ʴ ymC~-r ƮM+w>*TP iPX c^tsfOa+.QP()Dn 2Ю0 .pF)ΡJul/GsyHgbD4 3MuC'p9n <<|\(݅PxO7qrn & ? s7"|Lr|@?a@$@'B~@IO_~{e+G:=p-'֔f4>#w6}v]nYg~;A_t;u=[# ڼ7mhNnlS?tZ3a|n\V^3ʈVw챩~3M:kRߣB+e:ܨX la/$CS4[_LySBߢq/Yo͡EWR < ~FŤ =X׷ fɻΔ^%iqs"0.Ի*<}|ߨKD-i2lSwC>_|L<_a:wJ$qأ+Dtm7h ;5]W˾Ok)Ө4gn~N8<v}cŽ<Q ouVm8vTȦg3=~/ia)}O|'DT$C=iB4͸GCtJTi8ٿ􏇝ռcCC|v|K|wS*34XN; 7{ng~Y:}1!9# fIg+VI>'oYGof1G u TurLXs#p}Nɡu ڲm$tR4By ϰh/ [o#bO{'.sHQS4ALk-3m.y<禗w7XKĚ|zоhx7_xA|]ȾWuYat Ns?~,DQtYf}%Itmh圽p} Ԯ-4$ٰNxC="2"Ugb yxw}Nu!~h+h:h@@މ`sqx!;`owϓ: =LobaLH3[(S%_aH!No"yo*ЮBpc z*}Z5e4 ClŰ9N밦E_#%X&cڤ-8!x7I4$} ab/t>f t (J62 O{D$|l}} x G8w@㪏} 7OZ#ey |>t}({8D6C1Rnvs96,BFJIu29Q7&= PQ]G_p2my[tcȼq??AGlri~ESH&4us٫mDya(˜dUh eB3(hg[rD?]2R@bb5?m>}- iw1/߷>̂M&ey@hh]T_p,1uy/NP{.Nj;}XFؗ~Vz~NfNa ܭ]o[}ʛVӘ{ g,dm_2QW~ }_juɾc*βz3%s!þ.2==Azlđ懹^ =8:(7QqqC^Qd@~xer)}(=⩢G ӛ!CG( =@y5XcnqY֜t"  [g hCiq 13o&=%ޠ\eݨ<`mW)Yy:w1ve0@83P3e֚?Ev<^Aw #ī/PO"wK{/kZRKMݫB:x۴M<-.]59q* tC |M!Nk۶P7h2zC7<30Ѝ|v'h/*J ʋ#j͹hM.0R5!OVJ?x|66w\/.@Ot߯3("bߛIwa8=@&h6xW!|]4%.򻂈s?@G,oPϭoLO[9H;cmL3*[N_J{ }`P7@[-yg\+1Z臁c|fuԏ!=XЯݔ3(o* 1}υlsE}W/,U|o ϱZ[]gXk0w~Q;&~c16IjT4Ok^ӵWrjǀe*!/b{Dmc~Kd:8ߖN;~y*19{Z>qU*'O'|7;oViM$F>q(RVڋ!>&Z>0a#i4]MF)H蠒Vݪ7}_W_/×[껱{|W1[.>uu ]ޓֻ?AN5U|<}䖓ϓN>~CI-Qtb(@_F5FUFUTl}azmڶi!c I]vKti={޷_Y/|!C 1rlʡNxŤ+'O:mzь%WͺeV$ۮ?^M|]\c?h!WZ.Yh^[]53_9iLQ#G 6t/9 }zꙖ=ŗܭkĄΝ:wmծm4tMUoL+ iq_򰀲A-}e"elv̶SfR*14___|5kPJý>_ ~*W=dw *e` sey(Md?*__lgKNP;SLysR+%Tr+s F$+ A7[Ck}u}5МYAhznzs׆&i| j}mScSe ZP(@ЉP8B>n n_?C2 Mb HSoLOL>h|_`z?%8:_Rץ޸?!ۗ2_ߺvEEKGvᎪPp05Գ s*|؏6 Ꮺ!d)Q+X- p4Rc Iːrb|Md9 w0==ا'c G РKc| >-/OI^ېMs L)>TO%Ac;1ESĄ!zB1 */]eO0ؗ(};az ?$']b-I.5IY)nSg lx!"Dcٟ%))s ҜM?{m Kq5@izq/7HEka$egIoI]~}  P(oj}1A92GpCkJWsa9&#-d')18wmIpN?_\ )rR)ίRVZ|0+ۚ@\A r(kUHt0F"@+a^'L+Je*hl'0Vc%S{1He#:xgG=<{:ZEpP=B!pRF+Iu(snPjg'%M)kjBa5x(B)r5-CB1L/n&Lrd䐤Ȱhg *ln]p>hk$]J~蕊'G)}`'mRD- ߅uHڮGm8+[*W "]?Vi@)1%ؕ+|եDN6 N8U&c%5/S' (W"_e a`"%,/$@pǧH=}k[z熼 (m5)\XJRm`n >Ld(ò36XSQތ#9vB`˩ٸeM-NPP7'X3WV+Q|AW _zcݞP iK1IƳ #R9!򋿴=!oI+JFDp#.=vHn2T (<#u<7RĹ1e?&9fgCH@R55`섩W%cM_5֗ԕtSovMnzOZo: ZZ l|V~*8C|xhxc4[|OX ֥ޗ3 hB։>,@Pk'  ",nEL֩SZA_%w»fMbӼvav96צY5L#eQFvK񩨿hEdڦSP5Sdk{emmtR4USÚR߮}֘HR?XJV~jǨjuL.=4.~nSOrs4h^>L$~2l`+|xԿ3F=!AN2O RQBg&\oo?uP83#9U::%IGlǬDa!Qhi ԺקfB:׏ܠߗm |j~|d X p8ۀ )g S_^  xQMZ}ZNQuB(+ V}^З@P-ƴAy3«9=?zBƲ,' ''xܠF'q8*L1 8&3ZnSVb &J%Q|EC!]DOO╉W ŧDq[}`C?e8fY V[n-YnmU7<>LjG΃ l,Iv_J|:V}ˢV_->fi 3{P{_W+_bK߱QZ–m Uap8@hcWk~V X:$:5j O -6ᘇUiT){PQ$ylO4ˏ-҉ˢ0O &K5`H !y%ΦStfIgtQ9jU:DH VW(˵׻QAGM΍cƏ1-'f1[.ϊ?!ke%c&h)Jq-e1-؟O>[[ ]&LB5##!/+}x\wUylì7lF2\xgh1f3FԵixcZ~Ɏb?⨑G|5sFՍBGCC+HPOJe׏דl .[x`py_? $ML;L6dgk0frF9jf0-4A> ҉OAR{ d6Wa| | F>0gΈHچ͚ʎfdiF˃w0i]֜-FSYЬQ&:T:*kȺcKʮkc\%cbl6貟.cݣ\el26hu6X}:2 ȶ3ЏRА~Qt]cŔ5Eĺ8uh.3;Lvy.Y#HdҦ3jķ ?شd)#x"4_բٴ1-yǴTa{Pu[RːT8*?h!zY[%k듀KL 6P4q-1(j CX1[T l4H=akN%K$-$ēHS$FH/ŖhjL< p @,, T[8Ѳ^W0F$qd 5j]GItƇ;q˗͏YIFM&B0 "> 9B F' (Yr l$QH4ʧI'N"Wd%Y˝çdbƒE!9L%IA#x1t2 ?AL%N < *ҌOdWC|n D!<&pFp9 zxKBH=GvP iHwq7CxEɫC0 /42܈i'\gU )& rI,"!ow ~K &HP "[z?^+ ČtyQA>t(t}[Lt8 fHqQ==˿(f͸#a+$-ȸ 4>'NJ3q/CE-ؠn n7U~0'\#G:(B ?6#Q/L"c@| rQd5Y@to l~.Ba"WCovh'ޅ~ ]7 c%,}/ `J}di"wa.᠖dQ+QLEv(\5xsnFb^棌OB-.NQ2W0jBcȔ\rG2 q/l%{am^r'Fl,@ 7M:v!_2 MxRrw԰;mv*/ ?N-`N\' ȼBRC%̔"-.^2/#";Zg#ȯ'Qwكr%>Q h%JQSA⻀DrǑr'\쩼ETYSI\lPafcN>N\Q# ' -Hh';ZF&~J(}E5*E~_)("U=Wy0R"os!B9_I4o UGGV.K@IoЁRTmT⩪J,*(TgV+-v~QIɳga!QcW=ىkƵel Hwm%B4-1 A4^tG4XzGOGuʖTZi< ː B$UMK"f%rWh @ܹb-V9: 6p_*pƿsċ]lT3$aaߛ7}e@DsD+$荒5$#[$mV9fuiөkq!sxdh5lw=lv4qDbf, zxnbp:VeYE#GerYVԘwyiW(VS(}-ocHw[^bLI&r m(|O9> 7z;\vG"z[bDvoX(IzP3UŶHqqQ5Ur۳JҐcؙŅ!.!{h}o &C'=6cӓ17`vXƳ=}{ji,`2}c| oG@;p.Rpn@P "lm=(#㭥Ma&#[EaX 7pS-y.;ˋrs_. d4 ;xԤEJ*Ga \T 5Ja io>I[}un0WOddKݤRc*)=]ڷjsW7G֛;`7L~Yٜٙh -e({~ )4a68B򒜢R\4Q` LFp$D ,ZȋZ,zTABr/̕QGB^nZBO2dAx[4qPOs\n KKja R8cu%''Nm<$5t8KonX~z2g*.068sIo|x #9pjk-շkh|inxdʆ+{\M-+`kYuc/A\sömt.eGOIxAqbU#=twkw"讶̗JEv{ gfiɤ)A&Q.kݫWޫkj%"8 cdj 7 Հ5kyPl@N~fafS\f  3$!UYq sZmz,pO~1 L\B7U+]Eeƣdpq 3+3 lC~rP -{jǦ릌|ʧSazGM<7^;ixcɯjZkKMoaS7Ԓ_m^:X `D54Arbb\.+xE7LWքh fg˩62^뢛ܫte] }zKv|b:j7O j/-Lа_ u2A+ƙYYP;[Y_sGodt~nyUcO9&vN~c -OUj$JUADy1ZBvj~UzgUjCL{EV:S!$4Nbt6۬RJpA^>Y2STU]^AZ-% 'P={rBz{~|nӎc WgO+Tod_fd77_lW:+ߵ[,Z]U@'Zt^%fZ0>=XKrTp*r:>lV8?cӔwBc YO}/x Aob6K*ӹm${U{U6 FB?vU'^Bܜp/]>4kdŠBd"ph14 EPA`+F+YtY :1_&v4HQQA)QwskW.nCjn*kI*܎ ؒg.0fC7MܚZZ:Br~$Q{54HwsR骬$Я=$\:EE,ɶ;+@7J![Xc7<{cwVNb & _D2UZ8$ ˥!5d:Yyh٥.[5#$$܀/kVj6TXi6T5HDS%$(I%,Q.1UjPH[-b0MnAo S9:Aف},!煄!glؘvP5kvۮ0klUBKպdDù߻#Vط7su/Mo?b'<~=E C#̌ +OU )jTŐE/QP-NC+VSǿă(1h5}"תUcWƮf]ZjciܗnTkNf6AAf< $TEcbG$N`g0Tl(EU`3ZWi*4x(*R)bcs[a+/>3P-!4Ꙙ*n'LVrA+ ~ob+G1v`ym1 :IcHO1l6M-VjD[qh0F:<?5j6ML=T*^IoI7L Lmmm潘nzxNE'g|/]KGMKq_j`Ibm@MkG .P2ct UNJӣ[jBZςӿt1(/C 9 +YUU|JW/ USJ^Qj^IMsBjr}sN;C2dg͌c"6CoQxJug?뛽;} 8b.ן?p`x|b_sfBNλ#p0yT&2@nA,~!\+g&OA aP 3.aѠElUUhq1ݧӶ T%Gd~u./7εPipv-q796zKc1`?Pn29y;wJT=b' z [3`k\A`tCR>IMav0U_:̞oByk9`g[g D$sE=]LGM VeV!ȡt"1uELŠX,\>yϩqO($*HɨAYo5`$pm{`l}oڳs}+vUI164ϴ˴IY~lI$`$|s2&Öc:M&rGfJ )3gHTZ\PʒU"5Jmd(;JUhgu=C;Qجߙ%f*)*/WZ+* yj'ia*N+́QĀ0ä+Lc+Lj”r`E5ө>2z1.):\bS'l)(Pl-vfY9+=k蓿<}=V ӟ]Ө,@ސkSv9/60fzNU I4[x8t CNWVW:̣0FzR:̳-h;S,p.Fճ(Fz4췹lEv}PhbCٺ§ fKʼnCP-׈!S͉:w.|IB?9\[Х@Sjrkj|<.9͉v3W},gxUd)w?l9ZZ cf7ZNFu*oX[9UXh4)Αi#Sl l]mvpnon}{.d{P,yY-u0¹fh1SH]#?}'IGµ]<|neQmSj؏Z6*T=ݽȽͻ$RCSZ v1Qگ-:%le_~NN`"zssYP4]i9:o`k<%^GS+h&+\婢7Ѣ&QbܯLbUʘG^~l qA,{gͧ'7~y=e5[nY3.Ϗ77VY3b߾~+`o~O=+K3^jS2:^F)B $7qeRyMEj+S Ec4sR٩Qce[,a E!ڢrOZkzѹ$::G D,jEPKn/Dߓ}OsU59SzЩ:s۠7SF30ɥ^{<*5R&{@f|/J5,` 5;I#emH|M-xlԂG-h@z]e-vGmW5@Ý ? ~>]~u x Cn6~|>ްOXS?0aޚg_s%^K}L$Nzp@mE~YcKf5a%/:sN[WU3=ݳ,  K Ypd\,.qcj 0Srb"z((sNU􀾘誯-o9\FL*&͗sXFILzia$&ޓ5P@e(A׻U3] \(^2.~˷ sC+enHݑx0lgC/SC6иڋxX'| xk&V~YyOhe/ )E)`m[_ ZO <-jY6>3D t5t;j*>J%Xr8@8 QpTM<3X-f+aQ_)t:޹\wkso<}>{ sk/;wKx0?绞5=Գa~al9$xA|3ʰn[sXA|a)u>" $ۇ95:(Uʏ{'# 4-mBy,(.+yYeL#\3K/&x*zv ,`y|ӅBw c/q<oP4M'7˙,muS/\:98 ; vl62$ c"LSW nC3 L>rEbz4A 6´VWG 荾< ]dWq,OGbzXAbBPbY GW8&&:<86V Փ<9 0`E:CCgpNC|HxߘDgbb˳C9̱Äi3`X3mD0gBoo_&"·U-ʙ0]ߏ-K tءdƣ2Fi2Zm$vY*O5eT*L>?|Iq~%^ }!RlӲޗ4Y-!-i$2Kp:}<piL?Du(DhdαO]ȋ0?3:{%%-g% =+Κ`iD/Is,Q:\Cx3G_ Tt+Y.J$l!/o9|(/=w e/&^BaM(t P~ǒF`EÇ5O8H0)z7{Ojc}Ϟ՜;cr͉;O1!Q1p:q7 -"ߋFRQd6ۢ ӃEK%X+@#@f7?FnDZd{;V>bY6i=Œ̮%UZVbt/]-~! ER G''>H$D]]m-SRTH)FT^-U*x@>'Jy*z|%^Րu>hJ%sU|JY%Ɔk<) { D[;"QJucTjw*22E \s?IE8{oPx|I_)ŤceU϶ÈԉaQA TQ^ ԁa5867V-Z|˺ٝNiSHO`Iλwm~Ņ?XR- FsТiLP^:kH]hUؓzq!LpS|b'Ti.ÑF"^~,ԭR5f]It-0;:A``A3&fKZ%di葬>@qBE+it&MfޠA.I`Ljm"1pcIڂ4Kɀq[&?Z3 1ur:GيJ<&V%`g3 XݻOGzLg0l+y-;tB8_#0ko 'kg5/aX}x\l%$NH1xZTF#2Z䓨JH2#T[ ͔NȂJOO* J> Ѥ#&]cFqAENdEFb+22⃡@B|S&"@H6S 팭/1Y\- !+XǪR nk#?lbY޵SZ~M_s;g~?枟^аi)>su Cp*a( bɐRBaDxԠX |W*30f-VM?wZ<Ök9z$KF3'RqbCaM;i X,6cLt&\.?Z(w_H}[v_~x{ps^6Xս?F,l9晷='Uce)lˉSaIM,JHcoe(s*"CDA,mmbRxRE` P@F+P<)(:5AœœőmJekHjmƎodr+ XSّ&S0F2U[#"BNڤ,H]+<ql*owC~i&sZiz< .#&&jnuGS9qS;AOu6b iO{*mSjlrG8Zg_QK>s4)ɭ^ాcy̰ʹ23GJ9dl"ycm8A'طۋysvH-׾bes!"}:.lۣJn`>]@"XW+۴L^V[!FĺلOT$ҠKiY&&x{q pp.9bBKAo[ G9f(_|LVUˣlt+ڏNSWíep`?9طY2k[RM(I6wYEwϒ})B{(ΪSE)=DNa ɒ(se8 [$>,3dV-2 `^8cfnrErL!$7 H腷v}®II!hI'dhnaQ&fH' Gh b39r  fȓ#]IX{c7tI4tI"l`vgxg4ۘR9h%x+{=!L<ʊ,kdHUa2-MO+V2 IbG@[lN>>q[Ч#8 UMs|@(XNR 2N N Z;>Fnb/Md/iffmMN PvցυxDO|ܗ&Sw6/ђ 3^3W'#/(M|*(EL%y31lrBp;ʛ^|zo2~m̿ @ (?r2l?uSDм4g3sVQؐ3ሓ/ 7wYiq'ʡ Sb> pϱ9}?٪P])MOL+R6bFMc vtN._- ^.s:D@,C:Gijl$q,D$Ԥ#!S ypA2!H!B+XQA+G={!h/_X֥<1Jyb*(n*RW%BOJvP_յ Mh#$TR$_FgB[}Rd&3(FTI t5V>'K/lS;pY 6b?| ˬ^7ww٭@'?Oz|o!”<,E蒎E2VSD趒$@щuP=Bw.+քGʫL򼴺p>w_47=yݞ*}zʼe%+noT{Dg`[4}>U0 ɼEqI cD]Eu]Nf.fRE$bbm,Diaޛ{4k.YUGIsVlRAg9jp썟d;gW]G"/3ƙ8! auDbѬ]5plG|ǷJQ (|ur}u'fá֖6{k_R3́g]6{xjoײַ>5]ZUy֕`k*Bq5_L 3M=+&S]W. x w2zVTWh.)c+#C5m U %4)e+Vڅykn@#<"QA9!<"$S9P5ZVѾUS;m*h #(jn0\Uu+ZܮiR㪻|n<<阔iYl4m50^҆'@ R.1\J$BB'R69 ο=R.UR"ȃr|1:=D $A+X`O$f/Jk|ӥ!CSvo)ԂZ;uΪ%CU6֐ROX^7H[$!< `󈡈tB4V=OFKdџːյ2G 0]%<ߦg7? ?{-`qٝO[5y1O.Ջ&4wfc5]u囫F`T0`y {U_Vx *L`acJpUWi''}ln][v^t^Cy=dr'=Bks \Sw3"O&A itM]sڦMǾ {s*xҾ9qȆzX;^N=}Td ;/8@BK4"zXVI?p"zK@2 BC!(MS/!'y=ݑ Sf =sAzO'3b"C!xaB y۳83mvm4xVhd([M7nɟS4o+۾VHM%w$*0oXL.GR9V!!qq Hmr@^v?wT=+#䘗-"ݜҫa(k[O#K$w>qdAe=T%׫#zuzDUj YН!Uy h!~,II "`\BN_iRfDiBj"׋9|G!䈙Z98[vqG8녷u) 68d Ϊ2ȄVt; ?J ;1@ެk٣뢒_ʣ2y`p(zS@ lpb7RV>enn q \E?3k;ER/ɛo u"s#yJɤH>}EX=mviIV:eFc_5:29ݜf6X#>hFH͠[4 &u27Y<;OH4xwz]Iv )'8ɳ0%D8 Xdl~$MԀ߲ Gp\1$٫IvGP Gv0NH X$%&-S0 ӒT1|1$E OkXi2b,%p6; p$F{[!"h) '+GwFŷ8%>tŒ,oxTYLU9*P_+ΟSMp ]d@5+sLڍhkm21LR玮][xotHޯAͬ(~?̿Q-ؖODnlnmrǟt-4Y~4F c+|fA w/6M#Aîk3 B jc4V+飬1~򓚴E6[}q^J*I}5ZiVQ5'S'!yJ~,d//U +kE6\m]]#e{/ٽ~1~T*"bU!\UT&0"ɓ['3P.B'Qo _lF}LWAMA_Vo@$Ige5-"^ЯiʈAĚTmb;6{R^/ zw=I-ݶji dI&NO9(ѿ\& jnI#,)9'Y +GYdz~gǒٿXϒ.$>MV(|(a RH] Uԩ)M5+2 T1BAL bm+N L5T[ 0<1ϭ9 T3GR# --}_CeD_Ur Pp.Q1QhEA IT TVX@tg}EXQ$9|^"x&J;]VǶ 67l$oPu~ o,b\x/ Kp0sJ*(dHj4+F@w~Ձ{j|_®X 5SDIRD23g'l =g 4.j6:8&>nZ]N]-[0bvk탡bjIg}wwk! ?,kpf(f,\ kʲa3EUjuuӄ¨l 7ڒz}NTйGH鹐mC2Q;@<:O-Ӯ#{mk8R&˧͊()! 3Zn(AJDcHWE^2%Q=;$3$! &栲(J@d*H "*j\j-U\qKk˒Zs[*U^^BGLsΙ9@f3sf9K+%Q^ɓ@ Y#yRIOD$DgT*py?:N_֍Pu|my%vcm1A@1D<&uFB<Ñ5.i+VԜ [uH 2ּ!(O=RM2nhbaq)b ŮCxsYp(7?~"TojΜBziQX: Z.h4Pv7*>o4Bk^΅/._:;o~|)r/cWz]d]]skfu-/ןrxӝ{8 }А6.h3n&{:&K&UE۰oCjdlЙL.ݚ>+,.O uF;GO=FObqvq}`}uoloC_ľH|\/3Idf9<2|c&w51S5#:UI*N9YI rS+{d*@SXgL5Ľţ~._6+ ؐV FDŽ˄[KV+eE+nD[ACKM"GafPF "hh" w#"p7&YVk2C DQV¸~xm?f MwA˧k. =dSP ˧@;ȧᇽ&T3X7gobC3_ZB~vCnw߸q~~ʜv]X9z#I_bþu/-O>aExh~ ">gR˰>c"Ӭ k-E0ɵ`zuH_@mTI:;6;4; c̏ͧ%"f1wLӞQH[-UU?=wqqnt:,E}aJ C*Ƨ ϕРF"\Z#nT^)fru<~FwW gKg04`$ֹ/#>kG<]Sw (#t C5L@,-T۫夋ˆgN,"A)#ndߌEٳ\fعecjc aqX z|46.'`C禪/wz/+!q~݋BĶFUH~k6OdI"F'Lymlt"=^NO֦MK.ihD#"`QXTb3I%*8VD7T2FIU-_2 BX > UT\jD|Y`9kdaY m-HIt_gmN`]aexK 岭%;/NpWGˆ0B#8궙9I"!*Fxm~s"AIjS;O"Edŕ`Lcf/ Y|XUTضQCZ2Czw umy1;3(ֲ>46olg3OL9iC(PXji`h$,4Z0h?~ QMr!]uvzNt* TT8kF iKMg!Ɣِ'7Y/h6D[j qjg.?]ʛ,GS(m5 8ݰZ{Ͼ⫆0a?9.uk]2͉q ',c'0g2V%jjexGBV 9l1_K1 O= ыL: %"EjxW%ɋz+ {_]m,ƿ}RO/T uɔ+"ZAqxǍm/ SS)TDl4,BPr4DJ NX[7٨>J]+ϟ:svf~`)߲*OYpŃ_Yóϰ X{?@QpRLRUI 7v()S%bZ>3ϯ_״IP3aLWeJ1\4fpe͕c45?X/Xl7 4CX:fvN04vuK yr.Hk`q:%!3bl&B1B"g"{VO .%L`y, yTK*Pϐ!3CJ+n#c`3Fэm<_[2@IvF?\e4(6!ʩ8"Yz#3@A9JЋ{hzR^lak/(CQ4s՟Ǟ}sus'gZkQ|ؽLۃKZbB(^ߑ8g_`3 /EbhVe9!({F p6N}I-HN넶 J( L`x Hp$O:LD]Y$$}t+t̀XۄQzYt}tct$FDaQ> ncO0 FfGfF[91fߧh9: wtFdx-M#ʇrB9Py54K0PE2b$U)7$m.2Ukk+5}%3Ӊ=O.X{nډ}!:Ig;%в.XP Ĥ:0\f}zD+O(P\fuww}BDL+ hk/I}I륍ҠtX()#-ǽI#'4#ΑAK9yQzv#;cA0KSl݃X֍3s2jLNJX ۱3n9L &lU  YLCImce'ؑ0ʝF#1K700~{[w|/E<9< M~ѽ.{t}B-]-V_O>yertb" ,K\BB3a8EܓZ' /-cb1,SPFRt:x]R TCJ%A!rDI¿z!&I~R]OLwjm]k..Fh)$BrW %MW#- %x޽BRG67!>au#粟W=0;W/X^?"cݒz9+}S,?[68NĻ. _I(H>U!Ӂ92m$w${x?+gxT ?MҺ\bat;{ :{~SĈ-ð4#D!b!`XxBHYP2ıɉd+ÎTgcEU^>e8Zt!lkwQXRЉSAR.H &@fALhRn{[)*h`;Ai[E1 B<,Ʉ))u^Xg!%tIZ1e axa%X r[anG=q?TiDCZ)^XB)8R|)E 7,r)T"cl j+Es'åC!(SPDH3 N`DPQsڏqB쯻r;_؎VhT &Ci (. M& j8TV`j":)'D֥ 1|5&7/]Ƕ0-41 S-,^H7\//<D3.?]z<=yժ? ^Q DYBÇ_B!%A-&zY16^dMWQ.XzمM|<8x JoU@)9`0ߊ򒜲<6++Wfĉ|M6~8N/o8CF>E}nvW$ouOp]zxбOtg`@uf;;ꍢc]*l$Y:SȐm^/1RQ\ gKq~N^~>KkO4%n|{de>t#}Mz:g [EhHk>2Lq"Tް9N姉%~x H̉ds==:9>/]h= qI 7s%EE%R**y*Ҭ`a { 2@r,)݄8S<^OAf< =_h' J0rKJ!}L>5KqTjge&dC&Ā(JVH2Nd(+0 3Pxa*8zba]q4\xQ$2*z1-= Y]"OogN)k1A͢â0L1ì}z޷gM6cgVų+n4{۳f=8S8q]osʹE>5&FYE1~:=E"]u뫹P[9١٩+CWTUÿk~79ǫSy"}O񏣟&>I}Mɴ"|8bV(nF2TBI@4cg~1 oC `HA=J`Цh|9qp+Yr'T48 %!hª^T?G:O=`ה$2=5LMyypkOռg6Ex 4 zcg3ܵ{N{(~s`Jszs,eس ,Q%-dIňHa@R:l܉ȃWǼ?+`8 G٬n؛fS_~rLq?E2V챞'ؖT3dЎtSq7 CZD錱;UfٺJc.e*DwĆo$2%L :2fp`pdw h)d"vG۠]"4v~**XBOE6=V$Q2pBHNG"&QΉ,d"K>] Ȼ$WsҗTi߷%ݱ5CiqS}!bbKI8ƶ--tWK_ B5Tadۀ2!b9ɬ'lEibd={$0/68V}zuXR`;xh TX%)+PK0& Ұ]o[j|?=;yFEGͩ_ywH/Y~9g -箙1Lqm/a{m*$['?oU~ot#CC*;*"jBLPHl|c/(j2b) [b9*o0<6T4" eBN`)>6 x:@@4qLIR:`z1G6]}Bt~^ V|{ML`8R-K%2I[Z=GsHS6w^l x<'+D<8 D܅>67$SX E a'aۊ!CQ VTktT!ɢC@b1:l((7@GX+1iHA#|$c(6# $Ԑ<%'7&Glf+'\?  QRV#X7eHCw$! A\r'\#*;;X$YS  ojDM56qE)߂pDy`.ڭYt~ҧMe@5~207ԩf>^IRG@<-LA}30-ƸX&"*'R# :b{':d5C60HYA9$|(IK3kVh]Ҙ鵵T~ u :Cjx2/_ } $=0W/a*s$:PyFoxaʵt?Q2~0_i]zeبa+{ިU䞞Gljy;$#V*{֧ q0/#XY߹Lv0PR}0p͠F2ދ3j`4Ϊ[24r`[DBUSSSʬ%{iW[d`.]; 8*SFvLg]b=d1̄aOXDI63]m|˫ROI c)W$Em 1a!-*=OFQㅉ9T.+gSK %BVa"j?.5(Vՠ F>joeQE)Ϩ[w{ALJ+`£ɻ-y Q^Od`m tѐZж5a) CXurѺPo-V[߶dKf ý1'44 f~5fgE$YUM~#pslZ,.rB炦5M-(bx`agc̘"6:>jj W:r[F7wwz#u[NeqC =`t4tjp*c'B'+TwENk13e,>P5ژU+ol]^Gl!xfA`qd&!iH "l.> 4{6 a6S;×Xx,qkd_ey+ _VjvSґf ?!C(/L=|?cၝϏ#V?oA_?蛻諏Woz7j lo9L3ZEze W@HYZi^Kh.jzm\F131!C1G 7 oD;LHhIs @Se?Mjg\<^D0 ahfMŔy6duu6 e<5* *rs;Ԝl\Kw8269LFY:׍/jqlD#NBO[ ivX )INxU(Uj._HtHN< d.$|GG#|sGC##I;aꑁ~OM78={'J7᯦;:輹=jg1<_k~nO~nvEeO j UغJ¤+|ȱYd$O7 tGCdlGs0eƵAP%;z^&c`7EsCs#EE[-֭[#h߶ ~T~Nyi&%wm*\j D,t~MZYnE0iB?E,?z^Jtv,09z( >}g\Z-@jL{ѯ0[7366j+qx?<ј=-ϖIJqS4CQe  S A _.R@z{ 8t"Z)X,rx:Gep:ja}ˆ$8BFv0uG5g>CLf^| 8, pUGy#ƘScNr#ႂ0]8zŏ,v7 ΟY g?g4*M gc֚RM9%4R 8d h;1@؎BmTRD&>._\IѣڮP*9D8pFJINڝSw@`4VG=춒 -!f$yN(/p~49t@% Ixq6a@iM%8UM'Et9XCɎ![F,tYǶG*K=j/ؽf#&xJ\#3A1:Q $9"#%GJŞL0NHfƤ:QO3f89.1b*~~8GNdeZQ EW:Gq=, MDaIeq,[  )^ {|Z^/|A{'<f2n+}',ۿopW.J"i8G@Bn‡?EvHu2 h(q6ы=r>'_QqOFSܠq;߸Yn>HA@2觘=!λ| &SqL#8؉ |짇žtH -/A&/-Kex=NbHi͓n$Vۍ pE71Xߢez#Otı6%zߎj2u~oyvQ)Op3gk++cyb=]HB'ßtNiE@5&],fO;l'c\B,&#:q^1F S !\dP k#)DĚfI\s,JFy#! %'2HO PI@³Cl[ 9b7bA5O,~d $5k*sL1&1\2o7™sPb9:bR V^LXX c\^d;OA~چ>[<1B.='y!39|.wN|!f[̠,ȧqL l+~^Ċc(}=t#**z"PzuČ :r Ƶ5=opܧ|;opo\a??~FFl4EQ F/5/VaPP z 0V bJY!&%!O\!_3L7l.;xhѬvJV#BWD!,_l,PbBm1pSHLmrQk)LVGpKlOn.Y̼^",gƓ%oi9YF <gg>ʽjG#8vnf |OiQ*d|@T 9!1FjMPԧ(*JPU>nI+O3;I8?)9(lHNW ]_8DN|I9?C3Ϥd,g~7X`'$9_n7zua1c\i<s[iDG( B :NP%$2qz"WJj|⊴6>G(J݃& N<Cb`/as 5ElC9|;p/xy lPcE&qŪ?bWΛBѵ7UUţX"T ډ^="'}+5 mi-%b(d@t)xT+˯KAtlG+>? WCqң%*zZYqJ1; /{b'UfˡI ZOuH610 T 15Џ*?Q_|>g*%(yP4Ɵf?G/P/癯^| 8}Y>[0m'!荊Q^+t$IJDEXI=ާ5%K8}2j@Gg#EꗄȰJ+n\}WV.TV>^ W)܋xAĨĤ R>dK~)9bNB-]R \ǽ? ]-$(&#S6nhݛ12i.؀/|`gj[WΘ^Un?=/_vFc/-fJHdo^Bk.M~3i-4~l-s1* \ɰҁP*XщTVPhlNbzXv#Xo$Ll]FG򚊙J7O*YXj߾z򱳧?kn1M>9$V(eL_\1mm"43$=Bq[47HDYĚ4ND##[*VS3x#B->X"pR-DK}82U%1,Υ? Y՗?^h]x @aT4CV u7#TO>w굅ŷH˜_XEXb(.t3YIy9F֚4r ܱ xk|S (!7j״ֶaSloj# \nssD9Z/^^NFWj~^( %xc~n iIWnxйsAdx~'̥ғwsx熄 P z@@)ݗ?$/'/((%DhPsG׾dZ֑nEx޼7h-{ˑ 9̿I*^,(LE/^pd.  ՝+# ;.p3NXijڽ{d/HE,IsȎfGRj-~N*QW)1rr(MԈ!D&t_5:;p?H>dSq~gpܠ=@ߙ^,)+1>N}(}?djl];,TH(yPL@39$:'!FԜ=abmq%R_ Q.Uٴu)Zڋ!\؅w*i FQR!y~ѾU7͜)%U%B]%S"^JƭnKawIHXU6z#_ <"v Fgy)&5="Z!wߥfOo0_X=WRhpW ݈>&m m7!o6tޟ/m9}  /t!o~3!^ ̰_6aii\WZ+H&WGvay /wGK F-}ђMZT;IHy2dO"S˞a'RD{Oy62f|6WMRHipq4z }eYw@Fl[qr dϱ+ KJ`WWF:C3ZQ@X\Z=,VByA޸cIt,grԡ.W%Q/[H :1V&h]4´Q]tMD 6 >C1͸h#KۏGW_U\~,zﮝܳvTݹUUwx{wW]-y7?kHua"]"uqtҸ?Q(>}g9bBפiH1o5&h7AjtE 0 R}iiѭR)bH"=;cpoAЇ} Slzn=Eh/EJt": s1dOGuC/2\ec*JPМW]Ӻa1^n|ۣflirXA{ǚp|Pm^N*Zj*`fP646-(3k2<~< -&^3P-*آF 2GQt8^IjՔdGmCS446 fCvv*vmZC=.WP?GF(W'v}̒h)NؙAPe;%8FI)V"4{6h^xDʼn#Kҫ# qwVCsUW5\3vĒo{wzm壚'fe؊r缻)z_퉹B; |Qy$Q)X@ԛԸ8RE DRJLhSJ4h_i1p.H>m_0(.F:#_ Y"xj:Ky#˳ZmˆӴZV94W9Tje-2 $&JznZIbQFۭdQ*-&Ft ;h| 1GtLu#W7jHCF@++oN|a+|"w-{l0B"3w#ƹt1^tTrM 1L]ZXخJ/\=@!DB Y(tzxV]-y`"3(ViR,S|^J:&Ke>P@ė֞7eٳqs+ ߝ@c7t=گ tcKw#,:+rTIn-9N#FJ&<8I9 ]( 1ZeqU̕ k '@9@ 2;Š…D3JEPdy}6 t8 j`jݰ(8 Z+L СݦkT[U]EV фzwz8juf4^iV b]ve R!9R7dK[Y/>ˋYal |xA`ů~ʟ/oزk[}3Gn!6K?@gc|ݤwms =At^VF;#u2C$C 3 #4aPmPCP)7I(iU5Fz͎&dרSA>!} "ϊi~ u߻G9 \}9;Oݸю: BVU^{A׮=:ɫXJZDΔJw㵹'xI<%kq|&9E-+:%OYTJ+JDHr'O#%-.IJ>$)GIÚ<"P04(ød_ (afQ 9ʫv:BvyLˌ21O9A[N5Uh3@l5ѐ49ц5V>m= 7+wO^HO:o‘W`#/א{¢;*S5MSS K}#>vg[b@[woSUv#Kx)cFJͦM)y'ä́QJ(hG>?t=y,ܒ 56lPcr+xu+uuVt(1Pwav`bȡu`ßb59#9e0vlH4šHkQ0MUt??+^WM&s8Iձl <_7{?*;nzrL[5>XH[:ϴ4&uw"TOPB:I0\),ÛxB>Ev¡IfF HlTN] 4R70o O/2ɫ߼: μ[~*9u!4s'=W׆?LjZ"6ª\H,3\P(x"eJil!Cu!ZSmOr:MSR5&v0.)vVfl`4)iM,ڷMWfodbZO -GPzCA$e A9idj^I =ą[>]񾪃uS.yA昿pag:޿qPQpf=,*ߠXQFĢ82,cev3vy9 \^1 F>/%OͧѦH<|)H#t翓'Vɺd/$2R!g ɍHa+b)fxM(R%#`WЉbBVC0t1 /\пЀ_PJN L= _/\ZQ]l0e,(ϚP4l7$A @K 6;ء)fYa,rn@3Q,lF`7[-DdMJJpZZ8^.Ü׮d6Qa"cB}ځ`rF`L~-ǧC;&z,9pA0̄,ץ=N?& .j:}V`-`kӞx-KNvMpgozwo.έ[{K« G~҃+Ýu41OubB~$RN+OT\hBkzIgMGOg L.X̙c/6Ixnhb$ks*hhl 'e)ry qI8).UIF\$P}<>FIz.4LW1_Zz4dOK=UK-<>sӆCΪ͙36 |8ktn] lL&k98#DLAMP[Цؤ X%biV;ML(BN7yQiv)SҸ 34LI+dn@+(0n37cuE=Z.6 5ZbRRK?x%ZfCFXD@6WDE?;UnD?GPEٙ$`ۦ$I4,IWO-7oAWN_uѭ!cW҉?Z]cw뽧*3^j;!VEs`ư3LyH,,W󃧦8}t"WSvip?7أBjE\:}52PIN3lFYcUgPk6 aYhԏ1jjIyr{wܽ 56>=ӿٚ+ɟr_侲A%`AkArҪ53k9e"jS 3 Τ8пzBT7{ {&Jlk}:Eޏ#G{ ,~N6K*^VcBOT>A`д4w(*O&yf{E' Tޝ}FoWgX vbcbx|k^ڊF"BzN0I~Б-iha^V" .,|U/Kd66}P"%\2u4T8ʭ[NN>ϗ~۴keؚF}7o/ }<`$YhTXMʮ5Wm޸A4 rUiqCeiVQأ~E5 )%:ۡ7kTk,oW||6~m z|ϩ^+_8n+uhSҍ929IbزI*_]<^`ul1Hy*FS9xP/rwi,+gG]6dkڼrtjEok*?NnֶT,tu'9\anl g6`v ^sDIx87 :A}G0`G'DJ`W=,c˙|ֳ37a&'˟5jV j;?*,^OfZ,慭E\xBF݆6?Xl4ΨKuf=utxLuX'%Y8' Y6 O*HVF4,sv&8K=:H!^s 0y9<sL+TO|[ %x#LFs&spKs6[NelE XثT @IRΒ|,B7ΥLfR{Jh.1l\ҏM>vVpdk.1--~9K Lݼt-&FXM}Yq$CծEM Frnz[Fʌ]-}Vz僷72jKט.è1i jLVfbR6ɬј m4ӐtXYg[%IDz@5FҷUأ%#dg0S Ku 6X8ՋbW E_?_s^OqŲ>)~#Sy&<8TyвMkyfq|j4t8vL~eV+]Pz/=_˯Lۋ :WɑM΅8۫@=oU~y /K#a_84?2dkji/NE?=@TnFcm&mzmA r[aׅ"CZ aY+M,xHiHA6 _!LFe#q l(kNsfs9)AD VhֽʭBh~V ; !{)CZXspb9V-VcھhZ-+ Z-BSb6rZj ~6a㐍+ص+}Xw 74r+_N|\,ҼL]~}GerfPVC GW׊gn?ްCKa ڙt{tJB脼Wu '^Yun.ՖLt.^@xt^ʹ>g2nֹv&ꝥFK}wstUL9w,XVddauon~gHy*f!=ٟ[pd/_RVX>!^62)XFŏ$?%= vZOmiD6' 6DO-Jz x"1O乤'ccF%2_Y*;w)Š+W)WeW=z_cXPVӾaxٸi}lsK̻n eL=y#N2ǻ_w0M\+se\riA5G}w~|5CacjM#'dCS(| +2Bd5$ʰV(eX+$M0F 2L sKS(|NH\ZFMeX_o*Is瀖. y[dAX V305hyC%JC t(|JI,PUh8 K:`IO3g6f72XRFa`#^` 6d2Jl63?ςK\N_BKRKr/Qu(CS(jV]`zuC(""ԍ;/B]pz(p7 ^4 5 {&t)=xD~4ah$I+Q5@EɻZ`<C@ t(CƠNѤLT~&G1]h%C u3M̖Q% ha;V3 5Tg1#S(!D=(Rw0|{.0*QGQ 3 BI LWѤ<y:kϜQ|R?R+I}P;eʘCQb-cPCeaa-~6z:#;bTz8{x 3)%y}Fc)SI]i]y>~a6σNq-x{7fCk {^l*3J6Ԙ2{T Vòܗ_sݟ`HR( ."iM]?$ַZQ; jb5Ny Z6]+ԶBM1ۋ:'p 7׎DvOB.EǶAF .{v6 j«Yu(iD>(&8[w.!n'Gܕ]洅b8WG0%n .8eY~T?j#_'Z:73[{s5F2I{dQi;݌TV1iVZ^?sċ+l ^|-u\71[VlKbX&qoCڙJ'Sѝ‰D6W2G$,~җj՛I*jľ1. Ŧ^qU(E1(X.?:.oz}w8` M@h?"S:F+"!܁Fv@XPD)1T "Jp?2Eb44/_lA7"ƨ>? Fb^RFG"0xcn Z!c;CONANd$nFLmye 봮/)5GnDWh#c;{ܱ{Lƨ*IAN?H cЄ8'@(c!q$uǼ㏆AZG~bbnxi34# G)8o$;H31sW`I&@&?8PJp dӸLMFިfI\L%~SF@ Bnl%U8! ׉X\b>c@xFa 3z=u,_(1UQ5Ls%cX,<ws`^QEszKG'UDU c=*gf'ʼxah 8D_f&xȘ;2 2S0\ Ì RY4Ig2FC0sxB#`4L 8KZW'ϕ2<^$;\8鏍wsFO4m+"T&!<~e O@16aQZ){ HXG˲*Mx )MYӌɱHD$xO.ew$p?k\=MY ),<)rSt R {g\wJ>g&4?Mtu}-6+78[Z^/vξ>zZ6bKFq! z{n\l:gתVgjq% 3uKksۖNgF8islq=6 h].ҶBضnގNFw1Vult9WwݝmP 8kY&Vu89֖u-بnbd:Xk]TU]}.ugoClq9{B]݀Ft3$0MBU-βtm3t^:8s95!G ۋ )vw[Jۓxc= ?szz4w>w>w?.=/;obK֛;s;s;s;s8ϝ>wOhg}}=efkDUzga./krCo7D>Kj ߏtaoQ](FGaw }–x!wCtǂ-CI=v >@nD$GWȝ#1 ' ௓w~|ps\8jn-5"};y8 E1')x7|++|TQZqE-uF)[V)S.e/}~7(TQy1'RN[y-"ʃ_<a7V}K-ĩQ[QT_8jNW}௩9?F$4 ‚V#NHJ.^"|~?.SDgM,Կ-s‡I y??1auG9Dtو7<4x㈤=a!`APh(Bذj M7~ o[=yG9g6FqFQQij@UF6#x4ZMoMҏ"~{Y?H l}м ܧkՠg&5ȢvGSK=+F:/ 5ޯ>A!X}Rld!T+Jf??Iݓ@T׃&TZ endstream endobj 263 0 obj [ 0[ 750] 3[ 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556] 36[ 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278] 66[ 556] 68[ 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334] 131[ 400] 138[ 737 737] 141[ 333] 148[ 549] 177[ 556 1000 333 333 222 222] 534[ 500] ] endobj 264 0 obj [ 278 278 355 556 0 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 0 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737 0 0 0 0 737 0 400 0 0 0 333] endobj 265 0 obj <> stream x]Mk0sͪK"<6P|-t 󾓙SAf5(r' $w;ś̛̐mq8wjԤ!{ #٫h՘oQ9IӀzfY;mGS|lf25!s O>J˗5٠.^UDOTE*U4cWn_(9) {MWkqq0Txۿ&Y^ endstream endobj 266 0 obj <> stream x} |TEͽMӝ& !"a5A" 7l# qTGG"QAA qG|.߈;| uAy37Ӟ{VթSN!"SEon'bPۼʖ{y*\y>QS4KܗMTiW\{ɾUD Z֖'[wG_Gc"aMj>a\~ͼg%"% Zj|b"W-״ߞ*'B_uyԥ˽BwU˕'p}ےe˃KO]&MQ]Q$j~-v/W%B_YY O<5h'е SN'O\m3-am5?v0ة03shRȢH2CRz. Ge.H`?]sgNϕ7(x׉A,G'fJɦI,۩Oz$/n^ 2]hjW~f&p e6+O?4|Q6Ǧtʛ(t )@nev0h̨#Qv후u gM3s݊D5 <|0(eDCZF'fjg#qgu鵿X)o"E(BKlSp?ۆulP"&1 ϶%BP"E(BP"E(BP"E(B{H~.z`ѶD(B*~϶ BP_sn_ ak4;uW@ߩA^ywi56AnRh%~;Fn }=Av},B_efg!oy4WInp8GfSڢ@# h.ӡu? i%[)A& S m?v;Zh+8-OG(BP"/LRbPbL/>4bi(R94VS$?K&]j@ڴk&.vPy/J~ֹ,.X)gg:c3LI9?U d{{|B"%Yd /(Y4xҲUTS;.)SM1s \4o5!),{w_Wԫf+ƟW>nlYiQE# Fxsd{\C:đoY-f"KшZׄfiĉyՂ*}&Ӛ 5\Mh2VNy#Z{ƥ9PըF(Ǡtզ-|YMXD٪]խcB1 %_gF֎dQ WM/U#,Iږi 5Ngc^#W/kP1T3hlh3cc7{mI-bx/ƭ>-:OnXwvkQX4_[؈> 0F8n- >v LĬBkuՊ4UZqY3&Gӯu32ʨ:f6LWcKMVOuL7]mc9'6.\9z(T7g5 h9Kk)u,([YV7wNJz)nKcGϭi ט/IE 5.^_ns567GXǸGmK OOkk4?OzǛEKYtx >qEc},/4fij;þy]L[Kn2y3%A9ing2zOBPL7O ]mNwb̖@}/VzϽw9EwHWs::lM@&t4w4c/?V|zA6d&ll$VNU=.~ZϘӰ׎D~f3^\3 m {5\ZQ)n4qCu qC?sNnFqQg9]hACyt P~Z[F%T k[b-9Q=p0XcQe4͔vMR'TP+ciW H5} IxQ;ʨϻ(T;z"C# 鷄IEje``NqT-&?AEQ\e q}K~沍>Ȱ^ka)= Tvp;xuBKp%m+qi߮+m̥҃Qcͽv7%v^sI]Eu zmEvo` م+3uЛ"o zxbRtk @.K=_ZH1zoU@BJhRJ5Rej+qVsr0j)Pb"E_ F E[$3%AZjAɆ3k)ꬌfb362x*2^(mK<i! ?d D~|(WZhIw`0QGʡB0ע:jXT@tZnNڤU ނd?( )+Kip}?\Pk آ22K{SӊrM6?ZSĒ4ğ*U܋@V ?$o^WEHЦ&@e㿥-(q?f +|/U@BȽ /}IR3ÅJ7?w0r3O*2 /ʟD;,D* |~&!S设@=;(; >Go5b 8谐KD'wN=DwyzT.+4hZ߁c =`o%AI̋S;]F6Dϴ~a*-4Zp;|5:5+Mڀh 6Dm@6c`hf D3@4l @4z ꁨ@QD=z n t t t tB (@QD!B f 4 4 4 4;v @ ;v n @ 1b 0@ 1WH*_ 9d@rC2 9ȡԗ5vl?`@g |@. @tD]`ۃo^~kl!QCÆz }6ut!WS!WǐϐI0ZW0<,A>Z*Ǚw6+fgjbezڤ2 VcżX?}^eO]\Vi3tqOe zgz\tǞ3FcBb< woy`7X5rߠ wy v51FoB Y89gBB<ϞVZOEI]~w~u?ģ~ɟq?52"UЙa9r_ i~u8ןڹȍᬁ@èa\~uPZ&--(0O ) Q1n(w>uwyBRWڄ>· M}1>5_#ςam~FnvP]wD]^&7\0Y߱GG0 _=g8AVlL; K~KPQhoO>皿0w/2WǙ]!f9ɒ`[b-b1Yd %/8{I&&Y\el*J%JunF/ WmNqU1_Bͬzo\QCcw4eifC [2&=n=s/1~퍍""a||لo4o(÷nFoW$ AGc^cjkX!m_†)~kD7r3SKNI3SpAp1R GjqeDrt mfҋ(K?MR4FD*ZE^a ^9|.1r`bf69:8>+Kɏ(*?>𧘍`(E7 >AѰg$<2̧z 4#Lcx5қ6|X}7%LvbBt[zKfcrF{_el !1>~%[?ʃ'0cpJK{gh5o^M?tY)[b>6r+ʧ6 o;)]3hJ\~Mrbx#T N,xD6zDo"~86]Q`bƟLjx F]¯nw{0+[RRiC҇]Hy~婒KJ#I"*aFK..)}$},êCj>y=J|*O+)唉2LYeGM7co`icY,kgcy9Gf:UHKhm<]NH.wl?f/Za7|@~Gof.?"]٨Y|6@"N=rvcl,Of<&/ B/or}>ڄ}cI"IF-2﷐zMgkӑA0NO%j>Q!I? ,ðQEt>vwsm%E4zw}7 .W=F ;rz ;]! ,~17+~8T:nkt?"ffޠO+fڤ*AfԆ=<^2r#A/'O0,3Z-~nM5 s3;|iV?l }o F /԰+b1Tz{ F9=٩ e?;4T8L A1AwʤRXy R2JaÛL} +uҪ*=5j`HdݜL>^'"$tI p3ҼS'SS,t;ݸNiR)]?&чXgBVnEQH=]-ST+s,&d3EfHV1&yiW\w2ۢ1M9T>g&WQ>>awd!P3IR}X87%Ǭ!`ZVֶI=Ram]SEPND&ժFTVFH)f1+ubȢm dc6ISKb}|SojὦcM~,>' }W/MF;QuhV\\ׁCW.\,d:Bh4PN9]vEwHd;Qpida"& ɋɢqyC}K=qx!=ҕMac# Gxx0G|&ХĹg!P݆'ciNL>f,:%{f6 .]ѓI"^f?c~ĺFwuaۭ>e}jߘҘ1[4~QʢKUK/3'jb_6=o}>]k[ַbiZOnKWtu8<O CG;|{ y :5QS+JMMo/:d6SRF)oxxٹw'qU(:*$ͻ{6!ك{6}R9rXLL%eΡh*yO؛CieX3M.wgYLJ2&iai҇eH)y>pl$#+7;:8,ᕔbG9Dp:QC,:N|R y\twb=(C;l_Ӈvq؄pw$ or<m/(˄ 8C2b/S,e1eL䙉L55up2vJKK&VsLB VftDžr6(%9 &rl{џzǶ66,>Ngɣ'OaJ0{*.uqee}ʧO,_y#"2UJs!a\|]|kjmǔ,ݱ݉O^ؾ݉/+ʼncOOlN4+RK$eQ" 3%pnfwbwjN^]heSYJ>61ǜOeMP˄ܝvxjKpôjagbƒo:Ѵ4" ›KhiS;҈s>F!5 ?&'&fͬpue[vY_{ o񋯟>ҶӖCfwE<X*SRMmvxeJEzTLRf%qn0M)#CdűP>ǿ,2^b!VgՔ3NIP&]<995ԝhђ܌xfvu9ٻYHD֨>^_ߜߖߞߙߕo y~PD7捜rxVloZz‹?txn_VдHBv,Y$ !{EiY"8M_p$:pKRDFAJQHmE%cD6 رnΒyv6=]Xw7.o W}ͻqo .pNz55)UssH'pOz[m)[hgַnkNtN)+[9ќ:JnŜܧBRn'6PnbC/}l'[b؄غyqljӓӊq.ClR米s2(bY]fgVͅf {3ׄe8_DJB2:WHQ 51Dqj)G$H>rS &f,хE_gl[/u3/<.aW{\p͟N>=I{-P;wrOm[Բԉ))R12S6E)jwݒ۝Ls"Y' vnQ}k A1˥LQjJJBrvqh<q(;j97,/8Tey |'oZPϞ0\+b^ *%*T$ _Z\Z+(hJQ27|NX;̷9 h2/dZ'ֿMt_v49هw/ad~c ^aroUH|\s`q0^Lg 0woR>Nh6:k 5aHț7]EE;Ns.Dhr^iE&`~A 1}s{/vҤl¦uy;ƾxnw˂tR_e:!$dEFȨis6sT0 0opNIrh `$Ux)f* M %dZ&]YlļD uB6>>r!30Z aQ7M3X [ ?V0* lփnAei!]W6btXOywC~ `cI~4:n'+$>$.'K #nхA(d( ć f30`( +gfBԓM&a vޟ/8%:avs{gouPᝀt ra?ChZot[~6}/boKswT$J P⒔5 pGw9[Gxyǣ1V%ap43fD(s &yp6.@_[{Fکȫ\񱸤27ï"~пÏ\*ABnH.WjAPڃ у5._'a`3 kQԙ/QȌ 4NSGts.JIc0eqB/{]51hNrnw֨gdIݦ5F򓗫撊m (iZy5ğIڰDV.ބ [qA2&Hl"wYҽoYgx#wM(2ygԫQikMIO97Z[㦪XM-jD^3HL9$ |Af%aBh.q|Sq%rmMw !BnU| êl-[<-jMa!ag$AjgϑX^ P#yy xp_+6j=ۼ;=_pg8YU|KTfB!j C]#!&@yG#:@AL(.P>sFTl1YGQZ+:^|0Г/u뼍/ҩ~8 ۦ8CXsNqMH 4g) GGQ11 ݄6-fvٓ2Ȝa +JZXEܰ6w.|.s@5K <5F-3h%|cɺ?[w 8d =rPh,tssw]/p#ݚb2٤f(@RQKb9{E?4*so0c~h x)F4;Stȕ2)0q;/jEg2xF3Ì7f"pAqJ%T%PSططO@9U癟KO+nO #cblQ1ۤ!;# JJE D9*5o4>+tS Jq]Shg&$MafI3Sx{zGς]jvKvAKDGZAiƭjpdY9,@t1ζ8%Ȭ 3XF7^~ er 14<24k`s+'21<(zNXI oh{:OZE2?d9kYC KG.o!\#[F E.\`6́h6ʠk}"{KS5ذ7814>oB@CDk`^bug )z\J<?Wk8\X11D-S҅zpzaa!.l0gm0"U>{߇pxtj-程! `:ڃo* !>6[cܡn9xB(LCU6oZ NNt !+Ks|3[}ʶ`:-hgMA6!,R) {¨#7H  o.ͩ YE2m,LN1Z닚M\=ڒd4H+=tZxzSO__մq~ׅ3믺Rm},WUkg=ؘWɛrh=g?Y;zFEp.L@cf%zrՇ5ա+C9!g*f:UiT]W㷈bI",&ke;%B=k%N jH=M \gwGlWk>Q͜j7S[Voc3TwS }=iZw}0_ҝ ˚Y5oj`c {v\Mׁ%)3g;l./ l›77jG_q_ _\#]#= Ҧj?]b_î r:{EPfOwV+˹CI0gNLp+}TA= |\EQL%odu3^lԗ:ݗ"ۥSVV9mQ,gREfWMۖՃܩW{ ~ ~:Fh'"`nf>ԙ2Rie3@(wQtZI&DO}`(M5MmvX WbS n vB <A" m\5gѪ>G] ؗf0β;oXjkΠ$(x <箺lYMwIVTy/45[ĭFmS:$R{F\49|KrTH9y<£iU;c!lm>hb9l-6l;IQ,w GXզZ?lu;.5sGӲUtng0Sf/ cB΅omEJZSmer>֬Q0~}UQۆ ._ 3n.r+]~#BZo{h4$Gz뷽oxW.}Ȇy'`);*@5d!?ȳ^tw@]nE1I Ӽ(InBAG ӻE4$=hַ{c .?noO^.:AΚE\!;;`N}&jwDB>f[7l6NDi8׮>UUnuo0h́YSKz)T8:]lqG<"+~#bR ,;bYCS8 3M,F L@ȍ8LPƹ(5X8U8Gn"8 ')~}O~v)=b< ivN`Elp=ȧVj`ywBEjɓ+67rY.KMzqR(Piq #T̆s~z樂%^u oYi$i0偡ih[ҫoIHTPxXbwp?c~[Zh30ۘVn+U 'bRl)Wʗ ej#Jy$e8ՑhI|d˄sU,'P'H \@IN::ڙ?x ^+q~WJI6ZlUF VC42Ge|{{ u OƘjVp%l;=]lk%XD#CcirUZ+( >FR% *Ϋ鴐 }\e%SŖΒ%Oq;g}>eOɻ%JlTIYI|jg%\Ky!G>&pGͨÑ %]K8Z҃t{0y%$a{)*i+wnMcU d:.K,Iۓ$M%#@IR;(s"V =<B\ 8HE)WCtT>颒]oiXu,NN=q"nCLgM>muj-J]",j.iE "!5Ne5e}(6xo]E{#fWݵU65ޅiFqCu>}H$}P `?t,kv۠NwlLW>R;oZ݌~"xsO$0W^ޙ'{j7[ Kt'#k1>n~O 6~#A'jg-NiwmD\ֻ' (,x| Ug2LpF陼;l!2 챒] 4%C XE?/Ou&mZ]m@k&98Y L'T?5g}dZDuݪnx^9u!1f?Cw/ٹٽ)xȻyH"~V=J\qysgWļ͉55ձ{ \ ACJrzE"3 )xc$s>|FD>*s"wE؈hCtnFm3HB>1\R\ Xn `5Tjƾ0*MWU]U}Nwt'ݝ H+  r "P9EFDDGtfAwv33^ 3+#,㨻Q~tU:|^[D ^T/Q-Jiܑ`Զ\KpȲ>PZ]p'Zp޵W%QmB?Zo0i,iw˝ ,]ppkW-}2-g3n:얣封Auzud_f|p =ZSCF>!lZ ~K ZeS.8j.3bu8usk$Fd RYt͍};s+EoU&vI 6׺z8/7v VVr!pgwĜNDɥIb' K_c?vm5%-_Ȍhr3 =سhcϹ?_g)%8)"٩+%3%H 8Nr ER5I;ѠK#sH+tO[mYIB0B#=d ]Yq%4Jl ;e$&6l"`aqs4UW]W۪nQi0ve?'ԲGq 0vp)3q&7g `/_Lt%$Tpj5YqDuBrkxFi08u]@P(XV uWt Tu LjPYhEmMO6Fa**4dog GyW+sݗWķ8|SQU:j#5љ֘"`-0ĤDh~iFe`>ؠ -;_B,V"*Ja# I$'@X3ڎqrm+|cfܧ<9OϔOh'r=@ළ*o+_d6>_0pe\=jз>|=^ϋ1\&OH_r_BbmdzSeSęl]-n7w'3EȰ}3rm!C;*̰/!j,j9Yv} :oUĽOV]ʣg"(oREORQ7)]l7gtN13zќ醣 >#ZdSFqQ2qk',P_q$A1i*C!gʹЩOBeQ?qxFFx3[h,E0-nD.q 5lF|vN%5.ZM"ޤM%bSPMtbFkӌydbؽyZt̠AOҘ71HTeޭӻzeCȧ3ƔX6^G_^y:k,֌acH_^j l [mӆOsVLϒuHD<lP8ixXUfw ŪrpQAL[yݬP l1)lj> 7Omբi.p-\y`ηn`S窿r4j~*r=O=^[Gçe`3Sy=K5/ֲ mQj,xU9ׇY\W:bץgQfJYyz?> &F@`3t/eFke'6lG8 6 }VH XB80K mz23zryRfd}>ԯnVNVC%ǧqusgN"3pO=fCKf(~! Y7YÜ#mF[ #0 !C ,xۣx~|VP;wJ0Cg"#l:w*e[~N}O;Uwͻ׆CO!O_&?׽!?Je&-yƧCe< nr|4.M{y av pGA|dȥLjMv9BBؑ:̀SZrV8 'ٗMAdyh/ 1Md+Ujl3]8p|N'd#`#~*[XÛagbPmv_(3>0#8ܴPT^'fY4d̷;B gnd>c)%x:G-m%OB&Y/t ` J:oӊ + @]Jg gLRGa5P(Ns%E6zt-y}U][e }űxfe}]۶޺+2Y Y<zG sUOpR3hn=J)+QlѮa_þuU;<)'pk=ℾpͳ8jX'Z&XЕh;x^. 8JzԂ4ԋeh ڀ˿7}y7^0ueU Ni7',=JGWVff3)O|+[m\W{J{ᚚgdos\Y"*c%W''OK2>i9 ,#y8-uߝpDJo{{~ j{ݎ~12tE&]SJZy&M6.{"UO/yt=nz7,z`MfspT*CB>Ier ̊˲3KH{8@ˣ'drM6wf ~r5{O̺'͘yf>sU[jRQ Aڤp!wnǵ3Ix{\|SC2pAhEGՀRΡ8ĬRi'3tF/L J=CRڷCVx3H#R)[+Alve_> ,ܵjGhԝ8Et48MJskښPJ'5Ha2G&2 W/Ko>*/7g:)__P6/5|]bcX 5;ol;` \;rܲqgF̎CwgPWgpnRhԢH4祚d3^Xp:\ks[m{v 2n볛Yڵk1{N={^iǩ=8Çf[P)pyxp6.BJ"DaqQ!|-gmLqXMcdWe .ǃ(4sy䚛 -=HoZyM_?7{i/>*pc߄LC^[jmNh\iu8,R(6~|`b*Pc&P*I;U6'^L4~:W{`Rz6M͌w8SgBA\ -i䬉q9f}wm?ug'1oL}\'68{pS-1{s&,HW ˺Y#cfvX6ꑫP6ٽzJ,ZjZvvq͛]m3c5-L?dGQyB=${)9)=6g#ɖ$ / :RDJZ-Iٙʕ]pRaΰK$4Ș"G7T)nwgj\ ʅ?[Jom[?g wkVw wS+z WՅhl'e☀C!2Ld.LрZ[ZXl[ڤՄ¥ թMt=,W]n͢JfқFkt'~W;&gWkdx)ʄpG#/fy+;G}PǢ>$AW`,"Ejߙ)py€+O[!56rt?YiAܩ;=ʝx&Ub17ʍʛ8N:r2֝-#榨\P&y#Ř/ƾ"6]e. EA%d6W2`<'.W4Z.Ifj 4$P^m-UV9E~7pA>{ld0'pX͚/1~Ş:Q Kz |c?/} qR7 &E@ԲÄ SN{;ƋNd]k'`Ԃ|oI_ôÔJi,%NʡIs@y&#|=ɹsuW*JzZ-jk{R~끹}S8Skɭ3Kg\Swlڃʻ?mH6q,hwO9j 7~5/Jݙ4t FЃU]#]/,ʍi'ۘJԈS6XJ Ȗ/QE#(2#e+(?"<*i%;q"Q'ԚUQƁ8!EQQrRx5 :},a-ėOY)9qFO?_3XV njB3eIsnwKq2ppʄM%AM9l$i@ejXrRĒLA:  r# ?<ܺ՘},m驩-GKLz')<g붿|ۤ9sH.u9۵izY{[G+{SifȺj B:S:F#Xvr~؝^goS߽[]xi=ʗp+]jels641DbRA(-uePsP2GS &"T-hYV*@?0H\[htk?z5[^1^yFK鸺2ɉɵg_\SM7/nbBW{7IɞK?G.?wc+oQWE Z8pyVqVjT)=8A@Cvfj6t^P7OSofGf<3HSK^=jW֍Ƕ+_DG]0XQU31n测I~ʧOV[#K9qpͪ%NhoSxN¡)(_=r=̋1 ec4ܭi&sŊDJ?J«BgH2H'kA[Rc Zqt5Z tE|$D=8I)kU^bVd;ppnc唿2hG+AR撰^_R.ٵHg9J$sl6qyitCEUZIoʹc uSׇ߼е;v{_ǪML߱pKVSv}z-C_~ R6bSlN`&*j2T"`xYSl$qhߤƐNpϝ{Ϭv"hevZ#u^?9&tZ 5 ya Ddُ?D@`XXKyw2aZ(_u5:M/P{2s,v9,0D H²'CWI˷C O3){Jw#&OW*G8u1C師r*OLyye UtTv<<U"0f^վjsjGzHf}|ݮgN=ޝeo WOf\xJT>ןypϟLO)W_/ˏfueXFFV~Q $H攆<YSbA>ďDD|Hs= dA {532\DuLb'9IX d\KXeUP]q^*$Q}W[WW8v Z}䫿.N*0T,$yVcq:X:aXpl Kk5  #"$F9Qd .UueI7aM;u`#T0E\%+(YRgy ס]lK4xKy6%Ʋ7|Ljj/Qr9I# f64rfmJp$a?hQQ,֎q>NJ&B֔XNV2,0sh,y-:hS'xpjGj\CiPS`xQhxX^4I>o0eUM^%RQ&{>F|:f=cz1w@2`O |Hh Ry3. ` ~#0&c_!f"u6cc?3!'QRn [LbppW 'RJ?ݷjUF;o9y˛Θq;vyo7'ln^YUѱJnYYEҷs`zoݺ]]߸oGoeesn)/(;P /ŰeArfs(5Wt}Ulw8XJO_nw*$G<ʆ-}iQ%nsEL3=`աr{k qOv~Ջ8"HpzboMP" D?LvSQ(m*OWZf0ԗO'Nr%ʟg :4Go.jZoԣ]8$ 4>ёޢe=Q$E=E-:L),c?{&>!Kk:~*gQ1wFվP@Zqj!^Y=.Tri7iUy:s^gwܬmzV_ Lp̻QE'lKz0VNU؋}^Yu`u͂ _wPXL6b%yô  hSoi(?c^Rgv} p -(%1%&F4%8jZfŒ5}U&uUP<9_cٽ8İĸJ-.n7ж'W1Khlܾ2=J[LjlZ8f |6J`(8DA,XYb^o=&B"A`?DUP^vּcFơ~W\c"c>< bWf3| `D:.d#+ã ]ܤ^9ݕI*٤;}Kژ·Y Y{U{*BӾU; F24ydieGns{o?ӏʄYwqUVk֒lFdNMVJZUwWdWWūۻw@+MBM d”4i~vZ@4aMtB@h>=${),/x{m[[|-'ƒ[fqoo|fә<񎳛o~nM^ֿvd緽 ۟k[:?egwQ>~>KG>Cɳ\Td;o5! IC>7woڽ! iHCҐ4! iHCvkFjJ>ߐ\W+(3'<_'ruzsژ{zLytϿ~޷z3~o}/ޝ{ou3oxwϯ]S^~[ kcukHCҐ4X"}%~l;:}^>~Ba?ާpk+r=AؽMo7vNOx*aM)eWǮ~' 7ފ ۺ ca)h}wMh_yJa?Y @{>lco* : D{KYlk^ ?}IaɿĒ%K%K,v>_bɿ ;vqgDa3H8=7(g\znQ o@{[C Yg[zMÞ I]?2h~{~Dxy_'M:x"ڇFN~;(*,r*swO),Ə%r-(j#|GMa9 =w ?X&`M\-5[jƷ7g?2lO0eVa<⪣ݤ艰<1a%z2p70$9i[BK`׵e.C^ :MgWlUL#th(b,]v,;^2|,Ub<G y=U'&cz,)'+ef)^4KkSKrG|4@0"l st#w,ZJq~^Y )#r'Q9(|>AͽY9P!).4wX7;F,*~qUǞ xӨKWA5K#T K["sSŴIԳ@C$UM=&4g{ٵl]]"2|)R29סǜV2q*9p*yuG6K/|2ȿ+k dH^˹YP:.RP5K~\G͐bjĠU"=0'gMՉXҮV2%)K+g-ΖT&<w^Z][r[zsk\:\S"CܽѦճL#6#U\ʨ${PQD[71RwQkTfb*mMZÎʭsr}UkpNmJ袝]yA ڑoUmypWjVwR1כwr}wwuj m2OntfyQenU^<RgoY5O\Py(f[3r;N υ1fHbE&3mQL S4U~*ܥ*}Ihnd|u&$1LOʕT.SJTQӕ ޻)m$kԇ7Fz,J1f{N?4d!&AqcYPYI- ̚u0.<ⱉx,Xb8>5K!K$qİ4 RhjxXEPEQi A # D&"cQ SMG "w8K&DD&G Q2ӱtTT,-M%^ЉIRy"u{?w\sw\)P8'3!{_{_@{m1Q2Ng,3-_:Wں5w^׷}xlxO}Į]Ϛ>a~71[w o)I|?;#bAv^cqBq)Dl}V{J9@^5y>|އe? W 7}|MQ1Qne^ms }|w_bweSS7|?43Ad3x<D,A=u.XdpSȑ'q=x;Z>; |o3!"wLy`-Cz~ |> stream x}|U97-S23!6 3$!0$H@ 3BB(`{誸b (Xւ]uu*9{7yy{wH~0sC&,~}'F/ƸƔk4_3k̘vewOUǘֿfl;lxlgcѾ:Ø5@{V7=釐.E:qQcMKjkn}n jV7-#Q޻sd/wEY/3Ec};,otO(߼# al 0ygwk KgkQ#}ndS19|x[ZK],nqofA+|s9Su~ 3Z4ٝX}mT)v(:U}:ggi=M cYQ7)^;E[/Fu'z_`ߛ v݇+g}?_/k'LW>o3ڟS>bz[Kb7znѼjvٗ_م?wb,fc g.b,f1Yb,f1k3c,f1Yb,f1Yw6zb,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,f1s f1?m:@2 eHA)f($ec=VǖmE޸: ~y7c6i$]OTuz53ϵק\E~x'RDޖnWͦK[,E}.\{A-ob>:܃ QPGVzA[mQ"i# Vmї ;l)y *J's\!*sWRUGW6[ys`,|#V6 oҼMK!5ѱGj b)|s8? k`ZV%Z-XfյZR/oY[u)uPR 9JяpR %!va6x+ܾpW鯨w{}'j0SJb,Bqb?r2X.-)Vt0ow3Y OvPJF,UT-U~KhYaSp=GFEzyKtFF[T\D&e f4XoMV~ 1617B[.~R )f>d˄R=XpeңSlW[[];SVvsMK. O T~gnvWଖ#k^u^[{0\V8??b[Ԋu5 l7}$Rv?<=7O@<"pzde{&*uԼ HxEB4 V޽'XZ3g>j;9Aڃxv('(K3JDK9{"" AS0.hUl T"E8vZT[=ZKS%[QRZsQKCx ))!)b{bHq)EDv)R'ŽR#R.)~-ŝRl)n6)~%ŭR"6)n&)n):))*) ).2).).")JE h)6KIR/py嵇k.=\^{py嵇k.=\^{pyˤ.?\py.?\py.?\py.?\py.=\^{pym.o;\vBt(EKs"݇Z)u6Hw+hEHHF hJBDȹ41Lh1YDDtF$ hQ#|Hz)RuDDj͡z)5h&QQ%QD3BDӉM%B4hD DǀǂFG@exP)Q HADTo8iDèP!Th0 Xj?Q?X>Q%C Mԋ('5MEmfzP>"/u' J'rE&RR"i@DIt%QDvrوg!2QHdN#S@:" 8ӈwӊaR[o")ALR&+R_">#9?%DS(!@$'zC6[TwzH#3@JW^&zE*r>OѳDP=MΧ$zh?ozhѣ|AD{:nJ=@t?.bP$4N&^{&AtW$ Zh;At;mD"mD7Sc7Q+7@y]Gt-5TjJ]Et%w9rѥw Dm%B%/TD6mj@G\@m@q@1?;ZOzg@gRDV j!ZNM/K#Zjl1\DDtBTh>QZyD5DDsРgSfͤAWQӕ ө3A!je:4DS"AHx¤H#@"TdH"| F"gy$q=, TI<TIl$FG~QjXY J4$[0qVEUW@4 O%Eb`}#Nq6z.=QMԋ!IMqY$S=M5V.~i;󆭟uk&ϫl+/l|> <V1r\8cZEDݶ-cdp;f(R|@E4Su=xn+A;:o+3^ \nyl贩IAQa!A`/v@h}=.vv6W-6f&Fz:Zj*J r2Rb"`+h.6nD+8sq9?8sq9?8|8bG 1#p8bG 1#p8bG 1#p8bG 1#pq9?8gs}q9>8?w[݁_˻\̝̄&Ǝ]~_Lf r֊l+=fk6v5 oG8;SY1yб;}|HuyOx:_坎cfڔ ?y/]; ڮxӱm?e*6bY5X#[95ElZl@j.J!hD%XZ _ˣ)TK`𵚝ְZ.JE-XʜՔdl`jfvO.8؅l "v'.ץ2+ؕ*v SWkMfw%<7kJ>Ğd{}m.k1k4#r^9l7t1ߪ㳵cckt5v2:VhD+NK0'FD+v\:c*v#N-*ԭФntWMnҿb۱5%J?~(E'SPϰgsRϧz^aopKS|e/?dlc6_N5}smuNt\!*b[c%uglW,pѷn5/#ʩȊ6]>?PធĆwr0/n1&yIЮSlҊ1N{mӪ';-g{f?՜f]|ٌR1^s_0 9h%%ٖ/ə %!V KH.r(joYtZ26RN4E˒KxU<,]I8LH!`J&cT+#=ѢMo7cwofJ_-iEvw7kjVn+f3 XkiMqpzGީn.l[S?yp34ciJb0..:P1vst [SoӻoB6kE=0cANCƴ=Hbff"w=4t% +(-mSoe[~W+d EvqL|snnH9YuI5#.Ѩo)`,]BQ`gQrN]7nI.}79՛`T]`ǩǮU TO1;LJE^ FQÇVgPpqS=b(OwfPo| `AV'fd3+]g==xou"R1kK %E6EˊNQ3O< b]"uW.}ɕ {fK4aӪϟ7c~,lw\ʋO͈IP-]vlx֗]>Do0ӴT=@{S_UwRo8!-xrHD" P$bBу{lDPɏh[+根Rӭ-y*elA팟 Fh(…YVL5w5uw5i18C('%;ܥfkޕ]=XLOvԵ3kޥs'm=)ؓqw+-*1wZg*jZ5aƄ Z_UwPKY}IOK`p$'$ D_2!qئ|}ՍrZ Rw`́t3uq߷dyz|6Ql;e*v6AOnlTz9-}ZuuYTW[Xдn|iAAMY)cr/\.RRDj]{=9-k^{^'Egҳo,U | ӃWߤ"Sw*6_3|1#8i6F ,5f| ecǖa1njP_>f1gyA;&β ǎ-</Lz Ikʀ;Ҙ1Fx*mloQ^::_V6VY#Te^[6*NVJo @5QHdYҲh rb66[M3Nzޘ14Ĝ,8}zJ:ڏe韝S3,9=U3f>xXfT:ltuյbgˍo9p׿D?3.]Ew?ay"DI/FOS&J|Kc$J$J$J\Ry>Q%Q%Q%Q VLDIDIDIDIDIDIDIDIDIDIDIDS(XF%VbsHcuPn^ȵѓq^7ĵI,'y=n7S^7듊y=lNQ.`ʺbnusvDrr~8=1 qFrS뼞D2$-7MBsL>ܜ[fT ^(#A #Y+vVꊝ.NFR7ĵ+vVꊝbgY+vVꊝz*͑b27j𯋅H៛D *⅚J"u< #n@'JBZ]Z`DJz&Y}P@mdm#.#cVn V#AVy0Ar٩y=ñ5_X Ǎd k%kT 8K?d~e_B Qu^3 VeG`uvɎ>N@j]M8_=97fM8gms_CGpN'z"enlO湱u0&,"XRL.}'>Q{?%(.yva Q/h5{(^:[r8Ѧ~S)gYG% 빀zJx}xQBk{GA~?Õ6)CujW0xj)J(E4bYi?FW]UJpTVԻ(Q̉wG e&Û>D|?ߙѣ'xzK0nVfkf#Q+ڊ;cǺDs1m4ԞbM\pa,ËvmB }V&Žw0Z fQm.;C.ЌC.y3>EFd|݃Q]v9vrqyߊ\J$}C J9NJ_ynݎz x؋vf7/N~V2_#R4h rljqƨfӀui%]1XoY5D٘UQru:fk+q͊Zx5`3*r>m #_UU PAUmSi+MгWڂ֫6cm@npUNUjU > MΆbMmJUh&ݨB=:ކXR▘Ԣ*GS)Ne>DZQF>w\0WM^-/42͟ei^G(#rU  o_"W|ቄe+ u%rjj=ꑛ.ko%7{]:dG b}d6v z:p̅֩_rLoXŏva|F r8rdp=䒻NWHx\Vpî%:]N)V ;B [ tE^_󶇼la? nmzo##> ^(W';!+.#et\a9Ux#0#lÝv:x0ɰ+`(}@Π~9l AX voLq͋@g\W̗9",w 6UћFa-!oYelZ  ْ2l@2s\go8RP4`Y.=Y] Ğ3]`^ *538`#.C^xP;+D`^\hCzJPf3X52톾V':lYiz_?8OwrRai,ppp$u(>]3:Mhb/DŽŗ;L@;ֳ+gJW$bd2/(+pgEmKRS[Aew 27UnA׀?yOX!ZYxuA], o5r/.Ad/raJpK=@EȎAWʸpg*2DlЏ^g.J[\"7ۚk-ʷշ5MoAV:Cn+gȷ7V[ۛm5--rMP_mU ӫȓ_c\pa&MȇiaMU[9uUomdc rsjzCMnnknjaZR3nFhkڀ[*p頽 jjaR*55T@ЬrrC2,~UV9{5(6VWM0_%WZȖQj ƺVRc+m- &z4 ЯFZV0~zK͠.5 0V /\ Ye6Y?( A3gh@A:$>;Φ9dy' +vžfdKOMEE*oKOKC*Eݥ@ -ʳz"Taɓ@'hdok@$&5dAdAڧjdّ ;$jQ-  kAb*hd;d Ad M>KRdz׃&$cRҼe5 "$I:-"$IHoڴ))YHJylc6CYed #D }_ $!1&!_Mzhj,+ )IEV,YdEĨ|E&A4c,a|RSj0ߕCY% yKĔ`|-%UHl*TnU[=I$-N2s_jW$d.2 ٰH=Ȇ4S6P0PpraQQ~bœ+7?nNMRM|8 ytOJTC_ Bj =;܋NKJ+Cv\[ސ*Oq"C.o2[{yҨI*ГXS怞¤# t@=ekIV-nZ [Zeq d(1/|oF_1r79)K˜mYO~1ty"y,`O6#e:^ĹѤr-T\GښAjE&P&zAd.r K2r?y3OrwHG< ; ~$"~o$#!Z{fjPnq'Ô DIAf6ę>WgJ;яAq) վ×q##E܏؏4sG;]No1wC<1LJ9ЬC4!!f! G,F, 1E8 цx;,Dgv<1d #.C\q=&ĭ;w!E܏S!/b>05 vE!،݈O iTh Éi9^NBEl@!ގ8 щ8' |%+!nF{!@>وnDbqB%WlW@ ,f+7~ 9\:]ABpo7~Q?B.O[EW VYMrYVd#S!{h\v=}w/ j۲ G9m)d^!y8-oFȫn|ːQ2+tt)u u_zMk:SoJ@ lx_|ro@6M> c2{|[ޏv݇ `d*j" G!A>jS0l(]p;txӿ g;@COW#w9\eo9W\ƚ@֟E2/ dEP$ג뮀 ԝERDF\5o;d.Yw~ܥ 빒=Gxl"!v_G $ g}a\. ŢMlCbqY%OI! ʥɒMjBbiY%ޒN̺ :nnnnn]$}X?^_]԰ӰppᬑK7~¤HҒ5 W)$LLͦ٦i5{)ڔwJwҔM)r"ɜg_1NRǧ֥RWnJ=zi;Bw'1%2D,,,{r& LMoKww/M_pz_ጂ֌fusڍspRȧy-d"7Vxcs{g#܉:>>7bNWq0gG'5)59QV#K Wpe4c-N?7PͩkpxIԫn|@Gj8"FQ=Z޳Z=QzM]}k6%x}[j-%VIg˔qA僻q'8=>PRz~gw u\~49ܫ䘎c#`┟ ½cJ|rApngƿoc7#dlj<5Ĉu??U.)}qZ瞚CBd>YL^E/E-GxD<-pDž#<|/%%(G}j ~|̳ŗ9#c˯p^q:SO߫< 獯-x ymNwy| _ =czxߥ7ju9|}@{cjhC1u^8u~o^i~&NoVEU7)mQ}[=Sݓٷ} *k-j[5{Zx{'6h~z}'4'v:NV57I?s?RǖemχhTa:U}ޢ56V5z3%^|y|3lHQRxgkCjs_VKRͿ7_ * ~~5S * ! Ho4; 4O)oV&Q͛ռEBF#f1>3CgQyU+A5k-5?\_k55kj~fk~#jr5o=_/ij~t* Cj~ʇ_>T#V ߦ>Sj8M'_Oi*EԼ}Ӧj~z?{Kjj~jj~sj&h9tBuS[<5jxWO2h9I'A/~6OrC!a Ļ4}:>ȝNB=%HHVU)Gj:6!fB -fAJ%ӕA޻o7IPD4יm@-WH%:i?=4?!GQ~ AXI]H[@68wr\dT[Pw}҈OIsj4jx5>9O'/ fB1MLfU%sy XmቄWXb`-) dP,%Lr:2! rB|[X.,' *Ÿjp|O7_4V4f.ubE|^F|_)$2@]d#>q8<&~S\HK% ^^[q'-K䠔 ^4VKJjT/ tz!]z0Fߡz0Nև }KAߣ7,n4M4skyTg;SWP&IIjzdk4zNJ#)#!KKP:2i)-h:ZʦcX)V )<:ND:Q*7ӛB:NttՒLht5EgIé:kkzh'픊hR1]HC{i/핾DwJVzKEH%t]&tTFC#r5t4kqt]'Utt@7HFQn t3,D-DnLmt;.};It')UG#dssBj诤Zkki OKu1TOKSoo[INFO/5g3R}>+5??H󒍾H_ZK%L_WR}!FߧKӓ4;izZ*=C"ʹ fYFYFI_ZJٖіђ22NjL|YrY&[&KjKZj%R'ͱLLZ-li:-6MJbꞚ]DD⒣$"$, "ID@D3H """"9IN ~]w޹gTg:Էz [O>>/ڻ m(rDGD$fm.Rn m]nkm+v mݷܷD7M=7Er]ĻnWvsn﻽ޢ#}ݾ/(wuNJAxw؝Nd;՝*b;ӝ)sݹb;ߝ/F ݅SwXtK(wLvW+wRuW8wFw׹_ VwfbZ9]b舘mm:bv+阎:N+>t:DgRQgtN&IЛfޢz*6JojCkNSջ.NֻzW~_lAIևŗ>*6cJ'}J_3تs}A_E}Q|/b{̈X(;bXX|bsb!bJic,M,ʼn=bo,>/b b,S,8,ƲDzCp,w,IIHL ~B32yb -v =vM0c1B1$O YyV\<Xiln6lallm|| l&CL1S ʢ@ZUeEoMet*U. 2$* U~TAUUU2bRj5#qjU(&IP^MQSAE5C̀JjO9jTV:9՝"N sc;SN!TDR9 8Xv2%2"é##|e>+3Wf_"|E&L+2Wd4_"3|Ef+2Wd|_"ð#IQE"}E>Y+Wd |+W _U2}eY+Wd&_/}E+V_o|E"h#E6|+W;_"+WG_ݾ"{|E92|e9+q_"'}ENF$EH9/*rW䜯y_ "?\+rW__}E\W䆯M_۾"돕{2+c _3ER*)r)ތwDMh%^mk$:EwyP|$b8&8%N38'΋ gqQ\U\עq.vD Q%j-DK0DkB-EHH) t]D7pDD1Ҋ[\ƣF1#n0rz-#,'4dNNvc7*!#xCoHod0⍌Fhd>دwk126"e؆cD e6[[erD1]sI|)6*ķx/KF41 ;C##ZSo#8*ʌ+!>wboȘ~*H;יBV7oG;9S}sq Znyy )>X.Ih)`; G ń0XЊ|K`),>Gհ:Xf#l/a3|[k76wGa7쁽m80ZpN)8 g,کp~޳ Z_*\܀p np=*uy=^?_ !7yޔ7/ނ5ox;:|"??q~i~y~AXg~Q̯_*Ư ~b ! a","9QGD#X4/EG/~b%ƊbL,+bNߋK(v=b'8$#(m1v?co0q8n0Nq8o\0~6.Wq͸nf0nqόidEYI>)+˧dYUVO겆)䳲|N֑ue=Y_>/_ 䋲|I6eT6/|׫j#d;|C)-Q&N2Ev]۲+){weo#ߗ}e?_~ ?r$?'r*rTh9Fx9ANd9ENs\9OΗ BH.%r\&sR~!Wr\+r(7/f"[7rVn{S wnG~y@ayD?ciKW};nf߰oڷ]s#1s9tN93Ys޹\t.9+/ίUs͹tn9ߝ;]^,ʣ"jDh(*h$jEFUԍh,&6MMf&DD3Gf>}<-=#:&:6:.:>:!:1:):9:%:5:-:=:#:3ub~]['pth%'p|!^߅#bH1NPp)oɿ!vV, FIM˴XASkKC?N3,.u_~έiZں զtiw5/%_yKmV 0a ZmܩQ}M'j cor5m݃CxȌ%ݿj>,T-Uo;?VF/W& x"$ f ^/KUxi4Y,Pk(re2n zֿO4l![LG} }iMrϡDNk-zQxƇk^2 ~aoY/&xHmHnmF^Hd<"0yMqOI9N'$8N&'y}>VU?]o}oWU?>۹zoq XmVߟbMXK^eBֆ5:coPucá2A}/;Oݡ߅=>0̇p%(>Yi`q0]I0C`($*:vQ#uwpΌ1o^7 K0oXbcBGBᡑ,ghth 憖ҡeͬrhKh͚C#9 wX=z4[!lM8w8 `ŅWlKd$ڻǶ++o••ضppml{f&.\/\~}nnv_a?ۄ۰#b}VsjifV2;jX)ff57fN3L2y|f~Y,d6.#l;̎'vg'IvfgYvg aM7-q[.޿f" zJq% izΏyRU-b|YP_6=߁R\z&JCq+-W=Y'=,WF [GSw{cE@6C@n gϡP!(G[~@{~J`uJM? Юh2ҼQj[m,d@[J]E,ǠԢy ARuˢvE]i]q|k!h YYYa.a槖@?8 mV?E:@thFV{H]4'YkV!ugwP\ -2A}l.!E.a%ocHz!֋֋0s.eCYc fg Z 1G+ hD?xc0}>G}s?J_XE#`554XG/6ѯ`;:04Ip .b+0@KR/J,<8Ov\6~+ݕxC=2A@=(CHzGf{Xk*yGM2IA4XV\3! ; C!P$;&;!;d9d!&;PZCqdґ@v(#0W+Qt=3ʒXaVUbY<-kR0Alu"l[6ljsu8.wx3l< -ΒP|T7DՍYIRT7enP2+KusVWXy[-YE[TaUnիdR=23fFVöWiÎWT+ׄ]5w1x50i.2O[-~_ylދ `لIJ)+e3V˗Y,3#mŰlcْ=e+V {SXxcaٞ=eV˷XM,Ggja9ƌMrӛƎvXcm y K,X Gc0 ܩIn0 Sa.,UǶ.8'0uAI8ֳX*Ȋ28Zh!b[a+ģPݘͥ GuS6flB_a~-l խx51Wc+zu8 kQ}'ǩTg&PMD=7zn TiԋөfPͤG8OG'3xFR<O$3 ALg=C;sAaKOc-xoVXO^'#hP]ic_ ,f6,'}0GxBㄷ: #!cq'"kgޟuxޟ,XZqxk5њdMXSR6XM֗f+kMq%LRR-uǺkݳhڟC0{=iJ {^cڇ1}>c//tNıqu9NAS)u9ŝ'NIS)u9 NESyJ9*JҪ8uCTTʤ+9(sM;jGlۡOƬ1+r@2;Ms1H,46<҅~ Q;w0::l^փP0_ Obξjb~!_EGoN~;^*+_#GY&1 H:f磖?G-G F2tWovd~xQ[H)z8D?]OMLC33gz ԟԟ?2@:zѪz)8e4N9SCcLj8Y@#٤,i${wvtuUo!JN36t3,Ѣ~(V/) ˼8 Xva2o]<-t6 @ֹqI~.1euY'u N-] 꺺.KN7M!=mw?؊EkڴN*yWsC}mQڅC|.ۀ- SDKg{a*au8uE\ W|w+jCD L}F"Ad9|]C7\^? }N]c%~g໽ϩk` B͇-e&-K1bQCpy2{=* $] ZZ7*C9oEٚrl;Ɖ!0F3??;̹wIᇖ{`9L{/eKJ\=Da0yO_S?O֋%3){Ck3I?V&aQQ_Gwvup'> ucGH!=@4q6#flHDBHӯ;;Aw;xu=!~W@=գTN}+*d :_dzsdH O IGx&fBX1G N5K2a~gE1C6RbrAٱ̮s`C2Fs%hOLҘu14f~iIẆ7uMx:΄ ۔o&Ѣ4R9f 5Oym\D/梛!ℸkF+1Xbl7Θd7km>xsӼ JM ]&-9@N~y5¹•)M4*fa-c߭VA#bku ]nmb>Nf88휾Dg˹ GFD~]K ϡ*WFRYe/G|@N${ HI$'H."$7DrH$"IH"y$/DH>" D  R @ )H`"RH)L0RH"E(DH1"ň D) OyRH "%$DJH)" DJ) e!R&@)Kl#RH)O<RH""D*H%"T 'DHC" 4 DiDFҘHc")DH3"͈4 Di y+҂H "-%DZȫD^%j&ҚHiC 6ҖH["mvDD^'zIM"oH{"퉴D: t$1@:DSI! t&9@BKMm"o;D!Nt'ҝHAғHO"=]"y7@zMw!҇HK/ҏH?"?D" D "2(@>&1d0D'D>!I !2ȐJd(20"d8D"#DF c!2&@Kdl#2ȸOd<2"d"D&$"L D& SL!2%@JdjL'2Ad2L"3dYDfl"9D s%27@Gd^'2Y@dB" dEDb",ψ|FYBd %R"KdeDr"ˉ,DVY J"+ "_"@VYEdU&YCd 5Z"kduDz"뉬'!?e$VP64cSflJЌM)G36iƦTj4cSflZhvy33! Y B9u I#ӧwIU,{W3NXeY%.˒D@%#Dz."DAIDD $ _UasPӧCuuտa?+}~b+c|qn+ /^`= 6gCs&a| "]T~L(?k)Ә2=2)DQeLPFz!嗸#ȕz-r r0r(׹ő:DJ-\-㫰ٴBv+oHm8r\l/oEygyK@y I,o (u!:Rg/eI[}SV0e%S(R96PF9_B(^)cY(m5|inMcb AFQqb).l(D}[lz[|}Xd᧡մ/T᧼[跑b |!ZoџZt!jsL!z Qbu(KW9j~'qF}m4ޖم.h)*ڊB!QG, ň1I Fos_ F;: HA-Dz!=c݂"٧ [(͙JfOd?Vnʼ:Lb}ΒM{V$wpY ՘9' v5t}yqy_u@Q>=q3VECo<9tkh8g%~D:#}.Q[8geVr#lXYIQԆVF8c%]ZDJ ^m)/h ^mc9DOE]*);Y>Fџ,8H;EV}(pՉ(jWAo|@?8Eox}4+h[hE,zO%G)oe*%aJKZ(14Y WTla{qk7!8mbpvٸM.EKV_Ƚ(ks8,|%4\3= e+?-߳?r1y?Η[l˃EWX_3PEdvmB3c]9:B8OrH?L=hזS6jbo) -_, Q 5U Q@j QCb,9jGLBԆw[j6/먀&<߲,k^v«@*`]#p!ތcO`OdO .@y,e?F n-%݈ЪýI5t+@hTh4K(9K{ͭPg%[iz^bX;ˉН! =и8w; V߯8D/xs$.DWr\U)C[J~\."ָ.GCY߃·WWt$2ŧt`MQLA!KNLU3SzDQ0i4qU\ cˮ= *=XR[iK~.ZV$WI*,I}VMaɎ'@+z"hhm >Mϩ|6l$Q!JPINK^Q28Cg yK%K}v([G?GQcp[G&ݷ͡طz^#bo1zEv:ׯuU-ޏػniVFԨ+TCµ9"oB=el7-so}PK||+ 9v^"/ZZZz#fhEhehUhuhMhmкۡwBB66yUj^uWӫxuV)pOگuhhXЈK ݍz0wèQ+ߡG./,&kUlC]+JM_k[4.`9Dr!#RL.o7 RV%m ߕ& TJP*IQɪ* )*SUY**V9*WUVyWUujUuzujZjڨjF;]nuF{u&'d樹5O֩mڠU7[^~T?CY[:ctWFnMN_ou RҭuVug=XC0}G@M?gY9=5RjFWmzޡ?;gz\_=zާWI1%L)iL)nJ Sd&˔3MSd&4;޻GVSRf9uH/wC)eTF@uP7Akuzt^T ڤ uD;uNѺO.&.tsMx%i3_[U>kL%S >69&>1UL>lVvovz soGoD"gr#<|I,W5@.r\"˟UqyBS<#*PBYjjp5Bݡƫ 5AMTsy5[T+JJVkZڣ}K_}AuZQg ]Y*:_Wtu]CԵtm]GR7W醺oշz{}Sz^bhLlb Fmc\ꦆ{[}mvqó\g9gr=F%ȧT9MN33Y9S~!ȽrR_kyP~#GWquBTSN%u.uiL]Vgr+J:[\QԽto}E}=J֏z''d~ܣ>ӧi}F5`LĘXgMjyoO0s$5A ~6m{s ,gZT\%Ns +ȷ~~,*OI^mHI 9S2N&!eqEd'!"R,)KCH`3se*C)kAiYWփ2kdS('C\J5w {gRbj8.{d/zOz 9=[-'#e8@3'!8ax_#.wX{-S/^᣾C3#m.\uOYɔUQ7")k|FZ>( 6=hڳ-V܈'Ƣ L=s YʾP}AP}`hLh ٠ܮn70Qѹ2jld:G6tP;B;?אPg [s,9؄*D(gCWQ~D64q#t f *ZcZc'i'{^3č3L 0A1aD2HaF$:r\Z‰ %< e> h\}8(# B 8jƁZqP0;evUf}f?424BS3a1G9aN@ksڜ6, u[;`B{;ގNv]:bvb@o;Nt4bgY.ov6+ەaoWvu EFxvya X/pʏoUú;ӛRg/u@G} N9&m*K@ 45heqoI^"A7,ۚyQShn3q>fC zoPꆸf՝QDw_auƉd7-"BnQ0FH8rmṞ[RtK"ŏt+9[٭"*Uj"ǭ:n]Qŭ^) ݫEuDtu;)q)IYJr-*[XjU(BBQjB***x*QPZ2*V UDB U$h=f#~d Ċ(@yO@/=Zh%3ݵh IPEQTMҦL̐(AeeY2uE YuEmYe yTGZ %y閲 -N{9Vl?doFyE,ٌҌxANTEܛC=)Лqoiσp~a1y Ly9 nwήt:+invK\7Wp|q[ݭ!zڢ[ϭ'nvW[Fn#׽m*.6*zz;Š")E Rc(*UlUV!ZEIVQUDG* ũU[Imp&B?ۗQ!6^cr_2Ǚ܉ȩ~>-= PBvy;TM<5!+ Q_$}V$ E)^A=\iJJt&dmM681ŴGFYx9K$_B~ i mG$ !8cC# =(c6S$25۔Gp]dlLD _S/wR>5ODkn5>\9`a,I1fgtihGKB%i<,ʓ(σK D5_PR}tuZ<Y<'u' qC6CW y*zZ|U)89[9[9[(ume{ cAkQ{Zד0zZRPh`..\*g|<+g ,.*.Ee~\?WV=µ5m̺>6A0q݉̓c8SlޥXlb;>GlO>m!.ZB ?/A|N(f`ϒ)]QRqVe jZ:`j3C!꩏(j ij8)u WuN2:](t9Y:[-PAңPG+1GYVf.10!:kfyڮs M&h<9CXZ±%/f{$ѾyĘ K(߶JmfGkE*,]&3q0Qwc?7vSً}k)O~gucW#ȍz)ڱz9[pH#L PPPbr gw8s*Tt8KY g89Aɏb gX>VڹƖ<]"+]bz<ey.ƒbI,Ɇ%fI.[ ֛!1h q.N.:P!2ˇ<5@+xD5̃5~!+P_ FS UGqFF e{K`#wMo]xw`kq,ԮUv vaZuiQ֥$$)Yg֙6cR'K{;PCչ!~jl(Zv.geG]T0̻P>HuwvO՞9h}:y7M~B~T;֕ЮQ%U)y=U]ՀUO]֕i,"~`\ƴFd9~v`#'bպl71/#{Z15~QQ7ڟ'o j-&-<'5[HzPnP(=$Y,?u@mo7s8JfC1lJpN Itvv 9xP)AS{tZkA iPZN?v83OB<[ m i?+ QQO6gtwp "ga~E/18j6hgYmBf}/>O_/8H?/!8L?//Kqx)N/i8CĉC^ZqK+xi%/$⥕b%I-V{ĕY]gX=[=Qz&8_液.Q zGD31h9Z@԰2AKZ'1)!Vq_pɩW:\SLx ]߻eMʩr蝓>v"{I쩧H8A=ִE7> >@CX h0`]%T *Jt\1M\SL;\+O;Sqpp,+^7R#q8FhAoC3͙QtĬ"^X;=ěψn5'ުFo5 "ڢ\ 1m@^i&zعPγA&zq_g@=Ϟ엡:bP^d/jooS߷7CcD5VSe1hIOc(' 8Iru1ZO'P='"^1i PIy<<< [y[[%[-߮k_jh7đ\o_u׵[٭W0ƿ1~7h}5\ţṃm£mʣmƣmmǣmϣȣ̣37SdXjKR`aű΂8xńH _;;\^77= Y'P[RXױ6zf'U8={?~Np;y6LM?b>cg1ګV-˜5cv{QqaF?^W cFK%7̛\ƒy r)06 ȭWq`@n}>{?(9v88?T@0dj2/X㼴؇9{:i?ri㌅T}vRc{rhG!Goaw F hlylô}D=N9oT q>!ezÖ́sc~mimuqsd6_ȽGjq6H@r_#2ڎb:N"X~)fpD s39[qݐrsbW BůL.Gf82S#3U92S#392S#3592Sˮc_z4xXk̕(MQkSd1Gfpd\ˑf1gpj͝rN9huBKZ9^К#6m8bӖ#68b77Б0tb܅yO8DSխ SyŅgsA8Kg>Eq)AVRBv=]ZZ\kw]X>\^T}h>IK1/i>=0?ސ.j<_)aJK)cNj=Gzc0L,XzKF9h^+h;A}I`8k`a |Feo#CD.̙U͙UÙU3gV=άpfgVS9Z38ΙҜY-ÙLάfqs ٛG8rZ% \EyrTfSO>[;@|əp,MT5SK0Q8&8fqV-qKƢZqh-^=7?BSQ}pRP2QE&[-pݒ.ugrY\wyCj)y/V֕j%ֺCZwcS N-o.R tu~#Oӑ B[[zEQvs3IGN}.[yh/hc Jycsjك+\.ycVe+ gJ/ot+~ƩGK#\xRyQLO͑ GG?r%>{q lgoelXXS-6s=нwA]s{]$rjϝ8Ûɧ(#T6q\6 V7zQr6R{"#A{8~V}nUgiظjq_7Qmeފu ^U;Mth-. g\ʟk|0 48`5`(2h=Id4 Ѥ>΋co * M3<`.lE1zjh+n#81Ub8j%X)VUji[#1s|k)Oqr"w-4rv{ҟs7sC\2|L9E)?3%r}u}%WbxK|%~9z.KlWm.KlGz)Ǣ(ۙr<)'(2de'S~|ƔSQ]L9E͔QȔ((>(E)qQL|Ôsbĕ,Ÿ_G\}Wr VT_2%)X:#WJIVys|>abA>7E YǸlCFpu'Zw;H+Ur X ^d]t4⏍KZ$(',8S;ɝwLqgp3ݙ WWkkE"%R(z>:Mh]䕏Ķ|!b9Mt(Z=tL?Gz4e%K8nǻ[x`?Q{!oJ^˓i,3'xO=}fl z+`G'p:|lڃ'>=xiރ{Ry^K=x<Ͻ9Cq, 샞Q EkY6ߚW/|f|zvO=FG"=ĸ'ĺ!sOg hXEޙGQl}{fPL"aGְUv "k6 $,!EDdS!(",*reUQDDķ?EW|?s'tw>UuSE_*u*6VAԥK$2xQzr4F8ڍcU~Dkfث}1_{1χ #8FW #Jbt\$FǕ W at\Fz׀aIք5%-Xs֜d,bq,fYw҆%Җa}H;֏%,N/0^; xxtIAtA7#20nFea]6FЍ D7w ʑEP^eGY0E1E)EiEYE$F VH*)X#kbI-Q_P#a`}g41)953 At U br#҆H;)t{81w%I I?VI'}D;{w#L?{k5r' ?Ja\qr77%BKBK7ų j@YgAEԃJ1:f<ߚ[ p=ԏFvGooƨ+MPWZ< u JGG#11HA]IC]2ue$J&(ԕ,ԕQWE]DalF$sc$2\2bDLl[Pn-@Zuktn%t.:tn5t%F&й2Lz&m 7]Ί7ab]uUY^ ]+.lݘ#b>Z\_frm  φOOOOO3{l!"DyD9b?T68R=Lm0Qaꠇ>hZh[$߶4 J' ++ RR^Hڂ6 uqH]Ro!`9`9aSP)vvĻoo+ӈݵYed,=oow}{|\{k|x\óΌ +r}2Ia-lν{;dI~>?A<%=xfߵomw Ըc-r|s១~0Ms eHWM_u>L|x^v #ķ[nw5Bc{ڇ>sv\;׮DwarwWգr5U`}'a}R=O_7;]n}~D?/Wk3FQ(kT6juhlt7~Fndxc1Әk,4+:cf47CƗIqp9<(((vputttu;9RَyE<+͎]ݎ#o'WYqZHgEg5g]g3ϙLspf99sS3󜋜˝y5]νC/'W\r|WiWyW5W+55̕ZZsq::::B!C ,eHGy`2(d;Ke&6`o0Qsa/8>F1R 1JH)b E 1JQR@H)b]$stG,p> GQq8;1yv:;g8pv:wX(Dv!v5Hner0R3Q20,.( #TDKU8J\8'D={O Bfe`.(srrrrr֏Ϛf!C5 .-bq\V | IlRrT R{SC8!uCHQ)7HG8!uv5p,8Le|p\xp) _WCn}nE.}K_E.} 7.<\2**kԚЍЍ3Q201P@n T1ۉv",0  յյյյqmrEq2D[aʖDƨ*[.-*D@!]guoW˯#HssWt&0Zp2|\5>%zo^i&; (Ѵ~ӏd$,d)#kzI>$1rBsWJ5ZQ-BG{ :D(@,W)bNR\Neve+I\iq~'\;\ ]_ ST8IsU8Q9uT8_!nb/VU8^HX"{*%EMBXv$IY2IdZ$:H%K&IY2Ih3%,$X2Ih`$)K&Y1Rb9pPJHɐ"R$CdHl]R$CdH ))Rb R 䖂!MQ=C*NELN٩8;gTibI){j0;$Pw!%44,iYfe`.({4ճ%M,igISPqP\i(r܇"=#tf(p U*t{=].1 (+2`'e&bY8. eaa",HQ)7HG+h{|GG Kg$,(ő#.9tF*Kgt2K&rD.%d"8n\xp% e.*Lˍ5hmjM6t#,0.sAJ7nd+VѸh\{4b 0p20=Z]{huʞJRS`O%d {*킬ݲK!2+BBVu"7=&#bbY"u2wrX'3k7`eʀ-y V73aps94GYX} q`MBW̵H:BMZrm€?[>r%G$L i;=(!tHng;^ OiKs}yY/bJyS6@j!klң ՖP?Ņ&nhj[* jۤZA}? {5}`2Q{-ÙF`M?_,'j\kNIL7;qf0p$/'$4}H|".QQ)^V&rBMh ݘgEb^Q''/;E 7;jև1/} +gkV/B !N:V/cfM||S?n#2xeQ{W<~5xsدgVGnfoՋKΎ"$.G]i|?EjKO/bz9ЙLqwthz-G+J VhKӆ46h ښ&4&!t(͠#(0}N)t*Agѹt]@Et1]Jg GL_ku&}now??#/1~J?)z%9Z^;5{{iW4vB ݩ;Cw{vq.MG^Z/M $hm&ng?g?@8:ɤss8G8G3әI|$-IiiZiYZ4FFӊ"heZش*J"h5Z5iMR֦=CJz6 HIڈ6"hcژMiSR6IYڊ"޴7iRIyDH:&iM#h:M':T4TY4OqOǓ4t2Lj\Kjt:Mgҙ$ΡsH8}ԥ|R>A IҀ>E" 42MOY,iBWҕ)]EWfy}t7B?8!]^t>ҝIz =!z'IO37=Gϑz^ uE'׵BeKz C؅]?PthiLKu}.k^`EMsȷ͐ GPa:;,psw#%/7e xN6zE^MG4i1z'CzzhбB/޼Vpzk~RVpy =[pr=&Vł([_ܰ%-6[6[;a+]pSWZPUW G^OhCChZ-DVo+ڵzGѮu;vMk=]&@} qA$L3H= : :xB>E Hʆn JBzD LG'!\l^^C&׺7OAA}}>>Jp5-y;}}lsq!m/a.;f}aaȡ2aqZiZz9jrQ S3$Fn E J*1Tdثs(ր%{#NtOgmMi%ZɳqD&j俭)[`*Xuz`} $! GKFF'KB=<=q|9 jI¿#csOs!c[O[↼alɣZ,VVUӢZ3Ah`mrlmX{F{N[жi;=~vBX7ҩTY!,Zm(%i=j}1^F)k5<3FUQhb4cR1H81Dc1Әg,2yc8f|c6.Wr9|EHF`"X V` &X Fu`=>l6`) l[`-lv;`ƃ>`??8&` Ct03Q`08 'p8Ng3Ylp8|p) \> >> Usjp "| \  7Mfp n$hih]D{@*z:'Gxzzz<}H O?@R˓I%u==CHCPO 'M=#=fўѤg33xrȃI)ggYYA=y$Hj弗?x/{^{k7o'yOzOyO{x槝^-Vvkng߲ |P$Jzy{xzy~{ܻCG=yz?~@ nh7vnn4-7CKr%U _JjZe96>{<GcWqp7!~?\!M`39x7JiO3Yx^#`&8 ѿy0zs`%2X V5~dş|>-hx:}"x=gqP1]{&G)8R%} Nt31BRPpF߲kgg`KJ)>|W!e68G^7ԗAo/ _A&ތ}rxi[ vӽH)p7 _P3{fï%DN-rXNe [[zpol+*fVUɪlUYե(;Jz~(3jcYV\lZ]8npED(Q$FDx#|wkƩ.iYE-\*aZ5zV=\j!׷[DH)U9v_rPĂOLQ+x˗i +y_ş{xW!}Z?=+kHB3]8yS|1J:KZO3s\a'sMs i%SUҢZ%'*ܯOUx@ݠwUxHUxDGo*JU Q*Q aչX1 Cahm)V+U<֋U|Xu.g ~S8|XXufR ~J`ͱ{k$V+Uʰ-l ){ tXV+*`uX]Ʒ|EG*#G+OUg #Lc:39KaY(sK?ü” g~f2Ƹ}>bo? } M =J+R"X1VJ{YIVfeXYvd!VUbhv?ƪ&j(>faL+id )7^R5g(=(yf~LkBJxwo )*R$ܜ`N45sIdskN5Ls9ۜcεJ7HI<i.22K̥2s ^>bH\wp'w^HnƋpʋrr69[/.=m{yI^exY~415w<͏=v#(|4q>Ol>oRȓx2O|,} +^>'"rvȤ渚f.֌5g-%kZ6-kڳY" fCXҥ_.6`#Y&Ų,fcX6="ZbY'@vle9L̦zxޱX֗c6%$&}|Met6C|l6<6-`OI1R[m-c,[V<=Ǟg [^b70*[65`o͢%}mevaﲝol;{/؇#1e}}h#(;ƾ`_q5}NIvJzcg9v^zc߳KvȮU]L6wv=>'?6{?'A~G ;}>m}o6ʧz%J(wW{37 HAD/Xk_&_mXWt]_-$#ZH!ZA"iXߠ|5H`E[?+&I{%Yop]WO 7wBkuoBZ?-Y вmh6W[(އVhuhC%މj}e\֮=TL/UZz}RowֻpX " ^A`xX, ˀeH XVk`.lFV`kƀX v`O>`__?Wk/@4@蔼;uztztzt;`+;w """F Fb\5C5D4 nE{A4Hb*RT*Je2TɲTJ2d2j n][[qgU~}y^>)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t)N8t> N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi NAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVN**:lCp$}ѰH8xx<~O$x*< Ng3Yx.<~~N‹98~N_p ΄\˾6!{# {]s >N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mpi N68mu:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:sq:=g[GCaݽ-XSy;tAA5k* K egߵXpĖּUr#vwrmCgmh;θ>*S:)gk?GlyXqc{ܝDhyύ#*߽߽Gd/_㽌Z{{1`/׶Z.h, W¯,#oq6\ oҾޖ}li[ǖ}liЖ{ Q_|W)ppK͂.nˏ@R Xj?Ͻ{ϳ]ME@am齂{ڇU>gN9{[;LbfWS^S;D}oQE:S";#nIqܬ*m]m?Ӆ3~g'tDp~ECWKzU֔\?YRp9|nۋdrc9z8kRN.?rm)}Ӌ..>w+u]+K~SRdZJRG/2nۻ;g\/zm:6e׿-W?]8R΁C8{a\Wٯ޳*?rDF(7pbT8ihs&&CWG{Lhfeg}Dþ=;r?WY?7\pl׏v:Ow%I?W9碍7i[/.]W5~"v?)o|<&_T29>3>/_OgƳkxE:^Xxg'VwfejolʉIwIezQf9Bn#dq#d{D9B-Gr,bl^qXr,blQIS9nrl-GWq[c8zYG2(f]>YuYuy4.wuˬG2f]>Yfq̺A%:.:,y<ٚ<}?$(ɿߊFFTO9j$)^Aw*ѰNS4;hDgx琨؟QR<>]nθαbo&ox+y۝(vZT4:b:ueVqD?hWwD?~"UO[q%n#''ψω//3+9x~8^qo;7?<:m/~=_UWFUFWTWR\9r^eJʴrr؂p8 G <&(8 c88 O$x*< Ngx.4^ /tx)/3 Ex% _W߀o?÷~vncXUXQ_Eâ:3 cCGѡD3(i>5Ok4 /0˱!s;fr99\>ܞ־::zn=SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNq:SNu: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: 3p: AAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVֿӳͨo^3[#A߄G;yڱs}OO=qɵN3} g|q_|O?S~/zMpږ/y+G|P~~`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+ fY`V0+U<μoMxt4>0͈Dhy*Zm_xK:RpiG .븂w._ѱ+W{j_ZpCp?e=}> np㏱)ſDQ~ZwPUr]ʒʊJZTʞʷ*ߩ|O+T~Yy+oVj:ڮ&ձ'V'UO]=%+WUZzKuQuYueǪd7߮~ꏫ?oUT}Vj#knm\mBGjgΩ]P66veڜڼڪښچZ^RVQ]fj?گk^_ՇGG׏R\?~^}J57֗WWַַwԿUNZX5v#im81qzO7.iLo\Ѹ [+77nhxL`vp < Gq8 8NdQx:<x&< ?ρg"x1,~Ntx)/3 Ex% _Wÿ0vI\ΌZOHp  &$`B &$`B &$`B &$`B &$`B &$O'ALH0!LH0!LH0!LH0!Hp 'p ēO΁8΃7›x+6;.w. W{*x/\  \ pnfaf4ph Thní $,;p|/=%;(")")%!DQ(e2Jt~e2Vt+]Ɗ.cEXe2Vt+}Cv yg QqE^MNMKZhfrBrvtkrNdv_^FHh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6HhrL^ m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m$FB m4 kuzx Mfx · Bx\op \ ;rx\+=pp |z87` 30|nMp3| áB=[I5 >ç3Y>w. _{`FBI6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#6Hh#'m$F(6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6*GsFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFJ)mFC_p^7po[|.Evp.wnW{jx>Zp|0GF(7Ǡ98o-t-q>_Sp;|>;sp'|/EmHi#6RHi#6RHi#6RHi#6RHi#6RHi#6RHi#6bOFJ)mB}F6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF8n{mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdi#KYF6,mdil8^ \8o7[p>\"x;\ KR û x7\ p5kp-\A>S#p#|nc T8p |nO'6g p7|eYF6,mdi#KYF6,mdi#KYF6,mdi#KYF66lhF6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rQ9^9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9F6rmh#G9h+>΁8΃7›x+6;.w. W{*x/\  \ pnfaf40Z8=[I5 >ç3Y>w. _{`F6r6rmh#G9F6rmh#G9F6rmh#G9F6rmޣmh#(Ǻ0MCS}O>R_k}oQ?F6,hF6ф&l4a MhF6ф&l4a MhF6ф&l4a MhF6yc Mh{te5=ӵ>jzBOic>k zQ/iW]soM۷]M;%;~vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vl8wE;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6vlرccƎ;6v\XJW]tnЍI7ݪtНKwݫ>ݯzD1='zF9=^zE57zG=>:х9MZ:>g\_K}w^?GS;6vlvvގ;6vlرccƎ;6vlرccƎ;6v4cرc[ڒ~6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6ޯcFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +RWj]ku Q7fݢ[unSwnݣ{[ݧCzXQ=SzZY=^KzYU[z[]>GX'taS}O>R_k}oQ?FFh```````````````````````````#sFFFd%llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll4S碍V|պF:]tnͺE6ݮ;tݺG귺O=ѣzL =ѳzN^ѫzM ѻzO}Niw-D3}/F;}~ҩrFFFFFFFFFFFFFFFFFFFFFFFFFFFFfrFK6بQgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨m٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6l٨QgF:u6lhaW*]ktA7&ݬ[tnCw.ݭ{t~tЃzH=ГzJO=^ЋzI/ЛzKo>ЇHD.B'Ts}/7V{Nm٨/ڨQgF:u6l٨QgF:u6l٨QgF:u6l٨QgF懍:u6K6ZFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFӻs-ڨببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببببhaW*]ktA7&ݬ[tnCw.ݭ{t~tЃzH=ГzJO=^ЋzI/ЛzKo>ЇHDv]XO>B_+}oA?'ڨبmTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTlTldfبببld 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`FMcF 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`F 6l4h`FV|պF:]tnͺE6ݮ;tݺG귺O=ѣzL =ѳzN^ѫzM ѻzO}Nihj҅yO>R_k}oQ?LFcF 6l4h`F 6l4h`F 6l4h`F 62'l4hlߘk89N~4??.2{?Z{矟[9[/j'iMowg~mvg~>_~t?̗s_,_~gs4?r}{׸/Ͽ;?5~6g3/\vv>|6w˿]=}y?f-Ƨ3_=X՟}=s5_n6ms2=[rf + endstream endobj 271 0 obj <> stream x]Pj0 +t'CM)MC#9+*03b$=01ac0I8o.&*-a_.=MA5 w!;]FWvȞf8}va j[p8ɠg_̂;}S|Rpk4ЌZhZW8[Kvꮸ~< y+(rOx+]}íq endstream endobj 272 0 obj <> stream x|y@7Y '5x,G]GHh+JxsJN 72)5sRFЬY.[9;H7 .? : >-K.+.^[R-QDC^}3cRA\]?GoKfzp\ǒKI~׏ʓM1dQOSӴRAY4T"W/A.cї.R%-ޣijPXa ?-oK4vDy2>+~R}+&{JwPI7ho*zM N*od-W+E։v oQjo~Ӂ`8XqrQ3\蔵n6vCho *P`Xi3֥c £>D=O@~ xs%A߀J"|}~kԵJ%uO@pA@ʌA_=Hpg"O{j+~rB L' < howqlC 츞 -i8e֗]r e\.RboOSiːs,}Qoa MG.>z F(cr? :>LŜW!mzbս'Wb^oqW], wcks;x|`.׃3B]v<8` 3r+ xx c6@ ؇/%R_3+J݇\wΚy Ϳ[C^XgY`ݬ[3A*{&\QO֩} r B>S-FHZG9oA"z5@OCޙ)?"uh_R{зثP1kfb|ꐞ@ ]us9 elD`XuUhN߄Dr\zb0467hc(<мkCcMCQ's7 )ҫ@+Ay5SQI p۱.`#C83MFrDId cR?N\?hisu)Hژ::U쿗:{[#*vu|6,[_ŗ z*> 1峅:?Atyϧ> P \N8^aqm}gQ5ʴTfBWZML$o,q¹Xy7ڃT*Ϣ=ȲkD3S׆X~A̿!ܻ^{\y'q (A11M5S7b22KħxFr,P')iOa\+0 C௣lXy :~ERoaul8c?!ޛ,%m io@G|ƊU7^a]HC1XWQy-cg^A7_}`'xc ,),j*^鲰#=*I)v\vVqj k!{$xOFOiH#44zj;Ui߁ߴr4)QMjm)F}5E{O(WmFc8_A#jFki$Q;P&˅@˼.D{v#uK rn'YƳ'zQNbq6B <{s^O޷6@?+KG6@;#л36єSGǠ#:O锆ASlZ5 ͲNU6`vک `$܂Lˀkٟ! F3O|^6>!bIq#,=P!{Tܗyo~,#J;2e4^,Cżb-Jr^rD-sWl>8;%ۼwЁ3(4141tiq.sq..9U1=|ٍ@zyHXuց;|P_6xat6tGADH_y@GC`lHop *0c``ַuʷPx5r=.O`aދѦ`^$9]P~<‡o|_ ߍxo%Xcao5Fs/w_qƼ@C#f{ag!g^?]Qմ v;0+VDzҬpv;ﵦ#~%م2-JuUҥȏzR`&*-ο-4O4>;wۖJc,).JۿuC`>K_ڱM7} $Nr}=FYfK=q>#OmHsl[W@Wi G) S|[y9`xϾz:=n7Q'5v!Bg/Ȣ]ٱÂث٦NŶ_X#t{&]~H?nt0>5x|їʰ~|B[ΛiUa!y<}6h¯{V}[FMv)P>+v>~&|Nܱ5ج[ kQ4Ss s֑6@N7- 1o#*U 7zm!op=^N-I_6}/BЛ8s+۽|gy z  BMڨ?ort:^jΈ_']/ns o7%tIQv.Owovh?#z#~7՚%}xW2uͷ?̭oɢJ}i]c ,!Ѹn) YŐpËI )gS( 1 .PcD>9k<r|Wl]}\'ٗEbkpa/Rn;~vO^ys-3p5wumH6C+F|hK>emkO,G=R%%ѷҥro ? SdפùR`} }eHҒhȲ>=k-ms[lƯ5=cL3aݼF9xws=@h{~0i&x1 mvF c/xeW^Mص>mBޠV)eFi+>3惴@tybխ̀vQguF +`OF'ؤc?8z3` 5)`Fà! UWړċh.}8.}3n:aK)O_`~S+b)˥,|;TJi';xMiC>FW}d5uV 4ǚ#{y?Pg_rH @txVKa-8= d6"hg4|3YOo4/qȊ 6 sqM_:w9Vb~VtvZj\a|')NbF?Zzk5Gq:i,Rك!\%zt'ȇv;Nq7n}MxZiω#\qWs~]>ECGSk 3`;Q9c."j( _z-M-ܼm_,ucLEk~=֛1Χ^S^gX`w@gQ}ρ:q9pO:w3r Y3͞t+7v]='߰\M f9/7~ ~ :ߍj-+*E'.&=6j.^|?9gUu-*TMib >Rj [vy)thN >](?W|q#>z~5\׫? ԑG+Yu0Ơ[=l?r/1E| q4 ClYo;Y$_'OKgEb4zVӵĺ;1[fF.=,Z}دW0i$:4E !5t )AEGԝIF9THh"ZK5U~ t$z2< :{KbcIeT#cPfҵ(YPchIq`JWzn7_Wb?RU  npx3jA-#uMlظ.^~) t QFK ϾF=&]_P8~\hy֦/}ju!/4p@~IӻWbuuv/1Cvm۴n2EfM,5UޡE@śՃb$$`Ex=)Nq8Ѡ` x + xRj'?#n7sFQVd Jע;Fk*턆9ߔLSV&(,wAxL9ZB.%bNΌ<#~tM5ȫwQ7{TyPghyQyqX:oҵ̢׊o ]QNLW@UJ*+oQqjUQӋ bՃ}Yʉp,j%\]&Zd+ДZN"㐟R9 4p9ϓfg? z6Z!Sa(-טܽ^FC@6_6&MМLG$zp_fGsd&%}rft]&M4"6h~S '_.Q:^Ҳa5}lӆ @Pjlۦ>M;ǡ`,qxX>1pd G;w6 {\)kRnN4蓓e,Ȃ[A,T%eՄE*{}@A2y͠>{R۫P/u/xXP²KԠHr<2^2K=2qx6@PooMgm6K}|Rטk,u9R[-4 P( LSOI3v@&\dZ FwB=ߊ LrJ 5 $YWx00IiNSd`i/MKS_2%I巪c.f0+ ZfvAj8aC9ȡ=mZq_IڤMzۤMmon6jI[IkIM٤M0wla|0>[-g 㳅la|0>[-g 㳅la|0>gbbbܵIvdM7;}xt10(zamH@xIa%t5е5Q 6Mڮgm֐jI[PC[ ʯR)&y6ghHa}`>0 H.~ ES~PReRhBa \jFDdK]0PWʳUWȭ($ I7O]W(< ) djuWȔꮽ@8Wu)Qt\umkt]E]WS(h 䓴=ū'|RWn5~p|K>]׵VU-{zvZD3o>ceW Vc`|x(CO$#>Eor*4w[rωUV#wo$Fw-I{*q1h!ŝƇ9 _@,g;я!C/{twsk,_E'[YZ㬊D"bUYY֮HW+r.ݥպVwg.*`P\* @+-[M $dZbL_Bv3>JQ()=8Ual4%McӢꭰYC˹l%EihXmT !QC"?4, B 9 B=6Xd \D+8ZѨNs }8 :dnLߪFm33okԨ1ddc%N(Q,5w%M6.%2_rK>wɧ+W5ÓQyD3$ /lU&Q,bcm$R&y2W AV󁥧O('+)%KieR$ɲ4K͢UYJ$~J2g)9U.J+/iۈR3!yz_;BM"n?$*!b8(CfӀ 6 DIQ͜=R9 :YفwnɊ@rK{.M( M8+ןQPusOYfKف@ l*ʄQ4MiUaaeO!V&ƂfG'piϭ^㳯UIǁi}DZ '=c`!?s\;,3` rϯDcȕdydv`/Nΰʼn'Lr)~Dr;yhI"#c y^+Oz.9';U~GNA@f{*2%Z*D,#-`-H%JQߎ|%_ vxiNN%%rG2 f|bl#Ct2VB \As7,'[Y9og9tw'( cNiٴΠiyvkd+ϝ">A|L2tщ;'%䐾d*b݈H@^cr|J!B \ câ`9<`/C-Ih-b:=*yGy1'|TQ=Rt\:#g1ÿ՝Y|J%, {"+Q8eZJ21y1y 㯤!o!*ó3xt苾5?|*xm ;Ux:]x>| )9NS<-t ݏ~rv1 P㭒]]9ӸѮs-3dHnW)-K%lr<]S^(?-*\*ee7գ8( xn>T濃X qHkt9ͧkO Q/>W!yd!\@Ld t`9 '}hNj˗^ _!k|y@ͨ{IfG0*n+0"'HЛ'UPPǮ Sdt"{!z=­PLN8i^%K|k"GnI,~axD}XKχ+ P (VQtXA:CM6ٽs1t'%]NCFߓBяyq)NIvyYx̓OI:0a,v-r%O#+}K.Lލ]҆oU:<|22cW7O#:܌`[ |h 9t:65󟒓'H(qwTcΰc,I!v[2U-_kE ȳrYIAL^"~d ZKY BEYi'L?X"*K/RQJݕQݕ 3PqFq#W3a~ƔO$y̴L#fq F1C([\i2f!pΫzV:BhmvXT钢ʚƈu@+7-2I՚`a,.ƴh|&kC&5lhӈuvuG#8\"fY"=1vVTAaax #ߨx1d 9h{$2qb3!@'C `,Z-lMLj<)i3mw*kMJFNKCdݭܡ3 w1PM% %Ij4HͧƘ-a`6;GcHӫpUb@Q (<>[Wdu/fKlj󙀛x>6}Yh3|kv/4#%P*:0*$'dCя1 0B9yB)">1uIL~)ָyxv ;Vwt1b @i8 ^+>&0Qn)q&sIjHtBtgZgd] v % F"9 *RK&!,y6}upQGNvvuwb}8x~\R;frXQ{ڈ[k*t|}ZSVw?~no [ڭz''|Ar^d7;uӉUCۘ<*+N}"IE2!c36Hti N]$$C+E԰ b8IAy8"N;kaˆUK1V;=NIlHFŢgaKތښqBUg%5XSlMz2/t]VVRMȊe]Q[V647'[/Ox摒™3W=a;?{~ä!~_?=տɈԔėVY_3?"_0RiXqS*#Gu fFRk9l9n?$Wg|3 ?ihL mŢ\;߅NFMVxtSTX`Vxܴ@~]'IpT';El4mT*^ɍ"V )XY,I95ܽޒJϻ݋[EΝngCO;4 ?]ܰdωǶüȜ 'Oʿs~輪>Qkg xtK>@X/C7V[{ͪJ8zvK%2X{&b^U^DzvHf&Av [ai)ʄ̜@|c;9,E;uTb1,4v Y ^.o%>G}h!0zpUuǜ9V$]XZk" }h5jߗt ׭S/xԜq61aČc#&Jb̷dYkYAбsFc|{fL|s kxnR^jzSxd~Ҽìl,UfJҮt ;(J@rEv١S8R!}puds_%L4/TWk^vH>S?y~3ߥwu)6[M#z5)ר.USiTlE((jJ56lE,1☄RQ(SVy S!ԧFLKҙ0VtfjOeXXf"fɘ3YZBhΞ_ QYdOeMC3R-饵h^BP1HcRF02PmqcN0:,% k(6/8a}h]~{>ZX^O:y>4z<X|掆< BDlQ0Zmh(3 B[\Dba *U5 {^ddo++fC~V}h/N:-"&sC|mYZ҈;ؓkFk,lĝt'2Gž,z6d0D0Hj?'r O^8m5[/Y:@+xFH&+5u{c:yo++Da"P ΀]@ka"443p&3̺I<5:e5-i4f!3uzX+&h%䄉իdLK~>0oBn0~ȿlm/s^F?(= M&>͸cKol_,#f"?zW}-mo~rz$jVҳcYh-A3 D7r^֕JTI(YGY"IRm)ixyzܥ~.>?_p556Hm6O?>ƀG]/.C"Vr,ךXdeIMVϹ aKZNjkZ$PBVݨ\ ; 2۬ɨSEDFYT6PVzV2 E1ZM Boڹ蝌f:;Up7X D0J/b^Uranr6Tj;o9uBS,Bt4 Pտk\,*j砥&J/!Fp'Yn;e4B|'X k$]Nfx2:(ᴴo W=x+p[_ l; f" V[d=TֺdQLe&(F2}iV`ycQMДX)YOC!˙ B0B(LNĕъ IDKpN8bg4; _da!u" Q\p+,tEM''@IZmG- I+{HDL (J~$LYY*+SM* a-h$ 0K"re諼< oo?~Ÿq()身+ߪ99fp7<颻agEh_FSV(t-=k}]aVARA䠪),^r@}Ͳ.=lyDBv[uy}I]ɷjsru&O'o&yʭ\k4EkUEͦ#=g[ug]=Qg̐LGJ6JeKT*.@0d ZщtR1uX;16Ya 3ѐo,`B~/ӌHI֚o.x"n:>Cߑy&f㺎9u :ٝTa=ۑ<"pVd,8{k|1%_sɹ|(@!h3Ůٸx}~Ɔk>_d/.h\Oݜ&V%}ͧA bYN(z!ҫuJFV9((Faba;Uu)0DoQӥd55J3yUiVd]m^#k5_'IzFɽ !٠zTl.y8ZB"D9VDUAiEY7ե`V\R,D2O bl&;8MJ x2,rߦe-TDo' fJw^)5qeEn:S3\tnRv|7eҫq㠘4BIkaZGn \1&Zk{*TH8JH޴̨ܿ)uQEń#XĿDW ½o}|&Oj;S>ޒB F3u/3s)7>qJ=\.o_B֘4CB0{;?# ar?_Y"zVc5LE::7N,vP݋NNWmGZJޅ jW7B~[`ۊMx2ױo=y~o\q/c?$~JQw]Pƿܖ Z_$$=: Q5E !ѡ`EEN9pe~a1)eE"i2C"0TCҋUK9k21R,/v,sr{Z0XR|!)eMۧm-_}8ݺ >6?x +B& "^7oU)!+!#ө,MʷϳoZmF=z}NrjcmeumM'Σ 2~ x}LW3}+D<' 8d4ɢʆ")|B6*#NK-] S4s 9(hCtZ=~SBIFtUǻ+0~x}^w$%{=,Msp5s;f]0[i…E-R;w|Y:}sAo@槃ߞRQm)5FsTT̫&[qֳwGH_WGFaiU UkJ eچe#fSY>u0lQE{F4H ͈p@}M$c;y7PN/_VBr8ljH7~9# 'Dx$y.o4.f+77izIܓH$Ho+4 ] bMҥHN[]_J)xXO ),I 5X4RM.sNP`P1JLv k[`dlöo?I/bPX)Fti#F%BP#KJ%| w$C`2߇}}`dd!5Pcu3 ^k\\J*}uڪ *!)<'AB^cH.fـPěb/!17 bE$$E۽^Z5uI^Lt*ݛn8T3t <߳cгzȩNY;dL^1ٖL>m~?aď+a;sdO[xYg) y h"+fI@&>QLrKjXU?Nd9[Is^f͓ʥe$QXXZ!BUA_%iak!D4x%:ExN8He]G:R rk'ZQ$ـSЯN8ㄨwZ:͠dtP9hZ(>?0Β2In2!CH #H.kX,J W\ВąJ*HҪ򪲩%l!->d,yZd}%<P³T\}w&d2K2}w*}*:N<=?$<K3o`w+ LG6E'r,12IVW&PFa6ԁzQ~m zm ::22Uʠ̙Bk[3*6!m?m&ev:WXu.sN5dZLVzCrdA腯[L;í65h[LT {Mw {\ޝ1`1`Л/I};z4c`n_HfW0f;]U٧+cS`) =~r?H A%q1dX,RIYAVp;FW;j{ʇGޏRBF!WxMhĐ҄AaaUc1Z1ZT`d&*foe ye*Zm6KۣaZvI#Z ?KPLfV)IUgQyIwc$цd㽏NӜ8ѝAWEx,=X"1sHcKZ#B{3 #8j'Pzo1۲K3c /]ЊZeXq$7 p\|!jn煅7_p2(oוhv?FGDKb^؃*(Qd$&3' ⠧ZP;U "+f*m3V˱$Eó y2|B.MLYDϙ s -:d>4Ȣ"GMw(LVG񭮠C(Ik)#zUӈibR(&qYVlK΋?G z{zqC-VLtbyԀ=ÕCʃA4]: q!:\GXa|oFUbTx"I5`|^v2ϓvvV8ZCQ>AP DE)'B0[`1Ln@ILK9.L6Ƣg\ I:yBO>^ǹ -P塧#;CCB"* ,, _,XY|-3 . ;B'g"_ӃpPv ̞lNd(\Div}#™!O\ X7dpy,FEAī A7QPЎL`ifU6} {($'0:#V:JoGcZ* C}0 (2z b [.flGkM+J1#3(x46tղ+]XNXˉ NY'cLƆ$Om$O?QޒIC)0!n*`"XtÏ/]⭛~<=aG:}XyEMoa؉- 8"g8xLOg0ބ [fLpOEvdae.d8c.,hep>/Dtd&pȖM m`JItO-Dv8qEmJ緵5UX+:J;>Hg~(g2_Rʲ&kM'A Q2콁 Iuټy +SǦ0=EyxcQ0 P~PjAPjT E)B.:2-'َ܅G΢SqRT &V*- 6K٣`xAF٭\V~h27L"/JR*?[ԧf5'jH .-%s؜ʊ~4Bhf_D»>nS5 !3(@< ^γL|nIʷ XY2}YSמ9xխXV,\|S XZa&itL=fw-x 埢+١28ejQ+Uiu֩ urftPگttc)++W! aRTM` kh:ua@3Ñ) r)#jZthGK:6BBщRGz;l:dC5!z ъY3YOVG=)rSHmqh~Gga1ŝgju٧RFƍZQ/̷u?ܛVj9t/m5ta^aIpF@F20 ^$ 1 uD"Y\TƗ Si|_-Ϳ-\5E=h@E&߇8HC@ 9,e=x!iVJ\)x'lX$ynOS)YLK(D,!K,A q,?J!NSl>qߤLUu.1pG' r;ʟN)Ex)|)^ߋJWҎgp}2Y0S X &rNr}$Sl핤82#=̲EpyQh堓MnUZMMtҖbW 5a# ^I3IYq> WazRg6]&*X&zEYUbR8SQZ]0PKِyZ=n =\II-1hwyjY1JQLLL36 `Xސ6u.`Uk3R[ ~`ʾ𾴃G3OxN Ne˿._\m}y!{:b#RےϢ[*Eѕ\4 MN"H蜳wK2%Tt 3O>K }Dw|2M:x\g'0z.n1cvg%v!ַ0ct݌Y>1N (OI3z0Iw_.^^?3Y y+ZA`h3Ep}LMݡ+dmMަ2X~V#9r\+-j|L9|W macJm?D[U IViT /VxAj (9( R:^R{TdGTdj-uʚb!j02cL!$ :% ?l3g礈qѱ2'\S##a7x% |ג2?Dx ng&]1}LJ޽*x`(xrCԆ*?%߇ȡG!EL5K5Ni@r7}>o{{/͞YvIA<7ksP\"ǧԿ| Wj ]DaR+د7i4}5%*My$A] 5 `KN^MKyhќ8KhrvTXiC_ Yxqƾ;-E1H'>;wM+0ᕩc˅ŷ):: u?)m XtVK,Ub@k`@{`@NeJ:/v4& Y\/˓3V%б u ~e9cUk-)վ[rT]}Uߘ&f@C)|{{|JM| /+;'Wh2ugfR4 =L|ö&J`t_,]FD)3bE"v1ڄمF p VѩcvȢZ02Q`kHaehCrKI"*d$lUnxJ@Bjg8a¬fq.l=g0 :rGɎ&Kd~Wx1B_}9khߝkc D_M)o*/ʻ>~@z4ﳦ/^4ȰH^̻q͏ w^-n5ƇVU ?OoS/"OSA!x9>/+^ ڝK||wQxs];ͯyיNxJUθN^~)n^ķ}or5>OV5/-4MB !t<]s%vx|&}'B>bD# }2=(+{:24J^(í̉PG{Jh&H" zA"R_o'*{|W|o ` zܕs湅wW48v JeB־Eن琀(p*\,ddrrϫ͂'mZ/T0a+rf)G7Z7h3|]F+$ |$ҍI$[]  䁼 we2hf`(Gq ݪ⚭vCꏸr}߱060RAL_:y^:ŪM ~3YњQrz&f"}0u{tTxޭӀd9 b  ԡ}?x?-#v5>O=Nse NEx,^s(y~y1Y(K0Q]"VKsX(ed( B2/l*Q 4-LPlie,C)<}0#,Χ2LGY ̢Gߪ軶&vRoiGA\&ʯIs%$ O M ޖb#i@ "POcb'P¨}U[ܐPtv5$\U}fYͻW)tnLӹE7}rhpx+lvuʻ򎬏S S=DeBouϤ3l:nL)SٜBe -t4fҘ28E)lm& ։ӥ< ^^R\@ \![,- 2L*&p'$~0Yn39~xEKy5yr6Kot0O&q1B$IZ(GxYQ 9~).t+mE᥎\mhE&Tg kVa5/nQ/ }Ae h TpUhڍ3R.dc sWjn &;e֩0{:_doszv;M%z$B XJs)LIof{O>MQ^nsŰbrϤ&b7L=0cNEO6bJO=Aūgƿ_ǿ^{?vC˵rޖƊO"}[ U!_/BqQ|pmv~HFa;چykM5eJSz x7CiC&z)x!bLFc++"R!5{ZiA(3 &k"@@dzR$ ئ;f;G4 0Ii$YC L4#"mxI7N/MiwHA7hހj-&4j`h0M'{٬hVY D\|W(;a1.`MF[hfaɓ#z2(afW*KCâ)Kf,V.ys;cAfm(X(p0<Հ YghJX>L}A lImP^͑Du9.FDwlwH~=Tv8уAk(Qu)J}9vj LJKa}q0j51:2$* N"E8W7`X8Ni諾miJLLL*3BY03JHKÅ'nipOQR-+WcHS?`_tuj#l$ $b BG # m2ۓp:0%_#?:SMm$^r9ċ(8ʐ8|1*A #etKb.9ȷ=±Fp(nk"pkh}$Hν<<%*˞dP؊Vt=dq'oUNZh:ih .4&:;e鮸5G ;U._*$?hNiqUpx|?n!9[+:[R&cӻ嘚[dWQާ^uw(v^Jضkl9H6o FpV\ꚵͺ7o6n6IvvlGf?}P ݓV7~|Irl|pN1@Mրc6dqg̙Ŧ 4;ObO܁`bVs@0h,Ef?H`GV[Bk[t_1zp837SIe@ߕU{頗g\w9pƇqgGˊjy{̿i-t}7lk䕄{|c/0n5弓E/K]FA? g$/db{\ _vT ېed]fš8\ L ƓjhlVڞcޣj93* os7 `I7>l>0/m&PVDJwbTb"]Œ7Sa,A3w9(ky~a~+XOW]?T7}6SSkbݝm,h3eýFQQEQZ:ax]]^~e]xI`KoYA(!((W|@=6:XxVJBա;HUGt4 G*tc*d0_M=ie)Ko$ǏH;~ !8KT'.VƮ~&Itg(kQRZ eUW0d 8 )D7LsLKLl?`?S0&Hyby>7SRȏs1 04|gaAC&N R $8 NZ^cbwJ{~3Υ&OB _-q%]_]sUO mōkꚘG6,^9da܁Ý-},`yExC$Y"+7y V"Vf!a `'rk4`uȇ6bAd"' yvK}3[l.! .MlxYцi0a&vRLPc9l!bZ]Lu:\n/_5ELM|.:=W[W_&̚MyWﻧ{-}QW]^ȢkZcŋ; Ł; v?TPȪ˿scIR+1Z!n_+,opkn}͞X)[wY6R6a# \d#_y߹v7&w}P+֫yd;M=|u]7؅owko4/N['Ɯx^NUkCcvbwj-R=$n"<Eցٵ,n|e\dYMVlq-1 .`7,ZO=fЀy8{LD( DڇDol8F"Qk1$"zs_|WxCo~, \me=w68ܤ2Xu>-o`S/=4꧵kynv,XJ 4֡;1,( pdmfsXZ,8'0_1szvk2e,LdM$Ⱅ<%ϸ+Hý<C tswhvW/Zz"y9l[}K[QȰjpfڵ󽅫n*Z|Zv8,|zSPӠ!CJ pKTknheVl*~ӊX5fdlŐ D*c%^Vy C$Fg| .$\O3¢O6좿6:[3iɮaY^%Nt:Vta$qԒl!u2eH& HQ{T3ߨ~'OWO|棏䘗;=ku:Qk :V=r1a.g`*xS NXXZ5éxۜ2)J>p}~bKÚ6ҨPMK~Sp-of>m?|%TX-\4ou`e4MfkL8TjK`¦*h]lbA=T٢Q GXX" dJHFC@Q]PUsx.R7Lo/MM:\>o`I<V{/0E$PuH"2MIJywp%qNDP@g8,IR `sN$:!E3O@rc c`2A OQ5,9<|=޿n]-[k޻:/(NP>o˾UIVo>,0>oC 6ƲW6$lqk1żƩaT>sr&`@pEȀ &Ѡ3HEn, N1E\E`щ5nÛz[[яv7ܾޚd=7Z5r#}>%:՞y9r4P%aeg|:e!YP7C^MW+i9LcU*n3|W/-Z/'I/$>Iݚ1&j|"ąƲp8*Y+bC ~(q<?q\C~o3~CFE)mD5D^]0gYYY]`~U 2ު|}4,6ߴk?sշEoἦ+v3F\wp뚺 6TBWR,uZUʎhk+[0[!O'5R YbZe:s?H%sWp 77`\dzSf~#7" OfdQ0T6`?x0 Ebq?cz!F?>"(_/ӀT,Z $FK}]aRZ NqK?ONfzJPZ#ja~V2e)C_8`nzޞ9nI?hO l/+R/7Ja'5 y+K?F6f;8+ZS$1ke%EMXvF'7z~JGBůٷ]P]bTsTKTlI;`ƀ nx,D5'lv{Q/ $Xm+ mfa[v DY]1IѠXu4h[B_ E}u*bTF*E,;v,uV{}Kwܣ鿞÷7 ,7TLGؚ/?n4/ȒT հoœk[d(A[4x48[aID:|zM v12蔱秒dkuާ@27ČHDᅲ@ *rL|[p!{Kk_;jŏ0M-Gć2Q1 :;ޢ÷݂2MdfWOʷ` =2W[W,{͝+{۶</5C}Ɩ웋v WuWEN'ڵQ$Ũ厁H@mb"9VmV:ØE*jC=LRn),(X;KOS+;WǷM<+h5Wv\{ B {L%|æ:VcoJV!R[P%<>lsyV'ߏByyy3p̹VX) J 5OQ J`YcDX8Hv3l^bL?H}{G]r*<>=T6dپn,,^Sk̫F ]79ҿs:F3-Pl_gt$MAWǗDloOau/^ARJKjjlAHj4?fRٟ/NV ECU[@TҨ3odǨHY~PYj$.5xOX3{nOډւ}mMU7j2{dCKUb= M EDd՝4 BGt,Xgw /]-pf[0: 6GPITXdjKBE0 @,n8~qU3s~|-+xpfl- h[͜\Pa)@D^DBS`f5bãY3Ӥtk{{yzRE&/k;+0 ebauG~sK 6Mf[A;{CM=rϮ׭]Mrtڇ+VnjcHqF0:Cn{8e&xCQ5.^;FZZ#4: nfޛJY{טsPvnjU岢w/3a =uOMz55aV_0R͔_NhQ R ynx=Tj5gtGuGG27 ^7{,1k A['\t}9[ry=|Km>WpO/uOW*O*7 /J x4^ѥt)]Jҥt)]Jҥt)]Jҥt)M?Kӯ.SpHwRg&w $fRU^ s$?r%#oW遚:57^k}?-j⺻ԝ62\ ;s:qzn?+>O ܥt)]J@}W8diK3s101dC̭2# HAa5˴A!!ZtaUvb c;aS2"=a9 eX2h֢&g Ռs9=,*˽.>Ha;r_a /PXM rHa i'/K<#@d>a,_%K /%Xz"2,_%KȻ:B{2 ?Da=ߐa_00`)l52LK)lPevBczWQeC%SI *ÀOGv+XH2 Vx)C ÀgOi52 2Ea rO}2!_72 xV|e p*@o%O` kf_3. 3f7̐ACH@a6$oa4h9 l`rZJ $uBV~ѳ$&n8њFH-pI49!Wg09z[>@h!}Eg΢(@qFvC?^CζA.)8eh"|t ~*>Z=PBr)'.QjgXT^J/9뇶'Q jQ ȣp" QΥ'i$ }Nѣ chd$8M),1B#)QPMq"G{$8.]s.AJK+lP| \7@)<C-VdZ^; tH{ QMC"~H2MÀlZ m,4JK[ i ϪP ՁD/{B.eR)O[Gy,бTxFJm7Lpz# ~F(ҵr+I=B) isl+$M(?CC s>sg5pG@H|#x6!S:@ =H{r J~ɭK8|^ ~RWMO@bBD8OtCb QJ}VI#X>JTI0A#%"*T!5,,֕2 sy:eOF%hT*\PT2b6{$PN蜃">vPR<¡PC) mne%K;m-2SߙF/jc҆'Iњ$3bZ?k.S3"噑36_-iARk+!YJ۞"ánJ<(Hcd6(Ly]:G}t\LgGN-0˺)}5dOgҭ5mMHaaK<9CCݒ$4Mϰ=FG`e\_K;Wg3g uz;?ـxC2g30G4_CsgcQ oVZkSfi(34fڔ BUL'Ϲݟ" cTKh(fޙ3e~kAM5-;iN+JV"]9"X)TRk<V9Njpڸf$srC[&5;im ~z䊅 ZAvJZ-si  /Ī`g~\mf gl1m<"-6F]ˡJ#Y¶ -MsLTg\BdD[iFʃ4rJ W.kyF]FϦ$RCJx6[]'=JthBޭӵ$Bʹz&Ic!=뢲"YٽDk5RWf4jR30#g|,BHyBZZ|H5B׶6<4=v %GqBGkl794+%BrgO/' JB_rwt`HKw U6@GC0>ݗ=Ct(s+  ЏP6;:L+]#]E+C5b(k4Lh{b`hg{W6.J0ւi=}17q[kit/LN6^8NKL}< !`Xae0Đ`i|!ε&]WxAjϽ>|9-{^٭[z5+PY }Zhqk+Xl4j. lZdMBU| n*6k.VnsnB\yۂ0̄"IJw>+4|nVBQ`JcZ BYnRkg-zmTCFF3OxN@Ѭ*+s]h 9b߅V[lҜÌXրL?Ivhya]>Un 757"N#$ˏWhIDlγi;FU]nRG <ぃhc55Jx&FP6ҠaVanQl5o_Vٛw6 2JjďNGZm>L#yDʷ1#IԙQd3C+CeFi,?Qb0\iGb\FesS/Ydx!k3rDȍaD-)Ezfz Mm)P4d' f!_ԡ>9#7bB>JЊ>FǴl&`K S1:VbclFG˴Sf,k:M 4K|Hs%M^FQWfEdC<y.rz$f3jOU[2" ng)c ?|qI3v;g(4>p\DŽ_⚎SmrڟpM!?r!/['y钴Vcn[2Qm,G-wrܿv5;K-tenٿ[=-i9}2 4߹B~Ni?Ro;( r5; AB וgmOhx[۹sv_Pc>Gie$ZE M/Vw(?,i)y|P~Z>$E9(k!W*n U*F›Ctw!\5<7ߞhw|os}R&ܖ1 v;{'3Z}&"ҋ~Me32p,  &N$^ęggA]ߔD))%IJI}7KAo~L_= ~\zYZ 7囂$+geAH(/* rI@A_SBFϣسqAy$S=~7 &&ӂ$}$>۠HJAJzAoJԖ[S[AoK٠Tb2{ ;:G =:/)'@T`rZy PU)oz^ExM~e%e UПq4@oZI>N'lS2zfR3/'. endstream endobj 273 0 obj [ 0[ 750] 3[ 278 333] 10[ 238] 13[ 389] 15[ 278] 17[ 278 278] 20[ 556 556 556] 27[ 556] 29[ 333] 36[ 722 722 722 722 667 611 778 722 278] 46[ 722 611 833 722 778 667] 53[ 722 667 611 722 667 944 667 667 611] 66[ 556] 68[ 556 611 556 611 556 333 611 611 278] 78[ 556 278 889 611 611 611] 85[ 389 556 333 611 556 778 556 556 500] 179[ 500 500] ] endobj 274 0 obj [ 278 333 0 0 0 0 0 238 0 0 389 0 278 0 278 278 0 556 556 556 0 0 0 0 556 0 333 0 0 0 0 0 0 722 722 722 722 667 611 778 722 278 0 722 611 833 722 778 667 0 722 667 611 722 667 944 667 667 611 0 0 0 0 556 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 0 389 556 333 611 556 778 556 556 500] endobj 275 0 obj <> stream x]j0 ~ Cqv2aXpl%3,QC~:?[]; cѓc\aɓ:WM{Wn;$;j".78<0QWvȞ&8|^z5oTm(^LA9}N9>PK4ЄZhZ;5pv?<꺸CٕY 9')|~o' endstream endobj 276 0 obj <> stream x: xTՙ$!wc& τH&/@!$3Mf`LS"bDV?qժ֊XUjmwWn+-.ZLfso{O9s@`vTV}l'#ms($x~.x@z}Wռ#<}ޑ^9y'Gѭ8\5W^FBƒe(+Ʈ[ffHfϚio \]a[:$wd'ԫL)%5Fnݣۻ17*gfڎGހfiK6uYѴ`<FGdؤ3eh`%h@\l@ccPKtd H+BZ%Oi,QrdNpŒxԘQS o+@>\CMiLOjiZRBKD߈9EW2|IyP&  al+l -lD]=Yf-\7995욚^-c%?6sj(K0ovר$s|Kܲas<ڭŶs_>=A.> .gX[) cE XBU{M/(9KWaffZS:_1c^( \KQ9 2ٻaFvl:n7]95v7p븄G'rTI{3xDb#0&h)gLW9w&'s Tc5''Y?H8b̩,Lʩ-xm82rPaUڪ=8+|8WEXXII[ecarV{V?vD?֧sǮԏҏ-ՏYc|X>ِd0 F3p [)}F'Lt lhO_l9b P-\KGiQO:GR?Ĉ&@KgC%J[T}ۖqBۑr{1]a=Y=Dܞv;ե%L^t[KgWK3CA}>=v uQ(uQӳջZ:Dzj"vrm'=wfn!wGmG馣CQJjIq5Ӧ47ˎ&qh%=%稻uJq(!=K *jl t+ոjO5ZfM`[׸x5b.T%K sY?< xs4o:U^_^O`<զү_ayT2!9Qn Dox$pRNUīR\ 9x/,ț}z9#yr{,ѧ;z9j(Ƃ}sdUpB7 H&?@~7rI)rj!3r{HA ~sO^ˡeW[!L #\{9#dD "zqhN8`>| ~'B&9y9򟸪*a)ll߆"9^$33h?^~>"D#_#C4Zi|9Oym7us21Fw H݁p=ы{x#uM^!] Mߪo91G#h핰ߨG[pwQ׋YJVrNIn&'Õrqy|_nZ-8~䫑5K<0&脭 õ ۏm w<=x>j}4lVl$H i&ϑ?sbn)Wͭڹ>υ1Nƹi? !xANA~# "26xherK "=2=B џ6̪zrؾmc= = axyK*='_ 1rR񽌬ƶ4D%~ryv^N8;w57]s'SLJ~ 5'Nڄp0&<$<)LX!GQY].KXס uûI8?q8z'KLd~H~2rn3PK@_ha6%\;fnKwC8@:6|*q;s(?A>s;&FdtGbZ(2W-'\1wB Jk =̿fvȟM[#x&C^ׯG&':XIL& ډ'7H6F㞃O795؈½7'&ԁϦ>ggmNį=Qp`ԉN2c@xyzi\VGLPW;QKʊE|sOO%6΃$_x[xA:,;$~3&?Zi l[qq|x e_zOCGu$1b,YtQ~'\ K`zKy}}KR׮]QrK}bA74,zmkrn kk[^FDccD0p|BQl4F }!&F'ba.Mq'7OeΝx=c!HקĵAWU ^il19Œryaan.'/4&yaJ, rp[*[0liii(0-T 5͚.s4gp‚|ӳ:*2%Kyar)!esQ|jeUCYiz+}Z5Mubu" BbLUV$19-uѢEU˖.I\\ K̄S\.YMo,ؔں9ϯize^6Ɋ+ԉ\SX C ttъ~ߎ'H1,A¯xh|V,8"7ON->@*j R\-+}XQ%-ZCsjݙsgLgN0Aݺ3ugΘjkYҪY]Dwr.%95- E(mQZ$\dc]{v{Ce~jb<;mﶷO_̯};of \:|en1椴u[2dzw2_8vvE*<9UEh-;e볫Rby%iďb1B2ZCLFqߏkittGיh-,4&'/ȏ+ʇXux eUim[4rqE~{X M~s٣<[5X#3rs`?1>|DD_kp,Ts '/rv !.qB E/K}>`oap J P&':4yw5vq xDH`ği h'4tu .748z okp<7r [Y>R7>1D_'Gc=}PPjWJ`HqMtR͐RJ˲ h}volҦX**KuNBC}}=2HMǰgOZA7*Ww=A79<AӯVeXj;E!9~O J +#I%8p|}JȭaO-9P׫8ٔWwv+=}Q1}ʀ@CT6t;gHFRP ;sPAGyIih S{n'*)bGC0L)BnGłC!:<.~?qGЉ8JpNT:D4. l?H0 )^\oA_ZR=J؎>\ ut}A]]fJn%Z **63A{QJ1Fj 1[:blw#Y\ FMFhO/OaVWri=,LV!9 A8"c@Xl;jj:J?Q/cz=,>Mw*DeiCJ_IR,^sZE3#1ۣ5NfĴiOYC 0Q?2Mنk>7˲f֮5^VBLk4;m͔AxtW0cC;}?AEKc&iԙAME+8wϪꛛy}a6̚%έKf.+!q0(msL~:hz5^e.}xe;ͪ*.Qw*wڠb|~v60T`?Ne0a?~V!ͺfTnn+"@"Jexh8:~p 2I[6B5dR19?iTCt 1t6nZv@̌ѢL"Ss *fϼ8&{Q)sq',*apиS#P?I"fF/ym, },p7{<b: endstream endobj 277 0 obj [ 0[ 600] 120[ 460] ] endobj 278 0 obj <> stream x]j0 ~ Cqà#eúlJfXl8}e/t0 d]:g#yc:C4€u,X.zVAHm8wnAY\"mpx5~dk?8P#zWfSgXq;1B74rj~j:Oߩaߊ}awU W"ΓwsMD o9 endstream endobj 279 0 obj <> stream x: xř3V~o96IVQ8l۱?pNᕴKZc Z+uᖴw򆀒@ MI^(핆mӃ/w}JrpNf矙3+aP6LW]g~^ƮO,`ZY@@lң[P~?˒{_oZ@m@^~zhz_DPJ*`TP MŠ @&$S~ B$3F3ȇP'?˾_!ݹWy޷Zy>t4iT%BoͤVF(c?B3?H#1c^̄=[zDω޴TPP&hǢk tС?^t{O7K}dG{|g Cgv޴{;EXG"bY;y*g׶^;p/1R (.vddZ1X]*m1c3o^='_rm7͞re>=O2R91G!N P5&96E:\JW1J@F_XN 1,!KY]./_NeZf>al\WZ?L 86;Ǥ;57Dyq_iܽϏAzx~[/_1+;uv+yVFqk<ib͓y5Q|5~lbFl`zָY5X kLYݗA3P'PP CPG>Bf^P0҇Xkaìy55X5+Y#5U?zwz7> (ԧ%1uiiMx{00~0~0 a|@+>aWXb]l XK"k5ϚcͶfZӭVjrV8|ճw_.1ӷ^7;x^ھ82lo-%x;JU^uuǞGp]TX@F{`tq:Zt.i_4?uvfB=lEڮbQ.#// µڋo,=nB1 DT2Uj/2M}V{q>ù3P"z7|2T5f4CGw;PmtdOBfGhi9t W(w;Ag4z7 .;~HVpcW@ه'nd3oWѿ'v 8'R!e `k @,s @Ur8w31YFඛ jكKPex;I< =[ Z'|)y Ӗ½V 6Gj QZRu[g]O P> ܃GqtG&{3u!hg"Wn;AǾr>?Ԭ@z=ܳrG| #60fz͌q(4aHEpjd f$a(Ϣ砜F%r@%!NJnA  ˏ!gኸʄ|\}{<(ȘBo'3$-Ӵڴƴt5~t6X32s2hgCx=#|'z =,$?!Ą~-=._cZh oE_Qn9:]p> Nr>A|#^,5oE *bu3|;A>p ?¦÷ 2rMOL»>מ[fϵnM#V6&?l9#g@9P+z]aX2 K .;o⒲*K%ۓ\ÑJnv".eiay+g.)[jiDbiEtaUnNl\88h:Eu555ٜ3Lkn *k$ NQ[350.ʇj++_  @Q!}'V; xw ?MƎ~Qvq^ͯW:eWef<7ge/ذȶamfVU}d0ǿ1 u?O֛ӹgǪnL87'UrUdf87.XJ~! NmGW+4+[KW~q1MpMGK]m^v_e'(ʥxI]15JK GGKF޹Suoa;rMښAI5Zj& YU[K7kA؊l<1 [Hf+,ŀDoncQLAȻU0bpU&iL.(V]=װ_kezm9kkk˫V_9[==!VqEzܷMMSVؓ6vv:n&T(mlsO޹s}mEC"-UC@M`^wU+ef._Qfkh\ܺbM-[ٞbly/=V˦]gk6ɿK6[Y8x沥}$>M*~w/K?$B,gi[}ΔWXd֥ J"pgv>ѕ~79/g]Ÿbɛ,!i%45 q4}fj>68≩}o8p;py~nyJ,T4N-ic2Cβ6(ܝ4D>\4=N6"1[[Skr칂y'?5N_a/a9eE;w;hZx0[ u@A<~YL!j1{ld\vsur^4؎A+~;mS7Mq7M\>j33 .6?#"/ ʛJ e_e;6na uGuؔcFa ʵuX@-E:lEp)؍g,_M!z ) cV.د/i+r@X\Cҳ  *!)䏳>3^'j(i:-UE QʣQJY t|kjn5Yr= 49 Kq^'J%d~M6$ k.'*!E eE䨨 v kPhQJ R!0^pTH,LdT@5)W> a# %Uۜ"a5jNqHyTI!jwfq|OSvO (AnX{:ANQzD{#28mZ=;L%%uT%䣶}D=x$H)$J>B<ٙJ(QQr1lP!.XJ Ndk 3ߑN`@g2LF"^%Qpϣ=0헽C.Yb*%)%(  d lأ \D ADE55Rhrȫhx^ԫI0 {6c 0" ZOS=pvl&e@hC Vnj`]j@&1:0xjIA*3,Ib\AD9l!:GYUI4w^g`8@6I 7"GY)da֧h-Dc"l'.ISh K(g82fHVF uD3$s3z0(A9)^َha`C i>8vABNj`<8qKO MFDw 5 *-%Z u3 I[v('1QjT6vgyA 0`a=T \uT- Pj!XRb`1 5`hq&V!ѴKv&(HT"0[͘ NG)D 3{#TD.ih~/HXkRaQq'WMƽp~ PL 1Tlx>+#';/c Dvֽ#fURiKgs.)jK1u"4KS锍hRS}ޯCDޑ2$`& ͌s<坺Ax$ln RhJ>0B ,taQrCH,Js9Sb65ZBL/h=jtAՄ!c$joeJCǍI/vv˲~~/X0ǩ|tMjz$:,'815e:W&e&֝9.Oދ9|l#!{ޥ]UgRʽث"ܗrK4V]/uaQӭxnLvYwEy.6ˮ$J͈!7@qS#Bf輻$΄ZKs݂I.9 һQikYqg ?IU8u`gɖԜm4†i~P "7u kJ5p?Zy>[Xd+)Ls ~Kɖ2͎ͷjbܳ]bx';rԯ΁"某nIKb;X.L/b4:m )>{u~>úד,Je~oHջkN^)P ᾏ&$iJ?~Nb2yE4 $.ڒtT"㋭$|d@BgoКK;;GO+UITԄS%`5l$qLm=YþG* .Bnԓw(\u *AjL5$LcDOv ]rްNjΰAOO(-#[&I݈E2¯'Qѥ(ۊғ?/`>DWHT!+ 8.)V A6E$X` endstream endobj 280 0 obj [ 0[ 500] 198[ 979] ] endobj 281 0 obj <> stream x]Mj0 >L(3Ȣ?4[I lgWv*A~ґO8VNԩmڻrD%TӀ~qIх~ei繗_c)A23#;'OQ?ҟ~p"P5T UUHSh t/{\-]%OA #xۚboO endstream endobj 282 0 obj <> stream x} |TչޓyO&/`8&F&L @3yB!$!fL2 IHzcjshO; jRokjskc_kL={Zo}[kgH<)Թ" jg!chQS?DcDghמ%o"տECD'^s Ѿw5/%y;<(EQhO9'>xѽC Dĵ %rЍ迍 LJJXVٙو?:?y,{)[vH/gcg"DsSBRZ dWe D^ KOyl[md!.K9DO~QPdHkd8unǘ[TjqB؃*cj1a9-|4k$}^+h/)οlVqh]b,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,f1Yb,9YnCƕ;PO|]N1VA ̴7;oyo;48}z];?ֱcH֖-M7_Ѷuݚի*WX쒥K]\|QQ ysdgy3=naY3,,1*aZ~m ˹3c}ڼXg'FV=tk%4p:;4.cH %h!M*n-| XIə陚>~(0,rtĴZ*UpTxġ)/uu\`,Bq {[٫j WM;{;qa9 ϩm9pܧeYeX{>9Qߧf"qݿ=7H$ 'ak`J~&|Qgn5q0.t=$tLǕHǂhF^[ŃZ ẺA2УκH@wZX0ZÞtꓝ*נ4[ը=֕_I"yQM34K7&!ulJԠdz! DCPmHt&Sc]ALoؐĬM55}Ok8Ѽl|3Ȋ$M&!XNaO񀗩=Q[#>V` 16}_rOԅ6]o因pi=Ǔ=y[yX'53Y+O>9946CzS.$̑#F.%g7YڏDTov-D* ta)z0ڛ0OsS7$3K <>ֵIO~ / f\U=}ƄsvVRxݲe!1&2~!ڏ8UTN 7h_ M v#A%i$'*q^uO)zO8ɭfic:wmC%'$:2N5a%l .-'MrvF.fql)66nt1puo:m.0qD5pI -R=XsЇu|Ƃ51v0DBE vλX|H a`ZӅb?Mj뒳 c6s5G?^AA}~Ș4#-|bC4=#B4$ȷD")QaIK9#Bj#W! QywD1 ky y֘yμ?"$5?hc)4YBH}~/vZƴpSDgR}cHA k4gӫ8Jgp5X ODgf-l'CzB:5=cH\8u=Xw󍏵6vG4[J X5;$ hcu#עAA XD}\z5Z\e2-E|H";X&2 5GanAP|hb$ wݩ90çS[B3:%:;عF"uP~2EkιBݚ/ NP+!&H\ j喻wl SbJ+;{?B%4g8mgS݂HN=Q*Q1  N: EXpP(#|>5cbAu[w"ix ,Jd'6JQw[')~"QZpB#oE HgrF=6{B tf*>hMI8؋osWϚwCɼ #||4VRȇӇIce[OZ>8vx+Ugpyq LUlUhd뫘b{'U۪ ^\{!\z+2(*\;qLg-T`D2\X&g>ʶӛ$̾mr^}d^xNxbDd!C!ADny`DiQ^aEXBD<κy1*'NuN7(.'ڶ`ru9l3 /np%zW9ba"'Bsf"#(M '[J2湥~D+!rBW;jVF^x\&r.`ux^'Q 2IE/$%vK춗س//14ϳ۞g>ώ?ϛ^bx_dC/*W>Ŝ߭ĞU9O\\VP'MCcOhN:8>քt'~u7Þ̊W 1 S ۇAD س+»0lgGF8W&(Q] 4v?]r8:mhHn7w,In?[_bbs{Z?wj}Z`r0.'ڟ[5¹յ2> q {M3G&L** z7i )KHҴܕR*UMM6-Zóf|NYhkӟ^P_山5n7[ſ H!Q|FF5^˨ⵯn7< hg똖[߫B#0JҺ(ΣS_2m;J+_|7V~{l{4H#9RudyWUິReUmMUWW2Yy_|V .{u[}sQ\>˫ea[GWT6"$;722zy^v^pͧ,9,tkg9;曆u}ГyMqߨ?Aiz,{+ tamu~FO=!2]ߒK:Fح|'ՠ>6JԏPش(WIۤOI *] F=v`fQ%$}g`?5H7tC3,HS5 {3@* 2bߢ(>+kc&J|}vZV57=x̺A >̚[Eޥ"}h|| ѥŮc6ٽsچ: x#cԋl;lͷv\_f([~H=N.?wV}$CR_'zR.Y duzBOu )1zvS=)˒bN%$wZQ "nwjvCN'xhڥP)jG_7K.Y uaί*ԥDsى,|-=eݰ|J:+[%˕22ʨDzUv@Tt yɯ:Q^z˜WD蓡{qeT/$bmRZip JNeap[Wp支3C풒\,WVJŪnZQN̬6)[jiYH0&'9YxMʥ߅\.i5e8K\9fp338v8_\5{2=MɒvO6ҁ{,>#|9֩鷅t3|}M-O'}򂂗N~X U~tP692 7uune$:")uLtdϰK0uYn&WU_oYmyV@3 f{jbMS[,WZm+ݮpcG}OH3a'O@B)93kN"U 5w"ELVe*uIUU'BoAn+V]yG;ju d˷g5Zx`Yg3(UxZm™6Jx%VZb}lIi󆾲Pq[K%|oQvߗds/vZ7|-ٗbwci+1^hj_%|{I'cO~-^rq^Ǝ];kzz9S[_F[Tv㿧J;jVլf5YjVլf5YjVլf5YjVլf*f5Yd_UQdE$؋q[D`kI\Ryi#+i<ʗmH[i4mNeNVNC,.G]Nsv4\fs;MxN};,O̥\O 1 |c[\itWҖM4HôO.hL 9@1܇)&%ˏʏ:"JR\@SuoFp`JBڐGA%詆~1s?.k<169})Z+\nxU}etӕzzAHʮV-էGCéQ6r KU1>v {^ZDSXŅQQiN;}b܀j1>.8vvLUC$*#"}ߌԣ8c҇#B+p/x% xČ\+u=`}9-d ݖsl=xn킜~1wHʖCS]EsQ+z0j{y|`%“1AaUTd~P{3ڟ˺!1B[R È*Fr4InN^p[KDT9ߐ%"b! nCJhG!/QGu =>;Fzғʚ!юaL7%F}E$5|Z[Ն}bo@r:|L@x֚;t]%mXQ>?趌{=zEge w*OQh&p~S?Gǧ 3<,xC~^:Z Os;W<=;KDtnj\|j(N5N{ JEdq/GԐbc#)%?KƤ uA*w*9qqgLع5VH ]φ1K/vf,Yˈu22N}l )/Ew}ƞ3l71;Ox#"? _o(i>Ӧ~A?D؅ĸ$wvͽv'y{Y93'R2%b Wq]BqbK2}?cXjD|Dɵ=;z'윞ƻGcT'ަt4;s/ѝv~Ȟ1aA[< b9wq^$O%O?+GBWay:lT~x[9?ju^pl,(MӆVu\"+ę|[yh}5*ڼ v1G=f!rP7YolEb7ۄQF|5m]MY8[F1cRjuFo5d7 y\>Rz6V q\f-4(Z&ͺ m|?mF׏3VU &hEo8)6cdExvhXGVXý}P|9)5KsپBpUZ͢GVZExofaٳ^!2^pU [R W>4M%ꇬ]J{ZՒ|F|(*΢d5 R|/JY_%er)b}idt5ů\Gzmty3ovxDMWGJ=%jupu]kD7Y]D|6ݤFbziRt[/J'?w,nK%gg9<'77oNz$cSʕreJ7pLǕ]eU WRr~@yAA/)O_>ʫ)~]=VoZ~A7$[~kWay;v˟z$[e#Iַ5u$퇁?Q 7߲OsJYَlz mm$;;:>8|eп (_u|Xs^?~:;Iv8Og9<4^秀O~v:ໜsu$z\_uI]G:w-ܭ$wwpO2&1'/cx=${VyVYY|' zS\ndzx3 _ 3%y*əem!՜άNhVIYYPU)Q!Vzi)Fr#ol w~%QyhQ> ׬)q8c?nXy%֟̊f9)ȥ#s$HqHL_E endstream endobj 283 0 obj [ 0[ 1000] ] endobj 284 0 obj <> stream Microsoft® Word 2021 Marti Maria Microsoft® Word 20212026-04-19T17:54:08+02:002026-04-19T17:54:08+02:00 uuid:555385B9-ADB2-4B73-ACCE-370909702529uuid:555385B9-ADB2-4B73-ACCE-370909702529 endstream endobj 285 0 obj <> endobj 286 0 obj <] /Filter/FlateDecode/Length 891>> stream x%{Luq9tES-Hi-E Y%P&049AMN( $S?D.Xq^y~~O@gd~9 60:p'BKyEĉ\ c߂IY ƋV >E 8$}+ NJӐRk&qֵ> CE_MN+͵(rr .kl;퐵-lqrW@FoP8 >Zo! ߨ@RݪDTY";jjExȀ=Ew~?$PԬ#-8yq j5u; 9"S C8POv@~hL}.`hVu՜⅟uf<=Uhڂ]yб.k'tf=R?nG y~EpCCg3˰F9F+3h Q Oޅ/ɊJ| S8PVG b;̙1K7DQL jބ4܌C|pa\  macECd,AXYCg[ulVV h)><O u?,mcֶH=.&#;|O(cul:v_X:v$ 2 K?ǟqƳ/9مAt̉'|l%Nf;xcE dMp}v>rIS ͇n9!v8MYK\q5ø;AqǴHF*! ] >> startxref 635199 %%EOF xref 0 0 trailer <] /Prev 635199/XRefStm 634104>> startxref 641100 %%EOFlcms2-2.19.1/include/0000755000175000017500000000000015176574562013303 5ustar martimartilcms2-2.19.1/include/meson.build0000644000175000017500000000017715176573557015455 0ustar martimartilcms2_headers = files( 'lcms2.h', 'lcms2_plugin.h', ) install_headers(lcms2_headers) inc_dirs = include_directories('.') lcms2-2.19.1/include/lcms2_plugin.h0000644000175000017500000007550515176573557016071 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // // This is the plug-in header file. Normal LittleCMS clients should not use it. // It is provided for plug-in writers that may want to access the support // functions to do low level operations. All plug-in related structures // are defined here. Including this file forces to include the standard API too. #ifndef _lcms_plugin_H // Deal with Microsoft's attempt at deprecating C standard runtime functions #ifdef _MSC_VER # if (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE # endif # ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS # endif # endif #endif #ifndef _lcms2_H #include "lcms2.h" #endif // We need some standard C functions. #include #include #include #include #include #ifndef CMS_USE_CPP_API # ifdef __cplusplus extern "C" { # endif #endif // Vector & Matrix operations ----------------------------------------------------------------------- // Axis of the matrix/array. No specific meaning at all. #define VX 0 #define VY 1 #define VZ 2 // Vectors typedef struct { cmsFloat64Number n[3]; } cmsVEC3; // 3x3 Matrix typedef struct { cmsVEC3 v[3]; } cmsMAT3; CMSAPI void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z); CMSAPI void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b); CMSAPI void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v); CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v); CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a); CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b); CMSAPI void CMSEXPORT _cmsMAT3identity(cmsMAT3* a); CMSAPI cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a); CMSAPI void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b); CMSAPI cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b); CMSAPI cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b); CMSAPI void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v); // MD5 low level ------------------------------------------------------------------------------------- CMSAPI cmsHANDLE CMSEXPORT cmsMD5alloc(cmsContext ContextID); CMSAPI void CMSEXPORT cmsMD5add(cmsHANDLE Handle, const cmsUInt8Number* buf, cmsUInt32Number len); CMSAPI void CMSEXPORT cmsMD5finish(cmsProfileID* ProfileID, cmsHANDLE Handle); // Error logging ------------------------------------------------------------------------------------- CMSAPI void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...); // Memory management ---------------------------------------------------------------------------------- CMSAPI void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size); CMSAPI void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size); CMSAPI void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); CMSAPI void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); CMSAPI void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr); CMSAPI void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size); // I/O handler ---------------------------------------------------------------------------------- struct _cms_io_handler { void* stream; // Associated stream, which is implemented differently depending on media. cmsContext ContextID; cmsUInt32Number UsedSpace; cmsUInt32Number ReportedSize; char PhysicalFile[cmsMAX_PATH]; cmsUInt32Number (* Read)(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count); cmsBool (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset); cmsBool (* Close)(struct _cms_io_handler* iohandler); cmsUInt32Number (* Tell)(struct _cms_io_handler* iohandler); cmsBool (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void* Buffer); }; // Endianness adjust functions CMSAPI cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word); CMSAPI cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number Value); CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord); // Helper IO functions CMSAPI cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); CMSAPI cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ); CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); CMSAPI cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array); // ICC base tag typedef struct { cmsTagTypeSignature sig; cmsInt8Number reserved[4]; } _cmsTagBase; // Type base helper functions CMSAPI cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io); CMSAPI cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig); // Alignment functions CMSAPI cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io); CMSAPI cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io); // To deal with text streams. 2K at most CMSAPI cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...); // Fixed point helper functions CMSAPI cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8); CMSAPI cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val); CMSAPI cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32); CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v); // Date/time helper functions CMSAPI void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source); CMSAPI void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest); //---------------------------------------------------------------------------------------------------------- // Shared callbacks for user data typedef void (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data); typedef void* (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data); //---------------------------------------------------------------------------------------------------------- // Plug-in foundation #define cmsPluginMagicNumber 0x61637070 // 'acpp' #define cmsPluginMemHandlerSig 0x6D656D48 // 'memH' #define cmsPluginInterpolationSig 0x696E7048 // 'inpH' #define cmsPluginParametricCurveSig 0x70617248 // 'parH' #define cmsPluginFormattersSig 0x66726D48 // 'frmH #define cmsPluginTagTypeSig 0x74797048 // 'typH' #define cmsPluginTagSig 0x74616748 // 'tagH' #define cmsPluginRenderingIntentSig 0x696E7448 // 'intH' #define cmsPluginMultiProcessElementSig 0x6D706548 // 'mpeH' #define cmsPluginOptimizationSig 0x6F707448 // 'optH' #define cmsPluginTransformSig 0x7A666D48 // 'xfmH' #define cmsPluginMutexSig 0x6D747A48 // 'mtxH' #define cmsPluginParalellizationSig 0x70726C48 // 'prlH typedef struct _cmsPluginBaseStruct { cmsUInt32Number Magic; // 'acpp' signature cmsUInt32Number ExpectedVersion; // Expected version of LittleCMS cmsUInt32Number Type; // Type of plug-in struct _cmsPluginBaseStruct* Next; // For multiple plugin definition. NULL for end of list. } cmsPluginBase; // Maximum number of types in a plugin array #define MAX_TYPES_IN_LCMS_PLUGIN 20 //---------------------------------------------------------------------------------------------------------- // Memory handler. Each new plug-in type replaces current behaviour typedef void* (* _cmsMallocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); typedef void (* _cmsFreeFnPtrType)(cmsContext ContextID, void *Ptr); typedef void* (* _cmsReallocFnPtrType)(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); typedef void* (* _cmsMalloZerocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); typedef void* (* _cmsCallocFnPtrType)(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); typedef void* (* _cmsDupFnPtrType)(cmsContext ContextID, const void* Org, cmsUInt32Number size); typedef struct { cmsPluginBase base; // Required _cmsMallocFnPtrType MallocPtr; _cmsFreeFnPtrType FreePtr; _cmsReallocFnPtrType ReallocPtr; // Optional _cmsMalloZerocFnPtrType MallocZeroPtr; _cmsCallocFnPtrType CallocPtr; _cmsDupFnPtrType DupPtr; } cmsPluginMemHandler; // ------------------------------------------------------------------------------------------------------------------ // Interpolation. 16 bits and floating point versions. struct _cms_interp_struc; // Interpolation callbacks // 16 bits forward interpolation. This function performs precision-limited linear interpolation // and is supposed to be quite fast. Implementation may be tetrahedral or trilinear, and plug-ins may // choose to implement any other interpolation algorithm. typedef void (* _cmsInterpFn16)(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const struct _cms_interp_struc* p); // Floating point forward interpolation. Full precision interpolation using floats. This is not a // time critical function. Implementation may be tetrahedral or trilinear, and plug-ins may // choose to implement any other interpolation algorithm. typedef void (* _cmsInterpFnFloat)(cmsFloat32Number const Input[], cmsFloat32Number Output[], const struct _cms_interp_struc* p); // This type holds a pointer to an interpolator that can be either 16 bits or float typedef union { _cmsInterpFn16 Lerp16; // Forward interpolation in 16 bits _cmsInterpFnFloat LerpFloat; // Forward interpolation in floating point } cmsInterpFunction; // Flags for interpolator selection #define CMS_LERP_FLAGS_16BITS 0x0000 // The default #define CMS_LERP_FLAGS_FLOAT 0x0001 // Requires different implementation #define CMS_LERP_FLAGS_TRILINEAR 0x0100 // Hint only #define MAX_INPUT_DIMENSIONS 15 typedef struct _cms_interp_struc { // Used on all interpolations. Supplied by lcms2 when calling the interpolation function cmsContext ContextID; // The calling thread cmsUInt32Number dwFlags; // Keep original flags cmsUInt32Number nInputs; // != 1 only in 3D interpolation cmsUInt32Number nOutputs; // != 1 only in 3D interpolation cmsUInt32Number nSamples[MAX_INPUT_DIMENSIONS]; // Valid on all kinds of tables cmsUInt32Number Domain[MAX_INPUT_DIMENSIONS]; // Domain = nSamples - 1 cmsUInt32Number opta[MAX_INPUT_DIMENSIONS]; // Optimization for 3D CLUT. This is the number of nodes premultiplied for each // dimension. For example, in 7 nodes, 7, 7^2 , 7^3, 7^4, etc. On non-regular // Samplings may vary according of the number of nodes for each dimension. const void *Table; // Points to the actual interpolation table cmsInterpFunction Interpolation; // Points to the function to do the interpolation } cmsInterpParams; // Interpolators factory typedef cmsInterpFunction (* cmsInterpFnFactory)(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); // The plug-in typedef struct { cmsPluginBase base; // Points to a user-supplied function which implements the factory cmsInterpFnFactory InterpolatorsFactory; } cmsPluginInterpolation; //---------------------------------------------------------------------------------------------------------- // Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10 // Evaluator callback for user-supplied parametric curves. May implement more than one type typedef cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R); // Plug-in may implement an arbitrary number of parametric curves typedef struct { cmsPluginBase base; cmsUInt32Number nFunctions; // Number of supported functions cmsUInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function cmsParametricCurveEvaluator Evaluator; // The evaluator } cmsPluginParametricCurves; //---------------------------------------------------------------------------------------------------------- // Formatters. This plug-in adds new handlers, replacing them if they already exist. Formatters dealing with // cmsFloat32Number (bps = 4) or double (bps = 0) types are requested via FormatterFloat callback. Others come across // Formatter16 callback struct _cmstransform_struct; typedef cmsUInt8Number* (* cmsFormatter16)(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride); typedef cmsUInt8Number* (* cmsFormatterFloat)(struct _cmstransform_struct* CMMcargo, cmsFloat32Number Values[], cmsUInt8Number* Buffer, cmsUInt32Number Stride); // This type holds a pointer to a formatter that can be either 16 bits or cmsFloat32Number typedef union { cmsFormatter16 Fmt16; cmsFormatterFloat FmtFloat; } cmsFormatter; #define CMS_PACK_FLAGS_16BITS 0x0000 #define CMS_PACK_FLAGS_FLOAT 0x0001 typedef enum { cmsFormatterInput=0, cmsFormatterOutput=1 } cmsFormatterDirection; typedef cmsFormatter (* cmsFormatterFactory)(cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 cmsFormatterDirection Dir, cmsUInt32Number dwFlags); // precision // Plug-in may implement an arbitrary number of formatters typedef struct { cmsPluginBase base; cmsFormatterFactory FormattersFactory; } cmsPluginFormatters; //---------------------------------------------------------------------------------------------------------- // Tag type handler. Each type is free to return anything it wants, and it is up to the caller to // know in advance what is the type contained in the tag. typedef struct _cms_typehandler_struct { cmsTagTypeSignature Signature; // The signature of the type // Allocates and reads items void * (* ReadPtr)(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag); // Writes n Items cmsBool (* WritePtr)(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems); // Duplicate an item or array of items void* (* DupPtr)(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n); // Free all resources void (* FreePtr)(struct _cms_typehandler_struct* self, void *Ptr); // Additional parameters used by the calling thread cmsContext ContextID; cmsUInt32Number ICCVersion; } cmsTagTypeHandler; // Each plug-in implements a single type typedef struct { cmsPluginBase base; cmsTagTypeHandler Handler; } cmsPluginTagType; //---------------------------------------------------------------------------------------------------------- // This is the tag plugin, which identifies tags. For writing, a pointer to function is provided. // This function should return the desired type for this tag, given the version of profile // and the data being serialized. typedef struct { cmsUInt32Number ElemCount; // If this tag needs an array, how many elements should keep // For reading. cmsUInt32Number nSupportedTypes; // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum) cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // For writing cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data); } cmsTagDescriptor; // Plug-in implements a single tag typedef struct { cmsPluginBase base; cmsTagSignature Signature; cmsTagDescriptor Descriptor; } cmsPluginTag; //---------------------------------------------------------------------------------------------------------- // Custom intents. This function should join all profiles specified in the array in // a single LUT. Any custom intent in the chain redirects to custom function. If more than // one custom intent is found, the one located first is invoked. Usually users should use only one // custom intent, so mixing custom intents in same multiprofile transform is not supported. typedef cmsPipeline* (* cmsIntentFn)( cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); // Each plug-in defines a single intent number. typedef struct { cmsPluginBase base; cmsUInt32Number Intent; cmsIntentFn Link; char Description[256]; } cmsPluginRenderingIntent; // The default ICC intents (perceptual, saturation, rel.col and abs.col) CMSAPI cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //---------------------------------------------------------------------------------------------------------- // Pipelines, Multi Process Elements. typedef void (* _cmsStageEvalFn) (const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage* mpe); typedef void*(* _cmsStageDupElemFn) (cmsStage* mpe); typedef void (* _cmsStageFreeElemFn) (cmsStage* mpe); // This function allocates a generic MPE CMSAPI cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID, cmsStageSignature Type, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels, _cmsStageEvalFn EvalPtr, // Points to fn that evaluates the element (always in floating point) _cmsStageDupElemFn DupElemPtr, // Points to a fn that duplicates the stage _cmsStageFreeElemFn FreePtr, // Points to a fn that sets the element free void* Data); // A generic pointer to whatever memory needed by the element typedef struct { cmsPluginBase base; cmsTagTypeHandler Handler; } cmsPluginMultiProcessElement; // Data kept in "Element" member of cmsStage // Curves typedef struct { cmsUInt32Number nCurves; cmsToneCurve** TheCurves; } _cmsStageToneCurvesData; // Matrix typedef struct { cmsFloat64Number* Double; // floating point for the matrix cmsFloat64Number* Offset; // The offset } _cmsStageMatrixData; // CLUT typedef struct { union { // Can have only one of both representations at same time cmsUInt16Number* T; // Points to the table 16 bits table cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table } Tab; cmsInterpParams* Params; cmsUInt32Number nEntries; cmsBool HasFloatValues; } _cmsStageCLutData; //---------------------------------------------------------------------------------------------------------- // Optimization. Using this plug-in, additional optimization strategies may be implemented. // The function should return TRUE if any optimization is done on the LUT, this terminates // the optimization search. Or FALSE if it is unable to optimize and want to give a chance // to the rest of optimizers. typedef cmsBool (* _cmsOPToptimizeFn)(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); // Pipeline Evaluator (in 16 bits) typedef void (* _cmsPipelineEval16Fn)(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], const void* Data); // Pipeline Evaluator (in floating point) typedef void (* _cmsPipelineEvalFloatFn)(const cmsFloat32Number In[], cmsFloat32Number Out[], const void* Data); // This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional // duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. CMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, _cmsPipelineEval16Fn Eval16, void* PrivateData, _cmsFreeUserDataFn FreePrivateDataFn, _cmsDupUserDataFn DupPrivateDataFn); typedef struct { cmsPluginBase base; // Optimize entry point _cmsOPToptimizeFn OptimizePtr; } cmsPluginOptimization; //---------------------------------------------------------------------------------------------------------- // Full xform typedef struct { cmsUInt32Number BytesPerLineIn; cmsUInt32Number BytesPerLineOut; cmsUInt32Number BytesPerPlaneIn; cmsUInt32Number BytesPerPlaneOut; } cmsStride; typedef void (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo, // Legacy function, handles just ONE scanline. const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride); // Stride in bytes to the next plane in planar formats typedef void (*_cmsTransform2Fn)(struct _cmstransform_struct *CMMcargo, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride); typedef cmsBool (* _cmsTransformFactory)(_cmsTransformFn* xform, void** UserData, _cmsFreeUserDataFn* FreePrivateDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); typedef cmsBool (* _cmsTransform2Factory)(_cmsTransform2Fn* xform, void** UserData, _cmsFreeUserDataFn* FreePrivateDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); // Retrieve user data as specified by the factory CMSAPI void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn); CMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo); // Retrieve formatters CMSAPI void CMSEXPORT _cmsGetTransformFormatters16 (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput); CMSAPI void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput); // Retrieve original flags CMSAPI cmsUInt32Number CMSEXPORT _cmsGetTransformFlags(struct _cmstransform_struct* CMMcargo); typedef struct { cmsPluginBase base; // Transform entry point union { _cmsTransformFactory legacy_xform; _cmsTransform2Factory xform; } factories; } cmsPluginTransform; //---------------------------------------------------------------------------------------------------------- // Mutex typedef void* (* _cmsCreateMutexFnPtrType)(cmsContext ContextID); typedef void (* _cmsDestroyMutexFnPtrType)(cmsContext ContextID, void* mtx); typedef cmsBool (* _cmsLockMutexFnPtrType)(cmsContext ContextID, void* mtx); typedef void (* _cmsUnlockMutexFnPtrType)(cmsContext ContextID, void* mtx); typedef struct { cmsPluginBase base; _cmsCreateMutexFnPtrType CreateMutexPtr; _cmsDestroyMutexFnPtrType DestroyMutexPtr; _cmsLockMutexFnPtrType LockMutexPtr; _cmsUnlockMutexFnPtrType UnlockMutexPtr; } cmsPluginMutex; CMSAPI void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID); CMSAPI void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx); CMSAPI cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx); CMSAPI void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx); //---------------------------------------------------------------------------------------------------------- // Parallelization CMSAPI _cmsTransform2Fn CMSEXPORT _cmsGetTransformWorker(struct _cmstransform_struct* CMMcargo); CMSAPI cmsInt32Number CMSEXPORT _cmsGetTransformMaxWorkers(struct _cmstransform_struct* CMMcargo); CMSAPI cmsUInt32Number CMSEXPORT _cmsGetTransformWorkerFlags(struct _cmstransform_struct* CMMcargo); // Let's plug-in to guess the best number of workers #define CMS_GUESS_MAX_WORKERS -1 typedef struct { cmsPluginBase base; cmsInt32Number MaxWorkers; // Number of starts to do as maximum cmsUInt32Number WorkerFlags; // Reserved _cmsTransform2Fn SchedulerFn; // callback to setup functions } cmsPluginParalellization; #ifndef CMS_USE_CPP_API # ifdef __cplusplus } # endif #endif #define _lcms_plugin_H #endif lcms2-2.19.1/include/lcms2.h0000644000175000017500000032446415176573557014514 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // // Version 2.19 // #ifndef _lcms2_H // ********** Configuration toggles **************************************** // Uncomment this one if you are using big endian machines // #define CMS_USE_BIG_ENDIAN 1 // Uncomment this one if your compiler/machine does NOT support the // "long long" type. // #define CMS_DONT_USE_INT64 1 // Uncomment this one to enable large file support on file/stream I/O. // LittleCMS is still limited by ICC 32-bit offsets and sizes, so the // practical maximum remains 4 GiB minus profile overhead. Be careful // because such huge profiles have to be loaded into memory and that's // usually a very bad idea. // #define CMS_LARGE_FILE_SUPPORT 1 // Uncomment this if your compiler doesn't work with fast floor function // #define CMS_DONT_USE_FAST_FLOOR 1 // Uncomment this line if you want lcms to use the black point tag in profile, // if commented, lcms will compute the black point by its own. // It is safer to leave it commented out // #define CMS_USE_PROFILE_BLACK_POINT_TAG 1 // Uncomment this line if you are compiling as C++ and want a C++ API // #define CMS_USE_CPP_API // Uncomment this line if you need strict CGATS syntax. Makes CGATS files to // require "KEYWORD" on undefined identifiers, keep it commented out unless needed // #define CMS_STRICT_CGATS 1 // Uncomment to get rid of the tables for "half" float support // #define CMS_NO_HALF_SUPPORT 1 // Uncomment to get rid of pthreads/windows dependency // #define CMS_NO_PTHREADS 1 // Uncomment this for special windows mutex initialization (see lcms2_internal.h) // #define CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT // Uncomment this to remove the "register" storage class // #define CMS_NO_REGISTER_KEYWORD 1 // Uncomment this to remove visibility attribute when building shared objects // #define CMS_NO_VISIBILITY 1 // ********** End of configuration toggles ****************************** // Needed for streams #include // Needed for portability (C99 per 7.1.2) #include #include #include #ifndef CMS_USE_CPP_API # ifdef __cplusplus # if __cplusplus >= 201703L # define CMS_NO_REGISTER_KEYWORD 1 # endif extern "C" { # endif #endif // Version/release #define LCMS_VERSION 2190 // I will give the chance of redefining basic types for compilers that are not fully C99 compliant #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED // Base types typedef unsigned char cmsUInt8Number; // That is guaranteed by the C99 spec typedef signed char cmsInt8Number; // That is guaranteed by the C99 spec #if CHAR_BIT != 8 # error "Unable to find 8 bit type, unsupported compiler" #endif // IEEE float storage numbers typedef float cmsFloat32Number; typedef double cmsFloat64Number; // 16-bit base types #if (USHRT_MAX == 65535U) typedef unsigned short cmsUInt16Number; #elif (UINT_MAX == 65535U) typedef unsigned int cmsUInt16Number; #else # error "Unable to find 16 bits unsigned type, unsupported compiler" #endif #if (SHRT_MAX == 32767) typedef short cmsInt16Number; #elif (INT_MAX == 32767) typedef int cmsInt16Number; #else # error "Unable to find 16 bits signed type, unsupported compiler" #endif // 32-bit base type #if (UINT_MAX == 4294967295U) typedef unsigned int cmsUInt32Number; #elif (ULONG_MAX == 4294967295U) typedef unsigned long cmsUInt32Number; #else # error "Unable to find 32 bit unsigned type, unsupported compiler" #endif #if (INT_MAX == +2147483647) typedef int cmsInt32Number; #elif (LONG_MAX == +2147483647) typedef long cmsInt32Number; #else # error "Unable to find 32 bit signed type, unsupported compiler" #endif // 64-bit base types #ifndef CMS_DONT_USE_INT64 # if (ULONG_MAX == 18446744073709551615U) typedef unsigned long cmsUInt64Number; # elif (ULLONG_MAX == 18446744073709551615U) typedef unsigned long long cmsUInt64Number; # else # define CMS_DONT_USE_INT64 1 # endif # if (LONG_MAX == +9223372036854775807) typedef long cmsInt64Number; # elif (LLONG_MAX == +9223372036854775807) typedef long long cmsInt64Number; # else # define CMS_DONT_USE_INT64 1 # endif #endif #endif // Handle "register" keyword #if defined(CMS_NO_REGISTER_KEYWORD) # define CMSREGISTER #else # define CMSREGISTER register #endif // In the case 64 bit numbers are not supported by the compiler #ifdef CMS_DONT_USE_INT64 typedef cmsUInt32Number cmsUInt64Number[2]; typedef cmsInt32Number cmsInt64Number[2]; # if defined(CMS_LARGE_FILE_SUPPORT) # error "You need int64 for large file support" # endif #endif // Derivative types typedef cmsUInt32Number cmsSignature; typedef cmsUInt16Number cmsU8Fixed8Number; typedef cmsInt32Number cmsS15Fixed16Number; typedef cmsUInt32Number cmsU16Fixed16Number; // Boolean type, which will be using the native integer typedef int cmsBool; // Try to detect windows #if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_) # define CMS_IS_WINDOWS_ 1 #endif #ifdef _MSC_VER # define CMS_IS_WINDOWS_ 1 #endif #ifdef __BORLANDC__ # define CMS_IS_WINDOWS_ 1 #endif // Try to detect big endian platforms. This list can be endless, so primarily rely on the configure script // on Unix-like systems, and allow it to be set on the compiler command line using // -DCMS_USE_BIG_ENDIAN or something similar #ifdef CMS_USE_BIG_ENDIAN // set at compiler command line takes overall precedence # if CMS_USE_BIG_ENDIAN == 0 # undef CMS_USE_BIG_ENDIAN # endif #else // CMS_USE_BIG_ENDIAN # ifdef WORDS_BIGENDIAN // set by configure (or explicitly on compiler command line) # define CMS_USE_BIG_ENDIAN 1 # else // WORDS_BIGENDIAN // Fall back to platform/compiler specific tests # if defined(__sgi__) || defined(__sgi) || defined(sparc) # define CMS_USE_BIG_ENDIAN 1 # endif # if defined(__s390__) || defined(__s390x__) # define CMS_USE_BIG_ENDIAN 1 # endif # ifdef macintosh # ifdef __BIG_ENDIAN__ # define CMS_USE_BIG_ENDIAN 1 # endif # ifdef __LITTLE_ENDIAN__ # undef CMS_USE_BIG_ENDIAN # endif # endif # endif // WORDS_BIGENDIAN # if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) # define CMS_USE_BIG_ENDIAN 1 # endif #endif // CMS_USE_BIG_ENDIAN // Calling convention -- this is hardly platform and compiler dependent #if defined(CMS_IS_WINDOWS_) && !defined(__GNUC__) # if defined(CMS_DLL) || defined(CMS_DLL_BUILD) # ifdef __BORLANDC__ # define CMSEXPORT __stdcall _export # define CMSAPI # else # define CMSEXPORT __stdcall # ifdef CMS_DLL_BUILD # define CMSAPI __declspec(dllexport) # else # define CMSAPI __declspec(dllimport) # endif # endif # else # define CMSEXPORT # define CMSAPI # endif #else // not Windows # if defined(HAVE_FUNC_ATTRIBUTE_VISIBILITY) && !defined(CMS_NO_VISIBILITY) # define CMSEXPORT # define CMSAPI __attribute__((visibility("default"))) # else # define CMSEXPORT # define CMSAPI # endif #endif // CMS_IS_WINDOWS_ #ifdef HasTHREADS # if HasTHREADS == 1 # undef CMS_NO_PTHREADS # else # define CMS_NO_PTHREADS 1 # endif #endif // Some common definitions #define cmsMAX_PATH 256 #ifndef FALSE # define FALSE 0 #endif #ifndef TRUE # define TRUE 1 #endif // D50 XYZ normalized to Y=1.0 #define cmsD50X 0.9642 #define cmsD50Y 1.0 #define cmsD50Z 0.8249 // V4 perceptual black #define cmsPERCEPTUAL_BLACK_X 0.00336 #define cmsPERCEPTUAL_BLACK_Y 0.0034731 #define cmsPERCEPTUAL_BLACK_Z 0.00287 // Definitions in ICC spec #define cmsMagicNumber 0x61637370 // 'acsp' #define lcmsSignature 0x6c636d73 // 'lcms' // Base ICC type definitions typedef enum { cmsSigChromaticityType = 0x6368726D, // 'chrm' cmsSigcicpType = 0x63696370, // 'cicp' cmsSigColorantOrderType = 0x636C726F, // 'clro' cmsSigColorantTableType = 0x636C7274, // 'clrt' cmsSigCrdInfoType = 0x63726469, // 'crdi' cmsSigCurveType = 0x63757276, // 'curv' cmsSigDataType = 0x64617461, // 'data' cmsSigDictType = 0x64696374, // 'dict' cmsSigDateTimeType = 0x6474696D, // 'dtim' cmsSigDeviceSettingsType = 0x64657673, // 'devs' cmsSigLut16Type = 0x6d667432, // 'mft2' cmsSigLut8Type = 0x6d667431, // 'mft1' cmsSigLutAtoBType = 0x6d414220, // 'mAB ' cmsSigLutBtoAType = 0x6d424120, // 'mBA ' cmsSigMeasurementType = 0x6D656173, // 'meas' cmsSigMultiLocalizedUnicodeType = 0x6D6C7563, // 'mluc' cmsSigMultiProcessElementType = 0x6D706574, // 'mpet' cmsSigNamedColorType = 0x6E636f6C, // 'ncol' -- DEPRECATED! cmsSigNamedColor2Type = 0x6E636C32, // 'ncl2' cmsSigParametricCurveType = 0x70617261, // 'para' cmsSigProfileSequenceDescType = 0x70736571, // 'pseq' cmsSigProfileSequenceIdType = 0x70736964, // 'psid' cmsSigResponseCurveSet16Type = 0x72637332, // 'rcs2' cmsSigS15Fixed16ArrayType = 0x73663332, // 'sf32' cmsSigScreeningType = 0x7363726E, // 'scrn' cmsSigSignatureType = 0x73696720, // 'sig ' cmsSigTextType = 0x74657874, // 'text' cmsSigTextDescriptionType = 0x64657363, // 'desc' cmsSigU16Fixed16ArrayType = 0x75663332, // 'uf32' cmsSigUcrBgType = 0x62666420, // 'bfd ' cmsSigUInt16ArrayType = 0x75693136, // 'ui16' cmsSigUInt32ArrayType = 0x75693332, // 'ui32' cmsSigUInt64ArrayType = 0x75693634, // 'ui64' cmsSigUInt8ArrayType = 0x75693038, // 'ui08' cmsSigVcgtType = 0x76636774, // 'vcgt' cmsSigViewingConditionsType = 0x76696577, // 'view' cmsSigXYZType = 0x58595A20, // 'XYZ ' cmsSigMHC2Type = 0x4D484332 // 'MHC2' } cmsTagTypeSignature; // Base ICC tag definitions typedef enum { cmsSigAToB0Tag = 0x41324230, // 'A2B0' cmsSigAToB1Tag = 0x41324231, // 'A2B1' cmsSigAToB2Tag = 0x41324232, // 'A2B2' cmsSigBlueColorantTag = 0x6258595A, // 'bXYZ' cmsSigBlueMatrixColumnTag = 0x6258595A, // 'bXYZ' cmsSigBlueTRCTag = 0x62545243, // 'bTRC' cmsSigBToA0Tag = 0x42324130, // 'B2A0' cmsSigBToA1Tag = 0x42324131, // 'B2A1' cmsSigBToA2Tag = 0x42324132, // 'B2A2' cmsSigCalibrationDateTimeTag = 0x63616C74, // 'calt' cmsSigCharTargetTag = 0x74617267, // 'targ' cmsSigChromaticAdaptationTag = 0x63686164, // 'chad' cmsSigChromaticityTag = 0x6368726D, // 'chrm' cmsSigColorantOrderTag = 0x636C726F, // 'clro' cmsSigColorantTableTag = 0x636C7274, // 'clrt' cmsSigColorantTableOutTag = 0x636C6F74, // 'clot' cmsSigColorimetricIntentImageStateTag = 0x63696973, // 'ciis' cmsSigCopyrightTag = 0x63707274, // 'cprt' cmsSigCrdInfoTag = 0x63726469, // 'crdi' cmsSigDataTag = 0x64617461, // 'data' cmsSigDateTimeTag = 0x6474696D, // 'dtim' cmsSigDeviceMfgDescTag = 0x646D6E64, // 'dmnd' cmsSigDeviceModelDescTag = 0x646D6464, // 'dmdd' cmsSigDeviceSettingsTag = 0x64657673, // 'devs' cmsSigDToB0Tag = 0x44324230, // 'D2B0' cmsSigDToB1Tag = 0x44324231, // 'D2B1' cmsSigDToB2Tag = 0x44324232, // 'D2B2' cmsSigDToB3Tag = 0x44324233, // 'D2B3' cmsSigBToD0Tag = 0x42324430, // 'B2D0' cmsSigBToD1Tag = 0x42324431, // 'B2D1' cmsSigBToD2Tag = 0x42324432, // 'B2D2' cmsSigBToD3Tag = 0x42324433, // 'B2D3' cmsSigGamutTag = 0x67616D74, // 'gamt' cmsSigGrayTRCTag = 0x6b545243, // 'kTRC' cmsSigGreenColorantTag = 0x6758595A, // 'gXYZ' cmsSigGreenMatrixColumnTag = 0x6758595A, // 'gXYZ' cmsSigGreenTRCTag = 0x67545243, // 'gTRC' cmsSigLuminanceTag = 0x6C756d69, // 'lumi' cmsSigMeasurementTag = 0x6D656173, // 'meas' cmsSigMediaBlackPointTag = 0x626B7074, // 'bkpt' cmsSigMediaWhitePointTag = 0x77747074, // 'wtpt' cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' // Deprecated by the ICC cmsSigNamedColor2Tag = 0x6E636C32, // 'ncl2' cmsSigOutputResponseTag = 0x72657370, // 'resp' cmsSigPerceptualRenderingIntentGamutTag = 0x72696730, // 'rig0' cmsSigPreview0Tag = 0x70726530, // 'pre0' cmsSigPreview1Tag = 0x70726531, // 'pre1' cmsSigPreview2Tag = 0x70726532, // 'pre2' cmsSigProfileDescriptionTag = 0x64657363, // 'desc' cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm' cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq' cmsSigProfileSequenceIdTag = 0x70736964, // 'psid' cmsSigPs2CRD0Tag = 0x70736430, // 'psd0' cmsSigPs2CRD1Tag = 0x70736431, // 'psd1' cmsSigPs2CRD2Tag = 0x70736432, // 'psd2' cmsSigPs2CRD3Tag = 0x70736433, // 'psd3' cmsSigPs2CSATag = 0x70733273, // 'ps2s' cmsSigPs2RenderingIntentTag = 0x70733269, // 'ps2i' cmsSigRedColorantTag = 0x7258595A, // 'rXYZ' cmsSigRedMatrixColumnTag = 0x7258595A, // 'rXYZ' cmsSigRedTRCTag = 0x72545243, // 'rTRC' cmsSigSaturationRenderingIntentGamutTag = 0x72696732, // 'rig2' cmsSigScreeningDescTag = 0x73637264, // 'scrd' cmsSigScreeningTag = 0x7363726E, // 'scrn' cmsSigTechnologyTag = 0x74656368, // 'tech' cmsSigUcrBgTag = 0x62666420, // 'bfd ' cmsSigViewingCondDescTag = 0x76756564, // 'vued' cmsSigViewingConditionsTag = 0x76696577, // 'view' cmsSigVcgtTag = 0x76636774, // 'vcgt' cmsSigMetaTag = 0x6D657461, // 'meta' cmsSigcicpTag = 0x63696370, // 'cicp' cmsSigArgyllArtsTag = 0x61727473, // 'arts' cmsSigMHC2Tag = 0x4D484332 // 'MHC2' } cmsTagSignature; // ICC Technology tag typedef enum { cmsSigDigitalCamera = 0x6463616D, // 'dcam' cmsSigFilmScanner = 0x6673636E, // 'fscn' cmsSigReflectiveScanner = 0x7273636E, // 'rscn' cmsSigInkJetPrinter = 0x696A6574, // 'ijet' cmsSigThermalWaxPrinter = 0x74776178, // 'twax' cmsSigElectrophotographicPrinter = 0x6570686F, // 'epho' cmsSigElectrostaticPrinter = 0x65737461, // 'esta' cmsSigDyeSublimationPrinter = 0x64737562, // 'dsub' cmsSigPhotographicPaperPrinter = 0x7270686F, // 'rpho' cmsSigFilmWriter = 0x6670726E, // 'fprn' cmsSigVideoMonitor = 0x7669646D, // 'vidm' cmsSigVideoCamera = 0x76696463, // 'vidc' cmsSigProjectionTelevision = 0x706A7476, // 'pjtv' cmsSigCRTDisplay = 0x43525420, // 'CRT ' cmsSigPMDisplay = 0x504D4420, // 'PMD ' cmsSigAMDisplay = 0x414D4420, // 'AMD ' cmsSigPhotoCD = 0x4B504344, // 'KPCD' cmsSigPhotoImageSetter = 0x696D6773, // 'imgs' cmsSigGravure = 0x67726176, // 'grav' cmsSigOffsetLithography = 0x6F666673, // 'offs' cmsSigSilkscreen = 0x73696C6B, // 'silk' cmsSigFlexography = 0x666C6578, // 'flex' cmsSigMotionPictureFilmScanner = 0x6D706673, // 'mpfs' cmsSigMotionPictureFilmRecorder = 0x6D706672, // 'mpfr' cmsSigDigitalMotionPictureCamera = 0x646D7063, // 'dmpc' cmsSigDigitalCinemaProjector = 0x64636A70 // 'dcpj' } cmsTechnologySignature; // ICC Color spaces typedef enum { cmsSigXYZData = 0x58595A20, // 'XYZ ' cmsSigLabData = 0x4C616220, // 'Lab ' cmsSigLuvData = 0x4C757620, // 'Luv ' cmsSigYCbCrData = 0x59436272, // 'YCbr' cmsSigYxyData = 0x59787920, // 'Yxy ' cmsSigRgbData = 0x52474220, // 'RGB ' cmsSigGrayData = 0x47524159, // 'GRAY' cmsSigHsvData = 0x48535620, // 'HSV ' cmsSigHlsData = 0x484C5320, // 'HLS ' cmsSigCmykData = 0x434D594B, // 'CMYK' cmsSigCmyData = 0x434D5920, // 'CMY ' cmsSigMCH1Data = 0x4D434831, // 'MCH1' cmsSigMCH2Data = 0x4D434832, // 'MCH2' cmsSigMCH3Data = 0x4D434833, // 'MCH3' cmsSigMCH4Data = 0x4D434834, // 'MCH4' cmsSigMCH5Data = 0x4D434835, // 'MCH5' cmsSigMCH6Data = 0x4D434836, // 'MCH6' cmsSigMCH7Data = 0x4D434837, // 'MCH7' cmsSigMCH8Data = 0x4D434838, // 'MCH8' cmsSigMCH9Data = 0x4D434839, // 'MCH9' cmsSigMCHAData = 0x4D434841, // 'MCHA' cmsSigMCHBData = 0x4D434842, // 'MCHB' cmsSigMCHCData = 0x4D434843, // 'MCHC' cmsSigMCHDData = 0x4D434844, // 'MCHD' cmsSigMCHEData = 0x4D434845, // 'MCHE' cmsSigMCHFData = 0x4D434846, // 'MCHF' cmsSigNamedData = 0x6e6d636c, // 'nmcl' cmsSig1colorData = 0x31434C52, // '1CLR' cmsSig2colorData = 0x32434C52, // '2CLR' cmsSig3colorData = 0x33434C52, // '3CLR' cmsSig4colorData = 0x34434C52, // '4CLR' cmsSig5colorData = 0x35434C52, // '5CLR' cmsSig6colorData = 0x36434C52, // '6CLR' cmsSig7colorData = 0x37434C52, // '7CLR' cmsSig8colorData = 0x38434C52, // '8CLR' cmsSig9colorData = 0x39434C52, // '9CLR' cmsSig10colorData = 0x41434C52, // 'ACLR' cmsSig11colorData = 0x42434C52, // 'BCLR' cmsSig12colorData = 0x43434C52, // 'CCLR' cmsSig13colorData = 0x44434C52, // 'DCLR' cmsSig14colorData = 0x45434C52, // 'ECLR' cmsSig15colorData = 0x46434C52, // 'FCLR' cmsSigLuvKData = 0x4C75764B // 'LuvK' } cmsColorSpaceSignature; // ICC Profile Class typedef enum { cmsSigInputClass = 0x73636E72, // 'scnr' cmsSigDisplayClass = 0x6D6E7472, // 'mntr' cmsSigOutputClass = 0x70727472, // 'prtr' cmsSigLinkClass = 0x6C696E6B, // 'link' cmsSigAbstractClass = 0x61627374, // 'abst' cmsSigColorSpaceClass = 0x73706163, // 'spac' cmsSigNamedColorClass = 0x6e6d636c, // 'nmcl' // iccMAX only cmsSigColorEncodingSpaceClass = 0x63656E63, // 'cenc' cmsSigMultiplexIdentificationClass = 0x6D696420, // 'mid ' cmsSigMultiplexLinkClass = 0x6d6c6e6b, // 'mlnk' cmsSigMultiplexVisualizationClass = 0x6d766973 // 'mvis' } cmsProfileClassSignature; // ICC Platforms typedef enum { cmsSigMacintosh = 0x4150504C, // 'APPL' cmsSigMicrosoft = 0x4D534654, // 'MSFT' cmsSigSolaris = 0x53554E57, // 'SUNW' cmsSigSGI = 0x53474920, // 'SGI ' cmsSigTaligent = 0x54474E54, // 'TGNT' cmsSigUnices = 0x2A6E6978 // '*nix' // From argyll -- Not official } cmsPlatformSignature; // Reference gamut #define cmsSigPerceptualReferenceMediumGamut 0x70726d67 //'prmg' // For cmsSigColorimetricIntentImageStateTag #define cmsSigSceneColorimetryEstimates 0x73636F65 //'scoe' #define cmsSigSceneAppearanceEstimates 0x73617065 //'sape' #define cmsSigFocalPlaneColorimetryEstimates 0x66706365 //'fpce' #define cmsSigReflectionHardcopyOriginalColorimetry 0x72686F63 //'rhoc' #define cmsSigReflectionPrintOutputColorimetry 0x72706F63 //'rpoc' // Multi process elements types typedef enum { cmsSigCurveSetElemType = 0x63767374, //'cvst' cmsSigMatrixElemType = 0x6D617466, //'matf' cmsSigCLutElemType = 0x636C7574, //'clut' cmsSigBAcsElemType = 0x62414353, // 'bACS' cmsSigEAcsElemType = 0x65414353, // 'eACS' // Custom from here, not in the ICC Spec cmsSigXYZ2LabElemType = 0x6C327820, // 'l2x ' cmsSigLab2XYZElemType = 0x78326C20, // 'x2l ' cmsSigNamedColorElemType = 0x6E636C20, // 'ncl ' cmsSigLabV2toV4 = 0x32203420, // '2 4 ' cmsSigLabV4toV2 = 0x34203220, // '4 2 ' // Identities cmsSigIdentityElemType = 0x69646E20, // 'idn ' // Float to floatPCS cmsSigLab2FloatPCS = 0x64326C20, // 'd2l ' cmsSigFloatPCS2Lab = 0x6C326420, // 'l2d ' cmsSigXYZ2FloatPCS = 0x64327820, // 'd2x ' cmsSigFloatPCS2XYZ = 0x78326420, // 'x2d ' cmsSigClipNegativesElemType = 0x636c7020 // 'clp ' } cmsStageSignature; // Types of CurveElements typedef enum { cmsSigFormulaCurveSeg = 0x70617266, // 'parf' cmsSigSampledCurveSeg = 0x73616D66, // 'samf' cmsSigSegmentedCurve = 0x63757266 // 'curf' } cmsCurveSegSignature; // Used in ResponseCurveType #define cmsSigStatusA 0x53746141 //'StaA' #define cmsSigStatusE 0x53746145 //'StaE' #define cmsSigStatusI 0x53746149 //'StaI' #define cmsSigStatusT 0x53746154 //'StaT' #define cmsSigStatusM 0x5374614D //'StaM' #define cmsSigDN 0x444E2020 //'DN ' #define cmsSigDNP 0x444E2050 //'DN P' #define cmsSigDNN 0x444E4E20 //'DNN ' #define cmsSigDNNP 0x444E4E50 //'DNNP' // Device attributes, currently defined values correspond to the low 4 bytes // of the 8 byte attribute quantity #define cmsReflective 0 #define cmsTransparency 1 #define cmsGlossy 0 #define cmsMatte 2 // Common structures in ICC tags typedef struct { cmsUInt32Number len; cmsUInt32Number flag; cmsUInt8Number data[1]; } cmsICCData; // ICC date time typedef struct { cmsUInt16Number year; cmsUInt16Number month; cmsUInt16Number day; cmsUInt16Number hours; cmsUInt16Number minutes; cmsUInt16Number seconds; } cmsDateTimeNumber; // ICC XYZ typedef struct { cmsS15Fixed16Number X; cmsS15Fixed16Number Y; cmsS15Fixed16Number Z; } cmsEncodedXYZNumber; // Profile ID as computed by MD5 algorithm typedef union { cmsUInt8Number ID8[16]; cmsUInt16Number ID16[8]; cmsUInt32Number ID32[4]; } cmsProfileID; // ---------------------------------------------------------------------------------------------- // ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe // somebody want to use this info for accessing profile header directly, so here it is. // Profile header -- it is 32-bit aligned, so no issues are expected on alignment typedef struct { cmsUInt32Number size; // Profile size in bytes cmsSignature cmmId; // CMM for this profile cmsUInt32Number version; // Format version number cmsProfileClassSignature deviceClass; // Type of profile cmsColorSpaceSignature colorSpace; // Color space of data cmsColorSpaceSignature pcs; // PCS, XYZ or Lab only cmsDateTimeNumber date; // Date profile was created cmsSignature magic; // Magic Number to identify an ICC profile cmsPlatformSignature platform; // Primary Platform cmsUInt32Number flags; // Various bit settings cmsSignature manufacturer; // Device manufacturer cmsUInt32Number model; // Device model number cmsUInt64Number attributes; // Device attributes cmsUInt32Number renderingIntent;// Rendering intent cmsEncodedXYZNumber illuminant; // Profile illuminant cmsSignature creator; // Profile creator cmsProfileID profileID; // Profile ID using MD5 cmsInt8Number reserved[28]; // Reserved for future use } cmsICCHeader; // ICC base tag typedef struct { cmsTagTypeSignature sig; cmsInt8Number reserved[4]; } cmsTagBase; // A tag entry in directory typedef struct { cmsTagSignature sig; // The tag signature cmsUInt32Number offset; // Start of tag cmsUInt32Number size; // Size in bytes } cmsTagEntry; // ---------------------------------------------------------------------------------------------- // Little CMS specific typedefs typedef void* cmsHANDLE ; // Generic handle typedef void* cmsHPROFILE; // Opaque typedefs to hide internals typedef void* cmsHTRANSFORM; #define cmsMAXCHANNELS 16 // Maximum number of channels in ICC profiles // Format of pixel is defined by one cmsUInt32Number, using bit fields as follows // // 2 1 0 // 4 3 2 10987 6 5 4 3 2 1 098 7654 321 // M A O TTTTT U Y F P X S EEE CCCC BBB // // M: Premultiplied alpha (only works when extra samples is 1) // A: Floating point -- With this flag we can differentiate 16 bits as float and as int // O: Optimized -- previous optimization already returns the final 8-bit value // T: Pixeltype // F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) // P: Planar? 0=Chunky, 1=Planar // X: swap 16 bps endianness? // S: Do swap? ie, BGR, KYMC // E: Extra samples // C: Channels (Samples per pixel) // B: bytes per sample // Y: Swap first - changes ABGR to BGRA and KCMY to CMYK #define PREMUL_SH(m) ((m) << 23) #define FLOAT_SH(a) ((a) << 22) #define OPTIMIZED_SH(s) ((s) << 21) #define COLORSPACE_SH(s) ((s) << 16) #define SWAPFIRST_SH(s) ((s) << 14) #define FLAVOR_SH(s) ((s) << 13) #define PLANAR_SH(p) ((p) << 12) #define ENDIAN16_SH(e) ((e) << 11) #define DOSWAP_SH(e) ((e) << 10) #define EXTRA_SH(e) ((e) << 7) #define CHANNELS_SH(c) ((c) << 3) #define BYTES_SH(b) (b) // These macros unpack format specifiers into integers #define T_PREMUL(m) (((m)>>23)&1) #define T_FLOAT(a) (((a)>>22)&1) #define T_OPTIMIZED(o) (((o)>>21)&1) #define T_COLORSPACE(s) (((s)>>16)&31) #define T_SWAPFIRST(s) (((s)>>14)&1) #define T_FLAVOR(s) (((s)>>13)&1) #define T_PLANAR(p) (((p)>>12)&1) #define T_ENDIAN16(e) (((e)>>11)&1) #define T_DOSWAP(e) (((e)>>10)&1) #define T_EXTRA(e) (((e)>>7)&7) #define T_CHANNELS(c) (((c)>>3)&15) #define T_BYTES(b) ((b)&7) // Pixel types #define PT_ANY 0 // Don't check colorspace // 1 & 2 are reserved #define PT_GRAY 3 #define PT_RGB 4 #define PT_CMY 5 #define PT_CMYK 6 #define PT_YCbCr 7 #define PT_YUV 8 // Lu'v' #define PT_XYZ 9 #define PT_Lab 10 #define PT_YUVK 11 // Lu'v'K #define PT_HSV 12 #define PT_HLS 13 #define PT_Yxy 14 #define PT_MCH1 15 #define PT_MCH2 16 #define PT_MCH3 17 #define PT_MCH4 18 #define PT_MCH5 19 #define PT_MCH6 20 #define PT_MCH7 21 #define PT_MCH8 22 #define PT_MCH9 23 #define PT_MCH10 24 #define PT_MCH11 25 #define PT_MCH12 26 #define PT_MCH13 27 #define PT_MCH14 28 #define PT_MCH15 29 #define PT_LabV2 30 // Identical to PT_Lab, but using the V2 old encoding // Some (not all!) representations #ifndef TYPE_RGB_8 // TYPE_RGB_8 is a very common identifier, so don't include ours // if user has it already defined. #define TYPE_GRAY_8 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)) #define TYPE_GRAY_8_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1)) #define TYPE_GRAY_16 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) #define TYPE_GRAY_16_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1)) #define TYPE_GRAY_16_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_GRAYA_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)) #define TYPE_GRAYA_8_PREMUL (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PREMUL_SH(1)) #define TYPE_GRAYA_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)) #define TYPE_GRAYA_16_PREMUL (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PREMUL_SH(1)) #define TYPE_GRAYA_16_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_GRAYA_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_GRAYA_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_RGB_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_RGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_BGR_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_BGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_RGB_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_RGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_RGB_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_BGR_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_BGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_BGR_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_RGBA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_RGBA_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PREMUL_SH(1)) #define TYPE_RGBA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_RGBA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_RGBA_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PREMUL_SH(1)) #define TYPE_RGBA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ARGB_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) #define TYPE_ARGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) #define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_ARGB_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|PREMUL_SH(1)) #define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_ABGR_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PREMUL_SH(1)) #define TYPE_ABGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_ABGR_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PREMUL_SH(1)) #define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_BGRA_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) #define TYPE_BGRA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) #define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_BGRA_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) #define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_CMY_16 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_CMY_16_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_CMY_16_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_CMYK_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)) #define TYPE_CMYKA_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1)) #define TYPE_CMYK_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)) #define TYPE_YUVK_8 TYPE_CMYK_8_REV #define TYPE_CMYK_8_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_CMYK_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) #define TYPE_CMYK_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)) #define TYPE_YUVK_16 TYPE_CMYK_16_REV #define TYPE_CMYK_16_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_CMYK_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_KCMY_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1)) #define TYPE_KCMY_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_KCMY_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_KCMY_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_KCMY_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1)) #define TYPE_CMYK5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)) #define TYPE_CMYK5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)) #define TYPE_CMYK5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK6_8 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)) #define TYPE_CMYK6_8_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_CMYK6_16 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)) #define TYPE_CMYK6_16_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_CMYK6_16_SE (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_CMYK7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)) #define TYPE_CMYK7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)) #define TYPE_CMYK7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)) #define TYPE_CMYK8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)) #define TYPE_CMYK8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)) #define TYPE_CMYK9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)) #define TYPE_CMYK9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)) #define TYPE_CMYK10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)) #define TYPE_CMYK10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)) #define TYPE_CMYK11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)) #define TYPE_CMYK11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)) #define TYPE_CMYK12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)) #define TYPE_CMYK12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) // Colorimetric #define TYPE_XYZ_16 (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_LabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) #define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_LabV2_16 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2)) // YCbCr #define TYPE_YCbCr_8 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_YCbCr_8_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_YCbCr_16 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_YCbCr_16_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_YCbCr_16_SE (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // YUV #define TYPE_YUV_8 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_YUV_8_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_YUV_16 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_YUV_16_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_YUV_16_SE (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // HLS #define TYPE_HLS_8 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_HLS_8_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_HLS_16 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_HLS_16_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_HLS_16_SE (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // HSV #define TYPE_HSV_8 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_HSV_8_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_HSV_16 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_HSV_16_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_HSV_16_SE (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // Named color index. Only 16 bits is allowed (don't check colorspace) #define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2)) // Float formatters. #define TYPE_XYZ_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_Lab_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_LabA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_GRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)) #define TYPE_GRAYA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)|EXTRA_SH(1)) #define TYPE_GRAYA_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)|EXTRA_SH(1)|PREMUL_SH(1)) #define TYPE_RGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_RGBA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_RGBA_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|PREMUL_SH(1)) #define TYPE_ARGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1)) #define TYPE_ARGB_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1)|PREMUL_SH(1)) #define TYPE_BGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) #define TYPE_BGRA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_BGRA_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) #define TYPE_ABGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) #define TYPE_ABGR_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|PREMUL_SH(1)) #define TYPE_CMYK_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4)) // Floating point formatters. // NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield #define TYPE_XYZ_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0)) #define TYPE_Lab_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0)) #define TYPE_GRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0)) #define TYPE_RGB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)) #define TYPE_BGR_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1)) #define TYPE_CMYK_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0)) #define TYPE_OKLAB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_MCH3)|CHANNELS_SH(3)|BYTES_SH(0)) // IEEE 754-2008 "half" #define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) #define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) #define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_ARGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_BGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_BGRA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ABGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #endif // Colorspaces typedef struct { cmsFloat64Number X; cmsFloat64Number Y; cmsFloat64Number Z; } cmsCIEXYZ; typedef struct { cmsFloat64Number x; cmsFloat64Number y; cmsFloat64Number Y; } cmsCIExyY; typedef struct { cmsFloat64Number L; cmsFloat64Number a; cmsFloat64Number b; } cmsCIELab; typedef struct { cmsFloat64Number L; cmsFloat64Number C; cmsFloat64Number h; } cmsCIELCh; typedef struct { cmsFloat64Number J; cmsFloat64Number C; cmsFloat64Number h; } cmsJCh; typedef struct { cmsCIEXYZ Red; cmsCIEXYZ Green; cmsCIEXYZ Blue; } cmsCIEXYZTRIPLE; typedef struct { cmsCIExyY Red; cmsCIExyY Green; cmsCIExyY Blue; } cmsCIExyYTRIPLE; // Illuminant types for structs below #define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000 #define cmsILLUMINANT_TYPE_D50 0x0000001 #define cmsILLUMINANT_TYPE_D65 0x0000002 #define cmsILLUMINANT_TYPE_D93 0x0000003 #define cmsILLUMINANT_TYPE_F2 0x0000004 #define cmsILLUMINANT_TYPE_D55 0x0000005 #define cmsILLUMINANT_TYPE_A 0x0000006 #define cmsILLUMINANT_TYPE_E 0x0000007 #define cmsILLUMINANT_TYPE_F8 0x0000008 typedef struct { cmsUInt32Number Observer; // 0 = unknown, 1=CIE 1931, 2=CIE 1964 cmsCIEXYZ Backing; // Value of backing cmsUInt32Number Geometry; // 0=unknown, 1=45/0, 0/45 2=0d, d/0 cmsFloat64Number Flare; // 0..1.0 cmsUInt32Number IlluminantType; } cmsICCMeasurementConditions; typedef struct { cmsCIEXYZ IlluminantXYZ; // Not the same struct as CAM02, cmsCIEXYZ SurroundXYZ; // This is for storing the tag cmsUInt32Number IlluminantType; // viewing condition } cmsICCViewingConditions; typedef struct { cmsUInt8Number ColourPrimaries; // Recommendation ITU-T H.273 cmsUInt8Number TransferCharacteristics; // (ISO/IEC 23091-2) cmsUInt8Number MatrixCoefficients; cmsUInt8Number VideoFullRangeFlag; } cmsVideoSignalType; typedef struct { cmsUInt32Number CurveEntries; cmsFloat64Number* RedCurve; cmsFloat64Number* GreenCurve; cmsFloat64Number* BlueCurve; cmsFloat64Number MinLuminance; // ST.2086 min luminance in nits cmsFloat64Number PeakLuminance; // ST.2086 peak luminance in nits cmsFloat64Number XYZ2XYZmatrix[3][4]; } cmsMHC2Type; // Get LittleCMS version (for shared objects) ----------------------------------------------------------------------------- CMSAPI int CMSEXPORT cmsGetEncodedCMMversion(void); // Support of non-standard functions -------------------------------------------------------------------------------------- CMSAPI int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2); #ifdef CMS_LARGE_FILE_SUPPORT CMSAPI long long int CMSEXPORT cmsfilelength(FILE* f); #else CMSAPI long int CMSEXPORT cmsfilelength(FILE* f); #endif // Context handling -------------------------------------------------------------------------------------------------------- // Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility // though using the global context is not recommended. Proper context handling makes lcms more thread-safe. typedef struct _cmsContext_struct* cmsContext; CMSAPI cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData); CMSAPI void CMSEXPORT cmsDeleteContext(cmsContext ContextID); CMSAPI cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData); CMSAPI void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID); // Plug-In registering -------------------------------------------------------------------------------------------------- CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin); CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin); CMSAPI void CMSEXPORT cmsUnregisterPlugins(void); CMSAPI void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID); // Error logging ---------------------------------------------------------------------------------------------------------- // There is no error handling at all. When a function fails, it returns proper value. // For example, all create functions does return NULL on failure. Other may return FALSE. // It may be interesting, for the developer, to know why the function is failing. // for that reason, lcms2 does offer a logging function. This function will get // an ENGLISH string with some clues on what is going wrong. You can show this // info to the end user if you wish, or just create some sort of log on disk. // The logging function should NOT terminate the program, as this obviously can leave // unfreed resources. It is the programmer's responsibility to check each function // return code to make sure it didn't fail. #define cmsERROR_UNDEFINED 0 #define cmsERROR_FILE 1 #define cmsERROR_RANGE 2 #define cmsERROR_INTERNAL 3 #define cmsERROR_NULL 4 #define cmsERROR_READ 5 #define cmsERROR_SEEK 6 #define cmsERROR_WRITE 7 #define cmsERROR_UNKNOWN_EXTENSION 8 #define cmsERROR_COLORSPACE_CHECK 9 #define cmsERROR_ALREADY_DEFINED 10 #define cmsERROR_BAD_SIGNATURE 11 #define cmsERROR_CORRUPTION_DETECTED 12 #define cmsERROR_NOT_SUITABLE 13 // Error logger is called with the ContextID when a message is raised. This gives the // chance to know which thread is responsible of the warning and any environment associated // with it. Non-multithreading applications may safely ignore this parameter. // Note that under certain special circumstances, ContextID may be NULL. typedef void (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text); // Allows user to set any specific logger CMSAPI void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn); CMSAPI void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn); // Conversions -------------------------------------------------------------------------------------------------------------- // Returns pointers to constant structs CMSAPI const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void); CMSAPI const cmsCIExyY* CMSEXPORT cmsD50_xyY(void); // Colorimetric space conversions CMSAPI void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source); CMSAPI void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source); CMSAPI void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz); CMSAPI void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsLab2LCh(cmsCIELCh*LCh, const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh); // Encoding /Decoding on PCS CMSAPI void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]); CMSAPI void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]); CMSAPI void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fxyz, const cmsUInt16Number XYZ[3]); CMSAPI void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ); // DeltaE metrics CMSAPI cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); CMSAPI cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); CMSAPI cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); CMSAPI cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c); CMSAPI cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh); // Temperature <-> Chromaticity (Black body) CMSAPI cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK); CMSAPI cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint); // Chromatic adaptation CMSAPI cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt, const cmsCIEXYZ* Illuminant, const cmsCIEXYZ* Value); // CIECAM02 --------------------------------------------------------------------------------------------------- // Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing // conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag // cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions. #define AVG_SURROUND 1 #define DIM_SURROUND 2 #define DARK_SURROUND 3 #define CUTSHEET_SURROUND 4 #define D_CALCULATE (-1) typedef struct { cmsCIEXYZ whitePoint; cmsFloat64Number Yb; cmsFloat64Number La; cmsUInt32Number surround; cmsFloat64Number D_value; } cmsViewingConditions; CMSAPI cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC); CMSAPI void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel); CMSAPI void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut); CMSAPI void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut); // Tone curves ----------------------------------------------------------------------------------------- // This describes a curve segment. For a table of supported types, see the manual. User can increase the number of // available types by using a proper plug-in. Parametric segments allow 10 parameters at most typedef struct { cmsFloat32Number x0, x1; // Domain; for x0 < x <= x1 cmsInt32Number Type; // Parametric type, Type == 0 means sampled segment. Negative values are reserved cmsFloat64Number Params[10]; // Parameters if Type != 0 cmsUInt32Number nGridPoints; // Number of grid points if Type == 0 cmsFloat32Number* SampledPoints; // Points to an array of floats if Type == 0 } cmsCurveSegment; // The internal representation is none of your business. typedef struct _cms_curve_struct cmsToneCurve; CMSAPI cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsUInt32Number nSegments, const cmsCurveSegment Segments[]); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsUInt32Number nEntries, const cmsUInt16Number values[]); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]); CMSAPI void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve); CMSAPI void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]); CMSAPI cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* Src); CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma); CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsUInt32Number nResultSamples, const cmsToneCurve* InGamma); CMSAPI cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X, const cmsToneCurve* Y, cmsUInt32Number nPoints); CMSAPI cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda); CMSAPI cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v); CMSAPI cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* InGamma); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t); CMSAPI cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t); CMSAPI cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision); CMSAPI const cmsCurveSegment* CMSEXPORT cmsGetToneCurveSegment(cmsInt32Number n, const cmsToneCurve* t); // Tone curve tabular estimation CMSAPI cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t); CMSAPI const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t); // Implements pipelines of multi-processing elements ------------------------------------------------------------- // Nothing to see here, move along typedef struct _cmsPipeline_struct cmsPipeline; typedef struct _cmsStage_struct cmsStage; // Those are hi-level pipelines CMSAPI cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels); CMSAPI void CMSEXPORT cmsPipelineFree(cmsPipeline* lut); CMSAPI cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig); CMSAPI cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut); CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut); CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut); CMSAPI void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut); CMSAPI void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut); CMSAPI cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut); CMSAPI cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2); CMSAPI cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On); // Where to place/locate the stages in the pipeline chain typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc; CMSAPI cmsBool CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe); CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe); // This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements // that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and // then a list of expected types followed with a list of double pointers to Stage elements. If // the function founds a match with current pipeline, it fills the pointers and returns TRUE // if not, returns FALSE without touching anything. CMSAPI cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...); // Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode // matrices with far more precision that CLUTS CMSAPI cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels); CMSAPI cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]); CMSAPI cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe); CMSAPI void CMSEXPORT cmsStageFree(cmsStage* mpe); CMSAPI cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe); CMSAPI cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe); CMSAPI cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe); CMSAPI cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe); CMSAPI void* CMSEXPORT cmsStageData(const cmsStage* mpe); CMSAPI cmsContext CMSEXPORT cmsGetStageContextID(const cmsStage* mpe); // Sampling typedef cmsInt32Number (* cmsSAMPLER16) (CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo); typedef cmsInt32Number (* cmsSAMPLERFLOAT)(CMSREGISTER const cmsFloat32Number In[], CMSREGISTER cmsFloat32Number Out[], CMSREGISTER void * Cargo); // Use this flag to prevent changes being written to destination #define SAMPLER_INSPECT 0x01000000 // For CLUT only CMSAPI cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags); CMSAPI cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags); // Slicers CMSAPI cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLER16 Sampler, void * Cargo); CMSAPI cmsBool CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLERFLOAT Sampler, void * Cargo); // Multilocalized Unicode management --------------------------------------------------------------------------------------- typedef struct _cms_MLU_struct cmsMLU; #define cmsNoLanguage "\0\0" #define cmsNoCountry "\0\0" // Special language/country to retrieve unicode field for description in V2 profiles. Use with care. #define cmsV2Unicode "\xff\xff" CMSAPI cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems); CMSAPI void CMSEXPORT cmsMLUfree(cmsMLU* mlu); CMSAPI cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu); CMSAPI cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString); CMSAPI cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const wchar_t* WideString); CMSAPI cmsBool CMSEXPORT cmsMLUsetUTF8(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* UTF8String); CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetUTF8(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char ObtainedLanguage[3], char ObtainedCountry[3]); CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu); CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu, cmsUInt32Number idx, char LanguageCode[3], char CountryCode[3]); // Undercolorremoval & black generation ------------------------------------------------------------------------------------- typedef struct { cmsToneCurve* Ucr; cmsToneCurve* Bg; cmsMLU* Desc; } cmsUcrBg; // Screening ---------------------------------------------------------------------------------------------------------------- #define cmsPRINTER_DEFAULT_SCREENS 0x0001 #define cmsFREQUENCE_UNITS_LINES_CM 0x0000 #define cmsFREQUENCE_UNITS_LINES_INCH 0x0002 #define cmsSPOT_UNKNOWN 0 #define cmsSPOT_PRINTER_DEFAULT 1 #define cmsSPOT_ROUND 2 #define cmsSPOT_DIAMOND 3 #define cmsSPOT_ELLIPSE 4 #define cmsSPOT_LINE 5 #define cmsSPOT_SQUARE 6 #define cmsSPOT_CROSS 7 typedef struct { cmsFloat64Number Frequency; cmsFloat64Number ScreenAngle; cmsUInt32Number SpotShape; } cmsScreeningChannel; typedef struct { cmsUInt32Number Flag; cmsUInt32Number nChannels; cmsScreeningChannel Channels[cmsMAXCHANNELS]; } cmsScreening; // Named color ----------------------------------------------------------------------------------------------------------------- typedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST; CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix); CMSAPI void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v); CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v); CMSAPI cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* v, const char* Name, cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS]); CMSAPI cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* v); CMSAPI cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* v, const char* Name); CMSAPI cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor, char* Name, char* Prefix, char* Suffix, cmsUInt16Number* PCS, cmsUInt16Number* Colorant); // Retrieve named color list from transform CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform); // Profile sequence ----------------------------------------------------------------------------------------------------- // Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others // come from Profile Sequence Identifier Tag typedef struct { cmsSignature deviceMfg; cmsSignature deviceModel; cmsUInt64Number attributes; cmsTechnologySignature technology; cmsProfileID ProfileID; cmsMLU* Manufacturer; cmsMLU* Model; cmsMLU* Description; } cmsPSEQDESC; typedef struct { cmsUInt32Number n; cmsContext ContextID; cmsPSEQDESC* seq; } cmsSEQ; CMSAPI cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n); CMSAPI cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq); CMSAPI void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq); // Dictionaries -------------------------------------------------------------------------------------------------------- typedef struct _cmsDICTentry_struct { struct _cmsDICTentry_struct* Next; cmsMLU *DisplayName; cmsMLU *DisplayValue; wchar_t* Name; wchar_t* Value; } cmsDICTentry; CMSAPI cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID); CMSAPI void CMSEXPORT cmsDictFree(cmsHANDLE hDict); CMSAPI cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict); CMSAPI cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue); CMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict); CMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e); // Access to Profile data ---------------------------------------------------------------------------------------------- CMSAPI cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID); CMSAPI cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile); CMSAPI cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile); CMSAPI cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n); CMSAPI cmsBool CMSEXPORT cmsGetTagOffsetAndSize(cmsHPROFILE hProfile, cmsUInt32Number n, cmsUInt32Number* offset, cmsUInt32Number* size); CMSAPI cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig); // Read and write pre-formatted data CMSAPI void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig); CMSAPI cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data); CMSAPI cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest); CMSAPI cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig); // Read and write raw data CMSAPI cmsUInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size); // Access header data #define cmsEmbeddedProfileFalse 0x00000000 #define cmsEmbeddedProfileTrue 0x00000001 #define cmsUseAnywhere 0x00000000 #define cmsUseWithEmbeddedDataOnly 0x00000002 CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags); CMSAPI void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID); CMSAPI cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCMM(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model); CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags); CMSAPI void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID); CMSAPI void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent); CMSAPI cmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs); CMSAPI cmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig); CMSAPI cmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig); CMSAPI void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version); CMSAPI cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile); CMSAPI cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version); // How profiles may be used #define LCMS_USED_AS_INPUT 0 #define LCMS_USED_AS_OUTPUT 1 #define LCMS_USED_AS_PROOF 2 CMSAPI cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); CMSAPI cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile); CMSAPI cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); // Translate form/to our notation to ICC CMSAPI cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation); CMSAPI int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace); // Deprecated, use cmsChannelsOfColorSpace instead CMSAPI cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace); // Get number of channels of color space or -1 if color space is not listed/supported CMSAPI cmsInt32Number CMSEXPORT cmsChannelsOfColorSpace(cmsColorSpaceSignature ColorSpace); // Build a suitable formatter for the colorspace of this profile. nBytes=1 means 8 bits, nBytes=2 means 16 bits. CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat); CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat); // Localized info typedef enum { cmsInfoDescription = 0, cmsInfoManufacturer = 1, cmsInfoModel = 2, cmsInfoCopyright = 3 } cmsInfoType; CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfoUTF8(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize); // IO handlers ---------------------------------------------------------------------------------------------------------- typedef struct _cms_io_handler cmsIOHANDLER; CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode); CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream); CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode); CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID); CMSAPI cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile); CMSAPI cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io); // MD5 message digest -------------------------------------------------------------------------------------------------- CMSAPI cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile); // Profile high level functions ------------------------------------------------------------------------------------------ CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *ICCProfile, const char *sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char* sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void * MemPtr, cmsUInt32Number dwSize); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void * MemPtr, cmsUInt32Number dwSize); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write); CMSAPI cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile); CMSAPI cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName); CMSAPI cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream); CMSAPI cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded); CMSAPI cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io); // Predefined virtual profiles ------------------------------------------------------------------------------------------ CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFile(const char* cFileName); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFileTHR(cmsContext ContextID, const char* cFileName); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void); CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID); CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void); CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_OkLabProfile(cmsContext ctx); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID, cmsUInt32Number nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, cmsUInt32Number TempSrc, cmsUInt32Number TempDest); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(cmsUInt32Number nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, cmsUInt32Number TempSrc, cmsUInt32Number TempDest); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void); // Converts a transform to a devicelink profile CMSAPI cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags); // Intents ---------------------------------------------------------------------------------------------- // ICC Intents #define INTENT_PERCEPTUAL 0 #define INTENT_RELATIVE_COLORIMETRIC 1 #define INTENT_SATURATION 2 #define INTENT_ABSOLUTE_COLORIMETRIC 3 // Non-ICC intents #define INTENT_PRESERVE_K_ONLY_PERCEPTUAL 10 #define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC 11 #define INTENT_PRESERVE_K_ONLY_SATURATION 12 #define INTENT_PRESERVE_K_PLANE_PERCEPTUAL 13 #define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14 #define INTENT_PRESERVE_K_PLANE_SATURATION 15 // Call with NULL as parameters to get the intent count CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions); CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions); // Flags #define cmsFLAGS_NOCACHE 0x0040 // Inhibit 1-pixel cache #define cmsFLAGS_NOOPTIMIZE 0x0100 // Inhibit optimizations #define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway // Proofing flags #define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm #define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing // Misc #define cmsFLAGS_BLACKPOINTCOMPENSATION 0x2000 #define cmsFLAGS_NOWHITEONWHITEFIXUP 0x0004 // Don't fix scum dot #define cmsFLAGS_HIGHRESPRECALC 0x0400 // Use more memory to give better accuracy #define cmsFLAGS_LOWRESPRECALC 0x0800 // Use less memory to minimize resources // For devicelink creation #define cmsFLAGS_8BITS_DEVICELINK 0x0008 // Create 8 bits devicelinks #define cmsFLAGS_GUESSDEVICECLASS 0x0020 // Guess device class (for transform2devicelink) #define cmsFLAGS_KEEP_SEQUENCE 0x0080 // Keep profile sequence for devicelink creation // Specific to a particular optimizations #define cmsFLAGS_FORCE_CLUT 0x0002 // Force CLUT optimization #define cmsFLAGS_CLUT_POST_LINEARIZATION 0x0001 // create postlinearization tables if possible #define cmsFLAGS_CLUT_PRE_LINEARIZATION 0x0010 // create prelinearization tables if possible // Specific to unbounded mode #define cmsFLAGS_NONEGATIVES 0x8000 // Prevent negative numbers in floating point transforms // Copy alpha channels when transforming #define cmsFLAGS_COPY_ALPHA 0x04000000 // Alpha channels are copied on cmsDoTransform() // Fine-tune control over number of gridpoints #define cmsFLAGS_GRIDPOINTS(n) (((n) & 0xFF) << 16) // CRD special #define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000 // Transforms --------------------------------------------------------------------------------------------------- CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID, cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID, cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsHPROFILE Proofing, cmsUInt32Number Intent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsHPROFILE Proofing, cmsUInt32Number Intent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsHPROFILE hGamutProfile, cmsUInt32Number nGamutPCSposition, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number dwFlags); CMSAPI void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform); CMSAPI void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, const void * InputBuffer, void * OutputBuffer, cmsUInt32Number Size); CMSAPI void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, // Deprecated const void * InputBuffer, void * OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride); CMSAPI void CMSEXPORT cmsDoTransformLineStride(cmsHTRANSFORM Transform, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, cmsUInt32Number BytesPerLineIn, cmsUInt32Number BytesPerLineOut, cmsUInt32Number BytesPerPlaneIn, cmsUInt32Number BytesPerPlaneOut); CMSAPI void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); CMSAPI void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); CMSAPI void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]); CMSAPI void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]); // Adaptation state for absolute colorimetric intent CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d); CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d); // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed CMSAPI cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform); // Grab the input/output formats CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform); CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform); // Access the optimized pipeline and gamut-check pipeline inside a transform. CMSAPI cmsPipeline* CMSEXPORT cmsGetTransformPipeline(cmsHTRANSFORM hTransform); CMSAPI cmsPipeline* CMSEXPORT cmsGetTransformGamutCheckPipeline(cmsHTRANSFORM hTransform); // Grab colorants CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformInputColorants(cmsHTRANSFORM hTransform); CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformOutputColorants(cmsHTRANSFORM hTransform); // For backwards compatibility CMSAPI cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat); // PostScript ColorRenderingDictionary and ColorSpaceArray ---------------------------------------------------- typedef enum { cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD } cmsPSResourceType; // lcms2 unified method to access postscript color resources CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, cmsPSResourceType Type, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* io); CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen); CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen); // IT8.7 / CGATS.17-200x handling ----------------------------------------------------------------------------- CMSAPI cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID); CMSAPI void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8); // Tables CMSAPI cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8); CMSAPI cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE hIT8, cmsUInt32Number nTable); // Persistence CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName); CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, const void *Ptr, cmsUInt32Number len); // CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io); CMSAPI cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName); CMSAPI cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded); // Properties CMSAPI const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8); CMSAPI cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type); CMSAPI cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* cComment); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer); CMSAPI const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp); CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp); CMSAPI const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey); CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames); CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames); // Datasets CMSAPI const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col); CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val); CMSAPI const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample); CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample); CMSAPI cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample, cmsFloat64Number Val); CMSAPI int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, const char *Sample); CMSAPI int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames); CMSAPI const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer); CMSAPI int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch); // The LABEL extension CMSAPI int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType); CMSAPI cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample); // Formatter for double CMSAPI void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter); // Gamut boundary description routines ------------------------------------------------------------------------------ CMSAPI cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID); CMSAPI void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD); CMSAPI cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab); CMSAPI cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGDB, cmsUInt32Number dwFlags); CMSAPI cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab); // Feature detection ---------------------------------------------------------------------------------------------- // Estimate the black point CMSAPI cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); // Estimate total area coverage CMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile); // Estimate gamma space, always positive. Returns -1 on error. CMSAPI cmsFloat64Number CMSEXPORT cmsDetectRGBProfileGamma(cmsHPROFILE hProfile, cmsFloat64Number threshold); // Poor man's gamut mapping CMSAPI cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab, double amax, double amin, double bmax, double bmin); #ifndef CMS_USE_CPP_API # ifdef __cplusplus } # endif #endif #define _lcms2_H #endif lcms2-2.19.1/include/Makefile.am0000644000175000017500000000022715176573557015343 0ustar martimarti# # Makefile for include directory # Based on a work by Bob Friesenhahn include_HEADERS = lcms2.h lcms2_plugin.h EXTRA_DIST = lcms2.h lcms2_plugin.h lcms2-2.19.1/include/Makefile.in0000644000175000017500000004244715176574547015366 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for include directory # Based on a work by Bob Friesenhahn VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(includedir)" HEADERS = $(include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ include_HEADERS = lcms2.h lcms2_plugin.h EXTRA_DIST = lcms2.h lcms2_plugin.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-includeHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/lcms2.pc.in0000644000175000017500000000040715176573557013635 0ustar martimartiprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: @PACKAGE@ Description: LCMS Color Management Library Version: @VERSION@ Libs: -L${libdir} -llcms2 @LIB_PLUGINS@ Libs.private: @LIB_MATH@ @LIB_THREAD@ Cflags: -I${includedir} lcms2-2.19.1/m4/0000755000175000017500000000000015176574546012202 5ustar martimartilcms2-2.19.1/m4/ax_append_compile_flags.m40000644000175000017500000000334515176573557017275 0ustar martimarti# ============================================================================ # https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html # ============================================================================ # # SYNOPSIS # # AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # # For every FLAG1, FLAG2 it is checked whether the compiler works with the # flag. If it does, the flag is added FLAGS-VARIABLE # # If FLAGS-VARIABLE is not specified, the current language's flags (e.g. # CFLAGS) is used. During the check the flag is always added to the # current language's flags. # # If EXTRA-FLAGS is defined, it is added to the current language's default # flags (e.g. CFLAGS) when the check is done. The check is thus made with # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # # INPUT gives an alternative input source to AC_COMPILE_IFELSE. # # NOTE: This macro depends on the AX_APPEND_FLAG and # AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with # AX_APPEND_LINK_FLAGS. # # LICENSE # # Copyright (c) 2011 Maarten Bosmans # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 7 AC_DEFUN([AX_APPEND_COMPILE_FLAGS], [AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) for flag in $1; do AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4]) done ])dnl AX_APPEND_COMPILE_FLAGS lcms2-2.19.1/m4/ax_append_flag.m40000644000175000017500000000302015176573557015370 0ustar martimarti# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_append_flag.html # =========================================================================== # # SYNOPSIS # # AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) # # DESCRIPTION # # FLAG is appended to the FLAGS-VARIABLE shell variable, with a space # added in between. # # If FLAGS-VARIABLE is not specified, the current language's flags (e.g. # CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains # FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly # FLAG. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 8 AC_DEFUN([AX_APPEND_FLAG], [dnl AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) AS_VAR_SET_IF(FLAGS,[ AS_CASE([" AS_VAR_GET(FLAGS) "], [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], [ AS_VAR_APPEND(FLAGS,[" $1"]) AC_RUN_LOG([: FLAGS="$FLAGS"]) ]) ], [ AS_VAR_SET(FLAGS,[$1]) AC_RUN_LOG([: FLAGS="$FLAGS"]) ]) AS_VAR_POPDEF([FLAGS])dnl ])dnl AX_APPEND_FLAG lcms2-2.19.1/m4/ax_check_compile_flag.m40000644000175000017500000000407015176573557016714 0ustar martimarti# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # # Check whether the given FLAG works with the current language's compiler # or gives an error. (Warnings, however, are ignored) # # ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on # success/failure. # # If EXTRA-FLAGS is defined, it is added to the current language's default # flags (e.g. CFLAGS) when the check is done. The check is thus made with # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # # INPUT gives an alternative input source to AC_COMPILE_IFELSE. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 6 AC_DEFUN([AX_CHECK_COMPILE_FLAG], [AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl ])dnl AX_CHECK_COMPILE_FLAGS lcms2-2.19.1/m4/ax_gcc_func_attribute.m40000644000175000017500000002042615176573557016773 0ustar martimarti# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html # =========================================================================== # # SYNOPSIS # # AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE) # # DESCRIPTION # # This macro checks if the compiler supports one of GCC's function # attributes; many other compilers also provide function attributes with # the same syntax. Compiler warnings are used to detect supported # attributes as unsupported ones are ignored by default so quieting # warnings when using this macro will yield false positives. # # The ATTRIBUTE parameter holds the name of the attribute to be checked. # # If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_. # # The macro caches its result in the ax_cv_have_func_attribute_ # variable. # # The macro currently supports the following function attributes: # # alias # aligned # alloc_size # always_inline # artificial # cold # const # constructor # constructor_priority for constructor attribute with priority # deprecated # destructor # dllexport # dllimport # error # externally_visible # fallthrough # flatten # format # format_arg # gnu_format # gnu_inline # hot # ifunc # leaf # malloc # noclone # noinline # nonnull # noreturn # nothrow # optimize # pure # sentinel # sentinel_position # unused # used # visibility # warning # warn_unused_result # weak # weakref # # Unsupported function attributes will be tested with a prototype # returning an int and not accepting any arguments and the result of the # check might be wrong or meaningless so use with care. # # LICENSE # # Copyright (c) 2013 Gabriele Svelto # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 13 AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([ m4_case([$1], [alias], [ int foo( void ) { return 0; } int bar( void ) __attribute__(($1("foo"))); ], [aligned], [ int foo( void ) __attribute__(($1(32))); ], [alloc_size], [ void *foo(int a) __attribute__(($1(1))); ], [always_inline], [ inline __attribute__(($1)) int foo( void ) { return 0; } ], [artificial], [ inline __attribute__(($1)) int foo( void ) { return 0; } ], [cold], [ int foo( void ) __attribute__(($1)); ], [const], [ int foo( void ) __attribute__(($1)); ], [constructor_priority], [ int foo( void ) __attribute__((__constructor__(65535/2))); ], [constructor], [ int foo( void ) __attribute__(($1)); ], [deprecated], [ int foo( void ) __attribute__(($1(""))); ], [destructor], [ int foo( void ) __attribute__(($1)); ], [dllexport], [ __attribute__(($1)) int foo( void ) { return 0; } ], [dllimport], [ int foo( void ) __attribute__(($1)); ], [error], [ int foo( void ) __attribute__(($1(""))); ], [externally_visible], [ int foo( void ) __attribute__(($1)); ], [fallthrough], [ void foo( int x ) {switch (x) { case 1: __attribute__(($1)); case 2: break ; }}; ], [flatten], [ int foo( void ) __attribute__(($1)); ], [format], [ int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); ], [gnu_format], [ int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2))); ], [format_arg], [ char *foo(const char *p) __attribute__(($1(1))); ], [gnu_inline], [ inline __attribute__(($1)) int foo( void ) { return 0; } ], [hot], [ int foo( void ) __attribute__(($1)); ], [ifunc], [ int my_foo( void ) { return 0; } static int (*resolve_foo(void))(void) { return my_foo; } int foo( void ) __attribute__(($1("resolve_foo"))); ], [leaf], [ __attribute__(($1)) int foo( void ) { return 0; } ], [malloc], [ void *foo( void ) __attribute__(($1)); ], [noclone], [ int foo( void ) __attribute__(($1)); ], [noinline], [ __attribute__(($1)) int foo( void ) { return 0; } ], [nonnull], [ int foo(char *p) __attribute__(($1(1))); ], [noreturn], [ void foo( void ) __attribute__(($1)); ], [nothrow], [ int foo( void ) __attribute__(($1)); ], [optimize], [ __attribute__(($1(3))) int foo( void ) { return 0; } ], [pure], [ int foo( void ) __attribute__(($1)); ], [sentinel], [ int foo(void *p, ...) __attribute__(($1)); ], [sentinel_position], [ int foo(void *p, ...) __attribute__(($1(1))); ], [returns_nonnull], [ void *foo( void ) __attribute__(($1)); ], [unused], [ int foo( void ) __attribute__(($1)); ], [used], [ int foo( void ) __attribute__(($1)); ], [visibility], [ int foo_def( void ) __attribute__(($1("default"))); int foo_hid( void ) __attribute__(($1("hidden"))); int foo_int( void ) __attribute__(($1("internal"))); int foo_pro( void ) __attribute__(($1("protected"))); ], [warning], [ int foo( void ) __attribute__(($1(""))); ], [warn_unused_result], [ int foo( void ) __attribute__(($1)); ], [weak], [ int foo( void ) __attribute__(($1)); ], [weakref], [ static int foo( void ) { return 0; } static int bar( void ) __attribute__(($1("foo"))); ], [ m4_warn([syntax], [Unsupported attribute $1, the test may fail]) int foo( void ) __attribute__(($1)); ] )], []) ], dnl GCC doesn't exit with an error if an unknown attribute is dnl provided but only outputs a warning, so accept the attribute dnl only if no warning were issued. [AS_IF([grep -- -Wattributes conftest.err], [AS_VAR_SET([ac_var], [no])], [AS_VAR_SET([ac_var], [yes])])], [AS_VAR_SET([ac_var], [no])]) ]) AS_IF([test yes = AS_VAR_GET([ac_var])], [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, [Define to 1 if the system has the `$1' function attribute])], []) AS_VAR_POPDEF([ac_var]) ]) lcms2-2.19.1/m4/ax_pthread.m40000644000175000017500000005403415176573557014572 0ustar martimarti# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is # needed for multi-threaded programs (defaults to the value of CC # respectively CXX otherwise). (This is necessary on e.g. AIX to use the # special cc_r/CC_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # CXX="$PTHREAD_CXX" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to # that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # Copyright (c) 2019 Marc Stevens # # 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 . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 31 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items with a "," contain both # C compiler flags (before ",") and linker flags (after ","). Other items # starting with a "-" are C compiler flags, and remaining items are # library names, except for "none" which indicates that we try without # any flags at all, and "pthread-config" which is a program returning # the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], [ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif ], [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac # Are we compiling with Clang? AC_CACHE_CHECK([whether $CC is Clang], [ax_cv_PTHREAD_CLANG], [ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif ], [ax_cv_PTHREAD_CLANG=yes]) fi ]) ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) # Note that for GCC and Clang -pthread generally implies -lpthread, # except when -nostdlib is passed. # This is problematic using libtool to build C++ shared libraries with pthread: # [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 # [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC AS_IF([test "x$GCC" = "xyes"], [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first AS_IF([test "x$ax_pthread_clang" = "xyes"], [ax_pthread_flags="-pthread,-lpthread -pthread"]) # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac AS_IF([test "x$ax_pthread_check_macro" = "x--"], [ax_pthread_check_cond=0], [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void *some_global = NULL; static void routine(void *a) { /* To avoid any unused-parameter or unused-but-set-parameter warning. */ some_global = a; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [ac_link="$ax_pthread_2step_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [break]) ]) done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" ]) case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_CACHE_CHECK([for joinable pthread attribute], [ax_cv_PTHREAD_JOINABLE_ATTR], [ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $ax_pthread_attr; return attr /* ; */])], [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], []) done ]) AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes"], [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$ax_cv_PTHREAD_JOINABLE_ATTR], [Define to necessary symbol if this constant uses a non-standard name on your system.]) ax_pthread_joinable_attr_defined=yes ]) AC_CACHE_CHECK([whether more special flags are required for pthreads], [ax_cv_PTHREAD_SPECIAL_FLAGS], [ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac ]) AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes"], [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], [ax_cv_PTHREAD_PRIO_INHERIT], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT; return i;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes"], [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) ax_pthread_prio_inherit_defined=yes ]) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) AS_CASE(["x/$CC"], [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], [#handle absolute path differently from PATH based program lookup AS_CASE(["x$CC"], [x/*], [ AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"]) AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])]) ], [ AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC]) AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])]) ] ) ]) ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" AC_SUBST([PTHREAD_LIBS]) AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) AC_SUBST([PTHREAD_CXX]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_POP ])dnl AX_PTHREAD lcms2-2.19.1/m4/ax_require_defined.m40000644000175000017500000000230215176573557016264 0ustar martimarti# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_require_defined.html # =========================================================================== # # SYNOPSIS # # AX_REQUIRE_DEFINED(MACRO) # # DESCRIPTION # # AX_REQUIRE_DEFINED is a simple helper for making sure other macros have # been defined and thus are available for use. This avoids random issues # where a macro isn't expanded. Instead the configure script emits a # non-fatal: # # ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found # # It's like AC_REQUIRE except it doesn't expand the required macro. # # Here's an example: # # AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) # # LICENSE # # Copyright (c) 2014 Mike Frysinger # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 2 AC_DEFUN([AX_REQUIRE_DEFINED], [dnl m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) ])dnl AX_REQUIRE_DEFINED lcms2-2.19.1/m4/libtool.m40000644000175000017500000113752015176574546014121 0ustar martimarti# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2019, 2021-2024 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool 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 . ]) # serial 63 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.64])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_DECL_FILECMD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), in case it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2024 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) # Feature test to disable chained fixups since it is not # compatible with '-undefined dynamic_lookup' AC_CACHE_CHECK([for -no_fixup_chains linker flag], [lt_cv_support_no_fixup_chains], [ save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-no_fixup_chains" AC_LINK_IFELSE( [AC_LANG_PROGRAM([],[])], lt_cv_support_no_fixup_chains=yes, lt_cv_support_no_fixup_chains=no ) LDFLAGS=$save_LDFLAGS ] ) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main(void) { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' if test yes = "$lt_cv_support_no_fixup_chains"; then AS_VAR_APPEND([_lt_dar_allow_undefined], [' $wl-no_fixup_chains']) fi ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi _lt_dar_needs_single_mod=no case $host_os in rhapsody* | darwin1.*) _lt_dar_needs_single_mod=yes ;; darwin*) # When targeting Mac OS X 10.4 (darwin 8) or later, # -single_module is the default and -multi_module is unsupported. # The toolchain on macOS 10.14 (darwin 18) and later cannot # target any OS version that needs -single_module. case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*-darwin[[567]].*|10.[[0-3]],*-darwin[[5-9]].*|10.[[0-3]],*-darwin1[[0-7]].*) _lt_dar_needs_single_mod=yes ;; esac ;; esac if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [m4_require([_LT_DECL_SED])dnl AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then # Trim trailing / since we'll always append absolute paths and we want # to avoid //, if only for less confusing output for the user. lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*|x86_64-gnu*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*|x86_64-gnu*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} _LT_DECL([], [AR], [1], [The archiver]) # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because that's what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS _LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. _LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_REQUIRE([AC_PROG_RANLIB]) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu* | ironclad*) # Under GNU Hurd and Ironclad, this test is not required because there # is no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | windows* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord (void) __attribute__((visibility("default"))); #endif int fnord (void) { return 42; } int main (void) { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | windows* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -z "$STRIP"; then AC_MSG_RESULT([no]) else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds # If user builds GCC with multilib enabled, # it should just install on $(libdir) # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. if test xyes = x"$multilib"; then postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ $install_prog $dir/$dlname $destdir/$dlname~ chmod a+x $destdir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib $destdir/$dlname'\'' || exit \$?; fi' else postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac case $host_cpu in powerpc64) # On FreeBSD bi-arch platforms, a different variable is used for 32-bit # binaries. See . AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[int test_pointer_size[sizeof (void *) - 5]; ]])], [shlibpath_var=LD_LIBRARY_PATH], [shlibpath_var=LD_32_LIBRARY_PATH]) ;; *) shlibpath_var=LD_LIBRARY_PATH ;; esac case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' hardcode_into_libs=no ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # -rpath works at least for libraries that are not overridden by # libraries installed in system locations. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directories which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *-mlibc) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='mlibc ld.so' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; serenity*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no dynamic_linker='SerenityOS LibELF' ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; emscripten*) version_type=none need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= dynamic_linker="Emscripten linker" _LT_COMPILER_PIC($1)='-fPIC' _LT_TAGVAR(archive_cmds, $1)='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(no_undefined_flag, $1)= ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw* | *-*-windows*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | windows* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; *-mlibc) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; serenity*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | windows* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw* | windows*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_manifest_tool], [lt_cv_path_manifest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_manifest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_manifest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-mingw* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | windows* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BCDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw* | windows*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(void){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *-mlibc) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; serenity*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *flang* | ftn | f18* | f95*) # Flang compiler. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *-mlibc) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; serenity*) ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | windows* | cegcc*) case $cc_basename in cl* | icl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] _LT_TAGVAR(file_list_spec, $1)='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=no ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; *-mlibc) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and ICC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; esac ;; *-mlibc) ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; serenity*) ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e. impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(void){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | windows* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl* | ,icl* | no,icl*) # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=no ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " [[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; *-mlibc) _LT_TAGVAR(ld_shlibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; serenity*) ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R,l}" and the path. # Remove the space. if test x-L = x"$p" || test x-R = x"$p" || test x-l = x"$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_FILECMD # ---------------- # Check for a file(cmd) program that can be used to detect file type and magic m4_defun([_LT_DECL_FILECMD], [AC_CHECK_PROG([FILECMD], [file], [file], [:]) _LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) ])# _LD_DECL_FILECMD # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* | *-*-windows* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS lcms2-2.19.1/m4/ltoptions.m40000644000175000017500000003612115176574546014502 0ustar martimarti# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2024 Free # Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 10 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --enable-aix-soname configure option, and support the # `aix-soname=aix' and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. # DEFAULT is either `aix', `both', or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_ENABLE([aix-soname], [AS_HELP_STRING([--enable-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $enableval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --enable-aix-soname]) ;; esac lt_cv_with_aix_soname=$enable_aix_soname], [_AC_ENABLE_IF([with], [aix-soname], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)]) enable_aix_soname=$lt_cv_with_aix_soname]) with_aix_soname=$enable_aix_soname AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --enable-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_ENABLE([pic], [AS_HELP_STRING([--enable-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $enableval in yes|no) pic_mode=$enableval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $enableval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [dnl Continue to support --with-pic and --without-pic, for backward dnl compatibility. _AC_ENABLE_IF([with], [pic], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])])] ) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) lcms2-2.19.1/m4/ltsugar.m40000644000175000017500000001045315176574546014130 0ustar martimarti# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2024 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) lcms2-2.19.1/m4/ltversion.m40000644000175000017500000000131215176574546014466 0ustar martimarti# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2019, 2021-2024 Free Software Foundation, # Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4441 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.5.4]) m4_define([LT_PACKAGE_REVISION], [2.5.4]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.5.4' macro_revision='2.5.4' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) lcms2-2.19.1/m4/lt~obsolete.m40000644000175000017500000001400715176574546015020 0ustar martimarti# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2024 Free # Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) lcms2-2.19.1/plugins/0000755000175000017500000000000015176574553013341 5ustar martimartilcms2-2.19.1/plugins/README.1ST0000644000175000017500000000035415176573557014634 0ustar martimarti IMPORTANT: Before adding those plug-ins to your commercial project, please check licenses for each plugin. LittleCMS core is released under MIT, but plug-ins may be released under other license. fast_float and threaded are GPL3 lcms2-2.19.1/plugins/fast_float/0000755000175000017500000000000015176574562015463 5ustar martimartilcms2-2.19.1/plugins/fast_float/COPYING.GPL30000644000175000017500000010451215176573557017230 0ustar martimarti GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .lcms2-2.19.1/plugins/fast_float/Makefile.am0000644000175000017500000000003615176573557017521 0ustar martimartiSUBDIRS = src include testbed lcms2-2.19.1/plugins/fast_float/Projects/0000755000175000017500000000000015176573557017257 5ustar martimartilcms2-2.19.1/plugins/fast_float/Projects/VC2019/0000755000175000017500000000000015176573557020103 5ustar martimartilcms2-2.19.1/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin.vcxproj0000644000175000017500000002376315176573557026333 0ustar martimarti Debug Win32 Debug x64 Release Win32 Release x64 {71dede59-3f1e-486b-a899-4283000f76b5} {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} Win32Proj fast StaticLibrary true Unicode v142 StaticLibrary true Unicode v142 StaticLibrary false true Unicode v142 StaticLibrary false true Unicode v142 AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true Windows true true true true Level4 MaxSpeed true true WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded AnySuitable Speed true true true Fast Windows true true true lcms2-2.19.1/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin.vcxproj.filters0000644000175000017500000000506615176573557027776 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {7d5b1769-2be4-46f2-9e35-6260eea79d7f} {012df308-35db-4909-b035-b1cd5fd1ee5b} Header Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files doc doc lcms2-2.19.1/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin_testbed.vcxproj0000644000175000017500000002041315176573557030032 0ustar martimarti Debug Win32 Debug x64 Release Win32 Release x64 {7629D670-C419-402B-8A90-747952EE9FC0} Win32Proj fast_testbed 10.0 Application true Unicode v142 Application true Unicode v142 Application false true Unicode v142 Application false true Unicode v142 true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true {71dede59-3f1e-486b-a899-4283000f76b5} {ad9ff79b-cf6e-4971-a7cf-daa47d636676} lcms2-2.19.1/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin_testbed.vcxproj.filters0000644000175000017500000000170115176573557031500 0ustar martimarti {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files lcms2-2.19.1/plugins/fast_float/Projects/VC2022/0000755000175000017500000000000015176573557020075 5ustar martimartilcms2-2.19.1/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin_testbed.vcxproj.filters0000644000175000017500000000170115176573557031472 0ustar martimarti {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files lcms2-2.19.1/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin.vcxproj.filters0000644000175000017500000000471015176573557027763 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {7d5b1769-2be4-46f2-9e35-6260eea79d7f} {012df308-35db-4909-b035-b1cd5fd1ee5b} Header Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files doc lcms2-2.19.1/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin.vcxproj0000644000175000017500000003445015176573557026320 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {71dede59-3f1e-486b-a899-4283000f76b5} {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} Win32Proj fast 10.0 StaticLibrary true Unicode v143 StaticLibrary true Unicode v143 StaticLibrary true Unicode v143 StaticLibrary false true Unicode v143 StaticLibrary false true Unicode v143 StaticLibrary false true Unicode v143 AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\fast_float_plugin_$(Configuration)\ $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast CompileAsC Windows true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded AnySuitable Speed true true true Fast StreamingSIMDExtensions2 CompileAsC Windows true true true lcms2-2.19.1/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin_testbed.vcxproj0000644000175000017500000002740015176573557030027 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {7629D670-C419-402B-8A90-747952EE9FC0} Win32Proj fast_testbed 10.0 Application true Unicode v143 Application true Unicode v143 Application true Unicode v143 Application false true Unicode v143 Application false true Unicode v143 Application false true Unicode v143 true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ true $(Platform)\testbed_$(Configuration)\ true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src CompileAsC Console true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded CompileAsC Console true true true {71dede59-3f1e-486b-a899-4283000f76b5} {ad9ff79b-cf6e-4971-a7cf-daa47d636676} lcms2-2.19.1/plugins/fast_float/Projects/VC2026/0000755000175000017500000000000015176573557020101 5ustar martimartilcms2-2.19.1/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin.vcxproj0000644000175000017500000003445015176573557026324 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {71dede59-3f1e-486b-a899-4283000f76b5} {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} Win32Proj fast 10.0 StaticLibrary true Unicode v145 StaticLibrary true Unicode v145 StaticLibrary true Unicode v145 StaticLibrary false true Unicode v145 StaticLibrary false true Unicode v145 StaticLibrary false true Unicode v145 AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ AllRules.ruleset $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\fast_float_plugin_$(Configuration)\ $(Platform)\fast_float_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast CompileAsC Windows true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded AnySuitable Speed true true true Fast StreamingSIMDExtensions2 CompileAsC Windows true true true lcms2-2.19.1/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin.vcxproj.filters0000644000175000017500000000471015176573557027767 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {7d5b1769-2be4-46f2-9e35-6260eea79d7f} {012df308-35db-4909-b035-b1cd5fd1ee5b} Header Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files doc lcms2-2.19.1/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin_testbed.vcxproj0000644000175000017500000002740015176573557030033 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {7629D670-C419-402B-8A90-747952EE9FC0} Win32Proj fast_testbed 10.0 Application true Unicode v145 Application true Unicode v145 Application true Unicode v145 Application false true Unicode v145 Application false true Unicode v145 Application false true Unicode v145 true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ true $(Platform)\testbed_$(Configuration)\ true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src CompileAsC Console true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded CompileAsC Console true true true {71dede59-3f1e-486b-a899-4283000f76b5} {ad9ff79b-cf6e-4971-a7cf-daa47d636676} lcms2-2.19.1/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin_testbed.vcxproj.filters0000644000175000017500000000170115176573557031476 0ustar martimarti {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files lcms2-2.19.1/plugins/fast_float/include/0000755000175000017500000000000015176574562017106 5ustar martimartilcms2-2.19.1/plugins/fast_float/include/Makefile.am0000644000175000017500000000015315176573557021144 0ustar martimarti# # Makefile for include directory include_HEADERS = lcms2_fast_float.h EXTRA_DIST = lcms2_fast_float.h lcms2-2.19.1/plugins/fast_float/include/meson.build0000644000175000017500000000004615176573557021253 0ustar martimartiinstall_headers('lcms2_fast_float.h') lcms2-2.19.1/plugins/fast_float/include/lcms2_fast_float.h0000644000175000017500000002164115176573557022510 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #ifndef _LCMS2_FAST_FLOAT_H #define _LCMS2_FAST_FLOAT_H #include "lcms2_plugin.h" #ifndef CMS_USE_CPP_API # ifdef __cplusplus extern "C" { # endif #endif #define LCMS2_FAST_FLOAT_VERSION LCMS_VERSION // Configuration toggles // Uncomment this if you want to avoid SSE2 entirely. // Default is commented out. There are two kernels, one is vectorized and the other is not. // On initialization, there is a SSE2 detection. If the SSE2 detection succeeds, then the vectorized code is selected. // If the CPU is old and does not support SSE2, then the non-vectorized code is used. // If you define the toggle, there is no detection and the non-vectorized kernel is always used. // #define CMS_DONT_USE_SSE2 1 // The one and only plug-in entry point. To install this plugin in your code // you need to place this in some initialization place: // // cmsPlugin(cmsFastFloatExtensions()); // CMSAPI void* CMSEXPORT cmsFastFloatExtensions(void); // New encodings that the plug-in implements #define BIT15_SH(a) ((a) << 26) #define T_BIT15(a) (((a)>>26)&1) #define DITHER_SH(a) ((a) << 27) #define T_DITHER(a) (((a)>>27)&1) #define TYPE_GRAY_15 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|BIT15_SH(1)) #define TYPE_GRAY_15_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1)|BIT15_SH(1)) #define TYPE_GRAY_15_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_GRAYA_15 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|BIT15_SH(1)) #define TYPE_GRAYA_15_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_GRAYA_15_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) #define TYPE_RGB_15 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|BIT15_SH(1)) #define TYPE_RGB_15_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) #define TYPE_RGB_15_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_BGR_15 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) #define TYPE_BGR_15_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)|BIT15_SH(1)) #define TYPE_BGR_15_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_RGBA_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|BIT15_SH(1)) #define TYPE_RGBA_15_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) #define TYPE_RGBA_15_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_ARGB_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|BIT15_SH(1)) #define TYPE_ABGR_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) #define TYPE_ABGR_15_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)|BIT15_SH(1)) #define TYPE_ABGR_15_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_BGRA_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) #define TYPE_BGRA_15_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) #define TYPE_CMY_15 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|BIT15_SH(1)) #define TYPE_YMC_15 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) #define TYPE_CMY_15_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) #define TYPE_CMY_15_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_CMYK_15 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|BIT15_SH(1)) #define TYPE_CMYK_15_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|BIT15_SH(1)) #define TYPE_CMYK_15_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) #define TYPE_CMYK_15_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_KYMC_15 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) #define TYPE_KYMC_15_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)|BIT15_SH(1)) #define TYPE_KCMY_15 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1)|BIT15_SH(1)) #define TYPE_KCMY_15_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) #define TYPE_KCMY_15_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) #define TYPE_GRAY_8_DITHER (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|DITHER_SH(1)) #define TYPE_RGB_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DITHER_SH(1)) #define TYPE_RGBA_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DITHER_SH(1)) #define TYPE_BGR_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|DITHER_SH(1)) #define TYPE_ABGR_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|DITHER_SH(1)) #define TYPE_CMYK_8_DITHER (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DITHER_SH(1)) #define TYPE_KYMC_8_DITHER (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|DITHER_SH(1)) #define TYPE_AGRAY_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(1)) #define TYPE_AGRAY_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(2)) #define TYPE_AGRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(4)) #define TYPE_AGRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(0)) #define TYPE_ACMYK_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1)) #define TYPE_KYMCA_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_AKYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_CMYKA_16 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(2)) #define TYPE_ACMYK_16 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_KYMCA_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_AKYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_AGRAY_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_AGRAY_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_GRAYA_FLT_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(4)|PLANAR_SH(1)) #define TYPE_AGRAY_FLT_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(4)|PLANAR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_GRAYA_DBL_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(0)|PLANAR_SH(1)) #define TYPE_AGRAY_DBL_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(0)|PLANAR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ARGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|PLANAR_SH(1)) #define TYPE_BGRA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) #ifndef CMS_USE_CPP_API # ifdef __cplusplus } # endif #endif #endif lcms2-2.19.1/plugins/fast_float/include/Makefile.in0000644000175000017500000004246415176574547021170 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for include directory VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/fast_float/include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(includedir)" HEADERS = $(include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ include_HEADERS = lcms2_fast_float.h EXTRA_DIST = lcms2_fast_float.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/fast_float/include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/fast_float/include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-includeHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/fast_float/meson.build0000644000175000017500000000006215176573557017626 0ustar martimartisubdir('include') subdir('src') subdir('testbed') lcms2-2.19.1/plugins/fast_float/src/0000755000175000017500000000000015176574562016252 5ustar martimartilcms2-2.19.1/plugins/fast_float/src/lcms2_fast_float.rc.in0000644000175000017500000000354515176573557022441 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, multithread extensions // Copyright (c) 1998-2022 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include 1 VERSIONINFO FILEVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 PRODUCTVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #endif FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL { BLOCK "StringFileInfo" { BLOCK "040904e4" { VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "Fast Float plugin" VALUE "FileVersion", @LCMS2_VERSION@ VALUE "InternalName", "lcms2_fast_float" VALUE "LegalCopyright", "Copyright (C) Marti Maria 2022, GPL-3.0-or-later" VALUE "OriginalFilename", "lcms2_fast_float.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", @LCMS2_VERSION@ } } BLOCK "VarFileInfo" { VALUE "Translation", 0x409, 1252 } } lcms2-2.19.1/plugins/fast_float/src/meson.build0000644000175000017500000000232315176573557020417 0ustar martimartilcms2_fast_float_sources = files( 'fast_16_tethra.c', 'fast_8_curves.c', 'fast_8_matsh.c', 'fast_8_matsh_sse.c', 'fast_8_tethra.c', 'fast_float_15bits.c', 'fast_float_15mats.c', 'fast_float_cmyk.c', 'fast_float_curves.c', 'fast_float_internal.h', 'fast_float_lab.c', 'fast_float_matsh.c', 'fast_float_separate.c', 'fast_float_sup.c', 'fast_float_tethra.c', ) lcms2_fast_float_incdir = include_directories('../include', '.') if host_machine.system() == 'windows' if get_option('default_library') == 'shared' lcms2_fast_float_rc = configure_file( input: 'lcms2_fast_float.rc.in', configuration: version_cfg, output: 'lcms2_fast_float.rc', ) lcms2_fast_float_sources += win.compile_resources(lcms2_fast_float_rc) endif endif liblcms2_fast_float = library( 'lcms2_fast_float', lcms2_fast_float_sources, gnu_symbol_visibility: 'hidden', dependencies: [liblcms2_dep, m_dep], include_directories: lcms2_fast_float_incdir, c_args: cargs, version: library_version, install: true, ) liblcms2_fast_float_dep = declare_dependency( link_with: liblcms2_fast_float, include_directories: lcms2_fast_float_incdir, ) extra_libraries += liblcms2_fast_float lcms2-2.19.1/plugins/fast_float/src/Makefile.am0000644000175000017500000000176115176573557020316 0ustar martimarti# # Makefile for building lcms2_fast_float library # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign includedir = ${prefix}/include # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2_fast_float.la LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBRARY_AGE = @LIBRARY_AGE@ AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include liblcms2_fast_float_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_fast_float_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la liblcms2_fast_float_la_SOURCES = fast_8_curves.c fast_8_matsh_sse.c fast_8_matsh.c fast_8_tethra.c \ fast_16_tethra.c fast_float_15bits.c fast_float_15mats.c fast_float_cmyk.c fast_float_curves.c fast_float_matsh.c \ fast_float_separate.c fast_float_sup.c fast_float_tethra.c fast_float_lab.c fast_float_internal.h lcms2-2.19.1/plugins/fast_float/src/fast_16_tethra.c0000644000175000017500000003573015176573557021243 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" // lcms internal CMSAPI cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); // Optimization for 16 bits, 3 inputs only typedef struct { cmsContext ContextID; const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. } Performance16Data; // Precomputes tables for 16-bit on input devicelink. static Performance16Data* Performance16alloc(cmsContext ContextID, const cmsInterpParams* p) { Performance16Data* p16; p16 = (Performance16Data*) _cmsMallocZero(ContextID, sizeof(Performance16Data)); if (p16 == NULL) return NULL; p16 ->ContextID = ContextID; p16 ->p = p; return p16; } static void Performance16free(cmsContext ContextID, void* ptr) { _cmsFree(ContextID, ptr); } /** * Because cmsChangeBuffersFormat, we have to allow this code to output data in either 8 or 16 bits. * The increments are already computed correctly, but the data may change. So, we use a macro to * increase xput */ #define TO_OUTPUT_16(d,v) do { *(cmsUInt16Number*) (d) = v; } while(0) #define TO_OUTPUT_8(d,v) do { *(cmsUInt8Number*) (d) = FROM_16_TO_8(v); } while(0) #define TO_OUTPUT(d,v) do { if (out16) TO_OUTPUT_16(d,v); else TO_OUTPUT_8(d,v); } while(0) #define FROM_INPUT(v) (in16 ? (*((const cmsUInt16Number*)(v))) : FROM_8_TO_16(*((const cmsUInt8Number*)(v)))) static void PerformanceEval16(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt16Number r, g, b; int x0, y0, z0; cmsS15Fixed16Number rx, ry, rz; cmsS15Fixed16Number fx, fy, fz; cmsS15Fixed16Number c0, c1, c2, c3, Rest; cmsUInt32Number OutChan, TotalPlusAlpha; cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; Performance16Data* p16 = (Performance16Data*)_cmsGetTransformUserData(CMMcargo); const cmsInterpParams* p = p16->p; cmsUInt32Number TotalOut = p->nOutputs; const cmsUInt16Number* BaseTable = (const cmsUInt16Number*)p->Table; const cmsUInt16Number* LutTable; cmsUInt8Number* out[cmsMAXCHANNELS]; cmsUInt16Number res16; cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; int in16, out16; // Used by macros! cmsUInt32Number nalpha; size_t strideIn, strideOut; cmsUInt32Number dwInFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number dwOutFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); _cmsComputeComponentIncrements(dwInFormat, Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(dwOutFormat, Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); in16 = (T_BYTES(dwInFormat) == 2); out16 = (T_BYTES(dwOutFormat) == 2); if (!(_cmsGetTransformFlags((cmsHTRANSFORM)CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; TotalPlusAlpha = TotalOut; if (ain) TotalPlusAlpha++; for (OutChan = 0; OutChan < TotalPlusAlpha; OutChan++) { out[OutChan] = (cmsUInt8Number*)Output + DestStartingOrder[OutChan] + strideOut; } for (ii = 0; ii < PixelsPerLine; ii++) { r = FROM_INPUT(rin); g = FROM_INPUT(gin); b = FROM_INPUT(bin); rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; fx = _cmsToFixedDomain((int)r * p->Domain[0]); fy = _cmsToFixedDomain((int)g * p->Domain[1]); fz = _cmsToFixedDomain((int)b * p->Domain[2]); x0 = FIXED_TO_INT(fx); y0 = FIXED_TO_INT(fy); z0 = FIXED_TO_INT(fz); rx = FIXED_REST_TO_INT(fx); ry = FIXED_REST_TO_INT(fy); rz = FIXED_REST_TO_INT(fz); X0 = p->opta[2] * x0; X1 = (r == 0xFFFFU ? 0 : p->opta[2]); Y0 = p->opta[1] * y0; Y1 = (g == 0xFFFFU ? 0 : p->opta[1]); Z0 = p->opta[0] * z0; Z1 = (b == 0xFFFFU ? 0 : p->opta[0]); LutTable = &BaseTable[X0 + Y0 + Z0]; // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)) // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16 // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16 // at the cost of being off by one at 7fff and 17ffe. if (rx >= ry) { if (ry >= rz) { Y1 += X1; Z1 += Y1; for (OutChan = 0; OutChan < TotalOut; OutChan++) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c3 -= c2; c2 -= c1; c1 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); TO_OUTPUT(out[OutChan], res16); out[OutChan] += DestIncrements[OutChan]; } } else if (rz >= rx) { X1 += Z1; Y1 += X1; for (OutChan = 0; OutChan < TotalOut; OutChan++) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c2 -= c1; c1 -= c3; c3 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); TO_OUTPUT(out[OutChan], res16); out[OutChan] += DestIncrements[OutChan]; } } else { Z1 += X1; Y1 += Z1; for (OutChan = 0; OutChan < TotalOut; OutChan++) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c2 -= c3; c3 -= c1; c1 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); TO_OUTPUT(out[OutChan], res16); out[OutChan] += DestIncrements[OutChan]; } } } else { if (rx >= rz) { X1 += Y1; Z1 += X1; for (OutChan = 0; OutChan < TotalOut; OutChan++) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c3 -= c1; c1 -= c2; c2 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); TO_OUTPUT(out[OutChan], res16); out[OutChan] += DestIncrements[OutChan]; } } else if (ry >= rz) { Z1 += Y1; X1 += Z1; for (OutChan = 0; OutChan < TotalOut; OutChan++) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c1 -= c3; c3 -= c2; c2 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); TO_OUTPUT(out[OutChan], res16); out[OutChan] += DestIncrements[OutChan]; } } else { Y1 += Z1; X1 += Y1; for (OutChan = 0; OutChan < TotalOut; OutChan++) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c1 -= c2; c2 -= c3; c3 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); TO_OUTPUT(out[OutChan], res16); out[OutChan] += DestIncrements[OutChan]; } } } if (ain) { res16 = *(const cmsUInt16Number*)ain; TO_OUTPUT(out[TotalOut], res16); ain += SourceIncrements[3]; out[TotalOut] += DestIncrements[TotalOut]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } #undef DENS // -------------------------------------------------------------------------------------------------------------- cmsBool Optimize16BitRGBTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { Performance16Data* p16; cmsContext ContextID; _cmsStageCLutData* data; cmsUInt32Number newFlags; cmsStage* OptimizedCLUTmpe; // For empty transforms, do nothing if (*Lut == NULL) return FALSE; // This is a lossy optimization! does not apply in floating-point cases if (T_FLOAT(*InputFormat) || T_FLOAT(*OutputFormat)) return FALSE; // Only on 16-bit if (T_BYTES(*InputFormat) != 2 || T_BYTES(*OutputFormat) != 2) return FALSE; // Only real 16 bits if (T_BIT15(*InputFormat) != 0 || T_BIT15(*OutputFormat) != 0) return FALSE; // Swap endian is not supported if (T_ENDIAN16(*InputFormat) != 0 || T_ENDIAN16(*OutputFormat) != 0) return FALSE; // Only on input RGB if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; // If this is a matrix-shaper, the default does already a good job if (cmsPipelineCheckAndRetreiveStages(*Lut, 4, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, NULL, NULL, NULL, NULL)) return FALSE; if (cmsPipelineCheckAndRetreiveStages(*Lut, 2, cmsSigCurveSetElemType, cmsSigCurveSetElemType, NULL, NULL)) return FALSE; ContextID = cmsGetPipelineContextID(*Lut); newFlags = *dwFlags | cmsFLAGS_FORCE_CLUT; if (!_cmsOptimizePipeline(ContextID, Lut, INTENT_PERCEPTUAL, // Dont care InputFormat, OutputFormat, &newFlags)) return FALSE; OptimizedCLUTmpe = cmsPipelineGetPtrToFirstStage(*Lut); // Set the evaluator data = (_cmsStageCLutData*)cmsStageData(OptimizedCLUTmpe); p16 = Performance16alloc(ContextID, data->Params); if (p16 == NULL) return FALSE; *TransformFn = PerformanceEval16; *UserData = p16; *FreeDataFn = Performance16free; *InputFormat |= 0x02000000; *OutputFormat |= 0x02000000; *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; return TRUE; } lcms2-2.19.1/plugins/fast_float/src/fast_8_matsh.c0000644000175000017500000003174415176573557021012 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- // Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed #include "fast_float_internal.h" typedef cmsInt32Number cmsS1Fixed14Number; // Note that this may hold more than 16 bits! #define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5)) // This is the private data container used by this optimization typedef struct { // Alignment makes it faster cmsS1Fixed14Number Mat[4][4]; // n.14 to n.14 (needs a saturation after that) void * real_ptr; cmsContext ContextID; cmsS1Fixed14Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0) cmsS1Fixed14Number Shaper1G[256]; cmsS1Fixed14Number Shaper1B[256]; cmsUInt8Number Shaper2R[0x4001]; // 1.14 to 0..255 cmsUInt8Number Shaper2G[0x4001]; cmsUInt8Number Shaper2B[0x4001]; } XMatShaper8Data; static XMatShaper8Data* malloc_aligned(cmsContext ContextID) { cmsUInt8Number* real_ptr = (cmsUInt8Number*) _cmsMallocZero(ContextID, sizeof(XMatShaper8Data) + 32); cmsUInt8Number* aligned = (cmsUInt8Number*) (((uintptr_t)real_ptr + 16) & ~0xf); XMatShaper8Data* p = (XMatShaper8Data*) aligned; p ->real_ptr = real_ptr; return p; } static void free_aligned(XMatShaper8Data* a) { _cmsFree(a->ContextID, a->real_ptr); } // Free the private data container static void FreeMatShaper(cmsContext ContextID, void* Data) { UNUSED_PARAMETER(ContextID); if (Data != NULL) free_aligned((XMatShaper8Data*) Data); } // This table converts from 8 bits to 1.14 after applying the curve static void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve) { int i; cmsFloat32Number R, y; for (i=0; i < 256; i++) { R = (cmsFloat32Number) (i / 255.0); y = cmsEvalToneCurveFloat(Curve, R); Table[i] = DOUBLE_TO_1FIXED14(y); } } // This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve static void FillSecondShaper(cmsUInt8Number* Table, cmsToneCurve* Curve) { int i; cmsFloat32Number R, Val; cmsInt32Number w; for (i=0; i < 0x4001; i++) { R = (cmsFloat32Number) (i / 16384.0f); Val = cmsEvalToneCurveFloat(Curve, R); w = (cmsInt32Number) (Val * 255.0f + 0.5f); if (w < 0) w = 0; if (w > 255) w = 255; Table[i] = (cmsInt8Number) w; } } // Compute the matrix-shaper structure static XMatShaper8Data* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3]) { XMatShaper8Data* p; int i, j; // Allocate a big chuck of memory to store precomputed tables p = malloc_aligned(ContextID); if (p == NULL) return FALSE; p -> ContextID = ContextID; // Precompute tables FillFirstShaper(p ->Shaper1R, Curve1[0]); FillFirstShaper(p ->Shaper1G, Curve1[1]); FillFirstShaper(p ->Shaper1B, Curve1[2]); FillSecondShaper(p ->Shaper2R, Curve2[0]); FillSecondShaper(p ->Shaper2G, Curve2[1]); FillSecondShaper(p ->Shaper2B, Curve2[2]); // Convert matrix to nFixed14. Note that those values may take more than 16 bits as for (i=0; i < 3; i++) { for (j=0; j < 3; j++) { p ->Mat[j][i] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]); } } for (i=0; i < 3; i++) { if (Off == NULL) { p->Mat[3][i] = DOUBLE_TO_1FIXED14(0.5); } else { p->Mat[3][i] = DOUBLE_TO_1FIXED14(Off->n[i] + 0.5); } } return p; } // A fast matrix-shaper evaluator for 8 bits. This is a bit tricky since I'm using 1.14 signed fixed point // to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits, // in total about 50K, and the performance boost is huge! static void MatShaperXform8(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { XMatShaper8Data* p = (XMatShaper8Data*) _cmsGetTransformUserData(CMMcargo); cmsS1Fixed14Number l1, l2, l3; cmsS1Fixed14Number r, g, b; cmsUInt32Number ri, gi, bi; cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { // Across first shaper, which also converts to 1.14 fixed point. 16 bits guaranteed. r = p->Shaper1R[*rin]; g = p->Shaper1G[*gin]; b = p->Shaper1B[*bin]; // Evaluate the matrix in 1.14 fixed point l1 = (p->Mat[0][0] * r + p->Mat[1][0] * g + p->Mat[2][0] * b + p->Mat[3][0]) >> 14; l2 = (p->Mat[0][1] * r + p->Mat[1][1] * g + p->Mat[2][1] * b + p->Mat[3][1]) >> 14; l3 = (p->Mat[0][2] * r + p->Mat[1][2] * g + p->Mat[2][2] * b + p->Mat[3][2]) >> 14; // Now we have to clip to 0..1.0 range ri = (l1 < 0) ? 0 : ((l1 > 0x4000) ? 0x4000 : l1); gi = (l2 < 0) ? 0 : ((l2 > 0x4000) ? 0x4000 : l2); bi = (l3 < 0) ? 0 : ((l3 > 0x4000) ? 0x4000 : l3); // And across second shaper, *rout = p->Shaper2R[ri]; *gout = p->Shaper2G[gi]; *bout = p->Shaper2B[bi]; // Handle alpha if (ain) { *aout = *ain; } rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; if (ain) ain += SourceIncrements[3]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (aout) aout += DestIncrements[3]; } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // 8 bits on input allows matrix-shaper boost up a little bit cmsBool Optimize8MatrixShaper(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* Curve1, *Curve2; cmsStage* Matrix1, *Matrix2; _cmsStageMatrixData* Data1; _cmsStageMatrixData* Data2; cmsMAT3 res; cmsBool IdentityMat = FALSE; cmsPipeline* Dest, *Src; cmsContext ContextID; cmsUInt32Number nChans; cmsFloat64Number factor = 1.0; // Only works on RGB to RGB and gray to gray if ( !( (T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3) || (T_CHANNELS(*InputFormat) == 1 && T_CHANNELS(*OutputFormat) == 1) )) return FALSE; // Only works on 8 bit input if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; // Seems suitable, proceed Src = *Lut; // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for if (!cmsPipelineCheckAndRetreiveStages(Src, 4, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; ContextID = cmsGetPipelineContextID(Src); nChans = T_CHANNELS(*InputFormat); // Get both matrices, which are 3x3 Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1); Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2); // Input offset should be zero if (Data1 ->Offset != NULL) return FALSE; if (cmsStageInputChannels(Matrix1) == 1 && cmsStageOutputChannels(Matrix2) == 1) { // This is a gray to gray. Just multiply factor = Data1->Double[0]*Data2->Double[0] + Data1->Double[1]*Data2->Double[1] + Data1->Double[2]*Data2->Double[2]; if (fabs(1 - factor) < (1.0 / 65535.0)) IdentityMat = TRUE; } else { // Multiply both matrices to get the result _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double); // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? IdentityMat = FALSE; if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) { // We can get rid of full matrix IdentityMat = TRUE; } } // Allocate an empty LUT Dest = cmsPipelineAlloc(ContextID, nChans, nChans); if (!Dest) return FALSE; // Assemble the new LUT cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); if (!IdentityMat) { if (nChans == 1) cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 1, (const cmsFloat64Number*) &factor, Data2->Offset)); else cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)); } cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); // If identity on matrix, we can further optimize the curves, so call the join curves routine if (IdentityMat) { Optimize8ByJoiningCurves(TransformFn, UserData, FreeUserData, &Dest, InputFormat, OutputFormat, dwFlags); } else { _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); // In this particular optimization, cache does not help as it takes more time to deal with // the cache than with the pixel handling *dwFlags |= cmsFLAGS_NOCACHE; // Setup the optimization routines *UserData = SetMatShaper(ContextID, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves); *FreeUserData = FreeMatShaper; *TransformFn = MatShaperXform8; } *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; cmsPipelineFree(Src); *Lut = Dest; return TRUE; } lcms2-2.19.1/plugins/fast_float/src/fast_8_matsh_sse.c0000644000175000017500000003177015176573557021663 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- // Optimization for matrix-shaper in 8 bits using SSE2 intrinsics #include "fast_float_internal.h" #ifndef CMS_DONT_USE_SSE2 #ifdef _MSC_VER #include #else #include #include #endif #include // This is the private data container used by this optimization typedef struct { // This is for SSE, MUST be aligned at 16 bit boundary cmsFloat32Number Mat[4][4]; // n.14 to n.14 (needs a saturation after that) void * real_ptr; cmsContext ContextID; cmsFloat32Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0) cmsFloat32Number Shaper1G[256]; cmsFloat32Number Shaper1B[256]; cmsUInt8Number Shaper2R[0x4001]; // 1.14 to 0..255 cmsUInt8Number Shaper2G[0x4001]; cmsUInt8Number Shaper2B[0x4001]; } XMatShaper8Data; static XMatShaper8Data* malloc_aligned(cmsContext ContextID) { cmsUInt8Number* real_ptr = (cmsUInt8Number*) _cmsMallocZero(ContextID, sizeof(XMatShaper8Data) + 32); cmsUInt8Number* aligned = (cmsUInt8Number*) (((uintptr_t)real_ptr + 16) & ~0xf); XMatShaper8Data* p = (XMatShaper8Data*) aligned; p ->real_ptr = real_ptr; return p; } static void free_aligned(XMatShaper8Data* a) { _cmsFree(a->ContextID, a->real_ptr); } // Free the private data container static void FreeMatShaper(cmsContext ContextID, void* Data) { UNUSED_PARAMETER(ContextID); if (Data != NULL) free_aligned((XMatShaper8Data*) Data); } // This table converts from 8 bits to 1.14 after applying the curve static void FillFirstShaper(cmsFloat32Number* Table, cmsToneCurve* Curve) { cmsInt32Number i; cmsFloat32Number R; for (i = 0; i < 256; i++) { R = (cmsFloat32Number)(i / 255.0); Table[i] = cmsEvalToneCurveFloat(Curve, R); } } // This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve static void FillSecondShaper(cmsUInt8Number* Table, cmsToneCurve* Curve) { int i; cmsFloat32Number R, Val; cmsInt32Number w; for (i=0; i < 0x4001; i++) { R = (cmsFloat32Number) (i / 16384.0f); Val = cmsEvalToneCurveFloat(Curve, R); w = (cmsInt32Number) (Val * 255.0f + 0.5f); if (w < 0) w = 0; if (w > 255) w = 255; Table[i] = (cmsInt8Number) w; } } // Compute the matrix-shaper structure static XMatShaper8Data* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3]) { XMatShaper8Data* p; int i, j; // Allocate a big chuck of memory to store precomputed tables p = malloc_aligned(ContextID); if (p == NULL) return FALSE; p -> ContextID = ContextID; // Precompute tables FillFirstShaper(p ->Shaper1R, Curve1[0]); FillFirstShaper(p ->Shaper1G, Curve1[1]); FillFirstShaper(p ->Shaper1B, Curve1[2]); FillSecondShaper(p ->Shaper2R, Curve2[0]); FillSecondShaper(p ->Shaper2G, Curve2[1]); FillSecondShaper(p ->Shaper2B, Curve2[2]); // Convert matrix to float for (i=0; i < 3; i++) { for (j=0; j < 3; j++) { p ->Mat[j][i] = (cmsFloat32Number) Mat->v[i].n[j]; } } // Roundoff for (i=0; i < 3; i++) { if (Off == NULL) { p->Mat[3][i] = 0.0f; } else { p->Mat[3][i] = (cmsFloat32Number)Off->n[i]; } } return p; } // A fast matrix-shaper evaluator for 8 bits. static void MatShaperXform8SSE(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { XMatShaper8Data* p = (XMatShaper8Data*) _cmsGetTransformUserData(CMMcargo); cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; __m128 mat0 = _mm_load_ps(p->Mat[0]); __m128 mat1 = _mm_load_ps(p->Mat[1]); __m128 mat2 = _mm_load_ps(p->Mat[2]); __m128 mat3 = _mm_load_ps(p->Mat[3]); __m128 zero = _mm_setzero_ps(); __m128 one = _mm_set1_ps(1.0f); __m128 scale = _mm_set1_ps((cmsFloat32Number)0x4000); cmsUInt8Number buffer[32]; cmsUInt32Number* output_index = (cmsUInt32Number*)(((uintptr_t)buffer + 16) & ~0xf); _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; /** * Prefetch */ __m128 rvector = _mm_set1_ps(p->Shaper1R[*rin]); __m128 gvector = _mm_set1_ps(p->Shaper1G[*gin]); __m128 bvector = _mm_set1_ps(p->Shaper1B[*bin]); for (ii = 0; ii < PixelsPerLine; ii++) { __m128 el1 = _mm_mul_ps(rvector, mat0); __m128 el2 = _mm_mul_ps(gvector, mat1); __m128 el3 = _mm_mul_ps(bvector, mat2); __m128 sum = _mm_add_ps(el1, _mm_add_ps(el2, _mm_add_ps(el3, mat3))); __m128 out = _mm_min_ps(_mm_max_ps(sum, zero), one); out = _mm_mul_ps(out, scale); /** * Rounding and converting to index. * Actually this is a costly instruction that may be blocking performance */ _mm_store_si128((__m128i*)output_index, _mm_cvtps_epi32(out)); // Handle alpha if (ain) { *aout = *ain; } rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; if (ain) ain += SourceIncrements[3]; /** * Take next value whilst store is being performed */ if (ii < PixelsPerLine - 1) { rvector = _mm_set1_ps(p->Shaper1R[*rin]); gvector = _mm_set1_ps(p->Shaper1G[*gin]); bvector = _mm_set1_ps(p->Shaper1B[*bin]); } *rout = p->Shaper2R[output_index[0]]; *gout = p->Shaper2G[output_index[1]]; *bout = p->Shaper2B[output_index[2]]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (aout) aout += DestIncrements[3]; } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } static cmsBool IsSSE2Available(void) { #ifdef _MSC_VER int cpuinfo[4]; __cpuid(cpuinfo, 1); if (!(cpuinfo[3] & (1 << 26))) return FALSE; return TRUE; #else unsigned int level = 1u; unsigned int eax, ebx, ecx, edx; unsigned int bits = (1u << 26); unsigned int max = __get_cpuid_max(0, NULL); if (level > max) { return FALSE; } __cpuid_count(level, 0, eax, ebx, ecx, edx); return (edx & bits) == bits; #endif } // 8 bits on input allows matrix-shaper boost up a little bit cmsBool Optimize8MatrixShaperSSE(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* Curve1, *Curve2; cmsStage* Matrix1, *Matrix2; _cmsStageMatrixData* Data1; _cmsStageMatrixData* Data2; cmsMAT3 res; cmsBool IdentityMat = FALSE; cmsPipeline* Dest, *Src; cmsContext ContextID; cmsUInt32Number nChans; // Check for SSE2 support if (!(IsSSE2Available())) return FALSE; // Only works on 3 to 3, probably RGB if ( !( (T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3) ) ) return FALSE; // Only works on 8 bit input if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; // Seems suitable, proceed Src = *Lut; // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for if (!cmsPipelineCheckAndRetreiveStages(Src, 4, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; ContextID = cmsGetPipelineContextID(Src); nChans = T_CHANNELS(*InputFormat); // Get both matrices, which are 3x3 Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1); Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2); // Input offset should be zero if (Data1->Offset != NULL) return FALSE; // Multiply both matrices to get the result _cmsMAT3per(&res, (cmsMAT3*)Data2->Double, (cmsMAT3*)Data1->Double); // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? IdentityMat = FALSE; if (_cmsMAT3isIdentity(&res) && Data2->Offset == NULL) { // We can get rid of full matrix IdentityMat = TRUE; } // Allocate an empty LUT Dest = cmsPipelineAlloc(ContextID, nChans, nChans); if (!Dest) return FALSE; // Assamble the new LUT cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); if (!IdentityMat) { cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)); } cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); // If identity on matrix, we can further optimize the curves, so call the join curves routine if (IdentityMat) { Optimize8ByJoiningCurves(TransformFn, UserData, FreeUserData, &Dest, InputFormat, OutputFormat, dwFlags); } else { _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); // In this particular optimization, cache does not help as it takes more time to deal with // the cache than with the pixel handling *dwFlags |= cmsFLAGS_NOCACHE; // Setup the optimizarion routines *UserData = SetMatShaper(ContextID, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves); *FreeUserData = FreeMatShaper; *TransformFn = MatShaperXform8SSE; } *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; cmsPipelineFree(Src); *Lut = Dest; return TRUE; } #endif lcms2-2.19.1/plugins/fast_float/src/fast_8_tethra.c0000644000175000017500000004112715176573557021161 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" #define PRELINEARIZATION_POINTS 4096 // Optimization for 8 bits, 3 inputs only typedef struct { cmsContext ContextID; const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. cmsUInt16Number rx[256], ry[256], rz[256]; cmsUInt32Number X0[256], Y0[256], Z0[256]; // Precomputed nodes and offsets for 8-bit input data } Performance8Data; // Precomputes tables for 8-bit on input devicelink. static Performance8Data* Performance8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3]) { int i; cmsUInt16Number Input[3]; cmsS15Fixed16Number v1, v2, v3; Performance8Data* p8; p8 = (Performance8Data*) _cmsMallocZero(ContextID, sizeof(Performance8Data)); if (p8 == NULL) return NULL; // Since this only works for 8 bit input, values comes always as x * 257, // we can safely take msb byte (x << 8 + x) for (i=0; i < 256; i++) { if (G != NULL) { // Get 16-bit representation Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i)); Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i)); Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i)); } else { Input[0] = FROM_8_TO_16(i); Input[1] = FROM_8_TO_16(i); Input[2] = FROM_8_TO_16(i); } // Move to 0..1.0 in fixed domain v1 = _cmsToFixedDomain(Input[0] * p -> Domain[0]); v2 = _cmsToFixedDomain(Input[1] * p -> Domain[1]); v3 = _cmsToFixedDomain(Input[2] * p -> Domain[2]); // Store the precalculated table of nodes p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1)); p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2)); p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3)); // Store the precalculated table of offsets p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1); p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2); p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3); } p8 ->ContextID = ContextID; p8 ->p = p; return p8; } static void Performance8free(cmsContext ContextID, void* ptr) { _cmsFree(ContextID, ptr); } // Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for // almost any transform. We use floating point precision and then convert from floating point to 16 bits. static int XFormSampler16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { // Evaluate in 16 bits cmsPipelineEval16(In, Out, (cmsPipeline*) Cargo); // Always succeed return TRUE; } // A optimized interpolation for 8-bit input. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void PerformanceEval8(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt8Number r, g, b; cmsS15Fixed16Number rx, ry, rz; cmsS15Fixed16Number c0, c1, c2, c3, Rest; cmsUInt32Number OutChan, TotalPlusAlpha; cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; Performance8Data* p8 = (Performance8Data*)_cmsGetTransformUserData(CMMcargo); const cmsInterpParams* p = p8->p; cmsUInt32Number TotalOut = p->nOutputs; const cmsUInt16Number* LutTable = (const cmsUInt16Number*)p->Table; cmsUInt8Number* out[cmsMAXCHANNELS]; cmsUInt16Number res16; cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; TotalPlusAlpha = TotalOut; if (ain) TotalPlusAlpha++; for (OutChan = 0; OutChan < TotalPlusAlpha; OutChan++) { out[OutChan] = (cmsUInt8Number*)Output + DestStartingOrder[OutChan] + strideOut; } for (ii = 0; ii < PixelsPerLine; ii++) { r = *rin; g = *gin; b = *bin; rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; X0 = X1 = p8->X0[r]; Y0 = Y1 = p8->Y0[g]; Z0 = Z1 = p8->Z0[b]; rx = p8->rx[r]; ry = p8->ry[g]; rz = p8->rz[b]; X1 = X0 + ((rx == 0) ? 0 : p->opta[2]); Y1 = Y0 + ((ry == 0) ? 0 : p->opta[1]); Z1 = Z0 + ((rz == 0) ? 0 : p->opta[0]); // These are the 6 Tetrahedral for (OutChan = 0; OutChan < TotalOut; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); *out[OutChan] = FROM_16_TO_8(res16); out[OutChan] += DestIncrements[OutChan]; } if (ain) { *out[TotalOut] = *ain; ain += SourceIncrements[3]; out[TotalOut] += DestIncrements[TotalOut]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } #undef DENS // Curves that contain wide empty areas are not optimizeable static cmsBool IsDegenerated(const cmsToneCurve* g) { int i, Zeros = 0, Poles = 0; int nEntries = cmsGetToneCurveEstimatedTableEntries(g); const cmsUInt16Number* Table16 = cmsGetToneCurveEstimatedTable(g); for (i=0; i < nEntries; i++) { if (Table16[i] == 0x0000) Zeros++; if (Table16[i] == 0xffff) Poles++; } if (Zeros == 1 && Poles == 1) return FALSE; // For linear tables if (Zeros > (nEntries / 4)) return TRUE; // Degenerated, mostly zeros if (Poles > (nEntries / 4)) return TRUE; // Degenerated, mostly poles return FALSE; } // Normalize endpoints by slope limiting max and min. This assures endpoints as well. // Descending curves are handled as well. static void SlopeLimiting(cmsUInt16Number* Table16, int nEntries) { int BeginVal, EndVal; int AtBegin = (int) floor((cmsFloat64Number)nEntries * 0.02 + 0.5); // Cutoff at 2% int AtEnd = nEntries - AtBegin - 1; // And 98% cmsFloat64Number Val, Slope, beta; int i; if (Table16[0] > Table16[nEntries-1]) { BeginVal = 0xffff; EndVal = 0; } else { BeginVal = 0; EndVal = 0xffff; } // Compute slope and offset for begin of curve Val = Table16[AtBegin]; Slope = (Val - BeginVal) / AtBegin; beta = Val - Slope * AtBegin; for (i=0; i < AtBegin; i++) Table16[i] = _cmsSaturateWord(i * Slope + beta); // Compute slope and offset for the end Val = Table16[AtEnd]; Slope = (EndVal - Val) / AtBegin; // AtBegin holds the X interval, which is same in both cases beta = Val - Slope * AtEnd; for (i = AtEnd; i < (int) nEntries; i++) Table16[i] = _cmsSaturateWord(i * Slope + beta); } // -------------------------------------------------------------------------------------------------------------- cmsBool Optimize8BitRGBTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* OriginalLut; int nGridPoints; cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS]; cmsUInt32Number t, i, j; cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; cmsBool lIsSuitable; cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL; cmsStage* OptimizedCLUTmpe; cmsStage* OptimizedPrelinMpe; Performance8Data* p8; cmsUInt16Number* MyTable[3]; cmsContext ContextID; _cmsStageCLutData* data; // For empty transforms, do nothing if (*Lut == NULL) return FALSE; // This is a lossy optimization! does not apply in floating-point cases if (T_FLOAT(*InputFormat) || T_FLOAT(*OutputFormat)) return FALSE; // Only on 8-bit if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; // Only on RGB if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; // This optimization only works on RGB8->RGB8 if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE; OriginalLut = *Lut; ContextID = cmsGetPipelineContextID(OriginalLut); nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigRgbData, *dwFlags); // Empty gamma containers memset(Trans, 0, sizeof(Trans)); memset(TransReverse, 0, sizeof(TransReverse)); MyTable[0] = (cmsUInt16Number*) _cmsMallocZero(ContextID, sizeof(cmsUInt16Number) * PRELINEARIZATION_POINTS); MyTable[1] = (cmsUInt16Number*) _cmsMallocZero(ContextID, sizeof(cmsUInt16Number) * PRELINEARIZATION_POINTS); MyTable[2] = (cmsUInt16Number*) _cmsMallocZero(ContextID, sizeof(cmsUInt16Number) * PRELINEARIZATION_POINTS); if (MyTable[0] == NULL || MyTable[1] == NULL || MyTable[2] == NULL) goto Error; // Populate the curves for (i=0; i < PRELINEARIZATION_POINTS; i++) { v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); // Feed input with a gray ramp for (j=0; j < 3; j++) In[j] = v; // Evaluate the gray value cmsPipelineEvalFloat(In, Out, OriginalLut); // Store result in curve for (j=0; j < 3; j++) MyTable[j][i] = _cmsSaturateWord(Out[j] * 65535.0); } for (t=0; t < 3; t++) { SlopeLimiting(MyTable[t], PRELINEARIZATION_POINTS); Trans[t] = cmsBuildTabulatedToneCurve16(ContextID, PRELINEARIZATION_POINTS, MyTable[t]); if (Trans[t] == NULL) goto Error; _cmsFree(cmsGetPipelineContextID(OriginalLut), MyTable[t]); } // Check for validity lIsSuitable = TRUE; for (t=0; (lIsSuitable && (t < 3)); t++) { if (IsDegenerated(Trans[t])) lIsSuitable = FALSE; } // If it is not suitable, just quit if (!lIsSuitable) goto Error; // Invert curves if possible for (t = 0; t < cmsPipelineInputChannels(OriginalLut); t++) { TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]); if (TransReverse[t] == NULL) goto Error; } // Now insert the reversed curves at the begin of transform LutPlusCurves = cmsPipelineDup(OriginalLut); if (LutPlusCurves == NULL) goto Error; cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, 3, TransReverse)); // Create the result LUT OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 3, cmsPipelineOutputChannels(OriginalLut)); if (OptimizedLUT == NULL) goto Error; OptimizedPrelinMpe = cmsStageAllocToneCurves(ContextID, 3, Trans); // Create and insert the curves at the beginning cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe); // Allocate the CLUT for result OptimizedCLUTmpe = cmsStageAllocCLut16bit(ContextID, nGridPoints, 3, cmsPipelineOutputChannels(OriginalLut), NULL); // Add the CLUT to the destination LUT cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe); // Resample the LUT if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error; // Set the evaluator data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); p8 = Performance8alloc(ContextID, data ->Params, Trans); if (p8 == NULL) return FALSE; // Free resources for (t = 0; t <3; t++) { if (Trans[t]) cmsFreeToneCurve(Trans[t]); if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); } cmsPipelineFree(LutPlusCurves); // And return the obtained LUT cmsPipelineFree(OriginalLut); *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; *Lut = OptimizedLUT; *TransformFn = PerformanceEval8; *UserData = p8; *FreeDataFn = Performance8free; return TRUE; Error: for (t = 0; t < 3; t++) { if (Trans[t]) cmsFreeToneCurve(Trans[t]); if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); } if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves); if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); return FALSE; } lcms2-2.19.1/plugins/fast_float/src/fast_float_15bits.c0000644000175000017500000004344515176573557021744 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" //--------------------------------------------------------------------------------- // The internal photoshop 16 bit format range is 1.15 fixed point, which goes 0..32768 // (NOT 32767) that means: // // 16 bits encoding 15 bit Photoshop encoding // ================ ========================= // // 0x0000 0x0000 // 0xFFFF 0x8000 // // A nice (and fast) way to implement conversions is by using 64 bit values, which are // native CPU word size in most today architectures. // In CMYK, internal Photoshop format comes inverted, and this inversion happens after // the resizing, so values 32769 to 65535 are never used in PhotoShop. //--------------------------------------------------------------------------------- // This macro converts 16 bits to 15 bits by using a 64 bits value cmsINLINE cmsUInt16Number From16To15(cmsUInt16Number x16) { cmsUInt64Number r64 = (((cmsUInt64Number)x16 << 15)) / 0xFFFFL; return (cmsUInt16Number)r64; } // This macro converts 15 bits to 16 bits by using a 64 bit value. It is based in fixed 1.15 math cmsINLINE cmsUInt16Number From15To16(cmsUInt16Number x15) { cmsUInt64Number r64 = ((cmsUInt64Number) x15 * 0xFFFF + 0x4000L) >> 15; return (cmsUInt16Number)r64; } // Specialized 1-channel formatters static cmsUInt8Number* Unroll15bitsGray(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); Values[0] = From15To16(*(cmsUInt16Number*)Buffer); return Buffer + 2; } static cmsUInt8Number* Pack15bitsGray(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); *(cmsUInt16Number*)Buffer = From16To15(Values[0]); return Buffer + 2; } // Specialized 3-channels formatters static cmsUInt8Number* Unroll15bitsRGB(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); Values[0] = From15To16(*(cmsUInt16Number*)Buffer); Buffer += 2; Values[1] = From15To16(*(cmsUInt16Number*)Buffer); Buffer += 2; Values[2] = From15To16(*(cmsUInt16Number*)Buffer); return Buffer + 2; } static cmsUInt8Number* Pack15bitsRGB(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); *(cmsUInt16Number*)Buffer = From16To15(Values[0]); Buffer += 2; *(cmsUInt16Number*)Buffer = From16To15(Values[1]); Buffer += 2; *(cmsUInt16Number*)Buffer = From16To15(Values[2]); return Buffer + 2; } static cmsUInt8Number* Unroll15bitsRGBA(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); Values[0] = From15To16(*(cmsUInt16Number*)Buffer); Buffer += 2; Values[1] = From15To16(*(cmsUInt16Number*)Buffer); Buffer += 2; Values[2] = From15To16(*(cmsUInt16Number*)Buffer); return Buffer + 4; } static cmsUInt8Number* Pack15bitsRGBA(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); *(cmsUInt16Number*)Buffer = From16To15(Values[0]); Buffer += 2; *(cmsUInt16Number*)Buffer = From16To15(Values[1]); Buffer += 2; *(cmsUInt16Number*)Buffer = From16To15(Values[2]); return Buffer + 4; } // Specialized 3 channels reversed formatters static cmsUInt8Number* Unroll15bitsBGR(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); Values[2] = From15To16(*(cmsUInt16Number*)Buffer); Buffer += 2; Values[1] = From15To16(*(cmsUInt16Number*)Buffer); Buffer += 2; Values[0] = From15To16(*(cmsUInt16Number*)Buffer); return Buffer + 2; } static cmsUInt8Number* Pack15bitsBGR(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); *(cmsUInt16Number*)Buffer = From16To15(Values[2]); Buffer += 2; *(cmsUInt16Number*)Buffer = From16To15(Values[1]); Buffer += 2; *(cmsUInt16Number*)Buffer = From16To15(Values[0]); return Buffer+2; } // Specialized 4 channels CMYK formatters. Note Photoshop stores CMYK reversed static cmsUInt8Number* Unroll15bitsCMYK(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); Values[0] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); Buffer += 2; Values[1] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); Buffer += 2; Values[2] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); Buffer += 2; Values[3] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); return Buffer + 2; } static cmsUInt8Number* Pack15bitsCMYK(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { UNUSED_PARAMETER(CMMcargo); UNUSED_PARAMETER(Stride); *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[0]); Buffer += 2; *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[1]); Buffer += 2; *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[2]); Buffer += 2; *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[3]); return Buffer + 2; } // This macros does all handling for fallthrough cases cmsINLINE cmsUInt16Number UnrollOne(cmsUInt16Number x, cmsBool Reverse, cmsBool SwapEndian) { if (SwapEndian) x = (x << 8) | (x >> 8); if (Reverse) x = 0xffff - x; return From15To16(x); } cmsINLINE cmsUInt16Number PackOne(cmsUInt16Number x, cmsBool Reverse, cmsBool SwapEndian) { x = From16To15(x); if (Reverse) x = 0xffff - x; if (SwapEndian) x = (x << 8) | (x >> 8); return x; } // Generic planar support static cmsUInt8Number* Unroll15bitsPlanar(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { _xform_head* head = (_xform_head*) CMMcargo; int nChan = T_CHANNELS(head->InputFormat); int DoSwap = T_DOSWAP(head->InputFormat); int Reverse = T_FLAVOR(head->InputFormat); int SwapEndian = T_ENDIAN16(head->InputFormat); int i; cmsUInt8Number* Init = accum; UNUSED_PARAMETER(Stride); if (DoSwap) { accum += T_EXTRA(head->InputFormat) * Stride * 2; } for (i = 0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; wIn[index] = UnrollOne(*(cmsUInt16Number*)accum, Reverse, SwapEndian); accum += Stride * 2; } return (Init + 2); } static cmsUInt8Number* Pack15bitsPlanar(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { _xform_head* head = (_xform_head*)CMMcargo; int nChan = T_CHANNELS(head->OutputFormat); int DoSwap = T_DOSWAP(head->OutputFormat); int Reverse = T_FLAVOR(head->OutputFormat); int SwapEndian = T_ENDIAN16(head->OutputFormat); CMSREGISTER int i; cmsUInt8Number* Init = output; if (DoSwap) { output += T_EXTRA(head->OutputFormat) * Stride * 2; } for (i = 0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; *(cmsUInt16Number*)output = PackOne(wOut[index], Reverse, SwapEndian); output += (Stride * sizeof(cmsUInt16Number)); } return (Init + sizeof(cmsUInt16Number)); } // Generic fallthrough static cmsUInt8Number* Unroll15bitsChunky(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { _xform_head* head = (_xform_head*) CMMcargo; int nChan = T_CHANNELS(head->InputFormat); int DoSwap = T_DOSWAP(head->InputFormat); int Reverse = T_FLAVOR(head->InputFormat); int SwapEndian = T_ENDIAN16(head->InputFormat); CMSREGISTER int i; UNUSED_PARAMETER(Stride); if (DoSwap) { Buffer += T_EXTRA(head->OutputFormat) * 2; } for (i = 0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; Values[index] = UnrollOne(*(cmsUInt16Number*)Buffer, Reverse, SwapEndian); Buffer += 2; } return Buffer; } static cmsUInt8Number* Pack15bitsChunky(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { _xform_head* head = (_xform_head*)CMMcargo; int nChan = T_CHANNELS(head->OutputFormat); int DoSwap = T_DOSWAP(head->OutputFormat); int Reverse = T_FLAVOR(head->OutputFormat); int SwapEndian = T_ENDIAN16(head->OutputFormat); CMSREGISTER int i; UNUSED_PARAMETER(Stride); if (DoSwap) { Buffer += T_EXTRA(head->OutputFormat) * 2; } for (i = 0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; *(cmsUInt16Number*)Buffer = PackOne(Values[index], Reverse, SwapEndian); Buffer += 2; } return Buffer; } // Generic N-bytes plus dither 16-to-8 conversion. static int err[cmsMAXCHANNELS]; static cmsUInt8Number* PackNBytesDither(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { _xform_head* info = (_xform_head*)CMMcargo; int nChan = T_CHANNELS(info->OutputFormat); CMSREGISTER int i; unsigned int n, pe, pf; UNUSED_PARAMETER(Stride); for (i = 0; i < nChan; i++) { n = Values[i] + err[i]; // Value pe = (n / 257); // Whole part pf = (n % 257); // Fractional part err[i] = pf; // Store it for next pixel *Buffer++ = (cmsUInt8Number) pe; } return Buffer + T_EXTRA(info->OutputFormat); } static cmsUInt8Number* PackNBytesSwapDither(CMSREGISTER struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number Values[], CMSREGISTER cmsUInt8Number* Buffer, CMSREGISTER cmsUInt32Number Stride) { _xform_head* info = (_xform_head*)CMMcargo; int nChan = T_CHANNELS(info->OutputFormat); CMSREGISTER int i; unsigned int n, pe, pf; UNUSED_PARAMETER(Stride); for (i = nChan - 1; i >= 0; --i) { n = Values[i] + err[i]; // Value pe = (n / 257); // Whole part pf = (n % 257); // Fractional part err[i] = pf; // Store it for next pixel *Buffer++ = (cmsUInt8Number)pe; } return Buffer + T_EXTRA(info->OutputFormat); } // The factory for 15 bits. This function returns a pointer to specialized function // that would deal with the asked format. It return a pointer to NULL if the format // is not supported. This is the basis of formatter plug-in for 15 bit formats. CMSCHECKPOINT cmsFormatter CMSEXPORT Formatter_15Bit_Factory(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { cmsFormatter Result = { NULL }; UNUSED_PARAMETER(dwFlags); switch (Type) { // Simple Gray case TYPE_GRAY_15: Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsGray : Pack15bitsGray; break; // 3 channels case TYPE_CMY_15: case TYPE_RGB_15: Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsRGB : Pack15bitsRGB; break; // 3 channels reversed case TYPE_YMC_15: case TYPE_BGR_15: Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsBGR : Pack15bitsBGR; break; // 3 Channels plus one alpha case TYPE_RGBA_15: Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsRGBA : Pack15bitsRGBA; break; // 4 channels case TYPE_CMYK_15: Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsCMYK : Pack15bitsCMYK; break; // Planar versions case TYPE_GRAYA_15_PLANAR: case TYPE_RGB_15_PLANAR: case TYPE_BGR_15_PLANAR: case TYPE_RGBA_15_PLANAR: case TYPE_ABGR_15_PLANAR: case TYPE_CMY_15_PLANAR: case TYPE_CMYK_15_PLANAR: Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsPlanar : Pack15bitsPlanar; break; // Fallthrough for remaining (corner) cases case TYPE_GRAY_15_REV: case TYPE_GRAY_15_SE: case TYPE_GRAYA_15: case TYPE_GRAYA_15_SE: case TYPE_RGB_15_SE: case TYPE_BGR_15_SE: case TYPE_RGBA_15_SE: case TYPE_ARGB_15: case TYPE_ABGR_15: case TYPE_ABGR_15_SE: case TYPE_BGRA_15: case TYPE_BGRA_15_SE: case TYPE_CMY_15_SE: case TYPE_CMYK_15_REV: case TYPE_CMYK_15_SE: case TYPE_KYMC_15: case TYPE_KYMC_15_SE: case TYPE_KCMY_15: case TYPE_KCMY_15_REV: case TYPE_KCMY_15_SE: Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsChunky : Pack15bitsChunky; break; case TYPE_GRAY_8_DITHER: case TYPE_RGB_8_DITHER: case TYPE_RGBA_8_DITHER: case TYPE_CMYK_8_DITHER: if (Dir == cmsFormatterOutput) { Result.Fmt16 = PackNBytesDither; } break; case TYPE_ABGR_8_DITHER: case TYPE_BGR_8_DITHER: case TYPE_KYMC_8_DITHER: if (Dir == cmsFormatterOutput) { Result.Fmt16 = PackNBytesSwapDither; } break; default:; } return Result; } lcms2-2.19.1/plugins/fast_float/src/fast_float_15mats.c0000644000175000017500000003116715176573557021745 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- // Optimization for matrix-shaper in 15 bits. Numbers are operated in 1.15 unsigned, #include "fast_float_internal.h" // An storage capable to keep 1.15 signed and some extra precision. // Actually I use 32 bits integer (signed) typedef cmsInt32Number cmsS1Fixed15Number; // Conversion to fixed. Note we don't use floor to get proper sign roundoff #define DOUBLE_TO_1FIXED15(x) ((cmsS1Fixed15Number) ((double) (x) * 0x8000 + 0.5)) // This is the private data container used by this optimization typedef struct { cmsS1Fixed15Number Mat[3][3]; cmsS1Fixed15Number Off[3]; // Precalculated tables for first shaper (375 Kb in total of both shapers) cmsUInt16Number Shaper1R[MAX_NODES_IN_CURVE]; cmsUInt16Number Shaper1G[MAX_NODES_IN_CURVE]; cmsUInt16Number Shaper1B[MAX_NODES_IN_CURVE]; // Second shaper cmsUInt16Number Shaper2R[MAX_NODES_IN_CURVE]; cmsUInt16Number Shaper2G[MAX_NODES_IN_CURVE]; cmsUInt16Number Shaper2B[MAX_NODES_IN_CURVE]; // A flag for fast operation if identity cmsBool IdentityMat; // The context cmsContext ContextID; // Points to the raw, unaligned memory void * real_ptr; } XMatShaperData; // A special malloc that returns memory aligned to DWORD boundary. Aligned memory access is way faster than unaligned // reference to the real block is kept for later free static XMatShaperData* malloc_aligned(cmsContext ContextID) { cmsUInt8Number* real_ptr = (cmsUInt8Number*)_cmsMallocZero(ContextID, sizeof(XMatShaperData) + 32); cmsUInt8Number* aligned = (cmsUInt8Number*)(((uintptr_t)real_ptr + 16) & ~0xf); XMatShaperData* p = (XMatShaperData*)aligned; p->real_ptr = real_ptr; p->ContextID = ContextID; return p; } // Free the private data container static void FreeMatShaper(cmsContext ContextID, void* Data) { XMatShaperData* p = (XMatShaperData*)Data; if (p != NULL) _cmsFree(ContextID, p->real_ptr); } // This table converts from 8 bits to 1.14 after applying the curve static void FillShaper(cmsUInt16Number* Table, cmsToneCurve* Curve) { int i; cmsFloat32Number R, y; for (i = 0; i < MAX_NODES_IN_CURVE; i++) { R = (cmsFloat32Number)i / (cmsFloat32Number) (MAX_NODES_IN_CURVE - 1); y = cmsEvalToneCurveFloat(Curve, R); Table[i] = (cmsUInt16Number) DOUBLE_TO_1FIXED15(y); } } // Compute the matrix-shaper structure static XMatShaperData* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsBool IdentityMat) { XMatShaperData* p; int i, j; // Allocate a big chuck of memory to store precomputed tables p = malloc_aligned(ContextID); if (p == NULL) return FALSE; p->ContextID = ContextID; p->IdentityMat = IdentityMat; // Precompute tables FillShaper(p->Shaper1R, Curve1[0]); FillShaper(p->Shaper1G, Curve1[1]); FillShaper(p->Shaper1B, Curve1[2]); FillShaper(p->Shaper2R, Curve2[0]); FillShaper(p->Shaper2G, Curve2[1]); FillShaper(p->Shaper2B, Curve2[2]); // Convert matrix to nFixed14. Note that those values may take more than 16 bits if negative for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { p->Mat[i][j] = DOUBLE_TO_1FIXED15(Mat->v[i].n[j]); } } for (i = 0; i < 3; i++) { if (Off == NULL) { p->Off[i] = 0x4000; } else { p->Off[i] = DOUBLE_TO_1FIXED15(Off->n[i]) + 0x4000; } } return p; } // A fast matrix-shaper evaluator for 15 bits. This is a bit ticky since I'm using 1.15 signed fixed point. static void MatShaperXform(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { XMatShaperData* p = (XMatShaperData*)_cmsGetTransformUserData(CMMcargo); cmsS1Fixed15Number l1, l2, l3; cmsS1Fixed15Number r, g, b; cmsUInt32Number ri, gi, bi; cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { // Across first shaper, which also converts to 1.15 fixed point. r = p->Shaper1R[*(cmsUInt16Number*)rin]; g = p->Shaper1G[*(cmsUInt16Number*)gin]; b = p->Shaper1B[*(cmsUInt16Number*)bin]; if (p->IdentityMat) { l1 = r; l2 = g; l3 = b; } else { // Evaluate the matrix in 1.14 fixed point l1 = (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0]) >> 15; l2 = (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1]) >> 15; l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2]) >> 15; } // Now we have to clip to 0..1.0 range ri = (l1 < 0) ? 0 : ((l1 > 0x8000) ? 0x8000 : l1); gi = (l2 < 0) ? 0 : ((l2 > 0x8000) ? 0x8000 : l2); bi = (l3 < 0) ? 0 : ((l3 > 0x8000) ? 0x8000 : l3); // And across second shaper, *(cmsUInt16Number*)rout = p->Shaper2R[ri]; *(cmsUInt16Number*)gout = p->Shaper2G[gi]; *(cmsUInt16Number*)bout = p->Shaper2B[bi]; // Handle alpha if (ain) { memmove(aout, ain, 2); } rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; if (ain) ain += SourceIncrements[3]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (aout) aout += DestIncrements[3]; } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // 15 bits on input allows matrix-shaper boost up a little bit cmsBool OptimizeMatrixShaper15(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* Curve1, *Curve2; cmsStage* Matrix1, *Matrix2; _cmsStageMatrixData* Data1; _cmsStageMatrixData* Data2; cmsMAT3 res; cmsBool IdentityMat = FALSE; cmsPipeline* Dest, *Src; cmsContext ContextID; cmsUInt32Number nChans; // Only works on RGB to RGB and gray if (!(T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3)) return FALSE; // Only works on 15 bit to 15 bit if (T_BYTES(*InputFormat) != 2 || T_BYTES(*OutputFormat) != 2 || T_BIT15(*InputFormat) == 0 || T_BIT15(*OutputFormat) == 0) return FALSE; // Seems suitable, proceed Src = *Lut; // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for if (!cmsPipelineCheckAndRetreiveStages(Src, 4, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; ContextID = cmsGetPipelineContextID(Src); nChans = T_CHANNELS(*InputFormat); // Get both matrices, which are 3x3 Data1 = (_cmsStageMatrixData*)cmsStageData(Matrix1); Data2 = (_cmsStageMatrixData*)cmsStageData(Matrix2); // Input offset should be zero if (Data1->Offset != NULL) return FALSE; // Multiply both matrices to get the result _cmsMAT3per(&res, (cmsMAT3*)Data2->Double, (cmsMAT3*)Data1->Double); // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? IdentityMat = FALSE; if (_cmsMAT3isIdentity(&res) && Data2->Offset == NULL) { // We can get rid of full matrix IdentityMat = TRUE; } // Allocate an empty LUT Dest = cmsPipelineAlloc(ContextID, nChans, nChans); if (!Dest) return FALSE; // Assamble the new LUT cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); if (!IdentityMat) { cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*)&res, Data2->Offset)); } cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); { _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*)cmsStageData(Curve1); _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*)cmsStageData(Curve2); // In this particular optimization, cache does not help as it takes more time to deal with // the cache than with the pixel handling *dwFlags |= cmsFLAGS_NOCACHE; // Setup the optimizarion routines *UserData = SetMatShaper(ContextID, mpeC1->TheCurves, &res, (cmsVEC3*)Data2->Offset, mpeC2->TheCurves, IdentityMat); *FreeUserData = FreeMatShaper; *TransformFn = MatShaperXform; } cmsPipelineFree(Src); *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; *Lut = Dest; return TRUE; } lcms2-2.19.1/plugins/fast_float/src/fast_float_curves.c0000644000175000017500000004070215176573557022135 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" // Curves, optimization is valid for floating point curves typedef struct { cmsFloat32Number CurveR[MAX_NODES_IN_CURVE]; cmsFloat32Number CurveG[MAX_NODES_IN_CURVE]; cmsFloat32Number CurveB[MAX_NODES_IN_CURVE]; void* real_ptr; } CurvesFloatData; // A special malloc that returns memory aligned to DWORD boundary. Aligned memory access is way faster than unaligned // reference to the real block is kept for later free static CurvesFloatData* malloc_aligned(cmsContext ContextID) { cmsUInt8Number* real_ptr = (cmsUInt8Number*)_cmsMallocZero(ContextID, sizeof(CurvesFloatData) + 32); cmsUInt8Number* aligned = (cmsUInt8Number*)(((uintptr_t)real_ptr + 16) & ~0xf); CurvesFloatData* p = (CurvesFloatData*)aligned; p->real_ptr = real_ptr; return p; } // Free the private data container static void free_aligned(cmsContext ContextID, void* Data) { CurvesFloatData* p = (CurvesFloatData*)Data; if (p != NULL) _cmsFree(ContextID, p->real_ptr); } // Evaluator for float curves. This are just 1D tables static void FastEvaluateFloatRGBCurves(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM) CMMcargo); cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM) CMMcargo); CurvesFloatData* Data = (CurvesFloatData*) _cmsGetTransformUserData(CMMcargo); cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { *(cmsFloat32Number*)rout = flerp(Data->CurveR, *(cmsFloat32Number*)rin); *(cmsFloat32Number*)gout = flerp(Data->CurveG, *(cmsFloat32Number*)gin); *(cmsFloat32Number*)bout = flerp(Data->CurveB, *(cmsFloat32Number*)bin); rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (ain) { *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; ain += SourceIncrements[3]; aout += DestIncrements[3]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Do nothing but arrange the RGB format. static void FastFloatRGBIdentity(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM) CMMcargo); cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM) CMMcargo); cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; for (ii=0; ii < PixelsPerLine; ii++) { *(cmsFloat32Number*)rout = *(cmsFloat32Number*)rin; *(cmsFloat32Number*)gout = *(cmsFloat32Number*)gin; *(cmsFloat32Number*)bout = *(cmsFloat32Number*)bin; rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (ain) { *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; ain += SourceIncrements[3]; aout += DestIncrements[3]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Evaluate 1 channel only static void FastEvaluateFloatGrayCurves(struct _cmstransform_struct* CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* kin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* kout; cmsUInt8Number* aout = NULL; cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); CurvesFloatData* Data = (CurvesFloatData*)_cmsGetTransformUserData(CMMcargo); cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { kin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; kout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; if (nalpha) { ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; } for (ii = 0; ii < PixelsPerLine; ii++) { *(cmsFloat32Number*)kout = flerp(Data->CurveR, *(cmsFloat32Number*)kin); kin += SourceIncrements[0]; kout += DestIncrements[0]; if (ain) { *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; ain += SourceIncrements[1]; aout += DestIncrements[1]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } static void FastFloatGrayIdentity(struct _cmstransform_struct* CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* kin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* kout; cmsUInt8Number* aout = NULL; cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { kin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; kout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; if (nalpha) { ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; } for (ii = 0; ii < PixelsPerLine; ii++) { *(cmsFloat32Number*)kout = *(cmsFloat32Number*)kin; kin += SourceIncrements[0]; kout += DestIncrements[0]; if (ain) { *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; ain += SourceIncrements[1]; aout += DestIncrements[1]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } #define LINEAR_CURVES_EPSILON 0.00001 // Try to see if the curves are linear static cmsBool AllRGBCurvesAreLinear(CurvesFloatData* data) { int j; cmsFloat32Number expected; for (j = 0; j < MAX_NODES_IN_CURVE; j++) { expected = (cmsFloat32Number)j / (cmsFloat32Number)(MAX_NODES_IN_CURVE - 1); if (fabsf(data->CurveR[j] - expected) > LINEAR_CURVES_EPSILON || fabsf(data->CurveG[j] - expected) > LINEAR_CURVES_EPSILON || fabsf(data->CurveB[j] - expected) > LINEAR_CURVES_EPSILON) { return FALSE; } } return TRUE; } static cmsBool KCurveIsLinear(CurvesFloatData* data) { int j; cmsFloat32Number expected; for (j = 0; j < MAX_NODES_IN_CURVE; j++) { expected = (cmsFloat32Number)j / (cmsFloat32Number)(MAX_NODES_IN_CURVE - 1); if (fabs(data->CurveR[j] - expected) > LINEAR_CURVES_EPSILON) return FALSE; } return TRUE; } // Create linearization tables with a reasonable number of entries. Precision is about 32 bits. static CurvesFloatData* ComputeCompositeCurves(cmsUInt32Number nChan, cmsPipeline* Src) { cmsUInt32Number i, j; cmsFloat32Number InFloat[3], OutFloat[3]; CurvesFloatData* Data = malloc_aligned(cmsGetPipelineContextID(Src)); if (Data == NULL) return NULL; // Create target curves for (i = 0; i < MAX_NODES_IN_CURVE; i++) { for (j=0; j CurveR[i] = OutFloat[0]; } else { Data->CurveR[i] = OutFloat[0]; Data->CurveG[i] = OutFloat[1]; Data->CurveB[i] = OutFloat[2]; } } return Data; } // If the target LUT holds only curves, the optimization procedure is to join all those // curves together. That only works on curves and does not work on matrices. cmsBool OptimizeFloatByJoiningCurves(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* Src = *Lut; cmsStage* mpe; CurvesFloatData* Data; cmsUInt32Number nChans; // Apply only to floating-point cases if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; // Only on 8-bit if (T_BYTES(*InputFormat) != 4 || T_BYTES(*OutputFormat) != 4) return FALSE; // Curves need same channels on input and output (despite extra channels may differ) nChans = T_CHANNELS(*InputFormat); if (nChans != T_CHANNELS(*OutputFormat)) return FALSE; // gray and RGB if (nChans != 1 && nChans != 3) return FALSE; // Only curves in this LUT? for (mpe = cmsPipelineGetPtrToFirstStage(Src); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; } Data = ComputeCompositeCurves(nChans, Src); *dwFlags |= cmsFLAGS_NOCACHE; *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; *UserData = Data; *FreeUserData = free_aligned; // Maybe the curves are linear at the end if (nChans == 1) *TransformFn = (KCurveIsLinear(Data) ? FastFloatGrayIdentity : FastEvaluateFloatGrayCurves); else *TransformFn = (AllRGBCurvesAreLinear(Data) ? FastFloatRGBIdentity : FastEvaluateFloatRGBCurves); return TRUE; } lcms2-2.19.1/plugins/fast_float/src/fast_float_lab.c0000644000175000017500000003320115176573557021360 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" #define SIGMOID_POINTS 1024 // Optimization for floating point tetrahedral interpolation using Lab as indexing space typedef struct { cmsContext ContextID; const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. cmsFloat32Number sigmoidIn[SIGMOID_POINTS]; // to apply to a*/b* axis on indexing cmsFloat32Number sigmoidOut[SIGMOID_POINTS]; // the curve above, inverted. } LabCLUTdata; typedef struct { LabCLUTdata* data; cmsPipeline* original; } ResamplingContainer; /** * Predefined tone curve */ #define TYPE_SIGMOID 109 // Floating-point version of 1D interpolation cmsINLINE cmsFloat32Number LinLerp1D(cmsFloat32Number Value, const cmsFloat32Number* LutTable) { if (Value >= 1.0f) { return LutTable[SIGMOID_POINTS - 1]; } else if (Value <= 0) { return LutTable[0]; } else { cmsFloat32Number y1, y0; cmsFloat32Number rest; int cell0, cell1; Value *= (SIGMOID_POINTS - 1); cell0 = _cmsQuickFloor(Value); cell1 = cell0 + 1; rest = Value - cell0; y0 = LutTable[cell0]; y1 = LutTable[cell1]; return y0 + (y1 - y0) * rest; } } static void tabulateSigmoid(cmsContext ContextID, cmsInt32Number type, cmsFloat32Number table[], cmsInt32Number tablePoints) { const cmsFloat64Number sigmoidal_slope = 2.5; cmsToneCurve* original; cmsInt32Number i; memset(table, 0, sizeof(cmsFloat32Number) * tablePoints); original = cmsBuildParametricToneCurve(ContextID, type, &sigmoidal_slope); if (original != NULL) { for (i = 0; i < tablePoints; i++) { cmsFloat32Number v = (cmsFloat32Number)i / (cmsFloat32Number)(tablePoints - 1); table[i] = fclamp(cmsEvalToneCurveFloat(original, v)); } cmsFreeToneCurve(original); } } // Allocates container and curves static LabCLUTdata* LabCLUTAlloc(cmsContext ContextID, const cmsInterpParams* p) { LabCLUTdata* fd; fd = (LabCLUTdata*) _cmsMallocZero(ContextID, sizeof(LabCLUTdata)); if (fd == NULL) return NULL; fd ->ContextID = ContextID; fd ->p = p; tabulateSigmoid(ContextID, +TYPE_SIGMOID, fd->sigmoidIn, SIGMOID_POINTS); tabulateSigmoid(ContextID, -TYPE_SIGMOID, fd->sigmoidOut, SIGMOID_POINTS); return fd; } static void LabCLUTFree(cmsContext ContextID, void* v) { _cmsFree(ContextID, v); } // Sampler implemented by another LUT. static int XFormSampler(CMSREGISTER const cmsFloat32Number In[], CMSREGISTER cmsFloat32Number Out[], CMSREGISTER void* Cargo) { ResamplingContainer* container = (ResamplingContainer*)Cargo; cmsFloat32Number linearized[3]; // Apply inverse sigmoid linearized[0] = In[0]; linearized[1] = LinLerp1D(In[1], container->data->sigmoidOut); linearized[2] = LinLerp1D(In[2], container->data->sigmoidOut); cmsPipelineEvalFloat(linearized, Out, container->original); return TRUE; } // To prevent out of bounds indexing cmsINLINE cmsFloat32Number fclamp128(cmsFloat32Number v) { return ((v < -128) || isnan(v)) ? -128.0f : (v > 128.0f ? 128.0f : v); } cmsINLINE cmsFloat32Number fclamp100(cmsFloat32Number v) { return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 100.0f ? 100.0f : v); } // A optimized interpolation for Lab. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void LabCLUTEval(struct _cmstransform_struct* CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { LabCLUTdata* pfloat = (LabCLUTdata*)_cmsGetTransformUserData(CMMcargo); cmsFloat32Number l, a, b; cmsFloat32Number px, py, pz; int x0, y0, z0; int X0, Y0, Z0, X1, Y1, Z1; cmsFloat32Number rx, ry, rz; cmsFloat32Number c0, c1 = 0, c2 = 0, c3 = 0; cmsUInt32Number OutChan; const cmsInterpParams* p = pfloat->p; cmsUInt32Number TotalOut = p->nOutputs; cmsUInt32Number TotalPlusAlpha; const cmsFloat32Number* LutTable = (const cmsFloat32Number*)p->Table; cmsUInt32Number i, ii; const cmsUInt8Number* lin; const cmsUInt8Number* ain; const cmsUInt8Number* bin; const cmsUInt8Number* xin = NULL; cmsUInt8Number* out[cmsMAXCHANNELS]; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { lin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) xin = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; TotalPlusAlpha = TotalOut; if (xin) TotalPlusAlpha++; for (ii = 0; ii < TotalPlusAlpha; ii++) out[ii] = (cmsUInt8Number*)Output + DestStartingOrder[ii] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { // Decode Lab and go across sigmoids on a*/b* l = fclamp100( *(cmsFloat32Number*)lin ) / 100.0f; a = LinLerp1D((( fclamp128( *(cmsFloat32Number*)ain)) + 128.0f) / 255.0f, pfloat->sigmoidIn); b = LinLerp1D((( fclamp128( *(cmsFloat32Number*)bin)) + 128.0f) / 255.0f, pfloat->sigmoidIn); lin += SourceIncrements[0]; ain += SourceIncrements[1]; bin += SourceIncrements[2]; px = l * p->Domain[0]; py = a * p->Domain[1]; pz = b * p->Domain[2]; x0 = _cmsQuickFloor(px); rx = (px - (cmsFloat32Number)x0); y0 = _cmsQuickFloor(py); ry = (py - (cmsFloat32Number)y0); z0 = _cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number)z0); X0 = p->opta[2] * x0; X1 = X0 + (l >= 1.0f ? 0 : p->opta[2]); Y0 = p->opta[1] * y0; Y1 = Y0 + (a >= 1.0f ? 0 : p->opta[1]); Z0 = p->opta[0] * z0; Z1 = Z0 + (b >= 1.0f ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { // These are the 6 Tetrahedral c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } *(cmsFloat32Number*)(out[OutChan]) = c0 + c1 * rx + c2 * ry + c3 * rz; out[OutChan] += DestIncrements[OutChan]; } if (xin) { *(cmsFloat32Number*) (out[TotalOut]) = *(cmsFloat32Number*)xin; xin += SourceIncrements[3]; out[TotalOut] += DestIncrements[TotalOut]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } #undef DENS /** * Get from flags */ static int GetGridpoints(cmsUInt32Number dwFlags) { // Already specified? if (dwFlags & 0x00FF0000) { return (dwFlags >> 16) & 0xFF; } // HighResPrecalc is maximum resolution if (dwFlags & cmsFLAGS_HIGHRESPRECALC) { return 66; } else // LowResPrecal is lower resolution if (dwFlags & cmsFLAGS_LOWRESPRECALC) { return 33; } else return 51; } // -------------------------------------------------------------------------------------------------------------- cmsBool OptimizeCLUTLabTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* OriginalLut; int nGridPoints; cmsPipeline* OptimizedLUT = NULL; cmsStage* OptimizedCLUTmpe; LabCLUTdata* pfloat; cmsContext ContextID; _cmsStageCLutData* data; ResamplingContainer container; // For empty transforms, do nothing if (*Lut == NULL) return FALSE; // Check for floating point only if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; // Only on floats if (T_BYTES(*InputFormat) != sizeof(cmsFloat32Number) || T_BYTES(*OutputFormat) != sizeof(cmsFloat32Number)) return FALSE; if (T_COLORSPACE(*InputFormat) != PT_Lab) return FALSE; OriginalLut = *Lut; ContextID = cmsGetPipelineContextID(OriginalLut); nGridPoints = GetGridpoints(*dwFlags); // Create the result LUT OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 3, cmsPipelineOutputChannels(OriginalLut)); if (OptimizedLUT == NULL) goto Error; // Allocate the CLUT for result OptimizedCLUTmpe = cmsStageAllocCLutFloat(ContextID, nGridPoints, 3, cmsPipelineOutputChannels(OriginalLut), NULL); // Add the CLUT to the destination LUT cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedCLUTmpe); // Set the evaluator, copy parameters data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); // Allocate data pfloat = LabCLUTAlloc(ContextID, data ->Params); if (pfloat == NULL) return FALSE; container.data = pfloat; container.original = OriginalLut; // Resample the LUT if (!cmsStageSampleCLutFloat(OptimizedCLUTmpe, XFormSampler, (void*)&container, 0)) goto Error; // And return the obtained LUT cmsPipelineFree(OriginalLut); *Lut = OptimizedLUT; *TransformFn = LabCLUTEval; *UserData = pfloat; *FreeDataFn = LabCLUTFree; *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; return TRUE; Error: if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); return FALSE; } lcms2-2.19.1/plugins/fast_float/src/fast_float_matsh.c0000644000175000017500000003145015176573557021742 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- // Optimization for matrix-shaper in float #include "fast_float_internal.h" // This is the private data container used by this optimization typedef struct { cmsFloat32Number Mat[3][3]; cmsFloat32Number Off[3]; cmsFloat32Number Shaper1R[MAX_NODES_IN_CURVE]; cmsFloat32Number Shaper1G[MAX_NODES_IN_CURVE]; cmsFloat32Number Shaper1B[MAX_NODES_IN_CURVE]; cmsFloat32Number Shaper2R[MAX_NODES_IN_CURVE]; cmsFloat32Number Shaper2G[MAX_NODES_IN_CURVE]; cmsFloat32Number Shaper2B[MAX_NODES_IN_CURVE]; cmsBool UseOff; void * real_ptr; } VXMatShaperFloatData; static VXMatShaperFloatData* malloc_aligned(cmsContext ContextID) { cmsUInt8Number* real_ptr = (cmsUInt8Number*) _cmsMallocZero(ContextID, sizeof(VXMatShaperFloatData) + 32); cmsUInt8Number* aligned = (cmsUInt8Number*) (((uintptr_t)real_ptr + 16) & ~0xf); VXMatShaperFloatData* p = (VXMatShaperFloatData*) aligned; p ->real_ptr = real_ptr; return p; } // Free the private data container static void FreeMatShaper(cmsContext ContextID, void* Data) { VXMatShaperFloatData* d = (VXMatShaperFloatData*)Data; if (d != NULL) _cmsFree(ContextID, d->real_ptr); } static void FillShaper(cmsFloat32Number* Table, cmsToneCurve* Curve) { int i; cmsFloat32Number R; for (i = 0; i < MAX_NODES_IN_CURVE; i++) { R = (cmsFloat32Number) i / (cmsFloat32Number) (MAX_NODES_IN_CURVE - 1); Table[i] = cmsEvalToneCurveFloat(Curve, R); } } // Compute the matrix-shaper structure static VXMatShaperFloatData* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3]) { VXMatShaperFloatData* p; int i, j; // Allocate a big chuck of memory to store precomputed tables p = malloc_aligned(ContextID); if (p == NULL) return FALSE; // Precompute tables FillShaper(p->Shaper1R, Curve1[0]); FillShaper(p->Shaper1G, Curve1[1]); FillShaper(p->Shaper1B, Curve1[2]); FillShaper(p->Shaper2R, Curve2[0]); FillShaper(p->Shaper2G, Curve2[1]); FillShaper(p->Shaper2B, Curve2[2]); for (i=0; i < 3; i++) { for (j=0; j < 3; j++) { p->Mat[i][j] = (cmsFloat32Number) Mat->v[i].n[j]; } } for (i = 0; i < 3; i++) { if (Off == NULL) { p->UseOff = FALSE; p->Off[i] = 0.0; } else { p->UseOff = TRUE; p->Off[i] = (cmsFloat32Number)Off->n[i]; } } return p; } // A fast matrix-shaper evaluator for floating point static void MatShaperFloat(struct _cmstransform_struct* CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { VXMatShaperFloatData* p = (VXMatShaperFloatData*) _cmsGetTransformUserData(CMMcargo); cmsFloat32Number l1, l2, l3; cmsFloat32Number r, g, b; cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { r = flerp(p->Shaper1R, *(cmsFloat32Number*)rin); g = flerp(p->Shaper1G, *(cmsFloat32Number*)gin); b = flerp(p->Shaper1B, *(cmsFloat32Number*)bin); l1 = p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b; l2 = p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b; l3 = p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b; if (p->UseOff) { l1 += p->Off[0]; l2 += p->Off[1]; l3 += p->Off[2]; } *(cmsFloat32Number*)rout = flerp(p->Shaper2R, l1); *(cmsFloat32Number*)gout = flerp(p->Shaper2G, l2); *(cmsFloat32Number*)bout = flerp(p->Shaper2B, l3); rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (ain) { *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; ain += SourceIncrements[3]; aout += DestIncrements[3]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } cmsBool OptimizeFloatMatrixShaper(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* Curve1, *Curve2; cmsStage* Matrix1, *Matrix2, * XYZmatrix = NULL; _cmsStageMatrixData* Data1; _cmsStageMatrixData* Data2; cmsMAT3 res; cmsBool IdentityMat = FALSE; cmsPipeline* Dest, *Src; cmsContext ContextID; cmsUInt32Number nChans; cmsFloat64Number factor = 1.0; // Apply only to floating-point cases if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; // Only works on RGB to RGB and gray to gray if ( !( (T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3)) && !( (T_CHANNELS(*InputFormat) == 1 && T_CHANNELS(*OutputFormat) == 1))) return FALSE; // Only works on float if (T_BYTES(*InputFormat) != 4 || T_BYTES(*OutputFormat) != 4) return FALSE; // Seems suitable, proceed Src = *Lut; // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for if (cmsPipelineCheckAndRetreiveStages(Src, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Curve2)) { if (T_COLORSPACE(*OutputFormat) == PT_XYZ) { /** * XYZ is encoded in 1.15 fixed point, but in * out table it is on 0..1.0 range, so we need to adjust it. */ #define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) static const cmsFloat64Number mat[] = { MAX_ENCODEABLE_XYZ, 0, 0, 0, MAX_ENCODEABLE_XYZ, 0, 0, 0, MAX_ENCODEABLE_XYZ }; XYZmatrix = Matrix2 = cmsStageAllocMatrix(cmsGetPipelineContextID(Src), 3, 3, mat, NULL); } else if (T_COLORSPACE(*InputFormat) == PT_XYZ) { static const cmsFloat64Number mat[] = { 1.0/MAX_ENCODEABLE_XYZ, 0, 0, 0, 1.0/MAX_ENCODEABLE_XYZ, 0, 0, 0, 1.0/MAX_ENCODEABLE_XYZ }; Matrix2 = Matrix1; XYZmatrix = Matrix1 = cmsStageAllocMatrix(cmsGetPipelineContextID(Src), 3, 3, mat, NULL); } else return FALSE; } else if (!cmsPipelineCheckAndRetreiveStages(Src, 4, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; ContextID = cmsGetPipelineContextID(Src); nChans = T_CHANNELS(*InputFormat); // Get both matrices, which are 3x3 Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1); Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2); // Input offset should be zero if (Data1 ->Offset != NULL) return FALSE; if (cmsStageInputChannels(Matrix1) == 1 && cmsStageOutputChannels(Matrix2) == 1) { // This is a gray to gray. Just multiply factor = Data1->Double[0]*Data2->Double[0] + Data1->Double[1]*Data2->Double[1] + Data1->Double[2]*Data2->Double[2]; if (fabs(1 - factor) < (1.0 / 65535.0)) IdentityMat = TRUE; } else { // Multiply both matrices to get the result _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double); // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? IdentityMat = FALSE; if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) { // We can get rid of full matrix IdentityMat = TRUE; } } // Allocate an empty LUT Dest = cmsPipelineAlloc(ContextID, nChans, nChans); if (!Dest) return FALSE; // Assemble the new LUT cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); if (!IdentityMat) { if (nChans == 1) cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 1, (const cmsFloat64Number*) &factor, Data2->Offset)); else cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)); } cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); // If identity on matrix, we can further optimize the curves, so call the join curves routine if (IdentityMat) { OptimizeFloatByJoiningCurves(TransformFn, UserData, FreeUserData, &Dest, InputFormat, OutputFormat, dwFlags); } else { _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); // In this particular optimization, cache does not help as it takes more time to deal with // the cache than with the pixel handling *dwFlags |= cmsFLAGS_NOCACHE; // Setup the optimization routines *UserData = SetMatShaper(ContextID, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves); *FreeUserData = FreeMatShaper; *TransformFn = MatShaperFloat; } *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; cmsPipelineFree(Src); if (XYZmatrix != NULL) cmsStageFree(XYZmatrix); *Lut = Dest; return TRUE; } lcms2-2.19.1/plugins/fast_float/src/fast_float_separate.c0000644000175000017500000001575215176573557022441 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" // Separable input. It just computes the distance from // each component to the next one in bytes. It gives components RGB in this order // // Encoding Starting Increment DoSwap Swapfirst Extra // RGB, 012 333 0 0 0 // RGBA, 012 444 0 0 1 // ARGB, 123 444 0 1 1 // BGR, 210 333 1 0 0 // BGRA, 210 444 1 1 1 // ABGR 321 444 1 0 1 // // // On planar configurations, the distance is the stride added to any non-negative // // RGB 0, S, 2*S 111 // RGBA 0, S, 2*S 111 (fourth plane is safely ignored) // ARGB S, 2*S, 3*S 111 // BGR 2*S, S, 0 111 // BGRA 2*S, S, 0, 111 (fourth plane is safely ignored) // ABGR 3*S, 2*S, S 111 // //---------------------------------------------------------------------------------------- // Return the size in bytes of a given formatter static int trueBytesSize(cmsUInt32Number Format) { int fmt_bytes = T_BYTES(Format); // For double, the T_BYTES field returns zero if (fmt_bytes == 0) return sizeof(double); // Otherwise, it is already correct for all formats return fmt_bytes; } // RGBA -> normal // ARGB -> swap first // ABGR -> doSwap // BGRA -> doSwap swapFirst // This function computes the distance from each component to the next one in bytes. static void ComputeIncrementsForChunky(cmsUInt32Number Format, cmsUInt32Number BytesPerPlane, cmsUInt32Number* nChannels, cmsUInt32Number* nAlpha, cmsUInt32Number ComponentStartingOrder[], cmsUInt32Number ComponentPointerIncrements[]) { int extra = T_EXTRA(Format); int channels = T_CHANNELS(Format); int total_chans = channels + extra; int i; int channelSize = trueBytesSize(Format); int pixelSize = channelSize * total_chans; UNUSED_PARAMETER(BytesPerPlane); // Setup the counts if (nChannels != NULL) *nChannels = channels; if (nAlpha != NULL) *nAlpha = extra; // Separation is independent of starting point and only depends on channel size for (i = 0; i < total_chans; i++) ComponentPointerIncrements[i] = pixelSize; // Handle do swap for (i = 0; i < total_chans; i++) { if (T_DOSWAP(Format)) { ComponentStartingOrder[i] = total_chans - i - 1; } else { ComponentStartingOrder[i] = i; } } // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 if (T_SWAPFIRST(Format)) { cmsUInt32Number tmp = ComponentStartingOrder[0]; for (i = 0; i < total_chans-1; i++) ComponentStartingOrder[i] = ComponentStartingOrder[i + 1]; ComponentStartingOrder[total_chans - 1] = tmp; } // Handle size if (channelSize > 1) for (i = 0; i < total_chans; i++) { ComponentStartingOrder[i] *= channelSize; } } // On planar configurations, the distance is the stride added to any non-negative static void ComputeIncrementsForPlanar(cmsUInt32Number Format, cmsUInt32Number BytesPerPlane, cmsUInt32Number* nChannels, cmsUInt32Number* nAlpha, cmsUInt32Number ComponentStartingOrder[], cmsUInt32Number ComponentPointerIncrements[]) { int extra = T_EXTRA(Format); int channels = T_CHANNELS(Format); int total_chans = channels + extra; int i; int channelSize = trueBytesSize(Format); // Setup the counts if (nChannels != NULL) *nChannels = channels; if (nAlpha != NULL) *nAlpha = extra; // Separation is independent of starting point and only depends on channel size for (i = 0; i < total_chans; i++) ComponentPointerIncrements[i] = channelSize; // Handle do swap for (i = 0; i < total_chans; i++) { if (T_DOSWAP(Format)) { ComponentStartingOrder[i] = total_chans - i - 1; } else { ComponentStartingOrder[i] = i; } } // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 if (T_SWAPFIRST(Format)) { cmsUInt32Number tmp = ComponentStartingOrder[0]; for (i = 0; i < total_chans - 1; i++) ComponentStartingOrder[i] = ComponentStartingOrder[i + 1]; ComponentStartingOrder[total_chans - 1] = tmp; } // Handle size for (i = 0; i < total_chans; i++) { ComponentStartingOrder[i] *= BytesPerPlane; } } // Dispatcher por chunky and planar RGB CMSCHECKPOINT void CMSEXPORT _cmsComputeComponentIncrements(cmsUInt32Number Format, cmsUInt32Number BytesPerPlane, cmsUInt32Number* nChannels, cmsUInt32Number* nAlpha, cmsUInt32Number ComponentStartingOrder[], cmsUInt32Number ComponentPointerIncrements[]) { if (T_PLANAR(Format)) { ComputeIncrementsForPlanar(Format, BytesPerPlane, nChannels, nAlpha, ComponentStartingOrder, ComponentPointerIncrements); } else { ComputeIncrementsForChunky(Format, BytesPerPlane, nChannels, nAlpha, ComponentStartingOrder, ComponentPointerIncrements); } } lcms2-2.19.1/plugins/fast_float/src/fast_8_curves.c0000644000175000017500000003575415176573557021212 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" // Curves, optimization is valid for 8 bits only typedef struct { cmsContext ContextID; int nCurves; cmsUInt8Number Curves[cmsMAXCHANNELS][256]; } Curves8Data; // Evaluator for RGB 8-bit curves. This are just 1D tables static void FastEvaluateRGBCurves8(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; Curves8Data* Data = (Curves8Data*)_cmsGetTransformUserData(CMMcargo); _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { *rout = Data->Curves[0][*rin]; *gout = Data->Curves[1][*gin]; *bout = Data->Curves[2][*bin]; // Handle alpha if (ain) { *aout = *ain; } rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; if (ain) ain += SourceIncrements[3]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (aout) aout += DestIncrements[3]; } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Do nothing but arrange the format. RGB static void FastRGBIdentity8(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* rout; cmsUInt8Number* gout; cmsUInt8Number* bout; cmsUInt8Number* aout = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { *rout = *rin; *gout = *gin; *bout = *bin; // Handle alpha if (ain) { *aout = *ain; } rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; if (ain) ain += SourceIncrements[3]; rout += DestIncrements[0]; gout += DestIncrements[1]; bout += DestIncrements[2]; if (aout) aout += DestIncrements[3]; } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Evaluate 1 channel only static void FastEvaluateGrayCurves8(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* gin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* gout; cmsUInt8Number* aout = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; Curves8Data* Data = (Curves8Data*)_cmsGetTransformUserData(CMMcargo); _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { gin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; gout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { *gout = Data->Curves[0][*gin]; // Handle alpha if (ain) { *aout = *ain; } gin += SourceIncrements[0]; if (ain) ain += SourceIncrements[1]; gout += DestIncrements[0]; if (aout) aout += DestIncrements[1]; } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } static void FastGrayIdentity8(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, ii; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; const cmsUInt8Number* gin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* gout; cmsUInt8Number* aout = NULL; cmsUInt32Number nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { gin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; gout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; if (nalpha) aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { *gout = *gin; // Handle alpha if (ain) { *aout = *ain; } gin += SourceIncrements[0]; if (ain) ain += SourceIncrements[1]; gout += DestIncrements[0]; if (aout) aout += DestIncrements[1]; } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Try to see if the curves are linear static cmsBool AllCurvesAreLinear(Curves8Data* data) { int i, j; for (i=0; i < 3; i++) { for (j = 0; j < 256; j++) { if (data ->Curves[i][j] != j) return FALSE; } } return TRUE; } static Curves8Data* ComputeCompositeCurves(cmsUInt32Number nChan, cmsPipeline* Src) { cmsUInt32Number i, j; cmsFloat32Number InFloat[3], OutFloat[3]; Curves8Data* Data = (Curves8Data*) _cmsMallocZero(cmsGetPipelineContextID(Src), sizeof(Curves8Data)); if (Data == NULL) return NULL; // Create target curves for (i=0; i < 256; i++) { for (j=0; j Curves[j][i] = FROM_16_TO_8(_cmsSaturateWord(OutFloat[j] * 65535.0)); } return Data; } // If the target LUT holds only curves, the optimization procedure is to join all those // curves together. That only works on curves and does not work on matrices. // Any number of channels up to 16 cmsBool Optimize8ByJoiningCurves(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* Src = *Lut; cmsStage* mpe; Curves8Data* Data; cmsUInt32Number nChans; // This is a lossy optimization! does not apply in floating-point cases if (T_FLOAT(*InputFormat) || T_FLOAT(*OutputFormat)) return FALSE; // Only on 8-bit if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; // Curves need same channels on input and output (despite extra channels may differ) nChans = T_CHANNELS(*InputFormat); if (nChans != T_CHANNELS(*OutputFormat)) return FALSE; // gray and RGB if (nChans != 1 && nChans != 3) return FALSE; // Only curves in this LUT? for (mpe = cmsPipelineGetPtrToFirstStage(Src); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; } Data = ComputeCompositeCurves(nChans, Src); *dwFlags |= cmsFLAGS_NOCACHE; *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; *UserData = Data; *FreeUserData = _fast_float_free_user_data; // Maybe the curves are linear at the end if (nChans == 1) *TransformFn = (AllCurvesAreLinear(Data) ? FastGrayIdentity8 : FastEvaluateGrayCurves8); else *TransformFn = (AllCurvesAreLinear(Data) ? FastRGBIdentity8 : FastEvaluateRGBCurves8); return TRUE; } lcms2-2.19.1/plugins/fast_float/src/fast_float_cmyk.c0000644000175000017500000003304015176573557021566 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" // Optimization for floating point tetrahedral interpolation typedef struct { cmsContext ContextID; const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. } FloatCMYKData; // Precomputes tables on input devicelink. static FloatCMYKData* FloatCMYKAlloc(cmsContext ContextID, const cmsInterpParams* p) { FloatCMYKData* fd; fd = (FloatCMYKData*) _cmsMallocZero(ContextID, sizeof(FloatCMYKData)); if (fd == NULL) return NULL; fd ->ContextID = ContextID; fd ->p = p; return fd; } static int XFormSampler(CMSREGISTER const cmsFloat32Number In[], CMSREGISTER cmsFloat32Number Out[], CMSREGISTER void* Cargo) { // Evaluate in 16 bits cmsPipelineEvalFloat(In, Out, (cmsPipeline*) Cargo); // Always succeed return TRUE; } cmsINLINE cmsFloat32Number LinearInterpInt(cmsFloat32Number a, cmsFloat32Number l, cmsFloat32Number h) { return (h - l) * a + l; } // To prevent out of bounds indexing cmsINLINE cmsFloat32Number fclamp100(cmsFloat32Number v) { return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 100.0f ? 100.0f : v); } // A optimized interpolation for 8-bit input. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void FloatCMYKCLUTEval(struct _cmstransform_struct *CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsFloat32Number c, m, y, k; cmsFloat32Number px, py, pz, pk; int x0, y0, z0, k0; int X0, Y0, Z0, K0, X1, Y1, Z1, K1; cmsFloat32Number rx, ry, rz, rk; cmsFloat32Number c0, c1 = 0, c2 = 0, c3 = 0; cmsUInt32Number OutChan; FloatCMYKData* pcmyk = (FloatCMYKData*) _cmsGetTransformUserData(CMMcargo); const cmsInterpParams* p = pcmyk ->p; cmsUInt32Number TotalOut = p -> nOutputs; cmsUInt32Number TotalPlusAlpha; const cmsFloat32Number* LutTable = (const cmsFloat32Number*)p->Table; cmsUInt32Number i, ii; const cmsUInt8Number* cin; const cmsUInt8Number* min; const cmsUInt8Number* yin; const cmsUInt8Number* kin; const cmsUInt8Number* ain = NULL; cmsFloat32Number Tmp1[cmsMAXCHANNELS], Tmp2[cmsMAXCHANNELS]; cmsUInt8Number* out[cmsMAXCHANNELS]; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM) CMMcargo); cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM) CMMcargo); cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { cin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; min = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; yin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; kin = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[4] + strideIn; TotalPlusAlpha = TotalOut; if (ain) TotalPlusAlpha++; for (ii = 0; ii < TotalPlusAlpha; ii++) out[ii] = (cmsUInt8Number*)Output + DestStartingOrder[ii] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { c = fclamp100(*(cmsFloat32Number*)cin) / 100.0f; m = fclamp100(*(cmsFloat32Number*)min) / 100.0f; y = fclamp100(*(cmsFloat32Number*)yin) / 100.0f; k = fclamp100(*(cmsFloat32Number*)kin) / 100.0f; cin += SourceIncrements[0]; min += SourceIncrements[1]; yin += SourceIncrements[2]; kin += SourceIncrements[3]; pk = c * p->Domain[0]; // C px = m * p->Domain[1]; // M py = y * p->Domain[2]; // Y pz = k * p->Domain[3]; // K k0 = (int)_cmsQuickFloor(pk); rk = (pk - (cmsFloat32Number)k0); x0 = (int)_cmsQuickFloor(px); rx = (px - (cmsFloat32Number)x0); y0 = (int)_cmsQuickFloor(py); ry = (py - (cmsFloat32Number)y0); z0 = (int)_cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number)z0); K0 = p->opta[3] * k0; K1 = K0 + (c >= 1.0 ? 0 : p->opta[3]); X0 = p->opta[2] * x0; X1 = X0 + (m >= 1.0 ? 0 : p->opta[2]); Y0 = p->opta[1] * y0; Y1 = Y0 + (y >= 1.0 ? 0 : p->opta[1]); Z0 = p->opta[0] * z0; Z1 = Z0 + (k >= 1.0 ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Tmp1[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz; } LutTable = (cmsFloat32Number*)p->Table; LutTable += K1; for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Tmp2[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz; } for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { *(cmsFloat32Number*)(out[OutChan]) = LinearInterpInt(rk, Tmp1[OutChan], Tmp2[OutChan]); out[OutChan] += DestIncrements[OutChan]; } if (ain) { *(cmsFloat32Number*)(out[TotalOut]) = *(cmsFloat32Number*)ain; ain += SourceIncrements[4]; out[TotalOut] += DestIncrements[TotalOut]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } #undef DENS // -------------------------------------------------------------------------------------------------------------- cmsBool OptimizeCLUTCMYKTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* OriginalLut; int nGridPoints; cmsPipeline* OptimizedLUT = NULL; cmsStage* OptimizedCLUTmpe; FloatCMYKData* pcmyk; cmsContext ContextID; _cmsStageCLutData* data; // For empty transforms, do nothing if (*Lut == NULL) return FALSE; // This is a lossy optimization! does not apply in floating-point cases if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; // Only on 8-bit if (T_BYTES(*InputFormat) != 4 || T_BYTES(*OutputFormat) != 4) return FALSE; // Only on CMYK if (T_COLORSPACE(*InputFormat) != PT_CMYK) return FALSE; OriginalLut = *Lut; ContextID = cmsGetPipelineContextID(OriginalLut); nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigRgbData, *dwFlags); // Create the result LUT OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 4, cmsPipelineOutputChannels(OriginalLut)); if (OptimizedLUT == NULL) goto Error; // Allocate the CLUT for result OptimizedCLUTmpe = cmsStageAllocCLutFloat(ContextID, nGridPoints, 4, cmsPipelineOutputChannels(OriginalLut), NULL); // Add the CLUT to the destination LUT cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedCLUTmpe); // Resample the LUT if (!cmsStageSampleCLutFloat(OptimizedCLUTmpe, XFormSampler, (void*)OriginalLut, 0)) goto Error; // Set the evaluator, copy parameters data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); pcmyk = FloatCMYKAlloc(ContextID, data ->Params); if (pcmyk == NULL) return FALSE; // And return the obtained LUT cmsPipelineFree(OriginalLut); *Lut = OptimizedLUT; *TransformFn = FloatCMYKCLUTEval; *UserData = pcmyk; *FreeDataFn = _fast_float_free_user_data; *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; return TRUE; Error: if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); return FALSE; } lcms2-2.19.1/plugins/fast_float/src/fast_float_internal.h0000644000175000017500000002523215176573557022450 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #ifndef _FAST_INTERNAL_H #define _FAST_INTERNAL_H #include "lcms2_fast_float.h" #include #define REQUIRED_LCMS_VERSION 2120 // Unused parameter warning suppression #define UNUSED_PARAMETER(x) ((void)x) // For testbed #define CMSCHECKPOINT CMSAPI // The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). // unfortunately VisualC++ does not conform that #if defined(_MSC_VER) || defined(__BORLANDC__) # define cmsINLINE __inline #else # define cmsINLINE static inline #endif /// Properly define some macros to accommodate /// older MSVC versions. # if defined(_MSC_VER) && _MSC_VER <= 1700 #include #define isnan _isnan #define isinf(x) (!_finite((x))) # endif #if !defined(_MSC_VER) && (defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L) #if !defined(isinf) #define isinf(x) (!finite((x))) #endif #endif // A fast way to convert from/to 16 <-> 8 bits #define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) #define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF) // This macro return words stored as big endian #define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) // This macro changes the polarity of a word #define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x))) // Fixed point #define FIXED_TO_INT(x) ((x)>>16) #define FIXED_REST_TO_INT(x) ((x)&0xFFFFU) #define cmsFLAGS_CAN_CHANGE_FORMATTER 0x02000000 // Allow change buffer format // Utility macros to convert from to 0...1.0 in 15.16 fixed domain to 0..0xffff as integer cmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a) { return a + ((a + 0x7fff) / 0xffff); } cmsINLINE int _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); } // This is the upper part of internal transform structure. Only format specifiers are used typedef struct { cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference } _xform_head; #define MAX_NODES_IN_CURVE 0x8001 // To prevent out of bounds indexing cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) { return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 1.0f ? 1.0f : v); } // Fast floor conversion logic. cmsINLINE int _cmsQuickFloor(cmsFloat64Number val) { #ifdef CMS_DONT_USE_FAST_FLOOR return (int)floor(val); #else #define _lcms_double2fixmagic (68719476736.0 * 1.5) union { cmsFloat64Number val; int halves[2]; } temp; temp.val = val + _lcms_double2fixmagic; #ifdef CMS_USE_BIG_ENDIAN return temp.halves[1] >> 16; #else return temp.halves[0] >> 16; #endif #endif } // Floor to word, taking care of saturation. This is not critical in terms of performance cmsINLINE cmsUInt16Number _cmsSaturateWord(cmsFloat64Number d) { d += 0.5; if (d <= 0) return 0; if (d >= 65535.0) return 0xffff; return (cmsUInt16Number)floor(d); } cmsINLINE cmsFloat32Number flerp(const cmsFloat32Number LutTable[], cmsFloat32Number v) { cmsFloat32Number y1, y0; cmsFloat32Number rest; int cell0, cell1; if (isnan(v)) return LutTable[0]; if (v < 1.0e-9f) { return v; } else if (v >= 1.0) { return v; } v *= (MAX_NODES_IN_CURVE - 1); cell0 = _cmsQuickFloor(v); cell1 = (int)ceilf(v); // Rest is 16 LSB bits rest = v - cell0; y0 = LutTable[cell0]; y1 = LutTable[cell1]; return y0 + (y1 - y0) * rest; } // Some secret sauce from lcms CMSAPI cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags); // Compute the increments to be used by the transform functions CMSCHECKPOINT void CMSEXPORT _cmsComputeComponentIncrements(cmsUInt32Number Format, cmsUInt32Number BytesPerPlane, cmsUInt32Number* nChannels, cmsUInt32Number* nAlpha, cmsUInt32Number ComponentStartingOrder[], cmsUInt32Number ComponentPointerIncrements[]); // 15 bits formatters CMSCHECKPOINT cmsFormatter CMSEXPORT Formatter_15Bit_Factory(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags); // Optimizers // 8 bits on input allows matrix-shaper boost up a little bit cmsBool Optimize8MatrixShaper(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); // 8 bits using SSE cmsBool Optimize8MatrixShaperSSE(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool OptimizeMatrixShaper15(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool Optimize8ByJoiningCurves(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool OptimizeFloatByJoiningCurves(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool OptimizeFloatMatrixShaper(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool Optimize8BitRGBTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool Optimize16BitRGBTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool OptimizeCLUTRGBTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool OptimizeCLUTCMYKTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); cmsBool OptimizeCLUTLabTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); // Wrapper for _cmsFree that matches the _cmsFreeUserDataFn calling convention. // On Win32, _cmsFree uses __stdcall (CMSEXPORT) but _cmsFreeUserDataFn is __cdecl. // Using _cmsFree directly as a _cmsFreeUserDataFn would cause a calling convention // mismatch on 32-bit Windows builds. This wrapper uses the default (cdecl) convention. cmsINLINE void _fast_float_free_user_data(cmsContext ContextID, void* Data) { _cmsFree(ContextID, Data); } #endif lcms2-2.19.1/plugins/fast_float/src/fast_float_sup.c0000644000175000017500000001266715176573557021446 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" // This is the main dispatcher static cmsBool Floating_Point_Transforms_Dispatcher(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeUserData, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { // Softproofing & gamut check does not use plugin, both are activated via following flag. if (*dwFlags & cmsFLAGS_SOFTPROOFING) return FALSE; // Special flags for reversing are not supported if (T_FLAVOR(*InputFormat) || T_FLAVOR(*OutputFormat)) return FALSE; // Check consistency for alpha channel copy if (*dwFlags & cmsFLAGS_COPY_ALPHA) { if ((T_EXTRA(*InputFormat) != T_EXTRA(*OutputFormat))) return FALSE; if (T_PREMUL(*InputFormat) || T_PREMUL(*OutputFormat)) return FALSE; } // Try to optimize as a set of curves plus a matrix plus a set of curves if (OptimizeMatrixShaper15(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize by joining curves if (Optimize8ByJoiningCurves(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; #ifndef CMS_DONT_USE_SSE2 // Try to use SSE2 to optimize as a set of curves plus a matrix plus a set of curves if (Optimize8MatrixShaperSSE(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; #endif // Try to optimize as a set of curves plus a matrix plus a set of curves if (Optimize8MatrixShaper(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize by joining curves if (OptimizeFloatByJoiningCurves(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize as a set of curves plus a matrix plus a set of curves if (OptimizeFloatMatrixShaper(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize using prelinearization plus tetrahedral if (Optimize8BitRGBTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize using prelinearization plus tetrahedral if (Optimize16BitRGBTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize using prelinearization plus tetrahedral if (OptimizeCLUTRGBTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize using prelinearization plus tetrahedral if (OptimizeCLUTCMYKTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Try to optimize for Lab float as input if (OptimizeCLUTLabTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; // Cannot optimize, use lcms normal process return FALSE; } // On Win32, CMSEXPORT expands to __stdcall but cmsFormatterFactory is __cdecl. // This wrapper has the cdecl calling convention so it can be stored in the plugin struct. static cmsFormatter Formatter_15Bit_Factory_wrapper(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { return Formatter_15Bit_Factory(Type, Dir, dwFlags); } // The Plug-in entry points static cmsPluginFormatters PluginFastFloat = { { cmsPluginMagicNumber, REQUIRED_LCMS_VERSION, cmsPluginFormattersSig, NULL }, Formatter_15Bit_Factory_wrapper }; static cmsPluginTransform PluginList = { { cmsPluginMagicNumber, REQUIRED_LCMS_VERSION, cmsPluginTransformSig, (cmsPluginBase *) &PluginFastFloat }, // When initializing a union, the initializer list must have only one member, which initializes the first member of // the union unless a designated initializer is used (C99) { (_cmsTransformFactory) Floating_Point_Transforms_Dispatcher } }; // This is the main plug-in installer. // Using a function to retrieve the plug-in entry point allows us to execute initialization data. void* CMSEXPORT cmsFastFloatExtensions(void) { return (void*)&PluginList; } lcms2-2.19.1/plugins/fast_float/src/fast_float_tethra.c0000644000175000017500000003130215176573557022111 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" // Optimization for floating point tetrahedral interpolation typedef struct { cmsContext ContextID; const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. } FloatCLUTData; // Allocates container static FloatCLUTData* FloatCLUTAlloc(cmsContext ContextID, const cmsInterpParams* p) { FloatCLUTData* fd; fd = (FloatCLUTData*) _cmsMallocZero(ContextID, sizeof(FloatCLUTData)); if (fd == NULL) return NULL; fd ->ContextID = ContextID; fd ->p = p; return fd; } // Sampler implemented by another LUT. static int XFormSampler(CMSREGISTER const cmsFloat32Number In[], CMSREGISTER cmsFloat32Number Out[], CMSREGISTER void* Cargo) { cmsPipelineEvalFloat(In, Out, (cmsPipeline*) Cargo); return TRUE; } // A optimized interpolation for input. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void FloatCLUTEval(struct _cmstransform_struct* CMMcargo, const void* Input, void* Output, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { FloatCLUTData* pfloat = (FloatCLUTData*)_cmsGetTransformUserData(CMMcargo); cmsFloat32Number r, g, b; cmsFloat32Number px, py, pz; int x0, y0, z0; int X0, Y0, Z0, X1, Y1, Z1; cmsFloat32Number rx, ry, rz; cmsFloat32Number c0, c1 = 0, c2 = 0, c3 = 0; cmsUInt32Number OutChan; const cmsInterpParams* p = pfloat->p; cmsUInt32Number TotalOut = p->nOutputs; cmsUInt32Number TotalPlusAlpha; const cmsFloat32Number* LutTable = (const cmsFloat32Number*)p->Table; cmsUInt32Number i, ii; const cmsUInt8Number* rin; const cmsUInt8Number* gin; const cmsUInt8Number* bin; const cmsUInt8Number* ain = NULL; cmsUInt8Number* out[cmsMAXCHANNELS]; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); cmsUInt32Number nchans, nalpha; size_t strideIn, strideOut; _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) nalpha = 0; strideIn = strideOut = 0; for (i = 0; i < LineCount; i++) { rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; if (nalpha) ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; TotalPlusAlpha = TotalOut; if (ain) TotalPlusAlpha++; for (ii = 0; ii < TotalPlusAlpha; ii++) out[ii] = (cmsUInt8Number*)Output + DestStartingOrder[ii] + strideOut; for (ii = 0; ii < PixelsPerLine; ii++) { r = fclamp(*(cmsFloat32Number*)rin); g = fclamp(*(cmsFloat32Number*)gin); b = fclamp(*(cmsFloat32Number*)bin); rin += SourceIncrements[0]; gin += SourceIncrements[1]; bin += SourceIncrements[2]; px = r * p->Domain[0]; py = g * p->Domain[1]; pz = b * p->Domain[2]; x0 = (int) floorf(px); rx = (px - (cmsFloat32Number)x0); y0 = (int) floorf(py); ry = (py - (cmsFloat32Number)y0); z0 = (int) floorf(pz); rz = (pz - (cmsFloat32Number)z0); X0 = p->opta[2] * x0; X1 = X0 + (r >= 1.0 ? 0 : p->opta[2]); Y0 = p->opta[1] * y0; Y1 = Y0 + (g >= 1.0 ? 0 : p->opta[1]); Z0 = p->opta[0] * z0; Z1 = Z0 + (b >= 1.0 ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { // These are the 6 Tetrahedral c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } *(cmsFloat32Number*)(out[OutChan]) = c0 + c1 * rx + c2 * ry + c3 * rz; out[OutChan] += DestIncrements[OutChan]; } if (ain) { *(cmsFloat32Number*)(out[TotalOut]) = *(cmsFloat32Number*)ain; ain += SourceIncrements[3]; out[TotalOut] += DestIncrements[TotalOut]; } } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } #undef DENS // -------------------------------------------------------------------------------------------------------------- cmsBool OptimizeCLUTRGBTransform(_cmsTransform2Fn* TransformFn, void** UserData, _cmsFreeUserDataFn* FreeDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* OriginalLut; int nGridPoints; cmsPipeline* OptimizedLUT = NULL; cmsStage* OptimizedCLUTmpe; FloatCLUTData* pfloat; cmsContext ContextID; _cmsStageCLutData* data; // For empty transforms, do nothing if (*Lut == NULL) return FALSE; // Check for floating point only if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; // Only on floats if (T_BYTES(*InputFormat) != sizeof(cmsFloat32Number) || T_BYTES(*OutputFormat) != sizeof(cmsFloat32Number)) return FALSE; // Input has to be RGB if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; OriginalLut = *Lut; ContextID = cmsGetPipelineContextID(OriginalLut); nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigRgbData, *dwFlags); // Create the result LUT OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 3, cmsPipelineOutputChannels(OriginalLut)); if (OptimizedLUT == NULL) goto Error; // Allocate the CLUT for result OptimizedCLUTmpe = cmsStageAllocCLutFloat(ContextID, nGridPoints, 3, cmsPipelineOutputChannels(OriginalLut), NULL); // Add the CLUT to the destination LUT cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedCLUTmpe); // If output is CMYK, add a conversion stage to get % if (T_COLORSPACE(*OutputFormat) == PT_CMYK) { static const cmsFloat64Number mat[] = { 100.0, 0, 0, 0, 0, 100.0, 0, 0, 0, 0, 100.0, 0, 0, 0, 0, 100.0 }; cmsStage* percent = cmsStageAllocMatrix(ContextID, 4, 4, mat, NULL); if (percent == NULL) goto Error; cmsPipelineInsertStage(OriginalLut, cmsAT_END, percent); } else // If output is Lab, add a conversion stage to get Lab values if (T_COLORSPACE(*OutputFormat) == PT_Lab) { static const cmsFloat64Number mat[] = { 100.0, 0, 0, 0, 255.0, 0, 0, 0, 255.0 }; static const cmsFloat64Number off[] = { 0, -128.0, -128.0 }; cmsStage* lab_fix = cmsStageAllocMatrix(ContextID, 3, 3, mat, off); if (lab_fix == NULL) goto Error; cmsPipelineInsertStage(OriginalLut, cmsAT_END, lab_fix); } else // If output is XYZ if (T_COLORSPACE(*OutputFormat) == PT_XYZ) { /** * XYZ is encoded in 1.15 fixed point, but in * out table it is on 0..1.0 range, so we need to adjust it. */ #define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) static const cmsFloat64Number mat[] = { MAX_ENCODEABLE_XYZ, 0, 0, 0, MAX_ENCODEABLE_XYZ, 0, 0, 0, MAX_ENCODEABLE_XYZ }; cmsStage* XYZ_fix = cmsStageAllocMatrix(ContextID, 3, 3, mat, NULL); if (XYZ_fix == NULL) goto Error; cmsPipelineInsertStage(OriginalLut, cmsAT_END, XYZ_fix); } else { if (T_COLORSPACE(*OutputFormat) != PT_GRAY && T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE; } // Resample the LUT if (!cmsStageSampleCLutFloat(OptimizedCLUTmpe, XFormSampler, (void*)OriginalLut, 0)) goto Error; if (T_COLORSPACE(*OutputFormat) == PT_CMYK) { cmsPipelineUnlinkStage(OriginalLut, cmsAT_END, NULL); } // Set the evaluator, copy parameters data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); pfloat = FloatCLUTAlloc(ContextID, data ->Params); if (pfloat == NULL) return FALSE; // And return the obtained LUT cmsPipelineFree(OriginalLut); *Lut = OptimizedLUT; *TransformFn = FloatCLUTEval; *UserData = pfloat; *FreeDataFn = _fast_float_free_user_data; *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; return TRUE; Error: if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); return FALSE; } lcms2-2.19.1/plugins/fast_float/src/.deps/0000755000175000017500000000000015176574562017263 5ustar martimartilcms2-2.19.1/plugins/fast_float/src/Makefile.in0000644000175000017500000006235315176574547020333 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms2_fast_float library # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/fast_float/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = liblcms2_fast_float_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(top_builddir)/src/liblcms2.la am_liblcms2_fast_float_la_OBJECTS = fast_8_curves.lo \ fast_8_matsh_sse.lo fast_8_matsh.lo fast_8_tethra.lo \ fast_16_tethra.lo fast_float_15bits.lo fast_float_15mats.lo \ fast_float_cmyk.lo fast_float_curves.lo fast_float_matsh.lo \ fast_float_separate.lo fast_float_sup.lo fast_float_tethra.lo \ fast_float_lab.lo liblcms2_fast_float_la_OBJECTS = $(am_liblcms2_fast_float_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = liblcms2_fast_float_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(liblcms2_fast_float_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/fast_16_tethra.Plo \ ./$(DEPDIR)/fast_8_curves.Plo ./$(DEPDIR)/fast_8_matsh.Plo \ ./$(DEPDIR)/fast_8_matsh_sse.Plo ./$(DEPDIR)/fast_8_tethra.Plo \ ./$(DEPDIR)/fast_float_15bits.Plo \ ./$(DEPDIR)/fast_float_15mats.Plo \ ./$(DEPDIR)/fast_float_cmyk.Plo \ ./$(DEPDIR)/fast_float_curves.Plo \ ./$(DEPDIR)/fast_float_lab.Plo \ ./$(DEPDIR)/fast_float_matsh.Plo \ ./$(DEPDIR)/fast_float_separate.Plo \ ./$(DEPDIR)/fast_float_sup.Plo \ ./$(DEPDIR)/fast_float_tethra.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblcms2_fast_float_la_SOURCES) DIST_SOURCES = $(liblcms2_fast_float_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = ${prefix}/include infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2_fast_float.la AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include liblcms2_fast_float_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_fast_float_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la liblcms2_fast_float_la_SOURCES = fast_8_curves.c fast_8_matsh_sse.c fast_8_matsh.c fast_8_tethra.c \ fast_16_tethra.c fast_float_15bits.c fast_float_15mats.c fast_float_cmyk.c fast_float_curves.c fast_float_matsh.c \ fast_float_separate.c fast_float_sup.c fast_float_tethra.c fast_float_lab.c fast_float_internal.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/fast_float/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/fast_float/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -$(am__rm_f) $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ echo rm -f $${locs}; \ $(am__rm_f) $${locs} liblcms2_fast_float.la: $(liblcms2_fast_float_la_OBJECTS) $(liblcms2_fast_float_la_DEPENDENCIES) $(EXTRA_liblcms2_fast_float_la_DEPENDENCIES) $(AM_V_CCLD)$(liblcms2_fast_float_la_LINK) -rpath $(libdir) $(liblcms2_fast_float_la_OBJECTS) $(liblcms2_fast_float_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_16_tethra.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_curves.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_matsh.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_matsh_sse.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_tethra.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_15bits.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_15mats.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_cmyk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_curves.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_lab.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_matsh.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_separate.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_sup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_tethra.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/fast_16_tethra.Plo -rm -f ./$(DEPDIR)/fast_8_curves.Plo -rm -f ./$(DEPDIR)/fast_8_matsh.Plo -rm -f ./$(DEPDIR)/fast_8_matsh_sse.Plo -rm -f ./$(DEPDIR)/fast_8_tethra.Plo -rm -f ./$(DEPDIR)/fast_float_15bits.Plo -rm -f ./$(DEPDIR)/fast_float_15mats.Plo -rm -f ./$(DEPDIR)/fast_float_cmyk.Plo -rm -f ./$(DEPDIR)/fast_float_curves.Plo -rm -f ./$(DEPDIR)/fast_float_lab.Plo -rm -f ./$(DEPDIR)/fast_float_matsh.Plo -rm -f ./$(DEPDIR)/fast_float_separate.Plo -rm -f ./$(DEPDIR)/fast_float_sup.Plo -rm -f ./$(DEPDIR)/fast_float_tethra.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/fast_16_tethra.Plo -rm -f ./$(DEPDIR)/fast_8_curves.Plo -rm -f ./$(DEPDIR)/fast_8_matsh.Plo -rm -f ./$(DEPDIR)/fast_8_matsh_sse.Plo -rm -f ./$(DEPDIR)/fast_8_tethra.Plo -rm -f ./$(DEPDIR)/fast_float_15bits.Plo -rm -f ./$(DEPDIR)/fast_float_15mats.Plo -rm -f ./$(DEPDIR)/fast_float_cmyk.Plo -rm -f ./$(DEPDIR)/fast_float_curves.Plo -rm -f ./$(DEPDIR)/fast_float_lab.Plo -rm -f ./$(DEPDIR)/fast_float_matsh.Plo -rm -f ./$(DEPDIR)/fast_float_separate.Plo -rm -f ./$(DEPDIR)/fast_float_sup.Plo -rm -f ./$(DEPDIR)/fast_float_tethra.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/fast_float/testbed/0000755000175000017500000000000015176574562017115 5ustar martimartilcms2-2.19.1/plugins/fast_float/testbed/demo_cmyk.c0000644000175000017500000001024715176573557021237 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2022 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "lcms2_fast_float.h" #include #include static void Fail(const char* frm, ...) { va_list args; va_start(args, frm); vprintf(frm, args); va_end(args); exit(1); } #define ALIGNED_SIZE(a,x) (((x)+((a) - 1)) & ~((a) - 1)) static void* make_image(size_t size_x, size_t size_y, cmsBool fill_rgb, cmsUInt32Number* stride_x) { cmsUInt32Number size_x_aligned = ALIGNED_SIZE(16, size_x); cmsUInt32Number line_size_in_bytes = size_x_aligned * sizeof(cmsUInt32Number); // RGBA cmsUInt8Number* ptr_image = (cmsUInt8Number*) calloc(size_y, line_size_in_bytes); if (ptr_image == NULL) Fail("Couldn't allocate memory for image"); if (fill_rgb) { size_t line; for (line = 0; line < size_y; line++) { cmsUInt32Number* ptr_line = (cmsUInt32Number*)(ptr_image + line_size_in_bytes * line); cmsUInt32Number argb = 0; int col; for (col = 0; col < size_x; col++) *ptr_line++ = argb++; } } *stride_x = line_size_in_bytes; return (void*) ptr_image; } #define SIZE_X 10000 #define SIZE_Y 10000 static cmsFloat64Number MPixSec(cmsFloat64Number diff) { cmsFloat64Number seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; return (SIZE_X * SIZE_Y) / (1024.0 * 1024.0 * seconds); } static cmsFloat64Number speed_test(void) { clock_t atime; cmsFloat64Number diff; cmsHPROFILE hProfileIn; cmsHPROFILE hProfileOut; cmsHTRANSFORM xform; void* image_in; void* image_out; cmsUInt32Number stride_rgb_x, stride_cmyk_x; hProfileIn = cmsOpenProfileFromFile("sRGB Color Space Profile.icm", "r"); hProfileOut = cmsOpenProfileFromFile("USWebCoatedSWOP.icc", "r"); if (hProfileIn == NULL || hProfileOut == NULL) Fail("Unable to open profiles"); xform = cmsCreateTransform(hProfileIn, TYPE_RGBA_8, hProfileOut, TYPE_CMYK_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hProfileIn); cmsCloseProfile(hProfileOut); image_in = make_image(SIZE_X, SIZE_Y, TRUE, &stride_rgb_x); image_out = make_image(SIZE_X, SIZE_Y, FALSE, &stride_cmyk_x); atime = clock(); cmsDoTransformLineStride(xform, image_in, image_out, SIZE_X, SIZE_Y, stride_rgb_x, stride_cmyk_x, 0, 0); diff = clock() - atime; free(image_in); free(image_out); cmsDeleteTransform(xform); return MPixSec(diff); } int main(void) { cmsFloat64Number without_plugin; cmsFloat64Number with_plugin; fprintf(stdout, "DEMO of littleCMS fast float plugin: RGBA -> CMYK in Megapixels per second\n"); fflush(stdout); // filling cache fprintf(stdout, "Wait CPU cache to stabilize: "); fflush(stdout); speed_test(); fprintf(stdout, "Ok\n"); fprintf(stdout, "Without plugin: "); fflush(stdout); without_plugin = speed_test(); fprintf(stdout, "%.2f\n", without_plugin); fflush(stdout); cmsPlugin(cmsFastFloatExtensions()); fprintf(stdout, "With plugin: "); fflush(stdout); with_plugin = speed_test(); fprintf(stdout, "%.2f\n", with_plugin); fflush(stdout); fprintf(stdout, "x %2.2f\n", (with_plugin/without_plugin)); fflush(stdout); return 0; }lcms2-2.19.1/plugins/fast_float/testbed/meson.build0000644000175000017500000000054115176573557021262 0ustar martimartifast_float_testbed_srcs = files( 'fast_float_testbed.c', ) fast_float_testbed = executable( 'fast_float_testbed', fast_float_testbed_srcs, dependencies: [liblcms2_fast_float_dep, liblcms2_dep, m_dep], c_args: cargs + ['-DPROFILES_DIR="@0@"'.format(profiles_dir / '')], ) test( 'fast_float_testbed', fast_float_testbed, timeout: 600, ) lcms2-2.19.1/plugins/fast_float/testbed/fast_float_testbed.c0000644000175000017500000026336415176573557023136 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "fast_float_internal.h" #include #include // On Visual Studio, use debug CRT #ifdef _MSC_VER # include "crtdbg.h" #endif #ifndef PROFILES_DIR #define PROFILES_DIR "../../test_profiles/" #endif // Some pixel representations typedef struct { cmsUInt8Number r, g, b; } Scanline_rgb8bits; typedef struct { cmsUInt8Number r, g, b, a; } Scanline_rgba8bits; typedef struct { cmsUInt8Number c, m, y, k; } Scanline_cmyk8bits; typedef struct { cmsUInt16Number r, g, b; } Scanline_rgb16bits; typedef struct { cmsUInt16Number r, g, b, a; } Scanline_rgba16bits; typedef struct { cmsUInt16Number c, m, y, k; } Scanline_cmyk16bits; typedef struct { cmsUInt16Number r, g, b; } Scanline_rgb15bits; typedef struct { cmsUInt16Number r, g, b, a; } Scanline_rgba15bits; typedef struct { cmsUInt16Number r, g, b, a; } Scanline_cmyk15bits; typedef struct { cmsFloat32Number r, g, b; } Scanline_rgbFloat; typedef struct { cmsFloat32Number r, g, b, a; } Scanline_rgbaFloat; typedef struct { cmsFloat32Number c, m, y, k; } Scanline_cmykFloat; typedef struct { cmsFloat32Number L, a, b; } Scanline_LabFloat; // 15 bit mode. <=> 8 bits mode #define FROM_8_TO_15(x8) (cmsUInt16Number) ((((cmsUInt64Number)x8 << 15)) / 0xFF) #define FROM_15_TO_8(x15) (cmsUInt8Number) (((cmsUInt64Number) x15 * 0xFF + 0x4000) >> 15) // Floating point accuracy for tests #define EPSILON_FLOAT_TESTS 0.005 // A flushed printf static void trace(const char* frm, ...) { va_list args; va_start(args, frm); vfprintf(stderr, frm, args); fflush(stderr); va_end(args); } // The callback function used by cmsSetLogErrorHandler() static void FatalErrorQuit(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { UNUSED_PARAMETER(ContextID); UNUSED_PARAMETER(ErrorCode); trace("** Fatal error: %s\n", Text); exit(1); } // Rise an error and exit static void Fail(const char* frm, ...) { char ReasonToFailBuffer[1024]; va_list args; va_start(args, frm); vsprintf(ReasonToFailBuffer, frm, args); FatalErrorQuit(0, 0, ReasonToFailBuffer); // unreachable va_end(args); } // Creates a fake profile that only has a curve. Used in several places static cmsHPROFILE CreateCurves(void) { cmsToneCurve* Gamma = cmsBuildGamma(0, 1.1); cmsToneCurve* Transfer[3]; cmsHPROFILE h; Transfer[0] = Transfer[1] = Transfer[2] = Gamma; h = cmsCreateLinearizationDeviceLink(cmsSigRgbData, Transfer); cmsFreeToneCurve(Gamma); return h; } // Check for a single 15 bit Photoshop-like formatter static void CheckSingleFormatter15(cmsContext id, cmsUInt32Number Type, const char* Text) { cmsUInt16Number Values[cmsMAXCHANNELS]; cmsUInt8Number Buffer[1024]; cmsFormatter f, b; cmsInt32Number i, j, nChannels, bytes; _xform_head info; UNUSED_PARAMETER(id); memset(&info, 0, sizeof(info)); info.OutputFormat = info.InputFormat = Type; // Get functions to go forth and back f = Formatter_15Bit_Factory(Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); b = Formatter_15Bit_Factory(Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); if (f.Fmt16 == NULL || b.Fmt16 == NULL) { Fail("no formatter for %s", Text); return; } nChannels = T_CHANNELS(Type); bytes = T_BYTES(Type); for (j = 0; j < 5; j++) { for (i = 0; i < nChannels; i++) { Values[i] = (cmsUInt16Number)(i + j) << 1; } b.Fmt16((struct _cmstransform_struct*) &info, Values, Buffer, 1); memset(Values, 0, sizeof(Values)); f.Fmt16((struct _cmstransform_struct*) &info, Values, Buffer, 1); for (i = 0; i < nChannels; i++) { if (Values[i] != ((i + j) << 1)) { Fail("%s failed", Text); return; } } } } #define C(a) CheckSingleFormatter15(0, a, #a) // Check for all 15 bits formatters static void CheckFormatters15(void) { C(TYPE_GRAY_15); C(TYPE_GRAY_15_REV); C(TYPE_GRAY_15_SE); C(TYPE_GRAYA_15); C(TYPE_GRAYA_15_SE); C(TYPE_GRAYA_15_PLANAR); C(TYPE_RGB_15); C(TYPE_RGB_15_PLANAR); C(TYPE_RGB_15_SE); C(TYPE_BGR_15); C(TYPE_BGR_15_PLANAR); C(TYPE_BGR_15_SE); C(TYPE_RGBA_15); C(TYPE_RGBA_15_PLANAR); C(TYPE_RGBA_15_SE); C(TYPE_ARGB_15); C(TYPE_ABGR_15); C(TYPE_ABGR_15_PLANAR); C(TYPE_ABGR_15_SE); C(TYPE_BGRA_15); C(TYPE_BGRA_15_SE); C(TYPE_YMC_15); C(TYPE_CMY_15); C(TYPE_CMY_15_PLANAR); C(TYPE_CMY_15_SE); C(TYPE_CMYK_15); C(TYPE_CMYK_15_REV); C(TYPE_CMYK_15_PLANAR); C(TYPE_CMYK_15_SE); C(TYPE_KYMC_15); C(TYPE_KYMC_15_SE); C(TYPE_KCMY_15); C(TYPE_KCMY_15_REV); C(TYPE_KCMY_15_SE); } #undef C static cmsInt32Number checkSingleComputeIncrements(cmsUInt32Number Format, cmsUInt32Number planeStride, cmsUInt32Number ExpectedChannels, cmsUInt32Number ExpectedAlpha, ...) { cmsUInt32Number nChannels, nAlpha, nTotal, i, rc = 0 ; cmsUInt32Number ComponentStartingOrder[cmsMAXCHANNELS], ComponentPointerIncrements[cmsMAXCHANNELS]; va_list args; va_start(args, ExpectedAlpha); _cmsComputeComponentIncrements(Format, planeStride, &nChannels, &nAlpha, ComponentStartingOrder, ComponentPointerIncrements); if (nChannels != ExpectedChannels) return 0; if (nAlpha != ExpectedAlpha) return 0; nTotal = nAlpha + nChannels; for (i = 0; i < nTotal; i++) { cmsUInt32Number so = va_arg(args, cmsUInt32Number); if (so != ComponentStartingOrder[i]) goto Error; } for (i = 0; i < nTotal; i++) { cmsUInt32Number so = va_arg(args, cmsUInt32Number); if (so != ComponentPointerIncrements[i]) goto Error; } // Success rc = 1; Error: va_end(args); return rc; } #define CHECK(frm, plane, chans, alpha, ...) if (!checkSingleComputeIncrements(frm, plane, chans, alpha, __VA_ARGS__)) { trace("Format failed!\n"); return 0; } // Validate the compute increments function cmsInt32Number CheckComputeIncrements(void) { CHECK(TYPE_GRAY_8, 0, 1, 0, /**/ 0, /**/ 1); CHECK(TYPE_GRAYA_8, 0, 1, 1, /**/ 0, 1, /**/ 2, 2); CHECK(TYPE_AGRAY_8, 0, 1, 1, /**/ 1, 0, /**/ 2, 2); CHECK(TYPE_GRAY_16, 0, 1, 0, /**/ 0, /**/ 2); CHECK(TYPE_GRAYA_16, 0, 1, 1, /**/ 0, 2, /**/ 4, 4); CHECK(TYPE_AGRAY_16, 0, 1, 1, /**/ 2, 0, /**/ 4, 4); CHECK(TYPE_GRAY_FLT, 0, 1, 0, /**/ 0, /**/ 4); CHECK(TYPE_GRAYA_FLT, 0, 1, 1, /**/ 0, 4, /**/ 8, 8); CHECK(TYPE_AGRAY_FLT, 0, 1, 1, /**/ 4, 0, /**/ 8, 8); CHECK(TYPE_GRAY_DBL, 0, 1, 0, /**/ 0, /**/ 8); CHECK(TYPE_AGRAY_DBL, 0, 1, 1, /**/ 8, 0, /**/ 16, 16); CHECK(TYPE_RGB_8, 0, 3, 0, /**/ 0, 1, 2, /**/ 3, 3, 3); CHECK(TYPE_RGBA_8, 0, 3, 1, /**/ 0, 1, 2, 3, /**/ 4, 4, 4, 4); CHECK(TYPE_ARGB_8, 0, 3, 1, /**/ 1, 2, 3, 0, /**/ 4, 4, 4, 4); CHECK(TYPE_RGB_16, 0, 3, 0, /**/ 0, 2, 4, /**/ 6, 6, 6); CHECK(TYPE_RGBA_16, 0, 3, 1, /**/ 0, 2, 4, 6, /**/ 8, 8, 8, 8); CHECK(TYPE_ARGB_16, 0, 3, 1, /**/ 2, 4, 6, 0, /**/ 8, 8, 8, 8); CHECK(TYPE_RGB_FLT, 0, 3, 0, /**/ 0, 4, 8, /**/ 12, 12, 12); CHECK(TYPE_RGBA_FLT, 0, 3, 1, /**/ 0, 4, 8, 12, /**/ 16, 16, 16, 16); CHECK(TYPE_ARGB_FLT, 0, 3, 1, /**/ 4, 8, 12, 0, /**/ 16, 16, 16, 16); CHECK(TYPE_BGR_8, 0, 3, 0, /**/ 2, 1, 0, /**/ 3, 3, 3); CHECK(TYPE_BGRA_8, 0, 3, 1, /**/ 2, 1, 0, 3, /**/ 4, 4, 4, 4); CHECK(TYPE_ABGR_8, 0, 3, 1, /**/ 3, 2, 1, 0, /**/ 4, 4, 4, 4); CHECK(TYPE_BGR_16, 0, 3, 0, /**/ 4, 2, 0, /**/ 6, 6, 6); CHECK(TYPE_BGRA_16, 0, 3, 1, /**/ 4, 2, 0, 6, /**/ 8, 8, 8, 8); CHECK(TYPE_ABGR_16, 0, 3, 1, /**/ 6, 4, 2, 0, /**/ 8, 8, 8, 8); CHECK(TYPE_BGR_FLT, 0, 3, 0, /**/ 8, 4, 0, /**/ 12, 12, 12); CHECK(TYPE_BGRA_FLT, 0, 3, 1, /**/ 8, 4, 0, 12, /**/ 16, 16, 16, 16); CHECK(TYPE_ABGR_FLT, 0, 3, 1, /**/ 12, 8, 4, 0, /**/ 16, 16, 16, 16); CHECK(TYPE_CMYK_8, 0, 4, 0, /**/ 0, 1, 2, 3, /**/ 4, 4, 4, 4); CHECK(TYPE_CMYKA_8, 0, 4, 1, /**/ 0, 1, 2, 3, 4, /**/ 5, 5, 5, 5, 5); CHECK(TYPE_ACMYK_8, 0, 4, 1, /**/ 1, 2, 3, 4, 0, /**/ 5, 5, 5, 5, 5); CHECK(TYPE_KYMC_8, 0, 4, 0, /**/ 3, 2, 1, 0, /**/ 4, 4, 4, 4); CHECK(TYPE_KYMCA_8, 0, 4, 1, /**/ 3, 2, 1, 0, 4, /**/ 5, 5, 5, 5, 5); CHECK(TYPE_AKYMC_8, 0, 4, 1, /**/ 4, 3, 2, 1, 0, /**/ 5, 5, 5, 5, 5); CHECK(TYPE_KCMY_8, 0, 4, 0, /**/ 1, 2, 3, 0, /**/ 4, 4, 4, 4); CHECK(TYPE_CMYK_16, 0, 4, 0, /**/ 0, 2, 4, 6, /**/ 8, 8, 8, 8); CHECK(TYPE_CMYKA_16, 0, 4, 1, /**/ 0, 2, 4, 6, 8, /**/ 10, 10, 10, 10, 10); CHECK(TYPE_ACMYK_16, 0, 4, 1, /**/ 2, 4, 6, 8, 0, /**/ 10, 10, 10, 10, 10); CHECK(TYPE_KYMC_16, 0, 4, 0, /**/ 6, 4, 2, 0, /**/ 8, 8, 8, 8); CHECK(TYPE_KYMCA_16, 0, 4, 1, /**/ 6, 4, 2, 0, 8, /**/ 10, 10, 10, 10, 10); CHECK(TYPE_AKYMC_16, 0, 4, 1, /**/ 8, 6, 4, 2, 0, /**/ 10, 10, 10, 10, 10); CHECK(TYPE_KCMY_16, 0, 4, 0, /**/ 2, 4, 6, 0, /**/ 8, 8, 8, 8); // Planar CHECK(TYPE_GRAYA_8_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 1, 1); CHECK(TYPE_AGRAY_8_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 1, 1); CHECK(TYPE_GRAYA_16_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 2, 2); CHECK(TYPE_AGRAY_16_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 2, 2); CHECK(TYPE_GRAYA_FLT_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 4, 4); CHECK(TYPE_AGRAY_FLT_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 4, 4); CHECK(TYPE_GRAYA_DBL_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 8, 8); CHECK(TYPE_AGRAY_DBL_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 8, 8); CHECK(TYPE_RGB_8_PLANAR, 100, 3, 0, /**/ 0, 100, 200, /**/ 1, 1, 1); CHECK(TYPE_RGBA_8_PLANAR, 100, 3, 1, /**/ 0, 100, 200, 300, /**/ 1, 1, 1, 1); CHECK(TYPE_ARGB_8_PLANAR, 100, 3, 1, /**/ 100, 200, 300, 0, /**/ 1, 1, 1, 1); CHECK(TYPE_BGR_8_PLANAR, 100, 3, 0, /**/ 200, 100, 0, /**/ 1, 1, 1); CHECK(TYPE_BGRA_8_PLANAR, 100, 3, 1, /**/ 200, 100, 0, 300, /**/ 1, 1, 1, 1); CHECK(TYPE_ABGR_8_PLANAR, 100, 3, 1, /**/ 300, 200, 100, 0, /**/ 1, 1, 1, 1); CHECK(TYPE_RGB_16_PLANAR, 100, 3, 0, /**/ 0, 100, 200, /**/ 2, 2, 2); CHECK(TYPE_RGBA_16_PLANAR, 100, 3, 1, /**/ 0, 100, 200, 300, /**/ 2, 2, 2, 2); CHECK(TYPE_ARGB_16_PLANAR, 100, 3, 1, /**/ 100, 200, 300, 0, /**/ 2, 2, 2, 2); CHECK(TYPE_BGR_16_PLANAR, 100, 3, 0, /**/ 200, 100, 0, /**/ 2, 2, 2); CHECK(TYPE_BGRA_16_PLANAR, 100, 3, 1, /**/ 200, 100, 0, 300, /**/ 2, 2, 2, 2); CHECK(TYPE_ABGR_16_PLANAR, 100, 3, 1, /**/ 300, 200, 100, 0, /**/ 2, 2, 2, 2); return 1; } // Check 15 bit mode accuracy static cmsBool Valid15(cmsUInt16Number a, cmsUInt8Number b) { return abs(FROM_15_TO_8(a) - b) <= 2; } // Check the test macros itselves static void Check15bitMacros(void) { int i; trace("Checking 15 bit <=> 8 bit macros..."); for (i = 0; i < 256; i++) { cmsUInt16Number n = FROM_8_TO_15(i); cmsUInt8Number m = FROM_15_TO_8(n); if (m != i) Fail("Failed on %d (->%d->%d)", i, n, m); } trace("ok\n"); } // Do an in-depth test by checking all RGB cube of 8 bits, going from profilein to profileout. // Results should be same except for 2 contone levels allowed for roundoff. Note 15 bits is more // precise than 8 bits and this is a source of discrepancies. Cache is disabled static void TryAllValues15(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { Scanline_rgb8bits* buffer8in; Scanline_rgb15bits* buffer15in; Scanline_rgb8bits* buffer8out; Scanline_rgb15bits* buffer15out; int r, g, b, j; cmsUInt32Number npixels = 256 * 256 * 256; // All RGB cube in 8 bits cmsHTRANSFORM xform15 = cmsCreateTransformTHR(0, hlcmsProfileIn, TYPE_RGB_15, hlcmsProfileOut, TYPE_RGB_15, Intent, cmsFLAGS_NOCACHE); cmsHTRANSFORM xform8 = cmsCreateTransformTHR(0, hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, Intent, cmsFLAGS_NOCACHE); // Transforms already created cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xform15 == NULL || xform8 == NULL) { Fail("NULL transforms on check for 15 bit conversions"); } // Since this is just a test, I will not check memory allocation... buffer8in = (Scanline_rgb8bits*)malloc(npixels * sizeof(Scanline_rgb8bits)); buffer15in = (Scanline_rgb15bits*)malloc(npixels * sizeof(Scanline_rgb15bits)); buffer8out = (Scanline_rgb8bits*)malloc(npixels * sizeof(Scanline_rgb8bits)); buffer15out = (Scanline_rgb15bits*)malloc(npixels * sizeof(Scanline_rgb15bits)); // Fill input values for 8 and 15 bits j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { buffer8in[j].r = (cmsUInt8Number)r; buffer8in[j].g = (cmsUInt8Number)g; buffer8in[j].b = (cmsUInt8Number)b; buffer15in[j].r = FROM_8_TO_15(r); buffer15in[j].g = FROM_8_TO_15(g); buffer15in[j].b = FROM_8_TO_15(b); j++; } cmsDoTransform(xform15, buffer15in, buffer15out, npixels); cmsDoTransform(xform8, buffer8in, buffer8out, npixels); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { // Check the results if (!Valid15(buffer15out[j].r, buffer8out[j].r) || !Valid15(buffer15out[j].g, buffer8out[j].g) || !Valid15(buffer15out[j].b, buffer8out[j].b)) Fail("Conversion failed at (%d %d %d) != (%d %d %d)", buffer8out[j].r, buffer8out[j].g, buffer8out[j].b, FROM_15_TO_8(buffer15out[j].r), FROM_15_TO_8(buffer15out[j].g), FROM_15_TO_8(buffer15out[j].b)); j++; } free(buffer8in); free(buffer15in); free(buffer8out); free(buffer15out); cmsDeleteTransform(xform15); cmsDeleteTransform(xform8); } // Convert some known values static void Check15bitsConversions(void) { Check15bitMacros(); trace("Checking accuracy of 15 bits on CLUT..."); TryAllValues15(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); trace("Ok\n"); trace("Checking accuracy of 15 bits on same profile ..."); TryAllValues15(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); trace("Ok\n"); trace("Checking accuracy of 15 bits on Matrix..."); TryAllValues15(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); trace("Ok\n"); trace("All 15 bits tests passed OK\n\n"); } // Next test checks results of optimized 16 bits versus raw 16 bits. static void TryAllValues16bits(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsContext Raw = cmsCreateContext(NULL, NULL); cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); Scanline_rgba16bits* bufferIn; Scanline_rgba16bits* bufferRawOut; Scanline_rgba16bits* bufferPluginOut; int r, g, b; int j; cmsUInt32Number npixels = 256 * 256 * 256; cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, cmsFLAGS_NOCACHE| cmsFLAGS_COPY_ALPHA); cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, cmsFLAGS_NOCACHE| cmsFLAGS_COPY_ALPHA); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xformRaw == NULL || xformPlugin == NULL) { Fail("NULL transforms on check float conversions"); } // Again, no checking on mem alloc because this is just a test bufferIn = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); bufferRawOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); bufferPluginOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); // Same input to both transforms j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { bufferIn[j].r = FROM_8_TO_16(0xf8); bufferIn[j].g = FROM_8_TO_16(0xf8); bufferIn[j].b = FROM_8_TO_16(0xf8); bufferIn[j].a = 0xffff; j++; } // Different transforms, different output buffers cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); // Lets compare results j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { if (bufferRawOut[j].r != bufferPluginOut[j].r || bufferRawOut[j].g != bufferPluginOut[j].g || bufferRawOut[j].b != bufferPluginOut[j].b || bufferRawOut[j].a != bufferPluginOut[j].a) Fail( "Conversion failed at [%x %x %x %x] (%x %x %x %x) != (%x %x %x %x)", bufferIn[j].r, bufferIn[j].g, bufferIn[j].b, bufferIn[j].a, bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); j++; } free(bufferIn); free(bufferRawOut); free(bufferPluginOut); cmsDeleteTransform(xformRaw); cmsDeleteTransform(xformPlugin); cmsDeleteContext(Plugin); cmsDeleteContext(Raw); } static void CheckAccuracy16Bits(void) { // CLUT should be as 16 bits or better trace("Checking accuracy of 16 bits CLUT..."); TryAllValues16bits(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); trace("All 16 bits tests passed OK\n\n"); } // Try values that are denormalized, not-a-number and out of range static void CheckUncommonValues(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { union { cmsFloat32Number subnormal; cmsUInt32Number Int; } sub_pos, sub_neg; Scanline_rgbFloat* bufferIn; Scanline_rgbFloat* bufferPluginOut; cmsUInt32Number i, npixels = 100; cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, 0); sub_pos.Int = 0x00000002; sub_neg.Int = 0x80000002; cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xformPlugin == NULL) { Fail("NULL transform on check uncommon values"); } bufferIn = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); bufferPluginOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); for (i = 0; i < npixels; i++) { bufferIn[i].r = i / 40.0f - 0.5f; bufferIn[i].g = i / 20.0f - 0.5f; bufferIn[i].b = i / 60.0f - 0.5f; } cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); bufferIn[0].r = NAN; bufferIn[0].g = NAN; bufferIn[0].b = NAN; bufferIn[1].r = INFINITY; bufferIn[1].g = INFINITY; bufferIn[1].b = INFINITY; bufferIn[2].r = sub_pos.subnormal; bufferIn[2].g = sub_pos.subnormal; bufferIn[2].b = sub_pos.subnormal; bufferIn[3].r = sub_neg.subnormal; bufferIn[3].g = sub_neg.subnormal; bufferIn[3].b = sub_neg.subnormal; cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, 4); free(bufferIn); free(bufferPluginOut); cmsDeleteTransform(xformPlugin); cmsDeleteContext(Plugin); } static void lab8toLab(cmsUInt8Number lab8[3], cmsCIELab* Lab) { cmsUInt16Number lab16[3]; lab16[0] = FROM_8_TO_16(lab8[0]); lab16[1] = FROM_8_TO_16(lab8[1]); lab16[2] = FROM_8_TO_16(lab8[2]); cmsLabEncoded2Float(Lab, lab16); } static void CheckToEncodedLab(void) { cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); cmsContext Raw = cmsCreateContext(NULL, NULL); cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_8, INTENT_PERCEPTUAL, 0); cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_8, INTENT_PERCEPTUAL, 0); int r, g, b; cmsCIELab Lab1, Lab2; cmsUInt8Number rgb[3], lab1[3], lab2[3]; double err; for (r=0; r < 256; r += 5) for (g = 0; g < 256; g += 5) for (b = 0; b < 256; b += 5) { rgb[0] = (cmsUInt8Number) r; rgb[1] = (cmsUInt8Number) g; rgb[2] = (cmsUInt8Number) b; cmsDoTransform(xform_plugin, rgb, lab1, 1); cmsDoTransform(xform, rgb, lab2, 1); lab8toLab(lab1, &Lab1); lab8toLab(lab2, &Lab2); err = cmsDeltaE(&Lab1, &Lab2); if (err > 0.1) { trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); } } cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); cmsDeleteContext(Raw); cmsDeleteContext(Plugin); } static void CheckToFloatLab(void) { cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); cmsContext Raw = cmsCreateContext(NULL, NULL); cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); int r, g, b; cmsCIELab Lab1, Lab2; cmsUInt8Number rgb[3]; double err; for (r = 0; r < 256; r += 10) for (g = 0; g < 256; g += 10) for (b = 0; b < 256; b += 10) { rgb[0] = (cmsUInt8Number)r; rgb[1] = (cmsUInt8Number)g; rgb[2] = (cmsUInt8Number)b; cmsDoTransform(xform_plugin, rgb, &Lab1, 1); cmsDoTransform(xform, rgb, &Lab2, 1); err = cmsDeltaE(&Lab1, &Lab2); if (err > 0.1) { trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); } } cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); cmsDeleteContext(Raw); cmsDeleteContext(Plugin); } static void CheckFloatToFloatLab(void) { cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); cmsContext Raw = cmsCreateContext(NULL, NULL); cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_FLT, hLab, TYPE_Lab_FLT, INTENT_PERCEPTUAL, 0); cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_FLT, hLab, TYPE_Lab_FLT, INTENT_PERCEPTUAL, 0); int r, g, b; cmsCIELab Lab1, Lab2; cmsFloat32Number rgb[3]; cmsFloat32Number Lab[3]; double err; for (r = 0; r < 256; r += 10) for (g = 0; g < 256; g += 10) for (b = 0; b < 256; b += 10) { rgb[0] = (cmsFloat32Number)r / 255.0f; rgb[1] = (cmsFloat32Number)g / 255.0f; rgb[2] = (cmsFloat32Number)b / 255.0f; cmsDoTransform(xform_plugin, rgb, Lab, 1); Lab1.L = Lab[0]; Lab1.a = Lab[1]; Lab1.b = Lab[2]; cmsDoTransform(xform, rgb, Lab, 1); Lab2.L = Lab[0]; Lab2.a = Lab[1]; Lab2.b = Lab[2]; err = cmsDeltaE(&Lab1, &Lab2); if (err > 0.5) { trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); } } cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); cmsDeleteContext(Raw); cmsDeleteContext(Plugin); } static void CheckToFloatXYZ(void) { cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); cmsContext Raw = cmsCreateContext(NULL, NULL); cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_8, hXYZ, TYPE_XYZ_DBL, INTENT_PERCEPTUAL, 0); cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_8, hXYZ, TYPE_XYZ_DBL, INTENT_PERCEPTUAL, 0); int r, g, b; cmsCIEXYZ XYZ1, XYZ2; cmsCIELab Lab1, Lab2; cmsUInt8Number rgb[3]; double err; for (r = 0; r < 256; r += 10) for (g = 0; g < 256; g += 10) for (b = 0; b < 256; b += 10) { rgb[0] = (cmsUInt8Number)r; rgb[1] = (cmsUInt8Number)g; rgb[2] = (cmsUInt8Number)b; cmsDoTransform(xform_plugin, rgb, &XYZ1, 1); cmsDoTransform(xform, rgb, &XYZ2, 1); cmsXYZ2Lab(NULL, &Lab1, &XYZ1); cmsXYZ2Lab(NULL, &Lab2, &XYZ2); err = cmsDeltaE(&Lab1, &Lab2); if (err > 0.1) { trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); } } cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); cmsCloseProfile(hsRGB); cmsCloseProfile(hXYZ); cmsDeleteContext(Raw); cmsDeleteContext(Plugin); } static void CheckFloatToFloatXYZ(void) { cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); cmsContext Raw = cmsCreateContext(NULL, NULL); cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_FLT, INTENT_PERCEPTUAL, 0); cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_FLT, INTENT_PERCEPTUAL, 0); int r, g, b; cmsCIEXYZ XYZ1, XYZ2; cmsCIELab Lab1, Lab2; cmsFloat32Number rgb[3]; cmsFloat32Number XYZ[3]; double err; for (r = 0; r < 256; r += 10) for (g = 0; g < 256; g += 10) for (b = 0; b < 256; b += 10) { rgb[0] = (cmsFloat32Number)r / 255.0f; rgb[1] = (cmsFloat32Number)g / 255.0f; rgb[2] = (cmsFloat32Number)b / 255.0f; cmsDoTransform(xform_plugin, rgb, XYZ, 1); XYZ1.X = XYZ[0]; XYZ1.Y = XYZ[1]; XYZ1.Z = XYZ[2]; cmsDoTransform(xform, rgb, XYZ, 1); XYZ2.X = XYZ[0]; XYZ2.Y = XYZ[1]; XYZ2.Z = XYZ[2]; cmsXYZ2Lab(NULL, &Lab1, &XYZ1); cmsXYZ2Lab(NULL, &Lab2, &XYZ2); err = cmsDeltaE(&Lab1, &Lab2); if (err > 0.5) { trace("Error on XYZ encoded (%f, %f, %f) <> (% f, % f, % f)\n", Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); } } cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); cmsCloseProfile(hsRGB); cmsCloseProfile(hXYZ); cmsDeleteContext(Raw); cmsDeleteContext(Plugin); } // -------------------------------------------------------------------------------------------------- // A C C U R A C Y C H E C K S // -------------------------------------------------------------------------------------------------- // Check result accuracy static cmsBool ValidFloat(cmsFloat32Number a, cmsFloat32Number b) { return fabsf(a-b) < EPSILON_FLOAT_TESTS; } // Do an in-depth test by checking all RGB cube of 8 bits, going from profilein to profileout. // Values with and without optimization are checked (different contexts, one with the plugin and another without) // Results should be same except for EPSILON_FLOAT_TESTS allowed for accuracy/speed tradeoff. Cache is disabled static void TryAllValuesFloat(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsContext Raw = cmsCreateContext(NULL, NULL); cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); Scanline_rgbFloat* bufferIn; Scanline_rgbFloat* bufferRawOut; Scanline_rgbFloat* bufferPluginOut; int r, g, b; int j; cmsUInt32Number npixels = 256 * 256 * 256; cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, cmsFLAGS_NOCACHE); cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xformRaw == NULL || xformPlugin == NULL) { Fail("NULL transforms on check float conversions"); } // Again, no checking on mem alloc because this is just a test bufferIn = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); bufferRawOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); bufferPluginOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); // Same input to both transforms j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { bufferIn[j].r = (cmsFloat32Number)r / 255.0f; bufferIn[j].g = (cmsFloat32Number)g / 255.0f; bufferIn[j].b = (cmsFloat32Number)b / 255.0f; j++; } // Different transforms, different output buffers cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); // Lets compare results j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { if (!ValidFloat(bufferRawOut[j].r, bufferPluginOut[j].r) || !ValidFloat(bufferRawOut[j].g, bufferPluginOut[j].g) || !ValidFloat(bufferRawOut[j].b, bufferPluginOut[j].b)) Fail("Conversion failed at (%f %f %f) != (%f %f %f)", bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b); j++; } free(bufferIn); free(bufferRawOut); free(bufferPluginOut); cmsDeleteTransform(xformRaw); cmsDeleteTransform(xformPlugin); cmsDeleteContext(Plugin); cmsDeleteContext(Raw); } static void TryAllValuesFloatAlpha(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent, cmsBool copyAlpha) { cmsContext Raw = cmsCreateContext(NULL, NULL); cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); Scanline_rgbaFloat* bufferIn; Scanline_rgbaFloat* bufferRawOut; Scanline_rgbaFloat* bufferPluginOut; int r, g, b; int j; cmsUInt32Number npixels = 256 * 256 * 256; cmsUInt32Number flags = cmsFLAGS_NOCACHE | ( copyAlpha? cmsFLAGS_COPY_ALPHA : 0); cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_FLT, hlcmsProfileOut, TYPE_RGBA_FLT, Intent, flags); cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_FLT, hlcmsProfileOut, TYPE_RGBA_FLT, Intent, flags); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xformRaw == NULL || xformPlugin == NULL) { Fail("NULL transforms on check float conversions"); } // Again, no checking on mem alloc because this is just a test bufferIn = (Scanline_rgbaFloat*)malloc(npixels * sizeof(Scanline_rgbaFloat)); bufferRawOut = (Scanline_rgbaFloat*)malloc(npixels * sizeof(Scanline_rgbaFloat)); bufferPluginOut = (Scanline_rgbaFloat*)malloc(npixels * sizeof(Scanline_rgbaFloat)); memset(bufferRawOut, 0, npixels * sizeof(Scanline_rgbaFloat)); memset(bufferPluginOut, 0, npixels * sizeof(Scanline_rgbaFloat)); // Same input to both transforms j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { bufferIn[j].r = (cmsFloat32Number)r / 255.0f; bufferIn[j].g = (cmsFloat32Number)g / 255.0f; bufferIn[j].b = (cmsFloat32Number)b / 255.0f; bufferIn[j].a = (cmsFloat32Number) 1.0f; j++; } // Different transforms, different output buffers cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); // Lets compare results j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { if (!ValidFloat(bufferRawOut[j].r, bufferPluginOut[j].r) || !ValidFloat(bufferRawOut[j].g, bufferPluginOut[j].g) || !ValidFloat(bufferRawOut[j].b, bufferPluginOut[j].b) || !ValidFloat(bufferRawOut[j].a, bufferPluginOut[j].a)) Fail("Conversion failed at (%f %f %f %f) != (%f %f %f %f)", bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); j++; } free(bufferIn); free(bufferRawOut); free(bufferPluginOut); cmsDeleteTransform(xformRaw); cmsDeleteTransform(xformPlugin); cmsDeleteContext(Plugin); cmsDeleteContext(Raw); } // Next test checks results of optimized floating point versus 16 bits. That is, converting the float to 16 bits, operating // in 16 bits and back to float. Results again should be in range of epsilon static cmsBool Valid16Float(cmsUInt16Number a, cmsFloat32Number b) { return fabs(((cmsFloat32Number)a / (cmsFloat32Number) 0xFFFF) - b) < EPSILON_FLOAT_TESTS; } // Do an in-depth test by checking all RGB cube of 8 bits, going from profilein to profileout. 16 bits temporary is used as reference static void TryAllValuesFloatVs16(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { Scanline_rgbFloat* bufferIn; Scanline_rgb16bits* bufferIn16; Scanline_rgbFloat* bufferFloatOut; Scanline_rgb16bits* buffer16Out; int r, g, b; int j; cmsUInt32Number npixels = 256 * 256 * 256; cmsHTRANSFORM xformRaw = cmsCreateTransform(hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, Intent, cmsFLAGS_NOCACHE); cmsHTRANSFORM xformPlugin = cmsCreateTransform(hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xformRaw == NULL || xformPlugin == NULL) { Fail("NULL transforms on check float vs 16 conversions"); } // Again, no checking on mem alloc because this is just a test bufferIn = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); bufferIn16 = (Scanline_rgb16bits*)malloc(npixels * sizeof(Scanline_rgb16bits)); bufferFloatOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); buffer16Out = (Scanline_rgb16bits*)malloc(npixels * sizeof(Scanline_rgb16bits)); // Fill two equivalent input buffers j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { bufferIn[j].r = (cmsFloat32Number)r / 255.0f; bufferIn[j].g = (cmsFloat32Number)g / 255.0f; bufferIn[j].b = (cmsFloat32Number)b / 255.0f; bufferIn16[j].r = FROM_8_TO_16(r); bufferIn16[j].g = FROM_8_TO_16(g); bufferIn16[j].b = FROM_8_TO_16(b); j++; } // Convert cmsDoTransform(xformRaw, bufferIn16, buffer16Out, npixels); cmsDoTransform(xformPlugin, bufferIn, bufferFloatOut, npixels); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { // Check for same values if (!Valid16Float(buffer16Out[j].r, bufferFloatOut[j].r) || !Valid16Float(buffer16Out[j].g, bufferFloatOut[j].g) || !Valid16Float(buffer16Out[j].b, bufferFloatOut[j].b)) Fail("Conversion failed at (%f %f %f) != (%f %f %f)", buffer16Out[j].r / 65535.0, buffer16Out[j].g / 65535.0, buffer16Out[j].b / 65535.0, bufferFloatOut[j].r, bufferFloatOut[j].g, bufferFloatOut[j].b); j++; } free(bufferIn16); free(buffer16Out); free(bufferIn); free(bufferFloatOut); cmsDeleteTransform(xformRaw); cmsDeleteTransform(xformPlugin); } // Check change format feature static void CheckChangeFormat(void) { cmsHPROFILE hsRGB, hLab; cmsHTRANSFORM xform; cmsUInt8Number rgb8[3] = { 10, 120, 40 }; cmsUInt16Number rgb16[3] = { 10* 257, 120*257, 40*257 }; cmsUInt16Number lab16_1[3], lab16_2[3]; trace("Checking change format feature..."); hsRGB = cmsCreate_sRGBProfile(); hLab = cmsCreateLab4Profile(NULL); xform = cmsCreateTransform(hsRGB, TYPE_RGB_16, hLab, TYPE_Lab_16, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); cmsDoTransform(xform, rgb16, lab16_1, 1); cmsChangeBuffersFormat(xform, TYPE_RGB_8, TYPE_Lab_16); cmsDoTransform(xform, rgb8, lab16_2, 1); cmsDeleteTransform(xform); if (memcmp(lab16_1, lab16_2, sizeof(lab16_1)) != 0) Fail("Change format failed!"); trace("Ok\n"); } static cmsBool ValidInt(cmsUInt16Number a, cmsUInt16Number b) { return abs(a - b) <= 32; } static void CheckLab2Roundtrip(void) { cmsHPROFILE hsRGB, hLab; cmsHTRANSFORM xform, xform2; cmsInt8Number* lab; cmsInt32Number Mb, j; cmsInt32Number r, g, b; Scanline_rgb8bits* In; Scanline_rgb8bits* Out; trace("Checking lab2 roundtrip..."); hsRGB = cmsCreate_sRGBProfile(); hLab = cmsCreateLab2Profile(NULL); xform = cmsCreateTransform(hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_BLACKPOINTCOMPENSATION); xform2 = cmsCreateTransform(hLab, TYPE_Lab_8, hsRGB, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_BLACKPOINTCOMPENSATION); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); Mb = 256 * 256 * 256 * sizeof(Scanline_rgb8bits); In = (Scanline_rgb8bits*)malloc(Mb); Out = (Scanline_rgb8bits*)malloc(Mb); lab = (cmsInt8Number*)malloc(256 * 256 * 256 * 3 * sizeof(cmsInt8Number)); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt8Number)r; In[j].g = (cmsUInt8Number)g; In[j].b = (cmsUInt8Number)b; j++; } cmsDoTransform(xform, In, lab, 256 * 256 * 256); cmsDoTransform(xform2, lab, Out, 256 * 256 * 256); cmsDeleteTransform(xform); cmsDeleteTransform(xform2); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { // Check for same values if (!ValidInt(In[j].r, Out[j].r) || !ValidInt(In[j].g, Out[j].g) || !ValidInt(In[j].b, Out[j].b)) Fail("Conversion failed at (%d %d %d) != (%d %d %d)", In[j].r, In[j].g, In[j].b, Out[j].r, Out[j].g, Out[j].b); j++; } free(In); free(Out); free(lab); trace("Ok\n"); } static void CheckAlphaDetect(void) { cmsHPROFILE hsRGB; cmsHTRANSFORM xform; cmsSetLogErrorHandler(NULL); hsRGB = cmsCreate_sRGBProfile(); xform = cmsCreateTransform(hsRGB, TYPE_RGB_FLT, hsRGB, TYPE_RGBA_FLT, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); cmsCloseProfile(hsRGB); if (xform != NULL) Fail("Copy alpha with mismatched channels should not succeed"); cmsSetLogErrorHandler(FatalErrorQuit); } // Convert some known values static void CheckConversionFloat(void) { trace("Check alpha detection."); CheckAlphaDetect(); trace("Ok\n"); trace("Crash test."); TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, FALSE); trace(".."); TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, TRUE); trace("Ok\n"); trace("Crash (II) test."); TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, FALSE); trace(".."); TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, TRUE); trace("Ok\n"); trace("Crash (III) test."); CheckUncommonValues(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); trace(".."); CheckUncommonValues(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); trace("Ok\n"); trace("Checking conversion to Lab..."); CheckToEncodedLab(); CheckToFloatLab(); CheckFloatToFloatLab(); trace("Ok\n"); trace("Checking conversion to XYZ..."); CheckToFloatXYZ(); CheckFloatToFloatXYZ(); trace("Ok\n"); // Matrix-shaper should be accurate trace("Checking accuracy on Matrix-shaper..."); TryAllValuesFloat(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); trace("Ok\n"); // CLUT should be as 16 bits or better trace("Checking accuracy of CLUT..."); TryAllValuesFloatVs16(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); trace("Ok\n"); // Same profile should give same values (we test both methods) trace("Checking accuracy on same profile ..."); TryAllValuesFloatVs16(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); TryAllValuesFloat(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); trace("Ok\n"); } static cmsBool ValidFloat2(cmsFloat32Number a, cmsFloat32Number b) { return fabsf(a - b) < 0.007; } static cmsFloat32Number distance(cmsFloat32Number rgb1[], cmsFloat32Number rgb2[]) { cmsFloat32Number dr = rgb2[0] - rgb1[0]; cmsFloat32Number dg = rgb2[1] - rgb1[1]; cmsFloat32Number db = rgb2[2] - rgb1[2]; return dr * dr + dg * dg + db * db; } static void CheckLab2RGB(void) { cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHPROFILE hRGB = cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"); cmsContext noPlugin = cmsCreateContext(0, 0); cmsHTRANSFORM hXformNoPlugin = cmsCreateTransformTHR(noPlugin, hLab, TYPE_Lab_FLT, hRGB, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); cmsHTRANSFORM hXformPlugin = cmsCreateTransformTHR(0, hLab, TYPE_Lab_FLT, hRGB, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); cmsFloat32Number Lab[3], RGB[3], RGB2[3]; cmsFloat32Number maxInside = 0, maxOutside = 0, L, a, b; trace("Checking Lab -> RGB..."); cmsCloseProfile(hLab); cmsCloseProfile(hRGB); for (L = 4; L <= 100; L++) { for (a = -30; a < +30; a++) for (b = -30; b < +30; b++) { cmsFloat32Number d; Lab[0] = L; Lab[1] = a; Lab[2] = b; cmsDoTransform(hXformNoPlugin, Lab, RGB, 1); cmsDoTransform(hXformPlugin, Lab, RGB2, 1); d = distance(RGB, RGB2); if (d > maxInside) maxInside = d; } } for (L = 1; L <= 100; L += 5) { for (a = -100; a < +100; a += 5) for (b = -100; b < +100; b += 5) { cmsFloat32Number d; Lab[0] = L; Lab[1] = a; Lab[2] = b; cmsDoTransform(hXformNoPlugin, Lab, RGB, 1); cmsDoTransform(hXformPlugin, Lab, RGB2, 1); d = distance(RGB, RGB2); if (d > maxOutside) maxOutside = d; } } trace("Max distance: Inside gamut %f, Outside gamut %f\n", sqrtf(maxInside), sqrtf(maxOutside)); cmsDeleteTransform(hXformNoPlugin); cmsDeleteTransform(hXformPlugin); cmsDeleteContext(noPlugin); } static void CheckSoftProofing(void) { cmsHPROFILE hRGB1 = cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"); cmsHPROFILE hRGB2 = cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"); cmsContext noPlugin = cmsCreateContext(0, 0); cmsHTRANSFORM hXformNoPlugin = cmsCreateProofingTransformTHR(noPlugin, hRGB1, TYPE_RGB_FLT, hRGB1, TYPE_RGB_FLT, hRGB2, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK | cmsFLAGS_SOFTPROOFING); cmsHTRANSFORM hXformPlugin = cmsCreateProofingTransformTHR(0, hRGB1, TYPE_RGB_FLT, hRGB1, TYPE_RGB_FLT, hRGB2, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK | cmsFLAGS_SOFTPROOFING); cmsUInt32Number Mb, j, r, g, b; Scanline_rgbFloat* In; Scanline_rgbFloat* Out1, *Out2; trace("Checking soft proofing and gamut check ..."); cmsCloseProfile(hRGB1); cmsCloseProfile(hRGB2); Mb = 256 * 256 * 256 * sizeof(Scanline_rgbFloat); In = (Scanline_rgbFloat*)malloc(Mb); Out1 = (Scanline_rgbFloat*)malloc(Mb); Out2 = (Scanline_rgbFloat*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsFloat32Number)r / 255.0f; In[j].g = (cmsFloat32Number)g / 255.0f; In[j].b = (cmsFloat32Number)b / 255.0f; j++; } cmsDoTransform(hXformNoPlugin, In, Out1, 256 * 256 * 256); cmsDoTransform(hXformPlugin, In, Out2, 256 * 256 * 256); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { // Check for same values if (!ValidFloat(Out1[j].r, Out2[j].r) || !ValidFloat(Out1[j].g, Out2[j].g) || !ValidFloat(Out1[j].b, Out2[j].b)) Fail("Conversion failed at (%f %f %f) != (%f %f %f)", Out1[j].r, Out1[j].g, Out1[j].b, Out2[j].r, Out2[j].g, Out2[j].b); j++; } free(In); free(Out1); free(Out2); cmsDeleteTransform(hXformNoPlugin); cmsDeleteTransform(hXformPlugin); cmsDeleteContext(noPlugin); trace("Ok\n"); } static void CheckPremultiplied(void) { uint8_t BGRA8[4] = { 255, 192, 160, 128 }; uint8_t bgrA8_1[4], bgrA8_2[4]; cmsHPROFILE srgb1 = cmsCreate_sRGBProfile(); cmsHPROFILE srgb2 = cmsCreate_sRGBProfile(); cmsContext noPlugin = cmsCreateContext(0, 0); cmsHTRANSFORM xform1 = cmsCreateTransformTHR(noPlugin, srgb1, TYPE_BGRA_8, srgb2, TYPE_BGRA_8_PREMUL, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); cmsHTRANSFORM xform2 = cmsCreateTransformTHR(0, srgb1, TYPE_BGRA_8, srgb2, TYPE_BGRA_8_PREMUL, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); int i; cmsCloseProfile(srgb1); cmsCloseProfile(srgb2); cmsDoTransform(xform1, BGRA8, bgrA8_1, 1); cmsDoTransform(xform2, BGRA8, bgrA8_2, 1); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); for (i = 0; i < 4; i++) { if (bgrA8_1[i] != bgrA8_2[i]) Fail("Premultiplied failed at (%d %d %d) != (%d %d %d)", bgrA8_1[0], bgrA8_1[1], bgrA8_1[2], bgrA8_2[0], bgrA8_2[1], bgrA8_2[2]); } } // -------------------------------------------------------------------------------------------------- // P E R F O R M A N C E C H E C K S // -------------------------------------------------------------------------------------------------- static cmsFloat64Number MPixSec(cmsFloat64Number diff) { cmsFloat64Number seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; return (256.0 * 256.0 * 256.0) / (1024.0*1024.0*seconds); } typedef cmsFloat64Number(*perf_fn)(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut); static void PerformanceHeader(void) { trace(" MPixel/sec. MByte/sec.\n"); } static cmsHPROFILE loadProfile(const char* name) { if (*name == '*') { if (strcmp(name, "*lab") == 0) { return cmsCreateLab4Profile(NULL); } else if (strcmp(name, "*xyz") == 0) { return cmsCreateXYZProfile(); } else if (strcmp(name, "*curves") == 0) { return CreateCurves(); } else Fail("Unknown builtin '%s'", name); } return cmsOpenProfileFromFile(name, "r"); } static cmsFloat64Number Performance(const char* Title, perf_fn fn, cmsContext ct, const char* inICC, const char* outICC, size_t sz, cmsFloat64Number prev) { cmsHPROFILE hlcmsProfileIn = loadProfile(inICC); cmsHPROFILE hlcmsProfileOut = loadProfile(outICC); cmsFloat64Number n = fn(ct, hlcmsProfileIn, hlcmsProfileOut); trace("%-30s: ", Title); fflush(stdout); trace("%-12.2f %-12.2f", n, n * sz); if (prev > 0.0) { cmsFloat64Number imp = n / prev; if (imp > 1) trace(" (x %-2.1f)", imp); } trace("\n"); fflush(stdout); return n; } static void ComparativeCt(cmsContext ct1, cmsContext ct2, const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) { cmsHPROFILE hlcmsProfileIn; cmsHPROFILE hlcmsProfileOut; if (inICC == NULL) hlcmsProfileIn = CreateCurves(); else hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); if (outICC == NULL) hlcmsProfileOut = CreateCurves(); else hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); cmsFloat64Number n1 = fn1(ct1, hlcmsProfileIn, hlcmsProfileOut); if (inICC == NULL) hlcmsProfileIn = CreateCurves(); else hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); if (outICC == NULL) hlcmsProfileOut = CreateCurves(); else hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); cmsFloat64Number n2 = fn2(ct2, hlcmsProfileIn, hlcmsProfileOut); trace("%-30s: ", Title); fflush(stdout); trace("%-12.2f %-12.2f\n", n1, n2); } static void Comparative(const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) { ComparativeCt(0, 0, Title, fn1, fn2, inICC, outICC); } // The worst case is used, no cache and all rgb combinations static cmsFloat64Number SpeedTest8bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb8bits *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgb8bits); In = (Scanline_rgb8bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt8Number)r; In[j].g = (cmsUInt8Number)g; In[j].b = (cmsUInt8Number)b; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest8bitsRGBA(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgba8bits *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgba8bits); In = (Scanline_rgba8bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt8Number)r; In[j].g = (cmsUInt8Number)g; In[j].b = (cmsUInt8Number)b; In[j].a = 0; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } // The worst case is used, no cache and all rgb combinations static cmsFloat64Number SpeedTest15bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb15bits *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_15, hlcmsProfileOut, TYPE_RGB_15, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgb15bits); In = (Scanline_rgb15bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt16Number)r; In[j].g = (cmsUInt16Number)g; In[j].b = (cmsUInt16Number)b; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest15bitsRGBA(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgba15bits *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_15, hlcmsProfileOut, TYPE_RGBA_15, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgba15bits); In = (Scanline_rgba15bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt16Number)r; In[j].g = (cmsUInt16Number)g; In[j].b = (cmsUInt16Number)b; In[j].a = 0; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest15bitsCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_cmyk15bits *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_15, hlcmsProfileOut, TYPE_CMYK_15, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_cmyk15bits); In = (Scanline_cmyk15bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt16Number)r; In[j].g = (cmsUInt16Number)g; In[j].b = (cmsUInt16Number)b; In[j].a = (cmsUInt16Number)0; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } // The worst case is used, no cache and all rgb combinations static cmsFloat64Number SpeedTest16bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb16bits *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgb16bits); In = (Scanline_rgb16bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt16Number)FROM_8_TO_16(r); In[j].g = (cmsUInt16Number)FROM_8_TO_16(g); In[j].b = (cmsUInt16Number)FROM_8_TO_16(b); j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest16bitsCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_cmyk16bits* In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_16, hlcmsProfileOut, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_cmyk16bits); In = (Scanline_cmyk16bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].c = (cmsUInt16Number)r; In[j].m = (cmsUInt16Number)g; In[j].y = (cmsUInt16Number)b; In[j].k = (cmsUInt16Number)r; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static void SpeedTest8(void) { cmsContext noPlugin = cmsCreateContext(0, 0); cmsFloat64Number t[10]; trace("\n\n"); trace("P E R F O R M A N C E T E S T S 8 B I T S (D E F A U L T)\n"); trace("==============================================================\n\n"); fflush(stdout); PerformanceHeader(); t[0] = Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), 0); t[1] = Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); t[2] = Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); t[3] = Performance("8 bits on curves ", SpeedTest8bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb8bits), 0); // Note that context 0 has the plug-in installed trace("\n\n"); trace("P E R F O R M A N C E T E S T S 8 B I T S (P L U G I N)\n"); trace("===========================================================\n\n"); fflush(stdout); PerformanceHeader(); Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), t[0]); Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[1]); Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[2]); Performance("8 bits on curves ", SpeedTest8bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb8bits), t[3]); cmsDeleteContext(noPlugin); } static void SpeedTest15(void) { trace("\n\nP E R F O R M A N C E T E S T S 1 5 B I T S (P L U G I N)\n"); trace( "===============================================================\n\n"); PerformanceHeader(); Performance("15 bits on CLUT profiles ", SpeedTest15bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb15bits), 0); Performance("15 bits on Matrix-Shaper profiles", SpeedTest15bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb15bits), 0); Performance("15 bits on same Matrix-Shaper ", SpeedTest15bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb15bits), 0); Performance("15 bits on curves ", SpeedTest15bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb15bits), 0); Performance("15 bits on CMYK CLUT profiles ", SpeedTest15bitsCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_rgba15bits), 0); } static void SpeedTest16(void) { cmsContext noPlugin = cmsCreateContext(0, 0); trace("\n\n"); trace("P E R F O R M A N C E T E S T S 1 6 B I T S (D E F A U L T)\n"); trace("=================================================================\n\n"); PerformanceHeader(); Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on curves ", SpeedTest16bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, noPlugin, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), 0); trace("\n\n"); trace("P E R F O R M A N C E T E S T S 1 6 B I T S (P L U G I N)\n"); trace("===============================================================\n\n"); PerformanceHeader(); Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on curves ", SpeedTest16bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb16bits), 0); Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), 0); cmsDeleteContext(noPlugin); } // The worst case is used, no cache and all rgb combinations static cmsFloat64Number SpeedTestFloatRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; void *In; cmsUInt32Number size, Mb; cmsUInt32Number inFormatter=0, outFormatter=0; cmsFloat64Number seconds; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); switch (cmsGetColorSpace(hlcmsProfileIn)) { case cmsSigRgbData: inFormatter = TYPE_RGB_FLT; break; case cmsSigLabData: inFormatter = TYPE_Lab_FLT; break; default: Fail("Invalid colorspace"); } switch (cmsGetColorSpace(hlcmsProfileOut)) { case cmsSigRgbData: outFormatter = TYPE_RGB_FLT; break; case cmsSigLabData: outFormatter = TYPE_Lab_FLT; break; case cmsSigXYZData: outFormatter = TYPE_XYZ_FLT; break; default: Fail("Invalid colorspace"); } hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, inFormatter, hlcmsProfileOut, outFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); j = 0; if (inFormatter == TYPE_RGB_FLT) { cmsInt32Number r, g, b; Scanline_rgbFloat* fill; size = 256 * 256 * 256; Mb = size * sizeof(Scanline_rgbFloat); In = malloc(Mb); fill = (Scanline_rgbFloat*)In; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { fill[j].r = (cmsFloat32Number)r / 255.0f; fill[j].g = (cmsFloat32Number)g / 255.0f; fill[j].b = (cmsFloat32Number)b / 255.0f; j++; } } else { cmsFloat32Number L, a, b; Scanline_LabFloat* fill; size = 100 * 256 * 256; Mb = size * sizeof(Scanline_LabFloat); In = malloc(Mb); fill = (Scanline_LabFloat*)In; for (L = 0; L < 100; L++) for (a = -127.0; a < 127.0; a++) for (b = -127.0; b < +127.0; b++) { fill[j].L = L; fill[j].a = a; fill[j].b = b; j++; } } atime = clock(); cmsDoTransform(hlcmsxform, In, In, size); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; return ((cmsFloat64Number)size) / (1024.0 * 1024.0 * seconds); } static cmsFloat64Number SpeedTestFloatCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number c, m, y, k, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_cmykFloat* In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_FLT, hlcmsProfileOut, TYPE_CMYK_FLT, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 64 * 64 * 64 * 64 * sizeof(Scanline_cmykFloat); In = (Scanline_cmykFloat*)malloc(Mb); j = 0; for (c = 0; c < 256; c += 4) for (m = 0; m < 256; m += 4) for (y = 0; y < 256; y += 4) for (k = 0; k < 256; k += 4) { In[j].c = (cmsFloat32Number)c / 255.0f; In[j].m = (cmsFloat32Number)m / 255.0f; In[j].y = (cmsFloat32Number)y / 255.0f; In[j].k = (cmsFloat32Number)k / 255.0f; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, 64 * 64 * 64 * 64); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTestFloatLab(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; void* In; cmsUInt32Number size, Mb; cmsUInt32Number outFormatter = 0; cmsFloat64Number seconds; cmsFloat32Number L, a, b; Scanline_LabFloat* fill; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); if (cmsGetColorSpace(hlcmsProfileIn) != cmsSigLabData) { Fail("Invalid colorspace"); } switch (cmsGetColorSpace(hlcmsProfileOut)) { case cmsSigRgbData: outFormatter = TYPE_RGB_FLT; break; case cmsSigLabData: outFormatter = TYPE_Lab_FLT; break; case cmsSigXYZData: outFormatter = TYPE_XYZ_FLT; break; default: Fail("Invalid colorspace"); } hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_Lab_FLT, hlcmsProfileOut, outFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); j = 0; size = 100 * 256 * 256; Mb = size * sizeof(Scanline_LabFloat); In = malloc(Mb); fill = (Scanline_LabFloat*)In; for (L = 0; L < 100; L++) for (a = -127.0; a < 127.0; a++) for (b = -127.0; b < +127.0; b++) { fill[j].L = L; fill[j].a = a; fill[j].b = b; j++; } atime = clock(); cmsDoTransform(hlcmsxform, In, In, size); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; return ((cmsFloat64Number)size) / (1024.0 * 1024.0 * seconds); } static void SpeedTestFloat(void) { cmsContext noPlugin = cmsCreateContext(0, 0); cmsFloat64Number t[10] = { 0 }; trace("\n\n"); trace("P E R F O R M A N C E T E S T S F L O A T (D E F A U L T)\n"); trace("==============================================================\n\n"); fflush(stdout); PerformanceHeader(); t[0] = Performance("Floating point on CLUT profiles ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgbFloat), 0); t[1] = Performance("Floating point on Matrix-Shaper ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), 0); t[2] = Performance("Floating point on same MatrixSh ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), 0); t[3] = Performance("Floating point on curves ", SpeedTestFloatRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgbFloat), 0); t[4] = Performance("Floating point on RGB->Lab ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test5.icc", "*lab", sizeof(Scanline_rgbFloat), 0); t[5] = Performance("Floating point on RGB->XYZ ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test3.icc", "*xyz", sizeof(Scanline_rgbFloat), 0); t[6] = Performance("Floating point on CMYK->CMYK ", SpeedTestFloatCMYK, noPlugin, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc",sizeof(Scanline_cmykFloat), 0); t[7] = Performance("Floating point on Lab->RGB ", SpeedTestFloatLab, noPlugin, "*lab", PROFILES_DIR "test3.icc", sizeof(Scanline_LabFloat), 0); // Note that context 0 has the plug-in installed trace("\n\n"); trace("P E R F O R M A N C E T E S T S F L O A T (P L U G I N)\n"); trace("===========================================================\n\n"); fflush(stdout); PerformanceHeader(); Performance("Floating point on CLUT profiles ", SpeedTestFloatRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgbFloat), t[0]); Performance("Floating point on Matrix-Shaper ", SpeedTestFloatRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), t[1]); Performance("Floating point on same MatrixSh ", SpeedTestFloatRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), t[2]); Performance("Floating point on curves ", SpeedTestFloatRGB, 0, "*curves", "*curves", sizeof(Scanline_rgbFloat), t[3]); Performance("Floating point on RGB->Lab ", SpeedTestFloatRGB, 0, PROFILES_DIR "test5.icc", "*lab", sizeof(Scanline_rgbFloat), t[4]); Performance("Floating point on RGB->XYZ ", SpeedTestFloatRGB, 0, PROFILES_DIR "test3.icc", "*xyz", sizeof(Scanline_rgbFloat), t[5]); Performance("Floating point on CMYK->CMYK ", SpeedTestFloatCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmykFloat), t[6]); Performance("Floating point on Lab->RGB ", SpeedTestFloatLab, 0, "*lab", PROFILES_DIR "test3.icc", sizeof(Scanline_LabFloat), t[7]); cmsDeleteContext(noPlugin); } static cmsFloat64Number SpeedTestFloatByUsing16BitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM xform16; Scanline_rgbFloat *In; Scanline_rgb16bits *tmp16; cmsUInt32Number MbFloat, Mb16; UNUSED_PARAMETER(ct); if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); xform16 = cmsCreateTransformTHR(0, hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); MbFloat = 256 * 256 * 256 * sizeof(Scanline_rgbFloat); Mb16 = 256 * 256 * 256 * sizeof(Scanline_rgb16bits); In = (Scanline_rgbFloat*)malloc(MbFloat); tmp16 = (Scanline_rgb16bits*)malloc(Mb16); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsFloat32Number)r / 255.0f; In[j].g = (cmsFloat32Number)g / 255.0f; In[j].b = (cmsFloat32Number)b / 255.0f; j++; } atime = clock(); for (j = 0; j < 256 * 256 * 256; j++) { tmp16[j].r = (cmsUInt16Number)floor(In[j].r * 65535.0 + 0.5); tmp16[j].g = (cmsUInt16Number)floor(In[j].g * 65535.0 + 0.5); tmp16[j].b = (cmsUInt16Number)floor(In[j].b * 65535.0 + 0.5); j++; } cmsDoTransform(xform16, tmp16, tmp16, 256 * 256 * 256); for (j = 0; j < 256 * 256 * 256; j++) { In[j].r = (cmsFloat32Number) (tmp16[j].r / 65535.0 ); In[j].g = (cmsFloat32Number) (tmp16[j].g / 65535.0); In[j].b = (cmsFloat32Number) (tmp16[j].b / 65535.0); j++; } diff = clock() - atime; free(In); free(tmp16); cmsDeleteTransform(xform16); return MPixSec(diff); } static void ComparativeFloatVs16bits(void) { trace("\n\n"); trace("C O M P A R A T I V E converting to 16 bit vs. using float plug-in.\n"); trace(" values given in MegaPixels per second.\n"); trace("====================================================================\n"); trace(" 16 bits tmp. Float plugin\n"); fflush(stdout); Comparative("Floating point on CLUT profiles ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); Comparative("Floating point on Matrix-Shaper ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc"); Comparative("Floating point on same MatrixSh ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc"); Comparative("Floating point on curves ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, NULL, NULL); } typedef struct { Scanline_rgba8bits pixels[256][256]; cmsUInt8Number padding[4]; } padded_line; typedef struct { padded_line line[256]; } big_bitmap; static cmsFloat64Number SpeedTest8bitDoTransform(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; big_bitmap* In; big_bitmap* Out; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); // Our test bitmap is 256 x 256 padded lines Mb = sizeof(big_bitmap); In = (big_bitmap*)malloc(Mb); Out = (big_bitmap*)malloc(Mb); for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In->line[r].pixels[g][b].r = (cmsUInt8Number)r; In->line[r].pixels[g][b].g = (cmsUInt8Number)g; In->line[r].pixels[g][b].b = (cmsUInt8Number)b; In->line[r].pixels[g][b].a = 0; } atime = clock(); for (j = 0; j < 256; j++) { cmsDoTransform(hlcmsxform, In->line[j].pixels, Out->line[j].pixels, 256 * 256); } diff = clock() - atime; free(In); free(Out); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest8bitLineStride(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; big_bitmap* In; big_bitmap* Out; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); // Our test bitmap is 256 x 256 padded lines Mb = sizeof(big_bitmap); In = (big_bitmap*)malloc(Mb); Out = (big_bitmap*)malloc(Mb); for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In->line[r].pixels[g][b].r = (cmsUInt8Number)r; In->line[r].pixels[g][b].g = (cmsUInt8Number)g; In->line[r].pixels[g][b].b = (cmsUInt8Number)b; In->line[r].pixels[g][b].a = 0; } atime = clock(); cmsDoTransformLineStride(hlcmsxform, In, Out, 256*256, 256, sizeof(padded_line), sizeof(padded_line), 0, 0); diff = clock() - atime; free(In); free(Out); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static void ComparativeLineStride8bits(void) { cmsContext NoPlugin, Plugin; trace("\n\n"); trace("C O M P A R A T I V E cmsDoTransform() vs. cmsDoTransformLineStride()\n"); trace(" values given in MegaPixels per second.\n"); trace("====================================================================\n"); fflush(stdout); NoPlugin = cmsCreateContext(NULL, NULL); Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); ComparativeCt(NoPlugin, Plugin, "CLUT profiles ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); ComparativeCt(NoPlugin, Plugin, "CLUT 16 bits ", SpeedTest16bitsRGB, SpeedTest16bitsRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); ComparativeCt(NoPlugin, Plugin, "Matrix-Shaper ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc"); ComparativeCt(NoPlugin, Plugin, "same MatrixSh ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc"); ComparativeCt(NoPlugin, Plugin, "curves ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, NULL, NULL); cmsDeleteContext(Plugin); cmsDeleteContext(NoPlugin); } static void TestGrayTransformPerformance() { cmsInt32Number j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; float *In; cmsInt32Number pixels; cmsUInt32Number Mb; cmsToneCurve* gamma18; cmsToneCurve* gamma22; cmsHPROFILE hlcmsProfileIn; cmsHPROFILE hlcmsProfileOut; gamma18 = cmsBuildGamma(0, 1.8); gamma22 = cmsBuildGamma(0, 2.2); hlcmsProfileIn = cmsCreateGrayProfile(NULL, gamma18); hlcmsProfileOut = cmsCreateGrayProfile(NULL, gamma22); cmsFreeToneCurve(gamma18); cmsFreeToneCurve(gamma22); hlcmsxform = cmsCreateTransform(hlcmsProfileIn, TYPE_GRAY_FLT | EXTRA_SH(1), hlcmsProfileOut, TYPE_GRAY_FLT|EXTRA_SH(1), INTENT_PERCEPTUAL, 0); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); pixels = 256 * 256 * 256; Mb = pixels* 2*sizeof(float); In = (float*) malloc(Mb); for (j = 0; j < pixels*2; j++) In[j] = (j % 256) / 255.0f; atime = clock(); cmsDoTransform(hlcmsxform, In, In, pixels); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); trace("Gray conversion using two gray profiles\t %-12.2f MPixels/Sec.\n", MPixSec(diff)); } static void TestGrayTransformPerformance1() { cmsInt32Number j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; float *In; cmsInt32Number pixels; cmsUInt32Number Mb; cmsToneCurve* gamma18; cmsToneCurve* gamma22; cmsHPROFILE hlcmsProfileIn; cmsHPROFILE hlcmsProfileOut; gamma18 = cmsBuildGamma(0, 1.8); gamma22 = cmsBuildGamma(0, 1./2.2); hlcmsProfileIn = cmsCreateLinearizationDeviceLink(cmsSigGrayData, &gamma18); hlcmsProfileOut = cmsCreateLinearizationDeviceLink(cmsSigGrayData, &gamma22); cmsFreeToneCurve(gamma18); cmsFreeToneCurve(gamma22); hlcmsxform = cmsCreateTransform(hlcmsProfileIn, TYPE_GRAY_FLT, hlcmsProfileOut, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); pixels = 256 * 256 * 256; Mb = pixels* sizeof(float); In = (float*) malloc(Mb); for (j = 0; j < pixels; j++) In[j] = (j % 256) / 255.0f; atime = clock(); cmsDoTransform(hlcmsxform, In, In, pixels); diff = clock() - atime; free(In); cmsDeleteTransform(hlcmsxform); trace("Gray conversion using two devicelinks\t %-12.2f MPixels/Sec.\n", MPixSec(diff)); } static void sRGB_XYZ_roundtrip(void) { cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHTRANSFORM hform_forward = cmsCreateTransform(hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_FLT, INTENT_PERCEPTUAL, 0); cmsHTRANSFORM hform_reverse = cmsCreateTransform(hXYZ, TYPE_XYZ_FLT, hsRGB, TYPE_RGB_FLT, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hXYZ); cmsCloseProfile(hsRGB); float diff[3] = { 0, 0, 0 }; for (int r = 0; r < 256; r++) for (int g = 0; g < 256; g++) for (int b = 0; b < 256; b++) { float input_rgb[3] = { (float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f }; float xyz[3]; float output_rgb[3]; cmsDoTransform(hform_forward, input_rgb, xyz, 1); cmsDoTransform(hform_reverse, xyz, output_rgb, 1); for (int i = 0; i < 3; i++) { float d = fabsf(output_rgb[i] - input_rgb[i]); if (d > diff[i]) diff[i] = d; } } printf("sRGB XYZ roundtrip differences: %f %f %f\n", diff[0], diff[1], diff[2]); cmsDeleteTransform(hform_forward); cmsDeleteTransform(hform_reverse); } // The harness test int main() { #ifdef _MSC_VER _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif trace("FastFloating point extensions testbed - 1.7\n"); trace("Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved\n"); trace("\nInstalling error logger ... "); cmsSetLogErrorHandler(FatalErrorQuit); trace("done.\n"); trace("Installing plug-in ... "); cmsPlugin(cmsFastFloatExtensions()); trace("done.\n\n"); CheckComputeIncrements(); CheckPremultiplied(); // 15 bit functionality CheckFormatters15(); Check15bitsConversions(); // 16 bits functionality CheckAccuracy16Bits(); // Lab to whatever CheckLab2RGB(); // Change format CheckChangeFormat(); // Soft proofing CheckSoftProofing(); // Floating point functionality CheckConversionFloat(); // Do a roundrtrip sRGB_XYZ_roundtrip(); trace("All floating point tests passed OK\n"); SpeedTest8(); SpeedTest16(); SpeedTest15(); SpeedTestFloat(); ComparativeFloatVs16bits(); ComparativeLineStride8bits(); // Test gray performance trace("\n\n"); trace("F L O A T G R A Y conversions performance.\n"); trace("====================================================================\n"); TestGrayTransformPerformance(); TestGrayTransformPerformance1(); trace("\nAll tests passed OK\n"); cmsDeleteContext(0); return 0; } lcms2-2.19.1/plugins/fast_float/testbed/Makefile.am0000644000175000017500000000121515176573557021153 0ustar martimarti# # Makefile for building fast_float_testbed # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ -I$(top_builddir)/include check_PROGRAMS = fast_float_testbed fast_float_testbed_LDADD = $(builddir)/../src/liblcms2_fast_float.la $(LCMS_LIB_DEPLIBS) fast_float_testbed_LDFLAGS = -static @LDFLAGS@ fast_float_testbed_SOURCES = fast_float_testbed.c EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc check: if [ "x$(srcdir)" != "x$(builddir)" ]; then \ cp $(srcdir)/test?.icc . ; \ fi ./fast_float_testbed lcms2-2.19.1/plugins/fast_float/testbed/.deps/0000755000175000017500000000000015176574562020126 5ustar martimartilcms2-2.19.1/plugins/fast_float/testbed/Makefile.in0000644000175000017500000004702415176574547021174 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building fast_float_testbed # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = fast_float_testbed$(EXEEXT) subdir = plugins/fast_float/testbed ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_fast_float_testbed_OBJECTS = fast_float_testbed.$(OBJEXT) fast_float_testbed_OBJECTS = $(am_fast_float_testbed_OBJECTS) am__DEPENDENCIES_1 = fast_float_testbed_DEPENDENCIES = \ $(builddir)/../src/liblcms2_fast_float.la \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = fast_float_testbed_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(fast_float_testbed_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/fast_float_testbed.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(fast_float_testbed_SOURCES) DIST_SOURCES = $(fast_float_testbed_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ -I$(top_builddir)/include fast_float_testbed_LDADD = $(builddir)/../src/liblcms2_fast_float.la $(LCMS_LIB_DEPLIBS) fast_float_testbed_LDFLAGS = -static @LDFLAGS@ fast_float_testbed_SOURCES = fast_float_testbed.c EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/fast_float/testbed/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/fast_float/testbed/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) fast_float_testbed$(EXEEXT): $(fast_float_testbed_OBJECTS) $(fast_float_testbed_DEPENDENCIES) $(EXTRA_fast_float_testbed_DEPENDENCIES) @rm -f fast_float_testbed$(EXEEXT) $(AM_V_CCLD)$(fast_float_testbed_LINK) $(fast_float_testbed_OBJECTS) $(fast_float_testbed_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_testbed.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/fast_float_testbed.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/fast_float_testbed.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile check: if [ "x$(srcdir)" != "x$(builddir)" ]; then \ cp $(srcdir)/test?.icc . ; \ fi ./fast_float_testbed # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/fast_float/doc/0000755000175000017500000000000015176573557016233 5ustar martimartilcms2-2.19.1/plugins/fast_float/doc/LittleCMS floating point extensions 1.7.pdf0000644000175000017500000075720215176573557026107 0ustar martimarti%PDF-1.7 % 1 0 obj <>/Metadata 599 0 R/ViewerPreferences 600 0 R>> endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S/StructParents 0>> endobj 4 0 obj <> stream xQo0+?ccAScD%FxPJUZ~ 9I^\;?ߝswbu5_prbοE<v}o|̋vO)lv[FcqǘTi(da{_L@]{ Q3L!lMXI%4OHJnFяo:a$U%o]+׎0d&2OKBf3^ Lc`z2 Sf A>MCni,I@蒊 GG*pkٕu&`a|Sp8‘e'>/F 4/A<>>> endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> stream x \T׽3 3 , *jEKq7g1&CZ(ƗV'eA n`ԀeG;w}?ϧ̹ܶ9BV:bĈ~'Q(b ZL4gΜÇVWW8rҥ[G.=^hZmrr'~cpn8LK,qTbԩT%$hӦKJJ8Sj*Ğ j:%%O0)//ڵswݹs :G#>Fׯ_bM=z׳gOO^Ο?/x0ٴiSDR-]l6/(x k.''ǮT: @@3зoߛ7o: j 4Hd3f^F{ ]*jÆ 555&ʰaĞ:Hh9YVVȹ4uЁON4G:mTȹ4)#G͑7g\\e䔃ߝZ3g ƙ3gNSFDDrȦ/iƑsi ,--e#7onׯs&q@>z(9rHSoq;z>HSrr2kjp\DYd&R_~a"<֭޼;nٔEq>HӖ-[XHMMʹiӬvu9nt V4ul6ʑ}Yq*̙3ܲ)776O$HP|grKޜׯ78Z#G_k׮;HFp(IOOo܏?- dM6U6cǎ/^MbL$JӱҡfԨQ : r lX,&Le Y/4֋govmji:ZZƍӤ,,,~={d&oj*Ś;HٳYʪU}wM555XRW^e(EEE_tJLL)nDYp!/}wҤIs6&hLP={yGʼy󪫫SMM &hJBBXyo)5kְ_>*ϟl9,˔)SĞ4HFa޽{8glƞE`SRR|MĞ14EQRR2p@ ̀U8 Ş.43fp@6DEE=Wh6>s{gSnnnppfϏfD }W^^^bOYf5>Ş%43Ǐ_6ܹSR=Ehf<<]!ig#Et[4lO/kB]HoR#dDƼ uQɎU'K\Gϗh2qm*L77| )`/...??g6eeeiZ-\H=| adQAaN\s,Gȧm' ' Q%WݽyDߪMWVOt, Ld)SeJ/Xi -U줧,߿?rH-Lx:5b[PXHdM8-(eOT[@~ss!.Ic]Ofhv[yǧN7.JR#og6w]@ {{S]y:pa'ccO7 =i3 VOW Ø8'ak/:8Z89^ U.Uso a˞63VRRRaa T̙3&MB }C߽.V6ն/`Ps"N޴qdWG?u >jKFC.K).5{yjׯDSn޼ky{{=KhfT)馸g 1O'KJZazFbg۱o-xZ2yN s'Wn) Ց~r z H>4]'QLky{S};vvF-tM.zUNL^Uy.h?bΩu&O?D}F$n`O/$N㜡j{iU=jI,.ou<==7mdXMu-''g9@Cp 1`{?:`Mu*@&}q'"|[l4  or.:^?-ZJ5}"S.\9sdNy'cLѻ+|ƾhWd2C0*Tdo;3rZj0y ㉪t.{{<ߟ#ˏ-~%;;OL&߿3g ~gWWo͋/"jEӦk.}GY֏y4d!*bad)P?gW$)*U UM~,sR%POh$f޽vZž% 1r9WBN; }iϨFE.7vOdmx* $\AxߏTfӠH%Mtu=ޞ.СCbҿK[bDKg0%*IlHOZI_@USMNOiy?97,psq|#}3 C[D#!G9y 8z$RxЋ.~x-_\hzh̘1b }J]eb:x>ЃOMzs4j#Ͼ=dIAiTOx*4i{p]6M***#T6]zU1|H_:yX(d39D҇9\:ĘI%mTхt!SB8oOT{`@2vؚi.T<͝;W{Ңtq]AMkreN}=fHV'`o9NaVNP0*Ųk{xxTVVϦw'hskbxU@ X]7Ur)~Xx(I;}񺋯+obbblfMIIɓ0d2AMKKw AvӾ/҉0'8J$*3.Zqe̺ Oj5ri ]ׯ ԩS;vg6Qa}w bsCݳ8H@9)L*; Osِ6Nt6mܺuqܹsgڴiVOkZr%xZlg t'v?|p>tu Bx&"3Jng!oXFm^ї4TcNxOdzSVx U7}*WRk>Rkii)l8qc͋S/SN=@XS,JOd}m'|Ex8o:-j`!svbo'O rʸqpÇxwg2xO+mcO}'h.A<{ D lPub&_p#n6΁U? N'VLeMx"0&z2H=t{|U6($~ ]rǃx4B>%Z=$/^vk{;󆫝pT.~u&ٴxb R?\1m≲dII_:5NTMqԱ.>&,v:tp)luѣ&4~/l7=@۸S?N~HhƦ.gxm-LT⵨A[kBB;NNNgnl63f/$0;x x[O8S _wp!yJeOuN<)sZVml-\s{&wW(Rߧs<'bd61 <ҩ񥹐>{&?3S{}ݦ"NJ>~=Sg |)DT 'T6M")BS}*%HPʹB<)5QtG{6'M=\#RxkI'P%ՀpGsuY&w< ^OxyOatpN_@= k5Ye*:BV^7)V{{9g"i|B8Y#Hn".ɭ=+|6'sPԉtbU@Id޹Ø2D-l^DSTO #b[Zr2ߍʼpl[d*(;IM0B|[aTItchZp8fWyγ+M,0(=t7V O*%t1gޝa`; QTplxprHIBQ }@[; OTed)nǓLF6L[]n\vձC]鷊6FF9J Sm|^wٳL IS{ rcp&6(4QRLSx1HPmuα fkpRI}UTw{~af䘽U Ee3vkޚᚶ!Կr{+qʾMfdU@M*xz*BYŁMݦѯk#4: CzX1n%uĆ{ C_bP¶%xhztYl0- {S Z@-"uU|݅[Bi噦^H{b$mT3 ş'J:ڠ_-nhƉar%WiێOc[ Z?)%F.( qx7k ҧ\p;+'9Dž˭0jҧ8?YU&hV>g5viTC6Nsc0T6㒑͓;CVo T, x#R?[y<ҪHb7垙ںb=yϨq".2W[St~wZN}n["磝ZEV&dc KbƉ+S~lm'=*3MWѽ> stream xyO?Ϭ`&Y6k/,ES={H>%$Q|S$Ii(Zk`137sιg˹ssq9s{98666666W*5JfƊDUݢSk>n?z!]=ج==hش16o{so%HJۘd)jn36Ɠ6*f7P _2\Jfv+l #"eĊLh[bc 1]f L1SnD\1A)Ucv@لv_Q'f&tRDFڮ df&lT=? v20ox$v8Pue<ܬ7~H[gݣW#>o~XdƏxi)nM%ɿ7|у&<)Wx4`q{L'+l\I՜f!S}^ңI}?猩XFb+O^=Qo\.+kO'ٸQv&7>wr^~sƒVå,S‹Vzg~>{u}gRI+~"Țݵ$T;j۷›feKVOJbr֎jb׼R^Xv!l &70^Xvwe;?=CRyB3٨Izʉw6'Q1THcfPF[@4SYy^8jIa"%ȳ*nQL:ArWr.ù/d=NoQWOk-qfܹ֬DuַH{O1VWHE4U)In\ Gp:΅GWQĥڊh84'Xȑ M$ͮ; k)F BhWh'O抐L1Ki41h'XE̳f3ce 1MՏ68FΝ=*~:rt(^) ,h /kj}(Z2|TT{ua8bϊ:s :8+s٢)V|t %}*^Fsc9|[E}-b\;.+r\4盽PD_%p;ӯܦWU1%lNvϰ }-THa~*d1L1|eѸ>s}3{;4zF?TKmJ$'eӃ)3SCDeΊ^,F5kYP793.&n#f&+}7 j9ES;Cs*B%S"E3D飋KM.~D7эNUmLg-·"<PȍUT]`hXiw^ R`Y M=h]4{ Gy;"JZ9V_ӹh]S>0ӈ5HЖOT}ESϧ}(L]7XEGy$ƛeY[4y|]lj暲0ce`i8C=C=(E1tmT%i,s[ACIhNI(yD>6h1DsX,^pRKi'܆FDCT ul3jRhn]ez%aQ@8ilϊ,KAĈgvce,ˍJ99̇  J#d`x=++0b`.ݏ5TT[5p b,eFg>}n*Eh*RfAFZW :d~}N mS0 K iZM+?Q4,l)J#8"huL %#(= ,:O_fNWU> <JkL:Qr=!T Mn&ɡLь< Z @ݏ]bxX>{T frW5.fp=gl7RhdH f uj\Zf5N4 }tcnkC4qA OB/0GDblDÙ$d0 DX=_}stB KM@]FT"xOpٔz6&0\,0l^A=%R4/gLY)ڮ>~+E,OU:RӄnFV{UtIoę;9{D=t%Q\ۑc݌C\m8Q轼$'u ͎pGs{*>>ƚXf8u}^\?>'?&`i,*͍> =C7Pcs9oܶ)!?X5јc!Rݗ sxF9.2byhV)16k6&$FK#>VZGƿqSRXGYKm I̊yiP(Q~>|h]H]~2 7 ŷ1ϋd#Q}Y~X1e*̘EzQ:~0+Ynėj%-ZH6&_؃;D >/ä%0mq.aLZ @a;Ш,7%Ps [󌴶n|>< >/$R3/ N,ŃF =?bՍ?xӨ,7D~V} >/-"D F# D舆$No!X(Mp1 %O= a}~'c݊')%X٘,jBD+3 p?!qʘr<1g٨~b $5"tQc {@Q t,y4ΏT՗b*Fobsr /!YAb^j֠x!dyb1h|^SDT{c:<ђ8gp5FN-j ֥X?jtbل > sӾ! $s=DG 5w#/-I)G>= ?x c׬}O‰ًw?Y ",3̃*⁅ jy h&'٠C $bDF{ֳCtS8`?2߲ p K{uƣ ?X7@'ߜ.Gz;qʁ]#X72uANɦ+̺@7GѽsXox2B% ,ÿz6v[Jp׸h2>&\@7C`Bwj^g_s]]aFr/p’9@RuI>8O$9\/<æb_Asrꮹ^UӤ3B4G !Dn,El؏ 9U>qSeGq柈?*!`DfBF6 v4yX[_jg{3YGB<`2+{TjHQ;%[9M|8etu%Y[M]zR~cŵS}cIM~o9n} _ӑh?Ay%)j&./rBb>jp|LBy-r]~Q?cLb*8۞52guF_f=h2_qGcFA\5g *H@#+s07viE"lI)G%:Y Je2E-ߛ,[NK/oSnY bk8$M4^uzT9BvS@a3ۮ횇6lPg+W[;oG%lv]& DE`wP @OŁ7$< nID}EjG,{YgF9Nòek=RVW)廰@4BBkU7F: '\_ a\{]sGFNɇx48(r0'%k;{?h8EC[#ꎧ}|3kL%⛛*+| F IO('YOyu,hviy[Bפqoo"5:٤m2Һ$ ú@rRD*[ =.\/"άтc 0j̫z˿WkBSsDs-KaK =niyh?s 1l4-moXU\4E z\( ڊ畺y7V`J&s!Ne Nq9äɰQ?olYKEy(͐\p%e{Z5ɳ0Ȕ5>Ta Ŋ<'x hQ/$BKA .&#!iC"=GHS2pok?6h-`9Ȫ-:tO+:2>(;hWDl@Byu:nZJkt_/Rr 4KnZulP /LcȄk]'+y"P=a9~A wUb4DpM/DE*yhd2~)_})" 0Yk 3AVΘ}hDW[]\sJvMƘ[@ |EAX4"kh>˷`OMk/ ?=[pWKцBreÏs=D†.R9q?,ГڊGE4(G,|^{pѭ)C^͞%0U}\MxeChmyxIOkM4h pѭG;'}|Jį,4XBY(|L  0H\u\$8\uk SJ4b~Rn_B_$$TѴħ*IWݪ;؂! ьoOs^M(%J,2&\{T ?ty.V5&d$2s( 9u.\uǢD;Y%.5X2\)+ьGl- &/'rrhKK<[˯2&hZn#0ÅTa2(o2O1UC4͉3$=[˯⢉^4 ~q]N> Hxʩ~Jya8LnZl^lՌ4S{]ɺF>+egJD{LndZٰ'M,"^EƷ\]7&1,Ih ݌yp>(_eƱXRsqKo[-N`8$ThmFm$h5 %$^1Vb7c&EG"v%KwcTZxC/G/Lֈ&Ή:ꬥ-.r=ZL38' s[zՎwu+ EU~7͠e4gt|XYZ|y Q:A|lѤ k5Spˍ\uʹgI+pҏgfZ9SJq(piɵZg͈"n|F]7<YJ-ǻ Yb0s$Q=V"$S'QmNs1:B2X{x.PVZ]wGGJq]~^ Iri|F=k~`&~ڍMu̗UI f*kSV-mlIp;/۔Yb{NeԦlƓhlA9^W]6e?)>: glb\o 6VK݂zzV4 ˕Uz'Y^&l' W<\G˹O|sctl &) w9_?s܀-kڳ]c)oA]Y6oGto\M%͕7M_NOwkɉ`S6r6666666666666e01DF endstream endobj 14 0 obj <> endobj 15 0 obj [ 16 0 R] endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 23 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 33 0 R 36 0 R 38 0 R 39 0 R 41 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 20 0 R/Group<>/Tabs/S/StructParents 1>> endobj 20 0 obj <> stream x͜Ko8x _ ]4@wqvqo|8aA34P]nWkz=]dym4~62-b4~v~Mg7oٻsOW}%)2*%\լY{g~oM%aRj2i8d`K~l>{R|#~{KGg礤 춖lcDpj8}n^{]W _+we]6{]3iʬ1%29 D3ǷНASkr.KKzWl~" Z\Cé;wf.Z&P¶/h|?]P8􎔣Ŝ fqqPI$u4TM%(gED-\HTC^y1dzmȴuZ_r{H#ɚqgnu/ȗ~ 1UU5pBf/tJb瘴Ȱk2>=NNX`]8-**@S ,ќxWT^QQ]f3Ř &+cS=]mgvP;`T Hܵqt\Q5'Kؔ^BˊF.d{B2kP TR0ZjOYݩ7b(~ ,jʜ Ґ QuT I:n\:v6HQsP p `0 `H/L@Xm -u˄!e(kaajX4鈑bp_s,\C$5@`\Vq嘮BYi*JRGX*sAOauXD 8"Ǜ 2#2R6V*noZ&|pp >U:\8 \Br*X8; e w"^Z.t1Uc-frdF`~=79*3ߛtSr./찟؞onqS QH%Oo:/;vTLZAB.SQpwE;g'eX 8HǛ2bꇄ b4eۄMn[a폦F͗wP<>{{z{3:Y[|eQG!U6 :`YQǢU. .XK4Wgt n9 )PabGk4E 5I+j-Q_zg+5[fXtũ k,`UE;Xlc%'(*r*=P/L@-)ɨi4ir&m&,̀:-,,{ʃgM.=o~^qY&ayen\03H͔pT񧄁eE)n`Q3gxs:spp~HـZS6~ecϻ0u{,L; Th8 pQaGMK0G`ڢ\,fm͙-!ejNn!)U}Y^M" $Oɪj)d)IsFO-H[+Fdh_'.S #kCY^cݨ endstream endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <>/F 4/Dest[ 24 0 R/XYZ 82 771 0] /StructParent 2>> endobj 24 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 44 0 R 50 0 R 51 0 R 52 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 43 0 R/Group<>/Tabs/S/StructParents 13>> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <>/F 4/Dest[ 24 0 R/XYZ 82 618 0] /StructParent 3>> endobj 28 0 obj <>/F 4/Dest[ 24 0 R/XYZ 82 456 0] /StructParent 4>> endobj 29 0 obj <>/F 4/Dest[ 24 0 R/XYZ 82 372 0] /StructParent 5>> endobj 30 0 obj <>/F 4/Dest[ 24 0 R/XYZ 82 239 0] /StructParent 6>> endobj 31 0 obj <>/F 4/Dest[ 32 0 R/XYZ 82 771 0] /StructParent 7>> endobj 32 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.5 842.25] /Contents 58 0 R/Group<>/Tabs/S/StructParents 18>> endobj 33 0 obj <>/F 4/Dest[ 35 0 R/XYZ 82 771 0] /StructParent 8>> endobj 34 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.5 842.25] /Contents 59 0 R/Group<>/Tabs/S/StructParents 19>> endobj 35 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.5 842.25] /Contents 60 0 R/Group<>/Tabs/S/StructParents 20>> endobj 36 0 obj <>/F 4/Dest[ 37 0 R/XYZ 82 771 0] /StructParent 9>> endobj 37 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.5 842.25] /Contents 61 0 R/Group<>/Tabs/S/StructParents 21>> endobj 38 0 obj <>/F 4/Dest[ 37 0 R/XYZ 82 579 0] /StructParent 10>> endobj 39 0 obj <>/F 4/Dest[ 40 0 R/XYZ 82 771 0] /StructParent 11>> endobj 40 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.5 842.25] /Contents 62 0 R/Group<>/Tabs/S/StructParents 22>> endobj 41 0 obj <>/F 4/Dest[ 42 0 R/XYZ 82 771 0] /StructParent 12>> endobj 42 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.5 842.25] /Contents 65 0 R/Group<>/Tabs/S/StructParents 23>> endobj 43 0 obj <> stream xks۸gѺ9Sx ;M㼚6nӳN'(Ȯ,b$H3Abo,4~Z/nٳzze>K>/~_~Oozq_l>OlL/"!IVfi,KV,.ƯYB)_Qՙ$TuM,3\~U\7ŧzzs|$\G}c3׳ IB HRdeT5'Q eiǹ(yu3~AO)]})"j2BӆIPPpLl"|5mrjS*-yZ"T,vDrV#Nf3joq!afE.-zaQ<eBdS-L$U/_BǔbXayʳ}%VXx %,~h֕^Y0zFaZ-q2:ŃCj|E֞[b Uv$CSg[UJARɐJpb}LrfFKlو H#ԽSlá+֗|Y +3B)32k(C{>3ZM̚|0zwѢP>Sd|d{Z h:ԙ6ȥhpT]_MX=ͲJ֜O:`(g TO؂iB*wXP2il(•Kxjx&Sg{`؍$,x;.7cx[7x{9;3O|LBeJȒ0+> zՁh)=$~PE 'Qz֏UW[x0ltj#d+y % j#h, Q[X72~`2!\NT7lB)-&O QwY*kVT;Ʉ5iQNQ@++Х[ (wpofQ@n;#g{ӵ^x D; ٌjQeGtݙZkԆo+w jtyr.pȵ׫ ̵~6~ͽZPA_}1/:`g0;'`T?rs;Gı1Y85S\-SvW κ!5YY|D״;2 t'B4l`9Yzbyi "s;$uGZo*zgo,P sC\1zHǿ[ 'S87-y6T[JK`~JNNuԠ^>ʋf1 uC4@I|=Ir?'&g,?}Tnv&NǛLrЛ8?+2O)TOz t Z*[vxsz!9>Z$6N$m ȭ31 bYsvu69Z;fF eRż&Ya-:WgP .})yvOLB-S_NLm'8؃C7豨Ý{筢wQ]E3X}2\Τd1ٍ`ǘ ip=blin& |#/qWbh! >u#4eRC->E{rhw,zNSOIG Wne\ؼב[{хsC5tZ2jݴFئ@jTNۮhC<8~3o}gln߷Z7 A5%6@>5=D|tZ #XBa@ 6~@JkCsݚ|GW2[]böxf&9>N;ǮosC7 8~.Ih]m$@q 6%8bǫ6?`GSQҺ>Q7M)2~cPS@2`P2!%E\vGNs&NpF졈WՍJlA2V}OS!eP(%0[m*x>/F 4/A<>/StructParent 14>> endobj 45 0 obj <> endobj 46 0 obj [ 47 0 R] endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <>/F 4/A<>/StructParent 15>> endobj 51 0 obj <>/F 4/A<>/StructParent 16>> endobj 52 0 obj <>/F 4/A<>/StructParent 17>> endobj 53 0 obj <> endobj 54 0 obj [ 55 0 R] endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> stream x][~0<QO  ɊUZ,8Hxk7{NUY5Ȯ_Ul'w\}ww.]}_/_W?wo._WoϞyz4l:s9^=n=}u ՛G66&sm9٣.vxg٣Z2֧_<;:spka>L^9\AnyG_vCh(=Ѹ㘫m[ƈv0tp&PwGM 3`4MM3TT;K?\qB.+s~}h1 rl3oW7ٟ>;y{8y//Xϕ>|iuRHr?鏿*Z񱘬֖Δ?-'"ZtCgotc$Ny+x;vkK|RY7﷡k~\#4%U翻vW]~|\/oݿ~|X` E`>_fDz/:7pf"t뾛%riZ%5>vrqyܳĎK()A`0.\\+㤝xW~!瞈“np@8tz]nq 9^}goRoOX1VBnJ(I~sYY0cPN(a;~{nj<}Z8i)+4,סw@3tP]Wa!T>])J]L ~RX7~@g7AP^y\ Ӆa$ivfX{SL݅NݱbHlPLF/cp=ƣ{km`e"j"%|g:&ZS:3I9d6A36́GNoE׽'0S*?a]hդnFZQZ bVVUHܷh-:Vai)z>C~YOlmVQfq,3>k|r~JDiIzɦAF!F 98DͥETx|Hx {{Lrw^'ZɜS3I8b#1vmOXaY*(rܒ|`!gl#tC` 22ݦ](Z3 ;Upa%VטIQ pV3GPT#pUl|庐H]) .& |KI]"˱% G(m1XDAN1'@D,3#8]o9a(&mbX]; YpʭNKmGӢå+취l9^4WjPFJN#1d4'îkn ΈA[͜k73rin96CHr D5X5 y2xoVh*]Cd};`BǗvO O.Ѷ9;{BQ&+2YnӅ 'U#$1N)n1%<{b9Ũ GdIb˨::>Θ LnVNe .L¤6)`nf@ՕSױ(V IcxЛ{m M+`fz~;pa\trc\"K{|CTNLQE4 e骠pCf:9UM5T[]ov*&",˱au$DD-Cw0ƚjatr"aZzƮ8r2\b]e,G)UrǠ b RQS@i,NЅt-^e ~cnfZOǙB*!nv(ƹ; d[eݼ*˚<=!ko2iKx4OW &((7)%d27H []"Gb`}5teRgpw۶$ oRZ"C(S0P/tӛ)V$Ff/z':xԣ[VgqbRWމVbU\&wtUPaQ=NԽ(gJvoY+)r;i{qdpQk͛rP^#fx9+\h]!ǹSm?O~."B@M7.2#O$ȩB @x.h-!e5|B|YS(Nc'm~dH=b"5(_&s #X#r V_VOkn[('B < )[lVS @UKm‘m Y ce_َ 51 A\݁g4tfvK:etËe79`2'TlrhZ,8LށZ&~Ȁ„v$ m'x4R" S,b*E2>R0"k]e*ZN45^ac]݃ISR=VoD1 @5UFqJ=p(rz#A~:ڝr4Wlr ^{~3hs] mB,/%b;,/b]$,ӎ7H[l–8CѠ:U~:uBpM9jcQ +_q%I|rZ P`Nsΰ ~]a08_aCV m:\04r iB,mdQLDG ANGH1Dh ΏR%*qpY[~L1>*xPޚs9$!_ɠ Gg]p6¯,2T!O0@>` 8& FMs:0Aw /ALDBHW_Dt}6Xn5A~ܨ_}Md]rw.w vꋫ9@A&h 2@?8MC96ŘGDC81A tClt?͎oΈb":bSx r*>D$xmB8-oȎܠQSrtN2#3L}slbqq _{j Amύ4j+σ9Ɔ8?8)6~D2(ŋo.0REѹ@ XR ~qN#E [hʪfhA!3ɀSfCnj$ ) #B+0hx p*,-fS 9 D1q*O C3M6k!ַV>q^{1%a!b@SA@ } a0,0{f{-d*ff&+4e`ٲ=w[;ArGV:"f"<]:W9 ]pv| *M͆8^ &882)$d|L4 [~z<V|Ȓ-HrN8=ȓX>Y!An=W[AS@@MIDOWj cd*<%5zyәTR< $CZ<$zhģe2g4|a# -A!;ttsմR5n.Ț̏zr{r1H~u E" xjL4y;Lעr8 "ˬD+{W޺.-+Vv^N񣙖C!~ bGH3Gh-QCfa! Rz jZ D)S2cLf7ӊvEݸYXS\A^iVa!:PpiTԳ2JЊԋ#6ӈӴ*fO)Uwk~D5md:NI)35qt~ߺ!wE)xꂏo?x&B0xõYyC5oڤH_%d FK%"=(ct}L6ʼ˔yqA*iDf o-6a}P?fX.DL)u?Y/Y,'єC}sPf?_ɵ]Na(>(p玶nNd^)+OݲaoMoܣO`[#f(?hzڭjdx :yla47EcC.SN7vglM>uøgc dhЪ!D&im2!CZL@r5:Zπ=[evO _YB?/~AxO-xd7 Ɵ,.r-߮3!B JW?C~Zag ɭ^/N#q:1U%j6l {)1FzS3a\G*#Yn"0&D"/ЀR endstream endobj 59 0 obj <> stream xVMo@[~zR M*M͡$ٵ 1pXٝ7~$񡸛qҞϋ{I$iĻJ#A[:qK7BFHSXh]I*symUXes0܌Vc<hMIʡUKwU[# ׬w>G"b1hf KB`':;Q|N{ZvS߳~MNF7"5zoC<1Q5:gVRm*ͪf_nlM4wayt~B`jix endstream endobj 60 0 obj <> stream x[o?TԒ\ȗudpdUߗ^3h23ˏ3jԭvn0#}*D\}wxP= z-VTg\ͮ[LG?#{!1 >'=S #nlp8QFA킏&gD+}dܥ:X;cu|bW/wcU+ܽD lej-zҮ!^v3ӿ<ӟ/?TG>.M%<5h&Tn"uͤv9?('JQqW;,ˉ؏vz/p2/ o -zǶ%7Hq0DF4 |X2.Wעك,sbj`\0A>O)s+f>j?ۏBXݗi e/qⅺn#Do&+Bnz0{P.Z~Bkx=t1x9݃t\u|[ f F~PaanzYn1;y8vb{-08|h+ %$o6<^\/=OJ|`p90Oi1f5Ԝgn/w$|0} }?Lb~7-[?fBR}s n/_ "Unaw&Pw~?4R}!!gіdmg1vb1M۵B$HLmm0cZN_Mk.$FΩ&]FS2!_j)MxnU161.;{ͫ'lHnnMJڸsT=+t ׃kvoUq *h VƬ+^l'ʨ >7rױzVnbΘq-{;8v}Kjʴ) h/.L{?IKTצ}ݩ鳱AtafwGF\y.%{@ h'xut .b^--ZSym+=篟=zYqlӸ!ٙұ#%@X_˜(hmSx$5$Uۂ3 ժRY& \vӊAg"bp=v1 YaEZXOR=6&8tI9i7 \=>XsmK Rȥ\̈́eg_-x('CZuX3k.-4R :ũGr۱2nlmW?ߎM{tvv6a!D-ɡQ3ٗ3|2=vt5V[rHl>"y]pv`g!%"$aݥTW- 8r..;p! 9s=sd5&Hh'#F2HF(6Wӽx9^6_X~)0Y],v t(tnTd Ȥ "IcD(6%<L<]֍̖}{>Iݴsw,p{@ h$k쵭e z ["ǒHV(ښ^LeL꣖eQKxgbh7SẖÜ%c'+!.K*:s=;DIWn;֠06AlDR S.Korx6r~FUF"GYm׭ޱ'2Z̬vA S*1ٙ[C;s{qdnXio>mxIL#Poo,!)7,-R.O ļւsPaNKgjAwav $ckݺq#)MOlyfSjہmEP;I4}9&J@iLWX8Rr"}iwX#ymhڀf}0&o=zÅKeL;8xDt(l|1Yaͻ6OaH'q[I%YM8"YY7=XckQQ(ϭLm2낾%;tk@-Qo}w!{ӗ1^,S ELrc99J@9/NX  ~<9u,udr:|ss#B#ƈ:׊,8uNwpb9'J@LVXiI:aM,c)TcDԅzpx~D]*G!ٙ+8Bt(ldkVap'\q }Sk%J{-[VYגxX^附4n`9G8H&z׭5ۖ>@8yHk[鎻R=k =yh!y-M93{Z k;8Ɇ-M sͻwBI#DY;:ZS%O9\,ԶhOI6*n[$:s{k 66ѷIIye OSHJu1_([y|OyH~&6J/8{@ h# k̛Vi=nK?74W&y3[Rt~҆mSdi<ƺ8u,X{@ `" kֵI&Bc)F=rDIWx3AzN_Zj*"(;uY$C%Wנ+;igL(#=nHyu+H_JuzJsOݢEbv93Ij:$9PyuƚI~=qIYm׃;9멿T{m$,,=,_,Iљa:9Pxx z.ӱ,SI>>FqVlO݋p Jg[gݺߎ@Ét [d+%@Z9A|FJ^(k'q2XTi"悍* 7s5hXPN( k6OAvI(#D!THؤ/k쥺%Av|?B3Aks[ANŎ6Ώ5֐V@"9ND&iqOpz-楲ћDgrnaS /h{@ h" k)ϊRIl=y6IDi !o7KB"^*ϰL̍1rs6rn\"i 8u%.Q54BjRՒRɸX{SOGՃc9;JNi6*ͫQ| bb~e>QeLy40T.4Ϗcc I&c9G<J@C|L=)6AiXypl7Ø&n>kgݣiٴpb$`}!)A' endstream endobj 61 0 obj <> stream x\o6n>YIQC`AZk{^wk._CRJ y%pHtp~޼9>}yY\/oǗ_/>/?,/㏯W/wr}r]gy!5M]fE[)iNy^ir/o\dDTբY]&j}fw5w}>.VËǖ׳Y3A@΋J\dk1'q9tyf/{^q,U"U\֬kwȱҒɉ`yeCHDHbh3| N6Z Qь&UD*;$`qHxHJJA>{wgNgxEׇG,v5`yӤT|^/tͅhWkîse1ºOH=zbZ5 l*cK}~=W/Y" ]L<6MJ ~Xp%Dfi]8fO5·buBz*aG?r1y~G;u 8` g_HZnPh:L%<99|ᆇ88t -1K XQ'@nLZ(A3*9ª @pG{A@`^^I5궪kABm֔B`U2lKgAMȏئ65ATLn)kM^1%60,6`aѫ4 {>FoW~N`0{}xؾ5x=aZ#0C-W_u"+oY^EQۏ N&7Prà5(iҎ.MlMhDTϺ9k>G3΋;PS,]/g\<جI0/B& 2JP3dS2_I+T\$?TO΄]] B66:$ {;oqiAG,2ײ h z;dt΃6!6jzSs6\XfEFC{(ch9͕/ݽKU1B !/JorB[V'ec*/!y_;3M c֣wQ4{@ݓ3F!`$qIkۮIwT3 b`]Y Gį3k$ՑgG鞟g靅p.HŲ㖖 "lĀ}+V `!^ĢL :e'\K\/prs<^F9瘡i QT xmMB=7 XE$,I V4?:'{^NAbIMLκ/)'tf1F;:s;,@=/ w™ y]'x#fm6w#цRD<`>;?IiPZ:LtQB}ǁ<#5*mڏ[`^﨑CaHDOzHKٯ7O?*ׅz$Uê-0v 3@>Ris*h#LVHlKr ͔k޼ . ;TuA6XF,)LiH7F u͝aZqM[mad$bU64=75jat KR7Zm ug"6MceI%(O*Po+cƘMy=Lv`Ь Y1yfgݤUer;BaJ6Ar>-1ݔ*A{ y1*^Gmthɓe[>I`v 0b!Ѽg{`jnzhEBSņ:GQ;bG<-0O375gPC--ݏĿ2H[:w_?ς endstream endobj 62 0 obj <> stream x][s6~L 2d7i3}H DzDv9(:h&y`h @?\]$?xfr~=>]?>Wjy=盟~J>~ %)+B$iUɒR0²d3?<^<٬Mnv| >(+GM6sx0S'sSU=6:jdYIYl+U^ϖ/=/fE2/޼~ӊ fLFeV+Wh)͔ oo sRM3)xyYC.1^|!ftp8'W9kң[ggtu <%GC$yA&뫢$g!jbLh޺5L!f!2R~ޯT,"R/R7ДOj6™wwg#A f[RxoO58;>ϵ$mkx| @,t'sی_4#lI-þ+J Roh8ӲC+"f$ n񕟍/jYjċ_ ,`ynqXSv twƳMm s 6q"O~0 NдvV"ҬF1uZaO=UJa59o"ǬɳV׽f%Us & _`KU em>Ŧ2'7XiɊ-^6_iAw+4 3:sF0Nxl,or3mkqZI[t#<1_LzGVo;H N<~kɔD'g@x/:y!2ĞT4kƁFQ2Ui[3p5P5/:BMXu:Iٗ׺ WJhڹh`#O!hH,猴 ی;~tM  ƲnZRjkn̔PWk*t X&&$&:jQ؎0FO lѵ98i?ǒh k\)\xkQ3#Aw%rŠEh޿:;a#T^Q9 9oyae";ɜ{"J`_Z沷_9[{׏at**7?"+` U˰ #+Um^ X,w\6ۭٚgH 2 o "ɯ2*NBnKYZ!*YBA  iV#-wW1{cE\AtO9=8Mdo tPre,#]xd??]1WW Dpf L|:o G\M3¾=ɍޞȬz*IXyyJ8+ݘGV w5|4V -ÎY=Skho/ht!/Е~F1 ==KA:qc߳ aG6E!-EQ2䛀j =Bэ ݥpX 8dWI'3#PyhavsSvQJ?ϚG5#,:%dXZ̑~L)ESq̝-s7;Dvn6O<;:'pƱ2%Y䲋?OV_xpJ>Fb5sʓeS;)L}dIu[בMjy/'qLGlލYGObV@w>(Y 'cbVZ}(حdV{fIvDzG!I(s(iGF;FO'l e1vʮ6@'y1N1;;Z3%JUd9oL /V\XVon͍ZycW:.4Vw@؉fWJX6әǛ@284ZL;Y9oj[57y n.@[V.xH!"z4#!M崸uw;$2< c^L'Y cH3ᮆO:S;|^01r}'A)Vfk?DhHa9@ߗuII{VqwlCu+ y* 8ݦ(B(9J$Än'_r0APb8UL4UtpZBUeKI&aڋ$wwgkk= C3h73kofܕ^͛4wPAv1)ˀ17<>!p$RVn LⵡA}ߛvÕvj2^&ޡ!ׄy?OY^棚(!Ajqn F?Րz: wK/Hm+mfD ֍Xkl-+%+fUc3/wC눑:gCNa!cU F\CB OE푻 ~d t)ÿTkem.R}5ypJlT2ګOg3s8efv3煇/v;l]bE_@-  \<$(po}%w orY {fnxR\ PaIǚ5,e@\V)mS : #vFN*Cg,ySO"s(Hɲo~^[yho/8#g&tI#/Y> <ݹ1?|?QjSkVnu.fNGفH<=b&iҜ!=|FAe{gw(Bv endstream endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> stream x][o7~70}ܘf Y],qP(Hmd,/9pnJ&h9Ε|t,ߟLJ:4aYZ̼7&~ha9Ⱦ71RC*aj4?ګ }\5w9WaZ,.oK?vFOuq?|q4F@^aDm)GRJ^P>tA0H"XEgm|pot3O\U=f3ewXj}O/I+ xV1BUa@Qـ (`vB.AkrCY_Ή"57j{|N+u<]==8aƁE}C8vP炡44$l$i  ${hRoJRW=Ej3w"|') ةuVi4\5ZD8]^8W\enI ҽ坲0qѴm߯?ndB¬K'UD\o0B MfG.%"Nj ~/V=% iD)Sײ^(o\T<r |gpy()Ւ!Ͽ# ߏWAp5U\UUsXkŶTTk3 HH9?ߊ=xNdZ5HJ&ecҡ8Ro(/Xt$nJq%hb254_Θ !fq"HnsX53=z &l\YA%Pl0b0a4]>pӣWzCz8e jJ Soz4iu0C39Pq7ԿFn&~ $-ocpGh:_& 3 7)ҘmUM@LmʏڄaeqM̶#r;`kVc2IKD2K7F `IF0=p6hݽ},,?Xv+-Z>JŇOi~Q3{!_'U - MJg8Ͷb' Y~_AWt8v=EF|+Uw@DBM! 5cg[Xop]G#OX/>Ko5\-g"mI[p*7hH d^+ ۋ7TN/-zR96?kP&nlt6>HN0tTlF@Z8_@G%pHs}b},qw7!Esa6@x K̳_*fmg?eYqe5ty5enBaP5ll0V)hm W,OoTJΨpBl{ݛ)"?jџ˅憫vIq.t↧ns͢١<티> v9n2m!K$l(E~:]*䰯Ƴ\~ &e.GլWUj19Bؚ<vL[KJҐgmvWTltκvNwv/)7Leؘ9V$N0Pds OaTSxf74Y'%ە~MCl'w-#t<_< *^)T|Mi޸m]ɨ}Uw8ahD4%KsFv*%ss+!hD`k{a8sA=_HtIumJq~IA3Gl3EJa(wW._",/{6pbmE-8\6_yg l+EG3˓w`GgR lGgR)4L){>fq;`$GʭJנg@G^Rvvj2Cr賾ur m ,]/]̕JgV58 sGpPI bU U\CYͶ)YXiѳa6TFC"1 n13fRi8Q`a%&V6Fu8V(6CRR?2Ozy},I:!# +i؅\X\wU3s$ú]VwvCH1o[^8|_b4ItIWXx endstream endobj 66 0 obj <> endobj 74 0 obj <> stream x]]嶑}_ AYUY'`}{Yt6C4="yd|XTթH*iL'7)E.Mާ)4ODD/O&'!v¤@{`= _Oi+LY3Ȕ0qzyp6"Q:e*ܬ}pYB=*HFEs_J ~x3!(;& Rek~CWF.420'k!&VyE{ʢ LYh/*: J2T} hT ^7"l(@\7@e`,V@/5M=L<92O\ c=LKu@Е6"bo'b)X8@{ ad(V@f`Rџ9b dV9k48pBUl.m*XD/j2$0$5 < fSE]O v!Š`~N"жR`]M,iAŒJGRC cRE'B"E<:8q2g^CPKu+wIƫEE6u^яP,Jy#QOi)$0-3~3x)J_1ĨSR>^UԬ&/1% 0Q*ؘKK~K$ԌՅȵ稂GJ|]; 1QT׆ѫ eU3LvV 2zC"DQNDYNp=WNTbW/SKqGG y)D f Rn BKTlXVf/]^<"n7GQh`NZKLJma^H}C t~q~2hYp Zҫ},N[xzjNcN<ϠUvUQz}q=kD _XF0SϢfЂGPSyǠ7m]#!ps 3B5a TB̎ r'X?iS+aDhG($Qr%xC=C ^[hKP}JYj>YHU´.YIT[yE0-dȘ-P[0K^GSThK%K%"[_#*wBW#G*A<)3{Ж8#F(Q~U>;! a ) D4! b?!C[%yЂGP<ŽD]'xx UzTBaV ;HvIJ\-9bhTS^=V$<8-Q\/<Dwy@\ Zgե#A#@ DTƒG @Z``"Z xGQdby,,k$y]x y!naFbD^f* &$*YFv-$yF_3BeL[a{v%D S;8+Fu{S$ܫޘpj6a*Zy.KZ& la~5KaP`f5CcGO%AɈJɦ|*bҌ =+L!ȁ*h`HR[_yde;p@ %cp,XqEF, RįȇsK#1$#zcIpvjZ:#&զLL>&3B*6Sү0Ihdb~!k-)*#*LfLxI ?&F1@4e`ӹ$g9*0%Ֆc gY:Պ Rr1xLS7&U9 ՚P(`~JN$&Az$ՂZ M03*"?iIz䏘]ʌ6. jWR洐jf - o@>-Ś~~p,G`A0d#% E~<~C87~c8(F11oDW߈M`H@vNDؤ,jJ`JiaS FDdڂ$a-H !Ymy+$Me M Rj+6"&"E Y͈%sNd<ư'%׃h Γad R&aӪJ: Id38 ɜ#Aӛ IOݫo^ݫ}w4t?q;$ Fwo^tt{?NG}qb>N$2NI8I''T|ǸhӴqC::Iw  0h05ih`39|Y웿ww߼?MJ}G/}o4oǟp~6\˖g7%Ogr/+@цu$BU%[/]quYEz쳆jI58wpݼ{zq~^.yfv4gLEj|\UMz]e~njdw]QY7yc\SǛvT6XWڑ<v ƛUEJj\M5Qjl\W ]L= @`,O%@B5 Ϟ.S [®}% `7Y @5PPMO[wiKW5pvxS% `7Y @)5PPM5CJڥ{WDꪑ)oF1+S(fhꌒvij+6xs% $2@j3Jޥ7eK7 J0n$ f%T n|l[=K&~g97𐍔LWlXs9j^ &5n\Ɗ/h]N^'Ƃ edH>=f,'lxK1sOl%1gsƜύ9gb A_o}%!|Jvҝ#| y mU7U/ZGN㻓^\*"so@NQU@bzYq|}JE/nWo lNC6tVӼJsj<᱁w ȟ1 zZqHq˝=P7iëoc 'Vrvύ=kQ*hS&ux{)s=R3[y%HqnEŝXky-赖sB:_di횮IZ׀&Vvݿ9>MV-,Se;AO\*o*^M9Ct۹CtO8D'yCt8Q ]l1:lMct/ip:1 ]1D1q N>#O~F.<3.K)gp8Hh%%h,:#pF./jgLHQx"cohs4'흁-Qu?*Wt݌lMYk ۦ`t&)!]v8Dv.;gCtpؤT?aDzh)4Ye6Du Qm1nv6Ffgctmv66;fact IeU)3Dg>#::::> P*cq #TtR/0DN3;%]ۅ!]ۅ!]ۇ!];1mm[NV:;#1mގѝ$~1mݶctNXnݶIrn8Fm3nN134趂I ѝd)d)dS<c[Mg$V4F ;#tF)O$IcL^Vo񌋦m_:,ZϓvJwwmل-Hxed+*lf3is;؆V:;zN]JO;: oM>z[c᝸iؙlO6n'Bu)Ltǎd˶n^!lNa[¶="֟ζmcg`{ۺ-Il``{gf6XvF; հmBa{a 8Xmylۃif?6 ld PC֟>,e^ />}}}}3T b8['Ol=ئt1X b8[B&vR21X bGLY bxó,g1<+^tw?r@7Be"bըiM6^N /oˋjtykT^R4o/qKX׷glǴvw8</~_֘o5\G^#:;;xe~sUs endstream endobj 181 0 obj <> endobj 214 0 obj <> endobj 222 0 obj <> endobj 472 0 obj <> endobj 581 0 obj <> stream x]q1 EѽCćX*o3R o(}?3V=ϧ<%l^l{b~^Oxl~}~=+0u_{SW~IS^'NJ}RWʟ>Q{}qą D\#5\#u\'u 7 7M$7M&In]豨[qz~:2AmyAtwұ}rfO   1f~4hts1eL1F h]Ln+b2))-u1źehZSKg(ZS[u1źeZS[u1źWt1źeZS[u1źeZS[u1źeZS`ZS[u1X{T1׆"ag#~̤k1DCLqK,q2Mt1-OV;D] 1).}˓DCLs?x IwX߿aỹhp Ҧ8%oY-8w8vG3N%/}!b)Nq%r.vUrJ.^JvUݔ\Ȓ\ȒV<矚d7}JV:ošjCLqK,q߲Ԛ"a-uԖoYGJOb?k'Y7musf9k]" DjSlDq6ۿa M endstream endobj 582 0 obj [ 278 0 0 0 0 0 0 0 333 333 389 0 278 0 278 278 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 667 667 722 722 0 611 0 722 278 0 0 556 0 722 778 667 0 0 667 611 0 0 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 222 0 222 833 556 556 556 0 333 500 278 556 0 722 500 500 0 334 0 334] endobj 583 0 obj <> stream x| xTE詺[N%Igt6HB! c&]YTeQGDdNTQgtm ( ?o{&vN:ԩNF<=>+d66N״0AwЏ-[^ if\8kޥ 5w'^9P=fhlłcÐ?+ XN=o_΍_W2]0i65-_^y34Z2$2,o7?-]4>p%x؊l|[f,|`jE'WU~}ft&cEMc,+ݳ@AV`* @v.Ӟ'Hp h2eX /4 &!Zq^a!IsԬN)2π!|rp^ ե9^@r!pӒNR7,op {`?ũpe( ҟj&&Ap:17h$'<@ZƉ{cWq1ߊ=J61? ǬPs,t.qLzrU0a:8𹺾=jK_in`N0 LWo@&u_1nb>>>>>>>>>>>>>>G_}kcߥwC @+@ jŐ; ~*~Ԩsu W`/cub_υ]1^w}}?P } 0G)py{`gnpG{W ^`9NF06ĤNπ90 `ZYy#FU1cǍnSFhF eϰ<%CXTX0 /7vVfF;_jJrR+DG"#­I1:D(rWEÛ]jŠk*hTczs0=ALO/&QP(w9\[{\uy5_d{8m^(V,RX鴥ڌth0Ü7ҵD!jFl CѮroʛ{nj-/q:2ҽtk\üF4^+8rG[M>6]ӛz:6ɍy#Wvٮqpsik[cr[[Z68^dq]}iREcKNqі0R*g57;kkv͍!-^98厖 .$UTfq+:<[2Smc(63Mͩ,W5QbuLs %.\H!fB˴BDC#;+6(Y="රΟ)T#&)ep n7-ɅT4Q2җhkcj[,vbflm쀩1ryi#k9>iB=zW1*$?il[_(oi ju`{ao[(絔r141ڊ8j^> ?*}EQ! XN&Wt__t]:-'Ӫ --*T--M.j9LO,,oQ_oŦ:\l2°68C6=8Z8-j;ԪղJVpTvQc{֨Zu:|4X'JV'9=[<=Ϩqh5^*>99|>3 DNŪ00j{cXXo]D,+*IWƬ8\!KXVVleE[wkZ:oꪼ[;&O}e~X=^VWW[?f i % J4Vxsx(vATlO0|Rs _~j{0p&]Bxw{y>5ObX ;1GL$$RIƓf\-kN'ps;i+_,_vH;w=7 M[a- qQO!*< 5|G $ "d&K=:H%' \\=ν/zh t#7$h y={ _9XI$I$H"d K, }z }Oү%sHn [έ"?_<O'g?:>apV8+1lO|W⤱LiN:KQ;pÛyt/C$[WBMT,p)r.!t!nI&msrHnJ FQrJ$Z#8J,s@FX;vȓBquw1`^QliJ,_pqr1Fц3+yi'vj<_CE*s<ޯ\|OJH.M"'Finq.sQy\1_-~XFx 1>jof} |/jr 2[y?kldBMy\hb!#]ns._^?Ԓ9__KY+)<̓Drls6KhMP?ʉ(* v\эq3jRTki5HWwԕ'u46/QO% (RQYEADQ/:Kz$驞9j8J$#bL 5NA#$js?es\[Iž hJd'O|^Lqqd#dksE?t b,Ė^YX^s+Y}*n(.q#Om2SuK*.f"vgNd< b> +%'3`żY"ۊn[s^Ӥߟ lf}fÒak7 Z-u+|)6pWqݐ~Jt>Am[5 0)Oa59Ly6V_gmVM(rW ֈ(l,2\GZ٫ޜ2xVH7yU4Ԅ,HyҸRf?mQ5吐#{ &1Р^DrI;sx4;.$9/NoȠgq7aR>ᅡlp\zӴ/_߰3z2JV;JsH.2Ev2굢gtPb$&"Yi@/IH*"řjMtfl~c Ns!!('|,FƠZ(8ѮHTf'RAE$h/^<$ ϽH1"Zbq`XP.t),jzA K#/Qd*p]ݺ&s]G|ҟd,\'ex^ p;O30aPeLbFgZcW(hq=d!" TpT"2 \\([T #C< iZ%<YpS,j9Njb-+EzeݭzG] =PA** nRDHI6)ܜUxT 7Eݾ㏭;#wCx vuDC~~?2 ^B=#yY8jeTIVl<.UKu P1AAEYVidAQ| )uUF׸e&b2ǘЮTmj^)3cu@Bq%ӒK\'7侴~Bg6tvtW3{r<"ཹD/p#9-OMm.5X(Dž!/p]]7x̮kNSpxy0Ḷ:[( uZ䒥#pI\l8hŸ;&0!^tz>%꩘ad!M'7K˲XG[[u."U"uڊfUݽB  x[ DUrx&$HQ?tKP'61ulӠ!Y+y?|KqQo+K=뙏~EHF\/bt?Lqޣ&0;q$+ .&5K.l&\T +år2\M6͚9r9lٲ zyuzS);1ۢOG6afaLD=3(ؼpFBCGC3gZړ` i78ģ `Q]+Jz ^.L5<io4hd/0C0>$xs,h̛ V@MYPد­8@lT6Ҥ*Ŝj6t:uCϒsA3 lrxlmPsixz J!KM[[;tY%4wZ$b! BTAnC]ggvjVV׋V* ^`\59+ %JbL /v7C4 fp"1 Iaajˢ[P,|(Qs$)L+i-V9ye}tsЮ;+C}kJJtVJL4/ + \0Sh6Q}~ivn;L %*a&EQ,J%vz<$/QpPj^o Sij^{#o3Fr+[~I﬜sDnx['_/TO>~)?i閁喻ͼA6Zch1$&ʼnUֈ#< iYb8FlkDQlF ,vY AO[<>붆nyExE9v3P䅓%/t˫%tmG.Z2Vm#G7μ߿Q6ѕC􇱻*'F\۸HH/=kЛnfaKEXddH ތ|0謈e6$C]ghs"JTiL5"4rddϱv`lOs"K4xv"WP ~y Y.le/3IBPM WoUY`:dab, ޖYyL) o.3{iƧhтj޸ȟ t޽kP9bz`nUVR.M5sS;[|Y{Q^tɆ=cuh>)trr>Yc6:ZbQRV~:KK#B d+#3d/,%a6Sy}4PNQS?ˊJBj#6;fž{&{:^P.v h.+NO[0c@ j怼drYR2Q[%E=z{%n˭. L^WV8"NJL?OgΝxoʋ R>4uѡLÍC\'VLΟ/nRE_62Pw︶yc(qCk'kTv J@&>>^[eY({oUWwUuWUwWIzI'=H} [ H l"$# Tu@QG߀Et&*.?ǙQ3 LFoF[ ynuu%s~9ոt|i+) |)j,|S 5v.by8xS1E[gÖN64_gS[ƒ RKMHjƏOMQ%PqM؝1~g&Dx ՄԿ| y4/b3KD+E<|<k0xc8a8# +YD3 $f,q 'h'tOqrk- A;jt|3KmR#uT@k!u?xp&B;$>͉)j[Ɏ@9>g bȜ]X'b.b15|-}nʼřwa k e~FtN W1_$+(!YmȧV߫d0l r`wq0/ZK o\kRN*-dUi.IkY4@sv\dy86}쉎/Wěx;_rǨe7>`I蚳{,eL,*[W~ܼgN}봲yKY᥂y5b<0X; b^ qV.ɮhr;MÀ?ϴÛ1Y HPC@1Y~?g"E>`O(=^>-tCz:efd@]ʘ8~=F,-@6-Qvd{@+;Fҽ:WNjײ&U.ݽߔExOf`rv66ZಞM{'q×*_q/|*i#?<8?|,s=;w^d"mdW_4Nm6qAg?;]0H)]D屟xZXg%'n^s+腏~G:M}?ZmzO A(8&'Efqn8/1ϛ&]^sQ16l3P ndӼl؀lte?LPF@HV@jDVxn}hA{MZN54/;2E3# !DM4 KN² od_2k5t ]< Kc.mȋCXEX7VN9uP2m5;F2qJPU!Q$ƨ1x*);zK[ÝFTTw3}ytE#3~hC;d3,(Eq WTi>QT-%^Va.( ٶlG= ].AZrOHpAdt)J?KE-j-ϐni<@w~Wĵuwa1dCJ7I^"o*z#Zu)K(K_(4_wtj? 5DnjTS^ֺCMs*.p8hZɲjȊ2֮׼Dj_&٥Sɵ}O^z淡vl;1÷j̜W[1U #FXkN7I7.|WQ+L߂w>6n߻7=[?a#l76A}cEV"q qC:EQAN!(kAH[, V>bf9ga4|* k-"/-`6LH@F - F\20Ck-`V@Z(ʩx'w F&dO@v+cGχzv=%&w*d5pX$YZ̈#1Y-7.o󌟏#i*!bD%Fc*=F@f4 YD]Ku<.ZAacSllD{RX?* Q56RF>Gѕ:W9ڳ`usiRn !ީCGPp 9泞gOi)LB6t66n7#jH( ,b`) J_P9c*K@8 _P@f UUTl~75_}TcUm-슝X3_ 1'~zď߂k^&&UNnxZ2Ye^P1@@@KΑJwy* @DtKw9tg=ًv8wặ~C7<,𑎦em,H"5e-yՂ5еL+D0+C[K)idʥR__b2uXCd'ooWݎ {>.a'V.ڻvm-ɅQg^'pYFud$!͡9j_XFeٻw1Y#H=QXQ2*FxKfxw6sٕ*2F۫(UAu͢?=oUmͳvTp}7[}=Yy\N J.cYQ}l7V P7S C6[,8:٠^&6]Aqoݻ qx<^,us Y "Vk}*Dk.y{cY4[@pviv<̥e >PKL+kك.Mq ::IQgf<|CO7^%s߾aQeS8YB܂bRUlP M*XVC8VԤh1nHB魇LCLKReN*^KX?S`KQN ,CE3Q9mbzV6u9e~O6Q=xo{|v.S %<|EK*]e47CՋhZofNxvOM6de'=w3mE-+n| qco؉=Ppe [=ܪpj=F:+ʫW1Tx '7JߛqoչG}/mve="!,ۋ [[&zV;p}ֱaBZ _緛w /0?L9B{qƼRc`e7GGuB, `RM%M`0!ɛ@~"z܂ IÞn`33߳z@u 3(1  z\+TrS =+T(ЊhZ`Gn`p<+Xs*Mυ3dn6a}˂Ό==w)Y3;R7z֦{ /0:l 0bG,Igg}'Miþý{zJ.k)XGJ"KbEtTuq^$]jJ9Rz6/'"/{].z@"Y:^|`1iA/~#`EҤW1UƓ`dlh껣Yr`M[ۏWQʫR‡VMpf>Zgg$HO-J\J9- 8KĘ9 Y8y/V[8Hac#+J(FdXL`тs& !R+/IhIr?r8`|HB&yu ]%.<4_b'+ә F'={}^c|~_ ">EJׅ`,rD%+b6K8Wš#rz O=HI|e7i7_OZrrZºnmz+;L*Jx3ʚvQ NzP#ιgJgV5mRӈLI+o( bUM0"#-}rfx^Uno;J#uV:keʰ |6$5a5,‹H dBef0R=ژK{Qu}Y<74sWr ˇ _RP#2/#T'(9c>#eTMa|{;Mm >UH%%$:)i}R^R^ ;㙒/PM, YdX%u$s7A_JI,;@.(+] )YmlɵHxZ4[l>f%x]oK3pu:γ++ťF:}hrww#F̬q~ dg/Ub(i\dx7U]O&MYG#¿>`+&x$> QǪ"T`m!p&Z߻H [%C-c|&2%+?׿w.vk,E߸Yx`S{K\T^n 95Wl Oyu*RiMZ;`+#7[e|Y1-@~kx<:6jdFJ_L|[E]%e˺ʘdW8'x7pXp/&<7gssspB5?0כO}C9yA)"3c^Vj 1Ba(A qr [fxݣo޺Ol5?・'0lr`vӁww8fsׁ-xjƇ?m+Z>xF&cGu[l{dŦ?uO׍HǙu+wmhwz 'm?-~׌_5ϲ*3.(*%%Hm2 Wb]g8ϊ]VlU5|7lp!voVRUTv;<#YN`G}G2mE4/F1.ܺuP a؀Px\Ca ]ws[RG}a l97m{;FMzpJKj$ݒ5klS#;n~Uow֌7,M?ZPK\$XPgla@8 GfѪX-K,c_&e/RS,@l%+hDjH8n6q{Q;r+]X7TVVn2v %Ȅ '82ז25"fA(`B@2,hF僜 D|>7ޥYmj"=CLC8;1;6/ '_yav^i;]>>׹wI{qq f,i( cQ#WWDQ:`rY~Qs_n9]m(4C1!])Kd'>"oB-[co->vd=4f7Vg-Z=z槖/| N?{S|xism7ַ5dGgݴKIXѱ,‚!6p&k w|>>BhфvU4WKێK.5~4}jѫ~=ji MUNu;'|2Ps~UlY/sk 3kMB[k&ڜ?B#2q(WۀX7%6ŊMF,3"œ1-f`LD* TC3Mp!-cK\z7VlJ}E&l2eXsm nєA;q z=ss)Vؔ&b $ȤȟQr-V i݀N52&~O6:`ײTg\k8_<>W _{.WOn846ovثNo{30 0rd (+âl{:0 383hfYeefYij٪mk%=;À߿G'g=ٟsRqکٶIғvvAL#^Ⱦ.9Es6DhTƅ0zv0Zv/4W"5DU"QrSD(C#}@(DK6Bgl& L) dԹf7,|Ѻu^~kx~rÛ6߮M*;cjI8ҏ]V{۪]Mi˲t.[> VR!TsN@T&CHFʌ2s'% jcARN2_D%VRTrVzi 'v?A=Erl Q.ZھIW~ܕdk>50gF>^Ԥ$H H*l+L*KD!~RF&C RAfy3p(0FGMO^f,ѝ%ѝcu] 3A@d/(AWo=<#=hZ#x 'EA2ޭ!JȈb;Wѝ$1ǺZ k#j%XrJ(35I)MTF9 Gr(E ?<ڏQttB8DqH/0m\$pf<4gt'{v,B۸EVTV{ϒ?rYRdz1Zެ65?6'tmԴ ,|M[aԒX{θ˩.sF26j$`| F*$b<=X!A > ih(80#0ġYSzx,RZْ&NkKev_]-Vthe` 6Fpp̖Ź'B U2' &p"`*''N ŀ u@PP@@›{rEo$a)lY>`qHOr?W4,,[%`LfaJ?ݨ񾉉Ta'Q Ha9q| ow$ܽʊxwt\ukKNbej4]1?~q-Q6R++h`3GD:Krn"Ar Z"jXĪ|$]PS%6$)C2)CyiPVķS# G4 ҝip`!HX(cϿatC&EwkkHkȆa-9hPЋ)F!#>3K(=Pi i fT&1[zS{ŹB;E0%HJC+Un8} 3FD|9@TՑ3ihbbSDfBT!cdkH*UG#h8#e t7.Gb9̠~KeG/g_O%[dBљ Gu*u}z^ʶѓ(f}ڒњʶկtv4#tNuro̞8ǫ/>2rF~c/{C>s'-T$O7f4=қ(!^nGo0b:6Lyze]&BY6>_05;#}݊!]5恣)@m >,f9@M(ʇSCɣ<"e2Y\+kѴ< 3SQ`c(NV~`k$f ?(ƊMt 6(581Q켓BӇI[ouz5qOOlzee&vw-|6X wa9,2ڝZP\G # DGю ze )a|j.>ML*^Oǧ ""5 ݖRF1i2&Ɍքh&Dё!m=Q+Nq]O UޚE0D`Y ]x얘%ݧX`"r` OLXs;`c53ֺ1Af7 ;'&$dM[BߋyYOQ}K,^N@. ˠYll6 766C|E91$(C!S+h1Bh&<5(Vƫ3j/bWT e*(LJ^TZ)B̛SvBVN*-G+`g+H (.+FJ~ r_J6?:O=_tVԥ>.Z-d8 °pTc%8(ק8:HEqCGQW:%LЍgg)tA7H]S3 Q\)*?d(A6XV${XSvZvA!cL+c\&v ߾g6 ).DǏ_:S,:QdDW2]EwMF:σ5}GǬ\QzJV-aLl[Pִc/S)gR7O֩.^heՁE/w!ε٨CQ!ȿ+}Eu_RILx`|:%t:N@n[˩9Xsb_=!bqHTER(tMG9,gb<$Ζ^^YvInQJ-.^O,>*v_w_?ߦS_T_ ZC2+B{XsXs#˙~v־WJ_+}WJ_+}?Dw+{x9WʿReQQKF?}s(c.O6.cc'ˋo6!1a^ ?&g@ꀗ$Pfi445-$[ʨWJ_+PU|G<J0䤆aRқDt"R",K0Ɖǃ2xR<3@erf%O!/EQI)i@3TbTYJ*(a*ͅǓ ?*2JP-^t# ThZKH , \A&a؃_a~=\-I`0 /X `AAՆs",_ :r7n+]-OH(]^Y*,A{Cg^f)uN:.€?0I"X&C *HEahrx4CDhR܏׉0_@pu֍$x"L#pgc<&,g!J# kbI+'Rˑv;`4w&i)䒑GN.&l"y:_#XPL@#?f?V{w_C$jwqcc|)p7_ǍvЭ|b m0zbyJ&=&Bi,M;M$1nޱҨlj0hF?|--KzBo1G]$'[Ŝ |{Ñfm&IuK<#dd Y##D9GjkHŵT9UtDP/1 ;& #JXMV 8h$X=˫+NaVM1hz,XO]n\qUQyu#teU.l7,_iW贕\+.()B[qY^Iu~qY!7 敕CZ*OU^PDUJ"*.) 0@UꪊKru\ER ڲ-ՖUikU喔rz/b+*/B(-P;D+,LjB-UXtdHݸ"-ir2F^yYRW:RruŕX r@ 3 W`Qs=4CpRMK6pU{~GN 5Z{ԏ渷qk_{?lb^e^c^1 {/|wy/hw4yNm~m~mc mc|4NVF7;{<9l.;M dzɾҋb &;hl!ׯxA!=?5`0[D8.#_X٢mf Wh3Np%zV|)]-,;Rـ%EK~BN#*P%M[R K# ϐʓEY4bz^>b~5rdÆ#pz!dwt;w[yCo9v~:MgP$I7e΀#$V);LTR2͟O8dipX-i*7z{茆fŐ@ n%qt7JS%q|DWz?L>8ՁP/OgnwhwACA@zB Pą^FhŘ-l^wDj+̑O<޿885mpN^i~gtaKtSUϴ_^eKC>5BŎ-Ot3"#'X7P?˷.GNļ6uC7}fs;May-Xspѣkj> ~׬;iEsaߖ I'J'}i~YC*{+y$9K5hg~}*eK3"OuZm?2Σ:/]^~ܼ֎u g来B~:gsW{Ϳl>#&rFjoJ759^\֫ ֛8gl|Y!l~ sv-/|DsMkw5;׼CM flj>>q4u-Ιˎ.Uȷ?Qy˛@/9^+tGbwjA[SN0rFhw:x3!e@7H{ ߅o  Q%?ךO=4gެu""^5v=hy.%ܤXKx|ye3`ۼ1[7{~SӃHS2 Fv֤w^Zp {=`u8o rշ0[?l;E'mܫOޥ(j;xWSd[LZ6U{.Taz/$c~Ӳҧf:] y_^%<`[i qMPӬ2BD|.̣ryb4KxKxzDԼɵdž?p羅<|4݂ՂQ(39=*_&c/XN /Xw.E[.U18`UTV#縦t.6#՜ju…sAƕ'9xΊdmx跁hZw[}`レk_v?(_`bL?V<[;Vyn䰈UQ~Ҵ"zy0r7|xӼ\UOlƴdm.z'KEe{Ϝ/Ssƾl 9:ǟXq_m+ }*Ѻ[Lˤo,<¡s1ɇr^vOw-zLrKfN:V~Nl}?TEW隆W筋.=xAf){sꖟVn?{3~ɚ8"gTچH灚OK?~<ħcNM_tL#J;Bl{{#ú/#ISI"͛w S'i,vn~x8=eЎgdΖS75z{Wyqo%6]\w}Om\O@l"`/ܽ0c^WSSx{9 V{W1.ܧ. ~8p|[g;hxrcǕ'>dR F/|hE?.h_?6]xQ|{Mzֺp1y.}9{+>0ےzg>qW_[{(\uzSCmLs?7Ɩ9AM ^k痔~GM>z 鸧!92ɎU.2 JZmzF`Kdsa :Up@ Б ,^4AΠzg< N48%}<;FW-8a~{1!?h}0ʞ ",&UUVrʲ!y9?{`㎯lLt[Jr:|;<8C}Fǣ/ٗw% ߔ^AҲӄ6֕PKA|}㖖[Z?vcȢ_V}~~3UC e^°+G3lҀ|v|$~窿iOh_~Z7|ߠxޫm}=-l:7&fAiŮ7_ $6V뗭 lu_sqm_m|Q>C>|;;jWНx8nϷQ6sbƻ~?UR]Lݩщq",>T'챵t+"vqfJI_Lr|?33<3|\V [ɥ_ق@)bm"n.3DTuFB&6n,<5*peQI n7ᕣ7AN5;TB͐*ܘڇ hUnn,b$sr;89F{Q"?qՇB!yyfM/=6q[x{~JA 9!w8ArwO_!/&ZzNG!Aل)pp)$%L,,~Isu#y]oG[z: %΀+U ,a`-Rl=v*1Wq!r4X?t뉼^Gl*tcxn U#PGԏv";x%BVc\="w A+@].ҥN8g{k!Fז,ƚm>/oZO>)}b̠B] UlzXq;xmM'D̓ SFmqc3H+*+jׁZVSWڐїn}1ؾ[? PEI5aGė ,y=h8n{(G{ #?ySW2Za>@O[؃-6VLYAV1ܾ?Ua!& ThB+!Q>cRA-P=< 2몄CNݾO-'zM1/{;zA!D𚯸%%$aS;o[<~iFF ټ*#pɉ7TmlJ6YFk>,xAqJMBͮS>a~Y.jJ}q@p| >mfЍFAeWv@cg_Xf_ ԓ}b+Enpߔ c};IO6C؁a{-@knԨ'Da/,}_~>d(ƒ@ w-=?xNK#w~QTs7Tָ5o6 xcvf*H IJ$+ mcD=EBSff:V%IM@{O<(,֠r3qg"."w BV0ۧf{2r@6⠽12@ 妉-mh<=;!n8",7HO3;cLߊv*T\3tB~`@x ^sҡ߁|=<i7Z|y{u w~7.4wg~Ji*d&z#mnwǫI"}msN^3m-,4(|יW=Q'DMoqFo5k3@"H϶\uG~ H7Ũ]"CcЬ`>FiFApY}F=T%VjE~|9ڢOS8ޭKm6bE쵳"]\X^#/nC gD:V -0hZ(tm15+V̶l֡P0!P  hӨVybTmBIdh o_[\y.뵎"m7Aj!O1}͐:"rsϐq(]IoO Yn/[;sXРZ0"`%5te4G^j6ӊ#Ycw_]h\^]Ĝ#^?+7|ݤz!3Fiђ8"T<_L%o fF3')I0ǰ1?Rz'qAW+||q;Z *c`H睄^"tALZVȴ<]C2lMK gTf$뻊'٭WOd6x>D/.Ev䫐[ I.UXHwHa/dR^NT4^Gv|l5}nNyuꋡFqy- y!M/ ^Q> stream x}Rn0>LB $8~ː_Ey!X;3g>WuOӊzRJڋ@NpD֢{ԞoUzqLOz3N'xw#LYaqqP=^ mZ귲⻲e.m1 $pJt) ^LIH|'@ɧTuOi;lJSʺ5MfLlGeɈCtf;2a.en!B·̓t-6h4?Bڎ: D{ nF~Gnʑ=4'>.uIn{ S+.nX5> endstream endobj 585 0 obj <> stream x} xTյ3L5IfȜa H$$ D$@$"o ߯p-UD Z"qZ_ZVbEh?k3_ά^{^{@HdmҜ7uiZ=DRaǥ뵇u+QD.Z;y!W\L,Ho.l_}8q9Ye0-_߅-B'D5k;W70ʣD˻ܛ2?ښͯ .j_yf.XM4fZ|ŝ]{99JHl~^[YgB𑂾-:㯏ZeVC^yJ<_* ֤พRiIAtƸF Y{2tIRt!ϲ(n(I744͚/yVf-3\SJ%>ius@\]t@ibBth6oo8O!OE]APfڪuuhs#mG{kڦ|6FX?Cf+LYܯr"T,j|_U됆=]4S1TYС_?i7lU듆4! iAJ7X>J"IyiSP#bꢫAO8^)]k kV-[huZv__@e;]<زoZzS-'[&~#NZLL<`E}3^8zѻkˎDw=s䟷 K?rv|B+TJbY#Ùsr"'V~ֈQǔWZF&WL\u0R]̘pf7Ι;7/h,<Q0o?dK_g"y=_7x]ڋ֬^rev.imYa|Y鸱%cF q`P+rs\j3aY-f"KѨ6Mr0p9E9Fi6]kڙ2figJ!y$I$S*=Jhc K] Ǎ,#@G>y6^vh}[ۦvF^Y;r;S^N (@@ۗsZ<~d(M,)Pg j fcm ݤ:9Ғci`i]j1\![ЖOkN7È 47FZtCjb&bVum[ѕmX¨Ns%Ramj jO ^͡+ Z5Ga{#L`3Eae(0k4i `N"鬠hGVR :-V h+j@8Ӟ☊? ?t5PH9Ry*:N1F4.UmT~XbaZ3%Yh%Dၚgfy[%8TW,PݙohEltF)Y_1XS[$OG2jᔋEš ^3[itd`Xheϛ+Cg'Q>C=GTr74-FmgՒHx<5:,'8\!00T!KR3=| sit贀6-m%z45opXbM}j9=* jѥ$c7E١H@_ -Ko%9MmST`y [867qƧFzerLQDL-g_Ǩ Q12xO@Ac0 19Y$y=IRԨf?qqIE%l+W'jV8!;QV)H ^  :xɉ|O!o "-8}IPGEc;Z u.́+`t B4F5<X%*6ʋ"zϒY>yс_{E .h"NѠ1H8FE1pJވ4fhŒéw ^DC _ 8t'`҈ M# ӄAbtU'XܾQ}ٙiqG) eJ:isboW ^i4. t*⼙c&Z˒A7v4VN_:KtF-!90GPB\"n4&ӈ$ͣ.l OZ_(C;ע' b4n PS.yDxaKmH:%\Ѭ6) ߪ?{܆4XvJ0 QX kB9gm()l1z5.z〈 .sw*܅ƹSgaxG.jJ3DS%8lsp0| ;ic]%>O I# tdi/&tPAG\' McR?+4f!t-Q!I-W^> <| AVn5ۧԚR` N@ z1fM^<%jlbCz>G3w~ Wp@M$ʳC]ֻQIۑIk7#'Ipȉ$t%r" .\HC>6l|*d```H旉>n9'1׃A3z:Yϵgb="f=XL»(N 糞gYìYO1z4Vqߌ2Fl:г dr?,!}0JaiCEY,,]8>exXFA&jba `hP(H3OM:'֦T|PL(]R|6P!W H[,.Jr{V⊱/d[m)n/xW"&QVPQ@^˿ZmF̾(~>Ⱦ=Yg|UgJbpc dfV~݀{| wwoרLV\ЍR877w.^__URjh7*ّPv4Pn߄clyxy<<\je}!f9ǒeQ-NbX,&lG!dIDVFWHw"1 gK a^-kwPMh^ lxS '+5491W/5[z57ե%#bG6D"wiu~uפiu_F~Ha^K߄]FR#H ߠ*f;Y_QH>i S\E" 1lȑ9 9 Ni!G()wOR!7LYTl[̄\oa F݆L[;]b2y=!l^ѧ"^/D+$!eH"%)En4F2ޤL Y ɑEk@}'MFvDRoۖt,wHNi}I"Q=9PKZz;&'"Ǘ1֍coEgX˿\TOcXӍpƖ^ F.J~nmpS><ٟg?.;@UkF׈*l-QUg;SU*خ@-_} ׯK~`D<^u'jGkЫk6&WXp9JAA<5%INg"#^R_ JLX@)C!JIy_ʥl>E-Ѥ{$ z[ÜE-5NiTB5; :T* g}/Y->g6zHOB{T )(}A+zA5c)$I0h($nUuMM8)s#ţ+Hg}t ZOy,?;6JFʠL#[عKh%_Ot.]D]'ђ5q{~8Ev*Z_:)yZׅIz65|-W,qކ߄3m! 'V$HߠoяXfn5>/Hw/1 h Bߧ,Vrv5ľfGK}^Û*~BZ.~ 'w+7(7ޏğ4Di{1}"[S9h泫\naAag)DZM܃QŸ_DrKC;A"ZhI mP~QNΥVeSca\ۧFz3N۔5w*hߎg%{+fIiץY~%ۘߓ?(-䗾IH5> ?>B\hbc)EozZADZ7]ln2v5GŮ\diergigØXt%]B/6zSzڿf'l9v5tKl+e$LQDRz"ĴjYs΅_G6 {| cLq2D"\Z.ݝXF%nшWǝ.mlc*/Ui<g/]xAariU'nN }"ݴc0㽉iRI|/c6ZXM }ǬP95˘U&KXA (?"م#>_#*Tc&s&E>&,cT`1)ǸtNfEC!SUV:UEȫ!7򻊑0tB&?[p)dPK㏆*Z)W*+9vUmkQd?'Y+ * 'Uq1ƞmEZVR1-. .PLR"qc=X&s؄ʯ.dLKeFz[ѿwd'OLJ&ޓ#+bMg ­u_Xcާ~dƓ2֝/ZxpX(> 9?xԧ/E[ kgj;Y,[m*,ɶ]bit38[U|d>ޝid02gl|~'x(+J,:yv\rU~j6г_Y/簣F?)nz3Ozϴ3<6fu2狟1,YYfI?mcMÞ#% ;尜C&D g(ߡ+{<tݜ >Tk2=  2n,z,KFF"ݹ fT)b%kRWY`ЕLʄ)0[܃[S y""~w={xK<ȥFT̀'HVr22867"Ȅ D!8p u`Ar36朼cӇ$z-b \`DpTyilߜS>ܙS=Mًr2wd]U湂_f~e&6Vk,TFM|Hr`yɝ=o,v5a`XD2{D 5[oGw7v{20L[az9QD))n+z&?:O"ۺȦLZQΧƖ&@"dqQf30xz3rpN^!"ӷZ yu:$\͚XVl VJ'``4+;.[_^ꙭ&ZOxc[NīV Oc6o@6`-ؒ4J,*:mL spͰM1"8j`>2kpWX+\ q +t(aїS0M +\)gUl#%CźB.^- qKlVșV+sXq)<.<ᫌ敦)Y/_5j#ӟ]9Tawa">[{R3M3Ćra"WEEDMC̰(@'ۭT>q5zU(TrJED|p@GV7 [3]|`a{V6_#x>t-M&vOf >Yl:20?myk8KWf]}cw ,t?͋ldz[ZBQ]c{$ga;cNlv@+<;7F*;\{b_e}KI[x? kNOs \69DŽS,eVUE釉dFZ"BbZ9h޽;r2ݛڽ.+`RqNp'ǾoҾ>gkgvM6c7 p,IJ(b# jXQUk'""@Z":htge;nOȅU$VVγ/%zdwC>$}H,2M}G1i3ᩏ"OoAvB{8eՂg8 W]//|@!FYsD ^;x1MZNBTR dgR(ڵVE%!*Q%T뛈P/+7d%ހJ8@zF$L$K"Uvϒ>鬠Y{6?U-Ytэ)zm7^9jՂ׬wxEa/+K=hw@xϓ!|Go d',d}.B x/è6<5<5}X*f\ZЮЯƬG m~{W$W41s^':uw{r 2'Yx1SWtt]uEVn 1L=ήƨQO]El^YTT*U+C^n!8ePCSL)@G;J8]OV#l?^kS܊r:s#YH$KʩYB&Cf7BeE֠4K-=¾O\k\|2~nزO.7-q<7a;^D_y ֭h8¸xѬ$3 veS~ǨX'OB%5D.~*~ujMX/ȴ!D@ 3 5*HM}.H-n#e8,Q"3`F%?ůk}Rʞ1>~V8[yAxf"vik⫒%?.i}~(5̎H5y$*!Ao9ް\lRu~'FF-:N8V8N-:NE_iAӂ~X7D !t{j*>,l98@y!(8@'\M<|O4rlk [6{iw_k~_vx ;'i]<}+՛ԻG#*CV*SveS"O$w"gR[8zs70 /-2Ns9lslx7r$b0B^ө[gWfV,OR!P_Al=W<,cMH?uN,/9Yaj -bAK\ `I L> ?Ѹ{^-M%66a:HQ2< [;h@@Gbzռ8QfR,JXLqa(&95CNƞRǗih5 jX=7}lɖYA ,"< ,"0qp8KS*J=ǧt~h|9**X9nJe{ʕY^ ~ ֙I2 ~\$\Fe9`% eJJ0@eɤ|"*ѴdC8MFHX#Dܩ@EOO 9;ٞJk%会BΦaȹpǓjK6϶[;F-J]TjBpe &̍_~M[, Ɨ* vV;dk؝K- 1NPC EXWF֑8rƝ9mʍ.N9ϿgC~+gybN&QdʹWǢ?Wo1v5,[I%yF}K;5gl&sR*Ä =83_Rzu{-1_dfЌs`GMvM4@&l34ŋEAxq]im ]zD%E%u^rta,pi{ˑjs]Z*`845.6v-d-Ď댕Ep5h"WYQcbU55r1M? Z$zYtߣ^hS3k#ƣ~E #6Hw96ހqq"=.CIvͤH!Z4iQah!K*!+!JP"^Vjzl5 6JOO*JnhҨӮΎa$HIƣXP +p 6R,,RI9 +rT (Θ_jE‘ bбTy[Pz9Ͼ|yvQx[JnOO]ظų?y?%IDI2tB$QdX "'UFMY<=Vl+qq{1 c&_cմ ZAgrGdHKj<)SUC4Hӫ WA rUz.]Z0i[AJ*Qb 1fI<Z!H*d2Q/6StYZJqTT/-gFl*T9*QAك~X$rvJOrB F2]lGڝKܪqRA_t;짽+ĮNXpDԠŁqg—ޑs{:QF?(;?-߿_?;[i^tEmJg=.#X &nCyq,CO8Auvb0iw mljv#uML9ҤƝ֭algywW`612ṁlعay$N&_17fDz1{{gv>mf/__HHN#v0 _O؁? Ũ3  Sץ׃]\Ґ!".<(rZQ.tKi U@:nNKdiMd@i8>SO:iVǮ^3X!;A#{&RLc'pQ68K)ꆶ Ŵge ^R7xmn׳z^ħBfȟKl>5VHje0F9Cɮee+!t"V|5n=4+ͽÑ#eeN-c-kKz_&=-LNXnX4z*}Ȓ³gJa ,( 9zXE ׃gmx?S"ِoYZ Iݔh ^BOK ym!vu6"iۢMۖDH޸NlG oL,J1AYij4 X#Da  je`3dHv eh\C@R8ZOnl"]r=$ߏo`CZy}yΑEn " g$'w`UYoBL~IUҒaQ9;~6s0O`7A@ 89ɧi8tJۼ2$>F :M ɐ&ɿ𞼯kH9Nܷ|}#sEDjd钣K.%"필4*AdPK%2#Vf.xȂ`&"g=^X۳~ p2[w(M@yG  6 NHܕZ`6Uj\J^]_[K*楌>7Oc'YU?է܇gO `z/)i,XdE'd[->FmکɊںlVnW쬶ZExlRX+1C}F)6l~>[:$!h?τxgV7{)ιn9agA! w(9m*}>] /}nc3Ʊ9luW,ρ5!4N9O.I~h2Ș1T*tAC86C|Y}ǧp}tXǕcl%n^`*E0muv{*SgH]bD ܐEdcY8ˆ0- #XoNQ{_yG!Ʃlj:_]v*nVk;rYpEku*/G?[ YQa;.pG j 9HB랒٘;dCά2#  K!^pOHAXAݒ6!#/x}y 1':A6cȉ 4D$8 5=c#hۥYH6>%4gDE3Ef,ɲVRCCbPX=E$>_4FY$+zHZcȠ$$*z"pjxG)*5%:zwOLt"څ%A<͜ ȩZ 9:x5d@JK{ax*]tѬE$8xT8{ AO'pXew8<&(*Tc$a\@L\{Wһf-jts&+g-tog,ڰzM!`Λn2x5rK!kLɜEҥeLIt)eIS:9BN&,uU9x2YhH}ȎHUt//)M&$\,TUdbDϺ̙Q꾿 Gc6 LtOuQ8ѝJD /u 6CLA4V1%*qMpgJWO`?+!3XA(6^ 6ݪGNsv0^ᯍʺuZ?v9StG)xOs {*B$j\P,Ӱex۽T: mk1Es)(_m  ;o ;~#C6 H0?ܛHC\L+Ђ"<-h䙨M֚'윐$ O} 0b$%C`(4YN, -fߒ5) nga2SԲ~FG"qsal9L^YGtۤ*Amw\<cѳO_8Я_,TCCW |h9Q s_Bj8*T\7F{@WTf-!C8$tt%JU U"ҩCk_*>NAO3d_濿7z _[>CÒΘ7{nfF+sUfQpI}/IW]ouh^$-V Im5xkh-OOyv_oH.}` 9,bGV̯{)YUc"a3XLaubX_ [8ӳLYFt:c4u+ dX]崐"dC e9ƅ5#X6HM!3-Kؕ;_]h+]MV>ۜn39d+Y&jctu?I>M:~t'3Srf9xRiNҘmQ=RTGy´0!U:(4ۙtGxyF4 FcgI28L(ƁGg;T,TTu XJi}b 5|scکK4Súa.@e=Zm>Cʬ確? gFG7'_ k%螁)'a3ڦW"%_;/w>'@9ITׄ6Dì&kg'|dV x oy΢$d> 6dэLmqnI\O6A2ףՏL '+!*jXQTd t/e1".Rw [V2egb㶬3me’IUU2i09+l$uIl|ns CS uR,FTF x:Zo-1EҾI5_n'Fd/RA&G[45L*mHhKY̱Xk-́DU'sJe`'{7eUnހ6 Fv M4˱|pۊAրnNBI2Hʶ1J']{]Xx C ^AW+01KR[P%ϘrQ%o+EUJ"=a2)F%PR4 3NZbzL9Frb#CpGUm-VM[Ѓ B|䋍p+O(!ݥ͂tqd3?9i|6Sϴs.7$dCiOk[nX/l7>}툟DHG:Գw$M}z(?r'V5Q* <()\+-,iohVfS5\_9teOS&ͻ|YZ2iTAǷ#^ 6~wedL:ݒ>'4!# uF;E/JvKE}kP&MQ|W/ LT053b`JRibv*ƹr) Ub<_Ej*vztTjܭ;RzeȨJm\ ĈprpGja^ֽ"T@dt\4D˳l?B&E84!QX :p7. RF9 KFqhm@>,Jw?>!(Ǔ?hseb}_B :/M5LMu(xo֫7؃嫋?\ݲe~?7~5п6w;DL:!z#^bux-òG<:Dxhqg,% ӪOcQZ{-Vh{-¬!5fn@5I:76+4+6/4/& e[ߢ-WjvMjkQ}e.kGAeTRaC_2w_@I;w1Zk~!>D FvN :v8p,q zU_4V-%(s[+ŁZ{͉;/[3w/z۹U eĮdj_S|¹;=l$*z^op[befxV:v>@&d I*F''LG9}dtۦOf'/H_OϢ'1DPh1DT3^&*K})7L Ӳ[ț~ mͳV[DҩHW+Hŗ @'ւ ˠCf̎͋F2FB1B(sG ѣ(꣫bNW!wz[ou~8B<䢯|k]koPyaP+ӱ%;^m󸍛11Ҭ0#&ŰhUguE-/-cZd/(3Qa#0Iz 1tX>2wg@; h*ZǴnK[CQe=F {; &4% ٍ៰c Ͱkg88 wtjd)xM=cùʃaqB9f7-tH00lAj0 5o /"IVov"ֺ[O\>Y1H!:i'1#KZP|"9 iGc+{"!J:4ny"!|WZwiGR(ϟ[<x^Ę|Ara [*ƤDĴ@lX=(TQi*Gv:n#Tz0D@PUO#49դk >4"VK:Sr c JB!gƟRžjd+rpiE^7x}L]}s sݴw|"ȼ羦\N3J9]t5w0IJlɜ/0v(8.P.'{[NWGо72fs*lPȆ {7XGGsPqԾ0.O$ \ݢ* FR0VҧsRq|{pH_7R$(IAäD@p?WMϙ M˭{rc# v:h" {m_\$*urude9Vg̀ȍTQIU6weikt_0n0Կ ZEGLh'OJ׽IPT1Qrp6e[˭)p=I!KġU/,G:p^8cD6wO f7HW2v@X]Y*r8;zmgc6yhY/gw>:壓>‡͙)њZц]3}tG[>:3zG[>Zw{9%VST5CcdY6&ekx*+s\MeZPKDBM2a*hC~S%k7XC2 l4,Eb!z :ւ\!cPwo :^7P Δ*)gJQ)&| b)*UHi)/?"-5Ij<\p&32 i0"9b 0wN P_کH_@]2 H>*C jÚBA=9^쟚b*I"*F!c*ʜPImKDZm=p<@ M 0!`5yE+|}fKGߥ/Z3>:ʫ/ݽy@%W{m+WN>OɼO!9!>o2}: Մoo3Pgf sa 7J.lh{UoUoUK~ N# #7nSqǝ]\c?uj$aGx9%x/qcԳ Y 6rZU9u|+vq<xҏwv? nw)QIN0k-HtَP!e˺%A`)ދxiS|8װx6OX:ٵ70^%J꼡øp$X%,Dk_ "D%J%AQIhIRQ#]',Vs\p\->ϕg | [QDxrbbrm _,єXa/.b88[ M,-(BMz)u {g E~[GM1+rb&?&GhhІd%gp`4Fw,.+@x3DT*,/&ft4dy=~Y,jjS3Vr2C*9h>vg Ck=soqǃG^ٶn{mcCxJۿ[onp!"\d*{ kYdwedLvVSi8bivCV0vajt6767HZ-4o-Ng0a‡*f\0 6<<_h^f~~Q1hEӴLC 1*cDDnLV)nk٧NZ<l(tl9 -'L( s ^ /ZxfDWAEfb{ (^(~yGp ư(g !; 5F°2Bf3~E||e]߼up!fx`qrϼzD0k,kg6Q nYZ %ɒ,Yg8 0܌"oT [} +Q͒mTxU67958qc((s:|Nj6kAōY ~KID .s9p%}gҸ&v[6.]C•oX%k0A#0 }S¿HtGj]壳%3aUW Ww kNcxlc|Ͳf3Rs\e:W/ɋE"mWWȹcr)s,ϭHHczFyA{F=s#j<"N=5 Lk Nfk#XYɥD#"$W&6'%@")qg'/ ECMQee-7m5Ch܊%lE:"bdzOEf(Kءxk3}{3ΖJxw&] $ L;^vd#{y(mOwo@ cXuZ%I44qZ-G߂F`.h֩H Ruzjj8cCgo nf}p^v|{pAf (5YA0``-r-ŏxQ$ %X@5.GLաP[r4n%<#YQ<'|+%Ll^U:6e3Q)";GT].+[ѭmJVeZǮK?c<)nU`~`Sd|SQLTg[[y;m 9b*إ` xIrW`/J>,{C)0M%vEeYa8;M鼢0a.1oҐV-ٶ-YyJm<ʖOH21=Н9.GVʝXñ,i۸PPk?pZ_g/_}M`W.ϝ+*q$+lCKrğܰdBM)T(7ʾ(!Zaȹ<+\>HBr{Z鈠+D*!P| أT;/Y9sUMD{AZi\>MRj? 'o7Qʲbqш?V]^KLdg`NEh*kr`C1_s!H)e br/#p}0D)+Z`-=&PԙC1OLc) ңid|8"qb&%tN)ù ⽰G!AT'AMDy#`&<' ^4xk 2\Wڡo5CÏ,~2:8Cfk lΛtquJatnU\N=v1v6.Н4)Xqtg,d=3qM;W( V,! buH{P BjK`n5[].vNnnioLwMBt2mZp'Qttuw}AYp<N-Blahx9ЩxJn^9'8_qbg?8#Mxf\Ua+l/ Mr+ [fפ02Gt!\po$@i/ Ӱ6%pi`MJwnD$Rbjj ]/%^ x) $M>}$gĴDL0 )%R?Fv2],8عeZ7p3%!"?$D _K~->78ldTsq%)@K+Z81WrӅy0urXsmnXu+wvn;v.a.[.KI\"Vq!xMѸ ~GSJT#ֈ\beq- m\P{\Z_i ~svt 1&=]5*>錈46!A u!Ba +c)_LM SCcI8%9z$EBL͵ABO餠ݗ'1%gq1kL-1l"i3;C;z*$CM(z!Dq:Ӝ8_c8žuʇ x MAȠbam*m@6~h.=#/vhh/¨5{e2GrY\$׃&'!’i*HNGJqIq4ja)/(s1X̯. ԗf,2nm L;v/0h撱hVI֌}G뭏ҝugspr ;Nd)XCVи֯1zn!m46ѡ# 89]Opҧp"(YjtFŘbVIc%%tb0>boI),1_Ύ 7u;cEZ Gk}?}ą3 E vԑ.E I0ҡ 4Z[N{ iӚ>4|hSڟ\E_]ɹ{z|˅ܗBM[t|;d\A?Pf_f#9>ƩCLr? ׻nYD9'2en9]hX| ;T $8J4Q!Ùd6%44(F3yP8=`U%PAJ3Q#x !A3ƒڲf錛|\n$R@S 4J GSE 5#2м|LNf hLqio7ă7߁?x)9|r~Kvum?^qw?8#37ހg~~X|GO=هKoyf5ӟ8xѥ+eDh3h:(qiͲ$a.57idx{H/HL{:ٟ㿱3ό<{ވ_a_1{Ȉ{xɈ~0rnMXͩMdXZB;-j04LP^aXj*je [ rePŀUO%Ii'%TTY%6ܝ*$EJիVUe5VV8;#g)!Ku 0QiwܜBd?yWY]:w &K2!a9MLss#~}ψ_e_5Q#9s#3V#^ɮ4ńonNaSdPN~@QVW&5rbsS@53eD4 g'U W$AL H*)Fr*'Dz&Z/t.v0 6H$etDy9E WY|D[]{JqjSqHBL? ܋,eۓleSc`*ʔM}1+TN6UǠn)?5r<\K3[ih_4\O64K#.=F]tXN%ʴ_HI8ɑԼ+,O7G}$ׯQ|&x#y&NG'%[G hg$zzn "EjR?/S',)|Iqa^a.)PNV|CI _2˩ SC 0 QͶBZāt^RA4051`~5eJiALU %KtQc }f<18c}fZvM6|YQf(V+&7DF2d"N@,fpp47?,%>b\(ӔW7/;FcMɂk-F(#X2]K4k5XbJ-WfQEA)G(r@ih@l)1@St虉ҥ_l|(Z? `Mis>Ӏ\!0 Xì^mk5"Y5?'3LbE :$L2(=MXt|PP }~^! cC+ כU.3~/̜ް-ۧ΄Vxb+m82ZJ{WO\Y=V򨸢r6ׄF5e>/CBK``C;y6(ށW278vՉĽOڞMnF^"kfs8l¾,.tY<uh$Gɟҭ.f'I6z:0%drf۵vƴM0J|}ZvݱmVitB ]k& a_O6fӲ"#x24`,-;z`z;:Й\&ͅ4IqHE/LZͤ˱qh8qqlc*w;X}zw߽s{jk9s^-7;IIuJtVoQL&ֿ9%uxG%LuqS;bBBOƗLN i.3^;^ 9Af0Jة1n+Q Cg̪ . AK8q:q̠\S ~y#:HrMRקcdh \S 8-QUƗTkh])iFeն~Ӹuž;}f=>篯lyjÄ̷wOVʪSycXӤYc2Ypς=7u?|[6F%EUqU)n%5SPMGJ$25&T :P%m- 0PP >F=z/ƼޗX]K.n f|[bD%2N'~8$ D ;xXʯdj6%S$yrm6Y.U6[j9OPu\RtTDE+C%m{fEKț Mj_?Ab~m;9 ~f(~x;];?б=&Gҷ&vZГ k3 3l6V#V5:حњ l3R=HAA TzEɥ\fGPYP MIYqdl542z!KE@@7v]CbH:[*MI!$c3q/d"CSjG :CJ,rEq-9ɟ"iNo&ۥ9NDy۵}Pw|IaN8ah[C0+U.5v rJ;xwewxL$71uRcD n̐-FIX CNo2 6hHhCOu6.4oNC/^rӾ`-ct{cm)+ k׺yśMi1+^>M--vdkf{.^@c'jݮŦ4O웟 Nt :_qW~ܖ v`Po*kw陝VC+m,1d^l"\0L7[pc;aiu|yr^qa k"%@4USR)NZkc0=.Ζ}vGάY⹦Gy/lM/>in2x[} Оnk}M٪;^I1OP :NTUޥ9->B.ʭ+\Fpԩ(n{)Nkˣ;,]e,;m15=/v̾[~&?u!:{?}WIՆ;BjSú|Y^BUTxJXTQ7 C府O!5e. 'u~vx/ɮ:@4ٰj{ҹ`K׮Y*~NhfƤ ˧yi#Ko"t(gR%@qS#@BnmR˩ KS!gր~iNoa~ /( 7%T譓zS2+?*'t>foV(;nUMbne+eJ&K М1@~1DJ1t)/䧎#Gdu ܶfDu?p' c97]jsܷJ`A:eRT  q0o"@jeJfYP`A@* `ONДְ*j#0J{@~P╄gz|%JL})R?3iFa<^S ̪L\vR[ Govr0dJلl/"mJ2+NZBEm%*{P! 1)uhQ bϞ[q:lyY'}ԜUmUH]kO]݌|wڽ]Wݷxc˖?и`KjRcq tH--~fN ,@RF_~wSE)xNxÎe؝𭨦ܶYq3z@zs7zވ8SV!mժĹ:)%3.`G *B Z"l zrq˯_W%!p|3qAs~ pB)$:q.U}5{a˱ӧCsob.[:M+ttAQ*g,B&+quTPCb`-:Qko-kXz0 V^q֚`[}Qk,g婮I69v7?wGqg9[fzfaиP:/)$*7fhíjTmWfS("wk 7%ہ>_anXa-.#1QEʨ8* ajFqq􆑤>jM1c慏V6nïWt4xM.o3uۦg֭кEǯ{y[jjsGk^c#jOYYY}B҉Vs*>1 (UjKfZx(7[0 7 BrCoJz?SR./)CR=1! 虸tZ,+C`G&t]ybcz}| s/et{! ! EDn lE I@H0 "ZVնj[:j۪iUkkm]ZN]}ܛ\?߾sn`T (Q!~N2*\躓 lw:EnMMcUiɱGU>p|q3.NX:  J=PxvOuL=s~Gwq\ j?>+@ӴD)c4YMR|XF uDxEvQlk{K~[@Б3TX3x̀!o>1D"_ї@ IBJ-' EO ℐF'*lLj"?iA]O03sPC}b PUӿ^D)s7ASS>o9Eyr7f`/%$AD>vG3loo ՜%G#K$TI]cvї;}L~s6cPYv݊!DE0KW8DmΚQ: @2j `(* T@U Q*,6H~~t fU~Vih:KG3jˏBC21%.Džf/w[v#(9QppHr* $aW玻;w;XVD/!Hlj ϋz zfUJ#BdsvqT-cB#\IFlac2ʜQwH<]|Bz2~V yz4puhc3칿bOCt biY#G9,- F1>(TJ\Hҏ UrLhhlt>l"2w YgW\[^ O)xԜ:Ͱڌ= g.8b7[W\\uj؆ڶ;'=h&f(/J̊tW=?Տ T^*з|i_8BNQ 0E8@@HHTGZwX'5nsv^>pe1?fBcfg=zrc8@S쫳"釿ƅ3}{4սR9 APN Bw=.#@ܥ3bA!(J b~tZ3l-pcG?mxm K;wQq*v:WZݾ9M\JSRBRPe9gdt4+aY6p@z-pġ -PTB*t7~1CQE&jQ$.G%rtQ&R2ԾT*Ն0x 7<ĵ.} OeWɳ/o~wB!f񵩰g&f|1Nh36 r=l#G]Q{g>KPMTҀ~jzM+|FLd!ACK rp>b3)9DdɥH¹ƹ t]{l(:2W}ч:>F Fp\n HP-b ш2RW9 M+&=D5amPf$P3bȺϡ )a6Ig5_k8aN}/P-ߘTg8`Pz EQqah)T-@Ȏ!DC6 pFɡrdCf9> !ʳ:_v|eZCVB|9oT::?%IQ^Cv Jn_WQ+}V)R8Ak[!rEB QC7W@$ѡ(4,؎F!^@һ{#+P눩O+L8Y*ʵiF3izluFY R(y p[@RZ@(S4@\[җhU l|ФB :Ї@dw?&¡򈈄n%yH8!5^87(O>Stg͙#j0By]AGt P@>ח饑,pnHa12/ : ϩCdNΘi]q7wAvW1*5a} }YTRe[,RNBO^`CI ﷕*_]}DBtwmu'ϜD Ju(惫qך@mk%_ǷϨV._yԼ[J`6Y)d#gP\ {.[$U)a"ɔ|ާfu-0d _oEƾqƢb[4x,V!׀q(]_H0d/T`t]+al9Y9MWi-Vr(t:V%+P)҈Rd<=Ɖܐ7t  d\0:Zq=F" _q=+$ ӞkQ|iBq>+|=LEp\VwK56TTO##39lgmҼ8v'lq{RHK& Ҝ:#mE=38>៥r,GKI F?VY\\|\(#}YjbsFkO)=g)W!%RP^S~GO)=SzJO)=T,(gzʿUSzr˄gTU)UW+ͨfR9> )O8iibĖs&.x57M|tRӓ'|qϔz(gtN͙: J4v>UߤoPS_s0Űpoem+b݋~JtϑQ7u9$J)T2)E.%H]FH]Fҗź C.P 2AB]PR5ź C.P+}WIۃ~-NE>Ǒ Ǔz ↓c~Q{􇒵eޛ`FxQG HRDD2e|<}\l8*D* jT=ebFYIQͤ'ZvW=Ɍxɦ,P8J}uI9H&=^dJjDBO)n.][q~3]C,:KaN!JƊ-nC`oQE=DrE]{egXsenqx } V`q[zbb z"A.;Ybu[7Ƴ?@n 61⇑lp$YDpA۱22,cgnwk&\oݴ7D7o\&SO]tu+t%FԺ& qKАueXBIT-n]zA K,n\~ݖqzfxKLݦ$JOѕ n*JAb]rix,D~#2Eq=@sse.2YUJWD.{PᏂ !Jae.ᴜH/O消4CR2ȅz1rNG^Ztкn%-ɕҪ £ZQ:ǍXK# n '+PNG%>[OZ\VP\㕢o z6 ܍vsI|bWQomV6iYlәNgr3LxN,0M\iZl-Nb38͎pnDA9zIool3SX3յXvn@`abLvF'InHDpv}ZǕu Ng1[f;\i7z\OxtpIn bjmVg<75۸Ӊ%93MzI͎f[\ bwk6ٛN'i#t  zR1h;fbpj9l+V׸cel5XZذ\۬6n9VНt{ XnXM]r7!D̀ij:j vl ^[`Ffϩ7YK&N  zshW*a,1QZFZmV90lLH0Y[͍fѬp+fN ?K `n"<s x¢10Y2e7oV*˰ro V g:d圭<Ҋ'eg8 aaZ@#z \NN&=rjvnsӊ憩w [`n .T@slFs-~74Cz;wV&Dhu-J閤 (%Mh5 ZV Dmv - &e`]v o4L\_ca z5wY8W5n`Ԏ;`L8 {VǕWq\07/.vWXQPZY ]vIx4.ύ),ryerTA_aINQena(n$+)S@+J9PUWr =b/(0h6W(̩,qe<@ `K Ku%8"BW ʮuҲQ\AiQntʲG b-]=**(:2Mn\A|?SZRU+,rٺr,|])+`Qs4Sp<ܼ"U{N}yJ"5TR‰ڟӒk\<əȬgbfG'Aӧ]?]^ϝ{ϝ{ϝ{ϝѼ޽K:=w=w=wfw'X=Dkv5u;ÒS,&cQ0x̀z|x.īzmf(?N>a1ԭ!}4b>~fۛZ.nrF-WwZ-wf͟]-<ʷk6{..XIvеF(яWzɧ-.@&{yy!ш0z^%r^85RlmD89DžO ]rG_Xϛ$s炧7\?;vμЈ)Jk>5`{+r@睉 ^T^teyb @qzGZYU/Ju&cjLqw`PӇ|<7rs;-Əwx>2DSӓғ  d;q6|;)(?ӎ({>5aؘ>Yþ{C٘=٫wu.ֿRnJs]W9LMLKŽEo}I:9@-^Nb C쨝Y%C~.xrܳ{:|wu##&`K|{\zo?eּ'w|nWsJ4mɢsov_wdڍB'U2QU{yՇKu;b7>7ts_ЬJ婜%Y3sSȾU>۞sԟfEiG5 )| 2B^20qD0|eY_s}9X9mg4{i|gCf.(n`^%`-I)q)<`^|<'W~/U+QOW }RQ1jq`7plM ͍fܛ >'r$)```S0b!/Gǂ޻J( M?z;KiYZ,Uד^_m=! >}Cb5Y4zpİgMSΊJ:8PUuk_>r g=g;xjDg~aW?:vЌ3-m_=;d{GLVۈC]]x7>dDs&_x͑Q;ZT=MoP[͙podzṫY~zщk2oXvz=SMY yp`5~ݹcf2/nZ=D˷ paPb{H/Sw;H h¥NGQ6E {3U<ޞoھgtv!5>t"e^{޿>9Mnޙf8dEy}*>lT=; ܟ1RʱSvd-ĔgsǰI-jʹ{Tn$S*1Vmo9$ l`>sܩ!|tzf{nl#wE־ȘE2_۫fTwB>o9E0hEs=M{$-ɶKAi9C)Sm0hZM*DKtV륤4(Ȓ܋.4L|V,"øa6+u tbnT׳ڹ-z~f{FN]'ޥ\<4c e'61/rSW|:W(uF УoWlʟ230 ڜa_t̾>Fi; sr=2}0 ]p G=7Lc\/$NqCr!08l%3ā?+^:iT5)J5l^`QiʭzPYJ^X}kq/gB ΆR"4T3 Ffd"FEh$C~ ӇViAnᓋz˩eij^;F)ʯ{OΚ5~Xm:I=>u)^ N3*O qi+8dz&?Z6q@`?6S1CP4RWVXF.>??]-W$y ?IP P^Ao'I6wT /Z):rR$}uV|h4i=Ϛʃyyaől.u|%C1&)=ن}}e xPRU_tWNn*$R-ҍ҇9U+5_,*@,ƫ5d/kt/_Y X7hTY`xȲEg4ZB>lnqL'>B֫VrIWUNjL7G\%7 "uw!KZ }t@Y!:֏ͻ4d÷a"PAl&f[t\Hy "a` ƾ7Lv[Z&45E.k;-!gbgU|,MǢOش=/!p8h,£s8[Pxr-[1+ z!ǔg:ůéf1#W"%wv`6n0{Gh'H~"iz~x gxZF3.׿–i+-Jb$Bb"W,}_9Ԟ5G}Cѝ[]c-6XS5"Ÿ/&ĄcmkHW}la ]#WAtout9 'l %6NYmemWrq樗F5WPHrMK?-޹Lnl7 mpzYzm"/o8^%].5Rt[|"uGB6tWafV4hmoKwZ/{hݘJ!o"_-sաIZ_2Pֵu`1! (dqOXssԈ^Ovʦkg+Oy;6T#G.i H}uvY掤^W,\թPp" H Q"c5;)dp[_|>"ihG.YIθnnF}R+(_]עO\ߣOI,FnE"Bl!zB7Nw0Ns}\w v2/RO!icwg^*A<0ocJH&>`sѝee 8$g6 .~_Sq{Q{.+D]>ѿCF$Y?ʠPԟnNjF?ߓͽɵBOpŠyU5YFɐQeMWidn޸ւԍp`*)ʬI+*vdc1T)lmY;I ƑqP% =²8ETThM6-Al^^4=y5(:k[Su{l'`깲0#UԢNXг.mfT[`y.* = ~?wTfjI˖ / ;OrQL])pD oQ`(y*{>Y[>n6A%V?Zלz_=(S_ƜٕP[<SsR'Lx-ĵlJ:Φ8`RwϿWb'X1Hdfԕ% #Zp)ӑ w<|LfX}.pj{ٹх19F,*chmLr!Dr\;ͤDySTKa9!kqC,6w&^bP~/>7 gw-I dur%?X2aŦ0\.YkJ/Zf,*K޵9@P^*:dvS˽"TK{PAg(o# Ժ9]8 1Jy6aq{Z452nu> /i meRxfb8RZ. endstream endobj 586 0 obj [ 0[ 750] 3[ 278 278 355 556] 11[ 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584] 36[ 667 667 722 722 667 611 778 722 278] 46[ 667 556 833 722 778 667] 53[ 722 667 611 722 667 944] 60[ 667] 62[ 278 278 278] 66[ 556] 68[ 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556] 85[ 333 500 278 556 500 722 500 500 500 334] 96[ 334] 139[ 737] 177[ 556] 179[ 333 333] ] endobj 587 0 obj [ 278 278 355 556 0 0 0 0 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 0 0 667 667 722 722 667 611 778 722 278 0 667 556 833 722 778 667 0 722 667 611 722 667 944 0 667 0 278 278 278 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 0 333 500 278 556 500 722 500 500 500 334 0 334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737] endobj 588 0 obj <> stream x]j0^,.к,x1mo8l LP՗ZIKw3,q6h T$n/&37daU7 N,$HfzzUfP,%za @k.GS|.hf(`ҌaRSP.yW/fP8uatT!%',EJS<{Jʖ/;7>,xu潾JcyìBnFu؇gcpg8udRV=յ endstream endobj 589 0 obj <> stream x} `TEo{F:!܄$@B`D02D\Pt;,C7ppY򏠎љq$?o>S|UN[I#iy׵(_xECS #*!YY?DD.bF.׈Lc/|5."ZƆE_p qKcܟ{ߧӤ?Mݮ_牙*"Y9a$(y̙94˕Cy Y4xO84z3g;vyQ-?cE~ lfc+3xTшrs]YC33RC:8ePrRbB|\lLtT="<,4fM,qFٕ;-;'L4UPP4\Voijмz@S?Z dkNzS9jYd#ȇ!pU&,ܬ^t_u95rlrxgSˌ IΊJwBX*TV$;9n6nsBnܦqnэDhm[vZP ]\0-5Ԋ>"]xh-mG9}VxBydp˪{;!`81XǕ7Q24,w8 )^! y3 v1{q4߇3;=,I'=xS'nJ$>ҙF@{͞5`5K(SwxD#<5o"=MwIi9$-Mъ]Z߄ d;[=`eVFi#3_R9X ^n#_| Z^ݤ & h2M@4Dh2zo D=@Qo ꁨz!@TQ D5j 6@TQm t t t t@D>"| 7@o 4 4 4 4  @؁an @؁a7vc~Z D/@^ z@ D/_!-{9 Q@rԀ( Gl8#lւׁ[ l7vn#Z p @p6@Dhv D-`{jzVc\Gr-Z05ːWC"CtC=C6ja(,[T|Rv8$~>B"G=^30M5m716){L&%0cB7:AZjJy!->;B^Gig#YpۓnbeV~>N"TVU{Ec3ݴxՓ>R1TwA~o 94jeAF2ApDITEalW adddwdLxړ@-}!NE)n=8=G N(;x)aDi4WchJHIGcGRf-^,kP+ʛ)唉LLyKM`6G72,XSF58?cu)}D`. Rüzh4[|w3qI'z~{y6gҕ+AmVN{y !; Ut;ݬfײ"q vwpYDZ//OOY1_;0٣t)ϰI؍lEo$azLr?q7k Qُ*No|ȟUF`-bN JYosHT{GJhK&L#YV6{z>yKacD ѿT 33։EصS;MRhXB酛M!_+_&Ҩ4TVH)f1+"El6eW6IS7ļНa/2EF }˗EK#p#9~)E~@*.-.=)%d3{`= 6*f[ͩRkH de V7xNES4c23F,rneY-sfMYؤ5Z0KmvDJg:F.iR$KKDy墯up^_WLTsmH|xYgmbУ\'r)sk"Y)OROm_NF(|=MJZl8c[Nv`8J7sn_ͷIˆvW=mbC8ՈwUYݲ,'L/,ֈu}p39&󈑩EåtGy%eJ꯮L$'Â^)WA[]ң1ʾ~ha7,>:ΡCoz0Xq=B΋zT\ady#å0whw( SoV{ê{$W\O*CYǞp© "]ˎx\'ZXTq?[VWGuiqq F(Lw12&sX>@9 9Nf.\|*uU5'\OG;}%Iѱ.&I57n{囟Y|p3/ď¯#]8p-(2jba~5*2:daаH/obâl1b Lf8iÇa^>GSM۶+F8$&Pɏc/ۭDF<;ϳڧ%P#";~4,>I 2M,NܻsYE>M-͝shP4uo 2EeB-?S䙸=aQaCCz(I2)jugjH*HV%5UW_sP'Xxn iY# dĹɈv9$CEǜ tVMbco~tiuw_xʮSOV͵4J?;]=k_-gKl̋Ϝ: ׮ڛě<4[ƍ~̚lN3ǧM6%&*:S'eRd~B9S170VaN55/l}RR-qLOo+ gIcק,(j&NU7Kdꌗe_ $ľQl ե 7M-G)Q G!2cHz>+)VhdԈBr`]D RYh'M?HooO7Sl^6cf{vu'=x{ϾMf՜ʿTϾuR+=dӉ>SG-?Ol1/`t׬귾ھk:e7~=9ʺѭEŅL$f#\3Gt$xѫC2,%Ӗ:KR(],\bXdbbejV#/;*˚bQŦ'[URJ-KI?)Mf2#Kh||yy28jhRujeV+$CêmrӯDlNب&.dbJ].㥼7&alz}BkX!j|!3܃ͩ"Xd~:aG eb} r8$|#Zþ_[{aY&:ڸ+Nw hwi{UYlqUY_˲k5ef;ةݛ,VNgȺªIo>Ƣ]3կ(S=]-:,}O( ϯeU|WYC릔GE8%;72d}Kz++ɚf 34Ei^XK9wfY,dd& Lh.#  KP!*`Y ZenRA"TߧՊ-ZSh}΄%=ܹ̜;o}6\J|1]/EFf1Wk: D O٭xAM?CO9f:qןrb3h1TeT7#'_W4РCK'Wi-l_9!HiIKS c D"4|+쒐S**e.z!CEt6@T  BA٠WkzںK]BU α3()KG dn҃=7tnE&t=4"RfH@T lEF0>ܞ0ό=El L'L3(pC7"%EFL=sT NJH1X &"Ks\f8OZ3OI}I{ɷY+nߒ>2ď+ I]$.2Jk1?M1sĹx 7&AlI_*w&%<Eɋ!,EI"|%P*5%-CVSHdrK[Lc^b`Fm6kA}}B9%XI3f,I4S C+ Ɗy0/80k<\A?% vc[ɛ2 ,#`nrnL, |JV;WV] LG.2^#F 8I`BId[Jʨ#WUgF3K 0 l܇tL+/q>RrnzwˡV!ƒ8">)*H#56A ohh=r)Wۂ]&}t%mL#}.ap~M-|,\H# #V!_,Na&^M2#{zSIpn̏@y? ~N#q6kT^?_o?_wXNb~_ſ9!04e#ڀ"xr[d^ ~lBwR! szvA`;'Ot~kwZXpܧ2VW^$z{{*/CBIl6#a3nw\$|-R3LЁDq'qnXռ^bSE?ݱ|Z0y*z+ꥊܵ"2bpE *mguHbQ0 {;)6 %%K"]+"M:׳C>WMhonB_,,D$t|Ą`9])܃&N}QL$ Iܴ9mY]\x).-Hv)ȩ( M(swz=l?We, "NʮP9JMr"h%D&Couػvu7DcQ#ZZ]l={矿`NoȾOq=zEs˵ѿul} dYD=αky<9q+(q'Oht4:yA]ц99pX'ɋŁ;«UaNyDݱI눨GUU _[VO{㼺 c _>{ o筿i$O%O@ yI'A 潆fo+iicJ,Dۊ Z^^U8ɥ R5gcǙXGcǹ2T-kTIjRbY%ꝱgm[DqP}1>TSf ZG [ؿϢB L!졩1H,-4Vu3X1\*0FhⓉm'&t̕wsިiҴ(sxڮ _'EGى#va0lPD  _ x'u6zoIөתV_Nr+ӡ5V򓗻d\!PcՠDZXc٘D !oujys^cld 8 n]KLuc"2xC]w=|p^O^dbjlH2r5S;nզgߺ!A-zB3^.V0l.vkEC,.bhShAfɄ`SȃX͸wⵘ!BnV&N{ ì=Sg5E:@H&}fg~b]<} y  aT~s8/"kĩ:mkwo $'$/rQ&MCC͡ H":bBZ$P8Og;G lDs`Td~eZDw-!=rY"]vֲN.})KO~A>9) ڴ`rpDp1, hl`v+i!>@*஁Y1 t9` dy8mA˘N300=H6et'}n>$ST+BJ7XXˉ2߹|l|.{[f! 4NaPF!˙has f@OQ7~S/˸\%3Hqnh ]j̏" (c?L)&)XBQtJadߒT>xHBgdV^aWoqc˥)YzLr5}9Ty͒NEɐtg9KM's4xƮ6s Q2Fz+9 =4D.@ıl,ydY9GDFV]/ #FYIEx́&Tˁ Spf9U"م:``|%dL`# -kl&rlrؑcAmȠYS@DARk'SB},PǜEvg]LHLgŧO8==.N'dA"\2Ő !fXgXf@'ȾxB#1t<(Wac7p{KfwD?vįe Ĥ:OX%t$}`V d; e&Hy2G FW)/p=1*n8F_1CK8U:̹|PcþИEha5ف9G? > mH8$WMn7HʡAjY6$UhƊ-ąaf*%aDwa&()Q3U5CT߶UDgCBX . tRJpB Z"$:@h1X`Fm@}B*e;HYxYè#7R  S o*-ei H;lBFvgDm]H'&݀Ty5_ۯ4ѡ"Y1O<G~seaLk*MVσ]WwHGZdȩY򕀆Gm~G=K͡rmM֧rSt)fF#ա˙&}yQ~()pT<42nYvR(_+tI*TP;IB>}/ޞe}$$j=͔gsپ<% mAu:0KR<=+Q]-+;%SO]r9V2ZYǭgҧ'o}~'{ ^>7'NsoMo_X+oho?v=͹{|Ҧ#_^.rdW8W|J9œrTJ ?غ1:]2e­ QUk `2VTJNH&!> :e|_sAT`ݠ66džLPc:dᄩ@)N'\Ciu$$k 1v]ٜqmRE גFsU+. sufKZgA^pϹii@Gv+?ޟoyGICORI\QܤӶۤWWԞ x|(M߮ߔ~>TNT5ϙ5CxM+}K{m4ۭÀTN8@(t{y=.Jmlϳ[ d {'Yu<E,g/ߚ;:S7,h0$ nR\F k~ӉK_Yc/gmЪmLG}Cm~a?"+^7!e=BQLe9Q%].s}DxkE=.M{0ri^$WQ,%ьv_D"+Lwq#?Iۂ{yF}V r/d@^ vIIGN_eB:xI*(_lӾjMaLE_es!Udk*S?A^?|',ѳ¬=sۮs:3lQ_Hd0Kfw;;ևel\`@~ S4iNmD#{-]1/SRtJHS|p!DIbkIg֒m3nn䝒%x iQ%Q3r%Cyy0qj eNnu0=tCp\[ZP\{(HhE%A'9 Ɲ[(x0J#.I'N~ɂdgdE?$ <q֯՝ dGKYy3% HAepf469;oK*'ɉ#5wuI<)S&ϼaC&glHݘY7n>q & s棶~m sA0[ZZc9 x) i%F e!! UU7Rqby#[Sbƹ4zNI[G '֎ }བM p 7/e0-/] &Tf:*r2oX؀TT_ڿo6OQ+U&?W {[..ATaxO-l p.YBM"ئ͆ P;gS O$.IWߟ(n?=7?۾kD[ \b9d{)VuB Xu!]H$|tc `?rO,kNt8΄٤B!W7i S^t*G@ 8/zq^/ik&}=+n &V:i}8%5۞ b~f^SjS77 qyB{ ^#f5TwH;-TOy%07Ky<%".M5ٔe9mlw g'$YH2:O)5O}>0os4{ĺj+ xF'>s_IQt=,h;ivD>( W&(X 1'S&V"#[u{Be5|(mNFi&fD20p[Upqp&b9nGWKG,hO΅0U4,۠>u)*6ף]OZ2ӊ:qDS{w}p'BxA3 &"Lh_a&|aVפ RG5̢8:dS&/g58'l}-dl7jp)(ic-eY ÷{ZţԒ] Y_%&ڈlxb  da2,E 9BV>[k<ޱ 3~[\3-%i'/{Uu->g9~$L&3d2If!~##C bQX{[[m"-iURW[j_^Udϙ_߰9kkkּ܃i%D鰎o~mOJeBW-7z Qg"5CxV. hJz8SYu"r"nq`'j%CmF܏yp;0>Ĵx9뵲ɠRv.;`%.Ms6::up[;4aq#Ûၜ95Zh'13tlǻImzxykN tא5ݬ ;۳a3'3HA3I+䑞ioX};,D,OkOWFN{ 5vJzhϟv[u񦷰QY$,D0!C&n#pt=lLC[C(+p%:1Pjy=`Hkbj:z蠏t1?&n{b4jAޏAXI]DZc([T3XѶerDsPLTf"Qo/ZM"3Ԯ~ǡHd ]C傇CڈN4%.O.i!WA8^|ɑ@i{Mtgiwjiqa58asbGآ|ÿ5WK䃲+7:i]'q%bX4ODQ!Eh \u ]3y36l4dڒy'4t#e|!Ctax|]ٹ`7mZjNEsffnZ1sMܒ"TVQ)ZK=v*Dr,h?'_poKEջ]{__~.?d:^]GWTw)5eMDwU:\RUPe0sv0Zӊ#'svdfƍ&0иc#ٟZ&7Lhre 5v|mM^Kޕg9%.uպƸ80\t \K[cEgqEEyK|% U\]Wħ@=\Dt'(U}ڜOI) eq: P8\iYqʼ f_z쌹75klk*W]?r颚xf;%+S4"D~ fnk#Ng8}qlqi*'2ϧa &8O,4}#/վqtYlC# %oZ|H5V#v9K୧$]k! i 9Y%di a_={_,!FIrpXȈQ(BuQO( šh.[4ZzU h*Ew8e'`$\N7zB&;L⤪H;_s۹(>cgt5ÛGxtc1#3K[XCCV5f_U=#۹=VLDGW7O֖B٣uWLɆHESe^QM,6E D(*E}>G48 I6 Kv?tEqE͸鮢)@ f$ZNgХHt"efz7]o֜:rtUL}{Bbr,ovf˘u3X9܂uͮ[Viۛ->ЕɔgWzjV傈  -C `Jڪ83Fi5uݪKtt)kmLSӜo^>dEًVغrgkڎcMwN YyOiNmhQz#kjt_jh\ 8(ŔP@@.@c* J6ZT]ڈ[%z学"{lMZeۚW.;LcޘEuO(%pVS3A-J;[?iFhd_1 B$ H-h1bT4Q-E50|\c0.ɾۏ'/oȍtԯb0I tz>Li8Z5ثΐ5 VO=3)z4rs)gm eLf,Opk p^>v.RvAB%`6KѤW~0TrlX&kYMLJZt+7ž"ɀiAv"2Νgkkqc?։ؙ=rƃp-fzeN=s 7'5۫|9Ns\~/uK{O'^#qBQ+0TZ`* f9[r꠪/qmφ?:kփGoËpqir1ppg7}wz+{֩ťSnh)`;F{oM@IRǒ&@aWe5h#H|/$4n.Y΂d^BJV9DzkhY;sY.HVpՐ:EOtلe6k3/m)+4t%3TWFhTpBRNT&l**Ca[؏ٵ5&z)}XIXA=S~Pa?G4kST!qNI_lsl2u7N!NM&Fd{F-5sESCo9ˤŖK[g89kFk k*Ve N$5i8%I]vgvJQxXM'[{%˧ob]Hl [H:0*@"bQ,.v֤QMQ.7JP&2\kݪ1bh7趆 YiHTYp+Ov1vkŶuyg/NWϟh`Uo4#Vn(5uДk?㽹梦V--w$&:& ;*.=sovyH'*fOM1o)ŋVQrFաVv/}|G dBBrtvS}?GOCdXuL* ]Mk[gMo~\6f;>=k) 8ЫMyeVnw$)z;^l);)c;7A;nMZ&E E퇺le]8CS̍ijdkPj~yxdҟ^>)>pZ2I: OֆIg{?ŵW-itza-6A2pO%bj}AvPݩS1c,|[)[d9 c,9^򝞩U5]Զ"¤68&Hٚld,9,[.Q2C ~m-S,eBk*N;L-.{L^GW44,o./Rn\\NRvxr=ܺC--^}G[,ֶsVJK8P}R @|eAg搜S*UZsK?/?\WZHM^,a;J# !|akdдS.d?XHH+\߫ Q :*7NB<ځGq!ŵ^,cCx8ǁx2NA`4C-4e2R !:^K[X:NЖĕjR*E%J0(GIsn,f=H5uCL̉w\~+q,Jz}9 ^W%'_X8;b׍ \w7;hp;YlQkD2Q@Y+Qh1S +΀TO X UV9}JP8j' ?pN  h(dBÄ{p_~shهj3y}c畗b;E%%sRymcݼsQsLlD ֑8^PR>H w[N7E屝Q-uA>^a0D:.uNgCڢ╸"8S0MF=/;RxlSe~<kEIuFk9ƱxgՌ@Y1i־·y]k IۜӷM_ZX?fo%o3TXYL.kp`S|0LN fGʹF~3CBDd h-gCJaN: IXGm3kS E{p#@mn|އ_ \ႂ1;lf#g9 KydE;,'l3W;F+ԋQ/FQD$JRE+/hA+YhM0C^+H@1(ޅV|fR0ٮxYAttE#mgqevdh\ff1R^(OQv CgN.]]!&=/CxWqď Bd\j)(zt C#wM?ω!Jg@M:nȨ(vFl9hs8U6)9/jW `6ilk] :yl̞OnD/-b@3a z"j=M4ԍзH+A8P%AC8E9xq"f3 *RK[4uxoQ=?{d2){^9gQ:u@@F%̯E G0O;%E*E+=ꘒ9gMx4aGvNfC=+tNO"F W~U\DƘ?=ʶĪ!, E!S@Ow]^}WﶓKXk[{oܻȍ}x'㩽;8=(GV+ߒʷd6Nrߒȍo|[ |ըp;z틀xox?C#q >Cl狮W3=Mg^N'ʗo?wF F[]烐_~eO @8U2 D (4 L$%sVzr-Mp׿0|q1x^]`{qp zcO(N=8A:rsܤDAI0>T YVG3ʴ|Lg3|2<94[)]?Kׯ\~ Ő˷QU$DMEb7֢h {2B|xŨ75 ϖku,!p]b .F$j7H}# @rw}O`P-*g4̇@;i,D+ո ҷD㚿KƋ>82*t% \ۅ4^v' "ƹi1oF9Y>kʷ T,5 Z~ёղY~hJ,+Cy_n|;kXx|媞[ޗ%P$i!9gՒ.guV{r5joaX /Q 9}XSIpBEADI(6 $X@]*(X"(A)ֵaY˝s@wdޙy{yPߗ$|QD,<7DьRc*i dRߑ$e"[5xH+fm2}•iYF.mJ$CkWP˰l|Ѿ+4#rz`T4oqP PX!&KZˢ/[{5&y d)&k8hEwU-{b+zGF+ eTfHsXvԯ .i]z WϿg-z5Bej<QH:Ѝ4F8Zx2sb:֯k[+舍V^<;\t|&IrN[}QW6$^RIs<[R  +:#T齶T%R,.F˃<ҿU /R>MdzLoQ^ _l٧"AvH"K3?@^]EʫX o2:KQtB0J3`~2 `GBP X8): h@Fi6P*xe4 J酂]EV2ꕰ?W0YMA!#|8%:B0#8}GTt@#3 cIRnCQT2BN&tH b#?*铊 O8GY&Z!h`*)Y3DZ*:Jj)_TD'WwtS ][E}dhHj _tDmdr|K5 D2J{˽SJb[E^^ EH#d^/INn;]!f2 L!K ѹI1D9ȉq2 g"{LA P@)B@z<\ &C,~ !@|(0-F(1b'Q |ObK*d@ >%Bl"&&( ~l9b' ^1y . 0 i釬JL(ɂ t0A 񢼤p$rcl.xRg rHȠ A&ٔ8\"X I xW @- 1h( QPI#AH 0E(@Z+PxBCP?D F(!aT (?Jh@HH4!(CE!3d!do |(T s<0C) #љ*Eh 2 ІRB 9ʴT "G$Q()RK O2@Տ >dɇJBRIG !]4.qHFA ˤB1|iL:tf( LHt Q?#;h(/,łgG0}ITlV\Q(i$ &8#c4!)BѽE*SJ5s[___/}''/ޯWoo^___)8S3 @7bH< "@9? CY̔Sq]nxoX|0޽NoKP$ QUUv&Ca1D+x$2?Tq́$KB^w# `!,[+dZ(* _)p \ٺufl=ja{K ^YEz8(]zgɩXd.t WvjyǼ]n;W0fiEa[ Ϳ+4~;fm/;7~tZ>&} us]Nydݳ// N9Zx{+vuk΢jޱRԼkְؔ:9`3O*j˷hLon^,>W9$)ώu߸wƉwG)EZ[vd)ٔ.,ZpqeeU%%  N W*5ho8i=Y 3ȼ>wg0 E ǛFs :>ΨD?|3L2ܡ.8Y0OCJI@Y&AijKӲK S^LlXN \xk,⭶-bbP 0.KF"##G$8-دx&`ʏ{o1N }`9b: iiiM>A`[7ڠDZA ~4Պ_]y8\Rkd{3EjkƹkM{[st[hݏM*^'=;o5=~|vsjyO =~W x+[BgϏ0cߩ5ZmR/U},=mۧ/)Ӌw5,?zbh1{„{>_-{`2 ֕Hg9*BꢥiNEJ얽oI0,M}t,&rXDJ$ D\IfoHoDW$9KO*u`e&pr7~+V]&D̫Rk4`>jz.|KgWUqqTEG{iUTdJO]snqV+0?)ƉCNEG'N޲yEN9?R:p\#5V}u9T'zf`܀fݣgv<_b<)LCbAsRC6$&L+jV qz[pvw9T"f=Q#aW->ەW=i):V&gG3Wd<]{ƥPux[|89I}y{8Y?\]lQtQ4c ;K%&`]|S!p =++McP묺;u]q=*|_~Px޹CLpܮH8R`q[n[pr?oɸfÚg| =M13zx'`BaS'622kn5VsrbI1tm[<̄ܺ;څ>x02#)H<9z9 33LLV5OtnIJju5#&֥d6_m]^:rNkg _{ibcN0p8]lpe(އ#+$&q8km-У39.Y謰WiTdvi&(~ ۵.S߿),2h4o*>=pO$asE˖ח^Rq+6S-~oHaʭ)녾l_q2zz{[=ϫ+ gEF,MB 3&m1y5+ usU[xj q`͑<Δ%~hvZu%BexT?0ǫ<|㳷f=m*ݿovM⽞ Lwmz@8̾+c)^nlp^yueir8xiz96e8 8,]ESnN]pnǂ w2k(apy˓fvWLT9`mǶaƩړoэNHvN`MIvcYe8oKx0os򗔤Qt9ȌP7wT'g2l*ǧM2$4!Đep*(ݷWW'ҙF#onDwz3-98HGZP+ v.p>}$JA+3X6mEkS^|khUӫ_ѻ{Jw:ښnv4xL&brk\^Q6pWLb*Tsu+CqGJE%1.m',1+mϔvѰ#yA>Q,;wUb/nԖO6ߔnvj[IVOvҳnSuhTij1VS~!f{$k|뫮1uW_"RE5wp9YenquY/<4eV;~Ev4vz}3eë{\esZQ{3zfn]ѡWn範;>CMpRj*fLҤNJ1gljw:7{;W۞ǭ3a>?n#^os'~<~G3 /|q}+C~ze׷e_sNPNݕJs?k&ҽ\ Yt;byn51NOQg`n+=GÑ0^WdP{sa01 >"Zr<')%-ߣmm #. t8;>:s_z۷җluёy5:}=&07:P&?m< [Π}eY>KMDaKŅ/\3Ewc; L4Ippx|پ,Uŧnvߤ~fMfycTl\Pjzqϰ.auGG.x3jsuҠΓAw߮==.E" k)6h%xtߩ4uUZb8!p7[[\=X0bA5Y'_e{ҹ=9Zwႎ]Yl[ۓq֟,ͨN˝m6*oH-~ ٪a̘i/I*Gc'`3" iLhɚPga놈n,/ɂ> |q7hnRoխ'7 6ya_ٟ%۾.~V8c/f5tY?qz!>R*N|mfܴn1S(90q*U|pQP@rʅFN5r|_L][KYvm 6D&9888K.=|Y!eDfՀ末6m煦Ճ Vu8$w+S& KRpK2NteRjԷyakMNt-p/y֢sc$c; 7Ԏ"^z\G[W9f:qYGr+vN7_  ןFs|IYrwBxq}VX@h^8 u{pkCNLOx0zfK>O4ezVdܴCoǴ7qqWJny MxbJ^)}6[_اT,wnjPX&I{90Wђe^ںc\`:ݴiÙ1GDu3qz"w[q*bԕU%5 7y޿z:q}\/fJv] A.uf'Yb;B 84e'ޣlhlN؎ 1ʼ7Sس ssU$ݙv7F;ޞgi$)5#i ԫ`(LMql~؂ jo(4j15?1SSz_s+? u(~.oROE))q,s}-2kVQu1T\L wWqa΃WL5 ]ZQ?~sG:|Z.H&4z6u{FЯqs;=zϾ)L`,yYYvJnYcRaPnՇ5l*ʣ(L 1i'I^Xf${.=l?\(Nӕ[6L4.أ; !Cuim}1X#]4"uQ؋CM>׃+рՐmJP;6G#B7Grͮim ޔYG[PwiƔ+kECvz^3{ tael]kh,l$d䔩J'~:T;QeP/LO%y=ss s>s2߷^teQMK:>"rE?*vKb-m bop̍  ޾Xtcz%jS -OO=rNYTvT4/s]>no*\| %^Tyy9KA=6WG69 Tݯ]K3 n~u\9#he#PJЖgT@'f?;pv-SӢ#ᏻ; K^zx g+^mTد__3톉n ѕk6\EIw,DU*Ggmu(51K}]5aݖ~\\CϳO[͓Ý2'3˻sAgZ&.i^XtK׷۪=^03XO(ejqCGm7ZW.Y`no[0護eЫCZR>Tdi&|(Y0/1""$D55x> stream x}|U97-S23!L2IfIB`HB'e HBKH!h Q4e+X&JbY vv]WW*%9[z&Zbiw ll.dK=3U3=3GYlLLEѩCV8>]lty`A1)]D1RK< o~>_1]?cLy0Vs!n}SaW}%G6_ǿe-nq[uSͫa}>d?w?:s!nq[1bvq[-nq[93nq[-nq[o-nq[-nq[-nq[-nq[-nq[-nq[/=?wST ;/_݉*33\`xĿecY> ݝYK9r*~$w~Gw;'>|?(_[A,02RXIp,^UU$FXM]VLWZSFmVf;?h*яHJ)%1c6*=H WlpDz~'j0JbRUbU#0j2X.-)Vt0_%0Y OvPsJLj,UT-W~KX9Sp=GFEzʺtFZ~*b.bF X12KɅOA3KaS|@U{(4RM̵OV;Kf"JE2bV=rYh-}492; Z=m\"UȂ`/߻Ĭ58wڀhmlY .+is[^9̣u~ZzZ$61 M)lT[;-ϝ^][sgTF֌jF^nBW^ H!a{vkruCK׵sLY]B>=(W{Pvdi|&PXir"gËidmLLpȬB !bS0g&pmӆ6ivҖZ+قrԇb]hc#WW2}(a؅&!O}bjjу`Gx`(1FE,Q_"%7;p,5bJtTѤsFyρ*?2M3F =:RW+•1gl]ΥlEFBBJukMR V.Ϋ#D Ԧ>W<5)O >8͂76<$*$= G{d:2,4 r4=L&XlHBķЖs9ƪ*꼖+g;"(T*`v5VߛUQ1v6-p*B֒[Zݨ@lAkc/ybV;BB{i.!~b1nTVz#2;tצ[[M@eeͩԉXl8mū20MԘk:.7#WR-h!ޥxMk:h1[# O6MV2S@w EZ앓&p&[˭YWx# I+RUh &䈂tDosyA*lZEϦUF"yby0!S OqJc1!*(3*cˣ+zQ5xwH|}Gx9#+O+O"UHy߁_~0)o @=[W=;-qfA}ΒYP.(0nE;|tgKq-R)RbKVӤ8U5R"j)VIRR,bKX,E'KqhbR4HQ/E FR̓bs-EURTJ1KR!t)I1U)RLb x)I1V1RBr)ʤ(b#IQ")K1LR X")K1HR +E) ("_R%EO)!E9RdK~)|RxȒ"S )R^R| R'ŻR#R%xS7x]פxUWxYxQ'R<'ųR<#oxZxR'+ox\ǤxTGxXxP#n)ڥ%R'N)vHMJqwKqۥS_Kqۤ]ۤU[Y*ōR R\'ŵR\#R\%ŕR\!R\&ťRJKXP-R\ RJqJYMR#py嵇k.=\^{py嵇k.=\^{py+.?\py.?\py.?\py.?\py.=\^{pym.o;\vB+Y#3G\)uV4kRgͲSjDkNf,!:h5孢J\ZFh YLLtr4t"&Dь2P'GRjlj*JYD3D3M#J4h2$DzƂzƁFUD=AQPQ)(IBD%TopaTr(^LTD4h@jlQjQ_>X!Q'M$Eԓ(5KCmfS~"eeeyң@iDhdP*Q 9]DFD<D6"+YD g"2iS@hTH%B)N4DZ~R)߈%&k=J}Mї>':@}Jgr~B1џ>"ԇ~O{=rKDoQQM7@GSg^#zLыT}|9g"%zO=I^P)ѣDPDA&j(u?}D;vDSJ@hlPQ^{&h;ѝkkjmw;mDBt3MD[nnV'%j•r(RjWDPD]H*y>Z#:h3ѦtNԵhC:謨+ jQ D:w:ڨtU?h )DVWPDˢ:Rjl \LLt2ID^BY#Uo uD jjͣAϥ!MAD3AajetiDS!Дhxhޓ@ Td<Ѹh2|,&gE4 Py4y3,|&4M$ &·SjXYJ4$[( uVEՠ7ԏJ:DlP|zBo 5֋'5Gԃ(('M6S~jGx^&Q((- rG@Q|P (QUpR9DD6"+PI39LDF"SI9U"P}W^=b>;| |_#+>)'z{`?|E[7m'{߰~}Ֆ}x%["mYg $SE'mM'l {Q7hq1 (>.>h]}һǺʻhv?pv"o|Q ZNcY۲{ew ;mm|[Q&VoZu ںm]ߕePwy"d-ۼyQs"^=;>k{Kׇ-eg߾$y]xmkçׄOݾ&GsB§l_֭N^j|j^YڱڷZ ܾ"VLYѲ"B74 [흏Xɪ69*m_^Ҹ8|:haipcQ}a{}^_X-Մ >7<:<{{u^]XX*óPufьpxiۧ'M ObƄn]T.< G/CuL@ y>|1OGM{ӕ4^:9/M;34~={WS_H}?T]Pjς H.1̔3*4.)#;P7%[awqRʿpML>wT.oݧg_fǷشӔ~n$g M΍p6/~=!,~DKe 5>92nݚ9j|EPHӝB3 [ze249?p~T]8^p(v;;JȎLTC}Wm^">:mjJ_vעK,-JRRZƹC\5V jHU"^rkfLk59%lt ^Ne#W6gg-z`p:8 8XV+2`)X 4''&`!4@j<`.0 TU@%0 t`0L& x`0*r (F#PÀ(?    ^@O 9@6~x, <@:T p@7 p$6 X3#`nd'>U@8X=wG! =7[_//ρgO?>|  xxxx xxxx xx<<< <xx xx xx xxxxxxځ]}N`ڀp/pp7p5p   \\\ \\ \\ \\\\ \M9~d 8sq9?8sq9?8|8bG 1#p8bG 1#p8bG 1#p8bG 1#pq9?8gs}q9>8?w[݁_+\̄xc0SIl%k&]aoll+EciQ8MY]1y@@>R|FCZ-}*p;+s;[Sɳmd`6sy?:je ~To9.u1.a~]ή`Wa_\ˮ;{濆nĞysDIvF3"Qeu.=[stZc#=8%6VhD+O1FD˵v\:c v=NM*ФntW Gnҷ[mXmLۡ;pd]:*{EXl'V~k!?zԳa`<Ey_|ļ{5gAZԓ)Dgس9{}H^f7 % >D61uln'>:t~a|wav cc%uglgpޑM7w~+՗Tfdl"Į|pOIaC}LƇqQ4d)]%] [Tvĸ#WxIŅxjW %v5恪aK,C %!ŸK h&اow1^ ;~#r7`j~Y,=#ˇG YdAd8ViTUo2 }|syLWJfɔtO<>Pea蜒l*I Y^Ccgڻ9tngɘ9ɕ!p#gwu41bCF(>}R nwz{;|"4vUwX+PVv_Fq.>PlF)E{|44NySᤰ>J`I%~-qT9߷\,>-G.3UzsX,%X2!])ٛfR:Wf++٢td_Nk|%ݛfM7Yzj-#,Զ?لO9gv́zs*3W/1_Z7#&AMH|ݫ0cx֟[p䀙P'i{a{ _tP8A-xKrXDb P,bB{lDP)X[+搹RãK%{܀vۑ8Q?BƫQ 5w6%;ʘqw@{SR@RspJRdV3:3E} f[pBd{2e%\fUHCPZMk&Μm6./U,F6鳆-X*;axRҾ8WM}nv XǦNOJbn!'>|pt؜PBp\S(^̗6kڜc%Th숙0vٖ9ri/AM1$Lٮ>LIE I)c!ř6vUruAJ3!!\0abn4Y)- zUٜ<58Y6ȪŬD>+y!ӻ8-A͋,wu2G=nZHsrkkP{Ca`emߙb7587r~IiyF{zrrpn^5_nCM3oE*VNI:czAo@i b?8PfYY <+dM7ݕ̵؊~7Iyo`J/):d _ E^n^vz҉)n+l7/դ3S͝wpr8x&:*wsBZMw_nTscCFqH2:\Ą</Ҟ^o^Z_m]e5{IV*='Y,i"^S#`q-A8G SLi;etkCۙ.Li;et3]Li;et΍lǔi;$H"GxeZBM'C[7"PB@"h&rOk2x;R% -20 hDq@a (ecIHQMyF)"J͌ W | B-ZQoȧ3꓂M%)9r0֒] D NH$nX+#TR2N.tN&#eLT* t\<2XنL1J5PFbhYdX)Wr}+dV l P2%TIZL#cdLtVjC%uJ1V"@ Q)r T)eZh$.PW(dX+5bH=26HC@IRglLf `y̏d֑JOiT`etuȤ2 6@1ZtWBH%1 PҼPHrZLɲb1XC&B>hкZTksاkPD 2_\XHFij}^ѵ%:?a jZ&_ PS'*08`U3i4 9D#3y`B2bH5#CHz/)4C5Z9JEO1QUz Y2# F5ߏu8I(a/c`)ȑKrL$+rD_-Z\ނ&@:]%t@84j-\\`N\E3G.P)biMiSAd:>Tk HeHM#ShjZ."$G)ףe"glA"3%3:U2 3 SsT.SkQ01I̧৲#aEfi`.) as̓Ȕ52mrOL Q`/Lll: E3!H N(>`ARtB+2ڒL>K$ِ'pE&˄ЭCҼ--T<(˳S t9x<4yuPVktFa,(Q+GG4 *F HՐC,d!_*e&+JGSNrfӑtrz)1s&j{I.2).&bRcȮ0.!@4%D R1ɈX|(,]cbR2|ȘD3IԸP*JJL@6!&!R\"#R`M62" *drth\f ҋ|aI2:1.<Fd]"hVTX\hL/G%FcKM/$& 5RDP-E)ơ1d(&$R9aD"&"h*d >`Sd?[{{?a[{1|7@{~~~~v67#`{{{079op#FooΙec!|[[?cu |wr|x/K `w–5pM9Z"@_Z&΀`uZM]~(`E`nЗR`_}-Veo#'V*Cq$V/kKkqoKb TD8{a ,JKK,ޢE`Y!.gnmbY2L)Y"JV,K=p-겨T x,+O9r=3ĊXl+ #5 ZrYVpYYlhN!FXX?$Ik@MkLږemm[i擣'G#G F J6|%v%pEpYCȆŶ$l a;Í7œ+_;C}zU}Bp.r,6)粵7._W2AaBkʒIةB'ź*[V (;wdRZ%zP P'_ SP?ǩiTF&˳ P2<\mT[*@&0'T*d/|*ay )an.y9Ԟ,ힶs"^۲!IkL䪏o2o3LXwMlc\~C7+/ iG'Zd8{UWwXaLzpW7hҾi79!Ӳ:-u_vV\k=*3w۔aw/y$_6xWu奵V\޷wXẌG s9dii3(YXw~ qOoў3ގsL9M|D_q`C=7iS&%'ݫ;,ܛ.5zjT:>]K}!eW_s'^ąt|r=C{r z91w4鱁=x^2_:YmDq8csj'1I6 (:Հg%b 稵r}1=j@Qt &fo>PΒ[8}͋{O쑸riPegNTꕬI ʦM A_-ݾ[M̿V~fXOlmZcNo7dn~a|΍ڞM-G菶>Qd^׬# v6<})tϲ3n^t܆͒{x\399.%l㭣 Ώ:UʢwC|zoҠ_D{]uȱzE/%4ujF#C\xB&yq@]6 Yc0"F#h8-(,Z2 9 vW'reԠIg=Z.XS2eY3+o>{አ?oA:^[9pFA%/H/^gGVdvTt1%5p..mlܢr"i, {f=%LSR?wIKGwӲGBJzǖ}sjfyuccUQ|+{hVmf6JzF?X>Oe|,у:=ذ!MZ =aa3N\lx~);SG]oM gӌ3\7`›QWFPQv_4a^~=}vs_2.kWT|kiE"qԡ֏'>jYn_$mgֻZ֨QʎL 7Уٲ#w6n:ABƆq 0=|ԜҢ.:t#=a<ۺɄ6<FO> ٩KWaY#tg/Px'477;3YN8`OA[}Di:v@mL( IuZhG:SBO..3h35-8p޲QU6|<ޣAS&mҺE._Ԡ[zZ+Eq~8͡ŋzRDN :\?>U:ca.u~ʎzNjo[ްzd&$!ׯvl (jN[8/2L&+|? ymEϨV}NOdkv@ox5_p1z=?Νq5Nם\?VڊgM:쪟vov;}%<;ˁ+q"x*v}){ H׾^J=:A~}?>=f{<_T*q|h4/8^K5ΦGlZJYV8ض ttxfH̰>qM>?Lc9H&lN??ޫ,6O۾h7 rpC7!'lݦ'-bXV\NKfM ʛ>K¤")#5)Kf0%G~[-%9HNhצmHh֭!pmJ5'bj)rU^Ԑoa؅>VY䣩їwp)ь: A¶[;H(d8ˍ&aQO, dճಞ'*΁7w떲O컣.ɉ7-*]81mO;pخs5zrrSMܪ#)E*Ϋ^opow>z6ownnfsXoQr;\2e7 ¤)1e3Om]eܞ&/݁v7j?p쯦GTZ{HIܴuKk6mKww.UO7ow .n`v:+9gwM^x+/I+ֿ~ƣ}}6v<߭p1˼j$=N8!C# 9JFgbn3k?Spقy,MK_pZ<ŝ˥g\^٩'uc[=F~kOI畯$[BoLa˱'4xN~x2S3ԽtjÃO^UnTnw ^r!.̞|} q$O>v~h{6IylG[|Y9%}e7rT5vnmqE+Կ^JkցS.m^q#śuy)ܬfa``!A7V6QPg\;[Y^Oէ8[jEzphN7~W)eG\a3t8TLe32%B6]N[s^G7+Ya{޳G耑zq~)OM>b'UCFm.~׻Wֽݤc2yWШ5;uҽ~>SgY{83ÇUNU9OX ]NM2F|wPu9˟^,c%- :vǞ#}gY$z2m=255:on{Ѝٝr:.Xzeǟ wte=j㾃YG\vѠ?XشՎ)邖KlKpiqǻt wޯJ릯pxᇆ? gONkػ>/,]Z9'LQ^N=,9)Ŏ-?k~ʉ3)/Oɚ<ÀWZOivz% 4Vdqÿ9`e3?mӟZj5st΅rغhgrsJOwd46=Uqc]/slEEOX~~n?zlO$?eڽE rE״Ĺꂕǖ[icK6iO4|uˣM>)m7|6u/ugՍ@?x7~qxM[ׯi]9U/4W>sɢnt.l8?4^+f% ר=ߎcO/ Ϣq&LrxϗΗV^:xU\T6o^L樅 *ӓt7CA= Bi \Ces+.vl|\FX{2Bhm2>:1~NR+JqE2kti-9İo~ $,e%^˹zsorwqV(ׯ⛫}ǾT;uwՓo?4j;'_` Qw[TN.v\soVk=<:lƙzZb:6xT@zzgUzޔ 3~ۙonGύ~-UkCzم6YW=gWa{[[˽LO8yhAlk{K{˧k79h9uvhK$~A&!'R&T5ri{FF\x|n{aī'Hٿ)7/HqەOcw>^n*^(xXr+[I2vu YjXwwy0g7*s/$aziAtdZ`.hUGl|/x҆p5yM;av endstream endobj 594 0 obj <> stream x]j0 ~ Cqv2aXpl%3,QC~:?[]; cѓc\aɓ:WM{Wn;$;j".78<0QWvȞ&8|^z5oTm(^LA9}N9>PK4ЄZhZ;5pv?<꺸CٕY 9')|~o' endstream endobj 595 0 obj <> stream x: xTՙ$!wc& τH&/@!$3Mf`LS"bDV?qժ֊XUjmwWn+-.ZLfso{O9s@`vTV}l'#ms($x~.x@z}Wռ#<}ޑ^9y'Gѭ8\5W^FBƒe(+Ʈ[ffHfϚio \]a[:$wd'ԫL)%5Fnݣۻ17*gfڎGހfiK6uYѴ`<FGdؤ3eh`%h@\l@ccPKtd H+BZ%Oi,QrdNpŒxԘQS o+@>\CMiLOjiZRBKD߈9EW2|IyP&  al+l -lD]=Yf-\7995욚^-c%?6sj(K0ovר$s|Kܲas<ڭŶs_>=A.> .gX[) cE XBU{M/(9KWaffZS:_1c^( \KQ9 2ٻaFvl:n7]95v7p븄G'rTI{3xDb#0&h)gLW9w&'s Tc5''Y?H8b̩,Lʩ-xm82rPaUڪ=8+|8WEXXII[ecarV{V?vD?֧sǮԏҏ-ՏYc|X>ِd0 F3p [)}F'Lt lhO_l9b P-\KGiQO:GR?Ĉ&@KgC%J[T}ۖqBۑr{1]a=Y=Dܞv;ե%L^t[KgWK3CA}>=v uQ(uQӳջZ:Dzj"vrm'=wfn!wGmG馣CQJjIq5Ӧ47ˎ&qh%=%稻uJq(!=K *jl t+ոjO5ZfM`[׸x5b.T%K sY?< xs4o:U^_^O`<զү_ayT2!9Qn Dox$pRNUīR\ 9x/,ț}z9#yr{,ѧ;z9j(Ƃ}sdUpB7 H&?@~7rI)rj!3r{HA ~sO^ˡeW[!L #\{9#dD "zqhN8`>| ~'B&9y9򟸪*a)ll߆"9^$33h?^~>"D#_#C4Zi|9Oym7us21Fw H݁p=ы{x#uM^!] Mߪo91G#h핰ߨG[pwQ׋YJVrNIn&'Õrqy|_nZ-8~䫑5K<0&脭 õ ۏm w<=x>j}4lVl$H i&ϑ?sbn)Wͭڹ>υ1Nƹi? !xANA~# "26xherK "=2=B џ6̪zrؾmc= = axyK*='_ 1rR񽌬ƶ4D%~ryv^N8;w57]s'SLJ~ 5'Nڄp0&<$<)LX!GQY].KXס uûI8?q8z'KLd~H~2rn3PK@_ha6%\;fnKwC8@:6|*q;s(?A>s;&FdtGbZ(2W-'\1wB Jk =̿fvȟM[#x&C^ׯG&':XIL& ډ'7H6F㞃O795؈½7'&ԁϦ>ggmNį=Qp`ԉN2c@xyzi\VGLPW;QKʊE|sOO%6΃$_x[xA:,;$~3&?Zi l[qq|x e_zOCGu$1b,YtQ~'\ K`zKy}}KR׮]QrK}bA74,zmkrn kk[^FDccD0p|BQl4F }!&F'ba.Mq'7OeΝx=c!HקĵAWU ^il19Œryaan.'/4&yaJ, rp[*[0liii(0-T 5͚.s4gp‚|ӳ:*2%Kyar)!esQ|jeUCYiz+}Z5Mubu" BbLUV$19-uѢEU˖.I\\ K̄S\.YMo,ؔں9ϯize^6Ɋ+ԉ\SX C ttъ~ߎ'H1,A¯xh|V,8"7ON->@*j R\-+}XQ%-ZCsjݙsgLgN0Aݺ3ugΘjkYҪY]Dwr.%95- E(mQZ$\dc]{v{Ce~jb<;mﶷO_̯};of \:|en1椴u[2dzw2_8vvE*<9UEh-;e볫Rby%iďb1B2ZCLFqߏkittGיh-,4&'/ȏ+ʇXux eUim[4rqE~{X M~s٣<[5X#3rs`?1>|DD_kp,Ts '/rv !.qB E/K}>`oap J P&':4yw5vq xDH`ği h'4tu .748z okp<7r [Y>R7>1D_'Gc=}PPjWJ`HqMtR͐RJ˲ h}volҦX**KuNBC}}=2HMǰgOZA7*Ww=A79<AӯVeXj;E!9~O J +#I%8p|}JȭaO-9P׫8ٔWwv+=}Q1}ʀ@CT6t;gHFRP ;sPAGyIih S{n'*)bGC0L)BnGłC!:<.~?qGЉ8JpNT:D4. l?H0 )^\oA_ZR=J؎>\ ut}A]]fJn%Z **63A{QJ1Fj 1[:blw#Y\ FMFhO/OaVWri=,LV!9 A8"c@Xl;jj:J?Q/cz=,>Mw*DeiCJ_IR,^sZE3#1ۣ5NfĴiOYC 0Q?2Mنk>7˲f֮5^VBLk4;m͔AxtW0cC;}?AEKc&iԙAME+8wϪꛛy}a6̚%έKf.+!q0(msL~:hz5^e.}xe;ͪ*.Qw*wڠb|~v60T`?Ne0a?~V!ͺfTnn+"@"Jexh8:~p 2I[6B5dR19?iTCt 1t6nZv@̌ѢL"Ss *fϼ8&{Q)sq',*apиS#P?I"fF/ym, },p7{<b: endstream endobj 596 0 obj [ 0[ 600] 120[ 460] ] endobj 597 0 obj [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 0 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 556 0 0 0 0 0 0 0 889 611 0 0 0 389 556 333 611] endobj 598 0 obj <> stream x| x9lL23L !!!@$oV @TpBuVN .BV K*`!@ۯ_?y]νsϹܙ@K5 f RiEs[?k*Xmz/^譅/R.]yeQs -\0w#,+T`͏N􅋖_TW~! .]2onϊ+;\]4Vc1c~{-X>/g/hAKmw#b[,[M?R*?&esGƔͱ5HL.V韅Uo RԖe47Zt TI-W%{CFaʹ L]r~pW{ۧ7}dpnUJg725S.H%/'bjM署j͚S5͛d5N2lĸcBOuuSf7zۛu[7^?z?z)<$djdqSg7'f['F̂z%s+2zV3/!C~~j ٛ'oۄej+n?Иcʟ%B&>tV] Q5~oM{spt~+ye{kuGwݔ9HXcȲTtqݔNMc-~."ؙNu=^ڗRjƫf)AOQhV2é2ya2:F9-PA/[sgsƮAAV*7i;Cs-0VVLy#mR=)$J 0'm8T:;P] lumв]upZqS`+O`57]O0J(sqI^G:Rk++ V浰#BkBv4oNɠ-^FposQkn++T5@݄{ ?"P$&Ba=a3ƁҏV =t: O6 |u<L q7R لnet)zTK|]Z^f}H66#OxP&:7aTG `{5ҊZګ<) +̓Ӄ؃JƜ~vQQm6ʬ^Mʛx)TAЖ4^s%%JGƷBpF݄xvϜQB 쬈rEZ_ESD)"MeՖ֫e|"="VDZ~7RS+/Jt*GM݋ܥ]Vy]P ViWB@'#tu:ȸn3ρ% 7 xh?Mf; u4h2ۍ~p7!ch'w$QD$m::IV& /'\L8\JsG!8adV\BRX8Kjwte]D3% xh4- Lʾm$#rY]YDwey'2+\sW~OgAv8n3StLʮ${HʺSnThaۈ7uA61C ̶|]";lϳWz 3Tl7y٬<3-ĩ=-y"tIT|Whmd éS< ģq/n]ݳ Os;=s=13!s)7sx|vTgi=**ɞs|HW Y Uk5h|l+%ey5>UouU'[U?@3xzpWzε \8ǿI h2<` f`|%[g[OĒTTLNT)huf1qwK0Dwl2gAjĦFMIDl2X] W疫UdjUW9Kޅ[TK),[~ʏLw?"dGcCX)[~Bl')|:owBP! ;\<79Itr1zMgǣD߈~ F! 0 ZHm4դG)z]x>duL"p^KV܀wadadEOQSMG[GvF7."C:yw 7IO!|D~'0IO2#ۚx x>;1O??/k<8s16-d鹑bwN}mvq;)Eo!]/\&\IH |"htqX'$/jsJN)SZ,]']/m² 'zWx߰8" ]>ql(2?c cYJhc{F!)!­M"p=g/`+Y0V6h8Ҟik$0~/xZ~ ? p;{\h$ݮkk X$tGBacѷɆCr6 MT۾ED de.YxQ@,%NފNvDTro;< sYKǑ rVZmM*8} ;)R)c"2#}KFw Vi"&Tl(`~܍a]M\y5fMDN_k@(&!]^AmF Ӆw 3 !^8g2=gbToQ.CZIGМK0QT@lj¸Q>cXE y'oh:hSDZ4%~ mZز#c-b&#v+˽>9*˲˰p>lۤ#'7# U\c"/T*dFNb⫤X=ʐ8 uI<z^Nx9q8<48G 47ttenb&Cwy X!Rb{4fPġ Iard$mNloj[ziRɫVC֢ W&$3Y%xThdf b!޴yy.1|~Cw=q+Lyã.8z="]:=+񫡣{s;eu [N5ss]mY5J(kk9>ntd?͡` IXGR %y' (WX8"?Y*eyiata%ߪXYM6Zle\cY-wȻ-FmX3!8-CVI3ژA4ʒaE ={,qcif}Fy.tqet(-4[Wji|A54-KKe8R/+ vA}`!M!fKlag ̸&{d&?ɮ'kȪ[&UYsjslfF͸i%j\O߅]o2!j$z(lOR5m 8A-D/(BDX-l$cNI11 Vǀ0Jg]/ ~;Zȱ& ږ\I5U},rpFn+\yX2Oic?MM-qrD_ EGc>G;Z}KG5N)Oi7t*F(fͲfQq"VF;1QC{v<"lrꡅ40'dHbkR~ X|T9&rklIiKj" h Vr\m1y-9-^y =iǕ}M͸qWW,yXwUyHI_(W$ DcScenebvL{ѱ%zSmL}Yle:ͱweMLcJKc޳{M$&')IIB9t\ ) ʍ!咪u,xBVޙնjj|7D(~'w궷-%;;ԯq24vOnQ"t&jr2ˁ5Ĥ8_&viksӖǗdLU'K\rMm]uCd:|ߥ PuDcVU5d9]gbdc y6vRrKB%vFčI)mMI~'5Z_zOw0ILIi !15iҧ y0mO諒 ݞҏ&f0=,%k 7ڐbbt}A)ݧjt}KtbtyeQ?Cu%R^՞j l\fK.J+#NQ'11aI"&1uvuq+U.ݤ\a߫['*q%]8#bŰ6@I 4ik:ҤOLҦ ZVZLu-33Fz$n> y-z]w\_vlD@OF>2_dE1}d˥m}s}w̻#߾XY64vQX]c䩿#OѭՈ6n*+bһlOKl`(l|=Iz"]!Xx0dVQYP7Ͽ\la3yPwU;&N "sީț0|YI"y͗_SVM3uwuWyBTk!YIoPRuR?91yisLrcBCښ`k~LlSVV 9C CƸ,NdI1܊`yo0VX0;~I.B#tfO50`*& }M?%o->zNy 42^_)F |+T1ɿ5}2lSVMA2[,5r4v9y\+y\xuvK&㺘}F!`7&xm򘝱84k=OwZ_5o eÎvfWivOksa̕+<{0nyBmkxװsÏo㏧$ĮsY<6qۋ o$ހAU3n8Au*U\i# Xo@]H!+)`1V_MudNtVA=ћ _G]>v&/m}{ic*/$}P$KK{JȱOU#+SǕn JUwTuHUJO6--EGe36=.SQTbЉ39jNkɩo"%}U󁢑}f,2W@;~ۑ#+7cF~ċ[\+xws>zoywq+n6Z;&+bF0 ^]E6-+jmeG,'\7wapd$gf%r1*xhymc|bKۨEϙh,۲=^Ee;޲ʱ%NBHdK(eLY5-<7mS(ar{M%iKi[˻B+-%ϙ,; w_9?sΌ@^z͍®7=vCVK\߈gdt)/(2|̳?[~sOjѽ8O{\I W*_}+JW,\*T؟Լg2ԳWlM7ft VkP54lSj4`l Ȓ4Z-Cm*C1hQi隢vN{N״A[]eN-=T{6_OؗMϠe킘lEL)_Ll0b+gAOdF׉ܩ./ +@^֖xti[\qV"F?v'@:7tgQٷA& Ut.[4Kp]WK+K4mɂ_~ZN(Y EEjod\ 늼mEzNߟkop&߫(`Aa+iXO9%H_PXT!ڰk`8YL2ǐ7122}YzO: |SA"n!ssafzѣ5;āB=yF|艊b23Z1qzța)8 j` h @2ا 0k'#N~B_)aVe.EYH AA' !"MSzzʊcϬ2N{U43|h# =zWU~@D924wlדzJ45VZ)ĝB^-QeΊ5%?}G:ݼ͘Wab1}3Dϸb{JF7.R-t,d2ڨa6ʰ`o†YXXiP,23W#}8L=)KƼk}3;l1XNfEYo0?Ç;d;g]Dm8,6r.7Ԋ4-`B685-3X.v~gbMG`"o;h;l;f{&lncSm,%I_ ^JN6JDZC$4%9 (*>-$ė{vEK]bv"z#h-F ȑ(9P%GPlHx3<tʯ5,87 ;۵`iBbgas1;h_޽Xlhu#MVjFpj(\{k7_Ŏ*AX믒WYYɿ*@U~8\)^9sHWtM~Ŝ9?q/Xྒྷ|}^SUSUHjkj>Ikc>^P]MHs2N 7kjޅ =]nFM+3?JU(+Ͻ-Kv -`5 jmϒjV[mӳnwv\!oIc: +a^y-VUկ *XjɓpmĕHi?~ʈi (t)[SÐ#H# lA]8 aa3_1^̘eQk'd2\1[S_r,<ֲe#\rbKM״9ھnN7RoT[/-)_Ylm:r͎櫣{}q[z%&}M`MѢk~׎ }(Wĕ*)+(q\B90/=!꾅uP1Ϝ&&NTI0 <d_OQW@J.I"vϏ]u[nm .x~O _ؒml~2ϳƆ67[&')z-)˓ս}22o/.j`i O,7G32ҠЅZTq*Ff,US0lr87r*R84J9QڧNo5{x "5\P_ LOLT҈3VN 1wqq=4&Lnc1B"Yac_2qHl-@9%[5"fBzS9`Y,hWpn K?dN.AcO<? >i/-oՖe ~iQ*̩Ld䅂[,,^/hEp[zVs# 9 -Oy%~@c—9u[G>gڂwׇkK:XnɣCg7և^ER-Rjм6PͰj̨Hq`'**q̡T"'TN7L,Z h  E\){K;K/2c??M[ X^Q+JAk!rLPBfiihqx/a]FrrIYfl69\ɩ`4Y"Sl3X `cFͥ ѬyV4|j N*\M@X٨I7!05 '/ pK|$l ^63͸pӾ_qL)}@ِU/be[+>WX_Y!JJVB5'ئPlRHAY =(%ESuJܮ ةęJRb%8,!`+S1,hDu: 1 ddF@ $Ea$dqx=LCaݧ6ٻ1ӿb0'yrqΈ)RB&yh#%ydFR9&I(H,& f}WG߾+.X{|Ɩ,v}k8|] 7]֠U)-TiLJCݟ+5 F벍FEPȮ S:a ̓&cvBؔ!†h$'{ObQa1f,Vg4맏F k3r~, ffê{\,5}՚z.-5ԽWdt#IfayZAa{pAzTvyVyr[aek[_)Gy`YUBoۖ dpqNcnM# t<  ֤nP!?ÓaVR Cɧ+TaYpEC탓7zO>6k)mZiYޱ}݂]{l26,^$TX5kvWk̷T[ jWVw׍ܶ!C4zJ8Mu J^>zɱ%-:21Urjs% /;6*量7>$OCy4i4Y,h1K !"~|X Ȓ b!WeraIȵ4&#19kZ Y:z4Xf 5}j뱰S]%b޵VSnIz:;?Ӱ&lk=t"Q*=(-@!wl@ٟߚf2_|/!~?tSMkfJNfs(/2dc~,rTHXRXIq іf&~h.iBa(A&?i- tJ;Ԇ5&by:6=x!4L<}-D~cI A@͔ &:R(HhBgȅf]=aK,,I QNITfI?I^yOG`FK-&alA8%$TAezBtn3Jnz%hOzX|NdVQh|'|O-cKJoo @}u(xRѤ-JH1IN"t1Jxﰄ%(`+>r#ϹKw;e$Ƀ3Y3FgNN?:@$0 lR4D}*L'seO SƗβ ci[e QO[/AbZb8/c{Q!?IQNEϲ*ҷȕ4&E"BmB _F/19'%d?n"51kf553(C'Q:HLD  +R=Di Jj"X"R8p_϶^^25̶ILR9nd5$L @ɜ3r #SrG+D[8+cF _"'fdSf5Nc! \E4Kr?N4B^$fԌZ@"#/APl-&пIX{CZm!a*D>Z@뤶w.r 9Qv+#w4C*FAqnK-tH9Qڅ$3&(낚KM#[)ܝUʈ`&8NZ# MgnC+x)dfī8gCtD#b&*vJ͌ mO3DB9J2#v W)7DD-w-);i`-?3JIn5QʹOuEz.}PKQM㾤ROX8GO %|D$Z $WI>_.DMT&zPvW A+Ʒhl,CшKh _hh|\ǃ+ӵbIg,'tE'B8)4, GǶ=Aɥ)Qoш>'3ƅp*hLX aADaRa<:e$>H ℏ~34 : !, p,4Fsq(16#H%N[ۄ `;NLxTS@N cÐ \X05mT ơ4K#d'R$Eq@Lu{cY e0i(2;KP %RQ)WQ+j3'r#ZܞĵJ$ă[c!5lEQ;Q 'c` a fK)MNA>鈝D(5INa?F#IN(d4[XY&C[Bc@6UZ% A)8!^ސFt7G'"08#l&:]/Q8uD6 S cg"chnC"? . ; ǣ9>ቭBaL 8[O.J)E .8N GIs9%s#'!Sqn+&W:)lB#G QB Dג.H04)ѭ_#qX R(DaJpw&xWCEkoS5}5~ ˽@YN80Zڼ$ڽ k=݄~T?y@G)4:@Z}=HnZB3x:W9uLݰD7qHdBzsSG4[訫ЙFH۩-)xR[Lq9v}A(0,Rj1EύGҙ???吴[nn It% hry9=GpFZ5.(M̝:z5K"Tvzbvҙky'h̻4Kyx\.[5su\p+Fḧ́mճK':h?p\q؝ɖ9cH V1G#sd->$6_f[(]Wь~gq7хaZB~2#l`/)5N-:Xpc>6Zĩyb\U}:`.:]g*['Wmӎ,`r_.W1w3;8)-o첣Ŵ|+`>[JjBN~ŷ7y-~ehmՑ纻G֬s~;re0Øk. )|J9A+q5@*[%gWqr36Ҭ"H֓FY F#i3OsR}UI?kM&zTD.9w]UCuC{-T@F~"8?UP v76 hW31FzpKT?}V͞|Kqⳳ U x'̡/qӏE{r&,3cWǿE;x]Y>_㟞h6<{뫧 ]d-s(">I14;Lu UL $`>76¾[W' Z7WY@F oPYIq^Q:U](hZYaHA U[[.9<%>(Y1j̵E}tcZOcWU?{|zċ)hz R96:BbÉu'T>GSК]iar5fk`o3sSMɵLۛO+/W; Vwt9Bz"r,mIFY2퐑D0';x4gY9|e{Y$c=W=]BӇ!_A/jBoZ!-@sbi74Sp= aOc?pÛ潩KE'1JGr[b ɈJHo!_qeq#Jߧ9qqg_@cFpqgW o;8$8ٱLǻq+gga&Cdb_0+򝅡`Dcb}A/$OR{B"ٙsMM]Rq'9}+c2CC<{bqȡՊu5"G' K^dBdȜBر5xy3;lju|A4<'dsƇa$&KKP x۴\F9B3~V"y[63w"i"5蛪~j[Ōu^~}Ú_诇&v<#{N1>"s7٧}.q&Zܝ&iϡZͽwM~LbuPp7y7X7 gf5b˼*I/zJ] ^3=?A$4zAOJYUZ|<648ޒBqsaOnVP;JXɰl?  qwp͐IsJ~Ƞ ώ(7UؔIѝ[2r8B@@wr U@KBXVG/>K@x ɝݴ;}آ|dcˣ! =: ΁4Cu8' ܇f;S'N==>%+tMu8XU+) $`Rim"CC%X"t8D |4w)n~H/[9GQ$д"$"'PD<U3~S`wm`*5N "FKX!N' Zl+y0~W (հWOiS6R/D1e(ۋu1HF s2}|R<֞ pijCCa=&zNu" =7Z1\κ`Bn"`f: A8 `zA8x 

pwogNS8SnpT IZՐ>L=.pk2"P?mwW:p鯌4߲GvſdPyTj?K`c)-6X|NRX$YXH\l_ u1^Y-`Q9}3N3'=PϾyAa/6k~'qf:yB#XfM]m 62zgn*Mqmfɡ5TDGnyw]%_i=ǐ^xA[)$M@!& zlhDRep7a MfNH&тf'+]w+jƝĞʊvw4wB/wĦNS26gÖvo$M6 %ͯ2sCfY^`-Own$|g+{TEFrT\YOwT%ߝ[RtyD&.nJg(#+[H8:>-7GODѳurhb/I.p\zmr1f"=DZaV+~Y]u51z[|RJBAtKnXF˄U *NYNCQ zڞi%u\n8'x=qٛq&#S`M[r_u7/Yybf6B+=j\so<|w PH+S0/oHl<3F1/z]_ҹUaVm$$LI`(+LbUYXQ(oX0jpg%h Gb;2IN׏pѺVexȫH4S3/GykԖhyhH2l?i - 9Q!gߝ: _0H-][98,_6IJ-X?CdܿF>Ҟ ߾UYՕiTJCiʼnґ;gryQ$Ĵd BQ !SItPEtփ0T?ilo l-8-ŢxںWW7w2jrV и@"75@83U Scʑ )8sܮP!r|}x/ (է뒭*%78=;C3{x$^ \7hMTMerY<\utN:m]4D" fjb{,ϧc]Ͷ⤧a$յ8gfk@?Sgdt\p)ŋBNY :,0kVz8%|Qm-vXirC=2x MYI1v]QkԖp5K][^_D%'bGBKQ7^O]qJKꥧS^>i(r=(,Җ>J 2Uv:f&ͺ|EbN+^`uoM6B.t"}8U+ k3S__>Q`]k}F̋֞~tw lg[R+~nL'DE_%dS.=q5J u:d0Zpuɝd"_+ߎoG`T> ;&0-oQ<e@s7QV/ (oU3>1C7Lcݤ`t߱نWW Z~ endstream endobj 599 0 obj <> stream Microsoft® Word 2021 Marti Maria Microsoft® Word 20212025-07-07T17:05:47+02:002025-07-07T17:05:47+02:00 uuid:DD230E35-0D24-460F-9EA9-441DF1D214CCuuid:DD230E35-0D24-460F-9EA9-441DF1D214CC endstream endobj 600 0 obj <> endobj 601 0 obj <<350E23DD240D0F469EA9441DF1D214CC>] /Filter/FlateDecode/Length 1286>> stream x5uTU.((6` &؂ر "!-X݅`{a}̝SOJ\waNRh2,L" ^UXBX ~kžS8A- 5ƽ7z =ysᐖC;B/{N>q~3 k * ~0~. m 0l^$O=3~,QbDFw/]x?*tye6g4v/f#kv.f4PX b,fX c ,K{/W? `%,eVh5*V*X c 6b}lcKl6hͰ9@l۠=Nۡ#:a.;cbO쁮 {cǁ8Cp(zS Q8G 88 @8 C1 g48 8 g s‚ü|\q }`eKq%.Wj뜕BV܂qnMTfnm;px܍ý1A<&Q<,“xO%<"^d^tLۘw )>‡+|%_;|?gq_8`O/_ _2rZ_mnưG7fT46F7ͨhD1JQ_$2M`F#QHd32mF0ѿHd3nF"#fd0DF>#f1JDF0`3J`FQf2`F0QHd3Df3bQLwΒ`F"#hj2~YE0#RF#QʈbD1JQ(F)#(eNDF"#(et3Q(FňbTj ~+e3Q|F)s!2J(Fňb2QRF3ۭ^.3uD`D1 b3(F#`D12Q`F#b32Q F3сU/kjmFQhc0݌Ff056F7ƨa156F ͨa1jmnF Qhct3jmFQhc0݌Fl}9 s6F3Z7P]Vt\T5;6)L-{i)Lehy ˓50~?JZ endstream endobj xref 0 602 0000000067 65535 f 0000000017 00000 n 0000000165 00000 n 0000000277 00000 n 0000000609 00000 n 0000001601 00000 n 0000001744 00000 n 0000001920 00000 n 0000002180 00000 n 0000002233 00000 n 0000002286 00000 n 0000002457 00000 n 0000002709 00000 n 0000010543 00000 n 0000019349 00000 n 0000019482 00000 n 0000019512 00000 n 0000019673 00000 n 0000019747 00000 n 0000019999 00000 n 0000020378 00000 n 0000022121 00000 n 0000022297 00000 n 0000022554 00000 n 0000022683 00000 n 0000023044 00000 n 0000023214 00000 n 0000023455 00000 n 0000023584 00000 n 0000023712 00000 n 0000023840 00000 n 0000023969 00000 n 0000024098 00000 n 0000024381 00000 n 0000024510 00000 n 0000024793 00000 n 0000025076 00000 n 0000025205 00000 n 0000025508 00000 n 0000025638 00000 n 0000025768 00000 n 0000026070 00000 n 0000026200 00000 n 0000026483 00000 n 0000030130 00000 n 0000030307 00000 n 0000030445 00000 n 0000030475 00000 n 0000030641 00000 n 0000030715 00000 n 0000030972 00000 n 0000031140 00000 n 0000031306 00000 n 0000031467 00000 n 0000031601 00000 n 0000031631 00000 n 0000031793 00000 n 0000031867 00000 n 0000032107 00000 n 0000038477 00000 n 0000039259 00000 n 0000042994 00000 n 0000046571 00000 n 0000050652 00000 n 0000050834 00000 n 0000051099 00000 n 0000054576 00000 n 0000000068 65535 f 0000000069 65535 f 0000000070 65535 f 0000000071 65535 f 0000000072 65535 f 0000000073 65535 f 0000000074 65535 f 0000000075 65535 f 0000000076 65535 f 0000000077 65535 f 0000000078 65535 f 0000000079 65535 f 0000000080 65535 f 0000000081 65535 f 0000000082 65535 f 0000000083 65535 f 0000000084 65535 f 0000000085 65535 f 0000000086 65535 f 0000000087 65535 f 0000000088 65535 f 0000000089 65535 f 0000000090 65535 f 0000000091 65535 f 0000000092 65535 f 0000000093 65535 f 0000000094 65535 f 0000000095 65535 f 0000000096 65535 f 0000000097 65535 f 0000000098 65535 f 0000000099 65535 f 0000000100 65535 f 0000000101 65535 f 0000000102 65535 f 0000000103 65535 f 0000000104 65535 f 0000000105 65535 f 0000000106 65535 f 0000000107 65535 f 0000000108 65535 f 0000000109 65535 f 0000000110 65535 f 0000000111 65535 f 0000000112 65535 f 0000000113 65535 f 0000000114 65535 f 0000000115 65535 f 0000000116 65535 f 0000000117 65535 f 0000000118 65535 f 0000000119 65535 f 0000000120 65535 f 0000000121 65535 f 0000000122 65535 f 0000000123 65535 f 0000000124 65535 f 0000000125 65535 f 0000000126 65535 f 0000000127 65535 f 0000000128 65535 f 0000000129 65535 f 0000000130 65535 f 0000000131 65535 f 0000000132 65535 f 0000000133 65535 f 0000000134 65535 f 0000000135 65535 f 0000000136 65535 f 0000000137 65535 f 0000000138 65535 f 0000000139 65535 f 0000000140 65535 f 0000000141 65535 f 0000000142 65535 f 0000000143 65535 f 0000000144 65535 f 0000000145 65535 f 0000000146 65535 f 0000000147 65535 f 0000000148 65535 f 0000000149 65535 f 0000000150 65535 f 0000000151 65535 f 0000000152 65535 f 0000000153 65535 f 0000000154 65535 f 0000000155 65535 f 0000000156 65535 f 0000000157 65535 f 0000000158 65535 f 0000000159 65535 f 0000000160 65535 f 0000000161 65535 f 0000000162 65535 f 0000000163 65535 f 0000000164 65535 f 0000000165 65535 f 0000000166 65535 f 0000000167 65535 f 0000000168 65535 f 0000000169 65535 f 0000000170 65535 f 0000000171 65535 f 0000000172 65535 f 0000000173 65535 f 0000000174 65535 f 0000000175 65535 f 0000000176 65535 f 0000000177 65535 f 0000000178 65535 f 0000000179 65535 f 0000000180 65535 f 0000000182 65535 f 0000061566 00000 n 0000000183 65535 f 0000000184 65535 f 0000000185 65535 f 0000000186 65535 f 0000000187 65535 f 0000000188 65535 f 0000000189 65535 f 0000000190 65535 f 0000000191 65535 f 0000000192 65535 f 0000000193 65535 f 0000000194 65535 f 0000000195 65535 f 0000000196 65535 f 0000000197 65535 f 0000000198 65535 f 0000000199 65535 f 0000000200 65535 f 0000000201 65535 f 0000000202 65535 f 0000000203 65535 f 0000000204 65535 f 0000000205 65535 f 0000000206 65535 f 0000000207 65535 f 0000000208 65535 f 0000000209 65535 f 0000000210 65535 f 0000000211 65535 f 0000000212 65535 f 0000000213 65535 f 0000000215 65535 f 0000061617 00000 n 0000000216 65535 f 0000000217 65535 f 0000000218 65535 f 0000000219 65535 f 0000000220 65535 f 0000000221 65535 f 0000000223 65535 f 0000061668 00000 n 0000000224 65535 f 0000000225 65535 f 0000000226 65535 f 0000000227 65535 f 0000000228 65535 f 0000000229 65535 f 0000000230 65535 f 0000000231 65535 f 0000000232 65535 f 0000000233 65535 f 0000000234 65535 f 0000000235 65535 f 0000000236 65535 f 0000000237 65535 f 0000000238 65535 f 0000000239 65535 f 0000000240 65535 f 0000000241 65535 f 0000000242 65535 f 0000000243 65535 f 0000000244 65535 f 0000000245 65535 f 0000000246 65535 f 0000000247 65535 f 0000000248 65535 f 0000000249 65535 f 0000000250 65535 f 0000000251 65535 f 0000000252 65535 f 0000000253 65535 f 0000000254 65535 f 0000000255 65535 f 0000000256 65535 f 0000000257 65535 f 0000000258 65535 f 0000000259 65535 f 0000000260 65535 f 0000000261 65535 f 0000000262 65535 f 0000000263 65535 f 0000000264 65535 f 0000000265 65535 f 0000000266 65535 f 0000000267 65535 f 0000000268 65535 f 0000000269 65535 f 0000000270 65535 f 0000000271 65535 f 0000000272 65535 f 0000000273 65535 f 0000000274 65535 f 0000000275 65535 f 0000000276 65535 f 0000000277 65535 f 0000000278 65535 f 0000000279 65535 f 0000000280 65535 f 0000000281 65535 f 0000000282 65535 f 0000000283 65535 f 0000000284 65535 f 0000000285 65535 f 0000000286 65535 f 0000000287 65535 f 0000000288 65535 f 0000000289 65535 f 0000000290 65535 f 0000000291 65535 f 0000000292 65535 f 0000000293 65535 f 0000000294 65535 f 0000000295 65535 f 0000000296 65535 f 0000000297 65535 f 0000000298 65535 f 0000000299 65535 f 0000000300 65535 f 0000000301 65535 f 0000000302 65535 f 0000000303 65535 f 0000000304 65535 f 0000000305 65535 f 0000000306 65535 f 0000000307 65535 f 0000000308 65535 f 0000000309 65535 f 0000000310 65535 f 0000000311 65535 f 0000000312 65535 f 0000000313 65535 f 0000000314 65535 f 0000000315 65535 f 0000000316 65535 f 0000000317 65535 f 0000000318 65535 f 0000000319 65535 f 0000000320 65535 f 0000000321 65535 f 0000000322 65535 f 0000000323 65535 f 0000000324 65535 f 0000000325 65535 f 0000000326 65535 f 0000000327 65535 f 0000000328 65535 f 0000000329 65535 f 0000000330 65535 f 0000000331 65535 f 0000000332 65535 f 0000000333 65535 f 0000000334 65535 f 0000000335 65535 f 0000000336 65535 f 0000000337 65535 f 0000000338 65535 f 0000000339 65535 f 0000000340 65535 f 0000000341 65535 f 0000000342 65535 f 0000000343 65535 f 0000000344 65535 f 0000000345 65535 f 0000000346 65535 f 0000000347 65535 f 0000000348 65535 f 0000000349 65535 f 0000000350 65535 f 0000000351 65535 f 0000000352 65535 f 0000000353 65535 f 0000000354 65535 f 0000000355 65535 f 0000000356 65535 f 0000000357 65535 f 0000000358 65535 f 0000000359 65535 f 0000000360 65535 f 0000000361 65535 f 0000000362 65535 f 0000000363 65535 f 0000000364 65535 f 0000000365 65535 f 0000000366 65535 f 0000000367 65535 f 0000000368 65535 f 0000000369 65535 f 0000000370 65535 f 0000000371 65535 f 0000000372 65535 f 0000000373 65535 f 0000000374 65535 f 0000000375 65535 f 0000000376 65535 f 0000000377 65535 f 0000000378 65535 f 0000000379 65535 f 0000000380 65535 f 0000000381 65535 f 0000000382 65535 f 0000000383 65535 f 0000000384 65535 f 0000000385 65535 f 0000000386 65535 f 0000000387 65535 f 0000000388 65535 f 0000000389 65535 f 0000000390 65535 f 0000000391 65535 f 0000000392 65535 f 0000000393 65535 f 0000000394 65535 f 0000000395 65535 f 0000000396 65535 f 0000000397 65535 f 0000000398 65535 f 0000000399 65535 f 0000000400 65535 f 0000000401 65535 f 0000000402 65535 f 0000000403 65535 f 0000000404 65535 f 0000000405 65535 f 0000000406 65535 f 0000000407 65535 f 0000000408 65535 f 0000000409 65535 f 0000000410 65535 f 0000000411 65535 f 0000000412 65535 f 0000000413 65535 f 0000000414 65535 f 0000000415 65535 f 0000000416 65535 f 0000000417 65535 f 0000000418 65535 f 0000000419 65535 f 0000000420 65535 f 0000000421 65535 f 0000000422 65535 f 0000000423 65535 f 0000000424 65535 f 0000000425 65535 f 0000000426 65535 f 0000000427 65535 f 0000000428 65535 f 0000000429 65535 f 0000000430 65535 f 0000000431 65535 f 0000000432 65535 f 0000000433 65535 f 0000000434 65535 f 0000000435 65535 f 0000000436 65535 f 0000000437 65535 f 0000000438 65535 f 0000000439 65535 f 0000000440 65535 f 0000000441 65535 f 0000000442 65535 f 0000000443 65535 f 0000000444 65535 f 0000000445 65535 f 0000000446 65535 f 0000000447 65535 f 0000000448 65535 f 0000000449 65535 f 0000000450 65535 f 0000000451 65535 f 0000000452 65535 f 0000000453 65535 f 0000000454 65535 f 0000000455 65535 f 0000000456 65535 f 0000000457 65535 f 0000000458 65535 f 0000000459 65535 f 0000000460 65535 f 0000000461 65535 f 0000000462 65535 f 0000000463 65535 f 0000000464 65535 f 0000000465 65535 f 0000000466 65535 f 0000000467 65535 f 0000000468 65535 f 0000000469 65535 f 0000000470 65535 f 0000000471 65535 f 0000000473 65535 f 0000061719 00000 n 0000000474 65535 f 0000000475 65535 f 0000000476 65535 f 0000000477 65535 f 0000000478 65535 f 0000000479 65535 f 0000000480 65535 f 0000000481 65535 f 0000000482 65535 f 0000000483 65535 f 0000000484 65535 f 0000000485 65535 f 0000000486 65535 f 0000000487 65535 f 0000000488 65535 f 0000000489 65535 f 0000000490 65535 f 0000000491 65535 f 0000000492 65535 f 0000000493 65535 f 0000000494 65535 f 0000000495 65535 f 0000000496 65535 f 0000000497 65535 f 0000000498 65535 f 0000000499 65535 f 0000000500 65535 f 0000000501 65535 f 0000000502 65535 f 0000000503 65535 f 0000000504 65535 f 0000000505 65535 f 0000000506 65535 f 0000000507 65535 f 0000000508 65535 f 0000000509 65535 f 0000000510 65535 f 0000000511 65535 f 0000000512 65535 f 0000000513 65535 f 0000000514 65535 f 0000000515 65535 f 0000000516 65535 f 0000000517 65535 f 0000000518 65535 f 0000000519 65535 f 0000000520 65535 f 0000000521 65535 f 0000000522 65535 f 0000000523 65535 f 0000000524 65535 f 0000000525 65535 f 0000000526 65535 f 0000000527 65535 f 0000000528 65535 f 0000000529 65535 f 0000000530 65535 f 0000000531 65535 f 0000000532 65535 f 0000000533 65535 f 0000000534 65535 f 0000000535 65535 f 0000000536 65535 f 0000000537 65535 f 0000000538 65535 f 0000000539 65535 f 0000000540 65535 f 0000000541 65535 f 0000000542 65535 f 0000000543 65535 f 0000000544 65535 f 0000000545 65535 f 0000000546 65535 f 0000000547 65535 f 0000000548 65535 f 0000000549 65535 f 0000000550 65535 f 0000000551 65535 f 0000000552 65535 f 0000000553 65535 f 0000000554 65535 f 0000000555 65535 f 0000000556 65535 f 0000000557 65535 f 0000000558 65535 f 0000000559 65535 f 0000000560 65535 f 0000000561 65535 f 0000000562 65535 f 0000000563 65535 f 0000000564 65535 f 0000000565 65535 f 0000000566 65535 f 0000000567 65535 f 0000000568 65535 f 0000000569 65535 f 0000000570 65535 f 0000000571 65535 f 0000000572 65535 f 0000000573 65535 f 0000000574 65535 f 0000000575 65535 f 0000000576 65535 f 0000000577 65535 f 0000000578 65535 f 0000000579 65535 f 0000000580 65535 f 0000000581 65535 f 0000000000 65535 f 0000062586 00000 n 0000062888 00000 n 0000094587 00000 n 0000095020 00000 n 0000146948 00000 n 0000147403 00000 n 0000147865 00000 n 0000148231 00000 n 0000185022 00000 n 0000185345 00000 n 0000185643 00000 n 0000185699 00000 n 0000205225 00000 n 0000205527 00000 n 0000211651 00000 n 0000211695 00000 n 0000211915 00000 n 0000236506 00000 n 0000239651 00000 n 0000239697 00000 n trailer <<350E23DD240D0F469EA9441DF1D214CC>] >> startxref 241187 %%EOF xref 0 0 trailer <<350E23DD240D0F469EA9441DF1D214CC>] /Prev 241187/XRefStm 239697>> startxref 253387 %%EOFlcms2-2.19.1/plugins/fast_float/Makefile.in0000644000175000017500000004630315176574547017541 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/fast_float ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src include testbed all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/fast_float/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/fast_float/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/meson.build0000644000175000017500000000020715176573557015505 0ustar martimartisubdir('test_profiles') if get_option('fastfloat') subdir('fast_float') endif if get_option('threaded') subdir('threaded') endif lcms2-2.19.1/plugins/test_profiles/0000755000175000017500000000000015176573557016226 5ustar martimartilcms2-2.19.1/plugins/test_profiles/meson.build0000644000175000017500000000005215176573557020365 0ustar martimartiprofiles_dir = meson.current_source_dir() lcms2-2.19.1/plugins/test_profiles/test0.icc0000644000175000017500000000107015176573557017743 0ustar martimarti8lcms0mntrRGB XYZ  :acspMSFT-lcms desc4cprt<Lwtptchad,rXYZbXYZgXYZrTRCgTRCbTRCchrm$mluc enUSRGB built-inmluc enUS0No copyright, use freelyXYZ -sf32 J*XYZ OXYZ &0-XYZ 42para3chrmT{5&f\lcms2-2.19.1/plugins/test_profiles/test1.icc0000644000175000017500000210074015176573557017752 0ustar martimartilcmsprtrCMYKLab )5acspMSFT-lcms desccprt#wtptA2B0,A2B2,A2B14B2A0F<8B2A1~8B2A28gamtXdmnddmddltdesc,Test profile, not suitable for real use-Test profile, not suitable for real usetextNot suitable for real useXYZ Zg0mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{T?~ò~i~L}~cbA~Dad~ty~W~O>~\/~|~`Cx}%H}1X}%z}K} {N}׋<_~7A~-ψ||Dz|+E|[s|z} ^}wO@}-~ċ {Gu{Dz{]Ĭ{f{Zx|[]|ϕM?}R<}Ǝz]YzHħz|z={LNw{\|=>|v|ېI8z/r z;bz'sMzd6zɬqv{D[{0> |;|yyaIy?yazYvzݮ[{^=c{ФI{R*y߄yfUy`VyyuKzZi{ <{z%zȎ~+~}͇}W0}3}HtЄ}Zk}=~zɇ}!~Єd*s}Y<9wpSwuuVrUW؈|;,뇔{RsѲ;:8q)PCV:4.8Ȅ2񡂡?Up Vu9S c bփR.ՁNn U388A/ͬδz6߆өn1T\e7݀tXT)$̯̕6;eCʷˆ imw3SƀV7M \lGNػځNāa5tNzlߴS<H6*-N}o2ن N%է>w֣A}⇤\fXMݘ2, KԐ3g°[} 0e6M _1 ? 1ӣǾI^I|B̯dܪwLe1$: rW] 1S{z|diL g0\ U{[G{!{ ޔ`{&yE{xbie{Jr|/c5}~ ~:f#MKx+Ca|uI~.yW ώәߎ%¡唘[w!^T`^H*- 5GȨ瘎=Π4rv_ҍRGf,ދ̋|,ƕ{ Ҙtٕ^1Fő,;'\A*ىJ nyg؜(VN#q6\DՊB*|i˽?zzhzMџzEzrn8zY,{dBS| '|⃔*Z Ђ`>mۘ:Xc€A'4 uh¨h$nk)l]'Wf@&8[/Թ|zY9_N3kV41@49%wUh 3?Vkؔ.Uٓ|??R~%nVӎȩ5U.k~j9V"U"똬>Ð?%' Ȃ}ˡWml}ʗiRT>OlT$iƝaʚ=\},?iT- =$e0yYq,<-A_|?h@SG=ҩ$leLy)yywydGzPOsz:{ )|qʬί(h䁙~ڀvcc&OS#9tL߮=.v10b䞼 N8ՙ,K.Fpj癪7̥0uPhbQM88Ajʗ׋xAʜڨ†󤔗tuϔaMKMB=(7kua ,̘/1Hsʠ5`\Lk7M (_XĀ⫹}£rs@C`)6OLA;6}Ȕ@(Bat{C rȟH_֧Kť6#̕O&3"^ļ֢qrb_cKu6{ݤ < (ytյy:}Ѱy2ldygZ8dyF冷zj1{r{(B€}b kYdrFl1l;nˉՍވI|ϯkUYz4EƄ0ˀh|RjΌcX}-EYW0,\>շFiba{{4j$W]D?50>R*>6Ā;ٱџziWyZD}p/'g^ȶ6pDzi/W%ԞD9I/Ĝ' J״"ԯzWhy1VߣKC/1ŀٵ˰tzhVﭠCߟ8//)cyxr|xaixPqyS> sy)zjfY{ C7ċ恶q¹JaJm~P ~=_~)]f2ÀDÒG'q^`۳uOY=RZ)#JNO©k#_p鷼`k&O:%=j(Hڧ,O[pt` N֐&<èi(ץc^PbB7pM@s_ϱ ,N&q<Е(¤+8fը*p_oN<}:(nN&Q̺o_Nw }gu~_jx&thxQy7Qẙzi%u7{Z{=v|k|v՟wӾ xѦx Ryosz'kYuzیM1<} #}oha}?'O|}g3}f }É\}Y}|ȸזP|D|mg|˨N|3,}X S}(d}5<|0|nƕ|4~|8f|eNT|2|L |Qvww~~x }1xfyzM(zI28%{1 ։$|y<Ǽ|>ډcΒhU~|nWdQL\15 쇋Z⊩!_+7/0 zXcⅩFK&0D!D $~uI&%ڏ͆.yl bDŽ̋vJQ/nFY k솷&ڸWlΆN]xa„I.~ ҃ᆤh/jhwo`ӃX^H.Е QLr71Nu vf`ҟGHUXu-{8IF,mźg߄ދuނ_gfGǁ-pȑ=ͅtؠ/IzKhu5^ՂGJ,^&J5uYv vw6rw]xEry+Nz|},SP~˛S~~~Sr ~O\~mD΋o~*'C~,lWح46uxp[(/C񊁃)cM &oA(7ȍpofZ0C(e_׃GgϐNanً(AY@RBS( Ѓj<ŏJmQXm@A<'|;Ȇ<[9%_5,~4m,WƈA' U<ϻ6ʱ^ly0W(W@@&֚$`|źm[xR`k7NV@-&H;/ݲàztáHuNvz t9t|uOqEu^sJvJw5Wxk@kx0| |$p|spv4|p]ڜ9|J"|4}-И5}ls?䄅lfo1]Μ=*ڙʜ]1zlʫrզЮb*|Pܟ s>Ԧ*d0vsQysjٶCt+['tJu8vF$R+v Xw {.yzj `xbiAY3I?N7#ףV> J߻bSxPgi5YuߓHU7]ӑ#âk t€ޢ_x ڟdhY9>kH§79,# MbwյZhưkYeH^7 # { >w9hX#H97# `- a{n1rmŶs7_XsPst'@t/E!udukoMw${h@zmz_^kyPpIy@z /RzVG1z_ /|F"{rmÞ_G=PN @}:m/PGw}Iu!{pm}s_gP%ԅ@^/Jn{[emep^P‹@Oߊ/P܊߫Ћ0${9%mT^PՑ@O/aґ {ńumGꜳ^`GP f@[%]/yyK!;΄7z0m?[^,Pa@guY/Vx@jzĝ>m>᫓_ 8[P*̦3@פ/E1gȥFvpswKsxt̢*xu$yvqczwW{Ox;/|1y}!yt~hku~v|}we}ʈxK}p.y3}V[z}:z~ {T}1r̚td_u Fv ~wnxBU>xy8yĂyՂ iq8rsltюLuvmvT*w!7xxpu2q/r+sŖՄtl|viS#w 7wwq?lo pqˣrzwtkXu53R.vA6BvvKNn뷌p[q1r0z̓0!{ ){ͮwӹx*NxelxTyZy,4byqJz!K/z\r zˇ6wswwܳ5x'xx ay'Iyk.yN Bz-Uw>JwQ#_wwwwx$/a x{ITy'.}yAo y~p3qrrڌsvGu `\v5HwU-ńxR܆Oy`Fzꅻzs {u{Wu{_[| Gh|i,؃|/}u\1_rك,tT^QkFǂD+n9 ­Ǐ*1ɂ|q|sB6]5kEՁJ+,x~(Ta؂ uz)Qr-\5TEh*x }0@Wd8EqZ[QDD)D=DI7ˀNdK [p=DZC~")Q~B?θڬ&2`Nos~NY~C ~wp(~^~ܾxӾc$~5n~@IYE~ sB~0(y}^~&\Wo5p!rs.lˋtTWu@v&;w*$yXySCGyyz?k֊_zVf{$@ {%{ۈ}iI ]~׊Sij̉7UJ?6$΀,Mԋˋ>j}*iT·>>k $PYفKIŠ˔8o-|:7h1kS߆a=#ċ%ʁs Y{ygʆq[S1<#,!V5q zٟg՜{Rj"0Ճ'=r'@ zVfQPQƄ;Ο_"a?) Œn;y]eQD;d1!"ospA(~|݈C|BxGgtXUѕB{5.l ʓ@lןzwߕWfɗ/SU/B{@. 'F΀F(wD f9tTAA-ma8KΞNvҤeTQA-X9ub;k)v"xFeAS*A/:-}v 4n~W{oo]p/_yqKNrhSU7Ct214+}pO@bqSb&C%1#!}ip aƫɗRB1Ҡޔz~.Nx}joدPa=RB\p1Jf|yv}6GoЯ+Va]RdB1vɔŅ(rHlemX9nIӷo:up)S4q-p)t{rwtpeÿtX:tIu@:vu)v!uxr:{er{EX&zIֵ$z:{){8n{}.re&WjBIҀ:f)0!rvҊ e_WEIu:QsQ)GIUrQheJWNTIg":Al^)!'XPr0Pe?bW Icϓ:?)8`-!GrӠ`e=̞W՛Id:::ҙ)}yM:qv6eCPWC(Ikwk:E)Q)ЧʜERٵqlrn7touIq-vkrjwtRxu6zyvzyv׷oWwppxGIrAxKsy4ttyivzQPw4z5hx!{>xzmogp–rIs^htOuJ4lvwA"kJmo:pu~r1gWsvNt3uru0zjo;l@̩Tm֔?o^}Rp⏔f%r^Ms2tGtԆ&ik8#lϝan\Q|o*e qh?Lr1s? eshԻjgk+Im{od&p3Lq1:rZ sGhi˶ kSÐ^l֫z/njcWomKpqC0q grybιg`ia}ajںclM`ymmڮbohJpP0p q%Zyk}zdmKzn{hptyU{qb||sJ}t/}v 9dv7wv{>${* I|}9z Xz Əy|zhz1Tzy>z$zjR{݂\y yVy|yh9ySyA=z|$ y͘_{^؋iڜk~mpyofipQbr$; s!tNw$setU u2x?veqvQw;xx jx{j|ۚՇ{|ن} w}!dq4}FP)}u:Qr} U}~цZ>vScyO\yI98ƃoÏۘ"ubgbo֊dNkuJ82n2f{.י~~0\to3a0Mx8EERX 2ȃEvsš`ā7&M͕7ǀvQlWJ#&r&`VLS977ߛD-`3^|r<_|Kz6Xy iNԓ&k#yln̐nj\oIqt3֍rrz쓔rZsM't3mu[čXuHUEv3(ww~{Nb{}~!{mX{Z |G|_2~c|~||lZ+ |~5l YւXFΉӂ 10&,{^kY-F1YPƇXRQ?{7~j5X^ՏFEmԍ0ˇ)MIZ0zy͚iz^=W! DՇ[0^Wh̉إy܊Dh܈ɟWD@I/慽)aV{yVܫ9hNRVCՆ/8kH(؞ĥלLjsߚl4cėmR oI?씆p+Jqlq/}А@qcHrQsˑ{@*Y{q/{%Ϛ̂=nq-ya&P{7>*)ޏ
ґƗYp`O֑ =z)w>{UƓGxp<@` O33`=%j)"]Ƙ~ϙo_z`Nu<(όؒikU~"RCo^͜Nܚ<&O(k8KW=}Ôn^VM[Q;όƠ(!7h7vm\-=nknlpvZoRiʯ(p\WpMTq>p^r-:Isj㣧sF7uav |vi`w\Gw`Mw>(x--xxT^zXu~]h}~[w}M4}=Ǣ},Рj}Z}~uDhX.[τLm=rd,2kٞ;th(urZXL_yX=h,_hҝ#te=gZn#CL<ԟ,0;ڜYVjBt]םg-;Z2VKآ<억+뜓vƐSdt.~gZ.K]<{)+뛾њ|j2f]λ@hP㷖ipC#j4*k#>l!Hksi=n2]Ϻ9nPBoCEwpn4[.q1#sJqpx)iͼud]uPմuC&v4Qv|#vv&|"ir|k]af|P]{Bw{4-{#{g{hiz1]5#PVKB+4#0liN<]PDB 3#:槫i)]GP?Bl3񨛍#2E"Y߀i Y]PDYUBM3ǔ#^?YHh]#IPQ|B%3 n#"V PlmfDn0huojqcl{rndUtOp}LlurP1vs x1s\iqTXkrgmmswogtyquc>rvKasw0txU vtwɈg|`i|\k|_&m|}xoV|bp|JYro}/s+} !t|ǻePh Pj `kw*m̓`o/ITq.q vsdF4)f|Th~juln_nCH`oˆA.p+ rxRc!e?p8gUiS tkG^m!3Gn)-in hq öad@*fUhTksjR]l3FmT,m˒ pa< cĜSeLgri\kmF$l,Ol٘\ pj`b盲d%fNrhکs\]j¥>El7>+l mp_te`uglvqiwZkrxBm\Zy,oESzq+zs}s}Fr=osfq;Zturpuvsqvst[jwquDvx]v*8yw{[xp.zk>qrzrz?s{Bot{ZDu{Csv|2)XwN|?zy|l)n]ʨo31p샖rnxsOY'txBun(u.x1lя)'n2Ôo|PlpmFqXs4RAt-;'tDywdlxklmnM#Col0pِW)r@s'>rVgvރjl$mTInkGoV`q.V@>r8&qޒ#'wJ|i߮>kLl~vmϣjwo"aUpn7?q]&IpwYVib$jɴ#k}m/>inzUoţg?p %pw=p|dM}g}TiW|}kgh}meTD~VoS>~q$r&gtSzn3{'p{zqh{u{rg|:sSS|u=8},v#C}vxqxxyMyyyzKz&zfzzvRf{z*:FEeWqcbEa?b!PX>V e*5qE|czieYlDgx\dirLIkM:6 l%ّ8n ZduΤ[fˌWg/GR6Ґě.'K͒F؋RFn9ab]cU:eGi;gW8Mh'6j*inbmi?ajTFkG@m*87`nS'?1oq-n-simpa9qsTr7Fޢs7ퟹs'rt.sx0lx`xSS,xFjzx73yA&ݜyl2x0|cl(l`8PS+E&71~&p~~k_٣wS%DžE P6؛&o(ƀkd}_ҍRߟ猲E:6&;%Jۀk$_T&R3D_Y6@%a'j𤡝_VRD؛V63%j a|`U|bRIde`"m$gsinji]plFrEo,s&p v*q d%jѭKflhn,jorFlq`\nrEpItS+pu] mthukIaud vNf}vshwpjx\[lyDnpy+nz rz-w_K]aCdlȃfoiiZRkMCl)*Bl~vq~]U `ܕbie nRgbY5iBk9)krY?q[^pa-1cm-fX\Zyc]Vj_1bpl=dޕ1WjgAqh(`h|sYY\b|^_avknc眙Vf,@gɗ''f"Ds XԵ~[?^D~`!jcVe`~@Mf'neș_t̳7n_GpOb1qd~hrgwjt?iUulM?vnw&wZo2{ ql,i{mkoPmP}kpnir pUsxr2>ts%Wutxyruɰ1isk~tߎ{m u{nvhzp0w`Sqx.=rx$ry&yzFg~&if~-k!~.zl~)g8ni~0Ro~;=q~<#p~[zS~+eGgliiy.k flхQnlgonp,\qEUIrL64rcqˈKmkUܐHH;ʂ9V)07vdh'mO'aՊUTEG9vv(ϋQu߀mB a5UyGiӏ8t(pnjрla_}TԘ_G 8r(9ŕ'Ɏ0'ebW[Z^M#`e@[b1dh e emdc'YdMmf@l{hV1Ҝi j Oird+juY kMl?n1o Кo }lo{wcqXkrzLhs?y0z' M-z1 z*b,VWqaKuH>|0UN % b&-WyK$>(܆f/2mD t ΀a՜^+V̚JJӘ=ؕ/Dv~ %z!a˖V$Jŗl=(/Jg[ 숟Y#ZdNR\Bd^5`',b#abhEcZqXpga}McB#jd5.f:':g`gpҦhQvXhhMJ iAЩj588k'l sl|9mxgzWo:Lߪ&oAWp4Uqm&ߣq Nq\rA~WRvLvAv4w3&wm ]w)Ÿx>V}#LP*}J@դ}N4^7}?&t}3}~^V-L)@u4Al&t4G->!zVҋCL2@g42&]!6MVb4~L z"@U4.#&g/&jp&aSYc]6f/`7hqcLkjfFW(li%A*nbk'nmtnų*]daq`fc6h~Kekjh m(Vj@o.@5kq'lr^cu5sANZo]pJM`q|c&rinet TguC?>ivV&Qiew ux"tWy[y܍^ z9{Y`zhc{Se{k>Ng{%f{v$|UxFX΃u[y^łyfaRd=veʁX$dvmRSvfVZx] je_(Qbp pE [pqL.~sǤbmdo7fpxshqa8js&Mlti8mu|m.u~-xe4_wbPx0dxr_fyQ_hyLjzc7kzjz~T|f]}``]-b|&pd^fဤKhԀw6jKkht~uԠc[{+^B `oc ]e@Jg56ChXf~_Yt2\̀_>oa$]coJe܌5fe3~Xas[Y^ [nJ`l\ZbaIhdi57e7:d6~Wة6Z ~]#m_{N[aĜXHcš4dc x~ɀ|6pXq\`}gr_ltbZuDedGvgh2whj`^wkZrmbne|1pAgikqiYrkFtm28to`tovȘjl ?l@m{moUjo&pXpr(Fqst1rt|cr&tzhuiv~ykgwFi:lwWnlxEoyA0pyoy~qeggyl*zGn@{mzsj~t lyp{tn`uoP2vq>w]r]* wsE=yr}ps}kqto)ru_svOOtzwK=guOw)uxivwnk||Po}n p}W^q}zN]r}h-jKO0j,lksjgg>i[ kfM#l=xnd-o}oNq6rp?ofqYr8LJs>=4pt#,mt6t] vq}BwexYy"K]yh[img"ndgQf7\@gPPiCk=4l#mn^l^sf~qm[^nObp*Beq<3슀r #or7rxe}uLZvNvA.wP3fw#w SwN|d|Y0}KNg}{A }2އ}"ن} }dZYRwMh /@vT2Z"X3!GcއEY M/$@?,;2/g"6僠c|X!|L˅MS?O1sn"*ۂ] \URBYXF[E9]+}_I`JamI\]QY_UF7ay9cr+Qe Peߘer1[_dCPeEg9i&*jV&jjwZ@kZP8lDѕm8jan*joݔ3o.p#{eZ LrOs[D0t7ƒ|t*u-u!1*u.YsyO}zCC.z7Qz)zq-z;{XkN>;CL#6폗). PX\`N/:;B66(܍~sG+X7N rBÏ6o(WrT PaTMFbV;M Y=.[i \]`|q.Oƨ[*EĦ]7:_2.` [mb+ǥbleuO=SaE-c:Ae.~fy gVѢg iz<NǤ hDYi9k-IllƠ?l(wo+}NK oqD+kpN93q-+Lqqq5u Mנjv`Cʞv8(wU,뛞wXw؛w^qzTMs}UC}8},7}&]}љ} ~M$YCJsq82, w{{L)C(8dЋ,ٗDݏgZS]W|`[5wPc,^debCPhe;ih#%ipjygl˧V^ Y`\cv _fxcbiOe"k:fm"eeolyqgRhGVUjsYlLt\nb2_oNb^q9ds!btyvbOSrݔzS sڄ| X_|VEb(|1c|cD|dQGg{Q*gh{4jz{oY|\jn^_eaFO'cgd=e ;*Me$,h;WO{Z}m]^_Ndax"W`ixGkZyT6lxy#ml9z qze~bYr7d9dfVpgFiT6j_"i p}`(&q^bZddL4Uf F=g5ph"g nτC} ^p`ԏcdbЎU dkEfP4g ".e؋ m<|]Wp2_ baJTcdaE)d4xe!dbQ knd xyRmzbV` {YQ{])BG|h`0}Ab~ld#dy wv`[Hkw(^/_w`PxcAy}e0tzGg{h~)i|v}s cjte]u gOui@vk/w}m5wm{nuDpkisq:m}\rOnOsEp`?t.q/!trtryt(tmWt7hKnu:[ovNpv?jo}.pR}o}x<~r:i3fjZl Lxm%"=n-nnumx8qgFfiCYxjKk=(l,l߉+kx:qfqehXip"KejŒ\]2D^$g`Oؔ`ԑ biqRˑ ^?Hܐy`g> bm1؏d9#䏯eeggvRBe@Hf=(Kh1/i#TjJjl{<Q9lUGDimߡ;Md|Qg"lUAi{[ XkH[m4\o]Jq$}KtEERހC2SXW)} :qJ@wEhIW;ME\P{2.Q5!gUʆ}08?e=vvBgnG5VKDNԌ1O1T|436;vqABgF KVlJ?cDMY1M^PSϏ|8ZMC]aR v[_V9f}bZ/Ud]C=ga/Oh@diufTmґyUWXZu-[^Je^avTa1dxBcjgJ.d]iNf`jrPaITmcsWfPdZhSV]jAc_m-`ncowbLjGPslqTnVbWRoR)ZYqx@j\r-] t8ats{vHt~Lu{pPvca`T,wW~+V ^dXB[|~G nKDm_OOR~C>XTԄ+TLU]?{DʏmI0J_M&OP=R܊+-RG*]뉛>{C mVG^KNO E=QE*P^i@aN zdRlf&V]h9YMVj.];k`'lcpdhq'\WyH_Zwkca]\{dQ`LYfrc:h)fu'BhhCnhvhnXb`Fw[[bj-^ec[\`gKibj: dl &dmkmzT0iivWykBhZtm Z]0nJ?_pJ9aUq%`r ixr~#2PkrtSsgAW)tXZuI\\v8L^Kwq%g]x ~i1x:M!{sP|f6TG|oWWV|H{Y|7[}C$Z} Ri|~ ~JMrNYa.Yy@[tӄypqsMerQXxsUUJuX;v-\ *wC^x0`~bZxolUcnjYW_o\.Iq6_!; rja*RsZdCt d~g!|mh]bRjx`V6l#cHmei:&ng)oi7p}i~l*l5df`fhThiGj6k9FkmM(ln]mnn~eqja#nF_cfoSedpFgr8hns"(mhsjs~.wi^v^`vwPRbwEd\x7ey'eyxhyg~0{h[K~]]~R` E6a 7c+'Gb/qff$~h%Y]D[Qy^ D_ㅉ6a)&`a&eTD0}gW-\Z3P\^6D"^2"6 _?j&g^ad8~5dz MZYzPN{TA|dW2t}LZ!~] ̀]xe{cEuTXvXLw[@*x]1y`S!zgb |b=jH~aq\W]r_Kta?/uc0ue vxg |yAgoV`md2VoQf4Jph>7qi0r~kYrl? 0vXl t_j\kUlm_Imin=,no/xoOpKoq sqny^vgFsTitHjutX\L`NOCS>7 Va(YVZ\q[i5~WxNS|MVBy`Yq6,\(^I3_C`nmVH{ZZLT|]@A{|_5>}_a'S~ck~d/eVs$U+waK1xc@VyUe4Xyg&zhzi/s}jox Tt9iGJ)uRj?Uv/l63bvml%w7nXGwn^Z{io|rS&q,pICroq>sdr2tsg%7t=stsbyCuRQnwx Hsox=py1qyk$qyr&yxJ{sQl'tGm=Xn1o$eoRBp:\x'Q%j?GolM|np3}6oh(q}}p"}pl ~pvUFy1t]=z-u3\zu'{vrzv |6vl{GFOv{lAUx5:W+>Z:[\Ґ^.i#yt=o}[4P]*_gd`a*c:nV}X<b3tid&)Det"fKfght;ˇi]2j(kkBk?kn0y;;)p)1p'wqyq熮qtS}:|w 1]w|'vew.wIwnz+: ~'0~O' ~1~\~.~mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{OX͙~ʹ~y~eL~j~Qc=9~|4~cl@~]̳~nf~C~لOiZ/gP8v}6q}0}>ϲ:}i^},~"hN~uO 7A胬|.A|33|M|WE|ߓ}OgV}ьN~|M6g\7{cߥ{fǪ{ `{ɞi|+~|fn}CAN.}{5~zʸU/zDzCz{,a{}|$Ye|ȕM}5[~_wzRêzF2 z] z;{|{d|`L}5P4~=cyy@yz:z$| {[@dH|Lo|4}uyZy2yƔyj;zdj{w{ @c{̡L |34=}S~6׆}}p}UR*}u{}că~5Lx~5(=}p@kcyԃ-bKÂ4؂zGetMڽos ČX9wxʂʈaiJ͂&L43oۅO_tz莴r wA`ցNjdJh3\lԟ[7—vx`9Iue3${K͂:X2-{6 uȀ_JH䀯:2ՃsV/&ĤuU^THiS2`rփȥ$ƁWSJЀatk.\^)H;20T7Yn#s]ƞGЕV1||c|:;h|G|rʼni} ]}G{~2Q9*ǔR<6W[䂶q҈=\+3F遢1˄ڣ9Wr݌>WpxpЇh[HwFF1T4B،lkȉR9oهZ؊&Eo0샠ᤔÇ [ޘ:OnkY΅J4D=[05 ֵK\wʤĘRL~nY+ΒDsЌ0EڇDէи\Qڗݧ*mwzXbDsl0VŒj¦ψԖч{Ά=[l)X6NC'/тNA̩ՊMĠ'-7lgWԃٜmCx/O{Y{Q{F '{s~{ju|wV"}9B~P/BB̝ҹ<Ւ4 $~ӁiڍcUƋY1A7.zB!DE.Z.7} }iцJUAtp .!c˒ɒW|-Qh )TX@ۆ.e^fDi{ 3gQSm@]a..4ت`"סp 91zL fS6t@0-؆d VבAȣyf cRƈ?熏 -؄.eNĠ!|iDxFeDRk6?A -LŅq͒rƋwx{(e R?p-@ zɠz|zzur{Vb| P*[|=~ ,j;ӽp|Μsn%tŕb ǀO=n5,IY6ܟn웅φAusPaRPNل[= ,,ĻݔОD[ٚ̏~sd`TNf4<,è靎e!4ڔ&rٹޔVj)0Jp ^*L ;+Ņ􈉰(z&z ~z}HzjlJ!z[{J |9j})Ћį\RfԨف|PZk2"Z}Iʀ69!K)k9wkR{|GsGk]HYEsI 8䎛)ςϝ.4js2{{5j\pYTH`8n)GɬjԋIz,iX͕HTŊV8q*фDb7ɥR zi#fXVQH0k8Z* nԫ^D-yhTWGŐM8>*håڊʨly1hTW|Gj8*5%*؇TLdWɴ艴ux՜MAhF WxKGn/38*yǓyqb -RƇC`q:5ل(!ރ,ǘiq[LOa3R#C'Ή@4C(HaB%7y֙paDQ՚~UB84폿(in.֮z@ILp5`%QB֔4Ff(/\ ̀Ҥp^`žQqBT4(YϞM g<4˨s0p(Wd`PQ[HB 4ꎶ( Qy2yPxybiy[gzhL죡{O>|b1}%to<&؆ѻxE\i[~L,>1%܍2k3w+;iM"AZLb>-1@K&68P.TwOh~_t1S&HNBHƸyw3hzZ%XeK'T>k<1˒3&Nj„B]{vᖛhfғYK֟}>_ 1ݒU&RN:hvıQh?AKYإ/KĞ>X-1܉e',ƓM v͡Fh,YɤRK>UD1q'QZtvQh'9Y̤,KǞW>n20'onщ$yp{6y(nfhy/`췎ySxzND~}46~}y-z4*z{;24{Ё||vBd}.MU~6:hxYjxyxҪ^zzɈ}{d{c|_L}}[5L~?w31֮wȗxhبyyTzAzb{K|G4~ ivGUvޢrwާwxAMyy(zrb {K|,o4$}uoӿv'vͦצ7wϏ/xnxyia9z|J_{m3}u{ҝuv7$v=w䣍wQxs`z I{K33M|ˆhtqѰu'u¸{7v+`wqvx_yI^z2|t'tUAtɛLujnv$wux+_jy[Hz2|6♄x͍xxx8yd \z uz_{IU|3|~uႎ\?(e+kt 9^sHu2ZIQAAًnŀM>.s)]5GdX2Vݿ(%ǔ|B\PtKnr\1\Gņt1݀4DBAdz~{~ҝ~JA~q~[~ F{9m1t0~t~1c}X}Ӟņ=}ߚHp~ [9~V6E~Œ;1Q~2l}~\}^ǚ}C!^}Zo}Z}E~\0~ }Ė}:||ͭM|禛o9}-Z}E!~+0~f}J|'|5D|o;|Xn|դ`Y};D}ȓ=0c~tvٿ|wW-wݗ_x|yCmцz4Y{FD{|0Z~kud5<іZelgX@{C̄,/n*&T5ɇʕ4ЅkWm,C+w/ԁΉB7Ώˍvj3V|Bۅ/9K]́ih"4Ɇ~d1jUދBPy.ӄ[iLz6W b}yiGU]TA؋.l f3D^'DŽΧɃڢ|hsTفݓ=AWr~.'ʠǼcՐj{wh 2TiA .VΈ uͷ6,ׁEخ|lKe}v̊ c)bP‡>P,ńK'&t1uegFU7}EqЄ6L(z򂅤j?tqdȖJJTȊ;E%6(d(pcc`OޗCtN<9d<7TJ8DԎ'6ه(ϣ奖ԜVsϘcƕ"S푟 D5g(Nz]s]F+c_gSAD`5ۊ n([B?Hjr>c eSWD3_5ĉό(ٙltiNw@2Ǐ&z)"{ɪ{.ZblYLJ]b?N@GԄ2҃&GΓ\rys᥎qup[wF\x됔1zf۳n#o²apݻr;su~p`u [vwEx1Qza rÚs9(tN@uhdvpbw[3yNF>z1~|գ}f|r}|h}|}|~|oi~m}OZQ~}Ef]~71!~#{|(|`R|(e}kn\}pYq}D~p0uҞztDzi`{5n{.|mU|%X}%fD}焋0/~܂g.yƽyͩz9ݕz{-l[{tW|sC}L/~Ux٦y0ymByؚZzd}kw{W-{َC|ȊI/}ax5Lxz}xǦy4'y˜jzV{VmB|W/W}9whxxGx~ayKjzmVzBR{)/&}0ͯwj^\w_w趔xEZ}x$iyUz^- dƵ*% -6 v2~ٟxcG~̙P~Ҕ>p,Qtո1~_u~ob~iP[~}>2~,չwpFqLrІtsъiunaZvOx=Pz+|~Dy,yzC7zrJ{6`{Nl|[OLR;a^+ s6Z IMȈ 9-ەo`]L$;و4+ mvUjF|n)j] )FK2:؂fh*|HwT̡n\gK]Ғ :^*Rb!8†­)lmNj\a0K :kĎ *ځZo#+q NrQ{ҒsjCuYߎvIxf8dzs)|쪓xqx狏yX{eyj:/zYA{KH|,8H}B)5~×C,؀^z:Oir)X H7)'Ֆ+ňzey[HOh6YW*kG}7) ߁+KА]qxtfgOW`YG5X7]) Uܧ*rߗ1 וpwg) t%lǎۢv}Tf UF/Ґ 7) /ʥ#ޖ<׮ֆIjuNeD'UbsE놁6ۄ) wͣ o[pqq™ssJb4StR#vpCJx>4hqz_&|6w'xp}xq<`y'aByRzB{4A}&ˈ~Ďjiǚ`"pLa:~Q$BF4&H⟲ƍ~~[oՖI`sHQ CXB>&3'T"Ϗᛞ~,Hos_ߒkPxxAi3L9'*BD}ƒn~T_WPHhA3ɈH'@y̚Vn}2)m^ݑO.)A|,39#'S3~DZi|şPm^sO’AAŎG3ԉ'b@8Įڊ<|9n@m$H^FOJaAq3!'nߐo~pBvqhrYڜtKWv9=ʓx0ezN$|ېvڃlwCuʣwgɟxxYqyPKWDzR={r0j|$Љ~hy~yr~)uUk}gMl}Y`~KA~Z=m~03%ӏ`P^t_fĝadXeJTM=;0q%Q6vX¤yt?f1X7qJY%=Y0%=ÔGɒsːKe͎WЗ͋J‰<쏦0rl%!:-$0s>1+e[22W|5:Iݓ-<<׏30%҆צǟseW7.I_<0|%cōrjrrY?dΚ=V7IqD7<:01&WFnxaokƬq&^rQt1Eu8 w,8z="'|҄nvxJvxkw^ͦwQСxDky8{-%'|#0~SLM};w}|kh|^|Q}/DЛU}8~&-N3~#xX(.w\Mj~^-QJDVM8-o[#͉热0wChjF]̣QDvt8 -$YuvjSʍ]ԋP˝ˊDS@8do-$Rz嘞vj+P]N/P*D6 h8-i/$ ްivi릧|] PnDF8zB-ό$Yv;i5i]PX D 8ό-⌛$͇my0nem}oaεJpV r=JG\s>u3ʜw)z1 |yiuomua3vQV"GwJ_x'>ۡyg4z*|q!~>y>|m{aֲ{V {JU|R>j|4(}*U~" ym\aɁU׀JRX4EY*π~"y߀xm?saaUɅQJ-k>Y4`ɂ*ґH"֊8xƻ&Dm-gat؋UJ"ňG>y4zK+R##xlm$apU%2J >ʉ4Nq+2Q#b:]x am"]jasPU6Jn4>;?4ɉY+VB#݃x{&m'ꝑa|UJ$/?4Y+m臉#yڥqm*ƦsQnIJ+tpW uq釴w0sr&xuB\ywGm{y#2}{ضoxqkxrytOyuz4q"w=z[x{Fz|2%|}n[oQDqT{rށ5WtopvZwр=Ey1{4lnE ocqք sCunu Zv鄶EZx81D{QzӢkG}mŬ nprr;mt!Y?vDxJX0z2XjIlvmɛȖTo#q_lsVXuoGD?wJ0z;PikI mXMnşpl-r2WtڑCCw60[yφ"Јhjwlhqn'p kxr+-WUtdCovΎ{0'yuSh|jSHkēm8ojqVsgCvv/y,Szl$zm{(o,{qT"|Ls j|tV}vB~y/{`x/v}xw0Rx?z>-| 'qro(ksKLt?xufFdvRx11?y؍*-{®q*r ٝrܰsƪ'wotd]vL!QwΖS?=y$-{n`{kR݂m?o ^pvrcȁxtQrv>x,{Iuɀvc_vڈKFwu;xbDyP[]z>|,y}&~٪~ƙX~~6~~t~~b ~OZ~=,FII}t6}}}s}ᄯa0~%N~{=~,||9|`|{r|䊜`^}ENb}<~O+v{{ꕦ{'{ГOq|s_|M} <]}c+~жzؤzz͂{q{n_{1Me|x<}@+~- zK8fzZzdDCzfpSzᛂ^p{kL| `;|ۋ+}׆yWy*zy}zozk]zL{F;|+}ׯf;jNlYn~pGn)r#\)t#KWQvI:@x){sjt]u~vmOw[y JAzJ9ك{)}m |H}#[%}>}V}blo}[,}J-D~;9~)ւR (`)ᄡ|kqDZۂIX 95i)Ɓc,/͌ {qjzYUI#8J)v9?^zCi聱XY">H=8o)_ǚv͊{Hyi9X"HYT8o8)0w%dۂԁáyH hX .(G鏆8AҊ)ۅeăd<}E`UxhbWG48C))jNl?--nuvoeqUm sELv6 x'v{5s>teu t:vdꋍw?TډxE=y5dž{~'}Yl){I`{Ń{t|Ed(d|T<}DD}5~<'@~zۃHrtns$҂jcdPS؁DC_45Y'rX\#_r@ψbP6SC䅑5,CC'ȝ͍ڔ.Ӏڊqb\R0*C4'z)/[-rpވYbapLR+C͉1(%ۄyHgАvY4hPZckLA'>Ԇ1%3c0 v?th:YَK⊋=>g8o1&ƃ'惆uʑ4|gYRJK>)ċ1y"&$lO]Ψ?/^ugѠKgFEY*IKD=c-1c@&4%􈀦li|Qkom]bvIoGUqPG)s:fu.;x#!{Wql{rsoGsb#tTvG_w:Cy>.Oo{#y}1 x{kyEn̝Dyaz2TWfzG{:`8|.\z}#Ƈ~ĀJz͟ln a SMFƑ:7G.e$zf P[AE;Z1ٓ0U)Fj"0΂op~7f ![BPY_EE;T\1撠C)k"djpmfr=[M,1P\ǑES;`Ћ1')}"Ρmfni=pkqr^mtolVurX wtDyw'0|Yz>̾jqźjlr`ntpu0rnvgkbtgwWIv~yCtxz0b{x|bh|~j|l|^n|~pp|j\s}AVtu[}Bw}0z~l;fׇ i 9kDmh5})oviNqꂿUtXBEv=/yVǧeP{qgi卞|l{nohLp(TsuSAv@Z/ryX_dִ2f}}hƖMk/zmtLgdojT3rxAKuI/8xσ[c&5e[}gܞrQj.xylfoDSr d@u/x\ębp vdܫg%iwy3kyenbSq@to.wUad`RfWh-xkkemn)Rq\@?t@.wZtf4uhvjxxm0xyosekz.qR|{itP?|w-~zK'rp{sqԜu#svFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv|cwy|Qy }>z}-R|~H(oYpq݃^s=uPt;bvSPPx <>Ay-|0m{opzrt?s^auQOw+T=y>,{¹luSmoou{psGrlatqOvk?=txj,{ @k mܖnlprxqؔM`WsNuȌ=&x,zj׫4lgmomqq0_s*9N uI_|2so|u]}@vLO}xT;"~z-*|Ly(x*yyr z$yzz~n{D{]{{K||r:}}?* ~%FwzKxx~yDQmz\'z݀K{Ҁw:^|0*~Tۮvvfw`\}xlx[^yᅜJzV:|<*}ktufvV|wkwZyRJz79{*}1Ь&tt̛ku}l{vDEjw7ZxUIy|9{*u|sh$ t$tӟ{2ujYvVYwɓI7y9Kz*h|ersMtTzuuiv>YwKHx9 zL*^|쥋|e;gȈDj,xl{hQnW3qWGrs7rv(jz\nSoqtwƂ\rg~tW v4Fw7#y(k|>wEhpx #xvyofz/VZ{Fh{6ۀ|(k~#H߀ SuezUF6(k^~ˆK~/Y~sIt~]Jd~dMU ~XE}~σY6_5G(k}\}1q}uvs}jd9}~Tv}E~6(~(k8e|ٚR|˜ |vs>|c|S} D}k 5~ (k~ǃJ|4ȑ|$|Cr{c|$Ss|Dj|5}(k~k{{ {4{r{yb{_S|D|5}By(k~!E1d鋩gl}݋hio:Al(`nPއq As3rv%zajmy!o}pnrE_zsPYuAw3Fy&!|0u߉v|1twmkx_^ÆkyFO˅zzDA6{U3|&>}ݖ"#~~G{& ~_lن~q^.~OJ[~@惑~2%&XIf5ˆWȅzG҅+ln]| NۃV@P2&nȔkɎcэZyދkIV\σ)NZ|)@Gꅎ2y&Dž xzj3 \7qMЋ@C2& G_2yxhj~[Ԓ!MnF?ƋJ2x&K:Ʉw i[SOdM#ǒ?Y2m-&(dg sYieߐkXnWJpc{"r}~zsIzgh{L[p{O|4B+|7;S}o,Ox~0"Յ~~vrf=BZܒNـB*7ij,\P#;}}~r4fxO"ZhNMBe@(78,iA#FaN}qǖ*lf Zۋ M2HB-7߅,yY#p9|qeےNYƐ*M}"A튘6؈U,ۅ#||(qW,esY!MANJje6Ç,}#5tPcjOf=_`rhTkHm=op2s(Hv "zbtu5k#jl_-$nnSjpDHrB=tytn2ݑOv)yL |triIs ^ٟtSuSHt#v=_.x02y)B{! }~st(o.w]^`cCcHlVf+;t)i0aldOȯ>tsw[-wnw\-_AMb0ke#SsShA!a7kO|o>#r -v0[Dn^aaShdL%rg{`j哟On-=rfv-vm3Zp]­ `܄cr f؝C` jRNnb=q-vBw~o`^q&ccrfBti quk_wInN1yq<{u8,-}pymjynlpptnRrp/qsr_;utMwv2u6x)Gz_юzb〾eqhbmk~Rր$nCq4u7&y7}Gh}kj}lp}oa~8qR7~sTC#*u4xA' {*{&q{{r~{t&o|2ug`|vQ}AxB}y4N~{.'|y6z?wyz}z!{Loz{`{?|9Q{|BZ|}R4%}}',~w݊|x%|xnnyH _JzP]zLA{3}'9~u)vNovꊍ{wqm9x+2^xOyA{^3|f'C}䁀uA؈u5zvElw>&]xOXy,ABz\3{Ѕ+'L}lltq5u#zUuŖkv{]cwhNx@yҊv3{U'S} sڤtyu01kvu:\vҕ8Nx*@y\3Wz'Y|u_wbviehͅhoZRkXLEni>[Wq0u<$yB˅h.j@ul^h,n{YpKуXr>ul0Ђx $ւ{!pQVqtՂs!g"yK펭gXwOiknjk_EmRekp'E$r9u&-Jw"ք{1ov勋pkTr ^!sQuE"v8腦x-Pz#|`vvwj/xV]y'QTzDąz8{-S}#U~Aq~0uQh~ri\~]BR~PM~Dzk~8"-Z\# ވ9tCLh?\8 PyBXDKh8-]r#LFt5^ hwZ\?O@OgC邡N8Z-ZqW#Ӂ ~؆'sh[ԃ4OC8 ^^-Y#~se"g[uOOCWq8-Sf$QUx3f_)m2bb!dW:gKoj?ln4}q})鉪u= hyPwfmFhbNjVmm͉/}4/U4+d *u"5wtjCԉ _w TYI=6>gg4+* "cjt<ѐlj)(_?JtTO}I o>-4* "(5sIi^SىHӇ؍"> %3*R"ӂmBo^cxaYZdcNgbDLj9ѓAm/qi&όKuByTlec4gYPj#NDlD6 o 9ؑq0[t'w{l1:lbnXoN^qCsp9ŐOu01 w'az|k|s0bt9XuLM"vwCw9y#09z'|A W}k8yalzJWzM{PCv{9~|09}j'~E "jʚրKa=LRWX:M@C69h0<'އ p0jm醤`f,WtMɄB9F0G!n'k!%j'*`V֓iLƑ Bǎ-^9]07(݃+!R|i`"IV˓Y;L`Bōu9*s0Pg(6oZ!v%pb^Y}s`P7cFѠf=ij48m+wqM#uETyUbdY/"fPgi0F\k=q nb4_qK+tZ$hhw-zak$XԥtlOšnxFpj=]wr4mt,1w@$Ō,y|sapqVX}rsOisFS#u =;v4mx=,W_z%{ }a#wxX8Ax!O)xFy=%z~4l}{,vG|%Q#}K~`ݤ]}X }Oq}E~= ~J4ui~,Q%Rυ`fzWANuEO<4u,~E% `v*W؟ON囨xE֗ĆJ<̅/4hׄ*,ۃ>%W D`YWӞNEӗp?|sk2}v%z0xtkumwvoiVw(qh[3xVsCLyu7?){#wI1|y%~|Eqtrruutvh{uUwZyvxLrxy{1{|U& }}Ǝo|q}Strh}gts}YuH~Kw~M>ox~1z~&%}=T"n!Hot pyfruXt4KSu> w1z:^&9|Zl΍|)nTrsVo͋!eqZXis(Ju=w-$1ky&J|$k•vmWrnڑempr/WrFJntYl=v1Wy{&X{Tj&lrAndogWq"J$s=[v1/x&c{imZ{8]o\2a\b~DdU/^h G΁k:o~.2s#lxA~bz~einh aAjTmcGfp=:Js@.|v#z.|`jy|lm}n`}\pS}rF~Qt:^~v.pyU#〽{z.rxztl{uM`.{v~SK|4wFt|y :}zn.g~{$}xDzwx{Ykyu{_Uz|ERz|F{};9|}.c}~f$<*vvwqkxS^xɁR&yEzF9{À.P}$_~XauzNv&vAjWv^wjQx@3P5i+U"Mv~h"la~sa~[VP~<"K~AG?~oy5L~+Z3"ǁ v)}rk}a}zU}bJ}tW?}5~,+_~"Zu|k|ד/`|ʑU|J`|ˌ?[}5}U+W~;#pu^Zf]p\ms`Qd6Fzg;ϊk1zMox'هsqxZo4a`fd [䍉fQL$iFtl};9o1r(pve >z#nheUj[LlPĊQnFq;|s1gv(B;x j1{n;odqZrP7t Eou;:Jwd1o-y9(b+{5 H}@m,vpc=w^Y6xAOy EI z:{1\|0(}=}_!~l䈺}McY}Yh}O-~D~U:~1\~(nZ!@lZbԆƒX׃YNڂDX:1nF(!qQkubXNUDu:I1K(Á*!kᐿbI9XmSNMHDA[:m1F(р!-eޛ1Y\\S`AI픟c@"gh6fkL-Wo_%Wsxbe"G`}\k?c)S.eIh?Xk6jo+-Wr%[vJzd'g,[ԕ?iLR3kI=m?pJ6VDr-u%x{dm[8KoPRYpH͏=r?d t62v-x%܆zc}csWt3ZuIQv`HXwz?$x6z-{d&|~[bzZ=K{:Q7u{Hw|+>p|5r}T-~&(~8rbY5PgGm>v~5؇n-n&Hi 7_b*φYSPG}>n5Ճ=- &h} f6$aYoP㊄Gf݈>r85Ɔ-̄lq& ځ[\XSP\1J垦_BHic&9f1',k )_koL"^s^xhZڢ_pRԟbJ}dBh9 kG1=|n)r`"ϋGv:>zZkeR^gJ!j8Al9^dom1ArM)׍ZuK#-xw†{Z kQmI1o[ApqR91sq1&ـX/zP[Hޔ8@ő=e8Ў1108*_K_$J[cXoP͖)aHɓ~S@8֍z1E*t$c,4i\U+2_Y&c]}Lf0`litd[lhK;pm(;tq,xv媋X_a\ob`3_eW|'cWhLkfkIZjnaJnq:s4u4+wy>UgiY>k\m~z`ojxdqYhsIm7v :@qx+w{vR=ssKVct&Zduy^lviSbwYgy I:kz]9p{+v7}BOw}BS}nX"}x4\d}h[`}XIe~>Hj~9o~+unM Q†=V8w=Zg}_]WdQEH8i9To +t"K)sOׅT*vzY@uf^WcCGhV9"nt+tiIN$!SMuXfD]7VbeGg8m+t+Hp7M{RK\upW!e\;8VXaGDgb8mr+scU5fiY:Ih]'ukxaeqn,dUqhF/t(m77+wq)[{Xw +`0^呣caEeetc0QgCnll05q)|v#bQ1MU"|YnM]Џ_b,,Qf֊Ckp5p)vMUPjT|Xsm\*_OaZPf!Bk)O5zp)uR[k5UVmYV{'n]=mpa^gsdOuLiASwmI3vzq&}w+g^jbiazl dlnLg]pjOsIn@vqk3Fy/u'&|yQdagx fixialkknB\npNuqpr@tut3#wx<'{{Satpad@qwfsWiit[lv5Mow@ s4yb2v{1'*z}.^y.[ayvfdzhg{%[j{Mng|l?r }&2u}'>z~ގ\ƁR_uwc h f1gZYi"Lm+?Rq2u)'Oyk]Zi{^MtagWdԇmYh]IL!l()?p* 2t}']x聫Y\t`L/fc'Y3g`!KkU>o}2ts'ix}ƌX|Y[7s_YvfJbҒXfKdj>n2Ks'rx'rU~LsYqqu)]Odva#WFx eIyiOr7)t.̂wY&y߂=|eǀq,\rS€t JWuz@߀w7sx.zN&Ł | *l}e~w\M5xS3OyIXzf@{j{77R|.}&E~ i dv}d~}[}~R~~Im~!@$~P07(~_.~' +c|([j|Rq|*I>}{@}U7}[.~='~k c{*[{ʊOR|#H|Q?|U6}.}'$~x W^㓈TVXN \fE%`a<~d3h*ˊm#Mr&w^[U^MwvbDep;ȋyi 3 l*dp#u yU]XgbUEddL=gD:jb;}md2.p+s#wl&z\hT jLClCȈo6;+q2̆t.+zv$0{y|e\ oT&pKErECKAs:5u28w+$Fy$aw{}[u uaS{~v|KGwBx:y2z+17|@$}+~Z{S |'Js|B|:n}w2~+GM~$<gZFpRJhTB\:4݀2P7+?$ہ2 Z3HHR'Jy B_τ:b2ZM+|߂$/TܜT#MZWE [>_6&d.`5h'Emm| r҈~wToRaX1R^DteA6lC*sJ>9Dz|JoP`V+R]LD,d}b6k^*rރK(f9k'y7oԃ-}t$ysyTJnXc]EXa@`MUeBj]7`o7-ct@>$ywlsQltWU+buYdVwU]KBxb?zf4|k*W~p!dvuoXkp\La.r_VtscJvbgC?Vx~k04zoO*l}Ds!xtkq`jmcj`4ofVUAqiKJtlX>vo4Oy!r*u{v" ~z{sLhh9igjju_llT|odnIlqqS>{ts4!wve*zy8"M}|/re)ohRgqs^ jsSmBtHpv)>*s2w4vfy*y{"} }q!bwvgexa]phy7RkpzH^nz=q{3uK|*x}"|`pS`k~fc\f5Rei@Gm1W=yp3tW*x("{р8o^f4a\AeAQh3Gxl=!oɂ3sY*w"{]2o9]$e`[deQgG.k%`[nb 5f,Mk$bCq5ՄvaCjWY[OPGJ^G6b=f4Ձ{j,[o8$sRqx`C|^X |aO}dF~.g=~kC4n,Z\rv$OvaIz[_Tye^W"zgN{j_E{l=|o4T}r,N~u% xI{^pvOlVNwnMxoEFyq<{t4|Nv6,B}x%0zkn}G]srUult!MGvunDx!vb.8XfH0j(fo "5sxV]IO;`uGc?vg7(j/nX(Ճr6"vFgzLUҁcNvfSF܂7i?#4k7P(n/,q(?u%"rxЂ{U)j Ml&F9nL>1p7 ar/u_(w"`z)}T_|p[M}qE~sz>-~|u6~v/Mx(z#t|ts~;SzvyL{wEB|{xt=} yn6{}z/k~2{)~|#D~!{3SAx|YLz/|D{&}-={}6@|}/:}R~x)~#o~RwqKxDz=qzX6U{/h||)'}c#~~NؓOHJSAqX:=\2av+#f%AzkqovM̐UGRY}@]_9}?aq2le+jO%lo RsGxM[F,_?Ռ)b8f2i+y1m%q [v/; z>LxaE|d?1g8{j1ɇm+eoqF%jt xM{Kڈ^gESj!>{l8o1q+\t%τwb }zA|KAmDƅo>@qn7Ąs^1s9up+cw%y!&| aN~JsDL t=v"7w{1Lx+Zmz&|![}~JLy/C炗y=z7V^{X1-|2+E} &2~!~ځ,I|~CR~=U~71l~1$0+T|&(!ĀTmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92EJL`KqJڪMϩVȨaŪk¬u}ŶʲЫ֤ܚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚ82EJK`IqHۭJЬRɬ]ƯgñqyIJˬХ՝ړޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ82EJJ_HpFܯGҰNʱWȶbźlxŭ˧ϠӘ׏ڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏ82DKI_FoDݳCӶH̷Q\lxƩʢΛєԌ׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌72DKG^DnA߸>ֽBJ¾\lxƥɞ̘ϑҊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊ72DKF^Bm>};yN_kzpwtuwsyr{q}poˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀ )A$U5eFpTy{avhrnoqmtkwjyizh|g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@OTNdOuQڥXѢbɟmşwžùǶ˳ϱԮקէէէէէէէէէէէէէէ9*F@NTMdNtOۧUҥ_ʣiŢt¡}øȵͱӮاڡ֡֡֡֡֡֡֡֡֡֡֡֡֡֡9*F@MTLdLtNܪSҩ[˦fƥpåzøɳϰիڠܛ؛؛؛؛؛؛؛؛؛؛؛؛؛؛8*E@LTKcKsLݭPԬX̪bǪlĪv~¸ɳϬգښܖؖؖؖؖؖؖؖؖؖؖؖؖؖؖ8*E@KSJcIrJްMհUΰ^ɰhƲsò|ɮϥ՜ڕّّّّّّّّّّّّّّܑ8*E@JSHbHqH߳JֵQжZ̸eʽq{ȦΝԔ؎یٌٌٌٌٌٌٌٌٌٌٌٌٌٌ8*E@ISGaFpFGٻNӿWcpyǠ͗Ҏׇه؇؇؇؇؇؇؇؇؇؇؇؇؇؇7*D@HREaDoC}DJTbnxǛ̓Њԃւււււււււււււււ7*DAFRD`BnA{BFRamxƘʐΈтӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀ7*DAEQB_?l>x@FQ`mxŕȎˇ΂6*CACP?]Rcpzċņǂ5*BA?7J0R/U,h0BWgs|2*8=/E)H%R)l1EZit|~~~~~~~~~~~~~~~0*/8&<;#W*o5J]ku{~}{zyyyyyyyyyyyyyyy.*%0-A#Z.o<O_lt~x{{y}xvāuÃtÄs†s†s†s†s†s†s†s†s†s†s†s†s†s†s†$%#,F&[5lDzSb|lxquusxqzp|o~ǹm̂l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄ 1G,Y]?fCmMoNYfqyĆǀ|zyyyyyyyyyyyyy5"B7AE=P;Y69A4H3M6P6g;{HXgr{|zzzzzzzzzzzzzz2":43=.B/A.U3k;~J[is{}{ywwwwwwwwwwwwww1"31+6&6&A,Z3n=M^ktz}|zywussssssssssssss.!*+",-#G+]6oB}R`l~s{wx{v~tǀsƂqńpćnĊnËnËnËnËnËnËnËnËnËnËnËnËnË* "3#J.^FJFVHbKmOwU^lȷqw}Ɣɐˌ̊ɊƊƊƊƊƊƊƊƊƊƊƊ6C.F>EJEUFaIkNtU{ajĺpu{ŎȊʆˆɆƆƆƆƆƆƆƆƆƆƆƆ5B.E=DICTD_GhMpVudzinty~ĈDŽɀʁȂƂƂƂƂƂƂƂƂƂƂƂ5B.D=BHASB]FeMkXmazgmrw}Â}z{}}}}}}}}}}}}5B.B<@G>Q@YD`NcYg`yfkpv{}xvuwwwwwwwwwwww4A.@;=E;N>UDYOZQlZ}biqw~|yvtrrrrrrrrrrrr3A/=::C8J;OENF_KqR[fpx|ywvtttttttttttt3>.975?5D9EBHDRHZNaVgbmgmrx~‚ƒ3A&B3@=@GBOGWM]X``lf~kqv|}{}3A&A2?<>EAMESNVZW^kd}jotzzwtwzzzzzzzzzzz3A&?1<:IDMOMWV]jc{hmsx~ytqnqttttttttttt3@&<0989?%9.656::WEgKuS^h|qxwt}pȂnLJkŋiĐhĖfÞeåeåeåeåeåeåeåeåeåeåeå//*"$!# -55I4N?\JfUoy^urd{nk~jphueyc}bځ`ڄ_ه]؋\א[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔  !.,?7MDXOaxYhq_mjdqgjtdowbty`xz_{{]~|\}[~ZYXXXXXXXXXXX   $//==IIRxTZpZ_i_ddegaji^nk\rm[vnZyoX|pW~pVqUrTsStStStStStStStStStStSt'-49~BCwMJnSPgYUb^X^d[[h]Yl^Wp`VsaUvbTxbS{cR}dQdPeOfOfOfOfOfOfOfOfOfOfOf*(~82vD:mKAeQF_WI[]LXbNUfPSjQRmRPpSOrTNuTMwUMyUL{VK~WJWJWJWJWJWJWJWJWJWJWJW->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;VG[Ta`hkpuz䇃߂~zwtrpnmll¤nĤoĤoĤoĤoĤoĤoĤoĤoĤoĤoĤ->K.Q:TGXS^_djluv~䊀߅ۀ|yvsqonmn§p§q§q§q§q§q§q§q§q§q§q§->J-O:QFVR[^aihtq~|߉ۃ{wtrpooqrssssssssss->J-M9OESQX\^herm|wߌۇց}yurporstuuuuuuuuuu->I-L9NDQPV[\fbqi{s}ۊքzvsqqtuvwwwwwwwwww->I,J8LCOOTZYe_ofyoyێևҁ|xussuwxyyyyyyyyyy->H,H7JBMMRXWc]mcwkuܒ~ӌ̆ƀ|yvvwyz{{{{{{{{{{->G,G7HAKLPVUa[kati~ޟsԘ}ˑĊ|zyz{}}}}}}}}}}}->F+F6GAIKNUS^Yh`qhz٥s͜zŕ~}}~->E+D5E@HILSR\Xe_mްivҩqȠx~-=D*C5D>FHKQPYWa^iڴisͬo¤v|-=C*B4B=EFJOOVV]`dԸgrȯmtz-=A*@3A2?;BBGINOWS^_˾dqjpv|~,=?(=1>9A@FEMIXK\^cphntz{xwz||||||||||,==';0<7?)F:MKUZ\hbwgm~svypŁjĉfÒbÜ`æ_ô_¨aaaaaaaaaa,51 .#-"3:.B@IPN_Ul\wc~jvqoyk΀g̈dʐbɘ`ɡ_ɫ_ɹ\â\â\â\â\â\â\â\â\â\â,0,'&- 73>EETLbRnXx}`vipqkxheцbύ`Δ^Λ]ͣ\ͭ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ,+$+&48>KGV}Q^vYen_jhendkraqt_vv]{x[yYzX|W}V~TSSSSSSSSSS   +06=@H}KQuTXmZ]g`bcfe_kg\piZtkXxlW|nUoTpSqRqQrPsPsPsPsPsPsPsPsPsPs־ "!..9:|DCtNJlTPeZT`_X]eZZj\Wn^Ur_Tv`RyaQ}bPcOdNdMeLfLfLfLfLfLfLfLfLfLf %1*|<4sF;jLAcSF^YIZ^LVcNThPRlQPoROrSNvTLyUK|UJVIWHXGXGXGXGXGXGXGXGXGXGX'{3$q<,hC2aJ7[P;VV=S\@P`ANdCLhDJkEInFHqFGtGFvHEyHD|ICIBJBJBJBJBJBJBJBJBJBJ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9G%N1U=[HaSh^ohxp~xz~vspnkjhgffǔfДhГiДiДiДiДiДiДiДiДiД( 9F$M0T >(@0C8H?NEUK޻^TдdeŬksqx~' 7=='?/B6G0C4L6R?YQ¾`bfpl}rx~}xustwx¨x¨x¨x¨x¨x¨x¨x¨x¨' 588#9(<,B.L-O=WP^`doj|pv||vrommp§r§r§r§r§r§r§r§r§r§& 466!6%9'@&I(NNLVY]eco~jxvpnwhc·_ΐ[͚YͥWβV“VДWϕWϕWϕWϕWϕWϕWϕWϕWϕ& ,& '4#=3EBKPR\Xf|_ntfulmzfua}]܆ZۏX٘VءTجTطSɋS֋S֋S֋S֋S֋S֋S֋S֋S֋$ &  &2(;8CFKRR\|Yds^kjdpeluatx^|{[}YVߒUޚSޢRݪQݶQݿQݿQݿQݿQݿQݿQݿQݿQݿ!   &1,;:DGLQ|SZsY`k_fefjamm]tpZzsXtVvTxSyQzP{O|N|N|N|N|N|N|N|N|N|  ' 2.=;EE{MNrTUkZZd`_`gb\meYrgWxiU~jSlQmPnNoMpLqKrKrKrKrKrKrKrKrKr )!4.?9{GAqNHjTNcZR^`VZfXWlZUq\Sv^Qz_O`NaLbKcJdIeHfHfHfHfHfHfHfHfHfͻ, 7+zA4pG;hMAaTE\ZIX_KUeMRjOPnQNrRLwSK{TIUHVGWFWDXDYDYDYDYDYDYDYDYDY".y8%n>-fE2_L7YR;UX>Q]@ObBLfCJjDInEGrFFvGEzHC~HBIAJ@K?K?K?K?K?K?K?K?K?K $w-l3c:$\B(VI,QO/NU1KZ3H^5Fb6Df7Ci8Al8@p9?s:>w:={;<~<:<:=:=:=:=:=:=:=:=:=u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁v$w5yBI'Q2X=_HfQ~nZywbuiqnmskvhyf{d}cba`Ă_΂_׃aۃc݃d݃d݃d݃d݃d݃d݃d݃d݃w$x5|AH'O2V=]GdQlZ|tbxitoptlxj{g~fdba`Dž`Ӆbمd܅eۆeۆeۆeۆeۆeۆeۆeۆeۆx$x5~@G&N1U<[FbPiYqb{{ivprunyk}ifecbaˇbՇdڇeوgىg؉g؉g؉g؉g؉g؉g؉g؉y#y4?F&M0S;ZE`OgYna~xiyptvp{mjgedbÉbЊd؊f؊g׋h֌i֌i֌i֌i֌i֌i֌i֌i֌y#z4>E%L/Q:WD]NeXkati|pwvs|okhfdcnjcԌf֌hՍiԎjԎkԎkԎkԎkԎkԎkԎkԎkԎz#{4=D$J.N8TBZLaVi_phzp{wv|qmjgfeǎfԏhӏjӐkґlґmґmґmґmґmґmґmґmґ{#|4<C$H-L7RAXJ_Tf]nfwo态v{}uqnkihhϓkѓlГmДoГoѓoѓoѓoѓoѓoѓoѓoѓ|#}4;A#F,K5P?VH]Qc[kdumކ~u؀|zvromlkȖmϖoΖpϖqϕrϕrϕrϕrϕrϕrϕrϕrϕ|#}4:@"E+I4NEK2TC[Saahmnwtz{upmjiÜk˛n̚o̙o̙o̙o̙o̙o̙o̙o̙!+ 3214;?I0RBYQ`_fklur~xztojgdcd͘g͘h͗h͗h͗h͗h͗h͗h͗h͗!) 0.,/8 =H.P@XO^]dhjrpz{vt}nhda^]]Д`ДaДaДaДaДaДaДaДaД!( , (& (2 >G,O=VL\Ybehn{ovtu|m|hc_[YXWԎYӏZӐZӐZӐZӐZӐZӐZӐZӐ!'' !  0=F,N:UH[Ua`|gitnpmuvg|{b˄~^ʍZʗWʣUʯT˾SՆTوUىUىUىUىUىUىUىUى% /:"C1J>PJWT|^]tedlljftoa|s\لvYَyU٘{Sڣ|Qڰ}P۾}P|P~QQQQQQQQ  .9'B5IAPK{WSr]Zjc`dje_ri[zlWnSqPrNtLuKvJvJvKuKuKuKuKuKuKuKu !.9*B6JA{RIrWPi\VccZ]i^YpaUwcRfOgMiKkJlImHmGnFnFnFnFnFnFnFnFnӺ "/:+C5zL>qQEhVKa[O\bSWhVToXQuZN|\L]J_H`GaFbEcDdCdCdCdCdCdCdCdCdֲľ %2<)yE2oJ9gO?_UCZ[GUaJRgLOlNMrOKxQI~RGSETCUBVAW@X@X@X@X@X@X@X@X@XƸ  (4w<%mB,eG2]M6WS:SY=O_?LdAJiCHnDFsEDyFB~GAH?I>J=K$[D)TJ,PQ/LW2I\3F`5De6Bi7An8?s9=w:<|;;<9=8=7>6>6>6>6>6>6>6>6>|q$ h+_2W9Q?LF!HM#ER%BW'@[(>_)vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj$i2 l>vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj#i1 n>wE|M(~T3|\E%L.S8ZAaKiS|q[v|bqhmmiqfucxaz`{_|_}b}c~df߀g߀g߀g߀g߀g߀g߀g߀g߀o!o0 ~6<D$L-R6Y@`IfRnZ|yawhrnmsjwgze|c~bÀbӁd߁eނg݂h݃i݃i݃i݃i݃i݃i݃i݃i݃p!r/ 4;C"K+Q4W=]FdOkXu`|hwnrtnyk}hfee˄f܄hۅiۅkۅlۅlۅlۅlۅlۅlۅlۅlۅq!t. 3:C!I)N2T;[DbMiUs^ۂ|f|owurzoljiiĈi؈kوlوmوoڇoڇoڇoڇoڇoڇoڇoڇq v, 2:B G'L/R8X@_IgRڏp\чxfʁo|vw|tqomllϋn׋o؊p؊qىqىqىqىqىqىqىqىr x+ 09AE%J-P4V<\EܛeOғm\ʌufÆ}ov|}xusqppɍqՍs֌t֋t؊t؊t؊t؊t؊t؊t؊t؊s z* /9?C#H*N1T8\@՟bN˘k[Ñrfzow}}ywuttŏuԎvՍwՍw֋w֋w֋w֋w֋w֋w֋w֋s |) /8=A!F'L-R3ܪY?УaMƜiZpewov}~{yxxyӐzԏzՍ{֌{֌{֌{֌{֌{֌{֌{֌t~( .8<?D$J)Q.֮W>˧_MgZneun|v}~}}~Б~ӏ~Ԏ~Ս~Ս~Ս~Ս~Ս~Ս~Ս~Սt'.7:=B H$߷N,ѱU=Ǫ^LeYldsnzv|̑ӐԏՍՍՍՍՍՍՍՍu&- 68;?FڻK+ʹT<®\KcXjcqmwu~|}{ɑ|Ӑ|ԏ}Ս}Ս}Ս}Ս}Ս}Ս}Ս}Սu%- 568=EվI*ȸS;[JbWhbolut|{|yvtƑuӐvԏxՍxՍxՍxՍxՍxՍxՍxՍv$, 235:?H)ĻQ9YH`Ugamktszz{vronÐnӏpԎrՍrՍrՍrՍrՍrՍrՍrՍw", 0 /17 ;F'P8XG_Te_kirqxx~ztoliggՎiՍl֌l֌l֌l֌l֌l֌l֌l֌x!+, * + 29E%N6VE]Rc]igpovvy}|snieca`ҋc׋e؊e؊e؊e؊e؊e؊e؊e؊z )'$$'7C#L4TB[ObZhdnlytrs{xm}hc_][ZЇ\ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ~& %5A!K1R?YL`Wf`zlgssmlzsgwb{^~ZXVUρVނX݂X݂X݂X݂X݂X݂X݂X݂ &6@I-Q;XH^R{eZskalrgfylaǁp]ƊtYƔvVşxSƬyRƻzQyQzS|S|S|S|S|S|S|S| &4? G-O9VD{]LsdTlkZfr_ayd\ԂgXԋjUԕmRԠnPԭoNռpMoMpNrNrNrNrNrNrNrNrع  ' 4>$G0N:zTCqZJiaPdhU_pYZx\V_SbPdMeKgJgIgHgJgJgJgJgJgJgJgJg ۱ʽ (5?&G1yN9pT@hZFa`K]gOXnRTuUQ}WNYK[H\F^D_C_B`A`A`A`A`A`A`A`A`ާ˶ +6@&xH/oM6gS<`X@[_DVeGRlIOrKKyMHOEQCRAS?T=U=VLh@InAFuCC|D@F=G4>3?3?3?3?3?3?3?3? y o( g0_7X>RDLJ"HP$DU&AZ'>_);d*:i+8n,6t-4z.3/1000.1-2-2-2-2-2-2-2-2 ujb!Z) S1M8H>CD?JwFxN(wV1t_:nhAjsHf~NbS_V\ZZ\X^W`UaTbScSdRdTdVdXdYeZfZfZfZfZfZfZfb$^/j5 t<zD|L'{T0w\9reAloHh{NdS`X][[^Y`XbVcUdTeSfTfVfYfZg[h\h\h\h\h\h\h\hc$_.m3 w:}BJ&R0|[8wcAplHlwOgTcY`\]_[bYdXfWgVhUhViYh[i\j]k^k^k^k^k^k^k^kd#a-p2 {8@I%Q.Y7|a@viHpsOlUhZd^aa_d]f[hZjYkYkYk[l]m^n_n`o`o`o`o`o`o`oe#d+s0 ~6?H$O-W6^>|fFvpNq{UmZi_ecbf`i^k]l\m\n]n^o_qaqbrcrcrcrcrcrcrcrf#g)w. 5>G"N+U3\_JeUl^sfzlrw|{wtrƒrڃsށt߀uuuuuuuo#+,,16ɻCM.V<]IdTj]qexkqvyzu~qnlkՂmށo߀pppppppq!)'&*5ĿAL-T;[GbRi[ocvj~|oxtsyo|khfeрfh~j~j~j~j~j~j~j~u % "3 @J+S9ZEaPgYm`~tgxzmrrmvhyd|a~_~_~_}b}c|c|c|c|c|c|c|x0 >H(Q6XB_MeVk]xrdryilngrbu_x\zZzYzXz[z]y]y]y]y]y]y]y} . ;F%O3V?]IcRxjYqp_kwdfiam]pYrVtTtStStTuVuVuVuVuVuVuVuٸ +9D"M/T;[DxbMqiSkoYev^`~b\‡fXhUkRlPmOmOlOnPoPoPoPoPoPoPoگͻ +9CK*S5yZ?qaFjhLeoR`vV[~ZWχ]Sϑ_PϜaNϩcLϸcKcLbJeKfKfKfKfKfKfKf ަδ¿ - 9B J*wP3oX;i_AcfF^nJZuNV}QR߆SOߐVMߛWKXIYHYHYGYF[F[F[F[F[F[F[ѭ¸ .:C!vJ*nP1fV7`\<[d@WkCSrFPzIMKJMHNEPCQBQARAR@Q@Q@Q@Q@Q@Q@QԥIJ$1~;tB lH'eO-^U1Y[5Ub8Qh;Mo=Jv?G~ADCBE@F>G4>3?3?3?3?3?3?3? v$n- f5_<XCSINO!JU$F[&C`'@f)>k*;r+9y-6.4/1001.2-3,3,3,3,3,3,3,3}rha'Z/ T7N>IDEJAO>U;Y9_6d4i2p /w!-"+#($'%&&%&%&%&%&%&%&%&xo d\T N'H/C6 ?< sHrQ&oZ.jc6enxqFs{MnSjXg]e`ccae`g_h_i`iajbjcjdieieieieieiei^#i"v#, 6>EL"S*Z2߅e;~mExvMtTpZl^ibgeehdjckclcldmflglhkhkhkhkhkhkhk_#k y"+4 <CJP&X.׊a:΄jE~sMy{Uu[q`ndlgjjhlgngogohoiojnkmkmkmkmkmkmkm_#n{!*2 :AGM!ږU-Ϗ^9ȉgDoM~wUy[v`sephnllnkpkqkrlqmpmpnonnnnnnnnnnnna!p~ )1 8 >DߠJӚR+ʓ\8dCmMtT~|[zawetirmpporosospsprqqqpqpqpqpqpqpqpc r'/6 ;@ڤFΞQ*ŗZ7bBjLrTy[`|eyjwmupssstsutttsuruqupupupupupupet&-4 7 =ԧDɡO)X6`BhKoSvZ~`e}j{nyqxswuwvxuxtxsxqxqxqxqxqxqxqgw$+03ܮ7 ϪCťN(W5_AfJmStZ{`ejn~q}t|u}|v|}v|}t}|s}|r}|q}|q}|q}|q}|q}|qiy#),/ײ4 ˭AL'U4]@dIkRrYy_dimq|tyvwvvvvtwsxrxqxqxqxqxqxqk{!&'ߴ)ҵ2 ǰ@K&S3[>cHiQpXw^~di~mzqvssuqvovptqsrrsqsqsqsqsqsqm~" ں!͸1 ´>I$R1Z=aGhOnWu]|c}hxltpprmtjuiuitksmqmqmqmqmqmqmqpӽȻ/<G#P0X;_EfNlUs[}zawfrjnnjqfsdscscreqgpgpgpgpgpgpgpsپ -:F!O-V9^CdLjS|qYvx_qclhhkdn`p^q]q]p^p`oaoaoaoaoaoaow׵ *8DM+U6\@bI|iPvoVpv[k}`fdbg^j[lXmWmWlWlZlZlZlZlZlZlZl| ح ͸ '6AK(S3Z<}aEvgKpmQjtVe|[`_\bXeUfSgRgRgQhShThThThThThTh ۥαŻ#3 ?H$Q.}X8v_?ofFilKdsP_{T[XW[T]Q_O`M`M_LaMbMbMbMbMbMbMb Ъŵ / <F~O)vV2o^9hd?ckD^sIZzLVʃORʍROʘTMʥVKʳWJWIVIXGYHZHZHZHZHZHZԢǯ !0 ;}DuM$nU+g\2bd7]k;Yr?UzCRڃENڍHLژJIڥKH۳LGLFLFLDOCOCOCOCOCOCOۚʩ %3 {<sDkK"dR(^Y-Y`2Uh5Ro8Ow;L=I?GADBBCAD@D@D@D@C@C@C@C@C@Cͣ (x2 p;iCbJ\P#VW'R^+Oe-Ll0Is2F{4C6A7>9=:;;:<9<8<8<8<8<8<8<8<|t&l0 e8^@XGSMOT KZ"Ha%Eg&Bm(@u*=}+:-8.6/40312212121212121212yog"`,Z4 T<OCJIGOCU@[>a;f9m6t 4}!1#/$-%,&+&*')')')')')')'~ukb[T&N.I5E< AC >H;N8S5X3^1d.j,r*z'%$#"!!!!!!~pg^ VOI C'?.:47:3?0D.I ,N )S 'X %^ #d !l t }L*H3O4T7ZA\JZTW`$Tk*Px/M3J6G9F;EC?B?B@AAAAABABABBADAFBGBGBGBGBGBGBM)J2Q2W6\?^I]SZ^$Wi*Su/P4M7J:HFNW&~a1xj:ssBo|HlMiQfUdXcZa\`^`_`_a_a_c_d_d^d^d^d^d^d^[ ht~#+4 ;CJڊT%Ѓ]0~g:xoBtxHqNnRkViZg\e_dadbdbdbebfag`h`h`h`h`h`h`]jw!)18 ?ݔGҎQ$ʈ[/ƒd9~lAytHu|NrSoWm[k^j`hchdhehdidjckbkakakakakaka_mz'.5; ֘C̓O"čX.a8iA~qHzyNwStXq[o_nbmdlflflfmendncnbnbnbnbnbnbao|$+1ݠ6 ќAǗM!V-_7g@nH~vN{}SxXv\t_rbqepgphpgqfrerdrcrcrcrcrcrccq!',ؤ2̟@ÚK U,]7e?lGsM{S}Wz\x`vcuftgththugvfueududududududet#ߦ&ҧ0ȣ>IS+[6c?jFqMxRW\}`{czf~yh{yizyiyzhzzfzyezydzydzydzydzydzydgv۫Ϊ/Ħ=HQ*Y4a>hEoLvR}W[_~czfw~hu}is~is~ht~ft}eu|du|du|du|du|du|dixծʭ-;FP)X3_bpC^wGZKVNSPPRMTLTKTKTJUJVJVJVJVJVJV֘ɥ(6 AyJrR&lZ-fa2ah7\oqHjPdX%__*[g/Wn3Sv6P9Lӈ;JӔ>GӠ?EԮ@DԿAC@D@BBADADADADADADјå }&u2n<gEaM\U W]$Td'Pk*Ms-J|0H2E4C5A6@7?7?7?6=8=8=8=8=8=8ơyq'j2d; ^CXKSRPYL` Ig#Go%Dw'A)?*=,;-9.8/7/7/6/6/6/6/6/6/{tmf&_/Z8 T@PGLNHUE[Bb@h=p:x8 6"4#2$1%0&/&.&.&.&.&.&.&yphaZ#T+O3J;FB CI @O=U:[8a5h3o0x.,*)('&&&&&&xlc\UOI&D.@4<;9A6F3L1Q .W ,] *d (l %u #! yk^VO IC> 9'5-23.8+=(B&G$L"Q W^enx        B-B2H2L6N<PGPRN_KkHw$E'B*A,?.?/>0=1=2<2<3;3;4;4;4<3<3=4?5?5?5?5?5?5C,D0J0N4Q:SFRQQ]Ni Kt$H(E+C-B/A0@1?2?3>4>4>5=5=5>5>5?4?6A7A7A7A7A7A7D,G.M.Q2T9WDVOTZQf Nr%K})H,F.E0D2C3B4B5A6A6@7@7@7@7A6A7A8C9D9D9D9D9D9E+I,P,U/Y7\B[MXWVc Ro%Oz*L-J0H2G4F5E6E7D8D8D9C9D9D9D9D:E;FH?J@J@J@J@J@J@G*P'X&^*c3f= fGdQ`[ \g&Yr+V}/S3Q5P7N9M;LK>L=K?KAJBLCMCNCNCNCNCNCJ(T$\#c(h0l; lDjNfXab%^m+[x0X4V7T9S;Q=Q>P?O@O@OAOAOCNENFPFQGQGQGQGQGQGM%W!` h&n.r8 rApKmTh^$di*at0^~4[8Y;W>U@TBSCRDRERFRFRHRIRJTJUJUJUJUJUJUJP#[dm$s+w5x>wGtPoZ"ke)go/cy5`:]>[AYCXEWGVIVJUKUKVLVMVMXMYMYMYMYMYMYMS ^hq"x(|1~: }CzLvWra(mk/it6e};b@`C^F]H[KZLYNYOYOZPZPZP[P\P]O]O]O]O]OValu |%.7 ?H}Sw]'rg0np7jxHQ%X._5f<}mAxtFs{KoOkRgUdXaY_Z_Y_Y_XaWaWaWaWaWaWo  ߍҘʢ© /<FO#V,]3}d9wk?rqDnyHiLePaS^U[WZXYWYWYV[U[U[U[U[U[Us ̜ؑå ,9DM T)}\0wb6qi|HuP!oX'j_-ee2`l6\t:X|>UAQDNFLHJHIHIHHIHJHJHJHJHJHJΔ¡ /{; tEnNhV!c]'^d+Zk/Vr3S{6O9LG?F@E@E?DACBCCCCCCCCCC֍ƛ y*r7lBfKaS\[Xb#Ti'Qq*Mz-J΃0HΎ2EΚ4CΨ5Bθ6A5A5@7?9>9>9>9>9>9ʖx sn&h3b> ]HYPUXQ`NgKo Hx#Fށ%Cތ'Aޘ)?ަ*>ߵ*=*=*<+;-:.:.:.:.:.vnic'^2X;TD OLLSI[FbDjAr?{<: 8!7"6#5#4#4#4#4#4#4#4#uid^Y&T0O8K@GG DN AU?\A;G8N5T 3Z 1a /i ,r *} (&%$#""""""sgYSMHC?&:-73390?.D+J)P'V$]"e ny         tgXMGB <840%,+)0%5#: ?DIOV^hr~      9/<0A1D4D:DEEQ C]Ai>v<:9 8!7#7#6$6%6%5&5&5&5&5&6&6&6&6'6(6(6(6(6(9/>/D/F2H8HCHO G[DgBs?=$=%=&<'<(;);););*;*;)<)<*;+;,;-;-;-;-;-<-D)J)N,Q4R>RJ PUMaJmHxE"C$B&A'@(@)?*?+?+?+?,?,?+?,?->/>0?0?0?0?0?0@*H&N&R)V2W<WG UQR]PiMt J#H&G(F)E*D+D,C-C-C.C.C.D-C0B1B2B3C4C4C4C4C4C'K#R"X'\/]9^C [NXXUdRo Pz$M'L)J+I-I.H/G/G0G0G0H0G2G4F5F6F7H7H7H7H7H7F$O V]$a,c5d@ bJ^T[_Xk Uu%S(Q+O-N/M0L1L2K3K4J5K5K6J8J:J:K;L;L;L;L;L;J!S[b"g)i2j< hFePa[^f [q%X{)V,T/R2Q4P5O7N8N9N:N:O;N=N=N>O>P>P>P>P>P>MV_g l&o.p8oB lKiWebal%]v*[~/Y2W5V7T9S;SR?R?R?RARASASATATATATATAPZdlq#u*v3v= sGoSk^fg&cq+`y0^4\7Z:YW@VBVCUCVDVDWDWDXDXDXDXDXDXDS]hpv z&|.|8zD uOpZlc&hl,fu1c}5a9_<]?\A[CZEZFYGZGZG[G[G\F\F\F\F\F\FU`ktz")ނ3@ zLvVq`%nh,kq2hy6f:d=b@`C_E^G^I]J]J^J_I_I`H`G`G`G`G`GXcnw~#և.̃= I{Sv]%se,om2mu7j|;h>fAeDcGbIbKaLaLbLcKcJdIdIdIdIdIdIZfqz݋Ћ,Lj; GQ{Z$wb+tj1qr6oy;m?kBiEhHfJfLeMeNfNgLgKhKhJhJhJhJhJ\ht}֏ˎ*Œ8 DOX#|`+xh1uo6sv;q}?oBmElHkKjMiNiOjOkNkLkKkKkKkKkKkK^kv ۏ Вǒ'6BMV"^*}e0zl5ws:u{>sBrFpIoLnN}nO{mPznPyoNyoMyoLyoKyoKyoKyoKyoK`m y ۋ ԑ ̕•%4AKT!\)c/~j5|q9zx=xBvEuI|sLyrNvrPurPsrPtsOtsMtsLtsLtsLtsLtsLtsLbo { ކՎϔ ǘ#2?IR Z(a.h4o9v=}~A}{EzyIvxLswNqwPovPnwPnwOnwNnwMowLowLowLowLowLd r ~ڈАʗ›!0=GPX'_-f3m8t={{AxEtHq}Km|Nk|Oi{Ph|Ph|Oi|Ni|Mj{Lj{Lj{Lj{Lj{Lf uԋ˓Ě.; ENV%],d2k7zrmBiFeIbK_M^N\N]M]L]K^K^K^K^K^Km|Ոʒ )6 AJR!~Z(y`.tg3on8kuQ@OBMCLCLCKCKDKDKDKDKDKD}ϋ–-}9 wCqLkSfZ"ba&^h+Zo.Vw2S5O8L:JE?E?E?E?E?ڃǑ {(u5o@ iIdQ_X[_ Wf$Tn'Qv*M-J0H2E4C4B5C4B5A7@7@7@7@7@7΋{tp"k0f<aE \NXVT]QdNlKt"H~$EȈ'Cȕ(AȢ*?ȱ+>+>*>+=-<.<.<.<.<.ē{pg d`*\6XATJ PR MZJbGiErB|@؇=ؓ<ء:ٰ 9 9 9 8"7#7#7#7#7#{pe]ZV'R2N<JDGMEU B\ @d>l;v9754221111111{ocXTQM&I/E8A?>G94 0,)&""',16<AHOW a l y 116.:/;2;9;C9O8\ 6h 4t2100//.........//......3/9,=->0?6?A=M<<;::9999999:9!9#9$9$9%9%9%9%<'C#H"L&O/P9NCLO J[HfEqC|BA@?? > >!>!>!>!>!?!>#=%='=(=(=(=(=(=(?#G LQ$U,V5U?SJ PVNbKmIwGFE D!C"C#C#B$B$C$C$C%B(B*B+A+A,A,A,A,A,C JPW![(\2[;YF VQT]QhOrM|K J!I#H$G&G'F(F(F)F*G*F,F.F/F/F/F/F/F/F/FNV\`%b-b7`A]L ZXXcUnRwP"O$M'L(L*K+J,J-J.J/K/J1J2J2K3K3K3K3K3K3JRZaf!h)h2g<dH aT^^[iXr V{$T'R*Q,P.O/O1N2N3N4N4N5O6O6O6O6O6O6O6O6MU_fkm$n,m6kCgOdZ`d]m"[v&Y~)W,V/U1T3S4R6R7R8R8R9S9S9S9T8T8T8T8T8OYcjort&t1q?mKiVf`ci"`q'^y+\.[1Y3X5W7W9V:V;VZ?Z?[>[>\=\<\<\<\<\`>`=`=`=`=Wb l t z ~ ҁȁ'6|B xMuVr_"of'ln,ju0h|3g6e9db@bBbBbCcBcAd@d?d?d?d?d?Yd n w}Ԃ ̄Å$4@ |KyTv\!sd&qk+or/my3k6j9h I}RzZ wa&uh+so/qw3o~6n:m=k?|kByjCxjDvjEvkCvkBvkAvl@vl@vl@vl@vl@] it|ЃɈÊ /< GP~X|_%yf*wm.ut2t|6r9|q=yp@voBtnDrnEpnEpoDpoCqoAqo@qp@qp@qp@qp@_kvˆŋ -: ENV]$~d)|k-zr2}xy5zw9wvf~Ac~Ca}D`}D_}C`}B`}Aa}@a}@a}@a}@a}@gtLj&3? HPX z_%ve*rl.ns2j{6f9c<`?]A[BZCZBZA[@[@[?[?[?[?jx̓Œ#1< FNzVu]#pc(lj,hq0ey4a7^:Z=X?V@T@T@T?U?U>U>U>U>U>o|ȇ .9 CyLtSoZ ja%fh)co-_w0[4X7U9R;P=O=O,=-=-=-=-=-ljsj gc(_5[?WH TP PXM_JfHnExBÂ@Î>Ü<ë ;ü!:!;!9"8$8$8$8$8$uj^YW!U.Q9NCKLISF[ Cc Ak>u<р:ь8њ6ѩ5ѻ45433333uj^TL JH&F2D<BE?M=U;]9f7o 5z 3 1 0..--,,,,,vj^SIEB@$=.:68>6F3M1U/]-e+p){(&%$#""""""wj]QF?<96 3(10.6+=)D'J%R#Z cn{xj]PD:52 .+(!&'#- 39?EMU_jx       yk^PC8/+'$!#(-28? F OYer,/0,2,30160A/M-Z+f)s(~ ' ' ' & &&&&&&&&&&''&&&&&&.,3)5*6-645?3K2W0d.p ,{ , + +****)))))**+***))))1)6&9&:);2;=9H7T5`3l 2w 0 0//.........//.......4&9#=#>&A/A9?E=P;\9h 7s 6~5443333333334332322228#= AE#G,G6F@DLAX?d >o>=========< qInRl[ibgj"fq%dx(c+a.`0_3_5^6^8^8_7~_6~`5~`4~`4~`4~`4~`4U`ipuxz{z/x<uF sPpXn`kg!jn%hu(g|+f.d1c4c6|b7zb9yb9xc8xc7xd6xd5xd5xd5xd5xd5Wblsx{} ~~,|9yD wNtVr]pd nk$lr(kz+j.~i1{h4xg6vf8tf9sf:rf9rg8rg7rh6rh5rh5rh5rh5Yenv{ *7}B {KxTv[tb ri$qp'~ow+{n.xm1vl4sk6pj8nj:mj:lj:mk8mk7mk6mk6mk6mk6mk6[gqy~ (5@ I}R{Yy`wg#|un'ytu*vs}.sr1pq4mp6ko8io:ho:go:go8ho7ho6ho6ho6ho6ho6^jt|%3> GPW~^{|e"xzl&tys*qx{-nw0kv3hu6ft8ds9bs:bs:bs8cs7cs6cs6cs6cs6cs6amw#0<ENU{\wc!sj%oq)l}y,i|/f{2cz5`y7^y8]y9\y9]y8]x7^x6^x5^x5^x5^x5dpz .9C LzSuZqa nh#jo'gw+c.`1]3[6Y7W8W7W7X~6X~5X~5X~5X~5X~5ht~+7A yItQpXl_hf!em%at(^},[/X1U3S5R5Q5Q5R4R4R3R3R3R3ly '~4y>sG oOjVf]cc_j"\r%Y{(U+R.P0N1L2L2L2L2L1L1L1L1L1q~|#w0r;mD hLdT`Z]aYhVp!Sy$P'M)J,H-G-F-F-F.F.F.F.F.F.w}wso,j7eAaI ]QZXW_SfPnMvJ!H$E&C'B(A'A'@(@)@)@)@)@)~ul ie'a3^=ZFVN SU P\McJkGtE~B@> < < < ;!:":#:#:#:#yma]Z X-T8QBNJLRIY F` DhAq?|<:8767554444{ocXP ML%J1G;EDCLAT>\=<&;19;8E6M5V3^1h0s.,ۍ*ܝ)ܭ(('&& & & & ~qeYMC:5 31 0*.3-<+D*L(T']%g#s" reYLA8/- +(&$$+"2!9AIQZersfYK@5,&$ !"(.5<CL V b ougZK?3)!  # (.5=FQ]k{',**+**.&4%?#K!X dp{     )*,'.'-*,2+=)I'U%a#m"x"!!!!!!!!!!!!!"" " ! ! ! ! ! ,&0$1#1&2/1:/F-R+^)i(u''&&&& & & & & & & & ' ' & & & &&&&/#3 57#8,876B4N2Z0e.p-{-, , , + + + + + + , , , , ,,,,,,,37:= ?(?2=>;I9U7a5l4v3 2 2 2 1 1 1 1 1 1 2 2 2111111117;?CF$F.D9BD?P=\FJDVCbAl @u ?~ >==<<<;;;<<<<<<<<<<>DJOQR#Q-O8MEKQI\Gf FpExDCBBAA@@@@AAAAAAAAABG OSVWV%U1S?RLPW Na LjJrIzHGGFFEEEEE F!F!F"F!F!F!F!F!EK S W Z[ZZ+Z;XHVS T\ RePmOuN|MLKJJ!I"I#I$J$J$J%K$K$K$K$K$K$H OV[ ^ ^ _`'_6^C[N YXWaUiTpSxRQP O"N#N%N&N'N'N'O'O'P&P&P&P&P&J SZ_bc ce#e2c@aK ^T\][eYlXsVzU T"T$S&R'R)R*R*S*S)T)T(T(T(T(T(LV]cghhj i/h<eG cQ aZ_a^i\p[wZ~!Y#X%W'W)V+V,V,W,W+X*X*X)X)X)X)OY`gjllmn,l9jDhN fWd^be`l_s^{!]$\&[([*Z,}Z-|Z.zZ.z[-z\,y\+z\*z\*z\*z\*Q[djnpp qq)p7nBlK jTh\fceicpbx!a$`&}_){_+x^-v^.u^/t^/t_.t_,t`+t`+t`+t`+t`+S^gmqss uu't4r?pI nRlYj`ighnfu!}e}$zd&wd)uc+rb-pb/ob/nb/nc.nc-nc,nc+nc+nc+nc+U`iptwwxy$x2v=tG rOpWo^md}lkzks wjz#ti&rh)og,mg.kf/if0if0ig/ig-ig,jg+jg+jg+jg+Xclsxzz{|"|/z;xE wMuUs\{rbxpiuop rnx#om&ml)jl+hk.fk/dj0ck0ck/dk-dk-ek,ek,ek,ek,[fov{~~-9}C {K ~zSzxZvwasugptnmsv"jr&hq(ep+bp-`o/_o/^o/^o/_o-_o,`o,`o,`o,`o,^iry+6@~I yQu}Xr|_n{ekzlhyt"ex}%bw'`v*]u,[u.Zt/Yu/Yt.Yt-Zt,Zt+Zt+Zt+Zt+amv} (4~>yG tOpVm]icfjcr `~z#]}&Z|)X{+V{,T{-S{-Tz-Tz,Ty+Uy*Uy*Uy*Uy*eqz $}1x;sD oL kTgZdaah^p[x!X$U&R)P*O+N+N+N*O*O)O)O)O)ju{!w-r8mBiJ eQbX^_[fXmUvR!O#M%K'I(H(H'I(I'I'I'I'I'o{~wso)k5f?bG_O \VX\UcSkPsM}JG!E#D#C#C#C$C$C$C$C$C$utn jf%c1_;[DXKUS RZ OaMhJqG{DB@>====<< < < |{oc_\Z+W6T@QHNOKW I^ Ff DnAx?<:988776666sgZS QO$M0J:HCFKDRAZ?b=k :u 8 64321100000ui^SGCB@'?2><5-% $#"%!. 7@JS^jx{naTH=3*" &-5=FP[i x }obUG;1'  # ) 08ALXfwqcVH:/% #*2<GTcs")#'#( +1=IVbnx$'&$&$$'"/ :FS_ju'#) ) (#)-'7%C#O![fq{+--. /)/4,?*K(W&b%m$w############$$$$$ $ $ $ $ .1256%6/4:1F/R-],h+r*{***)))))***** + * * * * * * 258;= <*;59A6M4X3c2m2v11000//// 0 0 1 1 111111169>ACB#A.>:=Ft ={ = < <<;;;;;;<<<<<<<<= BH K LLJJ,K;JHHSG]Ff Dn Cv C}BAA@@@@@@AAAAABBB@ FLOP O OQ'Q6PCONMXLa Ji IpHxGGFFEEEEEEFFFFGGGBJPTVU UV"W2V?TJSTQ] PdNlMsLzLKJJIIIIJJKKKKKKEMTY[[Z[\.[;ZFXPVY U`ShRoQvP}PONNNN N!N!O O OPPPPGQX]``^ `a*`7^C]M[U Y]XdWkVrUyTSSRR!R"R#}R#|S"|S!{T!{T {T {T {T JT\addc de'd4c@aJ_R ^Z]a[hZoYvX}XW}V {V"yV#wV$vV$uW$uW#uX"uX!uX!uX!uX!MW_dghghi$h2g=eGdO bW a^_e^l]s}]z{\y[v[!tZ#rZ$qZ%pZ%o[%o[#o["o["o[!o[!o[!OZbgkljkl!l/k:iDhM fU e\db}bizbpxaxu`s_p_!n^#l^%k^&j^&i^%j_$j_#j_"j_"j_"j_"R]eknonopp,o8mBlK jR ~iY{h`wffufnreupd~mckc"ib$gb%eb&db&db&eb$ec#ec"ec"ec"ec"U`hnqsqrst*s6r@pH}oP ymWvl^skdpjlmiski|hhfg!dg#bf%`f&_f&_f&`f$`f#`f#af"af"af"Xckquwuv wx'w3v=|uFxsN urUqq\npckojinqfnzcmal!_k#]k%[k&Zk&Zk%[k$[j#\j"\j"\j"\j"[fnty{yz {|$|1|{;wzDsyL pxS lwZivaguhdtoasx^r\q Zq"Xp$Vp%Up%Up%Up$Vo#Vo"Wo"Wo"Wo"_irx}~!{.w9rBnJk~Q h}Xd|_b{f_zm\yuYxWxTw!Rv"Qv#Pv$Pv#Pu#Qu"Qt!Qt!Qt!Qt!cmv}}yu+q6m?iGeO bV _\\cZkWsT}QO~M~ K}!J}"J}!K|!K{ K{ K{ K{ K{ gr{|vrn'j2f<cD`L\S ZZ WaThQqOzLJHFEEEEEEEEmxtn if"c.`8\AYIVPTW Q^ NfLnIxFDB@????????s~{le`][)X4U=REPMMTK[ Hc Fk CuA><:99998888zuh[V SQ#O/L8JAHIFPCXA_?h=r :} 8 6433322222ymaUKGED'B2A;?C=K;S9[7d5n3y1/.- ,, + + * * * }qdYMB; 875)423;2D1L/U.^,h*t)'&$###""""sg[OD:0* ('&'%0$9#B"K!U _lz͊͜ήuh\PD90(  "+4=HS_m~ߑ wj]PD8.%   ! ) 1 ;EQ^nyk^QC7-#  %.7BN]n{m`RD7+!  !)3>K[l&$%'.:G S _ k u           #!!$,7DP\gr{""! )4@LXcnw%&$%&%$0!;HT_is|)*),,!,+)7'C%O#Z"d!n!w!!!    !!!!""#######,.0332%00.<,I*U*_)i)r(z(((((((((()****** * * 02 6 8975(352B2O1Z1d0m0u0|/////////00 0 0 0 0 0 0 0 3 6< > =<99-:<:I9T9^8g7o7v6}6655 5 5 5 5 5 6 6 6777777;@BB ?>@'A6ADAO@Y?a>i=q=x< < ; ; ; ; :;;;<<<<<<<:@EHHF EG"H1H?GJFTE]DdClBs Bz A A @@@@@@@AAABBBB<DJNOMKMN-N:MFLOKXJ`Ig Hn Gu F|FEEEEEEEFFFGGGG?HOSUSQ RS)S6RBQKPTO\Nc Mj LqKxKJJIIIIJJ~K~K}K}K}K}KCLSXYXV WX%X2W>VHUQTXR_ Rf QmPtO{ONN}N{MzNxNwNwOvOvOvOvOvOFPW\^]Z[\"\/[;ZEYMXUW\ Vc UjTq~Tx|SzRxRvRtRrRqRpRpSpSpSpSpSpSISZ_ba^_``,`8^B]K\R[Y Z` }Yg{XnxXuvW}tWrVoVnVlVkVjVjWjWjWkWkWkWLV^beebbcd)c5b?aH`P}_W z^] w]d u\ks\rp[{n[lZjZhZfZeZeZeZeZeZeZeZeZOYafhief gh'g2f=eF{dMxcT ub[ raa paim`pk_yi_g^e^c^a^`^`^`^`^`^a^a^a^R\dillij jk$k0~j:ziCvhKsgRpgY mf` kefhdnfdvdcbc`b^b\b[b[b[b[b\b\b\b\bU_glpolmno!}o-yo8unArmInlPkkW ik^ fjedilait_h~]g[gYfWfVfVfVfWfWfWfWfWfYbjpsspqr|sxs*ts5ps?mrGjqNgqU dp\ boc_oj]nrZm|XmVlTlRkQkQkQkRkRjRjRjRj\fntwvuvzwvxry'oy2kx<hxDewLbwS_vZ ]ua ZuhXtpUsySsQrOrMqLqKqLqLpMpMoMoMo`jrx{zzz{t| o~l~$i/f9bB_~I]}PZ}W W|^ U|e R{nPzwNzKyIyHxFxFxFwGvGvGuGuGueow}~sl he b,_6\?YFWNTUR\ Oc Mk KtHFDBA@AA~A}A}A}A}ju}yjd`]['X2U;SCPJNRLYI`Gh Er B}@><;:;;;;;;q{se\W TR"P-M6K?IGGNEUC]Ae>o <:9)827;5C4K2S1\/f-q+*('&&%%%%%xk_SH=4/-, +)*2):(C'L&U$_#k"x {nbVJ?5,$ &/8AJUaoƑǤǹ~qdXK@5+#   ! * 4 > I U brԄԘԫsfYL?4*!    (1<GTctuhZM@3(  %.9ESdvwj\O@3'  *5CRcv#!! $ +7DQ]hr{ ) 4 AMYdnw%0=I U ` j s |   ",8DP[fow""!"" '2>KV`jrz&% ( )(& $+!8 DP[emu}   !"""#####) *./ -+("&/&='J'U(_(h(o'w'~''''''((())******-0342 .,.(/70D0O0Y0b0j/q/x///...///00011111058:95 46"818?8J8T7]7d6l6s6y55555555 5 6 6 7 7 7 7 7 3:?BB>;>?,?:?E?O>X=_=g^qF\pMYpTWp[UobSoj Pns Nn~LmJmIlHlGlGlHkHkHjHjHj^gnrrqzqqrktfucv`w(^w3[x<YwCVwKTwRRvYPv`NuhKuq It| GtEsCsBsAsBrBrBqCpCpCpclsvuvuvixcz^|\}Y~$W/U8S@PHN~OL~VJ~]H}eF}nC|y A| ?{ >{<{<{v;9 8 6 6 6 6 6 6 6 6 ox~wk^UNJHG%E/D8B@@G?O=V;_9h7s5310////// / v}peZOFA >=;(:19:7B6J5R3Z1d/o-{,*)(''''''~vj^TI@7210!.*-2,:+C*K)T(^&i%v#" }ocWMC80($#!! )1:BLVao~uh[PE;1' &.7ALW e t zl`SG<1' $,6@LYhy̌˟˳|obUH;0&  "*4?KZj}ݑݤ޶qdVI</$  '1=KZltfXK=/$  #.;J[m  (5ANZenw %1>JVaks{  "-9FQ\fow~( 4 ALWajrz   ".:F R \ e m u |   &3?KV_how}""%$! *8EPZbjqx~   !!""#####%(*+(! !$$%2&?'J'T']'d'l'r'y'''''(((()******(.353-*-.,/:/E0O/X/_/f/m/s.z.....///0011111-5:=<73 46'747@7J7S6Z6a6h5o5u5|555555566777772;ADC?; ;<"=0=;=E=Nk >k `inmmxmlnap[rVt RuPvNw'Lw1Kx9IxAHxIFxPDwWBw_@wh>ws<83245*555@5I5P5W5^5d4k4r4y4~4}4{5y5x5w6v6t7t7t7t7t75=BDB>98::&;1;;;D;L;S:Z~:`}:g{:ny:uw:~v:t:r:q:o;n;m;m<l<l<l<l<9BGHFC?> ??!@-@7@@}@H{@Oy@Vw?]u?cs?jq?rp?zn?l?k?i?h?g@f@f@e@e@e@e@>FKLJGCCCD~D){E4yE=vEEtDLrDSpDYnD`lCgkCoiCwgCfCdCbCaD`D`D_E_E`E`D`DAINOMKGGG|HxH&uI0sI:pIBnIIlHPjHVhH]fHdeHlcHuaG`G^H]H[H[H ZHZIZIZHZHZHELRQPNJJzKvLrL#oL-mM6jL?hLFfLMdLSbLZaLa_Li^Lr\L|ZLYLWLVLUL UL ULULULVLVLHPUTSQMzNuO pOmP jP*gP3eP<cPCaPJ_PQ]PX\P_ZPgYPpWPzUPTPRPQP PP PP PPQPQOQOQOKSWVUT|PuQpR kShTeT'bT1`T9^TA\THZTOYTVWT]VTeTTnRTxQTOTNTLTLT KT LTLSLSMSMSNVZYXWwTpUjVfWbW`X$]X.[Y7YY?WYFVYMTYTSY[QYcOXlNXvLXJXIXHXGXGXGXGWHWHWHWQY\[[}ZrXkYeZ`[]\Z\!X]+V]4T^<S^DQ^KP^RN^YL^aK]jI]tG]E]D]C]B]B]B\B\C[C[C[U]_^^x]m\e]__Z` WaUbRb(Qc1Oc9NcALcHKcOIcVGc^EcgDcqBc}@b?b>b=b`>`>`Yaaaataia_bYdTf QgNgLh$Ki-Ii6Hi>FjEEjLCjTBj\@ie>io=:731 12 3+353>}3F{3My3Tw3Zv3at3gr4oq4wo4n4l4j5i5h5g6f6f6f6f6f67>BA?<8677|8'z81w9:u9Bs9Iq9Pp9Wn9]l9dk9ki9th9~f9d9c:b:a:`;_;_;_;_;_;;BEDC@=;};y<u=#s=-p=6n=?l=Fk=Mi=Sg=Zf=ad=hc=qa>{_>^>\>[?Z?Z?Y?Y?Y?Y?Y??FHGFD@|?w@ s@oA lA*jA3hA;fBCdBJcAPaAW`B^^Be]Bn[BxZBXBWBVCUCTCTCTCTCTCTCBIKJIG}CvCqD mDjEgE'dE0bE8`E?_EG]EM[ETZF[YFcWFlVFvTFSFRGPGPGOGOGOGOGOGPGEMMLKJxFqGlGhHdHaI$_I-]I5[I=YIDWIJVIQUJYTJaRJiQJtOJNJMJLKKKJKJKKKKJKJKJHPOON{MsIlJgKbL_L\M!ZM*XM2VM:TMASNHRNOPNWON_NNgLNrKN}INHNGOFOFOFOFNFNGNGNLRQQQwPnLgNbO]P ZPWQUQ'SQ0QR8PR?NRFMRMLSUJS]ISeHSoFS{ESCSBSASASASARBRBRBQOTTT}SsSiQbR\SXT TURUOV$NV-LW5KW<JWDHWKGXRFXZDXcCXmAXy@X>X=Xc>=cEg4*!  "+5@N]nvgZNB7,"   )4BQbuɊɟʱn`SF:/$  (4CTg|fYL?2$ '5FXk,9EPZckrx~ (4ALV_fmtz "/;GQZbiouz )6AKT\cjpu{ "/;ENW^djpu{'3>HQX_ejpv|   ,7BJRY_ekqw~   $0;DLSZ`flry!%"*5>GNU[agmt|~}|zyxxx"),*'#$/9AIPV\bi} p| xz y!w!u"t"s#r#p$o$o$n$n$)020.*'# #$%*%4&=}&D|&Kz&Rx&Xw&^u&et'lr'tq'}o(n(l(k)j)i*g*g+f+f*f*/66540-*)*|+%y+/w,8u,@s,Gq,Mp,Tn,Zm,ak-hj-ph-zg.e.d.b/a/a0`0_0_0_0_04;::8520{/w0t0!q1+o14m1<k1Cj1Jh2Pg2We2]d2eb2ma3w_3^3]4[4Z5Z5Y5Y5X5X5Y58>>=<:}7x4t4 p5m5j5'h60f68d6?c6Fa6M`6S^7Z]7b\7jZ8tY8W8V9U9T9S:S:S:S:S9S9<A@@?~=x:s8n9j9g9d:$b:,`:4^:<];C[;JZ;PX;WW;_VN>N>M>N>N=N=?CCCBz@s=m<h=d=a>^>!\>)Z>1X>9W>@U?FT?MS?UR@\P@eO@oNAzMAKAJAIBIBIBIBIAIAIACEEEEvCo@h@cA_A \AYBWB&UB.SB6QB=OBCOCKNCRMDZLDcJDmIExHEGEEEEFDFDFDEDEEEEEFHHH{GrFjBcC^DZE VETFQF#OF+NF3LG:KGAJGIIHPHHXGHaFIkDIvCIBIAI@I?J?J?I@I@H@HIJJJwJnIeE^GYHUIQJOJLJ!JK)IK1GK8FL?ELFDLNCMVBM_AMh@Mt>M=MQS=R\U+=V24\F3]N1]W0]a/]l.]z,]+]*]*])]*\*[+[+ZUUUrUgV^VTWLYE[?]:_6` 4a2b1b#0b+/c2.c:-cB,cJ*dS)d](di'dv&d%d$d#d"d#c#b$a$aXXzYnYcYZZP\H^A`:c4f/h ,i*i)j(j&'j.&k5%k=$kF#kO"lY lelrlllkkjihh\\u\i]_]V^LaCdk7n0q)u"x{}}}~"~*~1~:~DNZh x  ~ ~ } } | { zewejeafVhLkBo9s1w*z#~    # + 3=HTaq~jqjgk[lPpFtQez)5AMV_fmty $1=HRZbiouz +7BLU]djpuz%1<GPW^ejpuz +6@JRY_ejouz$/:CLSY_djou{  (3=EMSY_djpv~   ,6? G N T Z _ e k r y  }|{{{ %/9AHOU[agnu}~|zxwutsqqqp%%#! )3<C~J|PzVy\wbvitqszqonlkjihhgg&***(%"|$z.w6v>tErKqQoXn^lek mi vh!f!e"c"b#a#`$`$_$_$_$,///-*(}$z" v#s# q$)o$2m$:k%Aj%Gh%Mf%Te%Zd&ab&ia&r_'}^']([)Z)Z*Y*X*X*X*X*13332/y-u*r( o(k)i)%g*-e*5c*=b*C`*J_+P^+W\+^[,fY,oX-zW-V.T.S/S/R/R/R/R/R/66665y3s1o/k.h-d.b.!`/*^/1\/9[/@Y/FX/MW0SV0[T1cS1lR2wQ2O3N3M3M4L4L4L4L4L39999|9t7n4i3e2a2 ^2\3Z3&X3.V35U4<S4CR4JQ4PP5XN5`M6jL6uK7J7I8H8G8G8G8G8G8G8;<<<x<p:j7d6`6\6 Y7V7T7#R7+P72O89M8@L8GK8NJ9UI9^H:hG:sF;E;D<C<B<B=B<B<B<B;=>>>u>l=f:`9[:W:S;Q;N; L;(K;/I<6G<=G\C>fB?qA?~@??@>@=@=@=@=@>?>?@@A|AqAh@a<[=V>R>N?L?I?G@%F@,D@3C@:BABAAI@AQ?BZ>Bc=CoE8=E?*VF)VO(WY'Wd&Wr%W$W#W"W"W"W#V#U$UMNuNiN_OVOMPER?S9V3X/Z+[*[(\'\$&\+%\3$]:#]C"]L!]V ^a^n^~^^^]]\[[Q~QpQdR[RRSJTAW;Y5[.^(`$b "c!cd d'd.d6e>eGeQe]ejezeeeedcbbTxUkU`VWVOWFY=\6_0b)d#gjllmm!m)m0m9nBnLnXnenu n n m m l k k jYrYfY\ZTZJ\A_9c1f*i$loru www w# w* w3 w< wGwRw_wowwvvuttt{]m]b^Y^N`EcM]pduWyK~?4)  &3ARdy\PD8,!  &5EWkӂӗөҸUI=0%  '8J]r &2=HRZbiouz !,8CMU]djpuz '2=GPX_ejpuz!-7AJRY_ejotz &1;DLSY_diotz  +5>FMTY_dinu{$.7@GNTY^diov~   '19AHNTY_dkrz~}{yxvuu t s s    * 3 ; B I~ O} T{ Zz `x gw nu vt r p omlkjiii~${-y6w=vDtJsPqVp\nbmjksi}hfecbba```"#$#" ~|z wtq(o0n8l?kEiKhQfXe^cfbo`y_]\[ZYXXXX'((('{%v#s q nki#g,e3c:bA`G_M^T\[[bY kX vV!U!T"S"R#Q#Q$Q$Q$Q#+,,-|,t*o(k%i"f!c"a"_#']#/\#6Z#=Y$CW$JV$PU$WS%_R%hQ&sO&N'M(L(K)K)J)J)K)K)./00w/o.j+e*c'_' \'Z'X($V(+U(2S(9R)@P)FO)MN)TM*\L*eJ+pI+|H,G-F-E.E.E.E.E.E-123|3r3k1e/`-],Y, V,T,R, P,(N-/M-6L-<J-CI-JH.QG.YF/cE0mC0zB1A1A2@2?2?2@2@2@2355y6n5f5a2\0W0T0Q0N0L1J1%H1,G12F19D1@C2GB2OA3W@3`?4k>5x=5<6;6;6:6:6;6;6;6678u8k8c7]6W3S4O4K4 I4F5E5"C5)A5/@56?6=>6D=7L<7U;8^:8i99v897:7:6:5:6:6:697989~:r;h;_:Y9S6N7J8F8 D9A9?9>9&<9-;:4::;9;B8;J7;S6<\52>1>1>1>1>2=2=;<{<n=d=\=U<N:I;E<A=>=<=:>9>#7>*6?15?84?@3@H2@P1@Z0Ae/Ar.B-B-B,B+B,B,B-A-A=>w?k?a@Y?R?I>D?@@K9L3N.P(S$T "U UVV$V,V3W;WDWNWYXfXuXXWWWVUUItJfK\KSKKLDM[6_.b&fjmps vx xyyyz&z/z9zDzPz_zpzzzyxxwj[_[V[L\B`9c0h(l ptw{ ~  (1<IWh{e`\`QaFdPdz͑ͤʹMA5) !1CVk !-8CMU]ciotz (3>HPX^djotz#.8BKRY_ejotz (2<EMSY_dintz",6?GMTY^chntz &08@GNSX]chnt| )2:AHMSX]ciow~}{zyxwxx  #,4;BHNS}X|^{dyjxrv{tsqpnmmlll  ~%|.z6x<wCuHtNsTqYp_nfmnkxjhg e d c c b b b }|| x u r (p 0o 7m >l Dk Ji Oh Ug \e cckbu`_]\[ZYYYY~xtqq oli"g*f2d9c?bE`K_Q]X\_ZhYrW}VTSRQQQQQ ""#w"p!ligfca_&]-\4Z;YAXGVMUTS\RdQnOzNMKJJIIIJ$%&{'q&j%f#b!`^ [YW"U)T0S7Q=PCOJMQLXKaIkH wG F!D"D"C"C#C#C#C"')*v*m*e)`'\%Y#W!U!R!P!N!%M",L"3J"9I"@H"FG#ME#UD$^C$iB%u@&?&>'>'='=(=(='>'*+-r-h-a,\+X(T&Q&N% L%J&H&"G&)E&/D&6C'<A'C@'K?(S>)\=)f<*r;*:+9+8,7,7,8,8,8,,.{/o0e0]/X.S+P*L*I* F*D*B*A*%?*,>+3=+9<+@;,H:,P9-Y8.d7.p6/5/4030202030304//1w2k2b2Z2T1O/K-G.D.A.?.=.;."9/)8//7/660>50F51N41W32b22n13}03/4.4-4-4.4/3/313t4h5^5W4Q4K2F1B2?2<2 938363 43&33-24414;05C05L/6U.6`-7l,7{+7*8)8(8(8)8*7*745q6e7[7T7M6G6B5=6:677 472718/8$.8+-92,99+9A*:I*:S);^(;j';y&<%<$<#<#<$<%;%;6|8m9b9X:Q9J9D9=99:5;2;/<-=,=*=!)=((>/'>6&>>%?G$?P#@["@h!@v @AAAA@@ ?9x:i;^<U<M<G<@<8=4>0@-A*B 'B&C$C#C%"C,!D3 D;DDENEYEeEtEFFFEEDD<s=f>[?R?J?D?=@6A1C,D'F$G !H III"I)J0J8JAJKKUKbKqKKKKKJJI?o@aAWBNBGBAB:C2E-G(I#KMO PPPP%P,Q4Q=QGQRQ_RmR~ Q Q Q Q P POyCjD]DSEKEDE>F6H/J)L$OQSV WXXX X( X0 X9 XC XN XZXhXyXXXWWWVsFdGYHPHHHAI:J2M+P%R UXZ] ` ` ```#`+`4`=`I`U`c`s`___^^^lJ_KUKLLEL=N5P.S'V Y\_b eg ghhhi&i.i8iCiOi]imiihhgfffOZOQOJOAQ8T0W([!^beh knp p qqrs!s(s1s<tHsVsfsyssrqqpaSVSOSEU;X2\*`"dhlo rvyzz {|}~"*5AO_q~~}\XTXIZ?]5a,e#josw { ",8FVh~Y]N_Cb8f.l$qw| #.<L^tSdGhHPW^dioty$.9BKRY_dinty )3=EMSY_dinsy #-7?GNSY^chmsz '09AHMSX]bgms{ !*3;AHMRW\agnu~~}}}} $-4;BGMRW\~b}h{pzyxvutrqpppp'}.|6z<yBwGvLuRsWr]qcokntl~kihgfeeee  ~| ywu!s)q0o6n<lBkGjMiRhXf_egcpbz`_^\\[[[[|vsr q nli#g*f1d7c=bCaI_N^U]\[ cZ mX xW V T S R R Q Q Q }tmjggf c a _ %] ,\ 3[ 9Z ?X EW KVQUYSaRkPvNMLKJIIIIvmfb_^^ [YW U'T.S4Q;PAOGNNLUK^IgHsFEDCBBBBB }!q"h"a!\YWUTQON#L*K0J7I=GCFJERCZBdAp?}>=<;;;;<!#x$l%c%\$W#S QOM KHG E&D-C3B9@@?G>O=X<b:m9{8 7!6!5!5!5!6!6!#&t'h(_(X'S&O$L"I G DB@ ? #> )< /;!6:!=9!D8"L7"U6#_4#k3$y2%1%0%0&/&0&0&1%&(q*e*\*U*O)K(H%D$A$?$ =$;$9$7$&6$,5%34%:3&A2&J1'S0']/(i.)w-),)+*****+*+*,)(|*m,b-Y-Q-L,G+C(?(<(9( 7(5(3(2(#0()/)0/*7.*?-+G,+Q+,[*,g)-u(-'-&.%.%.&.&.'-+x-j._/V/N/H.C-?,;,7,4, 2,0-.--- +-'*.-*.5)/=(/E'0N&0Y%1e$1s#1"2!2!2 2!2"1"1-u/g0\1S1K1E1@0;0603001-1 +1)2(2'2$%3+%32$3:#4C"4L!5W 5c5q666666650q2c3Y4P4I4B3=37314.5+5(6 %7$7"7!8" 8(80879@9I:T:`:n:;;;;::9}2m4`5U6M6F6@6:646.8*9&:#; <===>%>->4>=?G?Q?^?l@|@@@@??>y5i7\8R9J9C9=9791:+<'="?AB CCDD"D)D1D:ECENE[EiEy E E E E E D Dt9e:X;O;G<@<:<4<.>(@#BDFHJ JJKK% K- K6 K@ KJ KV KdKtKKKJJJIn<`=T>K>D>=>7?1@*B$EGILNQ Q Q QQ"Q)Q2R;RFRRR_RoRQQQPPPh@[APAHAAA;B4C-E&H KMPSU X XXYYY%Y-Y6YAYMZZZiY|YYXXWWcDVEMEEE?E7G/I(L"ORUX Z ]_ ` `aab b'b1b;bGbUcdbvbbaa``]HRIJHCH:J2M*P#SWZ] `cfgh ijklm"m*m4m@mNm]momllkkjXMNMHL>N5Q,T$X\`d gknprrs uvwxy#z-z9zGzVyhz|yxxwwTQLQBR8U/Y&^bgk oswz|~ %0>M_sRVGWr2x'  #5I^uیܟܫ $/9CKRY_dinsy*4=EMSY^chmsy $.7@GNSY^chmsy(1:AHNSX\aglsz "+3;BHMRW[afmt}%-5<BGLQV[`gn~w}{zxwvvvuu  '/5}<|A{FyKxPwUv[tasiqqp{nmkjjiiii{ ywv"t)s0q6p<oAmFlKkPjVh\gdeldvca`_^^^]] | wtq omki#h*g1e6d<cAbF`L_R^X]_[hZrX~WVUTTSTT zrli g f db`^%]+\1Z7Y<XBWGVNUTS\ReQoO{NMLKJJJJ~sjd`^] ] ZXV U'S-R3Q8P>O DN JL QK YJ bH mG zF D C B B B B B xlc]YVTTS Q O M "L (K .J 4I :GAFGEODWBaAl?y>=;;:::;sg^XSPNLL JHFE$D*B0A7@=?D=L<T;^9i8v76443344|nc Z S NJHFECA?> =';-:39:8A7I5Q4[3f2s0/.---..x j"_#V#O"J!F CA?= ;976#5)40361>0F/O.Y-d,q+*)( ' ' ( ) t#g$\%S%L%G$B#?!=:7 5310 /&.--3, ;+ C*!L)!V("b&"o%#$###"$"$"$#$$##q%c&Y'P(I'C'?&;$8"5"2"0" .","*")"#(#*'#1&$8%%A$%J#&T"&`!'m '}'((((('~%n'`)V)M*F*A)<(7'4&0&-&+' ('''%'$'!#('"(.!)6 )>*H*R+^+k+{,,,,,++z'j*]+S,J,C,>+9+4*0*+*)+&+#,", ,,-%-,-3.<.E/P/\/i0y000000/v*g,Z-P.H.A.;.6-1-,-'/$/!01 1222"2)31393C4M4Y4g5w5555444r,c.W0M0E0>08030/0)1$2!356 77888&8.969@9K9W:d :t : : 9 9 9 9 8n/_1S2J3B3;36312,3'4!689;= >>>># >* >3 >< ?G ?R?`?o???>>>>i3[4P5G5?59545.5)7#8;<?AC D D DD D'D/D8EBENE[EjE|EDDDDCd6W7L8C8<87818+9%; =@BDG I J KKKK#K+K4K>LILWLfLwKKKJJJ_:R;H;@;:;4;.<'>"ACFIK NPQ QRSSS&S/S9SESRSaSrSRRQQQY>N>E>>>8>0@)B#DGJMP SUWX YZZ[\!\*\4\?\M\[\l\[[ZZYTBJBBB^2c'jpx  &8Kaz7j+p x ,@WnԆԛӫ *4=FMSY^chnsy %.8@GNTY^cgmsz )2:BHNSX]bgls{ #,4<BHMRW[`flt}&.5<BGLQUZ`fmv}|||||  (/6<AFK}O|T{Zy`xgvpuzsqponnnnn~|{y"x)w0u6t;r@qEpJoOmTl[kbijhtfecbaaaaa~yuq omlk$k*i0h6f;e@dEcJaO`V_]]e\oZzYXWVVVVVzrligd ca`_%^+]0[6Z;Y@XEWKVQUXSaRjPvONMLLLLL | p h b _ ]\ ZXWV U&S+R1Q6P;OANGMMKUJ]IgGsFEDCCCCC ti`ZVT S S QONL!K'J,I2H7G=ECDJCQBZ@d?p>~=<;::::|nbZTPMKK J IGED#B(A .@ 3? 9> @= G< O: X9 c8 o6 ~5 4 3 2 2 2 2 wi^UOJGECCB @ ? = < $; *9 0877=6E5M3W2b1n/}.-,+++,rdYQKFB?><; :875!4'3-230:/B.K-T+_*l){('&%%%&~n`VMGB>:8754 20/-#,*+0*7)?(H'R&]$j#y"!   zj]S J D >:7420. ,*)' &&%-$5#="F!P [hwwg Z!P"H"A";"7!3 0-+(&%#!!$ *2:C M!Y!f!u"""""!!s d"W#M$E%>$9$4#0",")!&!$!"! !!""!"(#/#8$A$K%W%d&s&&&&&%%p"a$T&J&B'<&6&1%-%)$&$"%%& &''''%(-(5)>)I)U*b*q*** * * *)l$]&Q(H(@)9(4(/(+'''"()*++ ,,,-#-*-2.<.F .R ._ /n / / / .. . .h'Z)N*E+=+7+1*-*)*$* +-./1 222 2 2' 2/ 38 3B 3N3[4j4{333332d*V,K-B-:-4-/,+,&,"-/1246 8 8 888$8,848>9J9W9e9w988887_-R.H/?08/2/-/)/$013579 ;= >>>>!>(>1?;?F?S?a?s?>>===Z0N2D2<25201+1&2 468;= ?AC CDEEE$E-F6FBFNF]FnEEDDCCU4J5A59534.4(5"7:<?A DFHI J KLMN N(N2M=NJNXMiM}LLKKJP8F8=87817*9$;=@CF IKNPQR STUVW#W,W8WDWRVcVwVUTSSK<B<;;5;-<&?BEHK OQTWXZ[\ ]_`bb&b1b>aLa]ap``_^]G@??:?1@)C!FJNQ UX[^acdegh jlno o*o6nEnUnhmmlkjDD>C5D+G#KOTX\`dgkmoprtuw y|~".=~M}a}w|{zyCG9I/L%PU[`ejnrvy|~ %3DWm=N2Q(V\bhnty~ ):Mb{6W,\!bipw~ 0CXp0b%ipx  %8Ne~͖̩ %/8@HNTY^chmsz )3;BHNSX]bgmt{ $,5<CHNRW\agmt}'/6<BGLQUZ`fnv !(06<AFKOTZ`g~o|zzxwutsttt#*}0{6z;x@wEuItNsTqZpanimskihgfeffg|vt rqpp$n*m0k5j:i?hDgIeNdTc[ac`m^y][ZYYYZZ{snjgedccb%a*_0^5]:\>[DYIXOWVV^ThSsQPONNNNO{phb_][ YXWW V%U*S0R4Q9P?ODNKMRKZJcIoG|FEEDDDEq f ^ Y UTRP ONML K&J+I0H5G:F@EFCNBVA_@k>x=<<<;;; x j_WQM K JI H FEDC!B&A+?1>6=<<C;J:R9\8h6u5443333 qdYQKGDB A A ?><;:"9(8-72695?4G3P1Z0f/s.-,++++}l_TLFB><:: : 8 654 2 $1 )0 // 6. =- E, N+ Y) e( s' & % $ # # # xh[QHB=975332 0 / - , !+ '* -)4(;'D%N$Y#e!s sdWME?:520.-, +)(&%$$*#1"9!B KVcqp`TJB<62/,*(&% #" !'.6?ITapl]QG?94/+(&$"  $,4=GR_niZNE= 61-)%#  ")1:EP ] l | eWL!B!:!4!/!* &#    !!"""&#/#7 #A $M $Y $g $x$$$$##bT!I#@#8#2#,#("$!!!!!#$%& ' ' ' '# '+ (4(>(I(U)d)t))((('^"Q$F%=%5%/%*$&$"##$%&() , ,,,,!,(-0-:-E-R.`.q---,,,Z$M&C':'3'-'(&$&!&&')+, . 0 11222%2-263B3N3]3m322111V'J)?*7*0*+)'(#()*,.0 1 45 67888"8*939>9J9Y9i9}88776Q+F,<,4,.,*+%+ ,-/13 5 7:; < =>?@@%@/@:@F@T@e?x?>>==M.B/9/2/-.(."/0257 : <>ABC D FGHH!H*H5HAHOH`GsGFEEDH2>26201+1%2469< ?BDFHJKL NOQRR%R0R<QJQZQmPONMMC6;645/4'5!8;>A DGJMOQSTUW Y[]]]*]6\D\T[g[~ZYXW?98938+9#<?CG JNQTWZ\]_`bd fhkk#j.j<jMi_hugfed==7<.=%@DIM QUZ]`cfhjkmoqt vy{{'z5yExYxmwvut_C^H]N[UZ]XgWrUTSRQQRR|qid`^\ [[ZZY%W*V/U4T8S=RCPIOPNXMbKmJzIHGGFGG~pf^YVSRP OONN M%L*J.I3H8G>FDEKDSC]Ah@u?>====>uh]UPLJIG FEEDC B%A*@/?4>:=@;G:O9Y8d7q6544445~m ` V N H D B@?> =<;;:!9%7*60554<3C2L1U0`/m.}-,,,,,w g ZPIC> ; 9 8 76 54321"0'/,.2-8,@+I*R)](k'z&%%%%%r bVLD>9631 0 0 / .,+*)#()'/&5%=$F#P"\!i ym^RH@:51.,** ) ( ' %$# " &! , 3 ; D O [ i y      iZNE=71-*(&$## "     # * 2:DP\j{eWKB:4/*'$"   !(09CNZiy    bTI?71,($! &-6ALW e u    _QF=5/*%"  # * 3 < G S aq\NC:3,'#      '/9CP^nXKA80*%!   !!!$","5"@#M#Z#k#~#""!!UH> 5 . ( #   " $ % %&&&!')'2'='I(W(g'{''&&%Q E!;"2","&!"!   "# % &( ) +,,,,&-/-9-F-T-d-w,,++*M"A$8$0$)$$#!"""#$& ( *,. / 02333"3+363B3P3`3s22100I%>&4'-'(&#%$%&(* , .0245 7 8::::':2:>:L:\:o98876D):)1)+)&("'()+. 0 2579;<> ? ACCC#C.C9CGBWBjA@?>>?,6,/,*+%*+-/2 58:<?ACEFH JLMMM(M4LBLQKdK{JIHG;03/-/(-"/147 :=@CFHJLNOQS UXYX"X.W<WKV^VsUTRR8312,1%258< @DGJMPSUWYZ\^a dfgf'f4eDdWdkba`^5705(7 :=B FJOSVY\_adegilnq tww v-v=uOtcs{rpo5:+;"?CH MRW\`dhknqsuwz| $3E[r/@%DIN TZafkoty} );Pg)INT[bipw} 0E\t"T[bjs{ &:Qhˁʖ %.6>DJOTY^cipx  (07>DINSW]biqz "*18=CHLQV\bir}zx $+17<AFKPU[bk~u|zxwvurnl %~+|1z6y;w@vDuIsOrUp\odmnlzjhgfeda`}wspoooom%k*i0h4g9f>eCcHbNaU_^^g\s[YXWWWVTulhda` ____]%\*[/Y3X8W=VCUISPRXQaPmN{MLKJJJJrg_ZWUSR RRRQO$N)M.L3K8J=ICHJFRE\DgCuBA@@?@@tg]UOLJHG G FFFED$C)B-A3?8>>=E<N;W:b9o8766666|k^TMGCA?>= =<<<:9$8)7.635:4A3I2S1^0k/{.----.sdWMF@;87654 44321 0$/)./-6,=+E*O)Z(g'w&&%%%&m^ R H @ : 6 2 0..- , ,+*)( '%&+%2$9#B"K"W!d sh Y M C<61 - * ( ' && %$$"!!" (.6?ITapc UI@82-)&# "    %+3<FR_n_QF<5/*&"          " ) 1 : E Q _ n  \NC:2,'#        ( 0; F Q ^ m   XK@70)%!      % - 6 A MZj|UI>5-'"       "*3>JXgzRF;2+%!   '0;GUdwOC90)#    $-8DRbuL@6-&!      !!"!*!5"A"O"_"r!! H=3+$   !" $ &&&''''2'>'K'\'n&&%$#D90(#  !"$&(* + ----$...:.H-X-j-,+*)@ 6!-!&!! ! " $&(+-/0 2 4555 5*565C5S4f4|3210<#2$*$$# "!!#% ' )+.02468: < >>>>&>1>?=N=a@BD F IIH!H,G:GIF[EqDCBA4*,*'("'(*- 0 369<>ACFHJLNP STTS'S4SCRUQjPOML0-+,&+,.2 59=@CFILNQSUWY\_ bccb,a<`N_b^{\[Y/0*/"037;?DHLORUX[]`bdfimp tts%r4rEpYoqmkj.3%58<AGLQUY]aehkmortwz~ +=Rg~): =BHNTZ`dinrvz} !3G^w#CHN U\cjqv{ (<RjNT \dlt|1H_vȎ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗  9` ˻0ƸOg{ĵ˲ѯխ٫ܩާख़㡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘  9` ˼.ŹMfzŵ˱Ѯլ٪ܧޥ࢚➙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙  9` ˾,ŹLg{Ŵ̰ѭի٨ۥݣߟᛙ⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙  9 ` ˿+ĺLg{Ŵ̰Ѭթئۣݠޝᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚ  8 _ )¹Mh{Ƴ̯Ѫէؤڡܞݚޕ  8 _ )Ni|Ʋ̭ѩԥעٟڛܗݓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ  7 ^ ǿ+Pj|ư̫Чԣ֟؜٘ڔܐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ  7 ^ ľ-Qj|Ʈ̩ХӠ՝ّ֙ؕڎێێێێێێێێێێێێێێێێ  6 _ 0Sl}Ǭ˧ϢўӚՖ֓׏؋ًًًًًًًًًًًًًًًً  5 b 3Um}ƪˤΟЛҗӓԐՌ։׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉  7 e 8Xn}Ƨɡ̜ΗϓѐҍӊӇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇ  : h>[o}ģǝʘ˓͐΍ϊχЅхххххххххххххххх  > mD^p}ßřǔɐʍˊˈ̅̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓  B rI`p}ÕđƍNJLjȆȄɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ H xGbq|ÊĈĆńŃŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁſ% N p9Xlz€€€€€€€€€€€€€€€€€1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ0 S'|̨Dƥ]¤pùǷʵγбӰկ׭٭ګګګګګګګګګګګګګګګ0S&|˩CƦ\¤o~ùȶ̳ϱҰծ׭٬ܫݧۧۧۧۧۧۧۧۧۧۧۧۧۧۧ0S%|˩BƧ[¥n~ĸɵͲѰԮ׭ګܩߨߣܣܣܣܣܣܣܣܣܣܣܣܣܣܣ0S$|˩AƧZ¥m}ķɴαӯ֭ګܩߧ⤑ࠎܠܠܠܠܠܠܠܠܠܠܠܠܠܠ0S#|˪AƨY¦m}ŷʳϰԮثܩߧ⥗栖ݜݜݜݜݜݜݜݜݜݜݜݜݜݜ 0S"|ʪ@ƨX¦l|Ŷ˳аխڪݧच⟘㝚ᙗݙݙݙݙݙݙݙݙݙݙݙݙݙݙ 0S!|ʫ?ƩW§k{Ŷ˲ѯ֫ڧݤߠ◚ᗜޗޗޗޗޗޗޗޗޗޗޗޗޗޗ /R |ʫ>ƪV¨kyŶ̲Ѭ֨٤ܡݜޗޒޒޒޒޒޒޒޒޒޒޒޒޒޒ /R|ʬ<ƫU¨jwŵ̯Ҫ֥ءڝۙݔސގݎݎݎݎݎݎݎݎݎݎݎݎݎݎ /R|˭:ƬT©is~Ų̬ѧբמؚږۑ܍܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋ /R|˯8ƭR«fo~ưͪѤӟ՛ًُ֗ؓڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈ .Q|˰5ǯOð`l~ǭ̧ϡҜӘԔՐ֍׉؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇ .Q|̳0DZLĸVnǩˣΞϙѕґӎԋԈՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅ  -P|̶*ȷDYpªǦʠ͖̚ΒϏЌщч҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅  ,O{ͼ"¼<^r¦Ţǜɗʓː͈̍͋Ά΄ττττττττττττττ  + N zFbtÞřǔȐɎʋˉˇ̅̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃  ) L ~%OfuÖőƎNjljȇɆɄɂʂʂʂʂʂʂʂʂʂʂʂʂʂʂ ( R -WhuÌĊňņƄƃƁǁǁǁǁǁǁǁǁǁǁǁǁǁǁ - Y +Pgu~ˆ†…ÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ 4 [v%E]ny~~~~~~~~~~~~~~~:Uh-x@Vgs~x{|ywÂu„t…srrqqqqqqqqqqqqqqq'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~')F5iިAǜaĜq›~ĹǷʵ̴γвұӱԮԬҬҬҬҬҬҬҬҬҬҬҬҬ'(F4jݨ@ǝ`Ĝqœ|ºŸɶ̴ϲѱӰկ֯תէӧӧӧӧӧӧӧӧӧӧӧӧ'(F3jݩ?ǝ`ĝpž{¹Ƿʵγѱӯ֮ح٪٥դԤԤԤԤԤԤԤԤԤԤԤԤ''F2jݩ>Ǟ_ĝoyøȶ̳бӯ֮ج۫ܦڢ֠ԠԠԠԠԠԠԠԠԠԠԠԠ&&F1jݪ=Ǟ^ĝoxĸɵͲѰծج۪ިߢڞ֜ԜԜԜԜԜԜԜԜԜԜԜԜ&&F0jݪ<Ǟ]ĞnvķʴϱӮ׬۪ި⤐ۚיՙՙՙՙՙՙՙՙՙՙՙՙ&%F0jܫ;ǟ]ğlt~ŷʳаխ٪ި⥗柕ۗזՖՖՖՖՖՖՖՖՖՖՖՖ&%F/jܫ:ǟ\Ġjs|Ŷ˳ѯ֬ۨߤ៙㜚ᗖܔؓ֓֓֓֓֓֓֓֓֓֓֓֓ &$F.jܫ:Ǡ\ġhqzŶ̲Ѯשۤޠᖛᕛݒؑבבבבבבבבבבבב &#F-jܬ9Ǡ[ģfnxŶ̰Ҫצڡܛޖߑߑݏُ׏׏׏׏׏׏׏׏׏׏׏׏ &"E,jܭ7ǡZťc©kuų̭ҧ֢؝ژےݎ݌܍ٌ׌׌׌׌׌׌׌׌׌׌׌׌ %"E+jۭ6ǢYŧ_­fp~ưͪѤԞُ֙ؔڋۈۈ؈׈׈׈׈׈׈׈׈׈׈׈׈ % E*jۯ4ȤUƫXó_n~Ǭ̦РқԖՑ֍׉؆؄ׄքքքքքքքքքքքք %E'j۰1ȨMDzNXpǩˢΝЗђҎӋԈՄՂՁՁՁՁՁՁՁՁՁՁՁՁՁ $D%jڲ.ʯ@Ƚ=]r©ƥɟ˙͔ΐόЉц҄ҁҀҀҀҀҀҀҀҀҀҀҀҀҀ $D!jڴ)ͼ(CasšǛɖʑˎ͈̋Ά΃΁πππππππππππππ #Ci#LeuÝŗƓǏȌɉʇʅʃˁˀˀˀˀˀˀˀˀˀˀˀˀˀ "Bh /Thv”ÐčŊƈƇƅǃǁǀǀǀǀǀǀǀǀǀǀǀǀǀ @ _ 4Zkw‰ˆÆÅÃĂāāāāāāāāāāāāā  = c3Sgt}€€€€€€€€€€€€€  Aax2L_nx|}|{zyxxxxxxxxxxxxxx " BZ(j9wI[i|qyvvzt}rqȁpǃoDžnƆmƈlŊlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋ &=N/[?gNq{[yveqlnrkwizg~fՀeԂdԄcӆbӉaҋaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ "0:=YJy؛[Ǖrŗ{ØúŹǸɷʶ˶~̵}̳|ͯ|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯| !/:}֨DɨOǰSŸYm}Ƭ˥ϟјӒՌ׈ׅ׃քԄффффффффффф%91Z<~׬;ʭDɹEYo~ƨʡ͛ϕЏҊӆԃԁԀӀррррррррррр$9/Z9~ٴ/̸2½@]q~Ťȝʗ̒΍ωЅЂр~}}}}}}}}}}}}"9-Z0z!Hbs~àƙȔɏʋˈ̅͂̀~||||||||||||8)Z$t*Oet›ÖőƍNJȇɅɂʀ~|||||||||||| 7%Zh 2VhuÌĉņńƃƁ}}}}}}}}}}}}6P f6Vjv~†„ƒÁÀ~~~~~~~~~~~~ 4 Eh7Ser{~}||||||||||||  ' Ie%x9O`mux}{z}yĀwÁvƒu„tsrqqqqqqqqqqqq  ,H\1kBvP~~_{iwntsqwpzn}mĺk̓j̅i̇hˉgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌ -A(P9\Hf|Tnw^uqezmk~jphufxe{c~bځaك`م`؇^؊^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍ (7.C=N|KWwV_o]ehbjdinaoq_ss]wu\{v[~wZxYyXzXzW{V|V|V|V|V|V|V|V|V|V|V|V|'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'5/DJQe^~۔mϒwŒēÒ¼~¼}û{Ļzĺyĵyõyõyõyõyõyõyõyõyõyõy&4/CJPe]ڕi͔tŔ~ĕ•ûĺ~ź}ƺ{ƹzƵzƱzızızızızızızızızızız%4/BJOf\ږf̕qŕ|Ė—úŹƹǸ}ȸ|ɵzɰ{Ǭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{$3/AJOf[٘c̖oŖy׺ŹǸɷʶ}˶|˰{ʬ|Ȩ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}$2/AKNgYٙa˗mŗwÙĹǸɶ˵ʹ~α|ά}˨}ɥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~#2/@KMgWٚ^˘jřtÚ}ºŸȶ˴γвѬ~Ϩ~̤ɡơơơơơơơơơơ#1/?KMgUٜ\ʙhŚrÜzùǷ˴βѱӬӧФ͠ʞƞƞƞƞƞƞƞƞƞƞ"1/?KLgSٝYʛeŜoÝxĸɵͲѰծקԣџ͜ʚǚǚǚǚǚǚǚǚǚǚ"0/>KKhQٟVʜbŝlßu~Ʒ˳ϰԭ٨ڢ՞ћΙʗǗǗǗǗǗǗǗǗǗǗ"0/>KKhO٠Sʞ_Ɵiár|ǵͲҮتߢܜ֙җΕʔǔǔǔǔǔǔǔǔǔǔ!//=KJhM٢Pˠ\ơeänx¸ȴΰիݥ曑ݖהӒϑːȐȐȐȐȐȐȐȐȐȐ!//PUQhS{WԞ_ʛkśuÛ~ŷʴϲҨϣˠǝś™%4%C>NUNhPzRա[˞fƝqÞz¹ǵΰԩ֡Н˚șŗ–%4%B>LULgMyNդV̡aơlâv÷ʲҬؚ۠ї̕ȔœÒ$3%B>JTJfJxK֨Qͦ[ǥeħpzö˯֥族ړґ͐ɐƏÏ$3%A>HTGfGwG٭KϬTȬ^Ưh±s}˥Քޏڍӌ΋ʋNjČ$2%A>FSDdCuB۴DҵJ˷Sʾ_n|©˜ҍ؆هӇχˇȈňˆˆˆˆˆˆˆˆˆ#2%@>CRAc?s=޾;?J]o}ãɖΊӁՁ҂ς̃ɄƅÅÅÅÅÅÅÅÅÅ#1%?>@Q>;O7]3j1u)8Ocsďȇʀ|zyz|}}}}}}}}}}!.%<>6L0Y,b'm&jNCdTH^YL[_OXdRUiTSmURqWPtXOxYN{ZM[L\K]I^H_H_H_H_H_H_H_H_H_H_$y3"p;*hB1aJ6\Q;WW?S]BPbDNgFLlHJpIItJHwKF{LEMDNCNBOAPAPAPAPAPAPAPAPAPAP' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K0YCcTidprz~≂܅؂}{ywvtsrqqsttttttttt' ;K0YD`UfdmswጀۈՅ҂}{ywvutsuuvvvvvvvvv' ;K0YD^Udejts}ًԈЅ͂}{yxvuvwwxxxxxxxxx' ;J0XD\Uaegtpߏz؍ҋ·˄ȁ}{ywvxxxyyyyyyyyy' ;J1UDYU^edtlޑv؏э͊ɇƄā~{ywxxyyzzzzzzzzz& ;I1SDWU[eathޓr֑{ЏˍNJĆÃ{ywxyyz{{{{{{{{{& :I1QDTTXd]tcޖm֓wБʏƍɄ{yxyz{{|||||||||& 9H1ODRTUcZs_ޙi֖rϓ|ʑŐË{yz{{|}}}}}}}}}}& 9G1MCOSRcVr[ߝdךmЗwʔŒŽ{ijzī{¦|}~& 8G1KBMRPbSqW^؞gЛqʘ{ŕ’ŷ|ɫ|Ǥ}à~& 8F2IBJQM`PoT}Xڤbҡk˝uƚ˜¶ˬ}΢ɝĚ& 7F2GAHPJ_LmP{Tܫ\ԩeΦoȣzßİΠљʖŔ& 7E2E@FOG]IkLxOߴUٵ_ӵiεv|ġΔҐˏƎŽ& 6D1C?CND[EhHtL~Q[kƽqxÔ͉҇̈ljÉ& 6B1@>@L@YAdDoIwR|bhnvπ̂ǃĄ& 5?0==hOCbUG]ZKY`MVePSjQQnSOrTNvUL{VKWIXHYGZF[E\E\E\E\E\E\E\E\E\ ~)u5#l<*dC/^J4XP7TV:Q[Kd@JhAHlBFpCEtDDxEB}FAG@H?I=J=J=J=J=J=J=J=J=J| q$g,_5Y=!TE&OK)LR,HW/F]0Da2Bf3@j5?n6=s7KKPXUdZpa{iޚsו~Ўʅ}xy{}~ 4B$C0E=HILUQaWl]wcm֞y˕~|~ 4A#A/B;EGISN^ShZra{ۯn̦v~ 4?"?.@:BEFPKZRcYk߽drѶlĬsz4=!<-=8@BDLIUQ\Zaboɼipw4; 9+:5=?BGHNQR[Y`mgmt}x|386)82:;?AGETEWX^kd~krzvorwz}~353'4/65=8H8MEVV\ib{howxnhiosvxz{{{{{{{{300#/)2-;,@:HLN\Vl]zem}vsălgefknqstttttttt1-*)"-!3,XFeOpXzzdsmmvhdЈ`ϒ^Ν\ͩ[ιYȚZʜ\ɝ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ  "'-96J?XHcRmz\urd{mmhud~`؆]֏Z՘XԢWԮVԼV͐VђWѓWѓWѓWѓWѓWѓWѓWѓ   #*.;8IBUL_zVgs^mkdrflwbtz_|}\ZߋWޓUݜTܥRܯRܻQ̅RڅRڅRڅRڅRڅRڅRڅRڅ  $*09:EFOzQXrX^k^ceeh`lk]rnZypWrUtSvQwPxNyMzMzLzLzLzLzLzLzLzLzظ '(35??yJGpQNiWSb]W^d[Zj^Wp`TvbR|dPeNgLhKiJjIkHlGlGlGlGlGlGlGlGlݯż *#~6-vA6mHk2CE@K=P;U9Y7^!5b"4g#2l$1r%/w&.}'-(+)+)+)+)+)+)+)+)+)vs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvst1 rBtO'xX3y`?wiJsqTq|\nckiimgqetdvbxay`{_|^}]}]}_}`|b}b}b}b}b}b}b}b}wtu1 sBwM'{V4|_@zgKwoUsz^qenkkpisgweyd{b}a~`_ŀ^Ё_ڀaހb߀c߁d߁d߁d߁d߁d߁d߁d߁xuv1 tBzL'U4]@~eLznVvw_tfpmmrkviyg|e~cba`DŽ_ӄaڄc݃d܄e܄e܄e܄e܄e܄e܄e܄e܄yvw0 vB~K'S4\@dLlVzt`whsoptmyk|hfecbaɇaՇdڇeڈfوgوgوgوgوgوgوgوgوzxy0 xAI'R3Z@bLiW~qa{{iwqswp|mjhfdcb΋d֋f֋g֌h֌i֌i֌i֌i֌i֌i֌i֌i֌{yz0 |?H&P3X@_LgWnaxj{rwys~oljgedďdҏgӏhӐjӐkӐlӐlӏlӏlӏlӏlӏlӏlӏ|z{0 >F&N2V?]KdVkask~s{zvrnkhfeʓhѓjДkДlДmДnѓnѓnѓnѓnѓnѓnѓnѓ}{|/ <E%M1S>YJ`Uh`pjyt|zuqmiggΗk͘l͘n͘o͘pΗqΖqϖqϖqϖqϖqϖqϖqϖ~|~/ ;C$K0P(B2G;MDTM[UܰeaΨlqßt|§åţƢȟȟȟȟȟȟȟȟ- 49<&@/E8K?SF\MӶb`ƭipqy¨æŤƢȠȟȟȟȟȟȟȟ+ 279$=,B3I9R>XL̺`_gon~v~~¨æŤƢȠȟȟȟȟȟȟȟ* 146!:(@-H1Q7VK^]enl}s{ytwz§|å}ţ~ơȟȟȟȟȟȟȟȟ( 1236"=&G&L5TI\[cljzqywpln§ræuĤwƢxǡzȟzɞzɞzɞzɞzɞzɞzɞ& /./2:DJ3RGZYaigxnvyohdeŤjţmƢpǡrȟtɝuʝuʝuʝuʝuʝuʝuʝ$ + )),7AI0QDXV_fetl|tqib^]ɞbȟfȟiɞkʝn˛n˛n˛n˛n˛n˛n˛n˛#' " $ 0=$F4NDVR]acokztsk~bȌ\ȜYȱWΖ[͘^̙a̙d͙g͘g͗g͗g͗g͗g͗g͗g͗!  .:)C9JHPVWb_lvhulr}c~\،W؝TװT͌UӏWґZѓ\ѓ_ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ  ,7.@=HJOVV`v^ilepdpw^||YVޗSݦQܸQԄSڇT؉V׊X֋Y֋Y֋Y֋Y֋Y֋Y֋Y֋ ٿ ,!70@>HJPTwW]m]defj_pnZzrVvSyQ{O|M|M|P|QRށSށSށSށSށSށSށSށ ۷ ,#71A=IGxQPnWWe^\`fa[oeVxhSkPmNoLqJrIrHrKrNsNtNtNtNtNtNtNt ެ˺!.#9/B9wJBmPIeVN_^SZeVUmZRu\O~_LaJbHdFeEfDgCgEgFgFgFgFgFgFgFgʹ $0 ~;*tB2kH9cN?]UCX]GSdJPkMMrOJyQGSETCVAW@X?Y>Z>Z=Z=Z=Z=Z=Z=Z=Zҭ &|1q8"h>)`E/ZL3TS7PZ:L`Fm@DtBA{C?E=F;G:I9J8J7K7K7K7K7K7K7K7K w# m*d1\8U@"PH&LO)HU+D[-Ba/?g1=m2;s39z5765738291:0;0;0;0;0;0;0;0;| of^! V)P2K:FABH?N5D2I0N.S,X*])c'i%o$w"~!hd#_/^@cKgT%h]/fg9drAb}H`N]R[VZYX[W]V_U`TaTbScRcRcScTcVbWcWcWcWcWcWcWcie#`._@fIjS%k\0ie:gpBd{IbO_T]X[[Z]X_WaVbUdUeTeSfSfUfVeXeYfYfYfYfYfYfYfjf"a.`?iHmQ&n[0ld:inCgyKdQaV_Z]][`ZbYdXeWgVhUhTiUiWhYhZi[i[i[i[i[i[i[ijg"b.c>lFqP&rY1pb;lkDivLgRdXa\_`]b[eZgYhXiWjVkUlWlYk[k\l]l]l]l]l]l]l]lkh!c-g<pEtN&vW1t`;piEmsMj~TfZc^ab_e]h\jZlYmXnWoWoYo\n]o^p_p_p_p_p_p_p_pli!e-k:tCyL&zU1y]\IdSk]vfoxwr~mjhhЌkՍmՍo֌p֋q؊qىrڇrڇrڇrڇrڇrڇrڇspu&, 6@F'L1R;YE`OhYߎscՆ}nxxsomlȑnґpӐrԏsՍt֌t؊uىuىuىuىuىuىuىtqx$+ 5>C$I.P7VA]JߝgTԕobˍxnÅyyurqsДtђvґwӏwՍw֌x؊x؊x؊x؊x؊x؊x؊ur{#) 4<A"F*M3T<[DףcS̚lb“un~y{xvwϖyДzђzӐzԏzՍz׋z׋z׋z׋z׋z׋z׋us}!) 49>D&J.R5ܯYAϨaRŠiarnzy~|}͗~ϕ~Г~ґ~ӏ}Ս}֋}֋}֋}֋}֋}֋}֋vt ( 37;A"H(P.ԴV@ɭ_Qg`omwx˘ΖДҒӐԎ֌֌֌֌֌֌֌wt'2 48=F!ܿL,ιT?ñ]Pe_lltw|}zǘ|Ζ}Д~ҒӐԎ֌֌֌֌֌֌֌xu&/ 04:DH+ȽS=[Nc]jjqvzytqØsϖvДxґyӐzՎ{֌{֌{֌{֌{֌{֌{֌xv%+ , /6<G)Q;YLa[hhotw~yqlikДnђqґsԏuՍv֋v֋v֋v֋v֋v֋v֋yx#&%(07E'O9WJ_Xfemqu{z~qjebcґgӐjԏmՍn֌p؊p؊p؊p؊p؊p؊p؊{|! $5C$M6UG]Udbkm{svr|~jc^[[Ս_Սc֌f׋h؊jوjوjوjوjوjوjو|%6A!K3SCZQb]~igtqpk{xd~]XVUۆXڇ\ڇ_ڇaۆcۅcۅcۅcۅcۅcۅcۅ~ھ %5@!I/R>YK`Wvhampiezp^̆uX̕yȚ{Qͼ|P|SU߀XށZށ\߁\߁\߁\߁\߁\߁\߁ ۵ % 3>%G2N?UIv]Smf[eoa^zgX܆kSܕoPݦqM޻rMqNtPwRxSyUzUzUzUzUzUzUz ݫ͸ % 3='F3N>vUGl[NdcU]mZXw^SbNeJgGiFiHiKjLmNoOpOpOpOpOpOpOp б '4>'G2vN;lTBdZH]bMWkQRuUMXHZE\B^A_@`C`G_HaIcIcIcIcIcIcIcԩµ )5~@%tF-kL5cR:\Y?V`CPhGLqJG{LCN@P>R=T;U;UA;C9E8F6G5H5I4I7I7I7I7I7I7I7Iɫ~u' l/d7\>VE"PK%KR(FX+A_->g/;o18x364361708/:.;.;-<-<-<-<-<-<-<yne^' W0Q7K>FEAL=R9X6_!4f"1n$/w%-&+())(*'+&,&-&-&-&-&-&-&-}ui _WPI&D. ?6 ;= 7C3I0O.U,[*b'i%r#{!|peZQ IC=8&4-03-9*>'C%I #N !T Z a i r |  \W&Q2N<WE[N\X"[c+Yo2Wz8T=RAPEOGNIMKLLKMJNIOIPHPHPIPKPMOOPOPOPOPOPOPOP\X&R2Q:ZC_M_W#^a+\m3Yy:W?TCRGPIOKNMMOLPKQKRJRISJSKSMRORPSQSQSQSQSQSQS]Y&S1T9]BbKbU#`_,_k4\w;Y@VETHRKQNPOOQNRMSLTKUKULUMUPTQURVSVSVSVSVSVSV^Z%T1X7a@eIfS#d]-bh5_t<\BYGVKTNSPQRPTOUNVMWMXLXNXPXSXTYUYUYUYUYUYUYUY_[%U0\4e=jGkQ$iZ-fd6cp=_|C\IYMWPUSSURWQYPZO[N[O\Q[T[U\V]X]X]X]X]X]X]X]`\$V/`2j;oDpN#oW-ka6gl>cxE`K\OZSWVVYT[S\Q^P_P_R_U_W`XaYb[b[b[b[b[b[b[ba]#Z-e/o8tAvK#uT-q]6lg?hsFdL`R]VZYX\V_T`SbRcScUcXdZe\f]f^f^f^f^f^f^f^fb^#^*i-t5z>|H"{Q,xZ6sc?mmGizNdT`X]\Z`XbVeUfTgVgZg\i]j_j`jajajajajajajajc`"b'n*y2<F!O+X5{`>uiGotNjUf[b__c\fZiYjXkZk]m_naobocndndmdmdmdmdmdmda"f%r'~0 ;EM)U3^=}fFvpNr|Um\hbdfaj_m]o]p^p`rbsdsesfrgqgpgpgpgpgpgpeb!i#w%/ 9CL&S0[:cDlMywUt]nciifncqatauavdwfwhwivjujsksksksksksksfc!m {#. 8AJ#Q-Y7`AiJ߁tSz~]teolkqhufxeze{h{j{kzlxmwmvnunununununugd p~", 7@H N)U3]<ݏfGӈoSˁy^{funqtnxk|j~jl~m}o|pzpypwqwqwqwqwqwqwhd s +5>DK%R-ߝZ7ӕcFʎlSÇu^~g{owuszp~ooʂpށq߀r~s|szsysxsxsxsxsxsxifv*4 ;AH O'آV6̚`EÓiRr^zgo}vy|vttńu݃vށvw}w{vzvyvyvyvyvyvyiix(2 7=DݭK$ЦT5Ɵ^DfRo]wgow~}{zyz܄z݂z߀z~z|yzyyyyyyyyyyyyjk{&03 9AֱG#ʫR4\CdQl\tf}ov}ۅ݃ށ~}}}{|z|z|z|z|z|zkm~$,/4 ݺ:еF!ůQ2ZBbOj[reznv||ywׅx݃zށz{}|{|z|z|z|z|z|zkp"&)/ֿ6ʺD O1X@`NgZodwmu{ztqoхq݃s߁u~v}w{wzwzwzwzwzwzls !&4 ľBM/V>^LeWmbuk~ryyr~mig̓iނl߀o~p|rzryryryryryrymv2 @K,T<\IcUk_rhy{orvk{fb`ʀbe~h|j{lymxmxmxmxmxmxn{ڻ / =I)R8ZFaQh[zpdrykkqdv_z[|Y|Z{^{azcyfwfwfwfwfwfwfwp ٳ Ͼ ,;F&P5XA_M|gVso^kwedk^pYsUuTuSvWvZv\u_t`t`t`t`t`t`tr ٩ε )7D!M0U<}]GtePlmWev^^ācYÎhTÝkQîlOmNmPoSpUpXpYpYpYpYpYpYpwޠϮĹ )7BL)T5u\?mdHelO_vTYҁYTю]Pѝ`MҰbKbJbKfMhOiQiRiRiRiRiRiRi ҦIJ * 7B}J)tQ3kY:daA^kGXuKSOOSKUIWGWFWFYG\I^J`K`K`K`K`K`K`ٞǬ , 9|AsI'jP/bW5\_:Vh?RqBM|FIIFKCM@N?O>NBOCQDSETETETETETET˦ . y7p?hF"`M(ZT-T\1Oe5Km8Gw;C=??D>F>F>F>F>F>FП{t* l3d;]CWJ QQ$LX'H`*Dh,@q.<{192543617/8.9-919393939393939}vme$^- X6R=LEHLCS?Z>>>=>=?>>@>C=D>F?F?F?F?F?F?P K*E5J8M=QHRRQ^Oj%Mw+J/H3F6D8C:B@?@@?@?@>A@@B@E@FAHAHAHAHAHAHAQL)G4M6Q;UFVPU\Rh&Pt,M1J5H8F;EC?CABAABAC@C@CCCFBHCIDJEJEJEJEJEJERM)J2P3U9YCZMYX Vd'Sq-P}3M7K:I=G?FAEBDDDECEBFBFCFFFIFKGLHMHMHMHMHMHMHSN(N/T0Z6^@`J^U [`(Xm/Ty4Q9N=L@JBIDHFGGFHEIDJEJGJJIMKNLOLQLQLQLQLQLQLTP'R,Y-_2d<fGdR a\(]h0Zu6V;R?OCMELHJIIKHLHMHMHNKMNOPPRPSQTQTQTQTQTQTQUQ'V)^*d/j:lElO hY(dc0`p7\|=XBUFSIQKOMNOMPMQLQMQPRRTTUVUWUXUXUXUXUXUXUWR&Z&b&j,q7sBsLpV(k`0fk8cw>_D[HXLVOUQSSRTQUQURVTXVYXZZZ[Y\Y\Y\Y\Y\Y\YXS%^#g#p*w5 z@zJxS&s\/nf7ir?e~EaJ^N\RYUXWWXVYVYV[X]Z^\^]^^]_\_\_\_\_\_\YV#b l u(}3 =GP${Y-vb6qm>lyEhKdQaU^Y\[[^Z_Z`Za\b^b`baabac_c_c_c_c_c_ZY!fpz&1 ;DM!V+~^4yi=ttEoLjSfXc]a`_c^d^e_f`fbfdeedecfbfbfbfbfbfb[\iu~$.8BJR'[0݁f:zpEuzNpUl[i`fddgcibjcjdjfighhgifidididididid[_ly!,6 ?GO"܎X-҇b:ʁlE{uNvVr]nbkfijglgngnimjlkjlilglflflflflflf\bp|)3 <DߚKӔU,ʍ_9‡iEqO|{Wx^tcqhnllolplqmonnolojoiogogogogogog]dr&08 ?؟G͙R+Ē]9fDnNwW}^ydvismqqqrqsrqsosmsksjrhrhrhrhrhrh^gu#,3ݨ9 ѣEǝP*Z8cDlNtW|^d|jynwrvtvtwrwpwnvlvjvivivivivivi^ix',֬4 ˧CN)X6aCiMqVy^djo}r|t}|u|}s||q|{o}zm}yk}yi}yi}yi}yi}yi}yi_k{ ݰ$а2 ƬAL'V5_AgLoUw]din|rwtuutsuqvow~mx}kx|ix|ix|ix|ix|ix|i`n~ֶ˴0?K%T3]@eJlSt[}bhymtqptmtmsoqpormsktitititititiaq ٵ ϹŸ.=I#R1[>cHjQrYz`xfrlmoirfserhpjnllmkninininininicu ܢԭ ϸ ɽ+;G!P/Y;aFhOpWxx^rdkifmbo_p^o`ncmfkgjihihihihihihgy ߚӦ̱ǻ(8DN,W8^BfKxmSqvZk`ed`h[kYlXkYk\j_iahcfcfcfcfcfcfk~ ̪֞Ĵ$5 BL(T3\>ydFqkNktTd~Z__ZbVeSfReRfUfXfZe\d\d\d\d\d\dp ݖΣĮ 1 >I#R.zZ8rb@kjGdsM^|SYWT[P]N^M]K_N`Q`S`U`U`U`U`U`U`wӛƨ ,:FzO'rX1j`8dh?^rEX|ITɈMOɕQLɥSJɹTISGUHXJYLZNZNZNZNZNZNZܓʢ ,9yCqM jV(c_/]g5Xq:S{>OوBKٖEH٦GFںHEGDIBMDOEPGRGRGRGRGRGRϛ~-v8nAfJ_R#Y[)Ud-Pm1Lx5I8F:C<@>?>>>=?=B?D@F@F@F@F@F@F֓ģyq+j6 c?]GWORW!M`$Ii(Fs*B~-?/<1:38465655476989898989898Ȟyskd'^1X; SCMKISEZAc>l;v!7#4%2'0(.)-*,*,*/*/*/*/*/*/*um e^W#R,L4H< CD ?L94%0,,2(8%>"DJQYcn|  rdTKD=7 1,($" ',16<BI Q Z fsD$?.<6@8A=AEAQ @]?j4B6D;DCEO D[Ah?u4@4A4A4A4A4A4G"A,E/I0L5M=NHMTKaHn E{%B(?+>.=/<1<2;3:4:5:5:5:5:5>5A7B8D8E8E8E8E8E8H"C,H,N-Q1S9UESQQ]Nj!Kw&H+E.D0B3A4A6@7?8?8?9?9?9@8C:EH@JAKAMAMAMAMAMAMAJ H'Q%X%]*`3c?bJ`U\a#Ym)Uy.R3P6N9L;K=J?J@I@IAJAJBJDLEOFPFQFQFQFQFQFQFL L$U!]!c'g1j< jGgRc\#_h*\t0Y5V9TeDbI`M^P]S[U[V[V\W]W^V`U`TaSaSaSaSaSaSPZepx$.8 BKW#yb/tl8ov@lFhKfPcSaV`Y_Z_[`[aZcYdXdWeUeUeUeUeUeUP]it}!*4= ܋HхT#^.zh8uq@qzGnMkRhVfYe\d^d^d^f]g\hZhYhWhVhVhVhVhVR_lx%/ޕ8 ӐEʋQ"…[.e8{nAwwHtNpSnWk[j^i`hai`j_k]k\lZlXkXkXkXkXkXTbo{(ؙ3̕BĐN!Y-b7k@|sHy|NvTsXq\o`nbmcnboao_o]o[oYoXoXoXoXoXVdr~ݞ ў1ǚ@L V,`7h@pH~yN{TxYv]tascrdsdtbt`s^~s\~rZ~rY~rY~rY~rY~rYXgu֣ˡ/ž>JT+]6f?nGvNT~Y{]ya}xdzxeyxexybyx`yw^yv\yuZyuZyuZyuZyuZyuZZix ݚ ٢ Цƥ,<HR)[4c>kFsM|SX]zav~ds}eq~eq~cr}`s{^tz\ty[uyZuyZuyZuyZuyZ]l { ܓ՝ ѥ ʪ*:FP(Y3a]xCXGTKPNMPKPKPJQLRNRPRQQQQQQQQQQv݉ʗ%4 |@uJmS#g\*ad0\m6Wv:S?OBKEHFGFGFDIEJGKILJLJLJLJLJLѐž y.r< lGeP_Y!Zb'Uk,Qu0Mρ4Iώ7Fϝ9DЮ;B;C:@>>@@BACBDBDBDBDBD݈ǘx tn+h7aB\MWVS_Oi"Ks%G~(D+B-?/>/>/<19496:8;9;9;9;9;9͒~tnhb*]5W? RHMQJZFcCm@x=!:#8$6&5&4&4&2(2+3,3,3,3,3,}qgb\W'R1M:HB DK AT>\;e8o5{20.,+********{oc[UPK#F,B4><:C7K4S1[ .d +o (| &$"! {n`TNIC?:%6,23/:+A(H%O"W `ly         |m_QGA< 72.*#&)"/5;BIQZf t   }m_PB:5/* &"#(-3 9 AIS^l|9'3254868;6C3N1[ /h -v+))((('''''''''(+-/////:'4181;4;9:A7K5X 3e1s/--,,++++* * * * + +,/!1"3"3"3"3"3";&50;/>1?6>=k;x977 6!5"5#4$4%4%4&4&4&5%5&6(8):)<*<*<*<*<*=%=*C(G)I-J6JAIM GZEgBt@> ="<$;&;':(:(:):):):);):+;-=.?.A.A.A.A.A.>%A&H$L%O)R3Q>QI OVLbJoG{ E#C%B'A)A*@+@,?-?-@-@-@/?1A2C3D3F3F3F3F3F3@$E#L R!V&Y/Y:YF VQT]QjNu!L%J(I+G,G.F/E0E1E1F1F2E5D6G7H8J8K7K7K7K7K7A#IQW\#`,`6`A ^M[XXdUp#S|'P+O.M0L2L3K4K5K5K6J8J:JO@OAQAR@S@T?T?T?T?T?FPYbhl$o.o8nDkNh[dg#`q*]{/[4X8W;U=T?SASBSCSDSETEVDWDXCXBXBXBXBXBHS]fmr!u)v3v> sJoWkb#gl+dv1a7^;\>[AYDXFWGWHXHXIYHZH[G\F\E\E\E\E\EKWakrx{$}-~9{FvSq^$mh,jq3g{8d=bA`E^G]J\K\L\M]L^L_J`I`H`G`G`G`G`GNZdov}'ۄ4ЁC|OxZ#sd,pm3lv:j?gCeGcJbMaO`P`PaObNcLdKdJdHdHdHdHdHP\h rzފ Ҋ0Ɇ@M}W#ya,uj4rr:o{@lDjHhLgOfQeReSfQgPgNhLhKgIgIgIgIgIR_k u ~ ֏̎.Ë= JU"~^+{g3wo:tx@rEoImMlPjSjTjTkSlQlOkMkLkJkJkJkJkJTa n x ܉ ؏ ГƓ+; HR!\+d3|m:yu@w}EuJrNqQoToU}oV|oT|pR{pP{oN{oM{nK{nK{nK{nK{nKWc p|܅ԌГ ʖ)9 FP Z*b2j9r?|zEzJxNvQ{uTxtVvtVutUuuSutQusOvrMvqLvqLvqLvqLvqLYfsֈϐʖĚ&7 DNW(`1h8p?xDI}}Mx{QtzTqyVoyVnzUnzSoyQpwOqvMquLquLquLquLquL[iw݂Ћɓę$4ALU'^/e7m=uC{~HvLrPnSkUhVgUhSi~Qj|Ok{MlyLlyLlyLlyLlyL^ lzֆˏė!2?JS%\-c5k;zsAu|FpKkOgRdTbUaTaRcPeOfMg~Lg~Lg~Lg~Lg~La o~ЉƓ /=HQ"Y+a2yi9tq?oyDjHeLaO^R[RZR[P\O^N`LaKaKaKaKaKdtڂˎ,: EOW(y_/sf5mn;hw@cE_I[LWNUOTNTNUMXLYK[J[J[J[J[JhyчŒ(6 BLxT#r\*ld1gl6bu;]@YCUGQIOJNININIPIRHTGTGTGTGTGnʍ#2~>wIqRkZ%eb+`j0[s5W}9S=O@LBJCIBHCGDIDKDMDMDMDMDMDu҆Ó {-u: oEiOcW^_#Yh(Uq-Q{0M4J7G9E:D9C;B=B>D>E>E>E>E>E>}ɍytp&k5e@ `K[TW]ReNo#Kz&GȆ)DȔ,BȤ.@ȸ/?/?0=3;5<6=7=7=7=7=7цxne c`-[:WF SP OYKbGlDwAׄ>ؓ <أ!;ٷ":":#7'6)4+6-6-6-6-6-ŐwlbZXT)P5L?HIES B\ ?fC;K8T6]3h 0t . ,*(''&&%%%%%vi]QIFB>!;*734:0B-J+S(\%f"s         vi[NC>: 62/#+*(1$7!?FNXcpwhZL@72.*&# &+28@H R ]k}xi[K>2+&!  $ *07@JVdu/++2/104/9+A'L#X!f t    !""""/+.02/3126/>+I)V'c%q$~ # #"""""""""""###$&''''0*1-5+7-624:2E/R-`,m *z )(((''''''''(((')+,,,,1)4)9(;*<.:69B7O5\3i 1v0/..--------..--/122223)8&=$@%A)B3A>?J=W ;d 9p7}655443333345433 6!7!8!8!8!8!5'="B F H%J/I:GFER C_ Ak?w=<<;;:::::;:!:#:%:%<&=&>&>&>&>&9$AGKO"Q+Q6OALM KZIfGrE}CBBA A!@"@"@#A#A$@'@)?*@*B*C*C*C*C*C*< EKQVX'X1W<UH RTPaNmLxJI H"G$G%F&E'E(E)F*E-E.E/F/H/I.I.I.I.I.@IPV\_#`,_7]BZO X\VhSrQ} O$N'M)L+K-J.J/J0K0K2J3K3L3M3N2N2N2N2N2CLT\aef'f1e=cJ `W]bZmWw#U'T+R.Q0P2O4O5O6O6O7P8P8Q7R6S5S5S5S5S5FPX `fjl!m+l7jE gRc^`h ^r&\{*Z.X1W4U6T8T:S;S;TX?X@Y?Y?Z>[<[;[:[:[:[:[:LV ` h o swyy.w> tKpVm`!ji(gr-ez2c6a9`<^?]A]B]C]C^A_@_>_=_<_;_;_;_;NX clsx{ ~~+|;yHvSr]!of(mn.jw3h7f;e>cAbCaEaEbEbCcBc@c>c=c|g=|g=|g=|g=R]irzʃņ&6CN|X y`'wi-tp3ry7pwj>wj>wj>T _lv}Ƀć#4ALU^&|f-yn2wv7u;t?|rCxqFupHsoIqpIqpGqqDrpBroArn?rn>rn>rn>rn>V boýŇ 1? JS\%d,k1}s6~{|;zy?vwBrvEouHluIkuIkuGkuEluCmsAmr?mr?mr?mr?mr?Yer|DŽ /< HQZ$b*i0|q5xz:t>p}Bl|Ei{GfzHd{Hd{Ge{DfzCgxAhv?hv?hv?hv?hv?[iv̀È ,: EOW"_({g.vo3rw8m_A\DZEXEXDXCYA[@]>]>]>]>]>bq~È%4@ JyStZ#ob(jj.fr2a|7]:Y>V@SARBRAR@R?U>V=W=W=W=W=gvɃ!0< xGsPmXh`$dg)_p.[y2W6S9P;N=L=L2@2A2A2A2A2|Š|phfc-^9ZDVN RWO_KiHsE~B ?"=#<#<#:&8(7)8*8+8+8+8+Ʌ|qf[WV#S2P>MHIRF[ Ce@o>{;ω9ϙ7ϫ664210!/!/!/!/!}qf[PG FE'D5A@?K=U:_8i5v 3 1 / .--+*)((((~qeYND? =;#9.684B1K/U-_*k(x&%#""!!     qdXLA85 30.'+0(8&@#I!R]iyrdVI>4.+ (%"&-4<DNYg w   sdVH;0'#  !' . 6>HTbsteVG9-#   &.7AM\m$/%/(/'1$6 >IVdr    %.)-+,+.)3$;FSan{       &-,).(/*-/)7'C$P"] jw             !!!!**/&2$3%2*14/?-L*Y(f&r%~%% % % % $ $ % % % % & & &%%&''''.&4"7 9!8%9/8;5G3T1a/m.y - - , , ,,,,,,---,,,-....2#8<>@"A+@6>B xJuSs\qd"ol'mt+l|/j2i5|h8yg:vf;tf#="=#<%;&;&;&;&;&;&zui^[Y$V1S=PGMPJY Gb DlAw><98775433 3 3 3 vk_TL KI(H5E@CJ@S>];g9s 7ǀ 4ǐ 2ǡ1ȵ00.-,++++xk`TJ@:98(756@4K3U1`/l-z+؋*؝(ٱ''& % $ # # # # yl`TH>5- ,+)*(5'?&J$U#a!n ~zl_SG<2*% #!"+4>HR_n      |m_RE9/&!(0 9 C N\l}n`RC7+"  "*3=IWi~paRC5)  #+6CSez/ ,!,.3<F T a o {                      -#)$)"+08CP^kw#*&&(%''#+3@MZgs~&&*", +"(&'0$<"IUbnz     *".000"0,.7+D(Q&]$i#u#########$$%%$ % % $ $ $ $ $ .35588'734?2K/X.d-o,z,,,,,,,, , -- , -,,,,---27:<?@">-<9:E8R7^6j5t5~44 4 4 3 3 3 3 4 44444344446;> CFFF&D2B?@L?Y>d=o}H |Q{zYwy`swhovp!lux%it(fs+cr.`q/^q0]q0]q.^q,^p+_p)`o(`n(`n(`n(Ubmu{.;~E zNuVq^n}fj|m g{v#cz'`y*]x,Zw.Xw/Ww/Ww.Xv,Xv*Yu)Zt(Zt'Zt'Zt'Yfqz +}8xBtL oTl[hcdkat!]}$Z(W*U~,R~-Q~-Q},R}+R|)S{(Tz'Tz'Tz'Tz'^kv~~{'v4r?mI iQeYb`^hW{!T$Q'O)M*K*K)L)L(L'M&N&N&N&cp{zur"o0j;fEbN _V[]XeUnQxN K#I$G&E&E%E%E%F$F$F$F$F$iv~pkhf*b7_A[JXR TZQbNkKuHEB@ ? ?? >!>!?!?!?!?!p}wi`][$Y1V<SEPNMW J_ GhDsA><:998777777xznbUPNM(K5I?FIDRA[?d+<6;A9K7T5_3j1w/-+**) ( ' ''''rfZOD:0.-,)+5+@*J(V'a&o$#ϑ!ϥ н tg[NC9/' &1<HUbrvh[NB7-$&0: F S b txi[M@4*!  $,7BPauyj\N?2'  '1>M_u|l]N?1%  !+9J]s,)(+0 8DQ^lx)&%',4 @N[ht&!" !#'0<J W c o z                ""$$"",8ER^ju&((&&&(#4 @MYepz*---.-",.):&G$T#`"k"u"~""""""###$$%%%%$$$$.12 4553'14/A-N,Z,e,p+y++++++++,-- - - - - , , , , 15 6: <;97+695G5T5`5j4s4|4433 3 3 3 3 4 4 4444444458<@A A?<"=1>A>O>Z=d=nCKQTTRQS"U3TATLSVQ_ PgOoNwNMLLKKKKLLLMLLLL@GPVYZXWYZ/Z=YIXS W[ VdUkTsS{RQQPP P!P!~Q }Q}Q}Q}Q}Q}Q}QBJTZ^_^\ ^`+`:_E^P \X [`ZhYpXwWVV~U!{U"yT#xU#wU"vV vVvVvVvVvVvVENX^bdcacd(e7dCcMaU `]_e^l]t~\}|[yZ wZ"tY$rY%qY%pZ#oZ"oZ pZpZpZpZpZHR[bfhhfgi%i4h@gJfS e[db~cj{brxazv`s_!p^#n^%l]%j^&i^$i^"j^ j^j^j^j^j^JU_ejlljkm"n1m=lGkP jX|h`xggvgosfxpemd!jc#hb%fb&db&db%db#db!ebebebebebLXbinppnprr.r;qE}pN znVvm^slepkmmjujigi!eh#bg%`g&_g&^g%^g#_g!_f`f`f`f`fO\emrutst vw+w8|vCxuL ttT qs[nrckqkhpseo|bn _m"]l$Zl%Yl%Xl%Yl#Yk!Zk[k[j[j[jS`iqvyywy {|({|5w{@szIoyQ lxYhwaevhbup_tz\tZs!Wr#Ur$Sr$Sr$Sq"Tq TpUpUoUoUoWdmu{~}}|x$u2q=mFiO fV c~^`}f]|nZ{wWzTzQy!Oy"Ny"Mx"Mw!NwNvOuOuOuOu\hrzytq n.j9gCcL`S ][ZcWkTuQNKIH GGH~H}I|I|I|I|anx{pk hf)b5_?\HYPVX S`PhMrJ}HECBAAAABBBBgt~uga^\#Z/W:TDRLOTL\ Ie GoDzA?=;;:::::::n{{nbWRQO(M4K>IGGPDXBa?k =w : 86544333333wsg[OGDCA+@7?A=J;S9\7g5s20.- ,, + * * * * * xk_SH=6 43!2,170A/K.U,`*m){'%$##"!!!!!{naUJ?4+$ ""!* 4?JVcsDžǙȮ}pbVJ>4*" %0<H V e x ֍ ؤ ؾ   rdWI=2(  $.:GVg{teWI<0%  !+7EVh~vfXJ;.#  '4CUixhYK;-! "0@Si(%% '-5AO\it~%"!# (0=KXdpz"" ,9FS`kv(4 A N[fqz     !! $/<IUaku~%%$ ##")5CO[fpy() (+ +)&"#.!; I U `!j!t!|!""""###$%%%%%%%%%, -.11 /+)%(3(B*O+Z+e+n,v,~,,,,,,,--....----/15763/.1,3<4I5U5_5h5p4x444444 4 4 5 5 5 5 5 5 5 5 5 35:>@=7 8:&=6>D>P=Z=c=kGPVXYVSTV%W4W@WJVSU[ Tc TjSrRz}R{QxPvPtPsPqPpQpQpQpQqPqPqP@KTZ]^[XY["\1\=\G[PZX Y` ~Yg{XoyWwvVtVrUoUmTlTjUjUjUjUjUkUkUkUCOX]ab`\^`a.a:`E`N~_V {^] x]ev\ls\tp[}nZkZiYgYeYdYdYdYdYeYeYeYeYFR[aefcabde+e7eB|dKxcSuc[ sbbpajm`rk`{h_f^c^a]`]_]_]_]_]`]`]`]`]JV^eiigef hi(~j5zi?viIshQpgY mg` kfghepedycd`c^b\bZbYbYbZbZa[a[a[a[aMYbhmmkik m|n%xn2un=qnFnmOklV hl^ ekecjm`iv]i[hXgVgUgTgTgTfUfUeVeVeVeQ]flqpon}pxrus!rs/os:lsDirLfrTcq[ `pc ]pk[otXnUnSmQmOmNmNlOkOkPjPjPjPjUajqutt|svuqwoxly+iy7fy@cyI`xQ]wX [w` XvhUuqRu|PtMtKsIsHsIrIqJqJpKpKpKpZfovyxxwyo|j} g~d&b2_=\FZNWUT~] R}e O}oL|yJ|G{E{D{C{CzCyCxDwDvDvDv_kt|~}~rfa^\!Z.X8UBSJPRNZKb Il Fw CA?=<<<===~=~=~fq{ym_XTRP'O3M=KEINFVD_Bh?s = : 8 766555666myrfZPI GE D+C6A@@H>QKZj~̫̔|n`RE9.#  '1>K[nބߛߴpaSE8,!  $/<K]qrcTF7*  +9J^tteVG8*  (7J^v$" !$)2>LYepz! #-:HUalv )6CP\gqz $0>KWblu~ + 8EQ\fpx   $0> J V a j s { " ! ! (6COZdmu}&%&'%! -<I U!_"h"p#x###$$$$%%&&&&&&&&)(-0/+" #&'(6*D+O,Y,b,j-r-z--------..//....,.5996/-0!214>5J5T5]5e5m5t5|554445556666555/4<AB@:69;,<:=F=P=Y=a=h @B'C5DBDLDUC]CdCkBsB{B A A A A~A|AzB yB xB xB xB xA xA 6@HMNMIEFH#I2J>JHJQIYI`IhHoHw G }G zGxFvFuFsFrGqGqG qG qG qF qF 9DLQSRNJKM O.O:OEONOVN]~Nd|Ml yMt wL} uLsLqKoKmKlKkLjLjLjK jK jK jK =HPUXVSOPRT+T7TBTK|TSzSZxSbuRi sRq qQz nQlPjPhPfPePdPdPdPdPeO eO eO ALTY\ZWTU WX'Y4}Y?zYHwXPtXXrW_oWf mVn kVw hUfUdTbT`T_T^T^T_T_T_S _S _S DPX]_][XZ [}\$z]1w]<t]Fq]No\Ul\]j\d h[l eZu cZaY^Y\X[XYYYXYXZXZXZW ZW ZW HS[aba_\^{_xa!ub.rb9obClaKjaSgaZe`b c`j `_s ^^}[^Y]W]U]T]T]T]U\U\U[V[ V[ LV_dedcaybudreof+lg7jg@gfIefQbeX`e`]dg [dp Yc{VcTbRbPbObObOaOaP`P`P` P` OZcihggyesgoiljik(gl4dl=blF_kN]kVZj]Xje Vin Six QhNhLgKgIgIgIfJfJeKe Kd Kd T^gmlkkskmmhn epbq$`q0^q:\qCYqKWqSUpZRpbPpk Nou Ko InGnEnDnCmDlDkEk Ej Ej Ej Xclqpozonpes`u]v[wYx+Wx6Ux?SxHQxOOwWLw_JwhHvs Ev Cu Au?u>u=u>s >r >q ?q ?p ?p ^iquttutiv^yX|T}R~Q&O1M;LCJKHTF\CeAp?~|<~ :~ 9~ 7~ 7} 7{ 7z 7y 8x 8x 8x doxyy{ypzd|XPK HG E+D5C>AG@O>X4*!! + 6 A N \ l teWK@5*!  "+6BP_qćĝĵxj\OA5)  !*5CRcxՏէ{l^PB4(  '3BTg~}n_QB4'  $1AUjqaRD4&!/AVm  %.;IVbmv  *7EQ^hrz%2@LYcmu}  ,:GS^gpx  &3@MXajrz  +9FQ[dlt{   " 0 > J U ^ gov~ (7DOYaiqx"!'*)$"1 >!I"S#\$d$l$s$z%%%%&&&''((''''&)1440)#&(+*8+D,N-W-_-g-n.u.}......////////)18<<92- /1&344@5J5S5[5b5i5q5y5555556}6{6{6z6z6z5z5-7?CD@:679":/<;h >g >f?e?e?d?dWaihg{gqgeh\jXlTnRoPo$Np.Mp8KqAJqIHqQFqYDpbBpl@px>p0$  !,:J]rzk\M?0# +:Maym^O@1"  );Of"+8FS^irz&4BNZdmu} ".<IT_hpx   (6CNYbkry "/<HS\elsz  (5ALV_fnt{  -:EPYahov}   $ 2 >IS[cjqx#%$+8CMV]els{       &-0.(" &!3">#H$Q$Y%`%g&n&v&&''''((~)})|(|(|(|($.5861,&&(!*.+9,D-L-T.\.c.j.r.z//}/{/z/x/v0u0s0s0s/s/s/*5;?<83/.02)354?5I5Q5X~5_}5f{6ny5vx5v5t5r6p6o6m6l6k6k6j6j5j50:ACA>:65 78%:1;<|;Ez"z?.x@8uABsAJrAQpAYnA`lAgjAphAygAeAcAaA`A^A^A]A]@]@]@]@9CJKIGDA~AzBvCtE*qE5oF?mFGkFOjFVhF]fFedFmbFv`F^F\E[EYFXFXFWEWEWDXDXD=GNNLKI}ExFtGpHnI'kJ2jK<hKDfKLdKSbKZ`Kb_Kj]Kt[JYJWJUJTJSJRJRJRIRIRHSHAKQPON~LxHrJnK kMhN$fN/dO9bOBaPI_PQ]PX[O`YOhWOrUO}SORNPNNNMNMNMNMMMMNLNLDNTSRQzPrMlOhP eQcR!aS,_S6]T?[TGZTNXTVVT]TTfRSoPS{NSLSKSISHSHRHRHQIQIPIPHRWVUTvSlQgSbT_V]W[W)YX3XX<VYDUYLSYSQY[OXdMXmKXxIXGWEWDWCXCWCVCUDUDTDTLVZYX{XqWfVaX]YYZW[U\&S]0R]9Q^AO^IM^QL^XJ^aH]kF]vD]B]@]?]>]=\>[>Z>Z>Y?YPZ]\[v[m[a[[]V^R` PaNb"Mb,Lc5Jc>IcFGcNFcVDc^Bch@cs>co=o"JV`hpx~ +8EPZckry  %2?JT]elsz  ,8CNW_gmtz  $1<GQY`gnt{  )5@JS[bhou}  !.:DMU \ c j q x  ! &3>GPW^els|#)*&"!-8BKRY`gow~ } { y!w"v"u"t!t!t!!+11.*&! !(#3$=$F%N&U&\~&c|'k{'sy'|x(v(t(r(q)o)m)l)k)k)k(k((28752-)' (*#+/~,9|,Bz-Jx.Qw.Xu.`s/gr/op/yo/m/k/i/h0g0e0d0c0c/c/c/.8=<:730. /{0x2+v35t3>r4Fp4No5Um5\l5dj5lh5ug5e5c5a6`6_6]6]6\6\5\5\43<A@><96{4w5t7q8'o92m9;k:Cj:Kh;Rg;Ye;ac;ib;r`;}^;\;[;Y;X;W;V;V;V:V:V97ADCB@~>y;t:q:m<k=$i>/g?8e?@d@Hb@Oa@W_@^]@f\@oZ@zX@V@T@S@R@Q@P@P?P?Q>Q>;EGFEDyBt>o?k@ gAeB!cC+aC5_D>^DE]EM[ETYE\XEdVEmTExREQDODMELEKEKDKDKCLBLB?HJIH}GuEnBiCeD bE_F]G(\H2ZH;YICWIJVIRTIYSIaQIkOIvMIKIJIHIGIFIFHFHGGGFGFCLLLKyJpIiFdG_I\JZKXL%VL/UM8SM@RMHQNOONWNN_LNiJNsHMFMEMCMBMAMALALBKBJBJGOONNuMlLcJ^LZMVNTORP"QQ,OQ5NR=MRELRMJRTIR]GRfERqCR~AR?R>R=RW{?\F>]O=]W;]a:]l8]y6]4]3]1]1\1[1Z1Y2Y2XTYXXsWiW`XTYN[H]C_@`>a=a ;b):b29b:8cB7cK6cT4c]3ch1cv/c.c,c+c*c*b*`+_+_+^Y\\{[o[e[\\Q^I`CbKYi{w}uptbuUxI|?4+" "+5BP_q}x|i|[NA6,#  "+7ETf{qaSF9.#  !+8HZnyhYK=1%  +:L`wؒجp`QC5(  *<QggXI:* ,?Un%2?KV`hpx -:FQ[cksy  (5@KU^fmtz ".:EOX`gmtz'3>IRYagmsz !,8BKSZagmtz%1;EMU[bhnu|   )4>GOV\cipx   " . 8 A J Q X ^ e lt}~}zxwwww!$# '2<DLSZ`~h}o{xyxvtsronmmmm )+*($  "-~7|@zHyOwUv\tcskq tp n!l!k!i"h"f"e#d#d"d"d!&/10.+($ ~ {"x#)u$3s%<q%Cp&Kn&Rm'Yk'`j'hi(qg({e(d)b)`)_)^*\*\)\)\)\(,55431-|+y(v'r)p*%m+/k,8j,@h-Gg-Ne.Ud.]c.ea/n_/x^/\/Z/Y/X0V0U0U/U/U.U.1:9876z2u0r.n. k/i0!f1+d24c2=a3D`3K_4R]4Z\4bZ4kY5uW5U5T5R5Q5P5O5O5O4O4O36=<<;{:t7o5l3h4 e5b6`7(^71]8:[8AZ9HY9PW9WV:_T:hS:sQ:O:N:L:K:J:I:I9I9I8J8:@??>w=p;j8f8b9_:\;Z;%Y<.W=7V=>T>FS>MR>UQ>]O?fM?pL?}J?H?G?E?D?D>D>D=D=E<>CBB}As@k?e<`<\>Y>W?U@"SA+RA4PB<OBCNBKMCRKCZJCdHCnGC{ECCCBC@C?C?C?B?A@A@@AEEEyDoDgB`?[AWBTC QDOENE(LF1KF9JGAIGHHGPFGXEGaCHlBHx@H>HCKFBLMALV@L_>LjPC%cG#cQ"d\!didyddddca``_YX{XmXbXYXPYG[>^7`1c*f$i !j jj k(k0k9kBlLlXleltllllkihhg]]u\h\^\U\K^Ba9d2g+j$mps ttt!u)u2u;uFuRu_ un u u ut t s q q pbapadaZaObEe2' $1@Re}o_QC6*  $3DXnшФgWI;.! $6I_x_PB4& %9Og"/;GR[dlsz *6ALV_fmtz $0;FPY`gntz *5@JRZagmsz#.9CLT[agmsz (3=FMU[agmsz!,6?GOU[agnu}   %09AIPV\bipx~}|{{{{  )3<CKQW^dl}t|~z x w u s r p p o o o    # - 6~>|F{MySxZvauhsqq{pnlkihfeeee$$#!|y(v1t:rAqHoOnVl]kdimhwfdca`^]\\\\%*))(%}"yxvro#m-k5i=hDfKeRc Yb aa i_!s]!\!Z"Y"W"V#U#T#T"T"T"+...-|+v(r&o#m! j"g#e$)c$1b%9`&A_&H]&O\'V[']Y'fX(pV(|T(S)Q)P)O)N)M)M)M(N(02221v0p-k+h)f( c(`)^*%\+.[+6Y,=X,DW-LU-ST-[S-cQ.nP.zN.L/K/I/H/H/G/G.G-H-4555{5r4k2f/b._-\.Z/X0"V0+U13S1:R2BQ2IP2PN3XM3aK3kJ3wH4G4E4C4B4B4B4B3B2B28888w8m7f6a3]2Y2W3 T4R5Q5(O60N68L7?K7FJ7NI8VG8_F8iD8uC8A9@9>9=9<9<8=7=7=6;;;;s;j:b9]7X6T7Q8 O9M9K:%J:-H;5G;<F=<=:=9=8=7=7<8;8;8:=>>|>o>f=^=X;S:O;L<I=G>F?"D?*C?2B@:A@A@@I>AQ=AZ@@@xAlAb@[@T?N?J@FADBBC@C?D'>D/:EF9EN8FX6Fb5Fn3F|1F0F.F-F-F-E.D.C.CCCCtChC_CWCPCHCDEAF>G nJnWnenvnmmllkjjZtZfZ\YSYHZ?]6`.c&gjmqt w wwww$x-x7xCxPx^xoxxwvuutt~_n_b^Y^M_Bb9e0h'lptw {~ &0;HWh|weid_cRdGgGNU[agmsz#.7@HOU[`fls{ '1:BIOU[`gmu~ !*3<CIPU[ahp~y|{yxvusssss   $.6>}D|KzQyWw]vdtlsuqonlkihhggg  |y(w0u8s @r Fp Lo Sm Yl aj ii rg ~f d b a ` ^]]]]{xxw sp"n+l3j;iBgIfOdVc]af`o^{\[YWVUTTTT""##"y!sonm jge'c/a7`>^E]K\RZZYbWlVwTRQONMLLMM&''({'r&l$h!fdb_]#[+Z3X:WAV HT OS WQ!_P!iN!tM!K"I"H"G"F#E#E"F"F!*++,v+m*f)b&_$]"[!X"V#T$(S$0R%7P%>O&EN&LL&TK'\I'fH'qF'E(C(A(@(?(?(?(@'@'-./}/q/h.a-]+Z(W'T' R(P)N)%M*,K*4J+;I+BH,IF,QE,ZD,dB-o@-}?-=-<-:-:-:-:-:,:,012y2m2d2]1X/U,Q,O- L-J.I/"G/*F01E08C0?B1GA1O@1W>1a=2m;2{928262524242515150345u5i5`5Y4T3P0L1I1G2E3C3B4'@4.?56>5==5D<6L:6U96_76k66x472717/7/7/6050504667r8f8]7V7P6K4G5D6A7 ?8>8<9$;9,:939::8:B6:J5:S4;]2;h0;v/;-;,;*;);*:*:+9,889|:n:c:Z:S:M:F8B:?;<< :<8=7=!6>)4>03>72??1?G0?P.?Z-@f+@t)@(@&@%@$@$?%>&=&=;<x=j=_=V=O=I=B=<>9?6A4A2B1B/C%.C--C4,D<+DD*DM(DX'Ec%Eq#E"E EEDDC B!A>?t@g@\@S@L@F@>A8C4E0F-G +H*H)H"(I)'I1%I9$IA#JJ"JU JaJoJJJJJIHGGBBpCcCXCPCICBD;E5G0I+K&M $N"N!O O%O,O5O=PGPQP]PkP|PPPPONMME{FkF_GUGMGFG?G7J1L+N&P SU VVV V'V0V9WBWMWYWhWyW W W V V U TSIvJgJ[JQJJJCJ;L3N,Q&T!VY\^ ^^^"^* ^3 ^= ^H ^T^b^s^^^]]\[[NpNbNWNNNGN>O6Q.T'W!Z]`c f gggg$g-g7gBgNg\gmgffeeddczRjS]RTRKRBS9U0X([!_beh kn ooopp'q0q;qHqVqfqyqpoonmmsXeWZWQVFWHRZbiou{ !,8CLT\ciou{ '2<FNV\chnt{!+6?HOV\agmsz %/8AHOU[afls{)2:BIOUZ`flt} #,4<CIOTZ`fnw~|{zxxxxx &.6=C~I}O|Uz[yawiuqt|rqonmlkkkk  | z(x0v8t>sDqJpPnVm]ldjmhwgedca`````| y x usp#n+l3j9i@gFfLeRcYba`j_t]\ZYWV V U U V vqnm m j g e &c .b 5` <_ B^ H\ O[ VY ^XhVsUSQPNMMMMMwoifddb_]![)Z1X8W>VETLSSQ[PeNpL}KIGFEEEEE!"|"q"h!b_\[Z WUT%R-Q4O;NBMHKPJXHbGmEzCB@?>=>>>#$%w&l&c%]$Y"VTS QNM"K)J1I7G>F EE MC UB _@!j?!w=!;!9!8"7"7"7"8!8!&')s)g)_)X(T&Q#O"L"J"H"G#E$&D$.B$4A%;@%C?%J=&S<&\:&g9&u7'5'4'2'1'1'2&2&3%)*},o,d-[,U+P*L(J&G'D' B(A(?)#>)+=)2<*9;*@9*H8+P6+Z5+e3+r1+0,.,,,+,,,,+-*-*,-y.k/`/X/Q.L.H,E+A+?, =,;-:.!9.(7./6/65/>4/E3/N10X00c.0p,0*0)0'0&0&0'/(/(..0v1h2]2U2N1H1D0@/<0:1 71625233%23,13304;/4C-4L,4V*5a)5n'5~%5#5"5!5!4"4#3#213r4e4Z5Q5K4E4@4:374452607/7.7"-8)+81*88)9@(9I&9S%9_#9l!:| :::9988746n7a7W7N7H7B7<75829/:,; *<)<(=&=&%=.$=5#>=">F >P>\?i?y???>>=<<7z8j9^:S:K:E:?:9:2<.>)@&A$B"B!B C#C*C2C:DCDMDYDgDwDDDDCBBA;v<f=Z=P=H=B=<=6>/@*B%D!FH IIII&I.J6J@JJJVJdJtJ J J J I H G G>q?b@V@M@E@?@9A2B+E&G!IKNPPPP!P)P1 P; QF QQ Q_ QoPPPPOONM}BkC]DRDJDCCGOW]ciou|"-7@IPW]chnu| &0:BJPV\agmt| *3;CIOUZ`fmt} $,5<CIOTZ_fmv~&.6=CINTY~`|gzoyzwutrrqpppq !})|0y7x=vCtIsNrTpZobmjktjhgeeddccd~{wurq#o+m2l8j>iDgIfOeVc]be`o_{]\[YYXXXY }v q om kige&c-a3`9_?]E\K[RZYXbWlUxSRQPONNNNtlgec c a^\![(Y/X5V;UBTHSOQVP _N iM vK I H G F E E E E xme_\ZZZ W U S $R +P 1O8N>MEKMJUH^GhEuCA@>====>rg_YUSRR PNL J'I.H4G;EBDICRA[?e>r<:8755667{ m!b!Z!TPMLKIGED$B*A1@8??=F<O:X9c7o5~320///00"w#i$^$V$P#K"H FEC A?>!<';.:59<7D6L4 V3 `1 m/ |-!,!*!)!)!)!* + "%s&e'['S'L&G%D$B!?!=! ;!9"8"6#%5#+4$23$92$A0$J/%S-%^+%k*%z(%&%$%#%#%$%%$%$%'o)b*W*O*I)D(@'=&:%7&5&4'2'1("0()/(0-)7,)?+)G))Q(*\&*i$*x#*!****) )!((|*l+_,T,L,F,A+<+8*5*2+0+ .,-,,,*-&)--(-4'.<&.E$.O#.Z!/g/v////..--+x-h.[/Q/I/C/>.9.4.0.-/+0 )1'1&1%2#$2*#21!39 3B3L3W3d4t44333321.t/e1X1N2F2@1;16111+3(4%5#6 !6 77 7'8.868?8I9U9b9q999888761p2a4U4K4D4=48434-5(7$9 :; <===#=+>3><>F>R>_>o> > > > = = < ;}4k6]7Q7H7A7;75707*9%; =?AC CCCD'D/D9 DC DN D[ DjD|DCCCCBAx8g9Y:N:E:>:8:3:-;'=!@BDFI J J J J#J+J4J>JIJVJeJwJJIIIHHr<b=U>J>B=<=6=/>)@#BEGJL O P QQQQ&Q/Q9QDRQR`QrQQQPPOOl@]AQAGA@@9@2A*C$FHKNQ SVW XXYZ!Z)Z3Z?ZLZZZlZYYXXWWeEXEMEED>D5E-G%JMPSV Y\^_ ` abcd#d-d8dEdTdfd{ccbaa`_JSJJICH9I/L'ORUY ]`cfhij k mnpq&q1p>pNp_psoonmllZOPNHM=N3Q)T X\` dhkortuwx z |}(5EVk~}|{zVTNSBT7V,Z"_ch mrvz} ,;MbzUYHZ;]/a$flr w} !1CWpNa@d3i'nu| %7LdFk9p+w +@XtӒҰ>y1# 3Kd )4?HPX^ekqw~ #.9BJRX^djpv} (2;DKQX]chov~"+4=DKQV\agnv %.6=DJOUZ`fnw'/7=CINTY`goz~|zyxwxxwu !)07}=|CzHyMwSvYtariqsomljihiiii|ywvt#s+q1o7n=lCkHjNhTg[eccmbx`_]]\\\\\xtpm kihf%e,c2b8`=_C^I\O[VZ^XhWsUTRQQQQQR ~ s l heca _]\!['Y-X3V9U?TESKQRPZOdMoL}JIHGGFGG ukc^[ Z Y WUSR#Q)O/N5M;LAJHIOHWFaEmCzB@?>===>|nd\VSQP P OMKI%H +G 1F 8D >C EB M@ U? _= k< y: 8 7 5 5 5 5 6 vi^VPMJIIH F D C!B(@.?5><=C;K:T8^6k4y21/---./qdYQLGDCBA @><;%:+82796@4H3Q1\0h.w,*('&'()}m`VNHC@>=;9865"3(2/160=.F-O+Y*f(t&$"! !"#yi!\"R"J"D!?!< 9854 20/.%-,+3*;)C'M&W$d"r  u"e#Y$O%G%A$<#8#5"3 0 .! ,!+!*"("#'")�%#8##A"$J!$U$a$p$$$$$$##"q$b&V'L'D'>'9&5&1%.$+%)%'&%&$'#' "''!(. (6(>(H)S)_)n))))((('%n'_(S)I*B);)6)2(.(*(&)$*"+ +,,,$-+-3-<-E.P.].l.~.. - - -,,|(j*[+P,F,?,9,4+/+++&,"./0 1112!2(20293C3N3[3i 3z 3 3222 1 1w+f-X.M/C/<.6.1.-.).#02356 7778$8,85 8? 8J 8W 8e8v8877766s.b0T1I1A19141/0+0%2 368:< = = = =! =)=1>;>F>R>a>r>===<<<m2]3P4F4>47423-3'4"68:=? A C DDDD$D-D6DADND\DmDDCCBBBh6X7L8C8;75606)7#9;=@B EGI IJKK K(K2K=LILWKhK}KJJIIIb:T;I;@;9:39,:%<?ADG ILOP P QRTT#T,T7TDTRTcTwTSRRQQ\?O?E?>>7=/>'@ CFIL ORTWXY Z[]^_&_1^=^L^]^q]]\[ZZVDKCCBFLRX]cipx &/7?EKQV\ahpy  (08>DJOUZahq{|{y "*18>CHNT~Z|azixsvusqpoooml ~}|$z+w1u7t=rBqHoMnSlZkbilgxfdba`aaa`|wrp nllk%i,g1f7d=cBbH`N_U]]\fZrYWVUTTTUUunifc a`_^ ]&[,Z2X7W=VCUISPRXQaOlNzLKJIIIIJtjc^[YW VTSR"Q(P-N3M8L>KEJLHTG]FhDuCA@@??@@ y l a Z U R PON LKJI#G)F/E4D:BAAH@P>Z=d<r:9876667 re[SNJH G G EDBA @%>+=1<7;>:E9N7W6b4p210/..-.}l_UNHDA@@ @ > < ; 9 "8 (7 .6 55 ;3 C2 L0 V/ a- o+ * ( ' % % & ' wg[QIC?<:998 7542%1,02/:-B,K*U(a&o$#! scWME@;85432 1/-,"+)*0(7'?&H$S"_ m~o_SJB<741/.,+)(' %&$-#4"= FQ]k|}k\P G ? 941-+)'% $"! #*2:DN[izzgY!M"D"<"6"2!.!* ' $"  !!!"!"'"/"8#A#L#X#g#x# # # # " " !vd"V#K$A$:$4$/#+#(#$# #$%& &&''%','5(?(J(V (d (t ( ('''&&q"`$S&H'?'7&1&-&)%%%"%'(*+ ,,,,",)-2 -; -F -R-`-p--,,,++m%]'O(E)<)5)/(+(''#'(*,.01 1 1 1 1&2.272B2N2\2l2211000h)X*L+A,9,2+-+)*%* +,.024 7 7777"7*838>8J8X8h8|776665c,T.H/>/6.0.+-'-"-/1357 :; <=>>>&>/>:>F>T>d>w>==<<;^0P1D2;241.0)/$02469 ; =@A B CDEF"F+F5FAFOF_FsEEDCCBX4K5A59524-3&4 58:= @ BEGHJ KLNOO%O/O<OJOZNmNMLKKJS9G9>97817)7!9<?B EHJMOQRT UWYZY)Y6YDYTXgXWVUTTN=C=<<5;,<$>ADH KNQTWY[]^` bdgg"f.f<fMe`ewdca`_IBAA:?0@&CFJN RVZ]`cegikmo ruwv&v5uFtYtosrponFF@E5F*H LQV Z_chkoruwy{} +<OfFK:L.O#SX^ diotx| !1D[v?R2U&Z`g mt{ &9Pj7\+ahp x.E_~ɞȾ/i#py #:Tr !+5>GNU[afms{ $.8@HNTZ_ekr{(19@GMSX^dks| !*2:@FLQV\cjs~}| #+29?DJOU[ckv~|zywrpo %,28}={CyHxNvTu[scqnozmljihgedc{xv utsr%p,n2l7j<iBhHfNeUc]bf`r^][ZYYYXXyqmif edcc a&`,^1\7[<ZBXHWOVWT`SlQyPONMMMMMukd`]ZX WVVU!S'R,Q1O7N=MCLJJRI[HfFsEDCBBBCCxjaZURPN M LKJI"H'G-E2D8C>BEAM?V>a=n;~:988899o b X Q LIGFD CBAA?#>)=.;4::9A8I7R6]4j3z210///0 x h \RKE A ? >=< ;:98 6%5+40372>1F/P.Z-g+w*)('''' rcVME@<97 6 6 54210"/(..-4+<*D)N'Y&e$u#"  m^RHA;74200 0 / - , * ) %( +' 2& :$ C# M! X e u       {iZNE=830-+**) (&%$##)!1 9BLXfvweWKB:40,)'&%# "!  '.6@JVdt  saSH?72-)&$"  $+4=HTbr       o^PE<5/*&#! ")1;E Q ^ m k[MB:2-($! !!!!"& ". "7 "A "M"Z"i"|""!! gWJ!@!7"0!*!& "  !#$& & & & &"&*'3'='I'V'f'y'&&%%$c T"G#=$4$.#(#$"!"!"#$&( * ++++,',0,:,E,S,c,v,++**)_#P%D&:&2&+&&%#$$$%')+ -/ 00111#2,262B2O2_2r1100//Z'L(@)7)/))(%'!&'(*,. 024 5 6788 8(829=9K9[8n877655U*H,=,4,-+(*$)*+-/ 1 468:; = >@@@$@.@9@G@V@i@?>=<<P/C/9/2/,-', -/13 6 8;=@ACE FHJJJ(J4IBIQIdH{HGFEDJ3?36301*0#1358 ;>ACFHJLNO QTUU"T.T<TKS^StRQPONE7<756/4&57:= ADHJMPSUWX[] _bbb'b4aE`W`m_]\ZYA<:;49*:!<@C GKOSVY\_acegjm psr r-q=pOoenmkih?@9>.?$BFJ OTX]aehknqsux{~ $4F]v~|z?D3E(HLR W]chmqvz~ )<Rl8K,N SY `gntz 0F`~1U$[aiqy %;TqȒų)biq{ /Ie&0:BIPV\bhov  *3;CIOU[`gnv #,4;BHNSY_fnw~%-4;AFLQW^eny|vsr &-4:?EJPV^f~q|}ywusrnige  }&z-w3u8t>rCpIoOmVl^jhhugedba`\[Z~xsom lkkj h&f,e2c7b<`B_H]O\WZaYmW{VUSRRPOOxngc`]\ [[[Z!X&V,T1S6R<QBOINQM[KfJtIHGFFEEExlb[VSQOO NNML!J&I,H1G7E=DDCLBU@`?n>~=<;;;;<~naXQLIGED CCCB@"?'>,=2;8:?9G8P7[5h4x3211123vfYPIC@><;: :9976#5(4.342;0C/L.W-d,s+*))))*n_ S J B = 9 6543 2110/.$,*+0*7)?(I'T&`$o#"!!!!"{ h Z NE=8 3 0 . - -, +*)('!&'%-$4#="F!Q]lu dUJ@93/,)' ' ' & %$"! $+2:DO\k}q_QF=60+(%#"! !     " ) 1 9 C O \ k ~  m\NC:2-(%"  !(09DP] k |  iXK@70*&" %.7 @ K X gxeUH=4-(#   " ) 2 <GTcuaRE;2+%!   &/8DQ`r^OB8/)#     !#!+!5!@!N!]!o! ZK?5-'" ! " # $%%& &(&2&=&J&Z&l&%%$##UG ;N;`:w98765G);*2*+)%'!&'(*, /1468;=?A CEEE!E,D9DHD[CqBA@?>B-8./-)+$**,. 1 47:<?ADFHJL NPPP'O4OCOUNjMLJIH>251./). .137 :=@DGILOQSUXZ ]_^ ^,]<\N[cZ~XWUT:634-2$369=AEILPSVY[]`behk oon%m4mFk[juhfdb8927(9;?DIMRVZ^behkmpsvy} ,>~T~k{zwu8=,>"AFKQW\bfkotx{~ !3Ib1D%HMSZahnty (>Vs*OT[ bjs{2KfƇ©"[b kt}'?[z ",5=ELRX^djrz %.7>EKPV\bjr|'/7=DIOU[ais{vt  (/6<BGMSYaju|smjh !(/5:@E~K|RzYxbvltyrqomle`^\|zx wxwt!r'p-n3l8k>iDhJfQdZcdap_^]\[WTRQtnjfec ccca!_'],\2Z7Y=WCVKUSS\RhPwONMLKIGG|ne^YWUTS STRQ!O&N+L1K7J=IDGLFVDaCpBA@??>=>ocYQMJHGG FFGED!B&A+@1>7=><G:P9[8i7z6554445teXOHC?=<<; ;;:97!6&5,42391A0K/V.c-s,,++++,l]QH@;74322 2 110/-",(+.*5)=(F'Q&^%n$##""#$weVKB:50-,+*) ))('&%$$*#1"9!C NZi|p_Q F = 5 0 + ( %$## " "!  &.6?JWfxk[ M B 9 1 , ' # !     #+3<GTcug W I>5.($           ! ( 0 : E R a s      c SF;2+%!        ' / 9 E Q ` q      _PC8/(#      $ , 6AN]o\M@6-&!      !)3>KZlXI=3+$     '0;HXjUF:0("     $-8FUg}QC7.&         !!*!5!B!R d zM?4+$  !# %&&&'''2'?&N&`&w%$#"!H<1("  !#%') , ....#...;.J-\-r,+*)(D 8!.!&!  !#%'),.03 5 6666)666E5W5m4210/?$4$+$$#!  !# %(*-/2479;> @AA@%@1@@?R>g=<:98:(0()'#%#$%( *-0368;>@BEGJ MMLL+K:JLIaH|GECB6,-+')#'(*- 037:=@CFHKMPSVY [[Z%Y4XFWZUtTRPO30,.',-/2 6:?BFILORUXZ]`cgk lkk,i=gRfjda_]13,1"259 =BGLPTX[_behknquy} $~5|I{axvsp16&8;@ EKQV[`einrvy|~+@Ys+> AG MT[ahnsy~!5Mi#HNT\dmu| )A\|U\enw6Qn߱  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C"K2TE]Zdqjo˸r±twĴ{ͫԢۙᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚ%0:C"K1TE\[cqimɿpruëxʢ|љؐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ%0:C"K1SE[[argknqsvȚyΒ~ԉ؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉%0:C!K1RDZZ`rejmprtĔwʋ{τԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄ%0:B!J0RDXZ^rdiloprvƆz%09B J/QCWZ\qdiknoqtx{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}$0 9BJ/PBUY[pchkmoqt}ww|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|$0 9BJ-O@SY[ocgjmoqszwt{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{$/ 8AI+M@RXZmbgjmoq{tvwq{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{$/ 8AI(L@QWYkazgknp}sxusxn|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|$/ 8AF(LAPUXfatg~korzuuxq{l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~#- 6 =F*K@OQX`akhtm{qytuxr{n~kւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւ#,/;E+I=NLWXaaiionytruwuqzwn}yk{i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|""':B*F9MEVObV~j\wp`sucoxem|gjhhjfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfk& :>'D3K=UE|aKujOppRluTjyVh|WfXdZc[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[ & 6;#A,J4xS:q_?liChoEetGcwHb{Ia~J_J^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8@I+R<\Oedmxsըy̟}ŗŶ̲ү֧~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~"- 7@I+R<[Pddlyrӭwʤzœ~÷ʲҮئڡաաաաաաաաաաաաաա"- 7@H+QG(N9TNYe`{fjmoruxz}tqqqqqqqqqqqqqqq!, 5>G'M8RLWd_zfjloqt|wv|qnnnnnnnnnnnnnnn!, 5>F%M6OLUc_xeiloq~txws{nkkkkkkkkkkkkkkk!, 5>F"K4OLTb^tdimorzttxp{khhhhhhhhhhhhhhh!+ 4 =EI5NLS_]pd}inq{tvwqym}iŁfąfąfąfąfąfąfąfąfąfąfąfąfąfąfą *3 <BI5MJR[]ietj}o|swwszo}lрhЄeχeχeχeχeχeχeχeχeχeχeχeχeχeχeχ )13 B!H5LFQU]`ejlq}qvwvzsy}o|l߀iރg݇e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉%"2A"E3JAQM]Vf^}ndvshrxkn|mlojpgresctctctctctctctctctctctctctctct1>"B/H:PD\K{gQtnVosYlx[i|]g^f_d`baababababababababababababababab 2:?*F3O:x[@qfElmHhsJfwLd{MbNaO`P^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q  05<$|D+sM1lX5gc9ck;aq=_u>]y?\|@[AZAYBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>F%P4ZEdWmiw{}ٖюˈǂ~zwuµqórrrrrrrrrrrrr* 5=F%O4YFcXlku}ߣ{՛͒Nj…|ùyǵvʭuƫvīvīvīvīvīvīvīvīvīvīvīvīv* 4=F%N4XFaYjlsݨxӟ~ʖĎŷ˴|ϫxϥyȤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤy* 4=E%N4WF`YimqܬvФ{Țŷ˴βѤ|џ}ʞ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}* 4<E$M4WF_YgnoڱtϨyş}Ƶ˯ϪҞә̘ʘʘʘʘʘʘʘʘʘʘʘʘ* 4<E$M3VF^Zfomٶsͭwĥ{Ʈ̨ϢҙӔ͓˓˓˓˓˓˓˓˓˓˓˓˓* 3<E$L3UF]Zeolػq̲uí|ƨˡЛӔԏΏˏˏˏˏˏˏˏˏˏˏˏˏ* 3<D#L3UE\ZdojoʹtzƢ˛ϕҏԊΊ̊̊̊̊̊̊̊̊̊̊̊̊* 3<D#L2TE\Zbphmżsx}ŝ˕ϏҋӆΆ̆̆̆̆̆̆̆̆̆̆̆̆) 3;D#L2SEZZ`pflqw|ŗʐΊхҁ΁́́́́́́́́́́́́) 3;D"K1RDYY_pdjoty}Ðȉ̃~}|||||||||||||) 2;D!K1QCWY]ocimptx†}ƀzvvwwwwwwwwwwwww) 2;C K/PBVW[nchlnqt~xw|rmmnnnnnnnnnnnnn) 2:CJ.O@RWZmbgknqtywt{njgfffffffffffff) 1 :BJ+L?QVYka|gknq{tuxp{lhdccccccccccccc(0 9BG(L@QUXhawglo~sxvryn|ifbaaaaaaaaaaaaa'/ 8 AF*L@PSWcapg{mqzutyp|lh̃dˈaʍ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ&-4<F+J>OOW\ahhqnx{s}uxq{mjڃgنd׋a֐`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց#&)<D+H;MIWTa]je|pjvvnqzqm~tkvhwfycza|`|`|`|`|`|`|`|`|`|`|`|`|`|( ;A)F6LAVKaR{kWtq\ov_l{aicgdefcgah_i_j_j_j_j_j_j_j_j_j_j_j_j_j ) 9>&D0K9T@xaFrjJlpMivPf{QdScTaU`V^W]X\X\X\X\X\X\X\X\X\X\X\X\X\X )4:!A)zI0rR6l^:hh=do@atA_yC^}D]E\E[FZGXGXHXHXHXHXHXHXHXHXHXHXHXHXH* 06w>"nG(fP,aZ/]d1[l3Yq5Xu6Vy6V|7U7T8S9R9R9R9R9R9R9R9R9R9R9R9R9R9R9) 5;D!N-YFI3NIT]\nc}imq{usxn|ieb_^^^^^^^^^^^^$,4 =BI3NHRZ[icvio~swwq{lhʃdɈaǎ^ƕ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ#*25 BH4LFQU[bdmkvp}yuszn~kׂgՆdԋaӐ^і\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ!&%3B!G3KBPO[Zecljzrptxto|wlzh|f}c`^ߖ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ3@"D0I=PH[PeWzm]tsaoydk~ghifjdlbm`n]p\q\q\q\q\q\q\q\q\q\q\q\q 3< B,H6O?ZFxeKqmOlsRiyUf~WdXbYaZ_[^\\][^[^[^[^[^[^[^[^[^[^[^[^  39?&F.zN5sX:mc?ilBerDbwF`|G_H]I\J[KZLXMWMWMWMWMWMWMWMWMWMWMWMWM! .4; vC'mL,fT0b`3^i5\o7Zt8Yy9X}:W;V;UR>R>R>R>R>R>R>R>R>R>R>" )~0s8i@bI#[Q&WZ(Ub*Ri+Qo,Ps-Ow.Nz.N}/M/L0K0K0K0K0K0K0K0K0K0K0K0K0K0(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(39BK'V4aBmPw]hr냒{}xtronlk›iʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜ'28AJ'T4_CjQt_~l펈x燏―{wtqomlægæiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡ'1 7@I'S4]ChSrb|pꔅ}㋋݄~zuromikmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥ'0 7@H&R4\DfTpdys瘂ߏوҁ{vspmknppppppppppp&0 6?H&Q4[DdUnewvܔԌ΄}xutpoqsssssssssss&/ 6?G&P4YDcUlgux|٘ѐʇł|ztrtvvvvvvvvvvv&. 6>G%O4XDaVjhszz͔֝ƍ}yvxyyyyyyyyyyy&. 5>F%N3WD`Vhip{ުwП|Ǘ~y{}}}}}}}}}}}&- 5>F$M3VD_Vgin}֬sʣz~&- 5=F$M3UD]Vej߸k~ЯqŦx~%, 5=E#L2TC\Vcjڻi~̲pv|‹Š%, 4=E#L2SC[VajԿh~Ƕntz†„%, 4<D"K1RBYU`jf}¹lrx~€%, 4<D!K0QAXT^ie|kpv|}{yzzzzzzzzzzz%+ 3<D J.P?VS]hc{iotzzwtsttttttttttt$+ 3 ;CJ,O=UQ[gbzgmrx~ytpnmnnnnnnnnnnn$*2 :BI)L;SQZe`xfkpv|xrmjgghhhhhhhhhhh#)1 :BG%K;QPYc_tejosuxn}iea__bbbbbbbbbbb!(08 @E&K;OOW`_of|lqzuszlgDŽcƊ_đ\ęZäZİZİZİZİZİZİZİZİZİZİZİ &.3<E(J;NLV[_hgsm|~rvxp}kԂf҇cь_ϒ\ΙY΢XͫXͫXͫXͫXͫXͫXͫXͫXͫXͫXͫ#&);D)I:MHUU_`hhopxuurzym}ie߉bݎ_ܓ]ۙZڡX٨X٨X٨X٨X٨X٨X٨X٨X٨X٨X٨) ;C(G6LCUM_Vi]ypbsvgn|jjmgodqar_t]uZwXxXxXxXxXxXxXxXxXxXxXx ) ;@&E2KG"R-]:iGtS~_ir}yxtpmkjiȓfϕdѓeԎeԎeԎeԎeԎeԎeԎeԎeԎeԎ&0 5=F!P-[;fHqV|bmw耕zuromkiɞeɞg͘iѓiѓiѓiѓiѓiѓiѓiѓiѓiѓ&/ 4=F!O-Z;dIoXyeqꋌ|䃒}xtpmkf§hƢj˛lΖlΖlΖlΖlΖlΖlΖlΖlΖlΖ&. 4<E M-X;bJlYvhu珉ڀzupmkhkæmȟo̙o̙o̙o̙o̙o̙o̙o̙o̙o̙%- 3<D L-W;`KjZtj~y䓆܋Ճ|wtspknpƢrʜrʜrʜrʜrʜrʜrʜrʜrʜrʜ%, 3;DK,U;_Kh\qlz|ߗՎͅǀ{xvupqtĤuɞuɞuɞuɞuɞuɞuɞuɞuɞuɞ%+ 2;CK,T;]Kf\onvՙ}̑Ŋ|zytuwæyǠyǠyǠyǠyǠyǠyǠyǠyǠyǠ%* 2:BJ+S;\Kd]loۥsΝzŕ~}zy{|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ%* 1 :BJ+R:ZKb^jpөpȠw~}ţţţţţţţţţţ$) 1 9BI*P:YKa^ܵgqάoäu|ĥĥĥĥĥĥĥĥĥĥ$) 1 9AI)O9WJ_]ֹfpɰmszææææææææææ$) 0 9AH(N8VJ^]Ѽeoijkqw~ææææææææææ$(0 8@H'N7UH\\̿coipu{~{}}§}§}§}§}§}§}§}§}§}§$(/ 8@G&M5TF[[bnh~nsz~zxuwx§x§x§x§x§x§x§x§x§x§#'/ 7?F#L2REYZ`lf|lrx~}xtqopr§r§r§r§r§r§r§r§r§r§"'. 6>F K.PDXX^kezjpu|}vqmjijkækækækækækækækækækæ &-5 =DH-OBVV]hcxhnt}zvpkgecdeŤeŤeŤeŤeŤeŤeŤeŤeŤeŤ%,3 <@H.MBUT[eatfl~rvyoƁjʼneŒbĝ_ħ]Ĵ^Ĥ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ#)14 AG.LASRZaanhynzur|k҂eψ`͏\̗ZˠX˫W˺Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙ %$2 @G/K?QNZZbejn}ruux{o~i݄dۊ`ّ]ؘZ֠X֨VմTTTTTTTTTT1@E.JC+H7OAYI}cPwmVptZkz^hadcae_g]hZiXkVlTmTmTmTmTmTmTmTmTmTm 2;A'G1N9zX?sbEnlIisLfzOcQ`S^T\UZWYXWYUZT[T[T[T[T[T[T[T[T[T[Ϳ!17>"}E)uM0nU5i`9ej_w@\~BZCYDWEVFUGSHRIQJQJQJQJQJQJQJQJQJQJϸ#-3y;pC"iJ'bR*]\-Ze0Xm1Vs3Ty4S~5R6P7O8N8M9L:K:K:K:K:K:K:K:K:K:K:"( v/m7e?^GXN!TW#Q_%Ne&Ml'Kq(Jv)I{*H*G+F+E,D,C-C-C-C-C-C-C-C-C-C-t# i*`2Y:SBNIKQHXF]DcCgAl@p?t >x =| qJ}U^g{nvsrxo}ligƆeψb׊aوb݂ccccccccc}y&|. 2:CL'X3c?nLzWbk~syztpljhƏfђbђdՌeۆf݂f݂f݂f݂f݂f݂f݂f݂f݂}z&, 1 :BK&V3a@lMvZfp삔y{uqmkișd˛eΗgґh؊iۆiۆiۆiۆiۆiۆiۆiۆiۆ~{&+ 1 9BJ&T3_AiOs]~j쌈u煑~xrmlkŠgǠh˛jДlՍlىlىlىlىlىlىlىlىlى~{%* 0 8AI&R3]AgPq_{m參zއ~xtqonkţkȟm͘oґp֌p֌p֌p֌p֌p֌p֌p֌p֌|%)/ 8@H%Q2[AdQnavpܑ~҉˂}xusrpæoƢq˛sГtԎtԎtԎtԎtԎtԎtԎtԎtԎ|%(/ 7?G$O2YAbRkbޞrsҕzʍÇ}ywvvsåuɞwϖwґwґwґwґwґwґwґwґwґ}%'. 6?G#N1WA`Rhd֢pt̙wÒ~{zywyǠz͘{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ~$&. 6>F#M0V@^RݮfdХnsƝu|~}{}Ƣ~̙ДДДДДДДДД~$&- 5=E"L0T@]Qײdc˩lsszŤ˛ϕϕϕϕϕϕϕϕϕ$%- 5=E!K.R?[Qѵccƭjrqw~ĥʜΗΗΗΗΗΗΗΗΗ#%, 4 <DK-Q=ZP͸abhqo~u|æɝ͘͘͘͘͘͘͘͘͘"$,3 <CJ+Q;XOȼ`agpm}sy|zzæ{ɞ|͘|͘|͘|͘|͘|͘|͘|͘|͘!$+3 ;BI(O9WN^`eok|qx~}xussæuɞv͙v͙v͙v͙v͙v͙v͙v͙v͙ #*2 :AH%M8UL]^cnj{ov|{vqnlmæoɞp͘p͘p͘p͘p͘p͘p͘p͘p͘")08@F K6TK[\blhxnsz{uokhffŤhʜi͗i͗i͗i͗i͗i͗i͗i͗i͗!'/6 >CJ4RHZZ`ifvlr{xtnieb`_Ša̚bϕbϕbϕbϕbϕbϕbϕbϕbϕ %+18C I3QFXW^edrj||ptwn~hÇc_\[³ZŚ[ϕ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ!"%7C"H3ODVS]`ck~juup}nwgbЇ^БZМXЧVеUǑVԎV֋V֋V֋V֋V֋V֋V֋V֋V֋&7B#G2L@UM]Xeaylirtol|tgxb{^~[XߧUޱS޾R҃Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂ &8@"F0K!D,J5S>y]ErfJmoNhvRd~UaW_Z\[Z]W^U`SaRaPbPbPbPbPbPbPbPbPb ָ ) 5;B&}I.uQ4o[:ie>enAbuD_|F\HZIXKVLUMSNQOPPOQOQOQOQOQOQOQOQOQگƼ+ 18y@ pG&iO+cX/_b2\k4Zr6Xx8V9T;RN>M?K@JAJAJAJAJAJAJAJAJAȵ & -u5l=eD^L"XT%U]'Re)Pl*Ns+My,L-J.I/H0G0E1D2C2C2C2C2C2C2C2C2C2 }!r( h0`8Z@THOOLWI]Gc Ei Do!Bt"Az"@#?$>$=%<%;&;&;&;&;&;&;&;&;&znd# \+ U3O;IBFIBO@U>Z<_;d9h8m7r6w5|43222222222pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl(k1 u6 {<FP!^*~k3{x;xBuHrMpQmTkWiZg\e^b_`a^b\c[dZdZbZbZbZbZbZbZbZbqm(n0 x4 ;DN![+h4u=|EyLvRrVoZm^jahcfecgai_k]l[m\h\g\g\g\g\g\g\g\grn(q. {2 :CL!Y+e5r?~H|PyVu\r`ndlhikgmdpar_s\t\q^l^k^k^k^k^k^k^k^kso't-~1 9BK!V+c6oA{KS|[xatgpkmojshvexbz_|]{_v`p`n`n`n`n`n`n`n`ntp'v+/ 8@I!T,`7lCwMW`zgvnrsnxk|hf͂b؄_܅`azctcrcrcrcrcrcrcrcrtp&y*. 7?H R,^8iDtP[e}nwur|njgeʍbԎb؊c܄e~fxfvfvfvfvfvfvfvfvuq&|(- 6>G P+[8fEpR{_ꅅj~tx}rmjhhÑgђeԏgىh݂i|jyjyjyjyjyjyjyjyvr&', 5=FN+Y8cFmTwboڀ{zuqnlkk˕iДkՍlۆmm|m|m|m|m|m|m|m|vs%&, 4<DL*W8aGjVre،{sυ|zvspooĘm͘oӐp؉qނqqqqqqqqwt%%+ 3 ;CK)T8^GgWڙogϑxsNJ}zwtsrr˚sГt֌u܄uށuށuށuށuށuށuށuށxv$#*2 :BJ(R7\GޥdXѝmfȕus|}{ywvwʜwϖxԎxۆx݃x݃x݃x݃x݃x݃x݃x݃xx##*1 :BI'P6ZFةcW̡kfšrrz|}{{{ƞ{͘|Ӑ|و|܅|܅|܅|܅|܅|܅|܅|܅yz"")1 9AH&O4ߴYEҭaVǥieprw|~ž̚Ғ؉ۆۆۆۆۆۆۆۆy{!"(0 8@G$N3۸WDͰ`V©gdnqu{|˛ѓ؊ڇڇڇڇڇڇڇڇz} !(/ 7?F"N0ռVCȴ^Ufclps{z~~ʜД֋ووووووووz!'.6 >EL/пTBķ]Sdbjoqzw~}zxwʝyϕy֌y؉y؉y؉y؉y؉y؉y؉y؉{ &-5 =DI.SA[Rbainoxu|{wsqpȝrϕsՌt؉t؉t؉t؉t؉t؉t؉t؉|%,3 ;BH,R@ZQa_glmwtzzupljiślДm֌m؉m؉m؉m؉m؉m؉m؉m؉}#)18 :F*P>XO_]ejktq}xztnifcbØeѓf֋gىgىgىgىgىgىgىgى~!&,19D(N;VL]Zcgiqoyzvs}mhc`^\”^Ӑ_ى`چ`چ`چ`چ`چ`چ`چ`چ  ,;D%L8TI[Wachl{nusu{l|gb^ZXWX׋Y܅Y݃Y݃Y݃Y݃Y݃Y݃Y݃Y݃,;D%K5RDYR`]|fftmnlttf|yaͅ}\̎Y̙V̥T̳SąS݃S~T}T}T}T}T}T}T}T} , <C%H3P@YK~`Tvh\oobhwhcl^ވpZޑsWޛuTާwRߴxPxOxOuOtOtOtOtOtOtOtOt۸ - ;A$G/N:~XCwaJpiPjqUeyYa\]_ZaWcUeRfQgOhNhMhMhMhMhMhMhMhMh ݮ̼ / 9?!F*|M2uW9n`?iiCdqGayJ]LZOXQVRSTQUPVNWMWLWLWLWLWLWLWLWLWδ / 6=xD$pL*jT/e^3ag7]o9ZvV?SAQBPCNEMEKFJGIGIGIGIGIGIGIGIGѮ"+ ~2u:lBeI"_Q%ZZ(Wc+Tk-Rr/Py0O1M2K4J5H5G6F7D8D8D8D8D8D8D8D8D8{' q.h6a>ZFUMQUN] Kd"Ik#Gq$Fx%D&C'A(@(?)=)<*<*<*<*<*<*<*<*<*wm"d* \2U9PAKHHOEVB\@a>guEqKoPlTjXh[f]d`ab^c\e[fZc[`][][][][][][][][ie(n+x. 6?HS%`/l8|yAxItPqVnZk_hbfedhbk_m]n[m\h^d________________jf(q){, 5 >GP%]/i:uD|MxUs\oblgikfocrau`w\x^r_m`hbcbcbcbcbcbcbcbckg't'+3 <EN%Z0f;qF|Q|Zvbqilphudzb~aa_~awbrcmdgdgdgdgdgdgdgdglj&w&*2 ;CL$W0bF M-X<٠aL͘jYőreznv}}ywuttƏu֋v݃v|vtvtvtvtvtvtvtvtou%-5 =EL+߫W;Ҥ_KȜhYodwnv}~{yxxzՍzۅz~zvzvzvzvzvzvzvzvpv%,4 <CK)گU:ͨ^J fXmdun|v}~}}ӏ~ڇ~~w~w~w~w~w~w~w~wpx$+2 :BJ'ԳS9ȫ\IdWkcrmyu|Αو߁yxxxxxxxqz#)1 9@ݼH%϶R8ï[HbVjbplwu~||{ˑ|؉}ނ}z}y}y}y}y}y}y}yq|"(/7 ?F$ʺP7YGaUhankut|{|xvtȑv؊w݂wzwzwzwzwzwzwzwzr &-5 <D#ŽO5XF_Tf`mjsszzzuromŐp؊p݃q{q{q{q{q{q{q{q{s$*15B!M4VD^Rd^khqqxx~ytokhgŽi؊j݂k{k{k{k{k{k{k{k{t %*2 AL1TB\Pb\ifonvuy}{smheb`bوcށezezezezezezezezv0 ?J/R?ZMaXgbmkytqr{wl|gb^\Z[ڄ]^x^x^x^x^x^x^x^xz / =H,P;XI_Te^ylfrrlkzrfvaz\}YWUUVzXuXtXtXtXtXtXtXt 1 =F'N7VD]OzdXrj_kreeyj`ɂo[ɋrWȖuTȢwRȯxQxPwQsRoRoRoRoRoRoRoRo ߮м 1 =D&L3T>{\GscOkjVer\`z`[كdWٌgSٗjP٣lNٱmMmLlMjNgNgNgNgNgNgNgNg Ѵſ"3;B$I.{S6s\>ldDglIbtM^|QZTVVSYQZN\M\L]K]J\J\J\J\J\J\J\J\Ԭŷ$2:A xH'pP.jZ4ec8`k<]t?Y|BWDTFQHOJMKKLJMIMHMHMHMHMHMHMHMHMڣDZ'/ }7t?lG fN%`W)\`-Yi0Vq2Sx4Q6O7M9K:I;HD>D>D>D>D>D>D>ˬ$z, p4h<aD[KVS S["Pc$Mk&Ks'Iz)H*F+D,B-A.@.?/>0>0>0>0>0>0>0>0 v l( d0 ]8W@QGMNJVG\DcBi@p?x=; :!8"7"6#5#5#5#5#5#5#5#5#} rh_#X+ Q3 L: GACH@N=T;Z9_7e5k3r1z/.,+********xn cZRK$F,A3 <: 9@ 5E 2J 0P .T,Y*^(d&j%q#x" \"W-X3_6 c= eFfPe^dn"a|'_+^.\1[3Z5Y6X7X9W9V:U;TU>T?S?R@R@R>R>R>R>R>R>R>]!X,\0d3 h: kClNlZjj$gx)d.b2a6_8^:]<\>[?ZAYBWCVDUDTETETDTBTBTBTBTBTBTB^!Y,_.f2 l8 oAoLqWng%ku+h0e5d9b<`>_A^B]D\FZGYHWIVJUJUJVGVEVEVEVEVEVEVE^!Y+b-j0o6 r@tJuUrd&or-l3i8fxHyRw`'tn.p{5m;jAgEeIcLaN`Q^S]U[VZXXYYVZS[O[M[M[M[M[M[M[M` ])h)q+x3 |<}F~P}](yj0uv8q?mEjKgOeSbV`Y_\]^\`ZaZ`[[\W]S^Q^Q^Q^Q^Q^Q^Qa`'k&u)|1 :DMY(f2zr;u~CqKmQiVf[c_`c^f\i[kZk\f^a_\`XaUaUaUaUaUaUaUbc%o$y(0 9BKV(b3n=zyGuPpXk^fdci`m_o^p^q]q_kafbac\cXcXcXcXcXcXcXcf#r"}'. 7@IS(_4j?tKx~Ur^mejjgmepcsbtauavcqdjeef`g\g\g\g\g\g\g\ch!u %-5 >GO([4fAoN}yXw`sgollpisgvfxeyeyfvhoiiicj_j_j_j_j_j_j_dk x$,4 <EM'Y4bB׉lN΃uX}~axhtmprnulxj{i|i}jzlrllmfnbnbnbnbnbnbnbem{#*2 ;CK%V3ږ`AώiNLjrXza}hynusrwpzn}m~mn~pupoqhqdqdqdqdqdqdqdeo~")1 9AI#ޡT1Қ^@ȓgMoXwah}nzswxt{s~qqr؁txtqukufufufufufufuffq!(/7 ?H ئR0̞\@×eMmWta|hn~t{xy|wvuvтxzxsxlxhxhxhxhxhxhxhgs &.5 =߯FҩQ/ǢZ?cLjWr`yhntx}||zzz̓|||u|n|i|i|i|i|i|i|igu%,4 ;۳DͭO.æY>aKhVp_wg~nsx|ʄ}vojjjjjjjhx#*19 շBɰN-W=_JgUn_uf|msx|}{yDŽz{w{p{k{k{k{k{k{k{kiz!'.޽5 к@ĴL,V;^IeTl]sfylrw|{wtrăttxuqvlvlvlvlvlvlvlk}#)0 ˽?J*T:\GcRj\qdwkq~vy{t~pmkmnxoqplplplplplplpln!-=I(R8ZEaQhZobui~|oxtsyn|jgeehxiqjljljljljljljlq+;G&Q6XC`NfXm`~sgwzlrrlvhyd|`}_~^}avbpclclclclclclclt (9E#O3W@^KdT~k\wqcqxikmfrau]x[yYyXyZs\n]j]j]j]j]j]j]jy ܮһ %6B L/T<\GbPwiWpp^jwceh`l\oXqUsSsRsToVjWgWgWgWgWgWgWg ҳɾ#3 @J*R7ZAxaJphQjoWdv\_`ZňdVĒgSĞiPĬjOļkNjOhPdQaQaQaQaQaQaQa Ԫȶ %5 >H%P0xX:p_BigIcnO^vSYWUӉZRӓ]OӠ_Mӭ`KԾ`J`K^L\LZLZLZLZLZLZLZڢʯ (4=D"wN*oW2i_8cg=_oBZwEVISKPNMPKQIRHRHRHQHOHOHOHOHOHOHOͩ *3|;tClK#fT)a]-]f1Yn5Vv7S:PK@IAGBFCECDCDBDBDBDBDBDBDBѢ (y1 p9iAbI\P WY#Tb&Qj(Os*L{,J.H/F1D2C3A4@4?4?5?5?5?5?5?5?5Ī~u%l- d6]>XERMOUL\IdGkDs B|"A#?$=%;&:&9'8'8(8(8(8(8(8(8(zpg!_)X1 R9 MAIHEOBU@\=b;i9p7y5320//.......vlbZS$M+G3 C: ?A ;G 8M 5S3X1^/d-k+s)|'%$#"""""""~pg] TMGA$<+72480=-C*H (M &R $W "] c k s |          R%M/Q2W5Z< [EZOY]XmV{U"S%R'Q)P*P+O,O-N.N.N/N/M0M0L0L0L/L/L/L/L/L/L/S$M/T0Y4]: _C^N]Z[jZy!X$V'U)T+S-R.R/Q0Q1P2P2O3O3N4N4M4N2N2N2N2N2N2N2S$N.V/\2`8 bAbL`X_h]v"[&Y)X,V.U0U1T3S4S5R6R7Q7Q8P8O8O7P5P4P4P4P4P4P4T#P-Y-_0c6 f@fJeUceas#^(\,[/Y1X4W5V7U8U9T:T;SkHjShafp%c}*`/^3\6[8Z:XW?VAUBUCTDSDTAU?U\A[CYEXGWHVJVKULVJWFXCY@Y?Y?Y?Y?Y?Y?W"Y'c&k(q0t9 uCuMuY!qg)mt0j6fHR!~_+yk5su>nFiMeTaY_\]_\a[b[cZc\`_Z`UaQbMbKbKbKbKbKbKY!b nx#+3 <EN![+~f6xpArzKmRiXf\d_bb`d_f^g^h_fc_dYeUePeOeOeOeOeOeOZ eq|")1 :CL X+b7~lCxvLsSoYk^ibfeehcjbkblbkfdg]hXiSiRiRiRiRiRiR[ gt '/7 @IU*ۊ_7фiC}rLx{TtZq_ndkgijglfnfofojhkal[lVlUlUlUlUlUlU\jw%-5 >FޖR)Ґ\7ʉfBÃoL~wTy[u`rephmllnkpjqjqnkodo^pXpWpWpWpWpWpW^lz#+3 ;EכP(̔Z6čcBlLtT~|[z`wetirmppornsosrnsfs`sZsYsYsYsYsYsY_n}")09 ޥCџN'ǘX5aAiKqTy[`|eyjvmuqssstsuvpwhwbw\wZwZwZwZwZwZaq &.6 ة@̣L&œV4_@gJoSvZ~`e}j{nyqxtwuwvzr{j{d{]{\{\{\{\{\{\cs#*2Ҭ>ǦK$U3^?eJmRtY{`ejn~q}t|v}|v}~ske~^~]~]~]~]~]~]eu &۴.ί=êI#S1\>dIkQrYy_dinq|tyvwvvtylyfz_z^z^z^z^z^z^gw!շ*ɳ;H"R0Z=bGiPpXw^~di~myqvsrupvousmsft`t_t_t_t_t_t_izݹϺ(ķ9F P/X;`FgOnVu]|c}hxlsporltjuiulmmgn`n_n_n_n_n_n_l} տʾ&7DN-W9^DeMlUs[|zawfrjmniqfscsbsflgfh`h_h_h_h_h_h_o ڭ Ӹ #5BL*U7\AcJjR|qYvx^pckggkcn_p]p\p_kaeb`b^b^b^b^b^b^s ۥѱ˻ 2 @J'S4Z>aG|hOuoUovZj}_ecag]jYkWlVlXhZc[^\]\]\]\]\]\]x ߜҩɴ¾/ =H#Q/X:|_CufJomPitUd|Z_^[aWdTeRfQfRcT_U[VZVZVZVZVZVZ~ ֡ʭ +:EN*}V4u]=neDhlIcsN^{SYVUYR\O]M^L^L\NYOUPUPUPUPUPUPUݘͦ (7B}K$uT-m\5gc*=+;+;+:+:+:+:+:+:+:+~wog&`/Y7 T?OGKNGVD]Bd@l=u;~9765332 2 2 2 2 2 2 {r jaZ"T*N2I: EA AH >N;U8[6b4i2r/{-+*)('''''''zmd\TMH$B,>3:96@3E0K .Q +W )] 'd $l "v yk_VN GA<7$2*/0+6';%@"E JPV\dmw         I'D1K1P4R:RC QNO\MkLyKIHH G!G"F#F#F$F$F%F%F%F%F%F%F$F#F#F#F#F#F#I'F/M/R2U9UB TMRYPhOwNLK!J"J#I$I%H&H&H'H'H(H(H(H(H(H'H&H&H&H&H&H&J'H-P-U0X6Y@ XKUVTfRtQO!N#M%M&L'K(K)K*J*J+J+J,J,J,J+J)J(J(J(J(J(J(K&K+R+X.[4]> ]IZTYbWqU~ S#R&Q(P*O+N,N-M.M/L0L0L1L1L1M/M-M+M+M+M+M+M+K&N)V)\+`1b; bF`Q^_\mZz#X&V)U,S.R0Q1Q3P4O5O6N7N8N8O5P3Q1Q/Q/Q/Q/Q/Q/L%Q'Z&`(e/h9 hCgNeZbh _v%]*Z.X1W4U6T8S:R;Q=Q>P?P@Q>S;T8U5U3U3U3U3U3U3M$T$]#e%j-m6 n@mKkVhd!eq(b}-_2\6Z:X=W@UBTDSFRHQIRHTDV@X=Y:Y8Y8Y8Y8Y8Y8N$X!a j#p+s4 t>tHrRo_#kl*gw1c7`=]AZEXIVLTNTPTPSQTNWJZE\B\>\<\<\<\<\<\HT"~_.xi8ss@n|GkLhQeTcWbZ`\`^_^__bYeSgNgJgFgFgFgFgFgFWdp{"*2; DފQ!Ԅ\-~f8xoAtwHpMmRjVhYf\e_d`cacbe]iWjQkLkIkIkIkIkIkIYgs~ '/8 B֏N ̉Y-Ńc7}k@ytHu|NrSoWm[k^i`hcgdgdiamZnTnOnKnKnKnKnKnK[iv$,4ܚ?ϔLƎW,`7i@~qHzyNwStXq\o_mbldlfkfmdq\rVrQrMrMrMrMrMrM]ky!(0՞=ʘJT+^6f?nG~vN{}SxXv\t_rcqepgpgpft^vXvRvNvNvNvNvNvN_n{#ݥ+ϡ;ŜHS*\5d?lGsMzS}Wz\x`vcufthththx`zYyTyOyOyOyOyOyOap~ר(˥9FQ)Z4b>jFqLxRW\}`{czf}yh{yizyi||a~~Z~}U~}Q~}Q~}Q~}Q~}Q~}QcrߪѬ&Ǩ7 DO'X3`=hEoLvR}W[_~czfw~hu~is~ivbx[xVyQyQyQyQyQyQeuٯ̯$«5 CN&V1^;fDmKtQ{V[|_xbteqhnimiocr\sVsRsRsRsRsRsRhx ޠ ֩ Ҳ Dz"3 AL$U0]:dBkIrPyU{Zv^rbnekghhghicl\mWmRmRmRmRmRmRk{ ֣Ь ˵ 1 ?J"S.[8b@iHpNzwSu~Xp\l`hcdebf`fbbe\gWgRgRgRgRgRgRn ٛϦɯĹ/=H Q+Y5`>gEznKtuQo|UjYf]b`^b\cZc[`_[`VaRaRaRaRaRaRr ߓџɪ,:EO(W2^:yeBslHnsMizQdV_Y\\X^V_U_U]XXZT[P[P[P[P[P[Pw֘ˤ(7CL$U.y\6rc=mjCgqHbyL^PZTVVSXPYOYOXQTSPTMTMTMTMTMTM}ߏΝè#3 ?IyR(rZ0ka7fh.=.=.=.=-=-=-=-=-=-şztm f*_4Z= TEOLLUI]FeDnAw?=; 9!8"7"6"6"6"6"6"6"6"6"wo g`Z'T0O8J@ FH CO@V=^;e8n6w420/.-,,,,,,,uia [TN"I+D2@:+C(I%O#V!]eoz           ugXNHA ;61-")(%-"28=BHNU]g r }        ?*?0D0H3I9HBFM E[CiAw@?>>====<<<<<==========@*A.G.J1L7K@JK HYFgDuCBAA@@??????????@@@@@@@@*C,I,M/O5P>NI LVJdHrGFEDDCCBB B B!B!B!B!B!C CCCCCCCA)F*L)Q,S2T<TG QRO`MoL|JIHG!G"F#F#F$E%E%E&E&E&E&F$F#G!G!G!G!G!G!B(I'P&U(X/Z9ZD WOU\SjQwON!M#L%K&J'J)I*I*H+H,H,H,I*J(J'K%L%L%L%L%L%C(M$T#Z%^,`6`A ^L[WYfWrU~"S%Q(P*O,N.M/L0L2K3K4J4K3M0N-O+P)P)P)P)P)P)F%P!X _!d*f3f= eHbS`a]m Zy%X)V-T0R3Q5P7N9N;MR@QAPBPCPDPCR?U;W7X4Y2Y1Y1Y1Y1Y1M W`io%r-t7sAqKnXjd$en+ay3^8\IS'[0b8i>pDxI~MzQvUrXoZl\k\kYnRqMrHrGrGrGrGrGf u܏Ҙ̡Ȩ-<GQ%Y/`6g=nC}vHy}LtPpTlWiYf[e[eYhRkMlHlGlGlGlGlGi x֒͜Ƥ+:EO#W-_5f;}lAxsFs{KnOjRfUcX`Y_Z^XbRdMfHfGfGfGfGfGl|ފЖȟ(7 CM!U*\2|c9wj>rqDmyHhLdP`S]UZWYWXV[P]L_G`F`F`F`F`Fp֏ʚ$4 @JS'|Z.va5ph;ko@gwDbH^LZOWQTSSSRRUNWJYFYEYEYEYEYEuϓğ 1=H|P"uX*o_0jf6em;`u?\~CXGUJQLOMMMMMNIPFRCRBRBRBRBRB|׌ș ,: {DtNnV$h]*cd0_l4Zt9V|K=K=K=K=K=͒&z5sAlJfSa[#\b(Xj,Tr0P|3Mņ6JĒ9Gğ;EĮ#<$;$:$9$9#9$9$9$9$9$9$~si d_ Y+T5O>KF GN DWB_?g=p:{8653211111111~qe^ YSN'J0E9A@>H;O 8W 6^ 3g 1p .|,+)(''&&&&&&~pdXR MGC">*:2793?0F-M+T([&c#m!y            ~pcUKF@;73#/)+0(5%;"AGNU^htpbTF?94 /+'#!%*/4:@FN V `lx6-9.>.@2@8>A@J>W *C*F-G2F<EHCU Ab ?p=}<;;::::99999::::::::::9+A'F'J)K/L9KEHQ F^DlByA@@??>>>>==>>>>???????=(E$J#N%Q,R6QAOM LZJgHtGFEDCCBB B B!A!B"B"B CCDDDDDD@%H!O S!W)Y3X>VI RUQcOoM{KJI!H"G$G%F&F'E(E)E)F(G&H$I"I IIIIIC"LSY]&_0_:]E ZPX^UjSvQ!O$M&L)K+J,I.H/H1H1H1I.K+L)M&N%N#N#N#N#N#GPW^c#f,f6dA bL_Y\eYp V{%T)Q-P0O2N3M5M6L7L8L8M5O1Q.R+S)S'S'S'S'S'JT\ci l)m2l= iGfTc`_k"\u(Y-W0U3T6S8R:Q;PU?UATBTBUAW[AZCYDYEXFXF[@^;_7`3a1a1a1a1a1S]hpw|$-;zIuTq_$mh+jp1gy6e:c=a@`C^E^G]H]I\I_Db>c9e6e3e3e3e3e3U`kt{އ'ф7F{Qv[#re+om1lu6j|:h>fAdDcGbIaKaLaLcGeAgm:n7n7n7n7n7Ye q z ݎϏ ƍ2AMV"|_*xg0uo6sv:q}?oBmFlIjKjMiOiOjLmEo?p;q8q8q8q8q8[gs}ކٌ Ց ʒ0?JT!])}e0zl5ws:u{>sBrFpIoLnN|mO{mPznM|qF~sAt=u:u:u:u:u:]jvىҏϔ Ŗ.= HR [(c/~j5|q9zx=xBvEuI|sLyrNvrPtrPtrOvuGxwBzx>{y:{y:{y:{y:{y:_ lyރӋ͒ɗ,; GPY'a.h4o9v=}~A}{EyzIvxLswNpwPnwPmwOpyHr{Ct|>u};u};u};u};u};a o|نώȕÚ*9 ENW&_-f3m8t={{AwEtHp}Km|Nj|Oh|Pg|Pj~ImCn?olBhFeIaK^M]N\M^H`Cb?cHQ ~Y'x`-sg2on7ju];];];];];n~΋ĕ .; F~NxV#r]*md/ik4ds8`{<\?YBUESGQGPGQDS@UΨ&<κ&<&<%;%;%;%;%;%;%;%Óyod ^[ W-S:PDLN IW F_ChAq>|<߉:87665444444ymbXUQ M+I5E>BG?O=X :` 8j 6t 320.--,,,,,,,yl`UN JFC'?0;88@5G3O0W._+i)t' % $ # " ! ! yl_RHC?;7!4)00-7*>'D%K"S \frzl^PD<73 /+(!%'!-28?FMV`l {    {l^OB61,'# !&,1 7 >FOYft./3,7-80764?1K/X,f*t ) ( ( ( ( ' ' ' ' ' ( ( ( ( ( ) ) ) ( ( ( ( ( 0-6*9*;.:48<6I3V1c /q -~ - , , , , , , + , , , , , , - - - , , , , , 2+9(=(?*>0=:}==<<;;;;;;;;;<<======="DIMP&Q0P;NFKS H`FlExDCBAA@@????@@ABBBBBBB@HNRV#X,W7UBRM PZMgLrJ}HGFE D"D#C$C%C&C&D$E"F GGHHHHHDLRX]_(^2]=ZI WUUbRmPwNL"K$J&I(I)H*H+H,H,H+J(K%L"M MMMMMGOV^be$e-d8aC _Q\]XhVrT{"R&P(O*N,N.M/L0L1L2L1N-P*Q'R$R"R"R"R"R"JS[bhjk(k2i>fL bX_c\m Zv$X~(V+U.S0R2R3Q5Q6P7P7R3T.V+W(W%W%W%W%W%MV_ glpq"q,p:lH hTe_bh!_q&]y*[-Z0X3W5V7V8U:U;U;V7X2Z.[+\(\(\(\(\(PY c k ptvw%v6rD nPk[gd!em'bu+`|/_2]4\7[9Z;Y=Y>Y>Z;]5^1_-`*`*`*`*`*R\ f n t x{| {3wA tMpXla!ji'gq+ex/d3b6a8_;^=^?]@]A^?a8b3d0d,e,e,e,e,U_irx|  ́0|? xKuUq^!nf&ln+ju/h}3g6e9db@aBaBbAd;f5g1h.i-i-i-i-W alu{ӀЃ Dž-< }HyRv[ sc&pk+nr/my3k6i:hyn8zo4{p0|p0|p0|p0|p0[fr{ςɇĊ(8DNW|_$yf*wm.ut2t|6r9|q=yp@voBsnDqnEpnErp?sr9us5vt1vt1vt1vt1vt1]it}˅Ċ&5BLU]$~d)|k-zr2}xy5zw9vv HQY!`'{g+wn0su4o}7k;h>eAb~C`~D_~D`@b:d6e3f2f2f2f2dr~LJ .; FOWz^%ue*ql.ms2i{6f9b=_?\AZBYBZ?\:^6_2_2_2_2_2hv͂Œ +8CLyTt\"pc'kj,gq0dy3`7\:Y=W?T@S@T=V9W5Y2Y1Y1Y1Y1m{ȇ'5@ yJsRnYi`$eg(ao,^w0Z3V6S9Q;O&=&=&=%=$=#=#=#=#=#Ljsh`^[,W8TCPLMU J]GfDoAy?ȅ<ȓ:Ȣ9ɳ887766666th]S OM"K0I<FFDOAX?a5;>9G7P4Y2b0m.y,+ ) ( ' ' ' & & & & & th[OE> <96%4.17.?,G)O'W%a#l!zugZMB851.+)&%-#4 ;CKS]jxvgZL?5-*& # #)/5=E N XetwhZK>2'#   "(.5=GR^m~*-.+0+0..5)=%I#W!dr,+0(3(3+11-:+G(T&a$o"|""!!!!!!!!!""""""""""".(3%6%7'5-482D/Q,^*k)w('' ' ' ' ' ' ' ' ' ' '(((((((((2%7":!;#;);49@6M4Z1f0s. . . - - - - - - - - - . . . . . . . . . . 5";?@B&B1@<>H;U9b7n 6y 5 4 4 43333333444455 5 5 5 5 9?CFI#I-H8EDCP@] >i =t <;;::9999999::;;;;;;;=CHLOP(O3M?JJGW Fd DoCyBA@??>>>>>>?@@AAAAAAAGLRVW$V.T9QEOR M^ KiItH}FEEDDCC C!C!C!DEFGGGGGGDKQW[]]([3Y?WMTY RdPnNwLKJ J!I#H$H%H&H'G'I%J"KLLMMMMGO V \`bc!b,`:^H[T X_ViTrRzQ!P#O%N'M(M*L+L,L,M*O&P#Q RRRRRJR Z ` eghg$f5dDaP ^[\dZmXu W}#U%T(S*R,R-Q/Q0Q0Q/S*U&V#V!WWWWM U]di k lml1j@gL dWa`_i]q!\x$Z'Y*X,W.V0U2U3U3U3W-Y)Z%[#[![![![!O Wahmpp rq.o=lI iTg]debm!at%_|(^+]-[0[2Z4Y5Y6Y6\0]+^(_%_#_#_#_#Q Zdlqtu vv*t:qF nQkZibgi!eq%dx(b+a.`1_3^5^7^7^8_3a-b)c&d%d%d%d%S]gotxyzz(x7vD sNpWm_kg!jn%hu(g}+e.d1c4b6|b8zb9yb9yc4ze/{f+|g(|g&|g&|g&|g&U`jrx{}~~%}5zA wLtUr]pd nk$lr(kz+j.~i1{g4xg6vf8tf9sf:sg6ti0uj,vk)wk'wk'wk'wk'Wcmu{#2~? {JySv[tb ri$qp'~ow+{n.xm1ul4sk7pj9nj:mj:mk7om1pn-qn*qo(qo(qo(qo(Yepx~ 0=H}Q{Yy`wg#|un'ytu*vs}.sr1pq4mp7jo9ho:go:gp7iq2kr-ls*ls(ls(ls(ls(\hs{ .;EOW~^{|e"x{l&tys*qx{-nw0kv3hu6et8ct9at:at8cv2ev.fw+gw)gw)gw)gw)_lv +8C LUz\vc!sj%oq)l~y,h}/e|2b{5_z7]z8\z9\z7^{2_{.`|+a|)a|)a|)a|)boz(6A JzRuZqamh#jo'fw+c.`1]4Z6X7V7V6X1Y-[*[)[)[)[)fs~$2> yHtPoWk^he!dm%`u(]~+Z.W1T3R4Q5P4R0S,T)U(U(U(U(kxƒ ~/x;sE nMiUe\ac^j![r%W|(T+Q.N0L1K1J1L-M*N(N&N&N&N&p}~ zu*p7lA gJ cR_Y[aXhTp Qz#N&K)H*F,E,E+E)F'G%G$G$G$G$w„tol$h2d=_F [O XVT^QfNnKxH E"C$A%@%?%?#@"@!@ @ @ @ ~wjca^,Z8WBSKPS M[JcGkDuB?=;:99999999ymbVSR#P0M;JEGNEWB_ @h =r ;~8Ì6Û5ë333221111{ncXMD CB%@2?==G;P9Y6c4n2z0҈.Ҙ -ө ,Ӿ , + * ) ) ) ) ) |ocWLB9 542'120=.G-P+Z*e(q&%#"!  }pcVK@6/-+)"'+%4#<!ENXdqqcVI=3*&$ !")19AJUa o   rcVH;0&  $ + 2;DO\k}sdVG:.# $+3=IVfx%+()))(,#2;GUbp|()+&,&+)(/"8 DR_ly*&.#/"/%,+*5'A$N"[ ht."243 2&22/>,J*W'd&p%{$$$$$$$$$$$$%%%%%%%%%2688:#9-8:5F2R0_.k-v,,+++++++++,,, , ,,,,,,5:=?AA)@4=A:M8Z6e5q4{3 3 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 4 4 4 9>AEHH$G/D;BG?T>`>>>>>>?@@AAAAA@F K Q STT"R-P;OIMUK` IjHsG{FEEDCCCCCCEEFFGGGGDJPU X YXW$W5UDTPR[ PeNmMvL}KJIIH H!H"H"H"IKKLLLLLG MTZ]] \]]0\?ZLXW V`TiSqQxPOO N!M#M$M%L&L&N"OPQQQQQIPX^bca bc,b;`H]S [\ZdXlWtU{T T"S$R%Q'Q(Q)Q*R&T"UVVVVVLS\bfhggh(g8eEcP aY_a]h\pZwY!X#W%W'V)V*U+V,W)X$Y ZZZZZNW_fjlklm%l5jBgM eVc^be`l_t^{!]$\&[(Z*Z,}Z-|Z.{[+|\&|]"}^}^}^}^}^PYcjnpppq"p2n?lJ jSh[fbeicpbx!a$`&}_){^+x^-v^.u^/t^-u`'va#wb wbwbwbwbR\fmrtttut/r=pG nQlYj`ighnfu!}e}$zd'wc)uc,rb.pb/ob/nb.od(pe$qf!qfqfqfqfT_ipuxxx yx-w:uE rNpVo^md}lkzks wj{#ti&rh)og,lf.jf/if0hf/jh)ki%li"lj lj lj lj Wblsx{|| }|*{8yC wLuTs[{rbxpiuop rnx#om&ll)jl,gk.ek/dk0bk/dl*fm&fm#gn gn gn gn Yeov|(5~A|J ~zRzxYvw`svgptnmsv#jr&gq)dq+bp-`p/^p/]p/_q*`q&ar#br br br br \irz%3>~H yPu~Wq}^n{ekzlhyt"ex}%bw(_v*\v,Zu.Yu.Xu.Yv*[v&\w#\w \w \w \w `lv~!0~;yE tNpUl\icfjbr _{#\~&Y})W|+U|,S|-R|-S|)U|%V|"W| W| W| W| dpz},x8sBnK jSgZca`h]pZy!V$T&Q(O*M*M*M'O$P"PPPPiu~ yu(q5l?hH dP aW]^ZfWnTwQ N#K%I&H'G'G$H"I JJJJn{upm#i0e;aE]M ZT W\TcQkNtKHE C!B"A"A BBCCCCuyjec`+]6Y@VISQ PY M`JiGrD}B?=<;;;;<<<<|}qdZWU#S0P;MDKMHUE] Ce @o >z;97655444444th\PI HF'E3C=AG?P=X:a8k6w4 2 0 / . . - , ,,,,vj^RG=876'534=3G1Q0[.e,q*)̐'̡&ʹ%%$#####xk_RG=4+ &%%%$0#;#E"P![ hvއߙ߬yl_RF;1)!'09CNZgw {m_RE9/% % - 5 ?JWfw}n`RD7,"  '0:ESbupaSC6*  !)4@N^r )"'"'*09E S ` m y             #&%$%$#',5BP]jv         &#( ( &""( 2?LYeq|*,,+)$(/%;"HTamw-0101 0*.6+C(O&\$g#r#|""""""""""###$$$$$$$146798%613=1J.V-b,m+w+*********++,,,,,,,,59: >@? =*;78D6Q5\4g3r3{222111 1 1 1 2 2 3 3 3 3 3 3 3 3 9= @ D FED#A/?<>J=W>>>>>>?@@@@AAA? DJNPO LLM0M?LLKWIa Hi GqFyFEDDCCCCCDEFFFFFFBGOSUUR ST+T;RHQRP\ Nd MlLtK{JJIIHHHHIJKKLLLLEKSX[[XXZ'Z7XDWOUX T` ShQoPvP~ONNMMM M MOPPPQQQGOW]``^]_#_3^@\KZT Y\XdVkUrTzTSRRQ!Q"Q"~R!~S~T~U~U~U~U~UJR[adecbc c0b=aH_Q ^Y \a[hZoYvX~WW}V!{V"yV#wV$vV$vWwXwYwYwYwYwYLV_ehihg hh-g:eEcN bW a^_e^l]s~\{{\y[vZ!tZ#rZ$qZ%oZ%p[ q\q]q]q]q]q]OYbhlmlk ll*k7iChL fT e[cb}bizapxaxu`s_p^"n^$l^%k^&i^&j_!k`kalalalalaQ\ekoqqoop'o5n@lIjR ~iY{h`wffufnrevpd~mckc"ib$fb%eb&db&dc"edfdgdgegegeS_hosuusst$s2r>pG}oO ymWvl^skdpjlmjski|hhfg"cg$af%`f&_g&_g"`hahbhbhbhbhWbkrwyywxx!x/w;|uExtM trUqq\npckojhnqfnzcm`l!^l#\k%Zk&Yl&Zl#[l\m]m]m]m]mZfov{~~||}}-||9wzCsyK pxS lwZivafuhctoasx^r[r Yq"Wq$Uq%Tq%Tq"VqWqWqXqXqXq^isz {)v6r@nIj~P g}Wd|^a{f^zm[zvYyVxSx!Qw"Pw#Ow#Ow!PwQwRwRwRwRwbnw} xt&p2l=hFeN aU ^\[cYkVtS~PNL J!I!I~J~K~K~L~L~L~gs||uom!i.e9bB^K[R XY VaShPqM{JHFDCCDDEEEEmxylfca)^5Z>WGUORV O^ LfJoGyDB@>===>>>>>ssd\ YW"U/R9PCMKJSHZEc Cl @v>;9877666777{wk_RMKJ'H3F=DFBN@V>_;h9s7 4 2 1 0 0 / / / / / / {ocWKA>=;):49>7G6P4Z2d0o.|,*)(('&&&&&~qeYMB8/ -,+)*3)=(G'Q&\%h#v"Ɔ ƘƫsgZNB8/& %/:DP]k|׏ؤٻuh[NB7-$ # - 7 B O ]mwi[NA5*!  "*4?L\myj\N@3(  &0<IZm{l]O@2&  !+7FXk&$$'- 6CP^kv#!!#)2 @ MZgs}""!$/<IV b n y         %&%! !+7EQ^it})*)'(''#3 ?LXdnx-.. //.!,-)9&F$S"^"i!s!|!!!!!!!!""##$$$$$$$02 36 652%02-?,L+X+c*m*v**********++,,,,,,,4 69<< ;85)473F4R3]3g3p2x222211122 2 3 3 3333337:>AA? <:;1<@DGHF@ BD+D;DHCSB\BeAl@t @{ ? ? >>>>>>??@@ A A A A =CINONIIJ&K6KCJNIWH`Gg Fo Fv E}EDDCCCCDEFFF F F F @GOSUTPOP"Q2Q?PJOSN\Mc Lj Kq JyJIIHHHHHJJKKKKKCKSXZZWTVV.V;UFTPSXR_ Qf PmOtO|NNM~M|MzMyMxNxOxOxPxPxPxPFOW\__\Y Z[*[8ZCYLXUW\ Vc UjTqSy}SzRxRvQtQsQqQqRqSqTrTrTrTrTHS[`cca^ __'_5^@]J\R[Y Z` }Yg{XnxXuvW~tVrVoVnUlUkVkVkWkXlXlXlXlXKV^dghfbcd$c2b=aG`O}_V z^] w]d u\ks\sp[{n[lZjZhYfZeZeZe[f[f\g\g\g\NYagjljggg!g/f;eD{dMxcT ub[ raa paim`pk_yi_f^d^b^a^_^_^`_a_a_b_b_b_Q\djnpnkjkk,~k8zjBviJshRpgY mf` keghdnfdwdcac_b]b[bZbZb[c\c\c]c]c]cU_hnrtsoo o}p)yo5un?rmHnlPklW ik^ fjedilaiu_h\hZgXgVgUgUgVgWgWhXgXgXgXckrvxwss |txt&tt2ps=msFjrNgqU dp\ apc_oj\nsZn|WmUlSlQlPlOlQlQlRlRlRlRl\gov{||xzyuyrz#nz/ky:hyCdxKawR_wY \v` YuhWtpTtzRsOsMrLrJrJrKrLrLrMrMrMr`kt{z~snkh,e7b@_H\~PY~WW}^ T|f Q|nO{xL{JzHzFzEzDzEyFyFxGxGxGxepywkf c`'^3[<XEVMSTP[Nc Kl IvFDB@?>??@@@@kvse] ZX!V-S8QANILPJXG`Ei Bs @ ><:98889999r}zm_TONL'J2H<FDDLBT@\>f;p9|7 5 3 2 2 1 1 1 1 1 1 zrfZNE B@?*>4<>;G9O7X5a3l1y/-,+**)))))vj^RF<5 32!1+/5.>-H,Q+[)g't&$#"!!  zm`UI>3*$ "! !* 3=GR^l|}obVJ>3*! %/:F R ` p ΃ Η ά qdWJ>2(  $.9ERbsވߝ߳seXJ=1&  "+6CRbvugYK</$  '3@QcwwhZL<."  #/>Obw#!!$*3AN\ht~  %0=KXdpz! , 9FS_ku~ (4 A N Zfpy ##!#/;IU`jt|'' % & %# (5BOZenw+ ++- ,)& #-!:HT _ h q!y!!!!!"""##$$$$$$$$//232/+'"'2)A*N*Y*b*k*s*z******+++,,,--,,,238995. /1,3;3H4S3\3e3m3t2{222222223344444458>BB?88:&;6EIJGA?A!B1C>CIBSA[Ab@j@q?x?? > > > > >?? @ @ @ AAA<CJOPNIFHI,I:IEHNGWG^FeFlEs E{ D D DCC~C|D{DzE zF zF zF zF zF >HOTUTPL MN(N6NAMKMSLZKaKhJo Jw ~I |IzHxHwHuHtIsIrJrJ rJ rJ rJ rJ BLSXZYVRRS$S2S>RGQPQWP^~Oe{Ol yNs wN{ uMsMqMoMnMlMlMlNlOlO lO lO lO EPW\^^[VVW!X/W;VDVM|UTzT[wTbuSh sSp qRx oRmQkQiQgQfQeReRfSfS fS fS fS ISZ_bb_ZZ[[,[8}[AzZJwYQtXXqX_oWf mWm kVv iVgUeUcUaU`U_U`V`VaWaW aW aW LV^cffd^^__)|_5x_?t^Gq]Oo\Vl\\j[c h[k fZs dZ}bZ_Y^Y\Y[YZY[Z[Z\Z\Z \Z \Z OYafijhbb ~czc&vc2sc<obElaLjaTg`Ze`ac_i a_q _^{]^Z^X]W]V^U^V^V^W^W^ W^ W^ S]djmnmg~g xgtg#qh/ng9kgBhfJefRceX`e_^dg \do ZcyXcUbSbRbQbPbQbQbRbRb Rb Rb V`hnqsqkxkrknlkl,hl7fl@ckH`kO^jV\j]Yie Wim Uiw ShPhNgMgKhKhKgLgLgMg Mg Mg Zdlrvwvyqqqkqhqfr(cr4`r=^rE[qMYqTWp[TpcRok Pot MnKnInGmFnEnFmFmGmGl Gl Gl _iqw{|{uxkwew ax_x$]y0Zy:XyBVxJSxQQwXOw`LvhJvr Hu} EuCuBu@u@u@t@tAs As As As dnv|re]YW U+S6Q>OFMNKUI]FfD~pB~{ ?~ =} <} :}:~ :| :{ :{ :z :z :z it|{n`UPNM&K0I:HBFJDRBZ@c=m;x97 5 4 3 3 3 3 3 3 3 pzuhZOG DCA*@4?==E;M:V8_6i4u20.-,,+++++xzmaUI?976"4,352>1G0P.Z-d+q)'&$###""""reYNB7.)('"&,%5$?#H"S!^ jyuh\PD9/&!*4>ITbq yk^RF:/%   (2=IWfwƋƠŶ{m`SF:.$ '1<IXi|ֿ֧֒~oaTF9-"  $.:IYkqcUG9,  !+8HZmteVH9+  (6GZn  !'0>LYepz!-:HUalv (6CP\gqz  $0>KWblu}  * 8EQ\fow !  #0>J V ` i q y %##$! '5COYcks{('**'" -< I S!]!e"m"t"|"""####$$%%%%%%%,-243.% %'')6*C+N+W+`+g+o+v+}++++++,,---.---03:=<91.0!203=3I3R3Z3b3i3p3w2222223344444443:ADDA;789+:8;D;M:V:]:d:k9r9z9999999:}:|;|;|;|;|;7@GJKIC> ?@&A4A?AIAQ@Y@`@g?m?u?}>}>{> z> x> w? u? t@t@t@s@s@s@;ELOPOJDEF"F0G<FEFNFUE\~Ec|DjzDqyDywDuC sC qC pC nD mD mE lElElElElE?IPTUTPJIJK,L8KBKJ|JRyJXwJ_uIfsImqIvoHmH lH jH hH gH fI fI fI fJfIfIfICMSXYXUNNOO)P5{P?xOGvOOsNUqN\oMcmMjkMriM|gL eL cL bLaM`M`M `N `N `N`N`NGPW[]]ZSR S|S%yT1uT<sSDpSLmRSkRYiR`gQheQpcQyaQ `P ^P \P[QZQZQ ZR [R [Q[Q[QJSZ_aa^WV zWvW"sX.pW9mWAjWIhVPfVWdV^bUe`Um^Uw\U ZU YU WUVUUUUU UU VU VU VUVUMW^beec\{[u[q[n\+k\6h[?e[Gc[NaZU_Z\]Zc[ZkYYuWY UY TY RYQYPYPY QY QY QY QYQYQZafhig}`u_o_k_h`(f`3c`<a`D__L\_S[_ZY_aW^iU^sS^~ Q] O] M] L^K^K^ L^ L] L] L]L]T^ejmmlxeodidedbd%`e0^e:\eBZeJXdQVdXTd_RdgPcqNc{ Lc Jc Hc Gc Fc Fc Fb Gb Gb GbGbXbinqrqtkiici _i\j!Zj-Xk6Vk?UkGSjNQjUOj]MjeJinHiyFi Di Ch Ai @i @h Ah Ag AgBgBg]fmsvwvpreq\pXpVpTq(Rq3Pq<OrDMqKKqSIqZGqbEplCpwAp?p=o ;p ;p :o ;n;n;m;m;mbksy{|{|mz`xVwPwNxLx$Ky.Iy7Hy@FyHDyOByWAy`?xiC=K;S9\7f5q310.----~-}-}-}nx}pcUKA;98"7,654=3F2O1X/b-n+{*(&%%%%%%%vvi\PD:1-,+$*-)6(?'H&R%\#h"w zmaUI=3*! $-6?JUapqdXL@5*" "+ 5 @ K X gxugZNA5+!  "+6AN\mxj\OB5*   "+5AP`rχϝϳzl^PB5) (4AQcw|n`QC5(  $1ASf|paSE6'  !.@Sh  $.<JVcmw *7ER^ir{ %3@MYdmv}  -:GS^hpx  &4AMXbjry  ,9FQ[dlsz   " 1 > J U^fmt{" #$! )7DNW`gnu|&'-/-'"1 =!H"R"Z#b#i#o#w#~#$$$$%%&'''''')06872+%')+*8*C+L+U+\+c+j+q,x,,,,,,-.....~.~..7=??<5/ /1&232>3H3P3X3^3e3l3s3|333}3|3z3y4w5v5u5u5u5u53=CEFC=668!9.999C9L9S9Z9a~9h|9oz9wy9w9u9t9r9q9o:n:n;m;m;m:m:9BHKKID><=>*?5??~?H|?Oz?Vx?]v>dt>kr>sp>|o>m>k>j>i?g?g?f@f@f@f?f?=FLOPOJDA BC&}D2zD<wDDuDLrDSpCYoC`mCgkCoiCyhCfCdCcCaC`D`D`D_D_D`D`DAJPSUSOIG }GyG"vH.sH8qHAnHIlHPjHVhH]fGdeGlcGvaG`G^G\G[HZHZHZIZIZHZHZHDMSWYXTN}KwKsLpL+mL5kL>hLFfLMdLSbLZaLb_Lj^Ls\K~ZKXKWLVL UL TLTMULULULULHQW[\\YSwOqOnPjP(hP2eP;cPCaPJ_PQ]PX\P_ZPgXPqWP{UPSPRPPP PP OPPPPPPPPPPPKTZ^``]|WrTlShTeT$bT/`T8^T@\THZTOYTVWT]UTeTTnRTyPTNTMTKTKT JTKTKTKTKTKTNW^bddbw[mXfX bX_X"]Y,[Y6YY>WYFVYMTYTRY[QYcOYlMYwKXIXHXGYFYEYFYFXFXGXGXR[afhigr`h^a] \]Z]W])V^3T^;R^CQ^JO^RN^YL^aJ^jH^uF^D]C^A^@^@^@]A]A]A\A\V_fjmmlogdd[bVbTbRc%Pc/Nd8Md@KdHJdOHdWFd_EdhCdsAc?c=cr@=rH;rP:rY8rc6rm4rz3r1r/r.r.r.q.p.o.o.ofovz|~}r}d|W{LzBy)G(P'Z&f$s#! t}~qeXL@6,% #"!% .6@IT`n~}wi]PE9.% $-7ALXg w {m`TH<0& $.8DP^nqcVJ=1&  %/9FTdvtfXK>1&  $.:GWi}ɔȪwhZM?1%  "-9IZn߅ߜ߲yk\N@1$   +:K^sm^PA2$ ):Mbx!+9GT_js{ '4BO[env~  "/=JU`iqy  )7DPZcksz "0=IT]emsz  (6BMW_fmtz -:FPX`gnu{   %2?IRZahov}#(*'!,8CLT\bipw     $,131-%  &!2"="G#O#V#]$d$k$r$z$%%%&~&}'{'y(x(x(x(x(+39;:6/('( )-*8+B+J+R+X,_,f,m},u{,~z,x,v-u-t-r.q.p/o/o/n/n/1:?AA>81./0(132=2F}2M{2Ty2[w2au2it2pr2yp3o3m3l3j4i4h5g5g5f5f5f46?DGGD?94 56$|7/y79w8Bt8Ir8Pq8Wo8^m8el8mj8uh8g8e8d9b9a:`:`:_:_:_:_:;CIKLJE?: {:w; t<+r<5o=>m=Fk=Mi=Sh=Zf=ad=ic=ra=}`=^=]>[>Z>Z?Y?Y?Y?Y?Y>?GLPPOKEz@u?q@m@(kA2iA;gABeAIcAPaAW`A^^Af]Bo[BzZBXBWBUCTCTCSCSCTCTCTCBJPSTSPJuEnCkDgE$eE.bE7aE?_EF]EM[ETZF[YFcWFlVFwTFSFQFPGOGNGNGNGNGOGOGFNTWXWT{NpJiH eHbI!_I+]I4[I<YICWIJVIRUJYTJaRJjQJuOJNJLKKKJKIKIKIKJKJKJKIQW[\\YvSkNdM _L\MZM(XM1VM:TMASNHRNOPNWON_MNhLNsJOIOGOFOEODPDOEOEOENENLU[^``^rWgS^QYQWQTQ%RR/QR7OR?NRFMSMLSUJS]ISfGSpES}DSBSAT@T?T?T@S@S@S@RPX^bee}bn\cYYVTVQVOV"MW,LW4JW<IXDHXKGXSEX[DXdBXn@X{?X=X^a<^l;^x9^7^6^5^4_4^5]5]5\5\Yaglnnvlgi\fQdHb DbBbAc$?c->c5=d=s4r 1s0s/s#.s+-t4,t<+tD)tM(uW'uc%uo$u"u!u uutsr q qksy|~tgZM~C~8}/}(} &}$}#~%"~-!~6!~?HR^kz~|{{{rz{m`TH<2( &.7ALXeu {seYLA4*!   & / 9 DP^nwj]PD8,"  '1<HVew{m`SF9-#   (2>L[lqcUG:-"  '2@O`tËáøseWI;-! &2ASf|ٔ٫vgYK<.!  $2CVkj[L>/   #3FZq(7DQ\fow~$2?LWajry ,:FR\eltz  &4@LV_gnt{  -:EOX`hnt{  %2>IRZahnt{  *7BKT[bhnu{  !.: D M U \ b i o v ~  $%" '3>GOV\cipx}||{{!)-/,' !-8AIPW^dks|}|zxwv t!r!q"q!q!q!(05751+# !'"2#<#D~#K|$R{$Yy$_w$fv%nt%ws%q&o&n&m'l'j(i)h)h)h(h(.6;==93-' '("|)-y*7w*?u*Gs+Nq+Tp+[n+bl+jk,ri,}h,f-e-d.c.a/`/`/`/`/`.4<ACC@:4.z-w.s/)q03o0;m0Ck1Ji1Qg1Wf1^d1fc2oa2y`2_2]3\3[4Z4Y5Y5Y4Y4Y48@EHHF@;y5s3o4l4%i5/g57e6?c6Fb6M`6T_6[]7c\7k[7vY7X8V8U8T9S9S:S9R9S9S9<DILLKF}@s;l8 h9e9"c:+`:4^:<]:C[:JZ;PX;XW;`V;hUM>M>M>M>M=M=@HMPQOKyEn@f= b=_=\>(Z>1X>8W>@U?FT?MS?UR@]P@fO@pN@|LAKAJAIBHBHBHBHBHAHADKPTTSPuJjFaB\AYBWB%UB.SB5QB=OBCOCKNCRMDZKDcJDnIEzGEFEEFDFCFCFCFCFCECEGOTWXX~UqOfJ\FWFTFQF"OF+NF3LG:KGAJGIIHPHHXGHaEIlDIxBIAI@J?J>K>J>J>I?I?IJRX[]\{YmSbOWLQJ NJLKJK(IK0GK8FL?ELFDLNCMVBM_@Mj?Mv=NRT2]F1^N0^W/^b-^n,_}*_)_(_'_'_'^'](](\\djnoyonn`kTiIg?e5c 2c0c/d!.d)-d1,d9+eB*eJ(eT'e_&fk$fz#f"f fff e d c!cbjpsuuuit\rOqDo:n0m)l 'l&l%m$$m,#m4"m=!nF nPn[ngnvnooonmlkkiqvy|{q{d{WzJy?x5x+w"vvwww&w.w7x@xJxVxcxrxxxxwvuutqx|wj]PD8.$ '0 9 D P ] l~y~}obUI=1&  )2=IVevtfYL@4(  "+5@N\nxj\OB6) "+6DScw{m_QD6*  !+8GXk~pbSF8*   +:K^sҋҤӻsdVG9* *<Od|fXI;+  +>Sj&4AMXbksz !.<HS]fmu{  )6BNW`hov| #0<GQZbiov|)5AKT\ciou{ ".:DMU\ciou{ '2=FOV\chou|  *5?HPV\ciov  !  # . 8 A I P W ] c jqz~|{zxvuttt&**(#'2;CKQ~W|^{eylwtv~trqonmkjjjj&-131,& "~,{6y>wEuLsSqYp`ngmpkzjhge d!c!b"a"a"a"a",48985/(!{ w!t"'q"1o#9m#Ak#Hi#Nh$Uf$[e$cc%kb%ua%_&^&]'[([(Z)Y)Y)Y)Y(29=??<60y*r&n'k(#i(,f)5e)<c)Ca*J`*Q^*W]*_\+hZ+rY,}X,V-U-T.S.R/R/R.R.R.6=BDDA<{7r1k, g-d-a.(_.1].9\/@Z/FX/MW/TV0\U0dS1nR1zQ1P2N2M3M4L4L4L4L3L3:BFIIGBw=m7d2 `2]2Z2%X3-V35U3<S4CR4JQ4QP4YO5aM5lL6wK6J7H7G8G8F8F8F8F8F7>EJMMK~GsBi=_7Z6W7T7"R7*P72O89M8@L8GK8NJ9VI9_H:iG:uE;D;C<B<A=A=A=A<A<A<BINPQP{LoFeBZ=T;Q;O;M;'K;/I<6G<=G\C>gB?s@???>@=@Ce=Cq;C:D9D8E7E7E7E7D8D8CIPUXYXvVhP]LSHJE FDDDBD"AE)?E1>E8=E?I=I;J&:J.9J58K=7KD6KM4LV3L`2Ll1Mz0M.M-N,N,N,M-M-L-LPX]ab{ap_b[XXNUCQ;O 8O6O5O#4P+3P22P:1PB0QJ.QS-R],Ri+Rx)R(S'S&S&S&S'R'Q'QU\bfgxfme`aU^J[?X5V1U0V.V-V',V/+W6*W>)WG(WP&XZ%Xg$Xu#Y!Y YYYX X W!WZbgkluljk]hQeFc;`1^*] (]&]%^#$^*#^2"^:!^C _L_W_c`q`````_^^]`hnp|rrrfqXnLlAk6i-g#fffff%f-g5g>gHgSh_hnhhhhhgfeegosvxxmx`wSvFt;s1r'qqp pppq'q/q8qBqN q[ qi qz qqqppo n nouy~|t~f~Y~M~@}5}*|!||| | | ||!|)|2|=|H|U|c|t|{{zyyyxw|yl^QE9-#  #,6BN]m~~qcVI<0$  $.9FUexugYL?2&  %/<K[nxj\NA3&  $0?Pbx{m_PB4&  $2CUj̜̃˵paRD6' $5H\scUF8(%8Mc|#0=IT^fnv|  +8DOYaipw}%2>IS\cjqw}  ,8CMV]dkqv|%1<FOW^djpv| *5?HPW^diou|#.8AJQW]ciov} &1:CJQW]cipw~}{zzyxx  )3<DKQW]c}j{rz|x v t s q p o nmmm#&&$   " ,~ 5|=zExKwQuXs^qepnnwlkihfedccbb$*./-("}yv's0q8o?mFlLjShYgaeidrb~a_^\\ZZYYY*15641+%ysol"i+g3e;dAbH`N_U]\\d[nYyXV U T!S!R"R#R#R"R"/6:<;82z-r&j f c!a!&_"/]"6["=Z#DX#JW#QU#XT$aS$jQ%vP%O&N'L'L(K(K)K(K(K(4;?A@>9u3l-c'^&\&Y'"W'+U(2T(9R(@Q(FP)MN)UM)]L*gK*sI+H+G,F-E-E.D.D.E-E-8?CEEC{>q9g4^.X+U+R,P,'O,/M-6L-<J-CI-JH.RG.ZF/dE/pC0~B0A1@2?2?3?3?2?2?2<CGIIHxDm>c9Z4R0 O0L0J0$I1+G12F19D1@C2GB2OA3X@3b?4m>4{=5<6;6:79797:7:6:6@FKMNLuHjC`>V9M5 I4G5E5!C5(A5/@56?6=>6E=7M<7U;8`:8k99y897:5:5;4;4;5;5:5:CJNQR~PsMgH\DR?H:D9A9?9>9&<9-;:4::;9;B8;J71>0?/?/?/?0?0>0>GMRUV|UqRdLYIOEE@?> <>:>9>#7>*6?15?84?@3@H2@Q1A[0Ag.Bu-B,C+C*C)D*C*C+B+BJQVYZyZnWaRWNMKCG:C 6C4C3C 2D'1D/0D6/E=-EF,EO+FY*Fd)Gr(G&G%H$H#H$H%G%G&GOUZ^_w^k\_XUUKQ@M5J0I.I-I,I$+J+*J3(J;'KC&KL%KV$Lb#Lp!L MMMNMLL KSZ_c~dtcia\^R[GXf3e)c a` ````&`.a7a@aKaX af bv b a aaa ` _ _fmq~suujt\sOrCp8o-n$lkkj j j j! j) j2j<kGkSkakqjjjiiihhmsw{zp{c{VzIz=y1x'wvvv v vvvv$u,u6uAuNu\ulu~ttssrrquz~vi[NA5)  &/;GUex~}}|{n`RE9,!  (2?M]prdVH;." )5CTf{ugYK=0# )8HZoxj\M?1# +<NbzƔƭl^OA2$  -@Tk`RC4%  1F\t ,9EPYbjqw~'3?JT]dkrx~ ".9ENW^elrw~ (3>HQX_ekqw} "-7AJRY_ejpv} &1:CKRX^dipv~  *4<DKRX]cipw  #,5>EKQW]cjqz}{ywutrrrqq  %/7>~E}K{QyWx]vdtkrtpnlkihgff e e  ##  |y(v0t8r ?p Eo Lm Rl Xj _h gg pe zc b ` _ ^ \\[[[!(++)${u q n!k*i2g9e@dFcMaS_Z^b\k[vYXVUTSRRRR(.221-'z!rk gda%_-]4\;[BYHXOVVU^SgRrPONLKKJJJJ-47874}/t)l#d^[Y!W)U0T7R=QDOKNRMZKcJnI|GF E!D!C"C"C"C"C"28<>=:y5o0f*^$W T Q O!%N!,L!3K":I"@H"GG"NF#WD#`C$kB$yA%?&>&='='=(=(='='6=@BB?v;l6b0Y*Q% M%K%I%!G&(E&/D&6C&=B'DA'K?(T>(]=)i<)v;*9+8+7,7,7,7,7,8,:@DFF}Ds@h;_6U1L+G)E*C*A*%?*,>+3=+9<+A;,H:,Q9-[8.f6.s5/4/30201111212030>DHJJ{IpEe@[;R6H1B. ?.=.;."9/)8//7/660>50F41O31Y22d12q03/4.4,5,5,5-5-4.4AHLNNyMnJbEX@N<E7=3 93736343&33-24414<05D/5L.6V-6b,7o+7*8(8'9&9'9(9(8)8EKORSwRlO_IVFLBB=88482818/8$.8+-92,99+:A*:J);T(;_'!>"=#=#<IOSVWuVjS]OSLJH@D6@/= -=+=*>!)>((>/'>7&??$?H#@R"@]!Aj AzABBBBBAAMSX[}\r[gX[TQRHN=J3G*C &C%C$C#D%"D,!D4 E<EEEOFZFhFxGGGHGGFFRX]`zap`e^YZOXDT9Q/N&K JJJJ!K(K0K8KBLLLWLeMuMMMNMMLLW]bewfmfcdVaJ^?[5X+V"TR RRRR$R,R4R>SHSTSb Tr T T TT T S R R]dh~ktlkl_jRgEd:b0`&^][Z ZZ [ [' [0 [: [E[Q[^[m[[[[ZZZYdkn{prrgqYpLn@l5k*i!gff e eedd#d,d5d@dLdZdid{dccbbbalquxwmx`wRvFu9t.t#rqq qqp ppoo&o0o;oGoTodounmmlkkksx}{s}e~X~K~>~2~&}|| |}}| ||||!|)|4{@{N{^{ozzyxwvvzxk]OB5)  ",8FVh|}oaSE8+  ".=M^srdVH:,  #1ASgugYJ<-   $5G[rj[M>/! '9Md~ܙܰ]O@2" *?Um  (4ALU]elrx~#/;FPX_flrx~ *5@JRY`flrx~$/9CLSZ`fkqw~ )3=EMTZ_ejpw",6>FMSY^djpw &/7?FLRX]cjqy~|zxxwww (19@FLRW}]{czkxsv}tqpnlkjjjj !~*{2y9w@uFsLrQpWn^mekniwgecb`__^^^  ~ yur#o+m3k:i@gFfLdRcYa`_i^s\ZYWVU T T T T %((%!{tn if d %b -` 4^ :] @[ GZ MX TW \U dT oR {PONLLKKKK&+//-)}$tle_\ZX'V.T5S;RBPHOPNWL`KkIxHFEDCCCCC+14541x+o&f ^W TQO#N*L1K7I>HDGLETD]CgAt@?=<;;<<<069;:~7s2j-a'Y!Q LJHF&E-C3B:AA@H>P=Y<d;q987 6 5!5!5"5!6!4:>??{<p8g2]-T(L"FCA?"> )= 0; 6:!=9!E8"M7"W6#b4#n3$~2$1%/%/&/&/&0&0&8>BCCxAn=c8Z3Q.H(@$ =#;$9$8$&6$,5%34%:3&B2&J1'T0'_/(l.({,)+***)*)+*+**+*<BFGGvElBa=W8N3D.<) 7(5(3(2(#0()/)0/*7.*?-+H,+R+,]*,j(-y'-&.%.$/$/%/%/&.?EIK~LtJjG^BT=K9A48/2- 0-.--- +-'*..).5)/=(/F'0O%0[$1h#1w"2!23333 3!2CIMO|PsOhL\FRCI??;66.2 +2)2(2&2$%3+$32#4:"4C!5M 5X6e6u77788877GMQS{TqSfPZLPIGE=A3=*9 %7#7"8!8" 8(80989A:K:V;c;r;<<==<<;KQUXyYnXdVXQNOEK:G0C'@ > >>>>%>-?5?>?H@S@`ApAAABBAA@PVZ]v^l]b[VWLUAQ6N,K#HE DDEE"E)E1E;FEFPG^ Gm G G GGG G F FU[`}bscjb`aS^GZUJVWVeUwUUUTTSSbhlwnoocnVlIj=h2f'ecba `` ____&_/_:_E_S_a^r^]]\\[[jo}rutju]tOsBr6p+o nml lkk jjjj!i*i4i@iNi\imhhgfeedqvzyp{b{U{Hz;z/z#yxw wwwwv vvvv#v.u:uGuVuht|tsrqppy}vhZL?2%  &2?O`u~~zl^PB5'  (6EWk~paSE7)  *:L`xsdVG9* .@TjgXJ;,  2F]vԒի[L=/ $8Ng $0<GQY`gmsy  +7BKS[agmsy&1;EMU[aglrx  *5>GNU[aflrx $.8@HNTZ_ekqx (19AHNSY^djqz~ "*2:AGMRX]dks}}{xvusqpppp  $,3:}A{GyLwRvWt]rdpmovljigedccbc ~zv%t-q4o:n@lFjLiRgXf_dgbq`|^\[YXXXWW~ w rnjh'e.d4b;`@_F]L\SZZXbWlUwSRPONMMMM"%%"}un g c_]![(Y/W5V;TASGQNPUN^MgKsI H G E D D C C D $),,*&w!nf_Y U S Q "O )M /L 6K <I BH IF QEZDdBp@?><;;;;<)/221|-r(i#aYQLJHF$E+C1B7A>@E>M=V<a:m9|76543444.4786x4n.e*\$TLF B@? ='<-;49:8B7J6S5^3j2y0/.---..28;<<v9k4b/Y*P%G@ <:86#5)40372>1G/P.[-g,v*)(' & ' ( ( 6<?A}@t>i:_5V0M+D%; 6320 /&.--4, ;+ D*!N)!X'"e&"t%###"$!$!%"%"$#$:?CE{DrCg?]:S6J1A,8&1# .","*")"#(#*'#1&$9%%A$%K#&V"&c!'r'(())))(>CGIzIpGfDZ?Q;G7>25-,( ('''%'$'!#('"(.!)6 )?*I*T+`+o,,------AGKMxMnLdIXDO@F==834*/$, !, ,--%-,.4.</F/Q0^0m11122211EKOQvRmPbNVIMFDC;?1:'62 2222"3)314:4D4O5\5k6}66 7 7 666IOS~VuVjU`SUOLLBI8E.A$=:88899&9.97:A:L ;Y ;h ;z ; <<<< ; ;NTX|[r[hZ^XSUIR>N4K*G!DB@ ??? @# @+ @4 @> AJAVAeAvAAAAAA@TY^y`p`f`]^Q[EW:T/Q%OLJH GGGG H(H1H;HGHSHbHsHHHGGGGZ`cwenfefYdL`@]5[*Y WUS RQ PPPP%P.P8PCPPP^PoPOONNMMaf}itllmakSiFg:d/c$a_^ \\[ ZZZY!Y)Y3Y?YLYZYkX~XWWVUUhmzprrgrZqLp?n3m(kjh ggff e eddd$d.d:cGcUcfczba`__^otxwnx`xRwEw8v+v tssrrrqq qpppp'p3o@oPo`ntnmlkjiw|{s}e~WI</"~~~~~~ ~ ~~~ ~+}9}H}Y|m|{zyxwwi[M?2$ "/?Pd{{m^PB4& $4FYppaSD6' '9Md~dUG8),@Vǫ͋XI:,2H`{ !,8CLT[bhntz '2=FOV\bhnsy",7@IPV\bgmsy &0:BJPV[aflrz *3;CIOUZ_ekr{ #,4<CINSY^dks}}{yxwwu&-5<BGMR}X{^yexmvvsqomljihhi  |'z.w5u;tArGpLoRmXk_ifgpe{cb`^]\\[[  { wso!l(j/h5g;eAcFbL`R_Y]a[jYuWUTSQPPPP wqkgda"^)]/[5Y;XAVFUMSTR\PeNpL}KIHGFFFE ""woh a ]YVT#R*P0O5N;LAKHIOGWFaDlCyA@>=<<<<"'))'{#qiaZ S OLJH$G*E0D6C=AC@K> S= ]; h: v8 7 5 4 3 3 3 4 ',//.w*m%d \TLF C A ? > %< +; 2: 88 ?7G6P4Z3f1t0.-,+,,-,145}4t1j+`'X!OG@ ;976!4'3-241;0C.M-W,c*q)'&%$%&&169:{9q6g1]-T(L"C;5 21/.$,*+1*8)@(J'T&`$o#!   4:=>y=o;e7[2R-I(@#80 ,*)' &'%-$5#>"G!R ^l~8=ABwBm@c<Y7O3F.=)5$- ' %#!!$ +2;E O!\!j"{""#####<ADFuFlDbAW<M8D4<03+*&#" !!""!"(#0#8$B%M%Y&h&y&'''(''@EH}JtJjI`FUAL>C::612(- ) ''''(%(-(6)@)K*W*f+w+ , , , , , +DIL|NsOiN^KSGJDB@9=/8%40- ,---#-*.3.= /H /U 0c 0t 0111100HMQzSqTgR]PRLIJ@F5B+>":74 33 3 3 4( 41 5;5F5R6`6q6666665MRVxXoYeX[UQRGOHPW]ciot{#.8BJQX]chnt{ (2<DKQW]bgmt{"+5=EKQV[afmt| %.6>DJPUZ_flu~~| '/7=CINSY_em~w|zxusrqppn !)07}={ByHxMvRtXr_qgopl{jhfecbaaa|xu#r)p0n6m<kAiGhLfRdYc`ai_t][YWVUUTU  {u plhf#c*a0`6^;]A[FZLXSV[TdRnQ{OMLKJIIIy qke a]ZX$V*T0S6Q;PANGMNKVI_GiFvDCA@??>?zrjb\WSPNL%J+H0G6F<DBCIAQ?Z>e<r:9866555 $&&$u ld\T N JGDB @%?+>1<7;>9E8M6V5a3n1~0/-,,,,%*,-{+r'h"_WOHA >;98!6&5,322 91 A/ I. S, ^+ l) |( & % $ # $ % */22y1o.e)\$SKC<5 3 1 / . "- (+ .* 5) ='F&P$\#j"{ /367v6m3c/Y*P%H ?80,*('%$$*#2":!C NZhx37:~;t;k8a4W/N+E&=!4-& #" !'/7AKWev6;>|?s?i=_9U5L0C,:'2"*" $,4>IUct  :?B{DqChB^>S:J6A29-1)(%  ")2<F S a !q ! " " " " " !>CFyHpHgF\DR?I;@884/0','# !!"" "'#/ $9 $D %P %^ &o&&&&&&&BGJxLoLeK[HPDGA?>7;-6$1-*( ' ( ( (% )- )7*B*N+\+l++++++*FKOvQmQcPZMOJGG>D3@)< 841 / ..//#/+050?0L1Y1i1|11000/KP}TuVkVbUXSNPEM:I/E%B>;9 7 6666 6)627=7I7W7g7y766655PV|Zr[i[`[WYLV@R5N*K HFC A@ ?>>>>&>/>:>F>T>d>v==<<;;W\y_paha_aT^G[:W/U%RPM KJI H GGFF"F,F7FCFQF`EsEDDCBB]bwenggh[fNcAa4^)\ZWVTSRQ QPOOO'O2O?OMN]NoNMLKJJe|itlmnbmTkGi:g-e"db` _^^]\[ ZZYY"Y-Y:YHXXXkWWVUTSlypsshsZrLq?p2o%nlk jjiihgff feee'd4dCdSdec{ba`_^}twwny_yQyCy6x)xwv uuuvuttsss rrr r,r;qLq_qtponlk{{r~d~UG9+  #2CVl~}|vhYK<.   '8Lb|j\M?0! -@Vo_PA3# 3Ib~SD5& %;Snߌݩ$/:CKRY^diou| )4=ELSX^cinu} #.7?FMRX]bhnu~'08@FLQV[agnv !)29?EJPUZ`gox}|{zwu #+28>DINS}Y{`yhwqu|spomkjiig }$z+x2v8t=rBqHoMmSlYjahjftda_^\[[ZZz uqnk%i+g1f7d<cAaG_M^S\[ZdXnV{TRQPONNM |unieb_]%[+Y1X6V;UASGQNPUN^LhJuHGEDCBBB{ sle_ [WTQO%N+L0K6I<HBFHEPCYAc?o>~<;:9888uld ]VQ MJGE D&B+A1?6>=<D;K9T7_6k4z210//.."$$z!qg_WP IE A><:!9&7,62483?1G0P.[-g+v*('&%%%#(**w(m%d [RKC = 96310"/'--,4*;)C(M&X%e#t"  (-/~/t.j+a&X!OG?81 .+)('#%)$ 0# 7! @ J U b r       -14|4r3h1_,U'L#D<4-& $ " !   % , 4=GSaq158z9p8g6]2S-J(B$91*# !)1:EQ_o     59<x=o=e:[7R2I.@*7%/!(  &.8BO \ l   8=@wAmAd?Z<P8G3>06+.''# # , 5 @ L Zi|<ADuElEcDYAO=F9>652..%*%!    "*3 > J!W!g!y!!!!! @E}HtJkJbIXFNBE?=<59+4"/+( $ ###$ $(%1%<%H&U&e&w&&&&%%EI{MsOjO`NWKMHDEO2L(HEB@=<; :999 9)949@9N9]9o887765UZv]m_e_]_R\DX8U-R"OLJ HFED C BAAA&A1A=AJAZAl@??>=<\|`scledfYdKa>^2[&YVT RQONML KKJJ"J,J9JGJVIhI~HGFEDcygrjkl`kRiDf7d*b`^ ][ZYXWVV UTTT'T4TBSRSdRyRQPON~jwnpqfqXpJoK=S;]9i7x6432211zph_ XQL HDA?=!<&:,91776>4F3O1Y/e.s,+*)((( !!ulcZR KD@ <8643!1'0,.3-:+B*K(U&a%p$"! "&(|'r%i"_WNF? 84 1.,*)"'(&.$6#>"G R^m~'+-y-p+f(]$TKC;4 - ) &$"! $*2:DO\j| +/1w2n1d.[*Q%I @81)#    ' . 7 A M Z i { /36v6l5c3Y/P+G&>!6.'       # + 4? J X g y37~:t;k:a8X5N0E,='5#-&    ( 2 <HUev6;|>s?j?`=W9M6D1<.4*,&%"   &/:FSbt:?{BrChC_BV?L;C7;430,,$)$   $-8DQ`r>CyFpHhH^FUDK@C=;:37*2 -)% "   " +!6!A!O!^"p"!!! CHxKoLfM]KTIJFBC:@/;%73/ ,)' &%&&!&)&3'?'M'\'m''&%%$HLvPnQeR\QSOJLAI5D+@!<96 20/ .----'-1-=-J-Y-k-,,+**M}RuUlWcW[VSUGQ;M0I%FC? =:87 6 5444$4.4:4G4W4h4}32110S{Xs[j]b][]OZBV6R*O LIGDBA?> ==<s0r#qo nmmmmlkjiiih hhg!g/g?fRffedcbawxmz_zPzBz3{%{zyyyyzzzxxwwwwwwww&v6vIu_uwtsrqq~cTE6(,?UmfWH9*!3IbZK<- '=UpM?/  /HbЀНи  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ݯŌh̜λŽzې[=eu4TӔ~I,Nʳ~emŮ滑tcĚsE&4}U0 `t5 R4Oi  R;5L[ML^`6`ʼϚmZF|>&T<.Sm1 aZ]5\} T}EDd/"7IXkA(?cղ廗wb۞g6 ?^ف9/Z$^w%j}[+L<0 -a''U'%ʝv]J<2-,09GԻ縏jK/og4<ւ;1oBPi7/"y4Ftjc)"aW7hӮ|uqprwۺiiȓe=ێLn|,E*"D}6jXFG5% ' p pUB3& &ӼҩeH,q<O5u#gCH.8thB`z]a$fɬ}vqligfgkpzŪyawݦwP, 1Np`o7@r_M;*3^+ ƣhM2|Fq|/;d tjK0/Ryt6m|i hpaPliZI9X)V/)G .>RhҰw]B( J}EP h6HuiR>3+X"\Jzwz LWhtңzX:)#RiC4yO]:*Ot3grD\A_KW $1?N`t¾~S?0# vuFNDkyf!SJ?w+ EM.*-E`ct˷|xtplhejH- 1B)kZN4 =eNCzt _t,8ESbrٲymd]VQKFA<82-(#K% f=3l 5[/^w^C@^N,>Rj|þm[L@7/(" 4v$Q|yfQ#:62/.1%B} 9b"Hri(N\3.2Rwr/BXpon~dVKC<60+'" RmQ:B#h >m7/Ptr*AZuXDTdu{xvtrsuxO:0(! #i 9c4[I9]{ !8RoX)9IZl~wqlhda^[YXWWY^eq1 V/W|7+a ,Pv0 #;Wvc*;L_tſld^YUQOLJHGFHKPYf&VP:y !2X1Z'KqI/Jhu&8J^urZSOKHFDCBABCGNYi}.VA{ 4`?%Jqf*Db5+>QhvPJGEDDDEFGKQZhA6ce 'Ls/*DbP6Ja{҇|SGIMQV`sV5Pmo>_{desc Little CMS Little CMSdesc2.x 2.xlcms2-2.19.1/plugins/test_profiles/test2.icc0000644000175000017500000237624015176573557017765 0ustar martimarti lcmsprtrCMYKLab 5acspMSFT-lcms desccprt#wtptA2B0,_fA2B2,_fA2B1a_fB2A08B2A18B2A22d8gamt kdmnd dmdd ,tdesc,Test profile, not suitable for real use-Test profile, not suitable for real usetextNot suitable for real useXYZ IÂmft2 -Ge % M u EtHHt !"$,%Z&'(*+E,s-.0132e345728]9:;=>;?i@ABD"EPFzGHIKLCMjNOPRS&TKUjVWXYZ\]*^F_b`abcdf g&hAi]jyklmnp q-rMsntuvwxy{ |"}9~Phʄ*AXoĐؑ.<=<:852/+'# ׮ϯǰo]K9'ǼȪɗʄp\H3ҵӒnI#تـT'ݘg5e0[%k&V7Yy.Pw/P^X"7Ni * Jl.[8^!"+#V$%&())*S+~,-/011a23467;8e9:;=>J?z@ABD!EGFlGHIKL$MGNjOPQRSUV5WRXoYZ[\^ _%`>aXbrcdefgij;k[l|mnoprst5uPvkwxyz|}"~Ca{˄8Rmӏ,9FR]hr{|wroljiijkmosvspmkihfeeeeeeeefeedb`]O?.ժ֏rS3ܟuJZ&Br,T t(=KT\ fnf>j#6Ld~  5RpAa / S!x"#$&'#(E)g*+,-/0>1`23457889]:;<=?@A:BUCqDEFGHJ K#L:MPNgO}PQRSTVWX3YDZU[f\x]^_`abdef5gKhcizjklmnpq0rLsituvwxz{2|O}l~Á6Rm֌2G\oəٚ $'+/38=BGMSZ`gnu|“ÚĢŪƬǧȢɜʖˏ̆}sgZL=+بٍqS4ߩS!K_!_Mt*Jf8T[:i&8Ng *@Vl $<T m!"#$%&().*E+\,s-./0124 5"687M8c9x:;<=>?A BC4DHE\FpGHIJKLMOPQ-R@SRTeUwVWXYZ[\^ _`.a@bRcdduefghijkmno"p3qCrTsdttuvwxyz{|},:IWftȍ֎ $0|7{̑|֩ڽ|}|u|YԢ|1|,.||/iG|=TN|A;|z3}ط}7u`|є|ɲ|OC|.za|f{Q{ר9&{pjx$N~~"dVfqth}^E2#TCG.c0ϽaĨ܄s>ӄ]LDq#߅f{s]jY dǂcA4QVBւ3mr!.\NDO$D텃_/ {͂S_ꏙTmpځG[~C$H4끃 \ ف~O0ׂ΀oZ1C$[$u:{s6Eƾǡ㵏Xo2ߚ풪vmlmY"|8A "(爂.jJ*֐=?~^vk[WC䓒?5pS%;|=FrG7碽|)\itU{S3='?~t >X ٝ$yRgG^SS~ӛe;~wV}rƂུ˜@47w%%n yې_3I-U kꞝ` JxCfbSP"<9كXܸ{Ĩ(٩J'vZڜd.Q:ƀNGؑא$W ΰ^|NڃxtblȞ>Od8D~ZՒt3YmلÂGaqhP~_v2L57 |ٍӟ%p|~?u"ҐQMo ]L+I;3-~Y{'|c|䏆}s}Ԍg~*~|щjV(L@*Մ!ڈfS؃Rʂˋ劁{SL ikPUՇ?b!፳5)*,5f61Fy戻h-Tdž߇>[!ЎbIc!sΌ\Ysx[%vfۇ$S@=񅨊!͏ӊmF8זɐvڇme.RK=J!}ېaџbj̜̋>͔bÈTtԇcQ.>;ÄGlʑY͐=m ⌢@ WrrayOR{90ɐn=fЌ{lҦ{݉iGpn;p_M 7ǂϕm+ܐ¼.h?Gĭu娼~]n+堓]u1KipU5#gyS˺N0?uغxD+{=SkZ„PH)2X~3g}aRyދ %PyG!1i@m\X_F=0(⠐|γ{!{|*E|}_x~'vQe׀TS =!?#ق۔trdӓL͎̄~uAĂkdcD#Q_< É7Ay3*7pՇˇ,c3sՌ;c! PމF;9 ɉ``,LёCZ[/)dErJa͊,O͈H;" JǗ7Ɖ󈲐(ӛs )]xwjt[.J~7ǑQ`O2o󟉘avh@UYh$.Hv5HX6d*O9~$Wt8_fsՔ_WfG3q AԞlH`=LTdrFdqpU9E\V1u6<j2$' ;~@9pcbKS^֛QC?/2@N4ƥjf_ѕW{2m_ƌ٣PK@m(,U}̱NSry-kݏ`]MNe5=̥)8 -czJJzH{L{[|~w}Wi~hZ\Iߐ5X\Ў06#4ϣBSdZ€xv hU8qYLuHΏb 51DOWݛsg~Sə-ta}fX(.GɎq4tщ@v"Ǣrћˉƀrψ\eVҐ"FŎ3ŒPMc51ў{/P~ygqfCjd|U>E΍wm3gp'{3P|oԐb6aSݏpDNQ1%8|f-աԝؔ qaę/zlm}`4RQ#Ba/ mϫsᤓ[졞x+k-^Q?P$@ыF-gT߯ I .vi\IpN7>x+KϚ tTF_fz-tQgZڥ@Y搼K;(fEQ ЇǦWȼ?dʚ³re\ĬWː ILg9jͥ=%Ǚ QkLZ7z!0z{ JM{||&p8}c~TȕE#1Ƒ ^ƪfǢznSaMSP-Dn1;UbuƄnUyTm$`qRoC _0drL) C>Tġwkbt_KQ0B/lE5/ǎf==v\6jҋQ]OsA&qR/*Bb=ì(ԕq`ztѐhSc][֖hNV?8-N3_lƢ\ϝZDL~v%r*fuY@L}=e+q0稲 *}EpJdĘ'X0MpJ˒dѕ,,GGτܑ:Pr|.hqكe7Y Lv=-q,rM'W0dDNzo=dTXF}KEW=y+vՐ&G\Ve yDn'bgVJRM<+΋g*㏁ȘIůҫwlD>aLLUCfH΍:ȓ?Y):`nyvcșIٗ"vvejء_MdScFۖd9Ǒ'{6 ߉Leﯿժt?~iHk]Q普E=7W% 뉣bwӥS~Nzs+g\xP"m7Cb5~#;u հn|ةDq6He¡Z kN KPA H2Ÿ| 8<PE{U݆JV`{ocdXSa L3/>`00r} .{lҺ{D{u {jI|7`|T~ G枰9P'wZ~. sOi^æ(S܀Fݝ8Κ&'j  ؽˆ츽9}[rͮ>huɂ]mR]%eEޝ38 [&U0E^,{q2g"\:†VQuoDŜ|K7DF&>cggڷz6KpGhOeƨZZ#OɟΉC͊:6݋&.j3Z|ylԐndRkYkNJJ.BFBz5@G$͓` ǏQXQxm?bݧWGL@ӑ3͒"ѓ3 S^I5=vڱUl9lal=VKF ?BUIG=(09 H |x~sX iBX^kSrqDgf\VpZK마?!-2"N څuT8|Ƅlr޻i<ƒ_kU_Jߦ;?S1 R!D 񕫈{Y(qXh%^`T'υI+>O1S/!~G ?NH*B3zp鹻go].R#UHxJU=ˊ=0a!AZ xeѓ y*oعAe[QG";Ѡ3/ /djxȖHnǸ㔋dóZP[#EƤD:jG.B,HL>ywsmbc1YO(D۔9P,ϗW,PvmldbX\pMxC7 *͚me݊XO4uVpfkP_a0V]LbdAw5w(|l4f~7Wt#qj'\`穖UNKT3@u.3%^t|' ]|{\|||};|e}}db~~!~~ډun_F}E;" {d {˃+|7|}A^X}ɃXn~\ntC~^>Ƅ!E>"ڃYz;zC{?{ω|lƙ}'}Rs$~J]BDj K#vy6ޗyɓ'zdϻ{{O!|Fх|jq}N\@~hxCd`#RYxdyxy&zA2z`{΄|=p|[H}ČwHӲx.4xа]y (ya y8{ zj%h>zޞS{K;{4zk5x=lx ]xy=ygyUx^z9ezQzŠ;8zx3xTy38y-Byg+yyڷvz Ccz9NzFw6yy$Mwڌ`z0͂~zɃ5{ׂ ||}Xk~,Epς/[YBmH!v;x́sdǁBR,S+]с%Co|"ZtBAC!"wř^ VFxSHhnjΆIYp1iA݇J!ҌH)GÍг&Y摌ފm Xi@ [!ł_~~i~ٖձ4~ߔ~m~x2kxWoߋ@Onp!ہ]~nϷ~k[@~d~e m~d~}||f~i~U9>ဂ~|͑~s~6~~<~z~*sg~VT~6<~Ӑ~,c~}K}ͨ}1}7w}Oe}ӘR?}:~?4}y ~a^F~(~}" } f}|ㆯ}h;u}^c}cP }g8}=r{׶~ʜ~k ~ }ָ8}l}N2r}#`}MP|5|upz]կt ~ ~^ܣz}{}}7Wj݄V?pqL QVڄKH^|М˄wH {ՃiuUg>M F0ؔ!SWӍ֪LŋkՃ\mzIhOʈT>Z <֚x]ז )$xĂWg$USa=^;m 3Ԏ %>jOЃVh.ǖ܂4/vɑe/Qpb;ہs%ҝĩ'#sGޟzAτŘtrQ%cP#̑9؀v|Ѳi(d;肖ϒBۂtbSrMaN_/Z7ΔdT~؏v(>3xR1*p ^LB5}*gwaȄҬpR}mu?o\@Iw`2~C4{ʋj ;Ȅ ცÜ<ڋ[ {tԲk/YUF~0l}zұDxrx7qy~Gzј!{ȉ'|x>}gF4S=xjJыUێL|–Q楢ˉi`WzwcTeRņdE6ۂ}J=Ɗ!o'ņ<{ԅ4l/\=UJr4聭uBO3 eOy3j\ОZ⛠HX$2+~IG PeƈǶMd)w'gуWt}Eu/(H}!UQʶ6Ɉxc 5te?WU"!C-Ym {∬wNx1ky 2zĎ{ |$r}`b[s~Pt:ʈ}E F~:~~~Ȝޏrsxcq{a ЁNĂ9.dÅ -'=Ҩ͐Wv5F*~pc_lj1M׈h9l\ߍ[>SH菰I:|u}.(n^nLo8IfE׎ٿ͓qQm鍟{l]K̊7{ޏ rϰ~Vpyw k[QUYJ%(59 s;3S`ߎnΓ)ƚU\wBhوYI˒ HN3g.2K6CBQގ:"Hru2/fχ/W^IFp1탙EGseَ-](zs CdC3U=՚Drc/ؘkKڻqV͌i~͊kppb%cRnA,ڂa ~^5`W_~{ӌt|Wlnw_񆩪PV=?2qJ*Kh <}?bvٙwwxFyzz{lÏ2|]~{KЌ 7pˌӹ}<9+}ږ}~Hd~ybvPkO[Ɍ3JZ6R¸ уv}@H]w׏փ!igZHI/5'b/Q՗ՉQ^~@ v-5'hbTY4H4ӉΈpKƛʎtÒS㐅6t\fጴW?Gz`E40|-S@+fPĒ>ސ rd*V$oE툿32]j5x^/f&O,} pv7bዴT+GD#0=%z󠹈Ñ{Ï^gn|P`DRMjBB],.ʕqM_Rc䧅ʑ^y%6llq^ӊP8@H ,B {}s۞ wu jҤ\dM=)h] d䇳KA(uzh fZ@P{Kg?; $&Ѓ> #~.BvuEwa)xYyyFz>sZ{`f?|Wh~PF3Db'|{|i}V}~~1r~dْVV(8E;2rچ 3͂ Ղny\rO}XrFpzcT􏔃Dߍ1S R#4o:ɛØv {φojSbDS놝CՌۇ0M7󏙩֝& ߋz 3mwˊY`jRgEBٌ3#0;o։pahYN%rAt x"kM^⍛PAW.֏DҍN%^l$Q*Jv%fmi\ŏrNҍ5?e,@|x0 9tJgZ M=܊s'*X Ʌ%RUȝҙ~ġr_(eˑHX뎱KV1;͉(U Mr۠ݝOIϙ|̨p8ϥcVmHe9 %pPϟև ܴzǖհnVAa~T1QFX6""ˆeSj㪄v}4wG[x{!xxByl8{ _|kQn~ B5~/cPT| ڦE|`5|j}(v/}ję?~Z^c[MPA+E.U7IvkmuFyi^]KOaH@--e騈Lʊ+QF~s݅gٗr[ N"g'?/ۇy,@{ "{9K}kr$?f[LIZCbLꑾ0>=. ,H/Ik*ۆW{Vp\Ɏ+d΍PXیKJ/x<Ǝ*vZy~yRXߗ4yɔTnrbnVpIz;^( FϧzƝكܛx5lș#`T GÐE9^@&o ɆՇK.ɤhݟšvybfj _&֛SwEԏ嘚7T *$bq?uή:ިti hg] FP̒Ck 4!mߖW~IrΜqg,ڪ[1NْO=AHU*2RU&Θ3&v܎Nwvxz1.xo̢dydzX||>Kg~<*5k{b|&B4|]x٥t|ne}8c72}W~Jy<)ߒTƁ 䬸𨂀wm a蝁9VkI~;)9ʼn.İ+Mɀ݅AvkI`zфUfHNG:.A(ۊM$Et|Hj_*aSSG$9M( %-PLܫ.}ڎs hy,]lBR2E 7&o` Iݯo}|qlfȞӑH[JUPWȏC䔓66k$~ɔ$ FZDěVzQ`ore4ZNhBD'4픾"([uՃqx4.nPK"cQ(XfL|@kϘP2 )zT) ˪רtw/֐4E(Ղl&77uWGjU`>uTIŦY< \9-ZOpX)wcxzQxpy1fjy\q}zQ|KD~!6Ҁ%;oK //=t|8]|]y6|oz|e}.[5}PU~CR6$u JOĀY%x[nPd~܀ZO4B5A+b$+ c `B|@vޮm kuc)$0X8LMYAܚͅ4r`# zo÷.u "kǩňa٥wWiL@ʚ3#; `}$}wtSj`J`bUK0g?^}2_!˓0 ӎZQؕ#|'r=hd^㤕;TdI =ʙ0Ǖxzozx,{iYqg3]~>R>H E7c~;00 |wf|nܷ|eг|\O}R}H̥~=/ܝǃsAӊ? (A1l*.v'mcdز?L[vEQ GŤp<4/1߅Ì ]T~uɻtl:JczZP?F߄_;7ۅ.k *u}tω4kSbŇYZBO9Er:=-ܛ+/:ɐ Ć}\sGj״az7XaN:D8t,ٗ,|F듹rْwi2`Gʐ%Vͪ(L{B7+,Ζ 0{(.q幍h1_)gU{KAa6%)~BϖgMzpǹ_g1]'TYFLJP͗?[4<#'ҙ/^̏rx߾OoSMf*P\R):H¥>@=2y$r%$ˌwwnUIIdܨ[_mQGh<á&S0"%\/qybvۢyw6zyg{5z,Z{{X||ph}u}q~R~\ cCف lwwfٛx3ykzz/@z{΀|apo}Z~BQ vזww3xVy1kzpz{Do7|ׅ"Y}ez*U{"Zm|X}*@~k 䀽ktQuxtv{!woxn ybGoz`l{^W|x@V}6 TsϢ tџuߜp.v֙wӖ֎xŔ]}VyjzVP{Í>|׌ ~[@sLt[.uwܭvjWw^njAxGzy6hzTt{B<{|Ls5<̏t'u"ҫsvv/wџJxxxfyRzb;{ mzېMsG]t#u%uٯovwbvyxNdSyPy(8z+'GycإsXtkL0u8uQv w^_sx MaxMy 6)yAcRwڌcֆt,Թt ujvv v'w>cqw̮_PxBK_x 3x\v֊Lu[Yvgx9"ygzb{ڀL}m%~[XTy@E6ՈY޲}}X~$~Z~P~Ȱ7~2K~&~kڀ jW8W?}Ã1ܲ|†+^}ǽ}MbX}}Ύ~J}"~ȄjOV)>-Vڤ{|O| N|eX|}\}A{~}iH~U@> )(-،zіA{/{e{D|I| z}Ag}֋eT~_=fj7$(ez/l z·z{X}{$u|"w|f!}/R}؍n;~ƎeZy"z$>zz{@{u|[d|P}$9}~ y ©yzBzz֡{4s{,b| .N|ww8|2Q|6yyy쵭z"Cz]1zzࣆq@{6x_{L{֘5{ݗzzgBz-mzLBzm-z  z`nz]9{J{7p3!zO5yWzV+z:Tzu䜲z{2zwq|zDlizEZzGz0zO x?MՓHt(v"„Nwoۃxʃyg{7zM|h]}T=zj>+ӟ|7}уG}~)~HVyg:St<kѧ_B$܂U×1郤ԃw҃eR`,;߂ÆˋϨ:@Fҁ{J!LPvd-BQMq@;!n͢*/C𒏰ـߢ:n{^:PtOcQrPI:q:=LˋF_%{D͓bra~͎EN8`+=ɐWŞb^C{pC0!_j9LUW6s_"ȩ{1v9L~}~қn&~]t~@K!~4~o-}J ±ƨ USYP~~?{g~|k~L[N~-I ~ G2}|"|,mu  ~vx~GPii}NX}FR}l"0 |3z‰xJĚԅ~v~g0}Vn}P1C|٥O-{ݞ ygbt!`ufvRvqwHyQY zt܆{|c}PɅm:Hȋ={c Q{Y|}<|}݂F~s]vbobtO19ԅtLoƦ6'[uƆq a*pNwL9C*ļR6_م LtZćp_J_ЃMs87ۈ&"-ʇIFȅ9} n׃^;Li 7|Jx‡ @4;N^KՄ{u'lۂ\~JقV5A=҆&۞{jϕOn yZjoZAI3T; Wȓͅ0wBhXtYGD1j7=@f¦du6fuVE1X/}&Ѫօ׶#ǩrVc.TBz,~ O|RN׆ƻ!~󂪲pŭaрݪBQЀl@ 0*n}Ŝ zنſ;sx!tvHwTx}z o{^}1MJ97,,`xzHُ$zM{1j|N.}| }m~]@Kڇ7[؋! @0wсCj_Dizt`l4f=\YJԃ6/z׎̈,s چq/xjZ؆I5ZLj6'QQ񑷊" wKiY&CHm04 ]o`P?Гfu \g&\W܅F)2/YF)-8V㛈yy>y>5e-rie֑UބmE)}0CDH$Nx0wO~Zpކskc X?S[wCk[..Y.0QHt m|FKnȆ`@QٙAY,z .~ڈs@7ز~B1y#lqפd^nOed>,)ـN }R#ѿEV-P?Xwgjd\g6M+<7'LĚT|s @tHuQ9vڃmx0vŽyiR{.YȌ|HΊ4Xa\Yyi"z!zَd{A|Ru(}J'+ݎTVzחʓؘWL}+rVq'eYAKH<#) 91Þ+džٕm{]oʐƖcŎdWkI֊“:ψ', 0dƥ4F'ym吀aێ]Ux>G݊K8ƈO%;_/m֎F4MNwuܥkɐ]_$S6Et6ɝ"T6䗦.t[t;WIuҭWi>}]ɍ5Q:CQ3LՕiCmrٓHsIu(~vXswhVyy\MzN|?S ,T-qIxSy֞y}&zrh@{Lf䖼|NZF}Ml>A E+҅>l-}ΐm'~T~e{F~peYLA_=;I*o,1yorNL/z%o^ȃ$cI\XBփK<6)!AǗ߉.fЈ0#x܇mԗUb.Vݒ8Iɏ臡;>ӈ)GV?iX6u#LvǙZ}l `”0U#H+J9č('c < /ɒtoj2"D^擓aSG F\Ď8"% *ܡ웾lɚ~}MsHhv•'](,QDEv6X#MօM0䢗z|ORXqoef|[VܘO>B֗*4Rj!9;vrЃm çzdV3ocd`YBM}@`w1i>s\;F7_.䯘x]mݘZ_bFWogK>H"/-|~ےAs*t!l uuv:kjwh`֜_xUczyH|q:)L'ʒ ̐ͬnx2dx~;yet3zj=z_|{TT}6G~9)O' }9%}t|äv}rס.~h~{^/)SFr@n83&RP KjoJ{Q,qbr4gl"J\ƚQŗ)3EC}>7?%1 cfˇEyoejC[ccJPshD<6V5%\t wBPvxUn[<dWߊrYӊ&NӕҊB ~4鐋#u@ 57pv0lڏbvXe2M^@ؒ36f!Xے؉7MZ ~楳u4ߖ k%a|VcKl?5&1dJ%(O"C}[siJ(_Z՘TxI=]/Y猁JR{rq֡Yg<]uRG];p,܎ыu2σ{uz pCf2[͚PeEĔ&9**h$o+s}رtuUul "v~b`wXȡxN=}z}Bm|4Q"w q_x\|ɰExt2ysjLzazW{M}@~3:!Օއ0 ~|{~}4s>}qi}}`n~*VbJ~K?Ё^2a!: rほzqƪ|hw_U}0J>"1o ? n\9ygKpɅg5]Ԣ1S՞IN=Ϙ80J )x#o)Beƥu\XRV$fH|6{߰ܣeril=_֤`V&uKbAWSo5P a'Ϛ8zuq*C3E&Frb􉩀ssTjϴVb5Y=CP1蕐F6<1wJq$'•Kr@Ƞi0`دfWϫvNvDG:Ȝ/]&!𗬖qh\_DYV(MXVC9a`-} k> v#rxwswumxvyx zy{{{m||X~:~p@^o~tzqu{lv|Dw|x}Wy~fz:lO|W}j?}w^s 2`t9&uu*v9wx}zk {KJV||>~6qJۗq6st^u7Hvʈmw| y@/iz{Ug{ֆn>}^k_p|qԺs\tau+wzwxhhhUyDT`{A=m|e~Ao;q%θNrFsu/vmxawfxxRzN\;{}b}vo &~prUsbtuޖvwHdZxQPy9z| {ҟnɯP3p/eqOr棟Qt%݄OuW{sv)bZw3O5x̓p8yylnp 0ZqodrsѦt{qv`.w!M$x5xx1np7}qKrvsvtXo u]vJuwYU3Tw*v䊩oYͰp|ɬq!r ?sT}yu5\uɹvvuvwzyx{jxxYNyFyi0AyF x^*us:ui}vv߆w[wwͯ9gx>W x-DlxO-x8 EwḘprY`^t3Iu9wSÁOxvzd|1QWw~:bʰ5xR 4y=r4z9T:{C| l|t~ cV'P.9ۂȬ~)|"ju;OUv@s߁bG9O܃9˄΄_1ƞ}͇}.o~&}~LPm~q~q `x}M8:&TĎ|ҏx}Wt}<.}k*})}ފMo~7_Y~LP7}$L^n|e|R:|Ù_|Ē h|}|}5 m}]}~K[~54}dh{yx{ȝ|s|H3|nz|k|[}SQI}Ď3~+{~پ){?װ{xƢ{{֞{x|+6i|kY|xG}2}$s |{,a{Rܠ{s{{vX{Şg{Wz|&'E|N/| {&{T#{iS{w.k{|3X{t0s{e{ T{C{-{ uyƇ{٪ {G{;]{m@{M:q{D1b{8cR{'c@z*z >x?zp>qŨ9s&u8v_xapz_{M}7oۈyj()wD\xEyWRzIH{F}|No}y^~LjR6j56~qp~Ϥ6)a|)fm]`KJ#6>vt)0քOzdQl2\3J,[m5HنËͺ@=͂HZx!judZk6I 4 =¸.Qh$ZEc vٍhX߀GӋ&25ŜAV~.s1 Z*/txQyf_#VE 0߀:"S :8/a̞KscrmЗd`nToCK9.~7s%SL4)}pSh)bGR~ߘFA~,~ |΁Q f{m_~Px~Z=?L}䜾)| z{iڿ > y]k~ޫ>]~Z NH}ॼ<}<\'s{暬Uy݄nvorgq?Pr [tlfv3xwjy[Ib{Iއ}5)Y`EvUHw]ÊCxtD`yt~zwM{is|Y~KHD40{ʈĊ-.}ȊA}L~~u~w~uhRFXց1G}3C;6ۊ1Pʙe)ătftWI JFf2ăd*Yۣx0ʆd_rZOd愺UJEP145C򈲑א#h}WPQp]gb T,C2/ǍX,+\k{4ВjnD`vR:뎷Aj-؂Q$𠿝|,@y6XlM_2PdI@2+ր0 بݏ kw.jG1k\k1N`j>)W) }نԥև̆ލ٪f٧tǤhZ[K3t;J&~"|S,Ɉ*cЇ ̅ԳyrHfVXÌ.9$$8}}{ìoO~$pqr)t!~ꍾur;wse ZyJV:d{ 7*ڎui}ڊ5r4ʖfvYqg KW<D(Z8 |(d򒯌颕|V0{p@od+W{IȖ:R&;_Kw@_J~yʉˤn7VaކܠU9G1F7n#2;}Ѓ뎟鎸ƃBwl4_򆗧S=&EϤ5R <|}dښ)o&np&re.sw'?uk:w4^ЏyP{A}-,_Պa>"tԗvwF5xSucyhiz]l7| O}?ዳ,HgkM2z֔34{}$|.~Y|t}khC~4\r)NHh>ʊ9+Պg~?זӡ o34~pr-ysoVu6d1vXxKLz6N$O ·Ϛ%z yHo!veZڐOC 4"k])ܜJs)xZn/cLY'M AU$37E T  }g"#(X~vؚlnoKb(WMǖL?p13?ɂU"r~|tšjvO`%ǞU>IC=.E. 4ҁ,2|Jrh4^cHSoHH ;ģ","z*OYovҥKpz#+rpKsgAfu\ۙvQ'|O~(C3k54c #YV _ʥ~~Ѣ~u lecXܗRqN=ρHB48"j g}ktуk#aWL@ȅ3GȇN!⎈C Epq4{erD7ҏ( )W} ns٠GjamW^!M&B;_5̢̎'R.gpox>q-p7rggss^FuTՙz1=]}R?TNc9t|w&ueovSfDwK]jbxOS]yIk{)=ʘ}#0NwH2n~D_yuymާzHez\7{R|H}<ʗ/iV2BW}$}t˩~lC~icŢ~Z럫A8"}6#)[]щJwރrB}=j}zb୾}Z~Rx&~I~a@":}5*.>(nF,op:qHi|aϬY QYGHbƂ? [44P-'ј$djpD*8:Ď/֙}#_Blֳ*dɯ-\ͫ T\BIKףhB㒾9#lf.#|?iVl@nC%:pqs(CtuUvI&cw݈_Py:{a~̰k̾NmKo( 6pOhr\ssCuzbwOFx9z_:|rHʀj{lܭxn"pqLsHptܑ`v]Mpw97yBAKzDy#j=al 5m좺oq%z~rnt<^ u@Kw50x%xj{kŮmGo)׋np|=r7ls[u IvE+3ww0åj.%kҷmopDyqBjsGWYetqGui0~uÙ \ufj_ƶk[mSolp`uwqgr㩢W+sDt.(t 'tͪxblyn(yq'zRszu"V{vv|xe}zQ |:܀F˓vt߽w{v+0xSwyxēyzz{8t{|}c|}P~-69ف*Utu|һv}a1w }!w~xysz;bi|Og}Q9~G =Jsڹt„uބ} vԄ\ w̄E|F)|J ,{3|!Ț|'|'|"v'|i"|[|tL|v<{ݛ&{Zz+|;0|*|{t*{٫eg"{ŨkY{J{}9{$myĘx@eKkmoȌLqstAufwWyF|72U{qFxrS>Rsu261v=wrlLyTezV*|Ex~1Oox_#yʕ;zo${{}|Rpڄ]}7c~;TބjDM0S؇ot KE%{o(oKb:Sy&C#:/d2!| Ch2y˅m~`ZRNBkJ.֋}v|GVً탲v9wkʉ^zP_5@uQ,݁Պ3ߊǃ|@?H󁜁uvi*\덛N{Č>*U ׀o4+Eǘa\sg}Z؀HL <Ґ(p- ~XjbEo}qzeXJh:&r~@2|ޝvMҒBө0N{}ʤoǀ5cuAVH6Hh~ԛ8W~r0t&{$upaveB'xhYizK{<ȊV~W)ӊp݉{`Iv񍒑w,xyyopzcҌA{X%},J9~;~(݉9 x1D|Ӌِ}a*7}w؍~~mw bFWV?Ii[:B'󈕆 􉙈“\Ԋ'݂{Pv5;k_`ŠrU5]H#9|օ' {$p"P$~ptXB%j^SvF} 7%iP f c?~|rl6hQ]!QD6+(q#<v j愛z⌕p4fMʑ[FO҇fB\4wXs! pсރALՂΛXy =nʊԘjds_YmMAl2wR1QÍwl bb]WV›Kӆl>ƅ+/܃ϛ ʂ'Z.~㍚|u4njmz`٤UqMI S(7HVѓ< D._G0&wRnڑe<[FQ+[F:_9ˆ+cxJMv.m!åAcȣYÍmOOܡD^70s)D0D_k|m\tž(o kɛpbƙFrX—txNAvB7x4D{" υ`Tp{qsosAjrtaiUuWs.wM yW@W{o31~:!4$Quz9v}r&wwixv`lyV1KzKޓ>|/?ۑ{}2* QH&.^zxɝ{5p<{g|^}DTؔ_~.JRJ>1$ xTwZ oa]f8]J-SxIUj=0*F~5ͅuĜKmvdS([GQŅG<.x]|1t/Ck-bЖ͉YؔaP;E&:=X,팵ɐ'vʁ{ ǐrIj#1a/RX-%NlD=8+>1{א4р#yoyph{Y_Vs4LOBs)64);J"wNvo&ǜEf$%]%T;KJ@`4rf&v3me9[%R͒VH됱=>`2l:^$%pzMl$rmko9bpZP rPutcGv};x.Q|Ɂ ry+pqoqiߣs#atlYuOƛwRE y!:{R-U ~W攴&ۑ5Iwup8vhw`MxW*yNz[D${9},d4j"v ynzpgQ{&^ {V=|Ml}CǗ7~8v+sKPNOluw9~m(~f]].UcWUL6ɁBQ 7i6*j:6ttlBvdU\6Sٚ;JAr5{) iݐ6rեۈjۢ߈qbˈjZWR1"RI?c4=f'j⍄䎍S 8qWjiaiaOPYPGm=Ȕ!2O%Đ/;og8`W!ODEÖ<&0Бӓ#|Snb՚GfRיu^UUϛM0Cؖb:̘.o!-V ӌYlndᡰh\۞TGKȞB( /8;},˔ W凫nڳZlgįn`۬PoRY3pQrdHӢt6?vI4x( |)Sn=pf⮿q_5rX9t%PzumGΡv>x3ќ{''-~v85[bm?teu^:vW1wOtxFԠy=Ɲ{{2!}&U{j8kXydɬy]MzZV {NR{E|<~b10[%zƗI߁jjy}gc}\n~>T~M4^DC;Ёu1ID$$}3SVibwD-[OcSkK͡C::</#LXnJvT]ha>Y(R JHAy8]-B!8Flg__*XNPƣ`-H۠'@07],or 01f(+>^ÐWJAJO]G[>35k5* C dݗG]R}Uɦ.MEm<Ŝh_3mt(`͘$qZ \Tc\FQTvϜLY{D4;&-199&W` 'ohbpk4r[mڣksp&u rvrtvwvdyxQf{{:T~}^v mqZo-rptrKv7sw'uay twzcTx|P5z}9o|vmkyJ6mz4oO{1p{kr|ԂtT}s v~obwDOyˀG8{Ƃj k򁹫m㝑oqz'sxT)OxxZyxtpqrçsvUtCiPuX[v&#Lv؛<w[&v7x pkqrysh1tRt6gNtYuGJv2c9vk$?ukyQg1jIlʍoqVtCsguW:xFz1}aۮ}nףH~p~Qrr ~t~us/weey%VgEzEc*}0Oֆ!|Nu̡V|v|x,>}Ty<~E}zUqt~{ld!~|UT}D8:/FSz|؟T{P}c"{}U|*~|s|o}b}HS~`CN2.̀-oyTz3z{{z{n|`|RT}r`A~h-lOsix$2yycz,}xzl{6_{Ո!P|@d}s,Q~u<qjĤ`wtxNUx4>yw'vyj z}/]{RN{>|vm*@} I~V#w wkxLʀ=x͕7tyHhy͒4[:zXLz<{8(C{q|wvwBȉwҝ~5xMrx™fywBmzu.օ} }!n8|Poq̄sqyVu%mv`QxQ zA~|-DŽWu3tu#w6xWwykz^{P}o@J,ăՇơG{a|5|}[u怜~ i݀~]YO9(?b+΂6MΟK9VdJt+h:[BM݀:>D„*火s承8~撳~G~3}G~r3~fU~ՇUY-L*V8<̇):|| ?H@}Ԑ}ӎ4}{9}Sp,~d\~X~AIJS~}:~̋'( 0Ɔ6}! }9>}OlyO}V'nF}Wb}kVE}H} 97}ӎ% }n}фY||ǜȂA|֛wY|ؙQlV|ϗ`|ؖTa|┰F|퓷7>|哗"|O9 |||q|b|Cu/|5j/|s1^v|hbR:|YDl|@4{zɕ|S|lGk|j~$|bEsK|IhN| \|PU{ܢBk{2q{ay8/ =g?$ikgl8~ˈnbtphkr\7&u%New>zZ+h}]׆3ndm}osqC}rrrtf݆v[Zʆ-x;Mz;=|*V N sЏyuv^{ldwpօxe^z Yj8{qK҅}<#)O1 pVĆz܆DzȄ{yJ|Qo"}cÄ|}W:~Jx ;Y9(U鄂 _]䅠W)Kw=@myɁb/{VnAyI%1/:=U['j ͅ|ꄱƊDSӆzudXk@`[7TeIG{N8`j%Ȋ P!~U""ti?^s늟ŔMEwJ6b#nρNP/()|t&r+)ǵ4\<]Q 鎨CY54k!n 2R֍Q6xz zpGeZπO6FB39~}N悤:2xjǟzn-Ecր1X7M?>R0~+}& Ђ\$Ev:lWLb[}VТ KC<=~.e}|{;Ygi΀̎lv؍un=l׌fpjaՋrVOtI("wa:RzK'B~C ύmHUlo 2IpuFJrkHPt9`\|uTwG2y9$|&7_ <ɆDr5tH} us/viÊBx)^{y~SzFF|8~%7 $xĄy{ʋzr{kh(6|I]mv}9R:~LEfR6$B 17c~.&zpaf1[vPӆ΁D#a5φ1;#]芉R%x;+nFdƇ^Z,1O{B4E@O!vӅOzkvQHlbކXMrME>c@2Jo,I&ΆÉc}ՐtjՆHaVJ K?0̓ZHّ--݉P+{crj i_ATI{=+5.тs܁)yyp f,~]6)?RFEGa:,A׀ ꧃wԇnцIe.[lѡlPݠÊT8\)񀨜\~8 _gixknӒnep![8rNPd}tC荌w+5z6# ~.l~nvphm\mr dsYՎuOwBy4|z" Tυr9}iVsutkݐZv%bwvXxMzvA|V3~!)Ww{˒@xshyjLPzla${cW|rL}@S42g%j KA} z4<}q֏~IhȎQ~_yU/K5 ?Â:1]=?ւxudp =gv]SIÄ=酈/׈P<d1Svkn6@Ve)߈9\s(R <5Go;'$.e;/yj*}tt7lycnEMZS،PfFo:k-,]~5{#s Oj/aɒXVND2֑c83 *]'|4yΏҜq:` hݚ _pV=LBH5 'ÄSQwom&{gB]!,TʼnLJˈ5@IƟ3gt%hݙK5~IgvƜ/io kfm]oTDUr Jth>Cbv0zz(h% }HluinZmpe+q\ sNRVuHꑹw%=#nyr/|jl ZH{՛qsrlKt.c˕uy[>vQ\xNGĐy< |.~zzavrwj̖xbWyYؓzPiY{F}:䎅~-]冼Pzx{q |SiY|`}X}~mOZLEFǀZ9,ۉVdςKwPokKg_C# Vё:}MxC83+ˇN̋χ݁9uɘ=Vm˖Uce`{]~UKAݍW6p)@&Pt(lċdGˋ[֑eSUCIXO@,4ËS'Dre>;jpQbTZ!tQDH:Ԑ&>b*c2芬%@Qph`_X:O&LF:c:3|&ߐJcmrEf^PWDO/eFe'=#)2.J%j ylфDdh]UUmM}VoDF;fK0ta#4B勫Ѐj>c Չ[КZSKĉC9.Ώ!g"h;i ɏsa`#ZARIJzP{H|~@}7י--V9$ ̄hc8}\x~8Uۢ~N%qGD['? ؁6]oh+rizL\!?b U[/-ThDME=iB4܅*0ψ&,( RqT݀`k]Y̤uSKD-2&;ޙ3R(6 s su_e錬XtQ3J&|B:7A{1S܎&pw^!W gPPHu,]@ʛe8J擨/?}$]d \}Wsvntw^vyKy${{5{}x4ځgtA,j uvl7w 7nx:p yo{qzms{\u|Jkx"~.4?z(1e|jhF}Wj}7l~)n~yp5kkr[HtۀNIJw3sy}kd6fOi.jIkSE&mv!xCoiqYs̓H8v2xyQ|" %bȪeN g/j5flhv2ngp5X'rχFu 18w1 z|iax Yd.giJk'smeo͌V1qߋwDsz/Lu8 x͈`l cYVf!4hk+jqlϓ2cnSTXpCCr6-vt= wIUJ`b£_Teugƞ}njZolan1wR[pTAUq֒+grYiu_xbǔe8gjc{i9m~kQ_gmPo9>p1(pIu`@_θJbVd.gyi%ktk ]_lpMnifxihtxkHynt0zqf{sW|vE~dx02{XtQku_mvyoNweq8xPs0ryTue zuw U{xD}[{#/=z}["ermrPsstuAuv}wwpx&y=cyazTxz| C_|U}.S~[Dpyrznsv{Dt|| u|oOv}bxE~gSyLB;{Os-u}?!J*Ϩ%op:rs sXzDtmuՂ`w-ZQxA&zPD,|- †mqoSprIRx4sktن^v2oPwK?y=a+z؇W }lnK^pqiv r3isf\uRN$v=x )yM |*kΗ_m|0Ho:p>t qgs+zZty8L\u6<3w'(wzegVk:=l❧0n}oqq8erwXs:Jpt:Eu %vAxjln={ioopecnq=Vs :H't7tƘ5"Zt3cI|#jɱ-lUDmYyso%mpIa~q_eTrg9F#s85srC~i{c|fc|i2r|kz}VnJnz}pa{~sIRmuBx-G{ yyjz;l znȄ{{py:| rl|t`}uvQi~cx@z,F} أwqaxrގ-yltnzuwzw6k\{x^|azP#}\{?~}}+Q` U ~v"xPwy59xz( x{uy{iz^|]{F}N|N~>}**hD: 'φRotJuTv >w_tx\hy</Mr{E=|)~0 ākjHs_Sty(8u}1vrw\f-xAYy5KzD;{ '|ׇ 7rFxszÆt{udpvd)wg,WxSIyMd:8z`{%{E/}qݎ{rs钁yt֑Unu*bEvUwx)H*x]|8yDQ#y{Ӄp𜀌frۂsJ6wt1lu `UuwTvFFw}!6x,!wY|p4qrztsĞxit{^/uLQvDv4&w7v s=N~peh(qz}rzss`h t\LtġPue-B u؟1ust <yc?f>)h_%kit6mhfpe\ZrNR/u>~x]*c{ Љ-:~jfAlbn=}p)rr"g%:tZv*M%xH=Iz)V} ;t}Tp{}q~s{~iuq>~vxewYyK{-<}=(Ty օ{w|Aw|yz"}#yo}|zd }{X~n} Jh~E:'^^W -U̖zX}z~{~~xa{m|Obw|ʀ!V}YI~ 9~&wJ y&HyȄIzrRvgzTk{R_`{τvT|]Go}8S}ޅ$~ˁExxӊ~yt^ziz{F^zR{wE| 6|*"}Vslw^ x4|xȐKryyBehy\z#Q*zC{4{ {/}%ЎVvǙmwvzx+pxnf'y"ZynOQyՑBz8l2zQy\e4v_/gwzxwȝnix0(d xXxؙ*M7y&?ya0wya |x v$fvɧvwrlwˣb4x WxNCK^x.=x.=xGrv .ccf+.hx k2mׅ=mbpVrI!uG:xx@& { QYi؄~k}^mve/ol=qa'sUuHNw9Dz%Ӆ}@zo q7~rttJju_wRT>xGz8} $̄߀:7euʆ4v|큶wsyiz^({0Rˁ|hE‚}6#у8C|d]|{+{}GqRy}glp~\6Q\Dy5߁_"悩0DUnHy7woj|evZfOB`4Vtv!0Oms~ }~]|w;~Cmt~ c~X~M~·A2Q 逃}dw~}uZ}؎)k}a}ڌW3}kL}?c~0~3~8~l|ɖn|}asr};[i}?V_}1]U`}0JF}-=}/.}|_|\zz|qZ|՛/g|̙]|ST|H7||;^|X,p{zr|x|JUo|{e|d.\|1Q| Ff{ٞM9m{*0z霆xԎ.cË|f*yhppkfpm\SoQ>yrxDyOu5x," |oiQkVx]empnoXe^Fw4Ç}z}!~JĈAnhpvr.mSscu5YvN\xBAzt3u| )}vt}Futw k_x(bRyMX zMFE{@˅4}e2l,ȇv;nzx{ {=sS|j7|`˄}Vn~_K0Q?)1ui<pn ԅRizqt9h?A^́TڃziJ9:=+/V\=ʄ+_px7soچfYs~]SHi^<29./:atN~vO_vm!d[X;`QE%F:O,!(} {tnĒk|b‚UYOz.'Dɏ8rT*HW{rpUi`W Mu8Bހ6(~{}y#Llp#h^*UKTAp4~ѝ%}~S|= ecyFf.q%hhŏ j_m*wl0w9oϊ:jgƉv_.VMjB*7K)ZTʌTv?Hm~f ]uىT҆KNAL`5Ɗ(Jw It@l4dE[98S EIr?3˃&CAr]9djJtbQ YkQG֔=x1#x3ԉpޞh`@XJXOU\Gw dpe|f@hh`͔djXlOCo^EnUq9яt,ZAw]|@\+vhn#jgl_v-nzW;pdMsrnDAIt8}w"+A0z<_ uTmmo+f5jp^rKUsLƏ`uC@w7wy*3!|isrlsdAu \vJTxwKsDyAލ*z6vf|)%A~aqwjxc8(yz[7zpS+_{uJ%-|@}5SX(# .)pR|hڑ}ka<~Y~Qw{HFQ?+X3NJe&RΊĀnđg6q_ʏuWŎ;OF>=?e 2n$E~nm?e^#VfN'E ̈~;0]#-afkMcяi\r#NTjˍ%LMaCN%I9ˈ.鏡!' !i;0q3{tx&eww}.߀lShegj^lbW n4OfEpFr= tX2sv%]z.рkmdn]^p>UїqN7)s`Eu<w1uyl$^|Di|qbr[t@TyuLvD`zx_;Tz0^|1#]yH؅h:cv@aYwKZxcS(ynKzC'k{:)}>/K&"hm'-kFxfb{_Ԙ{Y |Q}J~[A^8-Ǐl mƉ~eT|^PWl6O/HYe[?ېՃ'6ڏ\=, 5'x yc`\U=NYFF>;&E52B*bpTo 5b-![-iTKL4El<3n (\O`!YR9Js C0F:1^g&< wVI_DW񕒗P՗IQ A*8׎|/֚$-mvJZzbϨ:d\yfVQehoOV jvHQl@-n7zqV,ҙbt% w ~78ah[hjIUEkNImG>o?&q6s+Kvz K`lZFXnT'oM3qF1qr>(mt~5v*:y$| XY }_UpY 8qRsIKtE[u=Yw4|yn)*{1P Vπ^ ntWơ#uQwJƜxpؚhrjt7 lutowUfq]xW5sz[Ev5{/x} ~m_aw%d8xfy%iz4kz{ rm{e>p |Ur}Du~.w |V!_&rb[veΊg~lj iqVlocn T~qUWCrs.2v\ {u˫]"4`džɔcrf@ |XhхoZkCamKRp1Arń,u( yۅP\r1_k&[bMe!+z)gGm@j7s_lPo@?qZ*sSr x<R[kU^\7ag$:dx fkHi5]kUO$n>p?(qIvƄp Z]`bc8Pveޗ:iEhTI[jÓeM=l Ń~Bk?fϡNli4nkpm~qpJq7serucu-tTwvCTydy-|{h hnY:jplqEnxs|fpEu6orvbUtxgSAvyB1xE{,z} /HfuhwjxXly'znz`r|KQt}VAw"~+y l~d}g~ i[~{kc~xmnilVoq_HqWPs@vo+*xer R}Acc1/eg]jvl8jcnG]opdNry>t̄)vޅM {ˡaߖd@f֋E/itk*hSm>U[so[MqjLzp{)|} ܂Q$kt̕muoHw px4trZy^hszz\Fu{MwK|=yK~H({ WYj|k|0m}.~8oV}s.p~Yg@r~ZtOLvDgQnIxwn_dxbQxea~yh-szMkh{*m[|'pM}asV=rvI(|yiZ5u+fvhrwj}wm rGxohfyqZSzsLE|rpiedka^ulݣ_kn~aoMVtpk3Jqy=Rr?-rxpr|z_t|bIF}=e's9ށiv"%yzш,zWeÉzh{zjyva| ll,|na}Qq-Ua~sG~u8Cx$i{_zqxflym~yotzq{j{CsA_|uT|vF}x7{#"}僶vr,wks|xJuryvbhyw^ zyR{zgEp|{6b}}"ۀEkčtxIuy{vzq>w{pgYx|L\ys}(Q3zl~D*{#5K|ـ}!~6su?t}yu=oKvwevwaZxOpOzyIBzZ3{ }Dir,-;sN wtxmGunc}v]XwIMx9@y5M2 zE{;~JՇbq9~-rUusxketpraudWvLKw2S?xZ0`x y 0Qpo/|+q7srDi{sZ_tzU/ujJv@)=Gw.vwvڐ32oڛz plpr#gbr]sՖS#tH u^;u,v7tՏKotxpOoqerj+[s.QXs朻F }K/~2]Rzi€Gwxxoy`2fyQ]pzp}SLzH{bbre)iԆVg`jnVmLo?Cr1ZucyqUfe;y3g|qLihOk_En4UCprJr>luT02x= {#ŀH |7=|4;1|!#{ϕ@4{`q{6Di {cLa{kX{O{FM{y<#{^/{!b!8zrv zzz-_rubpjebgZj1PlF~o:rv,ˊ̓O2„%- nifӃG_^WE8OZsFQnt30wC%zN׎+Vրl`nqeLo^b(qjVNrO wtFRv*=:w1يz$N|")jōshct\uULw M;xXEy;Љ{?0}#|3ibxbyl[.z^S{PK+|TC_}n:6~/(f!#?gO}`f~^YmQ׉ J6?vAR8qg-j 62 eaX^WÈ P.&mH]?톴6Ɔv+1m ŇCc/\މ0ފG534)넨Wu=ǃb-[ tj,v!z( /rb'm}\`oUqpNؒ1r&Gs?ou{6wf+ˎy| ԐaurZs]T7tM}vF[wb>.x5tz*t| 6_铳vY^nwR&xKz D{-<|p3ߌ})&gY Ӌ^l{W̑r|QL:}gJ.~;C :׌02'csGt Džq\V*{O]H6Ab ^91E0m)%TLkӄW[oTʆN#Fv?I7xF.VS#Ӊ=^H*YrSwRЏ+LHE΍I=̋5,!{C,lWʏ˓Q0%JoWCw8<3ƉҖX*mٕ@y\*`VGbPӞgdJ'gClis;^k3n(]jq6 u6{}[ldrUvfcOhZILj^BNls:w%n2 q&'e@s2w_, ~ӀZ<]hlTJj$NkG mA8_o9pq1s&uv_6yۀX lzRHnM3oFq)?-r8?t/v%cy4t|ƒ6WpQ qKTs\EXt>v;7 w.˓dy$Q|:KׄV7uP;v3JbMw]CЖx=-y5}{E-8u}"ő]?xTyNЙ zHЗl{B.|;}=}3Ò~+n  G茍ST~MB20GO@9u2 !)84.HyQԙ KxE•䄱?UZ8=00fll'=_BqրPRgAJ ܉DMC=?6Z.k%ŏ юC TFNԏHOBzƐk;.A4,#܎ѕ peZREgY]•i(a`-kd}?lhpbnkbqnBSsoqBjvKt ,yvK!z^bb"*ddޓfgQijO{xk4lnmiogasoqR_r4tDABuv+Kx5xka| _ib7ldn$ogpyirm&ks`nmuQpw@&syl*v{+}~u]-qΙ_s#bte5uwgw1k}jhxr^{myOoz?r|J)u\}|8%Zy]zU`{cj{v7f7|ih}+\k}NsnV~>q=>) szӁAXk}[с^aށt7dŁgg[4jKLm>iIhhS}uV+Yĥ_u>\j/_^Jb"bQdpCf!3,gњf=iZ kw]hlamndwpgklqj^snOup?xjs)1{v{硦g)ahd~jgtNljvnllipVo]r^qN~tt=w$v(Rz0x}vd}i[fkhhmjot_lqhNnsd[quRM=sTw1~;Xb~e~d~gb~si{4ik^umRoE5qŁ5t!;uH/|'Ia(0c{eqh)gjP\l^PnnCtpr4 r{U;s~[_⌂pbCyd:of䊥eiZk(Om83Ao$2vp5Lq ^ܔZa9wcmeҐchXj MNl@mڍ0oSn^+-`]ubke{ag Vi KGj=l\.Imfl]U}&_psb3id=_f<#UhI~i嚛< kx|s0z:~6|Zq=)mUzyyn{TppG|gq|^{s}nTHtX~,Iu=w&.x,zY2k0w|mT_nnep\\qĂ*RjsGto;Luă,w"Ywo~juwllm}co SZp7Pq.Fs.F9tf+2u9u| is~k ;klbnXozNpČ=DKq 7sH)Qsۍt hyh2qhjA>hkӔT_m0}VnLo,BKp֑5qU&rrwh4otigk^'lbUmKn@o3pc$p%|q|[W{.}@^Mr}a]i~dA`Y~~g:V#jKcm$>p0r6s]U5v za,yo{#cq{fDh|Jh^|k-T}mJ!~up==wr/JuCxxtgwy(iolyk4ftzm4]m{hoBSo|8qMH}su<~*u..xC;"{^~7vlluwEnmx%p;dxq[ys}Rzu#G{v;X|x-~4z>}|Strtut&kvzudchoXjO]mUDo8r*̓uyw}f}o~Ihh4~j_ lW@xnMpCs7āVuT)xz{v|ln=|{mf|or^+}qqU}rL`~tBn&vV6xM(-z~NtHz=qlzrd{YtW\{uTV|svK}xXA*}y5k~{p'})MrdxwjjyEx\cyyZZzzKR{{IIZ{|P?|l}v3}<~&~Mipw1}?hw}a)x~tXyG PyGzi={(H2-{܂u$c|}~ _nucfv_^wpW8xOxhEyV<#yn0z"{ |-Ylte u]veUnw }M>wDx7:ex$.y)R yc zjtctΐ)[uStvKGvnB$w"8hw!,wǑBw ay/Xhsma9tUYtQuFRIu@iv b6vj*vpkuYxr[k1g^cac[ӆdSfJi@̆l5#Vo'Xrvq `icDbmjeZlShR]DjzIDRl?o4r8&<8uPyÀodehg`惼jXlQ n'H pA>}1r2t%)w{mk(fj l_InWw2p@ONrFs=;u1ƃ]w$kzs߇~kLpldŀkq]s-UtN4vE`w{;jy0z#}I,j,~ub~v[)wT?VyLz#C{P:c|/~9! hs}f{Ha8}|Z}|Rm~"}J~V~bA~I8~݀`-bF~ Wf|4_e|yXb|P|iH}1@E}k6}x+}(~H /d{'*]{oDV{mN{G?| >|OZ5=|x,)|)| }pbzJ[zTzԍMzEP{<{663={EJ'{=zב@|)`yYyҔ|Rz9KUz (Cz*Z:z1#1xz#%yjyzi\bȍ^\saXTcMhfDeit;!l_/֋/oY"=tr Lvh)`a`ZcZebSK_gKƉjC,l:o.q!&u Ǝ(yfel_≨gjYO8irQkwJmARo8Bq-tr w} |e jj@^SkWŇmPyXogI q6@s7u,7wJ;z, Xcjo(\ĆwpVE'rO szGąu?fv6sxU+nzR} 0aPt2[uUTvM[wFXx=DŽ=zK4݄:{)愂}Sz ]`yPY_z3R̃{#Kh|DR3} <~$3 t()6JDŽ.^?~WiQ y IIBj:XN1p}&v3 \z̈́U⁢OhvCH6C@ 78/5$瀟kzZTŠM+FNR|? 6̌-"lJ~퍔qX׀;RGKÑDv=Q4~ɓ+~h f}}p~`]O\BZR^SӒYa[L֑~cEʐf=i24l)oTrTpUx#^`XbReKg`DBi`d8 Ċ80='Dq 'PxhOJDΎD&0=R6Z.EE%h. ڂVe\nPV^K$a,Dc>1f!6th. k#5FnrOOqyU`KOmbsI旀dCXf= Ai 5\ek-n"4pCt T|SSۘ}d=N3Cf.Hh%BYj&;l64Mn`,p!;sPCvp~RhJLjG[kA m:oy3qq*ؑ,s `vEy~oQ$ltK\mF;o?.q-9]*r1אht)vy W|6O'pIr#Dps>#t7Ðvk0=Hx ( yj|U9NHu 0J?( bڌG~UAdj<r05yI.{'$]jْˉXxaU\cYe\ng`zt+i{dgkge[+mjLpcm;sip%wsgtxmr^]``ccB}eMfr|ghfjikYl\nnKQnq:qs%uSu~zv4[Cd]g`i{ckpemdh;pXpjr?J mtJ9p|vk$Xsx?}|]X lc[n^!oy`qro cscWfxtViCv:Hl w8nyU#qz{~#U>t X|u"[vFx(^wMmqaxYadyVUgzZGj}{P7mz|V#p%}]Fz?”jR{yVD|&Y|v#\}$k`}_c~Sf ~Fh6Yk!mҀZz9PTPTU.~X! t[^i^^"aRdDpgX4i j~O &R]||Vr*Yщ+g]\e`PxcBeʇ%3LhhT M QizzU3p=Xe[nZ^ÍlNa}A7d91f"jf}LPo@xTT6n*Wu@cZX]fL`N-?AbM/[cӑF;dUQL[OfvpSPslZVb"YV\hK=^=`-aa}cutfUĎZgY[]iJ]yj`nld c/nsgLVpyjHrm8sup"y8syHb\Pd_xfc whemHjhalkhUnn+Gqap7`t!s{"wqu^{"_dDNbfddiv2fkIkhm`CkoT?mqF[os6Yrv7!$~}g\k?_]mP~botcdpj fr{^i^tRkuE!nhw[5Rqy sz?}L Yr2\t|_uLrbtvjhmew]?gxQ{j9yClz4Yo|r}dX| Wz- Zzz]{sp`| fc\|[}e}EOh}Bkk<~2mLYot~.rU}X́x\*n_da΁YdyNg!"@ia1gkflބ(*SW/svZl]qb`JDWbLqe?7h/jjCRm}U؏tY6j\`^V(a8Jd5=fk.)hD`hQ@{TܖrX;h[q^]˓m}/p~qZl{]Pr`Fi)bĀS_e5UgIiׁM=l-no?u[X͆y|[p^SgNa1]cSYfHWhQ;zjc,mlxm;9BWtwxZ[ln]Oen_֌[bN{QdFfڊ9hu*i$k~VvuYYZl\Jcc^ZaOcJDeaC7f3(_gSj+|Us`Xij[[a]XE_uMb xCc5eGE&ReiϊnVcoYwp]Cmr`csJcY9tfMv9j5@xmN1tzmp~ s{|k\~m_unbl-pe_b}qwh!WsjLtm?vp90`xs|2u~rhca|jet l[hjmjPaolVqanKvs5q>{u#sA/VwYuzMx$ f'izh$kr>j-mhloY_mq%U orJ.qt=Ssv}.Nuxx_zcpyeqphsAgKj t^luSmw)Hox<3qy-Tt-{gvv}katw/wcx nf1xekhEy\f1g"f" QlT?sVytYpt]Mgu`t^YvcT xfI.yViEtt9w9vd|njf|fVh}]j}Ulx~>KXn~Ao5qO~&ruEftclre'd{gX[i,S@j2Ilu?}n*3oo%psramjc̉"beZg̈QuixGk#k=l1mЉ(#CnY r=p`h|b`dڏ`XfOzh>oEi6;kJ/k2 k Cp㇝nt_Mfa—Y^cҖsVNezMg D8h_:i-jXi6 8pj<zwVrOxxZ j2y*]_ajy`oXzcN{~fDO|i8}l)p1s1xu\pv _rhwb;_wdW.xgMryj!C){l7|to(~Lr"uwvrbnsdgtg^vviQUwkL9xHmByp5zrw'|u"wup&h`m&qj5e[rl\tmTkuPoJvq@ws4yUu&{ w4~zs.mnCkdo^ocpq6[jr7rS st#Itu?v8w.3wx%yfzZ|`}q;kt'tz2Xu|9$Ew}}zmobizNgkz_m}{Wn|OO|pT}F>q}H}i>(~rl2WoK$>urFR9u}oFwbgxd\`DyyfX+zBhP{kF{mV=|o1Q~!r#5t}-x5mungfvqiz^w}kgVxcm?NyHo$EzjWc_Z\Q@]Ti`bLcSCǂf=:6iE.lK o hs;h\a_4ZEaS6dTKmfBgiv9 l)-nq 0ugX}Ma`R}cYo~Tf$Q~hSJ(AjAjl8o(,qCtg ?xe{"f^{hW|gjP^|lxH}nf@(~"pW6~rc+tw -|cyl]ymV\zo-N{"pG{{rc>|lt5}1u*o~8wz g~b%w/qP[QwrTxsMAyzu%Ezvz=Szw42{yT(|{}}^̀u`du|vYv]wRwExKswyD xz;yL{2vy}'Az~\{b=~8^{s|fWt} Qu}Iv}~fBZw(!9w0xl%yyp|Ã@\rSUswOQtnHu }@u80vT/vօ#w1wr'C{A4ZqYSrHM_s9 Fs؉N>t^6Btъr-u#!u):ul}XpeR,qBKrDgr=s04sc;+Ws~)st8b&W[lZUR]Mч3`IF|c!=7t`^\Z%a_SjaLldE~+e| _}2G}suTxNykmH{y AzC:zf2wz̃^){{6qP{8 RwLx;TFx?x[8y%0yH*'yP ;y'` zXYQvJw*Dw'=wȍ6wَ.wא'%w0*w xYX5SeGZM[]F`9?9b7 e.Ih#zMkv)naǏuX\iR`^L aKEKc>uf%6kh-kC"umvpcxV`PbJReD g==Fip5Ok,Kn!w:psQ{wU*eO)gIKhBfj;Jl4an+wq _sTv'~SiMkMGmATn:p~2مrI*Kt7IvZyE\rQ7nBL 2oF<1q7?$r9t51?_8b0ܑe?([h j[m'xNNؒ\.IY^Cv`=c.7c[e/h'G1jbm# pE{*My`H Yb7BdZi4"k-fm% ,pHrm jv!ӀJahPEVj@gk9m3oQ,(fq.#֋s0ƌul I)yI)lCQn>qo8O{q52 r*t"12vk2x }yGEpBr>H{9N |3 },Ćs~%$JeI8„˃Bn<'7L1*4s#qO(ׄ> Ă@`/:ą5Έ/NoL("!@ тN]fJ]PIs_|T,a6X7uAc#[je__ gOcURifDl^j:4oms8owYWЇl\[}^7^ls`a~ibd]e^gQgjCjml3mp;,prZxV*_LlXa|[Cdq]gg`i\ScjlP|f@nnBip2ksntzRfƃQUhhz XYjp [Ple^VnZaLpOdKriAg3t41jv lw||^iOnA2R8oxUwqn>Xr{dF[sYP_#u1MbCv@geEw0h,y_jz3(}KuOuvvSwflKVnxcN{/e|ih}HI=}.|M }gsP}jSTo}`W~UU[A~J^|=vaU~.2cf\G8zKkqN7h~R{ ^VTKYhI\<_Y,a(dE/xIOpM(fPŊG]-T_RWGZۈ:]JS+$^WncOdD.vGnKǑdO[[XRPVEX<8Z) Zgkb`}IC(,tFԚlIJ=cN YQzObTYD`W:y7&XS'(Xy1daP1c:TydXoofh\eh!_Zj"cHNlQfA1nj1aqm]uoygc^WՁ#_[xa^KncaWd edrY'h2gcMjj`@m&m30eop sHr@{9CZd^*\av0^dqt|%Vf.})Yvh)tM\&j2j^l&aa{n(Vdd)p Kfq=is.l:uo w_~SmZ{$VqnrtYhpNi \Kq__5s3Tb tIdvH>km;Dmp+prst[Fe}w]g~n`iefb_k\&dmQg,oGiq~:.lsl+nur rw5}XlSuZml]Zogc_pZbrtPesEguo9j$v*lxq\pdy{]UAs#sXt*jZu8a]vCX`pwWNcxaDWeyv7hz(j2{n}IyTRzqUzhX{`[{W,^n|w6PoSgV^PY@Ux\smK_A4a4cr%d`kdu1N‡m"QЇe1Tb\WćSZI];?_3,as $-aň)j)?sML[kP[c)Sl ZV6tQXH'[e=]]1@^!^5 lqLJi*O =a\R9XTSP9WVFY<3[/\o\h of~iQvNjU"mkXdmJ\7[:n_Pp?cF rfm9Jt:i*Qvl{1o}|fQWtxg[liF^!cja YldOnWfDpSi8Br{l)Qtoy"qizc^_rd`jjfcazh{eXsjghlNqlljCnmI7Epo([s r;(w6tTx_dpafhch_fjW h6lM+j^nBlp6ScvkJYfxfw|2Jhi}#i~_p6SpUQiX La]ZX][Py_-Fb5Hopo22qr{#stxwpYapjOhc~ka!emXgoa_4bĊb(c;!dЍvdUp7]?WVZN[E]ܐ><_aV30`u ''`@c\)1xprRpirUaHsYXt\JP]u_FvbnbVp:eMqgDsBi:tld.vn xqp }trkii1ccje\lVgTmiLokClq0m9ro-tqvt7 D{woif]iTbBhk[ilS9kngKFm[pBIoq8ps,ruItPw% zzgco5`lepYLgqQips%Ik@t@lu76nwF+pLxOqzs ^x2~9eaWu'^cjv WmevOgcwGi9x>jy5l{)m|cn~7vOc_A{T\aY{Ucv|`Me[|F%g5}=Wh~V3j_2(dkkk&lZgu.Ta]fZ_}SaL+csJDee@;f΃23h&hŅAjSw̓G_[Ј\X]؈AQ_ވ1J6a6BqcLV9d0;ey$eehьBz^Z_W\S9P ^BH~_鎰@am7b.{c,V"bTgύk}ivRb&wTUZwYERx\dJy_Azb7{e,2}hk *o}gsX*`tZYxu]Qv`IwcN@xf6zh+={k~nhr3f:p]|_ r_Ws'bfP;tSdHfug)?vi5xKk*Pynn{p递u-dsn#b]`omdVlpgNr iGsek0>Ytm>4v@o^)Uwq~ysX~xvbkuh][ljTnVkMnomEq6o\=6rq3t#r(autwdv}{`hmYjoRS+lpKmr%D?os;pu2mrv&sex tz{:~_fsX+hRtQUjuIkvBvmw9nx0ozD%Op{ri}Zy_ ]#dyrVOfBz$OhzH:i{@k|d8Glq}F/m~S#nqUpczʂ[>bTyddMf OFzg? iH6j[-bk^!k[n· }%$YJa RbKdbMDeΆ= g4h$+ihʈhmFWl_~Pa!JbBd ;me6?2e)f7f lub{S1[)|V@Tm|tY\L|\aEY}_q<~cbr3%e'&h|kc-xp#`xX3YylZSz]Kz`RD!{c;{|e2&}hp&Bk#mZs^v],X5v_QwaJUxdLByf:fzi 10{kx%}Xmp[4_v_]6smb=VtgdJP$uff`HvkhmAw{j9p}Lsāy[pg^U qi!Ns jGt(l@juLn8vtpL/wr+#yt { v]|kYnvlSLonLpoErq>s5r6t]t-uu"j<7k0n/k_&wl/lEc ^q]PodKJ+f;iCg=hs 6 i<-i$i~j1 kp ZQSSVMDYoF\X?_M7.b6.e-"n7hgjV#q`X~5X6R~ZLw~]yEyp`>\b6eM-g!yJjrYm tWO{\Q|2_&K|aD,}[c=,~ f)4~h, j UmGowUyaOycIzneB{&g;{i3|k*}n6p2r~W(zTvfQNwbhH1x!iA}xk:ym2zos){q^}sJ]ut}MRUt]k8L[u,lFunV?vo9wqz1xs(Qytzv},yJPr=p8JsqDtr> tt7Guuo/Ovv&wsx_=xFz@ {}Np'uHqvBr w<]rx5sy-tz$uE|Qu~o y=Ln@{Go7{A:p,|:q}e3q~P+rvo#rsO wJlEms?>n^88o1o)p$#!p#%>q3JvfIjwC?k=}lf6mH'08mÊ;(2mی1mPo6u3RTSLkVFY@\W9C_+11`a(G7d'gm [MjxuPX-K7ZEVZ]L>„_8 b]0 d'6ig|>i lxBOu\rI^D:a=cZ6߃e.g&.jEKl 4ol{8MW`H1bBd<'rg5i-k/%mKz/o_ *rx}LJ}e2F}dgA4}h:~Ej4X~l,n#{p~irl uJziE{Bkn?{m91|Cn2|p`*}r "J~rsu byHxntCOyBo=yqT7bzer0zt&)!{u s|nwJ}dyV r~GvslAw\t<wu5xv//y&x2'hyyzT{-{E}}E4tx?uy:1vz3v{-cwB|%w~ w#yHY{惞C,r~7=s8t51t+Yu3A#u^u#nwOszOUANq ;qE6Hri"0r݇;)s1!s r u|>I"T DgV?;Ys9 f\!2k^*a"8d4 f~֑+jycHVWCZo=a\7Ŋc_[1za)ŠdI!f3h@l|.G[AÈu^+<^`m6ob0Ld(g* iaKkfo~ES_@pFb;E@d56]f/h1'[j:lDՊ-n3(sDTd!? e9g3Ai-{k&mn|oVqAvBhY=ii8? k29YmO, o$o7pʄ)r2vtuz@l; n6jOo0`q*,r"~t-ւNum$x{h~c>~q$9~Drn4~s.~u(cBvt wZy ΁}'`<|Lu7|w2|xI,}y}&~}}z}|b~~ ~ Հ:zq{:5z|Z0z}*{+~$I{~Y{e~{ |8xSF3xS.y(yM"My|y8iyD{mft2 -Ge % M u EtHHt !"$,%Z&'(*+E,s-.0132e345728]9:;=>;?i@ABD"EPFzGHIKLCMjNOPRS&TKUjVWXYZ\]*^F_b`abcdf g&hAi]jyklmnp q-rMsntuvwxy{ |"}9~Phʄ*AXoĐؑ.<=<:852/+'# ׮ϯǰo]K9'ǼȪɗʄp\H3ҵӒnI#تـT'ݘg5e0[%k&V7Yy.Pw/P^X"7Ni * Jl.[8^!"+#V$%&())*S+~,-/011a23467;8e9:;=>J?z@ABD!EGFlGHIKL$MGNjOPQRSUV5WRXoYZ[\^ _%`>aXbrcdefgij;k[l|mnoprst5uPvkwxyz|}"~Ca{˄8Rmӏ,9FR]hr{|wroljiijkmosvspmkihfeeeeeeeefeedb`]O?.ժ֏rS3ܟuJZ&Br,T t(=KT\ fnf>j#6Ld~  5RpAa / S!x"#$&'#(E)g*+,-/0>1`23457889]:;<=?@A:BUCqDEFGHJ K#L:MPNgO}PQRSTVWX3YDZU[f\x]^_`abdef5gKhcizjklmnpq0rLsituvwxz{2|O}l~Á6Rm֌2G\oəٚ $'+/38=BGMSZ`gnu|“ÚĢŪƬǧȢɜʖˏ̆}sgZL=+بٍqS4ߩS!K_!_Mt*Jf8T[:i&8Ng *@Vl $<T m!"#$%&().*E+\,s-./0124 5"687M8c9x:;<=>?A BC4DHE\FpGHIJKLMOPQ-R@SRTeUwVWXYZ[\^ _`.a@bRcdduefghijkmno"p3qCrTsdttuvwxyz{|},:IWftȍ֎ $0=_u{|;n`S7Tҽb5%bŪ=җ#-x{+Sam@\_:RZ⁨5bI /M]ׇVy1 k~^m~VQ~ᯃp T%=}vC9Ywx~j~đ/]5~P~賋}s슒}AK~3z6~̇5N\Abrtc]wUVƒS΄^o2K""Ճo$q?cOeU\V'.aDZ쉪CTGq b{KUagsԛ{zZjb` bٚ҄K˃҈~0p^Ib(Ufᡉو"ؕ<ޒyސ/j싘V}o1bBUj9JʈϢ.󇷞%|ry뎒|EPnljqt>7h\Q{섺̺(֍ϋP]_"aG}~L5rhfō[GP*_ 24t]W|pςyey Z}bP!DC{őJ||i})f}œHh~~ŊvPzh]҄Sςʄ5v➌̍5VF}rÇ{hM]pHSw`Yy_R<ݒqR |qMLg'\S|k7Qn5M1-UCwz-`p*ދf[񃋆R%[Jǘ5ޜߙbS⃄Sy!ʏnwe:[?QF .&NPӡyڑΝ\=rwqmUcڋZPo h!ϡ^ӎϘ{{)|}"m}|~rBg]"`RfŻ6.]:ݛG1S:a;'{" qm?g_W\R؄ᢡ I~gzDpVf{Ⴭ\g6R̃$"ˆq&ޑ 7yoɋ8ef\ʄRGP7\\ԡJB&njؓIxڍneX[˅e!RxΡĪԓ,S&@wmފ>d~[R"w[pڔJK͐ev#.lΊ#c1Z9}_Q?t靜l& G|~WPtԌ=@kebDYePq[c@{_ 㚪Ē@|spBj>0azDEXzvOu陓[ߞZ{9ɖqӋJh`>W\AOͮ6]ԣ?&՘pǍܡ胜 yɎpmI0g\U^ą!Vd`NYرzԧ{N~{̔ŝ|YJ|}x*T~nudb [2hQτۃ簢wȦΥGĝ@Ҋ逇Z>w6mF`dUׂ4Z⇜Q̄vㄫ.O[`IizvN+l󍻂c̊SUZ&QɄAhhw+ǟΆ̇х~V*]uNl*.cCӄsZQeQƃi:~ABۛGOzC}:tSkf4bÉZZPQÃkgg!受wߍ΅ό{{s" jd*a㆘Yp܅Q<§9-ᖷ~ 8qzqݏiHCarXd!PjmYHB_biiH_yQWPph?L`6WׄOƧ@ȔOD\۔xonSg_-V"OӦ}5_H7u].КWyvʔmet]·8qUNpߥ <wlz~%=u36l_dq1\ڋAUMÄXm{Px{䦷{,|`|{ڙL}s\ ~jb Y@vPυImyϦx|zܘr}gyi]6a]YPՄ37"cƥfՂt;WyGqɂXi@ǂa ҃)XÈPڄ[yڇΆנ8܁T!xUp*Jh1+`L1XPP߄*Fo^E;;wۖoג;g֎`%΅/XW?PلmIT܍ڇ4?v7WnŒ f_rR,WdžDžfPianØ$gDڏ^}ƚYuNjme񍦈w^݇!WLOքʠ2T񨒗Hs|tial&e7]։oVNنdNU؞ҕ!qQz{ntsA kō`cϋ \UiN[䝰ѣYeS:zE,qȒ j5nbjN[T:MӁ}aɓ" kX'{xpǔ i"asZ.mSM^$<|!4j|Mz|w|}֡},v}ng~f?^܎W*!O兯% pی|u#m1me򒕁,^wV(OINٵjh؃As|tP@l薃ea^rVԉPtүxΩĆƤV{ esf.lՃd‘P]VCP U􊟉/Tԣ6zrQkI/d'5]__V;P>s$Aܨˣyy 4qWpj]ac`'\ŋۅV AOĄΘΓʐ0ЇըWxpڊ{ijb\ ]U^>N6ܗ׏mۨ~ˢw Rrohvha/[_釁TƆ'NQy׎ɘԧɖ}Ǣhkv n ag='`׎Š ZvCTPM‚?dU|?3t m|Rf~卮_Z?YZSԆMDׄ@ϭ ]{s꜎Ple^BXWRKh7L؁}PF}g\}CR}~}Cw1}zpCD~i~b[ؐN2U2%O B}ʋYwu}Mvoonhab!ρ$[U5O"huՄ1փs˯|=unמhKHaT[G UO7GA_4 {̩,tߣWn gza!nZtT퉞7OJiƂORn{~Zt SmF+fՅ`DŽZ焥Tى-O[̐ʺBŋYz.s3lsf3_,ZwȦ[p͠jcՕ]א/|݇w}u~~&t_ydUvك>y*zG$z{,|4P|؊} ~/sj~#d8UwxOyoz4jSz{|EX|3 }r~cIUxtqyyƜ}%́px)k^OR߀!4g߃zܢЪ^=NV]ovÀ[jj)^ 臻QX ضӨiy!l%me7♵cu= i nj\uQ)Tx+3 .k9Be4Ý/sjɒgvz[:&Pt~\KDi.8N J^ti~mqf6Z~O~xy1z8{tf|e_}Yo}~_{*lm℟`ЃÁT9:FX識-ۈQFz8}m*! `cNT)8҉KAŘӉ1_eJe+jyQl|_ރvTwՋRƷYgІ͈NIӇZކrx^kЃ2_uIT .׵iiߨSO=XGЄW3wsk.ÆS_ESkNuX`޳/ΐN@ԎJv-j8S^S[˗g"ұšdIx(owE~pti]2Rb2ɷnټ دƇ,[΅) | shHh s\ȇ[QQ튖ʭ}]9nݗ}kѓ|qf΁'[iPm"],dDߟ{ p4qe5ԌZ_PNUlŷCC˯ZNnQͣkyXunc7cҀYOĉ>On~>xFxy짏 zۛȌ>{׏Ċ|ރވ}w$kxi_sSFɴ~e ~~W:Nptvj…_.S͂߃O0"SE\aᤂH+v u׆}j1^XS}ƅ캃箴È٢_mшSdtil^7TS"0&3ޡd^ފ[\݈@t~ h̄(]܂S΃1r)Ǖ-Oϒן 1n匧}erȅg݃5]R]epyʊєa5,|O0qkfȃD\' QQ݄1k泭nTRCم%zԅp%1eĂ܉[CQeKvަ<_a|lڕyF?nՎ`d~ZI;PLbCE"f Tl|]`wIm"c &Y߈6OxHov{l;ڊ[ߋyCqvu􄰖k4a؍)XO Gwx锆y1zy {x|2}s|~hۇwQ]΅S63E}=Y}٩t~/{~7~ԍv~sh-]cSJlјOŕ ɝboi}qwrBugy\CR郡WCDjjHVj{q]f:\bKۊ4X݂CO[gL|ݑĎqTߚo}7usYi]`׃|EWOz W(ZL:ewˋ{]rh b_(?VŁ`HNUw=cxsm,ynUMz^yl{U^|jzl }p,~~fK[݆R+[|}Ms}~#0~3 ykyoZegl[~Ră3Ɂ&˂xvnjRdч[%:Qcòh};a7YX߅qP%9žu ,y<ֈp鍰h`t߅XC8 PmVۢenƒAщ8*whbo$B`{'>~NՃevT 8nN$fȍ>_%AwWpP,%Έ`S(C}=0)uYemŐf+^„wW:XPSk^&׋Q| t7هl!e;,^CvVOnިkUAwւY0zϗ7s dkdD)]9ʆnU񅝅lN삌Aђ ǔ"X?yю-qLj7c_\xZXUB(NC c)4ԣʀZ=x~pӒjiӌ5b^L$[2T]M,q(̙K~Hw)DSoRhIwa$iZZwSDM,7èFT^@ND鄕:_khp{k tDVmIf}`5ZȆS Mh2Mdʕܣyzh=sClQe@_V5@YITSMٜ>BwNy@r!Tk6\nkޛd]e͖l_ڂYʍK*S߃N^hLDž[dž~wޤޅLqvk#Ge$΄_,1YSm2NHH2}ũw>pjS-db+^#Y/S{넨NḮ@⮴6|v1boŞmiuc]א GXnRcM@8F Ng|*uj.Zg (7a9F:[fV$/P/L(Ї|C]yrҢOlqJfB؎`sxZDNUGNP=~yKȁ=ywXzqxx{y{zİ|q{衞}*|k}~~sFc΀xTvTxq?yDBz 5zҀ9?{y6|vđ=}Q~+jrcfTrlwUxdx.ry>y􅭭z{Ȅ|1}q~jcTtvHvqw:Ɂx7ry+z)`{|T}4q$~ b&T=lucm{vc Ǜwoxpay{bz~g{v |p{}bS~ĄTX]tßWeuМ2zvw_x z:{}|"ot}AWa~ZT$rtO<^uj4Ovw?;xtyz|{;n?|ى`}S'[t>Ou@GFvMBwK?xO 'yQ\zZz{d}m|y_}R?~`tTPuBC>v:gw*?x">yszqy {k|% ^}7Qt~Z4]t:u%voszwJDx)!y /ypw)zj{ގ]2|kP~ _ju.YNu %vwe-x/pKx҂yלSuzh{\|(P%}ƄZvԯhwƵvxz {]L|<}z~pǀbJgT2>~"~~N~~{~~J~? ~ p yaT1v} }J>$}е9}su~1~΋ }~Po[!a{T/3| 7-|gF|Ɗv}!}~}~o|~naT.$F{?O{v| |oͤ:|֌}Q;U}ډ{~onC`T-XfLz3N{ij{{K|ZN|؎}cxzV}'m~`FSmz?WzS{3D{>{|zl}Ox}Uk~9^_~نR~cz- Xz]z+{K V{+|#I|$wk}:yj}֊^~siQuz@bhzBhzӧ{&j{y%U{療|du|퐑iz}G]~2P~-zazȳŵLz{9S{teN{͝ |6t|g}4[}ƈP?~dSϔ{{Cs{$h{I{o{y~| |r|xfh| Z}~O~u؋uh[wuxMHuy@z͖|}J|v~nTa`тSS˂La|ɦT}e}篡~dV~蕕%u{!ꀪm߁P`e܁SႬ􂲃dw؃B1Bukz9blc_kS|"΋-PJ #C׀܆z@҅yBׅl=]_S6JHؐhouOyvA=xTQ6kv_FSǃtc"[Uw -4ՏǍ{ŋcw ܉[jQ^/qR[͖vv̙=yiׁcuvmi]GR ˙ Σ1*Vuk%+7: t=thr4/\TQ0uɸɩ`k,1~훺i~ϗ~~er~ŏng7~ۋ[~Pn&̀c׺2攓~ڟx~|~q ~qe~Zq~O~IλހAg@7~ʣ~{~Qo~@TdD~CYf~T#O/~lgZ^u$*Uvk5Awĩ^yzS{Q|xa~Bk_g8Si̪O{\|g_} a}b~55~܄,mwՀRk2D^SRG\jχ{VᆐB΅т2#r)ق=vσN`jǂ^PS< 7 F$ԇ|(˙cjхAuނÄyiقM^.惟S(Huُ]9x'£wmʊ47ހt>i8ۅh]ԁhS1šY5N%C3VsƈhGg]5Rw0񫬄[׃rBʈ΂YQ}͌rV[g23\$QDAمѩJW,~|#miq sf.[D/PЃ(쩷 fP'iɂ[dzoNd2ZM͇jOh I+"$"\!}b!؎<-x΀ؔjmQ1c|݌ Y$sOM ?|dZn/9!قWwDl b,0X#$N~YAt_uwBaxyތ7{6w|uDK~i$^S ¬zٷnu{p|31|ږ&D}~J׆!tZhᄡ]R킦֌ ً((S$oŃyK%o)ue" d[IdQTr0l4ܐs>ȎfC_Ŋ·|܉+x6nMMdZAQ8\Д_1MdvYm/cZ?˄QJ˱ }giFVGG~و;juukbY^P{PmKy+nЍKɐɋj5 }kՏ1t"2jфaÃ:IX݆!OvPW576.;{rӎiL&`ՉcWtN#𑗧Lev~Ή8zP;q.~2h_PuwVENV:BӬԟlVۛexGoх3Df̓O^sUM_O^'tRݘuv"]x7ڐyIzw[|Zn+}d\{Z'QTOyzeS{6֒{􉗐7|%}v拾~mGctZAtQ:,~٤* Ej_TKu(l Mc(YQ#%cC؄ÖAܙ,7f݃+}ጯtk| br(YVQ ȃט=P]'ݎؐ%ώ9k|sEjb QYC+PsũYŎڕ&QoXۄ[{brjxiއnva=}XPnc^ȑ6ϏzڍHyqeh`RW̃7IOwO@Ӕ_bSvxp.g_uW ÅN!ė1PnIs wKW3n)f#$^s0V3XnN@9-@:nz{T:~x_uNJmsяe%Œ](ȉU4M'OfP2|k nϜ}.twЕ$l0cl\ lTWeM3Єbtuvx'}yj{zss|Gj}aɉd}Xف;P\aU)y^zfz؋˖{q|^z}Kr0~PiՋoa9؀XZPLT o~A~g+~ UTyOqXi `QX@アP<䞽=I^Vq$dVxϏ\pth`Z`+΂WrJP.5"r*VwÎoЌPgɄB_RW P!߃Hsod:S̔%O~/NvqknņfC^ԅWOh@'F і!g}K.u\;τz=Cerԑ kdc]HVOZCxЈƀb@yqanj'cA\/UmdN˄!YiN›`A$̊w֔7p刦ib[ևTN4C9ٓK/}bvnjZosh7Ya-[?T9vqMńOӢ[_|Ηulndg΋ `É=Z>·SMUc⊟9{xؓt=&wm!f^n_TYX\RULt3_њezOsl ueR[^X!Q݃+LRu֌XvÅw~xxyq{jU |c;8~ \?lU?|N,i yzJϣLz}؟/{w%|DpE.}/iR~6bd[؋ЀU 7N_}}ȃ뢀~|f~\vLS~oqBhb 耸[v;TׇNXɐժdj`dӏZ^;X׈1RʅR?LdTƄԒ}3w pyڍ/j{c1]׋`X,R!݅L|uȨ(V| u⚽oXhlbގ͋p\͋/WQRg LI |y{t䚀Nn_AgM5au[ϊV#HgPdK򄓉v!w}ͩ5xUwy:qʟz,kD{`eЖ|_[~4YS{MꅇV-zYHz}V{ v{q|[km}>e8~?_ oY/RSV"2MU}nn}|iw}v?~3p^~jbd9^X㌵S2M#{u|oDiρdt]^4N1zAns䠆nЅ9h2ab]MW֋,R)3MzRVyIy4=sJm+E^g_Նa咆\njpW@vQMeP~ThxcSq Mrt!Uu|vܐ8Qx5 yzzm1|kG`}Ӆ3SXF+prs4uנvuZwё?y5yzl|_ }g$Ri~ڃjpRq̥ksX;t!vwsNxؑwz8j{o^!} Q~upIq+s1AtNuߝvw4xqvy(i{H]|P~pýq̵sTteuۡЍwxi_tSy`h zs[|XP#}ʄ pr+jswæAttuצw 7xC-ryzxfzZ|rO}4%|4r~|t|uֲb}\wg:}y~Bzb~| ||}rn1~`܀ES@zy{Yzн{{|h||}Sc}~2~6~{~m`mnGSv=Xyb)z:s&z灈{%|! |ӁÈ}z~\m.+`ASjׂkhxyDy8JzRPz{_ |!o|y}̄Fl}~_2S`xvw(exW}y-)yɞzg5{w|Xx}@k~9A_J*SV wvԗrdw7wx詨y[Νzvz􌳄{ڊwk|Ɉj}Ɔ^~R9ΔvEmw3gx+x󕳛yݎz/V{uu|ai}YX]~KQBśvܿlv vwОEx6yZz1{Nt| h|\}ㆹP~׃ʉvyvШ~wxaXyAy!z͓ s&{gv|<[}PA~xȆv4nvŮnwqxfnPydyΚ};zqn{o6e|KZ}1HO~"Ɛvw*wѮxj5yoly{znzo{50d|Y|O }؄*kzq Xs5uZ|v?xz$=+{yKU}=lC~_k̀NSΜ0xK/y2.zހ2{8|WW}~~xXfk X^UCR<"%w<]AV<qŐ Ewp2j؀^1RD~侱~1^~aզ~^~莢~Evyj* e^/vRҀ}!μ}[}X}̊4$~E~N~ui]ԀR "|v|}ǣ }@U}{"}ˋj~)tK~ h!Y]R(!FP{v|EЭ||ۓm}}e~s}Ìar~3g~\*,QC{K{<#|%|EJ|R|'} |}cq}Ќf{~I4[L~kPr7a{A{I|ӝx|G|uw|M{[}p7}{eO}튋ZZ~_)O~҃׿m{կH{קH|~|>|Z|y|ٔCn}3 c}Y7~O~x|q|%|'B|6B|BÂ|mx |m%|b}OX;}N~)!ΆqTs5stv6Xx9yт{xu4}i~^ WRxxywxz({|=2} ~ui8e1]6@R[Wy~~΃Qs-NP΂Ct/)h䁦]- Rf5$ɫv҂f)ɂ݉Ӄ~ks?>gg\ɁWRKOʂ}Xi?P_ʈK-}}rVLg@|\mR3ekt"5׋.|q$xRfVz[QS/ZԁNÚ̀oc>QzEoӀ EeLGZ̀^PA]ѣ瀮ۘ_!*uېsyn-dRYOiI,r!zؗ*"]rǖ܁w`:mFHc2'הg1:znmrPi`s\XZP=<՛בpNM+eς-ryÄ(qXhʆ`fX pP$4o'Tފ%ȎS"ֈyĊxU4p*g̅c_{WkOq֐i>Ode Oxvmn2f^VNف5-&KRˍ{<} uNm>e]ꃍU^N'ܞ-ȏߗ֍T|ы|tgxl{#Q{€|ny1}r}k$~c^\U NT\~ˍu.+@ x+q"3KjUic=^\K UJNT; o}`w-Sp<|ib![އU>TN]O˛!ǃڗՆ?|ʔŅvLo(h%aʉL[8 TN-א֋}W{Ftϑ6nb ga`Zw Sل?vM󏖝xψZ8sizgҋs}lGf0`YÆ$S8DŽL~ S2;2ry8ur\kፃaeĉ_-LXRTtLb%8Ǚ~ؖSw0qA j(d\]]W7QKꀭ9W}!v’p%ǑiُcZ(][V͈xQzKKWKir‡#t ȠEuX{Jvuxn{yh5 {Wa}ZN~TTNvCwbxzoyt6'zmŔ{gM}`~yZTN |EGzd2m{{y|Psd[|m}f搘~`wTZ+S2Nxɥw~5E~~x $r{l=,f4ހ_ꌬ0YˉSMפU~!w]qʁkvme)F_b YpSLMR҉Ԥ݃M>~}W!vp&ij̄+d^vX{S MكޣH{ш;u5oiE+c]݊X7RlVLR 7AgzXMt1n"hɈb捋,]uSWzQۄL^Մ$N)yRsSm^gZb\M{VۇUQ;&=Kg8{?xŚir~l[f`G[LUㆋPzKqKyN}ewšgSqk e`QZo+U "OԃNK[Rstz.*ut~w4ox{iaycᔦ{^ }OXX&R"M`F5w4~wy|Ʀ4wC+q:lDWNfԕia\JWyt뉀o idk_g?ZZBUą!PcK߂&8?Iy`~sʟw2n/Fhߗc2^iYɆTKP KjK~V7xprӟm8eg閱bÊe] XSTцOTzfKU[}uw7qlcgTaܒc\􎔊QW툱SAg'NJiځsn)u#pvUsw|uoxvyx̊{6z|||Bn~}`}S]+ؘr`vTsw=uy;vnzWw{xy$|Vz}{|~n }`}SO֜p~kmrg~ؼksOJumRv2xeV.yz{qmU}P`~SB/ԏo rq6rPt{꠭vw$yByzۃcl|_~"S6ς0҅n`ŀp q\s6uC MvxxzIk|_P}S+w{nmuFloNPqsϖuۀwOtyyhzʼn\\|yVP~9KFl?TRn{p qɞYsbuDdwms1xgzk[|.P/}݃;lar=n5zZpaqˣLs}u%}x}vz yBzz{|k|}Fx}~ak~_ 퀒RÁ}v'}/w"}x%~:y~ztYuɗW vMzx4`}'y}sqzċf|[Z}UPM~Sqŧs tZѝu>vZw딽{y/#pgzpe|{5Zl|O~:qծIxsȧt\/u|ːHvawĘyxnz,d{cYP|N}ヹrs0ʥt` urjvMGwZxGxʖtm]yb{X[|PVNy}0~n)~Op7H~r`~tV-~v[bIx=z(v{/{j:}^IR[ہ\|u}vh}_wҤ }y~z` ~{|u~ i3c]πR=qĄ{`{{||R}Z~.O~[w:ڭwvxyI'yO}zx{bm|,cq|Y}ʆO~wC7w/xy3 Iy͚$zuEvk{'ol{䎧b |X }pDNv~8wkw֟$xJy|y*zLWtzj{|`|]#W} M}߿#*mfor$]tz'v x~ysT{g}\&QAhtbuɨRwAdxIy7E{5}N|rie}gHH\EQ؁󻤀zȱ{|X y} t}~r|y0qf[؁9}Qu;,GHio#́{Qp9e򀂂/[r˂WQy ~~O~~υ~zWz.Yo eR [f%Q[Â.}ˍʫ}{~!~3h~TH~3x~ч n)dpZaPǀPi}.}b9}mV}M}4~NwX~^mN~cp^YsO΃/w|ؚ,}ϝ}*h}P}t}fu} l%~Ib~XO2Ub|?F|ŝG)|E}N}&Q~2}\lt}j}싽ao~EW~;N~郏|{e؃\}[qQs̴sЪ[u<v+!xtyptzy|Bo[3}e'/ZQF8ԅyƩ Oz{z=|B}CR}x~ndMZ uQׂX(dXڀ:+fu񀴀wyICmcف́Z*DP{q셤zPRL2Zvalxc=TAYˁ:Pс&ӭ5͊aՇ~KSuAkkbdׄYP> JJCҘځTZ!q|̀ۊ sj{yEan[XCAOo(;#@ޕ 8xˁ{jkrv0id`)WzʅGNi_Ş؁--6ǔ\\yq(ҍKh8_ZV_N :b?ǁ{t(xmҒofR^=&U~My~փW73|ˀwrnhEe5]"~ՊT~!L~~׭&^m֤+oЛDqܒsɉuʇwvym{c}YPǃ ;sitؙԉvTw͇y~zu| l2}b%"Y\P=+x yԘ\zďT{|}~}htA~^kfn^bBqY!wPq?}z.~q,~ϖӈ$202:|JbQsjׁ7aXz:PJ₺UWǕXT~g|zW{7riEaXeP&7aS ʇbnyƄqY`rh`C%=WO$ $5]_N.cxap䇲g@_ZzVcNҀQ凨'pŐ܎Cw)npf̈C^1V.N {9fr|r5uo~vuÂʎ?m e}e]LJU`0M}~PņURO4̈́Vq|XtJlLFd1 \TeToʆBL3ćO֔*EՅ0Pc+{5"sBkpWc[GSqLy~ۃޤ6moۏ"rusMuzʊ_wrlyiw{a}XKO݃.ɑs&t(v'5wxyzhq4{h}`u#WBOoYx9y94@zA{,C|x}p~h3@2_]ẂO揘}N}ӏ̌f~]~zIw%oۀUgn_TvW0[;OvNsĂ^L3krz[(y~wvn~n1f^̓V߂OXiʌ쉉},uFׅ(meP^ yVCxNց~Kw{\Mxnwt {ćsYlj#d]3U@NsӍ^ŋ%zv(rBkOc\h-T΁|MsxC˖FDAf;y"Ɏqj)Ib)[7T rL߀#̆zv. wp 0Ch݃aĊZ]=S,L\ؕ ,O@}ۇ˗ZveEznꑠg`qlY`J)RjCwKM8n]p:}r!Vs}1uu+wng0yfF{^c}VO`st^uՐqwZ|^xthz@m~{eЈ}q^,#V_N~wCx&yz{}{t|lÉ}e& ]HJV N˃ٗd|]|}~zb~s @kdti]$nU2ri~x;t2wvqwjWycF{\Q~U"~EN;S<s0t:u}{VwLvxp3@z3i{bx}r[Ԉ*/TՅN%ʐ"wg|x_'yZ|y~zZv {]o`|zh"}b~[^BT|Nu{\|6:|{k}ru~n~h iat4kZQTGAM8ڙχ?& oFzgဈt Xm gb|`܈Z~TTM살i#xƃy6;r|l]hfp[`WY݆[SoM};v!͕䇞~r:wqʎ+k{؅ei%_-Y#ZRރLہ#]kl}A}vӐ3pjq]dv$^Z Xu KRCLG:ψޗN #| SuɌsoB"i`cy]vZW.QKƀ̃里pz%tYugnG药h-bXHW\f&VP؂4|KTk?;uy”Ts8,-m0g#6a_[|U҃P/υJoq]}^rw.trvflx?fz+_ԍ|/Y2~IStfxMst}gv,wDwqK+xkH.zUet@{_Pd}YMNS4܁Mv<􇸡"wLȝxJ|(yIv4hzGpY{Fji|hd܎}^ҋ~XJRYMg΃*Ƞ:{֜{{2|muM}o}iՐ~d4^^LIXpCRނLMYg\ɟl~ߜ%0zDtmnْ7iހc]ʊtX/0RlMM~ћqy3)sdmےh.8bz]߂W]!RbL炏Ğ S}Ț҆xrN`l̑g0aҋn\NW7VՄ QdLO ̂-|Nxw qM kӐOfF*`s[مlVdWPdKŁ灉{ߌvpFjѐeR`ZƈbU߅P`tKL#gÑzz5tזAo .Wi"d>I{_YχTDžhO?J„WQyq@{sԕn"ۏhɎ cOF^0(XS4OJn%p{r-vsq\Qu.l_vgxa{zn\|jW;~}QDL݅t zuIuvpp^wkxf~+zwas|\L}VlQ?LԄewsz)xWu;$y9pzz2k{-e]|U`}[~V[SQ,L˄N~zy`{ctpB|oH|ja}ieM~A`m1([I(VJā6QUWLÃ~}Ϥ~x5~nsl~n3i1dƀ&_xZ݌J_V7 Q-5LU|=twwrǜmhڕ|c_,ӂDZBUPƅUL]܃|+vݟՄqڜYl˜r#gc ^_BYTP?'KςW{<*u?pz kᆂgTb?]!XTrO„AKNރz\}upkbf;Ԉaiy<\ٍ?X9SчCO95J݁ryyt&Wo|j Ie>a`t[ƇWYRNDžJy$x/sDn@8i.dd _[%\RG@NgZJ%4q-jdrm %soucrbvtkxKvFyxyR{zlL}K|_8~RfπoarF‘pskruê t?wJuxؑgw|zKy-{xVz}k|~z^~RUbmyozʴqk{as(|Tt}Uv~x~wfzV{j|9,^\~RE]lCpn:pCr!tɎuӂwҁvhyj${]}R7j꼿mBo/q(+s'?@u|w!ury#6i{{7w]};R)DƻiӐ>lծn_bpmRr~t<vt/xhz\|˃Q~ۂRhwkSDmÓo_qʉt~Nv(rx9gwzQ\|[P~l hj՛m:o^ꓐq sK|uqwՊfvy3[+{P ~hCjlTvjkvl8wo|xqҚyt9Gzvk|xvV}Czj~|]~Q=YtQqutsbvu3wv̘xxmz y`{S{}ub||i\~~i]`lQȀҁ+irxҸtyЭumzۢYv{× w|yB}Dz~aty|1h}\~QlqqXr΀2tQuuw @xxyNs{twg}\~Q zp;q8sHtv4-w}yG8rz߃gX|+\6~Qxo@pnjŨCr*tvKuSEw2|mxq]z^fo|[}PIinHƱNpߦEq;s"ouVvzxKp yeg{}i{m oCprzyt utwPjx`z0W {ćM}azjW{SlǪa{oU~|[q|t}v;~~>xyse zg|\v~Q_y5q!-yrߨzt{CvTX{ww|y}}{3ry~g|g8]~W\KQ@=U wwڱjxx yqz bz:{{|7{|||}q}~f~[րQ#ف+vo~we~JxaSyDnz({d{v|!p}1e~Qg[6gQ{FuG/vR飙we+x^]yWz`zP{xo|1e@}ւZ~P$9StVuyʡvۗ`wFx yɇ"xz8n|Ld`}[ZZ,~lPdys(tɐvw%fx5݁ayPZwtzvmW{Scb|YT~IO8òvstOTuvwxߍvz jl-{;Mbv|v1X}N~Ńr̞˦Is>u5vPL=wix~Uxtyjzߋ8aj|W}[qqs,4v{yx]pfzé7|[(~P +~p~Wrn~tI~u w`yEyzo-|e~HZ$P||v}xI}vyN_}z]~'{p~|{x }n~ds!ZMP@ɱ{}9${}|p~J|~ċ=}MAm}w~[3m~c1Y@Pz%zoomz[{}JK{.|~,}v}l~cc2#YڂtP[TFyz$2z7{N={ۆ~|yu`}#kk}݄bZ~XbIOҀx͏y|Rez.zƋ{Ys}.{.s|j}dah~*`X~O ԪxXy—yAzHz{{:r|8]i|`}WN~oNZxzS3xz0o{2f|D2^F|6U}HM3~Tpwxwny ՉVy8\z$w^zn{Xze{]1|[T}VL~˄zjYlo*Fpqo# suw?xEmxzcy|Ym PskU)pDr !sقgu˂5wJnxv7zl|rc~:Y|PG|v!dwWxmny~Rz~HI|u}v#>}~}vj}ύn3~e~A]~jUY~ɅVMAI<} Ȗ}**}I}Z}J}h;t}l}d}D\~,Tn~hL~tr}%}}#Ԅ},{}2ss}MCk}pct}[~}ډS~LF~JY`j݈lוo:qvCs{usdxDjmUza|XF-O͂ԁ̈pc^qϔJsĆuWx[wzބxrm6zi|^`6~9XʀOkϣ:uuCv؅xny6@}zkyʃ{q|h܃~.`RWUOxz\9{Y|d*}}x6~p@hz_*WU恗OQTƀJ؄HɀćPׁ.wxbo%gF_,VQO.Tl9^R/~Q/v?ل7nbfNW^h+XV_N܂ɜփF㔣W|ၧtTm0 'eEօ]]U~MSŐ(b>CJ{)s؉lWdO^ \2TzMKԃ/udOsԁ1z1ĎrpsKj,|cH[ƆT(Lc[0eÁ˘$d?x~Jq %i֌bVZdSH1L7~e-5~ွwg@MohaGY R~؆?K~Zj͖*mouڊq@^swH>vos&x^gGz_7}V*XNG%o͋qksuD~{vv@qxnnzfx|^^~EV"N˂ۂ tjv>wix|zuD{`m|eل~^V23NtHyzɊ{"|x{Ά}Ct8~l҅~e;]xU܂N$~琝Pezjs4#kVdg}]UXPNm4ڏ7·5ŀDy]TrejރFc+\RvTۃMC%4q xʆpÃi<[b[>TDWMH$" }ą3vJoshÇcaZZŁ{YS݄SL@Pd񃢅|lˍuzpnlgXa`Y dRmL#уwb[!h<o[z_tdmffdo_GkX܀mRyKnˇ3ć7e4 y@rڃJ.kreWT^WA\QdKCtkDxms͏o=qy錉srv1k\xvdGz]d}!UrN#,XoAqsxFu*x݋vqȊ xjވz|c4|^\x~QUANC:ݑBtuׅsw1~]xzwڊypZ{j|b}[CzTɄMڂy?yz4z}_}{vˉ|o}iJ5~bQ[yT|M҂v?Q}x~,(~|B)uƉ)o ̀haT'[9T5&NM܎7Pqkzytm+g炣`؄ĂZ[SMKֆZ\FۆyfsJQl†fqd_B;Y0S$LGN3ZҊq~Qxhrpk%Beut_ɅX肶Rg/Lo⏟dm}?w'qpjdp{N^,XXBQ8K7(h|:uň*oiQTcJ8]舊WΆPʅ?K)փ\L0Ӗ@zE>t͒'nsVh?bL\.VCgPUiJ͍k̖tm+pzrtt5n vcg׋xa:zZ}KSMg+既p cq$syu/svmLxg#z`|mZB~hSVeMQktGbu~ؒ/vxx8r ylzfx)|``S}YІ}S_ׁM<7xtoye}GzYw8{Lqˍ0|@kF}Bel~L_gYaS_M)тr|h}/|l}vc~\p_~jߊe 3^ XzR߃PMs7.ʀ{t3u|goȋi܉ہd#^,zSX^RcqLA .#z2tC]n 0hƉPc&]TWlQƂ탂Lxh~hys"ImgňΆ#b=\zW Q6rKn*}ywюq&lk$1fY:aJG[ZVNzwPKБ |*vlpk2e_`80 ZUbZO灏J5ȀՑzt?u]]o_j#ed[_K̊Yׄ&T&OK,tJYl&5nylpt\rotiZzvcҍx]}{3XG}R^LtZp|~C/r$yfssuqn?+whxc<2z]|Ww~R0L›t>}T1ux4tvrx5m}Rygzby|c]&}WQ䅬1LҁȚw|]?yw@zq֒{lx{gF} b~&\}RW#PQ0L$Ú{{d_|ivS}p%}k䏧~nfL%as\ ܀VʆɁyQzVLă:@tzTuA7omje6`e[`EVDug7pΌ7kSfό aԊ]dX[ŋWkS?jNكJuBpݙloqGgݓscF_*Z ]VrRNZ>J@8t,okpfߒ/b`^79ZUQ}]MăI܃sojfjaN]fɉ1YTU- Q;MCIncfN{pi7qlHssonuqMvt@xvuzry"il|{}]~}P lkm๠n]p]p_r@r2t*t vuw~wyty{}h{}6\~ ~P4aju^lvnx'6qyW s zu{bw%|sy?}h{n~\O}P̀ h|ȵkL}Zm}o~rr~Ht:a~2vlrx5g[z逕[}&Pl gpilɝnރq(Tsi} uqxfzk3[|Pvf8?h[ks nDpoZrĆ{u"pweyZ|MPa~лe4Eh jmmSoo݋r@%zto`wdy|gZ{ڃO~>*d&gmڣ-jTVlג4oV߃qōxt9Zn-v#cyYZ{qN}؂}d;gOi薌lsn|qhw3sߎlvH5bxbX{NX}}Ǵd"nfПKiџ"lO(nǗq0NusknuMax\WznM}, d+f訦iLl.n~9p~t.scXj'u?`gx3Vzt0M]|Drfm:tAiDul?vnwq yBt.~!zvr|*y gU}{[i}P06qmqrot'qޝ'usҒvu·xew}yyq{{`f}@}1[`~~PqEo]tqu;rwqtfx1uzw{:{y;|rpz}e|~Z~vPbtLauvNdkxNnbzSzX|GNf~9riPȥHk(\m~Wo܇q4}s폗tujrwiayWM{XM}ڂԭsi'Rkqƙlm˜}{oș@q|srui wi_yCVZ{$MM}{i,1|keOmfo@qzsxq?un gw]E^yNU{BL}:I.wf xmiQ0yRl<znߏzq{tz|vo}yeK{ZD}P vf\um7SvoSwqxsyuzwky|y_o}A{Ad~}-Z~O ót%sҩuhuEvvȖwxXxy{_zzx{Y|nB|}cc}~YQO݀rzgt{-@u{uv|x}vyL~)wpz~m_|cZ}y?YZ~OȀHnqTr tv6uЁSw%qxv\yl{lb|Y~zO񁺭p?D0q˚sQ9u ӇvrS~dwuyZOkpza|~3Xe~O: oVZqhrEvto,z_z}q{h|B` }W/~ׂN$t^Duivꉌ)w򈮁xxypp{g|-_*}CGVo~Y[Ngmsˑu TvSIwbՀ+xi^wywo=zzf{ ^W|υU}%M`~򂱠s^Ә'tݏuv~xv;ynz&e{D]j|iT}~L~ s#oWteuj`v}wLtxǏly֍8dXz\C| T}!LW~,#:s tB]u}уv{wssxknysc?zW[D{>S]|φ7K}ۃRhf瞴iNlVnq|4t s|'vjbYy'aY{X~>O.7̥"l'`nהq1su{*wrhyi{`})Wg#O ρ}r~t ]~xu~wxyVzq{hҀ}`~~WUNlkm|hxD|y@}dzDj}{3C~|$x~}p~~hs~_VNȁ{:}f{~iX|b~ |I}Aw}o~E}g>~ۀ^|CVNz@z烀{m|O~|0vm}nz}fG~M^;~V mN1E>Syh z({zڄ{x5}{u|mE}$Be>}ʄ]c~xUQ8M~x֎\ytzTO~z{{ss| l&|dH}P\\~-T~LFxby"Ny吤zzz[{5r{~j|=cC|[}^S~=L`~قx>xޗFylz6xz~q({NFi{b|Z}9S}݅SK~x+Awnaxyo yUwzwo{h{1a |>hY|戡R]}K~$V}ig9~iԏτlDŽVo qw܃to߃Ovgy?_J{V̂~hNl nspㆁAr~΂tv͂vnyfȂi{^J}5Vi9BNn4Rar|sfu8;=v}x}]az&}ksS}nlb}Ge}^}ڊ{X ~ QV~LK ~e%gGYj5ElفoRzqsw)tPl3ovdyk]&|UM~MD-lnňdpȆryʅtrSvk`yc{$\}OTlMyqsBPtvyxxqyj{0cB||\~T3M<ՓGRv1wkNx~cz w2{'p|Ci@}fb~[{TS'Mq܂؅>{wׄ|3$[|}6}vZ~Eo~h邌a=C[T MZUUOU_{߃$uMXnDgaZet'S?\L ܃7FztPmQf؁d`)%YRRွLXˍApERy9ŕ?l7/eۀ_QXvnRHDK̀j!~ٌowwEqkd׀q^j8X.{QքRKT/* 0wȑ}1vp?iڀYec ]\Ј)W5PqJGY͗ {9uJϑo]hȀb\suV^BuPFjJ~~h6j׌}m+|A5ouro:t}hwăqy[d|4Sh~Lz^lӇ㌉n܁ap{31rttnXvgy a-{2Z}gSL ȍqYirStz"9v3swmyfg9{`%|Z=~SNgQLՂ `uc[wXVxWyJyr=zlF{ftY}!_~hYS LÂ=KnUzd&_{6~-i| wh|qe}k}~ce._]Y+-RɂLႆm~߂ΈL|݇vp҅xjҀdĄ1^LXROYLQl?z̓G{Rum Go;i@,căw]ŃW߂ QKĀB.KzF\t>tmn{hwb؂\GW:Q( KCu#ڇ|~dž3yۊcs mWgAaむ\ӅV2P.JӀ NhQ}]IwxqlPfVՊ`Ђ[c`UÆ O3JptƔ|vi ;p7kIeTv"_ばuZAT̀bOI؅1J_h9kC|k{mvoprQjPte"wB^!yX熤|kR8 LJ܁mۑo{ngqusptj.{w dxy%^jv{PXv }R;L=isq9ďrze`tqtv o40wipyMc׈7{]|X w~Q1sL0?G~uZ~vyOgwsynLOzWh{c'x|]W)~MWQL$|{yt}zZxB}{Br|%mkx}g݈}b{~\΅WBcQHL9܎}|P#~w~q9*l\ff/a\=VفQɂYKĂ耰ʁ{guڋpik=$:e߆҂[`|[OiVRPFK=E`y…ptg>oSj4dHw_ׅ6ZU}ՃP ̓JŀуC~x8ssn8yi'.cʆ^􄔅ỸrHTЂ`O^ J]jj|ό&wfˌrHqmgb܅U]X߂S셔NހJ{‘vv:hq-k􇥍af:a]FXS>bNRIizl u甄nGpNpk͐rfu0ahw[z$V|Q OK7~ޗmyЕozurqloNsWk 3uAeލ'wH`ً'y^[7{V?V}P΅K/}閵qEx唐rt.rto!]vjQQwe{%d:|*_i}@[#~ZWSP߀ÓK Ӄs{Zod| k|g]u}cg~Z_= [@|WZRPNK_JÂ^2r~nj6fsĀ b^w^iZ~aV`ˁReĂdN>ǂJQYq]miIe!ga‚]Yˉ^UɇFQC3MփN\Iq}p0lʔS hۑd`ڍ3\ۊZYل0U%DŽQe˃MdރI p3vkؓψgߑscď _茬[p X9QT`F*PSLނu5I@ojXg"bT_6[0WۆSՆ(P]LkHiнkbTmeToghq>kʒsnuq} w tqyUw}f{z8[ ~ |OtTii|kk&mnop"rsCut+u|{vcwpxye{&{Z}}OĹgzpܮiralFthnvpw3sHy/zuzp x|.e?z}ZM}~O.exh:yjzKme{ 9o{re|yt}o#ww~dzRY|O=c@fiՖlEnTqxt.nEvڀdyY|?O~ b6e˟h`k^'n"!pׄwFsm,vO c3yY {́O/~}Q)al dgNJ%jpm~pE~usikuԅKbGx%XJ{YN~`cՑSg #vicl匡~otr&juaiakx1WzM}`1..cTʙf]i}>lr|oQ-s6r/iut`qwχVzMX}Sg_u3cqfSeiBd~l0azo jqquh^t_:wyUz=L}_覣]bf$TOi kyn˔pqqg2thi^-w-U ybLv|pbmqyerhtkkunwqyy0to/{wd|zTY~|O,mi`ok֠3qgnfCsptsvuZxxqwnOz`yc|k{Yk~k}O$rlpGmr osqu3swEXuxwwz{myy|cT{}Y}O ajAw#:lnx4nyP.pzYr{it|dvv}^ly ~Jb{Z5X}Oh}pk~N,mk~o#hq~tuv;m_Ão͋Gzr5qtJhw_ypEVk{ƒMa~*=elgTjm8l oYyqȌpWt:glv^y U{aL}yIdНjgz6j1 2l_qowq| nscf"vP]x T{ `Le}]ddO\gVili|nі=v;q8msev\xgMTzL}QtZbupeΛvizwkSxoyqvr{Htl|wb~>zpX}NFҬrYiFAskKun=v_pwr~yu4unzwk|yb}|X8C~Nڀ5po¡rqssju)u!vv}x3xtwyz:j{m{au}"}W~Nunv8pw\rext yZuz|PwU{sny|j z~ `|W~\ Nmi|oK}q5}r~3t~{&v;rmxMiUz,)`P|W;}N>"l,ʜLn2p@rsyu҂yq6wchTy=_{V}}NQVk"䚅mI4oyRqlހsWy!;^{U}Mx~ځajk䘶lSnƌfpƋ)wrvtnvmf=x)]zUJ|L~lAilnD"3pIP}rK}utImvHe,xF]zF4T|.^Lc~ ix"k͘npb|jqt-sl)uQcw[y쇆S{օ#K}̛i~pk(TmŚ=oQ{ qirsjubwZyS {K}hxc Gygfz%i7zl${o{|qs}iti~iw`~zWq}INU Hvi0wkZxn#ypvXzrz{ur|wti"}y`1~|W~>N?>kuoE v;qwas^x{tł!yvyzxEq4{zhb}{_~`}V,N*ـásuVgtvNv'wوwcy xzFxsy{up:{%|g|y}_ }~Vc-N{r${Os{u|v[}Vw}wXy ~oFzl@f{^}YeV~ŀN%cBp* rI"tlu~&vv x]n ýe{M]|ׁU~LMoYqtssPitӅ|vOtwɄlyD6dz˃\|X1T}ςL8 o@p틚rt.{Cuskw?kxņczR\5{ℂT5}[nLn~łVn phHrqsyu@r$v͊rjxYbyU[Z{zS|.K~_ng2pqѓ}samx^t_pvuNi\x@ay#ZL{R|K~ؕXn8ፓoMq~qs&wtov&hBwp`y?Ycz̈(R|IK&}}cl}gf`}ij~+lJ~o7wrotgTw^zV[X}sME{Bi+ {kz|dn ~|p]~}rv~!un~wgfky^g!|U~]Mׁpynڔzdp{r4{tm}|v=u}Bxm~ye~{]}Ud>M7x2t yuՋyw.zxw|d{yt|h{ m}A|Te#~#}]M ~UOMځ?*vzwz*x{y|{8z}Hs{~ l,|~dl}\~:UMruv刖w/xsyy怸rbzk{4c|f\~ TwM"ՕtŅ?u†w-xv}tgw֍mgxfz6_{#aX|DQ}RK~Rr𙼇t'|u`Byvvs*wlCxeyK^zЉW{Q"}KJ~bpcofljہoilrl{@voisr~QU~O~YJ1!o|e|t|v|鐄p}kX}=Je}s`!} Zg}PT~AO1~I~҃Dze&g}܈jwƇmQq/pkÆireu_\xjYb{KRf~$KB k ipRl|ŇnYvÆpq6rjuyTey`szyn4x{h}|b}]d~W^QhK$(H{}t|Fx}rr}m~hg]b \`̀mVρPdKa7d݃e|*3vĂɀq7nk$fria#z[@V.5PrnJ怺m8zׂa&upɃj߁wey1`FZۀeUAOkJvH wyɇtVnY*؆=T:N4I8|N,v{q؀8l]g bsЊE]X`wSc\NGJIv<^N'e|hw쌑k+rPmmYplgֈs!bwu\xW{Q~gK7I4j{팙lYvnnqEpl sguiaنw\$K#V|}4zewqP{?rn|m|h}c~_)ZZc+UOۂ!Jف{UV~WvF~q_lgFc:^J$YVցT6O_kJgz_uǂ}phk/fbb]}XSSN*JxˆHs(oJejz{eՅ.a0!\wWلJOu&ycqyz_mJX{Yh|Hd}1`\e~\#1 WSCNJ]݂tF|pn}l<~WgF~cȇ_yŀ[WVDRqNAekIes{o[-k?Jf򈝁b^^1Z=V^~REMځIr΄5nN0j>H,ea̓]҅YلUQ~MjtIBHq?m2ni$d~`DE\X eTQ oLH@mpl‹:l*h.Gd`̈_\XBTDPm-LvńWHshowj]kWlgݒ0odq_ҍt"[vWXy|S|CNnJLrڗlkUnKmmk68og2$qcds_Iv[P(x]V>zRe};NIJԁr ?nn$0ptj/rDf*t"b͎1u^njDwZiyV|Ru~)N' =JchЎheQ4at^1Z"W, S*P-LLw;\HckqgڎVWdW?`]J.YVd R愓JO-LӃHjfˈ$c|_bD\YRURJKOÄKx,HjGi]k ax\me-ohq)ls^o[xurmx,ucszxX}{NQH~fe/$hhkDjmmwop^rirwtulwxbzHzXz}|NY.dglcFfn}ippl3rnt{qzvvt(xlvzlb:y|LX*|}N`qbPs|me-tܚHhvHjwmx~@pzGtsa{kCvB|ay6}W|! Ng `uzqc{(f{bi|]l}D}o}sr~jvuaxW{ Nm~k^9b6DeQh[kӁg{njrqiiwuW`Zx6;W{GN ~Pا]ߝa4 dg=k]z>nFqmqm)het_wV^zӂMp}G\ŽI`A Uc͋ˊlg"juWxmp?pght^wJSUzhL}%\"@_c4ڈfJi)wm;Qo p~yf[s]vU z Lf}* 0[К[_Ub敱fEH~ivlwmp*e%s`\v6T8yK|܂]H[j_ j2bjej}IiXltlrloގds[vHSyvK|m!^onapfe~rh؇slD~3uotwrkKyua|yW~`{M瀲~$je> lh ;njpm9rpV}trsvuj}y,xa{zWT}}MDnBhlMjn&m%pYo[rcqtv{svosv+xlixzZ`qz|PW}k~M٦]fri4t1ku,nwpxzryrud{Khw|_zv}V|M}=ydyXgz+ej[{l{тSo~|yr }cqt~$h*wD~_]yzVu|M$cÙf^iB-k`nxJqOosg6v^yt U| M~bD 4eKh\!{k*Qm]vpnspf0v2]xUD{L~Kiaq(hdz&Ig"jm$}mJ&up"mrekr'ct[6wˆS7zK}6oK`G~0cQΉ^fb"\iDsyl!qniq؍rbtZNw~RzAPK0|@q5^蜟rbJLseʋu5i@vlozx#oqyrh{{v_}Yy/V5|5MCuoeVphr7jDsmuzpMykw0rpxuhzx&_A|zV8~}v}ex~]{1[UZ}gMhǜDh~UAj~l o;d|qtsm"vaexS\zT|M !'fHiylănr{lp΃Yss" kuudwЂ\7z0KT4|wLz~fhPJkBmzp'r]r'jtZcwW[yS|K~Aerď%h pjm(xooq ritb&v_ZyVR{K}8eDggkjT~~lϏw;oCoqht$(a v=YxPR={PcK }SdߚgsDj }lun(nq`gzsҌf`vBXxQ{J}DuF_gzvCbwBf"xQi\~yelvzon{s ff}'v,^~y\U{|lM!xs4ertsh.Muj_vm}xIpPuyrm{ue|{x7]~zU'}fM )qRkm^rmtBoτuq|w7ttxvmzBx*e{z=\}s|\T~XMHtoqbq>rgrttv!{av/wswy=l3y{zdN{.|K\}|}T~@LInw>5oxGqyWysqz\z;u5{crv|akXx}_cz~P\|i=TK~5Ll|n}yep}r~xxtb~qv;mjLxbyI[Z{倩S}LM]kmołv~qlw|sdpwlexQhMy7kz&myu{pWr|rj}ucT~xJ[0zT'J}Lh"uk6rvmawoWxqxezsq+{-uj|Nxb}uz7[]~|dS~tL{spȋuFrk'vt~wuwIy wWp3zIxiJ{zb||+Z~}SaQLΑtrvFzswhuZx|vyv6xzoCym{h~z}af|.~Zl}!SK~!L}Qq>{r|MOtW|{~u}tw@~5n"x~gzi`{Y}|R~~L!߁p8p Yqρs~/zu Qsvvlxfuy_{ Y|R:}KbȌoQ*q[rmxtU rdu넯kwwLe}x^z~Xp|Q}K$~nY|yR~LgxupGyTqz3syf{ u\s/{w l|xf_}zh_~i|Y2E}Rw'mL $wuex v~y wxEyyr/zzRk{{e||_#}}X~R72KNuzq>v{7}6x |vy|pz}j{!~Bd|$~^`}/X.~;ZQBK@tcu{w8uxUJoykiz}c{%]|cW}Q6~K"{sLNu5"znvut`wnxǃhypbz>\|V}:P~KJMwvwӎvqxAlyfgz b]z≏]m{UX@|oS8}=N}RI?~ b~exhs kmƄenhqbt\w.VTzSPЃ,}rJу i]f|i2wkr.nSlbpgX,szav \4xV{P~>J͂)k{m>vonq8qlisfPuaX;x$[,zjV-"|P^%Jɂ1;぀oz|qMuxsp6ttk-qveځrxl`wz7[2| Ú}P*JŁ΁~9sy]MuRtkavo=sxjOyez` |CZ}Ur  O=kJs}GxCxDyKs5nzTn{TiG|Sd.}M_? ~DZ D;T1O"J} |~|v~]}*q~}l~~nh0c2;^bs/YRTdPO%AJSz}Fu} p}ہKk~}g.~^bJ~]~X/4S|_N͂}IyN|tU|o}7j}wf+}˄Da_~ \~bW~SH `NAeIaw{s|Znc| i|ve}F`\}L[}酴W~F R~_M Ifv{q{&mG|>:h|Ed|҉W_}}'][}~gVi}VQ~PBM?~/H+|ߊGcwuesShn[ki"n~deqt_tyZZ wU,yzO}J1j{ψg+virfrl&mnhՆ#q)cޅs_v_Y\yTЃ{Ojd~J4-zhk9um]qnDolqh-sc9v^+x?YtzTzD|O<7J6xyoLtօqpi#rktgC8vbxX]gz/X |T$~OgJ9&xfsTsĄwtolv=jӃwfxOy,aӂz]V|Xe}SԂ)NJ;Ɂw1wSrsxtnP#yi˂ze{`<|\}WSa#Ny5IZ?v {7qz|m/R|h}d~O` [ʁdWE:yR߁1N)I䂀tȁ0pPl g\gc)_: [ ՁyVRf.MŀyIFxs< o,k 'f+b-^_o+ZIP)V:$Qڀ(MY HrTm}iYMe/a]oEYoτU<Ä{Q+ LHŃq(lڀhۉCd`\q3X^T\PcLlo H~}Fv@dqlfm׌=iiyl`eVo(`߈r \tW܆wSB{NZ~IuGCgq$jEm lho*dq`Ft)\ vWvyjR|"N4"~IKhtLkpml+ogqct _vA[,xzWJzRp}*NvI݁sOo.o&qkDrg$tc?v_6xe[ hzCV|5Rc~-M%IvrKrn4tejbufXwvb(x^tezZ|VF}RW$MЂI/q8svm*wibxehz1a]{a]|Yׄ}Ub~Q̀!M7LImp/}z l#{h\{doY|`}\؄~YjcU Ԁ?QCEM%I25o }k~HgfM~cl_\muXk݀TP{PցɂLˁGvĤm3j ?xflb_ l&[L܂UWVS҂PYVLjނHol҅?h􄣄eY ap^ڄlZoNGV̄!SCSO僸K}yH`:kgdi\`]JZY҆ VCSR O1{K(H+փ^oeLkڑwghtjtdNm"a1o]V.rYu|U-xtQu{yM/a~pIVnhkXQ\ `mc׋z+grQk1fjnЇbrj[u[S.yK}fW[_=c{8xg0Wqj֋xinsarZ%uRvy;K#|Wh^[f_d~c(0w~fߐoj[hn `qYRucQxJ|u]CjGZwl ^:mb oeĀqizx7hn>yBkHqnJjqij{sJmsuJpl/wYsd"yvp\*{yoT~%|OLZ~-igkj&mlpozr&qyrtXskivv4cxx[{E{S}}RLZgom]ioÈ)lbqns}yrq uVqsfw"juxbx;z[=z|S}=~KL[!eshCuNjvkm~wxXoy.pr}zjit{b=w|Zz:~S`|5L[_W_cy"fz2i{s}lw|+wo|oq}htQ~Farw~Z7yR|`)L ~be僢hр|k=unUmnq gs`vxYy8Rb{K~,aedυ +g{0jτPtxmmpkfs/1_uXxĂgQ{zK~E`߇VdgD$yj0>s;m Xlloqer^uX:x`QR{J}ꌏ`|(c"fߍvxaiˌqlk5o~LdrT]u2zWYx Pz˃J^}i:`7R.cbv}fwipplDj)o"cq]t)Vw†:PzQJ}"q[Ȏs3_]^tc ufxw$jq`xmjz*qb{t[}xSbp{LJRoaqAdrg~tmjwumpvwpi]y_sa{,vZ}yS~|KpmgoojqMl}sovtqjovshxv3aWzxZ#|z{R~z}{Kyӑkmw mo`QoqR|Zqs2usunuvgwx`yzY{|R~ ~gK1gis6l.tn~v{.pw`trxmtzg%w{f`)y6|YL{n~Rh}FKÀh`xԆjym[zyo{lsgq|Clt}f9vU}_jx~XzpQ}).KU*g~Qqi~lg~xonJrq"ksre:uD^xXzgQu|K"~߁Q~fhփ}kXw%n'ppnjr҂dOu,]w]Wy(P|=J~re`ih!:|:j݇umdooچ0isrJ~c^t]w VykPs{܂JV~?dgzjotslnuohbhHq݈8bQtI\vVy3O{yJ}OdbgUCygjs>lmYoegFq{ahs'[Evm{UGxON{A%I}su\}v_Twc{uxftyjtmzmgK|*qV`V}stY~xMRy1{KLYsbte v/hzXwqjsxmm#zpf{_s_|vY~3yR4|K8qg/s/jtly>v-nrwq`lUysezv7_;|xX}{2Q;}KԀ Jomqo~sSqxtrqvtk}x.ve=yx^{szX>}|Q~~Kvdn(rz]ps}NrunwsvpuxOjwHydy{(^%z|W|}Q~aVK %lwƁnx{pyurzot{iv|cxR}]pz0~oWR|SQ}4K2kw|mm}jz}o}tgq~]ns~huRbw\y:V{P}iJ5sj ~lقy(o#s-q6mys8gu2aw"[yV({P!|JX~Ł̃iʆ}l#~wnvqplUrft`v[*xUz O|I~biD| kvdmppkr*elt4*_v4@ZCxCJTzMSO |UڀzCP@}AJvAyg{zzjCv.{lp|>o&kn|qe}s`~pvqZ0xU{OՀ~Jrx:lzBy:nuz7po{rj{te4|v`}xZ~zU'b|OO~Jn<~kvqGywrsxtnyvizwd{yF_m|zZ}|mT~~OyJj0}uvuwvwrwxWmy yhzzc{#{^|,|Ys}@~T^~S=O!haJ*u{tWzgvtu{5qw|lqx<|gyY}bzw~B]{~X|S}̀qN~'IzDse~u'tKpUv<k\wzfxPayր] zX!|)BS^}RNO~wIq$xrNstAo(u5jEvփex`yH\@zwWt{R|悩M~I$0iwrrs(muivPmr`lhncq^tYiKwTPzN}I؂g{7~ hv8~xjrq~ll;oFgqbt^BvXy"S{Ń}~PIہy|lqu}nypz}pk~rg~tb;v]xxXzSv|NIށ)x{ps{rvo||utj}ufN}wma~#y]~zX$O|cSd~NI@owyurzvcnZ{owi|xe[|z9`}^{{\I~|W~}Rd9N1|IӁvExyAqyz2m/z{#h{J|dY{|_|}[}d~V~!R~ހ]M7IP_ tw}zpax~ly~gz ck{L_|Z|ҀwVX}R~dpMr/ISsw o2xjy fyb{z^*{*Z|KBU}!\Q}vM~˂Hr]vkmwvaixy-eyUavz#]>zaY5{̄T|P}yL~r!H~DqulvhwKdx؇`y\sziX{\TX|KPV}<_L1~%HI~wd`2rcBnfTj|ine&lao\rWÃovKSNyN<}I=4{vzdOqgm˃iiKSl|e"o7`yr \tW_wRÂzMꂳ}IH€uhGhZqFjlFmh~8o~dU(q_tS[vWy[R|{MȂ2~IQVtIlconokpxgrc(t_E9v[LxVgzR6}MCIZfs0penrksf؀ub2w=^]xZzV8|gQ~&MIIbr ~Nt\m~ui~w!e%xb[y]{3Y|U&}Qv=MFπI2)p}HZmGzՃid{de{탳a|[^e|Z}.W}uSM~XO~9K$H#lzKQhSz܆d{ga{׆:]|?Y|rVh}' R}O(~EKr~փG_qbahmd]iʈ gOeŇpjOamN]ކpkYysUvQ`iz*L}xHpelcgijoeMmaTo]Q6rYqu\U?:xGQ!{@Lփj~.Hă ohkφk(h4mdY;o`r?\̄[tYwT냑yP5|ML~HԂXn(lpjng\pc)r` t\;{vX/xT{P}TLnHAmpjqfhsb܃"uq_ew.[xXpzT8D|Pu~NLHlshu>elva;x,^ yZ{Wy|oS}PPLWHƁw$kwFgx|dyasz]T{Z2=|V΁*~S51OLL `H~gjzf{c|`3}`\~#Y}~V/RqO\8KHRQ*MWJzG3kbh'xee xhHafk-^ZZnZˈMqWWIt*SWw^OͅvzK償}H5ـjfgd%hdS>k`Hm]ȈXpXZNisVuS=xO{KՄ~HLbGi݊iSfkcm`X=pG]=brY؆uVwoRyOjB|Kǃ%Haiyle܈nbp_1r\ktYTvV"yRV{RO:}KHuh7?oeqb.s_/uW\ ~wXӄxUFzRW|O+~vKMH*gHs;d/taRvO^9Kw[QyTX- zU(|VQ}N‚bKy-HdQf`vacHw`ly]az@Z{sWz{|T}QlNgIK0uH"ReU"ybWz_H{\|YσT}VԂ~hSxJP 6N!JEGdSK|ah}^~A[̃"~YV+N#Sg쀺P}WM1J|GcB`c:w]Z}LX?UoRWBOM/JGGK&b4!_pF\JjZ 상WT́1R3ԃOmLX}I-dG_ LcUf Yˍh.^ jb}mf)udojmKrnduq\xuT|eyK}a\c` \f$cNhf|~kj_thnml}qqd=ttP\x\wS{zL~C^VcoaDfVd2i1gKk{bjmnswmqIkpsctXv[wyfS{p|L~g[jR_lpZb[nepz.i+rrqltjpvbsy[?wH{S{}L2~Ykp]rx`tLdHu{ygvqokxmjoGyb\s{QZv|SWz~"LD~`|W{wiD[`xM7_Ay5~czwfzpQj{in|aro}ZIvI~fRz+2K}U}Z}^1~,}db5~}vlf*~o/j%hnu`qYuRhy?K}}T̃Yo ]<*| aZu:ejn$iwag;my`qwYuhQyX;K}3HS~SXD\z`t dՆJmhyfWm_NqXku Qdy(J|߁dSW͍)\qyZ`Jrdtkh{e_l+^mpWthPxJ[|ċS=j8W}~[x(_qdk h;JdlD|]p`VtzP>xJ|SSgV}iiZ:kH^mbbzofr@qjyjtzndbwBr?[z.v/S#}>zK\}~d]g`qidc5kgcedf\Xgi1~jDkwm nproqVi6rt auvZ0yyR|I|:K~ߓ_jbl4en`}hpvkronthorva uGyYx{0R{}EK$N>]pe5`qzd s|rghuujvnmx0gqAy`xt{EVQuOyI|߇WaC[Pz_0tbtnfhbjz>bTn+[qUuWOtyGI|.kWNl[5nf_7}[p;cvbrgo&t7jhvqn`xrY{jv{R:~zVKC~> h]j`؃la{|\e0|Jvhl|pk}zin~cq~]8u3Vx;P{YLJ~Yԇ#]h`Ԁ{d4tgnjՀhnbqO \tVowǁ'P3z4JJ}A\x`ycu!sf݄mj5>gmapу^[t!Uwf{Oz I}["}_9x7cSrFfkilifm`pjZsƄUwO,zII}Gn["|_!vbYq fkiXel3`)pZ;sviTlvӄNzIg}C;nX%op [qx_y3scrtglv~kBezxjo^z{rX|vQ[~zJ~l9^maJ~odxqgqsyk k6un\dwq^3ytW| xVQ%~]{J~ic̃kf}un iVwp/l prTnjutqzd>vt8]y'wWW{{yP}|JLegi4jk|0lvmunp2oq1rkistcvv];xyyVz{ZP}t}JȆeo/hipzjrtmtVopv hrwbu6yk\w{Vzm|P} ~wJ#^d)tWfuyiwslwxSmo'ygqzb4t~{\ w4}V/y~

|fJ)bz}ezx=h{irak|lnV|fq}aVs~B[lv~UyeO|RJK~LaI|yd|vgq4jkmfptS`sDZvU(xOe{0I~Kd`ńQ{cufpijlCeo_r‚Zu~Tx?N{PI}큿I`-9ycZtFfwniiyluadom^rTY?uMq%ptkruf#tw`w)yLZy_{ U\{|O}~JUfhKszju.um+v}oowjqye>t*za_vn{Z\x|T{ ~0Op}RuJQfxytiyt0l$znn{ciq |;dDsr}_u}Yx+~TizO|ՀXI #}e}xh~Ark4~mm~hpKTc\r^Su1YwnSz N|c,I~|dvgqjrlmggoPbpr3:]t%Xbw-SfyN9|IK~>zd[`u_g(phiSkIlflo$Eajq\t5BWvȃRyP:M{I}'y:ctfo@ikj8lern `qH[sΆ1Vvo?RyNMK{oWH}iHuZ|pv]vwaKq#xdkyhezl4`p|=oZ}sUH~wrO^{EJ.)s_-{?tbTuvep9wUhjxkeIzn_{ur9ZX|uT~SxOg|1J)kqd>zsfttioNvl]jwody#q_lztY|@wXT}z9O8d}J$~1oiIxqlkssmn\tpiLv{rUdx/t^yvY{y8TQ}6{O ~}JA|mnBwoprqqmtsshulucawAwh^hy y;Y'z{ T||N~~JP{slos%vJntqlpul]rwUgtxbvoz]xS{yXz@|S|'~/N~Iz*kwumZxp/oyk6qzfs{au|\w}Wy~S&{yN3}iIkTxj |sl`}on}j%p~er~`u!\'wW[y$(R{%M}3I4~w^i0+rwk9mmHip&\drSr_ty[bvVxR4zMu|H~uhq%jAlmQgocwqɄA^sZvUxAMQzfL|lH~HGth ojv!klΈ_fobqP^ s&YuuUNw䄻PzL|&AHz}|yG[wy^r|zb'mC{pehK|3i9c}l^~ pkXtSʀ wN#{IB{wB_vpx7bqy)flkz&i3g{ lIbx|/on]}ArXt~YuS}py3N_|IzhubduUvgIpwjkxlfzoWa{Lr]|tX}wS5~zN9$}^Im8y"siGt/ukovYmjwp(fyrmaFz\t\{wW}yaR~O{N~+I wqmssonuqivseawuz`yqwZ\'zy9WY|W{R}|ME~Ivprqr>tmlsuhuvdwwxo_xy[|z'{XV{|RL}A~s{ gruV{cyv|_x}e[yg~+X z~T|PN}ML=~SHX΂nq~Ajs~fjtbv^wj[ xπQWaz(S{$O|⁓K~5Ht[lp.hruEeKs[auqj]vׂxZ6xCVyR{OQ|K}G$kp?gqޅdRsni`t]$vVY~wȄVy.2R[zN|-K1})G~r]im`jce܀gCaj]>nY~q}UPHd[lxqpi/ysezstb{EvW^|wZ|yWT}{%S~|OQ~^L)HskwuGh#xvdywazly.]{LzmZ |/{V} |S}~3O|~vKH3jvy(gwzcx{ `?y{\z|Ym{}V|x~R}kO&~V|K|EeG)Ciu|fv}bw~_]x~\"y7XzUt{PR |N}vK1~G҂hQudv(awA'^fxSg[CyXWzbT{b Qq|t?N=}pJ~Gg=tO$cu`v]wȃZx҃WHyT1z郟P| wM}+MJ~BGsBl6^i9aeуeb&hG^xk~ZVnWP:r2Sd/uO.yJK>|GփVbkbyhgeZe~h5a}vk^qmZrppVrtS~w+O_zeK}G့kf'g+hdT@kN`ԁ[m]upzYs!VuRӁxO2{wK{4~JHtj"iflcnh`#:p\qrYxuNV!wR+z Ol|Kp~HPi%~5mne~owb~qx_z#sy\ZtupXwpU+ykR>{vN܀}KfLH-h!|qd}^ra}t^~1v3[~wXV yU0}{*Q|N_~K7Հ9HHg-{tc|Yv `|wu]}`xZ}z'W~b{T~|Q]b~-NAJ_GՀ݂)fzx&b{ryC`|zX\|{cZ}1|cV}}gT ~S~eP~oMfxJzG|mey{az|c_&{B}*\${}YS|~VT}0ISx}Px~bM~_Jt Gt'cy`y^"z[8{GwX{U|@R}6O}M~HJ:GL܂bxN__y&]AyZmzW{kT| RN|Os}sL~1I~G* g`dqc+af+^]iG[l^XV_oU*rQvQN4,yJ}HG_f͆vcc͆fQa i ]5k[nWzqTʄ tQdwNzJX}G}-f fcii`akk]`"nrZpWpsTndv7Q#,yM{J~GAeKj;baol_9n\ qYsGVuT wP߂zYMɂi|J\M|Mj]~JvuhGbt_u]Q%wZCxxX _yUF{PR|Oр~)MJ;G'Ta~w=^&xw\}RyYzWZ{T}R~)Ol@PLՀetJGRȂ`~z]]~X{S[~|@Y~}"V}TV~QNvL~IIŀ4G)u_}E}\}~:Z}~X.~(U~zSd~Q~1N~?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~O3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBQQSbUtWYZ[\]ߣ_ݣ`ڢaءbԟdҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgO3PAQQSbUsVXYZ[\ߨ[ۧ\إ^ԢbҠdўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfO3OAPPRaTrVXYZZY۪Yب[ԥ_ңbѡdРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfN2OAPPR`SqUWXYXܬVجWԩ\Ҧ_ѤbУdСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfN2O@POQ_SpTWXWޭUذRԭXҪ\Ѩ`ЦbϥdϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeN2N@OOP^RnU}WWUٴOԱSѮYЫ]ϩ`ΨbΧcΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeM2M?NNO]RlUyVUܳPշMѲTϯYέ]ͫ_ͪaͩc̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨dM1M>MLN[RhTxT߱Q׿FѸOϴUͱZ̯]̮_ˬa˫c˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪dL1L=LKNXRdSzRھGHκP̶V˴Zʲ]ʱ_ɯ`ɮbɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcK0J+"?,Q6_>iDqJvPzS}UVWXYYZZZZZZZZZZZZZZZZZJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P8QGSWUgWwY[]^`dgilߙoۘrؘu֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙wK*O8PGRVTfVvYZ\]_behkܜn؛rԛuқvқvқvқvқvқvқvқvқvқvқvқvқvқvқvK*O8PFRVTfVvXZ[]^adgݢj١mӞrϝuΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvK*O8PFQUSeVuXY[\^adݪh٩iԧlͤqɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuK*N7OFQUSdUtWYZ\_bޱfڰfհgЫiʧkťoŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsL*N7OEQTScUsVXZ]`a۷cֶeѱfͬgʧhťkĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnL*N7OEPSRbTqVY[]]ܹ]ֹ_ѴbαḓfʩgƧiħkħkħkħkħkħkħkħkħkħkħkħkħkħkħkL*N7NDPSQaSpV|YZZݸYּYҸ]δ`̰cʭeɪfȩhƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjM)M6NDORQ`SnVyYYߵXٿTҼXη\̴`ʱbɮdȬfȪgƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiM)M6MCNPP^TkWuWW۾RSϻX̷\ʴ_ɲaȰcǮeǬgĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhL)L5LBMOP\TgVuU޹SLS̼Xɸ\ȶ_dzaƲcưdůfîgîgîgîgîgîgîgîgîgîgîgîgîgîgîgK(K4K@KMPXTbTxREMSɽXǺ\Ʒ^Ŷ`ŴbijdòefffffffffffffffK(J3I>LIQRSeQzDENTƿYļ\ú^ù`÷b¶cdeeeeeeeeeeeeeeeI'H1G;MDPQPhF|IPUY\^_`bbcccccccccccccccE"B*H.K@GW/k6{AJQVY[]_``abbbbbbbbbbbbbbbAB"H,FC*X2j:wCKQVY[]^^_`aaaaaaaaaaaaaaa>DD/$E-W6f>rEzLRVXZ[[\]^_______________>A/2'E1T:aAjGqMvRzT|V~WXYZ[[\\\\\\\\\\\\\\\>5 !2+B5O=YDaIgLkOnQpSrUsVtVuWuXvYvZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwC#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#O0P>RLT[WkYy[]_dhlprtvxߔ{ܔ۔۔۔۔۔۔۔۔۔۔۔۔۔C#O0P=RLT[VjXx[]^bgkpruwޕz۔ؕוווווווווווווC#O0P=QKSZViXwZ\^`ejpsuݖyڕ֗ӗҗҗҗҗҗҗҗҗҗҗҗҗҗD#N/O=QKSYUhWvY[]_diosݛwٙ~ԘљΚΚΚΚΚΚΚΚΚΚΚΚΚΚD#N/OH/[7j>vFNSWZ]^_`abcddddddddddddd=BE!?6)I2Z:gAqHxO~TWY[\]^_`aaaaaaaaaaaaaa=A?$#7-I6W>bDjIpOuSyU{W}X~YZ[\]^_____________==&'70F9Q@ZFbKgMkPnRpTqVrWsXtYuZu[v\v\w\w\w\w\w\w\w\w\w\w\w\w\w; '+54AOKQWTcVnYx]bf߶iֽn̴sĭy=J'L2M>OJQVSbWlZu^|ceglƻpv|=K&L2M=NIPUT`WiZq_wc}޾dfimrx=K&K1LK&K1K;LFPQTZXa[g]t]`cegjlotz>J%J0J:LDPNTVW[XjXwV\bdfhjlot{>I%I/I8LBQJTPV^TmK{SY^bdfhjlpuyyyyyyyyyyyy>H$H-H6L>QDSQRbGpI}QW\`ceghjmrtttttttttttt?G#F+H3M9PAPTGe@sHPV[_adeghjnpppppppppppp@E!E(I.M1NDGW:g?uHPVZ^`cdefhkmmmmmmmmmmmm@CE$I'K4GH3Y:h@uH~PUZ]`acdegijjjjjjjjjjjjBAEH#F7-J5[fDoKvQ{UXZ\]_`abdeeeeeeeeeeee< A A0*)<1K:WAaFiKoQsTwVyX{Z|[~\]^`abbbbbbbbbbbb<> 5",,;5HOHSRV[Yc^icp߽dgmrx7CJ)J2L=OFSPVXY^_cao`ekpu|7CI(J1L;ODSMVTZX_]_n^~chmrx7CI'I0L9OBSIVNZT\aYl]|bfimqw}7DH&H/L7O>SDUJVXSdUp]{adgjmpu{7DF%H-L4O:S=SMO[JhQtY~^cfhjmptzƒ7EE#H*L0O3P@MPA_GkOvV[`dfhkmqv|ŁŁŁŁŁŁŁŁŁŁŁ7ED!H&L*M3LD9S@aFmMxTZ^befhkmqv{{{{{{{{{{{8BDH!K$J68G9V@cFnMxSY]`bdfhkmquuuuuuuuuuu8@DHG'<92I:X@dFnMvS|X\^`bdfhjmppppppppppp9 @DE>*,<4K;XBbGkMrSwW{Z~\^`bcegilllllllllll: @ B >$-.=6K=VD_IfMlRpUtXvZx\z]{_|a}b~dfhhhhhhhhhhh;?='.0<8H?REYJ`MdPhSjUmWnYp[q\r^r_satcudvdvdvdvdvdvdvdvdvdvdv:; *.3:;DALFRHWK[N^Q`SbUcWdXeZf[g\g^h_iajajajajajajajajajajaj7'# .+65==@DCJENHQKSNUPWRXSYUYVZW[Y[Z\~[\|]]|]]|]]|]]|]]|]]|]]|]]|]]|]]|]].'1'7/96=@3"!,/4;;FBOHVL\OaRdUgXjZk]m_naocpeqgr~js|lt|lt|lt|lt|lt|lt|lt|lt|lt|lt5<6$"..79>CDJGPIULYP\S^V`XaZc\d]e_faf~cg|ehzgizgizgizgizgizgizgizgizgizgi56 (!1,95>=ACDHFLJOMRPTRUTVVWXX~ZY|[Z{][z_[xa\wb]wb]wb]wb]wb]wb]wb]wb]wb]wb]1  !+4(70;6>;A@CCGEJGLI}OJ|QKzRLyTMxUMvWNuXNtZOs\Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]P  $*."2)6.:2=6@8|C:zFuL?sN@rO@qQApRAoTBnUBmWClXDlXDlXDlXDlXDlXDlXDlXDlXDlXDc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzue- v5=F(N3T>XH[R^[ebjhplupxr}t~v|w{w{xzxzxzxzx{w|w|w|w|w|w|w|w|w|wg- x4=F(N2T=WHZR][bbiiontrxt}wx}y}z|{|{{{|{|z}yzzzzzzzzzzzzzzzzzzi- z4=F'N2SVHYQ\Z_cgkorޘv{ؒэ̉džÄs+ 3=H"L+O4S=VEYN\W`_ggߤmrמw{ϗɓďt* 3=H!L*O2S;VCYK[Sa[eg٪lrФt|ȝ|™v* 3=H!K(O0R8V@YH\OaWݵcfҲjrɩq|yw* 3=H K'O/R6U=XC\I_W`e͸grðn|v~x* 3>GK&O-R3U9X?\D[U^deql{szy) 3>GK$O+R0U5X8ZCTT\ccpj{pw{) 3>GK"O(R,U0X1VASSZbaogznt|}) 3>GK N$R'T(U0L?QQY`_mexkry~yx}) 3@GKN Q!R(J3L?POW^]kcviov|ˉvɔqǠmƬsx{{{{{{{{{( 3 AGKNOI+A7ICPNV\\hasf{lryzՂtӌoҗjҤhаmǰp°p°p°p°p°p°p°p°p°(2 CGJLH!8.?;FGMRR]Zf`newi}ms~yx؁t֊p֔m֟g֬eԵeԵeԵeԵeԵeԵeԵeԵeԵ'3 C GIG/%72>>DJKUP^Wf]mbsfxj|ns}yy݀v݈sݑoܛkۡkۡkۡkۡkۡkۡkۡkۡkۡ'5B F F7.(65=ADLJUO^VeZj^obsfvjyn{~r}zx~w}usq~q~q~q~q~q~q~q~q~&8BD<%.+77=BDLJTO\TaXf\j_mcpfrit}muzqwwuxuzxrxqxqxqxqxqxqxqxqxqx%<A=& 0,88>BEJJRMWR\V`Yc\f_hbiek}hlzknwoourprwpq{qq{qq{qq{qq{qq{qq{qq{qq{q&<< )!2-97@?EGHMKROUSXV[Y]\__`}aa{dcyfdvietlfrofprgprgprgprgprgprgprgprgprg$9# !+!4+<4?;BAEFIJLMPPSRUS}XU{ZVy]Ww_XuaYtdZrf[pi[nk\nk\nk\nk\nk\nk\nk\nk\nk\,  %.4(8/;5?:B>FAID~LF{OGyRIwTJvVKtXLrZMq\Mo^Nn`OlcPkePkePkePkePkePkePkePkePkeP %*/#4)8.;2?5|B8yF:wI;uKpQ?nS@mUAlWAjYBi[Ch]Cg_Dg_Dg_Dg_Dg_Dg_Dg_Dg_Dg_D  $).!3%|7)w:+t>-qA/oD0mF1lH2jJ3iL3hN4gP5fQ5eS6cU6bW7aY7aY7aY7aY7aY7aY7aY7aY7aY7X+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndX+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndX+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndZ+i0w7? F*M4R=WF]NdT~kY{q]xw`u}bscqeoeofogogngngnfofoeoeoeoeoeoeoeoeoe\*l/z7? F)M3R=WF[NcTjZ}p^zwaw}dufsgqhqipipipioiphphpgnhnhnhnhnhnhnhnh])n/|6>F)M2RF(M2R;WEZM`Uh[n`ud}{gzixkulsmrmqnqmqmrlpmlnkokokokokokokokoa(r. 6>F'M1S:WD[L^Tf[mateyi}kzmwnuorprpqoropomplrlrlrlrlrlrlrlrlrc't- 6>F&N/T9WBZK^Td[lasfxjm}oyqvrsrqrrqpqnsntoupvpvpvpvpvpvpvpve'v- 5>G%O.S7WAZJ]RbZkarfwkoqzsvtruovnvqurwsxsytytytytytytytytyf&x- 5>H$P-S6V?YH\P`Yj`qfvlptyvuxtyszszuzv{w{x|x|x|x|x|x|x|x|x|h%z, 5>I#O+S4VJ"O)R2V:YB\K^Sg[oeْxmҌs̈xDŽ|~~}~k$}, 5?K O(R/U7X?[G^OeZٟmeИvnʓ~tĎz~l$+ 5@KO&R-U4X<[C^LܫcZҥkeʞsn˜{u{m$+ 4AKN$R+U1X8Z>߳\Kճ`Y̫heäpnxu{n#+ 4AKN"R(U.W3Y:ڿWJϹ^XƱfdmnuv}|p#+ 4BKN Q%T*W-W9SI\Wdckmruz|q"* 5CKNQ"T%V'P7QHZVbcimouw|s"* 5EJNQSS#G6OFXU`aflmtt{|~z|u!* 6 FJMPRK!G4NEVS]`djksqzyzuqrvz||||||||w!)7 FJMOKA#H2MBTQ[]bhhpowv}~xÈrmihlqrrrrrrrrz )9 F JL J5?&H1M?SNZZ`efmmt}tzv|~o҆jБeΞa̫^ʺbļghhhhhhhh~):F I I ;4=*E5L@RKYV_`dhjozqtsxyl|gb]ߦX޵X\^^^^^^^^*=EG? *4"<.C9ICOMWU]]bcgi~lmxrqryulwhydyay]yW{V{V{V{V{V{V{V{V{+@DA*3%;1B;HEMMTTYZ^`cdghzlkurmpxolpiqfqcp`q^r^r^r^r^r^r^r^r,@@%!+4(;2BGCLGPJ~TL{WOxZPu^RraTpdUmhVkkWioXfsYcyZb{Zb{Zb{Zb{Zb{Zb{Zb{Zb{Z  '04&8-<3@8D<H?{LAxPCvSEsVGqYHo\Im_JkbKieLghMekNboOaqOaqOaqOaqOaqOaqOaqOaqO  %+0"5(9,=0|A4xE6uI8rL:pO;nQhY?g\@e_AcaBbdC`hC_iD_iD_iD_iD_iD_iD_iD_iDӾ %+0!}4%w8(s<*p@,nD.kG/iJ1hL2fN2eQ3cS4bV5`X5_[6]]7[`7[a8[a8[a8[a8[a8[a8[a8[a8 %y*s/n3j7!g;"e>$cA%bC&`E&_H']J(\L([O)YQ*XS*WV+UX+UY,UY,UY,UY,UY,UY,UY,UY,R,Z, h2r:xA!{H*zN3wV:u^@rfFomJktMi|OfQdRbS`S_T_T_T_T_T_T`S`S`R`R`R`R`R`R`R`RR,Z, h2r:xA!{H*zN3wV:u^@rfFomJktMi|OfQdRbS`S_T_T_T_T_T_T`S`S`R`R`R`R`R`R`R`RS+[+ j2t:zA!}H*|N2yT:v]AseFplJmtNj{PgReScTaT`U`U`U`U`U`UaTaTaSaSaSaSaSaSaSaSU+^+ l1v9}@!G*M2|S:y[AvdGskKosOlzQjShUfVdVbWaWaWaWbWbWbVbVbUbVbVbVbVbVbVbVW*`* o1y8@ F)M2R:|ZAybGvjLrqPoySmUjWiXfXdYcYcYcYcYcYdXdWbYbYbYbYbYbYbYbYX)c)q0|8? F)L1R:XA}`HyhMvpQrwToWmXkZi[f[d[d\d[d[eZfYd[a\a\a\a\a\a\a\a\Z(e(t07>F(M0R9WA_H}gMynRvvVs}XpZn\k]i]f^e^e^f]g\d]c_b`b`b`b`b`b`b`b`]'h(w/7>F'M/R8W@\GeN}mSytWv|Zs\q^n_k`i`f`g`g_f_eadcedededededededed_'j'y.6?G%N.S6W?[FcMkS}sXz{[w^s`pbmbjcibgbgbfdgehfigigigigigigigiga&m&|.6?H$O,T5X=[EaLjSrX~z\z`ubqdnfkgighhigkhkiljmkmkmkmkmkmkmkmkb%o&- 6@I"P*U2Y;\C_KiRrXz]|bweshqjoknlmlnlolpmqnqnqnqnqnqnqnqnqnd$q%- 7AJ!R(U0X8[@^HgPpXۆy_Հd|hykwmuotpsprptpuquqvqvqvqvqvqvqvqvqf$s$, 7BKR&U-X5[=^EeOْnXҌw`̇fǃjn}p{rysxtxtytytztzszszszszszszszsg#u$, 7CMQ#U*W1Z9]BڟcNјkXʒt`č|gloruv~w}w~w~v~v~u~u~u~u~u~u~u~ui#w#, 8DNQ!T'W-Y4ݪZAӥ`N˞iXØqaygmqtwyzzyyxwwwwwwwwj"x#, 8ENQT#V)X1زT@ͪ]MŤfXnavh~mrvx{||{{zxxxxxxxxk!z", 9FNQSU$ݴS0ҸR?Ȱ[LdWl`sh{nrwz|}~}|{zzzzzzzzm!|"- : GMPRTG.̿P>¶YKbVi`qgxnsw{}~|{{{{{{{{o ~!-: IMPQ޹OD-NIKJ5 ;A'I6QDYP`Zgbniuo{~ttxo{j}f~c~d}h}l|l{l{l{l{l{l{l{x/@HH>/;C$H3PAWM^We_lfysls{pmɅtgǐwbŜz^é{[{Zz^zbybybybybybybyby|/BFB" /9B%J0O=VI\RcZ{jasqglykf܃o`ڎr[כtWԨuSҸuQuTuXvXvXvXvXvXvXvXv0CB"$ /8A)H3N}PBxUEtZHp^KmcMigOflQbrR^yTZTWUSUPUPUPUPUPUPUPUPU! */4#9)>/B4}G8xL;tQ>pU@mYBj]DhaFeeGbjI^oJ[tKX{LTLQMQMQMQMQMQMQMQM պ %+0 5%:*z?.vD1rH4oL6lP8iT9gX;d[]g?Zk@WoATtBQ{CQ{CQ{CQ{CQ{CQ{CQ{CQ{Cش &,~1 w6#r;'n?)kD+hG-fK.dN/bR1`U2^X3\\4Z_5Wc5Ug6Sk7Po8Oo8Oo8Oo8Oo8Oo8Oo8Oo8ϼ !z't,n1i5f: d>"aA#_D$]H%\K&ZM'XQ(VT)TW)RZ*Q^+Oa,Me,Le,Le,Le,Le,Le,Le,Le, |u o i&e+`/]3[7Y:W=U@TCREQHOKMNLQJTIW G[!G[!G[!G[!G[!G[!G[!G[!K,R,Y. d6j=lD!kL(jV/h^4eg8ao;^x>\@YAVBTCQCPCNCNDODPCPCQCQBRBSASASASASASASAL,S,[. e5k=mD!lK(kU/i^4ff9co<`w?]@ZBXCUCSDQDODOEPDQDQDRDRCSBTBTBTBTBTBTBTBN+V+]- h4n<pC!oJ(nS/l\5ie9fm=cu@`}B]CZDXEUFSFRFQFRFRFSFSETEVDVDVDVDVDVDVDVDO*X*`, k4q;sB!sI(qQ/o[5lc:ik>etAc|C`E]FZGXGVHTHSHSHTHTGVGWFXFTGTGTGTGTGTGTGQ)Z)c+ m3t:wA wH(tO/rY5ob;lj?hrBezEcF`H]I[IYJWJUJUJUIWIXHYGVIUJUJUJUJUJUJUJT(\(f* q2x9{A |H'zO/vW5s`;oh@lpCixFfHcJ`K^K[LYLXLVLXKZKYJWKVMVNVNVNVNVNVNVNV'_'i) t1|9@G&N.zT5w^;sf@pnElwHiJfLcMaN^N]N[NZNZMZLYNXPXQXRXRXRXRXRXRXRX'b&l( x09@G%M-S4{[;xdAtmEpuIl~LiNfOdPbQ`Q_Q]P]O[PZR[T\U]V]V]V]V]V]V]V[&d%p'|09@G$M+S3X:}b@xkFttJp}MmPjQgReScTaT_T^T^U_W`XaYbZbZbZbZbZbZbZ]%g$s&/9AG"M)R1W9_?}iExsJt|NpQlTjVgXeYdYcZcZdZe[f\f]g]g]g]g]g]g]g]_$i#v%/ 9AH N'S/W6]>gD~qJx{PtTqWnZm\k]j^i_h_i^j_k`k`l`l`l`l`l`l`l`a#l"x$/ 9BIO$S,W3\;eCڄnK~xRzVwZu]s_qaobncncncococpcpcpcpcpcpcpcpcb"n!{$0 :BJP!U(X/Z8ّbCъkL˅tSƁ}X}\{`ybwduftgsgsftftftftftftftftftftfd"p }$0 :CLSV$X+۞X8җ`CʑiLČqSyY^b~e}g{iyjxjxjxixixhxhxhxhxhxhxhxhf!r$0 : DNSU ߥU)դT7̝]BėfLnTvZ_cfikl~m}m}l}k}j}j}j}j}j}j}j}jg s$0; EPRSڭL(ϩQ6Ƣ[AdKlTtZ|`dhkmnoonmlkkkkkkki u$0; G OQPԶD'ʮO4YAbKiSqZy`eilnpqqponmmmmmmmjw$0< I N O۵GϻC%ŴM3W?_JgSoZv`~eimpqrrqponnnnnnnly$0=K M L 4A$K2U>]IeRlZt`|ejmpr{sxsxrzq}p~o~o~o~o~o~o~on|#0>KK޸D2?"I0R=[HcQjYq_yeim|pwrstptosrrupwowowowowowowop~#0>IG$0< G.P;YF`OgWo^vchyltporkshsfsjqmpoooooooooooooos#0?Gߺ;%/:E+N8VC^MeUl\~taw|frjlnhpcq`r^qapdofofofofofofofov"/?A&3 :C(L5T@\JcQ}jXvr^pzcjgej`l\nXnVnWm[m]m]m]m]m]m]m]mz -;޿+'4>D%K1SHG?C?@@=@=@=@=@=@=@=@ѷ"(.w3p8!k>$gC'dH)aM+^Q,\V.YZ/V_1Sd2Pj3Kp4Hw5D~6A6>7>7>7>7>7>7>7Ӳɾ  {"t(n.h3d9a=^B![F"YJ#WN%TR&RV'O[(M`)Je*Fk*Cp+@v,>{,>{,>{,>{,>{,>{,>{,˺~ wp j"d(`-\2Y7W;T?RBPFNJLMJQHVEZC_ @d =i!;m!;m!;m!;m!;m!;m!;m!ÿzpj d_Z V& R* P/N2L6J9H<F@ECCGAK?O>S;W9\7_7_7_7_7_7_7_E-L,P-U2 [:]B^K]U$[_(Yh,Vq/Rz0O2L3I4G4E4D5B5@5?5?4@4A4C3D3F2F2F2F2F2F2F2G,N+R,W1 ^8`@`J`T$^])\f-Yo0Ux2R3O4L5J5H6F6D6C6A6A6B5D5E4G4G3G3G3G3G3G3G3H+O*U+Z0 a7c?cHcR%a\)^e-[n0Xv3U4Q5O6L7J7I7G8E8D7C7D7F6H6I5F5F6F6F6F6F6F6J*R)W*]/ d6g>fGfP%dZ*ac.^l1[u4X~6T7R8O8M9K9J9H9G9F9G8I8J7H7G8G9G9G9G9G9G9M)T(Z)a- h5k=kEiN%hX*ea/bj2_s5[|7X9U:S:Q;O;M;L;J;J:K:J9J9I:HJ@J@J@J@J@J@J@R'Z&a&i* q4u<vCtJ$pS*n\0jf4gn8cw:`<]>Z?X?V@U@T?T?R>Q=N?MANCODODODODODODODT%]$e%n* v3z;{BzI#vP)rZ/oc4kl9gua@^A\B[BZBXBWAVATBRDSFTGUHUHUHUHUHUHUHW$`#h#r)z2:AH!}N(wV/ta4pj9lt=h~@eBbC`D_E\FZGYGYGYGXIYJZK[L[L[L[L[L[L[LY#c"l"v)2 :AGM&~T-y^3th9pr=l|AiDfGdIbJaK`L_L^L^L]N_O_P`P`P`P`P`P`P`P["e!o!z(2 :@GL$R+[1|f8vo>qyCnGlJjMhNgPeQdQdRdQcRdSeSeTeTeTeTeTeTeT]!h r }(1 9@FL Q'Y/ڂc8|l?xuEt~JrMpPnRlTkUjViViViViVjWjWjVjVjVjVjVjV_ ju '1 9 @FKO#ڏV/щ`8˃i@qF{zKxOvRtUrWqXoYoZnZnZnZnZoYoYoYoYoYoYoYa lw '19 @FKܛJ"ҕS.ː]8Êf@nGvL~Q|TzWxZv[u]t]s]s]s\s\s[s[s[s[s[s[s[cnz&09 A GK֡E!͛Q-ĕZ7c@kGsM{RVY}\|^z_y`x`w_w_w^w]w]w]w]w]w]w]ep|&09A H ܦEѦC ǠN,X7a@iGqMxRWZ]`a~b}b|b{a{`z_z_z_z_z_z_z_fr~%09AI ױ5̫A¥L+V6_?gGnMvS~W[^acdddcb~`~`~`~`~`~`~`ht%/9AߪFҶ3ǰ?J)T5]>dFlMsS{X\_bde|fze|d}cbaaaaaajv$.8Aڵ5ͼ1=H(R3Z=bFjMqSyX\`c|exfugrftevdxcybybybybybybly#-6=. ;F&P2X<`DgLoRvW\~`yctepgmgkglfodqcrcrcrcrcrcrcn|!*1ܷ+, 9D$M0V:^CeJlPtV||[v_qbmeifegcfcegdjcjcjcjcjcjcjcq%% ) 6A"K-T7[@cHjNzqTtyYo]j`ecae^e[e[d^cacbbbbbbbbbbbbt &3?H*Q4Y=aEyhKsoPmwUhYc]^_ZaVbSbRaUaXaY`Y`Y`Y`Y`Y`xٴ*4=F&O0W9x_@qfFlmLfuPa~T\ʼnWWÕZR\O]L]K\L\O]P]P]P]P]P]P]} ѹ ,7 >E"M+yU3r]:kd@ekE`sIZ|MUևPPԔSLҡTIϱUFUEUDVGWHWHWHWHWHWHWձ˿ , 5<C~L&wT-pZ3ja8dh=^oAXxDSGNIJKGLDLBK?L@N@O@O@O@O@O@O ٪θ * 29?xG%rO*lV/g\3bc6]i9WqM@HAEBCABA@AfD!bJ$^P&ZU(V[*Sa,Nh.Ip/Dy1?2;3734323232323232323اʹ¿ ~ v&o-h2c8_>\DXIUN!QS"NX#K^%Fe&Am'=v(9)5*1*.+-+-+-+-+-+-+ϰżyrk f'`-[2W7T<QANEKJHOETCZ>a:i7q 3x 0!-!,!,!,!,!,!,!Ǹulf`[V% R* N/ K4I8F<D@BE@J>O;T7[4a1h.n+v+x+x+x+x+x+xvkb[UOJG D$B)@->1=5 ;9 9= 7B 5G 2L /R ,W *] 'c'd'd'd'd'd'dA-F,I-K0L7 P@QJQTO^Lh!Hq#E{$B%?&='<':'8'7'5'4'4'3'3&3&5%4$3$3$3$3$3$3$B,G+K,M/O5 S?TISSQ]Of!Kp$Hz%E&B'@(>(<(;(9(8(7(7(6(6'6'5&5%5&5&5&5&5&5&D+I*N+P.R4 V=WGVRU[Re"On%Kx&H(E(C)A)?*>*<*;*:*:)9)9(8(6'7'7(7(7(7(7(7(E*L)Q)S,V2 Z<[EZPXY Vc#Sl&Ov(L)I*G+E+C+A+@+?+>+>+=*<*:)9)9*8,8,8,8,8,8,H(O'T(W*\1 _:_C_M]W Za$Wj'Ts)P}+M,K,I-G-E-D-D-C-C-A,@+?+<-;.;/;/;/;/;/;/K'R&X&\(a0 e9eAcJbT _^%\g(Yq*Uz,R-P.N/L/J/I/I/H/G.E.E-A/?1>2@3@3@3@3@3@3N&U$\$a'g/ k7k?iGfQ d[%ae)^n,Zx.W/T0R1Q1P2O2N1L1L0K/H1E4D6E7G8G8G8G8G8G8P$Y#_#f&l- p6q=oElN iX%fb)bl-_u/\1Y2W3V4U4T4R4Q4O4O4M7L9K:L;M[?Z@Z@Y@YAXBXCYCZDZDZDZDZDZDX!bjs$z*2 9@F}N yY&tc.om3lv8i;g>e@dBcCaD`E_E_E_E^F^G_G`G`G`G`G`G`GZdnw#~)18 >DLـV&z`.vi4rr:oz=mAkCjEhGgHfIeJdJdJcJdJdJdJdJdJdJdJdJ\gqz"(06 <AڌHцR&ʁ\.}f5yn;vv?sCqFoHnJmLkMjNiNiMhNiMiMiMiMiMiMiMiM^it}"&.5: ޖ=ӒDʍP%ÈZ.c5k;|s@y{DwHuJsMrOpPoQnQnQmQmPmPmOmOmOmOmOmO`kv!%-37؜6͗BŒM$W-`5hI"S,\4d;kArFzJNQTV}X|X~{X}zW~yVyUxTxTxTxTxTxTeq}!$%Ԯ ɫ/ <G!Q+Z3b;iApFxKORUW|YyZvYuXw~Wx}Vz|Uz|Uz|Uz|Uz|Uz|Ugsݫϳİ- :EO)X2_:g@nFuK~OS}VyXuZr[o[nZpXrWsVsVsVsVsVsVivճ ʹ+8CL(U1]9e?lEsJ{OzRvVqXnZj[h[gZhYkXlWlWlWlWlWlWlyتϷÿ(5@J&S/[7c>jD}qIxyNsRoUjXfZc[`[_ZaYcXeWeWeWeWeWeWo| ҮȻ$2>H#Q-Y5`<|gBwoGqvKlPhScV_X[YYYWXXX[W]V]V]V]V]V]Vr֧ͳ / ;E N)V1{^8ue>plDjtHe}LaP\SXUTVQVOUOURUUUUUUUUUUUUUvѬǸ+ 8BK&zT-t\4nc:ij?drC_{GZKUNQPMQJQHPHPJQLQLQLQLQLQLQ{  զ˱ *5?zI!sQ(mZ.ga4bi9]p=XyAS˃DOʏGKȝHGūJDþJCIBJBKDKDKDKDKDKDK ڠϬŸ +5 |>tFmO"gW(b_-]f1Xn5Sv8N߁;Jݍ>Fܛ?Bڪ@@ؽA>@=@;B6<588696969696969סͮù'x/ p6j>eF`M\T!XZ#Sa&Ni(Jr*E|,A-=.;.9.8.7-5-5-5-5-5-5-ܜЩƵ ~w#p+ i2c9_@[FWLSSOYK` Gh"Bp$>{%9&5'3'1(0(/'/'/'/'/'/'Ҧɲ{ smg% a, \3X9T?QEMJJPGVC]?e:n6x2.+ ) ( ( ( ( ( ( ˯{qib]X%S+ O1 L7 J<GADFAL>R:Y6`2i.s*}'$""""""Ķ}pg_YSMI"F'C,A1>6<; :@ 7E 4K 0R ,Y )a %j "s{sf]VOJ FB>;!9&6*4.22/7-<)A&H"OV^ekkkkkk<,@,C-C0B6A> CICTA^=h:r7|531/.,++**)((&$$#####>+B+D,E/E4E= FHFRD]Af=p:z86421/..-,,,*((&%%%%%?*D*G*H-H3I< JFJQH[EeAn>x<9864322110/-,+('''''A)F(J(L+L1M: ODNNMXJbFlCv@><:8776655220-+ * * * * * D'J&N'P)R/S7 TATKRVO`LiHsE}C A ?!=!=!YHWSU]RgNpKz!H"F"D#C#C#B#A"A"?">!= :#7%7&6'6(6(6(6(6(J$P#V"[%^,`3 `;_E]OZZWdTm!Qw"N#L$J%I%I%H%G$F$E#D"A%@'>)>+=,=,=,=,=,=,M#T!Z `$d*f1g9 eAbL`V]aYj"Vt$T~%R&Q'P'O'M(K(J(I)I)H*G,F.E/E0E0E0E0E0E0O!W^e#j)l.m7 l?hGeRb]_h"\r%Z{'W)U*T,S-R-Q.P.O/O/O/M1L3L4L4M4M4M4M4M4R [bj"o'r-t4 s<pDlNiZfd#bn'_w*]-\/[0Y1X2W3V4U4U4U4T6S7R8S8S8S8S8S8S8U^fn!t&w+z2z9 x@tKpVl`$ij)fs-d{0b2a4`6_7]8\9[9Z:Z:Z:Y;Y`>_>_>^?^?_?_?_?_?_?_?Ycmv|#',2܇9 уD~OzY%vb+sk0ps4n{7m:ki@gAfBeBdBdBcBcBcBcAcAcAcAcA[epy"$(-ԍ5 ˉAÅLV%}_+yh1vo5tw9r

oAnBlDkEiFiFhEgEgDgDgDgDgDgDgD]gr| "#ە%ϓ2 ŏ?JT$]+e1|m6zt:w|=u@tBrEqFoHnHmHlHkGkGkFkFkFkFkFkF_iu~՚!ʘ0 <GQ$Z+b1j6q:}y>{AyDwFuHtJrKqKpJpIoHoGnGnGnGnGnGalwݚОŜ.:EO#X*`1h6o:v>B~E|HzJxL|wLzvMxuLxtKysJzrIzrIzrIzrIzrIzrIcny֟ ˢ+8CM"V)^0f6m:t?|BFI|Kx~Mu|Ns{NqzNqyLrxKtwJtvJtvJtvJtvJtvJep|ٚУŧ)6AK T(\/d5k:r?zC}FyIuLrNnOlOjOj~Ml}Lm|Kn{Kn{Kn{Kn{Kn{Kgsԝ˦&4 ?IR'Z.b4i9p>{xBwFsIoLkNhOeOcOcNeMgLgKgKgKgKgKiv٘ϡŪ#1 =GP%X,`3g8zn=uuAp~ElHhKdM`O^O\O[N]M_L`K`K`K`K`Kly Ԝʥ . :DM#V*~]0xe6sl;ns?j|CeGaI]LYMVNTMTLULXKXKXKXKXKXKp } ڗϡŪ+7AK }S'w[-qb3li8hq|HvQ#pY)k`.fg3ao7\w;X>SAODKEHFFEFEEEGFHFHFHFHFHFyږϡū !/ {;tEnNiV$d^)_e-Zm1Vu5Q8M;I=E>C?A?@>??>@?@?@?@?@?@Ԝʧ {+t7 mAgJbS]["Xc&Tk*Os-K}0G҉2CЗ4@Υ6>̷6<6<5:7888989898989ڗΣĮ|u*n4 h>cG^PYWT_Pg!Lo$Hy&D)A*=+;,9,8+6-4/3/3/3/3/3/ҟȪ}un'h0b9 ]AYIUPQXM`IhDq@| =":#8#6#5"4!1$0$0$0$0$0$֛˧²~t mg"a+[3 W; SBPILPHWD^@g6H3S 1^ .h ,r)|'%$""   9+<*>+>.<3<<:G7Q 5\ 2f0p-z+)'&%$$##"!!;*?)A)A,@2@;>D =O :Z 7d5n2x0.,+*)((''&$#" =(A'C'D*E0E8CB BL @W=a:k7u5~310/..--,+))&#!     @&D%G%I'J.K6I? HI FTC^@h=r;{97655443210.+(('''''B$H#L#N%Q,Q3O< NF LQJ[GeDoAx?><<;;:98762100/////F#K!P T#X*X1U8TB SMPXMbJlHuF~DCCBA@?>=<:98 8!7"7"7"7"7"I!OTZ"^(_.]5Z> YIVTS_PiNrL{KJIGFEDDCCB!A#@$?%?&?&?&?&?&LSY`!d&e,d2b: _D\PZ[WfUoRxQP O!N"M#L#K$K$J$J$I&H(G)F)F*F*F*F*F*OV]ei$k*k/i6f@ dLaW^b\kZs X|#W$V&U'T(S(R)Q*P*P*O+N,N-M-M.M.M.M.M.QYbin"q'r,q2o< lHhSf]cf ao#_w&^(\)[+Z,Y-X.W/V/V/U/T0T1S1S1S1S1S1S1T\ems v$x(x.v8 sDpOmYjb!gk%es(d{*b-a.`0_1^2]3\3[4[4Z4Y4Y4Y4Y4Y4Y4Y4V_iqw{!}$(}4z@vLsVp_"ng&ko*jw-h/g1e3d4c6b7a7`8_7^7^7]7]7]7]7]7]7Xaktzօ#̄1À>}IySv\"td'ql+os.m{1l3k5i7h9f:e;d;c;b:b:b9a9a9a9a9a9Zcnv}݇Њ Ɖ/;FP|Y"ya'wi+tp/sx2q5o7n9l;kg=g=fzj=zi=zi=zi=zi=zi=^hs|ڊѐƓ*7 BKT!\'d+k/|r3zz6y9w<u>|t@yrAvqBtpAso@sn?tn?tm>tm>tm>tm>tm>`ju~ Վ̔'5 @IR Z&b+i/p3x7~:||=xz?uyArwCovCmuCmtBmsAmr@nq?nq?nq?nq?nq?bmxڊВǘ%2 =GPX%`+g/n3}v7y~:v>r@oBk}Ci{DgzDfyCfxBgwAhv@hv@hv@hv@hv@dp { ֎̕œ"0;ENV$^*e/|l3wt7s|:o=l@hBeDbD`D_C_~B`}Ab{@b{@b{@b{@b{@f s ~ Ғș -9CLT#\(zc-vj2qr6mz9i=e?aB^C[DYDXCXBYA[A[A[A[A[Ai v ٍΖÞ*6 @J~R yZ&ta+oh0kp4gx7c;^>Z@WBTBRBQBQAQ@S@S@S@S@S@mzӒɛ&3 >}GwPrX#m_(if,en1`v4\8X;T=P?M?K?J?J?I>K>K>K>K>K>rڌϗĠ!/}: vDqMlUg]$bd(^k,Zs0U}3Q6M8J:F;D;D:C:B;C;C;C;C;C;wԒʝ|*u6 o@jJeR`Z\b#Wi&Sq*O{-K0G2D3A4?4>4=4<5;6;6;6;6;6~ۍϙţxr$m1g< bF]OYWU_QgMo"Iy%EDŽ(AƑ*>Ġ+<°,:,9+8,7.6/6/6/6/6/ԕɠ|pje,`7[A VJRSN[KcGlCv@ہ<ڎ!9؞"7֮"5"4"3#2$1&1&1&1&1&ڐ͝ħtke_(Y2U;QD NM JUF]Ce@n[ :d7n3z0.,*)((((((ʣ~pd\ VQL$H,D3A:>@;G8O4W1` -k *w & $ " !      ītg[TN JEA#>);/855;2A.H+Q&Z"eswj^RKFA =:64#1(/.,3)9%@ HQ\hu {m`TJC>962 /,*(!%%"*06>G Q[envvvvv3,5+6,4/15.=+G&R"]hr|    5*7)8*7-433<0E+P'[#f!py            7)9(:(:+818:5C1N,Y)c'm%w # !              9'<%=&=(=.=7;A8K3V0` .j +t )} ( ' & % % $ $ # # !          <%?#A#A%C,C4A>>H:R7] 5g 2p 1y / . - , , + + * ) ( ' % " !      >#B!E G#J*J2H:EDAO >Y |=<<;;98766543222222EJNTX%X,V3R<OF MQ J\ HgFpEyDCBAA@??>>=<;::9999HNSZ^#_)]/Y7VATM RY OcNlLtK|KJIIHGFEEDCBA A A A A A KQX_c!e&d+a3^=\I YTX^VgToSwRQPOONM L K K!J"I#H$H$G$G$G$G$NU]dhj"j'h-f8dD aO_Z]c\kZsYzX W!V"U#T$S%R%Q%Q%P&O'N'N'N'N'N'N'PXahloo!n'm4k@ iKfVd_bg`o_v!^~#]$\&['Z(Y)W*V*V*U*T*T+S*S*S*S*S*SZdkprsu"t1r= oHmRj[hcfk er#cz%b'a)`*_,^-\-[.Z.Y.Y.X-X-W-W-W-W-U]gnsvw zz.x: uErOpXn`lh!jo$iv'g~)f+e-c.b0a0_1^1^1]0\0\/\/\/\/\/W` iqvy} ǀ+~7 {BxLuUs]qe"ol%ms(l{*j-i/h1f2e3d4~b4}b3|a2{a2{`1{`1{`1{`1{`1Yb lsy ~͂…(5@}J{Sx[vb"tj&rq)px+o.m0l2~k4{i5yh6wg6vf5ue4ue3td3td3td3td3td3Zd n v |Ђdž&3> HQ}Y{`"yg&wn)uv,s~/~r1{q4xo6un7rl7pk7oj7oi6oi5nh4oh4oh4oh4oh4\ g q yր̆‹#1< ENW^"~e&|l)zt,{y|/xw2uv5qt7ns8lq9jp9io8in7hm6il5il5il5il5il5^ i s |҄Ɋ .: CLT\!c%}j)yq-u~z0r}3n{5kz7hx9ev:cu:bt9bs8br7bq6cq6cq6cq6cq6a lvψŎ ,7 AJRZ {a%wh)so,pw/l2h5e7b~9_}:]{:\z9[y8\x7\w7\v6\v6\v6\v6cozքˌ)5?HPzXu_#qf'mn+ju.f~2b4^7[8X9V:U9U~8U}7U|7U|6U|6U|6U|6fs~҈Ǒ%2< ~FyNtVo]!ke%gl)ct-`}0\3X5T7Q8O8N8N7N6N6N6N6N6N6jwڃ΍Ö!.~9 xCrLnTi[ec"aj&]r*Y{-U0Q2N4K5H5G5G4G4F4F4F4F4F4o|ԉɓ}*v6q@ lIgQcY_`[h"Wp%Sy(O+K.G/D0B1A0@0@1?1?1?1?1?1u܃Ϗřyt%o2j< eF`N\VX^TePm Lv#I%E(B)?*<+;*;*:+9,9,9,9,9,|Պʖ~p kf,a7]A YJ URQ[McJkFtC? <"9#7#6"6"5$3%3%3%3%3%݅ϒŝwh_\$X0T;PEMN IV F_Cg@q=|:Έ7͗4˧2ɻ110.....ԎɚpbXTP)L4I>FGCP@Y=b :k 8v520.ߵ,+*)))))͘ãvh[S OJ#F,C5@==E:N7W4`1k.w , ) ( & % $ # " " " " ơzm`TMHD@$=,:37:4A1I-R*\'h#t ~pdWMFA =96!4(1..4+:'B#KUao     tgZOE>95 2/,*!'&$,!29BL X fuxj]QG>62.+' %" #)0 8ANZfq}.+0*/+,.'4$<FQ\f p y0*2)1)/,*1):%D OZdnw        2(4&4'2*//.8,B'L!Wakt}   5%7$7$5&5-562?.I)T%^!hqz       8#:!;!:#<*<39<6F1P-[*e'n%w%~$$#""!!     :!=>@!B'B0@9=B9L5W2a/k.s-{-,,++*)('&%% $ # # # # # # =ACGI%I,G5D>@Hu =| = < < < ; : : 98876554444DINTW W%T,P4M>KJIUH_ Gh Fp FwEEDDCBAA@?>==<<<<<GLSY\\!Z&W.U9TERP QZ PcOkNsMzLKKJIHGFFEDCCBBBBJOW]aa_]']4\A[L YVW_VgUnTvS}RQPPONLLKJIIHHHHLR [aeecd"e0d=bH `R^[]c[kZrYyXWVUT S!R!Q!P!O"N"N"M"M"M"M"OV _ehh h kk-j9hD fNdWc_ag`n^u]}\ [!Z"Y#X$V%U%U%T%S%S$R$R$R$R$QY b h k mn pq*p6nA lKjTh\gdekdrby a"`#_%^&\'[(Z(Y(~X'}W'|W&|W&|W&|W&|W&S [ d j nrsvw'u4s> qHoQmYlajhhogv!e~#d%c'b(~a*{_*y^*x]*w\*v\)v[(u[(u[(u[(u[(U ^g mrvxz{${1y< vFtOrWp^nemlkt"j|$i'}g)zf*we,uc,rb-qa,p`+p`+p_*o_)o_)o_)o_)W `iov{}!/~:{D yLwUu\scqj pq"|ny%ym(vl*tk,qi-nh.lg.ke.je-jd,jc+jc+jc+jc+jc+Yclsz ,8A ~J|RzZxa}wh zuo#vtw&sr(pq+no-kn.hm/fk/ej/di.dh-dg,dg,dg,dg,dg,[fnw~ *5? HPX{~_x|f t{m#qyu&nx~)kv+hu-es/br0`p0^o0^n/^m.^l-^l-^l-^l-^l-]hq{Ȃ'3= F~NzVv]rdok#ks&h~|(e|+b{-^z/\x0Yv0Xt0Xs/Xr.Xq.Xq-Xq-Xq-Xq-`kuŇ$0; ~DyLtTp[mbii!fq%bz'_*[,X.U~/S|0Q{0Qy/Qw.Qv-Rv-Rv-Rv-Rv-coz̄ -~8xA sJoRkYg`ch `o#\x&Y(U+R-O.L.K.K-J~-K}-K|,K|,K|,K|,hsȉ })w5r? mGiOeWa^]fZm Vv#R&O(K*H+F,D+D+D+D+D+D+D+D+myυďzu%p1k;gD bM^U[\WdSkPtL~!H$E&B'@'>'>&='='='='='='sրʌ|qlh,c7_A[I XQTYPaMiIrF|B? @;"9,754>2G0Q-[+f(r&$"!àwi\PE=963"1*.2+9(B%K"V bp{m`TI?830-*'%%,!2:DO\ k {qdWLB91-)& # $*2 ;FTbsugZND;2+&"  ")2<IWfs)*))'*#-3;D OZdnv~+(,'*(&+ 09BM X bkt|.&.%-%)(&.%7 @JU_ h qy0$1"0"-$-++4)=#GR\env} 3!443!4(310:+D&N"Xbksz6879;&:-764@/J+T(^&g$p$w#~"""!  9;<@A"A*>2;;6E3P0Z/d.l-t-|,,,,++**)))('' & & & & <?BFHG%D-@6=@9K8V7`7h7p7w7~6666554322 1 0 0 / / / / ?CGLNM I'E0B:BFBQA[Ad@k@s@y ? ? > > = = < ; : : 9877777BFMRSRNJ(K5LAKLJVJ_ Ig Hn Gu G| FFEEDCBA@??>====EI Q VXVPR#T1T=THRRQ[ Pc OjNqNxMLKKJIHGFEDDCCCCHMU Z [ YW Z\-\9[DZN XW W_VfUmTtS{RQPPNMLKJJIHHHHJ QY ]^`_ ac)c5a@`J ^S ][\c[jYpXwWVUTSRQPO~N~N}M}M}M}ML T\`dfegi&h2g=eG dP bXa_`f^m]t\|[ZYX~W{U yT xSwSwRvRvQvQvQNW_chkjln#n/l:kD iM gUf]ddcjbqay`~^{] y\!w["tZ"sX"rX"qW!qV pV pV pV pV PZagmppqr r-q8pB nK lSjZiaghfo}ewzdxc ub!sa#p_$n^$l]$l\#k[#kZ"kY!kY!kY!kY!R\dkqtuv ww*v6t?rH qPoXm_}lezkmwjtth}rg!of#me$jd%hb&fa&f`%e_$e^#e]"e]"e]"e]"T^fntxz{||({3y=wF uNtV{r]xqcupkrnrom{ll"ik$gj%dh&bg'`e'`d&`c%`b$`b#`b#`b#`b#Vajry}%1~;|D ~{LzyTvx[svbouimtpjry gq"dp$ao&^m'\k'Zj'Zi'Zh&Zg%Zf$Zf$Zf$Zf$Ydmv}".9}B yJ tRq~Ym|`j{ggzndxvaw"^v$[t&Xr'Vq'To'Tm'Tl&Tk%Tj$Tj$Tj$Tj$]gr{+}6x?sH oPlWh^eebl^u[~~!X|#Uz%Ry&Pw'Nu'Ms&Nr&Nq%Np$Np$Np$Np$`kwƀ |(w3r=nE jMfUc\_c\jYsU|R!O#L%I~%H|%Gz%Gy$Gw$Gv$Gv$Gv$Gv$eq|Åzu$p0l:hCdK `S]ZYaViSqO{LI!F"C#A#A"A"@"@~"@~"@~"@~"jwʂzrmi,e7a@]H ZP VWS_PgLoIyFB@=;;::::::p~ʼnvjd`&]2Y<VDSMOU L\ IdFmCw@=:865544444yˆtcZVS,P6M@KHHPEYBa ?j &H$S#_!lzߞݲtfYMB7-* '% #( 09CO\jz xj]QF<2)%" "*2< HUev}naTI?5-% "*3?N^pseXKA7/'   !+6DUfv$)#(),19CMXaks{&'%&"&).7 AJU_hqx)%(#%# %,5> GR\enu|,"+ ( #!#)!2;EO Xbjry..,*+&)/%8AKU^go v | 11/12#0+-3(=#FQZcksy454887&3//8*B'L%V$`#h#o$v$}$$$$$##"!!!!!    78;>> = < < ; : 9 8 8 8 8 @ DK N M GEIK-L9LDLMKVJ^IeIl Hr Hy G F F E DCBA@??>>>>C HORQQN QS(T5T@SIRRQZPa Oh No Nu M}LKKJIHFFEDCCCCELRUXYVXZ%[1Z<YFXOWW V^ Ue TkSrRyQQPON~L|KzJyJxIxHwHwHwHGOUZ^_]^`!a.`9_C^L\T [[ ZbYhXoWvVU}T{SxRvQtPsOrNrMqMqLqLqLIRX^ceccef+e6d@cIaQ `X __^f]m~\t{[|yZvYtXrWpUnTmSlRkQkQkPkPkPJT[cgjii jj(j4i=gFfN eU c\}bczajx`qu_zs^p]n\l[jYhXgWfVfUfUfTfTfTMW_flnnmno&n1m;lDjL ~iS zhZwgaufhreopdwmckbh`f_d^b\a[aZ`Y`Y`X`X`XPZbjprsrss#s/r9qA|oI ynQ umXrk_pjfmimjhuhgefce`d^b\a[_[^[][][\[\[\S]fntwwwxx x,w6|v?wtG tsO qrVmq]kpdhokemsbl}`k]j[hXgWeVdVbVaV`V`V`V`V`jrx|||}}}){|4w{=szEoyM lxTiw[fubcti`sq]r{ZpWoUnSlQjPiPgPfPePePePeYdow} z&v1q;mCjK f~R c}Y`|`]{hZypWxyTwQuOtLrKpJnJmJkJjJjJjJj]is|yt#p.l8hAdIaP ^W [^XfUnRwN~K|I{FyDwCuCsCrCqCpCpCpbnyzrmi+e5a>^F[N XU U\RdOlLuHEC@>=}={=y=x=w=w=whutk ea&^1Z:WCTKQRNZ Kb HjEsB~?=:97777777o|pc\X U,R6P?MGJOGWE_ Bg ?q <|97532210000wDŽ}n_S NK%I0F9DBBK@S=[;d8n6y 3 1 / - , , + * ***̀Œzk[LB@='<2:;8D6M4V2_0i.u,)(&%%$####NJsdVH;31/&-0,9+C)M(W&b$n"} zk]PC7,# !"+5?KWdrӃҖЪ pcVI>3)  '0: F TcsuhZNB8.%  !)4@O_qzl^QF;2)!  ",8GYlpbUH>4+#  $0?Qdv'''*/6@JU_hpx~!%$%',4>GR\fmu{##!!!#* 2;EOYbjqx~% #'/ 8AKU_gnuz)'"! $,4= GQ[cjqw},*&(( %( 09CMV _ g n t z /--/.+#&+!3=HR[cjpv|21 4 540+$$,"7$B%M&V'^(f(l(s(y(((((''&%%$$####5 49 ; 94,+%.20=2H2R3Z3b3h3o3u3{222210/..--,+++8 9?@=526 9-;9CDCA= @B(D4D?DIDQDYC`CgBmBtB{AA@? > = < ; ; : 9 9 9 9 =BGILKGHK$L0L;LEKNKUJ]IcIjHpHw G F F E D C B }A {@ z? y> y> y> y> >FKPSSNPR S-S8RARJQRPYO`Nf Nm Mt L| L K }J{IxHvGuFtEsDrCrCrCrCAINUYZUVXY*Y5X>WGVOUVT]Sc Sj Rq |Qy zPxPvOsNqLoKnJmIlHlHlGlGlGCLSZ^_\\ ]^&^2];\D[LZSYZ }Xa {Wg xVn vVvtUqToSmRkQiOhNgMfLfLfKfKfKFOW^cdaabc$b/b9aA`I}_Qz^X w]^ u\e r[lpZtnY}lXiWgVeUcTbRaQaPaPaOaOaOIR[bghfefg!g,f6e?{dGxcNubU ra\ o`c m_jk_ri^{f]d\a[_Y]X\V\U[T[T[S[S[SLU_fklkjkkk*~k4zj=viEshLpgS mfZ jea hdhfcpcbyaa^`\_Z^X\WZVYVXVWVWVWVWOYcjopono o}p'yo1uo:qnBnmJklQ hkX fj_ cifahn^gw[fYeWdTbS`Q_Q]Q\Q[Q[Q[Q[R]gotssst }txu$tt/pt8ls@irHfrOcqV ap] ^oe[nlYmuVkSjQiOgMeKdKbLaL`L_L_L_Ublsxwwx~ywzrz!nz,kz6gy>dyFaxM^wT [v[ Yuc VtkSssPq~NpKnImGkFiFhFfFeFdFdFdZgpx|{|~xplh)e3a<^D[KY~RV}Y S|a P{iMzrKx|HwEuCtAr@p@n@l@k@j@j@j`lv~}rj ea%^/[9XAUHRPPWM_ Jg GpEzB?}=|;z:x:v:t:r:q:q:qfr|{nc]Y V+S5Q=NELMIUG\De An >x <975444|3{3z3z3zmyyj^T PM%K0H9FADIBQ?Y=b;k8v5 3 1 / . . - - - - - vugZMFC@)?3=<;D9L7U5^3h1s/,*)'''&&&&reVI<75!3*240</E-N,X*b(n&{$"!ˆ|oaRD8, )' %)$2";!EOZftvhZL?4)$-7BN [ i yŊÝ|n`RF:/% '2>KZiz׍ԡҶseWK?4+!  +8FVhzxi\OC8.% $1@Rdw}n`RF;1( )9K_q&% %(+4=HS]fnu{#""$)2;EPZckqw}! '/8BLW`gnty~  %,4>HS\cjpv{"!)0:DNW_flrw|%"$, 5?IS[bhnty(% % &#&/ 9 C MV^dkqv|+ (+ , )"'3>HQY`g m s y  .-21, $ ""&.(9)C*L*U+\+c+i+o+u,|++++*)(('&&%%%13762/* .1)243>4H4P5X5_5e5k4r4x44433210/.----38;<>;68:$<0<:=D=L=T=[=by=w<v;t:t9s9s9s98@EKNMHHIK(K3K<KEJMITI[HaHhGn~Gv|F~yFwE uD sC qB pA n@ m? m> m> l= l= ;CJQTSNN PQ%Q0Q9PBPJOQNX}N^{MeyLlwLsuK| sK pJ nI lH jG iE hD gC gC fB fB fB >FPVZXTTUV"V-V7U?UG|TNySUwR\uRbsQiqPq nPy lO jN hM fLdKcJbIaH aG aF aF aF AJT[^]ZYZZ[*[4}Z=zYDwXKtXRqWYoV`mUg kUo iTw gT eSbR`Q^O]N\M\L\K[J[J[JDNX_a`^]^__'{_1x^:t^Bq]Io\Pl[Wj[^hZe fYm dYu aX _W]V[UYSXRWPWOWNWNWMWMGR\cedbbb czc$vc/sc8ob?laGjaNg`Ue`\c_c a^k ^]s \]~Z[XZVYTWRVRTRSRRRQRQRQJV`ghgffgzhuh!qh,ng5kg=hgEefLceS`eZ^da \ci Ybr Wa|U`R_P]N\MZLYLWMVMUMUMUN[dkkkjk|lulpmlm)im3fl;clC`lJ^kQ[jXYi_ Vhg Tgp RfzOeMdKbIaG_G]G\G[GZGZGZS_ionnn~ovqorjrfr&cr0`r9^rA[qHXqOVpVTo^Qne Omn Llx IkGjEhCfBeAcAaB`B_B_B_Xdmrrrryupvix dx`y#]y-Zy6Xy>UxFSwMPwTNv\KudItl Fsv Dr Ap?o=my ;x 9v 8t 6r 6q 6n 6m 6l 6k 6k epy{zz|rh\U QN%L/I7G?EGCOAW?_ ;8#7,553=2E0N/W-a+l)x'%$"!"!!!!}wj^QE8/-+$*-(5'>%G$P"[!fssg[NA5) "+4=GR^k{ }pdWI<1&   '1;FR`oyk]OC7,"",7CQ`qʄȗƫpbTH<1'  &1>N_qߛݬ۾ugYL@5+" +9J]ozk]PC8.%  $4EXk}$ ##$)1;FR\dkqw|!  !&/9CNX`gmsx}$,5@KT]djouz~!)2<FPX_fkqv{  %.7AKS[bgmrw|   (2<ENV]cinsx~!   !+6@IQY_e k p v { $ #!  $/:CLT[agmrx&&)% * 5!>"G"O#V#]#c#i$o$u$|$$$##"! ),.--*$ &)%+0,:,C-K-R-Y-_.e.k.r.y.---,+*)(~(}'}'}'+12896103 4+565?6G6N6U6\6b6h5o5v5~554}3{2z1x0v/u.u.u-u-/5:@B?:9;<'=2=;=C=K=R=Y<_l=j<i;h:g9g8g8g86=GMNLHGHI I+I4I=~ID|HKyHRwGYuG_sGfqFmoFumEkEiDgCeBdAb@b?a>a=a=a=9CLRRQLLMNN(N1{N:xNBuMIsMOqLVoL]mKdkKkiJsgJ}eIcIaH _G ^E \D \C \B[A[A[A<GQVVURQR R}S%yS.vS7sR?pRFnQMkQSiPZgPaeOicOqaO{_N ]M [L ZK XI WH WF WE VE VD VD ?KUYYXVUV |WwW"tW,pW5mW<kVChVJfUQdUXbU_`Tg^To\SyZR XQ VP TO SM RL RJ RI RH RH RH BPY\\\ZZ~[w[r\o\)k[2h[:f[Ac[HaZO_ZV]Y^[YeYXnWWw UW SU QT OS NQ MP MN MM ML ML ML GT]___^^y_r`m`i`&f`0d`8a`?_`F\_MZ_TX^\V^dT]lR\v P[ NZ LY JW HV HT HR HQ HP HP HP LXabccb{csdme hede$ae-^f5\e=ZeDXeKUdSSdZQcbObjMatJ` H_ F^ E\ CZ BY BW CV CU CT CT Q]effffvhnigj bk^k [k*Yk3Wk;TkBRkIPjQNiXLi`JhhGgrEf~ Ce Ac ?b >` =^ =\ =[ =Z =Y =Y Vbiiiijrminap\qXqUq'Sq0Pq8Nq@LqGJpNHpVFo^DngAmp?l|=k ;j 9h 8f 7d 7b 8a 8` 8_ 8_ \gmmmm}noqet[wUx QxNx#Kx-Ix5Hx=FxDDxLBwS@v\>vd;un9tz7r5q3o2m1l1i1h1f1f1fcnqqqqyskwbyW}MHFC)B1@9>A=H;P9Y7~b5}l3|x1{/y-w,v+t+q+o+n+m+mjuvuuvvxi|^SH?=:#9,745<4D2L1U/_-i+u*(&%$}$z$x$w$v$vr{zzz~{rfZOD820/&-.+6*>)F'P&Z$d"q!{zncVK@4) %#"& /7?IS^kywk_SG<1& %-6? J V cqsh\PD9.# !*4>JXfv}qfZL?4)  '1<IXiz|m_QE9.$!,9HYj}ԒӧжrdVI=2( &4DWkwi[MA5+! /?Sh|"!!"%/:EPYagmsx} #,7BMU]djoty~ !)3>HQY`fkpuz~&/9CLT[bglqvz  !*4>GOW]chmrv|  $/8AJQX^dinsx~ (2<DLTZ`ejou{  !, 6 ? G OV\aglry  &1:BJQW]ciou}$$))&"!#,$5%>%F&M&S&Z&_&e&k&r'z'&&&~%|$z#x"w"w!v v $(/330,)+-'.1.:.B.I.P/V/\/b/h/o/w}/{/y.w.u-s,r*p*o)o(n'n')-7;;852 35#5-666>6E6L6S~6Y|6_{6ey6lw6tu6}s5q5o4m3l2j1i0h/h.g-g-,5>AA?<9:;<)<2<:~`=^<];\:\9[8[7[73@IJJIFEE FzF#wG,tG4qG<oFCmFJjFPiEWgE^eEecEmaEv_D]D\CZBX@W?W>V=V<V;V;8DMNNMJIJyKuK qK)nK2kK9iK@gKGeJNcJTaJ\_Jc^Jk\IuZIXHVGUFSDRCQAQ@Q@Q?Q?<IPQQQONzOtOpPlP&iP/fO7dO>aOD_OK^OR\OZZNaYNjWNsUM~SLQKOJNHMGLELDLCLCLCAMSTTTS}RuSoTkTgT$dT,aT4_T;\TB[TIYTPWSXUS_SShRRqPR|NQLOJNIMHKGIGHGGGFGFEQVWXWWxWqXjX fYbY!_Y*\Y2ZY9XY@VYHTYORXVPX^NWfMWpKV{IUGTESDQCOCNCLCKCJCJJUYZ[ZZs[l\e]`^\^Y^'W^0U^7S^>Q^FO^MM^TK]\I]eG\nE[yCZAY@X?V>T=R>Q>P>O>OOZ]]^^|^n`fa`cZcVdSd$Qd-Od5Md<KdCJdKHdRFcZDbcBbl@aw>`<^;]9[8Y8W8V9U9T9TT_`aaaxbkebfZhTi PjMj!Kj*Hj2Gj9EjACjHBjP@iX>iaq>=qE;qM:pU8p^6oh4ns2m0l/j-h-f-d-b-a-`-`ahhhh{ipken[qRsGw@y=y;y"9y+8y26y:5yA4xI2xR1w[/we-vq+u~)s(r'p&n&l&j&h&g&ghlllmxmnoatWwNzC}9 421&/..6,=+E)N(W&b%m#~{!| {yvtrqoopqqqqurju_zT~I?4+ (& %(#0"7!?HR]iw}{zxxwvvv|vryg}[PE;0% (08AKWc q }|{{z}ncXLA7,"  '09CN[hxvk`TI>3)  %.8CP^nsh]QF;0& "+6BQas~rf[NB6+!  (3AQcvʋɢǸ}paSF:/%  #0?QdxufXJ>2( ,=Pdx #-9DMV]djoty}!*5@IRY`fkpuy~'1;EMU\bglquz #-6@HPW]chlqv{  '1:CKRX^chmqv|  ",5=EMTY_dimrx~&/8@HOUZ`ejou{  )2;CJPV\afl r y   #-6>ELRX]ciov~}{zyxx $#!(19AHNTZ_e l s {} { ywusrqppp"+--+'" $%#&,'5'='D'J(P(V~(\|(bz(ix(pv(yt(r(p(o'm&k$j$i#h"h"h!!+24420,,-.(/1/9~/@{/Fy/Mw/Su/Yt/_r/fp/nn/vm/k/i/g.f-d+c*b)a)a(a(%29::863344$|5-y55v5<t5Cr5Ip5Pn5Vm5]k5di5kg5tf5~d5b4`4_3]1\0\/[.[-[-+8=??>;99 }9y:!u:*r:2p;9n:@l:Fj:Mh:Sf:Ze:ac:ia:r_:|]:\9Z9Y7W6V5V3V2U2U21=ACCB?>|>w?s?o?'l?/j?6h?=f?Dd?Jb?Q`?X_?_]?g[?pY?zX>V>T=S<R:Q9P8P7P6P66BEFGFC~BwCrCmDjD$gD,dD3bD:`DA^DG\DN[DUYD]XDeVDnTCyRCQBOAN@L>L=L;K:K:K9;FHJJIGyGrGmH hHdH!aI)_I1\H8ZH>XHEWHLUHSTH[RHcQHmOHwMGKFJEHDGBGAG?G>G=G=?IKMMM~KtKnLhL cM_M\M'YM.WM5UM<SMCRMJPMROMYMMbLMkJLvHLFKEIDHCFBDBCBBBABACLNOPPzOpOiPcQ^RZRWR$TR,RR3PR:NRAMRHKRPJRXHR`GQiEQtCPAO@N?L>J=I=G>F>E>EHPQSSSvSkTdU^VXWUWQW"OW*MW1KX8IX?HXFFXNEWVCW^AVh@Vr>U]\<\f:[q9[}7Y5X4V3U3S3Q3O4N4NSWXYYzZoZc]\_SaMbHcEcCc$Ac,?c3=d:j;j!:j)8j06j75j>4jF2jN1iW/ia.hl,gy+f)e(c'a'_']'[(Z(Z^_``}`rahc^fUhLkBn9q 5r3r2r%0r,/r3-r;,qB+qK)qT(p^&pi%ov#n"l!j hf d c a accddydoeegZkQnHq>t4x,z*z(z 'z(&z/$z6#z>"zF yPyZxfwsvtrpnljiihhhhviljbmWqMuDx:{0% ")19AKVbo~ ~ | y w u s r qmmm}msnip_tTxI|@6,"" * 2 : DO[hw~}|{srrzrqtfx[}PE;2( !*2<GSaoyxxyxm}bWMB7.$  )2<IWfvvj_TI?4*! &1<JZk~sh]RG<2'  ".:K]q~rg\PC7,! +9J^s܉ڞگٽ~sdUG;/$(8J_s",7AJRZ`fkpty~(3=FNV\bglpuz%.8AIQW]chlquz  *3<DLSY^chlqv{  $.6?FMTY_chlqw} (19AHOUZ_chmrx#,4<CJPUZ_diou|%/7>EKQV[`fkry}||| ) 2 9 @ G M R X ]cipx~|zx v u s s r r  #,5<BINTZ~_|fzmxuv~trpomlkjii%''&#( 0 8!>}!Ez!Ky!Pw!Vu!\s"cq"jp"rn"{l"j!h!f eccbba',..-+'%&'$|(,y(4w(;t(Ar(Gp(Mo(Sm(Yk)`j)gh)pf)yd)b)`(_']&\%\$[#["["#.24421., {-w. t.(r.0o.7m.>k.Di.Jh/Pf/Vd/]b/ea/m_/w]/[/Z.X-W,V*U)U(U(U'*3689754z3u3q3n4%k4-i44g4:e4Ac4Ga4M_4T^4[\4cZ4kY5uW5U4T3R2Q1P/P.O-O,O,/7:<=<9z8t8o8k8h8"e9*b91`97^9>\9D[9JY9QX9YV9aU9jS9tQ9P9N8M7L5K4J2J1J1J04;>?@?}=u<o<j< f=b=_=']=.Z=5X=;W=AU=HS=OR=WQ>_O>hN>rL>~K=I<H;G9F8F6E5E5E49>ACCCy@q@jAeA`A]BZB$WB+UA2SA8QA?OAFNBMMBULB]JBfIBqGB}EAD@C?B=A<A:A9A8A8=ADEF~FuDlDfE`F[FXFUF"RF)PF0NF6LF=JFDIGKHGSFG[EGeDFoBF{AE?D>C=A<@<>===<=;ADGHI{IqHhHaI[JVK RKOKMK'JK.HK4GL;ELBDLICLQALZ@Lc?Kn=KzQOW09WE8WM7VV5V_4Vj2Uv1T0S/Q.O-M.L.J.I.HLOQQ{RqRfS\VUWMYE[@\ =\;]9]&7]-6]44];3]B2]J1\S/\].\h,[t+Z*Y)W(U'S(Q(O(N)NPSTUwUmVcWYZR[J]B`:c6c4d2d#0d*/d1-d8,c?+cG)cP(cZ'be%ar$a#_"^!\ Y!W!V"U"TUWXXsYjY`[W^O`Fc>e5i.k+k*k(k&'k-%k4$k<#kD!jM jWibioh}fec`^\[[Z[\{\p]g^]`ScKfBi:l0o&r"s ss"s)s0s7s?rIrSq_qkpznlj hfdcb_``v`madbZePiGl>o5s,v"y| |||#|*|2|: {C {N zZzfxuwuspnmlkde~dsejebhWlLpCs:w1z(~ $,4=GS`o}{xvutjiziqjik^oSsIx?|6,#$,5?KXgwooxopoesZyP}E;1( #,6AO^ouuwumyb~WLA7-$ !+6CRcv||uj_TI?4*! )6DVi}si^RG=3( &4EZn҄ИЪϹ~sh^SE8-!  #3DZq*4=FNU\bglquz&/9AIQX^chlquz !+4<ELSY_chlqu{  &/8@GNTZ_chlqv| !*3;BIOUZ^cglqw~ %-5=DJPUZ^chmsz (08?EKPUZ_diov~"*3:@FLQV[`els{~{yxwvuu  %-5<BHMRW]c}i{py yw usqpnmlll  (07>C}I{NyTwZv`tgrnpwnljhgedcc c  ""!#|+z3x9v?tErKpPnVm]kdilgueca`^]\[[["&))(&# {w t!'r!/p"6n"<l"Bj"Gh"Mf"Se"Zc#aa#i_#r]#}\#Z#X"W VUUTT!(,..-,|)x&t&p'm'$j(+h(2f(8d(>b(Da(J_)P])W\)_Z)gX)pV){U)S)R(P&O%O$N#N"N!&-0231|0v.r,m, j-f- d-(a-/_.5^.;\.AZ.GX.MW.UU.\T/eR/oP/zO.M.L-J,I*I)I(I'I&+14665x4r2l1h2 d2`2]2%[2,Y22W28U2>T2DR3KQ3RO3ZN3cL3mK4xI3H3F2E0D/D-D,D+D+/479:|9t7m6g6b6^7[7X7"U7)S7/Q75O7;N7BL7IK7PJ8XH8aG8kE8wD8C7A6@4?3?1?0?/@.38:<<x<p9i9c:];Y;U;R;P;&M;-K;3I;9H;@G;GF;=:<8;7;5;4;3;26;=??u?l=d=^>Y?T? P@M@J@$H@*F@1D@7C@>B@EA@L?AU>A^=Ah;@t:@9?8>7<6;69787776:=@A|BrBiA`AYCTCODKDGEEE!CE(AE/?E5>E<=ECADFGuHkHaHWJQKKMDN?O y4}+" '0:GVfxlulnldpYuOzD:0' &0<K\n}surlua{VKA7,# $0>Nav}yu|j_TI?4*!  "0@Rg}ȒƦŸsi^SH>4* /BWl'/8AIQX^chmqv{ "+4=EMSZ_dhmqv{  '08@HOUZ_dhlqv|#+3;CJPUZ_chlqw~ &/6>EKPUZ^cglrx!*19?FKPUY^chmt| $,4:@FKPUY^cipx~|{zzz '.5<AGLPUZ`fl}t{~ywusrqppo !)07=BH}L{RzWx\vctjsrq{omkihgfff  $~,{ 2y 8w >v Dt Ir Nq To Zm `k hi qg {e c b ` _ ^]]\  {xu's.q4o:m@kEjKhQfWd^bf`n^y][YXVVUUU!#$#~!yvspm#j*h0g6e<cBaG`M^T\[ZcYlWwUSRPONNNN"'()(x's%o"l i f!c!&a"-_"3]"9\"?Z"DX#JW#QU#XS#aQ$jP$uN$L#K#J!H HHHH!'+--z,s+n)i'f& b&_'\'#Z'*X'0W'6U(;S(AQ(HP(NN(VM)_K)hI)sH)F)E(D'C%B#B"B!B!%+.01v0o.i-d,`,\,Y,V, T,&R,-P,3N,9L,?K-EI-LH-TG.]E.fD.qB.~A-@,>+>)=(='>&>%).13{4r3k2e0_0[0W0 S0P1N1$L1*J10H16F1<E1CD1JB2RA2[@2e>2p=2}<2;1:/9.9,9+9*9),146x6o6h5a3[4V5Q5 N5K5H5!F5'D5-B53A5:@6A>6H=6P<6Y;7c97o86|76655342404/5.5-0478u9l9d8\7V8Q9L9H9E9C:A:%?:+=:1<:8;:?9:F8;N7;X6;b5;m3;z2:1907060402011137:};r;i<a<X;R<L=G=C> @>=>;?#:?)8?/7?65?=4?D3?L2?V1?`0?l.?y->,=+;+:+8+6,5,46:<z>o>f>^?T?M@GABB>C :C8D6D!4D'3D-1D40D;/DB.DJ-DT+D^*Dj)Cw(C'A&@&>&<&:'9'8:=?w@lAcAZBPCJDDE>G9H4I2J0J/J%-J+,J2+J8)J@(JH'JR&J\$Ih#Iu"H!F E C A!?!>"=>@BsChD_DWEMGGHAI;K4M.O ,P*P(P"'P)%P/$P6#P="PF POPZOfNsMLJHFDCBBD|FoFeG\HTHKKEK>M8P0R(V$W"W!WW%W,W3W:WCVLVWUcUqTRPNLJIHFHwIkJaJYKQLINBP;R4U,X$[^ ^^^"^(^/^7^?^I]T ]` \n [} Y WUS Q P OKLsMhM^NVONPFS?U8X0[(^ adff f f$ f+f2e;eDeOd[cibxa_][XWVO{PnQdQ[RTSLUCY;[4_,b$ehkn nnnn&n-n6m?mJlVkcjrigeca`_TvUjUaUYVRXH[?`7c/f'ilo ruuvww w(w0w9vCvPu]tms~qomkih~ZqZgZ_ZX[N_Dc;h3k+n"ruwz}~ ~")2<HVf~x|{xvutx_m_e___UcKg@l7q.u&x{~  "*5@N^ptdkded\gQlGr=w3|)   *5CTf{rjljdmYrNxC~9/% *8I[osplraxVK@6," *9Lawtyj_TI?4*  +<Pf{ߐݠ۬ #,4=EMSY_dhmqv|  (09AHOUZ_dhmrw}#,4<CJPUZ_dhmrw~ '/7>EKPUZ^chlry#+29@FKPUY^cgms{ &-4:AFKPTY^chnv!(/6;AFKOTY^djrz}{ywvutts #*17<AFK~P}U{Zz`xfvntwrpnmlkjji %~,|2z8y=wBvGtLsQqWo]nclkjthfecba```  ~{x u's.q4p9n>mCkHjNhTfZeacias_~][ZYXWWW{wv s p m "k )i /h 5f ;e@cEaK`Q^X\`ZhXrV~TSQP O O O O ztpmk hfc%a+_1^7\<[BYHWNVUT]RfPpN|MKIHGGGG!#}$u$o"j gda^\!Z(X.V4U9S?QEPKNRL[KdInGzFDCBAAAA"%'y(p(j&e%a#^![ X!U!S!%Q!+O!1N"6L"<J"BI"IG#PF#XD#bC$lA$y@#>#=!< ;<<< &)+u+m+f*a(\'X&U& Q&O&L&!J&(I&.G&3E'9D'?B'FA(N@(V>(`=(k;(w:(9'8&7%6#7!7 7 #),|.r.i.b.],X*S+O+L*I+F+D+%B++A+0?+6>+==,D<,L:-U9-^8-i6-v5,4,3*2)2'2&3%3$'+.y0o1f1_1Y/S.N/J/F/ C/A/?/"4;494 74&64,44235925@15H05Q/5[.5g-5s+5*4*2)1)/)-*,*+-13s5i6`6Y6R6J6D7@7<888694929$19*/90.97-:>,:F+:O*:Z):e'9r&9%8%6$5$3%1%0&/14}6p7f8]9V9N9E:@;;<7<3= 1>/>->",>(*>.)>5(?<'?D%?M$?X#>c">p!= <;975 4!347y9m:c;Z;R;K<C>>>9?3A.C +C)D'D&D&$D,#D3"D:!DB DKDVCaCnB}A@>;:987:v<j=_=W>O>H?@A;B6C/F)H$J"J JJ#J)J0J7J?JHJSI_IlH{GECA?=<;>r?f@\@TALAEC>D9F3H,J%MP QQQ Q&Q-Q4Q<PFPPP\ Oi Nx M K I G E C B?{AmBbCYCQDJEBF[5_-c%fil ortvw wxyz${,{5{AzNz]xnwutqonnWdW\WVWM[C_:d0i(l psvy{~ %.9FVg{||j\b\\\T_Id?i5o,s#w{~ %0=M^ribcb[dPiFo;u1{'  %1@Sg~jhcjXpMvC|8.$&5G[qkpavV}K@6+!  &7JaxҏѡϬ  (09AHOUZ_chmrw} $-5<DJPVZ_cgmrx (07?EKQUZ^bgmry $+3:@FKPUY]bgms{'.5;AFKPTX]bhnv ")06<AFKOSX]ciqz~}{zyyy $+17<AFJOSX~^|ezlxuvtsqponnm&,~2}7{<zAxFwJvOtTsZqaohmqk{jhfeddcc |zx!v(t.s3q8p=nAmFlKjQiWg^eecnay_^\[ZZZZ ~ y wt rpm#k)j/h4g9e>dCbHaM_T^[\cZlXwVUSRRQQQ ~wqnl khfc%b+`0^5]:\?ZEY KW QU YS aR kP vN L K JIIIH xpkgdca ^\ Z'X,W2U7T=RBQHOOMWK`IjHuFDCBA A A A }s kfa^\Y WUS#Q)O.N4L9K?IEGMFUD^BhAt?><;;;;; y#o#g#a#\!YVS PNL J&H+F1E6C<BC@J?R=\<f:r98665556 $v&k'c']&X$T"P!M!J G E C #A!(@!.>!4=!:<"@:"H9#P8#Z6#e5#q3#~2"1!0 0001$'r(h)`*Y)T(P%K%G%D% A%?%=% ;%%:%+8%17&76&>5'F3'N2(X1(c0(o.(}-',&,$+"+ ,-"&|)o+e,],V,P+K)F)B)?)<)9)7)5)#3)(2*/1*50+</+D.,M-,W,,b+,n),|(+(*'('&'$(#("%)y,l-b.Z.S.M.G-B->-:.7. 4.2.0.!/.'-/-,/3+/:*0B)0K(0U'0`&0l%0{$/#.","*"(#'$&',v.j/`0W1P0J0D0=1925222 /3-3+3*3%(4+'41&48%4@$4I#5S!4^ 4k4y320.,+**.s1g2]3T3M3G3@3955507-7)8'8&9$9"#9)"9/ 969>9G9Q9]9i8x76420/..~1o3d4Z5Q5J5D6=77839.:(<$= !> >> >&>->4><>E>O>Z=g=v<:975321z4l6`7W7N8G8A8::5;0<+>%@C DDDD$D*D1D9DBDLDX Ce Bs A @ > < : 8 75u7h9]:S:K:E;>;8=3>-@(B!EHK KKK! K' K. K6 J?JIJTIaHoGEDB@>=9q;d<Y=P=I=B>M^q~{zyw`UYUTTLWB\8a.f%kor vy|~  *6EVi_ZZZS\Ha>g4m*r w|!,;L`va`ZaPgEm:t0z&  .?SjbgXmMsB{8-#!2F]sɉɝǫ $-5<DKPV[_chlqx!)18?FLQVZ^cglry $,3:@GLQUY^bgls| (/5;AGKPTX]bgmv #*17<AFKOSX]bhpy%,27<AEJNSX]cj}t{~yxvutssr  '-27<}@|E{IyNxSwYu_sfqooynljihggg~ |zx"w(v.u3t7r<q@oEnJlOkTi[hbfkduba`^]]\\|yusqom#l)j.i3h8f<e@dFcKaQ`W^_\h[rY~WVUTSSS { t omk hgec%b*`/_4^8\=[BZGXMWTU\SeRpP|NMLKJJK ~tmhd ca `^\ Z&X+W0U5T:S?QDPKNRMZKdInG{FECCBBB xnga^[Z YVTR"Q (O -N 2L 7K <J BH IF QE YC cA n? {> = < ;;;;sib\XUSQPMKJ$H*F/E4D:B@AG?O=X<b:m8z76544 4 4 |oe^XSPMKH FDB!A&?,>1=7;=:D8L7V5`4l2y10/..//xl!b"Z"T"O KHEB @><:#9)7.645;3B2J1T/^.j-w,**))**u"i$_%W%Q$K#G"C @ = :864 3 &1 ,0 2/!9.!@-"H+"R*#])#i("v&"%!%$$%%!r$f&\'T'M'H&C%?$;$8$5$ 2$0$.$,$#+$)*%0)%6(&>'&F&'P%'[$'g"'u!&!% # ! ! }$o&c(Y)Q)K)E)@(;(6(3(0(-)+)))')!&)'%*.$*5#*<"+E!+N +Y+f*s*)'%#"!#z&l)`+V+N+H+B+=+7+1,.,+-(- %.$.".!.% .,/3/:/C/M/X/d/r.-+)'&%%w)i+]-T-L-E-?-:-4.//+0&1#2 3333#3*40484A4K4V3b3p21/-+*)(s,f.Z/Q/I0B0<07012-2(3$578999!9'9.969>9H9T 8` 8n 7} 6 4 2 0 . -,o/b0W1N2F2@2:253/4+5&7!9;> ??? ?% ?+ >3 >;>E>P=\=j @CE HK KKKK%K,K4K=JHJTIcHrGFCB@>p7b9V9M:E:?:::5;.>(@"CFILOP QRRS!S(S0R9RDRPQ^PnOMLIGFj;]<R=I=C===9=1@*D$GJMP RUW X XYZ[$[,[5[?ZKZYXiW{UTRPOe@Y@O@G@A@=@5C.G&K NQT WZ]__ `abcd&e/e9dFdTccav`^\[X_DTDLDFDAC:G1K)O"SVZ ]`beghi jklm!o)p4o?oNn^lpkigfeZIQIKHFH?J6O-T$Y\` cgiloqrst vwy{"}+~7}E|V{hy}wusrWNPMLLDO;T1Y(^cg knrtwy|} #/=M`uVSRRKTAZ7_,e#jpsw{~ &4DWlXXRYG_=e2l(rx}  *:MbzY_OdDk:r/z%,?Um!)18?FLQV[_chmsz %-4;AGLQVZ^chnt|!(/6<BGLPUY^bhnv $+17=BFJOTX]bipy&,28=AEINSX]cjs}~|zyyxx !'-27<@DI~M|SzXy^weunsxqonllkkk~|{"y(x.w3v7u<t@rDqHpMoSmZlajihsfdcaa``_}xu rpon$m)l.k3j7i;h?gDeIdOcUa]_e^o\|ZYWVVUUysoki gfec%b*b.`3_7^;]@\EZKYRWYVaTlRxPONMLLLzqjeca_]\[ Z%Y*W/V3U8T<RAQGONNVL^KiIuGFEDDCC t j c^ [ YX VUSR"P&O+M0L4K9J>HDGKESD\BgAs?>=<<<< znd]XTR P O NLJI#G(F,E1C6B<AB?I>R<[;f9r8665555 ui`YSOLJH G E C B @ %? )> /< 4; :: A8 H7 Q5[3g2s0/ . . ...qe\UOJFDBA?=;:!8'7,62483?1G0P.Z-e+r*)('' ( ( |nbYQKFB?=;9 7532$0)//.5-<+D*N)X'd&p%$#"""#yk_V N H C>;853 1/-,!*')-(3':&B$L#V"b!o~vh\!S"K"E"?!;!7 30.+ )'%$$# *" 1!!8 !A!J"U"a!n!} se"Z#P$H$B$=$8#4#/#,#)#&# ##"$ $$"$(%/%6%?&H&S&_%m%|$" o!b$W%M&F&?&:&5&1%,&''$'!(())) )&)-*4*=*F*Q*^*k)z(&% "! | l$_&T'K(C(=(7(3(.())%*!+,- ....$.+/2/;/D /O .[ .h -w ,+)'% $y#i&\)Q*H*@*:*5*0*,+&,#,.02 34 4 3" 3( 30383A3K3X3e2t1/.,*(t&e)X+N,E,>,8,3,.,*-%.!0246 9 9999&9-949=8H8T8b7p6531/.p*a-U.J.B/;/6/1/-/(0#2468 ;> >???#?*>1>:>E>Q=^ @C DDEE E&E.E7EADMDZCjB{@?<;:f1X3M4D4=47434/4(6"9<>A DGIJ KKLM#M*M3M=LHLVKeJwHFEBA`6T7I7A7;76626,9%<?BE HKMPQ RSTUV&V.V8UCTQTaRsQOMLJ[:O:F:?::969/<(?!CFJ MORUWXZ [\]^!`)`3_>_L^[]m[YWVUU>K>C>>=:<3?+C$GKO RUX[^`abd efhi$k-k8jEiUhgf|eca`QBHBBA?@8C/G'LQUY\_begiklno qsuw&y1x>wNv`utrpomNGHFDE=G4L+R!W\`dgjmpsuwxz|~(5EWk~MKIJCL9Q/W&]ch lotwy|  -<NczOPJQ@W5]+d!jp uy} $3EZpQVG\==<<vi ` Y U QONL KJIH"G&F+E/C4B9A>@E>M=V;`:l8y766555p d[TNK H GF DCBA?#>'=,<1;69<8B7K5T4^2j1w0//...y k`WOIEB@ ? > =<:9 7$6)5.443:1A0I/S- ^, j*w)((((( ug\SKEA=;98 7 5 4 2 1 "0 '/ ,- 2, 9+ @)I(T&_%k#z" " ! """ rdYOHB=964310.,+*$(*'0&7$?#H"R ]jx   naVLE?:620-+) (&$#""(!. 5=FP\iw|k^SIB<73/,)&$" %,3;DOZgvxh[PG?940,)%! # * 1 9!B!M!Y!f t      ueXM D!=!7!2!. * & " ""# #$$$!$(%/ %7 %@ %J %V %b$q$" qbV!K"B#:#5#0#+"'"$"#$%'( ) ) ) )%),)4)<)G)R)_)n(~'%#!n_"R#H%?%8%2%-%)$%$"%&'(* - ....#.).1.:.D.O.\-k,{+)'&$j"[$O&E'<'6'0'+''&$' ')+,/1 2333 3'3.373@3L3Y2h1y0/,*)e%W'K(A):)3).)*)&)#)+-/1 36 7 8999$9+949=9H8V8e7v5430/a)S*H+>,7,1+-+)+&+ -024 69;< =>?@!@(@0@:@E?R>a=s<:985\,O-D.;.5.0.,-)-#/257 9<?AB DEFGH$H,H6GAGNF]EnCA?>>V0J1@19131/0,/&2 58;=@CEHIK LMOP Q(Q2P<PIOXNiL~KIGFQ4F4=47423/2)5"8<?B EHKNPQST VWY[#[-[7ZDZSXdWxUSQOL8B8;86736-8&<@DG KNQTVYZ\]_ aceg'g1g>fLe^cra_]\G<@<:;7:1<)@!DIN RUX[^acdfhik mor!u+t7sFrXqkoljiE@??<>6@-E$JOT Y]`cfilnprtvxz |#/>Ocy}{yDEACCHMQUY^djs~ '-39>BGKOTY^dkv~| "(.49=AEJNSX^en{~|{yvsq#).38<@D~H|M{SyYx`vhtsrpomkjhg|y xwvu$u)u.t3s7r;q?oCnHmMkTj[hcgme{cba_^]\ysomkjih h%g)g.g2f6d:c>bCaH_O^V\^[gYuWVUSRRRvnhdb` ^^]] \%\)\-Z1Y5X:W?UDTJSQQZPcNpM~KJHHGGyme_[XVU TSRR Q%Q)P-O1N5M:K@JFIMGVF_DlCyA@?>>>pf]VRONL KJIIH!H%G)E-D2C6B<@B?J>R=\;h:v977666zj_WPKHFDC BA@??!>&=*<.;3:98?7G6O5Y3e2r10//..sfZ Q J E A ?=<; :9877"5'4+30261=0D/M-X,c+p*)((((n a VMF@<9 7 654 3210/$-(,.+3*:)B(K'V%b$o#~""!""{j ^RIB<8420 / . . ,+)(!'&&+%2$9#A! K U b o~w gZOF?941.+)( ( & % # " ! $ * 1 8ALWdq  t dWLC<61-*'%#"  #)07@JVbp  qaTI@93/*'$!  '.5>IT ` m }     m^RG>71,($!  $ + 3 ; EP]jzj[OD;4/*&"   "( 0 8 B M Z hwgXLA92,($  ! ####$&$-$5$?$J$W$e#u"!cUI? 6 0 * &" ! # %' (())#)*)3)<)G)T(c(s&%$! `RF!<"4"-"("$!!!  "#% ')+ ,-..!.(.0.9.D.Q-`-p+*('$[ N"B#9$1$+$&### ""$&' ),.0 12444%4-464A4N3]2m1/-,,W#J%?&6&/&)&%%"% $&(* ,/145 7 8:;;";*;3;>:J:Y9j8}6421R'E(;)3)-(((%'#&)+-0 257:;= >@BCC&C/B:BFAU@f?z=;:8L+A+8,0+++(*&) +.14 69;>ABDE GIKM"M+L5LAKPIaHuGDBAG.=/5//.+-),#.158 ;=@CFHJLNP RTVW&W1V=UKT[RpQNMKB29232/1,/'1 59= @CFILORTVWY[ ^`c!d+c7cEbU`i^\YX>6763503+5#9=B FJMQTWZ\^`bdfh knq%r1q?oOnblxjhf<:794809'=BH MRVY\`cfhjlnprux {)7G[}pzyu<>9<5=,B"HNTZ^cfiloruwy|~  .?Rg~>A;A1G'NU[agkpswz} $4G]sAF7L-T#[b iouy~+>Si %,39?DIMRV[`flt~!'.4:?DHLQUZ`fnw~ #)/49>BGKOTZ`hp{}xt$*/48=AEJOTZa}j|uzxvutqmj ~||{%{*{/{3{7y;x?wDuItNrTq[odmnlzjhgfeb`}wsponmm m%m)l.l2k6j:h>gCfIdOcVa^`h^t][ZYXVUxojfcb a``` `%`)`-_1^5\9[>ZCYJWQVYTcRoQ}ONMMKJwld^[XVV UUTT T$S(R-Q1P5O9N?LEKLJUH^GjFwDCBBA@|nd[UQNML JJIII I$H(G,F1E5D;BAAH@Q>Z=f<s::9877tg\SMIFDBA A@@@? ?$>(=-<1:79=8D7M6W5b4o210///naVMFA><;:9 88776!5%4)3.231:0A/J.T-_,l+}*)(((yi\QHA<854321 00/.-",&+++0*7)>(G'Q&\%k$z#"!""teW L C < 7 3 0 .,+* ) )('&&#%($-#4"<!E OZhwpaS H @93/, ) ' % $$ #"!  %+2:CMZgvl^ PE=60,(%"    #)09 B M Y gui [ MB:3-)%!       " ) 1:D N Z g v  f XK@70+&"    ' . 6?JVds  cUH=5.($    $+3<GTbq`RE;3,&"   !(1:EQ`o]OB80*$   &. 7 B O^mYK?6.'"   ! "#$$$$,$5$@$L$Z#k"}!VH<3+%  !# % ')))")))3)=)J)X(i'{%$"!QD90)# "$&(* ,.///'0/0:/F/U.e-y,*(&M@ 6!-!'!"  ! #%'),.0 2 4677#7,666C5Q5a3u20.-H"<#2$+$%#!"! !$& (+-02468 : <>? ?)>3>>=M<];q9864C%8&/&(&$%!$#$'* ,/2479;=?A CFII$H/H:GHFYDkB@>=>)4*-)'($'"&'*- 1469<?ACEGJL NQT S*R6QDPTOfM}KJG9-1-+,'+%) *.2 59<?BEHKMOQSVY \_a$`0_=^M\`ZuXVT61/0+/)-$.27 ;?BFJMPSUXZ\^acfimo*n7mGlYkmhfd44/3-1)2 7<AFKNRVY]`bdgiknqtw{#0@~R{fx~vt4826.6%;AGMSX\`cfimortvy|(7J^u7;4:*@!FM U[afimqtwz}.@Uk:?0E&LT[bintx| $6J`u  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./012456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~Q՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԜfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԜgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԜgԜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜e՜eԜfԜfԜfԜfӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜eԜeԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜eԜeԜeԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgQ՛d՜d՜dԜeԝeԝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՛d՜d՜dԝdԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՜c՜d՝dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՜c՝c՝cԝdӝeӝfӝfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛fԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛fԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMiY՛e՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMiZ՛e՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMjZ՛e՛e՛eԛfԛfԛfԛgԛgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMjZ՛e՛e՛eԛfԛfԛfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMkZ՛d՛e՛eԛfԛfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMkߜZ՛d՛e՛eԛfԛfԜfԜfԜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgLlޜ[՛d՛e՛eԛfԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgLnۛ]՛d՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgLo؛a՛d՛e՛eԜeԜeԝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgLr՛d՛d՛e՜eԜeԝeӝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgKu՛d՛d՜d՜dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgK}՛c՜d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgL՛c՜c՝cԝdӝeӝeӝfӜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgM՜c՝bԞcӝdӝeӝeҝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՚e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJQT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJQT՛e՛e՛eԛfԛfԛfԛfԛgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIQT՛e՛e՛eԛfԛfԛfԜfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIRT՛e՛e՛eԛfԛfԜfԜfԜfԜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIRT՛e՛e՛e՛fԛfԜfԜfԜfԜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgISU՛e՛e՛e՛eԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgITU՛d՛e՛e՜eԜeԜfԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgHVU՛d՛e՛eԜeԝeԝeӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgHWU՛d՛d՜dԝdԝeӝfӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgGZU՛d՜d՝dԝdӝeӝfӝfӜfӜfӜfӜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgI]V՛d՜cԝcӝdӝeӝfӝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgJfߞX՜cԞbӝdӝeӝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgKqP՞`ԞcӝdӝeҝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QjZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QjZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QkZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QlZ՚e՚fԛfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgHQr[՛e՛f՛fԛfԛfԜfԜfԜgԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG>Qs[՛e՛e՛fԛfԜfԜfԜfԜfӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF?Qtߛ\՛e՛e՛eԜfԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF?Qvܛ^՛e՛e՛eԜeԜeԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgF@Py؛b՛e՛e՜eԜeԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgEAP|՛d՛e՜d՜dԝdԝeӝfӜfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgDCP՛d՛d՜d՝dԝdӝeӝfӝfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgDDP՛d՜c՝cԝdӝeӝeӝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgEFP՜c՝bԞcӝdӝeҝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgGMMߥOԞbӝdӝeҝeҝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgHWH#6BʻLʷRʴWʲZʱ\ʰ^ʯ_ʯ`ʯ`ʮaʮaʮbʮbʮbʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OQW^՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OQWߙ_՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG+ORWޙ`՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG+OSWݙa՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OSWܙa՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OSWۙb՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWښb՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWٚc՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWؚd՚fԚfԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,NUW֚d՚f՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,NUW՚e՚f՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF-NUW՚e՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF-NVW՚e՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE-NVW՚e՚f՛fԛfԛfԛfԛfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE-NWW՚e՚f՛f՛fԛfԛfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE.NXW՚e՚e՛e՛fԛfԜfԜfԜfԜfӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE.NYW՚e՛e՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD.NZW՚e՛e՛e՜eԜeԜfԝfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD/M\W՚e՛e՛e՜eԜeԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC0M^W՛e՛d՜d՜dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgC1M`X՛d՜d՜dԝdԝeӝeӝfӜfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgB2LdX՛d՜c՝cԝdӝeӝeӝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg@3LhT՜c՝bԝcӝdӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgA4JiNۧKԞcӝdӝeҝeҝfҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgC6Jhߴ@+;DKǽQǻUǹXǸZǷ\Ƕ]Ƕ^ǵ^ǵ_Ƶ`Ƶ`ƴ`ƴaƴaŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbE==]o)w3}TeZۙcԚfԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM>TfZٙd՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM>TgZؙd՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM?ThZ֚e՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM?ThZ՚f՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM?TiZ՚f՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@TjZ՚f՚fԛfԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@TjZ՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@Tk[՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE LATl[՚f՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE LATl[՚f՚f՛fԛfԛfԛfԛfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgE LATm[՚f՛e՛f՛fԛfԜfԜfԜfԜgӜgӜgӛgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD LBTo[՚e՛e՛e՛eԛfԜfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD LCTp[՚e՛e՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD!LCTr[՚e՛e՛e՜eԜeԜfԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC!KETt[՛e՛e՜e՜eԝeԝeӝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC!KFTw[՛d՛d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgB"KHT{Z՛d՜d՝dԝdӝeӝeӝfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgA#JJSX՜c՝cԝcӝdӝeӝfӝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg@#ILO{S՜bԞbӝdӝeӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg?$HPLvLحBԢ\ӝdҝ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<%FFGp(0>FLQTVÿXÿZþ[¾\¾]¾]¾^^___```````````?#CF`#o.x6|>EJNRTVWXYYZ[[\]^^^^^^^^^^^?$ = K+S4X;^@dDiHmIpLsNuPwQxRzTzU{V|W}W}X~Y[[[[[[[[[[[;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_՚fԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SIXk\_ԚfԚgԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԛhԛhԛhԛhԛhԛhԛhԛhԛhԛhԛh<M,SJXl\`ԚfԚfԚgԚgԚgԚgԚgԚgԚgԛgԛhԛhԛhԛhԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛh=M,SKXn\aԚfԚfԚgԚgԚgԚgԚgԛgԛgԛgԛgԛhԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh=L-SLXo\aԚfԚfԚgԚgԚgԛgԛgԛgԛgԛgԛgԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh>L-SLXp\ޘbԚfԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh>L-SMXq\ۙc՚fԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SNXr\ٙd՚fԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SNXt\֚e՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SOXu\՚f՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh@L.ROXv\՚f՚fԚfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh@L/RPXv\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhAL/RPXw\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhAL/RQXx\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӜhӜhӜhӜhӜhӜhӜhӜhӜhAK/RRXz\՚e՚f՛fԛfԛfԛfԛfԛgԜgӛgӛgӛgӛgӛgӛgӛgӛgӜgӜhӜhӜhӜhӜhӜhӜhӜhӜhӜhBK0RRX{\՚e՛e՛e՛fԛfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgBK0RSX|\՚e՛e՛e՛eԜfԜfԜfԜfԜgӜgӜgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgCK1RTX~[՚e՛e՛e՜eԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgDK1RUW[՛e՛e՛e՜eԜeԜeԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgCJ2RWW[՛e՛d՜eԜeԝeԝeӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgCJ3RYVZ՛d՜d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgBJ4Q[TY՛d՜c՝cԝdӝeӝeӝfӜfӜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgBI5O[QV՜c՝cԝcӝdӝeӝfҝfҝfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgAH7KXL|P՝aԞbӝdӝeӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg?G9GNL{߭Gֶ<ҫOѦZѤ^ѤaУbФbФcϤcϤcϤcϥdΥdΥdΥdΦdΦeͦeͧeͧeͧeͧeͧeͧeͧeͧeͧeͧe>@/HNAr2>GMQTWYZ¿[¿\¿]^^__``aaaaaaaaaa;B*>Ja(n1w9|@GKORTUVWXXYZ[\\^^^^^^^^^^;;*>$L/T7Z=^BbFeGgHiIkKmMoOpPqQrSsTtUuVuWvYwZx[x[x[x[x[x[x[x[x[x9".*63;9@;D=I?MAQCTEVGXIZK[M\N]P^Q_S`TaUaWbYcZcZcZcZcZcZcZcZcZc. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cۗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. @P5WN[h]_c՚gԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. AQ6WP[j]_ߗdԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚi/ AR6WQ[l]_ۘeԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚi/ BR7WR[n]_יfԚfԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 BR7WSZp\_ԚfԚfԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 CR8WTZr\`ԚfԚfԚgԚgԚgԚgԚgԛgԛgԛgԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 D R9WUZt\`՚fԚfԚfԚgԚgԛgԛgԛgԛgԛgԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 D R9WVZv\ߘa՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 E Q:WVYw\ݙb՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 E Q:WWYy\ۙc՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;WXYz\ٙd՚f՚fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;VYY{[֚e՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;VZX}[՚e՚f՛fԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӜhӜhӜhӜhӜhӜhӜhӜhӜh3 G!QT]WZ՚e՛e՛e՜eԜeԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh4 J"Q?T]VZ՛e՛d՛e՜eԜeԝeԜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg5 J#Q@S^UY՛d՛d՜d՜dԝeԝeӝfӜfӜfӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg6 J#PAR^TW՛d՜d՜dԝdԝeӝeӝfӜfӜfӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg7I$OAP]QU՜c՜c՝cԝdӝeӝeӝfӜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg9I%L@L[MzQ՜b՞aԝcӝdӝeӝfҝfҝfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg;H&I=HSMzMڪHԞaӝdӝeҝeҝfҝfҝfҝfҜfҜfҜfҜgҜgҜgҜgҜgҜgҝgҝgҝgҝgҝgҝgҝgҝgҝg>G&C6IOIwܹ<5ϸEγOͰU̯Y̮[̭]˭^˭`˭`˭aʭbʭcʭcʭdɭdǭdƮeĮfĮfĮfĮfĮfĮfĮfĮfĮf?@ C+EP3n!1>FLPTWYZ\]^^_`abcddddddddd=;A.,J!^,k4t;zB~HMPSTVWXYZ[\]_`bbbbbbbbb3<+,>(K2S9Z?_DcFfHiIkKmMnOoPpRqSrTsVtWtYuZv\v^w_w_w_w_w_w_w_w_w8.#$.-65=:BWWZr\^ޘcԚfԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛiӛiӛi~%7G)U?WXYt[]ۙcԚfԚfԚgԚgԚgԚgԚgԛhԛhԛhԛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛiӛi%7G)U@WYYu[]ؙd՚fԚfԚgԚgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛi&7H)T@VZXv[]՚f՚fԚfԚfԛgԛgԛgԛgԛgӛhӛhӛhӛhӛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛi&8H*TAVZXwZ]՚f՚fԚfԛfԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhқiқiқiқiқiқiқiқi&8H*SAU[XxZ]՚e՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhқhқhқhқhқhқhқhқhқh&8I+SAU[WyZ\՚e՛e՛fԛfԛfԛgԛgӛgӛgӛgӛgӛhӛhӜhӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh&9I+RBT\WzY\՚e՛e՛eԛfԛfԛfԜgӛgӛgӛgӛgӜgӜhӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh'9J+RBT\VzY\՛e՛e՛e՛eԜfԜfԜfӜgӛgӛgӜgӜgӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh':K,QBS\UzX[՛d՛d՜eԜeԜeԜfӜfӜgӜgӜgӜgӜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh':L,PBR\TzWZ՛d՛d՜dԜeԝeԝfӜfӜgӜgӜgӜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh(;M,OBQ[SyUY՛d՜d՝dԝdԝeӝfӜfӜfӜgҜgҜgҜgҜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜh(<N,NAOZPvSW՜c՝cԝcԝdӝeӝfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜh)=L+L@LWMqPR՝bԞbԝdӝeӝeҝfҝfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg*>J*H=HQMnOߩLبKӞcӝdӝeҝeҝfҝfҜfҜfҜfҜgҜgҜgҜgѝgўgϠhΡhΡhΡhΡhΡhΡhΡhΡh+@F(D7IILoH0ҸAаNϬWϩ[Ϩ^Χ`ΧaΧbͧcͧdͧd̨ęf˩fʪgȫhūi¬j¬j¬j¬j¬j¬j¬j¬j-CA#C-ILDl0>GǿNǼSƻWƺZŹ\Ÿ^Ÿ_ķa·abcdfgikkkkkkkk/@;D-@Le'v0=.F%X/e7n=tByH}MQSUVXY[\^`bdgiiiiiiii47:+";,H4Q;X@]EbGeHhJjLlNnQoRpTqVrXsZt\u_vavdwfwfwfwfwfwfwfwfw07"'.067=;B=G?KANCPESFTIVKWMXOYQZS[U\X]~Z^|\^z__yb`yb`yb`yb`yb`yb`yb`yb`4 !*,%/*2.427598<:><@=~B?|D@zFAxHBwJBuLCtODrQEqSFoVGnXGl[Hl[Hl[Hl[Hl[Hl[Hl[Hl[H  "%)-"z0$w3%s5'q7(o9)m<*l>+j@,iB-hD.gG/fI0dL1cN1bQ2`T3`T3`T3`T3`T3`T3`T3`T3h#g+ m9qD$yM4UE[U`cdogyjlnoqqrsstuvwyyzzzzzzzzh#g+ m9rD%zM4UE[U`ddpgzjlnoqqrsstuvwyyzzzzzzzzi#h+ n9sD%}N5VG\X_gctf~ikmopqrrstuvwxyzzzzzzzzi#j+ p9tE&N7VI\Z^jbwehkmnpqqrstuvwxyzzzzzzzzj"k+ q9vE'O8WK\]^m`{dgjlnopqrrstuwxyyzzzzzzzk"l, s9xE(O:XM\_^p_cfikmnpqqrstuwwxyzzzzzzzl"n, t:|E)P;YO[b]s_behjlmnpqrstuvwxzzzzzzzzm"o, v:F*QXSZh\}]_begݗhڗiؘiטi֘j֘jטlؗnؗpؗrؗtؗvؗyؗ{ؗ{ؗ{ؗ{ؗ{ؗ{ؗ{o!s- z;H,U?WTYj[]^beܗfؘgԚgԚhԚhԚhԚhԚiԚiӚjԙmՙpՙsՙvՙxՙxՙxՙxՙxՙxՙxp!t- {;H,T@VUYk[\^aݘe֙fԚgԚgԚgԚhԚhԚiԚiӚiӚiӚiӚkӚoӚsӚuӚuӚuӚuӚuӚuӚuq!u- |;I,S@VUXlZ\^aٙeԚgԚgԚgԚgԚhԚhԚhӚiӚiӛiӛiӛiқlқpқrқrқrқrқrқrқrr!v- ~<J-S@UVWlY[]ߙa՚fԚfԚgԚgԚgԚhԚhӛhӛiӛiӛiӛiқiқiҜnќqќqќqќqќqќqќqr!w- <K-R@TVWmY[]ݙa՚fԚfԚfԚgԛgԛgӛhӛhӛhӛiӛiқiқiқiќmќoќoќoќoќoќoќos x. <L-Q@TVVmXZ\ܚa՚f՚fԛfԛgԛgӛgӛhӛhӛhӛhқiқiқiқiќmНoНoНoНoНoНoНos y. <L-Q@SVUmWY[ښa՛e՛fԛfԛfԛgӛgӛgӜhӜhҜhҜiҜiҜiҜiНmОoОoОoОoОoОoОot z.=N-P@RUTlVXZٛa՛e՛e՛eԜfԜfӛgӜgӜhҜhҜhҜhҜiҜiҜiОmϟoϟoϟoϟoϟoϟoϟou {.=N,O?QTSkUWYٜ`՛d՜dԜeԝeӜfӜgӜgҜgҜhҜhҜhҜhќiѝjϟnΠpΠpΠpΠpΠpΠpΠpu |.>M,N?OSQiSUWڝ\՜c՝cԝdӝeӜfҜgҜgҜgҜgҜhҜhҜhѝiϠl͢p̢q̢q̢q̢q̢q̢q̢qv ~/>L+L=MQOfP{RTܡV՝bԞcӝeӝeҜfҜgҜgҜgҜgҜgҜhѝhϠḳn˥rʦsʦsʦsʦsʦsʦsʦsw /?J*J;KNMaPwQQۧNա\ӝdӝeҝfҝfҜfҜgҜgҜgОgΠi̢jʥmȧpŪu«x«x«x«x«x«x«xy0AH)G8HINZOyNܰGմBҬQѧ[Ѥ`ѢcТdТeϢeϣfΤg˥hȦiƨlêo˿rɻwƹzĹzĹzĹzĹzĹzĹzz0BE&C3I@M]KyݸB5нBͷM̳T̰Y˯]˭`ʭbʬcɬeƭfĮhƿjźlķp´sy{{{{{{{|1DA!C+IAI^ݿA*2C#X,g4s:|CJOSWZ[]_bdgkotxzzzzzzz!46=0*?)O2[9d?kDpIuNxP{S~UWZ\_behlpvxxxxxxx /9/'%7.B6L<@=~C?{F@yHBwKCuNDsPEqSFoWGmZHk]IjaJheKggKggKggKggKggKggKggK  $(,"~0$y3&u6(r8*p;+n>,l@-jC.iF/gI0eK1dO2bR3`U4^Y5\]6\^6\^6\^6\^6\^6\^6\^6  { up l$i(f+c.a0_3^6\8[;Y>WAVDTG SK QN!OR"NT"NT"NT"NT"NT"NT"NT"]%W*T3 Y?eG"oN0vV=z\H|aR~fYj`md~ph}rk}tm|wn{yo{{pz}qzryrxrxqxpxoxnylylylylylylyl]%X*V3 Z?hF$sN1yU?}[JaTe]iclholqotqvs~xt~zu}|v|v|v{vzv{u{s|rzqzqzqzqzqzqzq^$Y*W3 ]>lF%vN3|T@[M`We`igllopqssvuwwyyz{z~{~{~{}z~y~w~v{v{v{v{v{v{v{v_$Z*Y3 a>oF&zN4TBZO`Zecijlpntqxszu|v}xz}}|{|{|{|{|{|{|{|{`$[)Z3 e=tF'~N6UDZQ`]dghnkunyp}rtuwy|~󁍁}}}}}}}a$\)\3i=xF(N7UF[T^`ckgsjzmoqstvxz}󉃉񆈈b#])^3m=}F)O9VH\W^daofxilnqrstvxz{}툈녎肕肕肕肕肕肕肕c#^(`3r<F*P:WJ[Y]g_sd}hknpqstvxy{|鎁苇戎䅗䅗䅗䅗䅗䅗䅗d#_(b3v<G+Q;XKZ[]i^vafjmoqrtvxy{}厄㋋ቓ߆߆߆߆߆߆߆d#`(f3z<G+RL*N9PIRZTkV{XY[\^۞cћjОmΟr͡vˡ{Ȣšßj!g&}1>K)L8NHPXRhTwUWYYުXԨ]Сf̢jʥqɥvŦ}¥k!g&1?J(K6LENTPcSpU|VUܲQӳRϬ]ͧeɦiŨnvʼƻk!i&1@H&H4IBLOQ\SkSRڼHҾJͶU˱]ʬcƫgʿlɺsƵ}òl!l%1AF$F1G=MHPXQnN>BMɻVǶ]Ƴbf»kqym q%1BC!B,I6MEN\Jp/:ENVü\¹aeinvo v$1 B?C%I1KHE^+p1=GPV\`cgms{p |#2 >=DG4AJ(^/n6{@HPV[_bfkqxŁƌǙƣr"29 >C >6$J,[4i:sA|IPVZ]adiov}͇ΑΝyϫyϫyϫyϫyϫyϫyϫt!28>;#7(H0V8a>jDqJwP|TWZ^bflrz؂׋y֕t֡t֡t֡t֡t֡t֡t֡|199##4,B4N;WA_FeKjMnQqTtXw[y_{c|h}n~u~~}}{|v~ppppppp27!(/0:8D>KCQEWG[J^MaQdTfXh\j`kdl{inxonuvns}nqmnmnmnmnmnmnmnm3 "+'4097;==B@GCJEMIPLRPTSU}WWz[Yw_Ztd[qi\no]ku]h{]f]f]f]f]f]f]f]   $)-#0)4.73:6=9@;}D=zG?wJAuNBrQDpUEmYFj]HhbIehJbmK_rK\zK\zK\zK\zK\zK\zK\zK  !&*/#{2%v6(r9*p<+m@-kC.iF/gJ1eM2bQ3`V4^[5[`6Ye7Vj8Rp9Rp9Rp9Rp9Rp9Rp9Rp9Կ  zto$k(h,d/b2_6^9\<Z@XC VG!TK"QP#OU$MZ$K_%Ge&Ge&Ge&Ge&Ge&Ge&Ge&}slg b^[ X U# S& P) O-M0K3J7H:F?DCBH@M>RmF%sM0vU;x[EyaMyfSxkXxo\ws_vwbu{ct~esfrfpfpfqfqercockchcgcgcgcgcgcgcV%Q+K1 Y6h>rF&yM2{S=}ZH~`P~eW}j]}na{rezvgxziw}kvlultmtlulujuipjljiihihihihihihiW%R+O0 _5n=xE'M4S?XJ_Td[ibmgqj~um}xp||qzrysxsysyrzpuqqqmpkpjojojojojojoX%S*S. d4s<~E(M5SAYM]Wc_hfllpptswv{x~y}z|z}y~wzxuxqxowlvkukukukukukuY$T*W, i3x<E(M5TBYN]Yabgjkqousyv|z~~zvs~p}o{nznznznznznzZ$U*Z+m2}<E(N6UCZO\[_edniun{ruy~􆆆逗zwttt€tttttt[$V)^*r2;F(O6VCYP[\^gapgxlqtx}򊁍팄膐‡{yyyyyyyyyy\$W)a(v1;F(Q5TBWPZ\\h_rd{kpsw{捇ڀ~~~~~~~]#X)e'y1<G'P4SAVOX\[h]s`}hpsy}䑂ފׄх̆ȅĄ„]#Z(h'}0<H&O3Q@TMWZYg\r^}eotz㐁܎Ӊ͊ȋŋŠ^#\'k&0<I%M1O>RKUXWdZp]{`lt~؍ΏȐĐ_#^&n%0<J$K/MDG'K1N9R@UFVUTcTr^el}a"h#{#0 >CG#K*N0P;PKFZFiOwYaitˆb"k!"0 ?BGK"L/K?9O>^DlLxV_fo~ǐãc!o "/> BGH!F2/C7R>`DlLwU]dkw̘ͅzȩe!t /> B DB$)50E7S>_EjLtU|\ahqӍwҠrͰw{~g!z0=A>!'*72E9R@]FfLnTuY{_elw܅wړm٦hԸmȹpsuuuuuum3<; #(,74D;OBXH`MgRlWq\vbyi|q~{|}x|ofੁ`ݾbf€hhhhhhu38 &(/57?=ICQHWK]ObTfYj_meo{lqwursrpphs`uYvYvZvZvZvZvZvZv~0& )%2099?ABHDMHRLVQYV\[_|aawgcsnenwfjefdae[gTiQiQiQiQiQiQi   #, 4)70:7=<@ADEHHMK|RNxVPu[RqaTmgUioWdxW`W\WYVTWQXQXQXQXQXQX ֿ  !'+ 0&4+80<3~?7zD9vHpQ@lVAi[CfaEbgF^oGYxHUHQHMHKGKGKGKGKGKGغ  "',{0"v5%q8(n=*kA,hE-fJ/cN0`S2]Y3Z_5Vf6Qn7Mw8I8E8C9C9C9C9C9C9ڴ} vq"l'h,d0a4^8\<Z@WD UI!RO"OU#L[%Hc&Dk'@s'<}(:(:(:(:(:(:(Ͻyojea] Y V$ S( P,N0L4J9H=FBCHAO>V:]6d3l1r1r1r1r1r1rznf_YT PLIFC@">&<):.83684>2D .K +R (Y '] '] '] '] '] '] G)B0<7>9A> KFROVW"W^(Xe-Xl1Wr4Vx6T~8R9Q:O;M;KP>M?K?K?L>L>M=M5B7H< RDXL\T%^\,_c1^j6]p9\vY?W@UASBQBNBOBOBPAQ@Q?Q>N>M?L?L?L?L?L?J(D/A4E5M: WB]J`S'bZ.cb4bh9an=`t@^zB]C[EYEWFTGSGSGTFTEUDVBRCQDPDPDPDPDPDPDK(E.D2I3 R8\@bH eQ)gX1g`7gf=fmAdsDbyFaH_J]K[KYLXLXLYKZJZHXHUITJQJPJPJPJPJPJL'F.H0M0 X6b>gF"kN+lV3m^:le@jkEiqIgwKe}MdObP`Q]Q]Q^Q^P_O^NZOYPUPSPSPSPSPSPSPM'G-K.R. ^5h=nE#qL-rT5r[=qbDpiInoMluPj|ShUfVdWcWcWcWdVdT_V]WYWXVWVWVWVWVWVWVN'H-P,W,d3n<uC$xK.xQ7xY@w`GugMsmRqtUozXlZk\h]i]h]i\i[e\b]^]]]\\[[[[[[[[[[[[O&J,T*\*j2t:{B$J.P8~VB}^J{ePykVvrZty^q`obmcmcmcnbkbgccdadacabbabababababaP&M*X(a(p1{:B$J.P9UC[KcSjY|p^xxbuerhqiqiqhpgjjfjejfighgggegegegegegeQ&P)\'e'u09A#I.P8UCZL`Uh\ob}wgykumtotoumnojpjqkplnlmlklilililililiR%T'_&j&z/8A"J,P7VBZL]Ue^nevk~oyrwtvsstnvowpvqtrrrpqnqlqlqlqlqlqlS%V&b$n%~.8A J+R6U@YK\Ua^kftm}s}wwywxr{t|u|vzwxwvwsvquouououououoS%Y%e#r$. 8BL)Q3U>XH[R_\ifro|v~|txz{|€}~|{|x{vzszqzqzqzqzqzqT%[$h"u#- 7DM&Q0T:WDZN^Xfcrnٍz̈́~zxu}r}r}r}r}r}rU$^#k!y", 8FL#P,T5W>ZG^Pd^եnoȚ|||yvssssssU$`"n |!, :HLP'S.V6Y=\J^]dzinu}}zwttttttV$b!q ,<HLO!S&U+W3OHY[dmo|~{xuuuuuuW$e t-> HKOQR!G0MDVX`jkzyt{yvvvvvvX#hw.A G KML<&F2MATT]fgvus͌gɫox~{yvvvvvv["k{/BGIF0:*B7JDRQ\`dpp}r܂eڠaϺkrx}~{xvvvvvv^!o0BEC $/!8.@:GGNSX_ajktwy|mb઀^elqv|yz{w~u~u~u~u~u~uct0@@% %/$80?xNBsTEn[HibKdkM^uOWOQOLNGPESFTGVGVGVGVGVGV ݳ #)/!4&9+y=/uC2pI5lO8hU;d\=_c?ZlASxBMCGCBB?AAD?F?F?F?F?F?FѼ !'z-t2 n7#j=&fB(cH*`N,\T.X[0Tc2Nm3Hy4B5<67545747474747474ӷ~x ql$g*b/_4[:X?UDRJ OQ!KX"Ga$Al%;y&6'1(-()()()()()()(ճɾulg b]Y U% R* O/L4J9G?DEAL>T9]4h/u*'""""""˻ujb[V QLHEA!?&=+;0866<3C /L *V &` "k w       wkaZTNJG C@=;9 6$4)1..4+:&A!JS[ffffff>,9267999=8C %<&:'8(6(4)1)/).)/(0(2'3&4%4%3%2&2&2&2&2&?+:2:4=6>9?? EIHRI[Ic Hk#Ft&C}(A)>*<+:+7,5,2,3,4,6+7*8):(8)5*3*3*3*3*3*@+;1=2A4B7D= JFMONXNa"Nj&Kr)I{+F-C.A/>/<0908090;/-;.8/8/8/8/8/8/A*<1A0D1F5J; PDSMTV T_%Tg)Rp-Ox/L1I2F3C4@5=5?5@4A4B3C2D2A3=4<4<5<5<5<5<5B*>/D.I/K1P8 VAYJ[S"[\(Ze-Xm1Uv3R6N7K8H9D:D:E:G9H9I7J7G9C:B:A;A:A:A:A:A:C)A-H,N,Q.X5]=`FaP$aY+`b0^j4[s8X}:TI?J?L?M?N>PI@GAGAFAG@G@G@G@G@D)D+M*S*W,_3e;gChL&gU-f_3dh8`q<]z?YAUCPDODPEQDRDTBRDNFMGLGMGNFOFOFOFOFOFE)H)Q(X(^)f1l9oAoH'nQ.l[5jd;fn?cwC`F\HXITJUJWJWHWISLRMSMTMULVKVKVKVKVKVKF(L(U&]&c'm/ s7w?xG'vN/tX6qa=njBjtGfJcM^NZOZO[N\NXQWSYSZS[R\Q\P\O\O\O\O\OG(O&Y$b$i%s- {6>F&M.|T7y^>ugEqqJm|NiQdS`T]T_R\U\X_Y`YaXbWbUbTbSbSbSbSbSH(R%]#f"n#z+ 6>F$M-S6Z>}dExnLszQnUiXeYbX`Yb]d^f_g^g\h[hYgWgVgVgVgVgVI'U#`!j s!+ 6?G!N*S4XהfL͌rXņah|myoxoynymyjxhwevbu`t^s]s]s]s]s]O$] iu+8 DOSU#W-֧V=˟bLmXzckqttrpm~j|g{dybx_w^w^w^w^w^Q#_lx+9G OQSغG+̲R;]KiXudmtxxurolhe}c|`{_{_{_{_{_S"bo|+:KM N ۽EB(½O9ZIeWpc~muy|zwtpmjfda~`~`~`~`~`V!dr+;IJߺE2?%K6VFaUlayltvzo{sxzu~qnjgebaaaaaX gv*<FA'4="H3SC]Qi^uiurkwcygwnttqxn|khecaaaaa[kz&:?(6?G.P>ZMfYwrdkǃmaÚrXtZscripomsjvgye{c|a|a|a|a|a_o 1) 5?H)P9XG|cSop]c݁eX٘kPӶmOlWm^mdkiimfpdrbtatatatatact ) 4=!F+M6V@{`JnkTb{\V`NbIcMfSgYg_ecdgbi`k_k_k_k_k_iz  պ*4<"B+I5Q=w[ElfLasRVVLWHVG[J^O`T`Y_\^_]a\a\a\a\a\o ֳ!+28!>)D1{M8rV>j_DbkIXzLNOFODNCSEVJXNXQXTXVWVWVWVWVWvڬϺ&-39&{@,tH1mP6gY;`c?XoBODFF?FAD?I@LDNGOIOKPKPKPKPKP Ҵ !(.z4 r;%lB)gK-bS1\\4Vf6Nr9F;=<7<:::=;@AF>N9X3d-t& бŻ|oe^WQ LHC?$<*:0774?0G +R %_ n        ǹrf\UOJF B>;85$2*/0+6'>!HTcr ui]SMHD@= :742/,#*)&/#6?IT _krrrrr6.0526382<0B+I&S&] %h#r!|  6.1545565:3@/H+Q +[ *f(p%{#  7.246384886>3E2O 2Y0c.n+x(%"  8-5291<2<5;;8B 9L 9V7`4k1v.+(%"!$'#"!9-80=.@/A2@8=? ?I@T?^/.?-=/<2<3?4@4B4B3B3B3B3B3=*F'N%T$X&Z)^1 a:aD`O_Y$]c)Zn,Vy/R1N3K4H4F4F3C2C3A7C9F:H:I:J9K8K8K8K8K8@)J%R#Y"^#b'g/ j8jAhJgU%e`+bj/^u3Z5V7S8P9O8L8K7G;J>M?O@Q?Q?R>R=R=R=R=R=C'M#V!^ d i%o- s7t?rGoQ%l\+ig1er5a9];Z|EyM$tX+pd2lo7g};c?`B]D[EZFYGZI\J]J^I_H_G^E^D^D^D^D^DH$S ^gov#}+4 <DK!T)z`1tl9ny?kEhIeLcMbNaNbOcPdOdMdKdJcHcFcFcFcFcFJ#Vakt|")3 ;CIQ%څ\1~g:xsCtIpNnRkTjUiTjUjTjRjPiNhLhJgHgHgHgHgHM"Ydnx!(2; BGؕK$ΏX0ʼnc;nD~zLzRwVtYrZqZqYpWpUoSnPmNlLjJjJjJjJjJO![gr| &09@ ڣ<ΞG"ĘT0_;jEuNTZ}]z_x_w]vZuXsUrRpPoNnLnLnLnLnLQ ^ju#.7ݩ:Ь7ƦD Q.\:fEqN~V\`bb~`|]zZxWvTtQrOqMqMqMqMqMS`my(.Ժ"ȵ3AM,X9cDmNyV]b{dudxb|^~[}XzUxRvPtNtNtNtNtNVcp}ؾ 0 >J*U7`BjMvU]wboejembr_v\yY{V}|S~zQxOxOxOxOxOXfsֳ, :F&R4\?gJ~rSu[l`ed_dbbh_m\qYtVvTwRy}Oy}Oy}Oy}Oy}O\jw֫θ'6C#N0Y;~dFtoOk}Wc][`UaV_^^c[hYlVnTpRrPrPrPrPrP_n| ٥бȾ'3?K*V6ua@lmIc{QZVRZM[LZSZYY_WcUfShQjOjOjOjOjOdr ҫʷ)6 >H$wS/n_9djA[yHRӋNKϢQFRCRITOUUTYS]Q_PbNbNbNbNbNix զͲþ(3<}FtQ'k\0ag8Xt>OCHFCG=G@KEMJNONSMVLXKXKXKXKXKoڠϭƸ%/8v@nK#fU*_a/Vm4M~8E;A;=:8@>A?C?C?C?C?C?֣̰º}u% m-f5`>ZGTQN["Fi%>y'6)/*,*,)/,1042649595959595۟Ϭŷw pjc& ]-W6R>MGGQA]9k2}* #! !& (!)$+&.(.(.(.(.(ѩǵuld \WQ$L, H4 D< ?E;O4[,j%~!"""""Ԧɲui`XR LGA ='9.561?,J%W g }         ˰xk_UNID ?;74"0),0(8#AN^ rö|nbWLGB>:6 30-)#&)"19DRdxrfZPGA=962/ ,*'$!#*1; GUcq-1*5-5-7+;'A!HR]iu.1,4/305.9*?%FP[ gs  /1/2213327.<*D"MXdp }    00205/606439/A)J!Ua m y          105-9,;-:0865=0F(Q'] %h #t    3.9+=)?*?->1;87B5M 4X 1d/o,{)'%#!  6,<(A'D'E)D-B4@> @H ?T=_:j7u420.,+**(%#')+,,,,9)@&F$J$L%K)K0J: JE JPH[EfBq?|<:766531,'!,#0$3$5$6$7$7$7$7$<'D$J"O!R"T&U-S5 S@ SKRWObLmHxF C!A!@!?!>!< 9!4%5'9)<*>*?)@)@)@)@)@)?%G"OUX\$^+]2]< \GZRX^UiQt!O#L$K%J%H%G$E$A)?,A.D/F/G/H.H-H-H-H-H-B$K SZ_d"g(g/g8 eBcM`Z]e Zq$W~&U(S*P,O-M-M-K0I3K4M4O4O3O2O1O1O1O1O1D"NW^ek n&p,q5 p>lHiUfb!bm'_y+]/[1Y3W5V6U6T7S9U9V9V8V7V6U4U4U4U4U4G!Q[bkqu$x*z1z: wDtPo]#lh*hs/f4c7b:`<^=]=\=[>\>\=\<\:[8[7Z6Z6Z6Z6JT^fov{!&-5 ڂ?~LyX$uc,qn2ny8lf=ei=i=i=i=S_iu  ՚Σæ 1 >J!U+`4j{l>{l>{l>Ual x ֗ϟƩ-;GR)]3g;qB{~HtMnQiSeRfPkMn|JqxGsuDtsBuq@vp?vp?vp?vp?Xdp} ړќɥ)8DO&Z0d9zn@rzGlLeP`R[R\ObMfJi~Gl{EnxBovApu@pu@pu@pu@[h tԘ̡ê%4 AL#W,ya5ql=jxCcI\MVORORNXL]JaGeEg~Ci{Aiz@iz@iz@iz@_l yڔϞǧ0 =HyS(q^0ii8bu>[DTHNJJJHJOITHYF\D_BaAb@b@b@b@cpԚʤ*8xDpP"i[*af1Zs7SF>J>M=O=Pg8x1.+)$(!+$.%0'1'1'1'1'ԝɩ{ne^WQ%L/G8CC >N 8Z1i+{%""%&&&&ڙ̧±}pd[T NHC$>-:56?0J*W$h |       ϤŰqeYOJD ?:6 2(.0*9#CQc z    ǮtgZNE@:61 -)& "(1; HZqxk_SH>940-)%"!*3?Oc~}ocWLC:40-)&# # ,6DUh{%4&4'4&5#:?G P\gs&3(2*2)4&7!=ENYeq~'2+0-0-1*5%:BK Vcp{*0/.1-1./2*7%>GS _kw..2+5*5+3.03+:#CNZfr ~  1+6(9':'9*6.15.?*J%V bmx          4)9%=#>#>%<);19;6F1Q-]+h )s '~ % $ # " ! !        7&=#A!D D!D%D.B7@A<:9!;!=!>!> > > > > @ HOTY^`$_+]3Y=WI UVSbQnOyNMLK J H!H!F#D%D&E&F&F%F$F#F#F#F#CLSY`dg!h'f.c7bD _Q]][hYsX}!V#U%T'R(Q(P(O*M+M+M*N)M(M'L&L&L&L&FOV]ejmo"o(n1l? jLgXecbn"`x&_)]+\-Z.Y/W/V/U0U/T.T-S+R*Q)Q)Q)Q)HRZa iosuww,v; sHpTm_ ki%is)g~-e0c2a4`5^5]4[4[3Z1Y/X-W,V+V+V+V+KT] e msx{~ˀ(7 |DyPv[!se&po+nz0l3j6h8f9d9b9a7`6_4^1\/[.Z-Z-Z-Z-MW_ i q x }Ղ͆É$4AM~X!{b'xk-uv2r6p9n;l=j=|h<{g:|e8|d6}b3}`1}_0}^.}^.}^.}^.OYblu |փΈō 0>JT _'h-|r3y}7w;~u>yr?up@sn?rmlp;nm9pk6qi4rg2se1se1se1se1T^ ht}Ն̎”*8 DOY%c,}l2ww7r_AZBWAW?\~=`y:bu8er5fp4gn2gn2gn2gn2Yeq}ֈ̑™ !1=IzS t]'ng-gr3a8\S5A6F5J4M3O2Q1Q1Q1Q1fs߃ґǛztn.h; bG\SV_Pj Kw%E(@+<,:,8-7/<0@0D0F/H/H/H/H/l|ٌ̘âshc%^4YA SNNZHgCu>φ:Κ!6˳"4!2$/'2)7*:+<+>+>+>+>+tѕǠ{la[U,P:LGGT Ba>o962/,((,"0#2$4$4$4$4$~א˝rdZ TO%I1E<@I;V7d 2t .+('""%(****ދϛŦvi\RLGB'>19<4G/U*d%w!    ӘȤyk_RID?:6%2..8(C"Qbw   ʣ{maTJ@;61-) %(!1<J \tìqcVJ@72-)$ ! ) 3AUmuh[OD:0)%   *8Kczm`TI?6.&" %1AUl 4"2!248>EOYeq|"2$0$0"26; BLWbo{$0'.'-&/"38?IT_lw(.++++*,&/ 4< DP\gs~++.)0'/(++&07@K Wbny/)2%4$3$1&,+(3%=GR^i t~2&6"8 8 6!3&3/08,C&N!Ydoy          5#9<=<<"<+:47>2I.T*`(k&u&&%%$#"      ! ! ! ! 8 =ABCFE'C/@9=D9P6[4g3q3{2210/.-- , *((*+,,,,;AEHKNN#L*I4F?CK@W?c>m >w > = = <;:997544555555>EILRVVT%Q-N8LEKRK] Jh IrI{HGGEDCB@?==>>====AHMR Y\][Y%W1W?WL VX UcSmRvQPONMKJIGEEEDDCCCDKQ W ^ aba_b,b;aH _T^^\h[qZ{XW V"T#S#Q#P#N#L"L!K JIIIIFNT\b f gghk(k7jD hOfZddbmaw _#^%]&[(Y(W(V(T'S%R$P"O!N NNNHP W`fjmopt$s3r@ pLmVl`jjhs#f}&d(b*a,_,],}[+{Z*zX(zW&zU$zT#zS!zR!zR!zR!KS Zdjotvx { {0y= wHuSs]pf np$lz(j+h-}g/zd0vc0ta.s_,s^*s\(tZ&tX$tW#tW"tW"tW"MU]gnuz}-: ~E|PyZwc!um%rw)}p,yn/um1qj2nh2lg1ke.lc,ma)n^'o\&o[$oZ$oZ$oZ$OXakszƀ)7CMW~a ~{j%zyt)uw-qu0ms2iq4eo4dm2ck0eh-ge+hc(ia'j_%j^%j^%j^%Q Zdnx̀†%4@ JT|^wg$rq)n|-i|0ez3`x4]v4[t3[r1]n.`k,bh)ce(dc&ec&ec&ec&T ]hs}ȅ !0= HzRu[pe#kn'fz,a/]2X4U}4S{3Sx1Vu.Yq,[m*]j(^h'_g&_g&_g&Wamy΃ċ,9 yDsOnYib dl%_w)Z-U0P2M2K1K0N{.Qv,Ts*Vp(Xn'Xm'Xm'Xm'[erʉ}'w5rA lLgVb`\j!Wu%R)M,I.E.D-C-E,I~+Ly)Ov(Qs'Qr&Qr&Qr&_jyІŐy t!o0j<dH _RZ]UgPs K#F&B(>(=';)<)@(D'F~&Iz&Iy%Iy%Iy%dq؁ˍpie)a7\CWN RYMdHpC~?; 8!7 4"3$7$;$=$@#@#@#@#izщƕ|k] YV.R<MHIT E` @m<{8521.,-146777rل˒ufVKH"E1B??M;Z8h4w 1Љ .Ϡ+̼* '$#'*,---~юƛ{l^QC?;%936A3O/],m)&$"  !"""׊ʙqdVJ>941'.3*?&M"]o    ΗâugZNC82-*&$"/:IZ o ơxj]PE;1*&" (4BUl|m_RF<3*"  +:NgreXK@5+" "1E_xj]QF<2*!  *<Tr20026<CLWbnz0..049@IT_kw!.",!+-0 5=FP\gr}$+&)%("),28BLXbmx((*&*$'%!',4=HS^is|,%.".!,!'" &09D NZdnw/#120,*#(,%5?IU_ i s { 2 565342'/0*:%E!P[eox59;:;<:"7+45/@,K*W)a)k)u)~))))(('&%$" ! ! " # # # 8<?? CDB>$;.795E5R6]7g7p7y77766432 1 / - , - - - - - ;@C EJ KID?%?2A@CLCXCbCkCt B} B A A @ > =<:97555555>CFKP Q N HGL,N;OGNSN] Mf Lo LxKJIHGEDB@>=<<;;;AF JQUVURSW'X6XCXNWY VbUkTtS}RQONLJIGEDCB~A~A~ACIMUZ\^]\`#a2a?`J _U ]^\g[pZzXWVTRP}O{MyKxJxHxGwFwFwFEKQY^cfee hi/h;gG fQd[cdam`v^][ |Z!yX!vV!tT sSrQrOrMrLrKrKrKG NU]dilmlop+o8nD lNkXiagjfs~d}{c!wa#t_$q]$n[$mZ"kX kVkTlRlPlOlOlOJ PXaiortsuv(v5tA sKqUo^~ng{lpwjz sh"pg$le&ic&fa&e_$d]"d[ eXfVgUgTgTgTLS\entxzz|}$|2{>yI wR|v[xtdtrmppw lo#hm&ek'ai(^g'^e%]c#^`!_]a[aYbXbXbXNU`jsy~!/;F z~Pu}Yq{bmykiwu eu#at&]r(Zo(Wm(Vk&Vh$Wf"Yc [`\]\\\\\\QXdox,~8xC sMoVk_fhbr^}~"Z{%Vy'Rv(Ot'Oq&On$Pk"Sg UdVbWaWaWaT\iu~|'v5q@mJ hSd]_f[pW| R#N%K~&H|&Gy%Gu#Hr"Km NjOgPfPfPfWbo{Äxs"o0j<fF aP]ZXdTnOzK G"C#A"@"?~!@z CuFqHnIlIlIl[hvʂ{ojf+b7^BYM UWQaLlHxD@<:987;~>y@uAsAsAs`o~ʼnzh_[#X1T=QHMS I^ EiAv=96331/2589|9|9|gxˆvdTOL(I5FBCM@Y<)977D5Q2_/m,~*'%$" !$%%%}ˍvgYK=0 ,*((6&D%T#d!uӊѣ    Љŗ|m_QD8,# !'4BSf{     ɕqcVI>3( $0 >Qf~ tfYLA6,# *9Ldxi[NC8.%  "2F`~oaTG;0&  *>Z}ugZNB8.% "7Su0.. 049@IT`lx.,,-16=FP]it}+))* -28BLXdox!(!&%&).4=GS_js{$%$""!!$ (09CNZdnv~("(&!#,5?IU_iqy+,+& (0 :DPZdmt|.0.+)(%# ,5?J U _ h q y       133 /21-(%"/9EP[dm u!}!!"!!47779 83-'&%2)?+K-V/`0i0q0y000//-,+*(&$#$$$7: :>@>8 //4,7::F;Q;[DFCA;=A'D5EBFMFWF`EiEqEz D D C A @ > = ; 9 7 5 4 ~4 ~4 ~4 = @BIKNMIHL"N1O>OIOSO\Ne Mm Mv L KJHGEC|Bz@y=x<w; v: v: v: ? BGNSVWTR UW-X:XEWOVY Ua Tj SrR|QP~O{MxKvItHrFqCpBp@p?p?p?AEKRY]_]Z]_*_6_B^L]U \^ [fZoYx|WyVvUsSpQnOlMkKjIjGjEjDjDjDCGOW_cedbde&f3e?dIcR b[~ad{`lx^vu]q\nZkXhVfTeRdPdNdLdJeIeHeHEJS]diljhjl#l0k<jFiP {hXxgatejqdsnc~jag`d^a\_Z^X^U]S^Q_O_M_M_MGKWbioqpop rr-r9}pCyoM unVqm^nkgjjpgh{dg`e]cZaX_X]WZWXXUYSZQZQZQJO\gntvuuw xx*{x6wwAsvJ otS ks\hredpn`oy]mYkViSgQdQbQ_Q]SZTWUUUUUULTaltz{{|}~~y&u3p~>l|Gh{Q ezYayb]wlZuwVtRrOpLmJkJhJeJcL_N\OZOZOZOYfqz~vr"n/j:fDbN ^W Z`WjS}tO{KyHwEuCrCoClCiEeGbI_I_I_R_mwwn if*b6^A[KWT S] OgLrHDA>~<{l@iBfBfBfVfs~sf`\$Y1V<SGOQL[ He DpA~=:7654}4y6t8p:m:m:m]n{paU QO*L6IAFLCW@b:;537":0<<=G>P>Y>b>j>r>z==<;97~6|4z2x/w-w,v,v,88<@FHGA> BD+F8GCGMGVG^FfFnEwED C }B z@ x> u< s: r8 p6p4o3o2o2:;@GNQPKHKM(O4O?OIORN[NcMkLt }K~ zJ wI tH rF oD mB k@ j> i< i9i8h8h8<=DNUXWTQSU$V1V<VFUOUX~T`{Sh xRq uQ{ rPpOmMjLgJfHdF cC cA b? b> c= c= >?IT[^]ZXZ[!\.]9\C}\Lz[UwZ] tYf qXn nWxkViTfScQ`O_M^K]I \F \D ]B ]B ]B @COY`cb`_` bc+~c6zbAwbJtaRq`[ n_c k^lh]ve[bZ_Y\VYTXRXPWMWK WH XG XF XF BGT^ehgfef g|h'xi4th>qgGnfPkfX hea ecjbbt^a[_X^U\SYRWQUQRQORM RK SJ SJ DKYcjlkkklzmvn$rn0on;kmDhlMelV bk^ ^jg [hqXg}UeRcOaL_K\KZKWKTLR MP MO MO FP^hppppqzrstot lu-ht8etBbsK^rS[q\ Xpe UnoQm{NkKjHgFeEbD`D]EZFW GU HT HT IWdnuutuwsyl{ h{d{)a{4^{>[zHXyQUxZ Qwc Nvm KtyGrDqAo?l>i>f>c>`?] AZ AY AY M]jt{zyz||ne_\$Y0V;TDQNMWJaG~k D|w @{=y:w8t8q7m7j7g8c :a ;_ ;_ Tdq{yj^VSP*M6K@HJESB^?hD!K Xgx{wj]O@3& %2?M ] n   ƇteVH;." "0>N`tyj\MA4),<Nbzԗи}n`RE9-"  '8LdqcUG;0&!4JexiZL>2'  /Gf~pbTG;/$)De +)**-2:DQ]hqy( &&'*.6@MYdlt{%#"$%)0;HT_gou}"  #,7CNYaipw}'2=IS[cjqw}#-8CMV^ekrx~  '1<FPX`fmsz#   +6@JS[biov~& $ #/:D M V ^ elt| ) '"$  (4>HQZaip x ,*)*,+' ""%/':)D*M+V,^,e-m-u-~-,+*('}%{#y!xwww/,/3884/*.1*364@5J6R7Z7b7j7r7{665|3z2w0t.r,q)p'o%o$o$1.4<BB?:68;&=2><?F?O?W?_?g?o}>x{>x=v<s;q9n7l5j2i0h.h,g+g+32:DJIGB@AC"E.F9GCGLGT}F\zFdxFluEusDpCnBkAi?f=e;c8b6a4a2a1a156AJPONKHIKL+M6~N@{NIxMQvMYsLaqLjnKslJ}iI fH dF aD _B ]@\>\;[9[7[6[67:FPUTSQOP R~S({T3xT=uTFrSOoSWmR_jRghQpeP{ bO `M ]L ZJ XG WE VCV@V>U<V:V:8>LVZYXWUW}XxY%uZ1rZ;oZDlYLjYTgX]dWebVn _Uy \T YS WQ TO RL QJ QG PEPBP@P?P?:CQ[^^]\[}]w^r_"o_.l`8i_Af_Jd^Ra^Z^]c\\l Y[w VY SX PV NT LQ KO KL KIKGKEKCKC<IV`bbaa~awcpdleie*fe5ce>`eG^dO[dXXcaVbj S`u P_ M] J\ GY FW ET EQ EN ELEJFHFH?O\effffxgqijj fkbk'`k2]k;ZkDXjMUjURi^OhhLfs Ie Fd Cb A_ ?] ?Z ?W ?T ?Q?O@M@MDUbkjjjjtmkocq^r[r#Xr.Vr8SqAQqJNpSKo\HnfFmqCl~ @j =h ;f 9d 9` 9] 9Z9W9U:S:SK\hponnoqrgu\xVySyPy)Ny4Ky=IxFGxPDwYAvc>uoL<V9a7~l4|z2{/y-v+t+p+l*h+e+c,`,`\kvzyxxxyl}^SF>;9(725<4F2Q0].i,w)'%#}#y#u"q#n"l$i$ies~}~thZNB5/-+*)5(?&J$V"d!r{xusso}}pdWJ>1$ +6AN\l~  ~~zyl`SF:.!  *6CRbtui]PC6*)6DUg}sgXJ=0$ '5DXmdžĥzk\NA5) "2DZto`QD8,"  -B\zteVH:/$(>]{m^QC7+$<[('&')08CP\dmt{ %$##%+3>KV_hov| "  %-9FQZbipv} )4@KT\djpw} $/:DNV^dkqw} )3>GPW_ekqw~  #-7AIRY`flsy   '1;DLT[bhnu}  +5>GOW^dkr{"  $ /9BKSZahpx}{y y x x $ $'&"*4 >"G#O#V$^$e%m%u%%$}#z"x usqppoo'!&031.*# &)%*0,:-C.K.S/Z/b/j~/r{/|y/v.t-q+o)m(j%i#h ggg)'09;:74002!4,566?7H~7P|8Xy8_w8gu8ps7zq7n6l5i3g1e/c-a*a(`&`$`$*+8ABA?<99;<)~=3{><y>Ev?Mt?Ur?]p?en>ml>wi=g<d;b:_7]5\3[0Z.Z,Z*Z*,1>GGGEB@A B{C%xD0uE9rEBpEJnERlEZiEbgDkeDubC`B]A[?X=W;V8U5T3T1T/T/.7DLLLKIFHyIuJ"qK-oK7lK@jLHhKPfKXcK`aJi^Js\IYHWFTDRBQ@P=O:O8N6N4N4/=JPPPPNLyNsOoPlQ*iQ4gQ=dQEbQM`QV]P^[PgYOqVN}SMQKNILGKDJBI?I<I:I8I82BOTTTTSzRsTmUiVfW'cW1aW:^WC\WKZVSXV\UUeSToPS{MRKPHOFLEIDGDDDAD?D=D<6HTXXXXXtXmZg[ c\`\$]].[]8Y]@V]IT\QR[ZO[cMZmJYyGXDVBT@Q?O?L?I?F?C?B?A=MY\\\\}\o^g`aa\bYb!Vc+Tc5Rc=PbFNbNKaWIaaF`kD_wA]>\)H(S&~_$}m"|} {xvrnjgdbbdrutsrvsku_yR}H<0& #"# -7AMZhx|wtpnlkn{{yx}xryf}ZNC8,  $.9 E Raq~zxwvy~{nbVJ>3($/;HWh{wk_RG;0$ $/<K]pth\OD8,!  !-<NczsfYJ=1%+;Pg҄Ϩ|l]NA4) );RnqbRD7+  %;Utyj[M@2&  9X|&###'-6BMW`hpv}#!"'0=HR[cjqw}!+7BLU]dkqw}&1<ENW^dkpv}  !+5?GPW^ejpv}  %/8AJQX_ekpw~  )2;DKSY_ekry #-6>FMT[agnu} &09AIPW]cjrz~|{{{    *4 < D L SZahpy|y w u srqqp "  %/8@HOV]e~m|vywtromkihhg g %*,+(% "+$4%<&D}&L{'Sy'Zw'bu'js'sp'~n'l&i%g#e!ca``__ .3431.*(*,'|-0z.9w/Au/Is0Pq0Xo0_m0hk0qi0|f/d.a-_+])['Z$Y"YYX )69:98531 }3x4#u5-r66p6>n7Fl7Mj7Uh7]f7ed7ob7z_6]5Z4X2V0T-S+S(R%R$R#!0<>??>;9{9v:r; o<*l=3j=;g=Ce>Kd>Sb>[_>c]=m[=xY<V;T9R7P5N3M0M-M+M)M(%6ACDDC@{>u?p@lAiB'fC0dC9aDA_DI^DP\DYZCaWCkUBvSAP@N?K<I:H8H5H2G0G.H-*;EGHHG~FvDoEjF fGcH$`I.^I6\I>ZIFXINVIVTI_QHiOHtMGJEHDEAD?C<C9B7B4B2B11AIKLLKzKpJjKdM `N]N"ZN+XO4VO<TODROLPOTNN]LNgIMrGLDKBI@G>D>A=>=;>9>7>66FMOOOOvOkOdQ^SZSWTTT(RT1PT9NTALTJJTRHT[FSeCRqAQ~>P`D<`M;`V9_a6^m4]z2\0Z.X-U-Q,N-K-H-F-EJXZ[[[u[k\__WaNdEg@g=g;g&9g/8g76g@4gI3fS1f^/ej-dx+c)a'_&\&X&U&Q&O&M'LR__`_|_q_ha\dSfJi@l7o 4o2o!0o*.o3-n<+nE)nO(mZ&mg$lu"j ifc`\XVTRZddddxdndeeYiOlFo;r0v)x'w%w$#w-"w6 w@vJvVuctrsqnkgda^\[djjihuhliakVoKrAv7y,} &09DP~^ }m |zwtp l i g e dmpon}mrmio]rRvFz<~2''2<IWfx~zwspnmxwutzspsewY{NB7-" (3@N^o|zy~|zzzm}aUI>3( )5BSf{vi]QF:/$ (5EXntg[OC8-!  %5H_yĘsfZK>1%"3Ie~n^O@4( 3LjvgXI;.! 4Pq"  #*4>IS\ckqx~#.9CLU]dkqw}(3=FNW^ekqw} #-6?HPX_ekpv} '09BJQX_djpv}  !+3<DKRY^djpw%.6>FMSY_ekqy  (19@GNTZ`fmu~~~ "+4;CIPV\biq{|ywvttss   &/7>ELRY`g}o{ yx vsqomkjiii   *2:A}H{OyVw]uesmqwnljgeca ` ``` $&%# %|.y6v>tErLp Sn Zl bj kh uf ca^\[YXXXX )+--*(%" {#w$!s%+q&3n';l(Bj(Ih(Pf)Xe)`b)i`)s^)\(Y'W%U"S!RQQQQ(/2331/|-x+s+o,l-'j.0g/8e/?c0Fa0M_0U^0]\0fY0qW0}U/R.P,N)M'L%K"K KK/47887}4w3q2m2i3f4$c5-a65_6<]6D[6KY6SW6[U6eS6oQ6{O5L4J2H/F-F*E(E%E#E!$59;<<;x9q7l8g9 c:`;"];*[<2Y<:Wl<f>a?]@Z@WA(UA0SA8QA?OBGMBOLAWJAaGAlE@xC?A>?<=9<7;4;1<.<,<+1=ACCDxCpBgBaC[EWETFQF%OG-MG5KG=IGDHGMFGUDG_BFj@Ew=D;C9A7>7;786673717/6BEFGGuGlGaG[IVJQK NLKL"IL+GL3EM:CLBBLJ@LS>L]R7=R?;RH9RQ8R[6Qf4Ps2O/N-L,I+F,B,?,<-:-9BJMNNxNnOdOZRSSKUDX?X=Y;Y$9Y,7Y46X<4XE2XN1XX/Wd-Vq+U)T'R%O%L%H&E&B&@'>IOQRRtRjSaTWVPXGZ?]7_ 4_2` 1_(/_0._9,_A*_K)^U'^a%]o#\~!ZXUROK H F DQTVV|VqVgW^XTZL]C_:b1f+g)g'g#&g,$g4"f=!fGfRe^dkc|a_\YUROMKYZ[[x[mZd[[\Q`Hb?e6h,k!o ooo&o/o8nBnMmZlhkx i g d a ] Z WUS_``_t_j_b_XbMfDh;k1o'rux y x x( x2w<wGvTubtrrpmifc_]\ffe}dqdhd_eThIl?p6s,v"z} !+5@M\~l}zwspljgfmlkyjoigi[mPqEu:y1|' ",8ETey{xtsqtrqwooocrWwL{@6,!  #.:J\p}{ywxvly_~SG<1'".=Od}vi\PD9.# !/@Umtg[NB8-" /C\y؜th\L>1%  -EdsdTE7).Hj '1:CLU]elrx~!)3=FOW_flrx~$-7@IQX_fkqw~  (1:CKRY_ejpw~ #,4=DLRX^djpw &/7?FLRX^dipx!)19@GMSX^djrz$,4;BHNSY_fmv}{yyxwv '/6=CIOU[b~i|rz}xvsqpnmlll !*28?~E|KzQxXv_tgrppzmkigecbbaa %|-y 4v ;t Bs Hq Oo Vm]kfiofzda _ ] [ZYXXX ~ zv s)p1n8l>jEhLfSd[bc`m]x[YVTRQQP P P "%''%}#x urnk%h-f 5d ;b!B`!I^"P\"XZ"aX"jV"vT!Q OMKJJIII#(+,,~+w)r'n%j$ g%d&"a'*_(2](9[(?Y)FW)NU)VS)_Q)hO)tM(J'H&F#D!DCCCC)-011y0r.m-h+d, `,]-[.'X./V/6T/=S/DQ/KO/TM/]K/gI/rF.D-B,@)>'>$>">>>$-145~5u5n3h1b1^2Z2W3T4%R4,P54N5;M5BK5II5RG5[E5eC4q@4>3<1:/9,9)9'9$9"9 +1589z9q8j8c5]7X8T8Q9O9"L:*J:1H:8G:?E:GC:PA:Y?:c=9o;9}987654414.4+4)4&5%059;<w<n<f<]:X<S=N> K>H?F?'D?/C?6A@=?@E=?Mn5>|3<1;08.6/3/0/-0+0)59=>?t@j?b@X@RAMBHCEDBD@E$>E,=E3;E;9EC8EK6EU4D`2Dl0Cz.A,@*=):)8*5*2+/+.9>@B|CpCgC_CTENFHHBI>JBDFxFmFdG[GQJKKDL=O7P 4Q2Q0Q&/Q.-Q5,Q=*QF(PP&P[%Oh#Nw!MKHEB?< 9 8CFIItJiJ`JXKNNHOAQ9S0W,X*X(X"&X*%X2#X:"WC WMVYVeUtSQOLHEB@>IKM~NqNfN]NUOLQES=V5Y,\#_ ___%_-_6_?^I^U]c\rZ X V S OLIGENQRyRmRcRZRRSIVAY9[0^'behhg g(g1 g: fE fPe^dmb`^[WTPNMUVWuWiV`VXVPXE\=_4b+e"hk oppp"o+o4o?nJmXlhkyifc`\YWU\\\q[g[^[V[K_Ac8f/i&mpsvx xyy$y.y8xDwRvbussqnjfca_bbzan`e`]`RcGg}3)  (5FZqw~uvtkv^{QF:/%(8Le}uh\OC8-"  );Sn̒ȿth[OB8-" *@[{wl`PA1$ )De%,4=GPX_fmsy%.8AJRY`flry   )2;DLSZ`ekrx $-5>FMSY_djqw '08?FMSX^cipx"*29@GMRX]cjqy %-4:AGMRX]dks~~|{z (/6<BHMSX_fn}x{ywusrqppo "*17=C}I{NyTx[vbtjqtomkihffeee ~%{,y3v9t?sEqKoQmXk_iggqe}ca_]\[ZZZ  ~{yu r(p/m5l;jAhHfNdUb]`f^p\}YWUTRRQQQyus q m j $h+f2d8b?`E^L\SZ\XeVpS|QNLJ I IIII  !!x rnki eb `(^/\5Z<XBVITQRYPcNmKzIGDCBBB B B !%&{'s&m$h"d a^[Y %V!,T!3S"9Q"@O"GM"NK#WI#aG"lD"yB!@ ><<<<<<!')+w+n+h)c'^&[%X%U&R'"P')N(0L(6J(=H)DG)LE)UC)_@(j>(w<':&8$6!66677 &+-~/s/j/d.^,Y+U+Q, N,L-J-&H.-F.4D.;B.BA.J?.S=.];.h9-u6,4+2)1&1$1!122%*/1{2o2g2`2Z1T0O1L1 H2F2D3$B3+@32>39=4@;4H94Q73[53g32t11/0-.++,),&-#-!.).24w5l5d6\5V5O5J6F7B7@8>8!<8):9099679>59F49O28Y08e.7s+6)5(3&0&-'*(((%)#-257t8i9`9Y9R9I:D;@<<= :=8>6>&4>-3>41></>D.>M,=X*=c(m?c?Z?R@JACC=D7F0H,J*J(J &J'%J.#J6"J? IHISH_GmF~DB?<9642;?AvBjB_BWCOCGEAF:H3J,M$P !Q QQ#P+P3P;PEOPO]NkM|K I F B?<:8@CErFfF\FTFLGEH>J7L/O(RVXXXX'X/X8 WA WL VYUgTwRPMIFC@?FH|InJbJYJQJJJBM:O3R+U#X[_ ```"_*_3_<^H]T\c[sZWUQNKHFLMwNjN_NVNONHO>R6U.Y&\_b eg hhh$g-g7gBfOe]dnb`]ZWSQORSrSfS\RURNRDV:Y1])`!cfiln oppq'q1q<pHoWnil|kge`]ZYY|YnXcX[WTVJZ?^5b,e$iloruwx yz{ |)}4|A|Pzbyvvtpmhfd_w_k^b][\P_Ec:h0l'psv y| !,9HZo~{xtpfseiccbXeLiAn6t+x!|  #/>Qg}mrkkialTqHv<|1& "1CZu|ttrkt^yQE9.# #4Kg|v}i]QD7,! $8Rrvk_TG;-"&>] (09BKS[agmsz !*3<EMU[aglry  %.7?GNU[`fkqx  )19@HNTZ_djpx#+3:AGMSX^djqz &-4;AGMRW]cjr~ (/5<AGLRW]dlw~{yxvvuts #*06<AGL}R{Xy_wguqr}pnlkjiihh~%|,z2x8v=tBsHqNoTm[kcimfxdba_^]]^^| xvt!q'o.n4l9j>hDfJdPcWa`_i]u[YWUTTTTT { v sp nki#g*d0b6a;_A^G\NZUX^VgTsQOMLKJJJJ {snjh gda_&],[ 2Y 8W >V ET LR TP ]N gK sI F D CBBABBumhc`_]ZX"U)S/R6P<NBLJJRH[FfCrA?<;: : :;; {!p!h!b ^ZXUSPN&L-J3H9G@EGCPAY?d<p:8643445 5 !$v%l&d%]%Y#U!RO L J G!#E!*D"0B"7@">?"E="M;"W9"b6"n4!}2 0...//0 %'s)h)`)Y)T'P%L%I%F&C&A'!?''>'.<(5:(;9(C7(K5(U3(`1'm.'|,%*$)!()**+$(}+o,e,],V,P+K*G*C+@+=,;,:-%8-,6-25-93-A1-J/-S--_+,k),{'*%(#&##$!%&&"(+y.l/b/Y/R/M/F/A/=0:1 715242#22)120/27-2?,2H*2R(2]&1j#0y!/ -+(% "! "&+/v1i2_2V2O2I2B3<4854617/7.7 ,7'*7.)75'7=&7E$7P"7[ 6h5x42/-*'$"*/2r4f5\5S5L5F6>7984:/;+< )='=%=$$=+"=2!=:=C4?.A'D GJ JJJ%I,I4I> IH HT GaFpEC@=:74 29<u=g>[?R?J?D?>?7A1D*F#ILP Q Q Q!P(P0P9ODOPN]MlLIGD@=;8>@pBcBXBOBHBBB;C3F-I&LOR UX XXX$X,W5W?VKVYUhS{ROLHEB@D|ElF_FUFMFFE@F8I0L(O!RVY\^ __``'`0`:_F_T^d\vZYUQNJIJuKgK[KRJKIFI^C\J[QYYWbUmSzQOMLKKKM w pkhe ca_]%[*Z0X5W:U@SGRNPVN_LjIwGEDCBBCC zphc_ ]\ ZXV!T'R-P2O8M=KDILHTE^CiAv?=<:::;; tjb]YVU T Q O M $K *I 0G 6F <DCBK@T>^<j9w7 5 4 33334 }oe]XSPNL JHF!D'B-@3?9=A;I9R7\5h2v0.,+ , ,-.xk a!Y S NKHFCA?=$<*:1877>5F3P1Z/g,u*(&%&'( ( u"h#^$V$O#J#F!C@= ; 9 7!"6!(4!.2"51"</"D-"N+"Y)!e'!s% #!  "#$#q%d&Z'R'L&G&B%>$;%8%5&3&1&0&&.',-'3+':)'B''L%'W#'d!&r%#!"}&n(a)W*O*I)C)>)9)5*2*/+-+,,*,#(,*',1%,8#,@",J ,U+b+p)(&#  %z)k+^,T,L,F,@,;,4.0/-/*0 '1%1$1!"1'!1.161>1H1T0`/o.-*'%"$)v,g.[/Q/I/C/=/8011-2)4$5 6677%7,746<6F6R5_5m 3~ 2 0- * '$"(,r/d1X2N2G2@2;253/4+5&7 :< <<<"<)<1<: 48536-7(9";>A C C C B&B-B6B?AKAX@f>w=;952/-2z5j6\8Q8H8A7;76819*;$>@CFI JII"I*I2H;HGGTFbEsDB?;8637u9e;X;N;F;?:::5;->'@ CFI LO PPQQ%Q.P7PBOON^MpKJFD@<;<o>`?U?K?C>>=9=1@)D#FJM PSUV WXY!Y)Y2Y=XJXZVlURQMJEB{BjC\DQCIBBA>@5C-G%KNQ UW[]^ `abc#d-c8cEbUaf_}]ZVSPMtHdHXHOGHFCE:H1K(P SWZ^`dfgi jkmn&o1o>nNmakwifd_\YmN`NUMNLIJ?L5Q,U"Z^aehjnqrtv wy{~)6~F|YzoxtqliehT]TUROPFR;W0\&afimqtwz}!-=Qgxte[\YWWNYA^6d+i ot w{ $3G^zda__W`Jf=l1s&x~ (;SphgagTmHs2& 1Nq  (09AIQX^djpv~  "+3<CJQW]ciov~ &.6=DJPU[agnv (07=DIOTY_fnw ")07=CHMRX^foy|zz $*17<AGLQW^gq}}zwtsponn%+17<}A{FzKxQvXt`rjpumkigedcbc{ xwu t&s,r1q7o;m@lFjLiRgZedcoa}_\[YXXXYxsomkih"g'f-e2c7b<`A^G]N[UY_WjUwSQONMMNO~tmiec a_^]#[)Z.X3W8U=TCRJPRO[MfKrIGEDCCDEvkd`]ZX WUS R%Q*O/N4L:K@IFGOFXDbBp@><;;;;<| o e ] X U SQ ONLJ"I'G,F1D7C=AD?L>V<`9m7|6433334 vi_XRNL J I HEDB$@*?/=5<;:C8K6U4`2m0|.-,+,,- qd[SMIFDBA ? = < !:'9-745:3B1K/U-a+n)~' & %%%&& }m`WOIDA>=; 9754%2+01/8-@+I)S'_%m"}   !yi]SLE@=:7531/.",(*/)6'>%G#Q!]k{  uf Z!P!H!B!=!9 5 2/- + ) ( &!&%!-#!4!!< !E!P!\ jzq c#W#M$E$?$:$6#2#-$*$(%%%#&"& &$&+&2&:&C&N&Z%h$y# !   n#`%T&J&C&<&7&3&/')(%)"*+ +++"+(+0+8+A+L+Y *f )v '&#   |#k&\(Q)G)@):)5)0),*&+#,.0 0111&1-15 0> 0I0U/c.r-+(%""x'g)Y+N+D,=+7+2+.,),%. /146 6 6 6#6*626;5E5R4`3p21.*'%"&s*c-U.J.B.;.5.0.,.'/"1368< <<< <'AK@Y?j>}<;751.{0i3Z4N5D4<47323.3'5!8;=@CFG HIJJ'J0J:IFIUHeFzDB>;86u5d7V8J8A8:76625+8#;>AD GJMN OQRS"S+S6SARPQaOvMJIDB>n;^<Q<G<?;::69.;'>BEI LORUWX Y[\^&^0]<]K\\ZpXVRPKIh@YANAE@>>;=3?*C"GKO RUX[^`ac dfh j*j6iEhWfkda^\VTbFUFKEDD@B8D.H%MQU Y]_cfiklnp rtw#y/x=wOuds~plig`\LRKKJFG>I3N)SY] aeiloruwy{~ &5G\v~yvpYRRPMNEP9U.[#`f joswz}+=SmYXUUMVA\4c)iou{~!2Hc]]V^Jc?j3p'w~ '=XyaeUkJq@x4),Hi  $-5=ELSY^djqy'/7?FLRX]bhox!)18?EKQV\bhoy #+28>DJOUZ`gpz~}| %+28>CHMSY`hrytqoo&,17<AFLRY}a{jyuvtqolhfed }|{ z&y,x1w7u<sAqFpLnSlZjdhnf~dba_\ZZZxtqomkj!j'i,i1g6e;d@bFaM_U]^[hYwWUTRQPPP|rlheb `_^^"](\-[1Y6W<VATHSOQYOcMqKJHFEEFFqhb^[XV UTSR#Q(P-N2M7K=JDHKGTE^ClA|?=<<;<>wi`ZURON LKJI H%G*E/D4B:A@?H>Q<[:h8w6543346oc Z S MJHFE CBA@">'=,<1:79=7E6N4Y2e0t.-,+,,.zj ^UMHD A ??=<:97$6)5.342;0C/L-W+c)r'&%%%%%u fZPIC>;98 8 6531!0'/ ,- 3, :* B( L& W$ c" r   qbVLE?:74321 /-,*%)+'2%9#B!LXet   m^SIA;730.,* )'&$##)!07@JVds {i[OF>840-*'%# !  '.5>IUbr       wfXLC<61-)&"      % , 4!< G R _ntcU I!@!9!3!.!* ' #!"#$%%%%"&) %1 %9%C%O$\$k"}!p_!R"F#=#6#1#,#(#%#!#%&(* * ** *&*.*6*@*L)Y)h(z&$!l!\$O%C&;&4&/%*%&%#%&()+ . 0000#0+03/=/H/V.e-x+)&$ z!h%X'K(@(8(2(-(('%'"'*+- 034556 6(505:5E4S4c2v1/-)&$u%c)T*G+=+6+0*+*')$)+.02 589 :;<<$<-<6? @BCE D)D2D>CKB\Ao?=:942i/Y1K2@28120./+.$0369 ;>ADFH IKMN$N.M9LGKWJkHFCA<:c4S5G6=56413.1(3 7:= @CFIMOPR TVXY)Y4XBWRVfT~QNKIC\:N:C:;96735,7#;?C FIMPSVXZ\^ `ce#f/e<dLba`x]ZVTQV?J?A>;<7:0<'?DI MQTX[^adfhjl oru't5sEqYoqmiea]REHDAB=?6A+F!KP UY^adgjnpruwz|  -=QjzvqlOJHHDF=G1L&RX^cgkoruy|~ $5Ia}OPKMDM8S,Z `g mrv{ *>WuSTMTAZ6a*gnu|3Lj‘W\LaAg6n+u|(A`ڻ  (08?GNU[`fls{ "+2:AHNSY^eks} $,3:@GLRW]ckt}| &-39?EJPU\ckv{urq  '-38>CHNT[cmy~{ytnigf !'-27<}A{FyMwTu\seqqomkhea^]\|ytsrqp!o'o,o1m6l;j@iFgMeUc_ai_w][YXURRR|snife cbba"a'a,_1]6\;Z@XGWOUXScRpPNLKIHHH|pga]ZXW VUTS"S'R,P1O6M<LBJIHSG^EjDzBA?>>>?rf]WSPNL JIIHH#G(F,D2C7A>@E>N=Y;e:t8764467zk_VOJGECA A@?? >$<);.:48:7A6J4U3a1o/.,,,-/sdYOHC?=;:9 8776!5&3+2017/>.G-Q+^)m(&%$%%'n`S J C = 9 6543 210/.#,(+.*4);'E&O$["j!{!|i [ OE>94 1 / . -, +*)'!&&%,$2":!CMZhzwe WKB:50-*)( ' & $# "  $ * 1 9 B N Z hys bTH?72-*'$#"  #*1:DO\ j z   o^QE<5/*'#!!(/8 A LXfw  k[MB92,($!  % , 4=HUdt |hXJ?60*%" " ) 1 : ERas wdUG<4-(#  !#$$$ $'$/$8$B$O#_#p!s`QD : 1 + & "! #%' ()**$*,*5*@)M)\(n&%"n\M!A"7#/#)"$" !  !#% '*, -/00!0)020=/J/Y-l,*'&!i X#I$=%4%,%'$#$ #"#%( *,/13 4677&7/696F5V4i31/,*&c%S'E(:(1(+'&'"% $&(+ -/2579 ;=??"?+?6>C=R@B DGII'H2H?GNE`CxB?<97W.H/=/4/-.),'*!,/2 58;>ADFIKM PRU"T-T9SIQ[OsMIFB@Q3D4:322-0+.$037 ;>ADHKNQSUXZ ]`b'a4`C^V\lYWSPJK8@88725/3)4 8<AEILPSWZ]_bdgjmq r-q<oOmeifb^XG>>=8;58.9$=CHMRUZ]adgjloqtx{&5G]|zxsohDC>A;>5>)DJPV[`dhkorux{~-?Vr{EHAECHNU]g}t{xusleb`_}{zzy"x'w,w2v7t<rApGoNmVk_ikfzedb_YVUTxqnkj hgff"f'f,e1d5b:a@_G]P[YYdXqUTRRMKKJ}qhc_]ZY XXWW"W'V,U0S5R;PAOIMSK]JjH|GEDBA@@qe]VSOMLK KKJJ"J'H,G1F6D<CCAL@X>d<u;:98778vg\SMGECA@ @@?>=#<(;,92887?6G5S4_3o10/...0n`TKD?<:876 55543$2)1.04/;-C,O+[*k)}(&&%'(yhYNE=8521/. . ---+ *%)+(1'8&@%K$W"g!y "tcTI?83/,*((' '&&%$"#(".!5 =HTcto_PD ; 4 / * ' $#"! !   %+3;ERask[L A 8 1 + & #    #)1:DP_ p  {gW I>5.(#          ! ( 0 9 D Q _ o wd TF;2+%!     '.7AN\m r ` PC8/(#   $+4?KZk o ]M@5-&!   ")2<IXj~ kYJ=3*$  '/:FUf}gUF:0("  ! #$$$$%-$7$D$S#e!{ bQB7-&  !#% (***"***4*A)P)b'x&#!]M?3 * # !$&)+- /111(111>1L0^/t,+'$#XH!;"0#(""!  "%'),/13 68::$:.::9H8[6p42/,)R#C%7&-&&%!$" !# &(+.1479<> ADE D*C6BDAW@l>;852L(>)3*+)%(!&#$' *-0369<?ADGJ MPP%P1O?MRKgIFC?;F-:.0-),%*#'(,/369=@CFILORUX\_ ^,]:[MYaW{SPKFA262.1*/',",159=ADHKORUX[^ae imp&n4lFj[gtb_[S<746/4-1'16;@EINRVY]`cehkorw {->S{lvrod:<5:27-7"<B HNTX\aeiloruy| %6Kdx;@8=4<(BIPX^dilquy}-B\|?D@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06<'D8KLSaYv]`aѻa̴bƭccѻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻd' * 06<&C7KLRaWv[]^Ǽ_`aıa̩cԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩc' * 06<&C7JKQaUwY\]^__`ǟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟb' * 06<%C6IKOaTvX\]]^_`—bȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗb& ) 06<$B5HJN`SuX[\]^_`bbbbbbbbbbbbbbbbb& ) 07<#B4GIL_SsWZ\]^_accccccccccccccccc&* 17EFTOaTlYt\z_~a{cwfrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrh$,550 71=ADONZTcYj\o_r{buwdxsfzpi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|%.4*. 5/;7G={OAvUErZGp\Im^JkaKicMheNheNheNheNheNheNheNheNheNheNheNheNheNheNheNheNheN# &-!4(;.xC3sK6oQ9lV:jYe_?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww~' ) .4:"C1KCTV\id{krvzܞ~ؙϑ~īwīwīwīwīwīwīwīwīwīwīwīwīwīwīw& ) .4:"B1JCSV[jb|hmqݨtڢw֝{˒}ɯ|yͧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}& ) .4:!B0ICRVYj`}ei޴kۭnاpԡr̛xήvФ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|& ( .4:!A0IBQVXk^beۺfشgԮjϪnɦsЮuҡz̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z& ( .4: A/HBPVVk[_aӽ`ͶcǰehʺlаtӠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠy&( .4: @/HAOVUlY\^Ⱦ__a³cɬfϤmҟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟx&( .4:@.GANVSkX\]^^^_Ǡb͙hЕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕr%( . 4:@-G@MURkW[\]]^_`ȏe̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l%( . 4:@,F?LTQjV}Z\]]^_aeŃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃj%' . 4:?+F=JTPiU{Y\\]^`be}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i$' . 5:?)C=HSOgUyX[]^_ac|fxixixixixixixixixixixixixixixi$'/ 5;>(@=GRNeTuX[]_`b}dwgsjsjsjsjsjsjsjsjsjsjsjsjsjsjsj#(/ 6<;(>=DQMbSpW|[^`b}dwfsiokokokokokokokokokokokokokokok#(07 96)==GFPNVT|[Xw_[tb^qe_ngalicikdgmegmegmegmegmegmegmegmegmegmegmegmegmegmegme"*%!(.#5-<5D=MCzTGuZJr]Mo`OlbPjdQhfSfiTekUekUekUekUekUekUekUekUekUekUekUekUekUekUekU!#%+2&9-~@3wJ8rQ;nW=lZ?j]Ah_BfaCecCceDbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfE  !'. 6%u<*nD-jL0gQ2dU3cX4bZ5a\5`^6_`7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7v' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrw& ( ,28@+J;TK^\gkpyy闉哐⎕ߋօzqpppppppppppppx& ( +28@+I:SL\]enm|u}朄▊ߒێ̃wsttttttttttttty&( +28?*H:QLZ^cojry~ܕؑ€twxxxxxxxxxxxxxz&' + 28?*H:PLX_`qgntyޞ}ژӒy{|||||||||||||{%' + 28?)G9OLW_^rekoߩrۣv՟}ϛèà|%' + 28>)F9NLV_]schjܰn֫sЧyʣ¸ĥŜ}%' + 28>(E9MLU`[s`dݾgֹkѳpʮué{÷ƢƘ~%' + 28>(E8LKT`Yt^aeϽhȸl³qwõ~ơǕ~%& + 28='E8LKR_Xt[_bľehlpéwƟ~Ȓ$& + 28=&D7KJQ_VtZ]_bdgkžqƘzǎŒ$&+ 28=%D6JIP^UsY\]^`cfkčsƊˆ$&, 28=$C4IHN^TrX[\\]^bfn{$%, 28="C2GHM]SpWZ\]^_aeyjutuyuyuyuyuyuyuyuyuyuyuyuyuy#%, 3 8= @2DGK[RmW}Z\^_aczftjoqntntntntntntntntntntntntnt#%,3 9<<2CFJYQiVwY\_aczetholjqisisisisisisisisisisisisis"%-4 :8;2@EHVPeVqY{]`bzeugpjkmgrfsfsfsfsfsfsfsfsfsfsfsfsfs!&.672 92?BGQO^UiZq]xa}zcvfqhmkindsctctctctctctctctctctctctct &/5.1!80=?EKNVU_Zf^l{bpvdsrgvoixklzho|dr~cscscscscscscscscscscscscs'0.'/ 6-<9CDLMTTZZ{^^vbaredohfljhiligokcrmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsm',&,3)93@;JCRHyXMt]Pq`RncTkeVihWgjYemZbp[bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\$ #)0$7,=2}G8wO&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysooooooooooooq&}( * 06>&H3SB]Ph^rj|t|􎏂쇝鄣恨yqmmmmmmmmmmmmr&~' * 06=%G3QB[Qe`omxy𒊊돒狙䇟~unqqqqqqqqqqqqs&' * /6<%F2OBYRcblqt}}옆甎䏔مzqrttttttttttttu%& ) /6<$E2NBWSadisqy鞁嘈܍͂wrvxxxxxxxxxxxxu%& ) /5<#D2MBVS^efunu|✂ޕؒȈ~wz||||||||||||v%& ) /5;#D1LBTT\fdwkrwߡ}؝љĐ|~w%& ) /5;"C1KAST[fbxhms٨zТʞx$&) /5;"C0JARTYg`yejܶpҮvʧ}ãy$%) /5;!B0IAQTXg^zbhֽn̴sĭyy$%) /5; B/I@PSVg[{aglƻpv|z$%) /5; A.H?OSUgY{_dhmrx{#%) / 5;A-G>NRSgXz]aehmrw}#$) 0 6;@+G=LQReWxZ^adglqx~~~~~~~~~~~~~#$)0 6;@)F;JPQdVvY\]`cfkq{zyyyyyyyyyyyyy"$)0 6;@'B;HOPbUsX[]^`b{fvkqsnpppppppppppp"#*1 7<<'@;FNO`ToX}[^`b{dugpkkqgyffffffffffff!#*18 :7(>:DLM\SjXv[^a|dvgpilmgqcxa~a~a~a~a~a~a~a~a~a~a~a~ #+28 46(=9BILWScXn\v_}~bwerhnkinds`x^}^}^}^}^}^}^}^}^}^}^}^}#,43 -5(;7AEJQR[Xd\k`pycusfxoi{kl}hods_w]{]{]{]{]{]{]{]{]{]{]{]{$,1& ,3'93??HIQRWY\_yactdfpgimjkjlmgoocrq`ws]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt$+'#*1$7/=8FAOGVMx\Qt`UpcWlfZji[gk]en^bq`_ua]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb"$!'- 4);1B7|L.rG2nO5jU7gY9e];d__f>]i?\l@ZoAZoAZoAZoAZoAZoAZoAZoAZoAZoAZoAZoA  &-y4!q:%jB(fH*cN,aS-_V.]Z/\\0\^0Z`1Yb2Xe2Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3  "y)q0j6d<aB!^F"\J#ZN$YP$XS%WU%VW&TY&S\'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'i't( ~* .5'F6MHU[[nbiѼpDzu|v#$&- 39>&E5LGSZYn`~gmrxw##&- 39>%E4KFRZWm^~ekpu|x"#'- 39>$D3JDPXVl\|bglrx~~~~~~~~~~~y"#'- 39="C0HCNWUjZ{^chlrxxwwwwwwwwwww{!"'.4 9>B/FCMVShXy[_cglq~xyurqqqqqqqqqqq}!"'.4 9==/DBKTReWuZ\_cgxksqnxk‚iÒkġkġkġkġkġkġkġkġkġkġkġ !'.5 :9cInTy]djos{vxyu{r}n~ih}iyiyiyiyiyiyiyiyiyiyh%t%~' + 28@&K2V?`KkWvaiqv{~{wrmjlm}m}m}m}m}m}m}m}m}m}i%u%' + 18?%J2T?^LiYsd}nv}쁥}yrlmoppppppppppk$w%& + 17>%H1R?\Nf[phzs|쌍臖䂟~{upqsttttttttttl$x$& + 17>$G1P?ZNd]mkvw叇ۈօςzuuwxxxxxxxxxxm$y$%+ 17=#F0O?XOb_jnr|zޕؒю̋ljzy{||||||||||n#{#%+ 17<"E0N?VO_`gpnޢw֝ϘɔÑ}o#|#%+ 16TO]adrlשtΣ}Ǟp#}#$+ 16SO[abr۸jЯrȨyq""$+ 16<B-J=QNYa`qhʶov~r""$+ 1 6;B+I;PMW`_qf~Ľls{s""$+1 6;A*H:NLU_]pd}jqw~u!!$+1 6;@'G7LJS^[na|hnt{{zzzzzzzzzzzv!!$+1 7;@%D6KIR\Ym_zekrxƀÉ}usssssssssssx  $+27<=#B5HHPZWk\xaflry}ɁwnjsǗn¡lllllllllll{%,28 :8$@5FGOXUgYu]bg~lwrqylʂhʍeʙeɩeeeeeeeeee~%,3848$?5DEMTTbYn\y`|ctgmmgsc{_΄]Ϗ\Р]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ%,33 .7$=3BBKOS[Yf]oavwe|pijmdr_x[׀W։T֖T٢T٢T٢T٢T٢T٢T٢T٢T٢T٢%,1% .5$;1A>IIRSX\^czbisfnmjrhnvcsy_x{[~}W~SPPPPPPPPPP$*&# ,3#9.?9GBPJXQ{]Wub\og`jkcfofbsh_xj[}lWnToQpQpQpQpQpQpQpQpQpQp"## *0 6*=2E:NAzVFt\JoaNkeQgiTdmVaqX^uZ[z[X]U^R_R_R_R_R_R_R_R_R_R_  &,3$:+~A1wK6qS:mY>i^@fbCcfEajF^nH\qIYuJWzLTMRNRNRNRNRNRNRNRNRNRN  "(/~6$t=(mE,iN/eT1cY3a]5_a7]d8[h9Yl:Wp;TtP~>P~>P~>P~>P~>P~>P~>P~>P~>  $}+t2l9 g@#cF%`L']Q([U)YY*W]+Ua,Td-Sg-Qk.Op/Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0ۼ   } t'l.f4a9]?ZDXHVLTP SS QV!PY"N\"M`#Kd#Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$} s k"e)_.[3W8U<S@QCPFNIMLLNKQITHWFZFZFZFZFZFZFZFZFZFZ[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T](g'o) v, z2}9B!O*}\2zi:uu@sEqIpMnOmQlSjTgUeVcWbX`Y^Y]Y]Y]Y]Y]Y]Y]Y]Y]Y_'i'r( y+ ~18@!M*Y4f<{rDx~JvOtSsVqXpZm\j^h_f`daba_b```````````````````&k&t' |* 07?!K+W5c>oG}{NzTxYw\u`sbpdmfkghiejcjcgcececececececececeb%m%v' * 07>!I+U6`@lJwRY|^zcxgujrlpnmpiqfreqflgigigigigigigigigid%o%y& ) 06= H+S6^BiLtV^d}jznwrturwnyj{gzhvipjmjmjmjmjmjmjmjmjme$p${%) /6< F+Q7\CfOqY|ckq}wy{urokj€lzmumqmqmqmqmqmqmqmqmqf$r#}%) /5<E*O7ZDdQn]xh튂q鄌y~{yxvpnpqyquququququququququh#t#$( /5;C)M7WEaSk`tl}wሆ܅ւр~|vstu}uyuyuyuyuyuyuyuyuyi#u"$( / 4:B)L6UE_ThcpqߖyzّҌ̉ȆÄ|wyy€y|y|y|y|y|y|y|y|y|j"w"#( . 4:A(J5SE]Ueenr؝w{Зɓď|}}~~~~~~~~~~~~~~~~~~l"x"#(. 4:@&I5QDZUceګkrФt{ɝ|™m"z!"(. 49?%G3ODXU޻aeӲiqʪq{£yn!{!"(. 49>$F2NBVT_d͹gqİn{v~o!| "(. 49>"E0L@TS]cepl{szp ~ "(. 4 9> D-J?RR[bcoizpw~~}}}}}}}}}r "(/4 9=C*H=PPYa`ngymt|{vvvvvvvvvvvt"(/4 9=>)G;ONW_^lewkqy~ysooooooooooov")/59 9=)E:MLU\\jbuh~ov{̉uʕpȡlŬgghhhhhhhhhx")/56 4<)C9KJSYYg_rezj~qwypՃkӎgҚcҧ`̱``````````|")/4, 3;)A8IGQTXa\l`u{f|sklrfza؄]؏ZלWةXջX̾X̾X̾X̾X̾X̾X̾X̾X̾").,)29(?6FBONWY]b}ajufpmjvgozav~[}V߆SޑPޝP஀Q~Q~Q~Q~Q~Q~Q~Q~Q~!&)(07'=2D=NGVP\Wwb]qgbklgeqj`vn[}pWrStPtMuKtKtKtKtKtKtKtKtKt"'.4$;.A7K?TFx[KqaPlfTgjXco[_u][{_WaTcQdMeKeKeKeKeKeKeKeKeKe$+1 8(>/|H6vQ;pY?l^CgcFdhI`mK]rMZwOV~PTRQSNTLULULULULULULULULU !'-4"{;(qC,lM0hU3e[6b_8_d:]hWr?Tx@R}BOCMDKDKDKDKDKDKDKDKDKD  "){0r7 j>#fF&bM(_S*\Y,Y^-Xb/Vf0Sk1Qp2Ou3Mz4J5I5I5I5I5I5I5I5I5I5   z%q,j2d9`?\EYK WO!UT"SX#Q\$Oa%Me&Ki&In'Gt(Ex(Ex(Ex(Ex(Ex(Ex(Ex(Ex(Ex(ջ y p i'c-]3Z8W=TBRFPJNMMQKUIXG\F`CeBhBhBhBhBhBhBhBhBhyph b" \' W,T1Q5O9M=K@JCHFGIFLDOCRAV?Y?Y?Y?Y?Y?Y?Y?Y?YU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAV(_(g) l, p1q9rBsO#p^*lj/iv4f8d;c=b?a@`A_B^C\DZDYEXEWEUFUFUFUFUFUFUFUFUFX'a'i( o+ t0v8w@xL$v[+rg2ns7k!H.R;\JfXodڑymҌs͇xȄ{Á~}}wv|vvwpvmvmvmvmvmvmvmvmg!s !&, 27= G-P;ZJcYڟmdјumʒ~tĎy}}{€{y{s{p{p{p{p{p{p{p{ph!u !&, 27=E+N:WJݬaXӥjdʞrnØ{u{|ussssssssj v &,1 7<C)L8UIִ_XͫhdĤpnxu{xuuuuuuuuk x&,1 6;B'J6SHк]WDzecmmuu}|zwwwwwwwwly&,1 6;A%H5QG[Vcckmruz||yyyyyyyyn{&,1 6;?!E3OEYUabhlouw|{zz}z{z{z{z{z{z{z{z{o}&,16 :>D1MDVS_`fkmtt{|}yssss|s|s|s|s|s|s|s|q&,16 9:C/LBTQ\^dijrqzyytplkkk}k}k}k}k}k}k}k}t&,1529B-J?ROZ\aghpowv}}wĉqlhdccd}d}d}d}d}d}d}d}v%+1//8@,H+E9NGUT\^cgzinrpslxxf|`~[ WੀU຀S~TyTwTwTwTwTwTwTwTw~#%"-5<*B6KBTL[Vza^rgeklkdro^zsXuTwPwNwMvMrMqMqMqMqMqMqMqMq# ,39'@1I;RD{ZKtaQmfWgl[br_]ycWfShOiLjIjHhHhHhHhHhHhHhHhHh ! )06#=,F4zP:sY@n_EidIdjM_pP[wRWUSWOXLYJZGZFZFZFZFZFZFZFZFZ &,3:&wA+pK1kU5g\8ca<`g>\mAXsCUzEQFNHKIIJFKEKEKEKEKEKEKEKEK ־ !(/x6n=#iF'dN*`U-]\/Za1Xg3Um4Rs6Oz7L8I9G:D;C;C;C;C;C;C;C;C; ٷ #w*o1g8b?^F [M"XS$UX%R^&Pd(Mi)Ko*Hv+F|+D,A-@-@-@-@-@-@-@-@-߱п  v n%g,`2\9X?UDRIPNNSLXI]GbEgBm @s!>{!=}!=}!=}!=}!=}!=}!=}!=}!Һ um f _& Z,V1R7P;M@KDIHHLFPDTBX?]=b;g:j:j:j:j:j:j:j:jul e^Y! T& P* M/ K3 I6 G:E=D@BD@G?K=N;R9V8X8X8X8X8X8X8X8XN)V)\*a- b2b:`C]R]`![l%Xx(V*T+S-R.Q.Q/P/O0O0M0J0J0I0I0H0H0H0H0H0H0H0H0N)V)\*a- b2b:`C]R]`![l%Xx(V*T+S-R.Q.Q/P/O0O0M0J0J0I0I0H0H0H0H0H0H0H0H0O)W(^*b- e2e9cBaP`_"^j&[w)Y,W.V/U0T1S2R2Q3Q3O3M3L4L4K4K3K3K3K3K3K3K3K3Q(Z'a(f+ h0i7h@gMe]#ch(`t,^/\1Z3Y4X5W6V7V8T8R9Q9P9P9O9O9O9O9O9O9O9O9O9S'\'c'i* l/ m6m?mJkZ$hf*eq.b~2`5^7]9\:[;ZU>T?T?S?R?S=S=S=S=S=S=S=S=U&^&f&l) p. r5r=sGqW%mc,jo1g{5d9c`?^A]B\CYDXEXEVFUFVDVAVAVAVAVAVAVAVAW&`%i%o( t- v4w<yEwS&ta-ol4lw9i=gAeDdFbHaI^K]L\M[MYNYLZIZFZFZFZFZFZFZFZFY%c$k$s' x, {3}:C}P'z]/vi7qt=nBlGiJgMePdRaS`U_V]W\U]R^N^K^K^K^K^K^K^K^K[$e#n#v%|+ 29AM(Z1}f9xqAt|HqMnRkViYf[d^b`aa``a[aWbTbPbPbPbPbPbPbPbP]#h"q"z%+ 18?K(W2b<mE{xMvTrZn_kciehfhfgfefebf]fYfTfTfTfTfTfTfTfT_"j!t!}$* 17>H(T3_>jHtR{}[watergpinkmkmkkkjgjbj^jYjXjXjXjXjXjXjXa"l v $* 0 6=F'Q3\?gKpW݃z^c{hykvmtosprpqpologobn\n\n\n\n\n\n\n\b!n y $*0 5;D&O2Y@cMۑmWӋw_͆eǂjm}pzrysxtwttqtksfr`r`r`r`r`r`r`r`d p{$*/ 5;B$M1W?ܞaMӘjW˒s`ō|fkoruv}w}wxuxoxiwcwcwcwcwcwcwcwce q}#)/ 4:A"J/߬T>ե_L̞hWĘp`ygmqtwyzz}y}r|lzezezezezezezezegs#)/49? H-ڳR=ϫ\KŤfWn`vg~mrvy{||{un~h~h~h~h~h~h~h~hhu#)/3 8>F,ӺP<ɱZKcVk`sh{nrwz|}~}wqjjjjjjjjjv#).3 7<C*N;÷XIaVi_qgxnsw{}y~s}l}l}l}l}l}l}l}lkx#).37 :A)L:VH_Tg_ngun~sx{~~z€w{wtvmvmvmvmvmvmvmvmmz#(.25 4?'J8TG\Sd]kfsm{sw{~~yur€o|ovooooooooooooooooo}"(-123>%H6RDZQb\idpkxqv|zv}qmjg|hvhphohohohohohohor"'+-'4<"F3OBXN_Ygbniuoz~tsxn{i}d~a~_{`v`o`o`o`o`o`o`o`ou!%''4=E/M>UK]Ud^lexskq|pk˅tfɑwaǞy\ĬzY½zWxWsXnXnXnXnXnXnXnXnx!( 2:B,K:SFZPbYwi`ppeiyjc߃n^ݏqY۝sUثtQսtOsPoQjQjQjQjQjQjQjQj} ' 08?*H5P@~XIv_RofXhm^bvb\fWhRjNkKkIjIgJdJdJdJdJdJdJdJd & .5<&D/N8wV?p^FieKdlP^sTX}XS[O]K^H_E_E]E[E[E[E[E[E[E[E[ؼ # +29"}@)uJ/oT5i\:db>`iB[pEVyHRJNLJNGOEPCPAOAOAOAOAOAOAOAO   '.~5t<"lE'gN+bW/_^2[e4Wl7St9O|;L=H>E?C@AA>A>A>A>A>A>A>A>Aһ  #~*u1l8f?aH"]O$YV&U](Rd*Ok+Lt-H|.E/B1@1=2;3;3;3;3;3;3;3;3Ե} t%l,e2_9Z@VGSMPSMYJ` Gg!Dn"Aw#>~$<%:%7&7&7&7&7&7&7&7&װ̽ |rj c% ],X2T8P>NCKHINFSDXA_>e;l9s6{33333333ι{q ib\ V% Q* N0 K5 I9F>DBBF@K>P;U9Z6`4e1m1m1m1m1m1m1m1mƾ|qha ZUPL#I(F, D0 B3 @7 >: <> ;B 9F 7J 4O 2S /Y /Y /Y /Y /Y /Y /Y /Y H*O*T+W. X3 V:TERRO_LlJxG F!D!C"B"B"A#@#@#@#>#<";";":":":":":":":":"I*P)U*Y- Z2 X9VDTQQ^OkLwJ!H"G#F#E$D$D$C$B$B$@$>$>$=$<$<$<$<$<$<$<$<$J)R(X)\, ]1 \8ZAXNU\SiQu!O#M%K&J&I'I'H(G(G(F(C(C(B(A(A(A(A(A(A(A(A(A(L(T'Z(^+ `/ `6^?[LY[Xg Ur#S&Q'P)N*N*M+L+K,K,H,G,G,F,E,E,F+F+F+F+F+F+F+N'V&]'b)d. e5c>`H^X]d"[p&X|)V+U,S.R/Q/P0P1N1L1K2K2J2J2J0K/K/K/K/K/K/K/P&Y%`&e(h, j4i<gEeUcb$`m(^y,[/Z1X2W4V5U6T7Q7P8P8O8N8O7O5P4P4P4P4P4P4P4S%\$c$i&m+ o2o:nClQ j_&gj+cv0a3_6]8\:ZU?T@S@SAT?TI'ޝT5ԗ^ȂhKŋqSyY^b~e|gziyjxjwiudt_sYrVrVrVrVrVrVrVcny!',1 6<G%إR4͝\AŗeKnSvZ_cfik~l}m}lzhxbw\vYvYvYvYvYvYvYdp| &,05;ݰD$ѪO3ǣZ@cKkSsZ|`dhkmnook}d{_z[z[z[z[z[z[z[fr~ &+04 9ظA"̰M2X?aJiSqZy`eilnpqqmga~]~]~]~]~]~]~]gt %*/2 5Ѿ?!ƶK0U>^IgRnZv`~eimpqrr|o{izcy_y_y_y_y_y_y_iv %*-0/=I/S<\HdQlYt`|ejmprzswstqtkses`s`s`s`s`s`s`kx$(++, ;G-Q;ZFbPiXq_yeim{pvsrtotlrlllflblblblblblblbm{"%%* 8D+O8WD_NgWn^vc~hylspnrjsgsdrdlefebebebebebebebp~ + 7B(L6UB]LeTl[}taw|fqjkmfpbq^q\p\k]f^b^b^b^b^b^b^bs - 6@$J2S>[HbP|jWuq]ozbiÃfcj^lZmVnTmTiUdVaVaVaVaVaVaVaw , 6> G.P9XC{`KsgRmoXgx\aԂ`\ҎdWϛfRͩgO˻hLgMdN`N]N]N]N]N]N]N]{ع * 3;D)M3zU7<7:797979797979797٫θ z$ q+i3b:]BYIUQRX N_"Jg#Gp%Cy&@'=(:)8*6*5*5*5*5*5*5*5*ܦѴǿyp h& a-[3W:SAOGLNITF[Bb?k;u8~530///////Ӱɻx ng_ Y% T+ O2 L7I=FBDHAN>T:[7c3k0t.}+)))))))˸vld ]WQM#I)F. C3 A7 ?< <@ :E 8K 4Q 1W .^+e)l'r'r'r'r'r'r'rýylc\U PKGD!A%?)=-;194785=2A0F-L *Q 'V &Z &Z &Z &Z &Z &Z &Z C+H*M+O.N3 M; JEGQD^@k=w;98765543330/..,,,,,,,D*J)O*Q-Q1 P9 MCKOH\DiAu?=<;:99887643311111111E)L(Q)T+U0 S7 QBONLZHgFsCA@?>==<<;987665555555G(N'T(W*X/ W5 U?SKPXMeJqH}FED C B!A!A!@!?!=!\AZCXDXDWEVEWCX?YeCcEbGaI_J^K]K]K\J^F^B^?_<_;_;_;_;_;_;X bks z&,2 9AM#}Z,xd5so=pyBmFjIhLgNeOdPcPbQbPcLcGdDc@c?c?c?c?c?c?[enw~%+1 7?J"V,݁a6|k>wuDt~IqMoOmRlSjTiUhUgUhQhLhHgDhChChChChChC]gqz%*0 5<G ݎS,ԉ^7̓h?~qFzzKwOuRsUrWpXoYnZmYmVmPlLlHkGkGkGkGkGkG^is}$).4 :EՖQ+͐\6Ŋe?nFvL~Q{TyWxYv[t\s]r]rZqTpPoKoJoJoJoJoJoJ`kv#(-2 8ڡBϜN*ƖY6c?kGsM{RVY}\{^z_y`x`v^uWtSrNrMrMrMrMrMrMbmx#(,05ԧ@ɡL)W5`?hGpMxRWZ]`a~b|b{ayZwUvPvOvOvOvOvOvOcoz"&*.۲0 έ>ĦJ(U4^>fFnMvS~W[^acddc~]~|W|zR|yQ|yQ|yQ|yQ|yQ|yQeq}!%()պ- ɳ;H'R3\=dFlMsS{X\_bdf|fyex_wYv~Tv~Sv~Sv~Sv~Sv~Sv~Sgs #$޺!* Ĺ9F%P2YI+R6Z?bGiNyqSsyXn]i`dc`d\eYdYaZ\[W[V[V[V[V[V[VqԶ /;F'O2X;`CxgJroPlwUfYa\\_XaTaQaQ^RZSVSUSUSUSUSUSUu خϻ "/ 9C#M-~U6w]>peEjmJduO_SYȊVUƗYPæ[M[J[IYJVKRLQLQLQLQLQLQz ҳ"- 7@~I'vR0o[7ic>cjC]sGX}KRۉNNٗQJ֦RFԷSDSCQDOELEKEKEKEKEKEK լ̹ * 3~;uE!nO(hW/b_5\g:Wo>RyAMDHFEGBH@H>G>E?D?C?C?C?C?C?C٧ϳſ' /u7l@fI!aS%\\)Wd-Sl0Nt3J6F8B9?:=;;::999999999999999ѮȺ# v+ n3f:`C[LWTS\"Ne$Jn&Gw(C*?+<-:-8-6-5-5-5-5-5-5-5-ԩ˶ vm& f- _4Z<UDQLNSJ[FcBl>v;7 5!3"1"0"/"/"/"/"/"/"إͲü~tld ^' W- S4 O;KBHHEOAV=^:g6q2|/,*(((((((ϯŹ~rj b[UP%K+H1 E7 B= ?B ,;0956:4@1F-M )T %\ "e l v y y y y y y vi^VOJ FB?<9"7&5*3.02.7+<(B$H!NT[]]]]]]>+C*F+G.G3D; AD >P:]6i2u0.,+*))((''%#"" @*E)H*J,I2G9 DC AN=[:g6t420/.--,,++(''%$$$$$$$A)G(K(L+L0J7 HA EMBY>e;q8~654322100/-,+*)))))))C(I'M'P)P.N5 L? JJGVCc@o={<:987766632100///////E&L%Q%T'U,T3 R< PHMTI`FlDxB@?>>=<<:987666666666H%O$U$X%Z)Z1 X9 VDSQP]MiKuIGFE D C!C!B!@!?!>!>!> >>>>>>>>K$R"X"]#`(a/ `7 \@YMVZTfRqP|!N#M$L%K&J'I'G(F(E(D(E'E&E$E#F"F"F"F"F"F"N"V \ a!f&g- g5 d=`H^V\cZn"Wx%U(T*R,Q-P.N/M0L1K1K0L.L,M*M(M'M'M'M'M'M'P!Y`fk%n,n3 l;iDgRd_!aj&^u*\.Z1X3V5U6T7S7R8Q8Q8R5S2S/T-T,T,T,T,T,T,S \djp$t*u1 t8rApNm[#if)fp/bz3`6_9]:\<[=Z>Y>X>W>X;Y8Z5[2Z0Z0Z0Z0Z0Z0U_gou#y){/ |6 {>yJuW$qb+ml2jv6h:e=d?cAaB`C_D^D]D]A_=`:_7_5_5_5_5_5_5Xajsz"~(.4 ;G~S$z^,uh3qr9nz=l@jCiEgFfHeIdIcIcGdBd>e;d8d8d8d8d8d8Zdmv~!',2 9ߋDՆP#́[-|e4xn:uv?rBpEoHmJlKjMiMhMhLiGiBh?hǓK"V,_4h;pAxE|IzLxOwQuRsSrTqSrNpIoEnAnAnAnAnAnA_ju"%(أ-˞<H!S+]4e;mAuF}JM~P|SzUxVwVvVvQtKsGrDrDrDrDrDrDalw !ߥ!Ѩ+ƣ:FQ*[3c;kArFzJNQTV}X|X}{X|zS{xNzwIyvFyvFyvFyvFyvFyvFcnyڮ̭(8DO)Y2a:iApFxKORUX|YxZvYuUt}Ps{KszGszGszGszGszGszGep|Ӵdz&5BM(V1_9f@nFuK~OS|VxXtZq[nZnWmQmMmImImImImImIgrլ̺ #3@J&T0]8d?lEsJ{OzSuVqYmZi[g[fXfRfNfJfJfJfJfJfJiu٥а0 =H$R.Z6b=iD}qIxyNsRnUiXeZb[_Z^X_S_N_K_K_K_K_K_Klx  өʵ- :E!O+X3`;{gAvnFpvKkOfSbV]XZYWYUWWRWNXJXJXJXJXJXJo} ףήĺ)7BL'U0z]7te=nlCitHd}L_OZRVTRUOUMTOOPLPIPIPIPIPIPIs  Ҩɴ$3>I"yR+sZ2mb8gj=brB\{FWJSLNNKOHOFNGKHHIFIFIFIFIFIFx֣ͮù$0 ;yEqO%kX+e`1`h6Zp;Uz?PЅBLΒDH̡FDʲGBGAFADABB@B@B@B@B@B@~۝ЩǴ"- x7qAjKdT$^\)Ye.Tm2Ow5J8F:BWGSPOXJaFjBt >!;#8$6$4$3$2#1#1#1#1#1#1#ݛѨdzy pia'[/ U7 Q?MFINEVA^=h:s620.,+++++++ԥʰxog`Y S'N.J5 G< CC @J *@+@.?3<:7D 3O .\ *h &t # !            ;*?)B*B,A1>9:B 7N 2Z .f +r '~ % # # " !               =(A(D(E+D0A7?@ AI >U 9a6m3y1//.-,,++)('%$## # # # # # A&G$K$M&M*K2J< HF DR@^=j:u8765443310/.-,,,,,,,,D$J#O"R$R'S/Q8 NC KOH[EgBr@}>><<;;:8765555555555G#N!S W!Y&Z-X5 U? RKOWLcIoHyFEDCBB@?>====>>>>>>>J!RW[_$a+`3 ]< YGVTS`QkPuNL K!J#I#H$G%F%E%D%E$E"F!FFFFFFFMU[`e#h*h1e9 aB_O\\ZgWq!U{$S&R(Q)P*O+N,M,L,L,L*M(M&M$N#N"N"N"N"N"PX_ek"n(o.m6 j>hKeXbc _m%]w([+Z-X/W0V1U2T2S3R3R1S.T+T)T'T'T'T'T'T'S[cjp t&u,u3 s;qGnTj_"gi'es+b|/a1_3^5]6\7[8Z8Y8X8Y4Z0Z.[+[+[+[+[+[+U^fnuy$|*}0|8 zDvPr[#oe)ln.iw1g4f7d9c:bh?fAeAdBcBd=d9e6d3d2d2d2d2d2Yclu| $(ۍ/ω=ƅIU#|^*yg0vo5tw8r

n@mBlDjEiEhEhAh=h9g6g5g5g5g5g5[enx "Ԕ,ɏ;GR#\*d0|l5yt:w|=u@tBrEpFoHmHlHlEl@l{AyDwFuHsJrKqKpHpB~p>}o:}n9}n9}n9}n9}n9_is}Ԟɞ&6 BM!W)`0g6o:v>B~E|HzJxL|wLyuMwtJxuEwt@wrpv=pv=pv=pv=pv=bm y ߖҟɧ !1 >IS'[/c5k:r?zC}FyIuLqNnOkOiNjHj}Cj{?j{>j{>j{>j{>j{>ep {  ֚͢¬/ <GQ&Y-a4h9p>{xBvFrInLjNfOdOaOcIcDcAc?c?c?c?c?gr  ەўȧ,9DN$W+_2~f8yn=tuAo~EkIgKcN_O\OZN[I\E\A\@\@\@\@\@j v ֙͢ë(6AK!T)}]/wd5rk:ms?h|CdF_I[LWMTMRLSHTDUAU@U@U@U@U@m zܔўȧ #2 >H|Q%vZ,pb2ki7fq;az?\CXFTHPIMJKIKFLBM?N>N>N>N>N>q֙ͣí.:{EtN oW'i_-dg2_o6Zx:U=Q@LBIDFDDCDAE>F;>:>8?6?6?6?6?6?6}̥֚¯z%r1k<eF_PZYUa"Qj&Lt*H-Dڍ/@؜1=խ2;29190808/8.8.8.8.8.ܕТƬ{s!k,c6 ^@XJTSO\KeGoCy"?$<%9&7&5%4%3%2%2%2%2%2%2%Ԟʩ{skd']0W9 SB NKJSF\Bf>p:}7420/.,,,,,,ٚͦırj c\ V)P1L9HA EI AQ =;D7L3T /^ +j &x "         ɭwj^VP KFA=$:*70461=-D)L$V bo~´zl_TLFA= 9520#-(*.'4#:BLVb nzqdWKC=951. +)&$ !%+17@ IR[dggggg6+9*:+:.733:-D'O![gs     7*;(<)<,:1681B,M'Y"eq|   9(='?'?*=/966@2K-W(c $n !y          <&?%A%B(@,=3<=9H4T /` ,k )v & $ $ # " " ! >%B#E#F%E)D1B:@E

KI GU D`Ak@v>=<<;;99776666666666G MRUY"Z)Y1U: RE OQL]JhHrG|FEDCBA@????????????JQV[` b'a.^6Z@ WLTYRdPnOxMLKKJ I!H!G!G!F!GGGGGGGGGMTZ`fh%h+f3c< `H^U[`YjWtV|!T"S$R%R&Q'P'O(N(M(N%N#N!NNNNNNPW^ekn"o(n/k7iD fPc\af_o"]w$\'[(Z*Y+X,V-U-T.T.T+T(U%U$U"U"U"U"U"RZaios u%u+t3q@ nLkXib fk$ds'c{*a,`._/^1]2[2Z3Y3Z0Z-Z*Z'Z&Z&Z&Z&Z&U]dmsx{!|%|.y< vIrTo^!mg%ko)iw,g/f1e3d4b5a6`7_7^5^1_-_+_)_)_)_)_)W_gpw|ރ҃*ǀ9 }FyQv[!sd&ql*os.m{1k3j5i7g9f:d:c:b9c4c1c.c,c,c,c,c,Yaj sz؉ˉ'7 CN|X!ya'vi+tp/rx2q5o7m9l;jmt9mt6mr3mr3mr3mr3mr3`ju  ӏʖ-:EOX%`*g/n3}v7y~;u>q@nBk}Dh{DezDfy?fy;gx7gw5gw5gw5gw5gw5b lxٌϓŚ*8 CMV$^)e.{l3wt7s|:o>k@gCdDaD^D^@_<`~8`}6`}6`}6`}6`}6e o{Ԑ˘'5 @JS"[(zc-uj1qr6lz9h=d@`B\CYDWCW@XY@UARBPBO?Q;Q8R6R6R6R6R6kx֐̚¡.:}DwNqV"l^'hf,cn0^v4Z7V:Q=N>K?H>H1<1;0;/;-;,;,;,;,;,|ތјȢxoj)e6_A ZKVTQ]MfIpE{"A·$>͖&;˦'8ɻ(7'6'6&5&5%5%5%5%5%ה̟©qic$]/W:SE OO KXGaCk?v<964210/.....ݏМƧwic\V)Q3M<IEEO AX =b:m6y31.-+*((((((ԙɥ|naZ UO!J*F2B;?C;L7U3_ /k +y ( & $ # " ! ̣íqdXRLGC ?(;/865>1F-O(Z$f uŬtgZOIC?;74#1)./+6&>!FQ^l} xi\PG?;62 /,)&!#' -4<G S`n~}oaTH>72-*&#! #* 1;EQ]gppppp2+4*4+3-/3):"CNZf r|3)6(6)5,21-8&A LXdo z 6(8&9'8)5.05,?'I!Ualw     8&;$<$<&9+523</G*R%^!it~  ;$>"@"?#='==<;::99988888888GMQUZ[$Z+V3R>OJ LV KaIkHuG}GFEEDCBBAAAAA@@@@@JPU[`b!a(^/Z8XE VR T]RgQpPxONNMLKJIHHHHHHHHHHMTY`egh$f*b3a@_M ]X[bYkXsW{VU T!S"R#Q#P$O$N#O OONNNNNOV\ dilml$k.i<gIeTc^ag_o^w ]~"\$Z%Z&X'W(V)U)T(T%T"T TTTTTRY` hmprqr*q8nElPiZgcfk ds#cz%a'`(_*^+],[-Z-Y-Y)Y&Y#Y!X!X!X!X!T[ c kqtv wy&x5uBrMpWm`kh!jo$hw'g)f+d-c.a/`0_1]0],])]&]$]$]$]$]$V^ f n t x {}#~3{? xJuTs]qe"ol%mt(l{*j-i/g1f2d3c3}b3|a0|a,{a){a&{a&{a&{a&{a&X` iq w|Ѐǃ 0= ~H{RxZvb"ti%rq(px+o.m0l2~j4{i5yg6vf6uf2uf.ue+te(te(te(te(te(Yblt{ԁ˅.; FO~X{`"yg&wn)uv,s~/~r2{q4wo6tm7rl7pk7nj4oj0oj-oi*oi)oi)oi)oi)[ dnw~ЅNJ+8 CMV^"~e&|l)~zt,{y|0xw2tv5qt7nr8kq9ip9ho6hn1in.im+im+im+im+im+] fqzւ͉Ž(6 AKT\!c%|j)yr-uz0q}3n{5kz7gx9dw:bu:at7bt3bs/br,br,br,br,br,` it~ӇɎ%3?IRZ {a$wh(sp,ox0k3h5d8a9^}:[{:Zz8[y3\x0\x-\x-\x-\x-\x-bmxڂϋŒ "0< F~OyWu_#qf'mn+iv.e2a5]7Z8W9T9S8T3U0U~.U~-U~-U~-U~-eq|Շː-9 ~CxMsUo]!jd%fl)bt,^}0Z3V5S7O7M7L6M2M0N-N-N-N-N-iu݂эǕ(}5w@qJmRhZdb"`j%[r)W|,S/O2K3H4F4E3E0F.G,G+G+G+G+m{؈͓Û{#u1p< jFfOaW]_Yg!Tp$Pz'L*H,E.B/?/>.?,?*?(?(?(?(?(sҏșxqm+g7cB ^KYTU]QeMnIx!E#B%>';(9'9'8&8%8$8$8$8$8$zڊ͖ğsfb!^0Y;UF QO MYIbFkBu?ł;Ð86433222222Ғȝ|l^WS&P3L>IIES B] >g;r85؎2֟0Գ..,,+++++؎̛¥seXRMI*E5B?>I;S8]4h1u / , * ) ' % $ # # # # # Иƣxj]QK FB!>+;38<4E0O-Z)g%t#!ɢ|naUJD?:7 4'1/.7)?%I!Taq     ªqdWLB;73 /,)!&(#/7@KY i|ugYMC:3/+'# !&- 6AO^n{l_RF;2+&"  #+6BP]jwyyyy.*/).*+-&2 9B MYeo{0)1(1(.+)0#7@J Wbmx2'3%3&1(--&4"=HT_ jt4%6#7#5%1),1*;$EP\gq {    7"9 : 9!6%4.27.B(M#Xcmw          : =>=<"<*:47>2I-T)_&i$s#|""!! =ACCDD'B0?:;E6P3[0f.o.x--,,+**)'''('''&&&&@EGHLL$J,F5C@?K>=<;;;::9 9 9 9 GLPUYZY#U+P4OAMNMY Lc KkJsJ{IIHGFEDCCCBBBBBBBIOS Z^`^[$X/X<WIVT U^TgSoRvQ~POONMKJIIIIHHHHHLR X_ cdc_a)a8`E ^P ]Z[cZkYrXyWVUTSR P O ONNNNNNNNU [c g h g fi%i5gA eLcVb_`g_n^v]}\[!Y"X#W$U$T$T"SSSSSSSQW_fjlmmp"o1m> kIiSh\fdekcrbz a"_#^%]&['Z'Y'~X%}X"}X|W|W|W|W|WS Zbinqss uu.s;qF oPmYkajhhogw!e#d%c'b(~`*{_*y]*w\(v\%v\"u\ u[u[u[u[U \elqvxy{{,y9vD tNrVp^nemlkt"j|$h'|g)zf*we,tc,rb,p`+p`'p`$o`"o_ o_ o_ o_ V ^gouz~)~6|A yKwTu\scqj pq"|ny%ym(vl*sk,pi-nh.lf.je-je)jd%jd#jc"jc"jc"jc"X`jry&4? I|RzZxa}wh yuo#vtw&sr(pq+mo-jn.gl/ek/cj/di*di'dh$dh#dh#dh#dh#[cmv~ƃ#1= GPW{~_w|f t{m#qyu&mx~)jv+gu-dt/ar0^q0]o0]n+^m(^m%^l$^l$^l$^l$]fpz͂È /: D~MzUv]rdnk#ks&g~|)d}+a{-]z/Zx0Xv0Vt0Ws,Wr(Xr&Xq%Xq%Xq%Xq%_itʇ,8~B yKtSp[lbii!eq%az(^*Z-W.T/Q}0O{/Py,Px(Qw&Qw%Qw%Qw%Qw%bnyЄƌ(}4x? sHnQjYf`bh_o#[x&W(S+P-M.J.H-I*I(J&J~$J~$J~$J~$fr̉‘|#v1q<lE hNdV`^\eXnTw"P%L'I)F*C*B*B(B&C$C#C#C#C#jxӅȏysn+i7eA aK \SY[UcQlMuI F#B$?%=%<%;#<"N^m|))))()$,18ALWcnx+(,'*'&* /6 >IU`kt~.&/$.%*'$+2< FR]hq{1#1"1".$('#/ 9CN Ydnw3!542-#+,)6#@JU`j s { 68865 4(12-<'F"Q\fow 9<=;<<%:.681B,M(X&b$l$t$|##""!!  =@ABDC!A)=39=5H2T0^0h/q/y/////..-,,+++*****@CEHKKH$D-?7== < < ; ; ; ; FJ NT WVSLN*O8PEOPNZ Nb Mj LqLyKJIIHGFEDCCBBBBBHMRY[ [ V TW%Y4XAWLVV U^ TfSmRtR|QPONMLJIIHHGGGGK PV]`_^\_!`0`=_H]R \[[cZjYqXxWVUTRQONNN~M}M}M}M}MM RZ`cffd fg-f:eE cO bWa__f^m]u\}[YXW~V{TySxSwRwRvQvQvQvQOU]chkljlm*l7jBiL gUf\ddcjbr`y_~^{] y\!vZ"tY"rW"qWqWpVpVpVpVpVQW`flprpqr'q4p?nI lRjZiaghfo}ewzdxc ua"r`#p_$n]$k\$k[ k[jZjZjZjZjZSZcjquwvww$v2u=sG qPoWm_}lezkmwjtth}rg!of#le$jc%gb&e`%e`"e_e^e^e^e^e^U]fnuy||||!|/z;xE vMtU{r\xqcupkrnrom{ll"ik$fj%ch&ag'_e&_d#_c _c_b_b_b_bW_iry~ -8}B ~{KyzSvxZrwbouiltpisy fq"cp$`o&]m'[k'Yj'Yh$Yh!YgYfYfYfYfYcmv~*6}@ xI tQq~Xm}`j{ggzncyw`w"]v$Zt&Ws'Tq'So'Rn%Sm!SlSkSkSkSk\fq{Ń&}3w=sF oOkVh^deam]uZ~!W}#S{%Py&Nw'Lv&Lt$Ls!MrMqMqMqMq_kv̀{"v/q:mD iL eTb\^c[kWtT~P!M#J$G%E}$E{#Ez FxFwFwFwFwcp|Ȇy so+k7f@bI _Q[YXaTiQrM|IF C!A"?!> ??????iw΃Črjg%c2_<[FWN TV Q_MgJpF{C?=:98888888o~ʊma ]Y+V7SAOJLS I\ Fd Bn?y<96432211111xІő{jYQN"K/I:FDCN@W=a;k 8v 5 20.,,+*****ׂʏteUF@>"3+ (% #* 4?LYiz  vh[NC8.&" %.9 ETfyzk^QF;2)  &1=M`upaTG=3+" (4DWlvhZM@5+#  *:L_s%($(!)+07@IV`kv''&%$&)- 4<GS]hr{*$)#'#"%*0:DOZenw,", * %"%-7 AKVajs{/0.*#!"*3=G R]fow~232.,+&'/!9CNX b k s z 676343"0++5%> IT^gow~9;: ;<:7&2/-9(D&O%Z%c&l&s'z''''''&%%$$##""""<> > B CA<7(22/>1J2U3_3g4o4v4}44332210/..--,,,?B CH I GA:8+;9=E>P>Z>b>j>q>x===<;; 9 8 8 7 655555B EHMNK D @D&G4HAHLHUG^GeFmFt E{ E D D C B A @ ? > = < < ; ; ; E HMRSQNJN!P0Q<PGPQOZNa Ni Mo Lw L~KJIHGFDDCBB A A A GJQVXZXT VX,X9XDWNVV U^ Te SlRsQzQPONL~K|IzIyHxHxGwGwGwGIMUZ^`_\]_)_6^A]J\S [[ Zb YiXpWwVU}T{SyQvPtNsNrMqLqLqLqLqLKPX^cffbce%e3d>bGaP `X __]f\m~[t{Z}yYvXtWrVoTmSlRkQkQkPkPkPkPMS[bhklhij"j0i;gEfM dU c\}bczajx`ru_zs^p]n\kZiYgWfVeVeUeTeTeTeTOV^flpqnn oo-n9lBkK ~iS zhZwgaufhreopdxmbjah`e_c]a\`[`Z_Y_Y_X_X_XQYbjqtvts tt+s6q@}oI ynQ umXrl_pjfmimjhvggefbe_d]b[`Z_Z^Z]Z]Z\Z\Z\S\fouy{zyyy(x4|v>wuF tsN prVmq]jpdhokentbl~_k\jYhWgUeTcTbTbUaU`U`U`V_jsz~~~${~1v|;r{DoyL kxT hw[evbbuj_sr\r|YqVoSnQlOjNiNgOfOfOeOeOeXcoxz!u.q9mBiJ fR c~Y`}`\{hYzpVyzSwPvMtKrHqHoHmHlHkIkIkIk\ht}y so*k5g?cG`O ]W Z^VfSoPxMI}G|DzBxAvAtBsBrBqBqBqanzÃrkg%d1`;]DYLVT S\ PdMmIwFC@><;;|;{;y;y;y;yguʀnb^[,X7U@RIOQLZ Ib FkBu?<:765544444n|ƈ}jZTQ$O0L;IDFMDVA_>h ;s 8 531//.-----w̅wfVI EC'A3?==G:Q8Z6e3p0}., * ( (' & & % % % ҁƎpaRC8 53'220=.H-S+^)k'y%#!ˋxi[M?2' $"#!/:FSaṕ˔ɪŕ~oaSF:/$*6C Q asޜܴseXK?4*! %0=M_rxi[NB8.%  )6FZp}m_QE:0'  .>SitfXJ>2(   %5I_t ''(*/5=GS^js|"%!$%' ,29EO[fpx%##""$(.6BLWblt|( &## +4>HS^hpw~+*' '1:DOYcksz..+%# #-5 ?JU_gou|11.++)$(1:E P Z c k r x  55 3 3 30+"%+4?KU^fmt{88 7:: 60)""-$9'E)P+Y,b,i,p-w-~--,,+*))(''&%%%; <=@@; 2*/'245@6K7U7]7e7l7r7y7766543210//...>?BFEA;7;!>0?<@G@P@Y@a@h@n@u?}?>>=<;99876555@BGJKLGB EG+I8ICILHUH]HdGjGqFxF E D C B A ? }? |> z= z< y< y< y< CDKOSTRLMO'P4P?PIOQOYN`MgMn Lu K} K J ~I{HyFwEuDtC sB rA rA rA rA DHOUZ[ZTUV$W1W<VFUNUVT]Sd Rj Qr }Qz zPxOvNtMqKoJnImHlGlF kF kF kF FKSZ_a`Z[\ ].\9\C[KZSYZ }Xa {Wh xVo vUwtUqToSmQkPiNgMfLfLeKeJeJeJINW_dffaa bb+b6a@`I}_Pz^W w]^ u\e r[lpZunY~kXiWgVdUbSaR`Q`P`O_O_O_OJR[chkkhf gg(f4e>{dFxcNubU ra\ o`c m_jk_rh^|f]c\a[^Y\W[V[U[TZSZSZSZSLU_gmppnlkl%~k1zj;viDshLpgS mfZ jea hdhecpcbz`a^`[_Y]W\UZUYUXUWUWUWUWNXckquvtqp~p"yp.uo9qnAnmIklQ hkX ej_ cig`io]hx[fXeUdSbQ`O_P]P\P[P[P[P[P\gpvy{zv}vxvsv+pu6lt?isGfrOcqV `p] ]oe[nmXmvUlRjOiMgKfJdJbJaJ`J`J`J`Talu{}w| q|n|(j{3g{=czE`yM]xT [w[ Xvc UtkRsuOrLqIoGmElDjDhDgDfDeDeDeYfqzqkg$d0`:]BZJWRU~Y R}a O|jL{sIy~FxCvAu?s=q=o>m>l>k>k>k_lw~nc_\+Y6V?SGQONWK_ Hh Eq B}?=:}8{7y7w7u7t7s7s7sfs~|j[VS%Q1N:LCILFTD]Af>p ;{ 9 64211 0~ 0} 0{ 0{ 0{ n{yfVKHF*D4B>@G>P;Y9c7m4y1/ - + * * ) ) ) ) ) vȃtcRC<: 8,665@3I2T0^-i+v)'%##"!!!!!΀Œ}m^N@2-+ )+'5&@$K#V!c pNJufWI;/#'2>JXgw  {l^PC7+! !-:HXh{ѐΦqcUH<1' '5DVh}ufYK?4*!  .>Rf|zk\NB7-#  &7LbyrcUG;/% 0DZp&%&)-2:EQ]hqy$## %*/7BNYdmu} !  !%*4>JU`iqx#  (1;FQ\eltz&$ %-6ALW`hou{)'" )2<GR[cjpv|-+& # "$-7BLV^elrx0. *+)%& 0 ; FPYahnu{3 2020* !(5@ K"T#\#c$j$q%w%~%%%$#""!! 65685-&!&#*0,;-F.O/X0_0f0m0s1z000/.-,+*)((((98<==;5/ 25+778B9K9T:[:b:i9o9w9~98875432}1|0|0{/{/;;ACGFB;<?'@3A>BGBPBWA^AeAl@s@{@?>~=|<z;x:v8u7t6s6s6s6=?EKOOLEEG#H/I:IDILHTH[GbGhFoFw|EzExD vC tB r@ p? n> m=m<l;l;l;@CIQUVTNLNO,O7OAOINQNX~M^|LeyLlwKtuK} sJ qI nH lG jE iD hC gB fA f@f@f@BGOW[][US TU)U4U>TF}SNzSUwR\uQbsQjqPq oOz lO jN hM fKdJbHaG `F `F `E `E `E CJT[`ba[YZZ&Z1~Z;zYDwXKtWRqWYoV`mUg kUo iTx gS dRbQ`P^O\M[L[K [J ZI ZI ZI EMX`egfb___#|_/x^8u^Aq]Io\Pl[Wj[^hZe fYm cYv aX ^W\VZTXSVQVPVO UN UM UM UM FQ\dikkhdc{d wd,sc6ob?lbFjaNg`Ue`\c_c `^k ^^t \]Y[WZTYRWQUPTPSPR PQ PQ PQ IVahmppni{huiqh)nh3jg<hgDefLbfS`eZ^da [ci Ybr Va}T`Q_O^M\KZKYKWKV KU KU KU MZemruutpvn pnln&hm1em:cmB`lJ]kQ[kXXj` Vih Shq Qg{NfKdIcGaE_E^E\E[EZ EZ EZ R_jqwz{zwptitft"bt-`s7]s?ZrGXrOUqVSp^Pof Mno Kmz HlEjCiAg@e?c?b?` @_ @_ @_ Weow|~~m|b{_{\{*Yz4Wz=TyERyLOxTMw\JvdGum Dtx Bs ?q=p;n:l9j9h 9g 9f 9e 9e ^ku}{j\ WT%R0O9MAJJHRFZCbA~l>|w ;{ 9z 7x 5v 3t 3r 3p 3n 3m 3l 3l eq{xgWNKH*F4D=BE@N>W<`9j7u420. -~-{,x,v ,u ,u ,u lyucSD @>#<-:78@7I5R3\1g/r,*('%%%$$$$uÁp_O@4 20%./-8+B*L(W&b%n#}!zjZK=/$ " $.8CNZhwÉrcTF8,   + 7 BO^mxi[M@3('3@O`qņÛ}n`RE9.# ".<M_s܊ڣսsdVH=1' (7I^twhZL@4)  !2D[q~oaRE7,! +?Ul%$$'*08DP\gow~"! !$&,5@LXckry "(1<HT^gnt{%.8DOYbiou{! "*4?JT\djpv|$   %/9DNW^ekqw}'$  )3>HQY`gmrx* '!" !,7BKT [ b i o u | .*))$  %1<FOW^dkqx0-//+(!!,$7%A&J'R(Y(`)g)m)t)|)))('&%$#"!~!~!3056861( *-'/20=1F2N2V3\3c3j3p3x32210}/{.y,w+v*v)u)u)55:@BB=657"9.:9:B:J;R;Y;_;f:m:t:}}9z9x8v7t6r4q3o2n1n0n0n07:@GKKG@=?@*A5A>BGBNAUA\}Ac{Ajx@qv@zt?r?p>n=l;k:i9h8g7g6f5f59>FMQROIE FG'H2H;HD|HKzGRwGYuG`sFgqFnoEwmEkDiCgBeAc?b>a=a<`;`:`:;ALSWXVPLLM$M/|N8yMAvMHsLOqLVoK]mKdkKliJtgJeIcHaG _E ]D \B[A[@Z?Z?Z?=FQX\]\VRRR!zR,vR6sR>pRFnQMkQTiPZgPbeOicOraN|_N ]M [K YJ WH VG VE UDUCUCUC?JU\aba]W~WyWtW)qW3nW<kVChVJfUQdUXbU``Tg^Tp\SzZR WQ UP SN RL QK PJ PH PHPGPGCOY`egfc]y\ s\o\&k\0i[9f[Ac[HaZO_ZV]Y^[YfYXnWWy TW RU PT NS LQ KO KN KM KL KKKKFS^eikkidtanaja#fa.ca7a`?^`F\`MZ_UX^\V^dT]mQ\w O[ LZ JY HW GV FT FR FQ FP FP FP JXbinpqo~joghfdf af+^f4\f<YfDWeKUeSSdZPcbNckLbuIa G` E^ C] A[ @Y @W @V @U @T @T P]gnsvvu|qmnal^l[l'Xl1Vl:TlBQkIOkQMjXKiaHijFhtCg Ae ?d =b ;a ;_ ;] ;[ ;Z ;Z ;Z Vclty|}{zyjv[t WsTs$Qs.Os6Ms?KrFIrNGqVDp_Bph@or=n;l9k 7i 5g 5e 5c5a5`5`5`\irzxh~W|N{L{I{)G{3Ez;DzCBzK@yT>x\;xf9wq7v}4t2s0q/o/m.j.i.g.g.gcoyudTF B@$>.<6;?9G7P6Z4d1o/|-}+|)z(x(u's'q'o'o'okwq`QA864'2009/B-K,U*`(k&y%#! |zxxxt}m\L>/)(&($1#;!D OZgu~wgWH:-(1;FS` n  o`QB5)%0;GUduufXJ=0%#.:GWh{{k]OB6*   *7FXlсϙ̱paSF:.$ #2CXnteWI=1& ,>Un|m^PB4) ':Pi#"#$(.7CO[elsz!  !$)3?KW`hou|$/;GR[cjpw|"+6BMV^ekqw| '1=GPX`flqw|  ",6AJSZaglrw}!  %0;DMT[bgmsy$ *4>GOV]ciou|'! " - 8AJQX_ekry*$'&'$ (3<E M T![!a!g"n"u"}""! ~|zyxxx,*,242-$#&#(.)8*A*H+P+W+],c,j,q,z,}+{+y*w)u's&q%p$p#o#o#./5<>=82-01*243=3E3L4S4Y~4`|4gz4nx4vv4t3r3p2n0m/k.i,i+h*h*h*/3=CFFB<6 79&:0:9:A};Iz;Px;Vv;]t;dr:kp:sn:}m9k9i8g7e5c4b3a1a0a0a019CJMMJD>>?"@-{@6xA>uAEsALq@So@Zm@ak@hj@qh?{f?d>b=`<^:]9\8[6[6Z5Z54>IOSSQKED}ExF*uF3rF;oFCmFJkEPiEWgE^eEfcEnaDx_D]C[BYAX?W>V<U;U:U9U97CMTXYWQL|JvKrK'oK0lK8iK@gJGeJNcJUaJ\_Jd^Il\IvZHXHVGTERCQBP@P?P>P=P=;HRY]^\XRwP qOmP$iP-fO6dO=aOD_OK^OR\OZZNbXNjVNtTMRLPKNJLHKFKEKCKBKAKA?MV]acb^XrUkTgU!dT+aT3_T;\TB[TIYTPWSXUS`SSiQRsOR~MQKOINGLFJFIFGFFFFFFDQ[bfggd}_mZfZbZ^Z(\Z1ZY9XY@VYGTYORYVPX^NXgLWqJV}GUETCSBQAOAMALAKAJAJIV_fjllj{elb`_\_Y_%V_.T_6R_>P_EO_MM^TK^]H]eF\oD\{B[@Y>XbzjY0 -+!**(2';&D$N"X!dq~{yvtrqqs}zjYJ;-! "+4=GS_m} ~ |{{|tdTE7*  ! + 5?KXfv|l]N?2&   *5@N]lsdUG9-!  (3@OasxiZL?2'%1?PcyŒî}m_PC7+   !.>Qf~rcTF:.# *<Qhyj[L>1&$8Oh!!!"%,5BOYbipw}  &1>JT]elrx~"-9EOX`gmsx~ )4?IRZagmsx~ $/:CLT\bhmrx~  )3=FNV\bhmsx#-7@HPW]chnsz '1:CJRX^diov} *4=E L S Y _ e l sz  } | |{!"#  $.8@GNU[ahow~|zxvtsrrq#")/0.(! *"3#<#C$J$Q$W%]~%d|%kz%sx%|v%t$r$p#n!m kjjii$(28:94.& (*%+/,8,?~,F{-My-Sw-Zu-as-hr-pp-yn-l-j,h+f)e(c'b&b%a$a$&0:@CA=8002!2+{34x4<u4Cs4Jq4Po4Wm4]l4ej4mh4vf4d3c3a2_0]/\-[,[+[*[*+7@FIIE@97|8w9(t91q:9o:@l:Fj:Mh:Tg:[e:bc:ja:t_:^9\8Z7X6W4V3U1U0U/U/.<FLOOLGAz= u>q>$m?.k?6h?=f?Dd?Jb?Q`?X_?`]?h[?rY?}X>V=T<R:Q9P7P6O5O4O44AKQTURMHuC oCkC!gD+eD3bD:`DA^DG\DN[DVYD^WDfVCpTC{RBPBN@L?K=K;J:J9J8J89FOVYZXS~NpIiHeHbI(_H0\H7ZH>XHEWHLUHTTH\RHdPHnNHyLGKFIEGCFAE@E>E=E<E<=JTZ^_]Y{TlOdM`M\M%YM.WM5UM<SMCRMJPMROMZMMcKMlILxGLEKCIBHAF@D@B@A@@@@BOX^bdc_yZjV^S ZSWS"TR+RR3PR:NRAMRHKRPIRXHRaFRkDQvBP@O>N=LVu^T<]^;]h9\s7[5Z3Y2W1U1S1Q1P1O1NS_gnrttrtoflUhGe CeAe"?e*=e21lF0lO.kY-kc+jo)i~'h&f$e#c$`$^$\$[$[altzo~_{Oy?v2u 0u.u!,u*+u2)t:(tB'tK%sU$sa"rm q{pnljhedcbis{}l[K<-%#"~$ ~,~4~=}F}Q|]|j{xywuspnlkkq{wgVG9*%-6@ K X et|ywutt{qaQB4' %.8CP^myiZK<0# $/:FUdvpaRD6*#.:IYkvfWI</#   +9J^r{k\M@4((7J_xדկpaRC7+   %6JbzvgXI:." #5Jc| #*4ALV_fmsy$0=GQZahotz +7BLT\ciotz  '2<FOW]dintz  !,6@IPW^dinty &0:BJRX^cintz  *4<DLSY^cinu|$.7?FMSY_djpw  '09AHNTZ`flt|~|zxwvuu   *3;BIOV\bi~p|yzwusqpnml l k &+,*% %.7>E~K|QyXw^vetmrvpnljhfedccc&/5750*"!# $*|%3y%:w&At&Gr&Np&To'[m'bk'ii'rg'}e'c&a%`$^"]!\ [[[ .7=?>94-){+w,&t,/q-7o-=l-Dj-Jh-Qg.We._c.ga.p`.{^.\-Z,Y+W)V(U'U%U$T$&4>CFEA<6y1 t1p2#m2+j33h3:e3Ac3Ga3M`4T^4\\4d[4mY4xW3V3T2R0Q/P-O,O+O*N)-:CIKKHC=s7m7i8f8(c80a87_9>]8D[8KY9RX9YV9bU9kS9vQ9P8N7L5K4J2J1I/I/I.2?HNPQNI}Do=g<c=`=%]=-[=4Y=;W=AU=HT=OR=WQ>`O>iM=tL=J<H;G:E8E7D5D4D3D27DMRUVTOzJkDbA^BZB#WB+UA2SA8QA?OAFNBMMBUKB^JBhHBsFBEAC@A>@<@;@9?8?7?6<HQWZ[YUwPiK]G XFUF RF(PF/MF6LF=JFDIGKHGSFG\EGfCGqAF~?E>DKpQG=QP;QY:Qc8Qn7P{5O3N2L1J1H1G1E1D1CKW_eijjgsde`U\FX CW@W >W(=W/;W6:W>8WE7WN5WW4Wa2Vl1Vz/U-T,R+P+N+L+J+I+HQ]ekoppnrkdhSdB`;^9^7^%6^,4^33^;1^C0^K/^U-]_+]k*\x(['Z%X$V$T%R%P%O%NXckquwwupraoPk@h3f 1f/f .f(,f0+e7)e?(eH'eR%e\#dh"cv ba_]ZXWUU_jrw{~~~|my]wMs=q.o'n&n$n##n+!n3 n;mDmNmYlfktjhgdb`^]\gqyziY~I|:z,yx www&w.w6w?vJvUub tp s qomj h f e dpyudSE6(  '0:DP]~k}|{yvtqonmy~n^N@2%  (2=HVev|zxxvgWH:-  )4?M]n}m^OA3' (4AQcwsdUF9,   '4CUjyiZK=1% #2EZq΋ͦ~n^OA4( 1D]xsdTE7+ 0E]x '3?IS[cjpv{".:DNV^ekqv{)4?HQY_ekpv{ $/9BKSY`ekpu{  )3<ELTZ`ejou{ #-6?FNTZ_diou|'09AHNTZ_djpw~ !*3;BIOTZ_ekrz~|{{z #,5<CIOUZ`fnv|zwutrqpoo &/7 > D J P~ V| \y cw ju ss}q o m k i h gfee #()&! !*2|9y@wFuLsRqXo_mgkoiygeca`^]]\\$-231-'|x%u.r5p<n Bl Hj Nh Uf!\d!cb!l`!v^!] [ YWVVUUU,5:;:60)y# t$p%!m%*j&1h'8f'>d'Db'K`'Q^(X\(`[(iY(tW(U'T'R%P$O"O!N NN%2;@BA=82s+l*i+e,&c,.`-5^-;\-AZ-GY-NW-VV.^T.gR.qP.~O-M-K+J)I(I'H%H$H$,8AFHGD?|9n3f0b1_2#\2+Z22X28V2>T2ER2KQ3SO3[N3eL3oJ3|I2G2F0D/C-C,C*C)C)1=EKMMKEy@k:`6 \6Y6 V7(S7/Q75O7;N7BL7IK7QI8YH8cF8nE8zC7B6@5?3>2>0>/>.>-6BJORRPKvFh@[< V;S;P;%M;,K;3I;9H;@G;GE<=;;9:8969493:2:1;FOTWWVQsLfGXBP@M@J@#H@*F@1D@7C@>B@E@AM?AV>A_5<5:58575655?KSX\\[WrSeNVIKEGEEE CE(AE.?E5>E<0=0;0:09EPX]aa`]qYdUUPFK AK?K=K%;K,:K38K:7KA6KI4KR3K\1Kg0Jt.J-I+G*E*C*A+@+>+>JU]bfgf~dp`c]TXCS;Q9Q7Q"5Q*4Q02Q71Q?0QG.QP-QZ+Pf*Ps(O'N%M$K$I$F%E%C%CP[bhkml}jogbdR`A[4X 1X0X.X&-X.+X5*X<)XD'WN&WX$Wd#Vq!V TSQNLJIHWainrss|qnn_kOg?d/`)_'_&_"$_*#_1"_9 _A_K^U^a]o\[YWUSQPO^houxzz{yku[rKo0$  #.;J\oqbRD6)".<NbzwgWH;."  .>Riǃß|l\M>2%-AXqqaQB5( +@[x%0;FOX`fmrx} +6@JSZagmrx} &1;DMT[bgmrw}  !+5>GNV\bglqw}&/8AHPV\afkqw~ !*2;BIPV[`ekpw$-5<CJPUZ`ekry '/7>DJPUZ`flt}~{ywvuuu  !)18?EJPU[a}h{pxyvtqonlkjii #+39~@|EzKwQuWs]qdolmvkigecb``__ %%#  { &w -u4r;pAnFlLkSiYgaeicsa_][YX W W V V "*/0-)#z uq!n)k0i7g=eBcHaO_V^]\fZpX|VTRQPOOON*27862-&slif%c ,a 3_!9]!?[!EY!KW"RV"ZT"cR"mP"yO"M!K JIHHHH$19=?>:5{/n(e$a%^&![&)Y&0W'6U'<T'BR'HP'OO(XM(aK(kJ(wH(F'E&C$B#B!B BB*6>CEDA<w6k0_+ Z+W+U+&R,,P,3O,9M,?K,EJ-MH-UG-^E-iD-uB-@,?+=)=(=&=%=$=#0;CHJJGBt=g7Z1T0Q0N0#L0*J00H16F1<E1CD1JB2SA2\@2g>2s<2;1:08.8,8+8)8(8'5@GLOOLGrBe=W8N5K5H5 F5'D5-B53A5:@6A>6H=6Q<6[:7e97r76654433313/3.3,3+:DLQTTR}MpHcDV>I: E:C:@:%?:+=:1<:8::?9;F8;O7;Y5;d4;p2;1:/9.7.5.3.2/0/0>IQVXYW|SoObKTEE@ @?=?;?"9?)8?/6?65?=4@E3@M1@W0@b.@o-?~+>*=);(9)8*6*5*4CNU[]^]{YnVaRSMDH:D7D5E 4E'2E-1E40E;.EC-EK,EU*Ea)Em'D|&C$B#@#>$<$:%9%8ISZ`cdc{`m\aYSUBO4K 1K/K.K$,K++K2)K9(K@'KI%KS$K_"Jl!JzIGECA?>=OY`ehjizglc`aP\@W1S*R(R&R!%R($R/"R6!Q> QGQQQ]PjPyOMKIGEDCU_flopoynlk]hMc=_.\"Y YYY$Y+Y3Y;YDXNXZWgWwVT R P MKJI]fmruwwxuiqYnJk:g,ecbaa a'a/a7 a@ `K `W_d^s][YWUSQPemty}~~u|dxTvEr6p(nl k kkj"j*j3j<iGiSh`gofdb_][YXmv|p_O}@z2y$wv uuuut%t-t7sAsNr\qko|nkifdbav~yiYI;-  '0;~G}V|ezwyvtromlrbRC5( (3@N_q~|{zyiYI;." )5CTg}o_PA4' )7H[qtdUF8+(8Kc}zjZJ</" );Qj߅ۤo_O@3& (>Wq"-8BKT[bintz (3=FNV]cinty  $.7@HPW^cinsy(2:BJQX]chmsy#,5=DKQW]bglry '/7>EKQW\afls{!*18?EKQV[afmt}~}{{z$,3:@FKPV[agox}zxusqpooo &-4:@FK~Q|Vy\wcujssp~nlihfeddc  '|/z5w;uAsFrLpQnXl_ifgoezca_]\[ZYY""  }xt"q)n0l6j <h Ag Ge Mc T` [^ c\ mZ xX V U S RQQPP (,-*& tmjg$d+b1`7^=]C[IYPWWU`SjQuONLJIIHH H (0453/*z#nea^ \'Z.X4V:T?RFQLOTM]KgJsHFDCBBBAA#/7:<:72v,j%_ ZW T $R *P!1N!6M!<K!CI"JH"QF"[D#eC#pA#~?">!=;;<<<)5<@BA=8s3g-Z'S%P%M%!K&'I&-G&3F&9D'@C'GA'O@(X>(c=(o;(}:'8&7%6#6!6 66/:AEGFC}>p:d4W.M* J*G*E+$C++A+1?+7>+==,D<,M:,V9-a7-m6-{4,3+2)1'1&1$2#2"4>EJLLI{Dn?b:U5H0 D/A/?/"=/(;/.:/480;70B61K51T31_21k01y/0./-.,,,*-(-'-&8BINPQNzJlEaAS;E6>4;49474&64,44235925@15I06R.6]-6j+5x*5)4'2'0'.(-(+)*=GNSUVTyPlK`GRBD=99 694929$19*/90.:7-:>,:G*:Q):\':h&:v%9#8"7!4"3#1#/$.BLSXZ[YxVkR_NRJCE4? 0>.?,?!+?(*?.(?5'?<&?E$?O#?Z"?g ?u>=;97543GQX]`a_w\jY_VRRAL2G)E(E&E%E%#E,"E3!E:ECEMEXDeDsCB@><:98MW^cegfwcj`_]OY?T0O#L LLL"L)K0K8K@KJKVKcJqIHF DB@>=T]dilmlvjjh\dL`<[-X USSSS&S-S5S= RG RS R`QnPOMKHFD C[dkpstsvrgnXkHg9c*`^\ \ \["[)[1[:[DZPZ]YkX|VTROMLKclrwz{zsxbuSrCn5k'ig feeee%d-d6d@cLbYah`x_\ZWVSRltz~m~]{Mx>v0t#rqpp ooo n(n1n;mGlTkcjthfdb^]\u}wgWG9~+}|{zzz zyy"y+y5xAwOv^uosrnljifo_O@2%  $.9GWi}~}ywutwgWG9, $/=Nau}m]M?1$ $1ATirbSC6( #3F\uxhXH:, #5JdҁѠο}m]M=0# %9Qk*5>GOW^djpu{ %09BJRY_ejou{  !*4<DLSY_djou{%.7?FMSY^cint{  )19@GMSX]bhnt}$,3:AGLRW\bgnv &.5;AGLQV\bhox}zxwvut!(/5;AFKQV\c|jzrw}trpnljiii #*06}<{AyFwKuQsWr^oemnkxhfdb`_^^^ ~y$v+s1q6o<mAlGjLhRfYdaaj_t][YWVUTTSw rnk%h,f2d7b=aB_H]N[UY]WfUqR~QOMLKKJJ&)*'#zogc ` ^ '\ -Z 3X 8V >TDRJQROZMdKoI|GED C B BBB&.120,'u!j_ ZWU#S)Q/O4M:L@JGHNFWEaClAz?><;;;;; "-48973~/r)f#ZROMK%I+G1F7D=BDAL?T>_<j:x97655556(3:=?>:{5o0c*W$M HF D "B (@ .?!4=!:BDC@y;m6a1T+H&B$@%=%;%%:%+8%17&86&?5'G3'P2'[1'f/'t.',&+%*#*!+++3<CGIIEwAk<_7R2E-<):)7)5)#3)(2*/1*50+=/+E.,N-,Y+,e*,s(+'*&)%'%%&$'"'!7AGLMNKvFjB^>Q9D48/ 4.2.0. /.&-/-,/3+/;*0C)0L'0W&0c$0q#0"/!- + *!("&"%<ELPRSPuLiH]DQ@C;55.3,3+3)4$(4+'41&49$5A#5J"5U 5b5o4320.,+*@JQUWXVtShO]KPGCB4=)9 '9%9$9""9)!9/ 97:?:H:S:`9n9~86420/.FOVZ]]\tYhV]SPOAI2D$@ ??? ?&?-?4?=?F?Q?^?l>}=; 9 7543LU\`ccbt`h]]ZNV>P0L"HFFFF#F*F2F:FD EO E\ EjDzCA?=; 9 8R[bfijisghdZaK\;X-TQN M M M M'M/M7MAMLLYLgKwIHECA?>ZbimpqpsnekVhFc8_)\YWVVVV$V,U4U>UITVSdRtQOMJHFEbjptwx~wqu`qQnBj3g%ec a` `__ _(_0^:^E]R\a[pZXUSPNMjrx||~l{[xKt=r/p!nlkjjjii#h+h5hAgNf\emcb^\ZXVs{ueTE|7z)ywvuut ttts&s/s;rHqWphn{lkgecb}~m]M>0#  (3A~P|b{uywuqonteTE7) +8GYm~}{j[K<."  ,;Nd|p`PA3& .@UmvfVF8*0F_zșŷ{k[K;.! 3Kg '1;CKSZ`flqw}  ",5>FNU[afkpv}'08@HOU[`ejpv}"*3;BIOUZ_djov~ &-5<CINTY^cipw (/6=CHMRX]cipy~|{ #*17=BGLRW]cjs}|zwusqpoo %,17=BG~L|QzWx]vetmqwoljhfedcb&|,y2w7u<sBqGoLnRlXj`gherc~`^\ZYXXX   }xs!p'm-k2i7g=fBdGbM`T^[[dYnWzUSQPONNN zr mie"b(`-^3\8Z=YCWIUPSXQaOkMwKIGFEEED$''$ uj b ]ZX#V)T.R4P9N?MEK LI TG ^E iC uA @ >==<<<%+//-)|$qf[S P N L$J*H/F5E;CABI@Q>[<f;s9765 5 5 5 5!+25640y,n&b WL HFD!B&@,>2=8<>:F9O7Y5d4q21/..///'17;<;7w2k-`(T"HA?=;#9)8/655<4C2L1V/b.o,+)(()**-6<@A@=u8j3].Q)E#< 864 3 &1 ,0 2/!9.!A-"J+"T*"`("m'"}%!$ ##$%%1:ADFEBs>h9\5P0D+8% 2$0$.$,$#+$)*%0)%7(&?'&H&'R$'^#'l!'| &$"   6?EIKJHrCg?[;O6C26,-)+)))')!&)'%*.$*5#*=!+F +Q+]+j+z*)'%#" ;CINPO~MrIfE[BO=B964(/ %.#.".!.% /,/3/;/D0O0[/i/x.-+)'&%?HNSUU}SqPfLZIODB@4:&64444#4*41494B5M4Y4g4w3 2 0 .,*)DMTXZZ}YqVeSZPOLAG2A$=: :::!:':/:7:@ :K :W :e9t87531/ .JSY]``|_q]eZ[WMS>M/I"EA @ @ @ @% @,@4@>@H@U@b?r><;8643QY`dfg|fqdfaY^IY:T,PMJH HHH"H*H2H;GFGRF`EoECA><:9X`fkmn|mqkdhUdE`6\(XUSR QQQP'P/P8OCOON]MlL~KHFCB?`hnruu|tor_nPj@g2d$a^ ]\ [ZZY#Y+Y4X?XLWZViT{SPNLIHipvz||z{jxYtJq;n-lihffe eddc&c0b;bGaV`f^x\[WUTRry~sc~R{Cx5v'tr qppoo onn!n*m5mBlPkaitgeb`^]{|k[K<.!}|{{{zzz zzz#z.y;xJw[vntqpljirbRC4'  %2ARg~}zwyhYH:,'6I]tn^N>1# ):OhtdTC5'  ,@XsyiYI9, .Gc  $.7?HOV\bgmrx )2:BJPW\bglrx#,5=DJQV\afkqx '/7>EJPUZ`ekqy#*18>DJOTY_dkr{ %,29>DINSX^dkt~}{yxvu '-39>CHMRX^~e{nywvtqomkjih "(.3}8{=zBxGvLtRrYp`nhkri~fdb`^]\\ }y#v)s.p3n8m=kBjGhMfSd[ac_m\xZXVTSRQQ  }wrnk#h)e.c3b8`=^B\HZOXVV_ThQtOMKJIHGG um hc`]$Z)X/V4U9S>QDOJMRK[IeGqECA@??>>!$$"{pf ] XURP%N*L/J4I:G@EGCNAX?b=n;|:877666#),,*&x!mbWN JHF D&B +@ 0? 6= << C: K8 U6 `4 l3 {1 0 ///// */331-u)j#_SHA?<;"9'8-62593@2I0S/^-k+z*('' ( ( )&/58984s/h*\%QE; 8542$1*/0.6->+F*P(\'i%x$"!!"## ,4:=>=}:q5f1Z,O&C!81/-,!*')-(4';&D$N#Z!g v09>BCB|?p;e6Y2N-B)7$, )'%$$# +" 1!!9 !B!L"X"e!t! 5=CFHG{EoAd<X9M4A/6+*& #$!$ $$"$)%/%7&@&J&V&d&s%$" 9AGKMLzJnFcBX?M;A662)-) ))) )'*-*5*>+H+U+b*q * ( ' % # !>FLPRQzPnMcIXFMBA>59'4/ ..//$/+/3/< 0F 0R 0`/o/-,)'&$CKRUXWyVnScPXMMIAE2?$:75 5 5 5" 5)515:5D5P5^4m4~21/,*)IQW[^]y\nZcWYUMP=K/F!B> < <<< <'FLRX]chms{  )19@FLRW\agmt| $,3:@FLQV[`fmt~ &.4:@FKPUZ`fmv~| "(/5:@EINTY_goy|ywtrqpo $*/4:?CH~M|SzYx`uisrp~nkigedcb%|*y/w4u9s>qCpHnMlTj[hcelcx`^\YXWVV |xsp%m*j/i4g9f>dCbH`O^V[^YgVsTRPNMLKK xr mie b%_*]/\4Z9X>VCTJRQPYNcKnI|GEDBBAA{phc^ZW T%R*Q/O4M9K?IEHMEUC_Ak?x=;:9988!!wlaY TPMJ!H&F+E0C5A;?A>I<R:\8h6u4321100!'*)'#si^S J FC@>"=';,91876>4F3O1Z/f-s,+*))))(-00.|*q&f![PE< 97 5 4 #2 (0 ./ 4- ;, C* M( X' d% s$ # " """"%-3664z1o-d(Y#NB81 .-+*%(*'1&8%@#J"V bq   *28;<:y7n3c.W)L$A 6, (&$#""(!. 6>HTao /7<?A?x=l8b4V0K+@'5"+" %,4<FR_n3;ADEDxBl>a9V6K2@-5)*$ # * 2!:!D!P!] !l !}    8?EHJIwGkD`@V=K8@450*,'$$$$!%(%0 &8 &B &N&[&j%{$#!<DJMOOwMkJ`FVCK?@;57'2-* * * * *&+.+7+@+L+Y+h*x)'%#! AIOSUTvSkPaMVJLGAC2=%84 1 0000%1,151>1J0W0f/v/-+(&%GOUY[[vYkWaTWRLN=H/C!?;8 8777"7*737<7H6U6d5t420.,)NV[_aav`l^b\WYHT9O+JFCA@ ??> >(>0>:=E=S`/]"YWTSR QPPO!O*N4N?MML\KmIHECA?fmquwwwvfrVnFj8g*db_^]\[ [ZYY%X0X;WIVYUjS~QOLJHouz}~~o{_xNu@q1o$mj iggffe edd c*c6bDaT`f^{\ZXTSx~xhW~G{8x*wusrqqqqpp ooo#o/n=mNlajvhfdb^o^N>0#}}||||||| |||'|5{FzYyowtrpoueTD6'  +<Pf|kZJ;, 1E\vq`O?1#"5MivfUD5' '=WtΕʽ'08@GNTZ_djov}"+3;BHNTY^ciov~ &.5<BHNSX]bhow!(06<BHMRW\bhpy #*16<AFKPU[ahq{~|zxw%+16;@EJOU[b~j|tyvsqnlkjj  &+0~6}:{?yDwIvNtUq\odmmjyheca_]]] }y!v's+q0o5m:k>jCiIgOdVb^`h]sZXUTRQPP|wrnj"g'e+c0a4`9^>\DZJXQUYSbQnO{LJHGFEE {sl hc`\"Z&W+V0T4R9P?NEMLJTH^FiDvA?>=<;;  vld^ YUQO"M&K+I0G5F:DABH@P>Z;e9r8654332}rh ]TP KHEC"A'?,=1;6:=8D6M4W2b0o/-,++++%''$z!oeZP FB><97#6(4-2319/A-I+T*`(m&}%$$###&+..+x(m$cWMB 9 530.-$+)*/(6'>%G#Q!^ k{$+1342w.k*a%U!K@6- ) ' & $ # &! , 3 ; DP\j {  )16897v4j0`,T'I"?5+" #)19BN[iz    .5:=><u:i6_1S.I)>%4 *  '.7@L Y g w 29?BCAt?h;^7S4I/>+4'*#  % , 5 >JWeu6>CFH~GtDhA^=S:I6?25.+*%    #!+!3"="H"U"c!s!;BHKM~LsJhG^CTAJ=?966(0,'%&&&"&)'1';'F'S'a&q%#"@HMPR}RsPhM^JTHJDAA3;%62 .- ,,, ,',0,9,D,Q,_+p*(&$" FMSVX}XsWiT_RUOLL=F/A!=964 3333%3-372B2O2^1n0/,*'&LTY]^}_s^i[`YVWGQ8L*GC@=< ;::9#9+959@8M8[7l6520.+T[`de}ftejcaaQ\BW4R&NK HFED CBA A(A2@=@J?Y>j=};9753\cgkm}mtlkj[fKb<^.Y VSQONM LKJJ%J/I:HGHVFgEzCB><:dkost}tuteoTlEh6d(a^\ZYXWV UUT S*S6RCQRPdNxLKIEDmsx{|~{nx^uMr>n0k"igeccbba` __^%^1]>\N[`YtWUSQNw|vf}U{Ew6u)sqonmmmllkkjjj*i8hHgZfoda_^[~m]L=.}!|{yyxxxxwwwwww"w0v@uSthromkjtcRB3%  &6J`y}{zziYH9*+?Uoo^M=/!1IctdSB3%"8QpÓ#,5<DJPV[`ekqx '07>DJPUZ_djqy"*18>DIOTY^djr{ %,28>CHMRW]cks~ &-38=BGLQV]dlv}zxvtrq "'-27<AEJP}Vz]xeuos{pnkhfedd#}(z,x1v6u;s@qEpJnPlWj_ghetb_]ZXWVW |wtp#m(k,i1g5f:e?cDaJ_Q\YZcWnT{RPNLKJK~wq lheb#_'],\0Z5X:V?TERLOTM^KiIvGDBA@??vmhc^ZWT#Q'O,N0L5K:I@GGEOBY@d>q<:86655 | qg_Y TPLJG"E'C,B1@6><<C:K8U6`4m2|0/.--- xnd YPK GC@=;#9(7-62483?1H/Q-]+j)y(&&%%%#$$!vkaVLC> :7420$.)-.+5)<(D&N$Z#g!v $)++)t%i!_TI? 62 .+)' &%$+#1!9 ALXet"*/11~/s+h(^#RH=4+ & # "(.6?J V ds'/467}5r1g.\)Q%G =3)      % , 4= H T b r    ,38;;|:q7f3\/Q+F'<#3)     " ) 2;FR`p   18<?@|?q<e8[5Q2G-<)3%)!    (09DP_n 5<ADE{DpBe>[;Q8G4=04-+)% &.7BO]m:AEIJzIpGfD[AQ>H;>754)/*%" """"$",#6#@#M#["k!} ?FKNOzOpMfJ\HREIB@?3:%50 ,) ((((#(+(4(>(K(Y'i&|%"!DLQTUzUpTfQ]OSMJJ=D/?!:631 0/..!.).2.=.I-X-h+z*(&$!KRW[\z\q[gY^WUTGO8J*EA=:87 6555&505:4G4U3f2x0/,*(RY^bczcqbh`__PZAU3P%LH EBA@ ?>==#<-<8@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./012456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~񪌫ۊa۶iUֆAaߖg\;~cibvBAj+0}" d[dgܿδӟr<@\12d&(WuD{ܳX7pѣxWH;_¸ܼаaDXhC9sB6 ix qjbT$WЧwF$Gۯ[?)7ܽkZS̾ҳǢhM3ڪ~V3c҆S%FB -bznTcYQ^G HÝdG3 AƲp[M;Aô˪x_GGϟuR3%j;|UbjI4c"8dy5qmUA1!n׼zk\PD3nȻë~eLqѢzY=# Xܓ]0 79/Ps`N(>R0{#O/  {ri_TE4Ӽy]絎oU=% a4uu+Vy: ! I|qnb Y;QpM JQHE?Ȩ|viYIݴz`I3ByI#%+_|kT@.En1`1|=#)wƼxT7!)w=Ia/TtDxoi\ Q0FZ=5.[*%rVh%;Oe~ܱ{tomlls~6Pj[R;&Ft6^KB p(Cb󒡶aF2# REypbUAJg@6.I%|,y M?8Z#7I\q˭uja[UPKJLQ`xW/8#?}'Pv%P}'a) x 0Ga}ŻuYC1"&/u2g_[QF6=]4+*"[ hG5PnFASdv鼟}qg^XRMIGDGRd3 ;n%Kp6aW-8T$5H]tǽy_L=0' &O>}s;gc]T$KIBq8%-V!%2Lv-C\wlhzƥ|tmhc^YVTV\l0@O{>c9c* &?k$=XwK9J[lŽxcUIB<72.*'%&+4Kpf4\ -wRmyb;-Iq /JjH+;MavԪ~|{}E6,$  BwP+{(Mq,R"Bc/LmS ,>Qhu}tmhda_^]^chv) %[J q*N7q@e8 <[h );Pgdx˽aZUQONMMORZez)JPjt*Qt6?gY5Sv(1EZsltPLIGHIJLSYh|<.\`Ak߂) 9VwK/CXp҄xUIJMRY^pV0Jhp>^y򣅦desc Little CMS Little CMSdesc2.x 2.xlcms2-2.19.1/plugins/test_profiles/test3.icc0000644000175000017500000006750415176573557017764 0ustar martimartioDlcmsspacRGB Lab  1 acspMSFT-lcmsdescA2B060B2A0760wtptncprtn,#dmndnPdmddntdesc,Test profile, not suitable for real use-Test profile, not suitable for real usemft1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ymb XPIC$<+6209+?%FLR z {~ ~sh^VN$G*@0963<-B'I!OUopt|yq!~g%^)U-M2E7>=7B1H*M$SY,i-j-m/q{1uq3zg6^:U>MBEF=K6O/T)Y"_=d>e>g?jAm{CrpEvgG{^JUNMQEU=Y6]/b(f!N`NaObPdQgRjzTnpVsgXx^[}U^MaEd=h5l.p'^[^\_]__`aadcgydkofpfht]kyUm~LpDs=w5z.nWnXnYoZo\p^qasexthovlfxq]zuU}zLD=5}S}S}T~U~WY\_bwfnien]rTvL{D=OOPQRTVY\_vcngek\oTsLwDKKLMNOQTVY~]v`mddh\lTpLG©GHIJKMOQTW}Zu]lade\iTCƷDķDEFGHJLOQT}Wt[l^cb[@@@ABCDFHJLOR|UsXk\c<<<=>?@ACEGJLO{RsVj8899:;<=?ACEGJMzPr{od ZRKD&>-731:+@%G MS ~ uj`W O%H+A1:74=.C'I"OUtvy~ }s#h&_*V/N4F9?>8C1I+N%TY.m.n/q0t|2xr5}h7_;V?MCFG>K7P0U)Z#_>g?h?j@lBp{DtqFxgH}^KUNMREV=Z6^/b(g"ObOcPdPfQiSlzTppVtgYy^[~U^MaEe=h6l/p(_]_^__``acbeciyempgqgiu^kzUn~MqEt=w6{.nYnYoZo[p]q`rbsfxuiovmfxr]{vU}{ME=5}T}U~U~VXZ]_cwfnjfn]sUwL{E=PPQRSUWZ]`wcngek]oTtLxDLLMNOPRTWZ]vamdeh\lTpLH©HIIJLMORTW~Zu^lade\iTDƷDŷEEFGIKMORU}Xt[l_db[@@AABCEFHJMOR|UsYk\c<===>?@BDFHJMP{SsVk999::;<>?ACEHJMzPr ~ r g]UM#F)?/963<-B'H!NTxmcZ#R(J.C4<95?/E)K"QV }!~"$u&j)a-X1P6H;@@9E2J,O&UZ0t0u1v3y~4|s7i9`=W@ODGH?M8Q1V*[$`@lAmAnBqCt|EwrG{hJ_MVPNSFW>[7_0c)h"PfPgQhRjSlTo{VsqXwhZ{_\V_NbFf>i6m/q(```a`bacbechdkzfophsgjw^l{VoMrEu>x6{/o[o\p\p^q_qbsethyukpwogys^{wU~|ME=6~V~W~WXZ\^adxholfp]tUxM}E=RRSTUWY[^awenhel]pUuMyENNNOPRTVX[^vbmeei]mTqLI©JJKLMOQSVX~\u_mbdf\jTEǷEŸFFGIJLNPSV}Yt\l`dc\AABBCDFGIKNPS|VtYk]c=>>>?@ACDFIKNP{SsWk:::;;<=>@BDFHKNzQrxlcZ#Q(J-B3<95?/E(K"PV}q!g$^(U-M2E7><7B1G*M$SX%&')x+n.d1[5R9J>BB;G4L-Q'W!\4|4}5~68u:k=b@YCPGHKAO9T2X+]%bCsCtDuEwFy~H|tJjLaOXROUGY?]8a1e*i#RlRlSmToUqVt|XwrY{i\~`^WaOdGg?k7n0r)aebebfchcjdlfo{grqivhkz_m~WpNsFv>y7|/p_q`q`qarcsethukzwnpxrgzv_}zV~NF>6ZZ[\]_adgxjongr^vVzM~F>UUVVXY[^`dwgojfn^rUvMzEPPQRSTVXZ]`wdngek]oUsMLêLLMNOQSUWZ~]v`mdeh]kTGǸGŸH¸HIJLNPRTW}Zu^lade\CCDDEFGIKMORT|Wt[l^d???@ABCDFHJLOR{UsXk;;;<==>@ACEGJLOzRr~ s"h&_*V.N3F8?=8C1H+N%SY"#$&w(l+b/Y3Q7IMBEF>K6P0T)Y"_99:;nAeD[GSJKNCR;V4[-_&d G{G|H}H~JKvMlOcRZUQXI\A_:c2g+k%UsUsVtVuWwYy~Z|t\k^aaYcPfHi@m9p1t*dkdkdlemfogqht|iwskzim~`oXrOuGx@{8~1rdresesfthujvlwo{xrqzuh|y`~}WOG?7^__`acehkynpqhu_yW|NF?YYYZ[]_adgxjomgq^uVxN|FSTTUVWY[]`cwfojfm^qUuMOëOOPQRTUXZ]`vcnfej]mUJǹJŹJ¹KLMNPRTWY~\u`mcef]EFFFGHJKMOQTV}Yt\l`dAABBCDEFHJLNQS|VtYk===>??@BCEGIKNQ{Ts''(*y,o/e2[6S:K>CCZ6^/c(g"KLLMNOyQoSeV\YT\K_CbXAOEGI@N8R1W+\$a56689w;m>cAZDQHILAP:T3Y,^%c<<=>@{ApDgF]IUMLPDT=X5].a(f!FFFGHJvLlNbQYTQWI[A^9b2f+k$QQRRSU|VrXhZ_]W`NcFf>j7n0q)]^^^_`bycoefh]jUmLpDs=v5z.jzkzkzk{l|m~npwqmsdu\wSzK}C;4xqxrxrysytzv{x|z~~|ulcZRJB:jjkkmnprt|wszj}bYQIAccdefghjmo{rruixa{XPH]]^^_`bdfhkymqpht`wWzOWĮW®XXYZ[]_adfxiolgo_sWRɼRǼRüSSTVWY[]`bwenhfl^LMMMNOPRSUWY\~_vbneeHHHHIJKLNOQTVY}[u^mCCCDDEFGIJLNPSU|Xt<<=>?{ApCgF]IULLPDT=X5\.a'f!??@AB}DrFhI_LVONRFV>Z7^/c)g"EEEFHIuKkNbPYSQVHZ@^9b2f+j$MMNNOQzSpUfW]ZU]L`Dc=g5k.o'WWXXYZ\v^l`cbZeQhIkAn:r2u+bcccdeg|hrjil`nWqOtGw?z7}0oooppqrtyupwgy^{U~ME=6{y|y|y|z}{~|~~wne\TLDxxyyz{|~wne]ULEppqqrsuvxz~|uld\SKiæijjklmoprt|wsyk|cZRbdzbijccdefgikmo{rrujwazY\\\]]^_abdfhkymqpis`VVVWWXYZ\^_bdfxiplgPPQQRRSTVWY[]`bweoKKKLLMNOPRSUWY\~^vPPPQRT|UrWhZ_\V_NbFe>i7m/q(RRSSTV}WsYj\a^XaOdGg?k8n0r)VVWWXZ[v]l_caZdQgIjAn9q2u+\]]^^`aycoefg]iTlLoDrw6{/eeeffgi~jtlknbpYsPuHx@{91lllmmnoqxrotfv]yT{L~D<5uuuuvwxy}zt|j~aYQHA9~~ypg^VNF>vmd\SKC|sjbYQI yqh`WOwƬwìwwxyz{}~wof^VoɸoǹpĹpqqrsuvxz~|umeĄ]hhhiijklmoqsu|wtyl|caabbccdeghjknp{rruj[[[\\]^_`acegikymqUUUVVWWXZ[\^`bdgxccddefg}itjjmaoXqPtHw@z8~1eeefghi~julknbpYsQuIxA|91hhhijklmvomqds[uRxJ{B~:3mmmnnopryspufw]zU|ME=5ssttuvwx}ys{j}aXPH@8{{||}}~wne]TLD<|sjbYQIAypg_VNFvmd\TLĤ¥|skbZR~ǰ~Ű~°~zqi`Xv˼vɼvżwwxyz{}~ÂwĄoņglj_ooooppqrtuwxz~|vmҁehhhhiijklnoqsu|wtylaaaabccdeghjlnp{rs[[[[\\]^_`bcegikylĹmijmīmġnėoōpŃqyspufw^yU|M~E=5n¹n³n¬o¢pØpÎrĄsztpvgx^{V}ME=6qqqrrstu{wryi{`}WOG?7uuuvwwxz~{t}kbZQIA9{{{||}~xne]TLD<|riaXPH@wne]TLD|sjbYQIĞypg_WOƩĩvme]TɴǴĴ|skcZ}Ϳ}}~~€‚ÃĄņƈzNJqɌiʎauuvvvwxyz{}~р҂xԄoՆgnnnooppqrtuwxz~|vnggghhiijkmnoqsu|wt`aaaabcdefgijlnp{vȼvȷvȰvȦwȜxɒyɈz|u}lcZRIA:wƽwƷwǰxǧxǝyǓzȉ{}v~lc[RJB:yĽzĸzızĨ{Ğ|Ŕ}Ŋ~Ɓwne\TKC<}~~~ƒypg^VME>|sjaYPH@wne\TLD‘{ri`XPHĚwne]ULƤä|skbZRɮƮ®yph_W˸ɹƹvm™eě]ÄÄĄĄąąņŇƈljȋɌʎ|ːt͑kΔc|||}}~~рҁӃԄՆֈz׊q،iuuuuvvwxyz{}~ကxpmnnnnoppqstuwyz~|vggggghiijkmnpqsu|̴̻̫͎͘͡΄zqh_WNF>˻˴ˬˢ̘̎̅{ri`WOG?ȼɵɭɣəʏʆ|sjaXPH@ŽŶŮťƛƑLj~ulcZRJB‹Šxnf]ULDÑ{ri`XPHĘvmd\TLƠàzqi`XPȩƩªvne]U˳ɳų|skbZͽ˽Ƚþ™ÚĜyŝpǟhȡ`ȋȋȋȋȌɌɍʎʏː̑͒Δ~ϕvїnҙeӃӃӃӄӄӄԅԆՇֈ։׊،َ|ۏtܑk{{|||}}~ဤၛ⃓ㄊ䆂zrttttuuvwxyz{}~xmmmmnnoppqstuwyz~ÈпиаѦѝѓ҉Ҁvmd\SKCÉϿϹϰϧНГЊрwne\TLDċ͹ͱͨΞΔ΋ρxof]UMEĎʺʲʩʠ˖ˍ̃zqh_WNFœżŴūƢƘǏDž|sjbYQIƘ؈vme\TLǟğzqh`XOɧƧ§~umd\T˯ɯİzqi`X͸˸ǹ¹vn­eĮ]ššššÛÛÜĜŝƞƟǠɢ|ʣs˥kͧc͓͓̒̒̒͒ΔΔϕϖЗљҚӛy՝p֟h׊׊׊׊׋؋،،ٍڎڏۑܒݔ~ߕvnㄽㅶ䆮䇦初払犍茄|t{{{{{||}~zsstttuuvwxyz{}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !!"#$%&'()*+,-../0123456789:;<<=>?@ABCDEFGHIIJKLMNOPQRSTUVVWXYZ[\]^_`abccdefghijklmnoppqrstuvwxyz{|}~~  !!"#$%&'()*+,-../0123456789:;<<=>?@ABCDEFGHIIJKLMNOPQRSTUVVWXYZ[\]^_`abccdefghijklmnoppqrstuvwxyz{|}~~kP7kP7kP7kP7kP7kP7kP7kP7kP 7 !!!!!!!!!k Q$7- 111111111k*Q68< ?????????-l>QF8K!MMMMMMMMM.ElPQW8Z"\\\\\\\\\-JYlbRg9j#kkkkkkkkk(NallsRw9y${ { { { { { { { { Qgu~mR:%|` F ,  |` F ,  |` F ,  |` F ,  |` F ,  |` F ,  |`F-|aF-|aF$-+--------}a/F8-=>>>>>>>>}8aDGJ.NOOOOOOOO?}NaWG\/^________DW}bbiHm/oppppppppG^l}ub{H~0Heu~bI1 j~~cI2/0011q2V2;2!22222222/0011q2V2;2!22222222/0011q2V2;2!22222222/0011q2V2;2!22222222./001q1V1;1!11111111*+,,-q-V-;-!--------%&'((q(V);)") ) ) ) ) ) ) ) !!q"V"<"""(")")")")")")")"r$V3<:#=>>>>>>>.r@VI';`tsX?(e|ˌsY@) ˢtZA+BCCDDDfDJE/EEEEEEEEBCCDDDfDJE/EEEEEEEEBCCDDDfDJE/EEEEEEEE@AABBBfCJC/CCCCCCCC=>>??@f@J@/@@@@@@@@9:;;<S SSSSSSSNOOPPPwPZP>Q!QQQQQQQJJKLLLwLZL>M!MMMMMMMDEEFFFwGZG?#G"*G,G,G,G,G,G,G<==>>?w2?[???F?#I?J?J?J?J?J?J?/122)3E3wR3[Z4@_4$a4b4b4b4b4b4b46Rb xk \q!@u!%v!w!w!w!w!w!w!?^o{x\A' Dg{y]B( Goҕy]C*uӬz^D,z_F. {`G0ijjjkkkjkLk.kkkkkkkghhiiiijjLj.jjjjjjjffgggghjhMh.hhhhhhhccddeeejeMe/eeeeeee_``aaaajbMb/bbbbbbbZ[\\\]]j]M]0] ]]]]]]TUUVVVVk%WN3W0:W =W=W=W=W=W=WKLMMN(NBNkNNNUN1YO[O[O[O[O[O[O?@AB=BUCcClkCOpC2sCtCtCtCtCtCtC-./L0e1s1}2l2P232222222WqƂ m P 5  _|ƜmQ6eƴnR8oS:!pU;$ qV=(}}}~~~~z~\~=~~{{{||||z}\}=}}}}}}}xyyyzzz{z\z=zzzzzzzuuvvvww{w]w>wwwwwwwqqrrrss{s]s>ssssssslllmmmm{n]n? nnnnnnneefffgg|5g^Cg@JgMgOgOgOgOgOg\\]]^;^R^|^^^f^@j^l^n^n^n^n^n^PPQ!RPRfRsS||S_SAS!SSSSSS??5@`AwABB}B`CBC#CCCCCC @!m#$ٕ%&'}'`'D(&((((((Xwٰ~aE(bF+ cH-dJ0fL3lL(lL(mM)mM*mN+}}~~~~n N&,046666vvvwww-wFxnSxOZx-^xaxaxaxaxaxmmmn nMnbnooowoP{o/~ooooooaaa>bcbwcccocQc1ccccccPQPQtRR̗SSSpSRT2TTTTTTW7^89::̳;;#vZ@'}\8}\9}]:}]:~^;~(^;p stttt~~~~<_s`?rrrVrvs߉ssttat@ttttttPbPbhbccߪddddbeBeeeeeeLLLMNNOOOcODOOOOOO""#%&(())d*F*#*****eH'gJ+hL/ jN3lImImJnKnL>oNMW"\^___)Shtp}N$SqфpO'>>>lѨqP*…ÅÅÅÅttttuuuvvrvRv-vvvvv___``aaabsbSb0bbbbb???@ABBCCuCUC3DDDDDvW6wY:y[=z]@"Ο}Z-˟~Z/Ơ~[0\2\3(15667R`]i5orsttDfy^7/h䖢â`9xxx亖Ė˖ЖaԖ<֖זؖؖؖχڇ⇤臃b>rrrrssttttdtAt tuuuWWWWXXYYYYeYCZZZZZ!"$$%&g&F&&'''iI$kL*mO/kA߱ߏkBڲڏlCղՐmDβΑm6FDLOQQNdzeǑsn|G[xՋoIeeee|մĴpɴK̴δϴддͨרިrMʘʘʘʘ՘sOtQ%lllllmmnnnvnTn*nnnnDDDDEEFGGGwGVH/HHHHyX4{[9}^=|S|T}U~W;PX\!cgij>>>>pƩѤс[)Ƥǂ\-Һ^1`5b9d=______``aaafaAabbb iD kHlJf1f3g5i7"2Ufjr:y}Vw؊푡k=xxxxxػm?ٶٓnBͷ͔pEqHsKuOwwwwwwwxxxxwyRyyyyMMMMMMNOOPPyPUP&PPPMMMMMMNOOPPyPUP&PPPMMMMMMNOOPPyPUP&PPPxHyIzK{M4BIMQk||OKKKKKKnǫ}Q~SV ߦXѧу[ ](`/a1a1a1a1\^_EaWahk?jفc ھe&g,i1k6m;׻ؖo?׻ؖo?׻ؖo?׻ؖo?׻ؖo?׻ؖo?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~XYZ MtextNot suitable for real usedesc Little CMS Little CMSdesc2.x 2.xlcms2-2.19.1/plugins/test_profiles/test5.icc0000644000175000017500000000625015176573557017755 0ustar martimarti lcmsmntrRGB XYZ  1acspMSFT-lcmscprtP#desctwtptTbkpthrXYZ|gXYZbXYZdmnddmdd8tvuedview4$lumiXmeasl$tech rTRC gTRC bTRC textNot suitable for real usedesc,Test profile, not suitable for real use-Test profile, not suitable for real useXYZ QXYZ XYZ o8XYZ bXYZ $desc Little CMS Little CMSdesc2.x 2.xdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Kmlcms2-2.19.1/plugins/threaded/0000755000175000017500000000000015176574562015121 5ustar martimartilcms2-2.19.1/plugins/threaded/COPYING.GPL30000644000175000017500000010451215176573557016666 0ustar martimarti GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .lcms2-2.19.1/plugins/threaded/Makefile.am0000644000175000017500000000003615176573557017157 0ustar martimartiSUBDIRS = src include testbed lcms2-2.19.1/plugins/threaded/Projects/0000755000175000017500000000000015176573557016715 5ustar martimartilcms2-2.19.1/plugins/threaded/Projects/VC2022/0000755000175000017500000000000015176573557017533 5ustar martimartilcms2-2.19.1/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj0000644000175000017500000003322215176573557025410 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {71dede59-3f1e-486b-a899-4283000f76b5} {6A44744B-BED4-49EC-87BB-83978458CE19} Win32Proj fast 10.0 StaticLibrary true Unicode v143 StaticLibrary true Unicode v143 StaticLibrary true Unicode v143 StaticLibrary false true Unicode v143 StaticLibrary false true Unicode v143 StaticLibrary false true Unicode v143 AllRules.ruleset $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ AllRules.ruleset $(Platform)\threaded_plugin_$(Configuration)\ AllRules.ruleset $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\threaded_plugin_$(Configuration)\ $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded AnySuitable Speed true true true Fast StreamingSIMDExtensions2 Windows true true true lcms2-2.19.1/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj.filters0000644000175000017500000000262015176573557027055 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {7d5b1769-2be4-46f2-9e35-6260eea79d7f} {012df308-35db-4909-b035-b1cd5fd1ee5b} Header Files Source Files doc Source Files Source Files Source Files Source Files lcms2-2.19.1/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj0000644000175000017500000002740415176573557027127 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {F56B9CBA-A34D-4C68-9003-A6919236399E} Win32Proj fast_testbed 10.0 Application true Unicode v143 Application true Unicode v143 Application true Unicode v143 Application false true Unicode v143 Application false true Unicode v143 Application false true Unicode v143 true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ true $(Platform)\testbed_$(Configuration)\ true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true {71dede59-3f1e-486b-a899-4283000f76b5} {6a44744b-bed4-49ec-87bb-83978458ce19} lcms2-2.19.1/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj.filters0000644000175000017500000000211215176573557030563 0ustar martimarti {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Header Files lcms2-2.19.1/plugins/threaded/Projects/VC2026/0000755000175000017500000000000015176573557017537 5ustar martimartilcms2-2.19.1/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj0000644000175000017500000003322215176573557025414 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {71dede59-3f1e-486b-a899-4283000f76b5} {6A44744B-BED4-49EC-87BB-83978458CE19} Win32Proj fast 10.0 StaticLibrary true Unicode v145 StaticLibrary true Unicode v145 StaticLibrary true Unicode v145 StaticLibrary false true Unicode v145 StaticLibrary false true Unicode v145 StaticLibrary false true Unicode v145 AllRules.ruleset $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ AllRules.ruleset $(Platform)\threaded_plugin_$(Configuration)\ AllRules.ruleset $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ $(Platform)\threaded_plugin_$(Configuration)\ $(Platform)\threaded_plugin_$(Configuration)\ ..\..\..\..\Lib\MS\ Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 Disabled WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) Fast Windows true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded false AnySuitable Speed true true Fast true StreamingSIMDExtensions2 Windows true true true true Level4 MaxSpeed true true WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) MultiThreaded AnySuitable Speed true true true Fast StreamingSIMDExtensions2 Windows true true true lcms2-2.19.1/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj.filters0000644000175000017500000000262015176573557027061 0ustar martimarti {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {7d5b1769-2be4-46f2-9e35-6260eea79d7f} {012df308-35db-4909-b035-b1cd5fd1ee5b} Header Files Source Files doc Source Files Source Files Source Files Source Files lcms2-2.19.1/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj0000644000175000017500000002740415176573557027133 0ustar martimarti Debug ARM64 Debug Win32 Debug x64 Release ARM64 Release Win32 Release x64 {F56B9CBA-A34D-4C68-9003-A6919236399E} Win32Proj fast_testbed 10.0 Application true Unicode v145 Application true Unicode v145 Application true Unicode v145 Application false true Unicode v145 Application false true Unicode v145 Application false true Unicode v145 true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ true $(Platform)\testbed_$(Configuration)\ true $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ false $(Platform)\testbed_$(Configuration)\ false $(Platform)\testbed_$(Configuration)\ $(ProjectDir)..\..\testbed\ Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 Disabled WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src Console true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true Level4 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) ..\..\..\..\include;..\..\include;..\..\src MultiThreaded Console true true true {71dede59-3f1e-486b-a899-4283000f76b5} {6a44744b-bed4-49ec-87bb-83978458ce19} lcms2-2.19.1/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj.filters0000644000175000017500000000211215176573557030567 0ustar martimarti {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Header Files lcms2-2.19.1/plugins/threaded/doc/0000755000175000017500000000000015176573557015671 5ustar martimartilcms2-2.19.1/plugins/threaded/doc/LittleCMS threaded extensions 1.0.pdf0000644000175000017500000056500415176573557024376 0ustar martimarti%PDF-1.5 % 68 0 obj <> endobj 77 0 obj <>/Filter/FlateDecode/ID[<2C835A029CC8374385C4EAE856CC9802>]/Index[68 25]/Info 67 0 R/Length 66/Prev 190598/Root 69 0 R/Size 93/Type/XRef/W[1 3 1]>>stream hbbd```b`` "l f@ z/u10R3@0 endstream endobj startxref 0 %%EOF 92 0 obj <>stream hb```f``RlW@( ou;&n(syƕ ,`!(р Š H17 hT00j(m~ Qs W c! endstream endobj 69 0 obj <> endobj 70 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC]/XObject<>>>/Rotate 0/Type/Page>> endobj 71 0 obj <>stream h޴Tn8yLl$Zli M=6k %Cb7nvMHq8Μ3AH#Az `<N`U+BJ0!|R5hʠsK޽cSr`ǣeӍʂ/c~gvsǛ.'6Po ;qr b,JPX(WGnd|>Kk,"e%TV4g)1g;%pMU?,iYIM&h*+v-\/1]Vb-Kx4O}6sζn'<=~n@Kîl{m$gyAIv]n6+Q $4FxV(%4_u-\gi-fƦ[| (ŖCD7,r;&lPpUvteb>.ybM"DBs*>hk3:nD/Q]84GO<kJ㵷ȠA>otWq>$h&Cl~I^qVt]F5UkuALPaB:I&S%WcZJb6W2=jM I]TzR*]Sᑟ ,{L mx㚚 ~_lJ\p*^pOs%-apjl$凤߱%=d92¾|FQˎ5FBv 囌E% endstream endobj 72 0 obj <>stream H|Tn1y;H$-$PW iZ"coM lc3jt^iZiZ|CUÖ SjhGڐ‡RK1b},Û`' v҉ x4+FS$^l,d `[TW3[[$"VwbFef:i;9QZWj-ֲżWCdaA;at{tm:l:z[._Ň |ktE{UkM^>TVmgfr/юY{G+w*A y֐Tz,R{_jy9z.18<=qO9Av Ct)g A] K|X*\g|=- g$m6Fɮ<>s9|sWzFhRl369L!L.6"FJy?4eph*;l>EwS=,Ї/XωƱ-sX.U~ E0Ӑu5=R)NhQ/:>S!W/ 1 pi]ɖͱ>`e !>;PV.'$= endstream endobj 73 0 obj <>stream x}Rn0+|LLB*48~R1q}uTK` ;4}ɳDJK tJVP;#|7$n&R4yمt)S*ZhyUϢ0";4* "ڡb_"Vgvk -h[DG9 i&œbMm ʮ!ZnhQn~~yK?ZJap03 ':D endstream endobj 74 0 obj <>stream x `՝3iF:l,KXv;;Wsa'!;vB H)"-P-v)=P]d:HzprPRp ][vRE2q+#yo3oi-]⶟5z˻{e½?-(+6wxVnq0_?DŽR׻rW/ﭭw27? _tk7|v}a { ̀w}7?)-0c{Nh/ { 'ϑ׀K ʝ#{.^رt޶sKk6?2i'f( k1MWܳa/h;7Aw?<$:>ܛ,3t^[뿁= o2Yl?t#={Ͽh_:c$^}W~. G~ /7ϖ<-Oy[K09'$y2ԁ8^lùzպ 6vpYM`8  omR}kT7t:;Ym6e- )^w;|b85\0<f LZRzh)9q3\ov`7Laoq'l"epyכnH=?y7}[ނL7|dU<>qlcN{0rNvbJw/\7}3)\_E1,LW6/z~ 0y7ld"'!vŰbro-nމ-vxs;!|`0 Ew[B!WW($:He 7 `0 `0 `0'aG|r?/ \AB`0NezwcxO3]; V `0]6Ça[ftK_r*ݰ( ߀[p+N`n1-AÅУ>[m,'N pٟ ?| XEPE迃qZdƼ= c3`1 @.b؍Bm$*txۡ0x3yxf:./d퟉ `fNuMpb6& 0~ j%4h4 ]yz5Al)Rig.bQZi疟h,$gr+jK-v6Y/);ͻ)xp)t Ȃz LԼi`A-Ә?Ns)$cN MH:]LW[.8v'8fg'91¨דqJ/[4X~ xo"6کJ`GABu p:AAuՍܨ%x1G R-jUJQB-5T@5 1J΃ *ƩVCe0PM@Q@ jP E] 6Bj46b-u VhDm&ԥЌ ڡvB+j`9vRX~ V@;J@].rԵГ~Q]+P7Jԍ*G8j/F5W`ELtX/l@݂ 1zQτ>R= 6_A،:nC lAgTw™{ӿ]0s!= σao؎z!z}3xz1B}?p z)AAQ? {Q?_˨P? P?K?ŨWPޟ~>^^ @|0,$C1ZgOe^z>C,\OpE+QP?WP/'P%p-P>z>z\ԧf gQoB*|.$ 5?6<ר7~ 7|܈:ԃppsW_P܂:_E=Epwk_wvQ= _G=@>|o?;ҏÏ z7PPp'?@} >P܅SGQԟc=ԟaH  ~TQ{P{ӏ3Tóp?s穾B-<~~GS?K(T_PWQ?WO7OӨogP GQE7-x5 /1}?1O3mc179/L7??͘<ӟۘӟ;fL1cg6cQ:c 4?t6Ϲ1}Oct٘c}E0c3P/ŠO]5zًL.9ل'Mf`L@L&3r- H {,92~i9Y[6~y))t ȂvIM܇F55X,6̛8J`s&z٬7")n./ }fY[4QPz ly&TൔJI$XM 50eFc^S)s:(1 %7_!#8]`0 # o| `X!vvhh0  ,lPg40s_[o GӔo@2E8hXA7̓7cfȓH>S)a 8_1̉ `07S,1$ 7cX,$2)⛙7`U2+F7C&` V[YXAD+H6~š9JPe(lhoo2$DY2 h:IMȭ NmoWe{*8 41]6Gld\ nۥNGС8ȑ%$%d<*o"mX.0 j!|3' @#bMa,cW9]KPܒfl$!Il.")d%7V3n;cKlc`X,pb,YVOBu:nu%gө %Yjf#U"6]e7Jɴ?xڲ qr^/N9 -`0Y~)LGXSUncuzeL 'ͲPdɩmݭ8e'ًՌ.>hjMQ%@Nd[y^xOBu^eu;nv/ps@q8VW$]$R dN-[;4yr ]`0 # /1 9YPDCqkJ'*$Z"}Y(hoh1+ӥnŎ˭T|"ϸ3J<`oSe'Nh4NxJJ<. ({%w|7cCP&|3buߌ$ɳꛙ|3iWnq1r,t ȂKLfe=>SN⛙b>㧾!qG,vTB|3r)~E7`U V4 @T~ |CP+TG\Qva534HUQ܎á8S)7'|3Y[EfSaW꠽mQxxrs#-qx\N}~lc`x]nǝ.^ ~eeALtØ* A?92ڼ^Ap ݅ )vIVJyi? ӟe}byr2r+t ȂjE 5 C PT8~#U%+^)TOIC}3Y[$fSUʊpR T@"ʊH$LX,PV&l[M)VURi ̼J~mR(ytQ|+`n].0 jqk1<}fY[4QP\ nWlp Fw>--5kXx912Rsǣ*QqdSNⴟ?:-|3}Qȹ]0[}8\_.0 b1}k*^:aW565k;θNG&%:ҘKTU،.>> >Ƭ-((.ק]6 x^oBEt@SSkkSCG7ޔ膎֦M͍ X%D$P R5&+_L[N/6r0GG_^/N9[ `0]],O('O3I%.\jH(Unb8Aȭ$jWEmekCc>Otm5]'p5g2yYy1kf0 na!Aζ敝D[XٶmqgKۚkhH446ܵXsa(o騩 A(,ϩT'a=ZY[%׋Sqx`0 F kΞ84i5/$fR1HHW@S+u5,ljnH.[XݹaUCC팛.>! >Ƭ-((#! `Y!-+֭ w5ºu+l#^K,\\{fS>\. ;:Rʹhem9ΣCÝ{YĩmBw`0,h+4i5.jn$Ts]r՚}kb=R̊<͋[ۚ;T/]i}SSÌ.9?a >Ƭ-(4L$u-]ftjʡ q\iVX ka la ߄pHW5q2TKZuWX} y0r.chrc`f&~~p0.1}oz顣7K}+㪧o}M[1V(#L08&8So0ҨUdt=BdX*Uū$j@}EM͋[2wXj]~z6m>`[|/ kީ(SK{?'gȱmi?}]x۳]<{mgySu˖.iYܴhaC}݂DxռX"RVCeW]N!Kvhxd49 `\YCґ!:&c0bVeR -_KZɒ:Ym֚jwDM=]rJUjꦍ e`].3ōWָ+S+I Y+mGI.5G:#;_OKc~QwɾH8,ZuAKUsjmÎڥLD>9hq[sՑEVRUIשfH7WJ5[H>2F刚|p9CST~H'ΟS8E]?>.E5/"|@K-npomHدU7HD쟘3Y}0{tp,?I8wtcvmȚ[`fۮ;.o]q=;$/ Q3ѝzdlԞ>qz!ƭےL ]MkpUf{<ծl#3#$ RɺHL򸂁L|!{gɞړLor$yg<}5TϵvZjGȜdrdQl=0kR"mՑp;h .q9]q]wuC2t\`h?⩂r$dJFfC\͠q{)$܇,LUd{#C7v+vn@w$J b}K=ʡWk-tKDjD3)ی3NB "]GQ_洡_E&aZ58>]ؑpkJYsܰ5}WvXɇ+'6ZGC$JCyc%G8}Xui萾R_:$>TRG^!z>;0`e/^a?;04+Q\`8JK15$wT}Xׇ *4=Ӌza=0| &Z䜏2 1Fcm{Ǯv䐖z&M<}@ݨMҊhjىNmZ9_*d*tx\Iv|/H:7ݐMvr"V:=G1Cܫ@#6{Qc5܁0=~垅˸d.pa cx;g44HSPa0pëS2$u`2Nkq %ppqۅPk1,ðY>FB .pNo-о+P%ki@k]L}#Z}#}1ƈFvaHlY#[߇1qoUT֟S;$/oJ>ݒܛܤI6i.aPhR,P@J("8W, ¸"R'NGgtFa3UC|9-<ϟ˹CJn*݆rЏ ={6=Cuuqn[V \7 p]q@:l4uZnp\(+u.ˌ4\Uʫj„+qP4<&܏BIo9AV7L}yC!؆C86! {%PBJ :~wJ%PC A 2(13"Cp!#O1t];xl0$e? r*AC!0YT7Y5?OQA=Q@au? ۡ.iTkeflgo h }Hh )pCг}O &0Ta/00]67jOм0+`Z-|3)_xׇZsO20-T(͞l =M&%2ylWa!Q-;)"]p#u ~0 $ 88Hr ;@3Q|&N0 YCc18fTƚQ0|:<5Vt3|ҚYg 4ǃ BSOk1kX c4ׯ\wo%YveH6W5BMޥ5WNM׍f~l}`Ã"efp]"[^-ZAaz 5=b,Wy[6(o[3tv EKj 𛆥/aOcφ ]ШFWBKw[Rf6<: NJ;Y_X2?%J&ud#6x1Q hP38VVkq ךcdЎP;bk6%V3uMx$ILJ+A|XNCt-FCwu/{A]u -6\%e!RYdiX&f%W|Qv )V'oJbYM&Ƨ᭝hjB̫BKch X)s?T*Fρ|hjFؗ-G1xkP>,fZ£SKTt\Wh!KMN=z$"z jG6fՒVs@q ǏXv#fȧ-h3 85;`AB- W؇+aR@q4mF͸?I"TUeèPW>Ūx:b4A`=M MHVDRTOߠwEX"❩EW͓ aDj(]60jߢ\\j҃, [3tIs`=D%G vἔ<ÎDѯ-Jø߃?'W MPV= ݌B؅k/&܂?2#9t}C VW\-> JNNN!C$]=+ۇO:"a;\a]p-V 7,/`'`DK1Nc)r?ȏK!O+h ]XM& GйD(>+no%U]xgI/1ِlJ y`A W_\q;1rqO<Ls"|;Pr%ތ_⸿58&P2idY#|L~2QОt$Yt1nw3=K/BHBL)L_ _S/%tZJH߃4X'_#u#ep!|ȇOt8ݍ&BDE~nU8lq)oAx :-DgY2VQxK2Vr BU!BmXa%/#I*j-#Szs/{qy.xC,NFz.wd8Bʃc&| \TFEȟQ} |0=JRz+$ 7!"lՕBLE7Zt-AG+%*8 FR+dC<Q\ݖ!r*SAn=0VA8g4$zt~$fv Z!x4%2ڔ~z}&F܊DV*yZ' ۣ8"Ջ% dcja`q?Z+ M@SvVX0/ATCvFЅ+9h,:^Et=zBb:+yaPj-sHW=2WAr#e({ m"UdD",bHb+,rz#_L?[^1F?SQ^*_[>gY7pх0=xy3-ց m_K~iؔ j\.ǸU QxJdO- 4h!aVmE'QUz Cߢ*$8"8PX+jj6ɆqUV涔[ENJz*;x>~H>kFm| 6([1u1H3=$+l(پ( Ja x:Gs|PA9u+>zQTo+8apNWy9+}XoXH J/@?- i)/iYߖ>{ON~xki2CDS7I"v?A1ҝ[vCaSض4t0W~MOw,~~*HG#)s_=m듓saJppk!>z ;i^SXaleq"lUP1T Z`|i}u30F: 96ĆYUY_ǐ4r>{v"|dxh9W'fML'ϳ̚3MvcQ)XGnJC"yS=f˴ρapV{k-F_:k^2-pՖ! l4U;6[h4);F #v@b"%Ҡ{0cmpg"̐x=7I P $lMʆwi-niB.4 W*cu׀ҒlT-g pт|Y4ؖ[{칏ذoҥ۶-[zuԧdЎ'⧓O|w޴x8cVlghXٰBfÚEQH5ea#5[$jJ+h(:"41]]]ZFcF8媢HdcX"C D[3PZU,Jݯc'Hq?`H(ZjatV8%I꫔orl_/4#a  2P.H] S|YY$ ]V-z@0ȞvxT pzw!*nAŌb~0Puа8ĜaseIA7cc7LaldYNKƤf#~]彀|ZNSo3~ח_OofUW$H *\ДJnjA=A^lfx"X#&[;Cܵjk(Z&x?YH չbd9H3)D!n8(޳1tRou?mw8m2"kXz@ӃeTj S^֠8R˶V˲F Z4nK;#rg)XC п-7 `&dAPFE/ln릻y :cgO 1beqޣO:7;&z X:)d'NV–33(jZ{x!# 4՗KXgBKxx0p!W9n``1mñVlmZ;us7d/pֺYmfd a:1Kphz_3y9=Յ/\ jI(\'wyI%6mG%3{| whVX=Mo^ȼog}oMkYr3Y2 7Lw&$rAaXF 5SM՚1 iI$a-fC4md6,lJX1i&c! lXFƎeծuM}OGcuBDej2XCM;B7Q5A~p bX :bƽh5B}*;W.34/'EɨMsCD'aB {=۞r=;lB~RFܳr@90{<)*;a+-ʩWScUV֍+WhWy:/qb=`Fd/s]*4VZZH\,8+ӏNS?sꗒρ~}(Fė#2ye6nFR41AO+}U5FF[OŌ!fH ]h ? 2c:iʽ#omƬW+,g.Ͳz\YYG=mwh,6aQaxpc:d9 :]k:Q#>Sև]pKPW]EY &2k1 u6M>b[3Ilt hYv7OZy<݀plLY 3m7;7iYO^C ptMiv0}ؕbeCgk8憱גNMûN<`7POu'r)w4pb~ЭYⱖunzyF-5Y(ަ35/ ϰa)yebeI`:QS=VҤY+0icM0i"BOQ')?E:#T^s/51h ]TAК8A\nh^g\ګl(o6ٛ )m+;[[pr `}k.G&wXj9OiߝyʭEn2E*Isx$:Uz݉FeWͫ2z2>XdY{؇w0>OUum[Gx[[߾Y՚3O܉(Ey"5 DdRޮHP]ZJޟãe9LW5C&jBf{άQ|m,H&"RV1p*3?#uiٛ5=|gNs faR?Ⱦ*I>ݍ E[%ڝZZYa[NKEARa-q'bv`':X[l$?Zq`đJ|L_m=4Af7@&P(Ancxg}wM-U3O;nlee~]'#O6Ed>VK/EPMS" ڊ$*I1BlaYu#B)>T7e  !,Uԯ i6BRhLǏ ^Bc6N=(Wzd\'QJ[@TUVC6k$dÇ5D3mFpS&7 ͩ+nYDRkayE ]<|[KqЬvdJJ@&}4"?P*64H#S}=蟍 ^s`0˚ ˆ j-+-MKąZ۽6[ fYJ~6|K+سg( NdǻN6˗: ]k/*I ,5 7 I$a*q֓܌-E]KEQ5Ul41Rs/GZM710 od?5qM7t~sؠ|octN&[3Ks윫s=s'#\SzHy擫_ߝ /]'m؟z<6l Ƚ%큸!|Nt EhRbOZHX{Pq MLCO; T-T?Bu%*5EcˊR/G$tJlwvV6.;|J swW/-j)f{!R# cEL ¸3S,s熖U]|K}W=1̎fOGLndǀÿ~=;zNц~y$1(j ڐ"3w~Dzuֈ5W,ƛefPfj_f UbWi&cap%YLR ?Zirz"PxGRlޑ|-`ZXc66dA SakaKTgWg԰ |.)o$p;.|IDZ_FfЯ@Wsn膧)YE Q%E(H0l1A;@ӂq[QaI/$U 46g{[9eSI~9;v6 g;$v^R͋ڡTԚ.JJPRd.OGcr&Ԩ^䉆J-(iyȊ;+,÷|(6vnAK$ )y&~Q1b/5 #v8clgfŕern]?E.=+&{.{&7K~g<#ѝ,Xmk0ٰ`Rn?qK><ڦى,f=<"i Y~ Z[XU$ĦV J'VPLV]eYbg0l!yEe<))iX#6l&|Μ4!|JF:ق* k8fh 5aP/_qaHsKy 6®|Jw[ ʋ6KFŷOo./)? U7A1S< sl9C !Z&l &F~pL{O5uqu>{t]PڗBOM׋;EwWe_Ey=3=;{&cb3ܠ%VQ.]JOmXE-%򂯦j/lXkQъYJ{gf6}7gv3ٝGmT4R5z:AfJѬkrCw>reAY3IKހ"¢εmgTrN ϭї3+k:nÉDXHS0X\bq1#I,t煌31nJF!l?,^Z޹/dmϯ9dޮFT):@϶Lc[>#W ז83a'i+k,7~;-I|l+6EXg}Zs8F˵HSF_/J\'Wnadd>Xc |d3w+9Fǂg>5)f:} 0й(EI$f+X!R$ @V (Q,v[,N9y(ino52Mr}2mpBv(th6,mX-Sh"P^0ڄ60+tጮ?[dDDghfЌfSDY,BU7s ~TEsH 2fN˗K'H X :1h)di&dI~x? 5pRu𕁟}Ay' rx*.]=؂݂b]9:ѧ#Q'm zV2HFNTq&Ej1iVWhPeD(ANdP8|OO~gX%΢/؏1Ҭ"[wȖ&[lY0Wc 9]ӆAly8 ( lɆEQ0Pn&=W#~LʀyKuo].rY d'Oa eu+u^٨Y깚|_NLk("EEUG"`Add$5an0nGcn6!{QrA[ļ[e C[2z-C;P%d܄Sڛ}07vXdn¸ (RvxTƻ897B`NCg.OJA0x 9KAՖ+*u]t:^M洆$micZ g:Tod, m]9۠PliI䎁jyţ`)`; }g>s@==͙[gx^g_4* l+7#E(OQ`F(LTX99A+](.0{zѻB#\If,y2zy&gʊy `q]IJ,<0V3<=b"f|dC]%JP/ZzR}tyW&IإChJ婳>_4\(tFw&dꀩ#!$i51fKf0婞bﳇ?*^ w~_|\ :Pkoy,~! @nbNUi(<|p1wqJ$T0d#Ҽqk-/lX05w2}"@?qսj[(J ŝ8"+$|.M!aH!˜`%DLz]`ݽV߻ ধT9[;}Ł`˭KW1pn#$?~d[y8áV?cLᾸgG l[p|f&;38-S`W/\DnQߧ_^C|'Y23L:Pi2Bb㓫gdB|||AbA rMcwgz-Ch•d9& ճYҁZ̈́,%iobS: T%/F1Mi"e)H«u:^,x}zKl# >QedIp2%yC$ *uH\g9Φ+v`4//hZlڨg)CL6HТi>EdJ"ۺ#Mvy#ސ'ԥA>SÕAXG=XfjlZC_&Un)$ז/xCM%G^E'Gvc H-RD/.fB#(fف4B~L̖•qF$d!^(R %d06#hك+j g;{+2[֦Ǧ'.Įno6Sc{ty£<ݣ+H@L\3φD1+ !6 R*B5r/)퇜ۓù8ap$VH֤6TU~RB8J_DN >r|8ZES H*yԯTE9h% Ӎs<3@'J4D9LЬX@AQGR([ cpϒWБS`8F>l jz$Dh[RZ|y7Oje)#*^fH ʈ`21CՁ:vj_?Ș֌{2&o0KEXQG;0aQo9Sג$*n1 ٣xs)$asHA^#, GȁJ h7DŽծ٭Mc4]^'L36o%{եr]2zފ+y>}]ƁWnq㙇~Uo/8&_Q$貫qيަumijZU;autB^>\])\˻č97n7 +QdlN2{ =AY2?q]mE;6Wz,Sp?1pAztdh_Ǵ;8 bUw8w|As:/d /Lx43)ta8{L zp'L_@^_7,=޲")$ 5 :F yԇp/l)#8m= ~YOkeظ0!΃mjNlct88M'^#x1=Lǁˊg^}Swrwvų 9gw?kHW1%"/l  nkD8&G.԰ydrܛ =yɧ8}= RNt )9y kQY&ؒRXQ`d_ dEOH .2(4Lmn6[t B6{B|Ɠ`pne,rvĽ2Hxwp ݔMw#nZy4<ߛ9Da 1)Ɇw8-#U#μa3u$B~=?.-vHʸL( J+!eg3k i@4t '2 23SVSxL(G [FML3R < !zB81b4 f<iBqu[7Kx1AxzÀ PbDQt=ax|1EEYc eK ]E=L㡄H01&`@wlGb ] "{1&nrs&8xmTS&B4z%݊Z~m9TD-~`-+^[V&y@5xӯLEI TFUჾ H﾿7"~WS–IJgu44$Y^z!4d(u{JڐܘP93˕D}V&!ê#3 23@+=N'SkcVdzqI-ξKz,cqȠ "KJPa@[X w "X&a↛Зc kl ;,e Cќ=9cpQ4'TEsx<4[X΋"|=T-l9(AӞ#MtM3'+sUl%LAL) : s.bt~>0U Nb`ιR+֢.= i`fO'G[YLq ~cV_ : @- p%kye~i9v?;]IjRw_/{8f&u{ b}цm!"& EIP/5jr[.1X>89NhQRpjB}$s4'(t`N9B %Ji}0dx%m =*J/!±r|.f$@Rm'L^Us88:n ػwq,ԆhDjlV@Kz 0 wh3+H@PDه/=xn?a2 H]ak-Run sV(@X-MB! $N> ^x%=8曯 v. Ptۅy\hhe[wM KzSEZd-M4ȕ rN*9:1FA2Z |B`[Hr ng0yY+l%AYD:Q&-mG r+2#XnVq\\Y'rumNvG6O_2Pk=p),j V%s ="%-%C#s,9'.Ύ!Ӡ@K+L =SM߱,Ŏ᳢ $RNPQ 36 Ri L"u( *.nB_(lhSю'hQafD2ǝE6h4Pqo|ǘj5DU:>[BJuE}Ǩ;Սu uj*L=~7`P @%<86͡ux067\4({"^٤|~6k1S1I_hiu.֨khkSXܛgOHCvU-ht-D`|;dosb-g8>CH1Xp50M )\&㷝"o8A>xXxI"3*3p#6ߍyKnm9 ACUF7k7q0εsx4kþ{ _7n'-?$1r#{ls=+@Vghנ4¢mʝOO\&oU/ޱɹz:rg*9SϾmOS#tՈsu:a]2}'~8zm̨x~sι6"9(Doرdmwa<^k[{mPPW#+rUʑZV|0Nzoۮ[L}.{9{iC1g4-d܌62 4*J(Cy}/2Y9T^r'O{T#-1+"0f޼22 Fu4c$M%vf„t~m L9B p{/@n`"/ B]Ձpa#fܵvM>9w1pmvC:"IӶ&3\4ms=p3sj-Mc*ߠjh_/{O{N> 6dqϜ{~}Mοwy9=w}ٍ>'\VrpE]p D`vt>Rk=ċ̘b 4?/{͓{͓5Ow/=GA 3Dcz/ vx;??>f<Q5,+:eA}\#J{%lT ij~~N+3Tkwm[ L zd油S@MU"f'lGQ)9G`iY;g9 ,箁[ ')ga kEkM]wY(dޟ:ă8C^#OO2G|惥4͆e-k9Gf[]{WJuJ4 G.!]TLd!L&D8@&Q2_Y*#s:$R 30ݶ)swx-3|O>wۃ{ v>]:|{L_n6=XҫXTl1YC$a0Ox4Vքz)kM4xɝdsYoLnFW`Λ?Ŀ 9/cMg5I:VS7Ʈ4W< C7\7sUCҔm9P =QIC;e }3>NW4_CuNnMBy|Z_YP̬ڰoIԵ7L$']niҺ Gj%? p>6剧c$Q@`c1]\S)݄OhlX;)ҡЋA``GpCi@7+$V(XBAb0r Wa ڝ@t:M%Vi*2deȸÐ|<~HSԙޮA>VtRDvzȞˤ &q,NQn"ww.D򆐐hXɣ;T)s~o-^;*zA,$ж[n{Z4wc&]{wU7>/۞oy߾02/=ŭ]w`ήO|Xl(y q[Xz2Oe)0zK>+c9F4K13ۘ.y ":bg1 M5[A`TBl>pkl-剷_ѽrxxg Kmav?9s?. `/>CPJ].W Q\B-Z%P2g4;ib7lP`Ya z)ʐ)5&k"s|̣oE>P0쀚2ƝV+^sB2=J_)xd WĚaoGrFf8IOd(i!cX43!EQʖmGwyx$ڣKu ӣq%4{ӘnzPv/̶.C=)j ؍b_VeFϖhhgXsv"gOqέ$]҇0N&tn7Oɒ|-tcZũB:zt+?΁j.ç7NlW程EB~x sG0w{'7%ijQ@ FjavsĜ5i ?cEu}Ιٹv$1BB ")@"P ת բ+pVۧ-JE~G%3M̜ݝٙy<#@b{, D(L3URU96PNg{B1 ڱ&#tDX`TR7)~Pw+?MXPș1m$/?CO') 6 +&5s91̀fo=k^;űheYukm:aOs:v8>ux)u,slt 8XL 1D*KE:a5 51ϠT\1Yi~m岠ryd&C'32A_5wɺymyð\.rf)\LR886 @2T0c Y0V ZU`c`l] zn.rz$$3IvcIgga3a/$ \yKbpkIVm5R% 4hĔ-݄E VαBAf/NWvpm =R0 =RHA6,U+j*SUv[e*݂5HV;)3V٫LMc?ya}_2#ݾ>ǠT'{7zrzJ3 AUf+ks)<٫)سԜA"C1ZYg qSPLr<3S`b&e)GWg';>_K=GҾW>Ʒ`٤W[mORN[(ǧL!(dW&pnpHzi]m |Nb\q8Oڼ3w,9s31],a;KKbyKHߛ w4HlAn|OB}ަaTRʋ+^gNog[X,ү.>;xdɉ@S&DQ۬g/g_guPOip*? 3T=&A]HslT[y/W\3VʆDZJ s"Ɏ$ff %^ċ3/hhEFyOH>yv΅U44YU" 2g1P#8Z0./G ep^\Fܑf"q\#2?^G}3Nyj>:z(:NS;Ng-vKrWhLirUO+*_ʞqOeΘA47p6dPDsbR b4*b"V-c_CTvl.~N?-~Qpqu cCOif냰xI1*PK]g\P\?48DLiW]CisEkDl{߷?tVC!T\xnzOGuKYEuzNzZՓt(Y!}|m23$$öxt(5z!Zؖt qZ+C|sGyXbc=#ѷbr.U7XN) L> E<]!dGZ~✒r&n. X(qejyDʝP%ae(q 6JbbXtAĦM@&7exjX+b &;/V+jQCzdY(C0l^u4~ʃ玪w /4v++x/nX oDŽ?nL/VV&&wqōbMsKUtjǃ < |pDli=@)Axt1IXkddMtfE^@`oY͇GaQ@64}x{@<-O=ھV=@ivyN'\0*< tydhnb VSÙ$Z2lANTh'ŀXC*$b5 b|PӠoF \$kYb~p_%<+eT:+JLGF:Vf$| =%?CkG)W4)dB:g Z1b%(kCTRy wL#ƜX:TS]$q)aLg/:%zNC2$ r;3A$8`R_0f(%IE km=`bCIS/ L8x>ǜTCƻ[y4CQL>9Dgt'$ "6:OfpJHM7$#p Pdd0ߓיԨO:F#BP#T4?@Uf./v0z~6(O>P\YZݶ;=mmD8imSP$=|ڤ";M.|@<ב!#wn lgz0@IXkЭH7yB)Pk./;a*ؖ}ӭlgw49+﹧>C'75y-c~oV3>ĺ:D2xPA)Ҡ̱HďF p-Om%9$eͨf/z]@&PbʈxǖLg.ƒ*T)&&$]ǣ…b Lq^upN1ECFAUBBl~)|y"5Ei'/M5$)?$ml\G_4?F:P% }XqpϡYhD;|D@ͨsԍת?DG* .R0@_WI>VO'jH'.֖h]mRL ⋶'ZW?HHHi5C[>ᓽ)VDC&YMLTx@UuR e`iX~&h193͎g+TW[ZIOROS>,S \RZʃͯ"q,jJgYvb%nVE-BxEӤaGLUpl^u͕pQWdQx$4 '7L_0Fn)WS‡/ƍ|X^ );-3L^kǷG bMx*XƜpXu>cC w*+l3 7b_Tݴer NE'æ+eS gʆS *n9V-o 2=bD}e+/wdBv)wd6\2.?v/%ָ×7<{"S#I8iR [=3<x ))uycF˄p/uOm$Y= WQ6zPߋߔAbKb $>z d$Yվن.a-xbMpwi>I5KhS.B}2jUҪS(VĥR 1.0T"y4JY)B3i5(qKWУ3o}ȑ샯 #5;wš'u%/x={-וn_yfx/}W—^_agwfI8Lף7/]ԢR,p 6"dZ7d׿A.bٕ{"eLg2ot\SSzۅ^_t].p-хs%7)t#EPxɀѾQoDPiq'S2IR~gxnQJ 63@Z] QB a OZ2ZA3K"֮>v-#вi&1X|9\nVP,^ >'fQ9y p4ˍ#֖)U㽳.aZN`@SZSZNZڍ…\0؅v]11os\h̅ h0ͦ pE81QULN('oALbZ TSunBPjZ,i7'@NәD.*Cə嘲ϻ] IJa  o!❶"@Dqz4#lCH*|T@ﳒsl[pKqT=5= o܎/dXŇVHVrN BsA0*T^ f"pV_Bp1 X&3PaYY~b|t^ɠs/i1ms;jDdVƏ;ܢ[n~sVoBǛ:)JԍM/]t%F]Kn&_o \i[E׭A#5zR%ɄYN1RH}><}CB>:[`b'^V$h`h*l]62W.\2e֬ղlUe͜yMTq7D5-et[}]b Ɵw#6=w yl\>$03gD$6YŊ򱣴iH2;cdXOIkem?l㳶pGҩ {^{zz_dž}x{ut}dԈԈ(eFHɲ?@@7.]_O7ϲd/}dؖ#RSp;t/[dCD<.FYN>JץkpsY68ʉ!Vt232 "_ : >}RٗwUA͊ܝT.VAk\+Hk#y?p\dd$\˻N93x()f1֖R*<u% }ɾOC@6V 3,A0uaC٣xS?wG΍%rϼ%p#^d7j={*$~-ps3%<'V :ّ,b8KȽhn$?_uπ#M]]G0665@$Y^̸&x n|%?` PfdJE#{xC1T y@/#3n 4QAJbѧk )Q_.h*+\eEe|n7+=5v|2undX㊙NǘbUNڵhغtƧFa<)L39y*GrU|w[Gx?W#gǥH9.#GR>O})|sIZ),Z'621X' Y_uybsmbM]7Aaw=9{k/gT2ZlCRr WSeen7;7laˎ.|&fjp +p #X ޲a j(U] ?U]$xnGHXOc5Y3umzki]wOm~{1mik7uOcڱ_Ƨ6',vPzCt@5j׆z=P0%)LRVnp:۷7f&<|D/W_?<\f߷L&Lfْ2 U ! D6%EpC@ZkݮDXKZV֪j^f&l>7pxsw9M%}6j4`H[P`J>9Tȷi%P|1F†02@g ( -$Yi9`t% 9\VXezf1g%AZLP&ӄ(zA܊ԆeM.kӊY':Nw55 ۷LNKҴE^Β-5 uʂL HAT߾b*|hϢ YP=[3hzmov3ԛat0N&d2wYvDô~W`}Q0V@NNTz\1)%䚂LťG%ɻ,;kF!Z \Q29kHp 1 DQrEY훳瑞;˰yGt[fwܽ5G;n.s=sCje-+RƳyE+ߜ$1?] :ShD i''rW 5ȕi*daiSVdrڐG\M)AzM?E|.~n杢Ratmxǵ4iЭޢjS5zUl 9Yo6k\D~ DFkkv`p'H#w::DcC⌯ZIObƭ? h ۓ GԾw; hDz+ʫ/zZO!Wː=n:9>3}wO4< P d6X`a\WTDѮ,$@yrhue..&g_)`*+MdbV>sw(}}wӨ &RH_{=r-<燞;۵F|8C06[[c/<]*@ҀHFz$4C olρzّIW)䅶4pj'&l^ lv~#ݦۧ[Cj:p9q'%~L䋣;ɏ~3v ߾vygj/_7]ruk;ǒܵyR43ɞr ?@^*{c(fSI5lGbNX=D[bgqi&('^~2a;ױj=O=;ն]Y_zeeҴR@[[-p$[n.I3(ヘ峯;sCgG̘Ju8Cܦ3}S:nXm> #k G{Ӡ 4$Bu"M}:خ%*HJ 4TmtS;#5Ajr#]!%S+Qr^(6%ic=7xnc?lYqct'u>n€?~ZxmcW{_3=F~wU?cP/+<<5#u4\WE(1 d7; .ƭ3] -rhUYS݅;sWn޶ӏ*SWn;<O_( >_w{O6rpt_>w_t4S8)7l·`ViOP :  6 (4M a#%9.oPX|z:[`d.o#}\ 5\thS:NɹlÞyC([[wzwX8ptYwL3uVK JӝXg~tlס8_TP$AfFF"d6+^E=l9 fzTVMH6r;NvDn[~Q /F 15Q*n8ZR U@Y5zL%S̐ DmVAݢJN SH2#jl}<3~F6&Рr(px < [b= c&ŘV626E]pOAptu~{_8y=4dCs~;G{;qd1B{HY+ ViIZu-uոhibM"ŠQ߭n%MNjA+}nFn٨Hp r 7w7uJ^XTA=b ?<}:l#3ʻekήN]3p7}+_\C^m+7r͑c̪EaF'g[n2WCF::$ y44<<=%/Ep$DJAZc?jc,"R%cϠ3:r[Pp0a1&01aETD AꝈ{x<)cA%2_FL#2 ܦ_`M9UZ 6 c9c%(MHkF9Ĺ#W1 فtL8T7lw1͏,GJJKhI~u>-ͮɦ4=IBff)Te*QrH54$)G_fQ ꇞy桧e"7p45l3e0/#Ùթ0ԙk^ծ9e߰Hjt?)_lo.Eq2NUo ֞pS_קiz{,Ie/3waǪ-%ϜnKO4с^2XO]AzybY(m}. ]~BNw'BbK^r˂a Fum0Tlgl}Bذ@K%X*o]9xW4N뙗5g%r= gƌww>xuݜ/^K\grYi/c5;.7qP8 /mTxAoQ[mhKGqVV2P@&tZ `YjTQXMTӀTjTp*mbF8-ebTC,I[V24ΛsňV?j2j=GHB#/S↗wD^^o5jLȈalPf3]䏼͢8J<_#9Fot' 49r|DP g4;;Ҟ2N iԱeYO21a{hE=B橮wwG /`ϝ=Sg3~yS3^zЕҺ; kf\s&9;dKzNBtPe S@KѪym6==}+{x^WzNo5׆; loiI[.ܛ  Lj;A+돼֍uP3t'75^Q\W8/qk׶5SDNf+9+DN.ja. z v(h!"r߱od|y)t=#D#_޴2DV d5sI 5*x[1OSؗ+e:,V ?G6! [~ pzg~R9}FUUG* B4 UR$DA^>)?/\G{pcCCg%UZ@}NZRԂU-WYɨCdn pLWƙ;&0xҏDc+@s=g#N$#_S"(3yI]b%AD剑%F3qù\Y.c#ZaPk(A-z4РYHN:>lEh1$l>Jr}+O&Z?PF_ᨴ=;B$1CebZr81vs1{B{Jx ;JqqV؏JĹvZ”UԮJntu^.G!TZ%{f W\*1*Pt4() vhRBrjTI ZZxQ2ܱqSc։ MոKh],$@Va9a(uf:G Zb%(`&" 2/qnp`8ʎYjgY%tY+Xw󎾊{75N8Ȍp`Zfgr/ї蓵ѻToi4:#ne ,QXdF7߿nJ6E>9o_{Wln/4кeu!WHd2&||o!) BQҬ$Zv c2+Dٜv]ZV0R$ۅ~#)yT;za39=WNYj5@a` Me*AD>Vb";(mޱwZaeK|lA 2`tR>ur'] KAً/^ : jVV]wi ̙.bkZ5s{Y"%ǰ\/M2?e/өNKT$ekZC pCↈ[LIze樧#s%-x#UuwPgrcˡbPR\2EwknO :VPy"2(mr̡LC^7,qTؚ[iz#짠S /!k,"cp@xNi~4+Nsc MIJ˲ b憦917TZw!R;~R&Y'b{@r9BuTCWp޶b j]3ŇҦg w\[[[fBj[FSZyXVPq]e+)@y^VmŹ9W-"1R*Ɗ!9(XmcӑSkrN6Ump񲤞$eՀ!+>(rR}Q{Q22Tp:~6ECD>u<*ϴ}Z]Y|U3N3=*X7-3=7)i\zGDX6Y#N. TNE{ U'X ,d65DrB% ʩ#xYƷ ط 1r,2HU+eTi5Lq7xĖXgrFq! #:QVFt!-tk!fA;$AcUݡ5*nuU[QL $s#)>>y$R'(iMrI'8U=pM(,PB!Hv%mNLh/I#h(hcD FJ4| ѝ@WVs73EHzFyT3og㏮E^yWF.>rj zoM0A[l26It *ʍ􋱕ef.N3ڹ?xKxͪ$ZBfʢ20Lh@a[Ģ*}*UmDK jAYkKbhTV{J qB.bFGO{lsf]$0'.32#ooDV;KFȭ\b5VEKhJ3ǬƱLT]rLTq!Íd=W:5' ia{$mgG#G#H3B#>=>47=ֲSQȥaQ!"/tاOd2:Ze1vcQvLO;_SGx4ژ =cX> .z+#|y_w=br;ۮ Dž,T!aA+{aj~E?3B҉!F굼2g̃cXcehﻎ~=V¢yQ^.Nxgr,;-; fbN^%X@XD^!/^KRuԎɞLJTKqx/YOcIJ]Q4*SqpLVA /TVuVPp ,bnSyeXm++ ǃIGRS#;}S r88qCϲ+snݔBXW\Y,*Sy⪃kgFGf![O\ ƒ 8R_7g VM$LPoG&a?[$L$L$L$L$L$L$%q4< WP3  {E[,^%w/Dpᖆnac?nҕK?k,n|ee46e.{ϛl~ElhY~vE֊/8ҶvɕS[mB[[:^ٹ`.2tteuw",CF{nBs&a&aށ/JL[*"'@aZrmL+1n%{1e<-??i%ǗaM/ii3p>SOY0&-b ,i3b15DS/],-)[ _*!F쥄XBRx-!L35<=Ex9[kƴ ۟&`2~^:*6^4ͮ9c; Oḗi acc; i#OJ*+9*8mVQUQUbkʹ[cb㍼2LkI-YGXǶ nLM6&y>>E؛$Hs_ R==2^ ud$>XQ\Au$~UdLuzQv8KYn@dۣ8% Q\ i_DqqBZrž :Jh5,"6/ ؗ92čuWmWr|U8P$K4p.P u$JDC WUQ\K4puW%$[Xuo+h#usY?>'F>5r<n2Wa mv3u^ϗ]ubۛލ`p=xg?Ra:)(6V>&G6|v\X[2BzIA8)v4GjoQxb>_6cuH=9esxzxyI70jY9i#/23T+z1yXYJoKVNS8w11uz|g=to[u+o{=ZVqµC┍t獋_=mx&RY~.b9ڸ|6Ggej _H{v~Ʒx[v$s#xfqUL6i.x1ݸKV?{h3x[\%I~_4f%Lj"6ja5s<*iuѕo=&!=Q*o亱2_%f%:4᳌Q\WQ>X]( A<1%9\ouUm,q [>,Y~cG@lψ763Pc@kce|d>cJ`bƵʔ=frE] +-^d#zC-3%P؛BfatDy{!"79qD_\YbJq3g@ yx̥҅i8>uq4[##MB'%&#g&d"P8_2JD9&-MCa`=-Ɂԝ(do;eKcxͼhQxL3p\8dчx7'Z-j.kۗ׫&#`o!RP2V4Uh/N6IH^Wj *A,Sshï@}Gd!Wcĵ{t~u8qTqBXqֿ-/#F-3啮ޮTk9}GiN}zaAaɲ">UT(+,cuGܒb,vʜѺ&83]r=Y$e,+,- eYE\Ϋ6BǣQ##(WO(*ZܩzBiv1?SZn^_ONK3BT/.,ue9唔gziAӥ~$IyY΂b8ԝK2l=ճY"AqlgIF^~qt+'2WFsIk^Sv`z^7m`UO3:z0q4oMBq򼂅zJNZyzr^Vna~Fq>#ĕf>8f zqiQQ~zSXP),՗d,KQY.gF3J+.lȕY8ĉ8X/r䕔eB`T$rx,tmN04$J綂QXy.zײr4 +4ykw8jPkKrs;/k<Ĺ_SWΚ]X^_ CU01tBXZRSvncrE, ܼ<9ZUa 339{.€ܒC: 92 ] ri(U@\^ażaОސG$#p5/*Dje|xPw/sUxXX? 8Qj+Ɏs\LXOVnk!u ]ኢ^ ,Jhⱳ7(#0t Hy^c@oT 'Ge;9!qzy^I.3(inySܼ.8p"(}Iav^B!EPqpXTYʝgJ+AN 4jZj)dS ) (-\r>r7(u1NQAv!`We3c`>;g kxFfaoTqNV87txn_G]%0&p^/o qzjJ|ڬGp'cR!g%%Lq#&9m$ѧ%&Fqg8RS8}FRb''͌MLOB >DTʪRye LJLJL'%:Qi>#Ƒ8yfRC11#%5Eɉ%nz\rZ4Ί<=.$N3wMN1Ǒ8%!MOHIC8,fRRq*tjrRL(=6fz̔8Q*8auDi)ɼSKGԸ(=ƑHA\("*A8j=.L%6.& uGc^S(H|R "LQXX-yMXdv~oOϘv< XOkoڍm[vsovϽ{0wN۽{m[ؽwl#<bE X:ְb3iaSnBx#yW&׷.+0^8?UR(RpDNn7Y?a7#v~ȺqCn>Ƒ6 G.[[O 'v" w]H=gH#/SGSG22#=4 $HSbUHeGmr)ŠI + +A4lÖ#"l [~mHoێtepRG$S ᣑ>XRqfלdt94Lͳm-H3 ]j.E\R{^kuHiv!SvO!/"XĤd=i.q8WqsڗDvTE@z`GF#@zO䟐~./DүDX䫑$?%g#!uH# ,yR,,/" %fJիɤvSӑGV ՞Ӟ#=oJjkob>~dN@֛h+үY?ASiO%rLlad‰̶Ya[6\;v~7) ;}JX\AF%6`\}yݡs41;^DdDd!̉(BX r\~]D:b5r 5Hq/"Cz3j_kpu#99LSOG}aahEk3.j賫 Ws=tӦ$=k+.t9Ӻ\gvgԝcOOX&tr 5Q8|Lƿ,e::RnOWQOU.t^~9 Eҏv:^S448mɀ ]Lt>R _긖f"PgDx [t(x0_kDNEX)]_["<)`eRFwPmĊi*w$1JWvVV,cy+ueY+cik5{e{1ud}xe,ky>4kޗjZG[i'=Dғ z'}01f1$e5lpFy6dě6Un2-,=~(K;o]$cٳضKmUJM[}S:^?,D=R]ӟ=z4VeH9H䘡<1eN^Im8[1ٯҮۈCOH_#lsqzFv^:@zчtwJbQ:)ݕJ2R*I|'3Ǭg=19+rVs fA1Lhn/E$/Y2_2~EU_~h8׾3?hG_yՈߔF- c dWo{0pn5==yߓ佗˼Y2K@%s~ 5t\ RcǫCqY,uB:Q;|P}(?&Xɰp_Nyu yc-H$?$Wɻǃ=AA y_?H~6H>$$$$$$ OgA7G$A-H$w}~A yP$GÂA yT<&H$O @(U#P>2PESg寂Pk ({Gg3(\bwF3ܛ;e46ju6+wŶ7.z`kչ/{QOo*./7r\!rneZ{01e-x^oNMTsbF[6!(p#S ql>>{_T8 ͕ظ5'yV[ޜq1-z3;[s4w&h{uɱ+4Ŋ+'~!ٟ\.b{E;ṷeMIM֌VIW¬bQE6jj{md6'"'n'JmhvUoS>zjkQs+.5Ԟ>>p)FI7^ {-'Q+\2,4 ]{۲T[g|8D&oE m?FjnD@z-b Vݽ$7K'x|qz}[(z꼍|kY!5rr)^.-|GF?Lʥ<^5/?p j Yu_=G@k_K&笡zʄwQCmQC'J˙GBYG1 UC=}mp} GO7gZ+ j4UM-# ۫M&9elKoِhPk"XS8kF_)(V Sj]~U(wT<b;6(qHb)OU_:r@\Kk8_}SZ@KG\jgC/'ҧ>V^[Zq$L-j]amm9A/qO;rK;G6˺ڡWCkڱPzV jM_,\j-w9VkEFAkޥk;Qbt/8VDK2)JG4-BQ@}z.~)dzl3 LrU]qfKUU UpvO\XzƌWx(d|sdy5rKԣG}6r/hx ty9 n7z>:[-+\5TisU\o!ZJ LĪ{'5J|lSuY[]'xHذJUKA_d(W~oz߿kzЯ2<^ӮW,4e}l:7?4ϚY+bc%|M<>Ͽ^~İ<_{n}>hi+hԒW\W$BQX<TmOTR>=65yyc#Ke](@OmVW?I!{j_ߓ ]8$f 5o*jR}67y-π¬ٖ.ҬHНާoY;WskЦ;I~ckt)Nk65W{Z]7wmsf6f]8m^LAu?-K&k$ fMDz͙̕O#>ra>dȽɝ۸o*ן~yhD= [(M yì,oo_jjo~Ҕi^ zw2tOpcV\\BHZPk2-;;'k.e6e_%P]J*_KDzR('hd t]Lo!K7oFj2e}QfPCu1|pnûDՃDՏxNS{="}|ai( u+|wqiԐg. -\SoN jKOyٶ)2"y#-.DޥumSQЕTYru;(]-w{-I6Ά$jG.5g?1e._bljrl[O/[SoHj5h:2HYOκsomζ2|޻x >8"#ޒWyKOޫbvh}}ۑ=R#g̗oT>烗2^_~ETD}i ti,J&LCsieRvcz~:D%zNѧ SU*vj[D)CpeR<<Q*WS>PN(P>WR)_+Reڱ֞u`2+®fװYo֗c`ŢPv=n`v#Ʊ&6&6Mf,ų),%lKbY2Ka3؏46Yl6[<6 ͜,El1gKX+dErUlZmuK}@k7c!z\=~V~URϩVWi4NY4UkWiZ7CZoO i(m ծFh#QhFm6NݤMn&j)Z6U%iӵd-EshL-]jZH[kKP+n\ZVjeZT[-Vh+)R'l&I_ pP2fFP; Ma?7RX' l)uĦv5lyHs~Eag`kO6:axuO] {ddM!T6튝Fk`^`e0FQOJ:lx8@RD(ϠQËʋ:] >BaGqߕ#==( <(:W>p@[[ (!v 4 ҁXh8|F+t54 ~ԝF×zNܧzӍ49@`Q,עi8:!=XLuQtnEP컞6q@h Ppm om@ı8*QMMs |v3MdhShP3rNŹih'4 uNצ/ɴ hza6f"9%06*28Cñ1bOM=+Ԇ-8fG#z`kG=EmOñu)"UتQ,6+cQ6@ێ*r`S*NG;S:.4W D&z[wz[{lIl::GWj_ cYWHDZr<ƺ|9`=w=YOGYw-x14]Ǯq$gY6⨚A@=lF!9Mc@4!pS )0] ,`ߏq30qD`|q [ 0.C`\,2nY, .GBwl![t㨷<} ["@`_"}m@:s!q0^)аXa@l-R ,WW+TDxzp >> &u­V՟#}z?Bw@U%TCZVU8ZbP{_==W//# oUY>V?AK+F`*w ]Eh@Z{ӻ-B`C+z#s@{zy@ϻkC+nz6P|nIfm6 1t6\tbnxQ vm69O+M`?CbÑt8-in]Uw Tݢfg l"ullMYfah@X[Ζ -e3ZZ,)lI>keDabFG$-|L8Ө9ٜJטͳy6'_hu:FZXx֛)o4z %la4˶¶f۶۶{gRFp^>LMlt:uhyy<ϼPn3)6/6+]b*O+՘*kYVfֿf;l~rK6;Ӿ;ND/H@0Rm2/<  2ǃ$;d<[|pd^2E~|e2^x5x-x#xx'D\ -IR'y6 ~ yGǐ.H鏑>l-ʞ2~CC4s|?foXY,eՖ7Z iyR myRӖY^>j9&8Ҝ?FY7fUQD uQxu&[Ϊi8n@(7IjYިsV]RuN,rޅ4燐ګ>,'?YkyP~9?2W$a9(- rLD+|wH5Ȝ;a>z!ցQ@1cp,䩐g e U`\*Cު\=*xqާW7Nj5y{k:YXmo-V7z,J*HbvNDk<ʚN:<:ur/9rֺH%kYpiΫ[V[ hY]g&Һq~奌Ղ7Zws>iyP"`X_'l=c<8g3gg%8a6 g[GȜz k$xQoK$9Am8s͵-a[`|[g \=mc;~5p:1f?[*lٶV+7m}?ߋ{~mg%" [=wۻ"94Xj;'w9Fٙ5p';qwäc9 rc<[GZq}V+B %ۧ c{XV9ӵ732mٞ|%U[;=a$?*y}1%GUu]s9{)!Xk,c>k!ZcZc-Yk!jó %x8kTԣ*tʕ 1K=p;oe )L= Rz֖vݖ~On-kY~^G1{Vz}BI _MYf4`9)nMiUs:A['MѲy_@u`) DYw4GL^Zu{guߴ;r- $ϰ1Zۭ-rEۭ*YKbjvDk`&B[v2N3hpQKj6@j,nE[)&múdgɖ)f9 3t{-@Ö =Jt>Ey }nIz>W0q+S~&W]Ip:km"['}Ѿf>|Ea&[ |N}apC` w-JprI-mz3W?ΠY7:|@rpZn\ =>R;k:3g\=sүoڬ h%z\2W2"ȣ/1+ {ؼk)j ʋgB&!Lk'+9nfB\pFA?t=4+G1rS?/~;zaL(7fǜgWeOQlj=8D8!NG*7?"ug+f‡K&mR;D3-星fypvW2G \k;1•-QkTMi1GxIYa,ʯU3|Z|"s#Yn`ȼ=@Oʏ,#yKnpXO@i3ycnjQ^<3yF$-ZCtLweSc _A9nb8>G@ȿzz Bl+'a\I,#ob!yC&*g#>;2'3I4}.߇5e͛'0AVq2_2s\EXHcCVXM9pmET܏t.\Ȼ nh;0TǚABA/JՌV܆g\Fƴ/z!@75 zfͫk&|7s[ LxR9OM@}`y }_~?{!B(H7#XJ%Wk~WJAU=wX˜v\;NKsfF`OYC'), ڑv oϛ>Mzm="`i#+X|FGKbf"%zdzl9G?wr7fz^eE^c~H{$(2b;V%L%{L|odGNN`߀xMM ^ dwcOOƟ1DbA=C[){z/E omGgc??ѥgG CCDכX`vav5@Y 1)c}r'밲!Fc,s'vqW1?I~<ڏqG$Fy'*p?<߁WXp؉Z_}k}Xb_3&ˁ&Bf <)gDӲ |%.|.j dGQC\ELĿڴsB#l-QK8ig.T(޶MޱM?n_`}\Ӿ1ч_^B ӛqӟM|EY|RY?veϚ~HqN蔶'O7Qm ATʕ )SIpY޲Lg~>*if!Tz PS=lej 'Y4Vee%&0&<L&7 ) `vL"xR)ɔ]A)Ѝ@W'`-@ s'}%L)ʴ2dJۛaޟioʔ"3}m3??>"uD9jO%zv)S( W([LhbTzqU%ZQl._0IgN#IT.Iei+(uVƤ^.ReiR4(]!JCDR Q~r$RZj@iHSR{tfJNT IRK*&E m6C$VJR!Q RFZHTHZAHHoTOT](eSKRxYjǩ$[ۤ )$^GŸx<$ZV){,k'Y$vU-[IF.8UYrJ~X,Zā.K,7VLj.W w@nlcJ/:ߑL=0i W*amL3iLlf^&S|T`ZnZa4WN?IusR,WV(eYs\CT=WjsN=ڒl껩7RoN[Z[ZD4fϰj {엨b>he#TcMU{OHL~W?^5)Gl­~|?CϜ'Ϊ3gęw̢g`g;ހÉCT!q3}G>:gęf r kACT[ţ1Zgvb8$c8% "YW[ ˤ dKB)RJZ#FAʷH\-*N֠6HMFOQ*dqi\tj2Vw*jćUD]WsWsfKȳKf~w: 8#=9B{zo ٟ$ eFl:`aKx d:A:asge;q%J."_U"5ᅯZxHK@c p2AcD}ri9|+'BЭ+oc[%%M+|I}&5n}ZlϤ[E_؇_I{*Pjٲ8HpK Z|vS t[L['TUT BB睓ip_\Kp3_%,;%Sng0ŕh>% [ ;X~+K~G2Fc!#h*mLQ:';#;qߩ(HSStZN0'O._JIޜMH.K%|,'UGN~3:yšԑQr[tG2q!CKa6 ?t=Hw5$_|%aP'aT0)L +Jb=B5?-(c4?uPjMhiuͩ-J2$eQ6mŬM#GKciHr%I uZIۢm#2pvi{~vHIvT;F4kZ֭j҆1i&)]]eփzRN髨Q}^ߠo^v\߭+$@}^EtޢOsy%mM/#j>O} edOwxCMf?>q+K~uБXAx:X(%C::v0$axv=jcET:E:8h9:gh7{=>Ǡc$9;\윣s^N>gԙ\@x3ϹJgsuornQof̹Kԭν΃CZYqGu4L17l/;۵]j!:ݚ߱'{(K6~R;sN8\KqYZ ZQ\A+C+suerRWSmv{õƵ޵L䓵ܵsU*Ws60͡ٹzs#|&{iW Z1IZˎKpNΑvw.:#Ke1׈ZwMn%w2~פ^) ZW9c=߽Ƚy,A3VW"Fw6uɽgAUMDtEwWRf8rnbbhw5àhF~wcM0ݬv3Lw n4${9}}]u#i vgѬMxϫ6¾LZ^_[-哗|9Kjoj٘H-m=$vvͷWq5}Q_Eʽ,%3N_ns mGu7H9]i.ש"uPTys}qTUm׏es\UBפvԟF٭L6 j,\bFş糩eſV2gBS 7{&?^w~?OiPp;*AO״D~d{oy\3(pV9o \5@;( l{C@ C"VW\mف&uꔙr߈OF}w.sp_;Ў͞Z=wcg1HI`t3i;pZՁ3驽Mkr%p5[DgB@r`Ľ'0 }F׆D.nպx6^λØw@%w.{/;hLm.%KHh0'8?H Ww +Siq+=ʐSkI(1X\Bx+w, CSdL6XM낍2%ʨq232ǽf6 XW `)d=F6x%8={8?sdz4.d}ChN(q.!'N}1NK<P4E -P{BCBB+#B}7J=#7<;!T7W= 98I;. m<Z@2Kdg'KϥѷPYž]d!NC)*C+jk=S%Ҵb;UɮP}:j NC|uPP  1/ -SXhFE;Vt^suWC6'J''p˞< A:623ԱV|]%mZdzaiv$ObTx B[^/#daC`ͷo]thgzs 4g ri5zO\'AK(bފpU$|*@71J .OOO;-s}2|1|)<[Msր^頗68*}o6SRx#ٓG6߈H9dХm]׎EjIDFDg2?龜xG/@v$_[\R"+49Y-"vP̉P3EGΐ3=FvzZ&3JmSd@};hF8i3-R=tcN5 "H鈜qّN@BG"}ȕh䚞SFH|ts+r耻#DӢΨ?fE:ڢ ܣѼhqGG|ӌn[dtKt[N ׸V;jU[jtWt{m4z z0z(ZFۣg]ho?:COt8:F'S1Ǎ)wǍY4|wlI Ko[ 02$ߔc|G&y͝4~yR  ǜBރ`,W;[jh{8V[[[MfukT=N眎Xyl.¸*bUؑXVǚb-Ɗo0{Kc'cs[,7v1v)6{v19.7__hoo0 f.<W 2[ 5Ao~Kf擠![c`^wWAW{];=97f|/!?|'!_7gXKQ[~5=;2x.#L+y1p i pqp:#|>ȼ (ⷀh} .Zf@!!Ʀ$p,͆f=M ~(??«`j`,CkL;1*3] 5&.=U45]_\6F܌0e,/~&6BXMF9c~ edހL m†a9?XCv>ȴ3_oEL`^=^lH.c) :c6]b@C-d1bk ~g~1 NVY)FT~a૫7%p[yȋk+h@s8&zDfm e3Jxh00cv sw$ A%z!'C&[6y, c+7]6g E02m5+8I 9·U Fg~`|#]ԝ׫l)de9QjJQ;@/̢ s/#:82c1(c޻­=%^c䄞O?yI6Y2u:''F5.X)"c(KO# ?{ ~ZoRFLB[Q#={9p kMH^6/dBc_cֱ6s%-FւN+Y_A< ~X5$QvBۃma &Uţ^cݙNSQ\c{XбF<1mNTfDdfŨA}pF匱 voXގĒ(C<hC; ӆ7ːxaW؏}XDd6qnդ 0|qXeh>o >vArzdMocOawCc2h{~c⃈5F)@CTgG km_ƙc݄%W1ʸqӠ`w:;np'?6Nh َIοÕTNgxmyQ|v'!."Ifh9G7CRDT< _nuo`ra9M~CsoAe_h~*z #tUuKU }>RRПŠFƼ1ΖRav}>222-bM@~/1n0>`VsQ F]> Twq/ T76 } _&d -#α Jl`+ὍF+n Ǜ8?;ۙwr'b}8@ 9BezLF;hގչ̿et56St9Ʒ!d͸N-N*e߲p2c8qeSi<#0^mb3Me{t<0ޙH8s:BgdŌPͥ7e{૸)ӈiJ#4"PHS44M)""RJ<ȣ(?DDH"yXŴEHS!"ȣH7=7{on I~3s̙3gΟ=w,?2eXdߴ^19A7؏ȿOXD5Lkdqpe;n{o ips19ZS݊K;?>OjLa!JC.FbHTztbMZ|""H!4>3[ gUOUQ5=yz浳z^sUxmo~>+w:[$8X)_E œ+??+q)Ct)1 y.zâԾAmd$=v]({=p[g 3v߾ϮؕvxR*H1qRtdTv9֦,E+:t.wxԻ=ZN39O.K2R!^\'/r!w}xhvW0ɣQ8%(h|Yu'z\?m6X+_ôJm6%jo|\c~ii?ؼLj~;̟<I 04À#TC =VkZai믛k1G+5}Y`7eݕ,W |):Waƴzgq41SV%4al 2Yް9 aC'3t*`l pGx Knd xc$7HHq7"##S:x\2GT&u32$ͺ=zTd,xiLLFiL>lsL6mCkyӁ_a,,MݳmtOүS2r*m3uYEez!6\gJ8mCdcҷn>oqm`z{d'{"~^;{.áyQhVuJs6G,&hv4/ lRFZQY.~dݢ>ђhY~tsɝO9]z~Mk4wK#uN g=}hUtjthΎ$eDs:Z]]|dY~Stktƹ'z z8z,z$gb9hzgwu:ź.zņy^UF7&6>6)V i4'|LҟΧu-l.K--:$͹򴱝ާy[[!uc/6Ƕv$}5%m^5??3_bq#),As9>wY8ύ_KKמ8E )#^A|c| uߏ|GN'ىDDDaGO$1$Q>fyplj7~cksґrϣωsUVڔ?{HGi?\q;'isRʹ5{32~^gMwbFb75<Չz@}bCrt$&c񯏽筍<u"+79yѸח88qMKLis7%di)xNqdEç:DNY]A*gEFe5)=2!k)-khV9$gOxY5{UES} X1DM9:,Ǔ6A+dxL[t7i mmcM~ t/ȯLOĴ~d$drg!؁fm_Us&c]g\Y© V.gZG.9 征\vB无=gՋ:QЦoO`oA#o&qP)( qCv3|po:Ɂr,_d% r2StO2G\DAX#R b3xz7F9"ys9׀=uUcC'Ry41à@/C>S/7s !_c> 8~2^KؑmP}`qE3"_t( ѓZw 1X wD[{MT1 -&#Iu&(E%Ɗ $S)b+bX+F[vS $zR>E^Fht w:Z+\sR[&p;^5\[)%ٮNS9N?g3)MZL|9Ú-OJne*#i{֏љSZU{LwfY5\ggU,'UZ9{}H~laO:۝Hmq֭!9pND Y@^K˚@!ZJap 퐃%;Io*C6>\(# &YùoFFCDg51Pʚulbm L h>M},JcN@tVV)O=%)5E^{h[''gZ FPBu&H v v˹`A(`Vgy@pP[ph VXuJ1vbu,8>8)XfWPhg N Σf]pa_KhϵMswkY!&.|%E Qٛۂ;v$`l;;Inn󼐄v>xxTp`c8hEdP0w6gnc(79 UtW/Áá~4k"P*64,p&4,T`[am &|f"W1Oh .[j` M %Тr(P =gW66v6&s=hv OP3%`p5M'yUVp>Řw;a%RgA 8xWIZI<$3tM+kv祏 lc5iOP|L@DX%܇RЃbD  Qy0i; joMp8 ֺ=vhذ׀ {tթ k\תj p?,]9 "e;YP"Qc=1[Y=$ah̜O9mchw>V ss DF XՐw;a:CZnV=ӽ۫EVu-RWuRZ*_g#tfjFVuf|y x"(q t"tl^7뇠gZap]cUBד쓝#WLF(t{}e>8+@O|W% |{_{Α͵聵w; \ ;06w;ЫUYSWut},c|Rݟ@~w mKORmCסp6 X~Zp.)EO < )%ր1_8v=,Qh{GQhtGNXH~+懮;}B"G7)F;b?'5i\:\>ƕ$m.sG_nѬ 6!>}Ϡ/M~Z4@]2#uOը?)AzC}n:'n|g'9}i6s?vtsJ?޿"cg\,җd+:`yRWõlh{2F-蝷:vSSs]d~>Dp0PEvxN,І/TV4˭ /=2ͷg2K)̏v!FPUkLק4~ghT`AYN0¥GIg{HPE0Uտ5Pl\NF,Zc|]:wէ+`+A.#8Ip&|$aNómoɳ7Z:FXO?\3;fsq7O(|VpĿ~bƜq@CɅ jr&ư:F[{M׉XQ { g^{zc}bEu|\ؠņ]W.VO\*RlGXfJns)G0&E/"blxՋl x Kk8xc]4KVЊh8N?; %;!8$ 8zqPgSH] s&h@@N Ο#Ā5Oq(s1X<8 1m#Q~1R]sA~h " k@Kv6dbKA>zYSG&Z~  s)#W:_םoEN"GB7n  EqHxxcG+g$(zE#w~BC j Vv꫚{ []fyL/lr~+Ǘx/x~W| ܲN +'Der!G(DY%nzlY#бϊu&*7 ʻŲwo}KvKٍMrOld7[1BUd#vGqA{^_wL$z_ |cGXO +?/KQ|C8e=47;L|#ovDΓ"ۙLq3ÙIfS Q9t8g5)IG\+n?~ѭď iB{#B=B\ŲCFA ?'܄cC g oOB |ۇ_Orw&~kIw!/36~gOxd*&)*DQ S+g"wMXWX,m(W|Z&N-[z& yu߅.D0v:=xރCDG1"~H.Al;DG'~:zt?G+IG?6DL&-Z Oː Ȉ1qLȄ$׈ZyC__ wubK~H~HsâL ow卢Vֳ=BP+Eb8}r\"*RTOkZQ)e\.#hB<(Wʕb\%W[kVy-(ub+_/8|Q<,_/|EL__UxLZZLkb)w'.n"ߐo)Mr3ψoDqB)Qh`\%4MoW24~=ħ!,v L#V ^ g2&U$2g7UfPF\9[fYJ 6ܑt!lN3I(Ќ~r!uWFOw$+RQsiR2JI(uwP\~Z_]muO[J `}K{3XRjxu\ٯZ Ҧ*2XR ַ`}K2Xm( #2rf-Ff->odZRnTvo)-Rntƶo)Ōܘ-RK۶،R 2ؗI eLr{Xs1ڏjm B? ,|ІCUQD+tDb9Lj½Q~^8O s.M< 1a}eg2r$#vU]0 *δOԾ)BE0t*tJD(֖j/𷰵-"O{UzzB .LFubGco%vk>2 yCy6_[D-VǞ6h-vmGۯҎv:,=[ӻB;'%LGz>Ug5}^Wuz^ߤo]^~X?٠{ToDFjEFO1d 5ʵF111F1͘i1 %2ce9iwvIyO_+Xc37^26ۨ>;<y|e;_I?eO_}<{A>q8)4̠7;fg3n~Hs9k'fV<9֜`N6Y\s~~qJ_1j&F?#^ŕʸ *>ZHETbŇy ?1M@׀K} ` 5ofX&+%8m(K~6A*47~ۿc|Fٴ`#_"[> KT/Wa_+wJ6J4A&ġk# Gl7@#Z\*OkGb @#.^~xA]H|\6M$`oAi 4Q‰M|qzȌ@AIYj- !Awœ ]HOnCW| tMS|EV@e󁱁 tut%|37S.&8'y-VЕApV'r'd9'bf9]cǙ[nNӍ$ YorJ:jgY0Ty)s\`68 ƹ>L4Z("I#<@N9\#bbN_gqZjj:gYfEzgSof;[e5:l"%ݏPŊ PEݨ(ƨ}(.2Fv7o{q2j/q]Bݸ)bGqwT{'`,R *IA$ڵT;ɻ_$VGuo`0TDHxQ=r 8jwF/I]t#8Rjot"OU CU,Y>RMoV Q.jLUO!% N2^9 {\!՞hڧS&=bK@GX ?rX%j͟A3rH{$ZŰ=n5DIĞY TiSEm!K۬a+ɖ;!>А1he㧩WU_.BŴ`OmWP}xMMɥ눥0lB8T QvB e{ DEMDž3coUڛ֘u#qeƓoт\j`tؠf\@3!:o`9=@Ixry~V:&wצbykXg2+IjgV^zàT~ϋ*҇\w2iz jIoޡL!%Ћ*AnmJ/j]jjޭ逫W'3>Z#嫁sKz9\Vu#QSg4m׍Q>O|_ P|7`*9WEuEXګ^WP{CK֨=bR^Q2 ˻^_ܬ].6ON Wߓڀ]%5^6P4rK1 ~ 8]\Ain;w]u8}.!h5vFoxR{>vBcn4SjPk+u5E7:8N׿[qRW~\[SБG^4?./Kr^g}t۶̓DKIO9YV(5y҅D7%fͅG kW"/ A{Wr;z5n/q;,t_wXc'!%7잿ZUYS;p^t%HNZtKׁx8}DZ_m5}֔.̶FGmTXslڷ mų21뢟 :%-֮{/_%Mݭ_y>{uc_x"LspqJwmJwm3+iܵ|]g!b^ƫ7cx{#"خ!.t[wN({-o~zvի{hhӶcBx=v)bB^1S\Ȏ-p>s9s_iӶڐ{m-!I$/K.*mr+$ $Jkm$E$IB-E뒤%3~ov]}<̜=3<3gf8N3J]R_@(My%JL;+4Z':JSU|v<ǡ{x~s|%w"W~Is-OđTB۝zswD]j%BtvZu.a5wLp˦ZtD7಍{ACO\zby`eY gUXMV%f5k:/'_ z KfX* |< /b81O6MdS eBe=lKH^ .$1Ue:]d:NS/'@eYS,SxyVu6Ӛݎ_ьgmdxrF3U hVg:PӷR3 ./WuOB;uX3$:+Q'eYm<f<ө(s#.WuOdrue΂F N>Fw3^x؀:f΄{Mcϰy/ٮvROyVYr<]BF#Di@ yxZQz6H]d"{DO˃f|U_<&s5^b3g^xmߥlA?.%u\ #O *فvZk>>?ݑ'S0,:GhPRU;r|8G`Vl/ %-O—7OXDd4Ț4CR=_YpK<1.`\vt[h~r\6<#v0/o.N%uHأ\JHkPΌ"IB,>,hŒ7Ԧ—`Ot|k*oG^t- xB@M).͋GA5ޙ7ěe$Ms;Z(pTAz; VOpt %exz =O~O~ġv iOĜKAw сpDKJ*e.C dQ)”̟y=+yR6s46χw+=T*LWJ왦3TV5hB7uJRhzư (=2yCF5 Ɨȸ l߳ͭ=p5/MGI>oWe?41Z+Ғd+ CD9kRlKvHcCҧuIic+h-XO0qp,->E:03J ;m_sG ٹ s^:M-,iWaKZhJgfꅹ/+B˯ߔ , +)~djtldFM3/ Wi4D=3ʰr,UbYXS֊cY֝b 06f fsul1LVl̶]l;r s=\, D DޚxWރd>4 u tj?bX<|,ȧ>OѨ\ QQLW0EҢMԡ%)*}Z7{䔖RԯƠJml!܊ )M1Z Bz- @0I/"n5dtuCƐ: B-Xu)ZSZ U7uCW@BuMn ]9J WԪ Z`Kz݃v Cy-mH8C5Ҟ#$p=ۂhs@%jѤ14^jOMt'Hf= kcd=f5mO;AJ]i'8XR;OetuO奸\jEw;mȋE[VaT ^=fQ˦Oշ Wte:BgJQrj> u:UsP#R}R5WscZtWYMfЌ58(rg/,nE~g2?ьᯣ ʕ\29ԜG!5)uk%5͟ ĕzq݀jk S-8Is-c9?jڛ\0+pc hnye_c㯳z$6,t%\ZCxz@JXcXIb=ΐ5]֫lmP iA)-Tr=9WsʆZ9 u~~C=뚫 +EU.]mʑnG@f\7u9dVa-@θ–8@f ]?B)>ROֱZjO4t:NS G%v{\9]R2 Jj740OI%29WtԺ)UKVꟈQ?WF8 x%LsA&[8| ׷ <8Sޮ+!7(u`6; 0iА>"LA8G ~@cN]s6¹ \0a6U"܀p3z6Axa Kf=i@[ F #Rq7Ba+'}MMR&J)1/)hB?VȆЛ4~Cz[-$da&=nt \0Xh91R(Eèblb/F B\$j/Ҕ+|+"yJ%T.ǓxRA⊁Fjz)LZ]乩`b  J pqiOV &g@B<$t#E3ʱ,cIl';#y ;O| ×U|sYW+UݕJwMq4'Lbzxd2c|3˽Ƚ½3˳ГQ5"1]DgFFLx!bqʈ"GD.2)rqSůȡ+5J;H-BΜ ;U; |%=޲+A*2:2u47*|ӸYPܐUiw}$et 4^pїM l0{P5B ǶCy -o ~0{\n]OokGzDg WѸ'>+jNPrcaTyF(T Ka7ٿP{aájcP{P{͸00P%̾. )Pʵw+|cƺnLEA2h$ HL" d>g[ }VAvz8}:t(\Ws5>pYUn`j\[y*ܰS4^p$*|S#34%j)|sSw(xM4w7 BKi0{0{Z}^o1{aP]Cw+w+E{Bz0_Ffyd$+l!;#9r{z;i-4֥YbTw)|#=K 5tyO{uuHu|]5#I wm CK=ZJI h/[hO[XX,j|P4uw<]SuY5U.T< Lxm U)^avշzy0]~~C 7wh`Pa2@g00:̞fofO SCKY~ eehȞf K/] KSauAm0N1)J@~LQ]3 t&.O'\I"ў1qZ'HIdR33{~$E uD! F% G1I}v4.gxG42y΂|Z֣i+ڞvi2MCH:NqUyͤ+~Kң\ 2V \L&X4cUXm<#њu`]X֗a,gS z~,=F㮸Yl.[2T:mcNxzx^ׁ繋[,@Jrz+;$ދCH<0"{|=LbA_rr|M~뀦{MAM5]Ú4]9#cHqMϚ_4]'5]"]4]wVSyNSy^SwASWtyC]pIǥ.]!D*|wLm=QmiCmv\fZ=O?=O?ݟٟ =Yz8bKi--yWE"itH[ܺԔM`l4cP{roM%ߙƻ Yt u$|96fۢ~i{loG$0_n{$G~˯2~\UN(Uy -iN4$mYxB= l CNuʛA!} KS#ꕨQ .7 ƨ$.*ji;C]b,L*D/{B?({e^{qٵ+2e*QYQORu=!o/:%oRﯨ?lܬ`ƛ ^+Xɰ'I| ȃY9"H @.|Ηe &ww|?:ʏ|xҨ͍ƭFkqht6ݍFxb 713Fcc1ɘbL5Ӎ,c1ǘk3 FedowO6ck|o6'S㜑ormF321c8E`V2UfMYǬo64&fsye>hZbiEZ*cE[1VzUժnմZ V 6vNJzX OQq\D8+8p8NUSi$:M:;˜7wOϜϽޡ4Howw/ŗKҽ W7@ uyC>?5$̟525GUFSh5.)F1xH/e ύ/WG_Ӆf"jjlakz#ͨj0J`5jgu{qH/W]\pq;΍N}&Yd:˝*glr6;[Cýx>}ooG|@+L$/_SY<owXWa`,{~QըfONF#a2AP#i2%FXgl06[;w~#8n4rFLӌ4m~`^Af# zfcJey,ZerVoUj[&VsVuujuzZV?+U?qBX)s;zN#yYv>p>r>>};;777/7'o0y^qdwq<}y8p,KƉ4$bn/>+ලmGmKm+j#3ך~2Ljf*=Vpۅr[=jfXaܶ_ ~?wǹʹƩr: [Nd;+zg7O3ޙ|C|#|?n4n#1$9/'9mV9\ՎrŠ@"?ۤR`N0 d4&)0 GQ "Hj 0OL!CfA8΅9?*uR%L{@ \ݕ+ˉs+odt;Ii$;bLVZIfŰg0Y {Nưb06ʰh9XG %G%^(L yNlV(̯ ѯ⽬ܷr\oZA.J.I\ިO*4q_t%-myJ ț˟KNg`|).HQS))sp!o%k\wр#f^6RhC3HE>~r}eJ9v796p*iNZ:[/I+['.1}77aU!^0O{(̟{ Z<^ jfWi;{LL:RuFPύHSM:%Ím= l[ki;NٶfUE} ("GN~WGi7jr~W4:O`D.OC?c9fMk (K&6q@jiNޟO,Dj@û̹0N5d6W߮AR@' F+GxF֤6Ǖ=U )ˑ7]P'sz^-ȿzcKJbnٗKC!T:%A'`Jz겿+i+ A;Q"¡WISфv7@Z [S#JxeѾ)O:3Ys"4ink }",XXӓ+J4ce]x.HΓG~Eb@<mC0R6*kOOi1E$ϋ1M<#L1C %ԄZ83'g^Zf,h>.GZ_v=~mbxM,KĻe1O[KEX.obxE,bX&+*RD-r-PǥЫv@࿇ @~95ti}^- HwЃH###RT!7Z6Q~ n?.pxB @A/ ib%'/O2x1N<r߳?,# T!?9D~"G#G3D xtNmP X1^C(gDo1X /9axgIЅt]L@dbdCټ#ƈ1t5}~@?яxDx& ] C.~G{W >ȷ!mI;r;wXkuu&@ =x77~Cqt@H^0+NF@Ic?s1d)g q}d#mdsQr3SpI*Z^Mi9CcirLЪ:}.zDҗ`os#1}>'\°۟؛-vK{emﶿ{!}εOgA[xDg "}Җw,' oiE±'cK"ZVoqeZ[%KSehcE ݮZ=Izqgہ>Ilz;R{#e "sFkZЀ;sd;2ys9¸2mI:uCs|QokR릨P,Яx_Z.@]20Wr}O%['j;]|]@v^2*wo0"F{Z#+8C;I uAfJ L% Si_j˙OM{ɨkr糠*(r؊RpT/z/Rqw&p5m:(vC"2eNJRi5$.nLI:T9%HHʬL"k='u^ݯ^g^k=kZ {*E(m0׷. 6AlJ6}39U,fVx&/;J?ehpz퇭oHo߻1s+憾9Bn2pJSwJ{*-QQhQO0:Eߚ{wz5֪})qpmBɢ/b_}NW$xo9?qmϠ6,Έ2hId 9Q>YZ V[(-CB߷d8R fa"(&J 2qK<"M;!H9RH]9JH ҆t ݠ_(9$1dvb6d%yF1eFY[3j IeQ{<UJURשc%2"ݑJ}i#ژ6iڃCy-zff{<]JWavetc̘1֌3<&a&b2y d3wKceXE#ەeF1kZφ(6M`kyWȀ_a1a11ć%ć`!!7s nBCq d0CcdG2csd+YtfnȺ0^?LZuL0ȆFv)$ ϬaRMa62[݌ndw1)+$P!;F`.FJ`+pBA&_l L09Hbdт8dc Ȯ 2(*F6K[p<*abA)gjd+WP!‘1BfB+TBTJ0/?.gPe."1@b @bY d%@ * d5@VI$H"D @@@@$I $H2T @RI$H:t lF l$HL @2l & l [lV [l 6 ہl ;$ H@v $H6l 9@rd]@rn  {> ~ r r! ra r @)RH!B @)r 'rI @9S@J)rY g)R s@)R y 灜RH9 @.H \rH%J @TR H5K@.2@. +@ *k@:@@n & 5@jR [@n 6@@ {@1u"JCDLfZh}:DcV"@lb={ SL2 @8q g @q+W n@܀q @@| ? ~@$H@ @L2t A@  $H !@ !V$"@B@Bv:xZxZ:xZxZ:xZxZ:xZxZ:xZxZ:Q< y@9 (c@9H#F /H& XpYZgB1@y  @<S π< s ρ`ţgY}10&faM AHN$ B:|uxd3<"~ӇGXã|HO& ' Y@{'!}QKbb- ]0EP6t7۳i*P '~HO0w6#>eIh ?EkR7ڧi4ܛBɃR q2bd( P!C'RN %J31`bPvC%rI e1d(yPڈC"F&w)~"$yf#,<¦OtE x.D[nE*7okǛFhȡu{P 疭}LeȿKggޜ mqz->%VٿUa*Gh>_\ɖWfߗ7ަ Y4?IgPQ?bêm9>·G6n~:gG*{~=m1oxrf4mTcKjXg-kV[%Ͼ.r3 o$\4W'@aB)|Kj~?˖ҩ sQsTY<7PRrV]3k<>ډjTU궒l>OV8Ͽ:Csi|&<[9>]s[9>/ V>?yf~ +@ϸn5ogɠ-qtɈG6I0jT+j{e ,3Fbb,b/+o7CŮ$nwR(f%zY/b4cL{gW !\8.?|%װBE^Ijh7C aؿB "Y_r6΄L)2gdʔʜ)9/S.sABL%g#r-06k#Vɨ2dAO=zhyr A+I 4?Bȅ~Bl 6E"MĦ((/< r@+ hSgϑ:%6,@x2^7,O ?sl,n>ÂuF Q69گיI~AH%%Q]G0r&S]E L~kCHHQ$'< M)̓#2E2DNQIdQfB0I Od'ϵ y^!zr |y_^GN)]$zljqG*&wsC^zK5ޗg oOEҫ#J ._Omgtƅ*]^2q[Zih~.nrR~FTp<9-X%M#'V򪉐*B*ZwsWG{nLM_֏3/ȅJ/;W MW7Au^5nH\`oi%2՜-"=O+K%Q}P꽆3Eݔhuzs}t`z5 >1Jș[%I=[jř?)XVq7CK˯|XnN9)%hтجʝ=.X6|vzݎM9 4DDɸ |;Sڼ/*vɼʒɷ&z'7wN'vYn?GQ8"s$ v7qcN[ӕ. 93߾ж}bn _q47J ', z}8}qz=\ >.=wӳ~oÞtCA\sBi\2Z.* 0 J.(T0NXzrzr[Ip7I˓{/3Iƾb+͋5'O oz{cOٺ޲{4{7IvjcG\3kamW=&i6/)aTpuܖ œG۽g6 TvjȝbАQsfIJTn{.1}?~ݹ̭rG U9v¨M&\.G;zybYp,bq1n'u*W"yZ*Z_;mU~j^|_?`b-Ǣ<d eyl^\|%E\X}:`t1ٜߣi'"+o*/Y,|9a4 Qg^W,PȕWJF=)P1&?FQ!GI! |ʗXGpR¸KV=q#RQj~L(ΟE@r(z{x: 2 ;wׇ뭧oЛ돜,W}}o΍+&qs|t9R{(ikJfet~܎NCEM%^&|~9h _7FܰLӽ;/ZSE/>g!eW veg]Yu2;쎖nQ&YHߦu^O=­{521N=q^Ss>K?ݣbכcF{cs 1/v0rIa5悅g\ﺦžVwv 7LW9S{T-yY1lA߆&Na9KUe(N'l.ړ\X#b 2#ZwKEv)7ntn)7kbژԌmP0P9:"uXԐ_/:r(Z&17E`ԉyoևѵK\Z`O{3Κ8 n'-4u+ڥGL6S7O6{hC;m֨ԨQ=[Vh 6o[ܤ n[>bxWjw|$6k+ Z?ZϞEeQ/SRWޘP=D_(%#_9jf~-2sE R̕ s#;H)Ȕ_Vt&g{/:3Ѻn]`*^:UiK'f*ѯSdΡs#rh[77+ٮkhEt[ ss{>|zxJ{Σnx; {?hrFZ?|\WmΎd^OZW2 HD^ǡG#wڛ3mPiGnhvw7&Gk8NuQ;7jpϝSV쿭~gOv0+b쌰m 3/-K?.' J+vpjcӛKDs?ؔXL}Ӫ_J;I\$6ɺ|( dbˡ(lD,nWq dO-=Tls%F_XIpAm TtwTo೽6s|~2czhW-j0OeH* ,E:L1]{ˡF.)Ț-Y0IZoѵ]{rGZ]Kiomw3Luya誦[m.0~M^̼O^a+iV젛3ur_v%uK&,P~k؁=z3z!kgu:/̬Wt);~\p 7dž2S⨤L7-.ci#NjL9.2X#=t϶uQVTى3s۩H+b{dkV?rΨ f Q㤢'*_h)i[̍GvwQ{<1Lo43R0]TM^ktz:+pf%qE#zͿ)LFG~5Fz/ƄƩ򛕋?SvO7PR%1p!F>/WP(l@Ŏ8p7P'OeAZY?6JގP9(,8sάE17s^H"⹈/.E|8E*f[k0:3o?Y^!~Џ;>Tq;I8# WbZO8e?骩~!,*C|jOdQB׸ sgIww1j*:7]ސ:GGoQ ĩ b.36T-7\yA×Yee|w{TgvjٚfƆ_x+eT-tr+/թC}lL]; m 7[ܸ7ˎY#-'är|fi'O63ulP;p?7E|g"l.N$]p}vG#4'b!' ŧ% rm{NӆrmKvYq[XӻY :w8HYsVZxXA(G7(;ᾂ y"yҺwӜm5+039ke3I.ko>g[NZ ݉e ,!Cw5s6~O*k9i 7}5Nk3cݣ|~VI^ffí"n0̪r5t.`3]0o= Ŗo9V^Zq_ fm[Ĥl ͰI($N}>φ&c $$7bh9\ՐYv=3>*w]nZx˾oOKê\_x}å͹-4,[,nuў{óԹlf(kn{gzVX)g-}YtO޼,i.;d6mk [Nwks/oG\DvM:^S}ᶃͺ>ȳ5^hp endstream endobj 75 0 obj <>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 76 0 obj <>stream JFIF7Adobed     $''''$25552;;;;;;;;;;  ####''',,,7"B   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw;!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$.ֺOEW*VvNIyW=nkO_h矘 {~a#`)9kDCw_c+o?~_߬yho!-YkK'IOҗhW ;;"ʣoOk$mQ=Qw*.ɳ$l_V.sPY?W`8 \ed s 'W_}s. 89%?E$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I汥!hNy/c^f٦}: RSg>ΛWkk74]זfuefMVZ@HL IIJIuW}immTޟER.v7J,p39mqKI)$ԯp=Cx7#TƳGF_Ѱrnt-*?R~_:F`ߩ _H$]=-T_U־뜽$}os{R}`]kdbdWs[sXHS{/B_ZzVͮĊg}[%߂ắau} r?n'OIx>oO}8m?EM?Y7}yy|?agFԔ\><r1Y,xk-qIO/㫯PCz&>c%yEv]m}Uꅵe6isk$ )RCrjm6ڞ%VC$"$$I)I$JRI$I$$I)I$JRI$I$$]:_zWSGvgC_Y:]#=u`gKmqx$I$RI$Xu^nκJ6c.zE6:cYU2ǂC ;v))Iqoi2:N^>[pkS+,$;BZ;%=K|=KWmUWs-5ֱ{CIJI%Lgu*eINK1'֎/ndOѵ翂RIpsnӬ9Vb:lmkH%=K?ůֿ}W]]G]CήKIk RI$I%)$IJI$RI$I%)$INW֎߫7Egc͖e_e/{ݩsd^;3]OBi䗻͵4Ue6_e cZ$/q.p_Qꕷ#Kǟͯ}| _ZۓswWӪv@=In^꒔I$$I)I$o^>z@ kf`t%;=og7d6cy{RW}h}gt@zn!9oC:C_:q:57E%2-{y9ĒIIQI$I%)$IJI$Sϫz')euOn+~~֋0oNt5''|I%?U$G/.u;'X}P?On qq1űSsC뱆Z))*I$I$$I)I$JRI$I$$I)z/+u/*?oKQo/^!"k/X$Z5]>}S {T [ 04.rJz%ŷUg{zվUKSz.lWgeuΧU 9Z7@IIO_J?:_V\ꬴsnsXë^!u_UƟ^Sh ז/z7% Բ:?nťV l^WfFш^kX[ӹĔX+w{GN펮-isa:7u}mGm?Jי;[R2ޣp:ܬZo4CwXƽ5J'tZSR&x?Ů7M{JRJ/{+c`.s`5$/W4ɰ#Z!J}!%5P?rXGw_*ίo椧\_=een4eMx4s|DI$$I)I$JRI$(N;3;FI *Id'§)/ƛ͇5^Hd^:ێc-jI%)$NԱ:?O;e/yc2t )LG6?-x^Բεd^,w$o^ծ깧a>ԔI%)$IJI$RI$. $]]վDAk?Kha?)^~^:f#hr,>J|Y/gOJͱPGdai˦,֖8|_R:_,uJ[k[V%?3.]}}[zoQyJvy~ү}[+kf-niRIO {,clxkdu%뉾_6TX5u?SA%)$IJI$RI$I%)$IJI$S_W_T 秮yu[RI$I$v/]_>_\[?n^(O}I)Wgm 4\j2 ~^ Ϧa3|wcˤW nZJzg#N~wWu׳-ͱ].9y]NTVu=G vn8y9,+\?gz]Jku ^wNi~>C v4Z|xW]ѩu'% wXVߦ{ZFO%<]71ӺfB6aݱH=שO#o^y'`?i)-8ac Vji$+u/8wKW;[RԔ7 /-qn+S_w埪QHsOyWZ ?>}E_[spnpy[tTQyyvM\O]WOS.mꫛjqגR?G7-~&uݯh%;}o>2Jwgk%.IOSvF"ڜ\;90b`lx,kø+>u>~uN\qv;ü1~ĉ^$o{GQ'^K,hJ}%$IJI$RI$I%<'9?TےѮMvׇT O}7վӚ7>wc}i)Vxn[,qwMͳ^WŹ7̱/*i;k~⒒$I)Kȿ/cvU?V1_:"cV1Wfpr:Aj}qnTG(͹V:\fIMdI%)$IJI$RI.t )z}mU4!kDNB>V۲>G{O_i/鯯uZR %)F+1sw$ZO\/+%F;5'u[=ueTOU@< IOu .kr(.sk$Ŧp=Ɗ7Oħ 1+ֈ]_b^3q/w#ySRڭGwp˓V:}Sdu6Z/;y]%&ٔ<~;en!}'{b|}7=g2?)~o띡kGIS$ӺF9y5?>h I/8&F7N}؆ַ#.dVL9s^5%.I$$I)I$JRI$+Gr]r_Կ==u_W'ZuCs\W;S?'{g\dzJ{T5#撟ⷬܽwQ2ꗑ}soX÷չze?$_<[u_?ƶ\x!ψI%=ĮO=cyf>OBww1k>Bͮ6g6:꒞yog['PB+]S뱡sL ?ۺ>P`%# )?,| [͍3$c8:x%{[>шs꘾nmq>A%BJu;[R]Ӿ]55x?KW}'z>YmtUԫR}>bI$#ouCM،0s(ӝ_Pxb]Һ5=))I$JRI$I$/GRQYzsĭK-o6U?>k]6۫ypn8lю]l ):M9ynM\p`5Wt{Qַ@?//ۑR{5ܣҺ,l^W^Ν7}>^3v\ɍ\G] JR_ѽg3MvmOY~K_LϫmnܫciyIJI$RԞz?֮;X/mV-+ KH HD 5uo9}k"ܻ谵wV}չ H0+/3;Ut}]qDceG8O?"_S],< )uώ]3\$I%)$IJI$RI$[7û39 i^m2>g_H$W_̯Ol $)?r6ELB%4S[>}g2q^]ۗs뱕8s>Uhu5]ĒR7f/ڋkȐ'?.IOWO֞s׹kw}`T+O֞kj׵m5V< r9$}T}ܟێ=@ L6u! WzMz,,؃VIOeX&C݃C]7uxYSe?տ9Vqf[L@|IlI)Ňηa]VPkGZC 7A"StKU9;W_VtϭeCjmh% H^̒I)^Yu*~=~A⇭t_A?qfEdAܽ$w]7.΢}Vp~}j/ YFxu}RIORZeafz?wFezkZZ@@NJRI$I$$I)I$JR?ռޚ7:SկϼS:F̿QcXk>at+Ӑ+nlN?(\J~J1z1UMpէ K`~^~19y??^mhߗ߭q:?εp)I$JRI$JBVαiZG淗-ֿձӺ;Cc#Tt=!z6=8b2h5kGeh-T_C?Sݻ$ xswf |gw?S8><]hi"hVռGQ }L5?Z)K [[pcߜ3 bz!_>g܋_}u9RI))k,m/qu$I)I$JRI$m{bVzM7'e *T-G0u 3+ SCO|V;w[)wt6݋cxak@8 IM.j+/2}S|͕vM muV4s kſճ:;cmo`>I$R܋YE uCX8cg[i:v;mVja':{G=bڇڳ!v"y]IO1T׉o mL97vsz`$+&,kr*,5I^'ee}b/ ?F̏3?iMm ^ǀAB P_{.wK:`I?d~I)OU}A>`u.PZJRI$I$$I)KҿįD7k}=$WVzYE-/1Թ0ϫ]6?:~\ I%)y7A]ii+r\3-K^K?^$tnU4͇^n/yp>f}?$脒I%)$IJI$RS8-aiڛToK7Yǻ\=}\*%c~4y{G!O/'S$1;6ܬXfˬqs+W}Yh)ƊD{>VzC:X|\OЮK9cFӏ)sCr G.FL}<z՗K3@׏VUUObWsWetN4qa(A;q}(s XxB2~tܚs[ 8~E,c1e!.(r'g8HW:N2)̮45ժsk?*]şER-phq {tyn\Nd#r|È0PunVK?OϕOUR*̆X>%G1(PGNT'tK'7TҬ.Tw. U|Xqdj,!9ﭝGt܃V='CNߤAWYY)1Ů ]N>Kڄ@(ē]Ni(C\1PG>fdjr6<!k/_?׳@1%@h# @zzx#`p Iuh{Gs.}-NiȤd˃`@1%ryg8H8GYVXy,By}[3%I\<wR/}>#j1,]S~s{Pd?vRh~+G=dD2+h7e:E *ձq~Kmi6\Աn FN|&=o>Χ@{ c{5~uΝi阓 e-#).k}WY԰]̆bRY.k;Pe6{t5uvunsݙcy.Z#֞c_-rn &>P'ZEg4X-wnwO-wNuCh%Lot8R>ouEPĉ=Jvܺ?վwB]RVNi+鄔I%)$IJI$RI$I%)faxXFGIѷǍX+I$zfgFzw㼱s|*?fgTi8d/ )ZǰZFRS:~[[]WgݗʫY:F?H ]Ts7H%>d3GK;\;$k]{״=Z> $L%}.`_f mɬwmcIORF5.Cm<nq*֧V~ àdS>3w^9}^ɰ?c?I$I%)$IJI%G}LJ6)߇))eeΌ~5ì3^V%b(h۠k[)I$JRɌ3>ud$dI%)$IJI$S}c9]Rϲ4|>g3)7 c>啒^ysO̕T`oK.Hܘ40=NV# NvRI%3״9ANJ[tIOk; YTVJFl߉{~~K+Yb_-a,6o?\!sZAt>ޭ)޼7Jl)mwG7U.{u+,QyHǩ#Y|1#gݏ~G^s˪ꆊӉ5ߧvXz=.ܖӤ-+I.2u%V'-r1!!Gѩ9>)O>~g?AԻT:W.,F,ZE;#5Ez?՞'W[_on*'}7C+?R9ϾsщxCY_?׳7sK|Az S{?X\qyy^-,qk#-e Ľ·0vgn+n.g,R Ik+dʛ}Of"Ax!:Ƞ69@:]d mo?x奇'C,%k52|7$uJQ0V<oPϵ=݇'_?uߕMXtK1(?˝wSnveT"T; }F</$Sl!Z6T8}7[oq%)$IJI$RI$I%)$IJI$R 0?Ž?XH 4KYgx?IOYX89bfT/l#%_֟]e_eo}gX>W.\?>zyVzwR9M鷿qef xUdSf_}BS"赔j1ߊ$ԞJI$$I)I$JRHXK!Y{u4RK387H߽%<Կ]Kn@ct:-#G,~ ݺOItޛP{ǻrQE8ԳU`5p)I$JRI$Y> qjii'f-3/xOgՌ_M'v:^6rxsk/׭opkZ Y3 )dI%)$IJI$SBFvEGM8/-v-ؤ~?*Z{oP`Zlp}dtzvS2iԷG7y nQ(8O4z8Qy= %$licy4YDF໑RI,:i]#s~';9 "dJܙa4AFp"@l=wZ}BlqwZ}Blo|O=O?V?[W.kl߉69-Wc鱶K^5ÐAW/0ҿd[*`-->]:( ؗ->(y~k]8>Nf?I4M`WyK6щx.=+OKߛ!{X&w}u]_͏ᜏgxg/.,+WgNQU>iş?9>+@^Vw;_g3o~̍~U?ۘ(+ {Oy #PU(e F2A(ﷁ(eA"P$X;9w}_~՟?rl1ec. ,6 tB' bGAS6{4$mgkdkF=w7<uǮ:u 8$ܸa ~8!?On3[F= e ggbtKsm7}?z/ҧu2~ˏr/ngV:e?gǷ/?YԺ]_J9C^!/_ gUҩw:lbQ^.-m]lִh )zE mu1ִ@M$RI$I%)$IJI$RI$I%)$IJL@"I%<^Uug89݉ >%1sNM9k>㹟3~l䌞VkΫxY6PvM!}JRSc >A\k4|ԴZ8|zw' b0~S+SzkHю=6| .#_[.5c7(x,X΍w.];s RS+tGٺN-x=Ώy;U.,Ozgf=դKƏ׋tx2GJw׿>'罩)5U3Nn]p_5u#/?*չqT$Ԥ,3܇k6~+㵰O3D֫'yJI)Yz;_)2l VbKԞMx˴?|Js:?HFӫ6_qq}o[tMEBl c{ ?+! z6<{#I$$I)I$JGEYTۺp+#X]r}N+L-p:rc'Z'j:f>Yomuoi1nh0rt̒]Xv;34;if^uk@pP/s%$b$JirX4+T-xc{`$ԃ7 Irx=<~PkWB\-$`? s·~_WM:YtP>ǏI,efrN,QO]şEv_P[?+Qv[iXZaktN_Dv%V: 2CDiU3rq 1^?幎B1̜ 5Ԋt'ΎӦ; m%,dX|6?-6?<ϪWwRuTQO|{>~W|J^oLN` v =2dpdž1{y뫕-Yq˰^FѦ*¹<1 7> `䥘瑈-wWO+_221MOH,ưp3]Tc.b,$_4ye͌eS# bߊNDZ,|ܬ_,-쪻YkC{8JλbXf:=\o>>S%ׂcx!$xsƻhAmg̃U^`k?W:ddWf]gGL)lewklgq(;D,;snV4vh]euS54 MWK;EǑŒ4ix4h2*~]B:#-Ʈ[St{ė?Ďϗi8_Z:c=61?gWZ3~c׉U4Rf=!hѢثIwlgIO׏b&{7UUpzQx&aᡠk@4.Gwl}\}]]{1wjSI$$I)I$JRI$I$$I)I$JRI$I$$I)I$Jx?^UeNkW[] }u[ԍ~~UW#ZV"K+];mZLSgӷ6ZSKRS)/xRJo9?MCTV$:tVxkqK՜X4t6ÅҪhnkmm$<[zfY0xuZn~%dF -l`7k/hI%>/MediaBox[0 0 595.32 841.92]/Parent 66 0 R/Resources<>/ProcSet[/PDF/Text]>>/Rotate 0/Tabs/S/Type/Page>> endobj 2 0 obj <>stream H̗_o0Iߎ&1BQE(i#4cm-/ RraHqIZ>+RL %ADp-f743b% W$TYTM 8%P 7"/P v̴s@2D3Ug{(UWJZd#7Z\t2vg11v ekh2MSi;Y/ٷfw+U৯wPbv.MʝxX2=& ^; g3PLZ3za>BR +rRLXi`H uQwՓlC.Piձ -7& eUkf~T5pX- s yx#q$?Y˟'(ol$qQ>αj AN{ g91T"K lm @{Lsiԁ-8L7,ѴHktc"˫)[tY(Q̎I + ʭ9727G\JiuSњq~H*& eܚ!~3 LK_ۏe|K.PX>mC&>Z[1#1bbL D\a]}{ Q*=mg΢Y?\ԩBDou#":JlD6¼v94UXTZ;b*\sZ? 쐓!>stream hޔJ@_e^g@ŠUK/j m]E@ v2Ò2"yЖ_c"Xm@#8ҠxE *Кa@apv&#B^41츓OWS9#y<aXE-x T>^(N`Ԁ+*l(?kMWM 6Q&q [Κ95'Q ptMl0+m[&6k?|Nm$x$gO ޢ.kZ%%g˲Z,Ko=ja: IϢ5Pd1{ɤU¸FDyx}_/V%}n卖T?p yzh<U۴\+ 0. endstream endobj 4 0 obj <>/MediaBox[0 0 595.32 841.92]/Parent 66 0 R/Resources<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Tabs/S/Type/Page>> endobj 5 0 obj <>stream HWr<%),*CbaJ$,ɖ R>}&AOO_N\~7cqZ5RucՇuй:b-ʢZ},~ZMmsbS8E4.Z[Bڻb^! ǫbE|.\rULBqHd3?(զmHJQ-FEVSw$|;;9;Z7?jaݡj}0尭LyU\%:tYRk1`} %-%_7Z. :ɒ%KoLki=w):-<]ƌW+>-T+xRmfXv߯=,na1J߁HϪ\Wʔ9RMATJ=FD rԮ,@gUh[@Mݨ*mShP]vh \T$;؃IBXOߡ68{\Q q:ZA; ̑|DHvPnp$wֱ xC0j}ձ#{JA u\2RKNBeþɚ7PQ?~;UkTL&<}L!Ah?b)J4OkpbAbOAO\C&vW/F>PRܞ!OwX?!z<1/SZܹ]G,@4NeM}wVϠPȆ8Z}T,l[`T3vfVo愝9=O0kk zK_.Ws?FkX*Rd[/{MN-7=iqxhGTp[Q0,F!Tu?_o,Bh@(Y+-}+AB@ցtERAynsIpzXBL]/Aunh"6^톪tǍ5`m;iij(G14x5'9,2F%e0wӠ4,ܩ@S'KcYT3'S jiBu#fHQ1L<8+&ɘѼaMf]zʉ{&'搘MI  [踇%K,״'5` nL~uɪ7^.C!vtuH20`RǞ5n":N{-Ƥ.5ҤmgY jr$oRu΄ZuIIiȽό-R&;;)OUOrOؖjglf4$(iif50{p}#"A¤Y Tg%maՑ8Mj`VГ5S&[ M}d.ٷ}H%0̩#_/#}y`4/ }:70]mW8*]]4Ly:g7ۇ/e#lyq|eעtu#zrږ[@}!0J4/[N.mٗ}ڊQr:mFv\xY W5 /6=*75CDe( LSy |pg2n|0&K / P:{ck 2[÷]zlޗ}:h$FJ$!bq¾i-xö{ 1mxqWA%>lDCz}/ oķȻ]>p7TxW+Ed>Nyk'm o٬|X=p8Aj[*f:|G0[SFŗp9=8|ohq}D3fœ-ZŅ=:+ !Mݨpv@&ZW`qC뺎M U Cmm[ۣEPylĔCG&+˿]1E>&!84w(*&ZFvK"M`=rs1*r"3¼7Uy\f0&)_8/J=BgxC̊^\;莺QH\Ƞ"!UylS;\دCI/j'Zȝ̎W k8'j~S~B{ُG7l+c11{&:{kպ؁fwzθtI^aj ӠKO@zO&uG[h&8󇘎b35Zc(+EVqX(^LX =VS"NF\9MA8ؤ;v_ZPS~Bʙߙ#P< {+׿Tk .Ȃ endstream endobj 6 0 obj <>stream x\ \T?a :,( %0(03lQI_Vji5h&ʴ6J-Sxs }}|w9{@ Aܢ :i|hRqYrp):4(9tǏ Ҏ3r'4 Z9ᮄNl{֙o]\JsU #N!a~sbpVbJp:p7@ UW.0< Sc#,?2ܷaފZ낰75&Ӈg~uku ̜ʏPkV? Pu@S5>^⸚M(_5o7gl{d4y PI;Lo;="Guƈb(I3fY}p8k$ɞ9ÁcyT ӑAއ- RPH7J0i[tRʯ'=##]5)KzJ%oA#~'C 5Ƀ!7J;InYj⟂2 ^ug[?p?rD'RuGrgo 09!*A Έ."v+";p=< }W HA$^!01BxB!Q1 !Q j7HBb 1q/H@L$$HFLfxR 1R M< 鐎P0@`8#fB #a$bd?u0 qF Z'" ِ8 @s!1"q3'D|G'C#)0q*Li q:O z(A,RR3a=,0F#~s t:oʑփ*cJJBj#"E<`b Bx ̈f 97A=b=C X`El q4!6? ůa!Ûf[V[6``1bhFl%WRX #.+`%JX%~ nG8Ոk` ZCVV9w]H݈w#~"3" 7&Mp)܇#lFz3lAz lE ">!xaxc㈏6m <cO"$<4m&~mq'B >nxY؃a/^o<<<>x؏p"KpP!C2" !5x 7M70ax -xm8"0<" {>.|G> A7#cD<1c)|_ ~@|×H _!~逯'oO1÷w=p4A~߄33?1~A/p,߀spҿw "%DN'tADDq?쬔ӠՓOnI2bi-tpuQZtpW$? u8[R&*w5?OrAL A:{:xy8kOrkX$oWAvg;I45}PU_7\ b^a U[+ wp|}Cj~>`/A7U}rͫ|:8_!U}r)R8HI?۳O*w02@ @ܮ }JꝮ! b-l-bg:`~1UL!*_J77a  |}9҈j*_?{H\\C \;H'1p?Ps)?7wW1n)v߿ O 2p[WYUb_H2p=EJ2p?qrTQqoQ?['7l~?se7H 2Di^r ߮hg5w% h?3g&8Sf( sqxѣ9"sxMrRbB|\lLtTd:G]Ds2b ۹lY%SѶh0:k3EJyʃv69ƕђ%>iɢejgb)z|G؈Ei3K2m{+ijRt=i&2rz%aMU6ގʰA6jVqCLۈ}}siQ`I_y.ykBzuu5I/oFȽ MP* Bnho>dF8t`(86/>/Cm_.ۉgVCl_<6<>].2mJY[\-^\NDZD^ D\&,-G{90r6=QĺKNNEmeVme\`=E%'KmKɮڅ4 xn_o[T.mݎUVO[mȵiչB[~lun,+.i[5fu{ŭ3ܪB)cvGG,Xψkiqq-q-@[F3 ZҦ1sĹ( +2b32֠I<\soZMahu:2,_qG 1Ey\z${ܢ R !p*w]i/8y"D=7u.։َԇJW6jSVxk f9}GW QP JXZl4"I5yrҩyqy.n;esJ#Tq3 0`FtkjEmˆ܏A Gk$ђd:C'ϒvy|Kr0.rUrks/(>'JtAr&PrFrV%$NYb8R,׈xBз oՠVf &2xmG,/w(|} _ҷ8T?FI :28OdYK6ncej8+ns7sk&n/w;3!2 ~_o=^~3_pzIAӒW%KI5ґl}2OY,]V$kM.BDVi'I^/s%3w4K!8Yk~F {\דhfRIfA~"֑"~*"z$=:i -|'mjX&7("sY+ \d/bH;L~s_E w-/qǵU=19&uOc[`yIK22{L\~p_tztfs9q'GXuA}1j^#FpsTqČ Ux~FjCdr==JT\\'_:53@u>k3 Fguf;EV%KV Az%S=@\jr3)*vuQHҽVǫwtvtYgffKG MTL.*IdKĤlRə4iR@ŃIIIZ--x/uM;i8 K% MTf)')g+k7+ePR&w]$x+eJp<$H+dR4>JMyQI.r P<}-xztVVVf2M")~-V$̤')@҈yIն}՝Uo\JFɚߟN;C~0>&K>y~d:)<5-1.N P0ohRΙh$v"ߓR8*919*`x湰jfɧϞVu(fѓO>}ZL"*:ʾW60xRؗ0?奥dX$qCIX-3ٓ]߼\x{rx ?'Z}¡' (ݗ{MNJ]5귺>?c3, 1U,qVzw[ d)bۉ[Z\#;PUUꏪ3=hi&D+"#ã"]b"Yv"I7BsD$ S!zGz We1Y&7i=}EE XRA.)aU93+^7BȔͯ|9iic4ԼGg[RC3~]ɭtɃn޵2kUMm}T]:YwsO3o\dӵ\\̟\-ח[ps{u S=AsA9f;hI:R\s68h8h'rJ"RYi\v%RI`H-b1ZV0zO\:́tP:AKzՑi-U(v:h%vPA@+ʯt`˻Vґ$rMdK/]c:^H{mݫ`mkƲܫNh/:_DF̊^8/n2*uzM(6Mu&+STMuF$ꬺ?]S#`17TtQT[nF7[hݔ 3٨7YLBCUC~xh&drqX(^gn2Fc]0҈jd,6ZJSU#uXkFT lj,B15:!A4V5rŨ uzk]S`6 FkAjj zVdjuX`jMPsb}^I0yzbZ:}XFCՈJ yk5k5 J0Q4`%c`bm]}3%j5HNnllLu2 {I$Zk-s$Q [4jk`MzfW4Q@}$Ԁ5 gPt}AgEW-]SS\ot#U6kV+vWĴi}aE@:J:B}Z1כ*:)Mm@c5Vս$kAu CeMu5MB1V0Ԗ,c&-^AgZod~syڼ1Fj+ވVjLMnꘘPaj:Նs_& uMtBCO܈2\lơLPx(gʡ\CpS^V|Ab=T6~P=Xǧ.ƣ2'cO79o3C򍬆lT.rOC,DN 4`ojڄ:#c~SP (m=X^bUЀf\z(`GQ/EMW=;Wcj ^^#TmT2 LL7YeEJtjD .g#bekkM35O̙%՟֡VO`}w.gu >̩Àj֯9yٳZљv>LbZм[:J^$6mxlul{٥6c^/]48z22kY^BufZq]$Ȯ$챯_&9dIfkqdD+1hsHSz`(\Ti |o鬖2[ 9V3/1ߠ_YlhbY4cM{3lfUꐮ=5^#?p*{tH[{cf lC=4MJ g?5:45_T0==mSèO$]._+zְ=Y]7i=&v]l4ڿ] QXd]USx=Zx9~RZYt =O5[??$y[瘙˽w뫽, Ͽ/ptNw8 }8,IB$)|8uX[֡vei1?\@D&bo/^?i~H|_]|7Z9BR5N2iJA)eDB38"RI`Ȣ!'xMA[X50ˏ&Wgmc44͒f~#畆"qKyQWvk\{%ROȼE)^Qx)Yq3m5ե4n)*pZB9J/˻^G֔0M(-/ӃbbUWkdkB\Si25)C^Y]\5δK2y”hM=Rc4ӽznQWT0b4MvzbFJzzJFmhHO} m/nj&;vo'~/Xpӳsw+3^}b ƎkuzۄcVYcnY0W^s'Rr穗n|xCC&NiF/ʞz!sw;f[Xƚ^uNe /|e[ud{t/}5i蛍,TwYAoo}yY6sb0w0 ۧWp2Мs2XZig9a%NyrUYm~۳ >CnfqK}u E"n%E&P\J(›&_ v4\i-VMZq26O@@~!K'BeܯɲvZbDq©Pw2tb]RɃB8E6^IJ;D܆OeTc իjԫ;D *787Qf{7h@Mb->Ȃ+[=*wXb $ً$6NG w&se۞t;xh:MkyELun7" :8_J;w)WU=2#DpˡV\*sճ[&k(:*$|jgF;+;3P{ #);뺬9I]q--tHq2"u9|dODM4 ='e-*ςjٟWYh_b[È~Z!aU/1TK,W]S 儋}2Lq M{ߥ_? Z%_njG B˜9>\TWr5Ӕz4^g1'f#|<,huUj7ASM`4j}@cNCp2IϹcXՌvko4Ձ7fy_V9LE-.k̩ 08^GՈ_zjmz! (6u2lpwʆۦ?UJĥUWXsާV5滤&GT .$&NF0ـT@Jl!R;9O,~]>#bCIts;)U||h* D[uD(@@@^ D\<7$" H"' ߦ1K[mwv3cg-+0 ɉ> :[ɢv{ oIџq-(}\lțEzx6)C95@u|EalREiĪ੒ql( VJ &5+^4\w/Yfz :CHuk_k,EB|~<,%_DAXݖiz 몢O 6KWT .\JKפ\;3Ձ`^>6˽.CM}bSHEAbkLbλ{w(ɣ4([k5?L%q3*QagqxZ5fLԣJȲ/˓>!bl[}iPzH#v^MGy*4Qm6YO+"P wUg)np}:!w\6fQ:#Uh-yϱKNT~!g'&|\mjicÍx1<+J J -0W.jjU5Ws- թWϋ:P Аr0O1bI~D]ɉT+1ޢ{!pi{4g:1`)n#T `w`8/'?](?}el@A.MαsCFjWbBKCm 3t!w6yҩ2ۃz)r*]۔ڇxJ{-H~x̴.㒼ĀzP5>GJm sJ`R0ToxހiaۏԒE,Z%H1h&Ѩ*[Xbe0J99YhZV)-TQ)SP!(қڪjʺAɱ3v,;X$ "a8-k$ 6D.t.1?)wϚ*!#+0>  ¦ˌƒن$X1][m=\[]nk=a-Z g]pkn)'&"Ed2?i$Y]Ib)Lm5.DDPܐ]E ܨ` ?rt5f =VL0 ˡ"|]_6ɈXsȯ:Ylak^B mo\߆xmlzo endstream endobj 7 0 obj <>stream x]j0 ~ CqK{cClJfXd8d/t0 }i'7'8-B'uyv2QiuN84UנE{r!{ayqBJP x5.ؾus|068ȆFTu%@*($Oߨ~_xX{,yJCT>?!oP endstream endobj 8 0 obj <>stream hޜS[o0+e<\ -J'6&!B5'3ZU=22.1H%@ pb Hfxru9KhV:m/ε=ӉT͑خFUOIˆjf8q:.U6 qB$K'ǝO9I]hvΨM9~[stL beA$! %Q?}aT\uOJ[,b,8#DHR/}]]:ɀ?c _tS {8.Cĩt ۝bֶ5FK/pBzyF'EYp $ߝA :yî܏-E2F-sQ+_5U7wLTF|c3ܩ=Nv KbAA[.&vVʇ!OcyQhktŇNC''(%·oR endstream endobj 9 0 obj <>/MediaBox[0 0 595.32 841.92]/Parent 66 0 R/Resources<>/ProcSet[/PDF/Text]>>/Rotate 0/Tabs/S/Type/Page>> endobj 10 0 obj <>stream HWmo6+(*RHiwwE{]N+;ޯy#EӴZQ<—kz(ƪ {W{[UrZn5<\[iBF[{M9u3+M[$P.tKk푙Ne L+fPjڇ\JJQ-bVk\|;ٹ9ٹmźBqw(bʶ؎PmqoKW~< CYYG]"$0״鞂Fo]¼%S.l֯,ؗܪjqZ ~_%\^0\WMôƬt6dfg+ ۓ 42~|5<RW<ނTN<4we>v)\n8`#!Z3 }H81f4ؔp)>nrN2)Ua~2Lx4@ZwI2]'BBec Qhk_| じ⒈oLRCJ`zA!$^dOB] [ L¬bwȚMd3a#w$C/[a҅۰(i YO~cJ)Pe_4dxx8^r!xT!:%^JViO= 26% ^p/RK,@h 07r/(4x\cI$Q_K޾8x/ā; xd}IFVxA}_N *apS>d?h> V #HxE`9Ll\+aX4D ئu&&fyd!Os~R TfeF!Pm3qL;>JIl)%S.y (i@U2AY x ׭1| 6~WKy7_}[.mlO(y[eAW=Dk(9_*%⹁ƒ49̎bQJ7H~]W";ntQZCƬ5S&Z ~$qеA!iDaPzƺu?x;V(`S<`xD& ٘XgJffxL?fw P:Du e7J#tDԗ Tg OFW = |ml#d NbMdu`;ZQu Eˌ_T;92j]&YGhm@ ӁqԱmRMsC4EޥqM>]FKo -ᢦ촣d=g7w}t5\j<ԀAƳ.mO$v/!Wx IpAe&b1*w 폕.TOIe34A*UUhlxUgw {sc ԡN)Д?ܬUcWFQjV_ ex5_uGU-Kѥa~f'b yyb)Z0e1Wʹs}[\ZѹҰSo`x$O}?,|'-i`nXaAn"#M+5,uz FMxyP~tFtqMBlvnHWC'lXb2X~9㕔X} 70[|=d N˜ګhu痴T߄I{H}h/ `;& )pjŸ-?H}5VgO1]]6tBUƫg&Vթ"%ք啷n  _`F7CbLX@"2Ct0drXmG@p\f"밶Oԅ|i Eg2tzҼbih;.r+J萪MLqWw2,pah3'*nHkQWBYXFෑCKZT/t/vPz4jVLF!gP '! B%H)"c@|ҍ'k/ g{9UJptjx*ؕ;طd\׳hZv 99yitu[tEⶠ`;yOK11H6VMg{ &'%䬡a/cԊ}T}f,IEäUl;juuk%r4>v rqR:*wu05]^N.f]-r0.n;R;xK+ܝ9ݧ .b*U3!_EwcZ+ @ W*u3rx2 \iI[c$͡{'-;(n͜})]e1+| B|_ rГMn2-R;e VyJ؟ę!-"kq' /䌘C\rɟݗXL1Q<ųzS80CRHُSM%`ΉUgN\w0OI =5qP y|0Ewγli{jg<=;Y|~6M ƦkgS]gUrӒv bgcEM95LrtT8 heh,bx :X}^/5qQeNӌyr:>7 tXHV=3 >stream hQj0rRЍ>tXŇ4JfenЇBCsra ( qw%b`39]!`z{]IU=$Z@CZTF,3]JI {tF]!J%6F=P[*R]nɇjeg+aZkFdع]qߍOvR1ݝzXy% 0} endstream endobj 12 0 obj <>/MediaBox[0 0 595.32 841.92]/Parent 66 0 R/Resources<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Tabs/S/Type/Page>> endobj 13 0 obj <>stream HW[o6+| #R.@4hNчtgdȕf=ƒ&3:|<_>׃x^gB) HDY||ج(_ ੨LjQY eaEߊg 4PgbUXEZ(q}U, 4+JӺ4:e;)Elj9-eE~UNcLrM<9 2[&~ӷТH V;m C<,r%XDje)jƋ OpbNxe+ U,39l?+~5ɝ m~d.HA1z4Y <*'[գ{0. ɇdbKYеzcROJ:j82[@'5z*9 jڼkT5g^uOK6i"?%ԇ~$䦣d=-Jl`ܓɢReDau~RF<ߤS :K!|%ѯ[ MZ"(c@3¢mʎn|39 i vG,!,Mkf8*çl-3W 逮Jۋ'U&?ByMCErE u9Q}t)cm^n;:yLo0ԍLGH6S9Ǝ2F;݂FGa]։j}2 a44 7I@IlP/,Z ":@*WS]OMw o!lݫ =xEצ Q=N nI_PQ ;2Ķ>h} ,^…p;^: jd?5м`3/%`0j>y3ϸ w(p1"6y. ☰6&|OZ җ?oQ*>gJ .Ny[\ n@2r ȥpDlJ4 ݔjψ؊FLe"y.IҘy)rq~O_O<# \5pq3DD/#gZܥb8&xDRuypUK>(x,\1]auf7M'tahn+>OT~~p+/'BYB3 (fB/cB*BC&&"9HMtgwY2(f.cf:~w3\=qO]egTyb ٧J? 3ɽ(fr/#r:ËԹ'r?ܹ?}/BȾ,&/cAWJVOWKq|3\gfyz/IҘE/%xb=gvlg>.nE1}AZ'c|$9S&B}T٘0/Z{] LfKCU"=bZ:ϳRzzcp'-@)@6ixUn"|\+ilRIm#էs`m*6Br_Y;W`jK]etH!<_ͧB̨UKY!bف@ Iii.tJ? z5볋Pm|yɇϠy[qp;V*i }TƋJO gdRÍkWT`8BFezdZvz5eGpwRҦ4i]PS:aFb|iRDY.ʨ'2STgHqߙAܺ{U@:.L~ }GW:} 7.=Ѷ~r`_LO(+=PWC"j:iYkˆF~"~혃U^N)zzED3l:z%p+z8eIG@8aaiKU2o(4=|ckwF޼{lDֺ+h@ҤynCrTqR$KeJWbQ4i)1{A_mNVB~ bɦ)Rde\䚖iUSjYLSiz/F\ybTcxxvyUVhͿ9LJImr7H3nNYe2E*e/3_1Jhݠ\'m[6&h) #e2ۀ6Cu`3Jy$jߝ?0ѭN05jNE| >]Gj4 endstream endobj 14 0 obj <>stream hޜRmk0+4-P/ZV4 K|[2 瞻I$b AIJH8(sg&8Kⰴ[9SX|j֐$flr@ lupXRٺ~9;.UNb_L]-GӀb1x-k .՚U-AJcg:ʼn7?Z܄Pj=fzs|7)e,_1OofxZܟJ'D{ؗm7 ή1utCpVT{n,nsqKlVSr^융oU^s΂ ~ѯ?-)K7 endstream endobj 15 0 obj <>stream Hj0 endstream endobj 16 0 obj <>stream H|U TT{{3,"Ȫ}0V@+"5 5Kf bZZ4ƥI46cKkαZU45=yyw ~ٹg7y YAE6IJuj6OԻ%Ů[&yN߳7懿+P2u-@V.5`Ω9ea1z77%E6-Q\&{Z݇Ahkj=eӯlDdׄM ϣժ ~1rX{ОTeY<H*^wuslgvԙ GC  ьUhXMA耶!X&KiUn@ >8+E,? Ÿ!!zvTqj .V`%tTK~׼Zo?I g;G ª`cԎ _ab/ϡ+{;`rFp86C#Q_ZNw(gY++R8t&|S8Ch:ޣFa⁲jb܍p>B18qO TBɤF-|Deb$vr廏(F2Nx_A?{EM Фk˴ZvX;'pa Wf_ d܄!1ތ=SD7$nX>{E?(Zl$_` H*E()8'ܖfqjڨR'ۧwz$&t5>.;we}ȈАmZ ln5%!.ӑ4b{opoeX4^1ǒ,9$SJ IF2Lap`Dpfw>;_杷yT_02CK2 FU^R`u5~b8ԏgfBR;!}k-4*2sFefDDEǙ^`‘f kM׌QK1_(r3+cU,0C^ U={!3CK ϲ0G={g|WtrVgġ[LZ& 'W8'#Qo>,['K:Ò,%ca`FQhM$-L!e20 &cd&$$iv:i#& o%voo%uCh̉$Z9j6cSőXu9!+ֳ:bD.JCkYp;Rnho|wj_;YLV!> `MoDFQpwoz:>]= pLk=D'TL;&,Q!1-ܓ"*pZ5UN)-kEr7$2>c1uRn0)yf/Z6%{:W{ƨ%=sq6JQB[@ʧf;S!M(ޜdyv&B8sLJ=6(59;le;W^2GN`/!7&9V8V5ѝIMu9xWb';[gzԒl}1؊-q!^%F`}Ek R%T@x>J|˘+r_ aԗ"_ȓHf_-X,踂nwto,<\EpFx}q:XlQ'$ H -DpNJl@ 6 a$qJE0o`Rõ[Dߜm^g#f6SW@#3HVB2\٪x*T3ScQ)w σCKFM\ԟNg4F\8]Re򙾮GֹrwcrZ܆~{$ H~ W9W2ɿI9\qĀ;m]ZNl"Еi5Ջ^)쑍jI}[6y֕ SPHM˕zC 9ZںJAm$/l*!%A4 &S%ϟ3^Ľf1+* iL||OK&e} i]CxPYPT6e:QE2L(SU*l[e=%G-Z=6|x)#xcm&MNʷ9|eI<<>i抔U iX aʭCv@>`SXTd2 3Y \38MFRUY_zK voll#Xz;v:m1څS ŲӇeR6cXf =5Qu:SE rwN@:g[6F!вhkO@P=C_(`ì$z݊?%f)DG&^ߏC͇_>Ƨ~7s?w4RL~ȕqȷB}]xCa–5lN?/笜@UsR̹E63bӖӶ 6xVcc;hO6F'M6ku6:B.tTE)ku)%j-ʠמ3(dvH7SXju9Bwe;8 ǒ7>ج/fq:!>@1\X(8=7()-X f"x1;אnOVۦn566 0ZkRUQ/Rd*V?sMoS,}"a<?!`EKXבІίo{Ue5Q>6g"ZZ95y/$N0c±2#jR-kWcx1).B Yg7Tp΢ӥ2: Y j\eqR;1 mˮRMvc+LHZ0t!P@u|: `Sg]J NB S5n b(k;⡎ {ַۇlRZ??p'sܗs76'zkw _ey34סzGGrU2PV!RqEnBz 튞%ǑpJ>eZvl6i|m*N*]}=0 6v<8659 B]=@Q\g|v88NCDR(5&dЊ6z()D8Љf:hh5iѦ0ӢhZrKwv{vo}}a}#Y^%^'Šj}e$SmB$z7P-(U*UxEəUk/ ^Lh4%V.$}s7=aCgܳh |n)㏳6ݯ[:|P/Ykm|b|o{ 6L,-Wf9>q˷ X9il0t?yy*-3st$l@ovlںi78VWEUT$? 2&$x 7F EqB p.Uԫb4 q!! 2,1B4*Q*)yJarTEtTJ2 A1\nPk@Q{p< Y i/4hid=s:lF|.ƃ*Nu'[|mpɓIA%$s 7͊ P7nXzp!C1X4*ΜFF7|k>AẠzdUZj]]t ¼N&Gy}vsLC*\!$,EEBڠ{@M`A`E ht- @Z&h Q~d̬d6'$4'!" AwT:;aRVT …[:s]@^hIn䉩ᛂmx=mjm4߰ ωN.d,4K_s漴£hQ09mOٜgg4~X̵3&T|::[ĶmI~-}ʾ0Wd>7-#F+&r\#q裲g)1'f xAtWF QFR;3BczDSnZg 7R`6vv(EAYCA[w}i侢 6M*B*QDV|CQR&OU3 ,EEl=lr*fKgqWz`uH gH gt g($EeBl4R N5*gwmcɃChL$|f%ʽ|#X2 si+^[ktltwRQ(o=W~u'3o'|?Z\7L+۸oܟh0=OULUL>^@ qGio~d>rjx|9KC!#ϗH+$PC%1 ʉEA%$>A<'g#«d̃lN%&׆dc'g7+Pat_PuX|Ҙ#VLJNd ѽ Hg&X p1e !3=<뻲)?u:p61GVRRϖjuX:ugW".WUϮUl Mm\S=^FR!r*U(s\UPG[Cx< j*L$T'vOm(ʨYK%LMJbuwfcgvbxcc1kd B 67]d UB0U *ƤM$-T MHlCJIb ))P+C! Uܻ3=|BJUV%d:7L~iDbhsYWD#z#7>,_9AKXò%kX;]$d}HpV$3䯩MJI$j]8%2ydƒ 1%)NkZڝXLUXXsE(@ Z3uV}(讁Ƈ{db:<1f6JA?; dz$}9}5w{JnVzBNuT_MUdy!ez]\Ztt6"xXcŠ/st\ jFДzmee})M&!<"#*p :@Hʪ?ʉ !B<2lɑ" Lϳj?. r9P%r.hv)p?d  vL9{@HG63J؜aYaS).I`S wL1(ka|B+LH~Rl<,&>^ID%i9D/y8,"-yAcA*1V&P Anȝ0 P~M%{|duOo@?u0aMsEKw*8H /"nuoGcPwx:@GN\ !+ !.T`!a}yG$Hg#f>i"OGqk_Öi["#T@ `{3x mmaÞ^4JOӭhO燻f~-&ԍ_ޣq6 U@m6؆lUT kyMijE4ǣ*?q }ȣY`R01 e]/Hn;뺖6~t#/[4e\>9ww&]_ꍊ?L;%bS vDxFݢD[զݣ(vݫ}n̓=)x= eѓfh V·RQ~?s&FFѨE?;5+N lT n>DάsjNҀXwE0ΉAϜ؛5+b)aX]Tq(4P])vE׹v 9sN/r<=/=o `koQ^ȿd2u uEh_ڐ\ˠ : Pbytq:zƎ)SSr%a,+Fئ(Gy)tP}-JGy#(_D Ie M)p  |(\aRUHOđQ=ڋR(DřrC\41p{܏۟/&ySCERQp_mgfds~q,[Bwovfj>cwkysttYXx#OBXJDnOo?@WhR?0fq.nvqHxdù #~kOtghUqn{1ػ]YîX>l_jR8J CWKrgFG= US_2"h "aHV+ZvwO./+v;b0uvYWRD:\faTx0̅pl AډK , w8aK|ViCTlD}{W~Br&xT߰0N~n+ZBA9ka}ڧ^X 62[kcؘT1FMi+)BI:!fBahINkL3$!xZ1Œ{ʦzsEh Bv\}|0>϶/ f_X\Z7/]7ߌu]5EBJU"d/&uMynP[Fl#jN/26Gǣd)YkC !{(T w g#fЛ߈ ߿dwzXwqxfExlEQ #LSrcMM'@̛bx-2AEOD:TZujSD~3 W G} @HPr h-.:Z<#e!ԓڞ(H@X}!J)ؚ89'䋵'I( ;ZE:/Vu*цݏh s_məmo`y蹪/%7GS~`jj߷`aApբ]B+mUG7@Z*H$ĉ1]SX 6iSڴTk'Uiek}Efٷ(pyf<"Mw8%>'5wQX(!m1~M='继np󕠴:k3{OMw't*Z&HNLBD"TTUE[\vp{h,ݞ޽kCjvhAqn$׵>rٖo_>}3$TN\ΧĔψe]|s[I QC!ߐa#-@3"|*W^1CMfGqN 9zbUU :,C-/)#)>C Շߺ޷vsٯoK-+MA0Q4_E ;vT&ATo |e d8xj[;{RR3<5ՖZKf-9($`'IƱj(Ь X'ݯp",.#8 >ϙ%ßLHaY<\FC8aX×ׅ*U {JIF"5m/\Sd:Qv;;~}`Р>GfEʹޔ}pohxIIT'·hF 7P+hBA x5:tZ]6WPd7Y#rS! c(m=Je8'4(lCM}ȗrXAN3^gh}5~mKaʻws=D+ԬjxmUUu(C+緆Hv;\mJ Z>% J`^Ǽc>M(ʼnRGJsqc'2g={-Uz@kQ\ y-\t{xffc/ZXÁ g_ wNMfc~ ~rT4`2D"9Ogta!{YeG+S&g}6ǂ/_r5t S-->#e J:2 w9աS}(lj%(gP |l;w6U޼yn|9t_;קuطqr8xw.#r#~2ߩ<yϞ::n&fGP Ha!Z;zhCqDvF!'yEM"9idF!7sfAxF4!Ͱ%qH;ڈF~!bl=%ɺ'&+?aȩj+e/`&ea; ]_=(X5iS"dg't;=L[Sٸ7%,;pj'uafI/4VI_oҿuꃢ8~.ǡpTR1FE!!`D4Uզlh"5:6D"#NؙiGӦ:t03uӊIt{vy bXI\&?@14bd3ZT 8Mu/=)Z#ʉ)h8~"s[wb'9uZN8+ y9Ti"dQ濾"de${P@'ep[#E*"rB`&,,lgkY2Tu۫z5*g\OPoG {R\0?sɧ<.LHݲQuT^3"m;O%ot]9i)?c)}# Q-)a>ˬv29 '-~}kev>L0'$I]\ /ڼs-]4f Wű%.AKPՋ^hz>?1vZ?| }z}JF rkNz@_B憐 B@jR:"foTtj>/hoDvLHLSi.NgEܢp&_M&dgh-${B<˜Wn"YO^I2I3OfUFl:<-Ê^#-ulhm #dDcz^m8ù3nJ4Akќ6R\G5F0pqŠvwk]395:#' iKGJ_5ҁR2#eK\{qA%@7kz;!ɏKp$`WNzd& Fs/{G QF97~_ZmBMiAqěo![!'jI[gwGԅ͇exyC뾮_%C=dđf38z|ԡwmCTfQx7[4U[na DF\!C3ɲE/e|;nQ;>TIvcDo(E} =n+`@2ClH[6Tq{CTZ Ƌ=LK^}[2.ub,!b7sU}>g4꾨3Ki\ciFEvaYџ6{|{h/"&Z*dG4V+0JB*+ XF QӴ|@3K/>QpgrG`W@v&_D=ʁo02tȌ'҉fSk { B3.ԖTZJfeP\H%30s;7=:OchÞ]'rb¬`bP<5F Ԧ#)$YD(ڌj(m#6JhSl/Fmd{~u8QG܌-e~ڇڟ5FD (1ֈr۷ +sj`8s0mf?ʐjnAZԂs?W"d.'0j70i2֡rń*&T1+*ӊ IzҬlS&jy|W}liw>wfvcfRۖUv<(pEV y'Xr_#g4ܙ=(x&D?0z5^)ENv}gv&>KVZ7̊tvOfkΨ,tQ.R%3E;3Vt̂ЭFǎir}&]{hy[$- ?~Ɵo&Sڵ3-4ssnݞ˥\'Իѯi]ТhBz_*ZT}GzQyϽ) ll-ᒸuI,q LIdTLލÅ:hU5`9#$%^&.cn9Ȼ# gQtRNCDr}:{qAĉsĩ^XYLjNhAEſNRC` !iL8-. 57'.MuM{D`O? IlRnem[ִw*?"|!}ˋ}*t\PP6D(pFϓPŚ?<"H:Loi[k2M׶-4U}H}_E[= qb^;.'>$\@4 ~iU2\^FF%ֵQ}JvAA ]+$KŤٸdXS^TpHh$ˌ<2AeXaNExapjp$ T%ejC<\ذDQXGgGg%6hz+? zoo67K k>eVOM׊D$*-!%9l!f8+g GU;=|РT\@48,]l ڤ4 o2[I%uJ"2!sCQvuzUʮ-rN*4tFf]>c6H$bQ{\X*)DԄ(؏ ƫ}*g8n> 3O& 骮iB1҄ŀb )tbc)HXAF6d|n.עHj+ˬ`A E& *6gGrLqe Z 1j>t/،ȊA,Cr B΂}gV^wv 3G?nHm0v6=ަҰvnUmRt-IjF$+(pPijХ ڰ1jeC E_ELEwP(ר:a,W_ /S@vXZ<4\\4uN)}z|N+p؆, r+~AŸ'`+0s ;x[О'bCvn=IMRX!0-C3cb &|!ف4R2};; poI,?X<6-8rM̊4/PIطQ0&s%׻uջ=G*+~`.6'Kj*gd؈u/6&x)&!!חﲻ:Ƿ?/પ+{^7D+ "B XkDLJЁRF Z&XAAk픗[ q("mhH8־d'@O7k{:*?q]]]}CdL3~4az@B%uuu3DkWxA'R{eS&d{)uw?e4ua^lb?F o} <}Fa}vC%c<yX&%X2DS#c1F'ҫ(_Uԗj[#|\O%,$eB̿TuFva2?A&ƾybdQo>}Zu 4̦| 0ׁ|9ЫjHۭ;d# -fݬqMot:?Ū_tujx+[s([隿}j}9r]ֵ\g=[|>n(V'9-2[!\_l}$^g`01_70Nu?Bvp0w{C~:z'`"{PT?=O'JξHۃsœ =}X 3OĞ^TcgfJJW!a< } g>+64^ ;(GA[m]i3VmVK8ږL(MO6vKש6ܔ<:yPc*VFvY{[(u_>Zs;K덭c QՌY-Nk9 R@.e}85a7),滛P5Isuf_kNMuc$vUln"$R:Jr˯k[%Hwk|,;MtBI+0nʸ9Q195Y,YImnvRi%Sgʋͻw&jit62:>csq[ ehq6.Emp p{woh(uN}ȟ3˸Tߢ-S*ׯqF;/ly;jjy#xG+q;z{ߞo۽U.oi[)OC?v {ڴe~GK; $˸o_{hޱ7yA~~9]<(&:ISΛWًM0~F2Mt#e%v,_dúߣgϝΘ#zj5XN#{Ҿ:]_|ݵY㮓Xa"ehaB12+#SVgtJ%fM2oɀZyK iI.1 /"л[#_K3̵d]ݝg2KNtOȽs3i?~T:O8gr~V~8k XBz IqigԿGqfH:?y9 ꫺6x>:u\6{9->`K~wbBR8yA⩍67{!'4)BCM^)T(7*"QvRmuHèfS":BNi_ߜOhoGɲ? f.츌oF wg?}` V!K&H,Y{\așD❪b]C&"FgJ;P O; lK~Pox_Ι^goBבːh~ٔE$??g=aL}tG \DI=soexFx_ o?N(9N¿~1eIJ&1&ޮ1dĔd?U5vC2.zBy[\xd m>i=ElX1.VdL/%o)d5O &ol3>_zax}^@G%/| 訟χ'J ƥ8|sqqG$IH0I}SK3ܷؽ\w:S5!~[~,wP&^#9W;!Lo/C(M>UbuZàOO:զ툀9n=3/,NJ` +6d6Ԁ ac]v EEtDEVe)(X '#h t Ev">{=w]w79=.$&TV&/u"KY8\){F0LoxI>~;ur_>6ƴ@XW Ir /d}ml 6I9m sw4-R̒K%J7$iۆܭ^Ζ&kv~W5&EM -+m6g6{<~7vlG.e4 *㭰jE?g%}؜J iM3F~ weV |)t IjfsgvSo=w^`_=xsV68!uα V#6f,8^ fଌ 3sϵsݻ[gܩڽ:/vh*sW529F 9cܑ=3)}uIy;-JRs H3) P9&oL嬧^zFI6vHҟӶMGcm3y]@g<'-g5 ӟLd>KQ6U{s6!W%ՎȆGsGs7fCWa3{01P>Gs+{0qP>.{'byxؗC߃ͤy.ջ ;`*u$&t,!nc$]Z̲ɜRg`_dJ(u wIQ>Z]GtV}Ml^#F=_E᎛"d`c^03>å@P\[74W".rLhۋ]M"ٳV_jNlgsV0߹SvvH~ZKttnv֚v-=kmmN6Xw꧛}}%ۨzJSH4ΏjN72tcUbߗpƵ;%7ua}Gbe/m6u&oŖݳė.=J{ŽE W`cƩ0uh K쨰V1n179|ni 4Dv [dO1S98笭W}O1v~d;hzjvwᰦKܻkꕬ9/eML:G=1E}u9 8';\^֚9D1rG+h}#:]S8W6 _@ζ^|fkGׅH j޶I2 cwuTϼٖ"+qT9:vVLñi^ P¼u}ͳXmdT0G)[P`l.,q/2tcL^9&ߩF^R|W_'ќeS}T]װ o\3lYLc(9ШGHo|ʿ}撾(LRjO_)J^ŋމ{0ޛԛ/:<:E#lB8cil gzOx{5p֞7ԙ1B5Vtե6KjEւǎaRl}->R-4,A9$DwC bioa)Of*ebe}6+vB|7,;yxH!w῔ pU{>$$$$4 `AF Bf0Z8C!<  OEQ0RP2ҡ_.W4p|9{~6ѹiW˒s[d9l7xɋ/C1;ϭŅl^8y$$d2M:I,ߒw-@vWõLl牟uZX)_ L̗".{DiKawlH~'CAX:y{+c\mxf_bK&β]gIr'wtD? ?{ }P"о_#$p0ғsY{j7JZj"UR3(Qw6?gy>V m+Pu0vkQhFuiTEAe}5'I(WϢXL):JLi/uzpUTìFq~j~[mG騶SY׆a ʉ_l9*KEOXh>ʘۦ#7jϸ[lbJ&mM3!["v#vD&2N=nٗaזAarL9>{6 !sg8cG5[Ah㈔U1%2&=КdU2@X?XYok>۔p\NoUJѶII~/6zYzK'8۬eئg!?.[cLo7§{vY:߿RW)?|&9|3NQf)m@2ēTґtgt{RErZT<NƹkŸwPn>,e5=r/ ߂ Y}pO(gԾ. [9/y[ Ndp 6a~ՈMxBH!lAF. q$,/>}L-K w?Z bvQƊ?HYn%ػgƛv8O0|?$[1y 1ǹG/ݣjc]BeƜi~6sr~qY 2b7)9_xk=+BH/#^sMv6?AQSh2KL#1@J`l?nDT+w䇇7uV-c$")߷='q+m#q}(g33ԭČBH_D0|{/E~ދI L {7ړi u"s;V]Wb;tYlXgwM|KZ̳*]/YlSƊ5(_( 'cfn WC=ꊻO<ތCg&c|!HN?|JgSun抏?z_aDCE8m$W qW[xZ/[{܏+L n]LUTdw29/sEd敏&~ &y{}/1K| (, >A_Wƙ˙C+OGwa3F#9B%/lCCv ̩ed!ٚh&DoTL۴?Z d^T/0ߤ>)r]+t!*O| 1,Ta5kaXh&axS'#QDۥNN==1Lr6{%['6V)s<Sl8Ϸ׸giC e}2=*b>GBϴ!ݯ/FSߋ ەHL?jgp#NZο==PY3[}{=el;f_*`K)J aYmwd\&R砑be\)d k.swRws]yGBQoדDK8.Aqtsneo5hWq J"{$㇅sk$Hzg3~)N\Z<Ä;P1%o&p ϰ%NӁ[d,˹l-v{[5p5#>ٷ0} Gw[,z:G=8j #㤥@ohWBn  )A$POR1Itc~6uqsҘd$6=cqڅ\ChBaE8 0GS%SH]u{1 X+ {6mX݋MߤNd쏪Nv}w=;N%6m/mmOu DA>0}Mԏ2>v7 `0 `0 `0 `0 `0 `0 `0 `0-xH'ޤpOJWqDr<|OqKZ"yFW깗zOQЄ6깇5sA\zހH=oD~{iJC6H %ANPKv.\_#(smxDQ9SƸf nd[O{G'v(Bq""OYf0"\.C-QWmDXE~ sy$>p<#v~OtiW_Xk'U^x=7%yԊ)ۏ0&:q;wCѧ^_U}D*.ϢD_za958d*w"ݩL:6J$\VtN)'Mu3ΘH;A쏜Hs*:h*}"NH"=FTJO&|,{gUvFR+>G# UuRTeSLAɍE2'cNF<TQ'uv(91fi=A#"Dv۾=OP&ItJ%b^TD2s<9R#{3c>+}C>I[{ta)Q7c>Ph1 kO/&Pk)&kةI$5G,Enyr r}VXYNo Ov,KAiGU]o,ym2WZLȴ{CYbZL}{}I6.IAmU} ŋx|~!pz Y;%hgC9#\ OYx@8gϴ8 Ng\y0IFFF4444i=1c!6` 1Ć!6000laaaaða0l6l6 ͆ Æa`####FFF CP0 `(6 Cgφ'QQQQe FFFU.+A@@RRRRaRzC؜`h nWhFFFF"""6 0 0 0 l6>[#x/wl8Nxr|^ ]xx8Q'G1G"kBmx # ft x9!{];^Ug֎wcpR4ukoMH`PP66I.?R NE %P$ TRUM/*2^T E=V\ ^f턪u{߼7~3mk+Y Z =^$5/E9 G y MoA!:#zi 9;1i~MҗITU.bQ}})O=]eUOzd`VNmͳvI. &q-=ZgSN래)93YW77 Q?Pߤ?h rN5yPP{KP+aEQBJPz;L u!%HT,*_\&ւ.j OmZX9~̰.? 3_RT];CW;D)}pu[ˑfi ,>>mX[׬Mp5o\wԲ[JRBU1JX>stream H\݊0FܽXlKir88E޾NB 8UcCթ)\u JڮK=fy,>ܯsӐ-*tW/v8,>az9p?YTNzV_S۾|5A%4Cc݄![r* }߹xʎw=M(tQ%ZCZ@[hMP }4$ѐL",YJ:K>=y,Rwm₦BNv}nèb`JG endstream endobj 18 0 obj <>stream h޴ێd7_%.13 4H-#{ Hj˘@\:RP Xo?JU2ܛ:q*T⩔ST)RQhwj/2Na#BLT ڇ[=դB*dע?7?ܿyx?}LJ_poO?}~yOӷ#ϿWoSw_|S>{tqx_ff{}NTog_`׏oݿ~Ӌvtw_>x~|y:~Bwۂ󛇟_SJ^{&f~yѾ|^J߼_~?ս[}yw.6._G0QWU|qn8xJ)SJ򥞚qj1b rP[ (=.z0N qJ;ۧ|hrI8 S1(S՟2pv~B2:;h#OAǁB%q.st|4NoLXo/B-Ky63F(?9~R䑁zLE-TH΅ p:7-tykĻ}[mnsC!gm&pV|@B7ߩ >~6O| 6qb+XXY$[&$?A eh~S $Z /1`hLwqR|\{5} }C}yѱ-j]9jIsϟLsa\ckm\W~5xߎdzc^\רsF: U{9ZRK8DKȗ|.ăLaB䎜5@,sXE)q$wjI{Q{qD3QJP<.eIZVd&Yk}uf2u>gRd%|g [^O젦}v1a'Rk 9slTT:+6a4 D+1>7lh!&(@r%JAU?ZEjZ շDp"0-&nwʃB S&:FZ`ŵKhgӉ>[Cz99#^7V1.[ f[77$hm&M=T@lYJHPSr/VYVqZ Նszi"x5IkWm?ʁzE(g*IiupB-dզƎKc%JU+!V&:5b/ gkE\zz_RgLH^Z{zT.{ku ˎ# (!ɬ}$"6ш!*pn+*8j\o a@:Xdr17nTPZ>{_)8"&bU녜mCXe1zX,# T7D6ʡ3E9sdw&JK1c2Je%q.2-bƸȂ0?]TxT`^ݤv_vߗY2S<Pdy?WJAE|)a~Aֽ4zke׀úowQҁk/fF* 9W}~vW?zL:)sr!%fKʔ+k[g"[T>X 4maPm,TÂL (lmOԱ`QZX0za6.Qƅf(}U\r{܂AAi ʷ m(a2 ٘LM٠(Yr +N H)"d9-W (mcjl +gB>=E {a, $gMS$BXt * j >A=܀:XAdOaYP@V2 I@tgz{Vh Gް£nX7Q±`!|T!_>=*q %Zj(jX0cAiEԵ`ڑYS*n^AD F˺P RRTc|: KUM:-/xAa @dM^,ߨ:ʐfExs#MJmVvbXiEשirn_陔y|>KE-Ǖ1)dP>a[*n2Ey[]еO)B"*FVsOu15k qcs-У6*sFV%Q:YX hϻf4 [ݭAI@M m[{9c]a߯yj 9 ܖ[5;L#>yB]Bg#19:i-'sUVԀ] L7 ~cPl 830rƹ&ud96쩍-.TLbQRɻ! (*gaA}iv vE 5˾7::јtڥHKvAwu:OOqavt/w+T!GĊ'Xt㋏"p76JJx_9!1JX Q,}d lG-ئ[B(7#@yl=U1ڧÍ0[)HVJCo8@bmhi,<Ń2|}WUl/0G+ooOU𯺫ۮ&Lvuո guL3}V$oLĿʮ.ƤlL81 &ucR7& LƤmLwuհclLddlL w$8iO0ՎtF*< {|ߍ C1^PkfH m>%':c%*9͐^ÿϡB)L<"NxD _uN?@{'k-k 4^ 1vuD/H3d?|_N_1Zd;,7y;t)յqcMqg |äN?{A'G_ “d3cR` ~a)"Gjjg+mV5ʎ}ẍsJd@ G~O ۏ'c{?QzUa?ʻxr\QT>ۄ~h}77.ه޿w>~@ܼV^"5=u dTLT_t '%,ڪDWh Zˏ؁ j(!ZJ;XqLM4X0y r *r1Lc43 jw9RQV)NѢB8B@A6ƗXmƯ|끌 cbBX׃6u:i>ݏqwu<`cq'< p=J8}<5ϑ^u-;5Es҆Tœa}}oKN܊{m<6vMqXsP̯- f#"n~g=A1sTpU0s3'iD:¡cP)1RAR|PA7M-Ԍe$mcDЮYE<܋41礱G5=pDWBZ!RXd`)g:J)y>7mkfW/,[gbC۝,4>1<ПY-#bf+g`){M)b;M>@5uv"8 EXH9;qc'DBɩC@کZ-Vs)Tk尣@pU"CBxЗ0y 3jHN&Cfsr 46+ GF¼D2Thfɚm2 (@s1Ig{.棽.qg>>` ڴkہs)  oʫFfbZ@$ܹz)?ywhJ3pJ_78w ^;' ~}@W& RR[λzʔVD2 ó gD|6+uJzE1ޜJ{kwHN v~~aocp^6#XᤄNR FI*0iO(law(lc2҆1ظ F(cgy,\ML)aVbJ*[Pf,D % DSv:94t pG@?Tve6*!9GrF| sA:7$X >ۅӔa1Uuf%X8Am cd[7L5TF'|r.6zZ a ݌EfZQ]H0y8:dVg "mbgBVtۙ"ȘBBYϳ@aZٞ=" ւyU^s#䴚%:wSP F_nP좵 )Oy)IVwJ+T B Jks$'wYYc)q:IPUN~ؗ](24[,o7Haƺ [bGm8X [[}'VhΙkZŖyyx uj̲"ءI63D#Յ߰JMAKy)āE_M%Ns*4"ݜdbn|gu0 Xjj dp 8f:sӖv}ы8ؔzB=9,,f\q4LhBRjpM3p}* ;Q3Zħ~Xh7| fZ;ņc3WJ1!O8F>$AN_58 6CP!H>*H؁.4y7CٲCYӯB9/n"Pqh3 r]!226ER~㥅xp_k3\B?$VڷùǺ"%k.sm۽$2 OPD9*PpMޠc&#UlG}Dl7-ͬ\&݂; ? ӣ;Fq%.y}<́ ;p\0f ,NmW_*(r4$;þuڸ6S{EoWaIWW. <7fBBLi[m?+nZt] 7 Jx=UNrs.{ Ԭ(4DʼO9~9Tѻ uvMaLGu9(勬EK2Z<"ȧ+**$UX)H82 ՍCN|_AiUXƨqfMR2auy!@[ٷ.G&\*3w)yH "~ mW'Dp]ꗴ|ͣ%v[RdԙرRBɯM΅:5B |{~i۫_ǻ/wq}^ƖP} :Zvd9G1r#nS~tNVk~J>stream application/pdf Marti Maria 2022-10-15T19:00:14+02:00 Microsoft® Word 2013 2022-10-15T19:02:08+02:00 2022-10-15T19:02:08+02:00 Microsoft® Word 2013 uuid:bfb9c453-4797-4d13-b4ae-e1e5a41ecb41 uuid:3793db82-afc6-413d-9450-f31b95c9166b endstream endobj 20 0 obj <>stream h23S0Pw/+Q0L)67 )I0i 1Q!vvr endstream endobj 21 0 obj <>stream h23W0Pw,-/M,*TE%y.%.VFFF&FPU Ei%R 5}S0X委&og`d/, endstream endobj 22 0 obj <>/Filter/FlateDecode/ID[<2C835A029CC8374385C4EAE856CC9802>]/Info 67 0 R/Length 126/Root 69 0 R/Size 68/Type/XRef/W[1 3 1]>>stream hbb&F'2 L yd&@$ h VVfse0 "zoH,֫P"ރegu]D-XR+9OB2} k endstream endobj startxref 116 %%EOF lcms2-2.19.1/plugins/threaded/include/0000755000175000017500000000000015176574562016544 5ustar martimartilcms2-2.19.1/plugins/threaded/include/Makefile.am0000644000175000017500000000014715176573557020605 0ustar martimarti# # Makefile for include directory include_HEADERS = lcms2_threaded.h EXTRA_DIST = lcms2_threaded.h lcms2-2.19.1/plugins/threaded/include/meson.build0000644000175000017500000000004415176573557020707 0ustar martimartiinstall_headers('lcms2_threaded.h') lcms2-2.19.1/plugins/threaded/include/lcms2_threaded.h0000644000175000017500000000350415176573557021602 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, multithread extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #ifndef _LCMS2_THREADED_H #define _LCMS2_THREADED_H #include "lcms2_plugin.h" #ifdef CMS_NO_PTHREADS #error "This plug-in needs pthreads to operate" #endif #ifndef CMS_USE_CPP_API # ifdef __cplusplus extern "C" { # endif #endif #define LCMS2_THREADED_VERSION LCMS_VERSION // Configuration toggles // The one and only plug-in entry point. To install this plugin in your code you need to place this in // some initialization place. If you want to combine this plug-in with fastfloat, make sure to call // the threaded entry point comes last in chain. flags is a reserved field for future use // // cmsPlugin(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0)); // #define CMS_THREADED_GUESS_MAX_THREADS -1 CMSAPI void* CMSEXPORT cmsThreadedExtensions(cmsInt32Number max_threads, cmsUInt32Number flags); #ifndef CMS_USE_CPP_API # ifdef __cplusplus } # endif #endif #endif lcms2-2.19.1/plugins/threaded/include/Makefile.in0000644000175000017500000004245215176574547020623 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for include directory VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/threaded/include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(includedir)" HEADERS = $(include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ include_HEADERS = lcms2_threaded.h EXTRA_DIST = lcms2_threaded.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/threaded/include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-includeHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/threaded/meson.build0000644000175000017500000000006215176573557017264 0ustar martimartisubdir('include') subdir('src') subdir('testbed') lcms2-2.19.1/plugins/threaded/src/0000755000175000017500000000000015176574562015710 5ustar martimartilcms2-2.19.1/plugins/threaded/src/lcms2_threaded.rc.in0000644000175000017500000000354215176573557021532 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, multithread extensions // Copyright (c) 1998-2022 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include 1 VERSIONINFO FILEVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 PRODUCTVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #endif FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL { BLOCK "StringFileInfo" { BLOCK "040904e4" { VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "Multithread plugin" VALUE "FileVersion", @LCMS2_VERSION@ VALUE "InternalName", "lcms2_threaded" VALUE "LegalCopyright", "Copyright (C) Marti Maria 2024, GPL-3.0-or-later" VALUE "OriginalFilename", "lcms2_threaded.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", @LCMS2_VERSION@ } } BLOCK "VarFileInfo" { VALUE "Translation", 0x409, 1252 } } lcms2-2.19.1/plugins/threaded/src/meson.build0000644000175000017500000000152215176573557020055 0ustar martimartiliblcms2_threaded_sources = files( 'threaded_core.c', 'threaded_main.c', 'threaded_scheduler.c', 'threaded_split.c', ) lcms2_threaded_incdir = include_directories('../include', '.') if host_machine.system() == 'windows' lcms2_threaded_rc = configure_file( input: 'lcms2_threaded.rc.in', configuration: version_cfg, output: 'lcms2_threaded.rc', ) liblcms2_threaded_sources += win.compile_resources(lcms2_threaded_rc) endif liblcms2_threaded = library( 'lcms2_threaded', liblcms2_threaded_sources, include_directories: lcms2_threaded_incdir, dependencies: [ liblcms2_dep, threads_dep ], c_args: cargs, version: library_version, install: true, ) liblcms2_threaded_dep = declare_dependency( link_with: liblcms2_threaded, include_directories: lcms2_threaded_incdir, ) extra_libraries += liblcms2_threaded lcms2-2.19.1/plugins/threaded/src/Makefile.am0000644000175000017500000000144415176573557017752 0ustar martimarti# # Makefile for building lcms2_threaded plugin # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign includedir = ${prefix}/include # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2_threaded.la LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBRARY_AGE = @LIBRARY_AGE@ AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include liblcms2_threaded_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_threaded_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la liblcms2_threaded_la_SOURCES = threaded_split.c threaded_core.c threaded_main.c threaded_scheduler.c threaded_internal.h lcms2-2.19.1/plugins/threaded/src/threaded_core.c0000644000175000017500000001076715176573557020662 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, multithread extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "threaded_internal.h" // This is the threading support. Unfortunately, it has to be platform-dependent because // windows does not support pthreads. #ifdef CMS_IS_WINDOWS_ #define WIN32_LEAN_AND_MEAN 1 #include // To pass parameter to the thread typedef struct { _cmsTransform2Fn worker; _cmsWorkSlice* param; } thread_adaptor_param; // This is an adaptor to the native thread on windows static DWORD WINAPI thread_adaptor(LPVOID p) { thread_adaptor_param* ap = (thread_adaptor_param*)p; _cmsWorkSlice* s = ap->param; ap->worker(s->CMMcargo, s->InputBuffer, s->OutputBuffer, s->PixelsPerLine, s->LineCount, s->Stride); _cmsFree(0, p); return 0; } // This function creates a thread and executes it. The thread calls the worker function // with the given parameters. cmsHANDLE _cmsThrCreateWorker(cmsContext ContextID, _cmsTransform2Fn worker, _cmsWorkSlice* param) { DWORD ThreadID; thread_adaptor_param* p; HANDLE handle; p = (thread_adaptor_param*)_cmsMalloc(0, sizeof(thread_adaptor_param)); if (p == NULL) return NULL; p->worker = worker; p->param = param; handle = CreateThread(NULL, 0, thread_adaptor, (LPVOID) p, 0, &ThreadID); if (handle == NULL) { cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot create thread"); } return (cmsHANDLE)handle; } // Waits until given thread is ended void _cmsThrJoinWorker(cmsContext ContextID, cmsHANDLE hWorker) { if (WaitForSingleObject((HANDLE)hWorker, INFINITE) != WAIT_OBJECT_0) { cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot join thread"); } } // Returns the ideal number of threads the system can run cmsInt32Number _cmsThrIdealThreadCount(void) { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return sysinfo.dwNumberOfProcessors; //Returns the number of processors in the system. } #else // Rest of the wide world #include #include // To pass parameter to the thread typedef struct { _cmsTransform2Fn worker; _cmsWorkSlice* param; } thread_adaptor_param; // This is the native thread on pthread static void* thread_adaptor(void* p) { thread_adaptor_param* ap = (thread_adaptor_param*)p; _cmsWorkSlice* s = ap->param; ap->worker(s->CMMcargo, s->InputBuffer, s->OutputBuffer, s->PixelsPerLine, s->LineCount, s->Stride); _cmsFree(0, p); return NULL; } // This function creates a thread and executes it. The thread calls the worker function // with the given parameters. cmsHANDLE _cmsThrCreateWorker(cmsContext ContextID, _cmsTransform2Fn worker, _cmsWorkSlice* param) { pthread_t threadId; thread_adaptor_param* p; p = (thread_adaptor_param*)_cmsMalloc(0, sizeof(thread_adaptor_param)); if (p == NULL) return NULL; p->worker = worker; p->param = param; int err = pthread_create(&threadId, NULL, thread_adaptor, p); if (err != 0) { cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot create thread [pthread error %d]", err); return NULL; } else return (cmsHANDLE) threadId; } // Waits until given thread is ended void _cmsThrJoinWorker(cmsContext ContextID, cmsHANDLE hWorker) { int err = pthread_join((pthread_t)hWorker, NULL); if (err != 0) { cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot join thread [pthread error %d]", err); } } cmsInt32Number _cmsThrIdealThreadCount(void) { long cores = sysconf(_SC_NPROCESSORS_ONLN); if (cores == -1L) return 1; else return (cmsInt32Number)cores; } #endif lcms2-2.19.1/plugins/threaded/src/threaded_internal.h0000644000175000017500000000524215176573557021543 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, multithreaded extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // 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 . // //--------------------------------------------------------------------------------- #ifndef _THREADED_INTERNAL_H #define _THREADED_INTERNAL_H #include "lcms2_threaded.h" // This plugin requires lcms 2.14 or greater #define REQUIRED_LCMS_VERSION 2140 // Unused parameter warning suppression #define UNUSED_PARAMETER(x) ((void)x) // For testbed #define CMSCHECKPOINT CMSAPI // The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). // unfortunately VisualC++ does not conform that #if defined(_MSC_VER) || defined(__BORLANDC__) # define cmsINLINE __inline #else # define cmsINLINE static inline #endif // Holds all parameters for a threadable transform fragment typedef struct { struct _cmstransform_struct* CMMcargo; const void* InputBuffer; void* OutputBuffer; cmsUInt32Number PixelsPerLine; cmsUInt32Number LineCount; const cmsStride* Stride; } _cmsWorkSlice; // Count the number of threads needed for this job cmsUInt32Number _cmsThrCountSlices(struct _cmstransform_struct* CMMcargo, cmsInt32Number MaxWorkers, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, cmsStride* Stride); // Split work following several expert rules cmsBool _cmsThrSplitWork(const _cmsWorkSlice* master, cmsInt32Number nslices, _cmsWorkSlice slices[]); // Thread primitives cmsHANDLE _cmsThrCreateWorker(cmsContext ContextID, _cmsTransform2Fn worker, _cmsWorkSlice* param); void _cmsThrJoinWorker(cmsContext ContextID, cmsHANDLE hWorker); cmsInt32Number _cmsThrIdealThreadCount(void); // The scheduler void _cmsThrScheduler(struct _cmstransform_struct* CMMcargo, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride); #endif lcms2-2.19.1/plugins/threaded/src/threaded_main.c0000644000175000017500000000265215176573557020650 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "threaded_internal.h" // The Plug-in entry point static cmsPluginParalellization Plugin = { { cmsPluginMagicNumber, REQUIRED_LCMS_VERSION, cmsPluginParalellizationSig, NULL }, CMS_THREADED_GUESS_MAX_THREADS, 0, _cmsThrScheduler }; // This is the main plug-in installer. void* CMSEXPORT cmsThreadedExtensions(cmsInt32Number max_threads, cmsUInt32Number flags) { Plugin.MaxWorkers = max_threads; Plugin.WorkerFlags = flags; return (void*)&Plugin; } lcms2-2.19.1/plugins/threaded/src/threaded_scheduler.c0000644000175000017500000000765715176573557021714 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, multithreaded extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "threaded_internal.h" // The scheduler is responsible to split the work in several portions in a way that each // portion can be calculated by a different thread. All locking is already done by lcms // mutexes, memory should not overlap. void _cmsThrScheduler(struct _cmstransform_struct* CMMcargo, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsContext ContextID = cmsGetTransformContextID(CMMcargo); _cmsTransform2Fn worker = _cmsGetTransformWorker(CMMcargo); cmsInt32Number MaxWorkers = _cmsGetTransformMaxWorkers(CMMcargo); // flags are not actually being used // cmsUInt32Number flags = _cmsGetTransformWorkerFlags(CMMcargo); _cmsWorkSlice master; _cmsWorkSlice* slices; cmsStride FixedStride = *Stride; cmsHANDLE* handles; // Count the number of threads needed for this job. MaxWorkers is the upper limit or -1 to auto cmsUInt32Number nSlices = _cmsThrCountSlices(CMMcargo, MaxWorkers, PixelsPerLine, LineCount, &FixedStride); // Abort early if no threaded code if (nSlices <= 1) { worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); return; } // Setup master thread master.CMMcargo = CMMcargo; master.InputBuffer = InputBuffer; master.OutputBuffer = OutputBuffer; master.PixelsPerLine = PixelsPerLine; master.LineCount = LineCount; master.Stride = &FixedStride; // Create memory for the slices slices = (_cmsWorkSlice*)_cmsCalloc(ContextID, nSlices, sizeof(_cmsWorkSlice)); handles = (cmsHANDLE*) _cmsCalloc(ContextID, nSlices, sizeof(cmsHANDLE)); if (slices == NULL || handles == NULL) { if (slices) _cmsFree(ContextID, slices); if (handles) _cmsFree(ContextID, handles); // Out of memory in this case only can come from a corruption, but we do the work anyway worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); return; } // All seems ok so far if (_cmsThrSplitWork(&master, nSlices, slices)) { // Work is split. Create threads cmsUInt32Number i; for (i = 1; i < nSlices; i++) { handles[i] = _cmsThrCreateWorker(ContextID, worker, &slices[i]); } // Do our portion of work worker(CMMcargo, slices[0].InputBuffer, slices[0].OutputBuffer, slices[0].PixelsPerLine, slices[0].LineCount, slices[0].Stride); // Wait until all threads are finished for (i = 1; i < nSlices; i++) { _cmsThrJoinWorker(ContextID, handles[i]); } } else { // Not able to split the work, so don't thread worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); } _cmsFree(ContextID, slices); _cmsFree(ContextID, handles); } lcms2-2.19.1/plugins/threaded/src/threaded_split.c0000644000175000017500000001653715176573557021066 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, fast floating point extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // // 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 . // //--------------------------------------------------------------------------------- #include "threaded_internal.h" // Returns true component size cmsINLINE cmsUInt32Number ComponentSize(cmsUInt32Number format) { cmsUInt32Number BytesPerComponent = T_BYTES(format); // For double, the T_BYTES field is zero if (BytesPerComponent == 0) BytesPerComponent = sizeof(cmsUInt64Number); return BytesPerComponent; } // Returns bytes from one pixel to the next cmsINLINE cmsUInt32Number PixelSpacing(cmsUInt32Number format) { if (T_PLANAR(format)) return ComponentSize(format); else return ComponentSize(format) * (T_CHANNELS(format) + T_EXTRA(format)); } // macro is not portable cmsINLINE cmsUInt32Number minimum(cmsUInt32Number a, cmsUInt32Number b) { return a < b ? a : b; } // Memory of block depends of planar or chunky. If lines is 1, then the stride does not contain // information and we have to calculate the size. If lines > 1, then we can take line size from stride. // if planar, total memory is number of planes per plane stride. If chunky memory is number of lines per // line size. If line size is zero, then it should be computed. static cmsUInt32Number MemSize(cmsUInt32Number format, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, cmsUInt32Number* BytesPerLine, cmsUInt32Number BytesPerPlane) { if (T_PLANAR(format)) { if (*BytesPerLine == 0) { *BytesPerLine = ComponentSize(format) * PixelsPerLine; } return (T_CHANNELS(format) + T_EXTRA(format)) * BytesPerPlane; } else { if (*BytesPerLine == 0) { *BytesPerLine = ComponentSize(format) * (T_CHANNELS(format) + T_EXTRA(format)) * PixelsPerLine; } return LineCount * *BytesPerLine; } } // Compute how many workers to use. Repairs Stride if any missing member cmsUInt32Number _cmsThrCountSlices(struct _cmstransform_struct* CMMcargo, cmsInt32Number MaxWorkers, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, cmsStride* Stride) { cmsInt32Number MaxInputMem, MaxOutputMem; cmsInt32Number WorkerCount; cmsInt32Number MaxCPUs = _cmsThrIdealThreadCount(); if (MaxWorkers == CMS_THREADED_GUESS_MAX_THREADS) { MaxWorkers = MaxCPUs; } else { // We allow large number of threads, but this is not going to work well. Warn it. if (MaxWorkers > MaxCPUs) { cmsSignalError(NULL, cmsERROR_RANGE, "Warning: too many threads for actual processor (CPUs=%d, asked=%d)", MaxCPUs, MaxWorkers); } } MaxInputMem = MemSize(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), PixelsPerLine, LineCount, &Stride->BytesPerLineIn, Stride->BytesPerPlaneIn); MaxOutputMem = MemSize(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), PixelsPerLine, LineCount, &Stride->BytesPerLineOut, Stride->BytesPerPlaneOut); // Each thread takes 128K at least WorkerCount = (MaxInputMem + MaxOutputMem) / (128 * 1024); if (WorkerCount < 1) WorkerCount = 1; else if (WorkerCount > MaxWorkers) WorkerCount = MaxWorkers; return WorkerCount; } // Slice input, output for lines static void SlicePerLines(const _cmsWorkSlice* master, cmsInt32Number nslices, cmsInt32Number LinesPerSlice, _cmsWorkSlice slices[]) { cmsInt32Number i; cmsInt32Number TotalLines = master ->LineCount; for (i = 0; i < nslices; i++) { const cmsUInt8Number* PtrInput = master->InputBuffer; cmsUInt8Number* PtrOutput = master->OutputBuffer; cmsInt32Number lines = minimum(LinesPerSlice, TotalLines); memcpy(&slices[i], master, sizeof(_cmsWorkSlice)); slices[i].InputBuffer = PtrInput + i * LinesPerSlice * master->Stride->BytesPerLineIn; slices[i].OutputBuffer = PtrOutput + i * LinesPerSlice * master->Stride->BytesPerLineOut; slices[i].LineCount = lines; TotalLines -= lines; } // Add left lines because rounding if (nslices > 0) slices[nslices - 1].LineCount += TotalLines; } // Per pixels on big blocks of one line static void SlicePerPixels(const _cmsWorkSlice* master, cmsInt32Number nslices, cmsInt32Number PixelsPerSlice, _cmsWorkSlice slices[]) { cmsInt32Number i; cmsInt32Number TotalPixels = master->PixelsPerLine; // As this works on one line only cmsUInt32Number PixelSpacingIn = PixelSpacing(cmsGetTransformInputFormat((cmsHTRANSFORM)master->CMMcargo)); cmsUInt32Number PixelSpacingOut = PixelSpacing(cmsGetTransformOutputFormat((cmsHTRANSFORM)master->CMMcargo)); for (i = 0; i < nslices; i++) { const cmsUInt8Number* PtrInput = master->InputBuffer; cmsUInt8Number* PtrOutput = master->OutputBuffer; cmsInt32Number pixels = minimum(PixelsPerSlice, TotalPixels); memcpy(&slices[i], master, sizeof(_cmsWorkSlice)); slices[i].InputBuffer = PtrInput + i * PixelsPerSlice * PixelSpacingIn; slices[i].OutputBuffer = PtrOutput + i * PixelsPerSlice * PixelSpacingOut; slices[i].PixelsPerLine = pixels; TotalPixels -= pixels; } // Add left pixels because rounding if (nslices > 0) slices[nslices - 1].PixelsPerLine += TotalPixels; } // If multiline, assign a number of lines to each thread. This works on chunky and planar. Stride parameters // are not changed. In the case of one line, stride chunky is not used and stride planar keeps same. cmsBool _cmsThrSplitWork(const _cmsWorkSlice* master, cmsInt32Number nslices, _cmsWorkSlice slices[]) { // Check parameters if (master->PixelsPerLine == 0 || master->Stride->BytesPerLineIn == 0 || master->Stride->BytesPerLineOut == 0) return FALSE; // Do the splitting depending on lines if (master->LineCount <= 1) { cmsInt32Number PixelsPerWorker = master->PixelsPerLine / nslices; if (PixelsPerWorker <= 0) return FALSE; else SlicePerPixels(master, nslices, PixelsPerWorker, slices); } else { cmsInt32Number LinesPerWorker = master->LineCount / nslices; if (LinesPerWorker <= 0) return FALSE; else SlicePerLines(master, nslices, LinesPerWorker, slices); } return TRUE; }lcms2-2.19.1/plugins/threaded/src/.deps/0000755000175000017500000000000015176574562016721 5ustar martimartilcms2-2.19.1/plugins/threaded/src/Makefile.in0000644000175000017500000005524515176574547017773 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms2_threaded plugin # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/threaded/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = liblcms2_threaded_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(top_builddir)/src/liblcms2.la am_liblcms2_threaded_la_OBJECTS = threaded_split.lo threaded_core.lo \ threaded_main.lo threaded_scheduler.lo liblcms2_threaded_la_OBJECTS = $(am_liblcms2_threaded_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = liblcms2_threaded_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(liblcms2_threaded_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/threaded_core.Plo \ ./$(DEPDIR)/threaded_main.Plo \ ./$(DEPDIR)/threaded_scheduler.Plo \ ./$(DEPDIR)/threaded_split.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblcms2_threaded_la_SOURCES) DIST_SOURCES = $(liblcms2_threaded_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = ${prefix}/include infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2_threaded.la AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include liblcms2_threaded_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_threaded_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la liblcms2_threaded_la_SOURCES = threaded_split.c threaded_core.c threaded_main.c threaded_scheduler.c threaded_internal.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/threaded/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -$(am__rm_f) $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ echo rm -f $${locs}; \ $(am__rm_f) $${locs} liblcms2_threaded.la: $(liblcms2_threaded_la_OBJECTS) $(liblcms2_threaded_la_DEPENDENCIES) $(EXTRA_liblcms2_threaded_la_DEPENDENCIES) $(AM_V_CCLD)$(liblcms2_threaded_la_LINK) -rpath $(libdir) $(liblcms2_threaded_la_OBJECTS) $(liblcms2_threaded_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_core.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_main.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_scheduler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_split.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/threaded_core.Plo -rm -f ./$(DEPDIR)/threaded_main.Plo -rm -f ./$(DEPDIR)/threaded_scheduler.Plo -rm -f ./$(DEPDIR)/threaded_split.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/threaded_core.Plo -rm -f ./$(DEPDIR)/threaded_main.Plo -rm -f ./$(DEPDIR)/threaded_scheduler.Plo -rm -f ./$(DEPDIR)/threaded_split.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/threaded/testbed/0000755000175000017500000000000015176574562016553 5ustar martimartilcms2-2.19.1/plugins/threaded/testbed/meson.build0000644000175000017500000000052015176573557020715 0ustar martimartithreaded_testbed_sources = files( 'threaded_testbed.c', ) threaded_testbed = executable( 'threaded_testbed', threaded_testbed_sources, dependencies: [liblcms2_threaded_dep, liblcms2_dep], c_args: cargs + ['-DPROFILES_DIR="@0@"'.format(profiles_dir / '')], ) test( 'threaded_testbed', threaded_testbed, timeout: 600, ) lcms2-2.19.1/plugins/threaded/testbed/threaded_testbed.c0000644000175000017500000006753215176573557022231 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System, multithreaded extensions // Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved // // 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 . // //--------------------------------------------------------------------------------- #include "threaded_internal.h" #include #include #include // On Visual Studio, use debug CRT #ifdef _MSC_VER # include "crtdbg.h" #define HAVE_TIMESPEC_GET 1 #endif #ifndef PROFILES_DIR #define PROFILES_DIR "../../test_profiles/" #endif #define FLAGS cmsFLAGS_NOOPTIMIZE // A fast way to convert from/to 16 <-> 8 bits #define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) #define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF) // Some pixel representations typedef struct { cmsUInt8Number r, g, b; } Scanline_rgb8bits; typedef struct { cmsUInt8Number r, g, b, a; } Scanline_rgba8bits; typedef struct { cmsUInt8Number c, m, y, k; } Scanline_cmyk8bits; typedef struct { cmsUInt16Number r, g, b; } Scanline_rgb16bits; typedef struct { cmsUInt16Number r, g, b, a; } Scanline_rgba16bits; typedef struct { cmsUInt16Number c, m, y, k; } Scanline_cmyk16bits; static struct timespec start, finish; cmsINLINE void MeasureTimeStart(void) { #if defined(HAVE_TIMESPEC_GET) timespec_get(&start, TIME_UTC); #else clock_gettime(CLOCK_MONOTONIC, &start); #endif } cmsINLINE double MeasureTimeStop(void) { double elapsed; #if defined(HAVE_TIMESPEC_GET) timespec_get(&finish, TIME_UTC); #else clock_gettime(CLOCK_MONOTONIC, &finish); #endif elapsed = ((double) finish.tv_sec - start.tv_sec); elapsed += ((double) finish.tv_nsec - start.tv_nsec) / 1000000000.0; return elapsed; } // A flushed printf static void trace(const char* frm, ...) { va_list args; va_start(args, frm); vfprintf(stderr, frm, args); fflush(stderr); va_end(args); } // The callback function used by cmsSetLogErrorHandler() static void FatalErrorQuit(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { UNUSED_PARAMETER(ContextID); UNUSED_PARAMETER(ErrorCode); trace("** Fatal error: %s\n", Text); exit(1); } // Rise an error and exit static void Fail(const char* frm, ...) { char ReasonToFailBuffer[1024]; va_list args; va_start(args, frm); vsprintf(ReasonToFailBuffer, frm, args); FatalErrorQuit(0, 0, ReasonToFailBuffer); // unreachable va_end(args); } // Creates a fake profile that only has a curve. Used in several places static cmsHPROFILE CreateCurves(void) { cmsToneCurve* Gamma = cmsBuildGamma(0, 1.1); cmsToneCurve* Transfer[3]; cmsHPROFILE h; Transfer[0] = Transfer[1] = Transfer[2] = Gamma; h = cmsCreateLinearizationDeviceLink(cmsSigRgbData, Transfer); cmsFreeToneCurve(Gamma); return h; } // -------------------------------------------------------------------------------------------------- // A C C U R A C Y C H E C K S // -------------------------------------------------------------------------------------------------- // Check change format feature static void CheckChangeFormat(void) { cmsHPROFILE hsRGB, hLab; cmsHTRANSFORM xform; cmsUInt8Number rgb8[3] = { 10, 120, 40 }; cmsUInt16Number rgb16[3] = { 10* 257, 120*257, 40*257 }; cmsUInt16Number lab16_1[3], lab16_2[3]; trace("Checking change format feature..."); hsRGB = cmsCreate_sRGBProfile(); hLab = cmsCreateLab4Profile(NULL); xform = cmsCreateTransform(hsRGB, TYPE_RGB_16, hLab, TYPE_Lab_16, INTENT_PERCEPTUAL, FLAGS); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); cmsDoTransform(xform, rgb16, lab16_1, 1); cmsChangeBuffersFormat(xform, TYPE_RGB_8, TYPE_Lab_16); cmsDoTransform(xform, rgb8, lab16_2, 1); cmsDeleteTransform(xform); if (memcmp(lab16_1, lab16_2, sizeof(lab16_1)) != 0) Fail("Change format failed!"); trace("Ok\n"); } // Next test checks results of optimized 8 bits versus raw 8 bits. static void TryAllValues8bits(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsContext Raw = cmsCreateContext(NULL, NULL); cmsContext Plugin = cmsCreateContext(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0), NULL); Scanline_rgba8bits* bufferIn; Scanline_rgba8bits* bufferRawOut; Scanline_rgba8bits* bufferPluginOut; int r, g, b; int j; cmsUInt32Number npixels = 256 * 256 * 256; cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xformRaw == NULL || xformPlugin == NULL) { Fail("NULL transforms on check float conversions"); } // Again, no checking on mem alloc because this is just a test bufferIn = (Scanline_rgba8bits*)malloc(npixels * sizeof(Scanline_rgba8bits)); bufferRawOut = (Scanline_rgba8bits*)malloc(npixels * sizeof(Scanline_rgba8bits)); bufferPluginOut = (Scanline_rgba8bits*)malloc(npixels * sizeof(Scanline_rgba8bits)); // Same input to both transforms j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { bufferIn[j].r = (cmsUInt8Number) r; bufferIn[j].g = (cmsUInt8Number) g; bufferIn[j].b = (cmsUInt8Number) b; bufferIn[j].a = 0xff; j++; } // Different transforms, different output buffers cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); // Lets compare results j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { if (bufferRawOut[j].r != bufferPluginOut[j].r || bufferRawOut[j].g != bufferPluginOut[j].g || bufferRawOut[j].b != bufferPluginOut[j].b || bufferRawOut[j].a != bufferPluginOut[j].a) Fail( "Conversion failed at [%x %x %x %x] (%x %x %x %x) != (%x %x %x %x)", bufferIn[j].r, bufferIn[j].g, bufferIn[j].b, bufferIn[j].a, bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); j++; } free(bufferIn); free(bufferRawOut); free(bufferPluginOut); cmsDeleteTransform(xformRaw); cmsDeleteTransform(xformPlugin); cmsDeleteContext(Plugin); cmsDeleteContext(Raw); } static void CheckAccuracy8Bits(void) { trace("Checking accuracy of 8 bits CLUT..."); TryAllValues8bits(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); trace("OK\n"); } // Next test checks results of optimized 16 bits versus raw 16 bits. static void TryAllValues16bits(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsContext Raw = cmsCreateContext(NULL, NULL); cmsContext Plugin = cmsCreateContext(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0), NULL); Scanline_rgba16bits* bufferIn; Scanline_rgba16bits* bufferRawOut; Scanline_rgba16bits* bufferPluginOut; int r, g, b; int j; cmsUInt32Number npixels = 256 * 256 * 256; cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); if (xformRaw == NULL || xformPlugin == NULL) { Fail("NULL transforms on check float conversions"); } // Again, no checking on mem alloc because this is just a test bufferIn = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); bufferRawOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); bufferPluginOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); // Same input to both transforms j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { bufferIn[j].r = FROM_8_TO_16(r); bufferIn[j].g = FROM_8_TO_16(g); bufferIn[j].b = FROM_8_TO_16(b); bufferIn[j].a = 0xffff; j++; } // Different transforms, different output buffers cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); // Lets compare results j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { if (bufferRawOut[j].r != bufferPluginOut[j].r || bufferRawOut[j].g != bufferPluginOut[j].g || bufferRawOut[j].b != bufferPluginOut[j].b || bufferRawOut[j].a != bufferPluginOut[j].a) Fail( "Conversion failed at [%x %x %x %x] (%x %x %x %x) != (%x %x %x %x)", bufferIn[j].r, bufferIn[j].g, bufferIn[j].b, bufferIn[j].a, bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); j++; } free(bufferIn); free(bufferRawOut); free(bufferPluginOut); cmsDeleteTransform(xformRaw); cmsDeleteTransform(xformPlugin); cmsDeleteContext(Plugin); cmsDeleteContext(Raw); } static void CheckAccuracy16Bits(void) { // CLUT should be as 16 bits or better trace("Checking accuracy of 16 bits CLUT..."); TryAllValues16bits(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); trace("OK\n"); } // -------------------------------------------------------------------------------------------------- // P E R F O R M A N C E C H E C K S // -------------------------------------------------------------------------------------------------- static cmsFloat64Number MPixSec(cmsFloat64Number seconds) { return (256.0 * 256.0 * 256.0) / (1024.0*1024.0*seconds); } typedef cmsFloat64Number(*perf_fn)(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut); static void PerformanceHeader(void) { trace(" MPixel/sec. MByte/sec.\n"); } static cmsHPROFILE loadProfile(const char* name) { if (*name == '*') { if (strcmp(name, "*lab") == 0) { return cmsCreateLab4Profile(NULL); } else if (strcmp(name, "*xyz") == 0) { return cmsCreateXYZProfile(); } else if (strcmp(name, "*curves") == 0) { return CreateCurves(); } else Fail("Unknown builtin '%s'", name); } return cmsOpenProfileFromFile(name, "r"); } static cmsFloat64Number Performance(const char* Title, perf_fn fn, cmsContext ct, const char* inICC, const char* outICC, size_t sz, cmsFloat64Number prev) { cmsHPROFILE hlcmsProfileIn = loadProfile(inICC); cmsHPROFILE hlcmsProfileOut = loadProfile(outICC); cmsFloat64Number n = fn(ct, hlcmsProfileIn, hlcmsProfileOut); trace("%-30s: ", Title); fflush(stdout); trace("%-12.2f %-12.2f", n, n * sz); if (prev > 0.0) { cmsFloat64Number imp = n / prev; if (imp > 1) trace(" (x %-2.1f)", imp); } trace("\n"); fflush(stdout); return n; } static void ComparativeCt(cmsContext ct1, cmsContext ct2, const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) { cmsHPROFILE hlcmsProfileIn; cmsHPROFILE hlcmsProfileOut; if (inICC == NULL) hlcmsProfileIn = CreateCurves(); else hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); if (outICC == NULL) hlcmsProfileOut = CreateCurves(); else hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); cmsFloat64Number n1 = fn1(ct1, hlcmsProfileIn, hlcmsProfileOut); if (inICC == NULL) hlcmsProfileIn = CreateCurves(); else hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); if (outICC == NULL) hlcmsProfileOut = CreateCurves(); else hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); cmsFloat64Number n2 = fn2(ct2, hlcmsProfileIn, hlcmsProfileOut); trace("%-30s: ", Title); fflush(stdout); trace("%-12.2f %-12.2f\n", n1, n2); } static void Comparative(const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) { ComparativeCt(0, 0, Title, fn1, fn2, inICC, outICC); } // The worst case is used, no cache and all rgb combinations static cmsFloat64Number SpeedTest8bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb8bits* In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, INTENT_PERCEPTUAL, FLAGS|cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgb8bits); In = (Scanline_rgb8bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt8Number)r; In[j].g = (cmsUInt8Number)g; In[j].b = (cmsUInt8Number)b; j++; } MeasureTimeStart(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = MeasureTimeStop(); free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest8bitsRGBA(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgba8bits* In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, FLAGS|cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgba8bits); In = (Scanline_rgba8bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt8Number)r; In[j].g = (cmsUInt8Number)g; In[j].b = (cmsUInt8Number)b; In[j].a = 0; j++; } MeasureTimeStart(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = MeasureTimeStop(); free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } // The worst case is used, no cache and all rgb combinations static cmsFloat64Number SpeedTest16bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb16bits *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_rgb16bits); In = (Scanline_rgb16bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].r = (cmsUInt16Number)FROM_8_TO_16(r); In[j].g = (cmsUInt16Number)FROM_8_TO_16(g); In[j].b = (cmsUInt16Number)FROM_8_TO_16(b); j++; } MeasureTimeStart(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = MeasureTimeStop(); free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest16bitsCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_cmyk16bits* In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_16, hlcmsProfileOut, TYPE_CMYK_16, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256 * 256 * 256 * sizeof(Scanline_cmyk16bits); In = (Scanline_cmyk16bits*)malloc(Mb); j = 0; for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In[j].c = (cmsUInt16Number)r; In[j].m = (cmsUInt16Number)g; In[j].y = (cmsUInt16Number)b; In[j].k = (cmsUInt16Number)r; j++; } MeasureTimeStart(); cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); diff = MeasureTimeStop(); free(In); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static void SpeedTest8(void) { cmsContext noPlugin = cmsCreateContext(0, 0); cmsFloat64Number t[10]; trace("\n\n"); trace("P E R F O R M A N C E T E S T S 8 B I T S (D E F A U L T)\n"); trace("==============================================================\n\n"); fflush(stdout); PerformanceHeader(); t[0] = Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), 0); t[1] = Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); t[2] = Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); t[3] = Performance("8 bits on curves ", SpeedTest8bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb8bits), 0); // Note that context 0 has the plug-in installed trace("\n\n"); trace("P E R F O R M A N C E T E S T S 8 B I T S (P L U G I N)\n"); trace("===========================================================\n\n"); fflush(stdout); PerformanceHeader(); Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), t[0]); Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[1]); Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[2]); Performance("8 bits on curves ", SpeedTest8bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb8bits), t[3]); cmsDeleteContext(noPlugin); } static void SpeedTest16(void) { cmsContext noPlugin = cmsCreateContext(0, 0); cmsFloat64Number t[10]; trace("\n\n"); trace("P E R F O R M A N C E T E S T S 1 6 B I T S (D E F A U L T)\n"); trace("=================================================================\n\n"); PerformanceHeader(); t[0] = Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), 0); t[1] = Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); t[2] = Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); t[3] = Performance("16 bits on curves ", SpeedTest16bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb16bits), 0); t[4] = Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, noPlugin, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), 0); trace("\n\n"); trace("P E R F O R M A N C E T E S T S 1 6 B I T S (P L U G I N)\n"); trace("===============================================================\n\n"); PerformanceHeader(); Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), t[0]); Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), t[1]); Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), t[2]); Performance("16 bits on curves ", SpeedTest16bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb16bits), t[3]); Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), t[4]); cmsDeleteContext(noPlugin); } typedef struct { Scanline_rgba8bits pixels[256][256]; cmsUInt8Number padding[4]; } padded_line; typedef struct { padded_line line[256]; } big_bitmap; static cmsFloat64Number SpeedTest8bitDoTransform(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; big_bitmap* In; big_bitmap* Out; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); // Our test bitmap is 256 x 256 padded lines Mb = sizeof(big_bitmap); In = (big_bitmap*)malloc(Mb); Out = (big_bitmap*)malloc(Mb); for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In->line[r].pixels[g][b].r = (cmsUInt8Number)r; In->line[r].pixels[g][b].g = (cmsUInt8Number)g; In->line[r].pixels[g][b].b = (cmsUInt8Number)b; In->line[r].pixels[g][b].a = 0; } MeasureTimeStart(); for (j = 0; j < 256; j++) { cmsDoTransform(hlcmsxform, In->line[j].pixels, Out->line[j].pixels, 256 * 256); } diff = MeasureTimeStop(); free(In); free(Out); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static cmsFloat64Number SpeedTest8bitLineStride(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; big_bitmap* In; big_bitmap* Out; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Fail("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); // Our test bitmap is 256 x 256 padded lines Mb = sizeof(big_bitmap); In = (big_bitmap*)malloc(Mb); Out = (big_bitmap*)malloc(Mb); for (r = 0; r < 256; r++) for (g = 0; g < 256; g++) for (b = 0; b < 256; b++) { In->line[r].pixels[g][b].r = (cmsUInt8Number)r; In->line[r].pixels[g][b].g = (cmsUInt8Number)g; In->line[r].pixels[g][b].b = (cmsUInt8Number)b; In->line[r].pixels[g][b].a = 0; } MeasureTimeStart(); cmsDoTransformLineStride(hlcmsxform, In, Out, 256 * 256, 256, sizeof(padded_line), sizeof(padded_line), 0, 0); diff = MeasureTimeStop(); free(In); free(Out); cmsDeleteTransform(hlcmsxform); return MPixSec(diff); } static void ComparativeLineStride8bits(void) { cmsContext NoPlugin, Plugin; trace("\n\n"); trace("C O M P A R A T I V E cmsDoTransform() vs. cmsDoTransformLineStride()\n"); trace(" values given in MegaPixels per second.\n"); trace("====================================================================\n"); fflush(stdout); NoPlugin = cmsCreateContext(NULL, NULL); Plugin = cmsCreateContext(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0), NULL); ComparativeCt(NoPlugin, Plugin, "CLUT profiles ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); ComparativeCt(NoPlugin, Plugin, "CLUT 16 bits ", SpeedTest16bitsRGB, SpeedTest16bitsRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); ComparativeCt(NoPlugin, Plugin, "Matrix-Shaper ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc"); ComparativeCt(NoPlugin, Plugin, "same MatrixSh ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc"); ComparativeCt(NoPlugin, Plugin, "curves ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, NULL, NULL); cmsDeleteContext(Plugin); cmsDeleteContext(NoPlugin); } // The harness test int main() { #ifdef _MSC_VER _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif trace("Multithreaded extensions testbed - 1.1\n"); trace("Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved\n"); trace("\nInstalling error logger ... "); cmsSetLogErrorHandler(FatalErrorQuit); trace("done.\n"); trace("Installing plug-in ... "); cmsPlugin(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0)); trace("done.\n\n"); // Change format CheckChangeFormat(); // Accuracy CheckAccuracy8Bits(); CheckAccuracy16Bits(); // Check speed SpeedTest8(); SpeedTest16(); ComparativeLineStride8bits(); cmsUnregisterPlugins(); trace("\nAll tests passed OK\n"); return 0; } lcms2-2.19.1/plugins/threaded/testbed/Makefile.am0000644000175000017500000000117515176573557020616 0ustar martimarti# # Makefile for building threaded_testbed # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ -I$(top_builddir)/include check_PROGRAMS = threaded_testbed threaded_testbed_LDADD = $(builddir)/../src/liblcms2_threaded.la $(LCMS_LIB_DEPLIBS) threaded_testbed_LDFLAGS = -static @LDFLAGS@ threaded_testbed_SOURCES = threaded_testbed.c EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc check: if [ "x$(srcdir)" != "x$(builddir)" ]; then \ cp $(srcdir)/test?.icc . ; \ fi ./threaded_testbed lcms2-2.19.1/plugins/threaded/testbed/.deps/0000755000175000017500000000000015176574562017564 5ustar martimartilcms2-2.19.1/plugins/threaded/testbed/Makefile.in0000644000175000017500000004671715176574547020642 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building threaded_testbed # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = threaded_testbed$(EXEEXT) subdir = plugins/threaded/testbed ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_threaded_testbed_OBJECTS = threaded_testbed.$(OBJEXT) threaded_testbed_OBJECTS = $(am_threaded_testbed_OBJECTS) am__DEPENDENCIES_1 = threaded_testbed_DEPENDENCIES = \ $(builddir)/../src/liblcms2_threaded.la $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = threaded_testbed_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(threaded_testbed_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/threaded_testbed.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(threaded_testbed_SOURCES) DIST_SOURCES = $(threaded_testbed_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ -I$(top_builddir)/include threaded_testbed_LDADD = $(builddir)/../src/liblcms2_threaded.la $(LCMS_LIB_DEPLIBS) threaded_testbed_LDFLAGS = -static @LDFLAGS@ threaded_testbed_SOURCES = threaded_testbed.c EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/testbed/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/threaded/testbed/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) threaded_testbed$(EXEEXT): $(threaded_testbed_OBJECTS) $(threaded_testbed_DEPENDENCIES) $(EXTRA_threaded_testbed_DEPENDENCIES) @rm -f threaded_testbed$(EXEEXT) $(AM_V_CCLD)$(threaded_testbed_LINK) $(threaded_testbed_OBJECTS) $(threaded_testbed_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_testbed.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/threaded_testbed.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/threaded_testbed.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile check: if [ "x$(srcdir)" != "x$(builddir)" ]; then \ cp $(srcdir)/test?.icc . ; \ fi ./threaded_testbed # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/threaded/Makefile.in0000644000175000017500000004627515176574547017207 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/threaded ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src include testbed all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/threaded/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/Makefile.am0000644000175000017500000000003615176573557015377 0ustar martimartiSUBDIRS = fast_float threaded lcms2-2.19.1/plugins/Makefile.in0000644000175000017500000004624215176574547015421 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = fast_float threaded all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/plugins/Makefile0000644000175000017500000004707615176574553015017 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # plugins/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/lcms2 pkgincludedir = $(includedir)/lcms2 pkglibdir = $(libdir)/lcms2 pkglibexecdir = $(libexecdir)/lcms2 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = x86_64-pc-linux-gnu host_triplet = x86_64-pc-linux-gnu subdir = plugins ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = ${SHELL} '/home/marti/lcms2-2.19.1/missing' aclocal-1.18 AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AR = ar AS = as AUTOCONF = ${SHELL} '/home/marti/lcms2-2.19.1/missing' autoconf AUTOHEADER = ${SHELL} '/home/marti/lcms2-2.19.1/missing' autoheader AUTOMAKE = ${SHELL} '/home/marti/lcms2-2.19.1/missing' automake-1.18 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -fvisibility=hidden -pthread CPP = gcc -E CPPFLAGS = CSCOPE = cscope CTAGS = ctags CXX = g++ CXXCPP = g++ -E CXXDEPMODE = depmode=gcc3 CXXFLAGS = -g -O2 -pthread CYGPATH_W = echo DEFS = -DPACKAGE_NAME=\"lcms2\" -DPACKAGE_TARNAME=\"lcms2\" -DPACKAGE_VERSION=\"2.19\" -DPACKAGE_STRING=\"lcms2\ 2.19\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_FUNC_ATTRIBUTE_VISIBILITY=1 -DHAVE_GMTIME_R=1 -DHAVE_PTHREAD_PRIO_INHERIT=1 -DHAVE_PTHREAD=1 -DHasTHREADS=1 -DHasJPEG=1 -DHasZLIB=1 -DHasTIFF=1 -DHAVE_TIFFCONF_H=1 DEPDIR = .deps DLLTOOL = false DSYMUTIL = DUMPBIN = ECHO_C = ECHO_N = -n ECHO_T = EGREP = /usr/bin/grep -E ETAGS = etags EXEEXT = FGREP = /usr/bin/grep -F FILECMD = file GREP = /usr/bin/grep INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s JPEGICC_DEPLIBS = -ljpeg -lm -lpthread LCMS_LIB_DEPLIBS = -lm -lpthread LD = /usr/bin/ld -m elf_x86_64 LDFLAGS = LIBOBJS = LIBRARY_AGE = 0 LIBRARY_CURRENT = 2 LIBRARY_REVISION = 19 LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LIBTOOL_DEPS = .//ltmain.sh LIB_JPEG = -ljpeg LIB_MATH = -lm LIB_PLUGINS = LIB_THREAD = -lpthread LIB_TIFF = -ltiff LIB_ZLIB = -lz LIPO = LN_S = ln -s LTLIBOBJS = LT_SYS_LIBRARY_PATH = MAINT = MAKEINFO = ${SHELL} '/home/marti/lcms2-2.19.1/missing' makeinfo MANIFEST_TOOL = : MKDIR_P = /usr/bin/mkdir -p NM = /usr/bin/nm -B NMEDIT = OBJDUMP = objdump OBJEXT = o OTOOL = OTOOL64 = PACKAGE = lcms2 PACKAGE_BUGREPORT = PACKAGE_NAME = lcms2 PACKAGE_STRING = lcms2 2.19 PACKAGE_TARNAME = lcms2 PACKAGE_URL = PACKAGE_VERSION = 2.19 PATH_SEPARATOR = : PTHREAD_CC = gcc PTHREAD_CFLAGS = -pthread PTHREAD_CXX = g++ PTHREAD_LIBS = -lpthread RANLIB = ranlib SED = /usr/bin/sed SET_MAKE = SHELL = /bin/sh STRIP = strip TIFFICC_DEPLIBS = -ltiff -ljpeg -lz -lm -lpthread VERSION = 2.19 abs_builddir = /home/marti/lcms2-2.19.1/plugins abs_srcdir = /home/marti/lcms2-2.19.1/plugins abs_top_builddir = /home/marti/lcms2-2.19.1 abs_top_srcdir = /home/marti/lcms2-2.19.1 ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_DUMPBIN = am__include = include am__leading_dot = . am__quote = am__rm_f_notfound = am__tar = tar --format=ustar -chf - "$$tardir" am__untar = tar -xf - am__xargs_n = xargs -n ax_pthread_config = bindir = ${exec_prefix}/bin build = x86_64-pc-linux-gnu build_alias = build_cpu = x86_64 build_os = linux-gnu build_vendor = pc builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host = x86_64-pc-linux-gnu host_alias = host_cpu = x86_64 host_os = linux-gnu host_vendor = pc htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info inline = install_sh = ${SHELL} /home/marti/lcms2-2.19.1/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} runstatedir = ${localstatedir}/run sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../ top_builddir = .. top_srcdir = .. SUBDIRS = fast_float threaded all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/src/0000755000175000017500000000000015176574562012447 5ustar martimartilcms2-2.19.1/src/lcms2.rc.in0000644000175000017500000000426715176573557014436 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2025 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include 1 VERSIONINFO FILEVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 PRODUCTVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #endif FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL { BLOCK "StringFileInfo" { BLOCK "040904e4" { VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "lcms color engine" VALUE "FileVersion", @LCMS2_VERSION@ VALUE "InternalName", "lcms2" VALUE "LegalCopyright", "Copyright (C) Marti Maria 2025" VALUE "OriginalFilename", "lcms2.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", @LCMS2_VERSION@ } } BLOCK "VarFileInfo" { VALUE "Translation", 0x409, 1252 } } lcms2-2.19.1/src/cmsalpha.c0000644000175000017500000004472415176573557014421 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Alpha copy ------------------------------------------------------------------------------------------------------------------ // This macro return words stored as big endian #define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) // Floor to byte, taking care of saturation cmsINLINE cmsUInt8Number _cmsQuickSaturateByte(cmsFloat64Number d) { d += 0.5; if (d <= 0) return 0; if (d >= 255.0) return 255; return (cmsUInt8Number) _cmsQuickFloorWord(d); } // Return the size in bytes of a given formatter static cmsUInt32Number trueBytesSize(cmsUInt32Number Format) { cmsUInt32Number fmt_bytes = T_BYTES(Format); // For double, the T_BYTES field returns zero if (fmt_bytes == 0) return sizeof(double); // Otherwise, it is already correct for all formats return fmt_bytes; } // Several format converters typedef void(*cmsFormatterAlphaFn)(void* dst, const void* src); // From 8 static void copy8(void* dst, const void* src) { memmove(dst, src, 1); } static void from8to16(void* dst, const void* src) { cmsUInt8Number n = *(cmsUInt8Number*)src; *(cmsUInt16Number*) dst = (cmsUInt16Number) FROM_8_TO_16(n); } static void from8to16SE(void* dst, const void* src) { cmsUInt8Number n = *(cmsUInt8Number*)src; *(cmsUInt16Number*)dst = CHANGE_ENDIAN(FROM_8_TO_16(n)); } static void from8toFLT(void* dst, const void* src) { *(cmsFloat32Number*)dst = (cmsFloat32Number) (*(cmsUInt8Number*)src) / 255.0f; } static void from8toDBL(void* dst, const void* src) { *(cmsFloat64Number*)dst = (cmsFloat64Number) (*(cmsUInt8Number*)src) / 255.0; } static void from8toHLF(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = (*(cmsUInt8Number*)src) / 255.0f; *(cmsUInt16Number*)dst = _cmsFloat2Half(n); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } // From 16 static void from16to8(void* dst, const void* src) { cmsUInt16Number n = *(cmsUInt16Number*)src; *(cmsUInt8Number*) dst = FROM_16_TO_8(n); } static void from16SEto8(void* dst, const void* src) { cmsUInt16Number n = *(cmsUInt16Number*)src; *(cmsUInt8Number*)dst = FROM_16_TO_8(CHANGE_ENDIAN(n)); } static void copy16(void* dst, const void* src) { memmove(dst, src, 2); } static void from16to16(void* dst, const void* src) { cmsUInt16Number n = *(cmsUInt16Number*)src; *(cmsUInt16Number*)dst = CHANGE_ENDIAN(n); } static void from16toFLT(void* dst, const void* src) { *(cmsFloat32Number*)dst = (*(cmsUInt16Number*)src) / 65535.0f; } static void from16SEtoFLT(void* dst, const void* src) { *(cmsFloat32Number*)dst = (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0f; } static void from16toDBL(void* dst, const void* src) { *(cmsFloat64Number*)dst = (cmsFloat64Number) (*(cmsUInt16Number*)src) / 65535.0; } static void from16SEtoDBL(void* dst, const void* src) { *(cmsFloat64Number*)dst = (cmsFloat64Number) (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0; } static void from16toHLF(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = (*(cmsUInt16Number*)src) / 65535.0f; *(cmsUInt16Number*)dst = _cmsFloat2Half(n); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } static void from16SEtoHLF(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0f; *(cmsUInt16Number*)dst = _cmsFloat2Half(n); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } // From Float static void fromFLTto8(void* dst, const void* src) { cmsFloat32Number n = *(cmsFloat32Number*)src; *(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0); } static void fromFLTto16(void* dst, const void* src) { cmsFloat32Number n = *(cmsFloat32Number*)src; *(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0); } static void fromFLTto16SE(void* dst, const void* src) { cmsFloat32Number n = *(cmsFloat32Number*)src; cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0); *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i); } static void copy32(void* dst, const void* src) { memmove(dst, src, sizeof(cmsFloat32Number)); } static void fromFLTtoDBL(void* dst, const void* src) { cmsFloat32Number n = *(cmsFloat32Number*)src; *(cmsFloat64Number*)dst = (cmsFloat64Number)n; } static void fromFLTtoHLF(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = *(cmsFloat32Number*)src; *(cmsUInt16Number*)dst = _cmsFloat2Half(n); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } // From HALF static void fromHLFto8(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); *(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } static void fromHLFto16(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); *(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } static void fromHLFto16SE(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0); *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } static void fromHLFtoFLT(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT *(cmsFloat32Number*)dst = _cmsHalf2Float(*(cmsUInt16Number*)src); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } static void fromHLFtoDBL(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT *(cmsFloat64Number*)dst = (cmsFloat64Number)_cmsHalf2Float(*(cmsUInt16Number*)src); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } // From double static void fromDBLto8(void* dst, const void* src) { cmsFloat64Number n = *(cmsFloat64Number*)src; *(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0); } static void fromDBLto16(void* dst, const void* src) { cmsFloat64Number n = *(cmsFloat64Number*)src; *(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0f); } static void fromDBLto16SE(void* dst, const void* src) { cmsFloat64Number n = *(cmsFloat64Number*)src; cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0f); *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i); } static void fromDBLtoFLT(void* dst, const void* src) { cmsFloat64Number n = *(cmsFloat64Number*)src; *(cmsFloat32Number*)dst = (cmsFloat32Number) n; } static void fromDBLtoHLF(void* dst, const void* src) { #ifndef CMS_NO_HALF_SUPPORT cmsFloat32Number n = (cmsFloat32Number) *(cmsFloat64Number*)src; *(cmsUInt16Number*)dst = _cmsFloat2Half(n); #else cmsUNUSED_PARAMETER(dst); cmsUNUSED_PARAMETER(src); #endif } static void copy64(void* dst, const void* src) { memmove(dst, src, sizeof(cmsFloat64Number)); } // Returns the position (x or y) of the formatter in the table of functions static int FormatterPos(cmsUInt32Number frm) { cmsUInt32Number b = T_BYTES(frm); if (b == 0 && T_FLOAT(frm)) return 5; // DBL #ifndef CMS_NO_HALF_SUPPORT if (b == 2 && T_FLOAT(frm)) return 3; // HLF #endif if (b == 4 && T_FLOAT(frm)) return 4; // FLT if (b == 2 && !T_FLOAT(frm)) { if (T_ENDIAN16(frm)) return 2; // 16SE else return 1; // 16 } if (b == 1 && !T_FLOAT(frm)) return 0; // 8 return -1; // not recognized } // Obtains an alpha-to-alpha function formatter static cmsFormatterAlphaFn _cmsGetFormatterAlpha(cmsContext id, cmsUInt32Number in, cmsUInt32Number out) { static const cmsFormatterAlphaFn FormattersAlpha[6][6] = { /* from 8 */ { copy8, from8to16, from8to16SE, from8toHLF, from8toFLT, from8toDBL }, /* from 16*/ { from16to8, copy16, from16to16, from16toHLF, from16toFLT, from16toDBL }, /* from 16SE*/{ from16SEto8, from16to16, copy16, from16SEtoHLF,from16SEtoFLT, from16SEtoDBL }, /* from HLF*/ { fromHLFto8, fromHLFto16, fromHLFto16SE, copy16, fromHLFtoFLT, fromHLFtoDBL }, /* from FLT*/ { fromFLTto8, fromFLTto16, fromFLTto16SE, fromFLTtoHLF, copy32, fromFLTtoDBL }, /* from DBL*/ { fromDBLto8, fromDBLto16, fromDBLto16SE, fromDBLtoHLF, fromDBLtoFLT, copy64 }}; int in_n = FormatterPos(in); int out_n = FormatterPos(out); if (in_n < 0 || out_n < 0 || in_n > 5 || out_n > 5) { cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized alpha channel width"); return NULL; } return FormattersAlpha[in_n][out_n]; } // This function computes the distance from each component to the next one in bytes. static cmsBool ComputeIncrementsForChunky(cmsUInt32Number Format, cmsUInt32Number ComponentStartingOrder[], cmsUInt32Number ComponentPointerIncrements[]) { cmsUInt32Number channels[cmsMAXCHANNELS]; cmsUInt32Number extra = T_EXTRA(Format); cmsUInt32Number nchannels = T_CHANNELS(Format); cmsUInt32Number total_chans = nchannels + extra; cmsUInt32Number i; cmsUInt32Number channelSize = trueBytesSize(Format); cmsUInt32Number pixelSize = channelSize * total_chans; // Sanity check if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS) return FALSE; memset(channels, 0, sizeof(channels)); // Separation is independent of starting point and only depends on channel size for (i = 0; i < extra; i++) ComponentPointerIncrements[i] = pixelSize; // Handle do swap for (i = 0; i < total_chans; i++) { if (T_DOSWAP(Format)) { channels[i] = total_chans - i - 1; } else { channels[i] = i; } } // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 if (T_SWAPFIRST(Format) && total_chans > 1) { cmsUInt32Number tmp = channels[0]; for (i = 0; i < total_chans-1; i++) channels[i] = channels[i + 1]; channels[total_chans - 1] = tmp; } // Handle size if (channelSize > 1) for (i = 0; i < total_chans; i++) { channels[i] *= channelSize; } for (i = 0; i < extra; i++) ComponentStartingOrder[i] = channels[i + nchannels]; return TRUE; } // On planar configurations, the distance is the stride added to any non-negative static cmsBool ComputeIncrementsForPlanar(cmsUInt32Number Format, cmsUInt32Number BytesPerPlane, cmsUInt32Number ComponentStartingOrder[], cmsUInt32Number ComponentPointerIncrements[]) { cmsUInt32Number channels[cmsMAXCHANNELS]; cmsUInt32Number extra = T_EXTRA(Format); cmsUInt32Number nchannels = T_CHANNELS(Format); cmsUInt32Number total_chans = nchannels + extra; cmsUInt32Number i; cmsUInt32Number channelSize = trueBytesSize(Format); // Sanity check if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS) return FALSE; memset(channels, 0, sizeof(channels)); // Separation is independent of starting point and only depends on channel size for (i = 0; i < extra; i++) ComponentPointerIncrements[i] = channelSize; // Handle do swap for (i = 0; i < total_chans; i++) { if (T_DOSWAP(Format)) { channels[i] = total_chans - i - 1; } else { channels[i] = i; } } // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 if (T_SWAPFIRST(Format) && total_chans > 0) { cmsUInt32Number tmp = channels[0]; for (i = 0; i < total_chans - 1; i++) channels[i] = channels[i + 1]; channels[total_chans - 1] = tmp; } // Handle size for (i = 0; i < total_chans; i++) { channels[i] *= BytesPerPlane; } for (i = 0; i < extra; i++) ComponentStartingOrder[i] = channels[i + nchannels]; return TRUE; } // Dispatcher por chunky and planar RGB static cmsBool ComputeComponentIncrements(cmsUInt32Number Format, cmsUInt32Number BytesPerPlane, cmsUInt32Number ComponentStartingOrder[], cmsUInt32Number ComponentPointerIncrements[]) { if (T_PLANAR(Format)) { return ComputeIncrementsForPlanar(Format, BytesPerPlane, ComponentStartingOrder, ComponentPointerIncrements); } else { return ComputeIncrementsForChunky(Format, ComponentStartingOrder, ComponentPointerIncrements); } } // Handles extra channels copying alpha if requested by the flags void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt32Number i, j, k; cmsUInt32Number nExtra; cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; cmsFormatterAlphaFn copyValueFn; // Make sure we need some copy if (!(p->dwOriginalFlags & cmsFLAGS_COPY_ALPHA)) return; // Exit early if in-place color-management is occurring - no need to copy extra channels to themselves. if (p->InputFormat == p->OutputFormat && in == out) return; // Make sure we have same number of alpha channels. If not, just return as this should be checked at transform creation time. nExtra = T_EXTRA(p->InputFormat); if (nExtra != T_EXTRA(p->OutputFormat)) return; // Anything to do? if (nExtra == 0) return; // Compute the increments if (!ComputeComponentIncrements(p->InputFormat, Stride->BytesPerPlaneIn, SourceStartingOrder, SourceIncrements)) return; if (!ComputeComponentIncrements(p->OutputFormat, Stride->BytesPerPlaneOut, DestStartingOrder, DestIncrements)) return; // Check for conversions 8, 16, half, float, dbl copyValueFn = _cmsGetFormatterAlpha(p->ContextID, p->InputFormat, p->OutputFormat); if (copyValueFn == NULL) return; if (nExtra == 1) { // Optimized routine for copying a single extra channel quickly cmsUInt8Number* SourcePtr; cmsUInt8Number* DestPtr; size_t SourceStrideIncrement = 0; size_t DestStrideIncrement = 0; // The loop itself for (i = 0; i < LineCount; i++) { // Prepare pointers for the loop SourcePtr = (cmsUInt8Number*)in + SourceStartingOrder[0] + SourceStrideIncrement; DestPtr = (cmsUInt8Number*)out + DestStartingOrder[0] + DestStrideIncrement; for (j = 0; j < PixelsPerLine; j++) { copyValueFn(DestPtr, SourcePtr); SourcePtr += SourceIncrements[0]; DestPtr += DestIncrements[0]; } SourceStrideIncrement += Stride->BytesPerLineIn; DestStrideIncrement += Stride->BytesPerLineOut; } } else { // General case with more than one extra channel cmsUInt8Number* SourcePtr[cmsMAXCHANNELS]; cmsUInt8Number* DestPtr[cmsMAXCHANNELS]; size_t SourceStrideIncrements[cmsMAXCHANNELS]; size_t DestStrideIncrements[cmsMAXCHANNELS]; memset(SourceStrideIncrements, 0, sizeof(SourceStrideIncrements)); memset(DestStrideIncrements, 0, sizeof(DestStrideIncrements)); // The loop itself for (i = 0; i < LineCount; i++) { // Prepare pointers for the loop for (j = 0; j < nExtra; j++) { SourcePtr[j] = (cmsUInt8Number*)in + SourceStartingOrder[j] + SourceStrideIncrements[j]; DestPtr[j] = (cmsUInt8Number*)out + DestStartingOrder[j] + DestStrideIncrements[j]; } for (j = 0; j < PixelsPerLine; j++) { for (k = 0; k < nExtra; k++) { copyValueFn(DestPtr[k], SourcePtr[k]); SourcePtr[k] += SourceIncrements[k]; DestPtr[k] += DestIncrements[k]; } } for (j = 0; j < nExtra; j++) { SourceStrideIncrements[j] += Stride->BytesPerLineIn; DestStrideIncrements[j] += Stride->BytesPerLineOut; } } } } lcms2-2.19.1/src/cmscam02.c0000644000175000017500000003356415176573557014236 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging. // ---------- Implementation -------------------------------------------- typedef struct { cmsFloat64Number XYZ[3]; cmsFloat64Number RGB[3]; cmsFloat64Number RGBc[3]; cmsFloat64Number RGBp[3]; cmsFloat64Number RGBpa[3]; cmsFloat64Number a, b, h, e, H, A, J, Q, s, t, C, M; cmsFloat64Number abC[2]; cmsFloat64Number abs[2]; cmsFloat64Number abM[2]; } CAM02COLOR; typedef struct { CAM02COLOR adoptedWhite; cmsFloat64Number LA, Yb; cmsFloat64Number F, c, Nc; cmsUInt32Number surround; cmsFloat64Number n, Nbb, Ncb, z, FL, D; cmsContext ContextID; } cmsCIECAM02; static cmsFloat64Number compute_n(cmsCIECAM02* pMod) { return (pMod -> Yb / pMod -> adoptedWhite.XYZ[1]); } static cmsFloat64Number compute_z(cmsCIECAM02* pMod) { return (1.48 + pow(pMod -> n, 0.5)); } static cmsFloat64Number computeNbb(cmsCIECAM02* pMod) { return (0.725 * pow((1.0 / pMod -> n), 0.2)); } static cmsFloat64Number computeFL(cmsCIECAM02* pMod) { cmsFloat64Number k, FL; k = 1.0 / ((5.0 * pMod->LA) + 1.0); FL = 0.2 * pow(k, 4.0) * (5.0 * pMod->LA) + 0.1 * (pow((1.0 - pow(k, 4.0)), 2.0)) * (pow((5.0 * pMod->LA), (1.0 / 3.0))); return FL; } static cmsFloat64Number computeD(cmsCIECAM02* pMod) { cmsFloat64Number D, temp; temp = 1.0 - ((1.0 / 3.6) * exp((-pMod->LA - 42) / 92.0)); D = pMod->F * temp; return D; } static CAM02COLOR XYZtoCAT02(CAM02COLOR clr) { clr.RGB[0] = (clr.XYZ[0] * 0.7328) + (clr.XYZ[1] * 0.4296) + (clr.XYZ[2] * -0.1624); clr.RGB[1] = (clr.XYZ[0] * -0.7036) + (clr.XYZ[1] * 1.6975) + (clr.XYZ[2] * 0.0061); clr.RGB[2] = (clr.XYZ[0] * 0.0030) + (clr.XYZ[1] * 0.0136) + (clr.XYZ[2] * 0.9834); return clr; } static CAM02COLOR ChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; for (i = 0; i < 3; i++) { clr.RGBc[i] = ((pMod -> adoptedWhite.XYZ[1] * (pMod->D / pMod -> adoptedWhite.RGB[i])) + (1.0 - pMod->D)) * clr.RGB[i]; } return clr; } static CAM02COLOR CAT02toHPE(CAM02COLOR clr) { cmsFloat64Number M[9]; M[0] =(( 0.38971 * 1.096124) + (0.68898 * 0.454369) + (-0.07868 * -0.009628)); M[1] =(( 0.38971 * -0.278869) + (0.68898 * 0.473533) + (-0.07868 * -0.005698)); M[2] =(( 0.38971 * 0.182745) + (0.68898 * 0.072098) + (-0.07868 * 1.015326)); M[3] =((-0.22981 * 1.096124) + (1.18340 * 0.454369) + ( 0.04641 * -0.009628)); M[4] =((-0.22981 * -0.278869) + (1.18340 * 0.473533) + ( 0.04641 * -0.005698)); M[5] =((-0.22981 * 0.182745) + (1.18340 * 0.072098) + ( 0.04641 * 1.015326)); M[6] =(-0.009628); M[7] =(-0.005698); M[8] =( 1.015326); clr.RGBp[0] = (clr.RGBc[0] * M[0]) + (clr.RGBc[1] * M[1]) + (clr.RGBc[2] * M[2]); clr.RGBp[1] = (clr.RGBc[0] * M[3]) + (clr.RGBc[1] * M[4]) + (clr.RGBc[2] * M[5]); clr.RGBp[2] = (clr.RGBc[0] * M[6]) + (clr.RGBc[1] * M[7]) + (clr.RGBc[2] * M[8]); return clr; } static CAM02COLOR NonlinearCompression(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; cmsFloat64Number temp; for (i = 0; i < 3; i++) { if (clr.RGBp[i] < 0) { temp = pow((-1.0 * pMod->FL * clr.RGBp[i] / 100.0), 0.42); clr.RGBpa[i] = (-1.0 * 400.0 * temp) / (temp + 27.13) + 0.1; } else { temp = pow((pMod->FL * clr.RGBp[i] / 100.0), 0.42); clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1; } } clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] + (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb; return clr; } static CAM02COLOR ComputeCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsFloat64Number a, b, temp, e, t, r2d, d2r; a = clr.RGBpa[0] - (12.0 * clr.RGBpa[1] / 11.0) + (clr.RGBpa[2] / 11.0); b = (clr.RGBpa[0] + clr.RGBpa[1] - (2.0 * clr.RGBpa[2])) / 9.0; r2d = (180.0 / 3.141592654); if (a == 0) { if (b == 0) clr.h = 0; else if (b > 0) clr.h = 90; else clr.h = 270; } else if (a > 0) { temp = b / a; if (b > 0) clr.h = (r2d * atan(temp)); else if (b == 0) clr.h = 0; else clr.h = (r2d * atan(temp)) + 360; } else { temp = b / a; clr.h = (r2d * atan(temp)) + 180; } d2r = (3.141592654 / 180.0); e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) * (cos((clr.h * d2r + 2.0)) + 3.8); if (clr.h < 20.14) { temp = ((clr.h + 122.47)/1.2) + ((20.14 - clr.h)/0.8); clr.H = 300 + (100*((clr.h + 122.47)/1.2)) / temp; } else if (clr.h < 90.0) { temp = ((clr.h - 20.14)/0.8) + ((90.00 - clr.h)/0.7); clr.H = (100*((clr.h - 20.14)/0.8)) / temp; } else if (clr.h < 164.25) { temp = ((clr.h - 90.00)/0.7) + ((164.25 - clr.h)/1.0); clr.H = 100 + ((100*((clr.h - 90.00)/0.7)) / temp); } else if (clr.h < 237.53) { temp = ((clr.h - 164.25)/1.0) + ((237.53 - clr.h)/1.2); clr.H = 200 + ((100*((clr.h - 164.25)/1.0)) / temp); } else { temp = ((clr.h - 237.53)/1.2) + ((360 - clr.h + 20.14)/0.8); clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp); } clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A), (pMod->c * pMod->z)); clr.Q = (4.0 / pMod->c) * pow((clr.J / 100.0), 0.5) * (pMod->adoptedWhite.A + 4.0) * pow(pMod->FL, 0.25); t = (e * pow(((a * a) + (b * b)), 0.5)) / (clr.RGBpa[0] + clr.RGBpa[1] + ((21.0 / 20.0) * clr.RGBpa[2])); clr.C = pow(t, 0.9) * pow((clr.J / 100.0), 0.5) * pow((1.64 - pow(0.29, pMod->n)), 0.73); clr.M = clr.C * pow(pMod->FL, 0.25); clr.s = 100.0 * pow((clr.M / clr.Q), 0.5); return clr; } static CAM02COLOR InverseCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsFloat64Number t, e, p1, p2, p3, p4, p5, hr, d2r; d2r = 3.141592654 / 180.0; t = pow( (clr.C / (pow((clr.J / 100.0), 0.5) * (pow((1.64 - pow(0.29, pMod->n)), 0.73)))), (1.0 / 0.9) ); e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) * (cos((clr.h * d2r + 2.0)) + 3.8); clr.A = pMod->adoptedWhite.A * pow( (clr.J / 100.0), (1.0 / (pMod->c * pMod->z))); p2 = (clr.A / pMod->Nbb) + 0.305; if ( t <= 0.0 ) { // special case from spec notes, avoid divide by zero clr.a = clr.b = 0.0; } else { hr = clr.h * d2r; p1 = e / t; p3 = 21.0 / 20.0; if (fabs(sin(hr)) >= fabs(cos(hr))) { p4 = p1 / sin(hr); clr.b = (p2 * (2.0 + p3) * (460.0 / 1403.0)) / (p4 + (2.0 + p3) * (220.0 / 1403.0) * (cos(hr) / sin(hr)) - (27.0 / 1403.0) + p3 * (6300.0 / 1403.0)); clr.a = clr.b * (cos(hr) / sin(hr)); } else { p5 = p1 / cos(hr); clr.a = (p2 * (2.0 + p3) * (460.0 / 1403.0)) / (p5 + (2.0 + p3) * (220.0 / 1403.0) - ((27.0 / 1403.0) - p3 * (6300.0 / 1403.0)) * (sin(hr) / cos(hr))); clr.b = clr.a * (sin(hr) / cos(hr)); } } clr.RGBpa[0] = ((460.0 / 1403.0) * p2) + ((451.0 / 1403.0) * clr.a) + ((288.0 / 1403.0) * clr.b); clr.RGBpa[1] = ((460.0 / 1403.0) * p2) - ((891.0 / 1403.0) * clr.a) - ((261.0 / 1403.0) * clr.b); clr.RGBpa[2] = ((460.0 / 1403.0) * p2) - ((220.0 / 1403.0) * clr.a) - ((6300.0 / 1403.0) * clr.b); return clr; } static CAM02COLOR InverseNonlinearity(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; cmsFloat64Number c1; for (i = 0; i < 3; i++) { if ((clr.RGBpa[i] - 0.1) < 0) c1 = -1; else c1 = 1; clr.RGBp[i] = c1 * (100.0 / pMod->FL) * pow(((27.13 * fabs(clr.RGBpa[i] - 0.1)) / (400.0 - fabs(clr.RGBpa[i] - 0.1))), (1.0 / 0.42)); } return clr; } static CAM02COLOR HPEtoCAT02(CAM02COLOR clr) { cmsFloat64Number M[9]; M[0] = (( 0.7328 * 1.910197) + (0.4296 * 0.370950)); M[1] = (( 0.7328 * -1.112124) + (0.4296 * 0.629054)); M[2] = (( 0.7328 * 0.201908) + (0.4296 * 0.000008) - 0.1624); M[3] = ((-0.7036 * 1.910197) + (1.6975 * 0.370950)); M[4] = ((-0.7036 * -1.112124) + (1.6975 * 0.629054)); M[5] = ((-0.7036 * 0.201908) + (1.6975 * 0.000008) + 0.0061); M[6] = (( 0.0030 * 1.910197) + (0.0136 * 0.370950)); M[7] = (( 0.0030 * -1.112124) + (0.0136 * 0.629054)); M[8] = (( 0.0030 * 0.201908) + (0.0136 * 0.000008) + 0.9834); clr.RGBc[0] = (clr.RGBp[0] * M[0]) + (clr.RGBp[1] * M[1]) + (clr.RGBp[2] * M[2]); clr.RGBc[1] = (clr.RGBp[0] * M[3]) + (clr.RGBp[1] * M[4]) + (clr.RGBp[2] * M[5]); clr.RGBc[2] = (clr.RGBp[0] * M[6]) + (clr.RGBp[1] * M[7]) + (clr.RGBp[2] * M[8]); return clr; } static CAM02COLOR InverseChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; for (i = 0; i < 3; i++) { clr.RGB[i] = clr.RGBc[i] / ((pMod->adoptedWhite.XYZ[1] * pMod->D / pMod->adoptedWhite.RGB[i]) + 1.0 - pMod->D); } return clr; } static CAM02COLOR CAT02toXYZ(CAM02COLOR clr) { clr.XYZ[0] = (clr.RGB[0] * 1.096124) + (clr.RGB[1] * -0.278869) + (clr.RGB[2] * 0.182745); clr.XYZ[1] = (clr.RGB[0] * 0.454369) + (clr.RGB[1] * 0.473533) + (clr.RGB[2] * 0.072098); clr.XYZ[2] = (clr.RGB[0] * -0.009628) + (clr.RGB[1] * -0.005698) + (clr.RGB[2] * 1.015326); return clr; } cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC) { cmsCIECAM02* lpMod; _cmsAssert(pVC != NULL); if((lpMod = (cmsCIECAM02*) _cmsMallocZero(ContextID, sizeof(cmsCIECAM02))) == NULL) { return NULL; } lpMod ->ContextID = ContextID; lpMod ->adoptedWhite.XYZ[0] = pVC ->whitePoint.X; lpMod ->adoptedWhite.XYZ[1] = pVC ->whitePoint.Y; lpMod ->adoptedWhite.XYZ[2] = pVC ->whitePoint.Z; lpMod -> LA = pVC ->La; lpMod -> Yb = pVC ->Yb; lpMod -> D = pVC ->D_value; lpMod -> surround = pVC ->surround; switch (lpMod -> surround) { case CUTSHEET_SURROUND: lpMod->F = 0.8; lpMod->c = 0.41; lpMod->Nc = 0.8; break; case DARK_SURROUND: lpMod -> F = 0.8; lpMod -> c = 0.525; lpMod -> Nc = 0.8; break; case DIM_SURROUND: lpMod -> F = 0.9; lpMod -> c = 0.59; lpMod -> Nc = 0.95; break; default: // Average surround lpMod -> F = 1.0; lpMod -> c = 0.69; lpMod -> Nc = 1.0; } lpMod -> n = compute_n(lpMod); lpMod -> z = compute_z(lpMod); lpMod -> Nbb = computeNbb(lpMod); lpMod -> FL = computeFL(lpMod); if (lpMod -> D == D_CALCULATE) { lpMod -> D = computeD(lpMod); } lpMod -> Ncb = lpMod -> Nbb; lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite); lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod); lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite); lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod); return (cmsHANDLE) lpMod; } void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel) { cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; if (lpMod) _cmsFree(lpMod ->ContextID, lpMod); } void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut) { CAM02COLOR clr; cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; _cmsAssert(lpMod != NULL); _cmsAssert(pIn != NULL); _cmsAssert(pOut != NULL); memset(&clr, 0, sizeof(clr)); clr.XYZ[0] = pIn ->X; clr.XYZ[1] = pIn ->Y; clr.XYZ[2] = pIn ->Z; clr = XYZtoCAT02(clr); clr = ChromaticAdaptation(clr, lpMod); clr = CAT02toHPE(clr); clr = NonlinearCompression(clr, lpMod); clr = ComputeCorrelates(clr, lpMod); pOut ->J = clr.J; pOut ->C = clr.C; pOut ->h = clr.h; } void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut) { CAM02COLOR clr; cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; _cmsAssert(lpMod != NULL); _cmsAssert(pIn != NULL); _cmsAssert(pOut != NULL); memset(&clr, 0, sizeof(clr)); clr.J = pIn -> J; clr.C = pIn -> C; clr.h = pIn -> h; clr = InverseCorrelates(clr, lpMod); clr = InverseNonlinearity(clr, lpMod); clr = HPEtoCAT02(clr); clr = InverseChromaticAdaptation(clr, lpMod); clr = CAT02toXYZ(clr); pOut ->X = clr.XYZ[0]; pOut ->Y = clr.XYZ[1]; pOut ->Z = clr.XYZ[2]; } lcms2-2.19.1/src/cmscnvrt.c0000644000175000017500000012564615176573557014473 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // This is the default routine for ICC-style intents. A user may decide to override it by using a plugin. // Supported intents are perceptual, relative colorimetric, saturation and ICC-absolute colorimetric static cmsPipeline* DefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //--------------------------------------------------------------------------------- // This is the entry for black-preserving K-only intents, which are non-ICC. Last profile have to be a output profile // to do the trick (no devicelinks allowed at that position) static cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //--------------------------------------------------------------------------------- // This is the entry for black-plane preserving, which are non-ICC. Again, Last profile have to be a output profile // to do the trick (no devicelinks allowed at that position) static cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //--------------------------------------------------------------------------------- // This is a structure holding implementations for all supported intents. typedef struct _cms_intents_list { cmsUInt32Number Intent; char Description[256]; cmsIntentFn Link; struct _cms_intents_list* Next; } cmsIntentsList; // Built-in intents static cmsIntentsList DefaultIntents[] = { { INTENT_PERCEPTUAL, "Perceptual", DefaultICCintents, &DefaultIntents[1] }, { INTENT_RELATIVE_COLORIMETRIC, "Relative colorimetric", DefaultICCintents, &DefaultIntents[2] }, { INTENT_SATURATION, "Saturation", DefaultICCintents, &DefaultIntents[3] }, { INTENT_ABSOLUTE_COLORIMETRIC, "Absolute colorimetric", DefaultICCintents, &DefaultIntents[4] }, { INTENT_PRESERVE_K_ONLY_PERCEPTUAL, "Perceptual preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[5] }, { INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC, "Relative colorimetric preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[6] }, { INTENT_PRESERVE_K_ONLY_SATURATION, "Saturation preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[7] }, { INTENT_PRESERVE_K_PLANE_PERCEPTUAL, "Perceptual preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[8] }, { INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC,"Relative colorimetric preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[9] }, { INTENT_PRESERVE_K_PLANE_SATURATION, "Saturation preserving black plane", BlackPreservingKPlaneIntents, NULL } }; // A pointer to the beginning of the list _cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginIntentsList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsIntentsPluginChunkType newHead = { NULL }; cmsIntentsList* entry; cmsIntentsList* Anterior = NULL; _cmsIntentsPluginChunkType* head = (_cmsIntentsPluginChunkType*) src->chunks[IntentPlugin]; // Walk the list copying all nodes for (entry = head->Intents; entry != NULL; entry = entry ->Next) { cmsIntentsList *newEntry = ( cmsIntentsList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsIntentsList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.Intents == NULL) newHead.Intents = newEntry; } ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsIntentsPluginChunkType)); } void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Copy all linked list DupPluginIntentsList(ctx, src); } else { static _cmsIntentsPluginChunkType IntentsPluginChunkType = { NULL }; ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx ->MemPool, &IntentsPluginChunkType, sizeof(_cmsIntentsPluginChunkType)); } } // Search the list for a suitable intent. Returns NULL if not found static cmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent) { _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin); cmsIntentsList* pt; for (pt = ctx -> Intents; pt != NULL; pt = pt -> Next) if (pt ->Intent == Intent) return pt; for (pt = DefaultIntents; pt != NULL; pt = pt -> Next) if (pt ->Intent == Intent) return pt; return NULL; } // Black point compensation. Implemented as a linear scaling in XYZ. Black points // should come relative to the white point. Fills an matrix/offset element m // which is organized as a 4x4 matrix. static void ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn, const cmsCIEXYZ* BlackPointOut, cmsMAT3* m, cmsVEC3* off) { cmsFloat64Number ax, ay, az, bx, by, bz, tx, ty, tz; // Now we need to compute a matrix plus an offset m and of such of // [m]*bpin + off = bpout // [m]*D50 + off = D50 // // This is a linear scaling in the form ax+b, where // a = (bpout - D50) / (bpin - D50) // b = - D50* (bpout - bpin) / (bpin - D50) tx = BlackPointIn->X - cmsD50_XYZ()->X; ty = BlackPointIn->Y - cmsD50_XYZ()->Y; tz = BlackPointIn->Z - cmsD50_XYZ()->Z; ax = (BlackPointOut->X - cmsD50_XYZ()->X) / tx; ay = (BlackPointOut->Y - cmsD50_XYZ()->Y) / ty; az = (BlackPointOut->Z - cmsD50_XYZ()->Z) / tz; bx = - cmsD50_XYZ()-> X * (BlackPointOut->X - BlackPointIn->X) / tx; by = - cmsD50_XYZ()-> Y * (BlackPointOut->Y - BlackPointIn->Y) / ty; bz = - cmsD50_XYZ()-> Z * (BlackPointOut->Z - BlackPointIn->Z) / tz; _cmsVEC3init(&m ->v[0], ax, 0, 0); _cmsVEC3init(&m ->v[1], 0, ay, 0); _cmsVEC3init(&m ->v[2], 0, 0, az); _cmsVEC3init(off, bx, by, bz); } // Approximate a blackbody illuminant based on CHAD information static cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad) { // Convert D50 across inverse CHAD to get the absolute white point cmsVEC3 d, s; cmsCIEXYZ Dest; cmsCIExyY DestChromaticity; cmsFloat64Number TempK; cmsMAT3 m1, m2; m1 = *Chad; if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; s.n[VX] = cmsD50_XYZ() -> X; s.n[VY] = cmsD50_XYZ() -> Y; s.n[VZ] = cmsD50_XYZ() -> Z; _cmsMAT3eval(&d, &m2, &s); Dest.X = d.n[VX]; Dest.Y = d.n[VY]; Dest.Z = d.n[VZ]; cmsXYZ2xyY(&DestChromaticity, &Dest); if (!cmsTempFromWhitePoint(&TempK, &DestChromaticity)) return -1.0; return TempK; } // Compute a CHAD based on a given temperature static void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp) { cmsCIEXYZ White; cmsCIExyY ChromaticityOfWhite; cmsWhitePointFromTemp(&ChromaticityOfWhite, Temp); cmsxyY2XYZ(&White, &ChromaticityOfWhite); _cmsAdaptationMatrix(Chad, NULL, &White, cmsD50_XYZ()); } // Join scalings to obtain relative input to absolute and then to relative output. // Result is stored in a 3x3 matrix static cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState, const cmsCIEXYZ* WhitePointIn, const cmsMAT3* ChromaticAdaptationMatrixIn, const cmsCIEXYZ* WhitePointOut, const cmsMAT3* ChromaticAdaptationMatrixOut, cmsMAT3* m) { cmsMAT3 Scale, m1, m2, m3, m4; // TODO: Follow Marc Mahy's recommendation to check if CHAD is same by using M1*M2 == M2*M1. If so, do nothing. // TODO: Add support for ArgyllArts tag // Adaptation state if (AdaptationState == 1.0) { // Observer is fully adapted. Keep chromatic adaptation. // That is the standard V4 behaviour _cmsVEC3init(&m->v[0], WhitePointIn->X / WhitePointOut->X, 0, 0); _cmsVEC3init(&m->v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0); _cmsVEC3init(&m->v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z); } else { // Incomplete adaptation. This is an advanced feature. _cmsVEC3init(&Scale.v[0], WhitePointIn->X / WhitePointOut->X, 0, 0); _cmsVEC3init(&Scale.v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0); _cmsVEC3init(&Scale.v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z); if (AdaptationState == 0.0) { m1 = *ChromaticAdaptationMatrixOut; _cmsMAT3per(&m2, &m1, &Scale); // m2 holds CHAD from output white to D50 times abs. col. scaling // Observer is not adapted, undo the chromatic adaptation _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut); m3 = *ChromaticAdaptationMatrixIn; if (!_cmsMAT3inverse(&m3, &m4)) return FALSE; _cmsMAT3per(m, &m2, &m4); } else { cmsMAT3 MixedCHAD; cmsFloat64Number TempSrc, TempDest, Temp; m1 = *ChromaticAdaptationMatrixIn; if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; _cmsMAT3per(&m3, &m2, &Scale); // m3 holds CHAD from input white to D50 times abs. col. scaling TempSrc = CHAD2Temp(ChromaticAdaptationMatrixIn); TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut); if (TempSrc < 0.0 || TempDest < 0.0) return FALSE; // Something went wrong if (_cmsMAT3isIdentity(&Scale) && fabs(TempSrc - TempDest) < 0.01) { _cmsMAT3identity(m); return TRUE; } Temp = (1.0 - AdaptationState) * TempDest + AdaptationState * TempSrc; // Get a CHAD from whatever output temperature to D50. This replaces output CHAD Temp2CHAD(&MixedCHAD, Temp); _cmsMAT3per(m, &m3, &MixedCHAD); } } return TRUE; } // Just to see if m matrix should be applied static cmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off) { cmsFloat64Number diff = 0; cmsMAT3 Ident; int i; if (m == NULL && off == NULL) return TRUE; // NULL is allowed as an empty layer if (m == NULL && off != NULL) return FALSE; // This is an internal error _cmsMAT3identity(&Ident); for (i=0; i < 3*3; i++) diff += fabs(((cmsFloat64Number*)m)[i] - ((cmsFloat64Number*)&Ident)[i]); for (i=0; i < 3; i++) diff += fabs(((cmsFloat64Number*)off)[i]); return (diff < 0.002); } // Compute the conversion layer static cmsBool ComputeConversion(cmsUInt32Number i, cmsHPROFILE hProfiles[], cmsUInt32Number Intent, cmsBool BPC, cmsFloat64Number AdaptationState, cmsMAT3* m, cmsVEC3* off) { int k; // m and off are set to identity and this is detected latter on _cmsMAT3identity(m); _cmsVEC3init(off, 0, 0, 0); // If intent is abs. colorimetric, if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) { cmsCIEXYZ WhitePointIn, WhitePointOut; cmsMAT3 ChromaticAdaptationMatrixIn, ChromaticAdaptationMatrixOut; if (!_cmsReadMediaWhitePoint(&WhitePointIn, hProfiles[i - 1])) return FALSE; if (!_cmsReadCHAD(&ChromaticAdaptationMatrixIn, hProfiles[i - 1])) return FALSE; if (!_cmsReadMediaWhitePoint(&WhitePointOut, hProfiles[i])) return FALSE; if (!_cmsReadCHAD(&ChromaticAdaptationMatrixOut, hProfiles[i])) return FALSE; if (!ComputeAbsoluteIntent(AdaptationState, &WhitePointIn, &ChromaticAdaptationMatrixIn, &WhitePointOut, &ChromaticAdaptationMatrixOut, m)) return FALSE; } else { // Rest of intents may apply BPC. if (BPC) { cmsCIEXYZ BlackPointIn = { 0, 0, 0}, BlackPointOut = { 0, 0, 0 }; cmsDetectBlackPoint(&BlackPointIn, hProfiles[i-1], Intent, 0); cmsDetectDestinationBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0); // If black points are equal, then do nothing if (BlackPointIn.X != BlackPointOut.X || BlackPointIn.Y != BlackPointOut.Y || BlackPointIn.Z != BlackPointOut.Z) ComputeBlackPointCompensation(&BlackPointIn, &BlackPointOut, m, off); } } // Offset should be adjusted because the encoding. We encode XYZ normalized to 0..1.0, // to do that, we divide by MAX_ENCODEABLE_XZY. The conversion stage goes XYZ -> XYZ so // we have first to convert from encoded to XYZ and then convert back to encoded. // y = Mx + Off // x = x'c // y = M x'c + Off // y = y'c; y' = y / c // y' = (Mx'c + Off) /c = Mx' + (Off / c) for (k=0; k < 3; k++) { off ->n[k] /= MAX_ENCODEABLE_XYZ; } return TRUE; } // Add a conversion stage if needed. If a matrix/offset m is given, it applies to XYZ space static cmsBool AddConversion(cmsPipeline* Result, cmsColorSpaceSignature InPCS, cmsColorSpaceSignature OutPCS, cmsMAT3* m, cmsVEC3* off) { cmsFloat64Number* m_as_dbl = (cmsFloat64Number*) m; cmsFloat64Number* off_as_dbl = (cmsFloat64Number*) off; // Handle PCS mismatches. A specialized stage is added to the LUT in such case switch (InPCS) { case cmsSigXYZData: // Input profile operates in XYZ switch (OutPCS) { case cmsSigXYZData: // XYZ -> XYZ if (!IsEmptyLayer(m, off) && !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) return FALSE; break; case cmsSigLabData: // XYZ -> Lab if (!IsEmptyLayer(m, off) && !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) return FALSE; if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID))) return FALSE; break; default: return FALSE; // Colorspace mismatch } break; case cmsSigLabData: // Input profile operates in Lab switch (OutPCS) { case cmsSigXYZData: // Lab -> XYZ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID))) return FALSE; if (!IsEmptyLayer(m, off) && !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) return FALSE; break; case cmsSigLabData: // Lab -> Lab if (!IsEmptyLayer(m, off)) { if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) || !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) || !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID))) return FALSE; } break; default: return FALSE; // Mismatch } break; // On colorspaces other than PCS, check for same space default: if (InPCS != OutPCS) return FALSE; break; } return TRUE; } // Is a given space compatible with another? static cmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature b) { // If they are same, they are compatible. if (a == b) return TRUE; // Check for MCH4 substitution of CMYK if ((a == cmsSig4colorData) && (b == cmsSigCmykData)) return TRUE; if ((a == cmsSigCmykData) && (b == cmsSig4colorData)) return TRUE; // Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other. if ((a == cmsSigXYZData) && (b == cmsSigLabData)) return TRUE; if ((a == cmsSigLabData) && (b == cmsSigXYZData)) return TRUE; return FALSE; } // Default handler for ICC-style intents static cmsPipeline* DefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsPipeline* Lut = NULL; cmsPipeline* Result; cmsHPROFILE hProfile; cmsMAT3 m; cmsVEC3 off; cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut = cmsSigLabData, CurrentColorSpace; cmsProfileClassSignature ClassSig; cmsUInt32Number i, Intent; // For safety if (nProfiles == 0) return NULL; // Allocate an empty LUT for holding the result. 0 as channel count means 'undefined' Result = cmsPipelineAlloc(ContextID, 0, 0); if (Result == NULL) return NULL; CurrentColorSpace = cmsGetColorSpace(hProfiles[0]); for (i=0; i < nProfiles; i++) { cmsBool lIsDeviceLink, lIsInput; hProfile = hProfiles[i]; ClassSig = cmsGetDeviceClass(hProfile); lIsDeviceLink = (ClassSig == cmsSigLinkClass || ClassSig == cmsSigAbstractClass ); // First profile is used as input unless devicelink or abstract if ((i == 0) && !lIsDeviceLink) { lIsInput = TRUE; } else { // Else use profile in the input direction if current space is not PCS lIsInput = (CurrentColorSpace != cmsSigXYZData) && (CurrentColorSpace != cmsSigLabData); } Intent = TheIntents[i]; if (lIsInput || lIsDeviceLink) { ColorSpaceIn = cmsGetColorSpace(hProfile); ColorSpaceOut = cmsGetPCS(hProfile); } else { ColorSpaceIn = cmsGetPCS(hProfile); ColorSpaceOut = cmsGetColorSpace(hProfile); } if (!ColorSpaceIsCompatible(ColorSpaceIn, CurrentColorSpace)) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "ColorSpace mismatch"); goto Error; } // If devicelink is found, then no custom intent is allowed and we can // read the LUT to be applied. Settings don't apply here. if (lIsDeviceLink || ((ClassSig == cmsSigNamedColorClass) && (nProfiles == 1))) { // Get the involved LUT from the profile Lut = _cmsReadDevicelinkLUT(hProfile, Intent); if (Lut == NULL) goto Error; // What about abstract profiles? if (ClassSig == cmsSigAbstractClass && i > 0) { if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error; } else { _cmsMAT3identity(&m); _cmsVEC3init(&off, 0, 0, 0); } if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error; } else { if (lIsInput) { // Input direction means non-pcs connection, so proceed like devicelinks Lut = _cmsReadInputLUT(hProfile, Intent); if (Lut == NULL) goto Error; } else { // Output direction means PCS connection. Intent may apply here Lut = _cmsReadOutputLUT(hProfile, Intent); if (Lut == NULL) goto Error; if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error; if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error; } } // Concatenate to the output LUT if (!cmsPipelineCat(Result, Lut)) goto Error; cmsPipelineFree(Lut); Lut = NULL; // Update current space CurrentColorSpace = ColorSpaceOut; } // Check for non-negatives clip if (dwFlags & cmsFLAGS_NONEGATIVES) { if (ColorSpaceOut == cmsSigGrayData || ColorSpaceOut == cmsSigRgbData || ColorSpaceOut == cmsSigCmykData) { cmsStage* clip = _cmsStageClipNegatives(Result->ContextID, cmsChannelsOfColorSpace(ColorSpaceOut)); if (clip == NULL) goto Error; if (!cmsPipelineInsertStage(Result, cmsAT_END, clip)) goto Error; } } return Result; Error: if (Lut != NULL) cmsPipelineFree(Lut); if (Result != NULL) cmsPipelineFree(Result); return NULL; cmsUNUSED_PARAMETER(dwFlags); } // Wrapper for DLL calling convention cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { return DefaultICCintents(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags); } // Black preserving intents --------------------------------------------------------------------------------------------- // Translate black-preserving intents to ICC ones static cmsUInt32Number TranslateNonICCIntents(cmsUInt32Number Intent) { switch (Intent) { case INTENT_PRESERVE_K_ONLY_PERCEPTUAL: case INTENT_PRESERVE_K_PLANE_PERCEPTUAL: return INTENT_PERCEPTUAL; case INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC: case INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC: return INTENT_RELATIVE_COLORIMETRIC; case INTENT_PRESERVE_K_ONLY_SATURATION: case INTENT_PRESERVE_K_PLANE_SATURATION: return INTENT_SATURATION; default: return Intent; } } // Sampler for Black-only preserving CMYK->CMYK transforms typedef struct { cmsPipeline* cmyk2cmyk; // The original transform cmsToneCurve* KTone; // Black-to-black tone curve } GrayOnlyParams; // Preserve black only if that is the only ink used static int BlackPreservingGrayOnlySampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { GrayOnlyParams* bp = (GrayOnlyParams*) Cargo; // If going across black only, keep black only if (In[0] == 0 && In[1] == 0 && In[2] == 0) { // TAC does not apply because it is black ink! Out[0] = Out[1] = Out[2] = 0; Out[3] = cmsEvalToneCurve16(bp->KTone, In[3]); return TRUE; } // Keep normal transform for other colors bp ->cmyk2cmyk ->Eval16Fn(In, Out, bp ->cmyk2cmyk->Data); return TRUE; } // Check whatever the profile is a CMYK->CMYK devicelink static cmsBool is_cmyk_devicelink(cmsHPROFILE hProfile) { return cmsGetDeviceClass(hProfile) == cmsSigLinkClass && cmsGetColorSpace(hProfile) == cmsSigCmykData; } // This is the entry for black-preserving K-only intents, which are non-ICC static cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { GrayOnlyParams bp; cmsPipeline* Result; cmsUInt32Number ICCIntents[256]; cmsStage* CLUT; cmsUInt32Number i, nGridPoints; cmsUInt32Number lastProfilePos; cmsUInt32Number preservationProfilesCount; cmsHPROFILE hLastProfile; // Sanity check if (nProfiles < 1 || nProfiles > 255) return NULL; // Translate black-preserving intents to ICC ones for (i=0; i < nProfiles; i++) ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]); // Trim all CMYK devicelinks at the end lastProfilePos = nProfiles - 1; hLastProfile = hProfiles[lastProfilePos]; // Skip CMYK->CMYK devicelinks on ending while (is_cmyk_devicelink(hLastProfile)) { if (lastProfilePos < 2) break; hLastProfile = hProfiles[--lastProfilePos]; } preservationProfilesCount = lastProfilePos + 1; // Check for non-cmyk profiles if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || !(cmsGetColorSpace(hLastProfile) == cmsSigCmykData || cmsGetDeviceClass(hLastProfile) == cmsSigOutputClass)) return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); // Allocate an empty LUT for holding the result Result = cmsPipelineAlloc(ContextID, 4, 4); if (Result == NULL) return NULL; memset(&bp, 0, sizeof(bp)); // Create a LUT holding normal ICC transform bp.cmyk2cmyk = DefaultICCintents(ContextID, preservationProfilesCount, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.cmyk2cmyk == NULL) goto Error; // Now, compute the tone curve bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, preservationProfilesCount, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.KTone == NULL) goto Error; // How many gridpoints are we going to use? nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags); // Create the CLUT. 16 bits CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL); if (CLUT == NULL) goto Error; // This is the one and only MPE in this LUT if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT)) goto Error; // Sample it. We cannot afford pre/post linearization this time. if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0)) goto Error; // Insert possible devicelinks at the end for (i = lastProfilePos + 1; i < nProfiles; i++) { cmsPipeline* devlink = _cmsReadDevicelinkLUT(hProfiles[i], ICCIntents[i]); if (devlink == NULL) goto Error; if (!cmsPipelineCat(Result, devlink)) goto Error; } // Get rid of xform and tone curve cmsPipelineFree(bp.cmyk2cmyk); cmsFreeToneCurve(bp.KTone); return Result; Error: if (bp.cmyk2cmyk != NULL) cmsPipelineFree(bp.cmyk2cmyk); if (bp.KTone != NULL) cmsFreeToneCurve(bp.KTone); if (Result != NULL) cmsPipelineFree(Result); return NULL; } // K Plane-preserving CMYK to CMYK ------------------------------------------------------------------------------------ typedef struct { cmsPipeline* cmyk2cmyk; // The original transform cmsHTRANSFORM hProofOutput; // Output CMYK to Lab (last profile) cmsHTRANSFORM cmyk2Lab; // The input chain cmsToneCurve* KTone; // Black-to-black tone curve cmsPipeline* LabK2cmyk; // The output profile cmsFloat64Number MaxError; cmsHTRANSFORM hRoundTrip; cmsFloat64Number MaxTAC; } PreserveKPlaneParams; // The CLUT will be stored at 16 bits, but calculations are performed at cmsFloat32Number precision static int BlackPreservingSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { int i; cmsFloat32Number Inf[4], Outf[4]; cmsFloat32Number LabK[4]; cmsFloat64Number SumCMY, SumCMYK, Error, Ratio; cmsCIELab ColorimetricLab, BlackPreservingLab; PreserveKPlaneParams* bp = (PreserveKPlaneParams*) Cargo; // Convert from 16 bits to floating point for (i=0; i < 4; i++) Inf[i] = (cmsFloat32Number) (In[i] / 65535.0); // Get the K across Tone curve LabK[3] = cmsEvalToneCurveFloat(bp ->KTone, Inf[3]); // If going across black only, keep black only if (In[0] == 0 && In[1] == 0 && In[2] == 0) { Out[0] = Out[1] = Out[2] = 0; Out[3] = _cmsQuickSaturateWord(LabK[3] * 65535.0); return TRUE; } // Try the original transform, cmsPipelineEvalFloat(Inf, Outf, bp ->cmyk2cmyk); // Store a copy of the floating point result into 16-bit for (i=0; i < 4; i++) Out[i] = _cmsQuickSaturateWord(Outf[i] * 65535.0); // Maybe K is already ok (mostly on K=0) if (fabsf(Outf[3] - LabK[3]) < (3.0 / 65535.0)) { return TRUE; } // K differ, measure and keep Lab measurement for further usage // this is done in relative colorimetric intent cmsDoTransform(bp->hProofOutput, Out, &ColorimetricLab, 1); // Is not black only and the transform doesn't keep black. // Obtain the Lab of output CMYK. After that we have Lab + K cmsDoTransform(bp ->cmyk2Lab, Outf, LabK, 1); // Obtain the corresponding CMY using reverse interpolation // (K is fixed in LabK[3]) if (!cmsPipelineEvalReverseFloat(LabK, Outf, Outf, bp ->LabK2cmyk)) { // Cannot find a suitable value, so use colorimetric xform // which is already stored in Out[] return TRUE; } // Make sure to pass through K (which now is fixed) Outf[3] = LabK[3]; // Apply TAC if needed SumCMY = (cmsFloat64Number) Outf[0] + Outf[1] + Outf[2]; SumCMYK = SumCMY + Outf[3]; if (SumCMYK > bp ->MaxTAC) { Ratio = 1 - ((SumCMYK - bp->MaxTAC) / SumCMY); if (Ratio < 0) Ratio = 0; } else Ratio = 1.0; Out[0] = _cmsQuickSaturateWord(Outf[0] * Ratio * 65535.0); // C Out[1] = _cmsQuickSaturateWord(Outf[1] * Ratio * 65535.0); // M Out[2] = _cmsQuickSaturateWord(Outf[2] * Ratio * 65535.0); // Y Out[3] = _cmsQuickSaturateWord(Outf[3] * 65535.0); // Estimate the error (this goes 16 bits to Lab DBL) cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1); Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab); if (Error > bp -> MaxError) bp->MaxError = Error; return TRUE; } // This is the entry for black-plane preserving, which are non-ICC static cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { PreserveKPlaneParams bp; cmsPipeline* Result = NULL; cmsUInt32Number ICCIntents[256]; cmsStage* CLUT; cmsUInt32Number i, nGridPoints; cmsUInt32Number lastProfilePos; cmsUInt32Number preservationProfilesCount; cmsHPROFILE hLastProfile; cmsHPROFILE hLab; // Sanity check if (nProfiles < 1 || nProfiles > 255) return NULL; // Translate black-preserving intents to ICC ones for (i=0; i < nProfiles; i++) ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]); // Trim all CMYK devicelinks at the end lastProfilePos = nProfiles - 1; hLastProfile = hProfiles[lastProfilePos]; // Skip CMYK->CMYK devicelinks on ending while (is_cmyk_devicelink(hLastProfile)) { if (lastProfilePos < 2) break; hLastProfile = hProfiles[--lastProfilePos]; } preservationProfilesCount = lastProfilePos + 1; // Check for non-cmyk profiles if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || !(cmsGetColorSpace(hLastProfile) == cmsSigCmykData || cmsGetDeviceClass(hLastProfile) == cmsSigOutputClass)) return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); // Allocate an empty LUT for holding the result Result = cmsPipelineAlloc(ContextID, 4, 4); if (Result == NULL) return NULL; memset(&bp, 0, sizeof(bp)); // We need the input LUT of the last profile, assuming this one is responsible of // black generation. This LUT will be searched in inverse order. bp.LabK2cmyk = _cmsReadInputLUT(hLastProfile, INTENT_RELATIVE_COLORIMETRIC); if (bp.LabK2cmyk == NULL) goto Cleanup; // Get total area coverage (in 0..1 domain) bp.MaxTAC = cmsDetectTAC(hLastProfile) / 100.0; if (bp.MaxTAC <= 0) goto Cleanup; // Create a LUT holding normal ICC transform bp.cmyk2cmyk = DefaultICCintents(ContextID, preservationProfilesCount, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.cmyk2cmyk == NULL) goto Cleanup; // Now the tone curve bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, preservationProfilesCount, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.KTone == NULL) goto Cleanup; // To measure the output, Last profile to Lab hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); bp.hProofOutput = cmsCreateTransformTHR(ContextID, hLastProfile, CHANNELS_SH(4)|BYTES_SH(2), hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); if ( bp.hProofOutput == NULL) goto Cleanup; // Same as anterior, but lab in the 0..1 range bp.cmyk2Lab = cmsCreateTransformTHR(ContextID, hLastProfile, FLOAT_SH(1)|CHANNELS_SH(4)|BYTES_SH(4), hLab, FLOAT_SH(1)|CHANNELS_SH(3)|BYTES_SH(4), INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); if (bp.cmyk2Lab == NULL) goto Cleanup; cmsCloseProfile(hLab); // Error estimation (for debug only) bp.MaxError = 0; // How many gridpoints are we going to use? nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags); CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL); if (CLUT == NULL) goto Cleanup; if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT)) goto Cleanup; cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0); // Insert possible devicelinks at the end for (i = lastProfilePos + 1; i < nProfiles; i++) { cmsPipeline* devlink = _cmsReadDevicelinkLUT(hProfiles[i], ICCIntents[i]); if (devlink == NULL) goto Cleanup; if (!cmsPipelineCat(Result, devlink)) goto Cleanup; } Cleanup: if (bp.cmyk2cmyk) cmsPipelineFree(bp.cmyk2cmyk); if (bp.cmyk2Lab) cmsDeleteTransform(bp.cmyk2Lab); if (bp.hProofOutput) cmsDeleteTransform(bp.hProofOutput); if (bp.KTone) cmsFreeToneCurve(bp.KTone); if (bp.LabK2cmyk) cmsPipelineFree(bp.LabK2cmyk); return Result; } // Link routines ------------------------------------------------------------------------------------------------------ // Chain several profiles into a single LUT. It just checks the parameters and then calls the handler // for the first intent in chain. The handler may be user-defined. Is up to the handler to deal with the // rest of intents in chain. A maximum of 255 profiles at time are supported, which is pretty reasonable. cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsIntentsList* Intent; // Make sure a reasonable number of profiles is provided if (nProfiles <= 0 || nProfiles > 255) { cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't link '%d' profiles", nProfiles); return NULL; } for (i=0; i < nProfiles; i++) { // Check if black point is really needed or allowed. Note that // following Adobe's document: // BPC does not apply to devicelink profiles, nor to abs colorimetric, // and applies always on V4 perceptual and saturation. if (TheIntents[i] == INTENT_ABSOLUTE_COLORIMETRIC) BPC[i] = FALSE; if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) { // Force BPC for V4 profiles in perceptual and saturation if (cmsGetEncodedICCversion(hProfiles[i]) >= 0x4000000) BPC[i] = TRUE; } } // Search for a handler. The first intent in the chain defines the handler. That would // prevent using multiple custom intents in a multiintent chain, but the behaviour of // this case would present some issues if the custom intent tries to do things like // preserve primaries. This solution is not perfect, but works well on most cases. Intent = SearchIntent(ContextID, TheIntents[0]); if (Intent == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported intent '%d'", TheIntents[0]); return NULL; } // Call the handler return Intent ->Link(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags); } // ------------------------------------------------------------------------------------------------- // Get information about available intents. nMax is the maximum space for the supplied "Codes" // and "Descriptions" the function returns the total number of intents, which may be greater // than nMax, although the matrices are not populated beyond this level. cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions) { _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin); cmsIntentsList* pt; cmsUInt32Number nIntents; for (nIntents=0, pt = DefaultIntents; pt != NULL; pt = pt -> Next) { if (nIntents < nMax) { if (Codes != NULL) Codes[nIntents] = pt ->Intent; if (Descriptions != NULL) Descriptions[nIntents] = pt ->Description; } nIntents++; } for (pt = ctx->Intents; pt != NULL; pt = pt -> Next) { if (nIntents < nMax) { if (Codes != NULL) Codes[nIntents] = pt ->Intent; if (Descriptions != NULL) Descriptions[nIntents] = pt ->Description; } nIntents++; } return nIntents; } cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions) { return cmsGetSupportedIntentsTHR(NULL, nMax, Codes, Descriptions); } // The plug-in registration. User can add new intents or override default routines cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data) { _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(id, IntentPlugin); cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data; cmsIntentsList* fl; // Do we have to reset the custom intents? if (Data == NULL) { ctx->Intents = NULL; return TRUE; } fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList)); if (fl == NULL) return FALSE; fl ->Intent = Plugin ->Intent; strncpy(fl ->Description, Plugin ->Description, sizeof(fl ->Description)-1); fl ->Description[sizeof(fl ->Description)-1] = 0; fl ->Link = Plugin ->Link; fl ->Next = ctx ->Intents; ctx ->Intents = fl; return TRUE; } lcms2-2.19.1/src/cmsgamma.c0000644000175000017500000012676015176573557014417 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Tone curves are powerful constructs that can contain curves specified in diverse ways. // The curve is stored in segments, where each segment can be sampled or specified by parameters. // a 16.bit simplification of the *whole* curve is kept for optimization purposes. For float operation, // each segment is evaluated separately. Plug-ins may be used to define new parametric schemes, // each plug-in may define up to MAX_TYPES_IN_LCMS_PLUGIN functions types. For defining a function, // the plug-in should provide the type id, how many parameters each type has, and a pointer to // a procedure that evaluates the function. In the case of reverse evaluation, the evaluator will // be called with the type id as a negative value, and a sampled version of the reversed curve // will be built. // ----------------------------------------------------------------- Implementation // Maxim number of nodes #define MAX_NODES_IN_CURVE 4097 #define MINUS_INF (-1E22F) #define PLUS_INF (+1E22F) // The list of supported parametric curves typedef struct _cmsParametricCurvesCollection_st { cmsUInt32Number nFunctions; // Number of supported functions in this chunk cmsInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function cmsParametricCurveEvaluator Evaluator; // The evaluator struct _cmsParametricCurvesCollection_st* Next; // Next in list } _cmsParametricCurvesCollection; // This is the default (built-in) evaluator static cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R); // The built-in list static _cmsParametricCurvesCollection DefaultCurves = { 10, // # of curve types { 1, 2, 3, 4, 5, 6, 7, 8, 108, 109 }, // Parametric curve ID { 1, 3, 4, 5, 7, 4, 5, 5, 1, 1 }, // Parameters by type DefaultEvalParametricFn, // Evaluator NULL // Next in chain }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginCurvesList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsCurvesPluginChunkType newHead = { NULL }; _cmsParametricCurvesCollection* entry; _cmsParametricCurvesCollection* Anterior = NULL; _cmsCurvesPluginChunkType* head = (_cmsCurvesPluginChunkType*) src->chunks[CurvesPlugin]; _cmsAssert(head != NULL); // Walk the list copying all nodes for (entry = head->ParametricCurves; entry != NULL; entry = entry ->Next) { _cmsParametricCurvesCollection *newEntry = ( _cmsParametricCurvesCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsParametricCurvesCollection)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.ParametricCurves == NULL) newHead.ParametricCurves = newEntry; } ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsCurvesPluginChunkType)); } // The allocator have to follow the chain void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsAssert(ctx != NULL); if (src != NULL) { // Copy all linked list DupPluginCurvesList(ctx, src); } else { static _cmsCurvesPluginChunkType CurvesPluginChunk = { NULL }; ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx ->MemPool, &CurvesPluginChunk, sizeof(_cmsCurvesPluginChunkType)); } } // The linked list head _cmsCurvesPluginChunkType _cmsCurvesPluginChunk = { NULL }; // As a way to install new parametric curves cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Data) { _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin); cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data; _cmsParametricCurvesCollection* fl; if (Data == NULL) { ctx -> ParametricCurves = NULL; return TRUE; } fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsParametricCurvesCollection)); if (fl == NULL) return FALSE; // Copy the parameters fl ->Evaluator = Plugin ->Evaluator; fl ->nFunctions = Plugin ->nFunctions; // Make sure no mem overwrites if (fl ->nFunctions > MAX_TYPES_IN_LCMS_PLUGIN) fl ->nFunctions = MAX_TYPES_IN_LCMS_PLUGIN; // Copy the data memmove(fl->FunctionTypes, Plugin ->FunctionTypes, fl->nFunctions * sizeof(cmsUInt32Number)); memmove(fl->ParameterCount, Plugin ->ParameterCount, fl->nFunctions * sizeof(cmsUInt32Number)); // Keep linked list fl ->Next = ctx->ParametricCurves; ctx->ParametricCurves = fl; // All is ok return TRUE; } // Search in type list, return position or -1 if not found static int IsInSet(int Type, _cmsParametricCurvesCollection* c) { int i; for (i=0; i < (int) c ->nFunctions; i++) if (abs(Type) == c ->FunctionTypes[i]) return i; return -1; } // Search for the collection which contains a specific type static _cmsParametricCurvesCollection *GetParametricCurveByType(cmsContext ContextID, int Type, int* index) { _cmsParametricCurvesCollection* c; int Position; _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin); for (c = ctx->ParametricCurves; c != NULL; c = c ->Next) { Position = IsInSet(Type, c); if (Position != -1) { if (index != NULL) *index = Position; return c; } } // If none found, revert for defaults for (c = &DefaultCurves; c != NULL; c = c ->Next) { Position = IsInSet(Type, c); if (Position != -1) { if (index != NULL) *index = Position; return c; } } return NULL; } // Low level allocate, which takes care of memory details. nEntries may be zero, and in this case // no optimization curve is computed. nSegments may also be zero in the inverse case, where only the // optimization curve is given. Both features simultaneously is an error static cmsToneCurve* AllocateToneCurveStruct(cmsContext ContextID, cmsUInt32Number nEntries, cmsUInt32Number nSegments, const cmsCurveSegment* Segments, const cmsUInt16Number* Values) { cmsToneCurve* p; cmsUInt32Number i; // We allow huge tables, which are then restricted for smoothing operations if (nEntries > 65530) { cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve of more than 65530 entries"); return NULL; } if (nEntries == 0 && nSegments == 0) { cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve with zero segments and no table"); return NULL; } // Allocate all required pointers, etc. p = (cmsToneCurve*) _cmsMallocZero(ContextID, sizeof(cmsToneCurve)); if (!p) return NULL; // In this case, there are no segments if (nSegments == 0) { p ->Segments = NULL; p ->Evals = NULL; } else { p ->Segments = (cmsCurveSegment*) _cmsCalloc(ContextID, nSegments, sizeof(cmsCurveSegment)); if (p ->Segments == NULL) goto Error; p ->Evals = (cmsParametricCurveEvaluator*) _cmsCalloc(ContextID, nSegments, sizeof(cmsParametricCurveEvaluator)); if (p ->Evals == NULL) goto Error; } p -> nSegments = nSegments; // This 16-bit table contains a limited precision representation of the whole curve and is kept for // increasing xput on certain operations. if (nEntries == 0) { p ->Table16 = NULL; } else { p ->Table16 = (cmsUInt16Number*) _cmsCalloc(ContextID, nEntries, sizeof(cmsUInt16Number)); if (p ->Table16 == NULL) goto Error; } p -> nEntries = nEntries; // Initialize members if requested if (Values != NULL && (nEntries > 0)) { for (i=0; i < nEntries; i++) p ->Table16[i] = Values[i]; } // Initialize the segments stuff. The evaluator for each segment is located and a pointer to it // is placed in advance to maximize performance. if (Segments != NULL && (nSegments > 0)) { _cmsParametricCurvesCollection *c; p ->SegInterp = (cmsInterpParams**) _cmsCalloc(ContextID, nSegments, sizeof(cmsInterpParams*)); if (p ->SegInterp == NULL) goto Error; for (i=0; i < nSegments; i++) { // Type 0 is a special marker for table-based curves if (Segments[i].Type == 0) p ->SegInterp[i] = _cmsComputeInterpParams(ContextID, Segments[i].nGridPoints, 1, 1, NULL, CMS_LERP_FLAGS_FLOAT); memmove(&p ->Segments[i], &Segments[i], sizeof(cmsCurveSegment)); if (Segments[i].Type == 0 && Segments[i].SampledPoints != NULL) p ->Segments[i].SampledPoints = (cmsFloat32Number*) _cmsDupMem(ContextID, Segments[i].SampledPoints, sizeof(cmsFloat32Number) * Segments[i].nGridPoints); else p ->Segments[i].SampledPoints = NULL; c = GetParametricCurveByType(ContextID, Segments[i].Type, NULL); if (c != NULL) p ->Evals[i] = c ->Evaluator; } } p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS); if (p->InterpParams != NULL) return p; Error: for (i=0; i < nSegments; i++) { if (p ->Segments && p ->Segments[i].SampledPoints) _cmsFree(ContextID, p ->Segments[i].SampledPoints); if (p ->SegInterp && p ->SegInterp[i]) _cmsFree(ContextID, p ->SegInterp[i]); } if (p -> SegInterp) _cmsFree(ContextID, p -> SegInterp); if (p -> Segments) _cmsFree(ContextID, p -> Segments); if (p -> Evals) _cmsFree(ContextID, p -> Evals); if (p ->Table16) _cmsFree(ContextID, p ->Table16); _cmsFree(ContextID, p); return NULL; } // Generates a sigmoidal function with desired steepness. cmsINLINE double sigmoid_base(double k, double t) { return (1.0 / (1.0 + exp(-k * t))) - 0.5; } cmsINLINE double inverted_sigmoid_base(double k, double t) { return -log((1.0 / (t + 0.5)) - 1.0) / k; } cmsINLINE double sigmoid_factory(double k, double t) { double correction = 0.5 / sigmoid_base(k, 1); return correction * sigmoid_base(k, 2.0 * t - 1.0) + 0.5; } cmsINLINE double inverse_sigmoid_factory(double k, double t) { double correction = 0.5 / sigmoid_base(k, 1); return (inverted_sigmoid_base(k, (t - 0.5) / correction) + 1.0) / 2.0; } // Parametric Fn using floating point static cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R) { cmsFloat64Number e, Val, disc; switch (Type) { // X = Y ^ Gamma case 1: if (R < 0) { if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) Val = R; else Val = 0; } else Val = pow(R, Params[0]); break; // Type 1 Reversed: X = Y ^1/gamma case -1: if (R < 0) { if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) Val = R; else Val = 0; } else { if (fabs(Params[0]) < MATRIX_DET_TOLERANCE) Val = PLUS_INF; else Val = pow(R, 1 / Params[0]); } break; // CIE 122-1966 // Y = (aX + b)^Gamma | X >= -b/a // Y = 0 | else case 2: { if (fabs(Params[1]) < MATRIX_DET_TOLERANCE) { Val = 0; } else { disc = -Params[2] / Params[1]; if (R >= disc) { e = Params[1] * R + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = 0; } } break; // Type 2 Reversed // X = (Y ^1/g - b) / a case -2: { if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || fabs(Params[1]) < MATRIX_DET_TOLERANCE) { Val = 0; } else { if (R < 0) Val = 0; else Val = (pow(R, 1.0 / Params[0]) - Params[2]) / Params[1]; if (Val < 0) Val = 0; } } break; // IEC 61966-3 // Y = (aX + b)^Gamma + c | X <= -b/a // Y = c | else case 3: { if (fabs(Params[1]) < MATRIX_DET_TOLERANCE) { Val = 0; } else { disc = -Params[2] / Params[1]; if (disc < 0) disc = 0; if (R >= disc) { e = Params[1] * R + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[3]; else Val = 0; } else Val = Params[3]; } } break; // Type 3 reversed // X=((Y-c)^1/g - b)/a | (Y>=c) // X=-b/a | (Y= Params[3]) { e = R - Params[3]; if (e > 0) Val = (pow(e, 1 / Params[0]) - Params[2]) / Params[1]; else Val = 0; } else { Val = -Params[2] / Params[1]; } } } break; // IEC 61966-2.1 (sRGB) // Y = (aX + b)^Gamma | X >= d // Y = cX | X < d case 4: if (R >= Params[4]) { e = Params[1]*R + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = R * Params[3]; break; // Type 4 reversed // X=((Y^1/g-b)/a) | Y >= (ad+b)^g // X=Y/c | Y< (ad+b)^g case -4: { e = Params[1] * Params[4] + Params[2]; if (e < 0) disc = 0; else disc = pow(e, Params[0]); if (R >= disc) { if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || fabs(Params[1]) < MATRIX_DET_TOLERANCE) Val = 0; else Val = (pow(R, 1.0 / Params[0]) - Params[2]) / Params[1]; } else { if (fabs(Params[3]) < MATRIX_DET_TOLERANCE) Val = 0; else Val = R / Params[3]; } } break; // Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | X < d case 5: if (R >= Params[4]) { e = Params[1]*R + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[5]; else Val = Params[5]; } else Val = R*Params[3] + Params[6]; break; // Reversed type 5 // X=((Y-e)1/g-b)/a | Y >=(ad+b)^g+e), cd+f // X=(Y-f)/c | else case -5: { disc = Params[3] * Params[4] + Params[6]; if (R >= disc) { e = R - Params[5]; if (e < 0) Val = 0; else { if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || fabs(Params[1]) < MATRIX_DET_TOLERANCE) Val = 0; else Val = (pow(e, 1.0 / Params[0]) - Params[2]) / Params[1]; } } else { if (fabs(Params[3]) < MATRIX_DET_TOLERANCE) Val = 0; else Val = (R - Params[6]) / Params[3]; } } break; // Types 6,7,8 comes from segmented curves as described in ICCSpecRevision_02_11_06_Float.pdf // Type 6 is basically identical to type 5 without d // Y = (a * X + b) ^ Gamma + c case 6: e = Params[1]*R + Params[2]; // On gamma 1.0, don't clamp if (Params[0] == 1.0) { Val = e + Params[3]; } else { if (e < 0) Val = Params[3]; else Val = pow(e, Params[0]) + Params[3]; } break; // ((Y - c) ^1/Gamma - b) / a case -6: { if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || fabs(Params[1]) < MATRIX_DET_TOLERANCE) { Val = 0; } else { e = R - Params[3]; if (e < 0) Val = 0; else Val = (pow(e, 1.0 / Params[0]) - Params[2]) / Params[1]; } } break; // Y = a * log (b * X^Gamma + c) + d case 7: e = Params[2] * pow(R, Params[0]) + Params[3]; if (e <= 0) Val = Params[4]; else Val = Params[1]*log10(e) + Params[4]; break; // (Y - d) / a = log(b * X ^Gamma + c) // pow(10, (Y-d) / a) = b * X ^Gamma + c // pow((pow(10, (Y-d) / a) - c) / b, 1/g) = X case -7: { if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || fabs(Params[1]) < MATRIX_DET_TOLERANCE || fabs(Params[2]) < MATRIX_DET_TOLERANCE) { Val = 0; } else { Val = pow((pow(10.0, (R - Params[4]) / Params[1]) - Params[3]) / Params[2], 1.0 / Params[0]); } } break; //Y = a * b^(c*X+d) + e case 8: Val = (Params[0] * pow(Params[1], Params[2] * R + Params[3]) + Params[4]); break; // Y = (log((y-e) / a) / log(b) - d ) / c // a=0, b=1, c=2, d=3, e=4, case -8: disc = R - Params[4]; if (disc < 0) Val = 0; else { if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || fabs(Params[2]) < MATRIX_DET_TOLERANCE) { Val = 0; } else { Val = (log(disc / Params[0]) / log(Params[1]) - Params[3]) / Params[2]; } } break; // S-Shaped: (1 - (1-x)^1/g)^1/g case 108: if (fabs(Params[0]) < MATRIX_DET_TOLERANCE) Val = 0; else Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]); break; // y = (1 - (1-x)^1/g)^1/g // y^g = (1 - (1-x)^1/g) // 1 - y^g = (1-x)^1/g // (1 - y^g)^g = 1 - x // 1 - (1 - y^g)^g case -108: Val = 1 - pow(1 - pow(R, Params[0]), Params[0]); break; // Sigmoidals case 109: Val = sigmoid_factory(Params[0], R); break; case -109: Val = inverse_sigmoid_factory(Params[0], R); break; default: // Unsupported parametric curve. Should never reach here return 0; } return Val; } // Evaluate a segmented function for a single value. Return -Inf if no valid segment found . // If fn type is 0, perform an interpolation on the table static cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R) { int i; cmsFloat32Number Out32; cmsFloat64Number Out; for (i = (int) g->nSegments - 1; i >= 0; --i) { // Check for domain if ((R > g->Segments[i].x0) && (R <= g->Segments[i].x1)) { // Type == 0 means segment is sampled if (g->Segments[i].Type == 0) { cmsFloat32Number R1 = (cmsFloat32Number)(R - g->Segments[i].x0) / (g->Segments[i].x1 - g->Segments[i].x0); // Setup the table (TODO: clean that) g->SegInterp[i]->Table = g->Segments[i].SampledPoints; g->SegInterp[i]->Interpolation.LerpFloat(&R1, &Out32, g->SegInterp[i]); Out = (cmsFloat64Number) Out32; } else { Out = g->Evals[i](g->Segments[i].Type, g->Segments[i].Params, R); } if (isinf(Out)) return PLUS_INF; else { if (isinf(-Out)) return MINUS_INF; } return Out; } } return MINUS_INF; } // Access to estimated low-res table cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t ->nEntries; } const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t ->Table16; } // Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the // floating point description empty. cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsUInt32Number nEntries, const cmsUInt16Number Values[]) { return AllocateToneCurveStruct(ContextID, nEntries, 0, NULL, Values); } static cmsUInt32Number EntriesByGamma(cmsFloat64Number Gamma) { if (fabs(Gamma - 1.0) < 0.001) return 2; return 4096; } // Create a segmented gamma, fill the table cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsUInt32Number nSegments, const cmsCurveSegment Segments[]) { cmsUInt32Number i; cmsFloat64Number R, Val; cmsToneCurve* g; cmsUInt32Number nGridPoints = 4096; _cmsAssert(Segments != NULL); // Optimizatin for identity curves. if (nSegments == 1 && Segments[0].Type == 1) { nGridPoints = EntriesByGamma(Segments[0].Params[0]); } g = AllocateToneCurveStruct(ContextID, nGridPoints, nSegments, Segments, NULL); if (g == NULL) return NULL; // Once we have the floating point version, we can approximate a 16 bit table of 4096 entries // for performance reasons. This table would normally not be used except on 8/16 bits transforms. for (i = 0; i < nGridPoints; i++) { R = (cmsFloat64Number) i / (nGridPoints-1); Val = EvalSegmentedFn(g, R); // Round and saturate g ->Table16[i] = _cmsQuickSaturateWord(Val * 65535.0); } return g; } // Use a segmented curve to store the floating point table cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]) { cmsCurveSegment Seg[3]; // Do some housekeeping if (nEntries == 0 || values == NULL) return NULL; // A segmented tone curve should have function segments in the first and last positions // Initialize segmented curve part up to 0 to constant value = samples[0] Seg[0].x0 = MINUS_INF; Seg[0].x1 = 0; Seg[0].Type = 6; Seg[0].Params[0] = 1; Seg[0].Params[1] = 0; Seg[0].Params[2] = 0; Seg[0].Params[3] = values[0]; Seg[0].Params[4] = 0; // From zero to 1 Seg[1].x0 = 0; Seg[1].x1 = 1.0; Seg[1].Type = 0; Seg[1].nGridPoints = nEntries; Seg[1].SampledPoints = (cmsFloat32Number*) values; // Final segment is constant = lastsample Seg[2].x0 = 1.0; Seg[2].x1 = PLUS_INF; Seg[2].Type = 6; Seg[2].Params[0] = 1; Seg[2].Params[1] = 0; Seg[2].Params[2] = 0; Seg[2].Params[3] = values[nEntries-1]; Seg[2].Params[4] = 0; return cmsBuildSegmentedToneCurve(ContextID, 3, Seg); } // Parametric curves // // Parameters goes as: Curve, a, b, c, d, e, f // Type is the ICC type +1 // if type is negative, then the curve is analytically inverted cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]) { cmsCurveSegment Seg0; int Pos = 0; cmsUInt32Number size; _cmsParametricCurvesCollection* c = GetParametricCurveByType(ContextID, Type, &Pos); _cmsAssert(Params != NULL); if (c == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Invalid parametric curve type %d", Type); return NULL; } memset(&Seg0, 0, sizeof(Seg0)); Seg0.x0 = MINUS_INF; Seg0.x1 = PLUS_INF; Seg0.Type = Type; size = c->ParameterCount[Pos] * sizeof(cmsFloat64Number); memmove(Seg0.Params, Params, size); return cmsBuildSegmentedToneCurve(ContextID, 1, &Seg0); } // Build a gamma table based on gamma constant cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma) { return cmsBuildParametricToneCurve(ContextID, 1, &Gamma); } // Free all memory taken by the gamma curve void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve) { cmsContext ContextID; if (Curve == NULL) return; ContextID = Curve ->InterpParams->ContextID; _cmsFreeInterpParams(Curve ->InterpParams); if (Curve -> Table16) _cmsFree(ContextID, Curve ->Table16); if (Curve ->Segments) { cmsUInt32Number i; for (i=0; i < Curve ->nSegments; i++) { if (Curve ->Segments[i].SampledPoints) { _cmsFree(ContextID, Curve ->Segments[i].SampledPoints); } if (Curve ->SegInterp[i] != 0) _cmsFreeInterpParams(Curve->SegInterp[i]); } _cmsFree(ContextID, Curve ->Segments); _cmsFree(ContextID, Curve ->SegInterp); } if (Curve -> Evals) _cmsFree(ContextID, Curve -> Evals); _cmsFree(ContextID, Curve); } // Utility function, free 3 gamma tables void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]) { _cmsAssert(Curve != NULL); if (Curve[0] != NULL) cmsFreeToneCurve(Curve[0]); if (Curve[1] != NULL) cmsFreeToneCurve(Curve[1]); if (Curve[2] != NULL) cmsFreeToneCurve(Curve[2]); Curve[0] = Curve[1] = Curve[2] = NULL; } // Duplicate a gamma table cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In) { if (In == NULL) return NULL; return AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16); } // Joins two curves for X and Y. Curves should be monotonic. // We want to get // // y = Y^-1(X(t)) // cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X, const cmsToneCurve* Y, cmsUInt32Number nResultingPoints) { cmsToneCurve* out = NULL; cmsToneCurve* Yreversed = NULL; cmsFloat32Number t, x; cmsFloat32Number* Res = NULL; cmsUInt32Number i; _cmsAssert(X != NULL); _cmsAssert(Y != NULL); Yreversed = cmsReverseToneCurveEx(nResultingPoints, Y); if (Yreversed == NULL) goto Error; Res = (cmsFloat32Number*) _cmsCalloc(ContextID, nResultingPoints, sizeof(cmsFloat32Number)); if (Res == NULL) goto Error; //Iterate for (i=0; i < nResultingPoints; i++) { t = (cmsFloat32Number) i / (cmsFloat32Number)(nResultingPoints-1); x = cmsEvalToneCurveFloat(X, t); Res[i] = cmsEvalToneCurveFloat(Yreversed, x); } // Allocate space for output out = cmsBuildTabulatedToneCurveFloat(ContextID, nResultingPoints, Res); Error: if (Res != NULL) _cmsFree(ContextID, Res); if (Yreversed != NULL) cmsFreeToneCurve(Yreversed); return out; } // Get the surrounding nodes. This is tricky on non-monotonic tables static int GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const struct _cms_interp_struc* p) { int i; int y0, y1; // A 1 point table is not allowed if (p -> Domain[0] < 1) return -1; // Let's see if ascending or descending. if (LutTable[0] < LutTable[p ->Domain[0]]) { // Table is overall ascending for (i = (int) p->Domain[0] - 1; i >= 0; --i) { y0 = LutTable[i]; y1 = LutTable[i+1]; if (y0 <= y1) { // Increasing if (In >= y0 && In <= y1) return i; } else if (y1 < y0) { // Decreasing if (In >= y1 && In <= y0) return i; } } } else { // Table is overall descending for (i=0; i < (int) p -> Domain[0]; i++) { y0 = LutTable[i]; y1 = LutTable[i+1]; if (y0 <= y1) { // Increasing if (In >= y0 && In <= y1) return i; } else if (y1 < y0) { // Decreasing if (In >= y1 && In <= y0) return i; } } } return -1; } // Reverse a gamma table cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsUInt32Number nResultSamples, const cmsToneCurve* InCurve) { cmsToneCurve *out; cmsFloat64Number a = 0, b = 0, y, x1, y1, x2, y2; int i, j; int Ascending; _cmsAssert(InCurve != NULL); // Try to reverse it analytically whatever possible if (InCurve ->nSegments == 1 && InCurve ->Segments[0].Type > 0 && /* InCurve -> Segments[0].Type <= 5 */ GetParametricCurveByType(InCurve ->InterpParams->ContextID, InCurve ->Segments[0].Type, NULL) != NULL) { return cmsBuildParametricToneCurve(InCurve ->InterpParams->ContextID, -(InCurve -> Segments[0].Type), InCurve -> Segments[0].Params); } // Nope, reverse the table. out = cmsBuildTabulatedToneCurve16(InCurve ->InterpParams->ContextID, nResultSamples, NULL); if (out == NULL) return NULL; // We want to know if this is an ascending or descending table Ascending = !cmsIsToneCurveDescending(InCurve); // Iterate across Y axis for (i=0; i < (int) nResultSamples; i++) { y = (cmsFloat64Number) i * 65535.0 / (nResultSamples - 1); // Find interval in which y is within. j = GetInterval(y, InCurve->Table16, InCurve->InterpParams); if (j >= 0) { // Get limits of interval x1 = InCurve ->Table16[j]; x2 = InCurve ->Table16[j+1]; y1 = (cmsFloat64Number) (j * 65535.0) / (InCurve ->nEntries - 1); y2 = (cmsFloat64Number) ((j+1) * 65535.0 ) / (InCurve ->nEntries - 1); // If collapsed, then use any if (x1 == x2) { out ->Table16[i] = _cmsQuickSaturateWord(Ascending ? y2 : y1); continue; } else { // Interpolate a = (y2 - y1) / (x2 - x1); b = y2 - a * x2; } } out ->Table16[i] = _cmsQuickSaturateWord(a* y + b); } return out; } // Reverse a gamma table cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma) { _cmsAssert(InGamma != NULL); return cmsReverseToneCurveEx(4096, InGamma); } // From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite // differences. in: Graphic Gems IV, Heckbert, P.S. (ed.), Academic press. // // Smoothing and interpolation with second differences. // // Input: weights (w), data (y): vector from 1 to m. // Input: smoothing parameter (lambda), length (m). // Output: smoothed vector (z): vector from 1 to m. static cmsBool smooth2(cmsContext ContextID, cmsFloat32Number w[], cmsFloat32Number y[], cmsFloat32Number z[], cmsFloat32Number lambda, int m) { int i, i1, i2; cmsFloat32Number *c, *d, *e; cmsBool st; if (m < 4 || lambda < MATRIX_DET_TOLERANCE) return FALSE; c = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); d = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); e = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); if (c != NULL && d != NULL && e != NULL) { d[1] = w[1] + lambda; c[1] = -2 * lambda / d[1]; e[1] = lambda /d[1]; z[1] = w[1] * y[1]; d[2] = w[2] + 5 * lambda - d[1] * c[1] * c[1]; c[2] = (-4 * lambda - d[1] * c[1] * e[1]) / d[2]; e[2] = lambda / d[2]; z[2] = w[2] * y[2] - c[1] * z[1]; for (i = 3; i < m - 1; i++) { i1 = i - 1; i2 = i - 2; d[i]= w[i] + 6 * lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; c[i] = (-4 * lambda -d[i1] * c[i1] * e[i1])/ d[i]; e[i] = lambda / d[i]; z[i] = w[i] * y[i] - c[i1] * z[i1] - e[i2] * z[i2]; } i1 = m - 2; i2 = m - 3; d[m - 1] = w[m - 1] + 5 * lambda -c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; c[m - 1] = (-2 * lambda - d[i1] * c[i1] * e[i1]) / d[m - 1]; z[m - 1] = w[m - 1] * y[m - 1] - c[i1] * z[i1] - e[i2] * z[i2]; i1 = m - 1; i2 = m - 2; d[m] = w[m] + lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; z[m] = (w[m] * y[m] - c[i1] * z[i1] - e[i2] * z[i2]) / d[m]; z[m - 1] = z[m - 1] / d[m - 1] - c[m - 1] * z[m]; for (i = m - 2; 1<= i; i--) z[i] = z[i] / d[i] - c[i] * z[i + 1] - e[i] * z[i + 2]; st = TRUE; } else st = FALSE; if (c != NULL) _cmsFree(ContextID, c); if (d != NULL) _cmsFree(ContextID, d); if (e != NULL) _cmsFree(ContextID, e); return st; } // Smooths a curve sampled at regular intervals. cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda) { cmsBool SuccessStatus = TRUE; cmsFloat32Number *w, *y, *z; cmsUInt32Number i, nItems, Zeros, Poles; cmsBool notCheck = FALSE; if (Tab != NULL && Tab->InterpParams != NULL) { cmsContext ContextID = Tab->InterpParams->ContextID; if (!cmsIsToneCurveLinear(Tab)) // Only non-linear curves need smoothing { nItems = Tab->nEntries; if (nItems < MAX_NODES_IN_CURVE) { // Allocate one more item than needed w = (cmsFloat32Number *)_cmsCalloc(ContextID, nItems + 1, sizeof(cmsFloat32Number)); y = (cmsFloat32Number *)_cmsCalloc(ContextID, nItems + 1, sizeof(cmsFloat32Number)); z = (cmsFloat32Number *)_cmsCalloc(ContextID, nItems + 1, sizeof(cmsFloat32Number)); if (w != NULL && y != NULL && z != NULL) // Ensure no memory allocation failure { memset(w, 0, (nItems + 1) * sizeof(cmsFloat32Number)); memset(y, 0, (nItems + 1) * sizeof(cmsFloat32Number)); memset(z, 0, (nItems + 1) * sizeof(cmsFloat32Number)); for (i = 0; i < nItems; i++) { y[i + 1] = (cmsFloat32Number)Tab->Table16[i]; w[i + 1] = 1.0; } if (lambda < 0) { notCheck = TRUE; lambda = -lambda; } if (smooth2(ContextID, w, y, z, (cmsFloat32Number)lambda, (int)nItems)) { // Do some reality - checking... Zeros = Poles = 0; for (i = nItems; i > 1; --i) { if (z[i] == 0.) Zeros++; if (z[i] >= 65535.) Poles++; if (z[i] < z[i - 1]) { cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic."); SuccessStatus = notCheck; break; } } if (SuccessStatus && Zeros > (nItems / 3)) { cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros."); SuccessStatus = notCheck; } if (SuccessStatus && Poles > (nItems / 3)) { cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles."); SuccessStatus = notCheck; } if (SuccessStatus) // Seems ok { for (i = 0; i < nItems; i++) { // Clamp to cmsUInt16Number Tab->Table16[i] = _cmsQuickSaturateWord(z[i + 1]); } } } else // Could not smooth { cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Function smooth2 failed."); SuccessStatus = FALSE; } } else // One or more buffers could not be allocated { cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Could not allocate memory."); SuccessStatus = FALSE; } if (z != NULL) _cmsFree(ContextID, z); if (y != NULL) _cmsFree(ContextID, y); if (w != NULL) _cmsFree(ContextID, w); } else // too many items in the table { cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Too many points."); SuccessStatus = FALSE; } } } else // Tab parameter or Tab->InterpParams is NULL { // Can't signal an error here since the ContextID is not known at this point SuccessStatus = FALSE; } return SuccessStatus; } // Is a table linear? Do not use parametric since we cannot guarantee some weird parameters resulting // in a linear table. This way assures it is linear in 12 bits, which should be enough in most cases. cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve) { int i; int diff; _cmsAssert(Curve != NULL); for (i=0; i < (int) Curve ->nEntries; i++) { diff = abs((int) Curve->Table16[i] - (int) _cmsQuantizeVal(i, Curve ->nEntries)); if (diff > 0x0f) return FALSE; } return TRUE; } // Same, but for monotonicity cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t) { cmsUInt32Number n; int i, last; cmsBool lDescending; _cmsAssert(t != NULL); // Degenerated curves are monotonic? Ok, let's pass them n = t ->nEntries; if (n < 2) return TRUE; // Curve direction lDescending = cmsIsToneCurveDescending(t); if (lDescending) { last = t ->Table16[0]; for (i = 1; i < (int) n; i++) { if (t ->Table16[i] - last > 2) // We allow some ripple return FALSE; else last = t ->Table16[i]; } } else { last = t ->Table16[n-1]; for (i = (int) n - 2; i >= 0; --i) { if (t ->Table16[i] - last > 2) return FALSE; else last = t ->Table16[i]; } } return TRUE; } // Same, but for descending tables cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t ->Table16[0] > t ->Table16[t ->nEntries-1]; } // Another info fn: is out gamma table multisegment? cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t -> nSegments > 1; } cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t) { _cmsAssert(t != NULL); if (t -> nSegments != 1) return 0; return t ->Segments[0].Type; } // We need accuracy this time cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v) { _cmsAssert(Curve != NULL); // Check for 16 bits table. If so, this is a limited-precision tone curve if (Curve ->nSegments == 0) { cmsUInt16Number In, Out; In = (cmsUInt16Number) _cmsQuickSaturateWord(v * 65535.0); Out = cmsEvalToneCurve16(Curve, In); return (cmsFloat32Number) (Out / 65535.0); } return (cmsFloat32Number) EvalSegmentedFn(Curve, v); } // We need xput over here cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v) { cmsUInt16Number out; _cmsAssert(Curve != NULL); Curve ->InterpParams ->Interpolation.Lerp16(&v, &out, Curve ->InterpParams); return out; } // Least squares fitting. // A mathematical procedure for finding the best-fitting curve to a given set of points by // minimizing the sum of the squares of the offsets ("the residuals") of the points from the curve. // The sum of the squares of the offsets is used instead of the offset absolute values because // this allows the residuals to be treated as a continuous differentiable quantity. // // y = f(x) = x ^ g // // R = (yi - (xi^g)) // R2 = (yi - (xi^g))2 // SUM R2 = SUM (yi - (xi^g))2 // // dR2/dg = -2 SUM x^g log(x)(y - x^g) // solving for dR2/dg = 0 // // g = 1/n * SUM(log(y) / log(x)) cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision) { cmsFloat64Number gamma, sum, sum2; cmsFloat64Number n, x, y, Std; cmsUInt32Number i; _cmsAssert(t != NULL); sum = sum2 = n = 0; // Excluding endpoints for (i=1; i < (MAX_NODES_IN_CURVE-1); i++) { x = (cmsFloat64Number) i / (MAX_NODES_IN_CURVE-1); y = (cmsFloat64Number) cmsEvalToneCurveFloat(t, (cmsFloat32Number) x); // Avoid 7% on lower part to prevent // artifacts due to linear ramps if (y > 0. && y < 1. && x > 0.07) { gamma = log(y) / log(x); sum += gamma; sum2 += gamma * gamma; n++; } } // We need enough valid samples if (n <= 1) return -1.0; // Take a look on SD to see if gamma isn't exponential at all Std = sqrt((n * sum2 - sum * sum) / (n*(n-1))); if (Std > Precision) return -1.0; return (sum / n); // The mean } // Retrieve segments on tone curves const cmsCurveSegment* CMSEXPORT cmsGetToneCurveSegment(cmsInt32Number n, const cmsToneCurve* t) { _cmsAssert(t != NULL); if (n < 0 || n >= (cmsInt32Number) t->nSegments) return NULL; return t->Segments + n; } lcms2-2.19.1/src/cmsgmt.c0000644000175000017500000005402615176573557014117 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Auxiliary: append a Lab identity after the given sequence of profiles // and return the transform. Lab profile is closed, rest of profiles are kept open. cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsHTRANSFORM xform; cmsHPROFILE hLab; cmsHPROFILE ProfileList[256]; cmsBool BPCList[256]; cmsFloat64Number AdaptationList[256]; cmsUInt32Number IntentList[256]; cmsUInt32Number i; // This is a rather big number and there is no need of dynamic memory // since we are adding a profile, 254 + 1 = 255 and this is the limit if (nProfiles > 254) return NULL; // The output space hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); if (hLab == NULL) return NULL; // Create a copy of parameters for (i=0; i < nProfiles; i++) { ProfileList[i] = hProfiles[i]; BPCList[i] = BPC[i]; AdaptationList[i] = AdaptationStates[i]; IntentList[i] = Intents[i]; } // Place Lab identity at chain's end. ProfileList[nProfiles] = hLab; BPCList[nProfiles] = 0; AdaptationList[nProfiles] = 1.0; IntentList[nProfiles] = INTENT_RELATIVE_COLORIMETRIC; // Create the transform xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList, BPCList, IntentList, AdaptationList, NULL, 0, InputFormat, OutputFormat, dwFlags); cmsCloseProfile(hLab); return xform; } // Compute K -> L* relationship. Flags may include black point compensation. In this case, // the relationship is assumed from the profile with BPC to a black point zero. static cmsToneCurve* ComputeKToLstar(cmsContext ContextID, cmsUInt32Number nPoints, cmsUInt32Number nProfiles, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsToneCurve* out = NULL; cmsUInt32Number i; cmsHTRANSFORM xform; cmsCIELab Lab; cmsFloat32Number cmyk[4]; cmsFloat32Number* SampledPoints; xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags); if (xform == NULL) return NULL; SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number)); if (SampledPoints == NULL) goto Error; for (i=0; i < nPoints; i++) { cmyk[0] = 0; cmyk[1] = 0; cmyk[2] = 0; cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1)); cmsDoTransform(xform, cmyk, &Lab, 1); SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation } out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints); Error: cmsDeleteTransform(xform); if (SampledPoints) _cmsFree(ContextID, SampledPoints); return out; } // Compute Black tone curve on a CMYK -> CMYK transform. This is done by // using the proof direction on both profiles to find K->L* relationship // then joining both curves. dwFlags may include black point compensation. cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID, cmsUInt32Number nPoints, cmsUInt32Number nProfiles, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsToneCurve *in, *out, *KTone; // Make sure CMYK -> CMYK if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL; // Make sure last is an output profile if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL; // Create individual curves. BPC works also as each K to L* is // computed as a BPC to zero black point in case of L* in = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags); if (in == NULL) return NULL; out = ComputeKToLstar(ContextID, nPoints, 1, Intents + (nProfiles - 1), &hProfiles [nProfiles - 1], BPC + (nProfiles - 1), AdaptationStates + (nProfiles - 1), dwFlags); if (out == NULL) { cmsFreeToneCurve(in); return NULL; } // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but // since this is used on black-preserving LUTs, we are not losing accuracy in any case KTone = cmsJoinToneCurve(ContextID, in, out, nPoints); // Get rid of components cmsFreeToneCurve(in); cmsFreeToneCurve(out); // Something went wrong... if (KTone == NULL) return NULL; // Make sure it is monotonic if (!cmsIsToneCurveMonotonic(KTone)) { cmsFreeToneCurve(KTone); return NULL; } return KTone; } // Gamut LUT Creation ----------------------------------------------------------------------------------------- // Used by gamut & softproofing typedef struct { cmsHTRANSFORM hInput; // From whatever input color space. 16 bits to DBL cmsHTRANSFORM hForward, hReverse; // Transforms going from Lab to colorant and back cmsFloat64Number Threshold; // The threshold after which is considered out of gamut } GAMUTCHAIN; // This sampler does compute gamut boundaries by comparing original // values with a transform going back and forth. Values above ERR_THRESHOLD // of maximum are considered out of gamut. #define ERR_THRESHOLD 5 static int GamutSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { GAMUTCHAIN* t = (GAMUTCHAIN* ) Cargo; cmsCIELab LabIn1, LabOut1; cmsCIELab LabIn2, LabOut2; cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS]; cmsFloat64Number dE1, dE2, ErrorRatio; // Assume in-gamut by default. NEVER READ, USED FOR DEBUG PURPOSES. ErrorRatio = 1.0; // Convert input to Lab cmsDoTransform(t -> hInput, In, &LabIn1, 1); // converts from PCS to colorant. This always // does return in-gamut values, cmsDoTransform(t -> hForward, &LabIn1, Proof, 1); // Now, do the inverse, from colorant to PCS. cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1); memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab)); // Try again, but this time taking Check as input cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1); cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1); // Take difference of direct value dE1 = cmsDeltaE(&LabIn1, &LabOut1); // Take difference of converted value dE2 = cmsDeltaE(&LabIn2, &LabOut2); // if dE1 is small and dE2 is small, value is likely to be in gamut if (dE1 < t->Threshold && dE2 < t->Threshold) Out[0] = 0; else { // if dE1 is small and dE2 is big, undefined. Assume in gamut if (dE1 < t->Threshold && dE2 > t->Threshold) Out[0] = 0; else // dE1 is big and dE2 is small, clearly out of gamut if (dE1 > t->Threshold && dE2 < t->Threshold) Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Threshold) + .5); else { // dE1 is big and dE2 is also big, could be due to perceptual mapping // so take error ratio if (dE2 == 0.0) ErrorRatio = dE1; else ErrorRatio = dE1 / dE2; if (ErrorRatio > t->Threshold) Out[0] = (cmsUInt16Number) _cmsQuickFloor((ErrorRatio - t->Threshold) + .5); else Out[0] = 0; } } return TRUE; } // Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs // the dE obtained is then annotated on the LUT. Values truly out of gamut are clipped to dE = 0xFFFE // and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well. // // **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors, // of course, many perceptual and saturation intents does not work in such way, but relativ. ones should. cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsUInt32Number nGamutPCSposition, cmsHPROFILE hGamut) { cmsHPROFILE hLab; cmsPipeline* Gamut; cmsStage* CLUT; cmsUInt32Number dwFormat; GAMUTCHAIN Chain; cmsUInt32Number nGridpoints; cmsInt32Number nChannels, nInputChannels; cmsColorSpaceSignature ColorSpace; cmsColorSpaceSignature InputColorSpace; cmsUInt32Number i; cmsHPROFILE ProfileList[256]; cmsBool BPCList[256]; cmsFloat64Number AdaptationList[256]; cmsUInt32Number IntentList[256]; memset(&Chain, 0, sizeof(GAMUTCHAIN)); if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) { cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong position of PCS. 1..255 expected, %d found.", nGamutPCSposition); return NULL; } hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); if (hLab == NULL) return NULL; // The figure of merit. On matrix-shaper profiles, should be almost zero as // the conversion is pretty exact. On LUT based profiles, different resolutions // of input and output CLUT may result in differences. if (cmsIsMatrixShaper(hGamut)) { Chain.Threshold = 1.0; } else { Chain.Threshold = ERR_THRESHOLD; } // Create a copy of parameters for (i=0; i < nGamutPCSposition; i++) { ProfileList[i] = hProfiles[i]; BPCList[i] = BPC[i]; AdaptationList[i] = AdaptationStates[i]; IntentList[i] = Intents[i]; } // Fill Lab identity ProfileList[nGamutPCSposition] = hLab; BPCList[nGamutPCSposition] = 0; AdaptationList[nGamutPCSposition] = 1.0; IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC; ColorSpace = cmsGetColorSpace(hGamut); nChannels = cmsChannelsOfColorSpace(ColorSpace); nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC); InputColorSpace = cmsGetColorSpace(ProfileList[0]); nInputChannels = cmsChannelsOfColorSpace(InputColorSpace); dwFormat = (CHANNELS_SH(nInputChannels)|BYTES_SH(2)); // 16 bits to Lab double Chain.hInput = cmsCreateExtendedTransform(ContextID, nGamutPCSposition + 1, ProfileList, BPCList, IntentList, AdaptationList, NULL, 0, dwFormat, TYPE_Lab_DBL, cmsFLAGS_NOCACHE); // Does create the forward step. Lab double to device dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2)); Chain.hForward = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_DBL, hGamut, dwFormat, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); // Does create the backwards step Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); // All ok? if (Chain.hInput && Chain.hForward && Chain.hReverse) { // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing // dE when doing a transform back and forth on the colorimetric intent. Gamut = cmsPipelineAlloc(ContextID, 3, 1); if (Gamut != NULL) { CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL); if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) { cmsPipelineFree(Gamut); Gamut = NULL; } else { cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0); } } } else Gamut = NULL; // Didn't work... // Free all needed stuff. if (Chain.hInput) cmsDeleteTransform(Chain.hInput); if (Chain.hForward) cmsDeleteTransform(Chain.hForward); if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse); if (hLab) cmsCloseProfile(hLab); // And return computed hull return Gamut; } // Total Area Coverage estimation ---------------------------------------------------------------- typedef struct { cmsUInt32Number nOutputChans; cmsHTRANSFORM hRoundTrip; cmsFloat32Number MaxTAC; cmsFloat32Number MaxInput[cmsMAXCHANNELS]; } cmsTACestimator; // This callback just accounts the maximum ink dropped in the given node. It does not populate any // memory, as the destination table is NULL. Its only purpose it to know the global maximum. static int EstimateTAC(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { cmsTACestimator* bp = (cmsTACestimator*) Cargo; cmsFloat32Number RoundTrip[cmsMAXCHANNELS]; cmsUInt32Number i; cmsFloat32Number Sum; // Evaluate the xform cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1); // All all amounts of ink for (Sum=0, i=0; i < bp ->nOutputChans; i++) Sum += RoundTrip[i]; // If above maximum, keep track of input values if (Sum > bp ->MaxTAC) { bp ->MaxTAC = Sum; for (i=0; i < bp ->nOutputChans; i++) { bp ->MaxInput[i] = In[i]; } } return TRUE; cmsUNUSED_PARAMETER(Out); } // Detect Total area coverage of the profile cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile) { cmsTACestimator bp; cmsUInt32Number dwFormatter; cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS]; cmsHPROFILE hLab; cmsContext ContextID = cmsGetProfileContextID(hProfile); // TAC only works on output profiles if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) { return 0; } // Create a fake formatter for result dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE); // Unsupported color space? if (dwFormatter == 0) return 0; bp.nOutputChans = T_CHANNELS(dwFormatter); bp.MaxTAC = 0; // Initial TAC is 0 // for safety if (bp.nOutputChans >= cmsMAXCHANNELS) return 0; hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); if (hLab == NULL) return 0; // Setup a roundtrip on perceptual intent in output profile for TAC estimation bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16, hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); cmsCloseProfile(hLab); if (bp.hRoundTrip == NULL) return 0; // For L* we only need black and white. For C* we need many points GridPoints[0] = 6; GridPoints[1] = 74; GridPoints[2] = 74; if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) { bp.MaxTAC = 0; } cmsDeleteTransform(bp.hRoundTrip); // Results in % return bp.MaxTAC; } // Carefully, clamp on CIELab space. cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab, double amax, double amin, double bmax, double bmin) { // Whole Luma surface to zero if (Lab -> L < 0) { Lab-> L = Lab->a = Lab-> b = 0.0; return FALSE; } // Clamp white, DISCARD HIGHLIGHTS. This is done // in such way because icc spec doesn't allow the // use of L>100 as a highlight means. if (Lab->L > 100) Lab -> L = 100; // Check out gamut prism, on a, b faces if (Lab -> a < amin || Lab->a > amax|| Lab -> b < bmin || Lab->b > bmax) { cmsCIELCh LCh; double h, slope; // Falls outside a, b limits. Transports to LCh space, // and then do the clipping if (Lab -> a == 0.0) { // Is hue exactly 90? // atan will not work, so clamp here Lab -> b = Lab->b < 0 ? bmin : bmax; return TRUE; } cmsLab2LCh(&LCh, Lab); slope = Lab -> b / Lab -> a; h = LCh.h; // There are 4 zones if ((h >= 0. && h < 45.) || (h >= 315 && h <= 360.)) { // clip by amax Lab -> a = amax; Lab -> b = amax * slope; } else if (h >= 45. && h < 135.) { // clip by bmax Lab -> b = bmax; Lab -> a = bmax / slope; } else if (h >= 135. && h < 225.) { // clip by amin Lab -> a = amin; Lab -> b = amin * slope; } else if (h >= 225. && h < 315.) { // clip by bmin Lab -> b = bmin; Lab -> a = bmin / slope; } else { cmsSignalError(0, cmsERROR_RANGE, "Invalid angle"); return FALSE; } } return TRUE; } // Detect whatever a given ICC profile works in linear (gamma 1.0) space // Actually, doing that "well" is quite hard, since every component may behave completely different. // Since the true point of this function is to detect suitable optimizations, I am imposing some requirements // that simplifies things: only RGB, and only profiles that can got in both directions. // The algorithm obtains Y from a synthetical gray R=G=B. Then least squares fitting is used to estimate gamma. // For gamma close to 1.0, RGB is linear. On profiles not supported, -1 is returned. cmsFloat64Number CMSEXPORT cmsDetectRGBProfileGamma(cmsHPROFILE hProfile, cmsFloat64Number threshold) { cmsContext ContextID; cmsHPROFILE hXYZ; cmsHTRANSFORM xform; cmsToneCurve* Y_curve; cmsUInt16Number rgb[256][3]; cmsCIEXYZ XYZ[256]; cmsFloat32Number Y_normalized[256]; cmsFloat64Number gamma; cmsProfileClassSignature cl; int i; if (cmsGetColorSpace(hProfile) != cmsSigRgbData) return -1; cl = cmsGetDeviceClass(hProfile); if (cl != cmsSigInputClass && cl != cmsSigDisplayClass && cl != cmsSigOutputClass && cl != cmsSigColorSpaceClass) return -1; ContextID = cmsGetProfileContextID(hProfile); hXYZ = cmsCreateXYZProfileTHR(ContextID); if (hXYZ == NULL) return -1; xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_RGB_16, hXYZ, TYPE_XYZ_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE); if (xform == NULL) { // If not RGB or forward direction is not supported, regret with the previous error cmsCloseProfile(hXYZ); return -1; } for (i = 0; i < 256; i++) { rgb[i][0] = rgb[i][1] = rgb[i][2] = FROM_8_TO_16(i); } cmsDoTransform(xform, rgb, XYZ, 256); cmsDeleteTransform(xform); cmsCloseProfile(hXYZ); for (i = 0; i < 256; i++) { Y_normalized[i] = (cmsFloat32Number) XYZ[i].Y; } Y_curve = cmsBuildTabulatedToneCurveFloat(ContextID, 256, Y_normalized); if (Y_curve == NULL) return -1; gamma = cmsEstimateGamma(Y_curve, threshold); cmsFreeToneCurve(Y_curve); return gamma; } lcms2-2.19.1/src/cmshalf.c0000644000175000017500000010504015176573557014233 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // // #include "lcms2_internal.h" #ifndef CMS_NO_HALF_SUPPORT // This code is inspired in the paper "Fast Half Float Conversions" // by Jeroen van der Zijp static const cmsUInt32Number Mantissa[2048] = { 0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000, 0x34c00000, 0x34e00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000, 0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000, 0x35f00000, 0x35f80000, 0x36000000, 0x36040000, 0x36080000, 0x360c0000, 0x36100000, 0x36140000, 0x36180000, 0x361c0000, 0x36200000, 0x36240000, 0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000, 0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000, 0x36580000, 0x365c0000, 0x36600000, 0x36640000, 0x36680000, 0x366c0000, 0x36700000, 0x36740000, 0x36780000, 0x367c0000, 0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000, 0x369c0000, 0x369e0000, 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000, 0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, 0x36b00000, 0x36b20000, 0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000, 0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000, 0x36cc0000, 0x36ce0000, 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000, 0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, 0x36e00000, 0x36e20000, 0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000, 0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000, 0x36fc0000, 0x36fe0000, 0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000, 0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371a0000, 0x371b0000, 0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, 0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000, 0x372e0000, 0x372f0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000, 0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374a0000, 0x374b0000, 0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, 0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000, 0x375e0000, 0x375f0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000, 0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377a0000, 0x377b0000, 0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, 0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, 0x378c0000, 0x378c8000, 0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000, 0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000, 0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000, 0x379f0000, 0x379f8000, 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000, 0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, 0x37a40000, 0x37a48000, 0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000, 0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000, 0x37ab0000, 0x37ab8000, 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000, 0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, 0x37b00000, 0x37b08000, 0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000, 0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000, 0x37b70000, 0x37b78000, 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000, 0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, 0x37bc0000, 0x37bc8000, 0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000, 0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000, 0x37c30000, 0x37c38000, 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000, 0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, 0x37c80000, 0x37c88000, 0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000, 0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000, 0x37cf0000, 0x37cf8000, 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000, 0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, 0x37d40000, 0x37d48000, 0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000, 0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000, 0x37db0000, 0x37db8000, 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000, 0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, 0x37e00000, 0x37e08000, 0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000, 0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000, 0x37e70000, 0x37e78000, 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000, 0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, 0x37ec0000, 0x37ec8000, 0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000, 0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000, 0x37f30000, 0x37f38000, 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000, 0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, 0x37f80000, 0x37f88000, 0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000, 0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000, 0x37ff0000, 0x37ff8000, 0x38000000, 0x38004000, 0x38008000, 0x3800c000, 0x38010000, 0x38014000, 0x38018000, 0x3801c000, 0x38020000, 0x38024000, 0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000, 0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000, 0x38058000, 0x3805c000, 0x38060000, 0x38064000, 0x38068000, 0x3806c000, 0x38070000, 0x38074000, 0x38078000, 0x3807c000, 0x38080000, 0x38084000, 0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000, 0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000, 0x380b8000, 0x380bc000, 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000, 0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, 0x380e0000, 0x380e4000, 0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000, 0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000, 0x38118000, 0x3811c000, 0x38120000, 0x38124000, 0x38128000, 0x3812c000, 0x38130000, 0x38134000, 0x38138000, 0x3813c000, 0x38140000, 0x38144000, 0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000, 0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000, 0x38178000, 0x3817c000, 0x38180000, 0x38184000, 0x38188000, 0x3818c000, 0x38190000, 0x38194000, 0x38198000, 0x3819c000, 0x381a0000, 0x381a4000, 0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000, 0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000, 0x381d8000, 0x381dc000, 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000, 0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, 0x38200000, 0x38204000, 0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000, 0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000, 0x38238000, 0x3823c000, 0x38240000, 0x38244000, 0x38248000, 0x3824c000, 0x38250000, 0x38254000, 0x38258000, 0x3825c000, 0x38260000, 0x38264000, 0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000, 0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000, 0x38298000, 0x3829c000, 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000, 0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, 0x382c0000, 0x382c4000, 0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000, 0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000, 0x382f8000, 0x382fc000, 0x38300000, 0x38304000, 0x38308000, 0x3830c000, 0x38310000, 0x38314000, 0x38318000, 0x3831c000, 0x38320000, 0x38324000, 0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000, 0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000, 0x38358000, 0x3835c000, 0x38360000, 0x38364000, 0x38368000, 0x3836c000, 0x38370000, 0x38374000, 0x38378000, 0x3837c000, 0x38380000, 0x38384000, 0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000, 0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000, 0x383b8000, 0x383bc000, 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000, 0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, 0x383e0000, 0x383e4000, 0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000, 0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000, 0x38418000, 0x3841c000, 0x38420000, 0x38424000, 0x38428000, 0x3842c000, 0x38430000, 0x38434000, 0x38438000, 0x3843c000, 0x38440000, 0x38444000, 0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000, 0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000, 0x38478000, 0x3847c000, 0x38480000, 0x38484000, 0x38488000, 0x3848c000, 0x38490000, 0x38494000, 0x38498000, 0x3849c000, 0x384a0000, 0x384a4000, 0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000, 0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000, 0x384d8000, 0x384dc000, 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000, 0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, 0x38500000, 0x38504000, 0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000, 0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000, 0x38538000, 0x3853c000, 0x38540000, 0x38544000, 0x38548000, 0x3854c000, 0x38550000, 0x38554000, 0x38558000, 0x3855c000, 0x38560000, 0x38564000, 0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000, 0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000, 0x38598000, 0x3859c000, 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000, 0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, 0x385c0000, 0x385c4000, 0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000, 0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000, 0x385f8000, 0x385fc000, 0x38600000, 0x38604000, 0x38608000, 0x3860c000, 0x38610000, 0x38614000, 0x38618000, 0x3861c000, 0x38620000, 0x38624000, 0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000, 0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000, 0x38658000, 0x3865c000, 0x38660000, 0x38664000, 0x38668000, 0x3866c000, 0x38670000, 0x38674000, 0x38678000, 0x3867c000, 0x38680000, 0x38684000, 0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000, 0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000, 0x386b8000, 0x386bc000, 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000, 0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, 0x386e0000, 0x386e4000, 0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000, 0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000, 0x38718000, 0x3871c000, 0x38720000, 0x38724000, 0x38728000, 0x3872c000, 0x38730000, 0x38734000, 0x38738000, 0x3873c000, 0x38740000, 0x38744000, 0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000, 0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000, 0x38778000, 0x3877c000, 0x38780000, 0x38784000, 0x38788000, 0x3878c000, 0x38790000, 0x38794000, 0x38798000, 0x3879c000, 0x387a0000, 0x387a4000, 0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000, 0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000, 0x387d8000, 0x387dc000, 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000, 0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, 0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000, 0x3801c000, 0x3801e000, 0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000, 0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000, 0x3804c000, 0x3804e000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, 0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000, 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000, 0x3807c000, 0x3807e000, 0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000, 0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000, 0x380ac000, 0x380ae000, 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000, 0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, 0x380c0000, 0x380c2000, 0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000, 0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000, 0x380dc000, 0x380de000, 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000, 0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, 0x380f0000, 0x380f2000, 0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000, 0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000, 0x3810c000, 0x3810e000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, 0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000, 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000, 0x3813c000, 0x3813e000, 0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000, 0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000, 0x3816c000, 0x3816e000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, 0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000, 0x3819c000, 0x3819e000, 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000, 0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, 0x381b0000, 0x381b2000, 0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000, 0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000, 0x381cc000, 0x381ce000, 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000, 0x381d8000, 0x381da000, 0x381dc000, 0x381de000, 0x381e0000, 0x381e2000, 0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000, 0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000, 0x381fc000, 0x381fe000, 0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000, 0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000, 0x3822c000, 0x3822e000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, 0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000, 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000, 0x3825c000, 0x3825e000, 0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000, 0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000, 0x3828c000, 0x3828e000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, 0x382a0000, 0x382a2000, 0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000, 0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000, 0x382bc000, 0x382be000, 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000, 0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, 0x382d0000, 0x382d2000, 0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000, 0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000, 0x382ec000, 0x382ee000, 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000, 0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, 0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000, 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000, 0x3831c000, 0x3831e000, 0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000, 0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000, 0x3834c000, 0x3834e000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, 0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000, 0x3837c000, 0x3837e000, 0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000, 0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000, 0x383ac000, 0x383ae000, 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000, 0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, 0x383c0000, 0x383c2000, 0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000, 0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000, 0x383dc000, 0x383de000, 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000, 0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, 0x383f0000, 0x383f2000, 0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000, 0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000, 0x3840c000, 0x3840e000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, 0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000, 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000, 0x3843c000, 0x3843e000, 0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000, 0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000, 0x3846c000, 0x3846e000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, 0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000, 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000, 0x3849c000, 0x3849e000, 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000, 0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, 0x384b0000, 0x384b2000, 0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000, 0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000, 0x384cc000, 0x384ce000, 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000, 0x384d8000, 0x384da000, 0x384dc000, 0x384de000, 0x384e0000, 0x384e2000, 0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000, 0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000, 0x384fc000, 0x384fe000, 0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000, 0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000, 0x3852c000, 0x3852e000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, 0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000, 0x3855c000, 0x3855e000, 0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000, 0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000, 0x3858c000, 0x3858e000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, 0x385a0000, 0x385a2000, 0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000, 0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000, 0x385bc000, 0x385be000, 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000, 0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, 0x385d0000, 0x385d2000, 0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000, 0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000, 0x385ec000, 0x385ee000, 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000, 0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, 0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000, 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000, 0x3861c000, 0x3861e000, 0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000, 0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000, 0x3864c000, 0x3864e000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, 0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000, 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000, 0x3867c000, 0x3867e000, 0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000, 0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000, 0x386ac000, 0x386ae000, 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000, 0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, 0x386c0000, 0x386c2000, 0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000, 0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000, 0x386dc000, 0x386de000, 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000, 0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, 0x386f0000, 0x386f2000, 0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000, 0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000, 0x3870c000, 0x3870e000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, 0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000, 0x3873c000, 0x3873e000, 0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000, 0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000, 0x3876c000, 0x3876e000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, 0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000, 0x3879c000, 0x3879e000, 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000, 0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, 0x387b0000, 0x387b2000, 0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000, 0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000, 0x387cc000, 0x387ce000, 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000, 0x387d8000, 0x387da000, 0x387dc000, 0x387de000, 0x387e0000, 0x387e2000, 0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000, 0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000, 0x387fc000, 0x387fe000 }; static const cmsUInt16Number Offset[64] = { 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400 }; static const cmsUInt32Number Exponent[64] = { 0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000, 0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000, 0x0f000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, 0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000, 0x8b000000, 0x8b800000, 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000, 0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000 }; static const cmsUInt16Number Base[512] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00, 0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400, 0x4800, 0x4c00, 0x5000, 0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00, 0x7000, 0x7400, 0x7800, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400, 0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00, 0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400, 0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00 }; static const cmsUInt8Number Shift[512] = { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d }; cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h) { union { cmsFloat32Number flt; cmsUInt32Number num; } out; int n = h >> 10; out.num = Mantissa[ (h & 0x3ff) + Offset[ n ] ] + Exponent[ n ]; return out.flt; } cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt) { union { cmsFloat32Number flt; cmsUInt32Number num; } in; cmsUInt32Number n, j; in.flt = flt; n = in.num; j = (n >> 23) & 0x1ff; return (cmsUInt16Number) ((cmsUInt32Number) Base[ j ] + (( n & 0x007fffff) >> Shift[ j ])); } #endif lcms2-2.19.1/src/cmsio1.c0000644000175000017500000010566115176573557014022 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Read tags using low-level functions, provides necessary glue code to adapt versions, etc. // LUT tags static const cmsTagSignature Device2PCS16[] = {cmsSigAToB0Tag, // Perceptual cmsSigAToB1Tag, // Relative colorimetric cmsSigAToB2Tag, // Saturation cmsSigAToB1Tag }; // Absolute colorimetric static const cmsTagSignature Device2PCSFloat[] = {cmsSigDToB0Tag, // Perceptual cmsSigDToB1Tag, // Relative colorimetric cmsSigDToB2Tag, // Saturation cmsSigDToB3Tag }; // Absolute colorimetric static const cmsTagSignature PCS2Device16[] = {cmsSigBToA0Tag, // Perceptual cmsSigBToA1Tag, // Relative colorimetric cmsSigBToA2Tag, // Saturation cmsSigBToA1Tag }; // Absolute colorimetric static const cmsTagSignature PCS2DeviceFloat[] = {cmsSigBToD0Tag, // Perceptual cmsSigBToD1Tag, // Relative colorimetric cmsSigBToD2Tag, // Saturation cmsSigBToD3Tag }; // Absolute colorimetric // Factors to convert from 1.15 fixed point to 0..1.0 range and vice-versa #define InpAdj (1.0/MAX_ENCODEABLE_XYZ) // (65536.0/(65535.0*2.0)) #define OutpAdj (MAX_ENCODEABLE_XYZ) // ((2.0*65535.0)/65536.0) // Several resources for gray conversions. static const cmsFloat64Number GrayInputMatrix[] = { (InpAdj*cmsD50X), (InpAdj*cmsD50Y), (InpAdj*cmsD50Z) }; static const cmsFloat64Number OneToThreeInputMatrix[] = { 1, 1, 1 }; static const cmsFloat64Number PickYMatrix[] = { 0, (OutpAdj*cmsD50Y), 0 }; static const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 }; // Get a media white point fixing some issues found in certain old profiles cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile) { cmsCIEXYZ* Tag; _cmsAssert(Dest != NULL); Tag = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag); // If no wp, take D50 if (Tag == NULL) { *Dest = *cmsD50_XYZ(); return TRUE; } // V2 display profiles should give D50 if (cmsGetEncodedICCversion(hProfile) < 0x4000000) { if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) { *Dest = *cmsD50_XYZ(); return TRUE; } } // All seems ok *Dest = *Tag; return TRUE; } // Chromatic adaptation matrix. Fix some issues as well cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile) { cmsMAT3* Tag; _cmsAssert(Dest != NULL); Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag); if (Tag != NULL) { *Dest = *Tag; return TRUE; } // No CHAD available, default it to identity _cmsMAT3identity(Dest); // V2 display profiles should give D50 if (cmsGetEncodedICCversion(hProfile) < 0x4000000) { if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) { cmsCIEXYZ* White = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag); if (White == NULL) { _cmsMAT3identity(Dest); return TRUE; } return _cmsAdaptationMatrix(Dest, NULL, White, cmsD50_XYZ()); } } return TRUE; } // Auxiliary, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper static cmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile) { cmsCIEXYZ *PtrRed, *PtrGreen, *PtrBlue; _cmsAssert(r != NULL); PtrRed = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigRedColorantTag); PtrGreen = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigGreenColorantTag); PtrBlue = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigBlueColorantTag); if (PtrRed == NULL || PtrGreen == NULL || PtrBlue == NULL) return FALSE; _cmsVEC3init(&r -> v[0], PtrRed -> X, PtrGreen -> X, PtrBlue -> X); _cmsVEC3init(&r -> v[1], PtrRed -> Y, PtrGreen -> Y, PtrBlue -> Y); _cmsVEC3init(&r -> v[2], PtrRed -> Z, PtrGreen -> Z, PtrBlue -> Z); return TRUE; } // Gray input pipeline static cmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile) { cmsToneCurve *GrayTRC; cmsPipeline* Lut; cmsContext ContextID = cmsGetProfileContextID(hProfile); GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag); if (GrayTRC == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 1, 3); if (Lut == NULL) goto Error; if (cmsGetPCS(hProfile) == cmsSigLabData) { // In this case we implement the profile as an identity matrix plus 3 tone curves cmsUInt16Number Zero[2] = { 0x8080, 0x8080 }; cmsToneCurve* EmptyTab; cmsToneCurve* LabCurves[3]; EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero); if (EmptyTab == NULL) goto Error; LabCurves[0] = GrayTRC; LabCurves[1] = EmptyTab; LabCurves[2] = EmptyTab; if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) { cmsFreeToneCurve(EmptyTab); goto Error; } cmsFreeToneCurve(EmptyTab); } else { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL))) goto Error; } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // RGB Matrix shaper static cmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile) { cmsPipeline* Lut; cmsMAT3 Mat; cmsToneCurve *Shapes[3]; cmsContext ContextID = cmsGetProfileContextID(hProfile); int i, j; if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL; // XYZ PCS in encoded in 1.15 format, and the matrix output comes in 0..0xffff range, so // we need to adjust the output by a factor of (0x10000/0xffff) to put data in // a 1.16 range, and then a >> 1 to obtain 1.15. The total factor is (65536.0)/(65535.0*2) for (i=0; i < 3; i++) for (j=0; j < 3; j++) Mat.v[i].n[j] *= InpAdj; Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag); Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag); Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag); if (!Shapes[0] || !Shapes[1] || !Shapes[2]) return NULL; Lut = cmsPipelineAlloc(ContextID, 3, 3); if (Lut != NULL) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL))) goto Error; // Note that it is certainly possible a single profile would have a LUT based // tag for output working in lab and a matrix-shaper for the fallback cases. // This is not allowed by the spec, but this code is tolerant to those cases if (cmsGetPCS(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID))) goto Error; } } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // Read the DToAX tag, adjusting the encoding of Lab or XYZ if needed static cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); if (Lut == NULL) return NULL; // input and output of transform are in lcms 0..1 encoding. If XYZ or Lab spaces are used, // these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0) if ( spc == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) goto Error; } else if (spc == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) goto Error; } if ( PCS == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) goto Error; } else if( PCS == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) goto Error; } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc // is adjusted here in order to create a LUT that takes care of all those details. // We add intent = 0xffffffff as a way to read matrix shaper always, no matter of other LUT cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) { cmsTagTypeSignature OriginalType; cmsTagSignature tag16; cmsTagSignature tagFloat; cmsContext ContextID = cmsGetProfileContextID(hProfile); // On named color, take the appropriate tag if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { cmsPipeline* Lut; cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag); if (nc == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 0, 0); if (Lut == NULL) return NULL; if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) || !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) { cmsPipelineFree(Lut); return NULL; } return Lut; } // This is an attempt to reuse this function to retrieve the matrix-shaper as pipeline no // matter other LUT are present and have precedence. Intent = 0xffffffff can be used for that. if (Intent <= INTENT_ABSOLUTE_COLORIMETRIC) { tag16 = Device2PCS16[Intent]; tagFloat = Device2PCSFloat[Intent]; if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence // Floating point LUT are always V4, but the encoding range is no // longer 0..1.0, so we need to add an stage depending on the color space return _cmsReadFloatInputTag(hProfile, tagFloat); } // Revert to perceptual if no tag is found if (!cmsIsTag(hProfile, tag16)) { tag16 = Device2PCS16[0]; } if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? // Check profile version and LUT type. Do the necessary adjustments if needed // First read the tag cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16); if (Lut == NULL) return NULL; // After reading it, we have now info about the original type OriginalType = _cmsGetTagTrueType(hProfile, tag16); // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); // We need to adjust data only for Lab16 on output if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) return Lut; // If the input is Lab, add also a conversion at the begin if (cmsGetColorSpace(hProfile) == cmsSigLabData && !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) goto Error; // Add a matrix for conversion V2 to V4 Lab PCS if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error; return Lut; Error: cmsPipelineFree(Lut); return NULL; } } // Lut was not found, try to create a matrix-shaper // Check if this is a grayscale profile. if (cmsGetColorSpace(hProfile) == cmsSigGrayData) { // if so, build appropriate conversion tables. // The tables are the PCS iluminant, scaled across GrayTRC return BuildGrayInputMatrixPipeline(hProfile); } // Not gray, create a normal matrix-shaper return BuildRGBInputMatrixShaper(hProfile); } // --------------------------------------------------------------------------------------------------------------- // Gray output pipeline. // XYZ -> Gray or Lab -> Gray. Since we only know the GrayTRC, we need to do some assumptions. Gray component will be // given by Y on XYZ PCS and by L* on Lab PCS, Both across inverse TRC curve. // The complete pipeline on XYZ is Matrix[3:1] -> Tone curve and in Lab Matrix[3:1] -> Tone Curve as well. static cmsPipeline* BuildGrayOutputPipeline(cmsHPROFILE hProfile) { cmsToneCurve *GrayTRC, *RevGrayTRC; cmsPipeline* Lut; cmsContext ContextID = cmsGetProfileContextID(hProfile); GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag); if (GrayTRC == NULL) return NULL; RevGrayTRC = cmsReverseToneCurve(GrayTRC); if (RevGrayTRC == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 3, 1); if (Lut == NULL) { cmsFreeToneCurve(RevGrayTRC); return NULL; } if (cmsGetPCS(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL))) goto Error; } else { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL))) goto Error; } if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC))) goto Error; cmsFreeToneCurve(RevGrayTRC); return Lut; Error: cmsFreeToneCurve(RevGrayTRC); cmsPipelineFree(Lut); return NULL; } static cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile) { cmsPipeline* Lut; cmsToneCurve *Shapes[3], *InvShapes[3]; cmsMAT3 Mat, Inv; int i, j; cmsContext ContextID = cmsGetProfileContextID(hProfile); if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL; if (!_cmsMAT3inverse(&Mat, &Inv)) return NULL; // XYZ PCS in encoded in 1.15 format, and the matrix input should come in 0..0xffff range, so // we need to adjust the input by a << 1 to obtain a 1.16 fixed and then by a factor of // (0xffff/0x10000) to put data in 0..0xffff range. Total factor is (2.0*65535.0)/65536.0; for (i=0; i < 3; i++) for (j=0; j < 3; j++) Inv.v[i].n[j] *= OutpAdj; Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag); Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag); Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag); if (!Shapes[0] || !Shapes[1] || !Shapes[2]) return NULL; InvShapes[0] = cmsReverseToneCurve(Shapes[0]); InvShapes[1] = cmsReverseToneCurve(Shapes[1]); InvShapes[2] = cmsReverseToneCurve(Shapes[2]); if (!InvShapes[0] || !InvShapes[1] || !InvShapes[2]) { return NULL; } Lut = cmsPipelineAlloc(ContextID, 3, 3); if (Lut != NULL) { // Note that it is certainly possible a single profile would have a LUT based // tag for output working in lab and a matrix-shaper for the fallback cases. // This is not allowed by the spec, but this code is tolerant to those cases if (cmsGetPCS(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID))) goto Error; } if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes))) goto Error; } cmsFreeToneCurveTriple(InvShapes); return Lut; Error: cmsFreeToneCurveTriple(InvShapes); cmsPipelineFree(Lut); return NULL; } // Change CLUT interpolation to trilinear static void ChangeInterpolationToTrilinear(cmsPipeline* Lut) { cmsStage* Stage; for (Stage = cmsPipelineGetPtrToFirstStage(Lut); Stage != NULL; Stage = cmsStageNext(Stage)) { if (cmsStageType(Stage) == cmsSigCLutElemType) { _cmsStageCLutData* CLUT = (_cmsStageCLutData*) Stage ->Data; CLUT ->Params->dwFlags |= CMS_LERP_FLAGS_TRILINEAR; _cmsSetInterpolationRoutine(Lut->ContextID, CLUT ->Params); } } } // Read the DToAX tag, adjusting the encoding of Lab or XYZ if needed static cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); cmsColorSpaceSignature dataSpace = cmsGetColorSpace(hProfile); if (Lut == NULL) return NULL; // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding, // and since the formatter has already accommodated to 0..1.0, we should undo this change if ( PCS == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) goto Error; } else if (PCS == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) goto Error; } // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline if ( dataSpace == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) goto Error; } else if (dataSpace == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) goto Error; } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // Create an output MPE LUT from a given profile. Version mismatches are handled here cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) { cmsTagTypeSignature OriginalType; cmsTagSignature tag16; cmsTagSignature tagFloat; cmsContext ContextID = cmsGetProfileContextID(hProfile); if (Intent <= INTENT_ABSOLUTE_COLORIMETRIC) { tag16 = PCS2Device16[Intent]; tagFloat = PCS2DeviceFloat[Intent]; if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence // Floating point LUT are always V4 return _cmsReadFloatOutputTag(hProfile, tagFloat); } // Revert to perceptual if no tag is found if (!cmsIsTag(hProfile, tag16)) { tag16 = PCS2Device16[0]; } if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? // Check profile version and LUT type. Do the necessary adjustments if needed // First read the tag cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16); if (Lut == NULL) return NULL; // After reading it, we have info about the original type OriginalType = _cmsGetTagTrueType(hProfile, tag16); // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); if (Lut == NULL) return NULL; // Now it is time for a controversial stuff. I found that for 3D LUTS using // Lab used as indexer space, trilinear interpolation should be used if (cmsGetPCS(hProfile) == cmsSigLabData) ChangeInterpolationToTrilinear(Lut); // We need to adjust data only for Lab and Lut16 type if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) return Lut; // Add a matrix for conversion V4 to V2 Lab PCS if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) goto Error; // If the output is Lab, add also a conversion at the end if (cmsGetColorSpace(hProfile) == cmsSigLabData) if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error; return Lut; Error: cmsPipelineFree(Lut); return NULL; } } // Lut not found, try to create a matrix-shaper // Check if this is a grayscale profile. if (cmsGetColorSpace(hProfile) == cmsSigGrayData) { // if so, build appropriate conversion tables. // The tables are the PCS iluminant, scaled across GrayTRC return BuildGrayOutputPipeline(hProfile); } // Not gray, create a normal matrix-shaper, which only operates in XYZ space return BuildRGBOutputMatrixShaper(hProfile); } // --------------------------------------------------------------------------------------------------------------- // Read the AToD0 tag, adjusting the encoding of Lab or XYZ if needed static cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*)cmsReadTag(hProfile, tagFloat)); cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); if (Lut == NULL) return NULL; if (spc == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) goto Error; } else if (spc == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) goto Error; } if (PCS == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) goto Error; } else if (PCS == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) goto Error; } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The // tag name here may default to AToB0 cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) { cmsPipeline* Lut; cmsTagTypeSignature OriginalType; cmsTagSignature tag16; cmsTagSignature tagFloat; cmsContext ContextID = cmsGetProfileContextID(hProfile); if (Intent > INTENT_ABSOLUTE_COLORIMETRIC) return NULL; tag16 = Device2PCS16[Intent]; tagFloat = Device2PCSFloat[Intent]; // On named color, take the appropriate tag if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*)cmsReadTag(hProfile, cmsSigNamedColor2Tag); if (nc == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 0, 0); if (Lut == NULL) goto Error; if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE))) goto Error; if (cmsGetColorSpace(hProfile) == cmsSigLabData) if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error; return Lut; Error: cmsPipelineFree(Lut); return NULL; } if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence // Floating point LUT are always V return _cmsReadFloatDevicelinkTag(hProfile, tagFloat); } tagFloat = Device2PCSFloat[0]; if (cmsIsTag(hProfile, tagFloat)) { return cmsPipelineDup((cmsPipeline*)cmsReadTag(hProfile, tagFloat)); } if (!cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? tag16 = Device2PCS16[0]; if (!cmsIsTag(hProfile, tag16)) return NULL; } // Check profile version and LUT type. Do the necessary adjustments if needed // Read the tag Lut = (cmsPipeline*)cmsReadTag(hProfile, tag16); if (Lut == NULL) return NULL; // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); if (Lut == NULL) return NULL; // Now it is time for a controversial stuff. I found that for 3D LUTS using // Lab used as indexer space, trilinear interpolation should be used if (cmsGetPCS(hProfile) == cmsSigLabData) ChangeInterpolationToTrilinear(Lut); // After reading it, we have info about the original type OriginalType = _cmsGetTagTrueType(hProfile, tag16); // We need to adjust data for Lab16 on output if (OriginalType != cmsSigLut16Type) return Lut; // Here it is possible to get Lab on both sides if (cmsGetColorSpace(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) goto Error2; } if (cmsGetPCS(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error2; } return Lut; Error2: cmsPipelineFree(Lut); return NULL; } // --------------------------------------------------------------------------------------------------------------- // Returns TRUE if the profile is implemented as matrix-shaper cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile) { switch (cmsGetColorSpace(hProfile)) { case cmsSigGrayData: return cmsIsTag(hProfile, cmsSigGrayTRCTag); case cmsSigRgbData: return (cmsIsTag(hProfile, cmsSigRedColorantTag) && cmsIsTag(hProfile, cmsSigGreenColorantTag) && cmsIsTag(hProfile, cmsSigBlueColorantTag) && cmsIsTag(hProfile, cmsSigRedTRCTag) && cmsIsTag(hProfile, cmsSigGreenTRCTag) && cmsIsTag(hProfile, cmsSigBlueTRCTag)); default: return FALSE; } } // Returns TRUE if the intent is implemented as CLUT cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) { const cmsTagSignature* TagTable; // For devicelinks, the supported intent is that one stated in the header if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) { return (cmsGetHeaderRenderingIntent(hProfile) == Intent); } switch (UsedDirection) { case LCMS_USED_AS_INPUT: TagTable = Device2PCS16; break; case LCMS_USED_AS_OUTPUT:TagTable = PCS2Device16; break; // For proofing, we need rel. colorimetric in output. Let's do some recursion case LCMS_USED_AS_PROOF: return cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_INPUT) && cmsIsIntentSupported(hProfile, INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT); default: cmsSignalError(cmsGetProfileContextID(hProfile), cmsERROR_RANGE, "Unexpected direction (%d)", UsedDirection); return FALSE; } // Extended intents are not strictly CLUT-based if (Intent > INTENT_ABSOLUTE_COLORIMETRIC) return FALSE; return cmsIsTag(hProfile, TagTable[Intent]); } // Return info about supported intents cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) { if (cmsIsCLUT(hProfile, Intent, UsedDirection)) return TRUE; // Is there any matrix-shaper? If so, the intent is supported. This is a bit odd, since V2 matrix shaper // does not fully support relative colorimetric because they cannot deal with non-zero black points, but // many profiles claims that, and this is certainly not true for V4 profiles. Lets answer "yes" no matter // the accuracy would be less than optimal in rel.col and v2 case. return cmsIsMatrixShaper(hProfile); } // --------------------------------------------------------------------------------------------------------------- // Read both, profile sequence description and profile sequence id if present. Then combine both to // create qa unique structure holding both. Shame on ICC to store things in such complicated way. cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile) { cmsSEQ* ProfileSeq; cmsSEQ* ProfileId; cmsSEQ* NewSeq; cmsUInt32Number i; // Take profile sequence description first ProfileSeq = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag); // Take profile sequence ID ProfileId = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag); if (ProfileSeq == NULL && ProfileId == NULL) return NULL; if (ProfileSeq == NULL) return cmsDupProfileSequenceDescription(ProfileId); if (ProfileId == NULL) return cmsDupProfileSequenceDescription(ProfileSeq); // We have to mix both together. For that they must agree if (ProfileSeq ->n != ProfileId ->n) return cmsDupProfileSequenceDescription(ProfileSeq); NewSeq = cmsDupProfileSequenceDescription(ProfileSeq); // Ok, proceed to the mixing if (NewSeq != NULL) { for (i=0; i < ProfileSeq ->n; i++) { memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID)); NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description); } } return NewSeq; } // Dump the contents of profile sequence in both tags (if v4 available) cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq) { if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE; if (cmsGetEncodedICCversion(hProfile) >= 0x4000000) { if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE; } return TRUE; } // Auxiliary, read and duplicate a MLU if found. static cmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig) { cmsMLU* mlu = (cmsMLU*) cmsReadTag(h, sig); if (mlu == NULL) return NULL; return cmsMLUdup(mlu); } // Create a sequence description out of an array of profiles cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]) { cmsUInt32Number i; cmsSEQ* seq = cmsAllocProfileSequenceDescription(ContextID, nProfiles); if (seq == NULL) return NULL; for (i=0; i < nProfiles; i++) { cmsPSEQDESC* ps = &seq ->seq[i]; cmsHPROFILE h = hProfiles[i]; cmsTechnologySignature* techpt; cmsGetHeaderAttributes(h, &ps ->attributes); cmsGetHeaderProfileID(h, ps ->ProfileID.ID8); ps ->deviceMfg = cmsGetHeaderManufacturer(h); ps ->deviceModel = cmsGetHeaderModel(h); techpt = (cmsTechnologySignature*) cmsReadTag(h, cmsSigTechnologyTag); if (techpt == NULL) ps ->technology = (cmsTechnologySignature) 0; else ps ->technology = *techpt; ps ->Manufacturer = GetMLUFromProfile(h, cmsSigDeviceMfgDescTag); ps ->Model = GetMLUFromProfile(h, cmsSigDeviceModelDescTag); ps ->Description = GetMLUFromProfile(h, cmsSigProfileDescriptionTag); } return seq; } // ------------------------------------------------------------------------------------------------------------------- static const cmsMLU* GetInfo(cmsHPROFILE hProfile, cmsInfoType Info) { cmsTagSignature sig; switch (Info) { case cmsInfoDescription: /** * Add for MacOS, which uses propiertary tags for description */ if (cmsIsTag(hProfile, cmsSigProfileDescriptionMLTag)) sig = cmsSigProfileDescriptionMLTag; else sig = cmsSigProfileDescriptionTag; break; case cmsInfoManufacturer: sig = cmsSigDeviceMfgDescTag; break; case cmsInfoModel: sig = cmsSigDeviceModelDescTag; break; case cmsInfoCopyright: sig = cmsSigCopyrightTag; break; default: return NULL; } return (cmsMLU*) cmsReadTag(hProfile, sig); } cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize) { const cmsMLU* mlu = GetInfo(hProfile, Info); if (mlu == NULL) return 0; return cmsMLUgetWide(mlu, LanguageCode, CountryCode, Buffer, BufferSize); } cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize) { const cmsMLU* mlu = GetInfo(hProfile, Info); if (mlu == NULL) return 0; return cmsMLUgetASCII(mlu, LanguageCode, CountryCode, Buffer, BufferSize); } cmsUInt32Number CMSEXPORT cmsGetProfileInfoUTF8(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize) { const cmsMLU* mlu = GetInfo(hProfile, Info); if (mlu == NULL) return 0; return cmsMLUgetUTF8(mlu, LanguageCode, CountryCode, Buffer, BufferSize); } lcms2-2.19.1/src/cmsmd5.c0000644000175000017500000002242515176573557014013 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- #include "lcms2_internal.h" #ifdef CMS_USE_BIG_ENDIAN static void byteReverse(cmsUInt8Number * buf, cmsUInt32Number longs) { do { cmsUInt32Number t = _cmsAdjustEndianess32(*(cmsUInt32Number *) buf); *(cmsUInt32Number *) buf = t; buf += sizeof(cmsUInt32Number); } while (--longs); } #else #define byteReverse(buf, len) #endif typedef struct { cmsUInt32Number buf[4]; cmsUInt32Number bits[2]; cmsUInt8Number in[64]; cmsContext ContextID; } _cmsMD5; #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) #define STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) static void cmsMD5_Transform(cmsUInt32Number buf[4], cmsUInt32Number in[16]) { CMSREGISTER cmsUInt32Number a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } // Create a MD5 object cmsHANDLE CMSEXPORT cmsMD5alloc(cmsContext ContextID) { _cmsMD5* ctx = (_cmsMD5*) _cmsMallocZero(ContextID, sizeof(_cmsMD5)); if (ctx == NULL) return NULL; ctx ->ContextID = ContextID; ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; return (cmsHANDLE) ctx; } void CMSEXPORT cmsMD5add(cmsHANDLE Handle, const cmsUInt8Number* buf, cmsUInt32Number len) { _cmsMD5* ctx = (_cmsMD5*) Handle; cmsUInt32Number t; t = ctx->bits[0]; if ((ctx->bits[0] = t + (len << 3)) < t) ctx->bits[1]++; ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; if (t) { cmsUInt8Number *p = (cmsUInt8Number *) ctx->in + t; t = 64 - t; if (len < t) { memmove(p, buf, len); return; } memmove(p, buf, t); byteReverse(ctx->in, 16); cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); buf += t; len -= t; } while (len >= 64) { memmove(ctx->in, buf, 64); byteReverse(ctx->in, 16); cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); buf += 64; len -= 64; } memmove(ctx->in, buf, len); } // Destroy the object and return the checksum void CMSEXPORT cmsMD5finish(cmsProfileID* ProfileID, cmsHANDLE Handle) { _cmsMD5* ctx = (_cmsMD5*) Handle; cmsUInt32Number count; cmsUInt8Number *p; count = (ctx->bits[0] >> 3) & 0x3F; p = ctx->in + count; *p++ = 0x80; count = 64 - 1 - count; if (count < 8) { memset(p, 0, count); byteReverse(ctx->in, 16); cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); memset(ctx->in, 0, 56); } else { memset(p, 0, count - 8); } byteReverse(ctx->in, 14); ((cmsUInt32Number *) ctx->in)[14] = ctx->bits[0]; ((cmsUInt32Number *) ctx->in)[15] = ctx->bits[1]; cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); byteReverse((cmsUInt8Number *) ctx->buf, 4); memmove(ProfileID ->ID8, ctx->buf, 16); _cmsFree(ctx ->ContextID, ctx); } // Assuming io points to an ICC profile, compute and store MD5 checksum // In the header, rendering intentent, flags and ID should be set to zero // before computing MD5 checksum (per 7.2.18 of ICC spec 4.4) cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile) { cmsContext ContextID; cmsUInt32Number BytesNeeded; cmsUInt8Number* Mem = NULL; cmsHANDLE MD5 = NULL; _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; _cmsICCPROFILE Keep; _cmsAssert(hProfile != NULL); ContextID = cmsGetProfileContextID(hProfile); // Save a copy of the profile header memmove(&Keep, Icc, sizeof(_cmsICCPROFILE)); // Set RI, flags and ID Icc ->flags = 0; Icc ->RenderingIntent = 0; memset(&Icc ->ProfileID, 0, sizeof(Icc ->ProfileID)); // Compute needed storage if (!cmsSaveProfileToMem(hProfile, NULL, &BytesNeeded)) goto Error; // Allocate memory Mem = (cmsUInt8Number*) _cmsMalloc(ContextID, BytesNeeded); if (Mem == NULL) goto Error; // Save to temporary storage if (!cmsSaveProfileToMem(hProfile, Mem, &BytesNeeded)) goto Error; // Create MD5 object MD5 = cmsMD5alloc(ContextID); if (MD5 == NULL) goto Error; // Add all bytes cmsMD5add(MD5, Mem, BytesNeeded); // Temp storage is no longer needed _cmsFree(ContextID, Mem); // Restore header memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); // And store the ID cmsMD5finish(&Icc ->ProfileID, MD5); return TRUE; Error: // Free resources as something went wrong // "MD5" cannot be other than NULL here, so no need to free it if (Mem != NULL) _cmsFree(ContextID, Mem); memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); return FALSE; } lcms2-2.19.1/src/cmsmtrx.c0000644000175000017500000001306215176573557014315 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" #define DSWAP(x, y) {cmsFloat64Number tmp = (x); (x)=(y); (y)=tmp;} // Initiate a vector void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z) { r -> n[VX] = x; r -> n[VY] = y; r -> n[VZ] = z; } // Vector subtraction void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b) { r -> n[VX] = a -> n[VX] - b -> n[VX]; r -> n[VY] = a -> n[VY] - b -> n[VY]; r -> n[VZ] = a -> n[VZ] - b -> n[VZ]; } // Vector cross product void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v) { r ->n[VX] = u->n[VY] * v->n[VZ] - v->n[VY] * u->n[VZ]; r ->n[VY] = u->n[VZ] * v->n[VX] - v->n[VZ] * u->n[VX]; r ->n[VZ] = u->n[VX] * v->n[VY] - v->n[VX] * u->n[VY]; } // Vector dot product cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v) { return u->n[VX] * v->n[VX] + u->n[VY] * v->n[VY] + u->n[VZ] * v->n[VZ]; } // Euclidean length cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a) { return sqrt(a ->n[VX] * a ->n[VX] + a ->n[VY] * a ->n[VY] + a ->n[VZ] * a ->n[VZ]); } // Euclidean distance cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b) { cmsFloat64Number d1 = a ->n[VX] - b ->n[VX]; cmsFloat64Number d2 = a ->n[VY] - b ->n[VY]; cmsFloat64Number d3 = a ->n[VZ] - b ->n[VZ]; return sqrt(d1*d1 + d2*d2 + d3*d3); } // 3x3 Identity void CMSEXPORT _cmsMAT3identity(cmsMAT3* a) { _cmsVEC3init(&a-> v[0], 1.0, 0.0, 0.0); _cmsVEC3init(&a-> v[1], 0.0, 1.0, 0.0); _cmsVEC3init(&a-> v[2], 0.0, 0.0, 1.0); } static cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b) { return fabs(b - a) < (1.0 / 65535.0); } cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a) { cmsMAT3 Identity; int i, j; _cmsMAT3identity(&Identity); for (i=0; i < 3; i++) for (j=0; j < 3; j++) if (!CloseEnough(a ->v[i].n[j], Identity.v[i].n[j])) return FALSE; return TRUE; } // Multiply two matrices void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b) { #define ROWCOL(i, j) \ a->v[i].n[0]*b->v[0].n[j] + a->v[i].n[1]*b->v[1].n[j] + a->v[i].n[2]*b->v[2].n[j] _cmsVEC3init(&r-> v[0], ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2)); _cmsVEC3init(&r-> v[1], ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2)); _cmsVEC3init(&r-> v[2], ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2)); #undef ROWCOL //(i, j) } // Inverse of a matrix b = a^(-1) cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b) { cmsFloat64Number det, c0, c1, c2; c0 = a -> v[1].n[1]*a -> v[2].n[2] - a -> v[1].n[2]*a -> v[2].n[1]; c1 = -a -> v[1].n[0]*a -> v[2].n[2] + a -> v[1].n[2]*a -> v[2].n[0]; c2 = a -> v[1].n[0]*a -> v[2].n[1] - a -> v[1].n[1]*a -> v[2].n[0]; det = a -> v[0].n[0]*c0 + a -> v[0].n[1]*c1 + a -> v[0].n[2]*c2; if (fabs(det) < MATRIX_DET_TOLERANCE) return FALSE; // singular matrix; can't invert b -> v[0].n[0] = c0/det; b -> v[0].n[1] = (a -> v[0].n[2]*a -> v[2].n[1] - a -> v[0].n[1]*a -> v[2].n[2])/det; b -> v[0].n[2] = (a -> v[0].n[1]*a -> v[1].n[2] - a -> v[0].n[2]*a -> v[1].n[1])/det; b -> v[1].n[0] = c1/det; b -> v[1].n[1] = (a -> v[0].n[0]*a -> v[2].n[2] - a -> v[0].n[2]*a -> v[2].n[0])/det; b -> v[1].n[2] = (a -> v[0].n[2]*a -> v[1].n[0] - a -> v[0].n[0]*a -> v[1].n[2])/det; b -> v[2].n[0] = c2/det; b -> v[2].n[1] = (a -> v[0].n[1]*a -> v[2].n[0] - a -> v[0].n[0]*a -> v[2].n[1])/det; b -> v[2].n[2] = (a -> v[0].n[0]*a -> v[1].n[1] - a -> v[0].n[1]*a -> v[1].n[0])/det; return TRUE; } // Solve a system in the form Ax = b cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b) { cmsMAT3 m, a_1; memmove(&m, a, sizeof(cmsMAT3)); if (!_cmsMAT3inverse(&m, &a_1)) return FALSE; // Singular matrix _cmsMAT3eval(x, &a_1, b); return TRUE; } // Evaluate a vector across a matrix void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v) { r->n[VX] = a->v[0].n[VX]*v->n[VX] + a->v[0].n[VY]*v->n[VY] + a->v[0].n[VZ]*v->n[VZ]; r->n[VY] = a->v[1].n[VX]*v->n[VX] + a->v[1].n[VY]*v->n[VY] + a->v[1].n[VZ]*v->n[VZ]; r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ]; } lcms2-2.19.1/src/cmspack.c0000644000175000017500000040654715176573557014257 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // This module handles all formats supported by lcms. There are two flavors, 16 bits and // floating point. Floating point is supported only in a subset, those formats holding // cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component // as special case) // --------------------------------------------------------------------------- // This macro return words stored as big endian #define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) // These macros handles reversing (negative) #define REVERSE_FLAVOR_8(x) ((cmsUInt8Number) (0xff-(x))) #define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x))) // * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x) { int a = (x << 8 | x) >> 8; // * 257 / 256 if ( a > 0xffff) return 0xffff; return (cmsUInt16Number) a; } // * 0xf00 / 0xffff = * 256 / 257 cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x) { return (cmsUInt16Number) (((x << 8) + 0x80) / 257); } typedef struct { cmsUInt32Number Type; cmsUInt32Number Mask; cmsFormatter16 Frm; } cmsFormatters16; typedef struct { cmsUInt32Number Type; cmsUInt32Number Mask; cmsFormatterFloat Frm; } cmsFormattersFloat; #define ANYSPACE COLORSPACE_SH(31) #define ANYCHANNELS CHANNELS_SH(15) #define ANYEXTRA EXTRA_SH(7) #define ANYPLANAR PLANAR_SH(1) #define ANYENDIAN ENDIAN16_SH(1) #define ANYSWAP DOSWAP_SH(1) #define ANYSWAPFIRST SWAPFIRST_SH(1) #define ANYFLAVOR FLAVOR_SH(1) #define ANYPREMUL PREMUL_SH(1) // Suppress waning about info never being used #ifdef _MSC_VER #pragma warning(disable : 4100) #endif // Unpacking routines (16 bits) ---------------------------------------------------------------------------------------- // Does almost everything but is slow static cmsUInt8Number* UnrollChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); cmsUInt32Number Premul = T_PREMUL(info->InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number v; cmsUInt32Number i; cmsUInt32Number alpha_factor = 1; if (ExtraFirst) { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0])); accum += Extra; } else { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan])); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = FROM_8_TO_16(*accum); v = Reverse ? REVERSE_FLAVOR_16(v) : v; if (Premul && alpha_factor > 0) { v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); if (v > 0xffff) v = 0xffff; } wIn[index] = (cmsUInt16Number) v; accum++; } if (!ExtraFirst) { accum += Extra; } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // Extra channels are just ignored because come in the next planes static cmsUInt8Number* UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number i; cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Extra = T_EXTRA(info->InputFormat); cmsUInt32Number Premul = T_PREMUL(info->InputFormat); cmsUInt8Number* Init = accum; cmsUInt32Number alpha_factor = 1; if (ExtraFirst) { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0])); accum += Extra * Stride; } else { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan * Stride])); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; cmsUInt32Number v = FROM_8_TO_16(*accum); v = Reverse ? REVERSE_FLAVOR_16(v) : v; if (Premul && alpha_factor > 0) { v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); if (v > 0xffff) v = 0xffff; } wIn[index] = (cmsUInt16Number) v; accum += Stride; } return (Init + 1); } // Special cases, provided for performance static cmsUInt8Number* Unroll4Bytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(*accum); accum++; // C wIn[1] = FROM_8_TO_16(*accum); accum++; // M wIn[2] = FROM_8_TO_16(*accum); accum++; // Y wIn[3] = FROM_8_TO_16(*accum); accum++; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4BytesReverse(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[3] = FROM_8_TO_16(*accum); accum++; // K wIn[0] = FROM_8_TO_16(*accum); accum++; // C wIn[1] = FROM_8_TO_16(*accum); accum++; // M wIn[2] = FROM_8_TO_16(*accum); accum++; // Y return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KYMC static cmsUInt8Number* Unroll4BytesSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[3] = FROM_8_TO_16(*accum); accum++; // K wIn[2] = FROM_8_TO_16(*accum); accum++; // Y wIn[1] = FROM_8_TO_16(*accum); accum++; // M wIn[0] = FROM_8_TO_16(*accum); accum++; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[2] = FROM_8_TO_16(*accum); accum++; // K wIn[1] = FROM_8_TO_16(*accum); accum++; // Y wIn[0] = FROM_8_TO_16(*accum); accum++; // M wIn[3] = FROM_8_TO_16(*accum); accum++; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3Bytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(*accum); accum++; // R wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[2] = FROM_8_TO_16(*accum); accum++; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3BytesSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { accum++; // A wIn[2] = FROM_8_TO_16(*accum); accum++; // B wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[0] = FROM_8_TO_16(*accum); accum++; // R return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[2] = FROM_8_TO_16(*accum); accum++; // B wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[0] = FROM_8_TO_16(*accum); accum++; // R accum++; // A return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3BytesSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { accum++; // A wIn[0] = FROM_8_TO_16(*accum); accum++; // R wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[2] = FROM_8_TO_16(*accum); accum++; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // BRG static cmsUInt8Number* Unroll3BytesSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[2] = FROM_8_TO_16(*accum); accum++; // B wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[0] = FROM_8_TO_16(*accum); accum++; // R return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollLabV2_8(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollALabV2_8(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { accum++; // A wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollLabV2_16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // for duplex static cmsUInt8Number* Unroll2Bytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(*accum); accum++; // ch1 wIn[1] = FROM_8_TO_16(*accum); accum++; // ch2 return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // Monochrome duplicates L into RGB for null-transforms static cmsUInt8Number* Unroll1Byte(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1ByteSkip1(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L accum += 1; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1ByteSkip2(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L accum += 2; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1ByteReversed(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++; // L return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollAnyWords(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number i; if (ExtraFirst) { accum += Extra * sizeof(cmsUInt16Number); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; cmsUInt16Number v = *(cmsUInt16Number*) accum; if (SwapEndian) v = CHANGE_ENDIAN(v); wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; accum += sizeof(cmsUInt16Number); } if (!ExtraFirst) { accum += Extra * sizeof(cmsUInt16Number); } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } return accum; cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollAnyWordsPremul(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number i; cmsUInt16Number alpha = (ExtraFirst ? ((cmsUInt16Number*)accum)[0] : ((cmsUInt16Number*)accum)[nChan]); cmsUInt32Number alpha_factor = _cmsToFixedDomain(alpha); if (ExtraFirst) { accum += sizeof(cmsUInt16Number); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; cmsUInt32Number v = *(cmsUInt16Number*) accum; if (SwapEndian) v = CHANGE_ENDIAN(v); if (alpha_factor > 0) { v = (v << 16) / alpha_factor; if (v > 0xffff) v = 0xffff; } wIn[index] = (cmsUInt16Number) (Reverse ? REVERSE_FLAVOR_16(v) : v); accum += sizeof(cmsUInt16Number); } if (!ExtraFirst) { accum += sizeof(cmsUInt16Number); } return accum; cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollPlanarWords(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap= T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse= T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); cmsUInt32Number i; cmsUInt8Number* Init = accum; if (DoSwap) { accum += T_EXTRA(info -> InputFormat) * Stride; } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; cmsUInt16Number v = *(cmsUInt16Number*) accum; if (SwapEndian) v = CHANGE_ENDIAN(v); wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; accum += Stride; } return (Init + sizeof(cmsUInt16Number)); } static cmsUInt8Number* UnrollPlanarWordsPremul(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap= T_DOSWAP(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); cmsUInt32Number Reverse= T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); cmsUInt32Number i; cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt8Number* Init = accum; cmsUInt16Number alpha = (ExtraFirst ? ((cmsUInt16Number*)accum)[0] : ((cmsUInt16Number*)accum)[nChan * Stride / 2]); cmsUInt32Number alpha_factor = _cmsToFixedDomain(alpha); if (ExtraFirst) { accum += Stride; } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; cmsUInt32Number v = (cmsUInt32Number) *(cmsUInt16Number*) accum; if (SwapEndian) v = CHANGE_ENDIAN(v); if (alpha_factor > 0) { v = (v << 16) / alpha_factor; if (v > 0xffff) v = 0xffff; } wIn[index] = (cmsUInt16Number) (Reverse ? REVERSE_FLAVOR_16(v) : v); accum += Stride; } return (Init + sizeof(cmsUInt16Number)); } static cmsUInt8Number* Unroll4Words(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4WordsReverse(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4WordsSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KYMC static cmsUInt8Number* Unroll4WordsSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4WordsSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3Words(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C R wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3WordsSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // C R wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // Y B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3WordsSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { accum += 2; // A wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3WordsSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { accum += 2; // A wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1Word(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1WordReversed(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1WordSkip3(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum += 8; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll2Words(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // ch1 wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // ch2 return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // This is a conversion of Lab double to 16 bits static cmsUInt8Number* UnrollLabDoubleTo16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { if (T_PLANAR(info -> InputFormat)) { cmsCIELab Lab; cmsUInt8Number* pos_L; cmsUInt8Number* pos_a; cmsUInt8Number* pos_b; pos_L = accum; pos_a = accum + Stride; pos_b = accum + Stride * 2; Lab.L = *(cmsFloat64Number*) pos_L; Lab.a = *(cmsFloat64Number*) pos_a; Lab.b = *(cmsFloat64Number*) pos_b; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat64Number); } else { cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum); accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); return accum; } } // This is a conversion of Lab float to 16 bits static cmsUInt8Number* UnrollLabFloatTo16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsCIELab Lab; if (T_PLANAR(info -> InputFormat)) { cmsUInt8Number* pos_L; cmsUInt8Number* pos_a; cmsUInt8Number* pos_b; pos_L = accum; pos_a = accum + Stride; pos_b = accum + Stride * 2; Lab.L = *(cmsFloat32Number*)pos_L; Lab.a = *(cmsFloat32Number*)pos_a; Lab.b = *(cmsFloat32Number*)pos_b; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat32Number); } else { Lab.L = ((cmsFloat32Number*) accum)[0]; Lab.a = ((cmsFloat32Number*) accum)[1]; Lab.b = ((cmsFloat32Number*) accum)[2]; cmsFloat2LabEncoded(wIn, &Lab); accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number); return accum; } } // This is a conversion of XYZ double to 16 bits static cmsUInt8Number* UnrollXYZDoubleTo16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { if (T_PLANAR(info -> InputFormat)) { cmsCIEXYZ XYZ; cmsUInt8Number* pos_X; cmsUInt8Number* pos_Y; cmsUInt8Number* pos_Z; pos_X = accum; pos_Y = accum + Stride; pos_Z = accum + Stride * 2; XYZ.X = *(cmsFloat64Number*)pos_X; XYZ.Y = *(cmsFloat64Number*)pos_Y; XYZ.Z = *(cmsFloat64Number*)pos_Z; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat64Number); } else { cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum); accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); return accum; } } // This is a conversion of XYZ float to 16 bits static cmsUInt8Number* UnrollXYZFloatTo16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { if (T_PLANAR(info -> InputFormat)) { cmsCIEXYZ XYZ; cmsUInt8Number* pos_X; cmsUInt8Number* pos_Y; cmsUInt8Number* pos_Z; pos_X = accum; pos_Y = accum + Stride; pos_Z = accum + Stride * 2; XYZ.X = *(cmsFloat32Number*)pos_X; XYZ.Y = *(cmsFloat32Number*)pos_Y; XYZ.Z = *(cmsFloat32Number*)pos_Z; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat32Number); } else { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; cmsCIEXYZ XYZ; XYZ.X = Pt[0]; XYZ.Y = Pt[1]; XYZ.Z = Pt[2]; cmsFloat2XYZEncoded(wIn, &XYZ); accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number); return accum; } } // Check if space is marked as ink cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type) { switch (T_COLORSPACE(Type)) { case PT_CMY: case PT_CMYK: case PT_MCH5: case PT_MCH6: case PT_MCH7: case PT_MCH8: case PT_MCH9: case PT_MCH10: case PT_MCH11: case PT_MCH12: case PT_MCH13: case PT_MCH14: case PT_MCH15: return TRUE; default: return FALSE; } } // Return the size in bytes of a given formatter cmsINLINE cmsUInt32Number PixelSize(cmsUInt32Number Format) { cmsUInt32Number fmt_bytes = T_BYTES(Format); // For double, the T_BYTES field is zero if (fmt_bytes == 0) return sizeof(cmsUInt64Number); // Otherwise, it is already correct for all formats return fmt_bytes; } // Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits static cmsUInt8Number* UnrollDoubleTo16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); cmsFloat64Number v; cmsUInt16Number vi; cmsUInt32Number i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; else v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start]; vi = _cmsQuickSaturateWord(v * maximum); if (Reverse) vi = REVERSE_FLAVOR_16(vi); wIn[index] = vi; } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat64Number); else return accum + (nChan + Extra) * sizeof(cmsFloat64Number); } static cmsUInt8Number* UnrollFloatTo16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; cmsUInt16Number vi; cmsUInt32Number i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; else v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; vi = _cmsQuickSaturateWord(v * maximum); if (Reverse) vi = REVERSE_FLAVOR_16(vi); wIn[index] = vi; } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat32Number); else return accum + (nChan + Extra) * sizeof(cmsFloat32Number); } // For 1 channel, we need to duplicate data (it comes in 0..1.0 range) static cmsUInt8Number* UnrollDouble1Chan(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsFloat64Number* Inks = (cmsFloat64Number*) accum; wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0); return accum + sizeof(cmsFloat64Number); cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } //------------------------------------------------------------------------------------------------------------------- // For anything going from cmsUInt8Number static cmsUInt8Number* Unroll8ToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); cmsUInt32Number Extra = T_EXTRA(info->InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info->InputFormat); cmsFloat32Number v; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat32Number) ((cmsUInt8Number *)accum)[(i + start) * Stride]; else v = (cmsFloat32Number) ((cmsUInt8Number *)accum)[i + start]; v /= 255.0F; wIn[index] = Reverse ? 1 - v : v; } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan - 1) * sizeof(cmsFloat32Number)); wIn[nChan - 1] = tmp; } if (T_PLANAR(info->InputFormat)) return accum + sizeof(cmsUInt8Number); else return accum + (nChan + Extra) * sizeof(cmsUInt8Number); } // For anything going from cmsUInt16Number static cmsUInt8Number* Unroll16ToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); cmsUInt32Number Extra = T_EXTRA(info->InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info->InputFormat); cmsFloat32Number v; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat32Number)((cmsUInt16Number*)accum)[(i + start) * Stride]; else v = (cmsFloat32Number)((cmsUInt16Number*)accum)[i + start]; v /= 65535.0F; wIn[index] = Reverse ? 1 - v : v; } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan - 1) * sizeof(cmsFloat32Number)); wIn[nChan - 1] = tmp; } if (T_PLANAR(info->InputFormat)) return accum + sizeof(cmsUInt16Number); else return accum + (nChan + Extra) * sizeof(cmsUInt16Number); } // For anything going from cmsFloat32Number static cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); cmsUInt32Number Extra = T_EXTRA(info->InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info->InputFormat); cmsUInt32Number Premul = T_PREMUL(info->InputFormat); cmsFloat32Number v; cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info->InputFormat) ? 100.0F : 1.0F; cmsFloat32Number alpha_factor = 1.0f; cmsFloat32Number* ptr = (cmsFloat32Number*)accum; Stride /= PixelSize(info->InputFormat); if (Premul && Extra) { if (Planar) alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan * Stride]) / maximum; else alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum; } if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = ptr[(i + start) * Stride]; else v = ptr[i + start]; if (Premul && alpha_factor > 0) v /= alpha_factor; v /= maximum; wIn[index] = Reverse ? 1 - v : v; } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat32Number); else return accum + (nChan + Extra) * sizeof(cmsFloat32Number); } // For anything going from double static cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); cmsUInt32Number Extra = T_EXTRA(info->InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info->InputFormat); cmsUInt32Number Premul = T_PREMUL(info->InputFormat); cmsFloat64Number v; cmsUInt32Number i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; cmsFloat64Number alpha_factor = 1.0; cmsFloat64Number* ptr = (cmsFloat64Number*)accum; Stride /= PixelSize(info->InputFormat); if (Premul && Extra) { if (Planar) alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan * Stride]) / maximum; else alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum; } if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; else v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start]; if (Premul && alpha_factor > 0) v /= alpha_factor; v /= maximum; wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v); } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat64Number); else return accum + (nChan + Extra) * sizeof(cmsFloat64Number); } // From Lab double to cmsFloat32Number static cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat64Number* Pt = (cmsFloat64Number*) accum; if (T_PLANAR(info -> InputFormat)) { Stride /= PixelSize(info->InputFormat); wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); return accum + sizeof(cmsFloat64Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } // From Lab double to cmsFloat32Number static cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; if (T_PLANAR(info -> InputFormat)) { Stride /= PixelSize(info->InputFormat); wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); return accum + sizeof(cmsFloat32Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } // 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF) static cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat64Number* Pt = (cmsFloat64Number*) accum; if (T_PLANAR(info -> InputFormat)) { Stride /= PixelSize(info->InputFormat); wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); return accum + sizeof(cmsFloat64Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } static cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; if (T_PLANAR(info -> InputFormat)) { Stride /= PixelSize(info->InputFormat); wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); return accum + sizeof(cmsFloat32Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } cmsINLINE void lab4toFloat(cmsFloat32Number wIn[], cmsUInt16Number lab4[3]) { cmsFloat32Number L = (cmsFloat32Number) lab4[0] / 655.35F; cmsFloat32Number a = ((cmsFloat32Number) lab4[1] / 257.0F) - 128.0F; cmsFloat32Number b = ((cmsFloat32Number) lab4[2] / 257.0F) - 128.0F; wIn[0] = (L / 100.0F); // from 0..100 to 0..1 wIn[1] = ((a + 128.0F) / 255.0F); // form -128..+127 to 0..1 wIn[2] = ((b + 128.0F) / 255.0F); } static cmsUInt8Number* UnrollLabV2_8ToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt16Number lab4[3]; lab4[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L lab4[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a lab4[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b lab4toFloat(wIn, lab4); return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollALabV2_8ToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt16Number lab4[3]; accum++; // A lab4[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L lab4[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a lab4[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b lab4toFloat(wIn, lab4); return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollLabV2_16ToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt16Number lab4[3]; lab4[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L lab4[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a lab4[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b lab4toFloat(wIn, lab4); return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // Packing routines ----------------------------------------------------------------------------------------------------------- // Generic chunky for byte static cmsUInt8Number* PackChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt8Number* swap1; cmsUInt16Number v = 0; cmsUInt32Number i; cmsUInt32Number alpha_factor = 0; swap1 = output; if (ExtraFirst) { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0])); output += Extra; } else { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan])); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index]; if (Reverse) v = REVERSE_FLAVOR_16(v); if (Premul) { v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); } *output++ = FROM_16_TO_8(v); } if (!ExtraFirst) { output += Extra; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, nChan-1); *swap1 = FROM_16_TO_8(v); } return output; cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackChunkyWords(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number SwapEndian = T_ENDIAN16(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt16Number* swap1; cmsUInt16Number v = 0; cmsUInt32Number i; cmsUInt32Number alpha_factor = 0; swap1 = (cmsUInt16Number*) output; if (ExtraFirst) { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(*(cmsUInt16Number*) output); output += Extra * sizeof(cmsUInt16Number); } else { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[nChan]); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index]; if (SwapEndian) v = CHANGE_ENDIAN(v); if (Reverse) v = REVERSE_FLAVOR_16(v); if (Premul) { v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); } *(cmsUInt16Number*) output = v; output += sizeof(cmsUInt16Number); } if (!ExtraFirst) { output += Extra * sizeof(cmsUInt16Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); *swap1 = v; } return output; cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); cmsUInt32Number i; cmsUInt8Number* Init = output; cmsUInt32Number alpha_factor = 0; if (ExtraFirst) { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0])); output += Extra * Stride; } else { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan * Stride])); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; cmsUInt16Number v = wOut[index]; if (Reverse) v = REVERSE_FLAVOR_16(v); if (Premul) { v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); } *(cmsUInt8Number*)output = FROM_16_TO_8(v); output += Stride; } return (Init + 1); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackPlanarWords(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); cmsUInt32Number SwapEndian = T_ENDIAN16(info->OutputFormat); cmsUInt32Number i; cmsUInt8Number* Init = output; cmsUInt16Number v; cmsUInt32Number alpha_factor = 0; if (ExtraFirst) { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[0]); output += Extra * Stride; } else { if (Premul && Extra) alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*)output)[nChan * Stride]); } for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index]; if (SwapEndian) v = CHANGE_ENDIAN(v); if (Reverse) v = REVERSE_FLAVOR_16(v); if (Premul) { v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); } *(cmsUInt16Number*) output = v; output += Stride; } return (Init + sizeof(cmsUInt16Number)); } // CMYKcm (unrolled for speed) static cmsUInt8Number* Pack6Bytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[4]); *output++ = FROM_16_TO_8(wOut[5]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KCMYcm static cmsUInt8Number* Pack6BytesSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[5]); *output++ = FROM_16_TO_8(wOut[4]); *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // CMYKcm static cmsUInt8Number* Pack6Words(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[3]; output+= 2; *(cmsUInt16Number*) output = wOut[4]; output+= 2; *(cmsUInt16Number*) output = wOut[5]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KCMYcm static cmsUInt8Number* Pack6WordsSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[5]; output+= 2; *(cmsUInt16Number*) output = wOut[4]; output+= 2; *(cmsUInt16Number*) output = wOut[3]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4Bytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[3]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4BytesReverse(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0])); *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1])); *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2])); *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // ABGR static cmsUInt8Number* Pack4BytesSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[3]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4Words(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[3]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4WordsReverse(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); output+= 2; *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]); output+= 2; *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]); output+= 2; *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // ABGR static cmsUInt8Number* Pack4WordsSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[3]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // CMYK static cmsUInt8Number* Pack4WordsBigEndian(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackLabV2_8(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackALabV2_8(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackLabV2_16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]); output += 2; *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]); output += 2; *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]); output += 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3Bytes(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesOptimized(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = (wOut[0] & 0xFFU); *output++ = (wOut[1] & 0xFFU); *output++ = (wOut[2] & 0xFFU); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesSwapOptimized(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = (wOut[2] & 0xFFU); *output++ = (wOut[1] & 0xFFU); *output++ = (wOut[0] & 0xFFU); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3Words(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsSwap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsBigEndian(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1Optimized(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = (wOut[0] & 0xFFU); *output++ = (wOut[1] & 0xFFU); *output++ = (wOut[2] & 0xFFU); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output++; *output++ = (wOut[0] & 0xFFU); *output++ = (wOut[1] & 0xFFU); *output++ = (wOut[2] & 0xFFU); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output++; *output++ = (wOut[2] & 0xFFU); *output++ = (wOut[1] & 0xFFU); *output++ = (wOut[0] & 0xFFU); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = (wOut[2] & 0xFFU); *output++ = (wOut[1] & 0xFFU); *output++ = (wOut[0] & 0xFFU); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1Byte(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1ByteReversed(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1ByteSkip1(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1ByteSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1Word(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordReversed(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordBigEndian(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordSkip1(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 4; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { output += 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // Unencoded Float values -- don't try optimize speed static cmsUInt8Number* PackLabDoubleFrom16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { if (T_PLANAR(info -> OutputFormat)) { cmsCIELab Lab; cmsFloat64Number* Out = (cmsFloat64Number*) output; cmsLabEncoded2Float(&Lab, wOut); Out[0] = Lab.L; Out[Stride] = Lab.a; Out[Stride*2] = Lab.b; return output + sizeof(cmsFloat64Number); } else { cmsLabEncoded2Float((cmsCIELab*) output, wOut); return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number)); } } static cmsUInt8Number* PackLabFloatFrom16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, wOut); if (T_PLANAR(info -> OutputFormat)) { cmsFloat32Number* Out = (cmsFloat32Number*) output; Stride /= PixelSize(info->OutputFormat); Out[0] = (cmsFloat32Number)Lab.L; Out[Stride] = (cmsFloat32Number)Lab.a; Out[Stride*2] = (cmsFloat32Number)Lab.b; return output + sizeof(cmsFloat32Number); } else { ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L; ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a; ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b; return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number); } } static cmsUInt8Number* PackXYZDoubleFrom16(CMSREGISTER _cmsTRANSFORM* Info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { if (T_PLANAR(Info -> OutputFormat)) { cmsCIEXYZ XYZ; cmsFloat64Number* Out = (cmsFloat64Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); Stride /= PixelSize(Info->OutputFormat); Out[0] = XYZ.X; Out[Stride] = XYZ.Y; Out[Stride*2] = XYZ.Z; return output + sizeof(cmsFloat64Number); } else { cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut); return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); } } static cmsUInt8Number* PackXYZFloatFrom16(CMSREGISTER _cmsTRANSFORM* Info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { if (T_PLANAR(Info -> OutputFormat)) { cmsCIEXYZ XYZ; cmsFloat32Number* Out = (cmsFloat32Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); Stride /= PixelSize(Info->OutputFormat); Out[0] = (cmsFloat32Number) XYZ.X; Out[Stride] = (cmsFloat32Number) XYZ.Y; Out[Stride*2] = (cmsFloat32Number) XYZ.Z; return output + sizeof(cmsFloat32Number); } else { cmsCIEXYZ XYZ; cmsFloat32Number* Out = (cmsFloat32Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); Out[0] = (cmsFloat32Number) XYZ.X; Out[1] = (cmsFloat32Number) XYZ.Y; Out[2] = (cmsFloat32Number) XYZ.Z; return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); } } static cmsUInt8Number* PackDoubleFrom16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info -> OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> OutputFormat); cmsUInt32Number Planar = T_PLANAR(info -> OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; cmsFloat64Number v = 0; cmsFloat64Number* swap1 = (cmsFloat64Number*) output; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = (cmsFloat64Number) wOut[index] / maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat64Number*) output)[(i + start) * Stride]= v; else ((cmsFloat64Number*) output)[i + start] = v; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); *swap1 = v; } if (T_PLANAR(info -> OutputFormat)) return output + sizeof(cmsFloat64Number); else return output + (nChan + Extra) * sizeof(cmsFloat64Number); } static cmsUInt8Number* PackFloatFrom16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 655.35 : 65535.0; cmsFloat64Number v = 0; cmsFloat32Number* swap1 = (cmsFloat32Number*)output; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = (cmsFloat64Number)wOut[index] / maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat32Number*)output)[(i + start) * Stride] = (cmsFloat32Number)v; else ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number)); *swap1 = (cmsFloat32Number)v; } if (T_PLANAR(info->OutputFormat)) return output + sizeof(cmsFloat32Number); else return output + (nChan + Extra) * sizeof(cmsFloat32Number); } // -------------------------------------------------------------------------------------------------------- static cmsUInt8Number* PackBytesFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt8Number* swap1 = (cmsUInt8Number*)output; cmsFloat64Number v = 0; cmsUInt8Number vv = 0; cmsUInt32Number i, start = 0; if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * 65535.0; if (Reverse) v = 65535.0 - v; vv = FROM_16_TO_8(_cmsQuickSaturateWord(v)); if (Planar) ((cmsUInt8Number*)output)[(i + start) * Stride] = vv; else ((cmsUInt8Number*)output)[i + start] = vv; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan - 1) * sizeof(cmsUInt8Number)); *swap1 = vv; } if (T_PLANAR(info->OutputFormat)) return output + sizeof(cmsUInt8Number); else return output + (nChan + Extra) * sizeof(cmsUInt8Number); } static cmsUInt8Number* PackWordsFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt16Number* swap1 = (cmsUInt16Number*)output; cmsFloat64Number v = 0; cmsUInt16Number vv = 0; cmsUInt32Number i, start = 0; if (ExtraFirst) start = Extra; Stride /= 2; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * 65535.0; if (Reverse) v = 65535.0 - v; vv = _cmsQuickSaturateWord(v); if (Planar) ((cmsUInt16Number*)output)[(i + start) * Stride] = vv; else ((cmsUInt16Number*)output)[i + start] = vv; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan - 1) * sizeof(cmsUInt16Number)); *swap1 = vv; } if (T_PLANAR(info->OutputFormat)) return output + sizeof(cmsUInt16Number); else return output + (nChan + Extra) * sizeof(cmsUInt16Number); } static cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0; cmsFloat32Number* swap1 = (cmsFloat32Number*)output; cmsFloat64Number v = 0; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat32Number*)output)[(i + start) * Stride] = (cmsFloat32Number)v; else ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number)); *swap1 = (cmsFloat32Number)v; } if (T_PLANAR(info->OutputFormat)) return output + sizeof(cmsFloat32Number); else return output + (nChan + Extra) * sizeof(cmsFloat32Number); } static cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0; cmsFloat64Number v = 0; cmsFloat64Number* swap1 = (cmsFloat64Number*)output; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat64Number*)output)[(i + start) * Stride] = v; else ((cmsFloat64Number*)output)[i + start] = v; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat64Number)); *swap1 = v; } if (T_PLANAR(info->OutputFormat)) return output + sizeof(cmsFloat64Number); else return output + (nChan + Extra) * sizeof(cmsFloat64Number); } static cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat32Number* Out = (cmsFloat32Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Stride /= PixelSize(Info->OutputFormat); Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); return output + sizeof(cmsFloat32Number); } else { Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); } } static cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat64Number* Out = (cmsFloat64Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Stride /= PixelSize(Info->OutputFormat); Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); return output + sizeof(cmsFloat64Number); } else { Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); } } static cmsUInt8Number* PackEncodedBytesLabV2FromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsCIELab Lab; cmsUInt16Number wlab[3]; Lab.L = (cmsFloat64Number)(wOut[0] * 100.0); Lab.a = (cmsFloat64Number)(wOut[1] * 255.0 - 128.0); Lab.b = (cmsFloat64Number)(wOut[2] * 255.0 - 128.0); cmsFloat2LabEncoded(wlab, &Lab); if (T_PLANAR(Info -> OutputFormat)) { Stride /= PixelSize(Info->OutputFormat); output[0] = wlab[0] >> 8; output[Stride] = wlab[1] >> 8; output[Stride*2] = wlab[2] >> 8; return output + 1; } else { output[0] = wlab[0] >> 8; output[1] = wlab[1] >> 8; output[2] = wlab[2] >> 8; return output + (3 + T_EXTRA(Info ->OutputFormat)); } } static cmsUInt8Number* PackEncodedWordsLabV2FromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsCIELab Lab; cmsUInt16Number wlab[3]; Lab.L = (cmsFloat64Number)(wOut[0] * 100.0); Lab.a = (cmsFloat64Number)(wOut[1] * 255.0 - 128.0); Lab.b = (cmsFloat64Number)(wOut[2] * 255.0 - 128.0); cmsFloat2LabEncodedV2(wlab, &Lab); if (T_PLANAR(Info -> OutputFormat)) { Stride /= PixelSize(Info->OutputFormat); ((cmsUInt16Number*) output)[0] = wlab[0]; ((cmsUInt16Number*) output)[Stride] = wlab[1]; ((cmsUInt16Number*) output)[Stride*2] = wlab[2]; return output + sizeof(cmsUInt16Number); } else { ((cmsUInt16Number*) output)[0] = wlab[0]; ((cmsUInt16Number*) output)[1] = wlab[1]; ((cmsUInt16Number*) output)[2] = wlab[2]; return output + (3 + T_EXTRA(Info ->OutputFormat)) * sizeof(cmsUInt16Number); } } // From 0..1 range to 0..MAX_ENCODEABLE_XYZ static cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat32Number* Out = (cmsFloat32Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Stride /= PixelSize(Info->OutputFormat); Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + sizeof(cmsFloat32Number); } else { Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); } } // Same, but convert to double static cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat64Number* Out = (cmsFloat64Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Stride /= PixelSize(Info->OutputFormat); Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + sizeof(cmsFloat64Number); } else { Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); } } // ---------------------------------------------------------------------------------------------------------------- #ifndef CMS_NO_HALF_SUPPORT // Decodes an stream of half floats to wIn[] described by input format static cmsUInt8Number* UnrollHalfTo16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F; Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); else v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; if (Reverse) v = maximum - v; wIn[index] = _cmsQuickSaturateWord((cmsFloat64Number) v * maximum); } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsUInt16Number); else return accum + (nChan + Extra) * sizeof(cmsUInt16Number); } // Decodes an stream of half floats to wIn[] described by input format static cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); else v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; v /= maximum; wIn[index] = Reverse ? 1 - v : v; } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsUInt16Number); else return accum + (nChan + Extra) * sizeof(cmsUInt16Number); } static cmsUInt8Number* PackHalfFrom16(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 655.35F : 65535.0F; cmsFloat32Number v = 0; cmsUInt16Number* swap1 = (cmsUInt16Number*)output; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = (cmsFloat32Number)wOut[index] / maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsUInt16Number*)output)[(i + start) * Stride] = _cmsFloat2Half(v); else ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number)); *swap1 = _cmsFloat2Half(v); } if (T_PLANAR(info->OutputFormat)) return output + sizeof(cmsUInt16Number); else return output + (nChan + Extra) * sizeof(cmsUInt16Number); } static cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 100.0F : 1.0F; cmsUInt16Number* swap1 = (cmsUInt16Number*)output; cmsFloat32Number v = 0; cmsUInt32Number i, start = 0; Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; for (i = 0; i < nChan; i++) { cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsUInt16Number*)output)[(i + start)* Stride] = _cmsFloat2Half(v); else ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number)); *swap1 = (cmsUInt16Number)_cmsFloat2Half(v); } if (T_PLANAR(info->OutputFormat)) return output + sizeof(cmsUInt16Number); else return output + (nChan + Extra)* sizeof(cmsUInt16Number); } #endif // ---------------------------------------------------------------------------------------------------------------- static const cmsFormatters16 InputFormatters16[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleTo16}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleTo16}, { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatTo16}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatTo16}, { TYPE_GRAY_DBL, 0, UnrollDouble1Chan}, { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| ANYSWAP|ANYEXTRA|ANYSPACE, UnrollDoubleTo16}, { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| ANYSWAP|ANYEXTRA|ANYSPACE, UnrollFloatTo16}, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| ANYEXTRA|ANYSWAP|ANYSPACE, UnrollHalfTo16}, #endif { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Unroll1Byte}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Unroll1ByteSkip1}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2), ANYSPACE, Unroll1ByteSkip2}, { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll1ByteReversed}, { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1), 0, Unroll2Bytes}, { TYPE_LabV2_8, 0, UnrollLabV2_8 }, { TYPE_ALabV2_8, 0, UnrollALabV2_8 }, { TYPE_LabV2_16, 0, UnrollLabV2_16 }, { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Unroll3Bytes}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSwap}, { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap}, { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst}, { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes}, { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse}, { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll4BytesSwap}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapSwapFirst}, { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYPREMUL| ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes}, { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYPREMUL| ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes}, { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Unroll1Word}, { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll1WordReversed}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3), ANYSPACE, Unroll1WordSkip3}, { CHANNELS_SH(2)|BYTES_SH(2), ANYSPACE, Unroll2Words}, { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Unroll3Words}, { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Unroll4Words}, { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSwap}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3WordsSkip1SwapFirst}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSkip1Swap}, { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll4WordsReverse}, { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll4WordsSwap}, { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapSwapFirst}, { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords}, { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollAnyWords}, { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE|PREMUL_SH(1), UnrollPlanarWordsPremul}, { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE|PREMUL_SH(1), UnrollAnyWordsPremul} }; static const cmsFormattersFloat InputFormattersFloat[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleToFloat}, { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatToFloat}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleToFloat}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatToFloat}, { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYPREMUL|ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat}, { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE|ANYPREMUL, UnrollDoublesToFloat}, { TYPE_LabV2_8, 0, UnrollLabV2_8ToFloat }, { TYPE_ALabV2_8, 0, UnrollALabV2_8ToFloat }, { TYPE_LabV2_16, 0, UnrollLabV2_16ToFloat }, { BYTES_SH(1), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE, Unroll8ToFloat}, { BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE, Unroll16ToFloat}, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE, UnrollHalfToFloat}, #endif }; // Bit fields set to one in the mask are not compared static cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsFormatter fr; switch (dwFlags) { case CMS_PACK_FLAGS_16BITS: { for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) { const cmsFormatters16* f = InputFormatters16 + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.Fmt16 = f ->Frm; return fr; } } } break; case CMS_PACK_FLAGS_FLOAT: { for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { const cmsFormattersFloat* f = InputFormattersFloat + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.FmtFloat = f ->Frm; return fr; } } } break; default:; } fr.Fmt16 = NULL; return fr; } static const cmsFormatters16 OutputFormatters16[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFrom16}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFrom16}, { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFrom16}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFrom16}, { FLOAT_SH(1)|BYTES_SH(0), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16}, { FLOAT_SH(1)|BYTES_SH(4), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16}, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackHalfFrom16}, #endif { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Pack1Byte}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack1ByteSkip1}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1ByteSkip1SwapFirst}, { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack1ByteReversed}, { TYPE_LabV2_8, 0, PackLabV2_8 }, { TYPE_ALabV2_8, 0, PackALabV2_8 }, { TYPE_LabV2_16, 0, PackLabV2_16 }, { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1Optimized}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirstOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapSwapFirstOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesSwapOptimized}, { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Pack3Bytes}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirst}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapSwapFirst}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1Swap}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3BytesSwap}, { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Pack4Bytes}, { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack4BytesReverse}, { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack4BytesSwap}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapSwapFirst}, { CHANNELS_SH(6)|BYTES_SH(1), ANYSPACE, Pack6Bytes}, { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack6BytesSwap}, { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS| ANYSPACE|ANYPREMUL, PackChunkyBytes}, { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE|ANYPREMUL, PackPlanarBytes}, { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Pack1Word}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack1WordSkip1}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1WordSkip1SwapFirst}, { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack1WordReversed}, { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack1WordBigEndian}, { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Pack3Words}, { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack3WordsSwap}, { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack3WordsBigEndian}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack3WordsAndSkip1}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3WordsAndSkip1Swap}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapFirst}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Pack4Words}, { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack4WordsReverse}, { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack4WordsSwap}, { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack4WordsBigEndian}, { CHANNELS_SH(6)|BYTES_SH(2), ANYSPACE, Pack6Words}, { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack6WordsSwap}, { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN| ANYEXTRA|ANYCHANNELS|ANYSPACE|ANYPREMUL, PackChunkyWords}, { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE|ANYPREMUL, PackPlanarWords} }; static const cmsFormattersFloat OutputFormattersFloat[] = { // Type Mask Function // ---------------------------- --------------------------------------------------- ---------------------------- { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFromFloat}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFromFloat}, { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFromFloat}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFromFloat}, { TYPE_LabV2_8, ANYPLANAR|ANYEXTRA, PackEncodedBytesLabV2FromFloat}, { TYPE_LabV2_16, ANYPLANAR|ANYEXTRA, PackEncodedWordsLabV2FromFloat}, { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR| ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackFloatsFromFloat }, { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR| ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackDoublesFromFloat }, { BYTES_SH(2), ANYPLANAR| ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackWordsFromFloat }, { BYTES_SH(1), ANYPLANAR| ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackBytesFromFloat }, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackHalfFromFloat }, #endif }; // Bit fields set to one in the mask are not compared static cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsFormatter fr; // Optimization is only a hint dwInput &= ~OPTIMIZED_SH(1); switch (dwFlags) { case CMS_PACK_FLAGS_16BITS: { for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) { const cmsFormatters16* f = OutputFormatters16 + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.Fmt16 = f ->Frm; return fr; } } } break; case CMS_PACK_FLAGS_FLOAT: { for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { const cmsFormattersFloat* f = OutputFormattersFloat + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.FmtFloat = f ->Frm; return fr; } } } break; default:; } fr.Fmt16 = NULL; return fr; } typedef struct _cms_formatters_factory_list { cmsFormatterFactory Factory; struct _cms_formatters_factory_list *Next; } cmsFormattersFactoryList; _cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupFormatterFactoryList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsFormattersPluginChunkType newHead = { NULL }; cmsFormattersFactoryList* entry; cmsFormattersFactoryList* Anterior = NULL; _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin]; _cmsAssert(head != NULL); // Walk the list copying all nodes for (entry = head->FactoryList; entry != NULL; entry = entry ->Next) { cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.FactoryList == NULL) newHead.FactoryList = newEntry; } ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType)); } // The interpolation plug-in memory chunk allocator/dup void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsAssert(ctx != NULL); if (src != NULL) { // Duplicate the LIST DupFormatterFactoryList(ctx, src); } else { static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL }; ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType)); } } // Formatters management cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data) { _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data; cmsFormattersFactoryList* fl ; // Reset to built-in defaults if (Data == NULL) { ctx ->FactoryList = NULL; return TRUE; } fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList)); if (fl == NULL) return FALSE; fl ->Factory = Plugin ->FormattersFactory; fl ->Next = ctx -> FactoryList; ctx ->FactoryList = fl; return TRUE; } cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID, cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); cmsFormattersFactoryList* f; if (T_CHANNELS(Type) == 0) { static const cmsFormatter nullFormatter = { 0 }; return nullFormatter; } for (f =ctx->FactoryList; f != NULL; f = f ->Next) { cmsFormatter fn = f ->Factory(Type, Dir, dwFlags); if (fn.Fmt16 != NULL) return fn; } // Revert to default if (Dir == cmsFormatterInput) return _cmsGetStockInputFormatter(Type, dwFlags); else return _cmsGetStockOutputFormatter(Type, dwFlags); } // Return whatever given formatter refers to float values cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type) { return T_FLOAT(Type) ? TRUE : FALSE; } // Return whatever given formatter refers to 8 bits cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type) { cmsUInt32Number Bytes = T_BYTES(Type); return (Bytes == 1); } // Build a suitable formatter for the colorspace of this profile cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) { cmsColorSpaceSignature ColorSpace = cmsGetColorSpace(hProfile); cmsUInt32Number ColorSpaceBits = (cmsUInt32Number) _cmsLCMScolorSpace(ColorSpace); cmsInt32Number nOutputChans = cmsChannelsOfColorSpace(ColorSpace); cmsUInt32Number Float = lIsFloat ? 1U : 0; // Unsupported color space? if (nOutputChans < 0) return 0; // Fix float spaces nBytes &= 7; // Create a fake formatter for result return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); } // Build a suitable formatter for the colorspace of this profile cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) { cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile); cmsUInt32Number ColorSpaceBits = (cmsUInt32Number) _cmsLCMScolorSpace(ColorSpace); cmsInt32Number nOutputChans = cmsChannelsOfColorSpace(ColorSpace); cmsUInt32Number Float = lIsFloat ? 1U : 0; // Unsupported color space? if (nOutputChans < 0) return 0; // Fix float spaces nBytes &= 7; // Create a fake formatter for result return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); } lcms2-2.19.1/src/cmspcs.c0000644000175000017500000006221515176573557014114 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // inter PCS conversions XYZ <-> CIE L* a* b* /* CIE 15:2004 CIELab is defined as: L* = 116*f(Y/Yn) - 16 0 <= L* <= 100 a* = 500*[f(X/Xn) - f(Y/Yn)] b* = 200*[f(Y/Yn) - f(Z/Zn)] and f(t) = t^(1/3) 1 >= t > (24/116)^3 (841/108)*t + (16/116) 0 <= t <= (24/116)^3 Reverse transform is: X = Xn*[a* / 500 + (L* + 16) / 116] ^ 3 if (X/Xn) > (24/116) = Xn*(a* / 500 + L* / 116) / 7.787 if (X/Xn) <= (24/116) PCS in Lab2 is encoded as: 8 bit Lab PCS: L* 0..100 into a 0..ff byte. a* t + 128 range is -128.0 +127.0 b* 16 bit Lab PCS: L* 0..100 into a 0..ff00 word. a* t + 128 range is -128.0 +127.9961 b* Interchange Space Component Actual Range Encoded Range CIE XYZ X 0 -> 1.99997 0x0000 -> 0xffff CIE XYZ Y 0 -> 1.99997 0x0000 -> 0xffff CIE XYZ Z 0 -> 1.99997 0x0000 -> 0xffff Version 2,3 ----------- CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xff00 CIELAB (16 bit) a* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff CIELAB (16 bit) b* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff Version 4 --------- CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xffff CIELAB (16 bit) a* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff CIELAB (16 bit) b* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff */ // Conversions void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source) { cmsFloat64Number ISum; ISum = 1./(Source -> X + Source -> Y + Source -> Z); Dest -> x = (Source -> X) * ISum; Dest -> y = (Source -> Y) * ISum; Dest -> Y = Source -> Y; } void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source) { Dest -> X = (Source -> x / Source -> y) * Source -> Y; Dest -> Y = Source -> Y; Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y; } /* The break point (24/116)^3 = (6/29)^3 is a very small amount of tristimulus primary (0.008856). Generally, this only happens for nearly ideal blacks and for some orange / amber colors in transmission mode. For example, the Z value of the orange turn indicator lamp lens on an automobile will often be below this value. But the Z does not contribute to the perceived color directly. */ static cmsFloat64Number f(cmsFloat64Number t) { const cmsFloat64Number Limit = (24.0/116.0) * (24.0/116.0) * (24.0/116.0); if (t <= Limit) return (841.0/108.0) * t + (16.0/116.0); else return pow(t, 1.0/3.0); } static cmsFloat64Number f_1(cmsFloat64Number t) { const cmsFloat64Number Limit = (24.0/116.0); if (t <= Limit) { return (108.0/841.0) * (t - (16.0/116.0)); } return t * t * t; } // Standard XYZ to Lab. it can handle negative XZY numbers in some cases void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz) { cmsFloat64Number fx, fy, fz; if (WhitePoint == NULL) WhitePoint = cmsD50_XYZ(); fx = f(xyz->X / WhitePoint->X); fy = f(xyz->Y / WhitePoint->Y); fz = f(xyz->Z / WhitePoint->Z); Lab->L = 116.0*fy - 16.0; Lab->a = 500.0*(fx - fy); Lab->b = 200.0*(fy - fz); } // Standard XYZ to Lab. It can return negative XYZ in some cases void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab) { cmsFloat64Number x, y, z; if (WhitePoint == NULL) WhitePoint = cmsD50_XYZ(); y = (Lab-> L + 16.0) / 116.0; x = y + 0.002 * Lab -> a; z = y - 0.005 * Lab -> b; xyz -> X = f_1(x) * WhitePoint -> X; xyz -> Y = f_1(y) * WhitePoint -> Y; xyz -> Z = f_1(z) * WhitePoint -> Z; } static cmsFloat64Number L2float2(cmsUInt16Number v) { return (cmsFloat64Number) v / 652.800; } // the a/b part static cmsFloat64Number ab2float2(cmsUInt16Number v) { return ((cmsFloat64Number) v / 256.0) - 128.0; } static cmsUInt16Number L2Fix2(cmsFloat64Number L) { return _cmsQuickSaturateWord(L * 652.8); } static cmsUInt16Number ab2Fix2(cmsFloat64Number ab) { return _cmsQuickSaturateWord((ab + 128.0) * 256.0); } static cmsFloat64Number L2float4(cmsUInt16Number v) { return (cmsFloat64Number) v / 655.35; } // the a/b part static cmsFloat64Number ab2float4(cmsUInt16Number v) { return ((cmsFloat64Number) v / 257.0) - 128.0; } void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]) { Lab->L = L2float2(wLab[0]); Lab->a = ab2float2(wLab[1]); Lab->b = ab2float2(wLab[2]); } void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]) { Lab->L = L2float4(wLab[0]); Lab->a = ab2float4(wLab[1]); Lab->b = ab2float4(wLab[2]); } static cmsFloat64Number Clamp_L_doubleV2(cmsFloat64Number L) { const cmsFloat64Number L_max = (cmsFloat64Number) (0xFFFF * 100.0) / 0xFF00; if (L < 0) L = 0; if (L > L_max) L = L_max; return L; } static cmsFloat64Number Clamp_ab_doubleV2(cmsFloat64Number ab) { if (ab < MIN_ENCODEABLE_ab2) ab = MIN_ENCODEABLE_ab2; if (ab > MAX_ENCODEABLE_ab2) ab = MAX_ENCODEABLE_ab2; return ab; } void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* fLab) { cmsCIELab Lab; Lab.L = Clamp_L_doubleV2(fLab ->L); Lab.a = Clamp_ab_doubleV2(fLab ->a); Lab.b = Clamp_ab_doubleV2(fLab ->b); wLab[0] = L2Fix2(Lab.L); wLab[1] = ab2Fix2(Lab.a); wLab[2] = ab2Fix2(Lab.b); } static cmsFloat64Number Clamp_L_doubleV4(cmsFloat64Number L) { if (L < 0) L = 0; if (L > 100.0) L = 100.0; return L; } static cmsFloat64Number Clamp_ab_doubleV4(cmsFloat64Number ab) { if (ab < MIN_ENCODEABLE_ab4) ab = MIN_ENCODEABLE_ab4; if (ab > MAX_ENCODEABLE_ab4) ab = MAX_ENCODEABLE_ab4; return ab; } static cmsUInt16Number L2Fix4(cmsFloat64Number L) { return _cmsQuickSaturateWord(L * 655.35); } static cmsUInt16Number ab2Fix4(cmsFloat64Number ab) { return _cmsQuickSaturateWord((ab + 128.0) * 257.0); } void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* fLab) { cmsCIELab Lab; Lab.L = Clamp_L_doubleV4(fLab ->L); Lab.a = Clamp_ab_doubleV4(fLab ->a); Lab.b = Clamp_ab_doubleV4(fLab ->b); wLab[0] = L2Fix4(Lab.L); wLab[1] = ab2Fix4(Lab.a); wLab[2] = ab2Fix4(Lab.b); } // Auxiliary: convert to Radians static cmsFloat64Number RADIANS(cmsFloat64Number deg) { return (deg * M_PI) / 180.; } // Auxiliary: atan2 but operating in degrees and returning 0 if a==b==0 static cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b) { cmsFloat64Number h; if (a == 0 && b == 0) h = 0; else h = atan2(a, b); h *= (180. / M_PI); while (h > 360.) h -= 360.; while ( h < 0) h += 360.; return h; } // Auxiliary: Square static cmsFloat64Number Sqr(cmsFloat64Number v) { return v * v; } // From cylindrical coordinates. No check is performed, then negative values are allowed void CMSEXPORT cmsLab2LCh(cmsCIELCh* LCh, const cmsCIELab* Lab) { LCh -> L = Lab -> L; LCh -> C = pow(Sqr(Lab ->a) + Sqr(Lab ->b), 0.5); LCh -> h = atan2deg(Lab ->b, Lab ->a); } // To cylindrical coordinates. No check is performed, then negative values are allowed void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh) { cmsFloat64Number h = (LCh -> h * M_PI) / 180.0; Lab -> L = LCh -> L; Lab -> a = LCh -> C * cos(h); Lab -> b = LCh -> C * sin(h); } // In XYZ All 3 components are encoded using 1.15 fixed point static cmsUInt16Number XYZ2Fix(cmsFloat64Number d) { return _cmsQuickSaturateWord(d * 32768.0); } void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ) { cmsCIEXYZ xyz; xyz.X = fXYZ -> X; xyz.Y = fXYZ -> Y; xyz.Z = fXYZ -> Z; // Clamp to encodeable values. if (xyz.Y <= 0) { xyz.X = 0; xyz.Y = 0; xyz.Z = 0; } if (xyz.X > MAX_ENCODEABLE_XYZ) xyz.X = MAX_ENCODEABLE_XYZ; if (xyz.X < 0) xyz.X = 0; if (xyz.Y > MAX_ENCODEABLE_XYZ) xyz.Y = MAX_ENCODEABLE_XYZ; if (xyz.Y < 0) xyz.Y = 0; if (xyz.Z > MAX_ENCODEABLE_XYZ) xyz.Z = MAX_ENCODEABLE_XYZ; if (xyz.Z < 0) xyz.Z = 0; XYZ[0] = XYZ2Fix(xyz.X); XYZ[1] = XYZ2Fix(xyz.Y); XYZ[2] = XYZ2Fix(xyz.Z); } // To convert from Fixed 1.15 point to cmsFloat64Number static cmsFloat64Number XYZ2float(cmsUInt16Number v) { cmsS15Fixed16Number fix32; // From 1.15 to 15.16 fix32 = v << 1; // From fixed 15.16 to cmsFloat64Number return _cms15Fixed16toDouble(fix32); } void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fXYZ, const cmsUInt16Number XYZ[3]) { fXYZ -> X = XYZ2float(XYZ[0]); fXYZ -> Y = XYZ2float(XYZ[1]); fXYZ -> Z = XYZ2float(XYZ[2]); } // Returns dE on two Lab values cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) { cmsFloat64Number dL, da, db; dL = fabs(Lab1 -> L - Lab2 -> L); da = fabs(Lab1 -> a - Lab2 -> a); db = fabs(Lab1 -> b - Lab2 -> b); return pow(Sqr(dL) + Sqr(da) + Sqr(db), 0.5); } // Return the CIE94 Delta E cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) { cmsCIELCh LCh1, LCh2; cmsFloat64Number dE, dL, dC, dh, dhsq; cmsFloat64Number c12, sc, sh; dL = fabs(Lab1 ->L - Lab2 ->L); cmsLab2LCh(&LCh1, Lab1); cmsLab2LCh(&LCh2, Lab2); dC = fabs(LCh1.C - LCh2.C); dE = cmsDeltaE(Lab1, Lab2); dhsq = Sqr(dE) - Sqr(dL) - Sqr(dC); if (dhsq < 0) dh = 0; else dh = pow(dhsq, 0.5); c12 = sqrt(LCh1.C * LCh2.C); sc = 1.0 + (0.048 * c12); sh = 1.0 + (0.014 * c12); return sqrt(Sqr(dL) + Sqr(dC) / Sqr(sc) + Sqr(dh) / Sqr(sh)); } // Auxiliary static cmsFloat64Number ComputeLBFD(const cmsCIELab* Lab) { cmsFloat64Number yt; if (Lab->L > 7.996969) yt = (Sqr((Lab->L+16)/116)*((Lab->L+16)/116))*100; else yt = 100 * (Lab->L / 903.3); return (54.6 * (M_LOG10E * (log(yt + 1.5))) - 9.6); } // bfd - gets BFD(1:1) difference between Lab1, Lab2 cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) { cmsFloat64Number lbfd1,lbfd2,AveC,Aveh,dE,deltaL, deltaC,deltah,dc,t,g,dh,rh,rc,rt,bfd; cmsCIELCh LCh1, LCh2; lbfd1 = ComputeLBFD(Lab1); lbfd2 = ComputeLBFD(Lab2); deltaL = lbfd2 - lbfd1; cmsLab2LCh(&LCh1, Lab1); cmsLab2LCh(&LCh2, Lab2); deltaC = LCh2.C - LCh1.C; AveC = (LCh1.C+LCh2.C)/2; Aveh = (LCh1.h+LCh2.h)/2; dE = cmsDeltaE(Lab1, Lab2); if (Sqr(dE)>(Sqr(Lab2->L-Lab1->L)+Sqr(deltaC))) deltah = sqrt(Sqr(dE)-Sqr(Lab2->L-Lab1->L)-Sqr(deltaC)); else deltah =0; dc = 0.035 * AveC / (1 + 0.00365 * AveC)+0.521; g = sqrt(Sqr(Sqr(AveC))/(Sqr(Sqr(AveC))+14000)); t = 0.627+(0.055*cos((Aveh-254)/(180/M_PI))- 0.040*cos((2*Aveh-136)/(180/M_PI))+ 0.070*cos((3*Aveh-31)/(180/M_PI))+ 0.049*cos((4*Aveh+114)/(180/M_PI))- 0.015*cos((5*Aveh-103)/(180/M_PI))); dh = dc*(g*t+1-g); rh = -0.260*cos((Aveh-308)/(180/M_PI))- 0.379*cos((2*Aveh-160)/(180/M_PI))- 0.636*cos((3*Aveh+254)/(180/M_PI))+ 0.226*cos((4*Aveh+140)/(180/M_PI))- 0.194*cos((5*Aveh+280)/(180/M_PI)); rc = sqrt((AveC*AveC*AveC*AveC*AveC*AveC)/((AveC*AveC*AveC*AveC*AveC*AveC)+70000000)); rt = rh*rc; bfd = sqrt(Sqr(deltaL)+Sqr(deltaC/dc)+Sqr(deltah/dh)+(rt*(deltaC/dc)*(deltah/dh))); return bfd; } // cmc - CMC(l:c) difference between Lab1, Lab2 cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c) { cmsFloat64Number dE,dL,dC,dh,sl,sc,sh,t,f,cmc; cmsCIELCh LCh1, LCh2; if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0; cmsLab2LCh(&LCh1, Lab1); cmsLab2LCh(&LCh2, Lab2); dL = Lab2->L-Lab1->L; dC = LCh2.C-LCh1.C; dE = cmsDeltaE(Lab1, Lab2); if (Sqr(dE)>(Sqr(dL)+Sqr(dC))) dh = sqrt(Sqr(dE)-Sqr(dL)-Sqr(dC)); else dh =0; if ((LCh1.h > 164) && (LCh1.h < 345)) t = 0.56 + fabs(0.2 * cos(((LCh1.h + 168)/(180/M_PI)))); else t = 0.36 + fabs(0.4 * cos(((LCh1.h + 35 )/(180/M_PI)))); sc = 0.0638 * LCh1.C / (1 + 0.0131 * LCh1.C) + 0.638; sl = 0.040975 * Lab1->L /(1 + 0.01765 * Lab1->L); if (Lab1->L<16) sl = 0.511; f = sqrt((LCh1.C * LCh1.C * LCh1.C * LCh1.C)/((LCh1.C * LCh1.C * LCh1.C * LCh1.C)+1900)); sh = sc*(t*f+1-f); cmc = sqrt(Sqr(dL/(l*sl))+Sqr(dC/(c*sc))+Sqr(dh/sh)); return cmc; } // dE2000 The weightings KL, KC and KH can be modified to reflect the relative // importance of lightness, chroma and hue in different industrial applications cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh) { cmsFloat64Number L1 = Lab1->L; cmsFloat64Number a1 = Lab1->a; cmsFloat64Number b1 = Lab1->b; cmsFloat64Number C = sqrt( Sqr(a1) + Sqr(b1) ); cmsFloat64Number Ls = Lab2 ->L; cmsFloat64Number as = Lab2 ->a; cmsFloat64Number bs = Lab2 ->b; cmsFloat64Number Cs = sqrt( Sqr(as) + Sqr(bs) ); cmsFloat64Number G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) )); cmsFloat64Number a_p = (1 + G ) * a1; cmsFloat64Number b_p = b1; cmsFloat64Number C_p = sqrt( Sqr(a_p) + Sqr(b_p)); cmsFloat64Number h_p = atan2deg(b_p, a_p); cmsFloat64Number a_ps = (1 + G) * as; cmsFloat64Number b_ps = bs; cmsFloat64Number C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps)); cmsFloat64Number h_ps = atan2deg(b_ps, a_ps); cmsFloat64Number meanC_p =(C_p + C_ps) / 2; cmsFloat64Number hps_plus_hp = h_ps + h_p; cmsFloat64Number hps_minus_hp = h_ps - h_p; cmsFloat64Number meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 : (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 : (hps_plus_hp - 360)/2; cmsFloat64Number delta_h = (hps_minus_hp) <= -180.000001 ? (hps_minus_hp + 360) : (hps_minus_hp) > 180 ? (hps_minus_hp - 360) : (hps_minus_hp); cmsFloat64Number delta_L = (Ls - L1); cmsFloat64Number delta_C = (C_ps - C_p ); cmsFloat64Number delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANS(delta_h) / 2); cmsFloat64Number T = 1 - 0.17 * cos(RADIANS(meanh_p-30)) + 0.24 * cos(RADIANS(2*meanh_p)) + 0.32 * cos(RADIANS(3*meanh_p + 6)) - 0.2 * cos(RADIANS(4*meanh_p - 63)); cmsFloat64Number Sl = 1 + (0.015 * Sqr((Ls + L1) /2- 50) )/ sqrt(20 + Sqr( (Ls+L1)/2 - 50) ); cmsFloat64Number Sc = 1 + 0.045 * (C_p + C_ps)/2; cmsFloat64Number Sh = 1 + 0.015 * ((C_ps + C_p)/2) * T; cmsFloat64Number delta_ro = 30 * exp( -Sqr(((meanh_p - 275 ) / 25))); cmsFloat64Number Rc = 2 * sqrt(( pow(meanC_p, 7.0) )/( pow(meanC_p, 7.0) + pow(25.0, 7.0))); cmsFloat64Number Rt = -sin(2 * RADIANS(delta_ro)) * Rc; cmsFloat64Number deltaE00 = sqrt( Sqr(delta_L /(Sl * Kl)) + Sqr(delta_C/(Sc * Kc)) + Sqr(delta_H/(Sh * Kh)) + Rt*(delta_C/(Sc * Kc)) * (delta_H / (Sh * Kh))); return deltaE00; } // This function returns a number of gridpoints to be used as LUT table. It assumes same number // of gripdpoints in all dimensions. Flags may override the choice. cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags) { cmsUInt32Number nChannels; // Already specified? if (dwFlags & 0x00FF0000) { // Yes, grab'em return (dwFlags >> 16) & 0xFF; } nChannels = cmsChannelsOf(Colorspace); // HighResPrecalc is maximum resolution if (dwFlags & cmsFLAGS_HIGHRESPRECALC) { if (nChannels > 4) return 7; // 7 for Hifi if (nChannels == 4) // 23 for CMYK return 23; return 49; // 49 for RGB and others } // LowResPrecal is lower resolution if (dwFlags & cmsFLAGS_LOWRESPRECALC) { if (nChannels > 4) return 6; // 6 for more than 4 channels if (nChannels == 1) return 33; // For monochrome return 17; // 17 for remaining } // Default values if (nChannels > 4) return 7; // 7 for Hifi if (nChannels == 4) return 17; // 17 for CMYK return 33; // 33 for RGB } cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, cmsUInt16Number **White, cmsUInt16Number **Black, cmsUInt32Number *nOutputs) { // Only most common spaces static cmsUInt16Number RGBblack[4] = { 0, 0, 0 }; static cmsUInt16Number RGBwhite[4] = { 0xffff, 0xffff, 0xffff }; static cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; // 400% of ink static cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 }; static cmsUInt16Number LABblack[4] = { 0, 0x8080, 0x8080 }; // V4 Lab encoding static cmsUInt16Number LABwhite[4] = { 0xFFFF, 0x8080, 0x8080 }; static cmsUInt16Number CMYblack[4] = { 0xffff, 0xffff, 0xffff }; static cmsUInt16Number CMYwhite[4] = { 0, 0, 0 }; static cmsUInt16Number Grayblack[4] = { 0 }; static cmsUInt16Number GrayWhite[4] = { 0xffff }; switch (Space) { case cmsSigGrayData: if (White) *White = GrayWhite; if (Black) *Black = Grayblack; if (nOutputs) *nOutputs = 1; return TRUE; case cmsSigRgbData: if (White) *White = RGBwhite; if (Black) *Black = RGBblack; if (nOutputs) *nOutputs = 3; return TRUE; case cmsSigLabData: if (White) *White = LABwhite; if (Black) *Black = LABblack; if (nOutputs) *nOutputs = 3; return TRUE; case cmsSigCmykData: if (White) *White = CMYKwhite; if (Black) *Black = CMYKblack; if (nOutputs) *nOutputs = 4; return TRUE; case cmsSigCmyData: if (White) *White = CMYwhite; if (Black) *Black = CMYblack; if (nOutputs) *nOutputs = 3; return TRUE; default:; } return FALSE; } // Several utilities ------------------------------------------------------- // Translate from our colorspace to ICC representation cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation) { switch (OurNotation) { case 1: case PT_GRAY: return cmsSigGrayData; case 2: case PT_RGB: return cmsSigRgbData; case PT_CMY: return cmsSigCmyData; case PT_CMYK: return cmsSigCmykData; case PT_YCbCr:return cmsSigYCbCrData; case PT_YUV: return cmsSigLuvData; case PT_XYZ: return cmsSigXYZData; case PT_LabV2: case PT_Lab: return cmsSigLabData; case PT_YUVK: return cmsSigLuvKData; case PT_HSV: return cmsSigHsvData; case PT_HLS: return cmsSigHlsData; case PT_Yxy: return cmsSigYxyData; case PT_MCH1: return cmsSigMCH1Data; case PT_MCH2: return cmsSigMCH2Data; case PT_MCH3: return cmsSigMCH3Data; case PT_MCH4: return cmsSigMCH4Data; case PT_MCH5: return cmsSigMCH5Data; case PT_MCH6: return cmsSigMCH6Data; case PT_MCH7: return cmsSigMCH7Data; case PT_MCH8: return cmsSigMCH8Data; case PT_MCH9: return cmsSigMCH9Data; case PT_MCH10: return cmsSigMCHAData; case PT_MCH11: return cmsSigMCHBData; case PT_MCH12: return cmsSigMCHCData; case PT_MCH13: return cmsSigMCHDData; case PT_MCH14: return cmsSigMCHEData; case PT_MCH15: return cmsSigMCHFData; default: return (cmsColorSpaceSignature) 0; } } int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace) { switch (ProfileSpace) { case cmsSigGrayData: return PT_GRAY; case cmsSigRgbData: return PT_RGB; case cmsSigCmyData: return PT_CMY; case cmsSigCmykData: return PT_CMYK; case cmsSigYCbCrData:return PT_YCbCr; case cmsSigLuvData: return PT_YUV; case cmsSigXYZData: return PT_XYZ; case cmsSigLabData: return PT_Lab; case cmsSigLuvKData: return PT_YUVK; case cmsSigHsvData: return PT_HSV; case cmsSigHlsData: return PT_HLS; case cmsSigYxyData: return PT_Yxy; case cmsSig1colorData: case cmsSigMCH1Data: return PT_MCH1; case cmsSig2colorData: case cmsSigMCH2Data: return PT_MCH2; case cmsSig3colorData: case cmsSigMCH3Data: return PT_MCH3; case cmsSig4colorData: case cmsSigMCH4Data: return PT_MCH4; case cmsSig5colorData: case cmsSigMCH5Data: return PT_MCH5; case cmsSig6colorData: case cmsSigMCH6Data: return PT_MCH6; case cmsSigMCH7Data: case cmsSig7colorData:return PT_MCH7; case cmsSigMCH8Data: case cmsSig8colorData:return PT_MCH8; case cmsSigMCH9Data: case cmsSig9colorData:return PT_MCH9; case cmsSigMCHAData: case cmsSig10colorData:return PT_MCH10; case cmsSigMCHBData: case cmsSig11colorData:return PT_MCH11; case cmsSigMCHCData: case cmsSig12colorData:return PT_MCH12; case cmsSigMCHDData: case cmsSig13colorData:return PT_MCH13; case cmsSigMCHEData: case cmsSig14colorData:return PT_MCH14; case cmsSigMCHFData: case cmsSig15colorData:return PT_MCH15; default: return (cmsColorSpaceSignature) 0; } } cmsInt32Number CMSEXPORT cmsChannelsOfColorSpace(cmsColorSpaceSignature ColorSpace) { switch (ColorSpace) { case cmsSigMCH1Data: case cmsSig1colorData: case cmsSigGrayData: return 1; case cmsSigMCH2Data: case cmsSig2colorData: return 2; case cmsSigXYZData: case cmsSigLabData: case cmsSigLuvData: case cmsSigYCbCrData: case cmsSigYxyData: case cmsSigRgbData: case cmsSigHsvData: case cmsSigHlsData: case cmsSigCmyData: case cmsSigMCH3Data: case cmsSig3colorData: return 3; case cmsSigLuvKData: case cmsSigCmykData: case cmsSigMCH4Data: case cmsSig4colorData: return 4; case cmsSigMCH5Data: case cmsSig5colorData: return 5; case cmsSigMCH6Data: case cmsSig6colorData: return 6; case cmsSigMCH7Data: case cmsSig7colorData: return 7; case cmsSigMCH8Data: case cmsSig8colorData: return 8; case cmsSigMCH9Data: case cmsSig9colorData: return 9; case cmsSigMCHAData: case cmsSig10colorData: return 10; case cmsSigMCHBData: case cmsSig11colorData: return 11; case cmsSigMCHCData: case cmsSig12colorData: return 12; case cmsSigMCHDData: case cmsSig13colorData: return 13; case cmsSigMCHEData: case cmsSig14colorData: return 14; case cmsSigMCHFData: case cmsSig15colorData: return 15; default: return -1; } } /** * DEPRECATED: Provided for compatibility only */ cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace) { int n = cmsChannelsOfColorSpace(ColorSpace); if (n < 0) return 3; return (cmsUInt32Number)n; }lcms2-2.19.1/src/cmsplugin.c0000644000175000017500000007534515176573557014635 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // ---------------------------------------------------------------------------------- // Encoding & Decoding support functions // ---------------------------------------------------------------------------------- // Little-Endian to Big-Endian // Adjust a word value after being read/ before being written from/to an ICC profile cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word) { #ifndef CMS_USE_BIG_ENDIAN cmsUInt8Number* pByte = (cmsUInt8Number*) &Word; cmsUInt8Number tmp; tmp = pByte[0]; pByte[0] = pByte[1]; pByte[1] = tmp; #endif return Word; } // Transports to properly encoded values - note that icc profiles does use big endian notation. // 1 2 3 4 // 4 3 2 1 cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number DWord) { #ifndef CMS_USE_BIG_ENDIAN cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord; cmsUInt8Number temp1; cmsUInt8Number temp2; temp1 = *pByte++; temp2 = *pByte++; *(pByte-1) = *pByte; *pByte++ = temp2; *(pByte-3) = *pByte; *pByte = temp1; #endif return DWord; } // 1 2 3 4 5 6 7 8 // 8 7 6 5 4 3 2 1 void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord) { #ifndef CMS_USE_BIG_ENDIAN cmsUInt8Number* pIn = (cmsUInt8Number*) QWord; cmsUInt8Number* pOut = (cmsUInt8Number*) Result; _cmsAssert(Result != NULL); pOut[7] = pIn[0]; pOut[6] = pIn[1]; pOut[5] = pIn[2]; pOut[4] = pIn[3]; pOut[3] = pIn[4]; pOut[2] = pIn[5]; pOut[1] = pIn[6]; pOut[0] = pIn[7]; #else _cmsAssert(Result != NULL); # ifdef CMS_DONT_USE_INT64 (*Result)[0] = (*QWord)[0]; (*Result)[1] = (*QWord)[1]; # else *Result = *QWord; # endif #endif } // Auxiliary -- read 8, 16 and 32-bit numbers cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n) { cmsUInt8Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt8Number), 1) != 1) return FALSE; if (n != NULL) *n = tmp; return TRUE; } cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n) { cmsUInt16Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt16Number), 1) != 1) return FALSE; if (n != NULL) *n = _cmsAdjustEndianess16(tmp); return TRUE; } cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array) { cmsUInt32Number i; _cmsAssert(io != NULL); for (i=0; i < n; i++) { if (Array != NULL) { if (!_cmsReadUInt16Number(io, Array + i)) return FALSE; } else { if (!_cmsReadUInt16Number(io, NULL)) return FALSE; } } return TRUE; } cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) return FALSE; if (n != NULL) *n = _cmsAdjustEndianess32(tmp); return TRUE; } cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n) { union typeConverter { cmsUInt32Number integer; cmsFloat32Number floating_point; } tmp; _cmsAssert(io != NULL); if (io->Read(io, &tmp.integer, sizeof(cmsUInt32Number), 1) != 1) return FALSE; if (n != NULL) { tmp.integer = _cmsAdjustEndianess32(tmp.integer); *n = tmp.floating_point; // Safeguard which covers against absurd values if (*n > 1E+20 || *n < -1E+20) return FALSE; #if defined(_MSC_VER) && _MSC_VER < 1800 return TRUE; #elif defined (__BORLANDC__) return TRUE; #elif !defined(_MSC_VER) && (defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L) return TRUE; #else // fpclassify() required by C99 (only provided by MSVC >= 1800, VS2013 onwards) return ((fpclassify(*n) == FP_ZERO) || (fpclassify(*n) == FP_NORMAL)); #endif } return TRUE; } cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) { cmsUInt64Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1) return FALSE; if (n != NULL) { _cmsAdjustEndianess64(n, &tmp); } return TRUE; } cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) return FALSE; if (n != NULL) { *n = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32(tmp)); } return TRUE; } cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ) { cmsEncodedXYZNumber xyz; _cmsAssert(io != NULL); if (io ->Read(io, &xyz, sizeof(cmsEncodedXYZNumber), 1) != 1) return FALSE; if (XYZ != NULL) { XYZ->X = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.X)); XYZ->Y = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.Y)); XYZ->Z = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.Z)); } return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n) { _cmsAssert(io != NULL); if (io -> Write(io, sizeof(cmsUInt8Number), &n) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n) { cmsUInt16Number tmp; _cmsAssert(io != NULL); tmp = _cmsAdjustEndianess16(n); if (io -> Write(io, sizeof(cmsUInt16Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array) { cmsUInt32Number i; _cmsAssert(io != NULL); _cmsAssert(Array != NULL); for (i=0; i < n; i++) { if (!_cmsWriteUInt16Number(io, Array[i])) return FALSE; } return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); tmp = _cmsAdjustEndianess32(n); if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n) { union typeConverter { cmsUInt32Number integer; cmsFloat32Number floating_point; } tmp; tmp.floating_point = n; tmp.integer = _cmsAdjustEndianess32(tmp.integer); if (io -> Write(io, sizeof(cmsUInt32Number), &tmp.integer) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) { cmsUInt64Number tmp; _cmsAssert(io != NULL); _cmsAdjustEndianess64(&tmp, n); if (io -> Write(io, sizeof(cmsUInt64Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); tmp = _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(n)); if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ) { cmsEncodedXYZNumber xyz; _cmsAssert(io != NULL); _cmsAssert(XYZ != NULL); xyz.X = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->X)); xyz.Y = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->Y)); xyz.Z = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->Z)); return io -> Write(io, sizeof(cmsEncodedXYZNumber), &xyz); } // from Fixed point 8.8 to double cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8) { return fixed8 / 256.0; } cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val) { cmsS15Fixed16Number GammaFixed32 = _cmsDoubleTo15Fixed16(val); return (cmsUInt16Number) ((GammaFixed32 >> 8) & 0xFFFF); } // from Fixed point 15.16 to double cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32) { return fix32 / 65536.0; } // from double to Fixed point 15.16 cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v) { return ((cmsS15Fixed16Number) floor((v)*65536.0 + 0.5)); } // Date/Time functions void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest) { _cmsAssert(Dest != NULL); _cmsAssert(Source != NULL); Dest->tm_sec = _cmsAdjustEndianess16(Source->seconds); Dest->tm_min = _cmsAdjustEndianess16(Source->minutes); Dest->tm_hour = _cmsAdjustEndianess16(Source->hours); Dest->tm_mday = _cmsAdjustEndianess16(Source->day); Dest->tm_mon = _cmsAdjustEndianess16(Source->month) - 1; Dest->tm_year = _cmsAdjustEndianess16(Source->year) - 1900; Dest->tm_wday = -1; Dest->tm_yday = -1; Dest->tm_isdst = 0; } void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source) { _cmsAssert(Dest != NULL); _cmsAssert(Source != NULL); Dest->seconds = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_sec); Dest->minutes = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_min); Dest->hours = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_hour); Dest->day = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_mday); Dest->month = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_mon + 1)); Dest->year = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_year + 1900)); } // Read base and return type base cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io) { _cmsTagBase Base; _cmsAssert(io != NULL); if (io -> Read(io, &Base, sizeof(_cmsTagBase), 1) != 1) return (cmsTagTypeSignature) 0; return (cmsTagTypeSignature) _cmsAdjustEndianess32(Base.sig); } // Setup base marker cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig) { _cmsTagBase Base; _cmsAssert(io != NULL); Base.sig = (cmsTagTypeSignature) _cmsAdjustEndianess32(sig); memset(&Base.reserved, 0, sizeof(Base.reserved)); return io -> Write(io, sizeof(_cmsTagBase), &Base); } cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io) { cmsUInt8Number Buffer[4]; cmsUInt32Number NextAligned, At; cmsUInt32Number BytesToNextAlignedPos; _cmsAssert(io != NULL); At = io -> Tell(io); NextAligned = _cmsALIGNLONG(At); BytesToNextAlignedPos = NextAligned - At; if (BytesToNextAlignedPos == 0) return TRUE; if (BytesToNextAlignedPos > 4) return FALSE; return (io ->Read(io, Buffer, BytesToNextAlignedPos, 1) == 1); } cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io) { cmsUInt8Number Buffer[4]; cmsUInt32Number NextAligned, At; cmsUInt32Number BytesToNextAlignedPos; _cmsAssert(io != NULL); At = io -> Tell(io); NextAligned = _cmsALIGNLONG(At); BytesToNextAlignedPos = NextAligned - At; if (BytesToNextAlignedPos == 0) return TRUE; if (BytesToNextAlignedPos > 4) return FALSE; memset(Buffer, 0, BytesToNextAlignedPos); return io -> Write(io, BytesToNextAlignedPos, Buffer); } // To deal with text streams. 2K at most cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...) { va_list args; int len; cmsUInt8Number Buffer[2048]; cmsBool rc; cmsUInt8Number* ptr; _cmsAssert(io != NULL); _cmsAssert(frm != NULL); va_start(args, frm); len = vsnprintf((char*) Buffer, 2047, frm, args); if (len < 0 || len >= 2047) { va_end(args); return FALSE; // Truncated, which is a fatal error for us } // setlocale may be active, no commas are needed in PS generator // and PS generator is our only client for (ptr = Buffer; *ptr; ptr++) { if (*ptr == ',') *ptr = '.'; } rc = io ->Write(io, (cmsUInt32Number) len, Buffer); va_end(args); return rc; } // Plugin memory management ------------------------------------------------------------------------------------------------- // Specialized malloc for plug-ins, that is freed upon exit. void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size) { struct _cmsContext_struct* ctx = _cmsGetContext(ContextID); if (ctx ->MemPool == NULL) { if (ContextID == NULL) { ctx->MemPool = _cmsCreateSubAlloc(0, 2*1024); if (ctx->MemPool == NULL) return NULL; } else { cmsSignalError(ContextID, cmsERROR_CORRUPTION_DETECTED, "NULL memory pool on context"); return NULL; } } return _cmsSubAlloc(ctx->MemPool, size); } // Main plug-in dispatcher cmsBool CMSEXPORT cmsPlugin(void* Plug_in) { return cmsPluginTHR(NULL, Plug_in); } cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in) { cmsPluginBase* Plugin; for (Plugin = (cmsPluginBase*) Plug_in; Plugin != NULL; Plugin = Plugin -> Next) { if (Plugin -> Magic != cmsPluginMagicNumber) { cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin"); return FALSE; } if (Plugin ->ExpectedVersion > LCMS_VERSION) { cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "plugin needs Little CMS %d, current version is %d", Plugin ->ExpectedVersion, LCMS_VERSION); return FALSE; } switch (Plugin -> Type) { case cmsPluginMemHandlerSig: if (!_cmsRegisterMemHandlerPlugin(id, Plugin)) return FALSE; break; case cmsPluginInterpolationSig: if (!_cmsRegisterInterpPlugin(id, Plugin)) return FALSE; break; case cmsPluginTagTypeSig: if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE; break; case cmsPluginTagSig: if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE; break; case cmsPluginFormattersSig: if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE; break; case cmsPluginRenderingIntentSig: if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE; break; case cmsPluginParametricCurveSig: if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE; break; case cmsPluginMultiProcessElementSig: if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE; break; case cmsPluginOptimizationSig: if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE; break; case cmsPluginTransformSig: if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE; break; case cmsPluginMutexSig: if (!_cmsRegisterMutexPlugin(id, Plugin)) return FALSE; break; case cmsPluginParalellizationSig: if (!_cmsRegisterParallelizationPlugin(id, Plugin)) return FALSE; break; default: cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin type '%X'", Plugin -> Type); return FALSE; } } // Keep a reference to the plug-in return TRUE; } // Revert all plug-ins to default void CMSEXPORT cmsUnregisterPlugins(void) { cmsUnregisterPluginsTHR(NULL); } // The Global storage for system context. This is the one and only global variable // pointers structure. All global vars are referenced here. static struct _cmsContext_struct globalContext = { NULL, // Not in the linked list NULL, // No suballocator { NULL, // UserPtr, &_cmsLogErrorChunk, // Logger, &_cmsAlarmCodesChunk, // AlarmCodes, &_cmsAdaptationStateChunk, // AdaptationState, &_cmsMemPluginChunk, // MemPlugin, &_cmsInterpPluginChunk, // InterpPlugin, &_cmsCurvesPluginChunk, // CurvesPlugin, &_cmsFormattersPluginChunk, // FormattersPlugin, &_cmsTagTypePluginChunk, // TagTypePlugin, &_cmsTagPluginChunk, // TagPlugin, &_cmsIntentsPluginChunk, // IntentPlugin, &_cmsMPETypePluginChunk, // MPEPlugin, &_cmsOptimizationPluginChunk, // OptimizationPlugin, &_cmsTransformPluginChunk, // TransformPlugin, &_cmsMutexPluginChunk, // MutexPlugin, &_cmsParallelizationPluginChunk // ParallelizationPlugin }, { NULL, NULL, NULL, NULL, NULL, NULL } // The default memory allocator is not used for context 0 }; // The context pool (linked list head) static _cmsMutex _cmsContextPoolHeadMutex = CMS_MUTEX_INITIALIZER; static struct _cmsContext_struct* _cmsContextPoolHead = NULL; // Make sure context is initialized (needed on windows) static cmsBool InitContextMutex(void) { // See the comments regarding locking in lcms2_internal.h // for an explanation of why we need the following code. #ifndef CMS_NO_PTHREADS #ifdef CMS_IS_WINDOWS_ #ifndef CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT static cmsBool already_initialized = FALSE; if (!already_initialized) { static HANDLE _cmsWindowsInitMutex = NULL; static volatile HANDLE* mutex = &_cmsWindowsInitMutex; if (*mutex == NULL) { HANDLE p = CreateMutex(NULL, FALSE, NULL); if (p && InterlockedCompareExchangePointer((void**)mutex, (void*)p, NULL) != NULL) CloseHandle(p); } if (*mutex == NULL || WaitForSingleObject(*mutex, INFINITE) == WAIT_FAILED) { cmsSignalError(0, cmsERROR_INTERNAL, "Mutex lock failed"); return FALSE; } if (((void**)&_cmsContextPoolHeadMutex)[0] == NULL) InitializeCriticalSection(&_cmsContextPoolHeadMutex); if (*mutex == NULL || !ReleaseMutex(*mutex)) { cmsSignalError(0, cmsERROR_INTERNAL, "Mutex unlock failed"); return FALSE; } already_initialized = TRUE; } #endif #endif #endif return TRUE; } // Internal, get associated pointer, with guessing. Never returns NULL. struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID) { struct _cmsContext_struct* id = (struct _cmsContext_struct*) ContextID; struct _cmsContext_struct* ctx; // On 0, use global settings if (id == NULL) return &globalContext; InitContextMutex(); // Search _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); for (ctx = _cmsContextPoolHead; ctx != NULL; ctx = ctx ->Next) { // Found it? if (id == ctx) { _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); return ctx; // New-style context } } _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); return &globalContext; } // Internal: get the memory area associanted with each context client // Returns the block assigned to the specific zone. Never return NULL. void* _cmsContextGetClientChunk(cmsContext ContextID, _cmsMemoryClient mc) { struct _cmsContext_struct* ctx; void *ptr; if ((int) mc < 0 || mc >= MemoryClientMax) { cmsSignalError(ContextID, cmsERROR_INTERNAL, "Bad context client -- possible corruption"); // This is catastrophic. Should never reach here _cmsAssert(0); // Reverts to global context return globalContext.chunks[UserPtr]; } ctx = _cmsGetContext(ContextID); ptr = ctx ->chunks[mc]; if (ptr != NULL) return ptr; // A null ptr means no special settings for that context, and this // reverts to Context0 globals return globalContext.chunks[mc]; } // This function returns the given context its default pristine state, // as no plug-ins were declared. There is no way to unregister a single // plug-in, as a single call to cmsPluginTHR() function may register // many different plug-ins simultaneously, then there is no way to // identify which plug-in to unregister. void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID) { _cmsRegisterMemHandlerPlugin(ContextID, NULL); _cmsRegisterInterpPlugin(ContextID, NULL); _cmsRegisterTagTypePlugin(ContextID, NULL); _cmsRegisterTagPlugin(ContextID, NULL); _cmsRegisterFormattersPlugin(ContextID, NULL); _cmsRegisterRenderingIntentPlugin(ContextID, NULL); _cmsRegisterParametricCurvesPlugin(ContextID, NULL); _cmsRegisterMultiProcessElementPlugin(ContextID, NULL); _cmsRegisterOptimizationPlugin(ContextID, NULL); _cmsRegisterTransformPlugin(ContextID, NULL); _cmsRegisterMutexPlugin(ContextID, NULL); _cmsRegisterParallelizationPlugin(ContextID, NULL); } // Returns the memory manager plug-in, if any, from the Plug-in bundle static cmsPluginMemHandler* _cmsFindMemoryPlugin(void* PluginBundle) { cmsPluginBase* Plugin; for (Plugin = (cmsPluginBase*) PluginBundle; Plugin != NULL; Plugin = Plugin -> Next) { if (Plugin -> Magic == cmsPluginMagicNumber && Plugin -> ExpectedVersion <= LCMS_VERSION && Plugin -> Type == cmsPluginMemHandlerSig) { // Found! return (cmsPluginMemHandler*) Plugin; } } // Nope, revert to defaults return NULL; } // Creates a new context with optional associated plug-ins. Caller may also specify an optional pointer to user-defined // data that will be forwarded to plug-ins and logger. cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData) { struct _cmsContext_struct* ctx; struct _cmsContext_struct fakeContext; if (!InitContextMutex()) return NULL; _cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager); fakeContext.chunks[UserPtr] = UserData; fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager; // Create the context structure. ctx = (struct _cmsContext_struct*) _cmsMalloc(&fakeContext, sizeof(struct _cmsContext_struct)); if (ctx == NULL) return NULL; // Something very wrong happened! // Init the structure and the memory manager memset(ctx, 0, sizeof(struct _cmsContext_struct)); // Keep memory manager memcpy(&ctx->DefaultMemoryManager, &fakeContext.DefaultMemoryManager, sizeof(_cmsMemPluginChunk)); // Maintain the linked list (with proper locking) _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->Next = _cmsContextPoolHead; _cmsContextPoolHead = ctx; _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->chunks[UserPtr] = UserData; ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager; // Now we can allocate the pool by using default memory manager ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); // default size about 22 pointers if (ctx ->MemPool == NULL) { cmsDeleteContext(ctx); return NULL; } _cmsAllocLogErrorChunk(ctx, NULL); _cmsAllocAlarmCodesChunk(ctx, NULL); _cmsAllocAdaptationStateChunk(ctx, NULL); _cmsAllocMemPluginChunk(ctx, NULL); _cmsAllocInterpPluginChunk(ctx, NULL); _cmsAllocCurvesPluginChunk(ctx, NULL); _cmsAllocFormattersPluginChunk(ctx, NULL); _cmsAllocTagTypePluginChunk(ctx, NULL); _cmsAllocMPETypePluginChunk(ctx, NULL); _cmsAllocTagPluginChunk(ctx, NULL); _cmsAllocIntentsPluginChunk(ctx, NULL); _cmsAllocOptimizationPluginChunk(ctx, NULL); _cmsAllocTransformPluginChunk(ctx, NULL); _cmsAllocMutexPluginChunk(ctx, NULL); _cmsAllocParallelizationPluginChunk(ctx, NULL); // Setup the plug-ins if (!cmsPluginTHR(ctx, Plugin)) { cmsDeleteContext(ctx); return NULL; } return (cmsContext) ctx; } // Duplicates a context with all associated plug-ins. // Caller may specify an optional pointer to user-defined // data that will be forwarded to plug-ins and logger. cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData) { int i; struct _cmsContext_struct* ctx; const struct _cmsContext_struct* src = _cmsGetContext(ContextID); void* userData = (NewUserData != NULL) ? NewUserData : src -> chunks[UserPtr]; ctx = (struct _cmsContext_struct*) _cmsMalloc(ContextID, sizeof(struct _cmsContext_struct)); if (ctx == NULL) return NULL; // Something very wrong happened if (!InitContextMutex()) return NULL; // Setup default memory allocators if (ContextID == NULL) _cmsInstallAllocFunctions(NULL, &ctx->DefaultMemoryManager); else memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); // Maintain the linked list _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->Next = _cmsContextPoolHead; _cmsContextPoolHead = ctx; _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->chunks[UserPtr] = userData; ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager; ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); if (ctx ->MemPool == NULL) { cmsDeleteContext(ctx); return NULL; } // Allocate all required chunks. _cmsAllocLogErrorChunk(ctx, src); _cmsAllocAlarmCodesChunk(ctx, src); _cmsAllocAdaptationStateChunk(ctx, src); _cmsAllocMemPluginChunk(ctx, src); _cmsAllocInterpPluginChunk(ctx, src); _cmsAllocCurvesPluginChunk(ctx, src); _cmsAllocFormattersPluginChunk(ctx, src); _cmsAllocTagTypePluginChunk(ctx, src); _cmsAllocMPETypePluginChunk(ctx, src); _cmsAllocTagPluginChunk(ctx, src); _cmsAllocIntentsPluginChunk(ctx, src); _cmsAllocOptimizationPluginChunk(ctx, src); _cmsAllocTransformPluginChunk(ctx, src); _cmsAllocMutexPluginChunk(ctx, src); _cmsAllocParallelizationPluginChunk(ctx, src); // Make sure no one failed for (i=Logger; i < MemoryClientMax; i++) { if (src ->chunks[i] == NULL) { cmsDeleteContext((cmsContext) ctx); return NULL; } } return (cmsContext) ctx; } // Frees any resources associated with the given context, // and destroys the context placeholder. // The ContextID can no longer be used in any THR operation. void CMSEXPORT cmsDeleteContext(cmsContext ContextID) { if (ContextID == NULL) { cmsUnregisterPlugins(); if (globalContext.MemPool != NULL) _cmsSubAllocDestroy(globalContext.MemPool); globalContext.MemPool = NULL; } else { struct _cmsContext_struct* ctx = (struct _cmsContext_struct*) ContextID; struct _cmsContext_struct fakeContext; struct _cmsContext_struct* prev; InitContextMutex(); memcpy(&fakeContext.DefaultMemoryManager, &ctx->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); fakeContext.chunks[UserPtr] = ctx ->chunks[UserPtr]; fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager; // Get rid of plugins cmsUnregisterPluginsTHR(ContextID); // Since all memory is allocated in the private pool, all what we need to do is destroy the pool if (ctx -> MemPool != NULL) _cmsSubAllocDestroy(ctx ->MemPool); ctx -> MemPool = NULL; // Maintain list _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); if (_cmsContextPoolHead == ctx) { _cmsContextPoolHead = ctx->Next; } else { // Search for previous for (prev = _cmsContextPoolHead; prev != NULL; prev = prev ->Next) { if (prev -> Next == ctx) { prev -> Next = ctx ->Next; break; } } } _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); // free the memory block itself _cmsFree(&fakeContext, ctx); } } // Returns the user data associated to the given ContextID, or NULL if no user data was attached on context creation void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID) { return _cmsContextGetClientChunk(ContextID, UserPtr); } // Use context mutex to provide thread-safe time cmsBool _cmsGetTime(struct tm* ptr_time) { struct tm* t; #if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME_S) struct tm tm; #endif time_t now = time(NULL); #ifdef HAVE_GMTIME_R t = gmtime_r(&now, &tm); #elif defined(HAVE_GMTIME_S) t = gmtime_s(&tm, &now) == 0 ? &tm : NULL; #else if (!InitContextMutex()) return FALSE; _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); t = gmtime(&now); _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); #endif if (t == NULL) return FALSE; else { *ptr_time = *t; return TRUE; } } lcms2-2.19.1/src/cmssm.c0000644000175000017500000004521415176573557013746 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // ------------------------------------------------------------------------ // Gamut boundary description by using Jan Morovic's Segment maxima method // Many thanks to Jan for allowing me to use his algorithm. // r = C* // alpha = Hab // theta = L* #define SECTORS 16 // number of divisions in alpha and theta // Spherical coordinates typedef struct { cmsFloat64Number r; cmsFloat64Number alpha; cmsFloat64Number theta; } cmsSpherical; typedef enum { GP_EMPTY, GP_SPECIFIED, GP_MODELED } GDBPointType; typedef struct { GDBPointType Type; cmsSpherical p; // Keep also alpha & theta of maximum } cmsGDBPoint; typedef struct { cmsContext ContextID; cmsGDBPoint Gamut[SECTORS][SECTORS]; } cmsGDB; // A line using the parametric form // P = a + t*u typedef struct { cmsVEC3 a; cmsVEC3 u; } cmsLine; // A plane using the parametric form // Q = b + r*v + s*w typedef struct { cmsVEC3 b; cmsVEC3 v; cmsVEC3 w; } cmsPlane; // -------------------------------------------------------------------------------------------- // ATAN2() which always returns degree positive numbers static cmsFloat64Number _cmsAtan2(cmsFloat64Number y, cmsFloat64Number x) { cmsFloat64Number a; // Deal with undefined case if (x == 0.0 && y == 0.0) return 0; a = (atan2(y, x) * 180.0) / M_PI; while (a < 0) { a += 360; } return a; } // Convert to spherical coordinates static void ToSpherical(cmsSpherical* sp, const cmsVEC3* v) { cmsFloat64Number L, a, b; L = v ->n[VX]; a = v ->n[VY]; b = v ->n[VZ]; sp ->r = sqrt( L*L + a*a + b*b ); if (sp ->r == 0) { sp ->alpha = sp ->theta = 0; return; } sp ->alpha = _cmsAtan2(a, b); sp ->theta = _cmsAtan2(sqrt(a*a + b*b), L); } // Convert to cartesian from spherical static void ToCartesian(cmsVEC3* v, const cmsSpherical* sp) { cmsFloat64Number sin_alpha; cmsFloat64Number cos_alpha; cmsFloat64Number sin_theta; cmsFloat64Number cos_theta; cmsFloat64Number L, a, b; sin_alpha = sin((M_PI * sp ->alpha) / 180.0); cos_alpha = cos((M_PI * sp ->alpha) / 180.0); sin_theta = sin((M_PI * sp ->theta) / 180.0); cos_theta = cos((M_PI * sp ->theta) / 180.0); a = sp ->r * sin_theta * sin_alpha; b = sp ->r * sin_theta * cos_alpha; L = sp ->r * cos_theta; v ->n[VX] = L; v ->n[VY] = a; v ->n[VZ] = b; } // Quantize sector of a spherical coordinate. Saturate 360, 180 to last sector // The limits are the centers of each sector, so static void QuantizeToSector(const cmsSpherical* sp, int* alpha, int* theta) { *alpha = (int) floor(((sp->alpha * (SECTORS)) / 360.0) ); *theta = (int) floor(((sp->theta * (SECTORS)) / 180.0) ); if (*alpha >= SECTORS) *alpha = SECTORS-1; if (*theta >= SECTORS) *theta = SECTORS-1; } // Line determined by 2 points static void LineOf2Points(cmsLine* line, cmsVEC3* a, cmsVEC3* b) { _cmsVEC3init(&line ->a, a ->n[VX], a ->n[VY], a ->n[VZ]); _cmsVEC3init(&line ->u, b ->n[VX] - a ->n[VX], b ->n[VY] - a ->n[VY], b ->n[VZ] - a ->n[VZ]); } // Evaluate parametric line static void GetPointOfLine(cmsVEC3* p, const cmsLine* line, cmsFloat64Number t) { p ->n[VX] = line ->a.n[VX] + t * line->u.n[VX]; p ->n[VY] = line ->a.n[VY] + t * line->u.n[VY]; p ->n[VZ] = line ->a.n[VZ] + t * line->u.n[VZ]; } /* Closest point in sector line1 to sector line2 (both are defined as 0 <=t <= 1) http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm Copyright 2001, softSurfer (www.softsurfer.com) This code may be freely used and modified for any purpose providing that this copyright notice is included with it. SoftSurfer makes no warranty for this code, and cannot be held liable for any real or imagined damage resulting from its use. Users of this code must verify correctness for their application. */ static cmsBool ClosestLineToLine(cmsVEC3* r, const cmsLine* line1, const cmsLine* line2) { cmsFloat64Number a, b, c, d, e, D; cmsFloat64Number sc, sN, sD; //cmsFloat64Number tc; // left for future use cmsFloat64Number tN, tD; cmsVEC3 w0; _cmsVEC3minus(&w0, &line1 ->a, &line2 ->a); a = _cmsVEC3dot(&line1 ->u, &line1 ->u); b = _cmsVEC3dot(&line1 ->u, &line2 ->u); c = _cmsVEC3dot(&line2 ->u, &line2 ->u); d = _cmsVEC3dot(&line1 ->u, &w0); e = _cmsVEC3dot(&line2 ->u, &w0); D = a*c - b * b; // Denominator sD = tD = D; // default sD = D >= 0 if (D < MATRIX_DET_TOLERANCE) { // the lines are almost parallel sN = 0.0; // force using point P0 on segment S1 sD = 1.0; // to prevent possible division by 0.0 later tN = e; tD = c; } else { // get the closest points on the infinite lines sN = (b*e - c*d); tN = (a*e - b*d); if (sN < 0.0) { // sc < 0 => the s=0 edge is visible sN = 0.0; tN = e; tD = c; } else if (sN > sD) { // sc > 1 => the s=1 edge is visible sN = sD; tN = e + b; tD = c; } } if (tN < 0.0) { // tc < 0 => the t=0 edge is visible tN = 0.0; // recompute sc for this edge if (-d < 0.0) sN = 0.0; else if (-d > a) sN = sD; else { sN = -d; sD = a; } } else if (tN > tD) { // tc > 1 => the t=1 edge is visible tN = tD; // recompute sc for this edge if ((-d + b) < 0.0) sN = 0; else if ((-d + b) > a) sN = sD; else { sN = (-d + b); sD = a; } } // finally do the division to get sc and tc sc = (fabs(sN) < MATRIX_DET_TOLERANCE ? 0.0 : sN / sD); //tc = (fabs(tN) < MATRIX_DET_TOLERANCE ? 0.0 : tN / tD); // left for future use. GetPointOfLine(r, line1, sc); return TRUE; } // ------------------------------------------------------------------ Wrapper // Allocate & free structure cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID) { cmsGDB* gbd = (cmsGDB*) _cmsMallocZero(ContextID, sizeof(cmsGDB)); if (gbd == NULL) return NULL; gbd -> ContextID = ContextID; return (cmsHANDLE) gbd; } void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD) { cmsGDB* gbd = (cmsGDB*) hGBD; if (hGBD != NULL) _cmsFree(gbd->ContextID, (void*) gbd); } // Auxiliary to retrieve a pointer to the segmentr containing the Lab value static cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp) { cmsVEC3 v; int alpha, theta; // Housekeeping _cmsAssert(gbd != NULL); _cmsAssert(Lab != NULL); _cmsAssert(sp != NULL); // Center L* by subtracting half of its domain, that's 50 _cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b); // Convert to spherical coordinates ToSpherical(sp, &v); if (sp ->r < 0 || sp ->alpha < 0 || sp->theta < 0) { cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, "spherical value out of range"); return NULL; } // On which sector it falls? QuantizeToSector(sp, &alpha, &theta); if (alpha < 0 || theta < 0 || alpha >= SECTORS || theta >= SECTORS) { cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, " quadrant out of range"); return NULL; } // Get pointer to the sector return &gbd ->Gamut[theta][alpha]; } // Add a point to gamut descriptor. Point to add is in Lab color space. // GBD is centered on a=b=0 and L*=50 cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab) { cmsGDB* gbd = (cmsGDB*) hGBD; cmsGDBPoint* ptr; cmsSpherical sp; // Get pointer to the sector ptr = GetPoint(gbd, Lab, &sp); if (ptr == NULL) return FALSE; // If no samples at this sector, add it if (ptr ->Type == GP_EMPTY) { ptr -> Type = GP_SPECIFIED; ptr -> p = sp; } else { // Substitute only if radius is greater if (sp.r > ptr -> p.r) { ptr -> Type = GP_SPECIFIED; ptr -> p = sp; } } return TRUE; } // Check if a given point falls inside gamut cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab) { cmsGDB* gbd = (cmsGDB*) hGBD; cmsGDBPoint* ptr; cmsSpherical sp; // Get pointer to the sector ptr = GetPoint(gbd, Lab, &sp); if (ptr == NULL) return FALSE; // If no samples at this sector, return no data if (ptr ->Type == GP_EMPTY) return FALSE; // In gamut only if radius is greater return (sp.r <= ptr -> p.r); } // ----------------------------------------------------------------------------------------------------------------------- // Find near sectors. The list of sectors found is returned on Close[]. // The function returns the number of sectors as well. // 24 9 10 11 12 // 23 8 1 2 13 // 22 7 * 3 14 // 21 6 5 4 15 // 20 19 18 17 16 // // Those are the relative movements // {-2,-2}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2}, // {-2,-1}, {-1, -1}, {0, -1}, {+1, -1}, {+2, -1}, // {-2, 0}, {-1, 0}, {0, 0}, {+1, 0}, {+2, 0}, // {-2,+1}, {-1, +1}, {0, +1}, {+1, +1}, {+2, +1}, // {-2,+2}, {-1, +2}, {0, +2}, {+1, +2}, {+2, +2}}; static const struct _spiral { int AdvX, AdvY; } Spiral[] = { {0, -1}, {+1, -1}, {+1, 0}, {+1, +1}, {0, +1}, {-1, +1}, {-1, 0}, {-1, -1}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2}, {+2, -1}, {+2, 0}, {+2, +1}, {+2, +2}, {+1, +2}, {0, +2}, {-1, +2}, {-2, +2}, {-2, +1}, {-2, 0}, {-2, -1}, {-2, -2} }; #define NSTEPS (sizeof(Spiral) / sizeof(struct _spiral)) static int FindNearSectors(cmsGDB* gbd, int alpha, int theta, cmsGDBPoint* Close[]) { int nSectors = 0; int a, t; cmsUInt32Number i; cmsGDBPoint* pt; for (i=0; i < NSTEPS; i++) { a = alpha + Spiral[i].AdvX; t = theta + Spiral[i].AdvY; // Cycle at the end a %= SECTORS; t %= SECTORS; // Cycle at the begin if (a < 0) a = SECTORS + a; if (t < 0) t = SECTORS + t; pt = &gbd ->Gamut[t][a]; if (pt -> Type != GP_EMPTY) { Close[nSectors++] = pt; } } return nSectors; } // Interpolate a missing sector. Method identifies whatever this is top, bottom or mid static cmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta) { cmsSpherical sp; cmsVEC3 Lab; cmsVEC3 Centre; cmsLine ray; int nCloseSectors; cmsGDBPoint* Close[NSTEPS + 1]; cmsSpherical closel, templ; cmsLine edge; int k, m; // Is that point already specified? if (gbd ->Gamut[theta][alpha].Type != GP_EMPTY) return TRUE; // Fill close points nCloseSectors = FindNearSectors(gbd, alpha, theta, Close); // Find a central point on the sector sp.alpha = (cmsFloat64Number) ((alpha + 0.5) * 360.0) / (SECTORS); sp.theta = (cmsFloat64Number) ((theta + 0.5) * 180.0) / (SECTORS); sp.r = 50.0; // Convert to Cartesian ToCartesian(&Lab, &sp); // Create a ray line from centre to this point _cmsVEC3init(&Centre, 50.0, 0, 0); LineOf2Points(&ray, &Lab, &Centre); // For all close sectors closel.r = 0.0; closel.alpha = 0; closel.theta = 0; for (k=0; k < nCloseSectors; k++) { for(m = k+1; m < nCloseSectors; m++) { cmsVEC3 temp, a1, a2; // A line from sector to sector ToCartesian(&a1, &Close[k]->p); ToCartesian(&a2, &Close[m]->p); LineOf2Points(&edge, &a1, &a2); // Find a line ClosestLineToLine(&temp, &ray, &edge); // Convert to spherical ToSpherical(&templ, &temp); if ( templ.r > closel.r && templ.theta >= (theta*180.0/SECTORS) && templ.theta <= ((theta+1)*180.0/SECTORS) && templ.alpha >= (alpha*360.0/SECTORS) && templ.alpha <= ((alpha+1)*360.0/SECTORS)) { closel = templ; } } } gbd ->Gamut[theta][alpha].p = closel; gbd ->Gamut[theta][alpha].Type = GP_MODELED; return TRUE; } // Interpolate missing parts. The algorithm fist computes slices at // theta=0 and theta=Max. cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags) { int alpha, theta; cmsGDB* gbd = (cmsGDB*) hGBD; _cmsAssert(hGBD != NULL); // Interpolate black for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, 0)) return FALSE; } // Interpolate white for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, SECTORS-1)) return FALSE; } // Interpolate Mid for (theta = 1; theta < SECTORS; theta++) { for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, theta)) return FALSE; } } // Done return TRUE; cmsUNUSED_PARAMETER(dwFlags); } // -------------------------------------------------------------------------------------------------------- // Great for debug, but not suitable for real use #if 0 cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname) { FILE* fp; int i, j; cmsGDB* gbd = (cmsGDB*) hGBD; cmsGDBPoint* pt; fp = fopen (fname, "wt"); if (fp == NULL) return FALSE; fprintf (fp, "#VRML V2.0 utf8\n"); // set the viewing orientation and distance fprintf (fp, "DEF CamTest Group {\n"); fprintf (fp, "\tchildren [\n"); fprintf (fp, "\t\tDEF Cameras Group {\n"); fprintf (fp, "\t\t\tchildren [\n"); fprintf (fp, "\t\t\t\tDEF DefaultView Viewpoint {\n"); fprintf (fp, "\t\t\t\t\tposition 0 0 340\n"); fprintf (fp, "\t\t\t\t\torientation 0 0 1 0\n"); fprintf (fp, "\t\t\t\t\tdescription \"default view\"\n"); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t]\n"); fprintf (fp, "\t\t},\n"); fprintf (fp, "\t]\n"); fprintf (fp, "}\n"); // Output the background stuff fprintf (fp, "Background {\n"); fprintf (fp, "\tskyColor [\n"); fprintf (fp, "\t\t.5 .5 .5\n"); fprintf (fp, "\t]\n"); fprintf (fp, "}\n"); // Output the shape stuff fprintf (fp, "Transform {\n"); fprintf (fp, "\tscale .3 .3 .3\n"); fprintf (fp, "\tchildren [\n"); // Draw the axes as a shape: fprintf (fp, "\t\tShape {\n"); fprintf (fp, "\t\t\tappearance Appearance {\n"); fprintf (fp, "\t\t\t\tmaterial Material {\n"); fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n"); fprintf (fp, "\t\t\t\t\temissiveColor 1.0 1.0 1.0\n"); fprintf (fp, "\t\t\t\t\tshininess 0.8\n"); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t\tgeometry IndexedLineSet {\n"); fprintf (fp, "\t\t\t\tcoord Coordinate {\n"); fprintf (fp, "\t\t\t\t\tpoint [\n"); fprintf (fp, "\t\t\t\t\t0.0 0.0 0.0,\n"); fprintf (fp, "\t\t\t\t\t%f 0.0 0.0,\n", 255.0); fprintf (fp, "\t\t\t\t\t0.0 %f 0.0,\n", 255.0); fprintf (fp, "\t\t\t\t\t0.0 0.0 %f]\n", 255.0); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t\tcoordIndex [\n"); fprintf (fp, "\t\t\t\t\t0, 1, -1\n"); fprintf (fp, "\t\t\t\t\t0, 2, -1\n"); fprintf (fp, "\t\t\t\t\t0, 3, -1]\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t}\n"); fprintf (fp, "\t\tShape {\n"); fprintf (fp, "\t\t\tappearance Appearance {\n"); fprintf (fp, "\t\t\t\tmaterial Material {\n"); fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n"); fprintf (fp, "\t\t\t\t\temissiveColor 1 1 1\n"); fprintf (fp, "\t\t\t\t\tshininess 0.8\n"); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t\tgeometry PointSet {\n"); // fill in the points here fprintf (fp, "\t\t\t\tcoord Coordinate {\n"); fprintf (fp, "\t\t\t\t\tpoint [\n"); // We need to transverse all gamut hull. for (i=0; i < SECTORS; i++) for (j=0; j < SECTORS; j++) { cmsVEC3 v; pt = &gbd ->Gamut[i][j]; ToCartesian(&v, &pt ->p); fprintf (fp, "\t\t\t\t\t%g %g %g", v.n[0]+50, v.n[1], v.n[2]); if ((j == SECTORS - 1) && (i == SECTORS - 1)) fprintf (fp, "]\n"); else fprintf (fp, ",\n"); } fprintf (fp, "\t\t\t\t}\n"); // fill in the face colors fprintf (fp, "\t\t\t\tcolor Color {\n"); fprintf (fp, "\t\t\t\t\tcolor [\n"); for (i=0; i < SECTORS; i++) for (j=0; j < SECTORS; j++) { cmsVEC3 v; pt = &gbd ->Gamut[i][j]; ToCartesian(&v, &pt ->p); if (pt ->Type == GP_EMPTY) fprintf (fp, "\t\t\t\t\t%g %g %g", 0.0, 0.0, 0.0); else if (pt ->Type == GP_MODELED) fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, .5, .5); else { fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, 1.0, 1.0); } if ((j == SECTORS - 1) && (i == SECTORS - 1)) fprintf (fp, "]\n"); else fprintf (fp, ",\n"); } fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t}\n"); fprintf (fp, "\t]\n"); fprintf (fp, "}\n"); fclose (fp); return TRUE; } #endif lcms2-2.19.1/src/cmswtpnt.c0000644000175000017500000002561115176573557014502 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // D50 - Widely used const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void) { static cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z}; return &D50XYZ; } const cmsCIExyY* CMSEXPORT cmsD50_xyY(void) { static cmsCIExyY D50xyY; cmsXYZ2xyY(&D50xyY, cmsD50_XYZ()); return &D50xyY; } // Obtains WhitePoint from Temperature cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK) { cmsFloat64Number x, y; cmsFloat64Number T, T2, T3; // cmsFloat64Number M1, M2; _cmsAssert(WhitePoint != NULL); T = TempK; T2 = T*T; // Square T3 = T2*T; // Cube // For correlated color temperature (T) between 4000K and 7000K: if (T >= 4000. && T <= 7000.) { x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063; } else // or for correlated color temperature (T) between 7000K and 25000K: if (T > 7000.0 && T <= 25000.0) { x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040; } else { cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp"); return FALSE; } // Obtain y(x) y = -3.000*(x*x) + 2.870*x - 0.275; // wave factors (not used, but here for futures extensions) // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y); // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y); WhitePoint -> x = x; WhitePoint -> y = y; WhitePoint -> Y = 1.0; return TRUE; } typedef struct { cmsFloat64Number mirek; // temp (in microreciprocal kelvin) cmsFloat64Number ut; // u coord of intersection w/ blackbody locus cmsFloat64Number vt; // v coord of intersection w/ blackbody locus cmsFloat64Number tt; // slope of ISOTEMPERATURE. line } ISOTEMPERATURE; static const ISOTEMPERATURE isotempdata[] = { // {Mirek, Ut, Vt, Tt } {0, 0.18006, 0.26352, -0.24341}, {10, 0.18066, 0.26589, -0.25479}, {20, 0.18133, 0.26846, -0.26876}, {30, 0.18208, 0.27119, -0.28539}, {40, 0.18293, 0.27407, -0.30470}, {50, 0.18388, 0.27709, -0.32675}, {60, 0.18494, 0.28021, -0.35156}, {70, 0.18611, 0.28342, -0.37915}, {80, 0.18740, 0.28668, -0.40955}, {90, 0.18880, 0.28997, -0.44278}, {100, 0.19032, 0.29326, -0.47888}, {125, 0.19462, 0.30141, -0.58204}, {150, 0.19962, 0.30921, -0.70471}, {175, 0.20525, 0.31647, -0.84901}, {200, 0.21142, 0.32312, -1.0182 }, {225, 0.21807, 0.32909, -1.2168 }, {250, 0.22511, 0.33439, -1.4512 }, {275, 0.23247, 0.33904, -1.7298 }, {300, 0.24010, 0.34308, -2.0637 }, {325, 0.24702, 0.34655, -2.4681 }, {350, 0.25591, 0.34951, -2.9641 }, {375, 0.26400, 0.35200, -3.5814 }, {400, 0.27218, 0.35407, -4.3633 }, {425, 0.28039, 0.35577, -5.3762 }, {450, 0.28863, 0.35714, -6.7262 }, {475, 0.29685, 0.35823, -8.5955 }, {500, 0.30505, 0.35907, -11.324 }, {525, 0.31320, 0.35968, -15.628 }, {550, 0.32129, 0.36011, -23.325 }, {575, 0.32931, 0.36038, -40.770 }, {600, 0.33724, 0.36051, -116.45 } }; #define NISO sizeof(isotempdata)/sizeof(ISOTEMPERATURE) // Robertson's method cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint) { cmsUInt32Number j; cmsFloat64Number us,vs; cmsFloat64Number uj,vj,tj,di,dj,mi,mj; cmsFloat64Number xs, ys; _cmsAssert(WhitePoint != NULL); _cmsAssert(TempK != NULL); di = mi = 0; xs = WhitePoint -> x; ys = WhitePoint -> y; // convert (x,y) to CIE 1960 (u,WhitePoint) us = (2*xs) / (-xs + 6*ys + 1.5); vs = (3*ys) / (-xs + 6*ys + 1.5); for (j=0; j < NISO; j++) { uj = isotempdata[j].ut; vj = isotempdata[j].vt; tj = isotempdata[j].tt; mj = isotempdata[j].mirek; dj = ((vs - vj) - tj * (us - uj)) / sqrt(1.0 + tj * tj); if ((j != 0) && (di/dj < 0.0)) { // Found a match *TempK = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi)); return TRUE; } di = dj; mi = mj; } // Not found return FALSE; } // Compute chromatic adaptation matrix using Chad as cone matrix static cmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion, const cmsCIEXYZ* SourceWhitePoint, const cmsCIEXYZ* DestWhitePoint, const cmsMAT3* Chad) { cmsMAT3 Chad_Inv; cmsVEC3 ConeSourceXYZ, ConeSourceRGB; cmsVEC3 ConeDestXYZ, ConeDestRGB; cmsMAT3 Cone, Tmp; Tmp = *Chad; if (!_cmsMAT3inverse(&Tmp, &Chad_Inv)) return FALSE; _cmsVEC3init(&ConeSourceXYZ, SourceWhitePoint -> X, SourceWhitePoint -> Y, SourceWhitePoint -> Z); _cmsVEC3init(&ConeDestXYZ, DestWhitePoint -> X, DestWhitePoint -> Y, DestWhitePoint -> Z); _cmsMAT3eval(&ConeSourceRGB, Chad, &ConeSourceXYZ); _cmsMAT3eval(&ConeDestRGB, Chad, &ConeDestXYZ); if ((fabs(ConeSourceRGB.n[0]) < MATRIX_DET_TOLERANCE) || (fabs(ConeSourceRGB.n[1]) < MATRIX_DET_TOLERANCE) || (fabs(ConeSourceRGB.n[2]) < MATRIX_DET_TOLERANCE)) return FALSE; // Build matrix _cmsVEC3init(&Cone.v[0], ConeDestRGB.n[0]/ConeSourceRGB.n[0], 0.0, 0.0); _cmsVEC3init(&Cone.v[1], 0.0, ConeDestRGB.n[1]/ConeSourceRGB.n[1], 0.0); _cmsVEC3init(&Cone.v[2], 0.0, 0.0, ConeDestRGB.n[2]/ConeSourceRGB.n[2]); // Normalize _cmsMAT3per(&Tmp, &Cone, Chad); _cmsMAT3per(Conversion, &Chad_Inv, &Tmp); return TRUE; } // Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll // The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll) { cmsMAT3 LamRigg = {{ // Bradford matrix {{ 0.8951, 0.2664, -0.1614 }}, {{ -0.7502, 1.7135, 0.0367 }}, {{ 0.0389, -0.0685, 1.0296 }} }}; if (ConeMatrix == NULL) ConeMatrix = &LamRigg; return ComputeChromaticAdaptation(r, FromIll, ToIll, ConeMatrix); } // Same as anterior, but assuming D50 destination. White point is given in xyY static cmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt) { cmsCIEXYZ Dn; cmsMAT3 Bradford; cmsMAT3 Tmp; cmsxyY2XYZ(&Dn, SourceWhitePt); if (!_cmsAdaptationMatrix(&Bradford, NULL, &Dn, cmsD50_XYZ())) return FALSE; Tmp = *r; _cmsMAT3per(r, &Bradford, &Tmp); return TRUE; } // Build a White point, primary chromas transfer matrix from RGB to CIE XYZ // This is just an approximation, I am not handling all the non-linear // aspects of the RGB to XYZ process, and assuming that the gamma correction // has transitive property in the transformation chain. // // the algorithm: // // - First I build the absolute conversion matrix using // primaries in XYZ. This matrix is next inverted // - Then I eval the source white point across this matrix // obtaining the coefficients of the transformation // - Then, I apply these coefficients to the original matrix // cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePt, const cmsCIExyYTRIPLE* Primrs) { cmsVEC3 WhitePoint, Coef; cmsMAT3 Result, Primaries; cmsFloat64Number xn, yn; cmsFloat64Number xr, yr; cmsFloat64Number xg, yg; cmsFloat64Number xb, yb; xn = WhitePt -> x; yn = WhitePt -> y; xr = Primrs -> Red.x; yr = Primrs -> Red.y; xg = Primrs -> Green.x; yg = Primrs -> Green.y; xb = Primrs -> Blue.x; yb = Primrs -> Blue.y; // Build Primaries matrix _cmsVEC3init(&Primaries.v[0], xr, xg, xb); _cmsVEC3init(&Primaries.v[1], yr, yg, yb); _cmsVEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg), (1-xb-yb)); // Result = Primaries ^ (-1) inverse matrix if (!_cmsMAT3inverse(&Primaries, &Result)) return FALSE; _cmsVEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn); // Across inverse primaries ... _cmsMAT3eval(&Coef, &Result, &WhitePoint); // Give us the Coefs, then I build transformation matrix _cmsVEC3init(&r -> v[0], Coef.n[VX]*xr, Coef.n[VY]*xg, Coef.n[VZ]*xb); _cmsVEC3init(&r -> v[1], Coef.n[VX]*yr, Coef.n[VY]*yg, Coef.n[VZ]*yb); _cmsVEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb)); return _cmsAdaptMatrixToD50(r, WhitePt); } // Adapts a color to a given illuminant. Original color is expected to have // a SourceWhitePt white point. cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt, const cmsCIEXYZ* Illuminant, const cmsCIEXYZ* Value) { cmsMAT3 Bradford; cmsVEC3 In, Out; _cmsAssert(Result != NULL); _cmsAssert(SourceWhitePt != NULL); _cmsAssert(Illuminant != NULL); _cmsAssert(Value != NULL); if (!_cmsAdaptationMatrix(&Bradford, NULL, SourceWhitePt, Illuminant)) return FALSE; _cmsVEC3init(&In, Value -> X, Value -> Y, Value -> Z); _cmsMAT3eval(&Out, &Bradford, &In); Result -> X = Out.n[0]; Result -> Y = Out.n[1]; Result -> Z = Out.n[2]; return TRUE; } lcms2-2.19.1/src/cmsintrp.c0000644000175000017500000011713015176573557014460 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // This module incorporates several interpolation routines, for 1 to 8 channels on input and // up to 65535 channels on output. The user may change those by using the interpolation plug-in // Some people may want to compile as C++ with all warnings on, in this case make compiler silent #ifdef _MSC_VER # if (_MSC_VER >= 1400) # pragma warning( disable : 4365 ) # endif #endif // Interpolation routines by default static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); // This is the default factory _cmsInterpPluginChunkType _cmsInterpPluginChunk = { NULL }; // The interpolation plug-in memory chunk allocator/dup void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { void* from; _cmsAssert(ctx != NULL); if (src != NULL) { from = src ->chunks[InterpPlugin]; } else { static _cmsInterpPluginChunkType InterpPluginChunk = { NULL }; from = &InterpPluginChunk; } _cmsAssert(from != NULL); ctx ->chunks[InterpPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsInterpPluginChunkType)); } // Main plug-in entry cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginInterpolation* Plugin = (cmsPluginInterpolation*) Data; _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin); if (Data == NULL) { ptr ->Interpolators = NULL; return TRUE; } // Set replacement functions ptr ->Interpolators = Plugin ->InterpolatorsFactory; return TRUE; } // Set the interpolation method cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p) { _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin); p ->Interpolation.Lerp16 = NULL; // Invoke factory, possibly in the Plug-in if (ptr ->Interpolators != NULL) p ->Interpolation = ptr->Interpolators(p -> nInputs, p ->nOutputs, p ->dwFlags); // If unsupported by the plug-in, go for the LittleCMS default. // If happens only if an extern plug-in is being used if (p ->Interpolation.Lerp16 == NULL) p ->Interpolation = DefaultInterpolatorsFactory(p ->nInputs, p ->nOutputs, p ->dwFlags); // Check for valid interpolator (we just check one member of the union) if (p ->Interpolation.Lerp16 == NULL) { return FALSE; } return TRUE; } // This function precalculates as many parameters as possible to speed up the interpolation. cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void *Table, cmsUInt32Number dwFlags) { cmsInterpParams* p; cmsUInt32Number i; // Check for maximum inputs if (InputChan > MAX_INPUT_DIMENSIONS) { cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", InputChan, MAX_INPUT_DIMENSIONS); return NULL; } // Creates an empty object p = (cmsInterpParams*) _cmsMallocZero(ContextID, sizeof(cmsInterpParams)); if (p == NULL) return NULL; // Keep original parameters p -> dwFlags = dwFlags; p -> nInputs = InputChan; p -> nOutputs = OutputChan; p ->Table = Table; p ->ContextID = ContextID; // Fill samples per input direction and domain (which is number of nodes minus one) for (i=0; i < InputChan; i++) { p -> nSamples[i] = nSamples[i]; p -> Domain[i] = nSamples[i] - 1; } // Compute factors to apply to each component to index the grid array p -> opta[0] = p -> nOutputs; for (i=1; i < InputChan; i++) p ->opta[i] = p ->opta[i-1] * nSamples[InputChan-i]; if (!_cmsSetInterpolationRoutine(ContextID, p)) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported interpolation (%d->%d channels)", InputChan, OutputChan); _cmsFree(ContextID, p); return NULL; } // All seems ok return p; } // This one is a wrapper on the anterior, but assuming all directions have same number of nodes cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags) { int i; cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS]; // Fill the auxiliary array for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Samples[i] = nSamples; // Call the extended function return _cmsComputeInterpParamsEx(ContextID, Samples, InputChan, OutputChan, Table, dwFlags); } // Free all associated memory void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p) { if (p != NULL) _cmsFree(p ->ContextID, p); } // Inline fixed point interpolation cmsINLINE CMS_NO_SANITIZE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h) { cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000; dif = (dif >> 16) + l; return (cmsUInt16Number) (dif); } // Linear interpolation (Fixed-point optimized) static void LinLerp1D(CMSREGISTER const cmsUInt16Number Value[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p) { cmsUInt16Number y1, y0; int cell0, rest; int val3; const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; // if last value or just one point if (Value[0] == 0xffff || p->Domain[0] == 0) { Output[0] = LutTable[p -> Domain[0]]; } else { val3 = p->Domain[0] * Value[0]; val3 = _cmsToFixedDomain(val3); // To fixed 15.16 cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits rest = FIXED_REST_TO_INT(val3); // Rest is 16 LSB bits y0 = LutTable[cell0]; y1 = LutTable[cell0 + 1]; Output[0] = LinearInterp(rest, y0, y1); } } // To prevent out of bounds indexing cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) { return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 1.0f ? 1.0f : v); } // Floating-point version of 1D interpolation static void LinLerp1Dfloat(const cmsFloat32Number Value[], cmsFloat32Number Output[], const cmsInterpParams* p) { cmsFloat32Number y1, y0; cmsFloat32Number val2, rest; int cell0, cell1; const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0 || p->Domain[0] == 0) { Output[0] = LutTable[p -> Domain[0]]; } else { val2 *= p->Domain[0]; cell0 = (int)floor(val2); cell1 = (int)ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; y0 = LutTable[cell0]; y1 = LutTable[cell1]; Output[0] = y0 + (y1 - y0) * rest; } } // Eval gray LUT having only one input channel static CMS_NO_SANITIZE void Eval1Input(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p16) { cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, k1, rk, K0, K1; int v; cmsUInt32Number OutChan; const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; // if last value... if (Input[0] == 0xffff || p16->Domain[0] == 0) { cmsUInt32Number y0 = p16->Domain[0] * p16->opta[0]; for (OutChan = 0; OutChan < p16->nOutputs; OutChan++) { Output[OutChan] = LutTable[y0 + OutChan]; } } else { v = Input[0] * p16->Domain[0]; fk = _cmsToFixedDomain(v); k0 = FIXED_TO_INT(fk); rk = (cmsUInt16Number)FIXED_REST_TO_INT(fk); k1 = k0 + (Input[0] != 0xFFFFU ? 1 : 0); K0 = p16->opta[0] * k0; K1 = p16->opta[0] * k1; for (OutChan = 0; OutChan < p16->nOutputs; OutChan++) { Output[OutChan] = LinearInterp(rk, LutTable[K0 + OutChan], LutTable[K1 + OutChan]); } } } // Eval gray LUT having only one input channel static void Eval1InputFloat(const cmsFloat32Number Value[], cmsFloat32Number Output[], const cmsInterpParams* p) { cmsFloat32Number y1, y0; cmsFloat32Number val2, rest; int cell0, cell1; cmsUInt32Number OutChan; const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0 || p->Domain[0] == 0) { cmsUInt32Number start = p->Domain[0] * p->opta[0]; for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { Output[OutChan] = LutTable[start + OutChan]; } } else { val2 *= p->Domain[0]; cell0 = (int)floor(val2); cell1 = (int)ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; cell0 *= p->opta[0]; cell1 *= p->opta[0]; for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { y0 = LutTable[cell0 + OutChan]; y1 = LutTable[cell1 + OutChan]; Output[OutChan] = y0 + (y1 - y0) * rest; } } } // Bilinear interpolation (16 bits) - cmsFloat32Number version static void BilinearInterpFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { # define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a))) # define DENS(i,j) (LutTable[(i)+(j)+OutChan]) const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; cmsFloat32Number px, py; int x0, y0, X0, Y0, X1, Y1; int TotalOut, OutChan; cmsFloat32Number fx, fy, d00, d01, d10, d11, dx0, dx1, dxy; TotalOut = p -> nOutputs; px = fclamp(Input[0]) * p->Domain[0]; py = fclamp(Input[1]) * p->Domain[1]; x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0; y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; X0 = p -> opta[1] * x0; X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[1]); Y0 = p -> opta[0] * y0; Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d00 = DENS(X0, Y0); d01 = DENS(X0, Y1); d10 = DENS(X1, Y0); d11 = DENS(X1, Y1); dx0 = LERP(fx, d00, d10); dx1 = LERP(fx, d01, d11); dxy = LERP(fy, dx0, dx1); Output[OutChan] = dxy; } # undef LERP # undef DENS } // Bilinear interpolation (16 bits) - optimized version static CMS_NO_SANITIZE void BilinearInterp16(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p) { #define DENS(i,j) (LutTable[(i)+(j)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy; CMSREGISTER int rx, ry; int x0, y0; CMSREGISTER int X0, X1, Y0, Y1; int d00, d01, d10, d11, dx0, dx1, dxy; TotalOut = p -> nOutputs; fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); x0 = FIXED_TO_INT(fx); rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); y0 = FIXED_TO_INT(fy); ry = FIXED_REST_TO_INT(fy); X0 = p -> opta[1] * x0; X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[1]); Y0 = p -> opta[0] * y0; Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d00 = DENS(X0, Y0); d01 = DENS(X0, Y1); d10 = DENS(X1, Y0); d11 = DENS(X1, Y1); dx0 = LERP(rx, d00, d10); dx1 = LERP(rx, d01, d11); dxy = LERP(ry, dx0, dx1); Output[OutChan] = (cmsUInt16Number) dxy; } # undef LERP # undef DENS } // Trilinear interpolation (16 bits) - cmsFloat32Number version static void TrilinearInterpFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { # define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a))) # define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; cmsFloat32Number px, py, pz; int x0, y0, z0, X0, Y0, Z0, X1, Y1, Z1; int TotalOut, OutChan; cmsFloat32Number fx, fy, fz, d000, d001, d010, d011, d100, d101, d110, d111, dx00, dx01, dx10, dx11, dxy0, dxy1, dxyz; TotalOut = p -> nOutputs; // We need some clipping here px = fclamp(Input[0]) * p->Domain[0]; py = fclamp(Input[1]) * p->Domain[1]; pz = fclamp(Input[2]) * p->Domain[2]; x0 = (int) floor(px); fx = px - (cmsFloat32Number) x0; // We need full floor functionality here y0 = (int) floor(py); fy = py - (cmsFloat32Number) y0; z0 = (int) floor(pz); fz = pz - (cmsFloat32Number) z0; X0 = p -> opta[2] * x0; X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = Z0 + (fclamp(Input[2]) >= 1.0 ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d000 = DENS(X0, Y0, Z0); d001 = DENS(X0, Y0, Z1); d010 = DENS(X0, Y1, Z0); d011 = DENS(X0, Y1, Z1); d100 = DENS(X1, Y0, Z0); d101 = DENS(X1, Y0, Z1); d110 = DENS(X1, Y1, Z0); d111 = DENS(X1, Y1, Z1); dx00 = LERP(fx, d000, d100); dx01 = LERP(fx, d001, d101); dx10 = LERP(fx, d010, d110); dx11 = LERP(fx, d011, d111); dxy0 = LERP(fy, dx00, dx10); dxy1 = LERP(fy, dx01, dx11); dxyz = LERP(fz, dxy0, dxy1); Output[OutChan] = dxyz; } # undef LERP # undef DENS } // Trilinear interpolation (16 bits) - optimized version static CMS_NO_SANITIZE void TrilinearInterp16(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p) { #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy, fz; CMSREGISTER int rx, ry, rz; int x0, y0, z0; CMSREGISTER int X0, X1, Y0, Y1, Z0, Z1; int d000, d001, d010, d011, d100, d101, d110, d111, dx00, dx01, dx10, dx11, dxy0, dxy1, dxyz; TotalOut = p -> nOutputs; fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); x0 = FIXED_TO_INT(fx); rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); y0 = FIXED_TO_INT(fy); ry = FIXED_REST_TO_INT(fy); fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); z0 = FIXED_TO_INT(fz); rz = FIXED_REST_TO_INT(fz); X0 = p -> opta[2] * x0; X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d000 = DENS(X0, Y0, Z0); d001 = DENS(X0, Y0, Z1); d010 = DENS(X0, Y1, Z0); d011 = DENS(X0, Y1, Z1); d100 = DENS(X1, Y0, Z0); d101 = DENS(X1, Y0, Z1); d110 = DENS(X1, Y1, Z0); d111 = DENS(X1, Y1, Z1); dx00 = LERP(rx, d000, d100); dx01 = LERP(rx, d001, d101); dx10 = LERP(rx, d010, d110); dx11 = LERP(rx, d011, d111); dxy0 = LERP(ry, dx00, dx10); dxy1 = LERP(ry, dx01, dx11); dxyz = LERP(rz, dxy0, dxy1); Output[OutChan] = (cmsUInt16Number) dxyz; } # undef LERP # undef DENS } // Tetrahedral interpolation, using Sakamoto algorithm. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void TetrahedralInterpFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number px, py, pz; int x0, y0, z0, X0, Y0, Z0, X1, Y1, Z1; cmsFloat32Number rx, ry, rz; cmsFloat32Number c0, c1=0, c2=0, c3=0; int OutChan, TotalOut; TotalOut = p -> nOutputs; // We need some clipping here px = fclamp(Input[0]) * p->Domain[0]; py = fclamp(Input[1]) * p->Domain[1]; pz = fclamp(Input[2]) * p->Domain[2]; x0 = (int) floor(px); rx = (px - (cmsFloat32Number) x0); // We need full floor functionality here y0 = (int) floor(py); ry = (py - (cmsFloat32Number) y0); z0 = (int) floor(pz); rz = (pz - (cmsFloat32Number) z0); X0 = p -> opta[2] * x0; X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = Z0 + (fclamp(Input[2]) >= 1.0 ? 0 : p->opta[0]); for (OutChan=0; OutChan < TotalOut; OutChan++) { // These are the 6 Tetrahedral c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Output[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz; } } #undef DENS static CMS_NO_SANITIZE void TetrahedralInterp16(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table; cmsS15Fixed16Number fx, fy, fz; cmsS15Fixed16Number rx, ry, rz; int x0, y0, z0; cmsS15Fixed16Number c0, c1, c2, c3, Rest; cmsUInt32Number X0, X1, Y0, Y1, Z0, Z1; cmsUInt32Number TotalOut = p -> nOutputs; fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); x0 = FIXED_TO_INT(fx); y0 = FIXED_TO_INT(fy); z0 = FIXED_TO_INT(fz); rx = FIXED_REST_TO_INT(fx); ry = FIXED_REST_TO_INT(fy); rz = FIXED_REST_TO_INT(fz); X0 = p -> opta[2] * x0; X1 = (Input[0] == 0xFFFFU ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = (Input[1] == 0xFFFFU ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = (Input[2] == 0xFFFFU ? 0 : p->opta[0]); LutTable += X0+Y0+Z0; // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)) // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16 // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16 // at the cost of being off by one at 7fff and 17ffe. if (rx >= ry) { if (ry >= rz) { Y1 += X1; Z1 += Y1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c3 -= c2; c2 -= c1; c1 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else if (rz >= rx) { X1 += Z1; Y1 += X1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c2 -= c1; c1 -= c3; c3 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else { Z1 += X1; Y1 += Z1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c2 -= c3; c3 -= c1; c1 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } } else { if (rx >= rz) { X1 += Y1; Z1 += X1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c3 -= c1; c1 -= c2; c2 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else if (ry >= rz) { Z1 += Y1; X1 += Z1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c1 -= c3; c3 -= c2; c2 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else { Y1 += Z1; X1 += Y1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c1 -= c2; c2 -= c3; c3 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } } } #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static CMS_NO_SANITIZE void Eval4Inputs(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p16) { const cmsUInt16Number* LutTable; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; cmsS15Fixed16Number fx, fy, fz; cmsS15Fixed16Number rx, ry, rz; int x0, y0, z0; cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; cmsUInt32Number i; cmsS15Fixed16Number c0, c1, c2, c3, Rest; cmsUInt32Number OutChan; cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; fk = _cmsToFixedDomain((int) Input[0] * p16 -> Domain[0]); fx = _cmsToFixedDomain((int) Input[1] * p16 -> Domain[1]); fy = _cmsToFixedDomain((int) Input[2] * p16 -> Domain[2]); fz = _cmsToFixedDomain((int) Input[3] * p16 -> Domain[3]); k0 = FIXED_TO_INT(fk); x0 = FIXED_TO_INT(fx); y0 = FIXED_TO_INT(fy); z0 = FIXED_TO_INT(fz); rk = FIXED_REST_TO_INT(fk); rx = FIXED_REST_TO_INT(fx); ry = FIXED_REST_TO_INT(fy); rz = FIXED_REST_TO_INT(fz); K0 = p16 -> opta[3] * k0; K1 = K0 + (Input[0] == 0xFFFFU ? 0 : p16->opta[3]); X0 = p16 -> opta[2] * x0; X1 = X0 + (Input[1] == 0xFFFFU ? 0 : p16->opta[2]); Y0 = p16 -> opta[1] * y0; Y1 = Y0 + (Input[2] == 0xFFFFU ? 0 : p16->opta[1]); Z0 = p16 -> opta[0] * z0; Z1 = Z0 + (Input[3] == 0xFFFFU ? 0 : p16->opta[0]); LutTable = (cmsUInt16Number*) p16 -> Table; LutTable += K0; for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; Tmp1[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); } LutTable = (cmsUInt16Number*) p16 -> Table; LutTable += K1; for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; Tmp2[OutChan] = (cmsUInt16Number) c0 + ((Rest + (Rest >> 16)) >> 16); } for (i=0; i < p16 -> nOutputs; i++) { Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); } } #undef DENS // For more that 3 inputs (i.e., CMYK) // evaluate two 3-dimensional interpolations and then linearly interpolate between them. static void Eval4InputsFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number rest; cmsFloat32Number pk; int k0, K0, K1; const cmsFloat32Number* T; cmsUInt32Number i; cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; pk = fclamp(Input[0]) * p->Domain[0]; k0 = _cmsQuickFloor(pk); rest = pk - (cmsFloat32Number) k0; K0 = p -> opta[3] * k0; K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[3]); p1 = *p; memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; TetrahedralInterpFloat(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; TetrahedralInterpFloat(Input + 1, Tmp2, &p1); for (i=0; i < p -> nOutputs; i++) { cmsFloat32Number y0 = Tmp1[i]; cmsFloat32Number y1 = Tmp2[i]; Output[i] = y0 + (y1 - y0) * rest; } } #define EVAL_FNS(N,NM) static CMS_NO_SANITIZE \ void Eval##N##Inputs(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p16)\ {\ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;\ cmsS15Fixed16Number fk;\ cmsS15Fixed16Number k0, rk;\ int K0, K1;\ const cmsUInt16Number* T;\ cmsUInt32Number i;\ cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\ cmsInterpParams p1;\ \ fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);\ k0 = FIXED_TO_INT(fk);\ rk = FIXED_REST_TO_INT(fk);\ \ K0 = p16 -> opta[NM] * k0;\ K1 = p16 -> opta[NM] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));\ \ p1 = *p16;\ memmove(&p1.Domain[0], &p16 ->Domain[1], NM*sizeof(cmsUInt32Number));\ \ T = LutTable + K0;\ p1.Table = T;\ \ Eval##NM##Inputs(Input + 1, Tmp1, &p1);\ \ T = LutTable + K1;\ p1.Table = T;\ \ Eval##NM##Inputs(Input + 1, Tmp2, &p1);\ \ for (i=0; i < p16 -> nOutputs; i++) {\ \ Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);\ }\ }\ \ static void Eval##N##InputsFloat(const cmsFloat32Number Input[], \ cmsFloat32Number Output[],\ const cmsInterpParams * p)\ {\ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\ cmsFloat32Number rest;\ cmsFloat32Number pk;\ int k0, K0, K1;\ const cmsFloat32Number* T;\ cmsUInt32Number i;\ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\ cmsInterpParams p1;\ \ pk = fclamp(Input[0]) * p->Domain[0];\ k0 = _cmsQuickFloor(pk);\ rest = pk - (cmsFloat32Number) k0;\ \ K0 = p -> opta[NM] * k0;\ K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[NM]);\ \ p1 = *p;\ memmove(&p1.Domain[0], &p ->Domain[1], NM*sizeof(cmsUInt32Number));\ \ T = LutTable + K0;\ p1.Table = T;\ \ Eval##NM##InputsFloat(Input + 1, Tmp1, &p1);\ \ T = LutTable + K1;\ p1.Table = T;\ \ Eval##NM##InputsFloat(Input + 1, Tmp2, &p1);\ \ for (i=0; i < p -> nOutputs; i++) {\ \ cmsFloat32Number y0 = Tmp1[i];\ cmsFloat32Number y1 = Tmp2[i];\ \ Output[i] = y0 + (y1 - y0) * rest;\ }\ } /** * Thanks to Carles Llopis for the templating idea */ EVAL_FNS(5, 4) EVAL_FNS(6, 5) EVAL_FNS(7, 6) EVAL_FNS(8, 7) EVAL_FNS(9, 8) EVAL_FNS(10, 9) EVAL_FNS(11, 10) EVAL_FNS(12, 11) EVAL_FNS(13, 12) EVAL_FNS(14, 13) EVAL_FNS(15, 14) // The default factory static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags) { cmsInterpFunction Interpolation; cmsBool IsFloat = (dwFlags & CMS_LERP_FLAGS_FLOAT); cmsBool IsTrilinear = (dwFlags & CMS_LERP_FLAGS_TRILINEAR); memset(&Interpolation, 0, sizeof(Interpolation)); // Safety check if (nInputChannels >= 4 && nOutputChannels >= MAX_STAGE_CHANNELS) return Interpolation; switch (nInputChannels) { case 1: // Gray LUT / linear if (nOutputChannels == 1) { if (IsFloat) Interpolation.LerpFloat = LinLerp1Dfloat; else Interpolation.Lerp16 = LinLerp1D; } else { if (IsFloat) Interpolation.LerpFloat = Eval1InputFloat; else Interpolation.Lerp16 = Eval1Input; } break; case 2: // Duotone if (IsFloat) Interpolation.LerpFloat = BilinearInterpFloat; else Interpolation.Lerp16 = BilinearInterp16; break; case 3: // RGB et al if (IsTrilinear) { if (IsFloat) Interpolation.LerpFloat = TrilinearInterpFloat; else Interpolation.Lerp16 = TrilinearInterp16; } else { if (IsFloat) Interpolation.LerpFloat = TetrahedralInterpFloat; else { Interpolation.Lerp16 = TetrahedralInterp16; } } break; case 4: // CMYK lut if (IsFloat) Interpolation.LerpFloat = Eval4InputsFloat; else Interpolation.Lerp16 = Eval4Inputs; break; case 5: // 5 Inks if (IsFloat) Interpolation.LerpFloat = Eval5InputsFloat; else Interpolation.Lerp16 = Eval5Inputs; break; case 6: // 6 Inks if (IsFloat) Interpolation.LerpFloat = Eval6InputsFloat; else Interpolation.Lerp16 = Eval6Inputs; break; case 7: // 7 inks if (IsFloat) Interpolation.LerpFloat = Eval7InputsFloat; else Interpolation.Lerp16 = Eval7Inputs; break; case 8: // 8 inks if (IsFloat) Interpolation.LerpFloat = Eval8InputsFloat; else Interpolation.Lerp16 = Eval8Inputs; break; case 9: if (IsFloat) Interpolation.LerpFloat = Eval9InputsFloat; else Interpolation.Lerp16 = Eval9Inputs; break; case 10: if (IsFloat) Interpolation.LerpFloat = Eval10InputsFloat; else Interpolation.Lerp16 = Eval10Inputs; break; case 11: if (IsFloat) Interpolation.LerpFloat = Eval11InputsFloat; else Interpolation.Lerp16 = Eval11Inputs; break; case 12: if (IsFloat) Interpolation.LerpFloat = Eval12InputsFloat; else Interpolation.Lerp16 = Eval12Inputs; break; case 13: if (IsFloat) Interpolation.LerpFloat = Eval13InputsFloat; else Interpolation.Lerp16 = Eval13Inputs; break; case 14: if (IsFloat) Interpolation.LerpFloat = Eval14InputsFloat; else Interpolation.Lerp16 = Eval14Inputs; break; case 15: if (IsFloat) Interpolation.LerpFloat = Eval15InputsFloat; else Interpolation.Lerp16 = Eval15Inputs; break; default: Interpolation.Lerp16 = NULL; } return Interpolation; } lcms2-2.19.1/src/cmsopt.c0000644000175000017500000020133115176573557014123 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" //---------------------------------------------------------------------------------- // Optimization for 8 bits, Shaper-CLUT (3 inputs only) typedef struct { cmsContext ContextID; const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. cmsUInt16Number rx[256], ry[256], rz[256]; cmsUInt32Number X0[256], Y0[256], Z0[256]; // Precomputed nodes and offsets for 8-bit input data } Prelin8Data; // Generic optimization for 16 bits Shaper-CLUT-Shaper (any inputs) typedef struct { cmsContext ContextID; // Number of channels cmsUInt32Number nInputs; cmsUInt32Number nOutputs; _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS]; _cmsInterpFn16 EvalCLUT; // The evaluator for 3D grid const cmsInterpParams* CLUTparams; // (not-owned pointer) _cmsInterpFn16* EvalCurveOut16; // Points to an array of curve evaluators in 16 bits (not-owned pointer) cmsInterpParams** ParamsCurveOut16; // Points to an array of references to interpolation params (not-owned pointer) } Prelin16Data; // Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed typedef cmsInt32Number cmsS1Fixed14Number; // Note that this may hold more than 16 bits! #define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5)) typedef struct { cmsContext ContextID; cmsS1Fixed14Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0) cmsS1Fixed14Number Shaper1G[256]; cmsS1Fixed14Number Shaper1B[256]; cmsS1Fixed14Number Mat[3][3]; // n.14 to n.14 (needs a saturation after that) cmsS1Fixed14Number Off[3]; cmsUInt16Number Shaper2R[16385]; // 1.14 to 0..255 cmsUInt16Number Shaper2G[16385]; cmsUInt16Number Shaper2B[16385]; } MatShaper8Data; // Curves, optimization is shared between 8 and 16 bits typedef struct { cmsContext ContextID; cmsUInt32Number nCurves; // Number of curves cmsUInt32Number nElements; // Elements in curves cmsUInt16Number** Curves; // Points to a dynamically allocated array } Curves16Data; // Simple optimizations ---------------------------------------------------------------------------------------------------------- // Remove an element in linked chain static void _RemoveElement(cmsStage** head) { cmsStage* mpe = *head; cmsStage* next = mpe ->Next; *head = next; cmsStageFree(mpe); } // Remove all identities in chain. Note that pt actually is a double pointer to the element that holds the pointer. static cmsBool _Remove1Op(cmsPipeline* Lut, cmsStageSignature UnaryOp) { cmsStage** pt = &Lut ->Elements; cmsBool AnyOpt = FALSE; while (*pt != NULL) { if ((*pt) ->Implements == UnaryOp) { _RemoveElement(pt); AnyOpt = TRUE; } else pt = &((*pt) -> Next); } return AnyOpt; } // Same, but only if two adjacent elements are found static cmsBool _Remove2Op(cmsPipeline* Lut, cmsStageSignature Op1, cmsStageSignature Op2) { cmsStage** pt1; cmsStage** pt2; cmsBool AnyOpt = FALSE; pt1 = &Lut ->Elements; if (*pt1 == NULL) return AnyOpt; while (*pt1 != NULL) { pt2 = &((*pt1) -> Next); if (*pt2 == NULL) return AnyOpt; if ((*pt1) ->Implements == Op1 && (*pt2) ->Implements == Op2) { _RemoveElement(pt2); _RemoveElement(pt1); AnyOpt = TRUE; } else pt1 = &((*pt1) -> Next); } return AnyOpt; } static cmsBool CloseEnoughFloat(cmsFloat64Number a, cmsFloat64Number b) { return fabs(b - a) < 0.00001f; } static cmsBool isFloatMatrixIdentity(const cmsMAT3* a) { cmsMAT3 Identity; int i, j; _cmsMAT3identity(&Identity); for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) if (!CloseEnoughFloat(a->v[i].n[j], Identity.v[i].n[j])) return FALSE; return TRUE; } // if two adjacent matrices are found, multiply them. static cmsBool _MultiplyMatrix(cmsPipeline* Lut) { cmsStage** pt1; cmsStage** pt2; cmsStage* chain; cmsBool AnyOpt = FALSE; pt1 = &Lut->Elements; if (*pt1 == NULL) return AnyOpt; while (*pt1 != NULL) { pt2 = &((*pt1)->Next); if (*pt2 == NULL) return AnyOpt; if ((*pt1)->Implements == cmsSigMatrixElemType && (*pt2)->Implements == cmsSigMatrixElemType) { // Get both matrices _cmsStageMatrixData* m1 = (_cmsStageMatrixData*) cmsStageData(*pt1); _cmsStageMatrixData* m2 = (_cmsStageMatrixData*) cmsStageData(*pt2); cmsMAT3 res; // Input offset and output offset should be zero to use this optimization if (m1->Offset != NULL || m2 ->Offset != NULL || cmsStageInputChannels(*pt1) != 3 || cmsStageOutputChannels(*pt1) != 3 || cmsStageInputChannels(*pt2) != 3 || cmsStageOutputChannels(*pt2) != 3) return FALSE; // Multiply both matrices to get the result _cmsMAT3per(&res, (cmsMAT3*)m2->Double, (cmsMAT3*)m1->Double); // Get the next in chain after the matrices chain = (*pt2)->Next; // Remove both matrices _RemoveElement(pt2); _RemoveElement(pt1); // Now what if the result is a plain identity? if (!isFloatMatrixIdentity(&res)) { // We can not get rid of full matrix cmsStage* Multmat = cmsStageAllocMatrix(Lut->ContextID, 3, 3, (const cmsFloat64Number*) &res, NULL); if (Multmat == NULL) return FALSE; // Should never happen // Recover the chain Multmat->Next = chain; *pt1 = Multmat; } AnyOpt = TRUE; } else pt1 = &((*pt1)->Next); } return AnyOpt; } // Preoptimize just gets rif of no-ops coming paired. Conversion from v2 to v4 followed // by a v4 to v2 and vice-versa. The elements are then discarded. static cmsBool PreOptimize(cmsPipeline* Lut) { cmsBool AnyOpt = FALSE, Opt; do { Opt = FALSE; // Remove all identities Opt |= _Remove1Op(Lut, cmsSigIdentityElemType); // Remove XYZ2Lab followed by Lab2XYZ Opt |= _Remove2Op(Lut, cmsSigXYZ2LabElemType, cmsSigLab2XYZElemType); // Remove Lab2XYZ followed by XYZ2Lab Opt |= _Remove2Op(Lut, cmsSigLab2XYZElemType, cmsSigXYZ2LabElemType); // Remove V4 to V2 followed by V2 to V4 Opt |= _Remove2Op(Lut, cmsSigLabV4toV2, cmsSigLabV2toV4); // Remove V2 to V4 followed by V4 to V2 Opt |= _Remove2Op(Lut, cmsSigLabV2toV4, cmsSigLabV4toV2); // Remove float pcs Lab conversions Opt |= _Remove2Op(Lut, cmsSigLab2FloatPCS, cmsSigFloatPCS2Lab); // Remove float pcs Lab conversions Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ); // Simplify matrix. Opt |= _MultiplyMatrix(Lut); if (Opt) AnyOpt = TRUE; } while (Opt); return AnyOpt; } static void Eval16nop1D(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const struct _cms_interp_struc* p) { Output[0] = Input[0]; cmsUNUSED_PARAMETER(p); } static void PrelinEval16(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const void* D) { Prelin16Data* p16 = (Prelin16Data*) D; cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS]; cmsUInt16Number StageDEF[cmsMAXCHANNELS]; cmsUInt32Number i; for (i=0; i < p16 ->nInputs; i++) { p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]); } p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams); for (i=0; i < p16 ->nOutputs; i++) { p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]); } } static void PrelinOpt16free(cmsContext ContextID, void* ptr) { Prelin16Data* p16 = (Prelin16Data*) ptr; _cmsFree(ContextID, p16 ->EvalCurveOut16); _cmsFree(ContextID, p16 ->ParamsCurveOut16); _cmsFree(ContextID, p16); } static void* Prelin16dup(cmsContext ContextID, const void* ptr) { Prelin16Data* p16 = (Prelin16Data*) ptr; Prelin16Data* Duped = (Prelin16Data*) _cmsDupMem(ContextID, p16, sizeof(Prelin16Data)); if (Duped == NULL) return NULL; Duped->EvalCurveOut16 = (_cmsInterpFn16*) _cmsDupMem(ContextID, p16->EvalCurveOut16, p16->nOutputs * sizeof(_cmsInterpFn16)); Duped->ParamsCurveOut16 = (cmsInterpParams**)_cmsDupMem(ContextID, p16->ParamsCurveOut16, p16->nOutputs * sizeof(cmsInterpParams*)); return Duped; } static Prelin16Data* PrelinOpt16alloc(cmsContext ContextID, const cmsInterpParams* ColorMap, cmsUInt32Number nInputs, cmsToneCurve** In, cmsUInt32Number nOutputs, cmsToneCurve** Out ) { cmsUInt32Number i; Prelin16Data* p16 = (Prelin16Data*)_cmsMallocZero(ContextID, sizeof(Prelin16Data)); if (p16 == NULL) return NULL; p16 ->nInputs = nInputs; p16 ->nOutputs = nOutputs; for (i=0; i < nInputs; i++) { if (In == NULL) { p16 -> ParamsCurveIn16[i] = NULL; p16 -> EvalCurveIn16[i] = Eval16nop1D; } else { p16 -> ParamsCurveIn16[i] = In[i] ->InterpParams; p16 -> EvalCurveIn16[i] = p16 ->ParamsCurveIn16[i]->Interpolation.Lerp16; } } p16 ->CLUTparams = ColorMap; p16 ->EvalCLUT = ColorMap ->Interpolation.Lerp16; p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16)); if (p16->EvalCurveOut16 == NULL) { _cmsFree(ContextID, p16); return NULL; } p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* )); if (p16->ParamsCurveOut16 == NULL) { _cmsFree(ContextID, p16->EvalCurveOut16); _cmsFree(ContextID, p16); return NULL; } for (i=0; i < nOutputs; i++) { if (Out == NULL) { p16 ->ParamsCurveOut16[i] = NULL; p16 -> EvalCurveOut16[i] = Eval16nop1D; } else { p16 ->ParamsCurveOut16[i] = Out[i] ->InterpParams; p16 -> EvalCurveOut16[i] = p16 ->ParamsCurveOut16[i]->Interpolation.Lerp16; } } return p16; } // Resampling --------------------------------------------------------------------------------- #define PRELINEARIZATION_POINTS 4096 // Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for // almost any transform. We use floating point precision and then convert from floating point to 16 bits. static cmsInt32Number XFormSampler16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { cmsPipeline* Lut = (cmsPipeline*) Cargo; cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; cmsUInt32Number i; _cmsAssert(Lut -> InputChannels < cmsMAXCHANNELS); _cmsAssert(Lut -> OutputChannels < cmsMAXCHANNELS); // From 16 bit to floating point for (i=0; i < Lut ->InputChannels; i++) InFloat[i] = (cmsFloat32Number) (In[i] / 65535.0); // Evaluate in floating point cmsPipelineEvalFloat(InFloat, OutFloat, Lut); // Back to 16 bits representation for (i=0; i < Lut ->OutputChannels; i++) Out[i] = _cmsQuickSaturateWord(OutFloat[i] * 65535.0); // Always succeed return TRUE; } // Try to see if the curves of a given MPE are linear static cmsBool AllCurvesAreLinear(cmsStage* mpe) { cmsToneCurve** Curves; cmsUInt32Number i, n; Curves = _cmsStageGetPtrToCurveSet(mpe); if (Curves == NULL) return FALSE; n = cmsStageOutputChannels(mpe); for (i=0; i < n; i++) { if (!cmsIsToneCurveLinear(Curves[i])) return FALSE; } return TRUE; } // This function replaces a specific node placed in "At" by the "Value" numbers. Its purpose // is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels static cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], cmsUInt32Number nChannelsOut, cmsUInt32Number nChannelsIn) { _cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data; cmsInterpParams* p16 = Grid ->Params; cmsFloat64Number px, py, pz, pw; int x0, y0, z0, w0; int i, index; if (CLUT -> Type != cmsSigCLutElemType) { cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage"); return FALSE; } if (nChannelsIn == 4) { px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0; x0 = (int) floor(px); y0 = (int) floor(py); z0 = (int) floor(pz); w0 = (int) floor(pw); if (((px - x0) != 0) || ((py - y0) != 0) || ((pz - z0) != 0) || ((pw - w0) != 0)) return FALSE; // Not on exact node index = (int) p16 -> opta[3] * x0 + (int) p16 -> opta[2] * y0 + (int) p16 -> opta[1] * z0 + (int) p16 -> opta[0] * w0; } else if (nChannelsIn == 3) { px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; x0 = (int) floor(px); y0 = (int) floor(py); z0 = (int) floor(pz); if (((px - x0) != 0) || ((py - y0) != 0) || ((pz - z0) != 0)) return FALSE; // Not on exact node index = (int) p16 -> opta[2] * x0 + (int) p16 -> opta[1] * y0 + (int) p16 -> opta[0] * z0; } else if (nChannelsIn == 1) { px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; x0 = (int) floor(px); if (((px - x0) != 0)) return FALSE; // Not on exact node index = (int) p16 -> opta[0] * x0; } else { cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn); return FALSE; } for (i = 0; i < (int) nChannelsOut; i++) Grid->Tab.T[index + i] = Value[i]; return TRUE; } // Auxiliary, to see if two values are equal or very different static cmsBool WhitesAreEqual(cmsUInt32Number n, cmsUInt16Number White1[], cmsUInt16Number White2[] ) { cmsUInt32Number i; for (i=0; i < n; i++) { if (abs(White1[i] - White2[i]) > 0xf000) return TRUE; // Values are so extremely different that the fixup should be avoided if (White1[i] != White2[i]) return FALSE; } return TRUE; } // Locate the node for the white point and fix it to pure white in order to avoid scum dot. static cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColorSpace, cmsColorSpaceSignature ExitColorSpace) { cmsUInt16Number *WhitePointIn, *WhitePointOut; cmsUInt16Number WhiteIn[cmsMAXCHANNELS], WhiteOut[cmsMAXCHANNELS], ObtainedOut[cmsMAXCHANNELS]; cmsUInt32Number i, nOuts, nIns; cmsStage *PreLin = NULL, *CLUT = NULL, *PostLin = NULL; if (!_cmsEndPointsBySpace(EntryColorSpace, &WhitePointIn, NULL, &nIns)) return FALSE; if (!_cmsEndPointsBySpace(ExitColorSpace, &WhitePointOut, NULL, &nOuts)) return FALSE; // It needs to be fixed? if (Lut ->InputChannels != nIns) return FALSE; if (Lut ->OutputChannels != nOuts) return FALSE; cmsPipelineEval16(WhitePointIn, ObtainedOut, Lut); if (WhitesAreEqual(nOuts, WhitePointOut, ObtainedOut)) return TRUE; // whites already match // Check if the LUT comes as Prelin, CLUT or Postlin. We allow all combinations if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &PreLin, &CLUT, &PostLin)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCurveSetElemType, cmsSigCLutElemType, &PreLin, &CLUT)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCLutElemType, cmsSigCurveSetElemType, &CLUT, &PostLin)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCLutElemType, &CLUT)) return FALSE; // We need to interpolate white points of both, pre and post curves if (PreLin) { cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PreLin); for (i=0; i < nIns; i++) { WhiteIn[i] = cmsEvalToneCurve16(Curves[i], WhitePointIn[i]); } } else { for (i=0; i < nIns; i++) WhiteIn[i] = WhitePointIn[i]; } // If any post-linearization, we need to find how is represented white before the curve, do // a reverse interpolation in this case. if (PostLin) { cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PostLin); for (i=0; i < nOuts; i++) { cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]); if (InversePostLin == NULL) { WhiteOut[i] = WhitePointOut[i]; } else { WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]); cmsFreeToneCurve(InversePostLin); } } } else { for (i=0; i < nOuts; i++) WhiteOut[i] = WhitePointOut[i]; } // Ok, proceed with patching. May fail and we don't care if it fails PatchLUT(CLUT, WhiteIn, WhiteOut, nOuts, nIns); return TRUE; } // ----------------------------------------------------------------------------------------------------------------------------------------------- // This function creates simple LUT from complex ones. The generated LUT has an optional set of // prelinearization curves, a CLUT of nGridPoints and optional postlinearization tables. // These curves have to exist in the original LUT in order to be used in the simplified output. // Caller may also use the flags to allow this feature. // LUTS with all curves will be simplified to a single curve. Parametric curves are lost. // This function should be used on 16-bits LUTS only, as floating point losses precision when simplified // ----------------------------------------------------------------------------------------------------------------------------------------------- static cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* Src = NULL; cmsPipeline* Dest = NULL; cmsStage* CLUT; cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL; cmsUInt32Number nGridPoints; cmsColorSpaceSignature ColorSpace, OutputColorSpace; cmsStage *NewPreLin = NULL; cmsStage *NewPostLin = NULL; _cmsStageCLutData* DataCLUT; cmsToneCurve** DataSetIn; cmsToneCurve** DataSetOut; Prelin16Data* p16; // This is a lossy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; ColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*InputFormat)); OutputColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*OutputFormat)); // Color space must be specified if (ColorSpace == (cmsColorSpaceSignature)0 || OutputColorSpace == (cmsColorSpaceSignature)0) return FALSE; // For empty LUTs, 2 points are enough if (cmsPipelineStageCount(*Lut) == 0) nGridPoints = 2; else { nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); // Lab16 as input cannot be optimized by a CLUT due to centering issues, thanks to Mike Chaney for discovering this. if (!(*dwFlags & cmsFLAGS_FORCE_CLUT) && (ColorSpace == cmsSigLabData) && (T_BYTES(*InputFormat) == 2)) return FALSE; } Src = *Lut; // Allocate an empty LUT Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); if (!Dest) return FALSE; // Prelinearization tables are kept unless indicated by flags if (*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION) { // Get a pointer to the prelinearization element cmsStage* PreLin = cmsPipelineGetPtrToFirstStage(Src); // Check if suitable if (PreLin && PreLin ->Type == cmsSigCurveSetElemType) { // Maybe this is a linear tram, so we can avoid the whole stuff if (!AllCurvesAreLinear(PreLin)) { // All seems ok, proceed. NewPreLin = cmsStageDup(PreLin); if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin)) goto Error; // Remove prelinearization. Since we have duplicated the curve // in destination LUT, the sampling should be applied after this stage. cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin); } } } // Allocate the CLUT CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL); if (CLUT == NULL) goto Error; // Add the CLUT to the destination LUT if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) { goto Error; } // Postlinearization tables are kept unless indicated by flags if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) { // Get a pointer to the postlinearization if present cmsStage* PostLin = cmsPipelineGetPtrToLastStage(Src); // Check if suitable if (PostLin && cmsStageType(PostLin) == cmsSigCurveSetElemType) { // Maybe this is a linear tram, so we can avoid the whole stuff if (!AllCurvesAreLinear(PostLin)) { // All seems ok, proceed. NewPostLin = cmsStageDup(PostLin); if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin)) goto Error; // In destination LUT, the sampling should be applied after this stage. cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin); } } } // Now its time to do the sampling. We have to ignore pre/post linearization // The source LUT without pre/post curves is passed as parameter. if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) { Error: // Ops, something went wrong, Restore stages if (KeepPreLin != NULL) { if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) { _cmsAssert(0); // This never happens } } if (KeepPostLin != NULL) { if (!cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin)) { _cmsAssert(0); // This never happens } } cmsPipelineFree(Dest); return FALSE; } // Done. if (KeepPreLin != NULL) cmsStageFree(KeepPreLin); if (KeepPostLin != NULL) cmsStageFree(KeepPostLin); cmsPipelineFree(Src); DataCLUT = (_cmsStageCLutData*) CLUT ->Data; if (NewPreLin == NULL) DataSetIn = NULL; else DataSetIn = ((_cmsStageToneCurvesData*) NewPreLin ->Data) ->TheCurves; if (NewPostLin == NULL) DataSetOut = NULL; else DataSetOut = ((_cmsStageToneCurvesData*) NewPostLin ->Data) ->TheCurves; if (DataSetIn == NULL && DataSetOut == NULL) { _cmsPipelineSetOptimizationParameters(Dest, (_cmsPipelineEval16Fn) DataCLUT->Params->Interpolation.Lerp16, DataCLUT->Params, NULL, NULL); } else { p16 = PrelinOpt16alloc(Dest ->ContextID, DataCLUT ->Params, Dest ->InputChannels, DataSetIn, Dest ->OutputChannels, DataSetOut); if (p16 == NULL) { cmsPipelineFree(Dest); return FALSE; } _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); } // Don't fix white on absolute colorimetric if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) { FixWhiteMisalignment(Dest, ColorSpace, OutputColorSpace); } *Lut = Dest; return TRUE; cmsUNUSED_PARAMETER(Intent); } // ----------------------------------------------------------------------------------------------------------------------------------------------- // Fixes the gamma balancing of transform. This is described in my paper "Prelinearization Stages on // Color-Management Application-Specific Integrated Circuits (ASICs)" presented at NIP24. It only works // for RGB transforms. See the paper for more details // ----------------------------------------------------------------------------------------------------------------------------------------------- // Normalize endpoints by slope limiting max and min. This assures endpoints as well. // Descending curves are handled as well. static void SlopeLimiting(cmsToneCurve* g) { int BeginVal, EndVal; int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5); // Cutoff at 2% int AtEnd = (int) g ->nEntries - AtBegin - 1; // And 98% cmsFloat64Number Val, Slope, beta; int i; if (cmsIsToneCurveDescending(g)) { BeginVal = 0xffff; EndVal = 0; } else { BeginVal = 0; EndVal = 0xffff; } // Compute slope and offset for begin of curve Val = g ->Table16[AtBegin]; Slope = (Val - BeginVal) / AtBegin; beta = Val - Slope * AtBegin; for (i=0; i < AtBegin; i++) g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta); // Compute slope and offset for the end Val = g ->Table16[AtEnd]; Slope = (EndVal - Val) / AtBegin; // AtBegin holds the X interval, which is same in both cases beta = Val - Slope * AtEnd; for (i = AtEnd; i < (int) g ->nEntries; i++) g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta); } // Precomputes tables for 8-bit on input devicelink. static Prelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3]) { int i; cmsUInt16Number Input[3]; cmsS15Fixed16Number v1, v2, v3; Prelin8Data* p8; p8 = (Prelin8Data*)_cmsMallocZero(ContextID, sizeof(Prelin8Data)); if (p8 == NULL) return NULL; // Since this only works for 8 bit input, values comes always as x * 257, // we can safely take msb byte (x << 8 + x) for (i=0; i < 256; i++) { if (G != NULL) { // Get 16-bit representation Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i)); Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i)); Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i)); } else { Input[0] = FROM_8_TO_16(i); Input[1] = FROM_8_TO_16(i); Input[2] = FROM_8_TO_16(i); } // Move to 0..1.0 in fixed domain v1 = _cmsToFixedDomain((int) (Input[0] * p -> Domain[0])); v2 = _cmsToFixedDomain((int) (Input[1] * p -> Domain[1])); v3 = _cmsToFixedDomain((int) (Input[2] * p -> Domain[2])); // Store the precalculated table of nodes p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1)); p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2)); p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3)); // Store the precalculated table of offsets p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1); p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2); p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3); } p8 ->ContextID = ContextID; p8 ->p = p; return p8; } static void Prelin8free(cmsContext ContextID, void* ptr) { _cmsFree(ContextID, ptr); } static void* Prelin8dup(cmsContext ContextID, const void* ptr) { return _cmsDupMem(ContextID, ptr, sizeof(Prelin8Data)); } // A optimized interpolation for 8-bit input. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static CMS_NO_SANITIZE void PrelinEval8(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const void* D) { cmsUInt8Number r, g, b; cmsS15Fixed16Number rx, ry, rz; cmsS15Fixed16Number c0, c1, c2, c3, Rest; int OutChan; CMSREGISTER cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; Prelin8Data* p8 = (Prelin8Data*) D; CMSREGISTER const cmsInterpParams* p = p8 ->p; int TotalOut = (int) p -> nOutputs; const cmsUInt16Number* LutTable = (const cmsUInt16Number*) p->Table; r = (cmsUInt8Number) (Input[0] >> 8); g = (cmsUInt8Number) (Input[1] >> 8); b = (cmsUInt8Number) (Input[2] >> 8); X0 = (cmsS15Fixed16Number) p8->X0[r]; Y0 = (cmsS15Fixed16Number) p8->Y0[g]; Z0 = (cmsS15Fixed16Number) p8->Z0[b]; rx = p8 ->rx[r]; ry = p8 ->ry[g]; rz = p8 ->rz[b]; X1 = X0 + (cmsS15Fixed16Number)((rx == 0) ? 0 : p ->opta[2]); Y1 = Y0 + (cmsS15Fixed16Number)((ry == 0) ? 0 : p ->opta[1]); Z1 = Z0 + (cmsS15Fixed16Number)((rz == 0) ? 0 : p ->opta[0]); // These are the 6 Tetrahedral for (OutChan=0; OutChan < TotalOut; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; Output[OutChan] = (cmsUInt16Number) (c0 + ((Rest + (Rest >> 16)) >> 16)); } } #undef DENS // Curves that contain wide empty areas are not optimizeable static cmsBool IsDegenerated(const cmsToneCurve* g) { cmsUInt32Number i, Zeros = 0, Poles = 0; cmsUInt32Number nEntries = g ->nEntries; for (i=0; i < nEntries; i++) { if (g ->Table16[i] == 0x0000) Zeros++; if (g ->Table16[i] == 0xffff) Poles++; } if (Zeros == 1 && Poles == 1) return FALSE; // For linear tables if (Zeros > (nEntries / 20)) return TRUE; // Degenerated, many zeros if (Poles > (nEntries / 20)) return TRUE; // Degenerated, many poles return FALSE; } // -------------------------------------------------------------------------------------------------------------- // We need xput over here static cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* OriginalLut; cmsUInt32Number nGridPoints; cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS]; cmsUInt32Number t, i; cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; cmsBool lIsSuitable, lIsLinear; cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL; cmsStage* OptimizedCLUTmpe; cmsColorSpaceSignature ColorSpace, OutputColorSpace; cmsStage* OptimizedPrelinMpe; cmsToneCurve** OptimizedPrelinCurves; _cmsStageCLutData* OptimizedPrelinCLUT; // This is a lossy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; // Only on chunky RGB if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; if (T_PLANAR(*InputFormat)) return FALSE; if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE; if (T_PLANAR(*OutputFormat)) return FALSE; // On 16 bits, user has to specify the feature if (!_cmsFormatterIs8bit(*InputFormat)) { if (!(*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION)) return FALSE; } OriginalLut = *Lut; ColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*InputFormat)); OutputColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*OutputFormat)); // Color space must be specified if (ColorSpace == (cmsColorSpaceSignature)0 || OutputColorSpace == (cmsColorSpaceSignature)0) return FALSE; nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); // Empty gamma containers memset(Trans, 0, sizeof(Trans)); memset(TransReverse, 0, sizeof(TransReverse)); // If the last stage of the original lut are curves, and those curves are // degenerated, it is likely the transform is squeezing and clipping // the output from previous CLUT. We cannot optimize this case { cmsStage* last = cmsPipelineGetPtrToLastStage(OriginalLut); if (last == NULL) goto Error; if (cmsStageType(last) == cmsSigCurveSetElemType) { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*)cmsStageData(last); for (i = 0; i < Data->nCurves; i++) { if (IsDegenerated(Data->TheCurves[i])) goto Error; } } } for (t = 0; t < OriginalLut ->InputChannels; t++) { Trans[t] = cmsBuildTabulatedToneCurve16(OriginalLut ->ContextID, PRELINEARIZATION_POINTS, NULL); if (Trans[t] == NULL) goto Error; } // Populate the curves for (i=0; i < PRELINEARIZATION_POINTS; i++) { v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); // Feed input with a gray ramp for (t=0; t < OriginalLut ->InputChannels; t++) In[t] = v; // Evaluate the gray value cmsPipelineEvalFloat(In, Out, OriginalLut); // Store result in curve for (t=0; t < OriginalLut ->InputChannels; t++) { if (Trans[t]->Table16 != NULL) Trans[t] ->Table16[i] = _cmsQuickSaturateWord(Out[t] * 65535.0); } } // Slope-limit the obtained curves for (t = 0; t < OriginalLut ->InputChannels; t++) SlopeLimiting(Trans[t]); // Check for validity. lIsLinear is here for debug purposes lIsSuitable = TRUE; lIsLinear = TRUE; for (t=0; (lIsSuitable && (t < OriginalLut ->InputChannels)); t++) { // Exclude if already linear if (!cmsIsToneCurveLinear(Trans[t])) lIsLinear = FALSE; // Exclude if non-monotonic if (!cmsIsToneCurveMonotonic(Trans[t])) lIsSuitable = FALSE; if (IsDegenerated(Trans[t])) lIsSuitable = FALSE; } // If it is not suitable, just quit if (!lIsSuitable) goto Error; // Invert curves if possible for (t = 0; t < OriginalLut ->InputChannels; t++) { TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]); if (TransReverse[t] == NULL) goto Error; } // Now inset the reversed curves at the begin of transform LutPlusCurves = cmsPipelineDup(OriginalLut); if (LutPlusCurves == NULL) goto Error; if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse))) goto Error; // Create the result LUT OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels); if (OptimizedLUT == NULL) goto Error; OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans); // Create and insert the curves at the beginning if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe)) goto Error; // Allocate the CLUT for result OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL); // Add the CLUT to the destination LUT if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe)) goto Error; // Resample the LUT if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error; // Free resources for (t = 0; t < OriginalLut ->InputChannels; t++) { if (Trans[t]) cmsFreeToneCurve(Trans[t]); if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); Trans[t] = NULL; TransReverse[t] = NULL; } cmsPipelineFree(LutPlusCurves); LutPlusCurves = NULL; OptimizedPrelinCurves = _cmsStageGetPtrToCurveSet(OptimizedPrelinMpe); OptimizedPrelinCLUT = (_cmsStageCLutData*) OptimizedCLUTmpe ->Data; // Set the evaluator if 8-bit if (_cmsFormatterIs8bit(*InputFormat)) { Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID, OptimizedPrelinCLUT ->Params, OptimizedPrelinCurves); if (p8 == NULL) goto Error; _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup); } else { Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID, OptimizedPrelinCLUT ->Params, 3, OptimizedPrelinCurves, 3, NULL); if (p16 == NULL) goto Error; _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); } // Don't fix white on absolute colorimetric if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) { if (!FixWhiteMisalignment(OptimizedLUT, ColorSpace, OutputColorSpace)) { goto Error; } } // And return the obtained LUT cmsPipelineFree(OriginalLut); *Lut = OptimizedLUT; return TRUE; Error: for (t = 0; t < OriginalLut ->InputChannels; t++) { if (Trans[t]) cmsFreeToneCurve(Trans[t]); if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); } if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves); if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); return FALSE; cmsUNUSED_PARAMETER(Intent); cmsUNUSED_PARAMETER(lIsLinear); } // Curves optimizer ------------------------------------------------------------------------------------------------------------------ static void CurvesFree(cmsContext ContextID, void* ptr) { Curves16Data* Data = (Curves16Data*) ptr; cmsUInt32Number i; for (i=0; i < Data -> nCurves; i++) { _cmsFree(ContextID, Data ->Curves[i]); } _cmsFree(ContextID, Data ->Curves); _cmsFree(ContextID, ptr); } static void* CurvesDup(cmsContext ContextID, const void* ptr) { Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data)); cmsUInt32Number i; if (Data == NULL) return NULL; Data->Curves = (cmsUInt16Number**) _cmsDupMem(ContextID, Data->Curves, Data->nCurves * sizeof(cmsUInt16Number*)); for (i=0; i < Data -> nCurves; i++) { Data->Curves[i] = (cmsUInt16Number*) _cmsDupMem(ContextID, Data->Curves[i], Data->nElements * sizeof(cmsUInt16Number)); } return (void*) Data; } // Precomputes tables for 8-bit on input devicelink. static Curves16Data* CurvesAlloc(cmsContext ContextID, cmsUInt32Number nCurves, cmsUInt32Number nElements, cmsToneCurve** G) { cmsUInt32Number i, j; Curves16Data* c16; c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data)); if (c16 == NULL) return NULL; c16 ->nCurves = nCurves; c16 ->nElements = nElements; c16->Curves = (cmsUInt16Number**) _cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*)); if (c16->Curves == NULL) { _cmsFree(ContextID, c16); return NULL; } for (i=0; i < nCurves; i++) { c16->Curves[i] = (cmsUInt16Number*) _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number)); if (c16->Curves[i] == NULL) { for (j=0; j < i; j++) { _cmsFree(ContextID, c16->Curves[j]); } _cmsFree(ContextID, c16->Curves); _cmsFree(ContextID, c16); return NULL; } if (nElements == 256U) { for (j=0; j < nElements; j++) { c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], FROM_8_TO_16(j)); } } else { for (j=0; j < nElements; j++) { c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], (cmsUInt16Number) j); } } } return c16; } static void FastEvaluateCurves8(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER const void* D) { Curves16Data* Data = (Curves16Data*) D; int x; cmsUInt32Number i; for (i=0; i < Data ->nCurves; i++) { x = (In[i] >> 8); Out[i] = Data -> Curves[i][x]; } } static void FastEvaluateCurves16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER const void* D) { Curves16Data* Data = (Curves16Data*) D; cmsUInt32Number i; for (i=0; i < Data ->nCurves; i++) { Out[i] = Data -> Curves[i][In[i]]; } } static void FastIdentity16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER const void* D) { cmsPipeline* Lut = (cmsPipeline*) D; cmsUInt32Number i; for (i=0; i < Lut ->InputChannels; i++) { Out[i] = In[i]; } } // If the target LUT holds only curves, the optimization procedure is to join all those // curves together. That only works on curves and does not work on matrices. static cmsBool OptimizeByJoiningCurves(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsToneCurve** GammaTables = NULL; cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; cmsUInt32Number i, j; cmsPipeline* Src = *Lut; cmsPipeline* Dest = NULL; cmsStage* mpe; cmsStage* ObtainedCurves = NULL; // This is a lossy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; // Only curves in this LUT? for (mpe = cmsPipelineGetPtrToFirstStage(Src); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; } // Allocate an empty LUT Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); if (Dest == NULL) return FALSE; // Create target curves GammaTables = (cmsToneCurve**) _cmsCalloc(Src ->ContextID, Src ->InputChannels, sizeof(cmsToneCurve*)); if (GammaTables == NULL) goto Error; for (i=0; i < Src ->InputChannels; i++) { GammaTables[i] = cmsBuildTabulatedToneCurve16(Src ->ContextID, PRELINEARIZATION_POINTS, NULL); if (GammaTables[i] == NULL) goto Error; } // Compute 16 bit result by using floating point for (i=0; i < PRELINEARIZATION_POINTS; i++) { for (j=0; j < Src ->InputChannels; j++) InFloat[j] = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); cmsPipelineEvalFloat(InFloat, OutFloat, Src); for (j=0; j < Src ->InputChannels; j++) GammaTables[j] -> Table16[i] = _cmsQuickSaturateWord(OutFloat[j] * 65535.0); } ObtainedCurves = cmsStageAllocToneCurves(Src ->ContextID, Src ->InputChannels, GammaTables); if (ObtainedCurves == NULL) goto Error; for (i=0; i < Src ->InputChannels; i++) { cmsFreeToneCurve(GammaTables[i]); GammaTables[i] = NULL; } if (GammaTables != NULL) { _cmsFree(Src->ContextID, GammaTables); GammaTables = NULL; } // Maybe the curves are linear at the end if (!AllCurvesAreLinear(ObtainedCurves)) { _cmsStageToneCurvesData* Data; if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves)) goto Error; Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves); ObtainedCurves = NULL; // If the curves are to be applied in 8 bits, we can save memory if (_cmsFormatterIs8bit(*InputFormat)) { Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves); if (c16 == NULL) goto Error; *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup); } else { Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves); if (c16 == NULL) goto Error; *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup); } } else { // LUT optimizes to nothing. Set the identity LUT cmsStageFree(ObtainedCurves); ObtainedCurves = NULL; if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels))) goto Error; *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL); } // We are done. cmsPipelineFree(Src); *Lut = Dest; return TRUE; Error: if (ObtainedCurves != NULL) cmsStageFree(ObtainedCurves); if (GammaTables != NULL) { for (i=0; i < Src ->InputChannels; i++) { if (GammaTables[i] != NULL) cmsFreeToneCurve(GammaTables[i]); } _cmsFree(Src ->ContextID, GammaTables); } if (Dest != NULL) cmsPipelineFree(Dest); return FALSE; cmsUNUSED_PARAMETER(Intent); cmsUNUSED_PARAMETER(InputFormat); cmsUNUSED_PARAMETER(OutputFormat); cmsUNUSED_PARAMETER(dwFlags); } // ------------------------------------------------------------------------------------------------------------------------------------- // LUT is Shaper - Matrix - Matrix - Shaper, which is very frequent when combining two matrix-shaper profiles static void FreeMatShaper(cmsContext ContextID, void* Data) { if (Data != NULL) _cmsFree(ContextID, Data); } static void* DupMatShaper(cmsContext ContextID, const void* Data) { return _cmsDupMem(ContextID, Data, sizeof(MatShaper8Data)); } // A fast matrix-shaper evaluator for 8 bits. This is a bit tricky since I'm using 1.14 signed fixed point // to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits, // in total about 50K, and the performance boost is huge! static CMS_NO_SANITIZE void MatShaperEval16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER const void* D) { MatShaper8Data* p = (MatShaper8Data*) D; cmsS1Fixed14Number l1, l2, l3, r, g, b; cmsUInt32Number ri, gi, bi; // In this case (and only in this case!) we can use this simplification since // In[] is assured to come from a 8 bit number. (a << 8 | a) ri = In[0] & 0xFFU; gi = In[1] & 0xFFU; bi = In[2] & 0xFFU; // Across first shaper, which also converts to 1.14 fixed point r = p->Shaper1R[ri]; g = p->Shaper1G[gi]; b = p->Shaper1B[bi]; // Evaluate the matrix in 1.14 fixed point l1 = (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0] + 0x2000) >> 14; l2 = (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1] + 0x2000) >> 14; l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14; // Now we have to clip to 0..1.0 range ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384U : (cmsUInt32Number) l1); gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384U : (cmsUInt32Number) l2); bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384U : (cmsUInt32Number) l3); // And across second shaper, Out[0] = p->Shaper2R[ri]; Out[1] = p->Shaper2G[gi]; Out[2] = p->Shaper2B[bi]; } // This table converts from 8 bits to 1.14 after applying the curve static void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve) { int i; cmsFloat32Number R, y; for (i=0; i < 256; i++) { R = (cmsFloat32Number) (i / 255.0); y = cmsEvalToneCurveFloat(Curve, R); if (y < 131072.0) Table[i] = DOUBLE_TO_1FIXED14(y); else Table[i] = 0x7fffffff; } } // This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve static void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8BitsOutput) { int i; cmsFloat32Number R, Val; for (i=0; i < 16385; i++) { R = (cmsFloat32Number) (i / 16384.0); Val = cmsEvalToneCurveFloat(Curve, R); // Val comes 0..1.0 if (Val < 0) Val = 0; if (Val > 1.0) Val = 1.0; if (Is8BitsOutput) { // If 8 bits output, we can optimize further by computing the / 257 part. // first we compute the resulting byte and then we store the byte times // 257. This quantization allows to round very quick by doing a >> 8, but // since the low byte is always equal to msb, we can do a & 0xff and this works! cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0); cmsUInt8Number b = FROM_16_TO_8(w); Table[i] = FROM_8_TO_16(b); } else Table[i] = _cmsQuickSaturateWord(Val * 65535.0); } } // Compute the matrix-shaper structure static cmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsUInt32Number* OutputFormat) { MatShaper8Data* p; int i, j; cmsBool Is8Bits = _cmsFormatterIs8bit(*OutputFormat); // Allocate a big chuck of memory to store precomputed tables p = (MatShaper8Data*) _cmsMalloc(Dest ->ContextID, sizeof(MatShaper8Data)); if (p == NULL) return FALSE; p -> ContextID = Dest -> ContextID; // Precompute tables FillFirstShaper(p ->Shaper1R, Curve1[0]); FillFirstShaper(p ->Shaper1G, Curve1[1]); FillFirstShaper(p ->Shaper1B, Curve1[2]); FillSecondShaper(p ->Shaper2R, Curve2[0], Is8Bits); FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits); FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits); // Convert matrix to nFixed14. Note that those values may take more than 16 bits for (i=0; i < 3; i++) { for (j=0; j < 3; j++) { p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]); } } for (i=0; i < 3; i++) { if (Off == NULL) { p ->Off[i] = 0; } else { p ->Off[i] = DOUBLE_TO_1FIXED14(Off->n[i]); } } // Mark as optimized for faster formatter if (Is8Bits) *OutputFormat |= OPTIMIZED_SH(1); // Fill function pointers _cmsPipelineSetOptimizationParameters(Dest, MatShaperEval16, (void*) p, FreeMatShaper, DupMatShaper); return TRUE; } // 8 bits on input allows matrix-shaper boot up to 25 Mpixels per second on RGB. That's fast! static cmsBool OptimizeMatrixShaper(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* Curve1, *Curve2; cmsStage* Matrix1, *Matrix2; cmsMAT3 res; cmsBool IdentityMat; cmsPipeline* Dest, *Src; cmsFloat64Number* Offset; // Only works on RGB to RGB if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE; // Only works on 8 bit input if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE; // Seems suitable, proceed Src = *Lut; // Check for: // // shaper-matrix-matrix-shaper // shaper-matrix-shaper // // Both of those constructs are possible (first because abs. colorimetric). // additionally, In the first case, the input matrix offset should be zero. IdentityMat = FALSE; if (cmsPipelineCheckAndRetreiveStages(Src, 4, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Matrix2, &Curve2)) { // Get both matrices _cmsStageMatrixData* Data1 = (_cmsStageMatrixData*)cmsStageData(Matrix1); _cmsStageMatrixData* Data2 = (_cmsStageMatrixData*)cmsStageData(Matrix2); // Only RGB to RGB if (Matrix1->InputChannels != 3 || Matrix1->OutputChannels != 3 || Matrix2->InputChannels != 3 || Matrix2->OutputChannels != 3) return FALSE; // Input offset should be zero if (Data1->Offset != NULL) return FALSE; // Multiply both matrices to get the result _cmsMAT3per(&res, (cmsMAT3*)Data2->Double, (cmsMAT3*)Data1->Double); // Only 2nd matrix has offset, or it is zero Offset = Data2->Offset; // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? if (_cmsMAT3isIdentity(&res) && Offset == NULL) { // We can get rid of full matrix IdentityMat = TRUE; } } else { if (cmsPipelineCheckAndRetreiveStages(Src, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Curve2)) { _cmsStageMatrixData* Data = (_cmsStageMatrixData*)cmsStageData(Matrix1); if (Matrix1->InputChannels != 3 || Matrix1->OutputChannels != 3) return FALSE; // Copy the matrix to our result memcpy(&res, Data->Double, sizeof(res)); // Preserve the Odffset (may be NULL as a zero offset) Offset = Data->Offset; if (_cmsMAT3isIdentity(&res) && Offset == NULL) { // We can get rid of full matrix IdentityMat = TRUE; } } else return FALSE; // Not optimizeable this time } // Allocate an empty LUT Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); if (!Dest) return FALSE; // Assamble the new LUT if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1))) goto Error; if (!IdentityMat) { if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest->ContextID, 3, 3, (const cmsFloat64Number*)&res, Offset))) goto Error; } if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2))) goto Error; // If identity on matrix, we can further optimize the curves, so call the join curves routine if (IdentityMat) { OptimizeByJoiningCurves(&Dest, Intent, InputFormat, OutputFormat, dwFlags); } else { _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); // In this particular optimization, cache does not help as it takes more time to deal with // the cache than with the pixel handling *dwFlags |= cmsFLAGS_NOCACHE; // Setup the optimizarion routines SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Offset, mpeC2->TheCurves, OutputFormat); } cmsPipelineFree(Src); *Lut = Dest; return TRUE; Error: // Leave Src unchanged cmsPipelineFree(Dest); return FALSE; } // ------------------------------------------------------------------------------------------------------------------------------------- // Optimization plug-ins // List of optimizations typedef struct _cmsOptimizationCollection_st { _cmsOPToptimizeFn OptimizePtr; struct _cmsOptimizationCollection_st *Next; } _cmsOptimizationCollection; // The built-in list. We currently implement 4 types of optimizations. Joining of curves, matrix-shaper, linearization and resampling static _cmsOptimizationCollection DefaultOptimization[] = { { OptimizeByJoiningCurves, &DefaultOptimization[1] }, { OptimizeMatrixShaper, &DefaultOptimization[2] }, { OptimizeByComputingLinearization, &DefaultOptimization[3] }, { OptimizeByResampling, NULL } }; // The linked list head _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginOptimizationList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsOptimizationPluginChunkType newHead = { NULL }; _cmsOptimizationCollection* entry; _cmsOptimizationCollection* Anterior = NULL; _cmsOptimizationPluginChunkType* head = (_cmsOptimizationPluginChunkType*) src->chunks[OptimizationPlugin]; _cmsAssert(ctx != NULL); _cmsAssert(head != NULL); // Walk the list copying all nodes for (entry = head->OptimizationCollection; entry != NULL; entry = entry ->Next) { _cmsOptimizationCollection *newEntry = ( _cmsOptimizationCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsOptimizationCollection)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.OptimizationCollection == NULL) newHead.OptimizationCollection = newEntry; } ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsOptimizationPluginChunkType)); } void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Copy all linked list DupPluginOptimizationList(ctx, src); } else { static _cmsOptimizationPluginChunkType OptimizationPluginChunkType = { NULL }; ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx ->MemPool, &OptimizationPluginChunkType, sizeof(_cmsOptimizationPluginChunkType)); } } // Register new ways to optimize cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data; _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin); _cmsOptimizationCollection* fl; if (Data == NULL) { ctx->OptimizationCollection = NULL; return TRUE; } // Optimizer callback is required if (Plugin ->OptimizePtr == NULL) return FALSE; fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsOptimizationCollection)); if (fl == NULL) return FALSE; // Copy the parameters fl ->OptimizePtr = Plugin ->OptimizePtr; // Keep linked list fl ->Next = ctx->OptimizationCollection; // Set the head ctx ->OptimizationCollection = fl; // All is ok return TRUE; } // The entry point for LUT optimization cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, cmsPipeline** PtrLut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin); _cmsOptimizationCollection* Opts; cmsBool AnySuccess = FALSE; cmsStage* mpe; // A CLUT is being asked, so force this specific optimization if (*dwFlags & cmsFLAGS_FORCE_CLUT) { PreOptimize(*PtrLut); return OptimizeByResampling(PtrLut, Intent, InputFormat, OutputFormat, dwFlags); } // Anything to optimize? if ((*PtrLut) ->Elements == NULL) { _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL); return TRUE; } // Named color pipelines cannot be optimized for (mpe = cmsPipelineGetPtrToFirstStage(*PtrLut); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE; } // Try to get rid of identities and trivial conversions. AnySuccess = PreOptimize(*PtrLut); // After removal do we end with an identity? if ((*PtrLut) ->Elements == NULL) { _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL); return TRUE; } // Do not optimize, keep all precision if (*dwFlags & cmsFLAGS_NOOPTIMIZE) return FALSE; // Try plug-in optimizations for (Opts = ctx->OptimizationCollection; Opts != NULL; Opts = Opts ->Next) { // If one schema succeeded, we are done if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) { return TRUE; // Optimized! } } // Try built-in optimizations for (Opts = DefaultOptimization; Opts != NULL; Opts = Opts ->Next) { if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) { return TRUE; } } // Only simple optimizations succeeded return AnySuccess; } lcms2-2.19.1/src/cmserr.c0000644000175000017500000005542715176573557014126 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- #include "lcms2_internal.h" // This function is here to help applications to prevent mixing lcms versions on header and shared objects. int CMSEXPORT cmsGetEncodedCMMversion(void) { return LCMS_VERSION; } // I am so tired about incompatibilities on those functions that here are some replacements // that hopefully would be fully portable. // compare two strings ignoring case int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2) { CMSREGISTER const unsigned char *us1 = (const unsigned char *)s1, *us2 = (const unsigned char *)s2; while (toupper(*us1) == toupper(*us2++)) if (*us1++ == '\0') return 0; return (toupper(*us1) - toupper(*--us2)); } #ifdef CMS_LARGE_FILE_SUPPORT long long int CMSEXPORT cmsfilelength(FILE* f) { long long int p, n; #ifdef CMS_IS_WINDOWS_ p = _ftelli64(f); if (p == -1LL) return -1LL; if (_fseeki64(f, 0, SEEK_END) != 0) return -1LL; n = _ftelli64(f); if (_fseeki64(f, p, SEEK_SET) != 0) return -1LL; #else p = (long long int) ftello(f); if (p < 0) return -1LL; if (fseeko(f, 0, SEEK_END) != 0) return -1LL; n = (long long int) ftello(f); if (fseeko(f, (off_t) p, SEEK_SET) != 0) return -1LL; #endif return n; } #else // long int because C99 specifies ftell in such way (7.19.9.2) long int CMSEXPORT cmsfilelength(FILE* f) { long int p, n; p = ftell(f); if (p == -1L) return -1L; if (fseek(f, 0, SEEK_END) != 0) return -1L; n = ftell(f); if (fseek(f, p, SEEK_SET) != 0) return -1L; return n; } #endif // Memory handling ------------------------------------------------------------------ // // This is the interface to low-level memory management routines. By default a simple // wrapping to malloc/free/realloc is provided, although there is a limit on the max // amount of memory that can be reclaimed. This is mostly as a safety feature to prevent // bogus or evil code to allocate huge blocks that otherwise lcms would never need. #ifdef CMS_LARGE_FILE_SUPPORT # define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*2048U)) #else # define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*512U)) #endif // User may override this behaviour by using a memory plug-in, which basically replaces // the default memory management functions. In this case, no check is performed and it // is up to the plug-in writer to keep in the safe side. There are only three functions // required to be implemented: malloc, realloc and free, although the user may want to // replace the optional mallocZero, calloc and dup as well. cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // ********************************************************************************* // This is the default memory allocation function. It does a very coarse // check of amount of memory, just to prevent exploits static void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size) { // Never allow 0 or over maximum if (size == 0 || size > MAX_MEMORY_FOR_ALLOC) return NULL; return (void*) malloc(size); cmsUNUSED_PARAMETER(ContextID); } // Generic allocate & zero static void* _cmsMallocZeroDefaultFn(cmsContext ContextID, cmsUInt32Number size) { void *pt = _cmsMalloc(ContextID, size); if (pt == NULL) return NULL; memset(pt, 0, size); return pt; } // The default free function. The only check proformed is against NULL pointers static void _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr) { // free(NULL) is defined a no-op by C99, therefore it is safe to // avoid the check, but it is here just in case... if (Ptr) free(Ptr); cmsUNUSED_PARAMETER(ContextID); } // The default realloc function. Again it checks for exploits. If Ptr is NULL, // realloc behaves the same way as malloc and allocates a new block of size bytes. static void* _cmsReallocDefaultFn(cmsContext ContextID, void* Ptr, cmsUInt32Number size) { if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never realloc over 512Mb return realloc(Ptr, size); cmsUNUSED_PARAMETER(ContextID); } // The default calloc function. Allocates an array of num elements, each one of size bytes // all memory is initialized to zero. static void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) { cmsUInt32Number Total = num * size; // Preserve calloc behaviour if (Total == 0) return NULL; // Safe check for overflow. if (num >= UINT_MAX / size) return NULL; // Check for overflow if (Total < num || Total < size) { return NULL; } if (Total > MAX_MEMORY_FOR_ALLOC) return NULL; // Never alloc over 512Mb return _cmsMallocZero(ContextID, Total); } // Generic block duplication static void* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number size) { void* mem; if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never dup over 512Mb mem = _cmsMalloc(ContextID, size); if (mem != NULL && Org != NULL) memmove(mem, Org, size); return mem; } // Pointers to memory manager functions in Context0 _cmsMemPluginChunkType _cmsMemPluginChunk = { _cmsMallocDefaultFn, _cmsMallocZeroDefaultFn, _cmsFreeDefaultFn, _cmsReallocDefaultFn, _cmsCallocDefaultFn, _cmsDupDefaultFn }; // Reset and duplicate memory manager void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsAssert(ctx != NULL); if (src != NULL) { // Duplicate ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType)); } else { // To reset it, we use the default allocators, which cannot be overridden ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager; } } // Auxiliary to fill memory management functions from plugin (or context 0 defaults) void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr) { if (Plugin == NULL) { memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk)); } else { ptr ->MallocPtr = Plugin -> MallocPtr; ptr ->FreePtr = Plugin -> FreePtr; ptr ->ReallocPtr = Plugin -> ReallocPtr; // Make sure we revert to defaults ptr ->MallocZeroPtr= _cmsMallocZeroDefaultFn; ptr ->CallocPtr = _cmsCallocDefaultFn; ptr ->DupPtr = _cmsDupDefaultFn; if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr; if (Plugin ->CallocPtr != NULL) ptr ->CallocPtr = Plugin -> CallocPtr; if (Plugin ->DupPtr != NULL) ptr ->DupPtr = Plugin -> DupPtr; } } // Plug-in replacement entry cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase *Data) { cmsPluginMemHandler* Plugin = (cmsPluginMemHandler*) Data; _cmsMemPluginChunkType* ptr; // NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure. // Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the // context internal data should be malloc'ed by using those functions. if (Data == NULL) { struct _cmsContext_struct* ctx = ( struct _cmsContext_struct*) ContextID; // Return to the default allocators if (ContextID != NULL) { ctx->chunks[MemPlugin] = (void*) &ctx->DefaultMemoryManager; } return TRUE; } // Check for required callbacks if (Plugin -> MallocPtr == NULL || Plugin -> FreePtr == NULL || Plugin -> ReallocPtr == NULL) return FALSE; // Set replacement functions ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); if (ptr == NULL) return FALSE; _cmsInstallAllocFunctions(Plugin, ptr); return TRUE; } // Generic allocate void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr ->MallocPtr(ContextID, size); } // Generic allocate & zero void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr->MallocZeroPtr(ContextID, size); } // Generic calloc void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr->CallocPtr(ContextID, num, size); } // Generic reallocate void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr->ReallocPtr(ContextID, Ptr, size); } // Generic free memory void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr) { if (Ptr != NULL) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); ptr ->FreePtr(ContextID, Ptr); } } // Generic block duplication void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr ->DupPtr(ContextID, Org, size); } // ******************************************************************************************** // Sub allocation takes care of many pointers of small size. The memory allocated in // this way have be freed at once. Next function allocates a single chunk for linked list // I prefer this method over realloc due to the big impact on xput realloc may have if // memory is being swapped to disk. This approach is safer (although that may not be true on all platforms) static _cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial) { _cmsSubAllocator_chunk* chunk; // 20K by default if (Initial == 0) Initial = 20*1024; // Create the container chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk)); if (chunk == NULL) return NULL; // Initialize values chunk ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, Initial); if (chunk ->Block == NULL) { // Something went wrong _cmsFree(ContextID, chunk); return NULL; } chunk ->BlockSize = Initial; chunk ->Used = 0; chunk ->next = NULL; return chunk; } // The suballocated is nothing but a pointer to the first element in the list. We also keep // the thread ID in this structure. _cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial) { _cmsSubAllocator* sub; // Create the container sub = (_cmsSubAllocator*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator)); if (sub == NULL) return NULL; sub ->ContextID = ContextID; sub ->h = _cmsCreateSubAllocChunk(ContextID, Initial); if (sub ->h == NULL) { _cmsFree(ContextID, sub); return NULL; } return sub; } // Get rid of whole linked list void _cmsSubAllocDestroy(_cmsSubAllocator* sub) { _cmsSubAllocator_chunk *chunk, *n; for (chunk = sub ->h; chunk != NULL; chunk = n) { n = chunk->next; if (chunk->Block != NULL) _cmsFree(sub ->ContextID, chunk->Block); _cmsFree(sub ->ContextID, chunk); } // Free the header _cmsFree(sub ->ContextID, sub); } // Get a pointer to small memory block. void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size) { cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used; cmsUInt8Number* ptr; size = _cmsALIGNMEM(size); // Check for memory. If there is no room, allocate a new chunk of double memory size. if (size > Free) { _cmsSubAllocator_chunk* chunk; cmsUInt32Number newSize; newSize = sub -> h ->BlockSize * 2; if (newSize < size) newSize = size; chunk = _cmsCreateSubAllocChunk(sub -> ContextID, newSize); if (chunk == NULL) return NULL; // Link list chunk ->next = sub ->h; sub ->h = chunk; } ptr = sub -> h ->Block + sub -> h ->Used; sub -> h -> Used += size; return (void*) ptr; } // Duplicate in pool void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size) { void *NewPtr; // Dup of null pointer is also NULL if (ptr == NULL) return NULL; NewPtr = _cmsSubAlloc(s, size); if (ptr != NULL && NewPtr != NULL) { memcpy(NewPtr, ptr, size); } return NewPtr; } // Error logging ****************************************************************** // There is no error handling at all. When a function fails, it returns proper value. // For example, all create functions does return NULL on failure. Other return FALSE // It may be interesting, for the developer, to know why the function is failing. // for that reason, lcms2 does offer a logging function. This function does receive // a ENGLISH string with some clues on what is going wrong. You can show this // info to the end user, or just create some sort of log. // The logging function should NOT terminate the program, as this obviously can leave // resources. It is the programmer's responsibility to check each function return code // to make sure it didn't fail. // Error messages are limited to MAX_ERROR_MESSAGE_LEN #define MAX_ERROR_MESSAGE_LEN 1024 // --------------------------------------------------------------------------------------------------------- // This is our default log error static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text); // Context0 storage, which is global _cmsLogErrorChunkType _cmsLogErrorChunk = { DefaultLogErrorHandlerFunction }; // Allocates and inits error logger container for a given context. If src is NULL, only initializes the value // to the default. Otherwise, it duplicates the value. The interface is standard across all context clients void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsLogErrorChunkType LogErrorChunk = { DefaultLogErrorHandlerFunction }; void* from; if (src != NULL) { from = src ->chunks[Logger]; } else { from = &LogErrorChunk; } ctx ->chunks[Logger] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsLogErrorChunkType)); } // The default error logger does nothing. static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { // fprintf(stderr, "[lcms]: %s\n", Text); // fflush(stderr); cmsUNUSED_PARAMETER(ContextID); cmsUNUSED_PARAMETER(ErrorCode); cmsUNUSED_PARAMETER(Text); } // Change log error, context based void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn) { _cmsLogErrorChunkType* lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger); if (lhg != NULL) { if (Fn == NULL) lhg -> LogErrorHandler = DefaultLogErrorHandlerFunction; else lhg -> LogErrorHandler = Fn; } } // Change log error, legacy void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn) { cmsSetLogErrorHandlerTHR(NULL, Fn); } // Log an error // ErrorText is a text holding an english description of error. void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...) { va_list args; char Buffer[MAX_ERROR_MESSAGE_LEN]; _cmsLogErrorChunkType* lhg; va_start(args, ErrorText); vsnprintf(Buffer, MAX_ERROR_MESSAGE_LEN-1, ErrorText, args); va_end(args); // Check for the context, if specified go there. If not, go for the global lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger); if (lhg ->LogErrorHandler) { lhg ->LogErrorHandler(ContextID, ErrorCode, Buffer); } } // Utility function to print signatures void _cmsTagSignature2String(char String[5], cmsTagSignature sig) { cmsUInt32Number be; // Convert to big endian be = _cmsAdjustEndianess32((cmsUInt32Number) sig); // Move chars memmove(String, &be, 4); // Make sure of terminator String[4] = 0; } //-------------------------------------------------------------------------------------------------- static void* defMtxCreate(cmsContext id) { _cmsMutex* ptr_mutex = (_cmsMutex*) _cmsMalloc(id, sizeof(_cmsMutex)); _cmsInitMutexPrimitive(ptr_mutex); return (void*) ptr_mutex; } static void defMtxDestroy(cmsContext id, void* mtx) { _cmsDestroyMutexPrimitive((_cmsMutex *) mtx); _cmsFree(id, mtx); } static cmsBool defMtxLock(cmsContext id, void* mtx) { cmsUNUSED_PARAMETER(id); return _cmsLockPrimitive((_cmsMutex *) mtx) == 0; } static void defMtxUnlock(cmsContext id, void* mtx) { cmsUNUSED_PARAMETER(id); _cmsUnlockPrimitive((_cmsMutex *) mtx); } // Pointers to memory manager functions in Context0 _cmsMutexPluginChunkType _cmsMutexPluginChunk = { defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock }; // Allocate and init mutex container. void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsMutexPluginChunkType MutexChunk = {defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock }; void* from; if (src != NULL) { from = src ->chunks[MutexPlugin]; } else { from = &MutexChunk; } ctx ->chunks[MutexPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsMutexPluginChunkType)); } // Register new ways to transform cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginMutex* Plugin = (cmsPluginMutex*) Data; _cmsMutexPluginChunkType* ctx = ( _cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (Data == NULL) { // No lock routines ctx->CreateMutexPtr = NULL; ctx->DestroyMutexPtr = NULL; ctx->LockMutexPtr = NULL; ctx ->UnlockMutexPtr = NULL; return TRUE; } // Factory callback is required if (Plugin ->CreateMutexPtr == NULL || Plugin ->DestroyMutexPtr == NULL || Plugin ->LockMutexPtr == NULL || Plugin ->UnlockMutexPtr == NULL) return FALSE; ctx->CreateMutexPtr = Plugin->CreateMutexPtr; ctx->DestroyMutexPtr = Plugin ->DestroyMutexPtr; ctx ->LockMutexPtr = Plugin ->LockMutexPtr; ctx ->UnlockMutexPtr = Plugin ->UnlockMutexPtr; // All is ok return TRUE; } // Generic Mutex fns void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->CreateMutexPtr == NULL) return NULL; return ptr ->CreateMutexPtr(ContextID); } void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->DestroyMutexPtr != NULL) { ptr ->DestroyMutexPtr(ContextID, mtx); } } cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->LockMutexPtr == NULL) return TRUE; return ptr ->LockMutexPtr(ContextID, mtx); } void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->UnlockMutexPtr != NULL) { ptr ->UnlockMutexPtr(ContextID, mtx); } } // The global Context0 storage for parallelization plug-in _cmsParallelizationPluginChunkType _cmsParallelizationPluginChunk = { 0 }; // Allocate parallelization container. void _cmsAllocParallelizationPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { void* from = src->chunks[ParallelizationPlugin]; ctx->chunks[ParallelizationPlugin] = _cmsSubAllocDup(ctx->MemPool, from, sizeof(_cmsParallelizationPluginChunkType)); } else { _cmsParallelizationPluginChunkType ParallelizationPluginChunk = { 0 }; ctx->chunks[ParallelizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &ParallelizationPluginChunk, sizeof(_cmsParallelizationPluginChunkType)); } } // Register parallel processing cmsBool _cmsRegisterParallelizationPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginParalellization* Plugin = (cmsPluginParalellization*)Data; _cmsParallelizationPluginChunkType* ctx = (_cmsParallelizationPluginChunkType*)_cmsContextGetClientChunk(ContextID, ParallelizationPlugin); if (Data == NULL) { // No parallelization routines ctx->MaxWorkers = 0; ctx->WorkerFlags = 0; ctx->SchedulerFn = NULL; return TRUE; } // callback is required if (Plugin->SchedulerFn == NULL) return FALSE; ctx->MaxWorkers = Plugin->MaxWorkers; ctx->WorkerFlags = Plugin->WorkerFlags; ctx->SchedulerFn = Plugin->SchedulerFn; // All is ok return TRUE; } lcms2-2.19.1/src/cmslut.c0000644000175000017500000014662215176573557014140 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Allocates an empty multi profile element cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID, cmsStageSignature Type, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels, _cmsStageEvalFn EvalPtr, _cmsStageDupElemFn DupElemPtr, _cmsStageFreeElemFn FreePtr, void* Data) { cmsStage* ph = (cmsStage*) _cmsMallocZero(ContextID, sizeof(cmsStage)); if (ph == NULL) return NULL; ph ->ContextID = ContextID; ph ->Type = Type; ph ->Implements = Type; // By default, no clue on what is implementing ph ->InputChannels = InputChannels; ph ->OutputChannels = OutputChannels; ph ->EvalPtr = EvalPtr; ph ->DupElemPtr = DupElemPtr; ph ->FreePtr = FreePtr; ph ->Data = Data; return ph; } static void EvaluateIdentity(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { memmove(Out, In, mpe ->InputChannels * sizeof(cmsFloat32Number)); } cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels) { return _cmsStageAllocPlaceholder(ContextID, cmsSigIdentityElemType, nChannels, nChannels, EvaluateIdentity, NULL, NULL, NULL); } // Conversion functions. From floating point to 16 bits static void FromFloatTo16(const cmsFloat32Number In[], cmsUInt16Number Out[], cmsUInt32Number n) { cmsUInt32Number i; for (i=0; i < n; i++) { Out[i] = _cmsQuickSaturateWord(In[i] * 65535.0); } } // From 16 bits to floating point static void From16ToFloat(const cmsUInt16Number In[], cmsFloat32Number Out[], cmsUInt32Number n) { cmsUInt32Number i; for (i=0; i < n; i++) { Out[i] = (cmsFloat32Number) In[i] / 65535.0F; } } // This function is quite useful to analyze the structure of a LUT and retrieve the MPE elements // that conform the LUT. It should be called with the LUT, the number of expected elements and // then a list of expected types followed with a list of cmsFloat64Number pointers to MPE elements. If // the function founds a match with current pipeline, it fills the pointers and returns TRUE // if not, returns FALSE without touching anything. Setting pointers to NULL does bypass // the storage process. cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...) { va_list args; cmsUInt32Number i; cmsStage* mpe; cmsStageSignature Type; void** ElemPtr; // Make sure same number of elements if (cmsPipelineStageCount(Lut) != n) return FALSE; va_start(args, n); // Iterate across asked types mpe = Lut ->Elements; for (i=0; i < n; i++) { // Get asked type. cmsStageSignature is promoted to int by compiler Type = (cmsStageSignature)va_arg(args, int); if (mpe ->Type != Type) { va_end(args); // Mismatch. We are done. return FALSE; } mpe = mpe ->Next; } // Found a combination, fill pointers if not NULL mpe = Lut ->Elements; for (i=0; i < n; i++) { ElemPtr = va_arg(args, void**); if (ElemPtr != NULL) *ElemPtr = mpe; mpe = mpe ->Next; } va_end(args); return TRUE; } // Below there are implementations for several types of elements. Each type may be implemented by a // evaluation function, a duplication function, a function to free resources and a constructor. // ************************************************************************************************* // Type cmsSigCurveSetElemType (curves) // ************************************************************************************************* cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe) { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; return Data ->TheCurves; } static void EvaluateCurves(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { _cmsStageToneCurvesData* Data; cmsUInt32Number i; _cmsAssert(mpe != NULL); Data = (_cmsStageToneCurvesData*) mpe ->Data; if (Data == NULL) return; if (Data ->TheCurves == NULL) return; for (i=0; i < Data ->nCurves; i++) { Out[i] = cmsEvalToneCurveFloat(Data ->TheCurves[i], In[i]); } } static void CurveSetElemTypeFree(cmsStage* mpe) { _cmsStageToneCurvesData* Data; cmsUInt32Number i; _cmsAssert(mpe != NULL); Data = (_cmsStageToneCurvesData*) mpe ->Data; if (Data == NULL) return; if (Data ->TheCurves != NULL) { for (i=0; i < Data ->nCurves; i++) { if (Data ->TheCurves[i] != NULL) cmsFreeToneCurve(Data ->TheCurves[i]); } } _cmsFree(mpe ->ContextID, Data ->TheCurves); _cmsFree(mpe ->ContextID, Data); } static void* CurveSetDup(cmsStage* mpe) { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; _cmsStageToneCurvesData* NewElem; cmsUInt32Number i; NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageToneCurvesData)); if (NewElem == NULL) return NULL; NewElem ->nCurves = Data ->nCurves; NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(mpe ->ContextID, NewElem ->nCurves, sizeof(cmsToneCurve*)); if (NewElem ->TheCurves == NULL) goto Error; for (i=0; i < NewElem ->nCurves; i++) { // Duplicate each curve. It may fail. NewElem ->TheCurves[i] = cmsDupToneCurve(Data ->TheCurves[i]); if (NewElem ->TheCurves[i] == NULL) goto Error; } return (void*) NewElem; Error: if (NewElem ->TheCurves != NULL) { for (i=0; i < NewElem ->nCurves; i++) { if (NewElem ->TheCurves[i]) cmsFreeToneCurve(NewElem ->TheCurves[i]); } } _cmsFree(mpe ->ContextID, NewElem ->TheCurves); _cmsFree(mpe ->ContextID, NewElem); return NULL; } // Curves == NULL forces identity curves cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]) { cmsUInt32Number i; _cmsStageToneCurvesData* NewElem; cmsStage* NewMPE; NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCurveSetElemType, nChannels, nChannels, EvaluateCurves, CurveSetDup, CurveSetElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(ContextID, sizeof(_cmsStageToneCurvesData)); if (NewElem == NULL) { cmsStageFree(NewMPE); return NULL; } NewMPE ->Data = (void*) NewElem; NewElem ->nCurves = nChannels; NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(ContextID, nChannels, sizeof(cmsToneCurve*)); if (NewElem ->TheCurves == NULL) { cmsStageFree(NewMPE); return NULL; } for (i=0; i < nChannels; i++) { if (Curves == NULL) { NewElem ->TheCurves[i] = cmsBuildGamma(ContextID, 1.0); } else { NewElem ->TheCurves[i] = cmsDupToneCurve(Curves[i]); } if (NewElem ->TheCurves[i] == NULL) { cmsStageFree(NewMPE); return NULL; } } return NewMPE; } // Create a bunch of identity curves cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels) { cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL); if (mpe == NULL) return NULL; mpe ->Implements = cmsSigIdentityElemType; return mpe; } // ************************************************************************************************* // Type cmsSigMatrixElemType (Matrices) // ************************************************************************************************* // Special care should be taken here because precision loss. A temporary cmsFloat64Number buffer is being used static void EvaluateMatrix(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsUInt32Number i, j; _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; cmsFloat64Number Tmp; // Input is already in 0..1.0 notation for (i=0; i < mpe ->OutputChannels; i++) { Tmp = 0; for (j=0; j < mpe->InputChannels; j++) { Tmp += In[j] * Data->Double[i*mpe->InputChannels + j]; } if (Data ->Offset != NULL) Tmp += Data->Offset[i]; Out[i] = (cmsFloat32Number) Tmp; } // Output in 0..1.0 domain } // Duplicate a yet-existing matrix element static void* MatrixElemDup(cmsStage* mpe) { _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; _cmsStageMatrixData* NewElem; cmsUInt32Number sz; NewElem = (_cmsStageMatrixData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageMatrixData)); if (NewElem == NULL) return NULL; sz = mpe ->InputChannels * mpe ->OutputChannels; NewElem ->Double = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Double, sz * sizeof(cmsFloat64Number)) ; if (Data ->Offset) NewElem ->Offset = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Offset, mpe -> OutputChannels * sizeof(cmsFloat64Number)) ; return (void*) NewElem; } static void MatrixElemTypeFree(cmsStage* mpe) { _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; if (Data == NULL) return; if (Data ->Double) _cmsFree(mpe ->ContextID, Data ->Double); if (Data ->Offset) _cmsFree(mpe ->ContextID, Data ->Offset); _cmsFree(mpe ->ContextID, mpe ->Data); } cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset) { cmsUInt32Number i, n; _cmsStageMatrixData* NewElem; cmsStage* NewMPE; n = Rows * Cols; // Check for overflow if (n == 0) return NULL; if (n >= UINT_MAX / Cols) return NULL; if (n >= UINT_MAX / Rows) return NULL; if (n < Rows || n < Cols) return NULL; NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigMatrixElemType, Cols, Rows, EvaluateMatrix, MatrixElemDup, MatrixElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageMatrixData*) _cmsMallocZero(ContextID, sizeof(_cmsStageMatrixData)); if (NewElem == NULL) goto Error; NewMPE->Data = (void*)NewElem; NewElem ->Double = (cmsFloat64Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat64Number)); if (NewElem->Double == NULL) goto Error; for (i=0; i < n; i++) { NewElem ->Double[i] = Matrix[i]; } if (Offset != NULL) { NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Rows, sizeof(cmsFloat64Number)); if (NewElem->Offset == NULL) goto Error; for (i=0; i < Rows; i++) { NewElem ->Offset[i] = Offset[i]; } } return NewMPE; Error: cmsStageFree(NewMPE); return NULL; } // ************************************************************************************************* // Type cmsSigCLutElemType // ************************************************************************************************* // Evaluate in true floating point static void EvaluateCLUTfloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; Data -> Params ->Interpolation.LerpFloat(In, Out, Data->Params); } // Convert to 16 bits, evaluate, and back to floating point static void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; cmsUInt16Number In16[MAX_STAGE_CHANNELS], Out16[MAX_STAGE_CHANNELS]; _cmsAssert(mpe ->InputChannels <= MAX_STAGE_CHANNELS); _cmsAssert(mpe ->OutputChannels <= MAX_STAGE_CHANNELS); FromFloatTo16(In, In16, mpe ->InputChannels); Data -> Params ->Interpolation.Lerp16(In16, Out16, Data->Params); From16ToFloat(Out16, Out, mpe ->OutputChannels); } // Given an hypercube of b dimensions, with Dims[] number of nodes by dimension, calculate the total amount of nodes static cmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b) { cmsUInt32Number dim; cmsUInt64Number rv; _cmsAssert(Dims != NULL); for (rv = 1; b > 0; b--) { dim = Dims[b-1]; if (dim <= 1) return 0; // Check for overflow if (rv > UINT_MAX / dim) return 0; rv *= dim; } // Again, prevent overflow if (rv > UINT_MAX / 15) return 0; return (cmsUInt32Number) rv; } static void* CLUTElemDup(cmsStage* mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; _cmsStageCLutData* NewElem; NewElem = (_cmsStageCLutData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageCLutData)); if (NewElem == NULL) return NULL; NewElem ->nEntries = Data ->nEntries; NewElem ->HasFloatValues = Data ->HasFloatValues; if (Data ->Tab.T) { if (Data ->HasFloatValues) { NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number)); if (NewElem ->Tab.TFloat == NULL) goto Error; } else { NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number)); if (NewElem ->Tab.T == NULL) goto Error; } } NewElem ->Params = _cmsComputeInterpParamsEx(mpe ->ContextID, Data ->Params ->nSamples, Data ->Params ->nInputs, Data ->Params ->nOutputs, NewElem ->Tab.T, Data ->Params ->dwFlags); if (NewElem->Params != NULL) return (void*) NewElem; Error: if (NewElem->Tab.T) // This works for both types _cmsFree(mpe ->ContextID, NewElem -> Tab.T); _cmsFree(mpe ->ContextID, NewElem); return NULL; } static void CLutElemTypeFree(cmsStage* mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; // Already empty if (Data == NULL) return; // This works for both types if (Data -> Tab.T) _cmsFree(mpe ->ContextID, Data -> Tab.T); _cmsFreeInterpParams(Data ->Params); _cmsFree(mpe ->ContextID, mpe ->Data); } // Allocates a 16-bit multidimensional CLUT. This is evaluated at 16-bit precision. Table may have different // granularity on each dimension. cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table) { cmsUInt32Number i, n; _cmsStageCLutData* NewElem; cmsStage* NewMPE; _cmsAssert(clutPoints != NULL); if (inputChan > MAX_INPUT_DIMENSIONS) { cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); return NULL; } NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, EvaluateCLUTfloatIn16, CLUTElemDup, CLutElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); if (NewElem == NULL) { cmsStageFree(NewMPE); return NULL; } NewMPE ->Data = (void*) NewElem; NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); NewElem -> HasFloatValues = FALSE; if (n == 0) { cmsStageFree(NewMPE); return NULL; } NewElem ->Tab.T = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number)); if (NewElem ->Tab.T == NULL) { cmsStageFree(NewMPE); return NULL; } if (Table != NULL) { for (i=0; i < n; i++) { NewElem ->Tab.T[i] = Table[i]; } } NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.T, CMS_LERP_FLAGS_16BITS); if (NewElem ->Params == NULL) { cmsStageFree(NewMPE); return NULL; } return NewMPE; } cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table) { cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; int i; // Our resulting LUT would be same gridpoints on all dimensions for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nGridPoints; return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table); } cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table) { cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; int i; // Our resulting LUT would be same gridpoints on all dimensions for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nGridPoints; return cmsStageAllocCLutFloatGranular(ContextID, Dimensions, inputChan, outputChan, Table); } cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table) { cmsUInt32Number i, n; _cmsStageCLutData* NewElem; cmsStage* NewMPE; _cmsAssert(clutPoints != NULL); if (inputChan > MAX_INPUT_DIMENSIONS) { cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); return NULL; } NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); if (NewElem == NULL) { cmsStageFree(NewMPE); return NULL; } NewMPE ->Data = (void*) NewElem; // There is a potential integer overflow on conputing n and nEntries. NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); NewElem -> HasFloatValues = TRUE; if (n == 0) { cmsStageFree(NewMPE); return NULL; } NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number)); if (NewElem ->Tab.TFloat == NULL) { cmsStageFree(NewMPE); return NULL; } if (Table != NULL) { for (i=0; i < n; i++) { NewElem ->Tab.TFloat[i] = Table[i]; } } NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT); if (NewElem ->Params == NULL) { cmsStageFree(NewMPE); return NULL; } return NewMPE; } static int IdentitySampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { int nChan = *(int*) Cargo; int i; for (i=0; i < nChan; i++) Out[i] = In[i]; return 1; } // Creates an MPE that just copies input to output cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan) { cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; cmsStage* mpe ; int i; for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = 2; mpe = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, nChan, nChan, NULL); if (mpe == NULL) return NULL; if (!cmsStageSampleCLut16bit(mpe, IdentitySampler, &nChan, 0)) { cmsStageFree(mpe); return NULL; } mpe ->Implements = cmsSigIdentityElemType; return mpe; } // Quantize a value 0 <= i < MaxSamples to 0..0xffff cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples) { cmsFloat64Number x; x = ((cmsFloat64Number) i * 65535.) / (cmsFloat64Number) (MaxSamples - 1); return _cmsQuickSaturateWord(x); } // This routine does a sweep on whole input space, and calls its callback // function on knots. returns TRUE if all ok, FALSE otherwise. cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags) { int i, t, index, rest; cmsUInt32Number nTotalPoints; cmsUInt32Number nInputs, nOutputs; cmsUInt32Number* nSamples; cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; _cmsStageCLutData* clut; if (mpe == NULL) return FALSE; clut = (_cmsStageCLutData*) mpe->Data; if (clut == NULL) return FALSE; nSamples = clut->Params ->nSamples; nInputs = clut->Params ->nInputs; nOutputs = clut->Params ->nOutputs; if (nInputs <= 0) return FALSE; if (nOutputs <= 0) return FALSE; if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE; if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; memset(In, 0, sizeof(In)); memset(Out, 0, sizeof(Out)); nTotalPoints = CubeSize(nSamples, nInputs); if (nTotalPoints == 0) return FALSE; index = 0; for (i = 0; i < (int) nTotalPoints; i++) { rest = i; for (t = (int)nInputs - 1; t >= 0; --t) { cmsUInt32Number Colorant = rest % nSamples[t]; rest /= nSamples[t]; In[t] = _cmsQuantizeVal(Colorant, nSamples[t]); } if (clut ->Tab.T != NULL) { for (t = 0; t < (int)nOutputs; t++) Out[t] = clut->Tab.T[index + t]; } if (!Sampler(In, Out, Cargo)) return FALSE; if (!(dwFlags & SAMPLER_INSPECT)) { if (clut ->Tab.T != NULL) { for (t=0; t < (int) nOutputs; t++) clut->Tab.T[index + t] = Out[t]; } } index += nOutputs; } return TRUE; } // Same as anterior, but for floating point cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags) { int i, t, index, rest; cmsUInt32Number nTotalPoints; cmsUInt32Number nInputs, nOutputs; cmsUInt32Number* nSamples; cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; _cmsStageCLutData* clut; if (mpe == NULL) return FALSE; clut = (_cmsStageCLutData*)mpe->Data; if (clut == NULL) return FALSE; nSamples = clut->Params ->nSamples; nInputs = clut->Params ->nInputs; nOutputs = clut->Params ->nOutputs; if (nInputs <= 0) return FALSE; if (nOutputs <= 0) return FALSE; if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE; if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; nTotalPoints = CubeSize(nSamples, nInputs); if (nTotalPoints == 0) return FALSE; index = 0; for (i = 0; i < (int)nTotalPoints; i++) { rest = i; for (t = (int) nInputs-1; t >=0; --t) { cmsUInt32Number Colorant = rest % nSamples[t]; rest /= nSamples[t]; In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, nSamples[t]) / 65535.0); } if (clut ->Tab.TFloat != NULL) { for (t=0; t < (int) nOutputs; t++) Out[t] = clut->Tab.TFloat[index + t]; } if (!Sampler(In, Out, Cargo)) return FALSE; if (!(dwFlags & SAMPLER_INSPECT)) { if (clut ->Tab.TFloat != NULL) { for (t=0; t < (int) nOutputs; t++) clut->Tab.TFloat[index + t] = Out[t]; } } index += nOutputs; } return TRUE; } // This routine does a sweep on whole input space, and calls its callback // function on knots. returns TRUE if all ok, FALSE otherwise. cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLER16 Sampler, void * Cargo) { int i, t, rest; cmsUInt32Number nTotalPoints; cmsUInt16Number In[cmsMAXCHANNELS]; if (nInputs >= cmsMAXCHANNELS) return FALSE; nTotalPoints = CubeSize(clutPoints, nInputs); if (nTotalPoints == 0) return FALSE; for (i = 0; i < (int) nTotalPoints; i++) { rest = i; for (t = (int) nInputs-1; t >=0; --t) { cmsUInt32Number Colorant = rest % clutPoints[t]; rest /= clutPoints[t]; In[t] = _cmsQuantizeVal(Colorant, clutPoints[t]); } if (!Sampler(In, NULL, Cargo)) return FALSE; } return TRUE; } cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLERFLOAT Sampler, void * Cargo) { int i, t, rest; cmsUInt32Number nTotalPoints; cmsFloat32Number In[cmsMAXCHANNELS]; if (nInputs >= cmsMAXCHANNELS) return FALSE; nTotalPoints = CubeSize(clutPoints, nInputs); if (nTotalPoints == 0) return FALSE; for (i = 0; i < (int) nTotalPoints; i++) { rest = i; for (t = (int) nInputs-1; t >=0; --t) { cmsUInt32Number Colorant = rest % clutPoints[t]; rest /= clutPoints[t]; In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, clutPoints[t]) / 65535.0); } if (!Sampler(In, NULL, Cargo)) return FALSE; } return TRUE; } // ******************************************************************************** // Type cmsSigLab2XYZElemType // ******************************************************************************** static void EvaluateLab2XYZ(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsCIELab Lab; cmsCIEXYZ XYZ; const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ; // V4 rules Lab.L = In[0] * 100.0; Lab.a = In[1] * 255.0 - 128.0; Lab.b = In[2] * 255.0 - 128.0; cmsLab2XYZ(NULL, &XYZ, &Lab); // From XYZ, range 0..19997 to 0..1.0, note that 1.99997 comes from 0xffff // encoded as 1.15 fixed point, so 1 + (32767.0 / 32768.0) Out[0] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.X / XYZadj); Out[1] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Y / XYZadj); Out[2] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Z / XYZadj); return; cmsUNUSED_PARAMETER(mpe); } // No dup or free routines needed, as the structure has no pointers in it. cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL); } // ******************************************************************************** // v2 L=100 is supposed to be placed on 0xFF00. There is no reasonable // number of gridpoints that would make exact match. However, a prelinearization // of 258 entries, would map 0xFF00 exactly on entry 257, and this is good to avoid scum dot. // Almost all what we need but unfortunately, the rest of entries should be scaled by // (255*257/256) and this is not exact. cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID) { cmsStage* mpe; cmsToneCurve* LabTable[3]; int i, j; LabTable[0] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); LabTable[1] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); LabTable[2] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); for (j=0; j < 3; j++) { if (LabTable[j] == NULL) { cmsFreeToneCurveTriple(LabTable); return NULL; } // We need to map * (0xffff / 0xff00), that's same as (257 / 256) // So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256); for (i=0; i < 257; i++) { LabTable[j]->Table16[i] = (cmsUInt16Number) ((i * 0xffff + 0x80) >> 8); } LabTable[j] ->Table16[257] = 0xffff; } mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable); cmsFreeToneCurveTriple(LabTable); if (mpe == NULL) return NULL; mpe ->Implements = cmsSigLabV2toV4; return mpe; } // ******************************************************************************** // Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID) { static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0, 0, 65535.0/65280.0, 0, 0, 0, 65535.0/65280.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V2ToV4, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigLabV2toV4; return mpe; } // Reverse direction cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID) { static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0, 0, 65280.0/65535.0, 0, 0, 0, 65280.0/65535.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V4ToV2, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigLabV4toV2; return mpe; } // To Lab to float. Note that the MPE gives numbers in normal Lab range // and we need 0..1.0 range for the formatters // L* : 0...100 => 0...1.0 (L* / 100) // ab* : -128..+127 to 0..1 ((ab* + 128) / 255) cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID) { static const cmsFloat64Number a1[] = { 1.0/100.0, 0, 0, 0, 1.0/255.0, 0, 0, 0, 1.0/255.0 }; static const cmsFloat64Number o1[] = { 0, 128.0/255.0, 128.0/255.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigLab2FloatPCS; return mpe; } // From XYZ to floating point PCS cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID) { #define n (32768.0/65535.0) static const cmsFloat64Number a1[] = { n, 0, 0, 0, n, 0, 0, 0, n }; #undef n cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigXYZ2FloatPCS; return mpe; } cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID) { static const cmsFloat64Number a1[] = { 100.0, 0, 0, 0, 255.0, 0, 0, 0, 255.0 }; static const cmsFloat64Number o1[] = { 0, -128.0, -128.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigFloatPCS2Lab; return mpe; } cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID) { #define n (65535.0/32768.0) static const cmsFloat64Number a1[] = { n, 0, 0, 0, n, 0, 0, 0, n }; #undef n cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigFloatPCS2XYZ; return mpe; } // Clips values smaller than zero static void Clipper(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsUInt32Number i; for (i = 0; i < mpe->InputChannels; i++) { cmsFloat32Number n = In[i]; Out[i] = n < 0 ? 0 : n; } } cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels) { return _cmsStageAllocPlaceholder(ContextID, cmsSigClipNegativesElemType, nChannels, nChannels, Clipper, NULL, NULL, NULL); } // ******************************************************************************** // Type cmsSigXYZ2LabElemType // ******************************************************************************** static void EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsCIELab Lab; cmsCIEXYZ XYZ; const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ; // From 0..1.0 to XYZ XYZ.X = In[0] * XYZadj; XYZ.Y = In[1] * XYZadj; XYZ.Z = In[2] * XYZadj; cmsXYZ2Lab(NULL, &Lab, &XYZ); // From V4 Lab to 0..1.0 Out[0] = (cmsFloat32Number) (Lab.L / 100.0); Out[1] = (cmsFloat32Number) ((Lab.a + 128.0) / 255.0); Out[2] = (cmsFloat32Number) ((Lab.b + 128.0) / 255.0); return; cmsUNUSED_PARAMETER(mpe); } cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL); } // ******************************************************************************** // For v4, S-Shaped curves are placed in a/b axis to increase resolution near gray cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID) { cmsToneCurve* LabTable[3]; cmsFloat64Number Params[1] = {2.4} ; LabTable[0] = cmsBuildGamma(ContextID, 1.0); LabTable[1] = cmsBuildParametricToneCurve(ContextID, 108, Params); LabTable[2] = cmsBuildParametricToneCurve(ContextID, 108, Params); return cmsStageAllocToneCurves(ContextID, 3, LabTable); } // Free a single MPE void CMSEXPORT cmsStageFree(cmsStage* mpe) { if (mpe ->FreePtr) mpe ->FreePtr(mpe); _cmsFree(mpe ->ContextID, mpe); } cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe) { return mpe ->InputChannels; } cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe) { return mpe ->OutputChannels; } cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe) { return mpe -> Type; } void* CMSEXPORT cmsStageData(const cmsStage* mpe) { return mpe -> Data; } cmsContext CMSEXPORT cmsGetStageContextID(const cmsStage* mpe) { return mpe -> ContextID; } cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe) { return mpe -> Next; } // Duplicates an MPE cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe) { cmsStage* NewMPE; if (mpe == NULL) return NULL; NewMPE = _cmsStageAllocPlaceholder(mpe ->ContextID, mpe ->Type, mpe ->InputChannels, mpe ->OutputChannels, mpe ->EvalPtr, mpe ->DupElemPtr, mpe ->FreePtr, NULL); if (NewMPE == NULL) return NULL; NewMPE ->Implements = mpe ->Implements; if (mpe ->DupElemPtr) { NewMPE ->Data = mpe ->DupElemPtr(mpe); if (NewMPE->Data == NULL) { cmsStageFree(NewMPE); return NULL; } } else { NewMPE ->Data = NULL; } return NewMPE; } // *********************************************************************************************************** // This function sets up the channel count static cmsBool BlessLUT(cmsPipeline* lut) { // We can set the input/output channels only if we have elements. if (lut ->Elements != NULL) { cmsStage* prev; cmsStage* next; cmsStage* First; cmsStage* Last; First = cmsPipelineGetPtrToFirstStage(lut); Last = cmsPipelineGetPtrToLastStage(lut); if (First == NULL || Last == NULL) return FALSE; lut->InputChannels = First->InputChannels; lut->OutputChannels = Last->OutputChannels; // Check chain consistency prev = First; next = prev->Next; while (next != NULL) { if (next->InputChannels != prev->OutputChannels) return FALSE; next = next->Next; prev = prev->Next; } } return TRUE; } // Default to evaluate the LUT on 16 bit-basis. Precision is retained. static void _LUTeval16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER const void* D) { cmsPipeline* lut = (cmsPipeline*) D; cmsStage *mpe; cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS]; int Phase = 0, NextPhase; From16ToFloat(In, &Storage[Phase][0], lut ->InputChannels); for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) { NextPhase = Phase ^ 1; mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe); Phase = NextPhase; } FromFloatTo16(&Storage[Phase][0], Out, lut ->OutputChannels); } // Does evaluate the LUT on cmsFloat32Number-basis. static void _LUTevalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const void* D) { cmsPipeline* lut = (cmsPipeline*) D; cmsStage *mpe; cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS]; int Phase = 0, NextPhase; memmove(&Storage[Phase][0], In, lut ->InputChannels * sizeof(cmsFloat32Number)); for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) { NextPhase = Phase ^ 1; mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe); Phase = NextPhase; } memmove(Out, &Storage[Phase][0], lut ->OutputChannels * sizeof(cmsFloat32Number)); } // LUT Creation & Destruction cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels) { cmsPipeline* NewLUT; // A value of zero in channels is allowed as placeholder if (InputChannels >= cmsMAXCHANNELS || OutputChannels >= cmsMAXCHANNELS) return NULL; NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline)); if (NewLUT == NULL) return NULL; NewLUT -> InputChannels = InputChannels; NewLUT -> OutputChannels = OutputChannels; NewLUT ->Eval16Fn = _LUTeval16; NewLUT ->EvalFloatFn = _LUTevalFloat; NewLUT ->DupDataFn = NULL; NewLUT ->FreeDataFn = NULL; NewLUT ->Data = NewLUT; NewLUT ->ContextID = ContextID; if (!BlessLUT(NewLUT)) { _cmsFree(ContextID, NewLUT); return NULL; } return NewLUT; } cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut) { _cmsAssert(lut != NULL); return lut ->ContextID; } cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut) { _cmsAssert(lut != NULL); return lut ->InputChannels; } cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut) { _cmsAssert(lut != NULL); return lut ->OutputChannels; } // Free a profile elements LUT void CMSEXPORT cmsPipelineFree(cmsPipeline* lut) { cmsStage *mpe, *Next; if (lut == NULL) return; for (mpe = lut ->Elements; mpe != NULL; mpe = Next) { Next = mpe ->Next; cmsStageFree(mpe); } if (lut ->FreeDataFn) lut ->FreeDataFn(lut ->ContextID, lut ->Data); _cmsFree(lut ->ContextID, lut); } // Default to evaluate the LUT on 16 bit-basis. void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut) { _cmsAssert(lut != NULL); lut ->Eval16Fn(In, Out, lut->Data); } // Does evaluate the LUT on cmsFloat32Number-basis. void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut) { _cmsAssert(lut != NULL); lut ->EvalFloatFn(In, Out, lut); } // Duplicates a LUT cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut) { cmsPipeline* NewLUT; cmsStage *NewMPE, *Anterior = NULL, *mpe; cmsBool First = TRUE; if (lut == NULL) return NULL; NewLUT = cmsPipelineAlloc(lut ->ContextID, lut ->InputChannels, lut ->OutputChannels); if (NewLUT == NULL) return NULL; for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) { NewMPE = cmsStageDup(mpe); if (NewMPE == NULL) { cmsPipelineFree(NewLUT); return NULL; } if (First) { NewLUT ->Elements = NewMPE; First = FALSE; } else { if (Anterior != NULL) Anterior ->Next = NewMPE; } Anterior = NewMPE; } NewLUT ->Eval16Fn = lut ->Eval16Fn; NewLUT ->EvalFloatFn = lut ->EvalFloatFn; NewLUT ->DupDataFn = lut ->DupDataFn; NewLUT ->FreeDataFn = lut ->FreeDataFn; if (NewLUT ->DupDataFn != NULL) NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data); NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits; if (!BlessLUT(NewLUT)) { _cmsFree(lut->ContextID, NewLUT); return NULL; } return NewLUT; } int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe) { cmsStage* Anterior = NULL, *pt; if (lut == NULL || mpe == NULL) return FALSE; switch (loc) { case cmsAT_BEGIN: mpe ->Next = lut ->Elements; lut ->Elements = mpe; break; case cmsAT_END: if (lut ->Elements == NULL) lut ->Elements = mpe; else { for (pt = lut ->Elements; pt != NULL; pt = pt -> Next) Anterior = pt; Anterior ->Next = mpe; mpe ->Next = NULL; } break; default:; return FALSE; } return BlessLUT(lut); } // Unlink an element and return the pointer to it void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe) { cmsStage *Anterior, *pt, *Last; cmsStage *Unlinked = NULL; // If empty LUT, there is nothing to remove if (lut ->Elements == NULL) { if (mpe) *mpe = NULL; return; } // On depending on the strategy... switch (loc) { case cmsAT_BEGIN: { cmsStage* elem = lut ->Elements; lut ->Elements = elem -> Next; elem ->Next = NULL; Unlinked = elem; } break; case cmsAT_END: Anterior = Last = NULL; for (pt = lut ->Elements; pt != NULL; pt = pt -> Next) { Anterior = Last; Last = pt; } Unlinked = Last; // Next already points to NULL // Truncate the chain if (Anterior) Anterior ->Next = NULL; else lut ->Elements = NULL; break; default:; } if (mpe) *mpe = Unlinked; else cmsStageFree(Unlinked); // May fail, but we ignore it BlessLUT(lut); } // Concatenate two LUT into a new single one cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2) { cmsStage* mpe; // If both LUTS does not have elements, we need to inherit // the number of channels if (l1 ->Elements == NULL && l2 ->Elements == NULL) { l1 ->InputChannels = l2 ->InputChannels; l1 ->OutputChannels = l2 ->OutputChannels; } // Cat second for (mpe = l2 ->Elements; mpe != NULL; mpe = mpe ->Next) { // We have to dup each element if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe))) return FALSE; } return BlessLUT(l1); } cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On) { cmsBool Anterior = lut ->SaveAs8Bits; lut ->SaveAs8Bits = On; return Anterior; } cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut) { return lut ->Elements; } cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut) { cmsStage *mpe, *Anterior = NULL; for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) Anterior = mpe; return Anterior; } cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut) { cmsStage *mpe; cmsUInt32Number n; for (n=0, mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) n++; return n; } // This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional // duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, _cmsPipelineEval16Fn Eval16, void* PrivateData, _cmsFreeUserDataFn FreePrivateDataFn, _cmsDupUserDataFn DupPrivateDataFn) { Lut ->Eval16Fn = Eval16; Lut ->DupDataFn = DupPrivateDataFn; Lut ->FreeDataFn = FreePrivateDataFn; Lut ->Data = PrivateData; } // ----------------------------------------------------------- Reverse interpolation // Here's how it goes. The derivative Df(x) of the function f is the linear // transformation that best approximates f near the point x. It can be represented // by a matrix A whose entries are the partial derivatives of the components of f // with respect to all the coordinates. This is know as the Jacobian // // The best linear approximation to f is given by the matrix equation: // // y-y0 = A (x-x0) // // So, if x0 is a good "guess" for the zero of f, then solving for the zero of this // linear approximation will give a "better guess" for the zero of f. Thus let y=0, // and since y0=f(x0) one can solve the above equation for x. This leads to the // Newton's method formula: // // xn+1 = xn - A-1 f(xn) // // where xn+1 denotes the (n+1)-st guess, obtained from the n-th guess xn in the // fashion described above. Iterating this will give better and better approximations // if you have a "good enough" initial guess. #define JACOBIAN_EPSILON 0.001f #define INVERSION_MAX_ITERATIONS 30 // Increment with reflexion on boundary static void IncDelta(cmsFloat32Number *Val) { if (*Val < (1.0 - JACOBIAN_EPSILON)) *Val += JACOBIAN_EPSILON; else *Val -= JACOBIAN_EPSILON; } // Euclidean distance between two vectors of n elements each one static cmsFloat32Number EuclideanDistance(cmsFloat32Number a[], cmsFloat32Number b[], int n) { cmsFloat32Number sum = 0; int i; for (i=0; i < n; i++) { cmsFloat32Number dif = b[i] - a[i]; sum += dif * dif; } return sqrtf(sum); } // Evaluate a LUT in reverse direction. It only searches on 3->3 LUT. Uses Newton method // // x1 <- x - [J(x)]^-1 * f(x) // // lut: The LUT on where to do the search // Target: LabK, 3 values of Lab plus destination K which is fixed // Result: The obtained CMYK // Hint: Location where begin the search cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut) { cmsUInt32Number i, j; cmsFloat64Number error, LastError = 1E20; cmsFloat32Number fx[4], x[4], xd[4], fxd[4]; cmsVEC3 tmp, tmp2; cmsMAT3 Jacobian; // Only 3->3 and 4->3 are supported if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE; if (lut ->OutputChannels != 3) return FALSE; // Take the hint as starting point if specified if (Hint == NULL) { // Begin at any point, we choose 1/3 of CMY axis x[0] = x[1] = x[2] = 0.3f; } else { // Only copy 3 channels from hint... for (j=0; j < 3; j++) x[j] = Hint[j]; } // If Lut is 4-dimensions, then grab target[3], which is fixed if (lut ->InputChannels == 4) { x[3] = Target[3]; } else x[3] = 0; // To keep lint happy // Iterate for (i = 0; i < INVERSION_MAX_ITERATIONS; i++) { // Get beginning fx cmsPipelineEvalFloat(x, fx, lut); // Compute error error = EuclideanDistance(fx, Target, 3); // If not convergent, return last safe value if (error >= LastError) break; // Keep latest values LastError = error; for (j=0; j < lut ->InputChannels; j++) Result[j] = x[j]; // Found an exact match? if (error <= 0) break; // Obtain slope (the Jacobian) for (j = 0; j < 3; j++) { xd[0] = x[0]; xd[1] = x[1]; xd[2] = x[2]; xd[3] = x[3]; // Keep fixed channel IncDelta(&xd[j]); cmsPipelineEvalFloat(xd, fxd, lut); Jacobian.v[0].n[j] = ((fxd[0] - fx[0]) / JACOBIAN_EPSILON); Jacobian.v[1].n[j] = ((fxd[1] - fx[1]) / JACOBIAN_EPSILON); Jacobian.v[2].n[j] = ((fxd[2] - fx[2]) / JACOBIAN_EPSILON); } // Solve system tmp2.n[0] = fx[0] - Target[0]; tmp2.n[1] = fx[1] - Target[1]; tmp2.n[2] = fx[2] - Target[2]; if (!_cmsMAT3solve(&tmp, &Jacobian, &tmp2)) return FALSE; // Move our guess x[0] -= (cmsFloat32Number) tmp.n[0]; x[1] -= (cmsFloat32Number) tmp.n[1]; x[2] -= (cmsFloat32Number) tmp.n[2]; // Some clipping.... for (j=0; j < 3; j++) { if (x[j] < 0) x[j] = 0; else if (x[j] > 1.0) x[j] = 1.0; } } return TRUE; } lcms2-2.19.1/src/cmssamp.c0000644000175000017500000004511615176573557014270 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" #define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) #define cmsmax(a, b) (((a) > (b)) ? (a) : (b)) // This file contains routines for resampling and LUT optimization, black point detection // and black preservation. // Black point detection ------------------------------------------------------------------------- // PCS -> PCS round trip transform, always uses relative intent on the device -> pcs static cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); cmsHTRANSFORM xform; cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE }; cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 }; cmsHPROFILE hProfiles[4]; cmsUInt32Number Intents[4]; hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab; Intents[0] = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC; xform = cmsCreateExtendedTransform(ContextID, 4, hProfiles, BPC, Intents, States, NULL, 0, TYPE_Lab_DBL, TYPE_Lab_DBL, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); cmsCloseProfile(hLab); return xform; } // Use darker colorants to obtain black point. This works in the relative colorimetric intent and // assumes more ink results in darker colors. No ink limit is assumed. static cmsBool BlackPointAsDarkerColorant(cmsHPROFILE hInput, cmsUInt32Number Intent, cmsCIEXYZ* BlackPoint, cmsUInt32Number dwFlags) { cmsUInt16Number *Black; cmsHTRANSFORM xform; cmsColorSpaceSignature Space; cmsUInt32Number nChannels; cmsUInt32Number dwFormat; cmsHPROFILE hLab; cmsCIELab Lab; cmsCIEXYZ BlackXYZ; cmsContext ContextID = cmsGetProfileContextID(hInput); // If the profile does not support input direction, assume Black point 0 if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Create a formatter which has n channels and no floating point dwFormat = cmsFormatterForColorspaceOfProfile(hInput, 2, FALSE); // Try to get black by using black colorant Space = cmsGetColorSpace(hInput); // This function returns darker colorant in 16 bits for several spaces if (!_cmsEndPointsBySpace(Space, NULL, &Black, &nChannels)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } if (nChannels != T_CHANNELS(dwFormat)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Lab will be used as the output space, but lab2 will avoid recursion hLab = cmsCreateLab2ProfileTHR(ContextID, NULL); if (hLab == NULL) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Create the transform xform = cmsCreateTransformTHR(ContextID, hInput, dwFormat, hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); cmsCloseProfile(hLab); if (xform == NULL) { // Something went wrong. Get rid of open resources and return zero as black BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Convert black to Lab cmsDoTransform(xform, Black, &Lab, 1); if (Lab.L > 95) Lab.L = 0; // for synthetical negative profiles else if (Lab.L < 0) Lab.L = 0; else if (Lab.L > 50) Lab.L = 50; // Free the resources cmsDeleteTransform(xform); // Convert from Lab (which is now clipped) to XYZ. cmsLab2XYZ(NULL, &BlackXYZ, &Lab); if (BlackPoint != NULL) *BlackPoint = BlackXYZ; return TRUE; cmsUNUSED_PARAMETER(dwFlags); } // Get a black point of output CMYK profile, discounting any ink-limiting embedded // in the profile. For doing that, we use perceptual intent in input direction: // Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab static cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile) { cmsHTRANSFORM hRoundTrip; cmsCIELab LabIn, LabOut; cmsCIEXYZ BlackXYZ; // Is the intent supported by the profile? if (!cmsIsIntentSupported(hProfile, INTENT_PERCEPTUAL, LCMS_USED_AS_INPUT)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return TRUE; } hRoundTrip = CreateRoundtripXForm(hProfile, INTENT_PERCEPTUAL); if (hRoundTrip == NULL) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } LabIn.L = LabIn.a = LabIn.b = 0; cmsDoTransform(hRoundTrip, &LabIn, &LabOut, 1); // Clip Lab to reasonable limits if (LabOut.L > 50) LabOut.L = 50; LabOut.a = LabOut.b = 0; cmsDeleteTransform(hRoundTrip); // Convert it to XYZ cmsLab2XYZ(NULL, &BlackXYZ, &LabOut); if (BlackPoint != NULL) *BlackPoint = BlackXYZ; return TRUE; } static cmsBool isInkColorspace(cmsColorSpaceSignature c) { switch(c) { case cmsSigCmykData: case cmsSigCmyData: case cmsSigMCH1Data: case cmsSigMCH2Data: case cmsSigMCH3Data: case cmsSigMCH4Data: case cmsSigMCH5Data: case cmsSigMCH6Data: case cmsSigMCH7Data: case cmsSigMCH8Data: case cmsSigMCH9Data: case cmsSigMCHAData: case cmsSigMCHBData: case cmsSigMCHCData: case cmsSigMCHDData: case cmsSigMCHEData: case cmsSigMCHFData: case cmsSig1colorData: case cmsSig2colorData: case cmsSig3colorData: case cmsSig4colorData: case cmsSig5colorData: case cmsSig6colorData: case cmsSig7colorData: case cmsSig8colorData: case cmsSig9colorData: case cmsSig10colorData: case cmsSig11colorData: case cmsSig12colorData: case cmsSig13colorData: case cmsSig14colorData: case cmsSig15colorData: return TRUE; default: return FALSE; } } // This function shouldn't exist at all -- there is such quantity of broken // profiles on black point tag, that we must somehow fix chromaticity to // avoid huge tint when doing Black point compensation. This function does // just that. There is a special flag for using black point tag, but turned // off by default because it is bogus on most profiles. The detection algorithm // involves to turn BP to neutral and to use only L component. cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsProfileClassSignature devClass; // Make sure the device class is adequate devClass = cmsGetDeviceClass(hProfile); if (devClass == cmsSigLinkClass || devClass == cmsSigAbstractClass || devClass == cmsSigNamedColorClass) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Make sure intent is adequate if (Intent != INTENT_PERCEPTUAL && Intent != INTENT_RELATIVE_COLORIMETRIC && Intent != INTENT_SATURATION) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // v4 + perceptual & saturation intents does have its own black point, and it is // well specified enough to use it. Black point tag is deprecated in V4. if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) && (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { // Matrix shaper share MRC & perceptual intents if (cmsIsMatrixShaper(hProfile)) return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0); // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents BlackPoint -> X = cmsPERCEPTUAL_BLACK_X; BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y; BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z; return TRUE; } #ifdef CMS_USE_PROFILE_BLACK_POINT_TAG // v2, v4 rel/abs colorimetric if (cmsIsTag(hProfile, cmsSigMediaBlackPointTag) && Intent == INTENT_RELATIVE_COLORIMETRIC) { cmsCIEXYZ *BlackPtr, BlackXYZ, UntrustedBlackPoint, TrustedBlackPoint, MediaWhite; cmsCIELab Lab; // If black point is specified, then use it, BlackPtr = cmsReadTag(hProfile, cmsSigMediaBlackPointTag); if (BlackPtr != NULL) { BlackXYZ = *BlackPtr; _cmsReadMediaWhitePoint(&MediaWhite, hProfile); // Black point is absolute XYZ, so adapt to D50 to get PCS value cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ); // Force a=b=0 to get rid of any chroma cmsXYZ2Lab(NULL, &Lab, &UntrustedBlackPoint); Lab.a = Lab.b = 0; if (Lab.L > 50) Lab.L = 50; // Clip to L* <= 50 cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab); if (BlackPoint != NULL) *BlackPoint = TrustedBlackPoint; return TRUE; } } #endif // That is about v2 profiles. // If output profile, discount ink-limiting and that's all if (Intent == INTENT_RELATIVE_COLORIMETRIC && (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) && (isInkColorspace(cmsGetColorSpace(hProfile)))) return BlackPointUsingPerceptualBlack(BlackPoint, hProfile); // Nope, compute BP using current intent. return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags); } // --------------------------------------------------------------------------------------------------------- // Least Squares Fit of a Quadratic Curve to Data // http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html static cmsFloat64Number RootOfLeastSquaresFitQuadraticCurve(int n, cmsFloat64Number x[], cmsFloat64Number y[]) { double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0; double sum_y = 0, sum_yx = 0, sum_yx2 = 0; double d, a, b, c; int i; cmsMAT3 m; cmsVEC3 v, res; if (n < 4) return 0; for (i=0; i < n; i++) { double xn = x[i]; double yn = y[i]; sum_x += xn; sum_x2 += xn*xn; sum_x3 += xn*xn*xn; sum_x4 += xn*xn*xn*xn; sum_y += yn; sum_yx += yn*xn; sum_yx2 += yn*xn*xn; } _cmsVEC3init(&m.v[0], n, sum_x, sum_x2); _cmsVEC3init(&m.v[1], sum_x, sum_x2, sum_x3); _cmsVEC3init(&m.v[2], sum_x2, sum_x3, sum_x4); _cmsVEC3init(&v, sum_y, sum_yx, sum_yx2); if (!_cmsMAT3solve(&res, &m, &v)) return 0; a = res.n[2]; b = res.n[1]; c = res.n[0]; if (fabs(a) < 1.0E-10) { if (fabs(b) < 1.0E-10) return 0; return cmsmax(0, cmsmin(50, -c/b )); } else { d = b*b - 4.0 * a * c; if (d <= 0) { return 0; } else { double rt; if (fabs(a) < 1.0E-10) return 0; rt = (-b + sqrt(d)) / (2.0 * a); return cmsmax(0, cmsmin(50, rt)); } } } // Calculates the black point of a destination profile. // This algorithm comes from the Adobe paper disclosing its black point compensation method. cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsColorSpaceSignature ColorSpace; cmsHTRANSFORM hRoundTrip = NULL; cmsCIELab InitialLab, destLab, Lab; cmsFloat64Number inRamp[256], outRamp[256]; cmsFloat64Number MinL, MaxL; cmsBool NearlyStraightMidrange = TRUE; cmsFloat64Number yRamp[256]; cmsFloat64Number x[256], y[256]; cmsFloat64Number lo, hi; int n, l; cmsProfileClassSignature devClass; // Make sure the device class is adequate devClass = cmsGetDeviceClass(hProfile); if (devClass == cmsSigLinkClass || devClass == cmsSigAbstractClass || devClass == cmsSigNamedColorClass) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Make sure intent is adequate if (Intent != INTENT_PERCEPTUAL && Intent != INTENT_RELATIVE_COLORIMETRIC && Intent != INTENT_SATURATION) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // v4 + perceptual & saturation intents does have its own black point, and it is // well specified enough to use it. Black point tag is deprecated in V4. if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) && (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { // Matrix shaper share MRC & perceptual intents if (cmsIsMatrixShaper(hProfile)) return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0); // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents BlackPoint -> X = cmsPERCEPTUAL_BLACK_X; BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y; BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z; return TRUE; } // Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document) ColorSpace = cmsGetColorSpace(hProfile); if (!cmsIsCLUT(hProfile, Intent, LCMS_USED_AS_OUTPUT ) || (ColorSpace != cmsSigGrayData && ColorSpace != cmsSigRgbData && !isInkColorspace(ColorSpace))) { // In this case, handle as input case return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags); } // It is one of the valid cases!, use Adobe algorithm // Set a first guess, that should work on good profiles. if (Intent == INTENT_RELATIVE_COLORIMETRIC) { cmsCIEXYZ IniXYZ; // calculate initial Lab as source black point if (!cmsDetectBlackPoint(&IniXYZ, hProfile, Intent, dwFlags)) { return FALSE; } // convert the XYZ to lab cmsXYZ2Lab(NULL, &InitialLab, &IniXYZ); } else { // set the initial Lab to zero, that should be the black point for perceptual and saturation InitialLab.L = 0; InitialLab.a = 0; InitialLab.b = 0; } // Step 2 // ====== // Create a roundtrip. Define a Transform BT for all x in L*a*b* hRoundTrip = CreateRoundtripXForm(hProfile, Intent); if (hRoundTrip == NULL) return FALSE; // Compute ramps for (l=0; l < 256; l++) { Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0; Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a)); Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b)); cmsDoTransform(hRoundTrip, &Lab, &destLab, 1); inRamp[l] = Lab.L; outRamp[l] = destLab.L; } // Make monotonic for (l = 254; l > 0; --l) { outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]); } // Check if (! (outRamp[0] < outRamp[255])) { cmsDeleteTransform(hRoundTrip); BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Test for mid range straight (only on relative colorimetric) NearlyStraightMidrange = TRUE; MinL = outRamp[0]; MaxL = outRamp[255]; if (Intent == INTENT_RELATIVE_COLORIMETRIC) { for (l=0; l < 256; l++) { if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) || (fabs(inRamp[l] - outRamp[l]) < 4.0 ))) NearlyStraightMidrange = FALSE; } // If the mid range is straight (as determined above) then the // DestinationBlackPoint shall be the same as initialLab. // Otherwise, the DestinationBlackPoint shall be determined // using curve fitting. if (NearlyStraightMidrange) { cmsLab2XYZ(NULL, BlackPoint, &InitialLab); cmsDeleteTransform(hRoundTrip); return TRUE; } } // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point, // with a corner and a nearly straight line to the white point. for (l=0; l < 256; l++) { yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL); } // find the black point using the least squares error quadratic curve fitting if (Intent == INTENT_RELATIVE_COLORIMETRIC) { lo = 0.1; hi = 0.5; } else { // Perceptual and saturation lo = 0.03; hi = 0.25; } // Capture shadow points for the fitting. n = 0; for (l=0; l < 256; l++) { cmsFloat64Number ff = yRamp[l]; if (ff >= lo && ff < hi) { x[n] = inRamp[l]; y[n] = yRamp[l]; n++; } } // No suitable points if (n < 3 ) { cmsDeleteTransform(hRoundTrip); BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // fit and get the vertex of quadratic curve Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y); if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative Lab.L = 0; } Lab.a = InitialLab.a; Lab.b = InitialLab.b; cmsLab2XYZ(NULL, BlackPoint, &Lab); cmsDeleteTransform(hRoundTrip); return TRUE; } lcms2-2.19.1/src/cmstypes.c0000644000175000017500000061557715176573557014512 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Tag Serialization ----------------------------------------------------------------------------- // This file implements every single tag and tag type as described in the ICC spec. Some types // have been deprecated, like ncl and Data. There is no implementation for those types as there // are no profiles holding them. The programmer can also extend this list by defining his own types // by using the appropriate plug-in. There are three types of plug ins regarding that. First type // allows to define new tags using any existing type. Next plug-in type allows to define new types // and the third one is very specific: allows to extend the number of elements in the multiprocessing // elements special type. //-------------------------------------------------------------------------------------------------- // Some broken types #define cmsCorbisBrokenXYZtype ((cmsTagTypeSignature) 0x17A505B8) #define cmsMonacoBrokenCurveType ((cmsTagTypeSignature) 0x9478ee00) // This is the linked list that keeps track of the defined types typedef struct _cmsTagTypeLinkedList_st { cmsTagTypeHandler Handler; struct _cmsTagTypeLinkedList_st* Next; } _cmsTagTypeLinkedList; // Some macros to define callbacks. #define READ_FN(x) Type_##x##_Read #define WRITE_FN(x) Type_##x##_Write #define FREE_FN(x) Type_##x##_Free #define DUP_FN(x) Type_##x##_Dup // Helper macro to define a handler. Callbacks do have a fixed naming convention. #define TYPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x), NULL, 0 } // Helper macro to define a MPE handler. Callbacks do have a fixed naming convention #define TYPE_MPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 } // Infinites #define MINUS_INF (-1E22F) #define PLUS_INF (+1E22F) // Register a new type handler. This routine is shared between normal types and MPE. LinkedList points to the optional list head static cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsMemoryClient pos) { cmsPluginTagType* Plugin = (cmsPluginTagType*) Data; _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(id, pos); _cmsTagTypeLinkedList *pt; // Calling the function with NULL as plug-in would unregister the plug in. if (Data == NULL) { // There is no need to set free the memory, as pool is destroyed as a whole. ctx ->TagTypes = NULL; return TRUE; } // Registering happens in plug-in memory pool. pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList)); if (pt == NULL) return FALSE; pt ->Handler = Plugin ->Handler; pt ->Next = ctx ->TagTypes; ctx ->TagTypes = pt; return TRUE; } // Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additions // made by plug-ins and then the built-in defaults. static cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList) { _cmsTagTypeLinkedList* pt; for (pt = PluginLinkedList; pt != NULL; pt = pt ->Next) { if (sig == pt -> Handler.Signature) return &pt ->Handler; } for (pt = DefaultLinkedList; pt != NULL; pt = pt ->Next) { if (sig == pt -> Handler.Signature) return &pt ->Handler; } return NULL; } // Auxiliary to convert UTF-32 to UTF-16 in some cases static cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array) { cmsUInt32Number i; _cmsAssert(io != NULL); _cmsAssert(!(Array == NULL && n > 0)); for (i=0; i < n; i++) { if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Array[i])) return FALSE; } return TRUE; } // Try to promote correctly to wchar_t when 32 bits cmsINLINE cmsBool is_surrogate(cmsUInt32Number uc) { return (uc - 0xd800u) < 2048u; } cmsINLINE cmsBool is_high_surrogate(cmsUInt32Number uc) { return (uc & 0xfffffc00) == 0xd800; } cmsINLINE cmsBool is_low_surrogate(cmsUInt32Number uc) { return (uc & 0xfffffc00) == 0xdc00; } cmsINLINE cmsUInt32Number surrogate_to_utf32(cmsUInt32Number high, cmsUInt32Number low) { return (high << 10) + low - 0x35fdc00; } cmsINLINE cmsBool convert_utf16_to_utf32(cmsIOHANDLER* io, cmsInt32Number n, wchar_t* output) { cmsUInt16Number uc; while (n > 0) { if (!_cmsReadUInt16Number(io, &uc)) return FALSE; n--; if (!is_surrogate(uc)) { *output++ = (wchar_t)uc; } else { cmsUInt16Number low; if (!_cmsReadUInt16Number(io, &low)) return FALSE; n--; if (is_high_surrogate(uc) && is_low_surrogate(low)) *output++ = (wchar_t)surrogate_to_utf32(uc, low); else return FALSE; // Corrupted string, just ignore } } return TRUE; } // Auxiliary to read an array of wchar_t static cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array) { cmsUInt32Number i; cmsUInt16Number tmp; cmsBool is32 = sizeof(wchar_t) > sizeof(cmsUInt16Number); _cmsAssert(io != NULL); if (is32 && Array != NULL) { return convert_utf16_to_utf32(io, n, Array); } for (i=0; i < n; i++) { if (Array != NULL) { if (!_cmsReadUInt16Number(io, &tmp)) return FALSE; Array[i] = (wchar_t) tmp; } else { if (!_cmsReadUInt16Number(io, NULL)) return FALSE; } } return TRUE; } // To deal with position tables typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag); // Helper function to deal with position tables as described in ICC spec 4.3 // A table of n elements is read, where first comes n records containing offsets and sizes and // then a block containing the data itself. This allows to reuse same data in more than one entry static cmsBool ReadPositionTable(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Count, cmsUInt32Number BaseOffset, void *Cargo, PositionTableEntryFn ElementFn) { cmsUInt32Number i; cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL; cmsUInt32Number currentPosition; currentPosition = io->Tell(io); // Verify there is enough space left to read at least two cmsUInt32Number items for Count items. if (((io->ReportedSize - currentPosition) / (2 * sizeof(cmsUInt32Number))) < Count) return FALSE; // Let's take the offsets to each element ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementOffsets == NULL) goto Error; ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementSizes == NULL) goto Error; for (i=0; i < Count; i++) { if (!_cmsReadUInt32Number(io, &ElementOffsets[i])) goto Error; if (!_cmsReadUInt32Number(io, &ElementSizes[i])) goto Error; ElementOffsets[i] += BaseOffset; } // Seek to each element and read it for (i=0; i < Count; i++) { if (!io -> Seek(io, ElementOffsets[i])) goto Error; // This is the reader callback if (!ElementFn(self, io, Cargo, i, ElementSizes[i])) goto Error; } // Success if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return TRUE; Error: if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return FALSE; } // Same as anterior, but for write position tables static cmsBool WritePositionTable(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number SizeOfTag, cmsUInt32Number Count, cmsUInt32Number BaseOffset, void *Cargo, PositionTableEntryFn ElementFn) { cmsUInt32Number i; cmsUInt32Number DirectoryPos, CurrentPos, Before; cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL; // Create table ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementOffsets == NULL) goto Error; ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementSizes == NULL) goto Error; // Keep starting position of curve offsets DirectoryPos = io ->Tell(io); // Write a fake directory to be filled latter on for (i=0; i < Count; i++) { if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size } // Write each element. Keep track of the size as well. for (i=0; i < Count; i++) { Before = io ->Tell(io); ElementOffsets[i] = Before - BaseOffset; // Callback to write... if (!ElementFn(self, io, Cargo, i, SizeOfTag)) goto Error; // Now the size ElementSizes[i] = io ->Tell(io) - Before; } // Write the directory CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) goto Error; for (i=0; i < Count; i++) { if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error; if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error; } if (!io ->Seek(io, CurrentPos)) goto Error; if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return TRUE; Error: if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return FALSE; } // ******************************************************************************** // Type XYZ. Only one value is allowed // ******************************************************************************** //The XYZType contains an array of three encoded values for the XYZ tristimulus //values. Tristimulus values must be non-negative. The signed encoding allows for //implementation optimizations by minimizing the number of fixed formats. static void *Type_XYZ_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsCIEXYZ* xyz; *nItems = 0; xyz = (cmsCIEXYZ*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIEXYZ)); if (xyz == NULL) return NULL; if (!_cmsReadXYZNumber(io, xyz)) { _cmsFree(self ->ContextID, xyz); return NULL; } *nItems = 1; return (void*) xyz; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_XYZ_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { return _cmsWriteXYZNumber(io, (cmsCIEXYZ*) Ptr); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_XYZ_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIEXYZ)); cmsUNUSED_PARAMETER(n); } static void Type_XYZ_Free(struct _cms_typehandler_struct* self, void *Ptr) { _cmsFree(self ->ContextID, Ptr); } static cmsTagTypeSignature DecideXYZtype(cmsFloat64Number ICCVersion, const void *Data) { return cmsSigXYZType; cmsUNUSED_PARAMETER(ICCVersion); cmsUNUSED_PARAMETER(Data); } // ******************************************************************************** // Type chromaticity. Only one value is allowed // ******************************************************************************** // The chromaticity tag type provides basic chromaticity data and type of // phosphors or colorants of a monitor to applications and utilities. static void *Type_Chromaticity_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsCIExyYTRIPLE* chrm; cmsUInt16Number nChans, Table; *nItems = 0; chrm = (cmsCIExyYTRIPLE*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIExyYTRIPLE)); if (chrm == NULL) return NULL; if (!_cmsReadUInt16Number(io, &nChans)) goto Error; // Let's recover from a bug introduced in early versions of lcms1 if (nChans == 0 && SizeOfTag == 32) { if (!_cmsReadUInt16Number(io, NULL)) goto Error; if (!_cmsReadUInt16Number(io, &nChans)) goto Error; } if (nChans != 3) goto Error; if (!_cmsReadUInt16Number(io, &Table)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Red.x)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Red.y)) goto Error; chrm ->Red.Y = 1.0; if (!_cmsRead15Fixed16Number(io, &chrm ->Green.x)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Green.y)) goto Error; chrm ->Green.Y = 1.0; if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.x)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.y)) goto Error; chrm ->Blue.Y = 1.0; *nItems = 1; return (void*) chrm; Error: _cmsFree(self ->ContextID, (void*) chrm); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool SaveOneChromaticity(cmsFloat64Number x, cmsFloat64Number y, cmsIOHANDLER* io) { if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) _cmsDoubleTo15Fixed16(x))) return FALSE; if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) _cmsDoubleTo15Fixed16(y))) return FALSE; return TRUE; } static cmsBool Type_Chromaticity_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsCIExyYTRIPLE* chrm = (cmsCIExyYTRIPLE*) Ptr; if (!_cmsWriteUInt16Number(io, 3)) return FALSE; // nChannels if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Table if (!SaveOneChromaticity(chrm -> Red.x, chrm -> Red.y, io)) return FALSE; if (!SaveOneChromaticity(chrm -> Green.x, chrm -> Green.y, io)) return FALSE; if (!SaveOneChromaticity(chrm -> Blue.x, chrm -> Blue.y, io)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE)); cmsUNUSED_PARAMETER(n); } static void Type_Chromaticity_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigColorantOrderType // ******************************************************************************** // This is an optional tag which specifies the laydown order in which colorants will // be printed on an n-colorant device. The laydown order may be the same as the // channel generation order listed in the colorantTableTag or the channel order of a // colour space such as CMYK, in which case this tag is not needed. When this is not // the case (for example, ink-towers sometimes use the order KCMY), this tag may be // used to specify the laydown order of the colorants. static void *Type_ColorantOrderType_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number* ColorantOrder; cmsUInt32Number Count; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (Count > cmsMAXCHANNELS) return NULL; ColorantOrder = (cmsUInt8Number*) _cmsCalloc(self ->ContextID, cmsMAXCHANNELS, sizeof(cmsUInt8Number)); if (ColorantOrder == NULL) return NULL; // We use FF as end marker memset(ColorantOrder, 0xFF, cmsMAXCHANNELS * sizeof(cmsUInt8Number)); if (io ->Read(io, ColorantOrder, sizeof(cmsUInt8Number), Count) != Count) { _cmsFree(self ->ContextID, (void*) ColorantOrder); return NULL; } *nItems = 1; return (void*) ColorantOrder; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ColorantOrderType_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt8Number* ColorantOrder = (cmsUInt8Number*) Ptr; cmsUInt32Number i, sz, Count; // Get the length for (Count=i=0; i < cmsMAXCHANNELS; i++) { if (ColorantOrder[i] != 0xFF) Count++; } if (!_cmsWriteUInt32Number(io, Count)) return FALSE; sz = Count * sizeof(cmsUInt8Number); if (!io -> Write(io, sz, ColorantOrder)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_ColorantOrderType_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, cmsMAXCHANNELS * sizeof(cmsUInt8Number)); cmsUNUSED_PARAMETER(n); } static void Type_ColorantOrderType_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigUInt8ArrayType // ******************************************************************************** // This type represents an array of generic 1-byte/8-bit quantity. static void* Type_UInt8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number* array; cmsUInt32Number i, n; *nItems = 0; n = SizeOfTag / sizeof(cmsUInt8Number); array = (cmsUInt8Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt8Number)); if (array == NULL) return NULL; for (i = 0; i < n; i++) { if (!_cmsReadUInt8Number(io, &array[i])) { _cmsFree(self->ContextID, array); return NULL; } } *nItems = n; return (void*)array; } static cmsBool Type_UInt8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt8Number* Value = (cmsUInt8Number*)Ptr; cmsUInt32Number i; for (i = 0; i < nItems; i++) { if (!_cmsWriteUInt8Number(io, Value[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } static void* Type_UInt8_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt8Number)); } static void Type_UInt8_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigUInt32ArrayType // ******************************************************************************** // This type represents an array of generic 4-byte/32-bit quantity. static void* Type_UInt32_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number* array; cmsUInt32Number i, n; *nItems = 0; n = SizeOfTag / sizeof(cmsUInt32Number); array = (cmsUInt32Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt32Number)); if (array == NULL) return NULL; for (i = 0; i < n; i++) { if (!_cmsReadUInt32Number(io, &array[i])) { _cmsFree(self->ContextID, array); return NULL; } } *nItems = n; return (void*)array; } static cmsBool Type_UInt32_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number* Value = (cmsUInt32Number*)Ptr; cmsUInt32Number i; for (i = 0; i < nItems; i++) { if (!_cmsWriteUInt32Number(io, Value[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } static void* Type_UInt32_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt32Number)); } static void Type_UInt32_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigUInt64ArrayType // ******************************************************************************** // This type represents an array of generic 8-byte/64-bit quantity. static void* Type_UInt64_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt64Number* array; cmsUInt32Number i, n; *nItems = 0; n = SizeOfTag / sizeof(cmsUInt64Number); array = (cmsUInt64Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt64Number)); if (array == NULL) return NULL; for (i = 0; i < n; i++) { if (!_cmsReadUInt64Number(io, &array[i])) { _cmsFree(self->ContextID, array); return NULL; } } *nItems = n; return (void*)array; } static cmsBool Type_UInt64_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt64Number* Value = (cmsUInt64Number*)Ptr; cmsUInt32Number i; for (i = 0; i < nItems; i++) { if (!_cmsWriteUInt64Number(io, &Value[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } static void* Type_UInt64_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt64Number)); } static void Type_UInt64_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigS15Fixed16ArrayType // ******************************************************************************** // This type represents an array of generic 4-byte/32-bit fixed point quantity. // The number of values is determined from the size of the tag. static void *Type_S15Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsFloat64Number* array_double; cmsUInt32Number i, n; *nItems = 0; n = SizeOfTag / sizeof(cmsUInt32Number); array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number)); if (array_double == NULL) return NULL; for (i=0; i < n; i++) { if (!_cmsRead15Fixed16Number(io, &array_double[i])) { _cmsFree(self ->ContextID, array_double); return NULL; } } *nItems = n; return (void*) array_double; } static cmsBool Type_S15Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsFloat64Number* Value = (cmsFloat64Number*) Ptr; cmsUInt32Number i; for (i=0; i < nItems; i++) { if (!_cmsWrite15Fixed16Number(io, Value[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } static void* Type_S15Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number)); } static void Type_S15Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigU16Fixed16ArrayType // ******************************************************************************** // This type represents an array of generic 4-byte/32-bit quantity. // The number of values is determined from the size of the tag. static void *Type_U16Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsFloat64Number* array_double; cmsUInt32Number v; cmsUInt32Number i, n; *nItems = 0; n = SizeOfTag / sizeof(cmsUInt32Number); array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number)); if (array_double == NULL) return NULL; for (i=0; i < n; i++) { if (!_cmsReadUInt32Number(io, &v)) { _cmsFree(self ->ContextID, (void*) array_double); return NULL; } // Convert to cmsFloat64Number array_double[i] = (cmsFloat64Number) (v / 65536.0); } *nItems = n; return (void*) array_double; } static cmsBool Type_U16Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsFloat64Number* Value = (cmsFloat64Number*) Ptr; cmsUInt32Number i; for (i=0; i < nItems; i++) { cmsUInt32Number v = (cmsUInt32Number) floor(Value[i]*65536.0 + 0.5); if (!_cmsWriteUInt32Number(io, v)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } static void* Type_U16Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number)); } static void Type_U16Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigSignatureType // ******************************************************************************** // // The signatureType contains a four-byte sequence, Sequences of less than four // characters are padded at the end with spaces, 20h. // Typically this type is used for registered tags that can be displayed on many // development systems as a sequence of four characters. static void *Type_Signature_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsSignature* SigPtr = (cmsSignature*) _cmsMalloc(self ->ContextID, sizeof(cmsSignature)); if (SigPtr == NULL) return NULL; if (!_cmsReadUInt32Number(io, SigPtr)) return NULL; *nItems = 1; return SigPtr; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Signature_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsSignature* SigPtr = (cmsSignature*) Ptr; return _cmsWriteUInt32Number(io, *SigPtr); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Signature_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsSignature)); } static void Type_Signature_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigTextType // ******************************************************************************** // // The textType is a simple text structure that contains a 7-bit ASCII text string. // The length of the string is obtained by subtracting 8 from the element size portion // of the tag itself. This string must be terminated with a 00h byte. static void *Type_Text_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { char* Text = NULL; cmsMLU* mlu = NULL; // Create a container mlu = cmsMLUalloc(self ->ContextID, 1); if (mlu == NULL) return NULL; *nItems = 0; // We need to store the "\0" at the end, so +1 if (SizeOfTag == UINT_MAX) goto Error; Text = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1); if (Text == NULL) goto Error; if (io -> Read(io, Text, sizeof(char), SizeOfTag) != SizeOfTag) goto Error; // Make sure text is properly ended Text[SizeOfTag] = 0; *nItems = 1; // Keep the result if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error; _cmsFree(self ->ContextID, Text); return (void*) mlu; Error: if (mlu != NULL) cmsMLUfree(mlu); if (Text != NULL) _cmsFree(self ->ContextID, Text); return NULL; } // The conversion implies to choose a language. So, we choose the actual language. static cmsBool Type_Text_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu = (cmsMLU*) Ptr; cmsUInt32Number size; cmsBool rc; char* Text; // Get the size of the string. Note there is an extra "\0" at the end size = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0); if (size == 0) return FALSE; // Cannot be zero! // Create memory Text = (char*) _cmsMalloc(self ->ContextID, size); if (Text == NULL) return FALSE; cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, size); // Write it, including separator rc = io ->Write(io, size, Text); _cmsFree(self ->ContextID, Text); return rc; cmsUNUSED_PARAMETER(nItems); } static void* Type_Text_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Text_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsMLU* mlu = (cmsMLU*) Ptr; cmsMLUfree(mlu); return; cmsUNUSED_PARAMETER(self); } static cmsTagTypeSignature DecideTextType(cmsFloat64Number ICCVersion, const void *Data) { if (ICCVersion >= 4.0) return cmsSigMultiLocalizedUnicodeType; return cmsSigTextType; cmsUNUSED_PARAMETER(Data); } // ******************************************************************************** // Type cmsSigDataType // ******************************************************************************** // General purpose data type static void *Type_Data_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsICCData* BinData; cmsUInt32Number LenOfData; *nItems = 0; if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; LenOfData = SizeOfTag - sizeof(cmsUInt32Number); if (LenOfData > INT_MAX) return NULL; BinData = (cmsICCData*) _cmsMalloc(self ->ContextID, sizeof(cmsICCData) + LenOfData - 1); if (BinData == NULL) return NULL; BinData ->len = LenOfData; if (!_cmsReadUInt32Number(io, &BinData->flag)) { _cmsFree(self ->ContextID, BinData); return NULL; } if (io -> Read(io, BinData ->data, sizeof(cmsUInt8Number), LenOfData) != LenOfData) { _cmsFree(self ->ContextID, BinData); return NULL; } *nItems = 1; return (void*) BinData; } static cmsBool Type_Data_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsICCData* BinData = (cmsICCData*) Ptr; if (!_cmsWriteUInt32Number(io, BinData ->flag)) return FALSE; return io ->Write(io, BinData ->len, BinData ->data); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Data_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { cmsICCData* BinData = (cmsICCData*) Ptr; return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCData) + BinData ->len - 1); cmsUNUSED_PARAMETER(n); } static void Type_Data_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigTextDescriptionType // ******************************************************************************** static void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { char* Text = NULL; wchar_t* UnicodeString = NULL; cmsMLU* mlu = NULL; cmsUInt32Number AsciiCount; cmsUInt32Number i, UnicodeCode, UnicodeCount; cmsUInt16Number ScriptCodeCode, Dummy; cmsUInt8Number ScriptCodeCount; *nItems = 0; // One dword should be there if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; // Read len of ASCII if (!_cmsReadUInt32Number(io, &AsciiCount)) return NULL; if (AsciiCount > 0x7ffff) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); // Check for size if (SizeOfTag < AsciiCount) return NULL; // All seems Ok, allocate the container mlu = cmsMLUalloc(self ->ContextID, 2); if (mlu == NULL) return NULL; // As many memory as size of tag Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1); if (Text == NULL) goto Error; // Read it if (io ->Read(io, Text, sizeof(char), AsciiCount) != AsciiCount) goto Error; SizeOfTag -= AsciiCount; // Make sure there is a terminator Text[AsciiCount] = 0; // Set the MLU entry. From here we can be tolerant to wrong types if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error; _cmsFree(self ->ContextID, (void*) Text); Text = NULL; // Skip Unicode code if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done; if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done; if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done; SizeOfTag -= 2* sizeof(cmsUInt32Number); if (UnicodeCount == 0 || UnicodeCount > 0x7ffff || SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done; UnicodeString = (wchar_t*)_cmsMallocZero(self->ContextID, (UnicodeCount + 1) * sizeof(wchar_t)); if (UnicodeString == NULL) goto Done; if (!_cmsReadWCharArray(io, UnicodeCount, UnicodeString)) { _cmsFree(self->ContextID, (void*)UnicodeString); goto Done; } UnicodeString[UnicodeCount] = 0; if (!cmsMLUsetWide(mlu, cmsV2Unicode, cmsV2Unicode, UnicodeString)) { _cmsFree(self->ContextID, (void*)UnicodeString); goto Done; } _cmsFree(self->ContextID, (void*)UnicodeString); UnicodeString = NULL; SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number); // Skip ScriptCode code if present. Some buggy profiles does have less // data that strictly required. We need to skip it as this type may come // embedded in other types. if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) { if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done; if (!_cmsReadUInt8Number(io, &ScriptCodeCount)) goto Done; // Skip rest of tag for (i=0; i < 67; i++) { if (!io ->Read(io, &Dummy, sizeof(cmsUInt8Number), 1)) goto Error; } } Done: *nItems = 1; return mlu; Error: if (UnicodeString) _cmsFree(self->ContextID, (void*)UnicodeString); if (Text) _cmsFree(self ->ContextID, (void*) Text); if (mlu) cmsMLUfree(mlu); return NULL; } // This tag can come IN UNALIGNED SIZE. In order to prevent issues, we force zeros on description to align it static cmsBool Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu = (cmsMLU*) Ptr; char *Text = NULL; wchar_t *Wide = NULL; cmsUInt32Number len, len_text, len_tag_requirement, len_aligned; cmsBool rc = FALSE; char Filler[68]; // Used below for writing zeroes memset(Filler, 0, sizeof(Filler)); // Get the len of string len = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0); // Specification ICC.1:2001-04 (v2.4.0): It has been found that textDescriptionType can contain misaligned data //(see clause 4.1 for the definition of 'aligned'). Because the Unicode language // code and Unicode count immediately follow the ASCII description, their // alignment is not correct if the ASCII count is not a multiple of four. The // ScriptCode code is misaligned when the ASCII count is odd. Profile reading and // writing software must be written carefully in order to handle these alignment // problems. // // The above last sentence suggest to handle alignment issues in the // parser. The provided example (Table 69 on Page 60) makes this clear. // The padding only in the ASCII count is not sufficient for a aligned tag // size, with the same text size in ASCII and Unicode. // Null strings if (len <= 0) { Text = (char*) _cmsDupMem(self ->ContextID, "", sizeof(char)); Wide = (wchar_t*) _cmsDupMem(self ->ContextID, L"", sizeof(wchar_t)); } else { // Create independent buffers Text = (char*) _cmsCalloc(self ->ContextID, len, sizeof(char)); if (Text == NULL) goto Error; Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t)); if (Wide == NULL) goto Error; // Get both representations. cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, len * sizeof(char)); cmsMLUgetWide(mlu, cmsV2Unicode, cmsV2Unicode, Wide, len * sizeof(wchar_t)); } // Tell the real text len including the null terminator and padding len_text = (cmsUInt32Number) strlen(Text) + 1; // Compute an total tag size requirement len_tag_requirement = (8+4+len_text+4+4+2*len_text+2+1+67); len_aligned = _cmsALIGNLONG(len_tag_requirement); // * cmsUInt32Number count; * Description length // * cmsInt8Number desc[count] * NULL terminated ascii string // * cmsUInt32Number ucLangCode; * UniCode language code // * cmsUInt32Number ucCount; * UniCode description length // * cmsInt16Number ucDesc[ucCount];* The UniCode description // * cmsUInt16Number scCode; * ScriptCode code // * cmsUInt8Number scCount; * ScriptCode count // * cmsInt8Number scDesc[67]; * ScriptCode Description if (!_cmsWriteUInt32Number(io, len_text)) goto Error; if (!io ->Write(io, len_text, Text)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; // ucLanguageCode if (!_cmsWriteUInt32Number(io, len_text)) goto Error; // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t) if (!_cmsWriteWCharArray(io, len_text, Wide)) goto Error; // ScriptCode Code & count (unused) if (!_cmsWriteUInt16Number(io, 0)) goto Error; if (!_cmsWriteUInt8Number(io, 0)) goto Error; if (!io ->Write(io, 67, Filler)) goto Error; // possibly add pad at the end of tag if (len_aligned > len_tag_requirement) if (!io ->Write(io, len_aligned - len_tag_requirement, Filler)) goto Error; rc = TRUE; Error: if (Text) _cmsFree(self ->ContextID, Text); if (Wide) _cmsFree(self ->ContextID, Wide); return rc; cmsUNUSED_PARAMETER(nItems); } static void* Type_Text_Description_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Text_Description_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsMLU* mlu = (cmsMLU*) Ptr; cmsMLUfree(mlu); return; cmsUNUSED_PARAMETER(self); } static cmsTagTypeSignature DecideTextDescType(cmsFloat64Number ICCVersion, const void *Data) { if (ICCVersion >= 4.0) return cmsSigMultiLocalizedUnicodeType; return cmsSigTextDescriptionType; cmsUNUSED_PARAMETER(Data); } // ******************************************************************************** // Type cmsSigCurveType // ******************************************************************************** static void *Type_Curve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number Count; cmsToneCurve* NewGamma; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; switch (Count) { case 0: // Linear. { cmsFloat64Number SingleGamma = 1.0; NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma); if (!NewGamma) return NULL; *nItems = 1; return NewGamma; } case 1: // Specified as the exponent of gamma function { cmsUInt16Number SingleGammaFixed; cmsFloat64Number SingleGamma; if (!_cmsReadUInt16Number(io, &SingleGammaFixed)) return NULL; SingleGamma = _cms8Fixed8toDouble(SingleGammaFixed); *nItems = 1; return cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma); } default: // Curve if (Count > 0x7FFF) return NULL; // This is to prevent bad guys for doing bad things NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, Count, NULL); if (!NewGamma) return NULL; if (!_cmsReadUInt16Array(io, Count, NewGamma -> Table16)) { cmsFreeToneCurve(NewGamma); return NULL; } *nItems = 1; return NewGamma; } cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Curve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsToneCurve* Curve = (cmsToneCurve*) Ptr; if (Curve ->nSegments == 1 && Curve ->Segments[0].Type == 1) { // Single gamma, preserve number cmsUInt16Number SingleGammaFixed = _cmsDoubleTo8Fixed8(Curve ->Segments[0].Params[0]); if (!_cmsWriteUInt32Number(io, 1)) return FALSE; if (!_cmsWriteUInt16Number(io, SingleGammaFixed)) return FALSE; return TRUE; } if (!_cmsWriteUInt32Number(io, Curve ->nEntries)) return FALSE; return _cmsWriteUInt16Array(io, Curve ->nEntries, Curve ->Table16); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Curve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Curve_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsToneCurve* gamma = (cmsToneCurve*) Ptr; cmsFreeToneCurve(gamma); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigParametricCurveType // ******************************************************************************** // Decide which curve type to use on writing static cmsTagTypeSignature DecideCurveType(cmsFloat64Number ICCVersion, const void *Data) { cmsToneCurve* Curve = (cmsToneCurve*) Data; if (ICCVersion < 4.0) return cmsSigCurveType; if (Curve ->nSegments != 1) return cmsSigCurveType; // Only 1-segment curves can be saved as parametric if (Curve ->Segments[0].Type < 0) return cmsSigCurveType; // Only non-inverted curves if (Curve ->Segments[0].Type > 5) return cmsSigCurveType; // Only ICC parametric curves return cmsSigParametricCurveType; } static void *Type_ParametricCurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { static const int ParamsByType[] = { 1, 3, 4, 5, 7 }; cmsFloat64Number Params[10]; cmsUInt16Number Type; int i, n; cmsToneCurve* NewGamma; if (!_cmsReadUInt16Number(io, &Type)) return NULL; if (!_cmsReadUInt16Number(io, NULL)) return NULL; // Reserved if (Type > 4) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown parametric curve type '%d'", Type); return NULL; } memset(Params, 0, sizeof(Params)); n = ParamsByType[Type]; for (i=0; i < n; i++) { if (!_cmsRead15Fixed16Number(io, &Params[i])) return NULL; } NewGamma = cmsBuildParametricToneCurve(self ->ContextID, Type+1, Params); *nItems = 1; return NewGamma; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ParametricCurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsToneCurve* Curve = (cmsToneCurve*) Ptr; int i, nParams, typen; static const int ParamsByType[] = { 0, 1, 3, 4, 5, 7 }; typen = Curve -> Segments[0].Type; if (Curve ->nSegments > 1 || typen < 1) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Multisegment or Inverted parametric curves cannot be written"); return FALSE; } if (typen > 5) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported parametric curve"); return FALSE; } nParams = ParamsByType[typen]; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) (Curve ->Segments[0].Type - 1))) return FALSE; if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Reserved for (i=0; i < nParams; i++) { if (!_cmsWrite15Fixed16Number(io, Curve -> Segments[0].Params[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_ParametricCurve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ParametricCurve_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsToneCurve* gamma = (cmsToneCurve*) Ptr; cmsFreeToneCurve(gamma); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigDateTimeType // ******************************************************************************** // A 12-byte value representation of the time and date, where the byte usage is assigned // as specified in table 1. The actual values are encoded as 16-bit unsigned integers // (uInt16Number - see 5.1.6). // // All the dateTimeNumber values in a profile shall be in Coordinated Universal Time // (UTC, also known as GMT or ZULU Time). Profile writers are required to convert local // time to UTC when setting these values. Programs that display these values may show // the dateTimeNumber as UTC, show the equivalent local time (at current locale), or // display both UTC and local versions of the dateTimeNumber. static void *Type_DateTime_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsDateTimeNumber timestamp; struct tm * NewDateTime; *nItems = 0; NewDateTime = (struct tm*) _cmsMalloc(self ->ContextID, sizeof(struct tm)); if (NewDateTime == NULL) return NULL; if (io->Read(io, ×tamp, sizeof(cmsDateTimeNumber), 1) != 1) return NULL; _cmsDecodeDateTimeNumber(×tamp, NewDateTime); *nItems = 1; return NewDateTime; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_DateTime_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { struct tm * DateTime = (struct tm*) Ptr; cmsDateTimeNumber timestamp; _cmsEncodeDateTimeNumber(×tamp, DateTime); if (!io ->Write(io, sizeof(cmsDateTimeNumber), ×tamp)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_DateTime_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(struct tm)); cmsUNUSED_PARAMETER(n); } static void Type_DateTime_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type icMeasurementType // ******************************************************************************** /* The measurementType information refers only to the internal profile data and is meant to provide profile makers an alternative to the default measurement specifications. */ static void *Type_Measurement_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsICCMeasurementConditions mc; memset(&mc, 0, sizeof(mc)); if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL; if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL; if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL; if (!_cmsRead15Fixed16Number(io, &mc.Flare)) return NULL; if (!_cmsReadUInt32Number(io, &mc.IlluminantType)) return NULL; *nItems = 1; return _cmsDupMem(self ->ContextID, &mc, sizeof(cmsICCMeasurementConditions)); cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Measurement_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsICCMeasurementConditions* mc =(cmsICCMeasurementConditions*) Ptr; if (!_cmsWriteUInt32Number(io, mc->Observer)) return FALSE; if (!_cmsWriteXYZNumber(io, &mc->Backing)) return FALSE; if (!_cmsWriteUInt32Number(io, mc->Geometry)) return FALSE; if (!_cmsWrite15Fixed16Number(io, mc->Flare)) return FALSE; if (!_cmsWriteUInt32Number(io, mc->IlluminantType)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Measurement_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCMeasurementConditions)); cmsUNUSED_PARAMETER(n); } static void Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigMultiLocalizedUnicodeType // ******************************************************************************** // // Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from // Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be // taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance) // static void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsMLU* mlu; cmsUInt32Number Count, RecLen, NumOfWchar; cmsUInt32Number SizeOfHeader; cmsUInt32Number Len, Offset; cmsUInt32Number i; wchar_t* Block; cmsUInt32Number BeginOfThisString, EndOfThisString, LargestPosition; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (!_cmsReadUInt32Number(io, &RecLen)) return NULL; if (RecLen != 12) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "multiLocalizedUnicodeType of len != 12 is not supported."); return NULL; } mlu = cmsMLUalloc(self ->ContextID, Count); if (mlu == NULL) return NULL; mlu ->UsedEntries = Count; SizeOfHeader = 12 * Count + sizeof(_cmsTagBase); LargestPosition = 0; for (i=0; i < Count; i++) { if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Language)) goto Error; if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Country)) goto Error; // Now deal with Len and offset. if (!_cmsReadUInt32Number(io, &Len)) goto Error; if (!_cmsReadUInt32Number(io, &Offset)) goto Error; // Offset MUST be even because it indexes a block of utf16 chars. // Tricky profiles that uses odd positions will not work anyway // because the whole utf16 block is previously converted to wchar_t // and sizeof this type may be of 4 bytes. On Linux systems, for example. if (Offset & 1) goto Error; // Check for overflow if (Offset < (SizeOfHeader + 8)) goto Error; if (((Offset + Len) < Len) || ((Offset + Len) > SizeOfTag + 8)) goto Error; // True begin of the string BeginOfThisString = Offset - SizeOfHeader - 8; // Adjust to wchar_t elements mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number); mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number); // To guess maximum size, add offset + len EndOfThisString = BeginOfThisString + Len; if (EndOfThisString > LargestPosition) LargestPosition = EndOfThisString; } // Now read the remaining of tag and fill all strings. Subtract the directory SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number); if (SizeOfTag == 0) { Block = NULL; } else { // Make sure this is an even utf16 size. if (SizeOfTag & 1) goto Error; Block = (wchar_t*) _cmsCalloc(self ->ContextID, 1, SizeOfTag); if (Block == NULL) goto Error; NumOfWchar = SizeOfTag / sizeof(wchar_t); if (!_cmsReadWCharArray(io, NumOfWchar, Block)) { _cmsFree(self->ContextID, Block); goto Error; } } mlu ->MemPool = Block; mlu ->PoolSize = SizeOfTag; mlu ->PoolUsed = SizeOfTag; *nItems = 1; return (void*) mlu; Error: if (mlu) cmsMLUfree(mlu); return NULL; } static cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu =(cmsMLU*) Ptr; cmsUInt32Number HeaderSize; cmsUInt32Number Len, Offset; cmsUInt32Number i; if (Ptr == NULL) { // Empty placeholder if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 12)) return FALSE; return TRUE; } if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE; if (!_cmsWriteUInt32Number(io, 12)) return FALSE; HeaderSize = 12 * mlu ->UsedEntries + sizeof(_cmsTagBase); for (i=0; i < mlu ->UsedEntries; i++) { Len = mlu ->Entries[i].Len; Offset = mlu ->Entries[i].StrW; Len = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t); Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8; if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE; if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country)) return FALSE; if (!_cmsWriteUInt32Number(io, Len)) return FALSE; if (!_cmsWriteUInt32Number(io, Offset)) return FALSE; } if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*) mlu ->MemPool)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_MLU_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_MLU_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsMLUfree((cmsMLU*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigLut8Type // ******************************************************************************** // Decide which LUT type to use on writing static cmsTagTypeSignature DecideLUTtypeA2B(cmsFloat64Number ICCVersion, const void *Data) { cmsPipeline* Lut = (cmsPipeline*) Data; if (ICCVersion < 4.0) { if (Lut ->SaveAs8Bits) return cmsSigLut8Type; return cmsSigLut16Type; } else { return cmsSigLutAtoBType; } } static cmsTagTypeSignature DecideLUTtypeB2A(cmsFloat64Number ICCVersion, const void *Data) { cmsPipeline* Lut = (cmsPipeline*) Data; if (ICCVersion < 4.0) { if (Lut ->SaveAs8Bits) return cmsSigLut8Type; return cmsSigLut16Type; } else { return cmsSigLutBtoAType; } } /* This structure represents a colour transform using tables of 8-bit precision. This type contains four processing elements: a 3 by 3 matrix (which shall be the identity matrix unless the input colour space is XYZ), a set of one dimensional input tables, a multidimensional lookup table, and a set of one dimensional output tables. Data is processed using these elements via the following sequence: (matrix) -> (1d input tables) -> (multidimensional lookup table - CLUT) -> (1d output tables) Byte Position Field Length (bytes) Content Encoded as... 8 1 Number of Input Channels (i) uInt8Number 9 1 Number of Output Channels (o) uInt8Number 10 1 Number of CLUT grid points (identical for each side) (g) uInt8Number 11 1 Reserved for padding (fill with 00h) 12..15 4 Encoded e00 parameter s15Fixed16Number */ // Read 8 bit tables as gamma functions static cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, cmsUInt32Number nChannels) { cmsUInt8Number* Temp = NULL; cmsUInt32Number i, j; cmsToneCurve* Tables[cmsMAXCHANNELS]; if (nChannels > cmsMAXCHANNELS) return FALSE; if (nChannels <= 0) return FALSE; memset(Tables, 0, sizeof(Tables)); Temp = (cmsUInt8Number*) _cmsMalloc(ContextID, 256); if (Temp == NULL) return FALSE; for (i=0; i < nChannels; i++) { Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); if (Tables[i] == NULL) goto Error; } for (i=0; i < nChannels; i++) { if (io ->Read(io, Temp, 256, 1) != 1) goto Error; for (j=0; j < 256; j++) Tables[i]->Table16[j] = (cmsUInt16Number) FROM_8_TO_16(Temp[j]); } _cmsFree(ContextID, Temp); Temp = NULL; if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables))) goto Error; for (i=0; i < nChannels; i++) cmsFreeToneCurve(Tables[i]); return TRUE; Error: for (i=0; i < nChannels; i++) { if (Tables[i]) cmsFreeToneCurve(Tables[i]); } if (Temp) _cmsFree(ContextID, Temp); return FALSE; } static cmsBool Write8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsUInt32Number n, _cmsStageToneCurvesData* Tables) { int j; cmsUInt32Number i; cmsUInt8Number val; for (i=0; i < n; i++) { if (Tables) { // Usual case of identity curves if ((Tables ->TheCurves[i]->nEntries == 2) && (Tables->TheCurves[i]->Table16[0] == 0) && (Tables->TheCurves[i]->Table16[1] == 65535)) { for (j=0; j < 256; j++) { if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE; } } else if (Tables ->TheCurves[i]->nEntries != 256) { cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization"); return FALSE; } else for (j=0; j < 256; j++) { val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]); if (!_cmsWriteUInt8Number(io, val)) return FALSE; } } } return TRUE; } // Check overflow static cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b) { cmsUInt32Number rv = 1, rc; if (a == 0) return 0; if (n == 0) return 0; for (; b > 0; b--) { rv *= a; // Check for overflow if (rv > UINT_MAX / a) return (cmsUInt32Number) -1; } rc = rv * n; if (rv != rc / n) return (cmsUInt32Number) -1; return rc; } // That will create a MPE LUT with Matrix, pre tables, CLUT and post tables. // 8 bit lut may be scaled easily to v4 PCS, but we need also to properly adjust // PCS on BToAxx tags and AtoB if abstract. We need to fix input direction. static void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number InputChannels, OutputChannels, CLUTpoints; cmsUInt8Number* Temp = NULL; cmsPipeline* NewLUT = NULL; cmsUInt32Number nTabSize, i; cmsFloat64Number Matrix[3*3]; *nItems = 0; if (!_cmsReadUInt8Number(io, &InputChannels)) goto Error; if (!_cmsReadUInt8Number(io, &OutputChannels)) goto Error; if (!_cmsReadUInt8Number(io, &CLUTpoints)) goto Error; if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least // Padding if (!_cmsReadUInt8Number(io, NULL)) goto Error; // Do some checking if (InputChannels == 0 || InputChannels > cmsMAXCHANNELS) goto Error; if (OutputChannels == 0 || OutputChannels > cmsMAXCHANNELS) goto Error; // Allocates an empty Pipeline NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels); if (NewLUT == NULL) goto Error; // Read the Matrix if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error; // Only operates if not identity... if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL))) goto Error; } // Get input tables if (!Read8bitTables(self ->ContextID, io, NewLUT, InputChannels)) goto Error; // Get 3D CLUT. Check the overflow.... nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); if (nTabSize == (cmsUInt32Number) -1) goto Error; if (nTabSize > 0) { cmsUInt16Number *PtrW, *T; PtrW = T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number)); if (T == NULL) goto Error; Temp = (cmsUInt8Number*) _cmsMalloc(self ->ContextID, nTabSize); if (Temp == NULL) { _cmsFree(self ->ContextID, T); goto Error; } if (io ->Read(io, Temp, nTabSize, 1) != 1) { _cmsFree(self ->ContextID, T); _cmsFree(self ->ContextID, Temp); goto Error; } for (i = 0; i < nTabSize; i++) { *PtrW++ = FROM_8_TO_16(Temp[i]); } _cmsFree(self ->ContextID, Temp); Temp = NULL; if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) { _cmsFree(self ->ContextID, T); goto Error; } _cmsFree(self ->ContextID, T); } // Get output tables if (!Read8bitTables(self ->ContextID, io, NewLUT, OutputChannels)) goto Error; *nItems = 1; return NewLUT; Error: if (NewLUT != NULL) cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin. static cmsBool Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number j, nTabSize, i; cmsUInt8Number val; cmsPipeline* NewLUT = (cmsPipeline*) Ptr; cmsStage* mpe; _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL; _cmsStageMatrixData* MatMPE = NULL; _cmsStageCLutData* clut = NULL; cmsUInt32Number clutPoints; // Disassemble the LUT into components. mpe = NewLUT -> Elements; if (mpe == NULL) { // Should never be empty. Corrupted? cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "empty LUT8 is not supported"); return FALSE; } if (mpe ->Type == cmsSigMatrixElemType) { if (mpe->InputChannels != 3 || mpe->OutputChannels != 3) return FALSE; MatMPE = (_cmsStageMatrixData*) mpe ->Data; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PreMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) { clut = (_cmsStageCLutData*) mpe -> Data; mpe = mpe ->Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PostMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } // That should be all if (mpe != NULL) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT8"); return FALSE; } if (clut == NULL) clutPoints = 0; else { // Lut8 only allows same CLUT points in all dimensions clutPoints = clut->Params->nSamples[0]; for (i = 1; i < cmsPipelineInputChannels(NewLUT); i++) { if (clut->Params->nSamples[i] != clutPoints) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT with different samples per dimension not suitable to be saved as LUT16"); return FALSE; } } } if (!_cmsWriteUInt8Number(io, (cmsUInt8Number)cmsPipelineInputChannels(NewLUT))) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number)cmsPipelineOutputChannels(NewLUT))) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding if (MatMPE != NULL) { for (i = 0; i < 9; i++) { if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; } } else { if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; } // The prelinearization table if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE; nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels); if (nTabSize == (cmsUInt32Number) -1) return FALSE; if (nTabSize > 0) { // The 3D CLUT. if (clut != NULL) { for (j=0; j < nTabSize; j++) { val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]); if (!_cmsWriteUInt8Number(io, val)) return FALSE; } } } // The postlinearization table if (!Write8bitTables(self ->ContextID, io, NewLUT ->OutputChannels, PostMPE)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUT8_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUT8_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigLut16Type // ******************************************************************************** // Read 16 bit tables as gamma functions static cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, cmsUInt32Number nChannels, cmsUInt32Number nEntries) { cmsUInt32Number i; cmsToneCurve* Tables[cmsMAXCHANNELS]; // Maybe an empty table? (this is a lcms extension) if (nEntries <= 0) return TRUE; // Check for malicious profiles if (nEntries < 2) return FALSE; if (nChannels > cmsMAXCHANNELS) return FALSE; // Init table to zero memset(Tables, 0, sizeof(Tables)); for (i=0; i < nChannels; i++) { Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, nEntries, NULL); if (Tables[i] == NULL) goto Error; if (!_cmsReadUInt16Array(io, nEntries, Tables[i]->Table16)) goto Error; } // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code) if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables))) goto Error; for (i=0; i < nChannels; i++) cmsFreeToneCurve(Tables[i]); return TRUE; Error: for (i=0; i < nChannels; i++) { if (Tables[i]) cmsFreeToneCurve(Tables[i]); } return FALSE; } static cmsBool Write16bitTables(cmsContext ContextID, cmsIOHANDLER* io, _cmsStageToneCurvesData* Tables) { cmsUInt32Number j; cmsUInt32Number i; cmsUInt16Number val; cmsUInt32Number nEntries; _cmsAssert(Tables != NULL); for (i=0; i < Tables ->nCurves; i++) { nEntries = Tables->TheCurves[i]->nEntries; for (j=0; j < nEntries; j++) { val = Tables->TheCurves[i]->Table16[j]; if (!_cmsWriteUInt16Number(io, val)) return FALSE; } } return TRUE; cmsUNUSED_PARAMETER(ContextID); } static void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number InputChannels, OutputChannels, CLUTpoints; cmsPipeline* NewLUT = NULL; cmsUInt32Number nTabSize; cmsFloat64Number Matrix[3*3]; cmsUInt16Number InputEntries, OutputEntries; *nItems = 0; if (!_cmsReadUInt8Number(io, &InputChannels)) return NULL; if (!_cmsReadUInt8Number(io, &OutputChannels)) return NULL; if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL; // 255 maximum // Padding if (!_cmsReadUInt8Number(io, NULL)) return NULL; // Do some checking if (InputChannels == 0 || InputChannels > cmsMAXCHANNELS) goto Error; if (OutputChannels == 0 || OutputChannels > cmsMAXCHANNELS) goto Error; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels); if (NewLUT == NULL) goto Error; // Read the Matrix if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error; // Only operates on 3 channels if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL))) goto Error; } if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error; if (!_cmsReadUInt16Number(io, &OutputEntries)) goto Error; if (InputEntries > 0x7FFF || OutputEntries > 0x7FFF) goto Error; if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least // Get input tables if (!Read16bitTables(self ->ContextID, io, NewLUT, InputChannels, InputEntries)) goto Error; // Get 3D CLUT nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); if (nTabSize == (cmsUInt32Number) -1) goto Error; if (nTabSize > 0) { cmsUInt16Number *T; T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number)); if (T == NULL) goto Error; if (!_cmsReadUInt16Array(io, nTabSize, T)) { _cmsFree(self ->ContextID, T); goto Error; } if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) { _cmsFree(self ->ContextID, T); goto Error; } _cmsFree(self ->ContextID, T); } // Get output tables if (!Read16bitTables(self ->ContextID, io, NewLUT, OutputChannels, OutputEntries)) goto Error; *nItems = 1; return NewLUT; Error: if (NewLUT != NULL) cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // We only allow some specific MPE structures: Matrix plus prelin, plus clut, plus post-lin. // Some empty defaults are created for missing parts static cmsBool Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number nTabSize; cmsPipeline* NewLUT = (cmsPipeline*) Ptr; cmsStage* mpe; _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL; _cmsStageMatrixData* MatMPE = NULL; _cmsStageCLutData* clut = NULL; cmsUInt32Number i, InputChannels, OutputChannels, clutPoints; // Disassemble the LUT into components. mpe = NewLUT -> Elements; if (mpe != NULL && mpe ->Type == cmsSigMatrixElemType) { MatMPE = (_cmsStageMatrixData*) mpe ->Data; if (mpe->InputChannels != 3 || mpe->OutputChannels != 3) return FALSE; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PreMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) { clut = (_cmsStageCLutData*) mpe -> Data; mpe = mpe ->Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PostMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } // That should be all if (mpe != NULL) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT16"); return FALSE; } InputChannels = cmsPipelineInputChannels(NewLUT); OutputChannels = cmsPipelineOutputChannels(NewLUT); if (clut == NULL) clutPoints = 0; else { // Lut16 only allows same CLUT points in all dimensions clutPoints = clut->Params->nSamples[0]; for (i = 1; i < InputChannels; i++) { if (clut->Params->nSamples[i] != clutPoints) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT with different samples per dimension not suitable to be saved as LUT16"); return FALSE; } } } if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) InputChannels)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) OutputChannels)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding if (MatMPE != NULL) { for (i = 0; i < 9; i++) { if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; } } else { if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; } if (PreMPE != NULL) { if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE; } else { if (!_cmsWriteUInt16Number(io, 2)) return FALSE; } if (PostMPE != NULL) { if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE; } else { if (!_cmsWriteUInt16Number(io, 2)) return FALSE; } // The prelinearization table if (PreMPE != NULL) { if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE; } else { for (i=0; i < InputChannels; i++) { if (!_cmsWriteUInt16Number(io, 0)) return FALSE; if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE; } } nTabSize = uipow(OutputChannels, clutPoints, InputChannels); if (nTabSize == (cmsUInt32Number) -1) return FALSE; if (nTabSize > 0) { // The 3D CLUT. if (clut != NULL) { if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE; } } // The postlinearization table if (PostMPE != NULL) { if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE; } else { for (i=0; i < OutputChannels; i++) { if (!_cmsWriteUInt16Number(io, 0)) return FALSE; if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE; } } return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUT16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUT16_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigLutAToBType // ******************************************************************************** // V4 stuff. Read matrix for LutAtoB and LutBtoA static cmsStage* ReadMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset) { cmsFloat64Number dMat[3*3]; cmsFloat64Number dOff[3]; cmsStage* Mat; // Go to address if (!io -> Seek(io, Offset)) return NULL; // Read the Matrix if (!_cmsRead15Fixed16Number(io, &dMat[0])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[1])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[2])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[3])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[4])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[5])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[6])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[7])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[8])) return NULL; if (!_cmsRead15Fixed16Number(io, &dOff[0])) return NULL; if (!_cmsRead15Fixed16Number(io, &dOff[1])) return NULL; if (!_cmsRead15Fixed16Number(io, &dOff[2])) return NULL; Mat = cmsStageAllocMatrix(self ->ContextID, 3, 3, dMat, dOff); return Mat; } // V4 stuff. Read CLUT part for LutAtoB and LutBtoA static cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels) { cmsUInt8Number gridPoints8[cmsMAXCHANNELS]; // Number of grid points in each dimension. cmsUInt32Number GridPoints[cmsMAXCHANNELS], i; cmsUInt8Number Precision; cmsStage* CLUT; _cmsStageCLutData* Data; if (!io -> Seek(io, Offset)) return NULL; if (io -> Read(io, gridPoints8, cmsMAXCHANNELS, 1) != 1) return NULL; for (i=0; i < cmsMAXCHANNELS; i++) { if (gridPoints8[i] == 1) return NULL; // Impossible value, 0 for no CLUT and then 2 at least GridPoints[i] = gridPoints8[i]; } if (!_cmsReadUInt8Number(io, &Precision)) return NULL; if (!_cmsReadUInt8Number(io, NULL)) return NULL; if (!_cmsReadUInt8Number(io, NULL)) return NULL; if (!_cmsReadUInt8Number(io, NULL)) return NULL; CLUT = cmsStageAllocCLut16bitGranular(self ->ContextID, GridPoints, InputChannels, OutputChannels, NULL); if (CLUT == NULL) return NULL; Data = (_cmsStageCLutData*) CLUT ->Data; // Precision can be 1 or 2 bytes if (Precision == 1) { cmsUInt8Number v; for (i=0; i < Data ->nEntries; i++) { if (io ->Read(io, &v, sizeof(cmsUInt8Number), 1) != 1) { cmsStageFree(CLUT); return NULL; } Data ->Tab.T[i] = FROM_8_TO_16(v); } } else if (Precision == 2) { if (!_cmsReadUInt16Array(io, Data->nEntries, Data ->Tab.T)) { cmsStageFree(CLUT); return NULL; } } else { cmsStageFree(CLUT); cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); return NULL; } return CLUT; } static cmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io) { cmsTagTypeSignature BaseType; cmsUInt32Number nItems; BaseType = _cmsReadTypeBase(io); switch (BaseType) { case cmsSigCurveType: return (cmsToneCurve*) Type_Curve_Read(self, io, &nItems, 0); case cmsSigParametricCurveType: return (cmsToneCurve*) Type_ParametricCurve_Read(self, io, &nItems, 0); default: { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) BaseType); cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); } return NULL; } } // Read a set of curves from specific offset static cmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number nCurves) { cmsToneCurve* Curves[cmsMAXCHANNELS]; cmsUInt32Number i; cmsStage* Lin = NULL; if (nCurves > cmsMAXCHANNELS) return FALSE; if (!io -> Seek(io, Offset)) return FALSE; for (i=0; i < nCurves; i++) Curves[i] = NULL; for (i=0; i < nCurves; i++) { Curves[i] = ReadEmbeddedCurve(self, io); if (Curves[i] == NULL) goto Error; if (!_cmsReadAlignment(io)) goto Error; } Lin = cmsStageAllocToneCurves(self ->ContextID, nCurves, Curves); Error: for (i=0; i < nCurves; i++) cmsFreeToneCurve(Curves[i]); return Lin; } // LutAtoB type // This structure represents a colour transform. The type contains up to five processing // elements which are stored in the AtoBTag tag in the following order: a set of one // dimensional curves, a 3 by 3 matrix with offset terms, a set of one dimensional curves, // a multidimensional lookup table, and a set of one dimensional output curves. // Data are processed using these elements via the following sequence: // //("A" curves) -> (multidimensional lookup table - CLUT) -> ("M" curves) -> (matrix) -> ("B" curves). // /* It is possible to use any or all of these processing elements. At least one processing element must be included.Only the following combinations are allowed: B M - Matrix - B A - CLUT - B A - CLUT - M - Matrix - B */ static void* Type_LUTA2B_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number BaseOffset; cmsUInt8Number inputChan; // Number of input channels cmsUInt8Number outputChan; // Number of output channels cmsUInt32Number offsetB; // Offset to first "B" curve cmsUInt32Number offsetMat; // Offset to matrix cmsUInt32Number offsetM; // Offset to first "M" curve cmsUInt32Number offsetC; // Offset to CLUT cmsUInt32Number offsetA; // Offset to first "A" curve cmsPipeline* NewLUT = NULL; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!_cmsReadUInt8Number(io, &inputChan)) return NULL; if (!_cmsReadUInt8Number(io, &outputChan)) return NULL; if (!_cmsReadUInt16Number(io, NULL)) return NULL; if (!_cmsReadUInt32Number(io, &offsetB)) return NULL; if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL; if (!_cmsReadUInt32Number(io, &offsetM)) return NULL; if (!_cmsReadUInt32Number(io, &offsetC)) return NULL; if (!_cmsReadUInt32Number(io, &offsetA)) return NULL; if (inputChan == 0 || inputChan >= cmsMAXCHANNELS) return NULL; if (outputChan == 0 || outputChan >= cmsMAXCHANNELS) return NULL; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan); if (NewLUT == NULL) return NULL; if (offsetA!= 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan))) goto Error; } if (offsetC != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan))) goto Error; } if (offsetM != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan))) goto Error; } if (offsetMat != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat))) goto Error; } if (offsetB != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan))) goto Error; } *nItems = 1; return NewLUT; Error: cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Write a set of curves static cmsBool WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsStage* mpe) { cmsUInt32Number i, n; _cmsStageMatrixData* m = (_cmsStageMatrixData*) mpe -> Data; n = mpe->InputChannels * mpe->OutputChannels; // Write the Matrix for (i = 0; i < n; i++) { if (!_cmsWrite15Fixed16Number(io, m->Double[i])) return FALSE; } if (m->Offset != NULL) { for (i = 0; i < mpe->OutputChannels; i++) { if (!_cmsWrite15Fixed16Number(io, m->Offset[i])) return FALSE; } } else { for (i = 0; i < mpe->OutputChannels; i++) { if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; } } return TRUE; cmsUNUSED_PARAMETER(self); } // Write a set of curves static cmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsTagTypeSignature Type, cmsStage* mpe) { cmsUInt32Number i, n; cmsTagTypeSignature CurrentType; cmsToneCurve** Curves; n = cmsStageOutputChannels(mpe); Curves = _cmsStageGetPtrToCurveSet(mpe); for (i=0; i < n; i++) { // If this is a table-based curve, use curve type even on V4 CurrentType = Type; if ((Curves[i] ->nSegments == 0) || // 16 bits tabulated ((Curves[i]->nSegments == 3) && (Curves[i] ->Segments[1].Type == 0)) ) // Floating-point tabulated CurrentType = cmsSigCurveType; else if (Curves[i] ->Segments[0].Type < 0) CurrentType = cmsSigCurveType; if (!_cmsWriteTypeBase(io, CurrentType)) return FALSE; switch (CurrentType) { case cmsSigCurveType: if (!Type_Curve_Write(self, io, Curves[i], 1)) return FALSE; break; case cmsSigParametricCurveType: if (!Type_ParametricCurve_Write(self, io, Curves[i], 1)) return FALSE; break; default: { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) Type); cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); } return FALSE; } if (!_cmsWriteAlignment(io)) return FALSE; } return TRUE; } static cmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt8Number Precision, cmsStage* mpe) { cmsUInt8Number gridPoints[cmsMAXCHANNELS]; // Number of grid points in each dimension. cmsUInt32Number i; _cmsStageCLutData* CLUT = ( _cmsStageCLutData*) mpe -> Data; if (CLUT ->HasFloatValues) { cmsSignalError(self ->ContextID, cmsERROR_NOT_SUITABLE, "Cannot save floating point data, CLUT are 8 or 16 bit only"); return FALSE; } memset(gridPoints, 0, sizeof(gridPoints)); for (i=0; i < (cmsUInt32Number) CLUT ->Params ->nInputs; i++) gridPoints[i] = (cmsUInt8Number) CLUT ->Params ->nSamples[i]; if (!io -> Write(io, cmsMAXCHANNELS*sizeof(cmsUInt8Number), gridPoints)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) Precision)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Precision can be 1 or 2 bytes if (Precision == 1) { for (i=0; i < CLUT->nEntries; i++) { if (!_cmsWriteUInt8Number(io, FROM_16_TO_8(CLUT->Tab.T[i]))) return FALSE; } } else if (Precision == 2) { if (!_cmsWriteUInt16Array(io, CLUT->nEntries, CLUT ->Tab.T)) return FALSE; } else { cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); return FALSE; } if (!_cmsWriteAlignment(io)) return FALSE; return TRUE; } static cmsBool Type_LUTA2B_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsPipeline* Lut = (cmsPipeline*) Ptr; cmsUInt32Number inputChan, outputChan; cmsStage *A = NULL, *B = NULL, *M = NULL; cmsStage * Matrix = NULL; cmsStage * CLUT = NULL; cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0; cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos; // Get the base for all offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (Lut ->Elements != NULL) if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &M, &Matrix, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &A, &CLUT, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &A, &CLUT, &M, &Matrix, &B)) { cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutAToB"); return FALSE; } // Get input, output channels inputChan = cmsPipelineInputChannels(Lut); outputChan = cmsPipelineOutputChannels(Lut); // Write channel count if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE; if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Keep directory to be filled latter DirectoryPos = io ->Tell(io); // Write the directory if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (A != NULL) { offsetA = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE; } if (CLUT != NULL) { offsetC = io ->Tell(io) - BaseOffset; if (!WriteCLUT(self, io, (Lut ->SaveAs8Bits ? 1U : 2U), CLUT)) return FALSE; } if (M != NULL) { offsetM = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE; } if (Matrix != NULL) { offsetMat = io ->Tell(io) - BaseOffset; if (!WriteMatrix(self, io, Matrix)) return FALSE; } if (B != NULL) { offsetB = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE; } CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE; if (!io ->Seek(io, CurrentPos)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUTA2B_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUTA2B_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // LutBToA type static void* Type_LUTB2A_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number inputChan; // Number of input channels cmsUInt8Number outputChan; // Number of output channels cmsUInt32Number BaseOffset; // Actual position in file cmsUInt32Number offsetB; // Offset to first "B" curve cmsUInt32Number offsetMat; // Offset to matrix cmsUInt32Number offsetM; // Offset to first "M" curve cmsUInt32Number offsetC; // Offset to CLUT cmsUInt32Number offsetA; // Offset to first "A" curve cmsPipeline* NewLUT = NULL; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!_cmsReadUInt8Number(io, &inputChan)) return NULL; if (!_cmsReadUInt8Number(io, &outputChan)) return NULL; if (inputChan == 0 || inputChan >= cmsMAXCHANNELS) return NULL; if (outputChan == 0 || outputChan >= cmsMAXCHANNELS) return NULL; // Padding if (!_cmsReadUInt16Number(io, NULL)) return NULL; if (!_cmsReadUInt32Number(io, &offsetB)) return NULL; if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL; if (!_cmsReadUInt32Number(io, &offsetM)) return NULL; if (!_cmsReadUInt32Number(io, &offsetC)) return NULL; if (!_cmsReadUInt32Number(io, &offsetA)) return NULL; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan); if (NewLUT == NULL) return NULL; if (offsetB != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan))) goto Error; } if (offsetMat != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat))) goto Error; } if (offsetM != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan))) goto Error; } if (offsetC != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan))) goto Error; } if (offsetA!= 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan))) goto Error; } *nItems = 1; return NewLUT; Error: cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } /* B B - Matrix - M B - CLUT - A B - Matrix - M - CLUT - A */ static cmsBool Type_LUTB2A_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsPipeline* Lut = (cmsPipeline*) Ptr; cmsUInt32Number inputChan, outputChan; cmsStage *A = NULL, *B = NULL, *M = NULL; cmsStage *Matrix = NULL; cmsStage *CLUT = NULL; cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0; cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &B, &Matrix, &M)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &CLUT, &A)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &Matrix, &M, &CLUT, &A)) { cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutBToA"); return FALSE; } inputChan = cmsPipelineInputChannels(Lut); outputChan = cmsPipelineOutputChannels(Lut); if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE; if (!_cmsWriteUInt16Number(io, 0)) return FALSE; DirectoryPos = io ->Tell(io); if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (A != NULL) { offsetA = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE; } if (CLUT != NULL) { offsetC = io ->Tell(io) - BaseOffset; if (!WriteCLUT(self, io, (Lut ->SaveAs8Bits ? 1U : 2U), CLUT)) return FALSE; } if (M != NULL) { offsetM = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE; } if (Matrix != NULL) { offsetMat = io ->Tell(io) - BaseOffset; if (!WriteMatrix(self, io, Matrix)) return FALSE; } if (B != NULL) { offsetB = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE; } CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE; if (!io ->Seek(io, CurrentPos)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUTB2A_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUTB2A_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigColorantTableType // ******************************************************************************** /* The purpose of this tag is to identify the colorants used in the profile by a unique name and set of XYZ or L*a*b* values to give the colorant an unambiguous value. The first colorant listed is the colorant of the first device channel of a lut tag. The second colorant listed is the colorant of the second device channel of a lut tag, and so on. */ static void *Type_ColorantTable_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number i, Count; cmsNAMEDCOLORLIST* List; char Name[34]; cmsUInt16Number PCS[3]; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (Count > cmsMAXCHANNELS) { cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many colorants '%d'", Count); return NULL; } List = cmsAllocNamedColorList(self ->ContextID, Count, 0, "", ""); if (List == NULL) return NULL; for (i=0; i < Count; i++) { if (io ->Read(io, Name, 32, 1) != 1) goto Error; Name[32] = 0; if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error; if (!cmsAppendNamedColor(List, Name, PCS, NULL)) goto Error; } *nItems = 1; return List; Error: *nItems = 0; cmsFreeNamedColorList(List); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Saves a colorant table. It is using the named color structure for simplicity sake static cmsBool Type_ColorantTable_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr; cmsUInt32Number i, nColors; nColors = cmsNamedColorCount(NamedColorList); if (!_cmsWriteUInt32Number(io, nColors)) return FALSE; for (i=0; i < nColors; i++) { char root[cmsMAX_PATH]; cmsUInt16Number PCS[3]; memset(root, 0, sizeof(root)); if (!cmsNamedColorInfo(NamedColorList, i, root, NULL, NULL, PCS, NULL)) return 0; root[32] = 0; if (!io ->Write(io, 32, root)) return FALSE; if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_ColorantTable_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr; return (void*) cmsDupNamedColorList(nc); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ColorantTable_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigNamedColor2Type // ******************************************************************************** // //The namedColor2Type is a count value and array of structures that provide color //coordinates for 7-bit ASCII color names. For each named color, a PCS and optional //device representation of the color are given. Both representations are 16-bit values. //The device representation corresponds to the header's 'color space of data' field. //This representation should be consistent with the 'number of device components' //field in the namedColor2Type. If this field is 0, device coordinates are not provided. //The PCS representation corresponds to the header's PCS field. The PCS representation //is always provided. Color names are fixed-length, 32-byte fields including null //termination. In order to maintain maximum portability, it is strongly recommended //that special characters of the 7-bit ASCII set not be used. static void *Type_NamedColor_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number vendorFlag; // Bottom 16 bits for ICC use cmsUInt32Number count; // Count of named colors cmsUInt32Number nDeviceCoords; // Num of device coordinates char prefix[32]; // Prefix for each color name char suffix[32]; // Suffix for each color name cmsNAMEDCOLORLIST* v; cmsUInt32Number i; *nItems = 0; if (!_cmsReadUInt32Number(io, &vendorFlag)) return NULL; if (!_cmsReadUInt32Number(io, &count)) return NULL; if (!_cmsReadUInt32Number(io, &nDeviceCoords)) return NULL; if (io -> Read(io, prefix, 32, 1) != 1) return NULL; if (io -> Read(io, suffix, 32, 1) != 1) return NULL; prefix[31] = suffix[31] = 0; v = cmsAllocNamedColorList(self ->ContextID, count, nDeviceCoords, prefix, suffix); if (v == NULL) { cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many named colors '%d'", count); return NULL; } if (nDeviceCoords > cmsMAXCHANNELS) { cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many device coordinates '%d'", nDeviceCoords); goto Error; } for (i=0; i < count; i++) { cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char Root[33]; memset(Colorant, 0, sizeof(Colorant)); if (io -> Read(io, Root, 32, 1) != 1) goto Error; Root[32] = 0; // To prevent exploits if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error; if (!_cmsReadUInt16Array(io, nDeviceCoords, Colorant)) goto Error; if (!cmsAppendNamedColor(v, Root, PCS, Colorant)) goto Error; } *nItems = 1; return (void*) v ; Error: cmsFreeNamedColorList(v); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Saves a named color list into a named color profile static cmsBool Type_NamedColor_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr; char prefix[33]; // Prefix for each color name char suffix[33]; // Suffix for each color name cmsUInt32Number i, nColors; nColors = cmsNamedColorCount(NamedColorList); if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, nColors)) return FALSE; if (!_cmsWriteUInt32Number(io, NamedColorList ->ColorantCount)) return FALSE; memcpy(prefix, (const char*) NamedColorList->Prefix, sizeof(prefix)); memcpy(suffix, (const char*) NamedColorList->Suffix, sizeof(suffix)); suffix[32] = prefix[32] = 0; if (!io ->Write(io, 32, prefix)) return FALSE; if (!io ->Write(io, 32, suffix)) return FALSE; for (i=0; i < nColors; i++) { cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char Root[cmsMAX_PATH]; memset(Root, 0, sizeof(Root)); memset(PCS, 0, sizeof(PCS)); memset(Colorant, 0, sizeof(Colorant)); if (!cmsNamedColorInfo(NamedColorList, i, Root, NULL, NULL, PCS, Colorant)) return 0; Root[32] = 0; if (!io ->Write(io, 32 , Root)) return FALSE; if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE; if (!_cmsWriteUInt16Array(io, NamedColorList ->ColorantCount, Colorant)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_NamedColor_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr; return (void*) cmsDupNamedColorList(nc); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_NamedColor_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigProfileSequenceDescType // ******************************************************************************** // This type is an array of structures, each of which contains information from the // header fields and tags from the original profiles which were combined to create // the final profile. The order of the structures is the order in which the profiles // were combined and includes a structure for the final profile. This provides a // description of the profile sequence from source to destination, // typically used with the DeviceLink profile. static cmsBool ReadEmbeddedText(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU** mlu, cmsUInt32Number SizeOfTag) { cmsTagTypeSignature BaseType; cmsUInt32Number nItems; BaseType = _cmsReadTypeBase(io); switch (BaseType) { case cmsSigTextType: if (*mlu) cmsMLUfree(*mlu); *mlu = (cmsMLU*)Type_Text_Read(self, io, &nItems, SizeOfTag); return (*mlu != NULL); case cmsSigTextDescriptionType: if (*mlu) cmsMLUfree(*mlu); *mlu = (cmsMLU*) Type_Text_Description_Read(self, io, &nItems, SizeOfTag); return (*mlu != NULL); /* TBD: Size is needed for MLU, and we have no idea on which is the available size */ case cmsSigMultiLocalizedUnicodeType: if (*mlu) cmsMLUfree(*mlu); *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, SizeOfTag); return (*mlu != NULL); default: return FALSE; } } static void *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsSEQ* OutSeq; cmsUInt32Number i, Count; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count); if (OutSeq == NULL) return NULL; OutSeq ->n = Count; // Get structures as well for (i=0; i < Count; i++) { cmsPSEQDESC* sec = &OutSeq -> seq[i]; if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) goto Error; if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) goto Error; if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error; if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error; SizeOfTag -= sizeof(cmsUInt64Number); if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error; if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) goto Error; if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) goto Error; } *nItems = 1; return OutSeq; Error: cmsFreeProfileSequenceDescription(OutSeq); return NULL; } // Aux--Embed a text description type. It can be of type text description or multilocalized unicode // and it depends of the version number passed on cmsTagDescriptor structure instead of stack static cmsBool SaveDescription(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* Text) { if (self ->ICCVersion < 0x4000000) { if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE; return Type_Text_Description_Write(self, io, Text, 1); } else { if (!_cmsWriteTypeBase(io, cmsSigMultiLocalizedUnicodeType)) return FALSE; return Type_MLU_Write(self, io, Text, 1); } } static cmsBool Type_ProfileSequenceDesc_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsSEQ* Seq = (cmsSEQ*) Ptr; cmsUInt32Number i; if (!_cmsWriteUInt32Number(io, Seq->n)) return FALSE; for (i=0; i < Seq ->n; i++) { cmsPSEQDESC* sec = &Seq -> seq[i]; if (!_cmsWriteUInt32Number(io, sec ->deviceMfg)) return FALSE; if (!_cmsWriteUInt32Number(io, sec ->deviceModel)) return FALSE; if (!_cmsWriteUInt64Number(io, &sec ->attributes)) return FALSE; if (!_cmsWriteUInt32Number(io, sec ->technology)) return FALSE; if (!SaveDescription(self, io, sec ->Manufacturer)) return FALSE; if (!SaveDescription(self, io, sec ->Model)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_ProfileSequenceDesc_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ProfileSequenceDesc_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigProfileSequenceIdType // ******************************************************************************** /* In certain workflows using ICC Device Link Profiles, it is necessary to identify the original profiles that were combined to create the Device Link Profile. This type is an array of structures, each of which contains information for identification of a profile used in a sequence */ static cmsBool ReadSeqID(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsSEQ* OutSeq = (cmsSEQ*) Cargo; cmsPSEQDESC* seq = &OutSeq ->seq[n]; if (io -> Read(io, seq ->ProfileID.ID8, 16, 1) != 1) return FALSE; if (!ReadEmbeddedText(self, io, &seq ->Description, SizeOfTag)) return FALSE; return TRUE; } static void *Type_ProfileSequenceId_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsSEQ* OutSeq; cmsUInt32Number Count; cmsUInt32Number BaseOffset; *nItems = 0; // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Get table count if (!_cmsReadUInt32Number(io, &Count)) return NULL; // Allocate an empty structure OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count); if (OutSeq == NULL) return NULL; // Read the position table if (!ReadPositionTable(self, io, Count, BaseOffset, OutSeq, ReadSeqID)) { cmsFreeProfileSequenceDescription(OutSeq); return NULL; } // Success *nItems = 1; return OutSeq; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool WriteSeqID(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsSEQ* Seq = (cmsSEQ*) Cargo; if (!io ->Write(io, 16, Seq ->seq[n].ProfileID.ID8)) return FALSE; // Store here the MLU if (!SaveDescription(self, io, Seq ->seq[n].Description)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ProfileSequenceId_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsSEQ* Seq = (cmsSEQ*) Ptr; cmsUInt32Number BaseOffset; // Keep the base offset BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // This is the table count if (!_cmsWriteUInt32Number(io, Seq ->n)) return FALSE; // This is the position table and content if (!WritePositionTable(self, io, 0, Seq ->n, BaseOffset, Seq, WriteSeqID)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_ProfileSequenceId_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ProfileSequenceId_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigUcrBgType // ******************************************************************************** /* This type contains curves representing the under color removal and black generation and a text string which is a general description of the method used for the ucr/bg. */ static void *Type_UcrBg_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUcrBg* n = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg)); cmsUInt32Number CountUcr, CountBg; cmsInt32Number SignedSizeOfTag = (cmsInt32Number)SizeOfTag; char* ASCIIString; *nItems = 0; if (n == NULL) return NULL; // First curve is Under color removal if (SignedSizeOfTag < (cmsInt32Number) sizeof(cmsUInt32Number)) return NULL; if (!_cmsReadUInt32Number(io, &CountUcr)) return NULL; SignedSizeOfTag -= sizeof(cmsUInt32Number); n ->Ucr = cmsBuildTabulatedToneCurve16(self ->ContextID, CountUcr, NULL); if (n ->Ucr == NULL) goto error; if (SignedSizeOfTag < (cmsInt32Number)(CountUcr * sizeof(cmsUInt16Number))) goto error; if (!_cmsReadUInt16Array(io, CountUcr, n ->Ucr->Table16)) goto error; SignedSizeOfTag -= CountUcr * sizeof(cmsUInt16Number); // Second curve is Black generation if (SignedSizeOfTag < (cmsInt32Number)sizeof(cmsUInt32Number)) goto error; if (!_cmsReadUInt32Number(io, &CountBg)) goto error; SignedSizeOfTag -= sizeof(cmsUInt32Number); n ->Bg = cmsBuildTabulatedToneCurve16(self ->ContextID, CountBg, NULL); if (n ->Bg == NULL) goto error; if (SignedSizeOfTag < (cmsInt32Number) (CountBg * sizeof(cmsUInt16Number))) goto error; if (!_cmsReadUInt16Array(io, CountBg, n ->Bg->Table16)) goto error; SignedSizeOfTag -= CountBg * sizeof(cmsUInt16Number); if (SignedSizeOfTag < 0 || SignedSizeOfTag > 32000) goto error; // Now comes the text. The length is specified by the tag size n ->Desc = cmsMLUalloc(self ->ContextID, 1); if (n ->Desc == NULL) goto error; ASCIIString = (char*) _cmsMalloc(self ->ContextID, SignedSizeOfTag + 1); if (io->Read(io, ASCIIString, sizeof(char), SignedSizeOfTag) != (cmsUInt32Number)SignedSizeOfTag) { _cmsFree(self->ContextID, ASCIIString); goto error; } ASCIIString[SignedSizeOfTag] = 0; cmsMLUsetASCII(n ->Desc, cmsNoLanguage, cmsNoCountry, ASCIIString); _cmsFree(self ->ContextID, ASCIIString); *nItems = 1; return (void*) n; error: if (n->Ucr) cmsFreeToneCurve(n->Ucr); if (n->Bg) cmsFreeToneCurve(n->Bg); if (n->Desc) cmsMLUfree(n->Desc); _cmsFree(self->ContextID, n); *nItems = 0; return NULL; } static cmsBool Type_UcrBg_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUcrBg* Value = (cmsUcrBg*) Ptr; cmsUInt32Number TextSize; char* Text; // First curve is Under color removal if (!_cmsWriteUInt32Number(io, Value ->Ucr ->nEntries)) return FALSE; if (!_cmsWriteUInt16Array(io, Value ->Ucr ->nEntries, Value ->Ucr ->Table16)) return FALSE; // Then black generation if (!_cmsWriteUInt32Number(io, Value ->Bg ->nEntries)) return FALSE; if (!_cmsWriteUInt16Array(io, Value ->Bg ->nEntries, Value ->Bg ->Table16)) return FALSE; // Now comes the text. The length is specified by the tag size TextSize = cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, NULL, 0); Text = (char*) _cmsMalloc(self ->ContextID, TextSize); if (cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, Text, TextSize) != TextSize) return FALSE; if (!io ->Write(io, TextSize, Text)) return FALSE; _cmsFree(self ->ContextID, Text); return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_UcrBg_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { cmsUcrBg* Src = (cmsUcrBg*) Ptr; cmsUcrBg* NewUcrBg = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg)); if (NewUcrBg == NULL) return NULL; NewUcrBg ->Bg = cmsDupToneCurve(Src ->Bg); NewUcrBg ->Ucr = cmsDupToneCurve(Src ->Ucr); NewUcrBg ->Desc = cmsMLUdup(Src ->Desc); return (void*) NewUcrBg; cmsUNUSED_PARAMETER(n); } static void Type_UcrBg_Free(struct _cms_typehandler_struct* self, void *Ptr) { cmsUcrBg* Src = (cmsUcrBg*) Ptr; if (Src ->Ucr) cmsFreeToneCurve(Src ->Ucr); if (Src ->Bg) cmsFreeToneCurve(Src ->Bg); if (Src ->Desc) cmsMLUfree(Src ->Desc); _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigCrdInfoType // ******************************************************************************** /* This type contains the PostScript product name to which this profile corresponds and the names of the companion CRDs. Recall that a single profile can generate multiple CRDs. It is implemented as a MLU being the language code "PS" and then country varies for each element: nm: PostScript product name #0: Rendering intent 0 CRD name #1: Rendering intent 1 CRD name #2: Rendering intent 2 CRD name #3: Rendering intent 3 CRD name */ // Auxiliary, read an string specified as count + string static cmsBool ReadCountAndString(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section) { cmsUInt32Number Count; char* Text; if (*SizeOfTag < sizeof(cmsUInt32Number)) return FALSE; if (!_cmsReadUInt32Number(io, &Count)) return FALSE; if (Count > UINT_MAX - sizeof(cmsUInt32Number)) return FALSE; if (*SizeOfTag < Count + sizeof(cmsUInt32Number)) return FALSE; Text = (char*) _cmsMalloc(self ->ContextID, Count+1); if (Text == NULL) return FALSE; if (io ->Read(io, Text, sizeof(cmsUInt8Number), Count) != Count) { _cmsFree(self ->ContextID, Text); return FALSE; } Text[Count] = 0; cmsMLUsetASCII(mlu, "PS", Section, Text); _cmsFree(self ->ContextID, Text); *SizeOfTag -= (Count + sizeof(cmsUInt32Number)); return TRUE; } static cmsBool WriteCountAndString(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, const char* Section) { cmsUInt32Number TextSize; char* Text; TextSize = cmsMLUgetASCII(mlu, "PS", Section, NULL, 0); Text = (char*) _cmsMalloc(self ->ContextID, TextSize); if (!_cmsWriteUInt32Number(io, TextSize)) return FALSE; if (cmsMLUgetASCII(mlu, "PS", Section, Text, TextSize) == 0) return FALSE; if (!io ->Write(io, TextSize, Text)) return FALSE; _cmsFree(self ->ContextID, Text); return TRUE; } static void *Type_CrdInfo_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsMLU* mlu = cmsMLUalloc(self ->ContextID, 5); *nItems = 0; if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "nm")) goto Error; if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#0")) goto Error; if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#1")) goto Error; if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#2")) goto Error; if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#3")) goto Error; *nItems = 1; return (void*) mlu; Error: cmsMLUfree(mlu); return NULL; } static cmsBool Type_CrdInfo_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu = (cmsMLU*) Ptr; if (!WriteCountAndString(self, io, mlu, "nm")) goto Error; if (!WriteCountAndString(self, io, mlu, "#0")) goto Error; if (!WriteCountAndString(self, io, mlu, "#1")) goto Error; if (!WriteCountAndString(self, io, mlu, "#2")) goto Error; if (!WriteCountAndString(self, io, mlu, "#3")) goto Error; return TRUE; Error: return FALSE; cmsUNUSED_PARAMETER(nItems); } static void* Type_CrdInfo_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_CrdInfo_Free(struct _cms_typehandler_struct* self, void *Ptr) { cmsMLUfree((cmsMLU*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigScreeningType // ******************************************************************************** // //The screeningType describes various screening parameters including screen //frequency, screening angle, and spot shape. static void *Type_Screening_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsScreening* sc = NULL; cmsUInt32Number i; sc = (cmsScreening*) _cmsMallocZero(self ->ContextID, sizeof(cmsScreening)); if (sc == NULL) return NULL; *nItems = 0; if (!_cmsReadUInt32Number(io, &sc ->Flag)) goto Error; if (!_cmsReadUInt32Number(io, &sc ->nChannels)) goto Error; if (sc ->nChannels > cmsMAXCHANNELS - 1) sc ->nChannels = cmsMAXCHANNELS - 1; for (i=0; i < sc ->nChannels; i++) { if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].Frequency)) goto Error; if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].ScreenAngle)) goto Error; if (!_cmsReadUInt32Number(io, &sc ->Channels[i].SpotShape)) goto Error; } *nItems = 1; return (void*) sc; Error: if (sc != NULL) _cmsFree(self ->ContextID, sc); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Screening_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsScreening* sc = (cmsScreening* ) Ptr; cmsUInt32Number i; if (!_cmsWriteUInt32Number(io, sc ->Flag)) return FALSE; if (!_cmsWriteUInt32Number(io, sc ->nChannels)) return FALSE; for (i=0; i < sc ->nChannels; i++) { if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].Frequency)) return FALSE; if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].ScreenAngle)) return FALSE; if (!_cmsWriteUInt32Number(io, sc ->Channels[i].SpotShape)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Screening_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening)); cmsUNUSED_PARAMETER(n); } static void Type_Screening_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigViewingConditionsType // ******************************************************************************** // //This type represents a set of viewing condition parameters including: //CIE 'absolute' illuminant white point tristimulus values and CIE 'absolute' //surround tristimulus values. static void *Type_ViewingConditions_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsICCViewingConditions* vc = NULL; vc = (cmsICCViewingConditions*) _cmsMallocZero(self ->ContextID, sizeof(cmsICCViewingConditions)); if (vc == NULL) return NULL; *nItems = 0; if (!_cmsReadXYZNumber(io, &vc ->IlluminantXYZ)) goto Error; if (!_cmsReadXYZNumber(io, &vc ->SurroundXYZ)) goto Error; if (!_cmsReadUInt32Number(io, &vc ->IlluminantType)) goto Error; *nItems = 1; return (void*) vc; Error: if (vc != NULL) _cmsFree(self ->ContextID, vc); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ViewingConditions_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsICCViewingConditions* sc = (cmsICCViewingConditions* ) Ptr; if (!_cmsWriteXYZNumber(io, &sc ->IlluminantXYZ)) return FALSE; if (!_cmsWriteXYZNumber(io, &sc ->SurroundXYZ)) return FALSE; if (!_cmsWriteUInt32Number(io, sc ->IlluminantType)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_ViewingConditions_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self->ContextID, Ptr, sizeof(cmsICCViewingConditions)); cmsUNUSED_PARAMETER(n); } static void Type_ViewingConditions_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigMultiProcessElementType // ******************************************************************************** static void* GenericMPEdup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsStageDup((cmsStage*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void GenericMPEfree(struct _cms_typehandler_struct* self, void *Ptr) { cmsStageFree((cmsStage*) Ptr); return; cmsUNUSED_PARAMETER(self); } // Each curve is stored in one or more curve segments, with break-points specified between curve segments. // The first curve segment always starts at -Infinity, and the last curve segment always ends at +Infinity. The // first and last curve segments shall be specified in terms of a formula, whereas the other segments shall be // specified either in terms of a formula, or by a sampled curve. // Read an embedded segmented curve static cmsToneCurve* ReadSegmentedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io) { cmsCurveSegSignature ElementSig; cmsUInt32Number i, j; cmsUInt16Number nSegments; cmsCurveSegment* Segments; cmsToneCurve* Curve; cmsFloat32Number PrevBreak = MINUS_INF; // - infinite // Take signature and channels for each element. if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return NULL; // That should be a segmented curve if (ElementSig != cmsSigSegmentedCurve) return NULL; if (!_cmsReadUInt32Number(io, NULL)) return NULL; if (!_cmsReadUInt16Number(io, &nSegments)) return NULL; if (!_cmsReadUInt16Number(io, NULL)) return NULL; if (nSegments < 1) return NULL; Segments = (cmsCurveSegment*) _cmsCalloc(self ->ContextID, nSegments, sizeof(cmsCurveSegment)); if (Segments == NULL) return NULL; // Read breakpoints for (i=0; i < (cmsUInt32Number) nSegments - 1; i++) { Segments[i].x0 = PrevBreak; if (!_cmsReadFloat32Number(io, &Segments[i].x1)) goto Error; PrevBreak = Segments[i].x1; } Segments[nSegments-1].x0 = PrevBreak; Segments[nSegments-1].x1 = PLUS_INF; // A big cmsFloat32Number number // Read segments for (i=0; i < nSegments; i++) { if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) goto Error; if (!_cmsReadUInt32Number(io, NULL)) goto Error; switch (ElementSig) { case cmsSigFormulaCurveSeg: { cmsUInt16Number Type; cmsUInt32Number ParamsByType[] = { 4, 5, 5 }; if (!_cmsReadUInt16Number(io, &Type)) goto Error; if (!_cmsReadUInt16Number(io, NULL)) goto Error; Segments[i].Type = Type + 6; if (Type > 2) goto Error; for (j = 0; j < ParamsByType[Type]; j++) { cmsFloat32Number f; if (!_cmsReadFloat32Number(io, &f)) goto Error; Segments[i].Params[j] = f; } } break; case cmsSigSampledCurveSeg: { cmsUInt32Number Count; if (!_cmsReadUInt32Number(io, &Count)) goto Error; // The first point is implicit in the last stage, we allocate an extra note to be populated latter on Count++; Segments[i].nGridPoints = Count; Segments[i].SampledPoints = (cmsFloat32Number*)_cmsCalloc(self->ContextID, Count, sizeof(cmsFloat32Number)); if (Segments[i].SampledPoints == NULL) goto Error; Segments[i].SampledPoints[0] = 0; for (j = 1; j < Count; j++) { if (!_cmsReadFloat32Number(io, &Segments[i].SampledPoints[j])) goto Error; } } break; default: { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve element type '%s' found.", String); } goto Error; } } Curve = cmsBuildSegmentedToneCurve(self ->ContextID, nSegments, Segments); for (i=0; i < nSegments; i++) { if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints); } _cmsFree(self ->ContextID, Segments); // Explore for missing implicit points for (i = 0; i < nSegments; i++) { // If sampled curve, fix it if (Curve->Segments[i].Type == 0) { Curve->Segments[i].SampledPoints[0] = cmsEvalToneCurveFloat(Curve, Curve->Segments[i].x0); } } return Curve; Error: if (Segments) { for (i=0; i < nSegments; i++) { if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints); } _cmsFree(self ->ContextID, Segments); } return NULL; } static cmsBool ReadMPECurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsToneCurve** GammaTables = ( cmsToneCurve**) Cargo; GammaTables[n] = ReadSegmentedCurve(self, io); return (GammaTables[n] != NULL); cmsUNUSED_PARAMETER(SizeOfTag); } static void *Type_MPEcurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsStage* mpe = NULL; cmsUInt16Number InputChans, OutputChans; cmsUInt32Number i, BaseOffset; cmsToneCurve** GammaTables; *nItems = 0; // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; if (InputChans != OutputChans) return NULL; GammaTables = (cmsToneCurve**) _cmsCalloc(self ->ContextID, InputChans, sizeof(cmsToneCurve*)); if (GammaTables == NULL) return NULL; if (ReadPositionTable(self, io, InputChans, BaseOffset, GammaTables, ReadMPECurve)) { mpe = cmsStageAllocToneCurves(self ->ContextID, InputChans, GammaTables); } else { mpe = NULL; } for (i=0; i < InputChans; i++) { if (GammaTables[i]) cmsFreeToneCurve(GammaTables[i]); } _cmsFree(self ->ContextID, GammaTables); *nItems = (mpe != NULL) ? 1U : 0; return mpe; cmsUNUSED_PARAMETER(SizeOfTag); } // Write a single segmented curve. NO CHECK IS PERFORMED ON VALIDITY static cmsBool WriteSegmentedCurve(cmsIOHANDLER* io, cmsToneCurve* g) { cmsUInt32Number i, j; cmsCurveSegment* Segments = g ->Segments; cmsUInt32Number nSegments = g ->nSegments; if (!_cmsWriteUInt32Number(io, cmsSigSegmentedCurve)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) nSegments)) goto Error; if (!_cmsWriteUInt16Number(io, 0)) goto Error; // Write the break-points for (i=0; i < nSegments - 1; i++) { if (!_cmsWriteFloat32Number(io, Segments[i].x1)) goto Error; } // Write the segments for (i=0; i < g ->nSegments; i++) { cmsCurveSegment* ActualSeg = Segments + i; if (ActualSeg -> Type == 0) { // This is a sampled curve. First point is implicit in the ICC format, but not in our representation if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigSampledCurveSeg)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; if (!_cmsWriteUInt32Number(io, ActualSeg -> nGridPoints - 1)) goto Error; for (j=1; j < g ->Segments[i].nGridPoints; j++) { if (!_cmsWriteFloat32Number(io, ActualSeg -> SampledPoints[j])) goto Error; } } else { int Type; cmsUInt32Number ParamsByType[] = { 4, 5, 5 }; // This is a formula-based if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigFormulaCurveSeg)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; // We only allow 1, 2 and 3 as types Type = ActualSeg ->Type - 6; if (Type > 2 || Type < 0) goto Error; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Type)) goto Error; if (!_cmsWriteUInt16Number(io, 0)) goto Error; for (j=0; j < ParamsByType[Type]; j++) { if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) ActualSeg ->Params[j])) goto Error; } } // It seems there is no need to align. Code is here, and for safety commented out // if (!_cmsWriteAlignment(io)) goto Error; } return TRUE; Error: return FALSE; } static cmsBool WriteMPECurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) Cargo; return WriteSegmentedCurve(io, Curves ->TheCurves[n]); cmsUNUSED_PARAMETER(SizeOfTag); cmsUNUSED_PARAMETER(self); } // Write a curve, checking first for validity static cmsBool Type_MPEcurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number BaseOffset; cmsStage* mpe = (cmsStage*) Ptr; _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) mpe ->Data; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Write the header. Since those are curves, input and output channels are same if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!WritePositionTable(self, io, 0, mpe ->InputChannels, BaseOffset, Curves, WriteMPECurve)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } // The matrix is organized as an array of PxQ+Q elements, where P is the number of input channels to the // matrix, and Q is the number of output channels. The matrix elements are each float32Numbers. The array // is organized as follows: // array = [e11, e12, ..., e1P, e21, e22, ..., e2P, ..., eQ1, eQ2, ..., eQP, e1, e2, ..., eQ] static void *Type_MPEmatrix_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsStage* mpe; cmsUInt16Number InputChans, OutputChans; cmsUInt32Number nElems, i; cmsFloat64Number* Matrix; cmsFloat64Number* Offsets; if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; // Input and output chans may be ANY (up to 0xffff), // but we choose to limit to 16 channels for now if (InputChans >= cmsMAXCHANNELS) return NULL; if (OutputChans >= cmsMAXCHANNELS) return NULL; nElems = (cmsUInt32Number) InputChans * OutputChans; Matrix = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, nElems, sizeof(cmsFloat64Number)); if (Matrix == NULL) return NULL; Offsets = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, OutputChans, sizeof(cmsFloat64Number)); if (Offsets == NULL) { _cmsFree(self ->ContextID, Matrix); return NULL; } for (i=0; i < nElems; i++) { cmsFloat32Number v; if (!_cmsReadFloat32Number(io, &v)) { _cmsFree(self ->ContextID, Matrix); _cmsFree(self ->ContextID, Offsets); return NULL; } Matrix[i] = v; } for (i=0; i < OutputChans; i++) { cmsFloat32Number v; if (!_cmsReadFloat32Number(io, &v)) { _cmsFree(self ->ContextID, Matrix); _cmsFree(self ->ContextID, Offsets); return NULL; } Offsets[i] = v; } mpe = cmsStageAllocMatrix(self ->ContextID, OutputChans, InputChans, Matrix, Offsets); _cmsFree(self ->ContextID, Matrix); _cmsFree(self ->ContextID, Offsets); *nItems = 1; return mpe; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_MPEmatrix_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number i, nElems; cmsStage* mpe = (cmsStage*) Ptr; _cmsStageMatrixData* Matrix = (_cmsStageMatrixData*) mpe ->Data; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE; nElems = mpe ->InputChannels * mpe ->OutputChannels; for (i=0; i < nElems; i++) { if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Double[i])) return FALSE; } for (i=0; i < mpe ->OutputChannels; i++) { if (Matrix ->Offset == NULL) { if (!_cmsWriteFloat32Number(io, 0)) return FALSE; } else { if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Offset[i])) return FALSE; } } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void *Type_MPEclut_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsStage* mpe = NULL; cmsUInt16Number InputChans, OutputChans; cmsUInt8Number Dimensions8[16]; cmsUInt32Number i, nMaxGrids, GridPoints[MAX_INPUT_DIMENSIONS]; _cmsStageCLutData* clut; if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; if (InputChans == 0 || InputChans >= cmsMAXCHANNELS) goto Error; if (OutputChans == 0 || OutputChans >= cmsMAXCHANNELS) goto Error; if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16) goto Error; // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number nMaxGrids = InputChans > MAX_INPUT_DIMENSIONS ? (cmsUInt32Number) MAX_INPUT_DIMENSIONS : InputChans; for (i = 0; i < nMaxGrids; i++) { if (Dimensions8[i] == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least GridPoints[i] = (cmsUInt32Number)Dimensions8[i]; } // Allocate the true CLUT mpe = cmsStageAllocCLutFloatGranular(self ->ContextID, GridPoints, InputChans, OutputChans, NULL); if (mpe == NULL) goto Error; // Read and sanitize the data clut = (_cmsStageCLutData*) mpe ->Data; for (i=0; i < clut ->nEntries; i++) { if (!_cmsReadFloat32Number(io, &clut->Tab.TFloat[i])) goto Error; } *nItems = 1; return mpe; Error: *nItems = 0; if (mpe != NULL) cmsStageFree(mpe); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Write a CLUT in floating point static cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt8Number Dimensions8[16]; // 16 because the spec says 16 and not max number of channels cmsUInt32Number i; cmsStage* mpe = (cmsStage*) Ptr; _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data; // Check for maximum number of channels supported by lcms if (mpe -> InputChannels > MAX_INPUT_DIMENSIONS) return FALSE; // Only floats are supported in MPE if (clut ->HasFloatValues == FALSE) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE; memset(Dimensions8, 0, sizeof(Dimensions8)); for (i=0; i < mpe ->InputChannels; i++) Dimensions8[i] = (cmsUInt8Number) clut ->Params ->nSamples[i]; if (!io ->Write(io, 16, Dimensions8)) return FALSE; for (i=0; i < clut ->nEntries; i++) { if (!_cmsWriteFloat32Number(io, clut ->Tab.TFloat[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } // This is the list of built-in MPE types static _cmsTagTypeLinkedList SupportedMPEtypes[] = { {{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] }, // Ignore those elements for now {{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] }, // (That's what the spec says) {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCurveSetElemType, MPEcurve), &SupportedMPEtypes[3] }, {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigMatrixElemType, MPEmatrix), &SupportedMPEtypes[4] }, {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCLutElemType, MPEclut), NULL }, }; _cmsTagTypePluginChunkType _cmsMPETypePluginChunk = { NULL }; static cmsBool ReadMPEElem(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsStageSignature ElementSig; cmsTagTypeHandler* TypeHandler; cmsUInt32Number nItems; cmsPipeline *NewLUT = (cmsPipeline *) Cargo; _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); // Take signature and channels for each element. if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return FALSE; // The reserved placeholder if (!_cmsReadUInt32Number(io, NULL)) return FALSE; // Read diverse MPE types TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk ->TagTypes, SupportedMPEtypes); if (TypeHandler == NULL) { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); // An unknown element was found. cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown MPE type '%s' found.", String); return FALSE; } // If no read method, just ignore the element (valid for cmsSigBAcsElemType and cmsSigEAcsElemType) // Read the MPE. No size is given if (TypeHandler ->ReadPtr != NULL) { // This is a real element which should be read and processed if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag))) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(n); } // This is the main dispatcher for MPE static void *Type_MPE_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt16Number InputChans, OutputChans; cmsUInt32Number ElementCount; cmsPipeline *NewLUT = NULL; cmsUInt32Number BaseOffset; // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Read channels and element count if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; if (InputChans == 0 || InputChans >= cmsMAXCHANNELS) return NULL; if (OutputChans == 0 || OutputChans >= cmsMAXCHANNELS) return NULL; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, InputChans, OutputChans); if (NewLUT == NULL) return NULL; if (!_cmsReadUInt32Number(io, &ElementCount)) goto Error; if (!ReadPositionTable(self, io, ElementCount, BaseOffset, NewLUT, ReadMPEElem)) goto Error; // Check channel count if (InputChans != NewLUT->InputChannels || OutputChans != NewLUT->OutputChannels) goto Error; // Success *nItems = 1; return NewLUT; // Error Error: if (NewLUT != NULL) cmsPipelineFree(NewLUT); *nItems = 0; return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // This one is a little bit more complex, so we don't use position tables this time. static cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number i, BaseOffset, DirectoryPos, CurrentPos; cmsUInt32Number inputChan, outputChan; cmsUInt32Number ElemCount; cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL, Before; cmsStageSignature ElementSig; cmsPipeline* Lut = (cmsPipeline*) Ptr; cmsStage* Elem = Lut ->Elements; cmsTagTypeHandler* TypeHandler; _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); inputChan = cmsPipelineInputChannels(Lut); outputChan = cmsPipelineOutputChannels(Lut); ElemCount = cmsPipelineStageCount(Lut); ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number)); if (ElementOffsets == NULL) goto Error; ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number)); if (ElementSizes == NULL) goto Error; // Write the head if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) inputChan)) goto Error; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) outputChan)) goto Error; if (!_cmsWriteUInt32Number(io, (cmsUInt16Number) ElemCount)) goto Error; DirectoryPos = io ->Tell(io); // Write a fake directory to be filled latter on for (i=0; i < ElemCount; i++) { if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size } // Write each single tag. Keep track of the size as well. for (i=0; i < ElemCount; i++) { ElementOffsets[i] = io ->Tell(io) - BaseOffset; ElementSig = Elem ->Type; TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk->TagTypes, SupportedMPEtypes); if (TypeHandler == NULL) { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); // An unknown element was found. cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Found unknown MPE type '%s'", String); goto Error; } Before = io ->Tell(io); if (!_cmsWriteUInt32Number(io, ElementSig)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; if (!TypeHandler ->WritePtr(self, io, Elem, 1)) goto Error; if (!_cmsWriteAlignment(io)) goto Error; ElementSizes[i] = io ->Tell(io) - Before; Elem = Elem ->Next; } // Write the directory CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) goto Error; for (i=0; i < ElemCount; i++) { if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error; if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error; } if (!io ->Seek(io, CurrentPos)) goto Error; if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes); return TRUE; Error: if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes); return FALSE; cmsUNUSED_PARAMETER(nItems); } static void* Type_MPE_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_MPE_Free(struct _cms_typehandler_struct* self, void *Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigVcgtType // ******************************************************************************** #define cmsVideoCardGammaTableType 0 #define cmsVideoCardGammaFormulaType 1 // Used internally typedef struct { double Gamma; double Min; double Max; } _cmsVCGTGAMMA; static void *Type_vcgt_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number TagType, n, i; cmsToneCurve** Curves; *nItems = 0; // Read tag type if (!_cmsReadUInt32Number(io, &TagType)) return NULL; // Allocate space for the array Curves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); if (Curves == NULL) return NULL; // There are two possible flavors switch (TagType) { // Gamma is stored as a table case cmsVideoCardGammaTableType: { cmsUInt16Number nChannels, nElems, nBytes; // Check channel count, which should be 3 (we don't support monochrome this time) if (!_cmsReadUInt16Number(io, &nChannels)) goto Error; if (nChannels != 3) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported number of channels for VCGT '%d'", nChannels); goto Error; } // Get Table element count and bytes per element if (!_cmsReadUInt16Number(io, &nElems)) goto Error; if (!_cmsReadUInt16Number(io, &nBytes)) goto Error; // Adobe's quirk fixup. Fixing broken profiles... if (nElems == 256 && nBytes == 1 && SizeOfTag == 1576) nBytes = 2; // Populate tone curves for (n=0; n < 3; n++) { Curves[n] = cmsBuildTabulatedToneCurve16(self ->ContextID, nElems, NULL); if (Curves[n] == NULL) goto Error; // On depending on byte depth switch (nBytes) { // One byte, 0..255 case 1: for (i=0; i < nElems; i++) { cmsUInt8Number v; if (!_cmsReadUInt8Number(io, &v)) goto Error; Curves[n] ->Table16[i] = FROM_8_TO_16(v); } break; // One word 0..65535 case 2: if (!_cmsReadUInt16Array(io, nElems, Curves[n]->Table16)) goto Error; break; // Unsupported default: cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported bit depth for VCGT '%d'", nBytes * 8); goto Error; } } // For all 3 channels } break; // In this case, gamma is stored as a formula case cmsVideoCardGammaFormulaType: { _cmsVCGTGAMMA Colorant[3]; // Populate tone curves for (n=0; n < 3; n++) { double Params[10]; if (!_cmsRead15Fixed16Number(io, &Colorant[n].Gamma)) goto Error; if (!_cmsRead15Fixed16Number(io, &Colorant[n].Min)) goto Error; if (!_cmsRead15Fixed16Number(io, &Colorant[n].Max)) goto Error; // Parametric curve type 5 is: // Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | X < d // vcgt formula is: // Y = (Max - Min) * (X ^ Gamma) + Min // So, the translation is // a = (Max - Min) ^ ( 1 / Gamma) // e = Min // b=c=d=f=0 Params[0] = Colorant[n].Gamma; Params[1] = pow((Colorant[n].Max - Colorant[n].Min), (1.0 / Colorant[n].Gamma)); Params[2] = 0; Params[3] = 0; Params[4] = 0; Params[5] = Colorant[n].Min; Params[6] = 0; Curves[n] = cmsBuildParametricToneCurve(self ->ContextID, 5, Params); if (Curves[n] == NULL) goto Error; } } break; // Unsupported default: cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag type for VCGT '%d'", TagType); goto Error; } *nItems = 1; return (void*) Curves; // Regret, free all resources Error: cmsFreeToneCurveTriple(Curves); _cmsFree(self ->ContextID, Curves); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // We don't support all flavors, only 16bits tables and formula static cmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsToneCurve** Curves = (cmsToneCurve**) Ptr; cmsUInt32Number i, j; if (cmsGetToneCurveParametricType(Curves[0]) == 5 && cmsGetToneCurveParametricType(Curves[1]) == 5 && cmsGetToneCurveParametricType(Curves[2]) == 5) { if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE; // Save parameters for (i=0; i < 3; i++) { _cmsVCGTGAMMA v; v.Gamma = Curves[i] ->Segments[0].Params[0]; v.Min = Curves[i] ->Segments[0].Params[5]; v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min; if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE; if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE; if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE; } } else { // Always store as a table of 256 words if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE; if (!_cmsWriteUInt16Number(io, 3)) return FALSE; if (!_cmsWriteUInt16Number(io, 256)) return FALSE; if (!_cmsWriteUInt16Number(io, 2)) return FALSE; for (i=0; i < 3; i++) { for (j=0; j < 256; j++) { cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0)); cmsUInt16Number n = _cmsQuickSaturateWord(v * 65535.0); if (!_cmsWriteUInt16Number(io, n)) return FALSE; } } } return TRUE; cmsUNUSED_PARAMETER(self); cmsUNUSED_PARAMETER(nItems); } static void* Type_vcgt_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { cmsToneCurve** OldCurves = (cmsToneCurve**) Ptr; cmsToneCurve** NewCurves; NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); if (NewCurves == NULL) return NULL; NewCurves[0] = cmsDupToneCurve(OldCurves[0]); NewCurves[1] = cmsDupToneCurve(OldCurves[1]); NewCurves[2] = cmsDupToneCurve(OldCurves[2]); return (void*) NewCurves; cmsUNUSED_PARAMETER(n); } static void Type_vcgt_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeToneCurveTriple((cmsToneCurve**) Ptr); _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigDictType // ******************************************************************************** // Single column of the table can point to wchar or MLUC elements. Holds arrays of data typedef struct { cmsContext ContextID; cmsUInt32Number *Offsets; cmsUInt32Number *Sizes; } _cmsDICelem; typedef struct { _cmsDICelem Name, Value, DisplayName, DisplayValue; } _cmsDICarray; // Allocate an empty array element static cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count) { e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number)); if (e->Offsets == NULL) return FALSE; e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number)); if (e->Sizes == NULL) { _cmsFree(ContextID, e -> Offsets); return FALSE; } e ->ContextID = ContextID; return TRUE; } // Free an array element static void FreeElem(_cmsDICelem* e) { if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets); if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e -> Sizes); e->Offsets = e ->Sizes = NULL; } // Get rid of whole array static void FreeArray( _cmsDICarray* a) { if (a ->Name.Offsets != NULL) FreeElem(&a->Name); if (a ->Value.Offsets != NULL) FreeElem(&a ->Value); if (a ->DisplayName.Offsets != NULL) FreeElem(&a->DisplayName); if (a ->DisplayValue.Offsets != NULL) FreeElem(&a ->DisplayValue); } // Allocate whole array static cmsBool AllocArray(cmsContext ContextID, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) { // Empty values memset(a, 0, sizeof(_cmsDICarray)); // On depending on record size, create column arrays if (!AllocElem(ContextID, &a ->Name, Count)) goto Error; if (!AllocElem(ContextID, &a ->Value, Count)) goto Error; if (Length > 16) { if (!AllocElem(ContextID, &a -> DisplayName, Count)) goto Error; } if (Length > 24) { if (!AllocElem(ContextID, &a ->DisplayValue, Count)) goto Error; } return TRUE; Error: FreeArray(a); return FALSE; } // Read one element static cmsBool ReadOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsUInt32Number BaseOffset) { if (!_cmsReadUInt32Number(io, &e->Offsets[i])) return FALSE; if (!_cmsReadUInt32Number(io, &e ->Sizes[i])) return FALSE; // An offset of zero has special meaning and shall be preserved if (e ->Offsets[i] > 0) e ->Offsets[i] += BaseOffset; return TRUE; } static cmsBool ReadOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length, cmsUInt32Number BaseOffset, cmsInt32Number* SignedSizeOfTagPtr) { cmsUInt32Number i; cmsInt32Number SignedSizeOfTag = *SignedSizeOfTagPtr; // Read column arrays for (i=0; i < Count; i++) { if (SignedSizeOfTag < 4 * (cmsInt32Number) sizeof(cmsUInt32Number)) return FALSE; SignedSizeOfTag -= 4 * sizeof(cmsUInt32Number); if (!ReadOneElem(io, &a -> Name, i, BaseOffset)) return FALSE; if (!ReadOneElem(io, &a -> Value, i, BaseOffset)) return FALSE; if (Length > 16) { if (SignedSizeOfTag < 2 * (cmsInt32Number) sizeof(cmsUInt32Number)) return FALSE; SignedSizeOfTag -= 2 * sizeof(cmsUInt32Number); if (!ReadOneElem(io, &a ->DisplayName, i, BaseOffset)) return FALSE; } if (Length > 24) { if (SignedSizeOfTag < 2 * (cmsInt32Number) sizeof(cmsUInt32Number)) return FALSE; SignedSizeOfTag -= 2 * (cmsInt32Number) sizeof(cmsUInt32Number); if (!ReadOneElem(io, & a -> DisplayValue, i, BaseOffset)) return FALSE; } } *SignedSizeOfTagPtr = SignedSizeOfTag; return TRUE; } // Write one element static cmsBool WriteOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i) { if (!_cmsWriteUInt32Number(io, e->Offsets[i])) return FALSE; if (!_cmsWriteUInt32Number(io, e ->Sizes[i])) return FALSE; return TRUE; } static cmsBool WriteOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) { cmsUInt32Number i; for (i=0; i < Count; i++) { if (!WriteOneElem(io, &a -> Name, i)) return FALSE; if (!WriteOneElem(io, &a -> Value, i)) return FALSE; if (Length > 16) { if (!WriteOneElem(io, &a -> DisplayName, i)) return FALSE; } if (Length > 24) { if (!WriteOneElem(io, &a -> DisplayValue, i)) return FALSE; } } return TRUE; } static cmsBool ReadOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, wchar_t ** wcstr) { cmsUInt32Number nChars; // Special case for undefined strings (see ICC Votable // Proposal Submission, Dictionary Type and Metadata TAG Definition) if (e -> Offsets[i] == 0) { *wcstr = NULL; return TRUE; } if (!io -> Seek(io, e -> Offsets[i])) return FALSE; nChars = e ->Sizes[i] / sizeof(cmsUInt16Number); if (nChars > 0x7ffff) return FALSE; *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t)); if (*wcstr == NULL) return FALSE; if (!_cmsReadWCharArray(io, nChars, *wcstr)) { _cmsFree(e ->ContextID, *wcstr); return FALSE; } // End of string marker (*wcstr)[nChars] = 0; return TRUE; } static cmsUInt32Number mywcslen(const wchar_t *s) { const wchar_t *p; p = s; while (*p) p++; return (cmsUInt32Number)(p - s); } static cmsBool WriteOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const wchar_t * wcstr, cmsUInt32Number BaseOffset) { cmsUInt32Number Before = io ->Tell(io); cmsUInt32Number n; e ->Offsets[i] = Before - BaseOffset; if (wcstr == NULL) { e ->Sizes[i] = 0; e ->Offsets[i] = 0; return TRUE; } n = mywcslen(wcstr); if (!_cmsWriteWCharArray(io, n, wcstr)) return FALSE; e ->Sizes[i] = io ->Tell(io) - Before; return TRUE; } static cmsBool ReadOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsMLU** mlu) { cmsUInt32Number nItems = 0; // A way to get null MLUCs if (e -> Offsets[i] == 0 || e ->Sizes[i] == 0) { *mlu = NULL; return TRUE; } if (!io -> Seek(io, e -> Offsets[i])) return FALSE; *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, e ->Sizes[i]); return *mlu != NULL; } static cmsBool WriteOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const cmsMLU* mlu, cmsUInt32Number BaseOffset) { cmsUInt32Number Before; // Special case for undefined strings (see ICC Votable // Proposal Submission, Dictionary Type and Metadata TAG Definition) if (mlu == NULL) { e ->Sizes[i] = 0; e ->Offsets[i] = 0; return TRUE; } Before = io ->Tell(io); if (e->Offsets != NULL) e ->Offsets[i] = Before - BaseOffset; if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE; if (e->Sizes != NULL) e ->Sizes[i] = io ->Tell(io) - Before; return TRUE; } static void *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsHANDLE hDict = NULL; cmsUInt32Number i, Count, Length; cmsUInt32Number BaseOffset; _cmsDICarray a; wchar_t *NameWCS = NULL, *ValueWCS = NULL; cmsMLU *DisplayNameMLU = NULL, *DisplayValueMLU=NULL; cmsBool rc; cmsInt32Number SignedSizeOfTag = (cmsInt32Number)SizeOfTag; *nItems = 0; memset(&a, 0, sizeof(a)); // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Get name-value record count SignedSizeOfTag -= sizeof(cmsUInt32Number); if (SignedSizeOfTag < 0) goto Error; if (!_cmsReadUInt32Number(io, &Count)) return NULL; // Get rec length SignedSizeOfTag -= sizeof(cmsUInt32Number); if (SignedSizeOfTag < 0) goto Error; if (!_cmsReadUInt32Number(io, &Length)) return NULL; // Check for valid lengths if (Length != 16 && Length != 24 && Length != 32) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown record length in dictionary '%d'", Length); return NULL; } // Creates an empty dictionary hDict = cmsDictAlloc(self -> ContextID); if (hDict == NULL) return NULL; // On depending on record size, create column arrays if (!AllocArray(self -> ContextID, &a, Count, Length)) goto Error; // Read column arrays if (!ReadOffsetArray(io, &a, Count, Length, BaseOffset, &SignedSizeOfTag)) goto Error; // Seek to each element and read it for (i=0; i < Count; i++) { if (!ReadOneWChar(io, &a.Name, i, &NameWCS)) goto Error; if (!ReadOneWChar(io, &a.Value, i, &ValueWCS)) goto Error; if (Length > 16) { if (!ReadOneMLUC(self, io, &a.DisplayName, i, &DisplayNameMLU)) goto Error; } if (Length > 24) { if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error; } if (NameWCS == NULL || ValueWCS == NULL) { cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value"); rc = FALSE; } else { rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU); } if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS); if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS); if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU); if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU); if (!rc) goto Error; } FreeArray(&a); *nItems = 1; return (void*) hDict; Error: FreeArray(&a); if (hDict != NULL) cmsDictFree(hDict); return NULL; } static cmsBool Type_Dictionary_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsHANDLE hDict = (cmsHANDLE) Ptr; const cmsDICTentry* p; cmsBool AnyName, AnyValue; cmsUInt32Number i, Count, Length; cmsUInt32Number DirectoryPos, CurrentPos, BaseOffset; _cmsDICarray a; if (hDict == NULL) return FALSE; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Let's inspect the dictionary Count = 0; AnyName = FALSE; AnyValue = FALSE; for (p = cmsDictGetEntryList(hDict); p != NULL; p = cmsDictNextEntry(p)) { if (p ->DisplayName != NULL) AnyName = TRUE; if (p ->DisplayValue != NULL) AnyValue = TRUE; Count++; } Length = 16; if (AnyName) Length += 8; if (AnyValue) Length += 8; if (!_cmsWriteUInt32Number(io, Count)) return FALSE; if (!_cmsWriteUInt32Number(io, Length)) return FALSE; // Keep starting position of offsets table DirectoryPos = io ->Tell(io); // Allocate offsets array if (!AllocArray(self ->ContextID, &a, Count, Length)) goto Error; // Write a fake directory to be filled latter on if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; // Write each element. Keep track of the size as well. p = cmsDictGetEntryList(hDict); for (i=0; i < Count; i++) { if (!WriteOneWChar(io, &a.Name, i, p ->Name, BaseOffset)) goto Error; if (!WriteOneWChar(io, &a.Value, i, p ->Value, BaseOffset)) goto Error; if (p ->DisplayName != NULL) { if (!WriteOneMLUC(self, io, &a.DisplayName, i, p ->DisplayName, BaseOffset)) goto Error; } if (p ->DisplayValue != NULL) { if (!WriteOneMLUC(self, io, &a.DisplayValue, i, p ->DisplayValue, BaseOffset)) goto Error; } p = cmsDictNextEntry(p); } // Write the directory CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) goto Error; if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; if (!io ->Seek(io, CurrentPos)) goto Error; FreeArray(&a); return TRUE; Error: FreeArray(&a); return FALSE; cmsUNUSED_PARAMETER(nItems); } static void* Type_Dictionary_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsDictDup((cmsHANDLE) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsDictFree((cmsHANDLE) Ptr); cmsUNUSED_PARAMETER(self); } // cicp VideoSignalType static void* Type_VideoSignal_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsVideoSignalType* cicp = NULL; if (SizeOfTag != 4) return NULL; cicp = (cmsVideoSignalType*)_cmsCalloc(self->ContextID, 1, sizeof(cmsVideoSignalType)); if (cicp == NULL) return NULL; if (!_cmsReadUInt8Number(io, &cicp->ColourPrimaries)) goto Error; if (!_cmsReadUInt8Number(io, &cicp->TransferCharacteristics)) goto Error; if (!_cmsReadUInt8Number(io, &cicp->MatrixCoefficients)) goto Error; if (!_cmsReadUInt8Number(io, &cicp->VideoFullRangeFlag)) goto Error; // Success *nItems = 1; return cicp; Error: if (cicp != NULL) _cmsFree(self->ContextID, cicp); return NULL; } static cmsBool Type_VideoSignal_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsVideoSignalType* cicp = (cmsVideoSignalType*)Ptr; if (!_cmsWriteUInt8Number(io, cicp->ColourPrimaries)) return FALSE; if (!_cmsWriteUInt8Number(io, cicp->TransferCharacteristics)) return FALSE; if (!_cmsWriteUInt8Number(io, cicp->MatrixCoefficients)) return FALSE; if (!_cmsWriteUInt8Number(io, cicp->VideoFullRangeFlag)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(self); cmsUNUSED_PARAMETER(nItems); } void* Type_VideoSignal_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return _cmsDupMem(self->ContextID, Ptr, sizeof(cmsVideoSignalType)); cmsUNUSED_PARAMETER(n); } static void Type_VideoSignal_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self->ContextID, Ptr); } // ******************************************************************************** // Microsoft's MHC2 Type support // ******************************************************************************** static void SetIdentity(cmsFloat64Number XYZ2XYZmatrix[3][4]) { XYZ2XYZmatrix[0][0] = 1.0; XYZ2XYZmatrix[0][1] = 0.0; XYZ2XYZmatrix[0][2] = 0.0; XYZ2XYZmatrix[0][3] = 0.0; XYZ2XYZmatrix[1][0] = 0.0; XYZ2XYZmatrix[1][1] = 1.0; XYZ2XYZmatrix[1][2] = 0.0; XYZ2XYZmatrix[1][3] = 0.0; XYZ2XYZmatrix[2][0] = 0.0; XYZ2XYZmatrix[2][1] = 0.0; XYZ2XYZmatrix[2][2] = 1.0; XYZ2XYZmatrix[2][3] = 0.0; } static cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b) { return fabs(b - a) < (1.0 / 65535.0); } cmsBool IsIdentity(cmsFloat64Number XYZ2XYZmatrix[3][4]) { cmsFloat64Number Identity[3][4]; int i, j; SetIdentity(Identity); for (i = 0; i < 3; i++) for (j = 0; j < 4; j++) if (!CloseEnough(XYZ2XYZmatrix[i][j], Identity[i][j])) return FALSE; return TRUE; } static void Type_MHC2_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsMHC2Type* mhc2 = (cmsMHC2Type*)Ptr; if (mhc2->RedCurve != NULL) _cmsFree(self->ContextID, mhc2->RedCurve); if (mhc2->GreenCurve != NULL) _cmsFree(self->ContextID, mhc2->GreenCurve); if (mhc2->BlueCurve != NULL) _cmsFree(self->ContextID, mhc2->BlueCurve); _cmsFree(self->ContextID, Ptr); } void* Type_MHC2_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { cmsMHC2Type* mhc2 = (cmsMHC2Type*)_cmsDupMem(self->ContextID, Ptr, sizeof(cmsMHC2Type)); mhc2->RedCurve = (cmsFloat64Number*) _cmsDupMem(self->ContextID, mhc2->RedCurve, mhc2->CurveEntries*sizeof(cmsFloat64Number)); mhc2->GreenCurve = (cmsFloat64Number*) _cmsDupMem(self->ContextID, mhc2->GreenCurve, mhc2->CurveEntries * sizeof(cmsFloat64Number)); mhc2->BlueCurve = (cmsFloat64Number*) _cmsDupMem(self->ContextID, mhc2->BlueCurve, mhc2->CurveEntries * sizeof(cmsFloat64Number)); if (mhc2->RedCurve == NULL || mhc2->GreenCurve == NULL || mhc2->BlueCurve == NULL) { Type_MHC2_Free(self, mhc2); return NULL; } return mhc2; cmsUNUSED_PARAMETER(n); } static cmsBool WriteDoubles(cmsIOHANDLER* io, cmsUInt32Number n, cmsFloat64Number* Values) { cmsUInt32Number i; for (i = 0; i < n; i++) { if (!_cmsWrite15Fixed16Number(io, *Values++)) return FALSE; } return TRUE; } static cmsBool Type_MHC2_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMHC2Type* mhc2 = (cmsMHC2Type*)Ptr; cmsUInt32Number BaseOffset = io->Tell(io) - sizeof(_cmsTagBase); cmsUInt32Number TablesOffsetPos; cmsUInt32Number MatrixOffset; cmsUInt32Number OffsetRedTable, OffsetGreenTable, OffsetBlueTable; if (!_cmsWriteUInt32Number(io, mhc2->CurveEntries)) return FALSE; if (!_cmsWrite15Fixed16Number(io, mhc2->MinLuminance)) return FALSE; if (!_cmsWrite15Fixed16Number(io, mhc2->PeakLuminance)) return FALSE; TablesOffsetPos = io->Tell(io); if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Matrix if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Curve R if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Curve G if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Curve B if (IsIdentity(mhc2->XYZ2XYZmatrix)) { MatrixOffset = 0; } else { MatrixOffset = io->Tell(io) - BaseOffset; if (!WriteDoubles(io, 3 * 4, &mhc2->XYZ2XYZmatrix[0][0])) return FALSE; } OffsetRedTable = io->Tell(io) - BaseOffset; if(!_cmsWriteUInt32Number(io, cmsSigS15Fixed16ArrayType)) return FALSE; if(!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->RedCurve)) return FALSE; OffsetGreenTable = io->Tell(io) - BaseOffset; if (!_cmsWriteUInt32Number(io, cmsSigS15Fixed16ArrayType)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->GreenCurve)) return FALSE; OffsetBlueTable = io->Tell(io) - BaseOffset; if (!_cmsWriteUInt32Number(io, cmsSigS15Fixed16ArrayType)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->BlueCurve)) return FALSE; if (!io->Seek(io, TablesOffsetPos)) return FALSE; if (!_cmsWriteUInt32Number(io, MatrixOffset)) return FALSE; if (!_cmsWriteUInt32Number(io, OffsetRedTable)) return FALSE; if (!_cmsWriteUInt32Number(io, OffsetGreenTable)) return FALSE; if (!_cmsWriteUInt32Number(io, OffsetBlueTable)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(self); cmsUNUSED_PARAMETER(nItems); } static cmsBool ReadDoublesAt(cmsIOHANDLER* io, cmsUInt32Number At, cmsUInt32Number n, cmsFloat64Number* Values) { cmsUInt32Number CurrentPos = io->Tell(io); cmsUInt32Number i; if (!io->Seek(io, At)) return FALSE; for (i = 0; i < n; i++) { if (!_cmsRead15Fixed16Number(io, Values++)) return FALSE; } if (!io->Seek(io, CurrentPos)) return FALSE; return TRUE; } static void* Type_MHC2_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsMHC2Type* mhc2 = NULL; cmsUInt32Number BaseOffset = io->Tell(io) - sizeof(_cmsTagBase); cmsUInt32Number MatrixOffset; cmsUInt32Number OffsetRedTable, OffsetGreenTable, OffsetBlueTable; mhc2 = (cmsMHC2Type*)_cmsCalloc(self->ContextID, 1, sizeof(cmsMHC2Type)); if (mhc2 == NULL) return NULL; if (!_cmsReadUInt32Number(io, &mhc2->CurveEntries)) goto Error; if (mhc2->CurveEntries > 4096) goto Error; mhc2->RedCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number)); mhc2->GreenCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number)); mhc2->BlueCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number)); if (mhc2->RedCurve == NULL || mhc2->GreenCurve == NULL || mhc2->BlueCurve == NULL) goto Error; if (!_cmsRead15Fixed16Number(io, &mhc2->MinLuminance)) goto Error; if (!_cmsRead15Fixed16Number(io, &mhc2->PeakLuminance)) goto Error; if (!_cmsReadUInt32Number(io, &MatrixOffset)) goto Error; if (!_cmsReadUInt32Number(io, &OffsetRedTable)) goto Error; if (!_cmsReadUInt32Number(io, &OffsetGreenTable)) goto Error; if (!_cmsReadUInt32Number(io, &OffsetBlueTable)) goto Error; if (MatrixOffset == 0) SetIdentity(mhc2->XYZ2XYZmatrix); else { if (!ReadDoublesAt(io, BaseOffset + MatrixOffset, 3*4, &mhc2->XYZ2XYZmatrix[0][0])) goto Error; } // Skip sf32 tag and filler (8bytes) if (!ReadDoublesAt(io, BaseOffset + OffsetRedTable + 8, mhc2->CurveEntries, mhc2->RedCurve)) goto Error; if (!ReadDoublesAt(io, BaseOffset + OffsetGreenTable + 8, mhc2->CurveEntries, mhc2->GreenCurve)) goto Error; if (!ReadDoublesAt(io, BaseOffset + OffsetBlueTable + 8, mhc2->CurveEntries, mhc2->BlueCurve)) goto Error; // Success *nItems = 1; return mhc2; Error: Type_MHC2_Free(self, mhc2); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // ******************************************************************************** // Type support main routines // ******************************************************************************** // This is the list of built-in types static const _cmsTagTypeLinkedList SupportedTagTypes[] = { {TYPE_HANDLER(cmsSigChromaticityType, Chromaticity), (_cmsTagTypeLinkedList*) &SupportedTagTypes[1] }, {TYPE_HANDLER(cmsSigColorantOrderType, ColorantOrderType), (_cmsTagTypeLinkedList*) &SupportedTagTypes[2] }, {TYPE_HANDLER(cmsSigS15Fixed16ArrayType, S15Fixed16), (_cmsTagTypeLinkedList*) &SupportedTagTypes[3] }, {TYPE_HANDLER(cmsSigU16Fixed16ArrayType, U16Fixed16), (_cmsTagTypeLinkedList*) &SupportedTagTypes[4] }, {TYPE_HANDLER(cmsSigTextType, Text), (_cmsTagTypeLinkedList*) &SupportedTagTypes[5] }, {TYPE_HANDLER(cmsSigTextDescriptionType, Text_Description), (_cmsTagTypeLinkedList*) &SupportedTagTypes[6] }, {TYPE_HANDLER(cmsSigCurveType, Curve), (_cmsTagTypeLinkedList*) &SupportedTagTypes[7] }, {TYPE_HANDLER(cmsSigParametricCurveType, ParametricCurve), (_cmsTagTypeLinkedList*) &SupportedTagTypes[8] }, {TYPE_HANDLER(cmsSigDateTimeType, DateTime), (_cmsTagTypeLinkedList*) &SupportedTagTypes[9] }, {TYPE_HANDLER(cmsSigLut8Type, LUT8), (_cmsTagTypeLinkedList*) &SupportedTagTypes[10] }, {TYPE_HANDLER(cmsSigLut16Type, LUT16), (_cmsTagTypeLinkedList*) &SupportedTagTypes[11] }, {TYPE_HANDLER(cmsSigColorantTableType, ColorantTable), (_cmsTagTypeLinkedList*) &SupportedTagTypes[12] }, {TYPE_HANDLER(cmsSigNamedColor2Type, NamedColor), (_cmsTagTypeLinkedList*) &SupportedTagTypes[13] }, {TYPE_HANDLER(cmsSigMultiLocalizedUnicodeType, MLU), (_cmsTagTypeLinkedList*) &SupportedTagTypes[14] }, {TYPE_HANDLER(cmsSigProfileSequenceDescType, ProfileSequenceDesc),(_cmsTagTypeLinkedList*) &SupportedTagTypes[15] }, {TYPE_HANDLER(cmsSigSignatureType, Signature), (_cmsTagTypeLinkedList*) &SupportedTagTypes[16] }, {TYPE_HANDLER(cmsSigMeasurementType, Measurement), (_cmsTagTypeLinkedList*) &SupportedTagTypes[17] }, {TYPE_HANDLER(cmsSigDataType, Data), (_cmsTagTypeLinkedList*) &SupportedTagTypes[18] }, {TYPE_HANDLER(cmsSigLutAtoBType, LUTA2B), (_cmsTagTypeLinkedList*) &SupportedTagTypes[19] }, {TYPE_HANDLER(cmsSigLutBtoAType, LUTB2A), (_cmsTagTypeLinkedList*) &SupportedTagTypes[20] }, {TYPE_HANDLER(cmsSigUcrBgType, UcrBg), (_cmsTagTypeLinkedList*) &SupportedTagTypes[21] }, {TYPE_HANDLER(cmsSigCrdInfoType, CrdInfo), (_cmsTagTypeLinkedList*) &SupportedTagTypes[22] }, {TYPE_HANDLER(cmsSigMultiProcessElementType, MPE), (_cmsTagTypeLinkedList*) &SupportedTagTypes[23] }, {TYPE_HANDLER(cmsSigScreeningType, Screening), (_cmsTagTypeLinkedList*) &SupportedTagTypes[24] }, {TYPE_HANDLER(cmsSigViewingConditionsType, ViewingConditions), (_cmsTagTypeLinkedList*) &SupportedTagTypes[25] }, {TYPE_HANDLER(cmsSigXYZType, XYZ), (_cmsTagTypeLinkedList*) &SupportedTagTypes[26] }, {TYPE_HANDLER(cmsCorbisBrokenXYZtype, XYZ), (_cmsTagTypeLinkedList*) &SupportedTagTypes[27] }, {TYPE_HANDLER(cmsMonacoBrokenCurveType, Curve), (_cmsTagTypeLinkedList*) &SupportedTagTypes[28] }, {TYPE_HANDLER(cmsSigProfileSequenceIdType, ProfileSequenceId), (_cmsTagTypeLinkedList*) &SupportedTagTypes[29] }, {TYPE_HANDLER(cmsSigDictType, Dictionary), (_cmsTagTypeLinkedList*) &SupportedTagTypes[30] }, {TYPE_HANDLER(cmsSigcicpType, VideoSignal), (_cmsTagTypeLinkedList*) &SupportedTagTypes[31] }, {TYPE_HANDLER(cmsSigVcgtType, vcgt), (_cmsTagTypeLinkedList*) &SupportedTagTypes[32] }, {TYPE_HANDLER(cmsSigMHC2Type, MHC2), (_cmsTagTypeLinkedList*) &SupportedTagTypes[33] }, {TYPE_HANDLER(cmsSigUInt8ArrayType, UInt8), (_cmsTagTypeLinkedList*) &SupportedTagTypes[34] }, {TYPE_HANDLER(cmsSigUInt32ArrayType, UInt32), (_cmsTagTypeLinkedList*) &SupportedTagTypes[35] }, {TYPE_HANDLER(cmsSigUInt64ArrayType, UInt64), NULL } }; _cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupTagTypeList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src, int loc) { _cmsTagTypePluginChunkType newHead = { NULL }; _cmsTagTypeLinkedList* entry; _cmsTagTypeLinkedList* Anterior = NULL; _cmsTagTypePluginChunkType* head = (_cmsTagTypePluginChunkType*) src->chunks[loc]; // Walk the list copying all nodes for (entry = head->TagTypes; entry != NULL; entry = entry ->Next) { _cmsTagTypeLinkedList *newEntry = ( _cmsTagTypeLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagTypeLinkedList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.TagTypes == NULL) newHead.TagTypes = newEntry; } ctx ->chunks[loc] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagTypePluginChunkType)); } void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Duplicate the LIST DupTagTypeList(ctx, src, TagTypePlugin); } else { static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL }; ctx ->chunks[TagTypePlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType)); } } void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Duplicate the LIST DupTagTypeList(ctx, src, MPEPlugin); } else { static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL }; ctx ->chunks[MPEPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType)); } } // Both kind of plug-ins share same structure cmsBool _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data) { return RegisterTypesPlugin(id, Data, TagTypePlugin); } cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data) { return RegisterTypesPlugin(id, Data,MPEPlugin); } // Wrapper for tag types cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig) { _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(ContextID, TagTypePlugin); return GetHandler(sig, ctx->TagTypes, (_cmsTagTypeLinkedList*) SupportedTagTypes); } // ******************************************************************************** // Tag support main routines // ******************************************************************************** typedef struct _cmsTagLinkedList_st { cmsTagSignature Signature; cmsTagDescriptor Descriptor; struct _cmsTagLinkedList_st* Next; } _cmsTagLinkedList; // This is the list of built-in tags. The data of this list can be modified by plug-ins static _cmsTagLinkedList SupportedTags[] = { { cmsSigAToB0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[1]}, { cmsSigAToB1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[2]}, { cmsSigAToB2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[3]}, { cmsSigBToA0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[4]}, { cmsSigBToA1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[5]}, { cmsSigBToA2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[6]}, // Allow corbis and its broken XYZ type { cmsSigRedColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[7]}, { cmsSigGreenColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[8]}, { cmsSigBlueColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[9]}, { cmsSigRedTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[10]}, { cmsSigGreenTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[11]}, { cmsSigBlueTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[12]}, { cmsSigCalibrationDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[13]}, { cmsSigCharTargetTag, { 1, 1, { cmsSigTextType }, NULL}, &SupportedTags[14]}, { cmsSigChromaticAdaptationTag, { 9, 1, { cmsSigS15Fixed16ArrayType }, NULL}, &SupportedTags[15]}, { cmsSigChromaticityTag, { 1, 1, { cmsSigChromaticityType }, NULL}, &SupportedTags[16]}, { cmsSigColorantOrderTag, { 1, 1, { cmsSigColorantOrderType }, NULL}, &SupportedTags[17]}, { cmsSigColorantTableTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[18]}, { cmsSigColorantTableOutTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[19]}, { cmsSigCopyrightTag, { 1, 3, { cmsSigTextType, cmsSigMultiLocalizedUnicodeType, cmsSigTextDescriptionType}, DecideTextType}, &SupportedTags[20]}, { cmsSigDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[21]}, { cmsSigDeviceMfgDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[22]}, { cmsSigDeviceModelDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[23]}, { cmsSigGamutTag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[24]}, { cmsSigGrayTRCTag, { 1, 2, { cmsSigCurveType, cmsSigParametricCurveType }, DecideCurveType}, &SupportedTags[25]}, { cmsSigLuminanceTag, { 1, 1, { cmsSigXYZType }, NULL}, &SupportedTags[26]}, { cmsSigMediaBlackPointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[27]}, { cmsSigMediaWhitePointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[28]}, { cmsSigNamedColor2Tag, { 1, 1, { cmsSigNamedColor2Type }, NULL}, &SupportedTags[29]}, { cmsSigPreview0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[30]}, { cmsSigPreview1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[31]}, { cmsSigPreview2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[32]}, { cmsSigProfileDescriptionTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[33]}, { cmsSigProfileSequenceDescTag, { 1, 1, { cmsSigProfileSequenceDescType }, NULL}, &SupportedTags[34]}, { cmsSigTechnologyTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[35]}, { cmsSigColorimetricIntentImageStateTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[36]}, { cmsSigPerceptualRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[37]}, { cmsSigSaturationRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[38]}, { cmsSigMeasurementTag, { 1, 1, { cmsSigMeasurementType }, NULL}, &SupportedTags[39]}, { cmsSigPs2CRD0Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[40]}, { cmsSigPs2CRD1Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[41]}, { cmsSigPs2CRD2Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[42]}, { cmsSigPs2CRD3Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[43]}, { cmsSigPs2CSATag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[44]}, { cmsSigPs2RenderingIntentTag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[45]}, { cmsSigViewingCondDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[46]}, { cmsSigUcrBgTag, { 1, 1, { cmsSigUcrBgType}, NULL}, &SupportedTags[47]}, { cmsSigCrdInfoTag, { 1, 1, { cmsSigCrdInfoType}, NULL}, &SupportedTags[48]}, { cmsSigDToB0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[49]}, { cmsSigDToB1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[50]}, { cmsSigDToB2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[51]}, { cmsSigDToB3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[52]}, { cmsSigBToD0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[53]}, { cmsSigBToD1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[54]}, { cmsSigBToD2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[55]}, { cmsSigBToD3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[56]}, { cmsSigScreeningDescTag, { 1, 1, { cmsSigTextDescriptionType }, NULL}, &SupportedTags[57]}, { cmsSigViewingConditionsTag, { 1, 1, { cmsSigViewingConditionsType }, NULL}, &SupportedTags[58]}, { cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]}, { cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]}, { cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]}, { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]}, { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, &SupportedTags[63]}, { cmsSigcicpTag, { 1, 1, { cmsSigcicpType}, NULL }, &SupportedTags[64]}, { cmsSigArgyllArtsTag, { 9, 1, { cmsSigS15Fixed16ArrayType}, NULL}, &SupportedTags[65]}, { cmsSigMHC2Tag, { 1, 1, { cmsSigMHC2Type }, NULL}, NULL} }; /* Not supported Why ======================= ========================================= cmsSigOutputResponseTag ==> WARNING, POSSIBLE PATENT ON THIS SUBJECT! cmsSigNamedColorTag ==> Deprecated cmsSigDataTag ==> Ancient, unused cmsSigDeviceSettingsTag ==> Deprecated, useless */ _cmsTagPluginChunkType _cmsTagPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupTagList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsTagPluginChunkType newHead = { NULL }; _cmsTagLinkedList* entry; _cmsTagLinkedList* Anterior = NULL; _cmsTagPluginChunkType* head = (_cmsTagPluginChunkType*) src->chunks[TagPlugin]; // Walk the list copying all nodes for (entry = head->Tag; entry != NULL; entry = entry ->Next) { _cmsTagLinkedList *newEntry = ( _cmsTagLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagLinkedList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.Tag == NULL) newHead.Tag = newEntry; } ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagPluginChunkType)); } void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { DupTagList(ctx, src); } else { static _cmsTagPluginChunkType TagPluginChunk = { NULL }; ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagPluginChunk, sizeof(_cmsTagPluginChunkType)); } } cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data) { cmsPluginTag* Plugin = (cmsPluginTag*) Data; _cmsTagLinkedList *pt; _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(id, TagPlugin); if (Data == NULL) { TagPluginChunk->Tag = NULL; return TRUE; } pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList)); if (pt == NULL) return FALSE; pt ->Signature = Plugin ->Signature; pt ->Descriptor = Plugin ->Descriptor; pt ->Next = TagPluginChunk ->Tag; TagPluginChunk ->Tag = pt; return TRUE; } // Return a descriptor for a given tag or NULL cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig) { _cmsTagLinkedList* pt; _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(ContextID, TagPlugin); for (pt = TagPluginChunk->Tag; pt != NULL; pt = pt ->Next) { if (sig == pt -> Signature) return &pt ->Descriptor; } for (pt = SupportedTags; pt != NULL; pt = pt ->Next) { if (sig == pt -> Signature) return &pt ->Descriptor; } return NULL; } cmsBool _cmsAvoidTypeCheckOnTags(cmsContext ContextID) { _cmsTagLinkedList* pt; _cmsTagPluginChunkType* TagPluginChunk = (_cmsTagPluginChunkType*)_cmsContextGetClientChunk(ContextID, TagPlugin); for (pt = TagPluginChunk->Tag; pt != NULL; pt = pt->Next) { if (pt->Signature == (cmsTagSignature)0) return TRUE; } return FALSE; } lcms2-2.19.1/src/cmsvirt.c0000644000175000017500000012354215176573557014314 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Virtual (built-in) profiles // ----------------------------------------------------------------------------------- static cmsBool SetTextTags(cmsHPROFILE hProfile, const wchar_t* Description) { cmsMLU *DescriptionMLU, *CopyrightMLU; cmsBool rc = FALSE; cmsContext ContextID = cmsGetProfileContextID(hProfile); DescriptionMLU = cmsMLUalloc(ContextID, 1); CopyrightMLU = cmsMLUalloc(ContextID, 1); if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; if (!cmsMLUsetWide(DescriptionMLU, "en", "US", Description)) goto Error; if (!cmsMLUsetWide(CopyrightMLU, "en", "US", L"No copyright, use freely")) goto Error; if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; rc = TRUE; Error: if (DescriptionMLU) cmsMLUfree(DescriptionMLU); if (CopyrightMLU) cmsMLUfree(CopyrightMLU); return rc; } static cmsBool SetSeqDescTag(cmsHPROFILE hProfile, const char* Model) { cmsBool rc = FALSE; cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsSEQ* Seq = cmsAllocProfileSequenceDescription(ContextID, 1); if (Seq == NULL) return FALSE; Seq->seq[0].deviceMfg = (cmsSignature) 0; Seq->seq[0].deviceModel = (cmsSignature) 0; #ifdef CMS_DONT_USE_INT64 Seq->seq[0].attributes[0] = 0; Seq->seq[0].attributes[1] = 0; #else Seq->seq[0].attributes = 0; #endif Seq->seq[0].technology = (cmsTechnologySignature) 0; cmsMLUsetASCII( Seq->seq[0].Manufacturer, cmsNoLanguage, cmsNoCountry, "Little CMS"); cmsMLUsetASCII( Seq->seq[0].Model, cmsNoLanguage, cmsNoCountry, Model); if (!_cmsWriteProfileSequence(hProfile, Seq)) goto Error; rc = TRUE; Error: if (Seq) cmsFreeProfileSequenceDescription(Seq); return rc; } // This function creates a profile based on White point, primaries and // transfer functions. cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]) { cmsHPROFILE hICC; cmsMAT3 MColorants; cmsCIEXYZTRIPLE Colorants; cmsCIExyY MaxWhite; cmsMAT3 CHAD; cmsCIEXYZ WhitePointXYZ; hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetProfileVersion(hICC, 4.4); cmsSetDeviceClass(hICC, cmsSigDisplayClass); cmsSetColorSpace(hICC, cmsSigRgbData); cmsSetPCS(hICC, cmsSigXYZData); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Implement profile using following tags: // // 1 cmsSigProfileDescriptionTag // 2 cmsSigMediaWhitePointTag // 3 cmsSigRedColorantTag // 4 cmsSigGreenColorantTag // 5 cmsSigBlueColorantTag // 6 cmsSigRedTRCTag // 7 cmsSigGreenTRCTag // 8 cmsSigBlueTRCTag // 9 Chromatic adaptation Tag // This conforms a standard RGB DisplayProfile as says ICC, and then I add (As per addendum II) // 10 cmsSigChromaticityTag if (!SetTextTags(hICC, L"RGB built-in")) goto Error; if (WhitePoint) { if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error; cmsxyY2XYZ(&WhitePointXYZ, WhitePoint); _cmsAdaptationMatrix(&CHAD, NULL, &WhitePointXYZ, cmsD50_XYZ()); // This is a V4 tag, but many CMM does read and understand it no matter which version if (!cmsWriteTag(hICC, cmsSigChromaticAdaptationTag, (void*) &CHAD)) goto Error; } if (WhitePoint && Primaries) { MaxWhite.x = WhitePoint -> x; MaxWhite.y = WhitePoint -> y; MaxWhite.Y = 1.0; if (!_cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries)) goto Error; Colorants.Red.X = MColorants.v[0].n[0]; Colorants.Red.Y = MColorants.v[1].n[0]; Colorants.Red.Z = MColorants.v[2].n[0]; Colorants.Green.X = MColorants.v[0].n[1]; Colorants.Green.Y = MColorants.v[1].n[1]; Colorants.Green.Z = MColorants.v[2].n[1]; Colorants.Blue.X = MColorants.v[0].n[2]; Colorants.Blue.Y = MColorants.v[1].n[2]; Colorants.Blue.Z = MColorants.v[2].n[2]; if (!cmsWriteTag(hICC, cmsSigRedColorantTag, (void*) &Colorants.Red)) goto Error; if (!cmsWriteTag(hICC, cmsSigBlueColorantTag, (void*) &Colorants.Blue)) goto Error; if (!cmsWriteTag(hICC, cmsSigGreenColorantTag, (void*) &Colorants.Green)) goto Error; } if (TransferFunction) { // Tries to minimize space. Thanks to Richard Hughes for this nice idea if (!cmsWriteTag(hICC, cmsSigRedTRCTag, (void*) TransferFunction[0])) goto Error; if (TransferFunction[1] == TransferFunction[0]) { if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error; } else { if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error; } if (TransferFunction[2] == TransferFunction[0]) { if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error; } else { if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error; } } if (Primaries) { if (!cmsWriteTag(hICC, cmsSigChromaticityTag, (void*) Primaries)) goto Error; } return hICC; Error: if (hICC) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]) { return cmsCreateRGBProfileTHR(NULL, WhitePoint, Primaries, TransferFunction); } // This function creates a profile based on White point and transfer function. cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction) { cmsHPROFILE hICC; cmsCIEXYZ tmp; hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetProfileVersion(hICC, 4.4); cmsSetDeviceClass(hICC, cmsSigDisplayClass); cmsSetColorSpace(hICC, cmsSigGrayData); cmsSetPCS(hICC, cmsSigXYZData); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Implement profile using following tags: // // 1 cmsSigProfileDescriptionTag // 2 cmsSigMediaWhitePointTag // 3 cmsSigGrayTRCTag // This conforms a standard Gray DisplayProfile // Fill-in the tags if (!SetTextTags(hICC, L"gray built-in")) goto Error; if (WhitePoint) { cmsxyY2XYZ(&tmp, WhitePoint); if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) &tmp)) goto Error; } if (TransferFunction) { if (!cmsWriteTag(hICC, cmsSigGrayTRCTag, (void*) TransferFunction)) goto Error; } return hICC; Error: if (hICC) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction) { return cmsCreateGrayProfileTHR(NULL, WhitePoint, TransferFunction); } // This is a devicelink operating in the target colorspace with as many transfer functions as components cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]) { cmsHPROFILE hICC; cmsPipeline* Pipeline; cmsInt32Number nChannels; hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) return NULL; cmsSetProfileVersion(hICC, 4.4); cmsSetDeviceClass(hICC, cmsSigLinkClass); cmsSetColorSpace(hICC, ColorSpace); cmsSetPCS(hICC, ColorSpace); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Set up channels nChannels = cmsChannelsOfColorSpace(ColorSpace); // Creates a Pipeline with prelinearization step only Pipeline = cmsPipelineAlloc(ContextID, nChannels, nChannels); if (Pipeline == NULL) goto Error; // Copy tables to Pipeline if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions))) goto Error; // Create tags if (!SetTextTags(hICC, L"Linearization built-in")) goto Error; if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline)) goto Error; if (!SetSeqDescTag(hICC, "Linearization built-in")) goto Error; // Pipeline is already on virtual profile cmsPipelineFree(Pipeline); // Ok, done return hICC; Error: cmsPipelineFree(Pipeline); if (hICC) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]) { return cmsCreateLinearizationDeviceLinkTHR(NULL, ColorSpace, TransferFunctions); } // Ink-limiting algorithm // // Sum = C + M + Y + K // If Sum > InkLimit // Ratio= 1 - (Sum - InkLimit) / (C + M + Y) // if Ratio <0 // Ratio=0 // endif // Else // Ratio=1 // endif // // C = Ratio * C // M = Ratio * M // Y = Ratio * Y // K: Does not change static int InkLimitingSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { cmsFloat64Number InkLimit = *(cmsFloat64Number *) Cargo; cmsFloat64Number SumCMY, SumCMYK, Ratio; InkLimit = (InkLimit * 655.35); SumCMY = (cmsFloat64Number) In[0] + In[1] + In[2]; SumCMYK = SumCMY + In[3]; if (SumCMYK > InkLimit && SumCMY > 0) { Ratio = 1 - ((SumCMYK - InkLimit) / SumCMY); if (Ratio < 0) Ratio = 0; } else Ratio = 1; Out[0] = _cmsQuickSaturateWord(In[0] * Ratio); // C Out[1] = _cmsQuickSaturateWord(In[1] * Ratio); // M Out[2] = _cmsQuickSaturateWord(In[2] * Ratio); // Y Out[3] = In[3]; // K (untouched) return TRUE; } // This is a devicelink operating in CMYK for ink-limiting cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit) { cmsHPROFILE hICC; cmsPipeline* LUT; cmsStage* CLUT; cmsInt32Number nChannels; if (ColorSpace != cmsSigCmykData) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "InkLimiting: Only CMYK currently supported"); return NULL; } if (Limit < 1.0 || Limit > 400) { cmsSignalError(ContextID, cmsERROR_RANGE, "InkLimiting: Limit should be between 1..400"); if (Limit < 1) Limit = 1; if (Limit > 400) Limit = 400; } hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetProfileVersion(hICC, 4.4); cmsSetDeviceClass(hICC, cmsSigLinkClass); cmsSetColorSpace(hICC, ColorSpace); cmsSetPCS(hICC, ColorSpace); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Creates a Pipeline with 3D grid only LUT = cmsPipelineAlloc(ContextID, 4, 4); if (LUT == NULL) goto Error; nChannels = cmsChannelsOf(ColorSpace); CLUT = cmsStageAllocCLut16bit(ContextID, 17, nChannels, nChannels, NULL); if (CLUT == NULL) goto Error; if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) || !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) || !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels))) goto Error; // Create tags if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error; if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) LUT)) goto Error; if (!SetSeqDescTag(hICC, "ink-limiting built-in")) goto Error; // cmsPipeline is already on virtual profile cmsPipelineFree(LUT); // Ok, done return hICC; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hICC != NULL) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit) { return cmsCreateInkLimitingDeviceLinkTHR(NULL, ColorSpace, Limit); } // Creates a fake Lab identity. cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 2.1); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); if (!SetTextTags(hProfile, L"Lab identity built-in")) goto Error; // An identity LUT is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint) { return cmsCreateLab2ProfileTHR(NULL, WhitePoint); } // Creates a fake Lab V4 identity. cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; cmsCIEXYZ xyz; if (WhitePoint == NULL) xyz = *cmsD50_XYZ(); else cmsxyY2XYZ(&xyz, WhitePoint); hProfile = cmsCreateRGBProfileTHR(ContextID, NULL, NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 4.4); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xyz)) goto Error; if (!SetTextTags(hProfile, L"Lab identity built-in")) goto Error; // An empty LUTs is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint) { return cmsCreateLab4ProfileTHR(NULL, WhitePoint); } // Creates a fake XYZ identity cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 4.4); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigXYZData); cmsSetPCS(hProfile, cmsSigXYZData); if (!SetTextTags(hProfile, L"XYZ identity built-in")) goto Error; // An identity LUT is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void) { return cmsCreateXYZProfileTHR(NULL); } //sRGB Curves are defined by: // //If R'sRGB,G'sRGB, B'sRGB < 0.04045 // // R = R'sRGB / 12.92 // G = G'sRGB / 12.92 // B = B'sRGB / 12.92 // // //else if R'sRGB,G'sRGB, B'sRGB >= 0.04045 // // R = ((R'sRGB + 0.055) / 1.055)^2.4 // G = ((G'sRGB + 0.055) / 1.055)^2.4 // B = ((B'sRGB + 0.055) / 1.055)^2.4 static cmsToneCurve* Build_sRGBGamma(cmsContext ContextID) { cmsFloat64Number Parameters[5]; Parameters[0] = 2.4; Parameters[1] = 1. / 1.055; Parameters[2] = 0.055 / 1.055; Parameters[3] = 1. / 12.92; Parameters[4] = 0.04045; return cmsBuildParametricToneCurve(ContextID, 4, Parameters); } // Create the ICC virtual profile for sRGB space cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID) { cmsCIExyY D65 = { 0.3127, 0.3290, 1.0 }; cmsCIExyYTRIPLE Rec709Primaries = { {0.6400, 0.3300, 1.0}, {0.3000, 0.6000, 1.0}, {0.1500, 0.0600, 1.0} }; cmsToneCurve* Gamma22[3]; cmsHPROFILE hsRGB; // cmsWhitePointFromTemp(&D65, 6504); Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID); if (Gamma22[0] == NULL) return NULL; hsRGB = cmsCreateRGBProfileTHR(ContextID, &D65, &Rec709Primaries, Gamma22); cmsFreeToneCurve(Gamma22[0]); if (hsRGB == NULL) return NULL; if (!SetTextTags(hsRGB, L"sRGB built-in")) { cmsCloseProfile(hsRGB); return NULL; } return hsRGB; } cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void) { return cmsCreate_sRGBProfileTHR(NULL); } /** * Oklab colorspace profile (experimental) * * This virtual profile cannot be saved as an ICC file */ cmsHPROFILE CMSEXPORT cmsCreate_OkLabProfile(cmsContext ctx) { cmsStage* XYZPCS = _cmsStageNormalizeFromXyzFloat(ctx); cmsStage* PCSXYZ = _cmsStageNormalizeToXyzFloat(ctx); const double M_D65_D50[] = { 1.047886, 0.022919, -0.050216, 0.029582, 0.990484, -0.017079, -0.009252, 0.015073, 0.751678 }; const double M_D50_D65[] = { 0.955512609517083, -0.023073214184645, 0.063308961782107, -0.028324949364887, 1.009942432477107, 0.021054814890112, 0.012328875695483, -0.020535835374141, 1.330713916450354 }; cmsStage* D65toD50 = cmsStageAllocMatrix(ctx, 3, 3, M_D65_D50, NULL); cmsStage* D50toD65 = cmsStageAllocMatrix(ctx, 3, 3, M_D50_D65, NULL); const double M_D65_LMS[] = { 0.8189330101, 0.3618667424, -0.1288597137, 0.0329845436, 0.9293118715, 0.0361456387, 0.0482003018, 0.2643662691, 0.6338517070 }; const double M_LMS_D65[] = { 1.227013851103521, -0.557799980651822, 0.281256148966468, -0.040580178423281, 1.112256869616830, -0.071676678665601, -0.076381284505707, -0.421481978418013, 1.586163220440795 }; cmsStage* D65toLMS = cmsStageAllocMatrix(ctx, 3, 3, M_D65_LMS, NULL); cmsStage* LMStoD65 = cmsStageAllocMatrix(ctx, 3, 3, M_LMS_D65, NULL); cmsToneCurve* CubeRoot = cmsBuildGamma(ctx, 1.0 / 3.0); cmsToneCurve* Cube = cmsBuildGamma(ctx, 3.0); cmsToneCurve* Roots[3] = { CubeRoot, CubeRoot, CubeRoot }; cmsToneCurve* Cubes[3] = { Cube, Cube, Cube }; cmsStage* NonLinearityFw = cmsStageAllocToneCurves(ctx, 3, Roots); cmsStage* NonLinearityRv = cmsStageAllocToneCurves(ctx, 3, Cubes); const double M_LMSprime_OkLab[] = { 0.2104542553, 0.7936177850, -0.0040720468, 1.9779984951, -2.4285922050, 0.4505937099, 0.0259040371, 0.7827717662, -0.8086757660 }; const double M_OkLab_LMSprime[] = { 0.999999998450520, 0.396337792173768, 0.215803758060759, 1.000000008881761, -0.105561342323656, -0.063854174771706, 1.000000054672411, -0.089484182094966, -1.291485537864092 }; cmsStage* LMSprime_OkLab = cmsStageAllocMatrix(ctx, 3, 3, M_LMSprime_OkLab, NULL); cmsStage* OkLab_LMSprime = cmsStageAllocMatrix(ctx, 3, 3, M_OkLab_LMSprime, NULL); cmsPipeline* AToB = cmsPipelineAlloc(ctx, 3, 3); cmsPipeline* BToA = cmsPipelineAlloc(ctx, 3, 3); cmsHPROFILE hProfile = cmsCreateProfilePlaceholder(ctx); if (!hProfile) // can't allocate goto error; cmsSetProfileVersion(hProfile, 4.4); cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); cmsSetColorSpace(hProfile, cmsSig3colorData); cmsSetPCS(hProfile, cmsSigXYZData); cmsSetHeaderRenderingIntent(hProfile, INTENT_RELATIVE_COLORIMETRIC); /** * Conversion PCS (XYZ/D50) to OkLab */ if (!cmsPipelineInsertStage(BToA, cmsAT_END, PCSXYZ)) goto error; if (!cmsPipelineInsertStage(BToA, cmsAT_END, D50toD65)) goto error; if (!cmsPipelineInsertStage(BToA, cmsAT_END, D65toLMS)) goto error; if (!cmsPipelineInsertStage(BToA, cmsAT_END, NonLinearityFw)) goto error; if (!cmsPipelineInsertStage(BToA, cmsAT_END, LMSprime_OkLab)) goto error; if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, BToA)) goto error; if (!cmsPipelineInsertStage(AToB, cmsAT_END, OkLab_LMSprime)) goto error; if (!cmsPipelineInsertStage(AToB, cmsAT_END, NonLinearityRv)) goto error; if (!cmsPipelineInsertStage(AToB, cmsAT_END, LMStoD65)) goto error; if (!cmsPipelineInsertStage(AToB, cmsAT_END, D65toD50)) goto error; if (!cmsPipelineInsertStage(AToB, cmsAT_END, XYZPCS)) goto error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB)) goto error; cmsPipelineFree(BToA); cmsPipelineFree(AToB); cmsFreeToneCurve(CubeRoot); cmsFreeToneCurve(Cube); return hProfile; error: cmsPipelineFree(BToA); cmsPipelineFree(AToB); cmsFreeToneCurve(CubeRoot); cmsFreeToneCurve(Cube); cmsCloseProfile(hProfile); return NULL; } typedef struct { cmsFloat64Number Brightness; cmsFloat64Number Contrast; cmsFloat64Number Hue; cmsFloat64Number Saturation; cmsBool lAdjustWP; cmsCIEXYZ WPsrc, WPdest; } BCHSWADJUSTS, *LPBCHSWADJUSTS; static int bchswSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { cmsCIELab LabIn, LabOut; cmsCIELCh LChIn, LChOut; cmsCIEXYZ XYZ; LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo; cmsLabEncoded2Float(&LabIn, In); cmsLab2LCh(&LChIn, &LabIn); // Do some adjusts on LCh LChOut.L = LChIn.L * bchsw ->Contrast + bchsw ->Brightness; LChOut.C = LChIn.C + bchsw -> Saturation; LChOut.h = LChIn.h + bchsw -> Hue; cmsLCh2Lab(&LabOut, &LChOut); // Move white point in Lab if (bchsw->lAdjustWP) { cmsLab2XYZ(&bchsw->WPsrc, &XYZ, &LabOut); cmsXYZ2Lab(&bchsw->WPdest, &LabOut, &XYZ); } // Back to encoded cmsFloat2LabEncoded(Out, &LabOut); return TRUE; } // Creates an abstract profile operating in Lab space for Brightness, // contrast, Saturation and white point displacement cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID, cmsUInt32Number nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, cmsUInt32Number TempSrc, cmsUInt32Number TempDest) { cmsHPROFILE hICC; cmsPipeline* Pipeline; BCHSWADJUSTS bchsw; cmsCIExyY WhitePnt; cmsStage* CLUT; cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; cmsUInt32Number i; bchsw.Brightness = Bright; bchsw.Contrast = Contrast; bchsw.Hue = Hue; bchsw.Saturation = Saturation; if (TempSrc == TempDest) { bchsw.lAdjustWP = FALSE; } else { bchsw.lAdjustWP = TRUE; cmsWhitePointFromTemp(&WhitePnt, TempSrc); cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt); cmsWhitePointFromTemp(&WhitePnt, TempDest); cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt); } hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetDeviceClass(hICC, cmsSigAbstractClass); cmsSetColorSpace(hICC, cmsSigLabData); cmsSetPCS(hICC, cmsSigLabData); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Creates a Pipeline with 3D grid only Pipeline = cmsPipelineAlloc(ContextID, 3, 3); if (Pipeline == NULL) { cmsCloseProfile(hICC); return NULL; } for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints; CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL); if (CLUT == NULL) goto Error; if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) goto Error; if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) goto Error; // Create tags if (!SetTextTags(hICC, L"BCHS built-in")) goto Error; if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*)cmsD50_XYZ())) goto Error; if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*)Pipeline)) goto Error; // Pipeline is already on virtual profile cmsPipelineFree(Pipeline); // Ok, done return hICC; Error: cmsPipelineFree(Pipeline); cmsCloseProfile(hICC); return NULL; } CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(cmsUInt32Number nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, cmsUInt32Number TempSrc, cmsUInt32Number TempDest) { return cmsCreateBCHSWabstractProfileTHR(NULL, nLUTPoints, Bright, Contrast, Hue, Saturation, TempSrc, TempDest); } // Creates a fake NULL profile. This profile return 1 channel as always 0. // Is useful only for gamut checking tricks cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; cmsStage* PostLin; cmsStage* OutLin; cmsToneCurve* EmptyTab[3]; cmsUInt16Number Zero[2] = { 0, 0 }; const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 }; hProfile = cmsCreateProfilePlaceholder(ContextID); if (!hProfile) // can't allocate return NULL; cmsSetProfileVersion(hProfile, 4.4); if (!SetTextTags(hProfile, L"NULL profile built-in")) goto Error; cmsSetDeviceClass(hProfile, cmsSigOutputClass); cmsSetColorSpace(hProfile, cmsSigGrayData); cmsSetPCS(hProfile, cmsSigLabData); // Create a valid ICC 4 structure LUT = cmsPipelineAlloc(ContextID, 3, 1); if (LUT == NULL) goto Error; EmptyTab[0] = EmptyTab[1] = EmptyTab[2] = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero); PostLin = cmsStageAllocToneCurves(ContextID, 3, EmptyTab); OutLin = cmsStageAllocToneCurves(ContextID, 1, EmptyTab); cmsFreeToneCurve(EmptyTab[0]); if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin)) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL))) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_END, OutLin)) goto Error; if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error; if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void) { return cmsCreateNULLProfileTHR(NULL); } static int IsPCS(cmsColorSpaceSignature ColorSpace) { return (ColorSpace == cmsSigXYZData || ColorSpace == cmsSigLabData); } static void FixColorSpaces(cmsHPROFILE hProfile, cmsColorSpaceSignature ColorSpace, cmsColorSpaceSignature PCS, cmsUInt32Number dwFlags) { if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) { if (IsPCS(ColorSpace) && IsPCS(PCS)) { cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, ColorSpace); cmsSetPCS(hProfile, PCS); return; } if (IsPCS(ColorSpace) && !IsPCS(PCS)) { cmsSetDeviceClass(hProfile, cmsSigOutputClass); cmsSetPCS(hProfile, ColorSpace); cmsSetColorSpace(hProfile, PCS); return; } if (IsPCS(PCS) && !IsPCS(ColorSpace)) { cmsSetDeviceClass(hProfile, cmsSigInputClass); cmsSetColorSpace(hProfile, ColorSpace); cmsSetPCS(hProfile, PCS); return; } } cmsSetDeviceClass(hProfile, cmsSigLinkClass); cmsSetColorSpace(hProfile, ColorSpace); cmsSetPCS(hProfile, PCS); } // This function creates a named color profile dumping all the contents of transform to a single profile // In this way, LittleCMS may be used to "group" several named color databases into a single profile. // It has, however, several minor limitations. PCS is always Lab, which is not very critic since this // is the normal PCS for named color profiles. static cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform) { _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; cmsHPROFILE hICC = NULL; cmsUInt32Number i, nColors; cmsNAMEDCOLORLIST *nc2 = NULL, *Original = NULL; // Create an empty placeholder hICC = cmsCreateProfilePlaceholder(v->ContextID); if (hICC == NULL) return NULL; // Critical information cmsSetDeviceClass(hICC, cmsSigNamedColorClass); cmsSetColorSpace(hICC, v ->ExitColorSpace); cmsSetPCS(hICC, cmsSigLabData); // Tag profile with information if (!SetTextTags(hICC, L"Named color devicelink")) goto Error; Original = cmsGetNamedColorList(xform); if (Original == NULL) goto Error; nColors = cmsNamedColorCount(Original); nc2 = cmsDupNamedColorList(Original); if (nc2 == NULL) goto Error; // Colorant count now depends on the output space nc2 ->ColorantCount = cmsPipelineOutputChannels(v ->Lut); // Make sure we have proper formatters cmsChangeBuffersFormat(xform, TYPE_NAMED_COLOR_INDEX, FLOAT_SH(0) | COLORSPACE_SH(_cmsLCMScolorSpace(v ->ExitColorSpace)) | BYTES_SH(2) | CHANNELS_SH(cmsChannelsOfColorSpace(v ->ExitColorSpace))); // Apply the transfor to colorants. for (i=0; i < nColors; i++) { cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1); } if (!cmsWriteTag(hICC, cmsSigNamedColor2Tag, (void*) nc2)) goto Error; cmsFreeNamedColorList(nc2); return hICC; Error: if (hICC != NULL) cmsCloseProfile(hICC); return NULL; } // This structure holds information about which MPU can be stored on a profile based on the version typedef struct { cmsBool IsV4; // Is a V4 tag? cmsTagSignature RequiredTag; // Set to 0 for both types cmsTagTypeSignature LutType; // The LUT type int nTypes; // Number of types (up to 5) cmsStageSignature MpeTypes[5]; // 5 is the maximum number } cmsAllowedLUT; #define cmsSig0 ((cmsTagSignature) 0) static const cmsAllowedLUT AllowedLUTTypes[] = { { FALSE, cmsSig0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, { FALSE, cmsSig0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, { FALSE, cmsSig0, cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType } }, { TRUE, cmsSig0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType } }, { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } }, { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 5, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 1, { cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 5, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }} }; #define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT)) // Check a single entry static cmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut) { cmsStage* mpe; int n; for (n=0, mpe = Lut ->Elements; mpe != NULL; mpe = mpe ->Next, n++) { if (n >= Tab ->nTypes) return FALSE; if (cmsStageType(mpe) != Tab ->MpeTypes[n]) return FALSE; } return (n == Tab ->nTypes); } static const cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4, cmsTagSignature DestinationTag) { cmsUInt32Number n; for (n=0; n < SIZE_OF_ALLOWED_LUT; n++) { const cmsAllowedLUT* Tab = AllowedLUTTypes + n; if (IsV4 ^ Tab -> IsV4) continue; if ((Tab ->RequiredTag != 0) && (Tab ->RequiredTag != DestinationTag)) continue; if (CheckOne(Tab, Lut)) return Tab; } return NULL; } // Does convert a transform into a device link profile cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags) { cmsHPROFILE hProfile = NULL; cmsUInt32Number FrmIn, FrmOut; cmsInt32Number ChansIn, ChansOut; int ColorSpaceBitsIn, ColorSpaceBitsOut; _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; cmsPipeline* LUT = NULL; cmsStage* mpe; cmsContext ContextID = cmsGetTransformContextID(hTransform); const cmsAllowedLUT* AllowedLUT; cmsTagSignature DestinationTag; cmsProfileClassSignature deviceClass; _cmsAssert(hTransform != NULL); // Check if the pipeline holding is valid if (xform -> Lut == NULL) return NULL; // Get the first mpe to check for named color mpe = cmsPipelineGetPtrToFirstStage(xform ->Lut); // Check if is a named color transform if (mpe != NULL) { if (cmsStageType(mpe) == cmsSigNamedColorElemType) { return CreateNamedColorDevicelink(hTransform); } } // First thing to do is to get a copy of the transformation LUT = cmsPipelineDup(xform ->Lut); if (LUT == NULL) return NULL; // Time to fix the Lab2/Lab4 issue. if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) { if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID))) goto Error; } // On the output side too. Note that due to V2/V4 PCS encoding on lab we cannot fix white misalignments if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) { dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID))) goto Error; } hProfile = cmsCreateProfilePlaceholder(ContextID); if (!hProfile) goto Error; // can't allocate cmsSetProfileVersion(hProfile, Version); FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags); // Optimize the LUT and precalculate a devicelink ChansIn = cmsChannelsOfColorSpace(xform -> EntryColorSpace); ChansOut = cmsChannelsOfColorSpace(xform -> ExitColorSpace); ColorSpaceBitsIn = _cmsLCMScolorSpace(xform -> EntryColorSpace); ColorSpaceBitsOut = _cmsLCMScolorSpace(xform -> ExitColorSpace); FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2); FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2); deviceClass = cmsGetDeviceClass(hProfile); if (deviceClass == cmsSigOutputClass) DestinationTag = cmsSigBToA0Tag; else DestinationTag = cmsSigAToB0Tag; // Check if the profile/version can store the result if (dwFlags & cmsFLAGS_FORCE_CLUT) AllowedLUT = NULL; else AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); if (AllowedLUT == NULL) { // Try to optimize _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); } // If no way, then force CLUT that for sure can be written if (AllowedLUT == NULL) { cmsStage* FirstStage; cmsStage* LastStage; dwFlags |= cmsFLAGS_FORCE_CLUT; _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); // Put identity curves if needed FirstStage = cmsPipelineGetPtrToFirstStage(LUT); if (FirstStage != NULL && FirstStage ->Type != cmsSigCurveSetElemType) if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn))) goto Error; LastStage = cmsPipelineGetPtrToLastStage(LUT); if (LastStage != NULL && LastStage ->Type != cmsSigCurveSetElemType) if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut))) goto Error; AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); } // Somethings is wrong... if (AllowedLUT == NULL) { goto Error; } if (dwFlags & cmsFLAGS_8BITS_DEVICELINK) cmsPipelineSetSaveAs8bitsFlag(LUT, TRUE); // Tag profile with information if (!SetTextTags(hProfile, L"devicelink")) goto Error; // Store result if (!cmsWriteTag(hProfile, DestinationTag, LUT)) goto Error; // Colorant tables have special rules depening on deviceClass if (xform -> InputColorant != NULL && (deviceClass == cmsSigLinkClass || deviceClass == cmsSigInputClass)) { if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->InputColorant)) goto Error; } if (xform -> OutputColorant != NULL) { if (deviceClass == cmsSigLinkClass) { if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error; } else { if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->OutputColorant)) goto Error; } } if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) { if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error; } // Set the white point if (deviceClass == cmsSigInputClass) { if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error; } else { if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error; } // Per 7.2.15 in spec 4.3 cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent); cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); cmsCloseProfile(hProfile); return NULL; } lcms2-2.19.1/src/lcms2_internal.h0000644000175000017500000011776515176573557015560 0ustar martimarti // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #ifndef _lcms_internal_H // Include plug-in foundation #ifndef _lcms_plugin_H # include "lcms2_plugin.h" #endif // ctype is part of C99 as per 7.1.2 #include // assert macro is part of C99 as per 7.2 #include // Some needed constants #ifndef M_PI # define M_PI 3.14159265358979323846 #endif #ifndef M_LOG10E # define M_LOG10E 0.434294481903251827651 #endif // BorlandC 5.5, VC2003 are broken on that #if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER < 1400)) // 1400 == VC++ 8.0 #define sinf(x) (float)sin((float)x) #define sqrtf(x) (float)sqrt((float)x) #endif // Alignment of ICC file format uses 4 bytes (cmsUInt32Number) #define _cmsALIGNLONG(x) (((x)+(sizeof(cmsUInt32Number)-1)) & ~(sizeof(cmsUInt32Number)-1)) // Alignment to memory pointer // (Ultra)SPARC with gcc requires ptr alignment of 8 bytes // even though sizeof(void *) is only four: for greatest flexibility // allow the build to specify ptr alignment. #ifndef CMS_PTR_ALIGNMENT # define CMS_PTR_ALIGNMENT sizeof(void *) #endif #define _cmsALIGNMEM(x) (((x)+(CMS_PTR_ALIGNMENT - 1)) & ~(CMS_PTR_ALIGNMENT - 1)) // Maximum encodeable values in floating point #define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) #define MIN_ENCODEABLE_ab2 (-128.0) #define MAX_ENCODEABLE_ab2 ((65535.0/256.0) - 128.0) #define MIN_ENCODEABLE_ab4 (-128.0) #define MAX_ENCODEABLE_ab4 (127.0) // Maximum of channels for internal pipeline evaluation #define MAX_STAGE_CHANNELS 128 // Unused parameter warning suppression #define cmsUNUSED_PARAMETER(x) ((void)x) // The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). // unfortunately VisualC++ does not conform that #if defined(_MSC_VER) || defined(__BORLANDC__) # define cmsINLINE __inline #else # define cmsINLINE static inline #endif // Allow signed overflow, we know this is harmless in this particular context #if defined(__clang__) # define CMS_NO_SANITIZE __attribute__((no_sanitize("signed-integer-overflow"))) #else # define CMS_NO_SANITIZE #endif // Other replacement functions #ifdef _MSC_VER # ifndef snprintf # define snprintf _snprintf # endif # ifndef vsnprintf # define vsnprintf _vsnprintf # endif /// Properly define some macros to accommodate /// older MSVC versions. # if defined(_MSC_VER) && _MSC_VER <= 1700 #include #define isnan _isnan #define isinf(x) (!_finite((x))) # endif #if !defined(_MSC_VER) && (defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L) #if !defined(isinf) #define isinf(x) (!finite((x))) #endif #endif #endif // A fast way to convert from/to 16 <-> 8 bits #define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) #define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((cmsUInt32Number)(rgb) * 65281U + 8388608U) >> 24) & 0xFFU) // Code analysis is broken on asserts #ifdef _MSC_VER # if (_MSC_VER >= 1500) # define _cmsAssert(a) { assert((a)); __analysis_assume((a)); } # else # define _cmsAssert(a) assert((a)) # endif #else # define _cmsAssert(a) assert((a)) #endif //--------------------------------------------------------------------------------- // Determinant lower than that are assumed zero (used on matrix invert) #define MATRIX_DET_TOLERANCE 0.0001 //--------------------------------------------------------------------------------- // Fixed point #define FIXED_TO_INT(x) ((x)>>16) #define FIXED_REST_TO_INT(x) ((x)&0xFFFFU) #define ROUND_FIXED_TO_INT(x) (((x)+0x8000)>>16) cmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a) { return a + ((a + 0x7fff) / 0xffff); } cmsINLINE int _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); } // ----------------------------------------------------------------------------------------------------------- // Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon // note than this only works in the range ..-32767...+32767 because // mantissa is interpreted as 15.16 fixed point. // The union is to avoid pointer aliasing overoptimization. cmsINLINE int _cmsQuickFloor(cmsFloat64Number val) { #ifdef CMS_DONT_USE_FAST_FLOOR return (int) floor(val); #else const cmsFloat64Number _lcms_double2fixmagic = 68719476736.0 * 1.5; // 2^36 * 1.5, (52-16=36) uses limited precision to floor union { cmsFloat64Number val; int halves[2]; } temp; temp.val = val + _lcms_double2fixmagic; #ifdef CMS_USE_BIG_ENDIAN return temp.halves[1] >> 16; #else return temp.halves[0] >> 16; #endif #endif } // Fast floor restricted to 0..65535.0 cmsINLINE cmsUInt16Number _cmsQuickFloorWord(cmsFloat64Number d) { return (cmsUInt16Number) _cmsQuickFloor(d - 32767.0) + 32767U; } // Floor to word, taking care of saturation cmsINLINE cmsUInt16Number _cmsQuickSaturateWord(cmsFloat64Number d) { d += 0.5; if (d <= 0) return 0; if (d >= 65535.0) return 0xffff; return _cmsQuickFloorWord(d); } // Test bed entry points--------------------------------------------------------------- #define CMSCHECKPOINT CMSAPI // Pthread support -------------------------------------------------------------------- #ifndef CMS_NO_PTHREADS // This is the threading support. Unfortunately, it has to be platform-dependent because // windows does not support pthreads. #ifdef CMS_IS_WINDOWS_ #define WIN32_LEAN_AND_MEAN 1 #include // The locking scheme in LCMS requires a single 'top level' mutex // to work. This is actually implemented on Windows as a // CriticalSection, because they are lighter weight. With // pthreads, this is statically inited. Unfortunately, windows // can't officially statically init critical sections. // // We can work around this in 2 ways. // // 1) We can use a proper mutex purely to protect the init // of the CriticalSection. This in turns requires us to protect // the Mutex creation, which we can do using the snappily // named InterlockedCompareExchangePointer API (present on // windows XP and above). // // 2) In cases where we want to work on pre-Windows XP, we // can use an even more horrible hack described below. // // So why wouldn't we always use 2)? Because not calling // the init function for a critical section means it fails // testing with ApplicationVerifier (and presumably similar // tools). // // We therefore default to 1, and people who want to be able // to run on pre-Windows XP boxes can build with: // CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT // defined. This is automatically set for builds using // versions of MSVC that don't have this API available. // // From: http://locklessinc.com/articles/pthreads_on_windows/ // The pthreads API has an initialization macro that has no correspondence to anything in // the windows API. By investigating the internal definition of the critical section type, // one may work out how to initialize one without calling InitializeCriticalSection(). // The trick here is that InitializeCriticalSection() is not allowed to fail. It tries // to allocate a critical section debug object, but if no memory is available, it sets // the pointer to a specific value. (One would expect that value to be NULL, but it is // actually (void *)-1 for some reason.) Thus we can use this special value for that // pointer, and the critical section code will work. // The other important part of the critical section type to initialize is the number // of waiters. This controls whether or not the mutex is locked. Fortunately, this // part of the critical section is unlikely to change. Apparently, many programs // already test critical sections to see if they are locked using this value, so // Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical // section, even when they changed the underlying algorithm to be more scalable. // The final parts of the critical section object are unimportant, and can be set // to zero for their defaults. This yields to an initialization macro: typedef CRITICAL_SECTION _cmsMutex; #ifdef _MSC_VER # if (_MSC_VER >= 1800) # pragma warning(disable : 26135) # pragma warning(disable : 4127) # endif #endif #ifndef CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT // If we are building with a version of MSVC smaller // than 1400 (i.e. before VS2005) then we don't have // the InterlockedCompareExchangePointer API, so use // the old version. # ifdef _MSC_VER # if _MSC_VER < 1400 # define CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT # endif # endif #endif #ifdef CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT # define CMS_MUTEX_INITIALIZER {(PRTL_CRITICAL_SECTION_DEBUG) -1,-1,0,0,0,0} #else # define CMS_MUTEX_INITIALIZER {(PRTL_CRITICAL_SECTION_DEBUG)NULL,-1,0,0,0,0} #endif cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) { EnterCriticalSection(m); return 0; } cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) { LeaveCriticalSection(m); return 0; } cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) { InitializeCriticalSection(m); return 0; } cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) { DeleteCriticalSection(m); return 0; } cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) { EnterCriticalSection(m); return 0; } cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) { LeaveCriticalSection(m); return 0; } #else // Rest of the wide world #include #define CMS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER typedef pthread_mutex_t _cmsMutex; cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) { return pthread_mutex_lock(m); } cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) { return pthread_mutex_unlock(m); } cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) { return pthread_mutex_init(m, NULL); } cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) { return pthread_mutex_destroy(m); } cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) { return pthread_mutex_lock(m); } cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) { return pthread_mutex_unlock(m); } #endif #else #define CMS_MUTEX_INITIALIZER 0 typedef int _cmsMutex; cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) { cmsUNUSED_PARAMETER(m); return 0; } cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) { cmsUNUSED_PARAMETER(m); return 0; } cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) { cmsUNUSED_PARAMETER(m); return 0; } cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) { cmsUNUSED_PARAMETER(m); return 0; } cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) { cmsUNUSED_PARAMETER(m); return 0; } cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) { cmsUNUSED_PARAMETER(m); return 0; } #endif // Plug-In registration --------------------------------------------------------------- // Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once. void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size); // Memory management cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Interpolation cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Parametric curves cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Formatters management cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Tag type management cmsBool _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Tag management cmsBool _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Intent management cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Multi Process elements cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Optimization cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Transform cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Mutex cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Parallelization cmsBool _cmsRegisterParallelizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // --------------------------------------------------------------------------------------------------------- // Suballocators. typedef struct _cmsSubAllocator_chunk_st { cmsUInt8Number* Block; cmsUInt32Number BlockSize; cmsUInt32Number Used; struct _cmsSubAllocator_chunk_st* next; } _cmsSubAllocator_chunk; typedef struct { cmsContext ContextID; _cmsSubAllocator_chunk* h; } _cmsSubAllocator; _cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial); void _cmsSubAllocDestroy(_cmsSubAllocator* s); void* _cmsSubAlloc(_cmsSubAllocator* s, cmsUInt32Number size); void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size); // ---------------------------------------------------------------------------------- // The context clients. typedef enum { UserPtr, // User-defined pointer Logger, AlarmCodesContext, AdaptationStateContext, MemPlugin, InterpPlugin, CurvesPlugin, FormattersPlugin, TagTypePlugin, TagPlugin, IntentPlugin, MPEPlugin, OptimizationPlugin, TransformPlugin, MutexPlugin, ParallelizationPlugin, // Last in list MemoryClientMax } _cmsMemoryClient; // Container for memory management plug-in. typedef struct { _cmsMallocFnPtrType MallocPtr; _cmsMalloZerocFnPtrType MallocZeroPtr; _cmsFreeFnPtrType FreePtr; _cmsReallocFnPtrType ReallocPtr; _cmsCallocFnPtrType CallocPtr; _cmsDupFnPtrType DupPtr; } _cmsMemPluginChunkType; // Copy memory management function pointers from plug-in to chunk, taking care of missing routines void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr); // Internal structure for context struct _cmsContext_struct { struct _cmsContext_struct* Next; // Points to next context in the new style _cmsSubAllocator* MemPool; // The memory pool that stores context data void* chunks[MemoryClientMax]; // array of pointers to client chunks. Memory itself is held in the suballocator. // If NULL, then it reverts to global Context0 _cmsMemPluginChunkType DefaultMemoryManager; // The allocators used for creating the context itself. Cannot be overridden }; // Returns a pointer to a valid context structure, including the global one if id is zero. // Verifies the magic number. struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID); // Returns the block assigned to the specific zone. void* _cmsContextGetClientChunk(cmsContext id, _cmsMemoryClient mc); // Chunks of context memory by plug-in client ------------------------------------------------------- // Those structures encapsulates all variables needed by the several context clients (mostly plug-ins) // Container for error logger -- not a plug-in typedef struct { cmsLogErrorHandlerFunction LogErrorHandler; // Set to NULL for Context0 fallback } _cmsLogErrorChunkType; // The global Context0 storage for error logger extern _cmsLogErrorChunkType _cmsLogErrorChunk; // Allocate and init error logger container. void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for alarm codes -- not a plug-in typedef struct { cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]; } _cmsAlarmCodesChunkType; // The global Context0 storage for alarm codes extern _cmsAlarmCodesChunkType _cmsAlarmCodesChunk; // Allocate and init alarm codes container. void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for adaptation state -- not a plug-in typedef struct { cmsFloat64Number AdaptationState; } _cmsAdaptationStateChunkType; // The global Context0 storage for adaptation state extern _cmsAdaptationStateChunkType _cmsAdaptationStateChunk; // Allocate and init adaptation state container. void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // The global Context0 storage for memory management extern _cmsMemPluginChunkType _cmsMemPluginChunk; // Allocate and init memory management container. void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for interpolation plug-in typedef struct { cmsInterpFnFactory Interpolators; } _cmsInterpPluginChunkType; // The global Context0 storage for interpolation plug-in extern _cmsInterpPluginChunkType _cmsInterpPluginChunk; // Allocate and init interpolation container. void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for parametric curves plug-in typedef struct { struct _cmsParametricCurvesCollection_st* ParametricCurves; } _cmsCurvesPluginChunkType; // The global Context0 storage for tone curves plug-in extern _cmsCurvesPluginChunkType _cmsCurvesPluginChunk; // Allocate and init parametric curves container. void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for formatters plug-in typedef struct { struct _cms_formatters_factory_list* FactoryList; } _cmsFormattersPluginChunkType; // The global Context0 storage for formatters plug-in extern _cmsFormattersPluginChunkType _cmsFormattersPluginChunk; // Allocate and init formatters container. void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // This chunk type is shared by TagType plug-in and MPE Plug-in typedef struct { struct _cmsTagTypeLinkedList_st* TagTypes; } _cmsTagTypePluginChunkType; // The global Context0 storage for tag types plug-in extern _cmsTagTypePluginChunkType _cmsTagTypePluginChunk; // The global Context0 storage for mult process elements plug-in extern _cmsTagTypePluginChunkType _cmsMPETypePluginChunk; // Allocate and init Tag types container. void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Allocate and init MPE container. void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for tag plug-in typedef struct { struct _cmsTagLinkedList_st* Tag; } _cmsTagPluginChunkType; // The global Context0 storage for tag plug-in extern _cmsTagPluginChunkType _cmsTagPluginChunk; // Allocate and init Tag container. void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for intents plug-in typedef struct { struct _cms_intents_list* Intents; } _cmsIntentsPluginChunkType; // The global Context0 storage for intents plug-in extern _cmsIntentsPluginChunkType _cmsIntentsPluginChunk; // Allocate and init intents container. void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for optimization plug-in typedef struct { struct _cmsOptimizationCollection_st* OptimizationCollection; } _cmsOptimizationPluginChunkType; // The global Context0 storage for optimizers plug-in extern _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk; // Allocate and init optimizers container. void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for transform plug-in typedef struct { struct _cmsTransformCollection_st* TransformCollection; } _cmsTransformPluginChunkType; // The global Context0 storage for full-transform replacement plug-in extern _cmsTransformPluginChunkType _cmsTransformPluginChunk; // Allocate and init transform container. void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for mutex plug-in typedef struct { _cmsCreateMutexFnPtrType CreateMutexPtr; _cmsDestroyMutexFnPtrType DestroyMutexPtr; _cmsLockMutexFnPtrType LockMutexPtr; _cmsUnlockMutexFnPtrType UnlockMutexPtr; } _cmsMutexPluginChunkType; // The global Context0 storage for mutex plug-in extern _cmsMutexPluginChunkType _cmsMutexPluginChunk; // Allocate and init mutex container. void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for parallelization plug-in typedef struct { cmsInt32Number MaxWorkers; // Number of workers to do as maximum cmsInt32Number WorkerFlags; // reserved _cmsTransform2Fn SchedulerFn; // callback to setup functions } _cmsParallelizationPluginChunkType; // The global Context0 storage for parallelization plug-in extern _cmsParallelizationPluginChunkType _cmsParallelizationPluginChunk; // Allocate parallelization container. void _cmsAllocParallelizationPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // ---------------------------------------------------------------------------------- // MLU internal representation typedef struct { cmsUInt16Number Language; cmsUInt16Number Country; cmsUInt32Number StrW; // Offset to current unicode string cmsUInt32Number Len; // Length in bytes } _cmsMLUentry; struct _cms_MLU_struct { cmsContext ContextID; // The directory cmsUInt32Number AllocatedEntries; cmsUInt32Number UsedEntries; _cmsMLUentry* Entries; // Array of pointers to strings allocated in MemPool // The Pool cmsUInt32Number PoolSize; // The maximum allocated size cmsUInt32Number PoolUsed; // The used size void* MemPool; // Pointer to begin of memory pool }; // Named color list internal representation typedef struct { char Name[cmsMAX_PATH]; cmsUInt16Number PCS[3]; cmsUInt16Number DeviceColorant[cmsMAXCHANNELS]; } _cmsNAMEDCOLOR; struct _cms_NAMEDCOLORLIST_struct { cmsUInt32Number nColors; cmsUInt32Number Allocated; cmsUInt32Number ColorantCount; char Prefix[33]; // Prefix and suffix are defined to be 32 characters at most char Suffix[33]; _cmsNAMEDCOLOR* List; cmsContext ContextID; }; // ---------------------------------------------------------------------------------- // This is the internal struct holding profile details. // Maximum supported tags in a profile #define MAX_TABLE_TAG 100 typedef struct _cms_iccprofile_struct { // I/O handler cmsIOHANDLER* IOhandler; // The thread ID cmsContext ContextID; // Creation time struct tm Created; // Color management module identification cmsUInt32Number CMM; // Only most important items found in ICC profiles cmsUInt32Number Version; cmsProfileClassSignature DeviceClass; cmsColorSpaceSignature ColorSpace; cmsColorSpaceSignature PCS; cmsUInt32Number RenderingIntent; cmsPlatformSignature platform; cmsUInt32Number flags; cmsUInt32Number manufacturer, model; cmsUInt64Number attributes; cmsUInt32Number creator; cmsProfileID ProfileID; // Dictionary cmsUInt32Number TagCount; cmsTagSignature TagNames[MAX_TABLE_TAG]; cmsTagSignature TagLinked[MAX_TABLE_TAG]; // The tag to which is linked (0=none) cmsUInt32Number TagSizes[MAX_TABLE_TAG]; // Size on disk cmsUInt32Number TagOffsets[MAX_TABLE_TAG]; cmsBool TagSaveAsRaw[MAX_TABLE_TAG]; // True to write uncooked void * TagPtrs[MAX_TABLE_TAG]; cmsTagTypeHandler* TagTypeHandlers[MAX_TABLE_TAG]; // Same structure may be serialized on different types // depending on profile version, so we keep track of the // type handler for each tag in the list. // Special cmsBool IsWrite; // Keep a mutex for cmsReadTag -- Note that this only works if the user includes a mutex plugin void * UsrMutex; } _cmsICCPROFILE; // IO helpers for profiles cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc); cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace); int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks); // Tag types cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig); cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig); cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig); cmsBool _cmsAvoidTypeCheckOnTags(cmsContext ContextID); // Error logging --------------------------------------------------------------------------------------------------------- void _cmsTagSignature2String(char String[5], cmsTagSignature sig); // Interpolation --------------------------------------------------------------------------------------------------------- CMSCHECKPOINT cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); CMSCHECKPOINT void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p); cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p); // Curves ---------------------------------------------------------------------------------------------------------------- // This struct holds information about a segment, plus a pointer to the function that implements the evaluation. // In the case of table-based, Eval pointer is set to NULL // The gamma function main structure struct _cms_curve_struct { cmsInterpParams* InterpParams; // Private optimizations for interpolation cmsUInt32Number nSegments; // Number of segments in the curve. Zero for a 16-bit based tables cmsCurveSegment* Segments; // The segments cmsInterpParams** SegInterp; // Array of private optimizations for interpolation in table-based segments cmsParametricCurveEvaluator* Evals; // Evaluators (one per segment) // 16 bit Table-based representation follows cmsUInt32Number nEntries; // Number of table elements cmsUInt16Number* Table16; // The table itself. }; // Pipelines & Stages --------------------------------------------------------------------------------------------- // A single stage struct _cmsStage_struct { cmsContext ContextID; cmsStageSignature Type; // Identifies the stage cmsStageSignature Implements; // Identifies the *function* of the stage (for optimizations) cmsUInt32Number InputChannels; // Input channels -- for optimization purposes cmsUInt32Number OutputChannels; // Output channels -- for optimization purposes _cmsStageEvalFn EvalPtr; // Points to fn that evaluates the stage (always in floating point) _cmsStageDupElemFn DupElemPtr; // Points to a fn that duplicates the *data* of the stage _cmsStageFreeElemFn FreePtr; // Points to a fn that sets the *data* of the stage free // A generic pointer to whatever memory needed by the stage void* Data; // Maintains linked list (used internally) struct _cmsStage_struct* Next; }; // Special Stages (cannot be saved) CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID); CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID); cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID); CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID); cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID); CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID); CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS); CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels); CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan); cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID); cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID); cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID); cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID); cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels); // For curve set only cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe); struct _cmsPipeline_struct { cmsStage* Elements; // Points to elements chain cmsUInt32Number InputChannels, OutputChannels; // Data & evaluators void *Data; _cmsPipelineEval16Fn Eval16Fn; _cmsPipelineEvalFloatFn EvalFloatFn; _cmsFreeUserDataFn FreeDataFn; _cmsDupUserDataFn DupDataFn; cmsContext ContextID; // Environment cmsBool SaveAs8Bits; // Implementation-specific: save as 8 bits if possible }; // LUT reading & creation ------------------------------------------------------------------------------------------- // Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy // of the LUTS, since ownership of original is up to the profile. The user should free allocated resources. CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); // Special values cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile); cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile); // Profile linker -------------------------------------------------------------------------------------------------- // Link several profiles to obtain a single LUT modelling the whole color transform. Intents, Black point // compensation and Adaptation parameters may vary across profiles. BPC and Adaptation refers to the PCS // after the profile. I.e, BPC[0] refers to connetion between profile(0) and profile(1) cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); // Sequence -------------------------------------------------------------------------------------------------------- cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile); cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq); cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]); // LUT optimization ------------------------------------------------------------------------------------------------ CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples); CMSAPI cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags); cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, cmsUInt16Number **White, cmsUInt16Number **Black, cmsUInt32Number *nOutputs); CMSAPI cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags ); // Hi level LUT building ---------------------------------------------------------------------------------------------- cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsUInt32Number nGamutPCSposition, cmsHPROFILE hGamut); // Formatters ------------------------------------------------------------------------------------------------------------ #define cmsFLAGS_CAN_CHANGE_FORMATTER 0x02000000 // Allow change buffer format cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type); cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type); CMSCHECKPOINT cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID, cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 cmsFormatterDirection Dir, cmsUInt32Number dwFlags); #ifndef CMS_NO_HALF_SUPPORT // Half float CMSCHECKPOINT cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h); CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt); #endif // Transform logic ------------------------------------------------------------------------------------------------------ struct _cmstransform_struct; typedef struct { // 1-pixel cache (16 bits only) cmsUInt16Number CacheIn[cmsMAXCHANNELS]; cmsUInt16Number CacheOut[cmsMAXCHANNELS]; } _cmsCACHE; // Transformation typedef struct _cmstransform_struct { cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference // Points to transform code _cmsTransform2Fn xform; // Formatters, cannot be embedded into LUT because cache cmsFormatter16 FromInput; cmsFormatter16 ToOutput; cmsFormatterFloat FromInputFloat; cmsFormatterFloat ToOutputFloat; // 1-pixel cache seed for zero as input (16 bits, read only) _cmsCACHE Cache; // A Pipeline holding the full (optimized) transform cmsPipeline* Lut; // A Pipeline holding the gamut check. It goes from the input space to bilevel cmsPipeline* GamutCheck; // Colorant tables cmsNAMEDCOLORLIST* InputColorant; // Input Colorant table cmsNAMEDCOLORLIST* OutputColorant; // Colorant table (for n chans > CMYK) // Informational only cmsColorSpaceSignature EntryColorSpace; cmsColorSpaceSignature ExitColorSpace; // White points (informative only) cmsCIEXYZ EntryWhitePoint; cmsCIEXYZ ExitWhitePoint; // Profiles used to create the transform cmsSEQ* Sequence; cmsUInt32Number dwOriginalFlags; cmsFloat64Number AdaptationState; // The intent of this transform. That is usually the last intent in the profilechain, but may differ cmsUInt32Number RenderingIntent; // An id that uniquely identifies the running context. May be null. cmsContext ContextID; // A user-defined pointer that can be used to store data for transform plug-ins void* UserData; _cmsFreeUserDataFn FreeUserData; // A way to provide backwards compatibility with full xform plugins _cmsTransformFn OldXform; // A one-worker transform entry for parallelization _cmsTransform2Fn Worker; cmsInt32Number MaxWorkers; cmsUInt32Number WorkerFlags; } _cmsTRANSFORM; // Copies extra channels from input to output if the original flags in the transform structure // instructs to do so. This function is called on all standard transform functions. void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride); // ----------------------------------------------------------------------------------------------------------------------- cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID, cmsUInt32Number nPoints, cmsUInt32Number nProfiles, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll); cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries); // thread-safe gettime cmsBool _cmsGetTime(struct tm* ptr_time); #define _lcms_internal_H #endif lcms2-2.19.1/src/cmsnamed.c0000644000175000017500000010630115176573557014406 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Multilocalized unicode objects. That is an attempt to encapsulate i18n. // Allocates an empty multi localizad unicode object cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems) { cmsMLU* mlu; // nItems should be positive if given if (nItems <= 0) nItems = 2; // Create the container mlu = (cmsMLU*) _cmsMallocZero(ContextID, sizeof(cmsMLU)); if (mlu == NULL) return NULL; mlu ->ContextID = ContextID; // Create entry array mlu ->Entries = (_cmsMLUentry*) _cmsCalloc(ContextID, nItems, sizeof(_cmsMLUentry)); if (mlu ->Entries == NULL) { _cmsFree(ContextID, mlu); return NULL; } // Ok, keep indexes up to date mlu ->AllocatedEntries = nItems; mlu ->UsedEntries = 0; return mlu; } // Grows a mempool table for a MLU. Each time this function is called, mempool size is multiplied times two. static cmsBool GrowMLUpool(cmsMLU* mlu) { cmsUInt32Number size; void *NewPtr; // Sanity check if (mlu == NULL) return FALSE; if (mlu ->PoolSize == 0) size = 256; else size = mlu ->PoolSize * 2; // Check for overflow if (size < mlu ->PoolSize) return FALSE; // Reallocate the pool NewPtr = _cmsRealloc(mlu ->ContextID, mlu ->MemPool, size); if (NewPtr == NULL) return FALSE; mlu ->MemPool = NewPtr; mlu ->PoolSize = size; return TRUE; } // Grows a entry table for a MLU. Each time this function is called, table size is multiplied times two. // No need to check integer overflow since that is 2*16*count = 2^32-1 ; => count = 128 M entries, // That would be 2Gb, which is over MAX_MEMORY_FOR_ALLOC, even for large file size. // I added this check to silence the continuous spam reports of people using AI to catch what // they think are "vulnerabilities". static cmsBool GrowMLUtable(cmsMLU* mlu) { cmsUInt32Number AllocatedEntries; _cmsMLUentry *NewPtr; // Sanity check if (mlu == NULL) return FALSE; AllocatedEntries = mlu ->AllocatedEntries * 2; // Check for overflow in count doubling: if wrapped, result < original if (AllocatedEntries < mlu->AllocatedEntries) return FALSE; // Check for overflow in byte-size multiplication: // dividing back by sizeof must recover the original count if ((AllocatedEntries * sizeof(_cmsMLUentry)) / sizeof(_cmsMLUentry) != AllocatedEntries) return FALSE; // Reallocate the memory NewPtr = (_cmsMLUentry*)_cmsRealloc(mlu ->ContextID, mlu ->Entries, AllocatedEntries*sizeof(_cmsMLUentry)); if (NewPtr == NULL) return FALSE; mlu ->Entries = NewPtr; mlu ->AllocatedEntries = AllocatedEntries; return TRUE; } // Search for a specific entry in the structure. Language and Country are used. static int SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode) { cmsUInt32Number i; // Sanity check if (mlu == NULL) return -1; // Iterate whole table for (i=0; i < mlu ->UsedEntries; i++) { if (mlu ->Entries[i].Country == CountryCode && mlu ->Entries[i].Language == LanguageCode) return (int) i; } // Not found return -1; } // Add a block of characters to the intended MLU. Language and country are specified. // Only one entry for Language/country pair is allowed. static cmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode) { cmsUInt32Number Offset; cmsUInt8Number* Ptr; // Sanity check if (mlu == NULL) return FALSE; // Is there any room available? if (mlu ->UsedEntries >= mlu ->AllocatedEntries) { if (!GrowMLUtable(mlu)) return FALSE; } // Only one ASCII string if (SearchMLUEntry(mlu, LanguageCode, CountryCode) >= 0) return FALSE; // Only one is allowed! // Check for size while ((mlu ->PoolSize - mlu ->PoolUsed) < size) { if (!GrowMLUpool(mlu)) return FALSE; } Offset = mlu ->PoolUsed; Ptr = (cmsUInt8Number*) mlu ->MemPool; if (Ptr == NULL) return FALSE; // Set the entry memmove(Ptr + Offset, Block, size); mlu ->PoolUsed += size; mlu ->Entries[mlu ->UsedEntries].StrW = Offset; mlu ->Entries[mlu ->UsedEntries].Len = size; mlu ->Entries[mlu ->UsedEntries].Country = CountryCode; mlu ->Entries[mlu ->UsedEntries].Language = LanguageCode; mlu ->UsedEntries++; return TRUE; } // Convert from a 3-char code to a cmsUInt16Number. It is done in this way because some // compilers don't properly align beginning of strings static cmsUInt16Number strTo16(const char str[3]) { const cmsUInt8Number* ptr8; cmsUInt16Number n; // For non-existent strings if (str == NULL) return 0; ptr8 = (const cmsUInt8Number*)str; n = (cmsUInt16Number)(((cmsUInt16Number)ptr8[0] << 8) | ptr8[1]); return n; } static void strFrom16(char str[3], cmsUInt16Number n) { str[0] = (char)(n >> 8); str[1] = (char)n; str[2] = (char)0; } // Convert from UTF8 to wchar, returns len. static cmsUInt32Number decodeUTF8(wchar_t* out, const char* in) { cmsUInt32Number codepoint = 0; cmsUInt32Number size = 0; while (*in) { cmsUInt8Number ch = (cmsUInt8Number) *in; if (ch <= 0x7f) { codepoint = ch; } else if (ch <= 0xbf) { codepoint = (codepoint << 6) | (ch & 0x3f); } else if (ch <= 0xdf) { codepoint = ch & 0x1f; } else if (ch <= 0xef) { codepoint = ch & 0x0f; } else { codepoint = ch & 0x07; } in++; if (((*in & 0xc0) != 0x80) && (codepoint <= 0x10ffff)) { if (sizeof(wchar_t) > 2) { if (out) *out++ = (wchar_t) codepoint; size++; } else if (codepoint > 0xffff) { if (out) { *out++ = (wchar_t)(0xd800 + (codepoint >> 10)); *out++ = (wchar_t)(0xdc00 + (codepoint & 0x03ff)); size += 2; } } else if (codepoint < 0xd800 || codepoint >= 0xe000) { if (out) *out++ = (wchar_t) codepoint; size++; } } } return size; } // Convert from wchar_t to UTF8 static cmsUInt32Number encodeUTF8(char* out, const wchar_t* in, cmsUInt32Number max_wchars, cmsUInt32Number max_chars) { cmsUInt32Number codepoint = 0; cmsUInt32Number size = 0; cmsUInt32Number len_w = 0; while (len_w < max_wchars && *in) { if (*in >= 0xd800 && *in <= 0xdbff) codepoint = ((*in - 0xd800) << 10) + 0x10000; else { if (*in >= 0xdc00 && *in <= 0xdfff) codepoint |= *in - 0xdc00; else codepoint = *in; if (codepoint <= 0x7f) { if (out && (size + 1 < max_chars)) *out++ = (char)codepoint; size++; } else if (codepoint <= 0x7ff) { if (out && (max_chars > 0) && (size + 2 < max_chars)) { *out++ = (char)(cmsUInt32Number)(0xc0 | ((codepoint >> 6) & 0x1f)); *out++ = (char)(cmsUInt32Number)(0x80 | (codepoint & 0x3f)); } size += 2; } else if (codepoint <= 0xffff) { if (out && (max_chars > 0) && (size + 3 < max_chars)) { *out++ = (char)(cmsUInt32Number)(0xe0 | ((codepoint >> 12) & 0x0f)); *out++ = (char)(cmsUInt32Number)(0x80 | ((codepoint >> 6) & 0x3f)); *out++ = (char)(cmsUInt32Number)(0x80 | (codepoint & 0x3f)); } size += 3; } else { if (out && (max_chars > 0) && (size + 4 < max_chars)) { *out++ = (char)(cmsUInt32Number)(0xf0 | ((codepoint >> 18) & 0x07)); *out++ = (char)(cmsUInt32Number)(0x80 | ((codepoint >> 12) & 0x3f)); *out++ = (char)(cmsUInt32Number)(0x80 | ((codepoint >> 6) & 0x3f)); *out++ = (char)(cmsUInt32Number)(0x80 | (codepoint & 0x3f)); } size += 4; } codepoint = 0; } in++; len_w++; } return size; } // Add an ASCII entry. Do not add any \0 termination (ICC1v43_2010-12.pdf page 61) // In the case the user explicitly sets an empty string, we force a \0 cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString) { cmsUInt32Number i, len = (cmsUInt32Number)strlen(ASCIIString); wchar_t* WStr; cmsBool rc; cmsUInt16Number Lang = strTo16(LanguageCode); cmsUInt16Number Cntry = strTo16(CountryCode); if (mlu == NULL) return FALSE; // len == 0 would prevent operation, so we set a empty string pointing to zero if (len == 0) { wchar_t empty = 0; return AddMLUBlock(mlu, sizeof(wchar_t), &empty, Lang, Cntry); } WStr = (wchar_t*)_cmsCalloc(mlu->ContextID, len, sizeof(wchar_t)); if (WStr == NULL) return FALSE; for (i = 0; i < len; i++) WStr[i] = (wchar_t)ASCIIString[i]; rc = AddMLUBlock(mlu, len * sizeof(wchar_t), WStr, Lang, Cntry); _cmsFree(mlu->ContextID, WStr); return rc; } // Add an UTF8 entry. Do not add any \0 termination (ICC1v43_2010-12.pdf page 61) // In the case the user explicitly sets an empty string, we force a \0 cmsBool CMSEXPORT cmsMLUsetUTF8(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* UTF8String) { cmsUInt32Number UTF8len; wchar_t* WStr; cmsBool rc; cmsUInt16Number Lang = strTo16(LanguageCode); cmsUInt16Number Cntry = strTo16(CountryCode); if (mlu == NULL) return FALSE; if (*UTF8String == '\0') { wchar_t empty = 0; return AddMLUBlock(mlu, sizeof(wchar_t), &empty, Lang, Cntry); } // Len excluding terminator 0 UTF8len = decodeUTF8(NULL, UTF8String); // Get space for dest WStr = (wchar_t*) _cmsCalloc(mlu ->ContextID, UTF8len, sizeof(wchar_t)); if (WStr == NULL) return FALSE; decodeUTF8(WStr, UTF8String); rc = AddMLUBlock(mlu, UTF8len * sizeof(wchar_t), WStr, Lang, Cntry); _cmsFree(mlu ->ContextID, WStr); return rc; } // We don't need any wcs support library static cmsUInt32Number mywcslen(const wchar_t *s) { const wchar_t *p; p = s; while (*p) p++; return (cmsUInt32Number)(p - s); } // Add a wide entry. Do not add any \0 terminator (ICC1v43_2010-12.pdf page 61) cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString) { cmsUInt16Number Lang = strTo16(Language); cmsUInt16Number Cntry = strTo16(Country); cmsUInt32Number len; if (mlu == NULL) return FALSE; if (WideString == NULL) return FALSE; len = (cmsUInt32Number) (mywcslen(WideString)) * sizeof(wchar_t); if (len == 0) len = sizeof(wchar_t); return AddMLUBlock(mlu, len, WideString, Lang, Cntry); } // Duplicating a MLU is as easy as copying all members cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu) { cmsMLU* NewMlu = NULL; // Duplicating a NULL obtains a NULL if (mlu == NULL) return NULL; NewMlu = cmsMLUalloc(mlu ->ContextID, mlu ->UsedEntries); if (NewMlu == NULL) return NULL; // Should never happen if (NewMlu ->AllocatedEntries < mlu ->UsedEntries) goto Error; // Sanitize... if (NewMlu ->Entries == NULL || mlu ->Entries == NULL) goto Error; memmove(NewMlu ->Entries, mlu ->Entries, mlu ->UsedEntries * sizeof(_cmsMLUentry)); NewMlu ->UsedEntries = mlu ->UsedEntries; // The MLU may be empty if (mlu ->PoolUsed == 0) { NewMlu ->MemPool = NULL; } else { // It is not empty NewMlu ->MemPool = _cmsMalloc(mlu ->ContextID, mlu ->PoolUsed); if (NewMlu ->MemPool == NULL) goto Error; } NewMlu ->PoolSize = mlu ->PoolUsed; if (NewMlu ->MemPool == NULL || mlu ->MemPool == NULL) goto Error; memmove(NewMlu ->MemPool, mlu->MemPool, mlu ->PoolUsed); NewMlu ->PoolUsed = mlu ->PoolUsed; return NewMlu; Error: if (NewMlu != NULL) cmsMLUfree(NewMlu); return NULL; } // Free any used memory void CMSEXPORT cmsMLUfree(cmsMLU* mlu) { if (mlu) { if (mlu -> Entries) _cmsFree(mlu ->ContextID, mlu->Entries); if (mlu -> MemPool) _cmsFree(mlu ->ContextID, mlu->MemPool); _cmsFree(mlu ->ContextID, mlu); } } // The algorithm first searches for an exact match of country and language, if not found it uses // the Language. If none is found, first entry is used instead. static const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu, cmsUInt32Number *len, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode, cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode) { cmsUInt32Number i; int Best = -1; _cmsMLUentry* v; if (mlu == NULL) return NULL; if (mlu -> AllocatedEntries <= 0) return NULL; for (i=0; i < mlu ->UsedEntries; i++) { v = mlu ->Entries + i; if (v -> Language == LanguageCode) { if (Best == -1) Best = (int) i; if (v -> Country == CountryCode) { if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country; if (len != NULL) *len = v ->Len; return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v -> StrW); // Found exact match } } } // No string found. Return First one if (Best == -1) Best = 0; v = mlu ->Entries + Best; if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country; if (len != NULL) *len = v ->Len; if (v->StrW + v->Len > mlu->PoolSize) return NULL; return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v ->StrW); } // Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize) { const wchar_t *Wide; cmsUInt32Number StrLen = 0; cmsUInt32Number ASCIIlen, i; cmsUInt16Number Lang = strTo16(LanguageCode); cmsUInt16Number Cntry = strTo16(CountryCode); // Sanitize if (mlu == NULL) return 0; // Get WideChar Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); if (Wide == NULL) return 0; ASCIIlen = StrLen / sizeof(wchar_t); // Maybe we want only to know the len? if (Buffer == NULL) return ASCIIlen + 1; // Note the zero at the end // No buffer size means no data if (BufferSize <= 0) return 0; // Some clipping may be required if (BufferSize < ASCIIlen + 1) ASCIIlen = BufferSize - 1; // Process each character for (i=0; i < ASCIIlen; i++) { wchar_t wc = Wide[i]; if (wc < 0xff) Buffer[i] = (char)wc; else Buffer[i] = '?'; } // We put a termination "\0" Buffer[ASCIIlen] = 0; return ASCIIlen + 1; } // Obtain a UTF8 representation of the wide string. Setting buffer to NULL returns the len cmsUInt32Number CMSEXPORT cmsMLUgetUTF8(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize) { const wchar_t *Wide; cmsUInt32Number StrLen = 0; cmsUInt32Number UTF8len; cmsUInt16Number Lang = strTo16(LanguageCode); cmsUInt16Number Cntry = strTo16(CountryCode); // Sanitize if (mlu == NULL) return 0; // Get WideChar Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); if (Wide == NULL) return 0; UTF8len = encodeUTF8(NULL, Wide, StrLen / sizeof(wchar_t), BufferSize); // Maybe we want only to know the len? if (Buffer == NULL) return UTF8len + 1; // Note the zero at the end // No buffer size means no data if (BufferSize <= 0) return 0; // Some clipping may be required if (BufferSize < UTF8len + 1) UTF8len = BufferSize - 1; // Process it encodeUTF8(Buffer, Wide, StrLen / sizeof(wchar_t), BufferSize); // We put a termination "\0" Buffer[UTF8len] = 0; return UTF8len + 1; } // Obtain a wide representation of the MLU, on depending on current locale settings cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize) { const wchar_t *Wide; cmsUInt32Number StrLen = 0; cmsUInt16Number Lang = strTo16(LanguageCode); cmsUInt16Number Cntry = strTo16(CountryCode); // Sanitize if (mlu == NULL) return 0; Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); if (Wide == NULL) return 0; // Maybe we want only to know the len? if (Buffer == NULL) return StrLen + sizeof(wchar_t); // Invalid buffer size means no data if (BufferSize < sizeof(wchar_t)) return 0; // Some clipping may be required if (BufferSize < StrLen + sizeof(wchar_t)) StrLen = BufferSize - sizeof(wchar_t); memmove(Buffer, Wide, StrLen); Buffer[StrLen / sizeof(wchar_t)] = 0; return StrLen + sizeof(wchar_t); } // Get also the language and country CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char ObtainedLanguage[3], char ObtainedCountry[3]) { const wchar_t *Wide; cmsUInt16Number Lang = strTo16(LanguageCode); cmsUInt16Number Cntry = strTo16(CountryCode); cmsUInt16Number ObtLang, ObtCode; // Sanitize if (mlu == NULL) return FALSE; Wide = _cmsMLUgetWide(mlu, NULL, Lang, Cntry, &ObtLang, &ObtCode); if (Wide == NULL) return FALSE; // Get used language and code strFrom16(ObtainedLanguage, ObtLang); strFrom16(ObtainedCountry, ObtCode); return TRUE; } // Get the number of translations in the MLU object cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu) { if (mlu == NULL) return 0; return mlu->UsedEntries; } // Get the language and country codes for a specific MLU index cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu, cmsUInt32Number idx, char LanguageCode[3], char CountryCode[3]) { _cmsMLUentry *entry; if (mlu == NULL) return FALSE; if (idx >= mlu->UsedEntries) return FALSE; entry = &mlu->Entries[idx]; strFrom16(LanguageCode, entry->Language); strFrom16(CountryCode, entry->Country); return TRUE; } // Named color lists -------------------------------------------------------------------------------------------- // Grow the list to keep at least NumElements static cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v) { cmsUInt32Number size; _cmsNAMEDCOLOR * NewPtr; if (v == NULL) return FALSE; if (v ->Allocated == 0) size = 64; // Initial guess else size = v ->Allocated * 2; // Keep a maximum color lists can grow, 100K entries seems reasonable if (size > 1024 * 100) { _cmsFree(v->ContextID, (void*) v->List); v->List = NULL; return FALSE; } NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR)); if (NewPtr == NULL) return FALSE; v ->List = NewPtr; v ->Allocated = size; return TRUE; } // Allocate a list for n elements cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix) { cmsNAMEDCOLORLIST* v; if (ColorantCount > cmsMAXCHANNELS) return NULL; v = (cmsNAMEDCOLORLIST*)_cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST)); if (v == NULL) return NULL; v ->List = NULL; v ->nColors = 0; v ->ContextID = ContextID; while (v -> Allocated < n) { if (!GrowNamedColorList(v)) { cmsFreeNamedColorList(v); return NULL; } } strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1); strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1); v->Prefix[32] = v->Suffix[32] = 0; v -> ColorantCount = ColorantCount; return v; } // Free a list void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v) { if (v == NULL) return; if (v ->List) _cmsFree(v ->ContextID, v ->List); _cmsFree(v ->ContextID, v); } cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v) { cmsNAMEDCOLORLIST* NewNC; if (v == NULL) return NULL; NewNC= cmsAllocNamedColorList(v ->ContextID, v -> nColors, v ->ColorantCount, v ->Prefix, v ->Suffix); if (NewNC == NULL) return NULL; // For really large tables we need this while (NewNC ->Allocated < v ->Allocated){ if (!GrowNamedColorList(NewNC)) { cmsFreeNamedColorList(NewNC); return NULL; } } memmove(NewNC ->Prefix, v ->Prefix, sizeof(v ->Prefix)); memmove(NewNC ->Suffix, v ->Suffix, sizeof(v ->Suffix)); NewNC ->ColorantCount = v ->ColorantCount; if (v->nColors > 0) memmove(NewNC->List, v ->List, v->nColors * sizeof(_cmsNAMEDCOLOR)); NewNC ->nColors = v ->nColors; return NewNC; } // Append a color to a list. List pointer may change if reallocated cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList, const char* Name, cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS]) { cmsUInt32Number i; if (NamedColorList == NULL) return FALSE; if (NamedColorList ->nColors + 1 > NamedColorList ->Allocated) { if (!GrowNamedColorList(NamedColorList)) return FALSE; } for (i=0; i < NamedColorList ->ColorantCount; i++) NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL ? (cmsUInt16Number)0 : Colorant[i]; for (i=0; i < 3; i++) NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? (cmsUInt16Number) 0 : PCS[i]; if (Name != NULL) { strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1); NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0; } else NamedColorList ->List[NamedColorList ->nColors].Name[0] = 0; NamedColorList ->nColors++; return TRUE; } // Returns number of elements cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* NamedColorList) { if (NamedColorList == NULL) return 0; return NamedColorList ->nColors; } // Info about a given color cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor, char* Name, char* Prefix, char* Suffix, cmsUInt16Number* PCS, cmsUInt16Number* Colorant) { if (NamedColorList == NULL) return FALSE; if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE; // strcpy instead of strncpy because many apps are using small buffers if (Name) strcpy(Name, NamedColorList->List[nColor].Name); if (Prefix) strcpy(Prefix, NamedColorList->Prefix); if (Suffix) strcpy(Suffix, NamedColorList->Suffix); if (PCS) memmove(PCS, NamedColorList ->List[nColor].PCS, 3*sizeof(cmsUInt16Number)); if (Colorant) memmove(Colorant, NamedColorList ->List[nColor].DeviceColorant, sizeof(cmsUInt16Number) * NamedColorList ->ColorantCount); return TRUE; } // Search for a given color name (no prefix or suffix) cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name) { cmsUInt32Number i; cmsUInt32Number n; if (NamedColorList == NULL) return -1; n = cmsNamedColorCount(NamedColorList); for (i=0; i < n; i++) { if (cmsstrcasecmp(Name, NamedColorList->List[i].Name) == 0) return (cmsInt32Number) i; } return -1; } // MPE support ----------------------------------------------------------------------------------------------------------------- static void FreeNamedColorList(cmsStage* mpe) { cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data; cmsFreeNamedColorList(List); } static void* DupNamedColorList(cmsStage* mpe) { cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data; return cmsDupNamedColorList(List); } static void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data; cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); if (index >= NamedColorList-> nColors) { cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range", index); Out[0] = Out[1] = Out[2] = 0.0f; } else { // Named color always uses Lab Out[0] = (cmsFloat32Number) (NamedColorList->List[index].PCS[0] / 65535.0); Out[1] = (cmsFloat32Number) (NamedColorList->List[index].PCS[1] / 65535.0); Out[2] = (cmsFloat32Number) (NamedColorList->List[index].PCS[2] / 65535.0); } } static void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data; cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); cmsUInt32Number j; if (index >= NamedColorList-> nColors) { cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range", index); for (j = 0; j < NamedColorList->ColorantCount; j++) Out[j] = 0.0f; } else { for (j=0; j < NamedColorList ->ColorantCount; j++) Out[j] = (cmsFloat32Number) (NamedColorList->List[index].DeviceColorant[j] / 65535.0); } } // Named color lookup element cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS) { return _cmsStageAllocPlaceholder(NamedColorList ->ContextID, cmsSigNamedColorElemType, 1, UsePCS ? 3 : NamedColorList ->ColorantCount, UsePCS ? EvalNamedColorPCS : EvalNamedColor, DupNamedColorList, FreeNamedColorList, cmsDupNamedColorList(NamedColorList)); } // Retrieve the named color list from a transform. Should be first element in the LUT cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform) { _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; cmsStage* mpe; if (v == NULL) return NULL; if (v->Lut == NULL) return NULL; mpe = v->Lut->Elements; if (mpe == NULL) return NULL; if (mpe ->Type != cmsSigNamedColorElemType) return NULL; return (cmsNAMEDCOLORLIST*) mpe ->Data; } // Profile sequence description routines ------------------------------------------------------------------------------------- cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n) { cmsSEQ* Seq; cmsUInt32Number i; if (n == 0) return NULL; // In a absolutely arbitrary way, I hereby decide to allow a maxim of 255 profiles linked // in a devicelink. It makes not sense anyway and may be used for exploits, so let's close the door! if (n > 255) return NULL; Seq = (cmsSEQ*) _cmsMallocZero(ContextID, sizeof(cmsSEQ)); if (Seq == NULL) return NULL; Seq -> ContextID = ContextID; Seq -> seq = (cmsPSEQDESC*) _cmsCalloc(ContextID, n, sizeof(cmsPSEQDESC)); Seq -> n = n; if (Seq -> seq == NULL) { _cmsFree(ContextID, Seq); return NULL; } for (i=0; i < n; i++) { Seq -> seq[i].Manufacturer = NULL; Seq -> seq[i].Model = NULL; Seq -> seq[i].Description = NULL; } return Seq; } void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq) { cmsUInt32Number i; if (pseq == NULL) return; if (pseq ->seq != NULL) { for (i=0; i < pseq ->n; i++) { if (pseq ->seq[i].Manufacturer != NULL) cmsMLUfree(pseq ->seq[i].Manufacturer); if (pseq ->seq[i].Model != NULL) cmsMLUfree(pseq ->seq[i].Model); if (pseq ->seq[i].Description != NULL) cmsMLUfree(pseq ->seq[i].Description); } _cmsFree(pseq ->ContextID, pseq ->seq); } _cmsFree(pseq -> ContextID, pseq); } cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq) { cmsSEQ *NewSeq; cmsUInt32Number i; if (pseq == NULL) return NULL; NewSeq = (cmsSEQ*)_cmsMallocZero(pseq->ContextID, sizeof(cmsSEQ)); if (NewSeq == NULL) return NULL; NewSeq->ContextID = pseq->ContextID; NewSeq->seq = (cmsPSEQDESC*)_cmsCalloc(pseq->ContextID, pseq->n, sizeof(cmsPSEQDESC)); if (NewSeq->seq == NULL) goto Error; NewSeq->n = pseq->n; for (i = 0; i < pseq->n; i++) { memmove(&NewSeq ->seq[i].attributes, &pseq ->seq[i].attributes, sizeof(cmsUInt64Number)); NewSeq ->seq[i].deviceMfg = pseq ->seq[i].deviceMfg; NewSeq ->seq[i].deviceModel = pseq ->seq[i].deviceModel; memmove(&NewSeq ->seq[i].ProfileID, &pseq ->seq[i].ProfileID, sizeof(cmsProfileID)); NewSeq ->seq[i].technology = pseq ->seq[i].technology; NewSeq ->seq[i].Manufacturer = cmsMLUdup(pseq ->seq[i].Manufacturer); NewSeq ->seq[i].Model = cmsMLUdup(pseq ->seq[i].Model); NewSeq ->seq[i].Description = cmsMLUdup(pseq ->seq[i].Description); } return NewSeq; Error: cmsFreeProfileSequenceDescription(NewSeq); return NULL; } // Dictionaries -------------------------------------------------------------------------------------------------------- // Dictionaries are just very simple linked lists typedef struct _cmsDICT_struct { cmsDICTentry* head; cmsContext ContextID; } _cmsDICT; // Allocate an empty dictionary cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID) { _cmsDICT* dict = (_cmsDICT*) _cmsMallocZero(ContextID, sizeof(_cmsDICT)); if (dict == NULL) return NULL; dict ->ContextID = ContextID; return (cmsHANDLE) dict; } // Dispose resources void CMSEXPORT cmsDictFree(cmsHANDLE hDict) { _cmsDICT* dict = (_cmsDICT*) hDict; cmsDICTentry *entry, *next; _cmsAssert(dict != NULL); // Walk the list freeing all nodes entry = dict ->head; while (entry != NULL) { if (entry ->DisplayName != NULL) cmsMLUfree(entry ->DisplayName); if (entry ->DisplayValue != NULL) cmsMLUfree(entry ->DisplayValue); if (entry ->Name != NULL) _cmsFree(dict ->ContextID, entry -> Name); if (entry ->Value != NULL) _cmsFree(dict ->ContextID, entry -> Value); // Don't fall in the habitual trap... next = entry ->Next; _cmsFree(dict ->ContextID, entry); entry = next; } _cmsFree(dict ->ContextID, dict); } // Duplicate a wide char string static wchar_t* DupWcs(cmsContext ContextID, const wchar_t* ptr) { if (ptr == NULL) return NULL; return (wchar_t*) _cmsDupMem(ContextID, ptr, (mywcslen(ptr) + 1) * sizeof(wchar_t)); } // Add a new entry to the linked list cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue) { _cmsDICT* dict = (_cmsDICT*) hDict; cmsDICTentry *entry; _cmsAssert(dict != NULL); _cmsAssert(Name != NULL); entry = (cmsDICTentry*) _cmsMallocZero(dict ->ContextID, sizeof(cmsDICTentry)); if (entry == NULL) return FALSE; entry ->DisplayName = cmsMLUdup(DisplayName); entry ->DisplayValue = cmsMLUdup(DisplayValue); entry ->Name = DupWcs(dict ->ContextID, Name); entry ->Value = DupWcs(dict ->ContextID, Value); entry ->Next = dict ->head; dict ->head = entry; return TRUE; } // Duplicates an existing dictionary cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict) { _cmsDICT* old_dict = (_cmsDICT*) hDict; cmsHANDLE hNew; cmsDICTentry *entry; _cmsAssert(old_dict != NULL); hNew = cmsDictAlloc(old_dict ->ContextID); if (hNew == NULL) return NULL; // Walk the list freeing all nodes entry = old_dict ->head; while (entry != NULL) { if (!cmsDictAddEntry(hNew, entry ->Name, entry ->Value, entry ->DisplayName, entry ->DisplayValue)) { cmsDictFree(hNew); return NULL; } entry = entry -> Next; } return hNew; } // Get a pointer to the linked list const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict) { _cmsDICT* dict = (_cmsDICT*) hDict; if (dict == NULL) return NULL; return dict ->head; } // Helper For external languages const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e) { if (e == NULL) return NULL; return e ->Next; } lcms2-2.19.1/src/cmsps2.c0000644000175000017500000013717615176573557014044 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // PostScript ColorRenderingDictionary and ColorSpaceArray #define MAXPSCOLS 60 // Columns on tables /* Implementation -------------- PostScript does use XYZ as its internal PCS. But since PostScript interpolation tables are limited to 8 bits, I use Lab as a way to improve the accuracy, favoring perceptual results. So, for the creation of each CRD, CSA the profiles are converted to Lab via a device link between profile -> Lab or Lab -> profile. The PS code necessary to convert Lab <-> XYZ is also included. Color Space Arrays (CSA) ================================================================================== In order to obtain precision, code chooses between three ways to implement the device -> XYZ transform. These cases identifies monochrome profiles (often implemented as a set of curves), matrix-shaper and Pipeline-based. Monochrome ----------- This is implemented as /CIEBasedA CSA. The prelinearization curve is placed into /DecodeA section, and matrix equals to D50. Since here is no interpolation tables, I do the conversion directly to XYZ NOTE: CLUT-based monochrome profiles are NOT supported. So, cmsFLAGS_MATRIXINPUT flag is forced on such profiles. [ /CIEBasedA << /DecodeA { transfer function } bind /MatrixA [D50] /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ] /WhitePoint [D50] /BlackPoint [BP] /RenderingIntent (intent) >> ] On simpler profiles, the PCS is already XYZ, so no conversion is required. Matrix-shaper based ------------------- This is implemented both with /CIEBasedABC or /CIEBasedDEF depending on the profile implementation. Since here there are no interpolation tables, I do the conversion directly to XYZ [ /CIEBasedABC << /DecodeABC [ {transfer1} {transfer2} {transfer3} ] /MatrixABC [Matrix] /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ] /DecodeLMN [ { / 2} dup dup ] /WhitePoint [D50] /BlackPoint [BP] /RenderingIntent (intent) >> ] CLUT based ---------- Lab is used in such cases. [ /CIEBasedDEF << /DecodeDEF [ ] /Table [ p p p [<...>]] /RangeABC [ 0 1 0 1 0 1] /DecodeABC[ ] /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ] % -128/500 1+127/500 0 1 -127/200 1+128/200 /MatrixABC [ 1 1 1 1 0 0 0 0 -1] /WhitePoint [D50] /BlackPoint [BP] /RenderingIntent (intent) ] Color Rendering Dictionaries (CRD) ================================== These are always implemented as CLUT, and always are using Lab. Since CRD are expected to be used as resources, the code adds the definition as well. << /ColorRenderingType 1 /WhitePoint [ D50 ] /BlackPoint [BP] /MatrixPQR [ Bradford ] /RangePQR [-0.125 1.375 -0.125 1.375 -0.125 1.375 ] /TransformPQR [ {4 index 3 get div 2 index 3 get mul exch pop exch pop exch pop exch pop } bind {4 index 4 get div 2 index 4 get mul exch pop exch pop exch pop exch pop } bind {4 index 5 get div 2 index 5 get mul exch pop exch pop exch pop exch pop } bind ] /MatrixABC <...> /EncodeABC <...> /RangeABC <.. used for XYZ -> Lab> /EncodeLMN /RenderTable [ p p p [<...>]] /RenderingIntent (Perceptual) >> /Current exch /ColorRendering defineresource pop The following stages are used to convert from XYZ to Lab -------------------------------------------------------- Input is given at LMN stage on X, Y, Z Encode LMN gives us f(X/Xn), f(Y/Yn), f(Z/Zn) /EncodeLMN [ { 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind { 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind { 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind ] MatrixABC is used to compute f(Y/Yn), f(X/Xn) - f(Y/Yn), f(Y/Yn) - f(Z/Zn) | 0 1 0| | 1 -1 0| | 0 1 -1| /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ] EncodeABC finally gives Lab values. /EncodeABC [ { 116 mul 16 sub 100 div } bind { 500 mul 128 add 255 div } bind { 200 mul 128 add 255 div } bind ] The following stages are used to convert Lab to XYZ ---------------------------------------------------- /RangeABC [ 0 1 0 1 0 1] /DecodeABC [ { 100 mul 16 add 116 div } bind { 255 mul 128 sub 500 div } bind { 255 mul 128 sub 200 div } bind ] /MatrixABC [ 1 1 1 1 0 0 0 0 -1] /DecodeLMN [ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind ] */ /* PostScript algorithms discussion. ========================================================================================================= 1D interpolation algorithm 1D interpolation (float) ------------------------ val2 = Domain * Value; cell0 = (int) floor(val2); cell1 = (int) ceil(val2); rest = val2 - cell0; y0 = LutTable[cell0] ; y1 = LutTable[cell1] ; y = y0 + (y1 - y0) * rest; PostScript code Stack ================================================ { % v [array] % v tab dup % v tab tab length 1 sub % v tab dom 3 -1 roll % tab dom v mul % tab val2 dup % tab val2 val2 dup % tab val2 val2 val2 floor cvi % tab val2 val2 cell0 exch % tab val2 cell0 val2 ceiling cvi % tab val2 cell0 cell1 3 index % tab val2 cell0 cell1 tab exch % tab val2 cell0 tab cell1 get % tab val2 cell0 y1 4 -1 roll % val2 cell0 y1 tab 3 -1 roll % val2 y1 tab cell0 get % val2 y1 y0 dup % val2 y1 y0 y0 3 1 roll % val2 y0 y1 y0 sub % val2 y0 (y1-y0) 3 -1 roll % y0 (y1-y0) val2 dup % y0 (y1-y0) val2 val2 floor cvi % y0 (y1-y0) val2 floor(val2) sub % y0 (y1-y0) rest mul % y0 t1 add % y 65535 div % result } bind */ // This struct holds the memory block currently being write typedef struct { _cmsStageCLutData* Pipeline; cmsIOHANDLER* m; int FirstComponent; int SecondComponent; const char* PreMaj; const char* PostMaj; const char* PreMin; const char* PostMin; int FixWhite; // Force mapping of pure white cmsColorSpaceSignature ColorSpace; // ColorSpace of profile } cmsPsSamplerCargo; static int _cmsPSActualColumn = 0; // Convert to byte static cmsUInt8Number Word2Byte(cmsUInt16Number w) { return (cmsUInt8Number) floor((cmsFloat64Number) w / 257.0 + 0.5); } // Write a cooked byte static void WriteByte(cmsIOHANDLER* m, cmsUInt8Number b) { _cmsIOPrintf(m, "%02x", b); _cmsPSActualColumn += 2; if (_cmsPSActualColumn > MAXPSCOLS) { _cmsIOPrintf(m, "\n"); _cmsPSActualColumn = 0; } } // ----------------------------------------------------------------- PostScript generation // Removes offending carriage returns static char* RemoveCR(const char* txt) { static char Buffer[2048]; char* pt; strncpy(Buffer, txt, 2047); Buffer[2047] = 0; for (pt = Buffer; *pt; pt++) if (*pt == '\n' || *pt == '\r') *pt = ' '; return Buffer; } // Writes the body of a PostScript string literal, escaping the metacharacters // '\\', '(' and ')' and emitting non-printable / high-bit bytes as octal // triples per PLRM 3.3.4.1. The caller is responsible for the surrounding // '(' and ')' delimiters. static void EmitPSEscaped(cmsIOHANDLER* m, const char* txt) { const unsigned char* p; if (txt == NULL) return; for (p = (const unsigned char*)txt; *p != 0; p++) { unsigned char c = *p; if (c == '\\' || c == '(' || c == ')') { _cmsIOPrintf(m, "\\%c", c); } else if (c < 0x20 || c >= 0x7F) { _cmsIOPrintf(m, "\\%03o", c); } else { _cmsIOPrintf(m, "%c", c); } } } static void EmitHeader(cmsIOHANDLER* m, const char* Title, cmsHPROFILE hProfile) { time_t timer; cmsMLU *Description, *Copyright; char DescASCII[256], CopyrightASCII[256]; time(&timer); Description = (cmsMLU*) cmsReadTag(hProfile, cmsSigProfileDescriptionTag); Copyright = (cmsMLU*) cmsReadTag(hProfile, cmsSigCopyrightTag); DescASCII[0] = DescASCII[255] = 0; CopyrightASCII[0] = CopyrightASCII[255] = 0; if (Description != NULL) cmsMLUgetASCII(Description, cmsNoLanguage, cmsNoCountry, DescASCII, 255); if (Copyright != NULL) cmsMLUgetASCII(Copyright, cmsNoLanguage, cmsNoCountry, CopyrightASCII, 255); _cmsIOPrintf(m, "%%!PS-Adobe-3.0\n"); _cmsIOPrintf(m, "%%\n"); _cmsIOPrintf(m, "%% %s\n", Title); _cmsIOPrintf(m, "%% Source: %s\n", RemoveCR(DescASCII)); _cmsIOPrintf(m, "%% %s\n", RemoveCR(CopyrightASCII)); _cmsIOPrintf(m, "%% Created: %s", ctime(&timer)); // ctime appends a \n!!! _cmsIOPrintf(m, "%%\n"); _cmsIOPrintf(m, "%%%%BeginResource\n"); } // Emits White & Black point. White point is always D50, Black point is the device // Black point adapted to D50. static void EmitWhiteBlackD50(cmsIOHANDLER* m, cmsCIEXYZ* BlackPoint) { _cmsIOPrintf(m, "/BlackPoint [%f %f %f]\n", BlackPoint -> X, BlackPoint -> Y, BlackPoint -> Z); _cmsIOPrintf(m, "/WhitePoint [%f %f %f]\n", cmsD50_XYZ()->X, cmsD50_XYZ()->Y, cmsD50_XYZ()->Z); } static void EmitRangeCheck(cmsIOHANDLER* m) { _cmsIOPrintf(m, "dup 0.0 lt { pop 0.0 } if " "dup 1.0 gt { pop 1.0 } if "); } // Does write the intent static void EmitIntent(cmsIOHANDLER* m, cmsUInt32Number RenderingIntent) { const char *intent; switch (RenderingIntent) { case INTENT_PERCEPTUAL: intent = "Perceptual"; break; case INTENT_RELATIVE_COLORIMETRIC: intent = "RelativeColorimetric"; break; case INTENT_ABSOLUTE_COLORIMETRIC: intent = "AbsoluteColorimetric"; break; case INTENT_SATURATION: intent = "Saturation"; break; default: intent = "Undefined"; break; } _cmsIOPrintf(m, "/RenderingIntent (%s)\n", intent ); } // // Convert L* to Y // // Y = Yn*[ (L* + 16) / 116] ^ 3 if (L*) >= 6 / 29 // = Yn*( L* / 116) / 7.787 if (L*) < 6 / 29 // // Lab -> XYZ, see the discussion above static void EmitLab2XYZ(cmsIOHANDLER* m) { _cmsIOPrintf(m, "/RangeABC [ 0 1 0 1 0 1]\n"); _cmsIOPrintf(m, "/DecodeABC [\n"); _cmsIOPrintf(m, "{100 mul 16 add 116 div } bind\n"); _cmsIOPrintf(m, "{255 mul 128 sub 500 div } bind\n"); _cmsIOPrintf(m, "{255 mul 128 sub 200 div } bind\n"); _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n"); _cmsIOPrintf(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n"); _cmsIOPrintf(m, "/DecodeLMN [\n"); _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n"); _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n"); _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\n"); _cmsIOPrintf(m, "]\n"); } // Outputs a table of words. It does use 16 bits static void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table) { cmsUInt32Number i; cmsFloat64Number gamma; /** * On error, empty tables or lienar assume gamma 1.0 */ if (Table == NULL || Table->nEntries <= 0 || cmsIsToneCurveLinear(Table)) { _cmsIOPrintf(m, "{ 1 } bind "); return; } // Check if is really an exponential. If so, emit "exp" gamma = cmsEstimateGamma(Table, 0.001); if (gamma > 0) { _cmsIOPrintf(m, "{ %g exp } bind ", gamma); return; } _cmsIOPrintf(m, "{ "); // Bounds check EmitRangeCheck(m); // Emit interpolation code // PostScript code Stack // =============== ======================== // v _cmsIOPrintf(m, " ["); for (i=0; i < Table->nEntries; i++) { if (i % 10 == 0) _cmsIOPrintf(m, "\n "); _cmsIOPrintf(m, "%d ", Table->Table16[i]); } _cmsIOPrintf(m, "] "); // v tab _cmsIOPrintf(m, "dup "); // v tab tab _cmsIOPrintf(m, "length 1 sub "); // v tab dom _cmsIOPrintf(m, "3 -1 roll "); // tab dom v _cmsIOPrintf(m, "mul "); // tab val2 _cmsIOPrintf(m, "dup "); // tab val2 val2 _cmsIOPrintf(m, "dup "); // tab val2 val2 val2 _cmsIOPrintf(m, "floor cvi "); // tab val2 val2 cell0 _cmsIOPrintf(m, "exch "); // tab val2 cell0 val2 _cmsIOPrintf(m, "ceiling cvi "); // tab val2 cell0 cell1 _cmsIOPrintf(m, "3 index "); // tab val2 cell0 cell1 tab _cmsIOPrintf(m, "exch "); // tab val2 cell0 tab cell1 _cmsIOPrintf(m, "get\n "); // tab val2 cell0 y1 _cmsIOPrintf(m, "4 -1 roll "); // val2 cell0 y1 tab _cmsIOPrintf(m, "3 -1 roll "); // val2 y1 tab cell0 _cmsIOPrintf(m, "get "); // val2 y1 y0 _cmsIOPrintf(m, "dup "); // val2 y1 y0 y0 _cmsIOPrintf(m, "3 1 roll "); // val2 y0 y1 y0 _cmsIOPrintf(m, "sub "); // val2 y0 (y1-y0) _cmsIOPrintf(m, "3 -1 roll "); // y0 (y1-y0) val2 _cmsIOPrintf(m, "dup "); // y0 (y1-y0) val2 val2 _cmsIOPrintf(m, "floor cvi "); // y0 (y1-y0) val2 floor(val2) _cmsIOPrintf(m, "sub "); // y0 (y1-y0) rest _cmsIOPrintf(m, "mul "); // y0 t1 _cmsIOPrintf(m, "add "); // y _cmsIOPrintf(m, "65535 div\n"); // result _cmsIOPrintf(m, " } bind "); } // Compare gamma table static cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, cmsUInt32Number nG1, cmsUInt32Number nG2) { if (nG1 != nG2) return FALSE; return memcmp(g1, g2, nG1 * sizeof(cmsUInt16Number)) == 0; } // Does write a set of gamma curves static void EmitNGamma(cmsIOHANDLER* m, cmsUInt32Number n, cmsToneCurve* g[]) { cmsUInt32Number i; for( i=0; i < n; i++ ) { if (g[i] == NULL) return; // Error if (i > 0 && GammaTableEquals(g[i-1]->Table16, g[i]->Table16, g[i-1]->nEntries, g[i]->nEntries)) { _cmsIOPrintf(m, "dup "); } else { Emit1Gamma(m, g[i]); } } } // Following code dumps a LUT onto memory stream // This is the sampler. Intended to work in SAMPLER_INSPECT mode, // that is, the callback will be called for each knot with // // In[] The grid location coordinates, normalized to 0..ffff // Out[] The Pipeline values, normalized to 0..ffff // // Returning a value other than 0 does terminate the sampling process // // Each row contains Pipeline values for all but first component. So, I // detect row changing by keeping a copy of last value of first // component. -1 is used to mark beginning of whole block. static int OutputValueSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { cmsPsSamplerCargo* sc = (cmsPsSamplerCargo*) Cargo; cmsUInt32Number i; if (sc -> FixWhite) { if (In[0] == 0xFFFF) { // Only in L* = 100, ab = [-8..8] if ((In[1] >= 0x7800 && In[1] <= 0x8800) && (In[2] >= 0x7800 && In[2] <= 0x8800)) { cmsUInt16Number* Black; cmsUInt16Number* White; cmsUInt32Number nOutputs; if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs)) return 0; for (i=0; i < nOutputs; i++) Out[i] = White[i]; } } } // Handle the parenthesis on rows if (In[0] != sc ->FirstComponent) { if (sc ->FirstComponent != -1) { _cmsIOPrintf(sc ->m, sc ->PostMin); sc ->SecondComponent = -1; _cmsIOPrintf(sc ->m, sc ->PostMaj); } // Begin block _cmsPSActualColumn = 0; _cmsIOPrintf(sc ->m, sc ->PreMaj); sc ->FirstComponent = In[0]; } if (In[1] != sc ->SecondComponent) { if (sc ->SecondComponent != -1) { _cmsIOPrintf(sc ->m, sc ->PostMin); } _cmsIOPrintf(sc ->m, sc ->PreMin); sc ->SecondComponent = In[1]; } // Dump table. for (i=0; i < sc -> Pipeline ->Params->nOutputs; i++) { cmsUInt16Number wWordOut = Out[i]; cmsUInt8Number wByteOut; // Value as byte // We always deal with Lab4 wByteOut = Word2Byte(wWordOut); WriteByte(sc -> m, wByteOut); } return 1; } // Writes a Pipeline on memstream. Could be 8 or 16 bits based static void WriteCLUT(cmsIOHANDLER* m, cmsStage* mpe, const char* PreMaj, const char* PostMaj, const char* PreMin, const char* PostMin, int FixWhite, cmsColorSpaceSignature ColorSpace) { cmsUInt32Number i; cmsPsSamplerCargo sc; sc.FirstComponent = -1; sc.SecondComponent = -1; sc.Pipeline = (_cmsStageCLutData *) mpe ->Data; sc.m = m; sc.PreMaj = PreMaj; sc.PostMaj= PostMaj; sc.PreMin = PreMin; sc.PostMin = PostMin; sc.FixWhite = FixWhite; sc.ColorSpace = ColorSpace; if (sc.Pipeline != NULL && sc.Pipeline->Params != NULL) { _cmsIOPrintf(m, "["); for (i = 0; i < sc.Pipeline->Params->nInputs; i++) { if (i < MAX_INPUT_DIMENSIONS) _cmsIOPrintf(m, " %d ", sc.Pipeline->Params->nSamples[i]); } _cmsIOPrintf(m, " [\n"); cmsStageSampleCLut16bit(mpe, OutputValueSampler, (void*)&sc, SAMPLER_INSPECT); _cmsIOPrintf(m, PostMin); _cmsIOPrintf(m, PostMaj); _cmsIOPrintf(m, "] "); } } // Dumps CIEBasedA Color Space Array static int EmitCIEBasedA(cmsIOHANDLER* m, cmsToneCurve* Curve, cmsCIEXYZ* BlackPoint) { _cmsIOPrintf(m, "[ /CIEBasedA\n"); _cmsIOPrintf(m, " <<\n"); _cmsIOPrintf(m, "/DecodeA "); Emit1Gamma(m, Curve); _cmsIOPrintf(m, " \n"); _cmsIOPrintf(m, "/MatrixA [ 0.9642 1.0000 0.8249 ]\n"); _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n"); EmitWhiteBlackD50(m, BlackPoint); EmitIntent(m, INTENT_PERCEPTUAL); _cmsIOPrintf(m, ">>\n"); _cmsIOPrintf(m, "]\n"); return 1; } // Dumps CIEBasedABC Color Space Array static int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** CurveSet, cmsCIEXYZ* BlackPoint) { int i; _cmsIOPrintf(m, "[ /CIEBasedABC\n"); _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "/DecodeABC [ "); EmitNGamma(m, 3, CurveSet); _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/MatrixABC [ " ); for( i=0; i < 3; i++ ) { _cmsIOPrintf(m, "%.6f %.6f %.6f ", Matrix[i + 3*0], Matrix[i + 3*1], Matrix[i + 3*2]); } _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n"); EmitWhiteBlackD50(m, BlackPoint); EmitIntent(m, INTENT_PERCEPTUAL); _cmsIOPrintf(m, ">>\n"); _cmsIOPrintf(m, "]\n"); return 1; } static int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, cmsUInt32Number Intent, cmsCIEXYZ* BlackPoint) { const char* PreMaj; const char* PostMaj; const char* PreMin, *PostMin; cmsStage* mpe; mpe = Pipeline->Elements; switch (cmsStageInputChannels(mpe)) { case 3: _cmsIOPrintf(m, "[ /CIEBasedDEF\n"); PreMaj = "<"; PostMaj = ">\n"; PreMin = PostMin = ""; break; case 4: _cmsIOPrintf(m, "[ /CIEBasedDEFG\n"); PreMaj = "["; PostMaj = "]\n"; PreMin = "<"; PostMin = ">\n"; break; default: return 0; } _cmsIOPrintf(m, "<<\n"); if (cmsStageType(mpe) == cmsSigCurveSetElemType) { _cmsIOPrintf(m, "/DecodeDEF [ "); EmitNGamma(m, cmsStageOutputChannels(mpe), _cmsStageGetPtrToCurveSet(mpe)); _cmsIOPrintf(m, "]\n"); mpe = mpe ->Next; } if (cmsStageType(mpe) == cmsSigCLutElemType) { _cmsIOPrintf(m, "/Table "); WriteCLUT(m, mpe, PreMaj, PostMaj, PreMin, PostMin, FALSE, (cmsColorSpaceSignature) 0); _cmsIOPrintf(m, "]\n"); } EmitLab2XYZ(m); EmitWhiteBlackD50(m, BlackPoint); EmitIntent(m, Intent); _cmsIOPrintf(m, " >>\n"); _cmsIOPrintf(m, "]\n"); return 1; } // Generates a curve from a gray profile static cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent) { cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE); int i; if (Out != NULL && xform != NULL) { for (i=0; i < 256; i++) { cmsUInt8Number Gray = (cmsUInt8Number) i; cmsCIEXYZ XYZ; cmsDoTransform(xform, &Gray, &XYZ, 1); Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0); } } if (xform) cmsDeleteTransform(xform); if (hXYZ) cmsCloseProfile(hXYZ); return Out; } // Because PostScript has only 8 bits in /Table, we should use // a more perceptually uniform space... I do choose Lab. static cmsBool WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hLab; cmsHTRANSFORM xform; cmsUInt32Number nChannels; cmsUInt32Number InputFormat; cmsHPROFILE Profiles[2]; cmsCIEXYZ BlackPointAdaptedToD50; // Does create a device-link based transform. // The DeviceLink is next dumped as working CSA. InputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE); nChannels = T_CHANNELS(InputFormat); cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0); // Adjust output to Lab4 hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); Profiles[0] = hProfile; Profiles[1] = hLab; xform = cmsCreateMultiprofileTransform(Profiles, 2, InputFormat, TYPE_Lab_DBL, Intent, 0); cmsCloseProfile(hLab); if (xform == NULL) { cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Profile -> Lab"); return FALSE; } // Only 1, 3 and 4 channels are allowed switch (nChannels) { case 1: { cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent); EmitCIEBasedA(m, Gray2Y, &BlackPointAdaptedToD50); cmsFreeToneCurve(Gray2Y); } break; case 3: case 4: { cmsUInt32Number OutFrm = TYPE_Lab_16; cmsPipeline* DeviceLink; _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; cmsBool rc; DeviceLink = cmsPipelineDup(v ->Lut); if (DeviceLink == NULL) { cmsDeleteTransform(xform); return FALSE; } dwFlags |= cmsFLAGS_FORCE_CLUT; _cmsOptimizePipeline(m->ContextID, &DeviceLink, Intent, &InputFormat, &OutFrm, &dwFlags); rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50); cmsPipelineFree(DeviceLink); if (!rc) { cmsDeleteTransform(xform); return FALSE; } } break; default: cmsDeleteTransform(xform); cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Only 3, 4 channels are supported for CSA. This profile has %d channels.", nChannels); return FALSE; } cmsDeleteTransform(xform); return TRUE; } static cmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe) { _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; return Data -> Double; } // Does create CSA based on matrix-shaper. Allowed types are gray and RGB based static int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper) { cmsColorSpaceSignature ColorSpace; int rc; cmsCIEXYZ BlackPointAdaptedToD50; ColorSpace = cmsGetColorSpace(hProfile); cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); if (ColorSpace == cmsSigGrayData) { cmsToneCurve** ShaperCurve = _cmsStageGetPtrToCurveSet(Shaper); rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50); } else if (ColorSpace == cmsSigRgbData) { cmsMAT3 Mat; int i, j; memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat)); for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ; rc = EmitCIEBasedABC(m, (cmsFloat64Number *) &Mat, _cmsStageGetPtrToCurveSet(Shaper), &BlackPointAdaptedToD50); } else { cmsSignalError(m->ContextID, cmsERROR_COLORSPACE_CHECK, "Profile is not suitable for CSA. Unsupported colorspace."); return 0; } return rc; } // Creates a PostScript color list from a named profile data. // This is a HP extension, and it works in Lab instead of XYZ static int WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, cmsUInt32Number Intent) { cmsHTRANSFORM xform; cmsHPROFILE hLab; cmsUInt32Number i, nColors; char ColorName[cmsMAX_PATH]; cmsNAMEDCOLORLIST* NamedColorList; hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, hLab, TYPE_Lab_DBL, Intent, 0); cmsCloseProfile(hLab); if (xform == NULL) return 0; NamedColorList = cmsGetNamedColorList(xform); if (NamedColorList == NULL) { cmsDeleteTransform(xform); return 0; } _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "(colorlistcomment) (%s)\n", "Named color CSA"); _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n"); _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n"); nColors = cmsNamedColorCount(NamedColorList); for (i=0; i < nColors; i++) { cmsUInt16Number In[1]; cmsCIELab Lab; In[0] = (cmsUInt16Number) i; if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL)) continue; cmsDoTransform(xform, In, &Lab, 1); _cmsIOPrintf(m, " ("); EmitPSEscaped(m, ColorName); _cmsIOPrintf(m, ") [ %.3f %.3f %.3f ]\n", Lab.L, Lab.a, Lab.b); } _cmsIOPrintf(m, ">>\n"); cmsDeleteTransform(xform); return 1; } // Does create a Color Space Array on XYZ colorspace for PostScript usage static cmsUInt32Number GenerateCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* mem) { cmsUInt32Number dwBytesUsed; cmsPipeline* lut = NULL; cmsStage* Matrix, *Shaper; // Is a named color profile? if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { if (!WriteNamedColorCSA(mem, hProfile, Intent)) goto Error; } else { // Any profile class are allowed (including devicelink), but // output (PCS) colorspace must be XYZ or Lab cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile); if (ColorSpace != cmsSigXYZData && ColorSpace != cmsSigLabData) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Invalid output color space"); goto Error; } // Read the lut with all necessary conversion stages lut = _cmsReadInputLUT(hProfile, Intent); if (lut == NULL) goto Error; // Tone curves + matrix can be implemented without any LUT if (cmsPipelineCheckAndRetreiveStages(lut, 2, cmsSigCurveSetElemType, cmsSigMatrixElemType, &Shaper, &Matrix)) { if (!WriteInputMatrixShaper(mem, hProfile, Matrix, Shaper)) goto Error; } else { // We need a LUT for the rest if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error; } } // Done, keep memory usage dwBytesUsed = mem ->UsedSpace; // Get rid of LUT if (lut != NULL) cmsPipelineFree(lut); // Finally, return used byte count return dwBytesUsed; Error: if (lut != NULL) cmsPipelineFree(lut); return 0; } // ------------------------------------------------------ Color Rendering Dictionary (CRD) /* Black point compensation plus chromatic adaptation: Step 1 - Chromatic adaptation ============================= WPout X = ------- PQR Wpin Step 2 - Black point compensation ================================= (WPout - BPout)*X - WPout*(BPin - BPout) out = --------------------------------------- WPout - BPin Algorithm discussion ==================== TransformPQR(WPin, BPin, WPout, BPout, PQR) Wpin,etc= { Xws Yws Zws Pws Qws Rws } Algorithm Stack 0...n =========================================================== PQR BPout WPout BPin WPin 4 index 3 get WPin PQR BPout WPout BPin WPin div (PQR/WPin) BPout WPout BPin WPin 2 index 3 get WPout (PQR/WPin) BPout WPout BPin WPin mult WPout*(PQR/WPin) BPout WPout BPin WPin 2 index 3 get WPout WPout*(PQR/WPin) BPout WPout BPin WPin 2 index 3 get BPout WPout WPout*(PQR/WPin) BPout WPout BPin WPin sub (WPout-BPout) WPout*(PQR/WPin) BPout WPout BPin WPin mult (WPout-BPout)* WPout*(PQR/WPin) BPout WPout BPin WPin 2 index 3 get WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin 4 index 3 get BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin 3 index 3 get BPout BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin sub (BPin-BPout) WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin mult (BPin-BPout)*WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin sub (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin 3 index 3 get BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin 3 index 3 get WPout BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin exch sub (WPout-BPin) (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin div exch pop exch pop exch pop exch pop */ static void EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute) { if (lIsAbsolute) { // For absolute colorimetric intent, encode back to relative // and generate a relative Pipeline // Relative encoding is obtained across XYZpcs*(D50/WhitePoint) cmsCIEXYZ White; _cmsReadMediaWhitePoint(&White, hProfile); _cmsIOPrintf(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n"); _cmsIOPrintf(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); _cmsIOPrintf(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n" "/TransformPQR [\n" "{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n" "{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n" "{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n", White.X, White.Y, White.Z); return; } _cmsIOPrintf(m,"%% Bradford Cone Space\n" "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n"); _cmsIOPrintf(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); // No BPC if (!DoBPC) { _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space\n" "/TransformPQR [\n" "{exch pop exch 3 get mul exch pop exch 3 get div} bind\n" "{exch pop exch 4 get mul exch pop exch 4 get div} bind\n" "{exch pop exch 5 get mul exch pop exch 5 get div} bind\n]\n"); } else { // BPC _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space plus BPC\n" "/TransformPQR [\n"); _cmsIOPrintf(m, "{4 index 3 get div 2 index 3 get mul " "2 index 3 get 2 index 3 get sub mul " "2 index 3 get 4 index 3 get 3 index 3 get sub mul sub " "3 index 3 get 3 index 3 get exch sub div " "exch pop exch pop exch pop exch pop } bind\n"); _cmsIOPrintf(m, "{4 index 4 get div 2 index 4 get mul " "2 index 4 get 2 index 4 get sub mul " "2 index 4 get 4 index 4 get 3 index 4 get sub mul sub " "3 index 4 get 3 index 4 get exch sub div " "exch pop exch pop exch pop exch pop } bind\n"); _cmsIOPrintf(m, "{4 index 5 get div 2 index 5 get mul " "2 index 5 get 2 index 5 get sub mul " "2 index 5 get 4 index 5 get 3 index 5 get sub mul sub " "3 index 5 get 3 index 5 get exch sub div " "exch pop exch pop exch pop exch pop } bind\n]\n"); } } static void EmitXYZ2Lab(cmsIOHANDLER* m) { _cmsIOPrintf(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n"); _cmsIOPrintf(m, "/EncodeLMN [\n"); _cmsIOPrintf(m, "{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); _cmsIOPrintf(m, "{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); _cmsIOPrintf(m, "{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\n"); _cmsIOPrintf(m, "/EncodeABC [\n"); _cmsIOPrintf(m, "{ 116 mul 16 sub 100 div } bind\n"); _cmsIOPrintf(m, "{ 500 mul 128 add 256 div } bind\n"); _cmsIOPrintf(m, "{ 200 mul 128 add 256 div } bind\n"); _cmsIOPrintf(m, "]\n"); } // Due to impedance mismatch between XYZ and almost all RGB and CMYK spaces // I choose to dump LUTS in Lab instead of XYZ. There is still a lot of wasted // space on 3D CLUT, but since space seems not to be a problem here, 33 points // would give a reasonable accuracy. Note also that CRD tables must operate in // 8 bits. static cmsBool WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hLab; cmsHTRANSFORM xform; cmsUInt32Number i, nChannels; cmsUInt32Number OutputFormat; _cmsTRANSFORM* v; cmsPipeline* DeviceLink; cmsHPROFILE Profiles[3]; cmsCIEXYZ BlackPointAdaptedToD50; cmsBool lDoBPC = (cmsBool) (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION); cmsBool lFixWhite = (cmsBool) !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP); cmsUInt32Number InFrm = TYPE_Lab_16; cmsUInt32Number RelativeEncodingIntent; cmsColorSpaceSignature ColorSpace; cmsStage* first; hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); if (hLab == NULL) return FALSE; OutputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE); nChannels = T_CHANNELS(OutputFormat); ColorSpace = cmsGetColorSpace(hProfile); // For absolute colorimetric, the LUT is encoded as relative in order to preserve precision. RelativeEncodingIntent = Intent; if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC) RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC; // Use V4 Lab always Profiles[0] = hLab; Profiles[1] = hProfile; xform = cmsCreateMultiprofileTransformTHR(m ->ContextID, Profiles, 2, TYPE_Lab_DBL, OutputFormat, RelativeEncodingIntent, 0); cmsCloseProfile(hLab); if (xform == NULL) { cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Lab -> Profile in CRD creation"); return FALSE; } // Get a copy of the internal devicelink v = (_cmsTRANSFORM*) xform; DeviceLink = cmsPipelineDup(v ->Lut); if (DeviceLink == NULL) { cmsDeleteTransform(xform); cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot access link for CRD"); return FALSE; } // We need a CLUT dwFlags |= cmsFLAGS_FORCE_CLUT; if (!_cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags)) { cmsPipelineFree(DeviceLink); cmsDeleteTransform(xform); cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot create CLUT table for CRD"); return FALSE; } _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "/ColorRenderingType 1\n"); cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0); // Emit headers, etc. EmitWhiteBlackD50(m, &BlackPointAdaptedToD50); EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC); EmitXYZ2Lab(m); // FIXUP: map Lab (100, 0, 0) to perfect white, because the particular encoding for Lab // does map a=b=0 not falling into any specific node. Since range a,b goes -128..127, // zero is slightly moved towards right, so assure next node (in L=100 slice) is mapped to // zero. This would sacrifice a bit of highlights, but failure to do so would cause // scum dot. Ouch. if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) lFixWhite = FALSE; _cmsIOPrintf(m, "/RenderTable "); first = cmsPipelineGetPtrToFirstStage(DeviceLink); if (first != NULL) { if (first->Type != cmsSigCLutElemType) { cmsPipelineFree(DeviceLink); cmsDeleteTransform(xform); cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot create CLUT, revise your flags!"); return FALSE; } WriteCLUT(m, first, "<", ">\n", "", "", lFixWhite, ColorSpace); } _cmsIOPrintf(m, " %d {} bind ", nChannels); for (i=1; i < nChannels; i++) _cmsIOPrintf(m, "dup "); _cmsIOPrintf(m, "]\n"); EmitIntent(m, Intent); _cmsIOPrintf(m, ">>\n"); if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { _cmsIOPrintf(m, "/Current exch /ColorRendering defineresource pop\n"); } cmsPipelineFree(DeviceLink); cmsDeleteTransform(xform); return TRUE; } // Builds a ASCII string containing colorant list in 0..1.0 range static void BuildColorantList(char *Colorant, cmsUInt32Number nColorant, cmsUInt16Number Out[]) { char Buff[32]; cmsUInt32Number j; Colorant[0] = 0; if (nColorant > cmsMAXCHANNELS) nColorant = cmsMAXCHANNELS; for (j = 0; j < nColorant; j++) { snprintf(Buff, 31, "%.3f", Out[j] / 65535.0); Buff[31] = 0; strcat(Colorant, Buff); if (j < nColorant - 1) strcat(Colorant, " "); } } // Creates a PostScript color list from a named profile data. // This is a HP extension. static int WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsHTRANSFORM xform; cmsUInt32Number i, nColors, nColorant; cmsUInt32Number OutputFormat; char ColorName[cmsMAX_PATH]; char Colorant[512]; cmsNAMEDCOLORLIST* NamedColorList; OutputFormat = cmsFormatterForColorspaceOfProfile(hNamedColor, 2, FALSE); nColorant = T_CHANNELS(OutputFormat); xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, NULL, OutputFormat, Intent, dwFlags); if (xform == NULL) return 0; NamedColorList = cmsGetNamedColorList(xform); if (NamedColorList == NULL) { cmsDeleteTransform(xform); return 0; } _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "(colorlistcomment) (%s) \n", "Named profile"); _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n"); _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n"); nColors = cmsNamedColorCount(NamedColorList); for (i=0; i < nColors; i++) { cmsUInt16Number In[1]; cmsUInt16Number Out[cmsMAXCHANNELS]; In[0] = (cmsUInt16Number) i; if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL)) continue; cmsDoTransform(xform, In, Out, 1); BuildColorantList(Colorant, nColorant, Out); _cmsIOPrintf(m, " ("); EmitPSEscaped(m, ColorName); _cmsIOPrintf(m, ") [ %s ]\n", Colorant); } _cmsIOPrintf(m, " >>"); if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { _cmsIOPrintf(m, " /Current exch /HPSpotTable defineresource pop\n"); } cmsDeleteTransform(xform); return 1; } // This one does create a Color Rendering Dictionary. // CRD are always LUT-Based, no matter if profile is // implemented as matrix-shaper. static cmsUInt32Number GenerateCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* mem) { cmsUInt32Number dwBytesUsed; if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { EmitHeader(mem, "Color Rendering Dictionary (CRD)", hProfile); } // Is a named color profile? if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) { return 0; } } else { // CRD are always implemented as LUT if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) { return 0; } } if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { _cmsIOPrintf(mem, "%%%%EndResource\n"); _cmsIOPrintf(mem, "\n%% CRD End\n"); } // Done, keep memory usage dwBytesUsed = mem ->UsedSpace; // Finally, return used byte count return dwBytesUsed; cmsUNUSED_PARAMETER(ContextID); } cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, cmsPSResourceType Type, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* io) { cmsUInt32Number rc; switch (Type) { case cmsPS_RESOURCE_CSA: rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io); break; default: case cmsPS_RESOURCE_CRD: rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io); break; } return rc; } cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen) { cmsIOHANDLER* mem; cmsUInt32Number dwBytesUsed; // Set up the serialization engine if (Buffer == NULL) mem = cmsOpenIOhandlerFromNULL(ContextID); else mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w"); if (!mem) return 0; dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CRD, hProfile, Intent, dwFlags, mem); // Get rid of memory stream cmsCloseIOhandler(mem); return dwBytesUsed; } // Does create a Color Space Array on XYZ colorspace for PostScript usage cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen) { cmsIOHANDLER* mem; cmsUInt32Number dwBytesUsed; if (Buffer == NULL) mem = cmsOpenIOhandlerFromNULL(ContextID); else mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w"); if (!mem) return 0; dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CSA, hProfile, Intent, dwFlags, mem); // Get rid of memory stream cmsCloseIOhandler(mem); return dwBytesUsed; } lcms2-2.19.1/src/meson.build0000644000175000017500000000255515176573557014623 0ustar martimartilcms2_srcs = files( 'cmsalpha.c', 'cmscam02.c', 'cmscgats.c', 'cmscnvrt.c', 'cmserr.c', 'cmsgamma.c', 'cmsgmt.c', 'cmshalf.c', 'cmsintrp.c', 'cmsio0.c', 'cmsio1.c', 'cmslut.c', 'cmsmd5.c', 'cmsmtrx.c', 'cmsnamed.c', 'cmsopt.c', 'cmspack.c', 'cmspcs.c', 'cmsplugin.c', 'cmsps2.c', 'cmssamp.c', 'cmssm.c', 'cmstypes.c', 'cmsvirt.c', 'cmswtpnt.c', 'cmsxform.c', ) if host_machine.system() == 'windows' if get_option('default_library') == 'shared' lcms2_rc = configure_file( input: 'lcms2.rc.in', configuration: version_cfg, output: 'lcms2.rc', ) lcms2_srcs += win.compile_resources(lcms2_rc) cargs += '-DCMS_DLL_BUILD=1' endif endif if get_option('versionedlibs') liblcms2_lib = library( 'lcms2', lcms2_srcs, include_directories: inc_dirs, gnu_symbol_visibility: 'hidden', dependencies: deps, c_args: cargs, version: library_version, # vs_module_defs: 'lcms2.def', install: true, ) else liblcms2_lib = library( 'lcms2', lcms2_srcs, include_directories: inc_dirs, gnu_symbol_visibility: 'hidden', dependencies: deps, c_args: cargs, install: true, ) endif liblcms2_dep = declare_dependency( link_with: liblcms2_lib, include_directories: [inc_dirs, include_directories('.')], dependencies: deps, ) lcms2-2.19.1/src/cmsxform.c0000644000175000017500000015003515176573557014460 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Transformations stuff // ----------------------------------------------------------------------- #define DEFAULT_OBSERVER_ADAPTATION_STATE 1.0 // The Context0 observer adaptation state. _cmsAdaptationStateChunkType _cmsAdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE }; // Init and duplicate observer adaptation state void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsAdaptationStateChunkType AdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE }; void* from; if (src != NULL) { from = src ->chunks[AdaptationStateContext]; } else { from = &AdaptationStateChunk; } ctx ->chunks[AdaptationStateContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAdaptationStateChunkType)); } // Sets adaptation state for absolute colorimetric intent in the given context. Adaptation state applies on all // but cmsCreateExtendedTransformTHR(). Little CMS can handle incomplete adaptation states. cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d) { cmsFloat64Number prev; _cmsAdaptationStateChunkType* ptr = (_cmsAdaptationStateChunkType*) _cmsContextGetClientChunk(ContextID, AdaptationStateContext); // Get previous value for return prev = ptr ->AdaptationState; // Set the value if d is positive or zero if (d >= 0.0) { ptr ->AdaptationState = d; } // Always return previous value return prev; } // The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d) { return cmsSetAdaptationStateTHR(NULL, d); } // ----------------------------------------------------------------------- // Alarm codes for 16-bit transformations, because the fixed range of containers there are // no values left to mark out of gamut. #define DEFAULT_ALARM_CODES_VALUE {0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} _cmsAlarmCodesChunkType _cmsAlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE }; // Sets the codes used to mark out-out-gamut on Proofing transforms for a given context. Values are meant to be // encoded in 16 bits. void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS]) { _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext); _cmsAssert(ContextAlarmCodes != NULL); // Can't happen memcpy(ContextAlarmCodes->AlarmCodes, AlarmCodesP, sizeof(ContextAlarmCodes->AlarmCodes)); } // Gets the current codes used to mark out-out-gamut on Proofing transforms for the given context. // Values are meant to be encoded in 16 bits. void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS]) { _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext); _cmsAssert(ContextAlarmCodes != NULL); // Can't happen memcpy(AlarmCodesP, ContextAlarmCodes->AlarmCodes, sizeof(ContextAlarmCodes->AlarmCodes)); } void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]) { _cmsAssert(NewAlarm != NULL); cmsSetAlarmCodesTHR(NULL, NewAlarm); } void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number OldAlarm[cmsMAXCHANNELS]) { _cmsAssert(OldAlarm != NULL); cmsGetAlarmCodesTHR(NULL, OldAlarm); } // Init and duplicate alarm codes void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsAlarmCodesChunkType AlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE }; void* from; if (src != NULL) { from = src ->chunks[AlarmCodesContext]; } else { from = &AlarmCodesChunk; } ctx ->chunks[AlarmCodesContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAlarmCodesChunkType)); } // ----------------------------------------------------------------------- // Get rid of transform resources void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* p = (_cmsTRANSFORM*) hTransform; _cmsAssert(p != NULL); if (p -> GamutCheck) cmsPipelineFree(p -> GamutCheck); if (p -> Lut) cmsPipelineFree(p -> Lut); if (p ->InputColorant) cmsFreeNamedColorList(p ->InputColorant); if (p -> OutputColorant) cmsFreeNamedColorList(p ->OutputColorant); if (p ->Sequence) cmsFreeProfileSequenceDescription(p ->Sequence); if (p ->UserData) p ->FreeUserData(p ->ContextID, p ->UserData); _cmsFree(p ->ContextID, (void *) p); } static cmsUInt32Number PixelSize(cmsUInt32Number Format) { cmsUInt32Number fmt_bytes = T_BYTES(Format); // For double, the T_BYTES field is zero if (fmt_bytes == 0) return sizeof(cmsUInt64Number); // Otherwise, it is already correct for all formats return fmt_bytes; } // Apply transform. void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size) { _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; cmsStride stride; stride.BytesPerLineIn = 0; // Not used stride.BytesPerLineOut = 0; stride.BytesPerPlaneIn = Size * PixelSize(p->InputFormat); stride.BytesPerPlaneOut = Size * PixelSize(p->OutputFormat); p -> xform(p, InputBuffer, OutputBuffer, Size, 1, &stride); } // This is a legacy stride for planar void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride) { _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; cmsStride stride; stride.BytesPerLineIn = 0; stride.BytesPerLineOut = 0; stride.BytesPerPlaneIn = Stride; stride.BytesPerPlaneOut = Stride; p -> xform(p, InputBuffer, OutputBuffer, Size, 1, &stride); } // This is the "fast" function for plugins void CMSEXPORT cmsDoTransformLineStride(cmsHTRANSFORM Transform, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, cmsUInt32Number BytesPerLineIn, cmsUInt32Number BytesPerLineOut, cmsUInt32Number BytesPerPlaneIn, cmsUInt32Number BytesPerPlaneOut) { _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; cmsStride stride; stride.BytesPerLineIn = BytesPerLineIn; stride.BytesPerLineOut = BytesPerLineOut; stride.BytesPerPlaneIn = BytesPerPlaneIn; stride.BytesPerPlaneOut = BytesPerPlaneOut; p->xform(p, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, &stride); } // Transform routines ---------------------------------------------------------------------------------------------------------- // Float xform converts floats. Since there are no performance issues, one routine does all job, including gamut check. // Note that because extended range, we can use a -1.0 value for out of gamut in this case. static void FloatXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsFloat32Number fIn[cmsMAXCHANNELS], fOut[cmsMAXCHANNELS]; cmsFloat32Number OutOfGamut; size_t i, j, c, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); strideIn = 0; strideOut = 0; memset(fIn, 0, sizeof(fIn)); memset(fOut, 0, sizeof(fOut)); for (i = 0; i < LineCount; i++) { accum = (cmsUInt8Number*)in + strideIn; output = (cmsUInt8Number*)out + strideOut; for (j = 0; j < PixelsPerLine; j++) { accum = p->FromInputFloat(p, fIn, accum, Stride->BytesPerPlaneIn); // Any gamut check to do? if (p->GamutCheck != NULL) { // Evaluate gamut marker. cmsPipelineEvalFloat(fIn, &OutOfGamut, p->GamutCheck); // Is current color out of gamut? if (OutOfGamut > 0.0) { _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*)_cmsContextGetClientChunk(p->ContextID, AlarmCodesContext); // Certainly, out of gamut for (c = 0; c < cmsMAXCHANNELS; c++) fOut[c] = ContextAlarmCodes->AlarmCodes[c] / 65535.0F; } else { // No, proceed normally cmsPipelineEvalFloat(fIn, fOut, p->Lut); } } else { // No gamut check at all cmsPipelineEvalFloat(fIn, fOut, p->Lut); } output = p->ToOutputFloat(p, fOut, output, Stride->BytesPerPlaneOut); } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } static void NullFloatXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsFloat32Number fIn[cmsMAXCHANNELS]; size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); strideIn = 0; strideOut = 0; memset(fIn, 0, sizeof(fIn)); for (i = 0; i < LineCount; i++) { accum = (cmsUInt8Number*) in + strideIn; output = (cmsUInt8Number*) out + strideOut; for (j = 0; j < PixelsPerLine; j++) { accum = p->FromInputFloat(p, fIn, accum, Stride ->BytesPerPlaneIn); output = p->ToOutputFloat(p, fIn, output, Stride->BytesPerPlaneOut); } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // 16 bit precision ----------------------------------------------------------------------------------------------------------- // Null transformation, only applies formatters. No cache static void NullXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS]; size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); strideIn = 0; strideOut = 0; memset(wIn, 0, sizeof(wIn)); for (i = 0; i < LineCount; i++) { accum = (cmsUInt8Number*)in + strideIn; output = (cmsUInt8Number*)out + strideOut; for (j = 0; j < PixelsPerLine; j++) { accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); output = p->ToOutput(p, wIn, output, Stride->BytesPerPlaneOut); } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // No gamut check, no cache, 16 bits static void PrecalculatedXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { CMSREGISTER cmsUInt8Number* accum; CMSREGISTER cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); strideIn = 0; strideOut = 0; memset(wIn, 0, sizeof(wIn)); memset(wOut, 0, sizeof(wOut)); for (i = 0; i < LineCount; i++) { accum = (cmsUInt8Number*)in + strideIn; output = (cmsUInt8Number*)out + strideOut; for (j = 0; j < PixelsPerLine; j++) { accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); p->Lut->Eval16Fn(wIn, wOut, p->Lut->Data); output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Auxiliary: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical. static void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p, const cmsUInt16Number wIn[], cmsUInt16Number wOut[]) { cmsUInt16Number wOutOfGamut; p ->GamutCheck ->Eval16Fn(wIn, &wOutOfGamut, p ->GamutCheck ->Data); if (wOutOfGamut >= 1) { cmsUInt32Number i; _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(p->ContextID, AlarmCodesContext); for (i=0; i < p ->Lut->OutputChannels; i++) { wOut[i] = ContextAlarmCodes ->AlarmCodes[i]; } } else p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data); } // Gamut check, No cache, 16 bits. static void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); strideIn = 0; strideOut = 0; memset(wIn, 0, sizeof(wIn)); memset(wOut, 0, sizeof(wOut)); for (i = 0; i < LineCount; i++) { accum = (cmsUInt8Number*)in + strideIn; output = (cmsUInt8Number*)out + strideOut; for (j = 0; j < PixelsPerLine; j++) { accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); TransformOnePixelWithGamutCheck(p, wIn, wOut); output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // No gamut check, Cache, 16 bits, static void CachedXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; _cmsCACHE Cache; size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); // Empty buffers for quick memcmp memset(wIn, 0, sizeof(wIn)); memset(wOut, 0, sizeof(wOut)); // Get copy of zero cache memcpy(&Cache, &p->Cache, sizeof(Cache)); strideIn = 0; strideOut = 0; for (i = 0; i < LineCount; i++) { accum = (cmsUInt8Number*)in + strideIn; output = (cmsUInt8Number*)out + strideOut; for (j = 0; j < PixelsPerLine; j++) { accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); } else { p->Lut->Eval16Fn(wIn, wOut, p->Lut->Data); memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); } output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // All those nice features together static void CachedXFORMGamutCheck(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; _cmsCACHE Cache; size_t i, j, strideIn, strideOut; _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); // Empty buffers for quick memcmp memset(wIn, 0, sizeof(wIn)); memset(wOut, 0, sizeof(wOut)); // Get copy of zero cache memcpy(&Cache, &p->Cache, sizeof(Cache)); strideIn = 0; strideOut = 0; for (i = 0; i < LineCount; i++) { accum = (cmsUInt8Number*)in + strideIn; output = (cmsUInt8Number*)out + strideOut; for (j = 0; j < PixelsPerLine; j++) { accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); } else { TransformOnePixelWithGamutCheck(p, wIn, wOut); memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); } output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); } strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Transform plug-ins ---------------------------------------------------------------------------------------------------- // List of used-defined transform factories typedef struct _cmsTransformCollection_st { _cmsTransform2Factory Factory; cmsBool OldXform; // Factory returns xform function in the old style struct _cmsTransformCollection_st *Next; } _cmsTransformCollection; // The linked list head _cmsTransformPluginChunkType _cmsTransformPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginTransformList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsTransformPluginChunkType newHead = { NULL }; _cmsTransformCollection* entry; _cmsTransformCollection* Anterior = NULL; _cmsTransformPluginChunkType* head = (_cmsTransformPluginChunkType*) src->chunks[TransformPlugin]; // Walk the list copying all nodes for (entry = head->TransformCollection; entry != NULL; entry = entry ->Next) { _cmsTransformCollection *newEntry = ( _cmsTransformCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTransformCollection)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.TransformCollection == NULL) newHead.TransformCollection = newEntry; } ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTransformPluginChunkType)); } // Allocates memory for transform plugin factory void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Copy all linked list DupPluginTransformList(ctx, src); } else { static _cmsTransformPluginChunkType TransformPluginChunkType = { NULL }; ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TransformPluginChunkType, sizeof(_cmsTransformPluginChunkType)); } } // Adaptor for old versions of plug-in static void _cmsTransform2toTransformAdaptor(struct _cmstransform_struct *CMMcargo, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, const cmsStride* Stride) { size_t i, strideIn, strideOut; _cmsHandleExtraChannels(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); strideIn = 0; strideOut = 0; for (i = 0; i < LineCount; i++) { void *accum = (cmsUInt8Number*)InputBuffer + strideIn; void *output = (cmsUInt8Number*)OutputBuffer + strideOut; CMMcargo->OldXform(CMMcargo, accum, output, PixelsPerLine, Stride->BytesPerPlaneIn); strideIn += Stride->BytesPerLineIn; strideOut += Stride->BytesPerLineOut; } } // Register new ways to transform cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginTransform* Plugin = (cmsPluginTransform*) Data; _cmsTransformCollection* fl; _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID,TransformPlugin); if (Data == NULL) { // Free the chain. Memory is safely freed at exit ctx->TransformCollection = NULL; return TRUE; } // Factory callback is required if (Plugin->factories.xform == NULL) return FALSE; fl = (_cmsTransformCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsTransformCollection)); if (fl == NULL) return FALSE; // Check for full xform plug-ins previous to 2.8, we would need an adapter in that case if (Plugin->base.ExpectedVersion < 2080) { fl->OldXform = TRUE; } else fl->OldXform = FALSE; // Copy the parameters fl->Factory = Plugin->factories.xform; // Keep linked list fl ->Next = ctx->TransformCollection; ctx->TransformCollection = fl; // All is ok return TRUE; } void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn) { _cmsAssert(CMMcargo != NULL); CMMcargo ->UserData = ptr; CMMcargo ->FreeUserData = FreePrivateDataFn; } // returns the pointer defined by the plug-in to store private data void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo) { _cmsAssert(CMMcargo != NULL); return CMMcargo ->UserData; } // returns the current formatters void CMSEXPORT _cmsGetTransformFormatters16(struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput) { _cmsAssert(CMMcargo != NULL); if (FromInput) *FromInput = CMMcargo ->FromInput; if (ToOutput) *ToOutput = CMMcargo ->ToOutput; } void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput) { _cmsAssert(CMMcargo != NULL); if (FromInput) *FromInput = CMMcargo ->FromInputFloat; if (ToOutput) *ToOutput = CMMcargo ->ToOutputFloat; } // returns original flags cmsUInt32Number CMSEXPORT _cmsGetTransformFlags(struct _cmstransform_struct* CMMcargo) { _cmsAssert(CMMcargo != NULL); return CMMcargo->dwOriginalFlags; } // Returns the worker callback for parallelization plug-ins _cmsTransform2Fn CMSEXPORT _cmsGetTransformWorker(struct _cmstransform_struct* CMMcargo) { _cmsAssert(CMMcargo != NULL); return CMMcargo->Worker; } // This field holds maximum number of workers or -1 to auto cmsInt32Number CMSEXPORT _cmsGetTransformMaxWorkers(struct _cmstransform_struct* CMMcargo) { _cmsAssert(CMMcargo != NULL); return CMMcargo->MaxWorkers; } // This field is actually unused and reserved cmsUInt32Number CMSEXPORT _cmsGetTransformWorkerFlags(struct _cmstransform_struct* CMMcargo) { _cmsAssert(CMMcargo != NULL); return CMMcargo->WorkerFlags; } // In the case there is a parallelization plug-in, let it to do its job static void ParalellizeIfSuitable(_cmsTRANSFORM* p) { _cmsParallelizationPluginChunkType* ctx = (_cmsParallelizationPluginChunkType*)_cmsContextGetClientChunk(p->ContextID, ParallelizationPlugin); _cmsAssert(p != NULL); if (ctx != NULL && ctx->SchedulerFn != NULL) { p->Worker = p->xform; p->xform = ctx->SchedulerFn; p->MaxWorkers = ctx->MaxWorkers; p->WorkerFlags = ctx->WorkerFlags; } } /** * An empty unroll to avoid a check with NULL on cmsDoTransform() */ static cmsUInt8Number* UnrollNothing(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(wIn); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackNothing(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(wOut); cmsUNUSED_PARAMETER(Stride); } // Allocate transform struct and set it to defaults. Ask the optimization plug-in about if those formats are proper // for separated transforms. If this is the case, static _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID, TransformPlugin); _cmsTransformCollection* Plugin; // Allocate needed memory _cmsTRANSFORM* p = (_cmsTRANSFORM*)_cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM)); if (!p) { cmsPipelineFree(lut); return NULL; } // Store the proposed pipeline p->Lut = lut; // Let's see if any plug-in want to do the transform by itself if (p->Lut != NULL) { if (!(*dwFlags & cmsFLAGS_NOOPTIMIZE)) { for (Plugin = ctx->TransformCollection; Plugin != NULL; Plugin = Plugin->Next) { if (Plugin->Factory(&p->xform, &p->UserData, &p->FreeUserData, &p->Lut, InputFormat, OutputFormat, dwFlags)) { // Last plugin in the declaration order takes control. We just keep // the original parameters as a logging. // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default // an optimized transform is not reusable. The plug-in can, however, change // the flags and make it suitable. p->ContextID = ContextID; p->InputFormat = *InputFormat; p->OutputFormat = *OutputFormat; p->dwOriginalFlags = *dwFlags; // Fill the formatters just in case the optimized routine is interested. // No error is thrown if the formatter doesn't exist. It is up to the optimization // factory to decide what to do in those cases. p->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; p->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; p->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; p->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; // Save the day? (Ignore the warning) if (Plugin->OldXform) { p->OldXform = (_cmsTransformFn)(void*)p->xform; p->xform = _cmsTransform2toTransformAdaptor; } ParalellizeIfSuitable(p); return p; } } } // Not suitable for the transform plug-in, let's check the pipeline plug-in _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags); } // Check whatever this is a true floating point transform if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) { // Get formatter function always return a valid union, but the contents of this union may be NULL. p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; p ->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; if (p ->FromInputFloat == NULL || p ->ToOutputFloat == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); cmsDeleteTransform(p); return NULL; } if (*dwFlags & cmsFLAGS_NULLTRANSFORM) { p ->xform = NullFloatXFORM; } else { // Float transforms don't use cache, always are non-NULL p ->xform = FloatXFORM; } } else { // Formats are intended to be changed before use if (*InputFormat == 0 && *OutputFormat == 0) { p->FromInput = UnrollNothing; p->ToOutput = PackNothing; *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; } else { cmsUInt32Number BytesPerPixelInput; p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; p ->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; if (p ->FromInput == NULL || p ->ToOutput == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); cmsDeleteTransform(p); return NULL; } BytesPerPixelInput = T_BYTES(*InputFormat); if (BytesPerPixelInput == 0 || BytesPerPixelInput >= 2) *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; } if (*dwFlags & cmsFLAGS_NULLTRANSFORM) { p ->xform = NullXFORM; } else { if (*dwFlags & cmsFLAGS_NOCACHE) { if (*dwFlags & cmsFLAGS_GAMUTCHECK) p ->xform = PrecalculatedXFORMGamutCheck; // Gamut check, no cache else p ->xform = PrecalculatedXFORM; // No cache, no gamut check } else { if (*dwFlags & cmsFLAGS_GAMUTCHECK) p ->xform = CachedXFORMGamutCheck; // Gamut check, cache else p ->xform = CachedXFORM; // No gamut check, cache } } } /** * Check consistency for alpha channel copy */ if (*dwFlags & cmsFLAGS_COPY_ALPHA) { if (T_EXTRA(*InputFormat) != T_EXTRA(*OutputFormat)) { cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Mismatched alpha channels"); cmsDeleteTransform(p); return NULL; } } p ->InputFormat = *InputFormat; p ->OutputFormat = *OutputFormat; p ->dwOriginalFlags = *dwFlags; p ->ContextID = ContextID; p ->UserData = NULL; ParalellizeIfSuitable(p); return p; } static cmsBool GetXFormColorSpaces(cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], cmsColorSpaceSignature* Input, cmsColorSpaceSignature* Output) { cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut; cmsColorSpaceSignature PostColorSpace; cmsUInt32Number i; if (nProfiles == 0) return FALSE; if (hProfiles[0] == NULL) return FALSE; *Input = PostColorSpace = cmsGetColorSpace(hProfiles[0]); for (i=0; i < nProfiles; i++) { cmsProfileClassSignature cls; cmsHPROFILE hProfile = hProfiles[i]; int lIsInput = (PostColorSpace != cmsSigXYZData) && (PostColorSpace != cmsSigLabData); if (hProfile == NULL) return FALSE; cls = cmsGetDeviceClass(hProfile); if (cls == cmsSigNamedColorClass) { ColorSpaceIn = cmsSig1colorData; ColorSpaceOut = (nProfiles > 1) ? cmsGetPCS(hProfile) : cmsGetColorSpace(hProfile); } else if (lIsInput || (cls == cmsSigLinkClass)) { ColorSpaceIn = cmsGetColorSpace(hProfile); ColorSpaceOut = cmsGetPCS(hProfile); } else { ColorSpaceIn = cmsGetPCS(hProfile); ColorSpaceOut = cmsGetColorSpace(hProfile); } if (i==0) *Input = ColorSpaceIn; PostColorSpace = ColorSpaceOut; } *Output = PostColorSpace; return TRUE; } // Check colorspace static cmsBool IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwFormat) { int Space1 = (int) T_COLORSPACE(dwFormat); int Space2 = _cmsLCMScolorSpace(Check); if (dwFormat == 0) return TRUE; // Bypass used by linkicc if (Space1 == PT_ANY) return (T_CHANNELS(dwFormat) == cmsChannelsOf(Check)); if (Space1 == Space2) return TRUE; if (Space1 == PT_LabV2 && Space2 == PT_Lab) return TRUE; if (Space1 == PT_Lab && Space2 == PT_LabV2) return TRUE; return FALSE; } // ---------------------------------------------------------------------------------------------------------------- // Jun-21-2000: Some profiles (those that comes with W2K) comes // with the media white (media black?) x 100. Add a sanity check static void NormalizeXYZ(cmsCIEXYZ* Dest) { while (Dest -> X > 2. && Dest -> Y > 2. && Dest -> Z > 2.) { Dest -> X /= 10.; Dest -> Y /= 10.; Dest -> Z /= 10.; } } static void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src) { if (src == NULL) { wtPt ->X = cmsD50X; wtPt ->Y = cmsD50Y; wtPt ->Z = cmsD50Z; } else { wtPt ->X = src->X; wtPt ->Y = src->Y; wtPt ->Z = src->Z; NormalizeXYZ(wtPt); } } // New to lcms 2.0 -- have all parameters available. cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsHPROFILE hGamutProfile, cmsUInt32Number nGamutPCSposition, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number dwFlags) { _cmsTRANSFORM* xform; cmsColorSpaceSignature EntryColorSpace; cmsColorSpaceSignature ExitColorSpace; cmsPipeline* Lut; cmsUInt32Number LastIntent; // Safeguard if (nProfiles <= 0 || nProfiles > 255) { cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); return NULL; } LastIntent = Intents[nProfiles - 1]; // If it is a fake transform if (dwFlags & cmsFLAGS_NULLTRANSFORM) { return AllocEmptyTransform(ContextID, NULL, INTENT_PERCEPTUAL, &InputFormat, &OutputFormat, &dwFlags); } // If gamut check is requested, make sure we have a gamut profile if (dwFlags & cmsFLAGS_GAMUTCHECK) { if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK; } if ((dwFlags & cmsFLAGS_GAMUTCHECK) && (nGamutPCSposition <= 0 || nGamutPCSposition >= nProfiles - 1)) { cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong gamut PCS position '%d'", nGamutPCSposition); return NULL; } // On floating point transforms, inhibit cache if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat)) dwFlags |= cmsFLAGS_NOCACHE; // Mark entry/exit spaces if (!GetXFormColorSpaces(nProfiles, hProfiles, &EntryColorSpace, &ExitColorSpace)) { cmsSignalError(ContextID, cmsERROR_NULL, "NULL input profiles on transform"); return NULL; } // Check if proper colorspaces if (!IsProperColorSpace(EntryColorSpace, InputFormat)) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong input color space on transform"); return NULL; } if (!IsProperColorSpace(ExitColorSpace, OutputFormat)) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong output color space on transform"); return NULL; } // Check whatever the transform is 16 bits and involves linear RGB in first profile. If so, disable optimizations if (EntryColorSpace == cmsSigRgbData && T_BYTES(InputFormat) == 2 && !(dwFlags & cmsFLAGS_NOOPTIMIZE)) { cmsFloat64Number gamma = cmsDetectRGBProfileGamma(hProfiles[0], 0.1); if (gamma > 0 && gamma < 1.6) dwFlags |= cmsFLAGS_NOOPTIMIZE; } // Create a pipeline with all transformations Lut = _cmsLinkProfiles(ContextID, nProfiles, Intents, hProfiles, BPC, AdaptationStates, dwFlags); if (Lut == NULL) { cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Couldn't link the profiles"); return NULL; } // Check channel count if ((cmsChannelsOfColorSpace(EntryColorSpace) != (cmsInt32Number) cmsPipelineInputChannels(Lut)) || (cmsChannelsOfColorSpace(ExitColorSpace) != (cmsInt32Number) cmsPipelineOutputChannels(Lut))) { cmsPipelineFree(Lut); cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Channel count doesn't match. Profile is corrupted"); return NULL; } // All seems ok xform = AllocEmptyTransform(ContextID, Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags); if (xform == NULL) { return NULL; } // Keep values xform ->EntryColorSpace = EntryColorSpace; xform ->ExitColorSpace = ExitColorSpace; xform ->RenderingIntent = Intents[nProfiles-1]; // Take white points SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag)); SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag)); // Create a gamut check LUT if requested if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK)) xform ->GamutCheck = _cmsCreateGamutCheckPipeline(ContextID, hProfiles, BPC, Intents, AdaptationStates, nGamutPCSposition, hGamutProfile); // Try to read input and output colorant table if (cmsIsTag(hProfiles[0], cmsSigColorantTableTag)) { // Input table can only come in this way. xform ->InputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[0], cmsSigColorantTableTag)); } // Output is a little bit more complex. if (cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigLinkClass) { // This tag may exist only on devicelink profiles. if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)) { // It may be NULL if error xform ->OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)); } } else { if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)) { xform -> OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)); } } // Store the sequence of profiles if (dwFlags & cmsFLAGS_KEEP_SEQUENCE) { xform ->Sequence = _cmsCompileProfileSequence(ContextID, nProfiles, hProfiles); } else xform ->Sequence = NULL; // If this is a cached transform, init first value, which is zero (16 bits only) if (!(dwFlags & cmsFLAGS_NOCACHE)) { memset(&xform ->Cache.CacheIn, 0, sizeof(xform ->Cache.CacheIn)); if (xform ->GamutCheck != NULL) { TransformOnePixelWithGamutCheck(xform, xform ->Cache.CacheIn, xform->Cache.CacheOut); } else { xform ->Lut ->Eval16Fn(xform ->Cache.CacheIn, xform->Cache.CacheOut, xform -> Lut->Data); } } return (cmsHTRANSFORM) xform; } // Multiprofile transforms: Gamut check is not available here, as it is unclear from which profile the gamut comes. cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsBool BPC[256]; cmsUInt32Number Intents[256]; cmsFloat64Number AdaptationStates[256]; if (nProfiles <= 0 || nProfiles > 255) { cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); return NULL; } for (i=0; i < nProfiles; i++) { BPC[i] = dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION ? TRUE : FALSE; Intents[i] = Intent; AdaptationStates[i] = cmsSetAdaptationStateTHR(ContextID, -1); } return cmsCreateExtendedTransform(ContextID, nProfiles, hProfiles, BPC, Intents, AdaptationStates, NULL, 0, InputFormat, OutputFormat, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { if (nProfiles <= 0 || nProfiles > 255) { cmsSignalError(NULL, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); return NULL; } return cmsCreateMultiprofileTransformTHR(cmsGetProfileContextID(hProfiles[0]), hProfiles, nProfiles, InputFormat, OutputFormat, Intent, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID, cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hArray[2]; hArray[0] = Input; hArray[1] = Output; return cmsCreateMultiprofileTransformTHR(ContextID, hArray, Output == NULL ? 1U : 2U, InputFormat, OutputFormat, Intent, dwFlags); } CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { return cmsCreateTransformTHR(cmsGetProfileContextID(Input), Input, InputFormat, Output, OutputFormat, Intent, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID, cmsHPROFILE InputProfile, cmsUInt32Number InputFormat, cmsHPROFILE OutputProfile, cmsUInt32Number OutputFormat, cmsHPROFILE ProofingProfile, cmsUInt32Number nIntent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags) { cmsHPROFILE hArray[4]; cmsUInt32Number Intents[4]; cmsBool BPC[4]; cmsFloat64Number Adaptation[4]; cmsBool DoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION) ? TRUE : FALSE; hArray[0] = InputProfile; hArray[1] = ProofingProfile; hArray[2] = ProofingProfile; hArray[3] = OutputProfile; Intents[0] = nIntent; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = ProofingIntent; BPC[0] = DoBPC; BPC[1] = DoBPC; BPC[2] = 0; BPC[3] = 0; Adaptation[0] = Adaptation[1] = Adaptation[2] = Adaptation[3] = cmsSetAdaptationStateTHR(ContextID, -1); if (!(dwFlags & (cmsFLAGS_SOFTPROOFING|cmsFLAGS_GAMUTCHECK))) return cmsCreateTransformTHR(ContextID, InputProfile, InputFormat, OutputProfile, OutputFormat, nIntent, dwFlags); return cmsCreateExtendedTransform(ContextID, 4, hArray, BPC, Intents, Adaptation, ProofingProfile, 1, InputFormat, OutputFormat, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile, cmsUInt32Number InputFormat, cmsHPROFILE OutputProfile, cmsUInt32Number OutputFormat, cmsHPROFILE ProofingProfile, cmsUInt32Number nIntent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags) { return cmsCreateProofingTransformTHR(cmsGetProfileContextID(InputProfile), InputProfile, InputFormat, OutputProfile, OutputFormat, ProofingProfile, nIntent, ProofingIntent, dwFlags); } // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return NULL; return xform -> ContextID; } // Grab the input/output formats cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return 0; return xform->InputFormat; } cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return 0; return xform->OutputFormat; } // Returns the optimized pipeline (Lut) inside a transform. Read-only; do not free. cmsPipeline* CMSEXPORT cmsGetTransformPipeline(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return NULL; return xform->Lut; } // Returns the gamut-check pipeline inside a transform. Read-only; do not free. cmsPipeline* CMSEXPORT cmsGetTransformGamutCheckPipeline(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return NULL; return xform->GamutCheck; } // For backwards compatibility cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; cmsFormatter16 FromInput, ToOutput; // We only can afford to change formatters if previous transform is at least 16 bits if (!(xform ->dwOriginalFlags & cmsFLAGS_CAN_CHANGE_FORMATTER)) { cmsSignalError(xform ->ContextID, cmsERROR_NOT_SUITABLE, "cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision"); return FALSE; } FromInput = _cmsGetFormatter(xform->ContextID, InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; ToOutput = _cmsGetFormatter(xform->ContextID, OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; if (FromInput == NULL || ToOutput == NULL) { cmsSignalError(xform -> ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); return FALSE; } xform ->InputFormat = InputFormat; xform ->OutputFormat = OutputFormat; xform ->FromInput = FromInput; xform ->ToOutput = ToOutput; return TRUE; } cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformInputColorants(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*)hTransform; if (xform == NULL) return NULL; return xform->InputColorant; } cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformOutputColorants(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*)hTransform; if (xform == NULL) return NULL; return xform->OutputColorant; } lcms2-2.19.1/src/lcms2.def0000644000175000017500000006224015176573557014156 0ustar martimartiEXPORTS _cms15Fixed16toDouble = _cms15Fixed16toDouble _cms8Fixed8toDouble = _cms8Fixed8toDouble cmsAdaptToIlluminant = cmsAdaptToIlluminant _cmsAdjustEndianess16 = _cmsAdjustEndianess16 _cmsAdjustEndianess32 = _cmsAdjustEndianess32 _cmsAdjustEndianess64 = _cmsAdjustEndianess64 cmsAllocNamedColorList = cmsAllocNamedColorList cmsAllocProfileSequenceDescription = cmsAllocProfileSequenceDescription cmsAppendNamedColor = cmsAppendNamedColor cmsBFDdeltaE = cmsBFDdeltaE cmsBuildGamma = cmsBuildGamma cmsBuildParametricToneCurve = cmsBuildParametricToneCurve cmsBuildSegmentedToneCurve = cmsBuildSegmentedToneCurve cmsBuildTabulatedToneCurve16 = cmsBuildTabulatedToneCurve16 cmsBuildTabulatedToneCurveFloat = cmsBuildTabulatedToneCurveFloat _cmsCalloc = _cmsCalloc cmsChannelsOf = cmsChannelsOf cmsChannelsOfColorSpace = cmsChannelsOfColorSpace cmsCIE2000DeltaE = cmsCIE2000DeltaE cmsCIE94DeltaE = cmsCIE94DeltaE cmsCIECAM02Done = cmsCIECAM02Done cmsCIECAM02Forward = cmsCIECAM02Forward cmsCIECAM02Init = cmsCIECAM02Init cmsCIECAM02Reverse = cmsCIECAM02Reverse cmsCloseIOhandler = cmsCloseIOhandler cmsCloseProfile = cmsCloseProfile cmsCMCdeltaE = cmsCMCdeltaE cmsCreate_sRGBProfile = cmsCreate_sRGBProfile cmsCreate_sRGBProfileTHR = cmsCreate_sRGBProfileTHR cmsCreateBCHSWabstractProfile = cmsCreateBCHSWabstractProfile cmsCreateBCHSWabstractProfileTHR = cmsCreateBCHSWabstractProfileTHR cmsCreateExtendedTransform = cmsCreateExtendedTransform cmsCreateGrayProfile = cmsCreateGrayProfile cmsCreateGrayProfileTHR = cmsCreateGrayProfileTHR cmsCreateInkLimitingDeviceLink = cmsCreateInkLimitingDeviceLink cmsCreateInkLimitingDeviceLinkTHR = cmsCreateInkLimitingDeviceLinkTHR cmsCreateLab2Profile = cmsCreateLab2Profile cmsCreateLab2ProfileTHR = cmsCreateLab2ProfileTHR cmsCreateLab4Profile = cmsCreateLab4Profile cmsCreateLab4ProfileTHR = cmsCreateLab4ProfileTHR cmsCreateLinearizationDeviceLink = cmsCreateLinearizationDeviceLink cmsCreateLinearizationDeviceLinkTHR = cmsCreateLinearizationDeviceLinkTHR cmsCreateMultiprofileTransform = cmsCreateMultiprofileTransform cmsCreateMultiprofileTransformTHR = cmsCreateMultiprofileTransformTHR cmsCreateNULLProfile = cmsCreateNULLProfile cmsCreateNULLProfileTHR = cmsCreateNULLProfileTHR cmsCreateProfilePlaceholder = cmsCreateProfilePlaceholder cmsCreateProofingTransform = cmsCreateProofingTransform cmsCreateProofingTransformTHR = cmsCreateProofingTransformTHR cmsCreateRGBProfile = cmsCreateRGBProfile cmsCreateRGBProfileTHR = cmsCreateRGBProfileTHR cmsCreateTransform = cmsCreateTransform cmsCreateTransformTHR = cmsCreateTransformTHR cmsCreateXYZProfile = cmsCreateXYZProfile cmsCreateXYZProfileTHR = cmsCreateXYZProfileTHR cmsD50_xyY = cmsD50_xyY cmsD50_XYZ = cmsD50_XYZ _cmsDecodeDateTimeNumber = _cmsDecodeDateTimeNumber _cmsDefaultICCintents = _cmsDefaultICCintents cmsDeleteTransform = cmsDeleteTransform cmsDeltaE = cmsDeltaE cmsDetectBlackPoint = cmsDetectBlackPoint cmsDetectDestinationBlackPoint = cmsDetectDestinationBlackPoint cmsDetectTAC = cmsDetectTAC cmsDesaturateLab = cmsDesaturateLab cmsDoTransform = cmsDoTransform cmsDoTransformStride = cmsDoTransformStride cmsDoTransformLineStride = cmsDoTransformLineStride _cmsDoubleTo15Fixed16 = _cmsDoubleTo15Fixed16 _cmsDoubleTo8Fixed8 = _cmsDoubleTo8Fixed8 _cmsDupMem = _cmsDupMem cmsDupNamedColorList = cmsDupNamedColorList cmsDupProfileSequenceDescription = cmsDupProfileSequenceDescription cmsDupToneCurve = cmsDupToneCurve _cmsEncodeDateTimeNumber = _cmsEncodeDateTimeNumber cmsEstimateGamma = cmsEstimateGamma cmsGetToneCurveEstimatedTableEntries = cmsGetToneCurveEstimatedTableEntries cmsGetToneCurveEstimatedTable = cmsGetToneCurveEstimatedTable cmsEvalToneCurve16 = cmsEvalToneCurve16 cmsEvalToneCurveFloat = cmsEvalToneCurveFloat cmsfilelength = cmsfilelength cmsFloat2LabEncoded = cmsFloat2LabEncoded cmsFloat2LabEncodedV2 = cmsFloat2LabEncodedV2 cmsFloat2XYZEncoded = cmsFloat2XYZEncoded cmsFormatterForColorspaceOfProfile = cmsFormatterForColorspaceOfProfile cmsFormatterForPCSOfProfile = cmsFormatterForPCSOfProfile _cmsFree = _cmsFree cmsFreeNamedColorList = cmsFreeNamedColorList cmsFreeProfileSequenceDescription = cmsFreeProfileSequenceDescription cmsFreeToneCurve = cmsFreeToneCurve cmsFreeToneCurveTriple = cmsFreeToneCurveTriple cmsGBDAlloc = cmsGBDAlloc cmsGBDFree = cmsGBDFree cmsGDBAddPoint = cmsGDBAddPoint cmsGDBCheckPoint = cmsGDBCheckPoint cmsGDBCompute = cmsGDBCompute cmsGetAlarmCodes = cmsGetAlarmCodes cmsGetColorSpace = cmsGetColorSpace cmsGetDeviceClass = cmsGetDeviceClass cmsGetEncodedICCversion = cmsGetEncodedICCversion cmsGetHeaderAttributes = cmsGetHeaderAttributes cmsGetHeaderCreationDateTime = cmsGetHeaderCreationDateTime cmsGetHeaderFlags = cmsGetHeaderFlags cmsGetHeaderManufacturer = cmsGetHeaderManufacturer cmsGetHeaderModel = cmsGetHeaderModel cmsGetHeaderProfileID = cmsGetHeaderProfileID cmsGetHeaderRenderingIntent = cmsGetHeaderRenderingIntent cmsGetNamedColorList = cmsGetNamedColorList cmsGetPCS = cmsGetPCS cmsGetPostScriptColorResource = cmsGetPostScriptColorResource cmsGetPostScriptCRD = cmsGetPostScriptCRD cmsGetPostScriptCSA = cmsGetPostScriptCSA cmsGetProfileInfo = cmsGetProfileInfo cmsGetProfileInfoASCII = cmsGetProfileInfoASCII cmsGetProfileInfoUTF8 = cmsGetProfileInfoUTF8 cmsGetProfileContextID = cmsGetProfileContextID cmsGetProfileVersion = cmsGetProfileVersion cmsGetSupportedIntents = cmsGetSupportedIntents cmsGetTagCount = cmsGetTagCount cmsGetTagSignature = cmsGetTagSignature cmsGetTransformContextID = cmsGetTransformContextID _cmsICCcolorSpace = _cmsICCcolorSpace _cmsIOPrintf = _cmsIOPrintf cmsIsCLUT = cmsIsCLUT cmsIsIntentSupported = cmsIsIntentSupported cmsIsMatrixShaper = cmsIsMatrixShaper cmsIsTag = cmsIsTag cmsIsToneCurveDescending = cmsIsToneCurveDescending cmsIsToneCurveLinear = cmsIsToneCurveLinear cmsIsToneCurveMonotonic = cmsIsToneCurveMonotonic cmsIsToneCurveMultisegment = cmsIsToneCurveMultisegment cmsGetToneCurveParametricType = cmsGetToneCurveParametricType cmsIT8Alloc = cmsIT8Alloc cmsIT8DefineDblFormat = cmsIT8DefineDblFormat cmsIT8EnumDataFormat = cmsIT8EnumDataFormat cmsIT8EnumProperties = cmsIT8EnumProperties cmsIT8EnumPropertyMulti = cmsIT8EnumPropertyMulti cmsIT8Free = cmsIT8Free cmsIT8GetData = cmsIT8GetData cmsIT8GetDataDbl = cmsIT8GetDataDbl cmsIT8FindDataFormat = cmsIT8FindDataFormat cmsIT8GetDataRowCol = cmsIT8GetDataRowCol cmsIT8GetDataRowColDbl = cmsIT8GetDataRowColDbl cmsIT8GetPatchName = cmsIT8GetPatchName cmsIT8GetPatchByName = cmsIT8GetPatchByName cmsIT8GetProperty = cmsIT8GetProperty cmsIT8GetPropertyDbl = cmsIT8GetPropertyDbl cmsIT8GetPropertyMulti = cmsIT8GetPropertyMulti cmsIT8GetSheetType = cmsIT8GetSheetType cmsIT8LoadFromFile = cmsIT8LoadFromFile cmsIT8LoadFromMem = cmsIT8LoadFromMem cmsIT8SaveToFile = cmsIT8SaveToFile cmsIT8SaveToMem = cmsIT8SaveToMem cmsIT8SetComment = cmsIT8SetComment cmsIT8SetData = cmsIT8SetData cmsIT8SetDataDbl = cmsIT8SetDataDbl cmsIT8SetDataFormat = cmsIT8SetDataFormat cmsIT8SetDataRowCol = cmsIT8SetDataRowCol cmsIT8SetDataRowColDbl = cmsIT8SetDataRowColDbl cmsIT8SetPropertyDbl = cmsIT8SetPropertyDbl cmsIT8SetPropertyHex = cmsIT8SetPropertyHex cmsIT8SetPropertyStr = cmsIT8SetPropertyStr cmsIT8SetPropertyMulti = cmsIT8SetPropertyMulti cmsIT8SetPropertyUncooked = cmsIT8SetPropertyUncooked cmsIT8SetSheetType = cmsIT8SetSheetType cmsIT8SetTable = cmsIT8SetTable cmsIT8SetTableByLabel = cmsIT8SetTableByLabel cmsIT8SetIndexColumn = cmsIT8SetIndexColumn cmsIT8TableCount = cmsIT8TableCount cmsJoinToneCurve = cmsJoinToneCurve cmsLab2LCh = cmsLab2LCh cmsLab2XYZ = cmsLab2XYZ cmsLabEncoded2Float = cmsLabEncoded2Float cmsLabEncoded2FloatV2 = cmsLabEncoded2FloatV2 cmsLCh2Lab = cmsLCh2Lab _cmsLCMScolorSpace = _cmsLCMScolorSpace cmsLinkTag = cmsLinkTag cmsTagLinkedTo = cmsTagLinkedTo cmsPipelineAlloc = cmsPipelineAlloc cmsPipelineCat = cmsPipelineCat cmsPipelineCheckAndRetreiveStages = cmsPipelineCheckAndRetreiveStages cmsPipelineDup = cmsPipelineDup cmsPipelineStageCount = cmsPipelineStageCount cmsPipelineEval16 = cmsPipelineEval16 cmsPipelineEvalFloat = cmsPipelineEvalFloat cmsPipelineEvalReverseFloat = cmsPipelineEvalReverseFloat cmsPipelineFree = cmsPipelineFree cmsPipelineGetPtrToFirstStage = cmsPipelineGetPtrToFirstStage cmsPipelineGetPtrToLastStage = cmsPipelineGetPtrToLastStage cmsPipelineInputChannels = cmsPipelineInputChannels cmsPipelineInsertStage = cmsPipelineInsertStage cmsPipelineOutputChannels = cmsPipelineOutputChannels cmsPipelineSetSaveAs8bitsFlag = cmsPipelineSetSaveAs8bitsFlag _cmsPipelineSetOptimizationParameters = _cmsPipelineSetOptimizationParameters cmsPipelineUnlinkStage = cmsPipelineUnlinkStage _cmsMalloc = _cmsMalloc _cmsMallocZero = _cmsMallocZero _cmsMAT3eval = _cmsMAT3eval _cmsMAT3identity = _cmsMAT3identity _cmsMAT3inverse = _cmsMAT3inverse _cmsMAT3isIdentity = _cmsMAT3isIdentity _cmsMAT3per = _cmsMAT3per _cmsMAT3solve = _cmsMAT3solve cmsMD5computeID = cmsMD5computeID cmsMLUalloc = cmsMLUalloc cmsMLUdup = cmsMLUdup cmsMLUfree = cmsMLUfree cmsMLUgetASCII = cmsMLUgetASCII cmsMLUgetTranslation = cmsMLUgetTranslation cmsMLUgetWide = cmsMLUgetWide cmsMLUgetUTF8 = cmsMLUgetUTF8 cmsMLUsetASCII = cmsMLUsetASCII cmsMLUsetWide = cmsMLUsetWide cmsMLUsetUTF8 = cmsMLUsetUTF8 cmsStageAllocCLut16bit = cmsStageAllocCLut16bit cmsStageAllocCLut16bitGranular = cmsStageAllocCLut16bitGranular cmsStageAllocCLutFloat = cmsStageAllocCLutFloat cmsStageAllocCLutFloatGranular = cmsStageAllocCLutFloatGranular cmsStageAllocToneCurves = cmsStageAllocToneCurves cmsStageAllocIdentity = cmsStageAllocIdentity cmsStageAllocMatrix = cmsStageAllocMatrix _cmsStageAllocPlaceholder = _cmsStageAllocPlaceholder cmsStageDup = cmsStageDup cmsStageFree = cmsStageFree cmsStageNext = cmsStageNext cmsStageInputChannels = cmsStageInputChannels cmsStageOutputChannels = cmsStageOutputChannels cmsStageSampleCLut16bit = cmsStageSampleCLut16bit cmsStageSampleCLutFloat = cmsStageSampleCLutFloat cmsStageType = cmsStageType cmsStageData = cmsStageData cmsGetStageContextID = cmsGetStageContextID cmsNamedColorCount = cmsNamedColorCount cmsNamedColorIndex = cmsNamedColorIndex cmsNamedColorInfo = cmsNamedColorInfo cmsOpenIOhandlerFromFile = cmsOpenIOhandlerFromFile cmsOpenIOhandlerFromMem = cmsOpenIOhandlerFromMem cmsOpenIOhandlerFromNULL = cmsOpenIOhandlerFromNULL cmsOpenIOhandlerFromStream = cmsOpenIOhandlerFromStream cmsOpenProfileFromFile = cmsOpenProfileFromFile cmsOpenProfileFromFileTHR = cmsOpenProfileFromFileTHR cmsOpenProfileFromIOhandlerTHR = cmsOpenProfileFromIOhandlerTHR cmsOpenProfileFromIOhandler2THR = cmsOpenProfileFromIOhandler2THR cmsOpenProfileFromMem = cmsOpenProfileFromMem cmsOpenProfileFromMemTHR = cmsOpenProfileFromMemTHR cmsOpenProfileFromStream = cmsOpenProfileFromStream cmsOpenProfileFromStreamTHR = cmsOpenProfileFromStreamTHR cmsCreateDeviceLinkFromCubeFileTHR = cmsCreateDeviceLinkFromCubeFileTHR cmsCreateDeviceLinkFromCubeFile = cmsCreateDeviceLinkFromCubeFile cmsPlugin = cmsPlugin _cmsRead15Fixed16Number = _cmsRead15Fixed16Number _cmsReadAlignment = _cmsReadAlignment _cmsReadFloat32Number = _cmsReadFloat32Number cmsReadRawTag = cmsReadRawTag cmsReadTag = cmsReadTag _cmsReadTypeBase = _cmsReadTypeBase _cmsReadUInt16Array = _cmsReadUInt16Array _cmsReadUInt16Number = _cmsReadUInt16Number _cmsReadUInt32Number = _cmsReadUInt32Number _cmsReadUInt64Number = _cmsReadUInt64Number _cmsReadUInt8Number = _cmsReadUInt8Number _cmsReadXYZNumber = _cmsReadXYZNumber _cmsRealloc = _cmsRealloc cmsReverseToneCurve = cmsReverseToneCurve cmsReverseToneCurveEx = cmsReverseToneCurveEx cmsSaveProfileToFile = cmsSaveProfileToFile cmsSaveProfileToIOhandler = cmsSaveProfileToIOhandler cmsSaveProfileToMem = cmsSaveProfileToMem cmsSaveProfileToStream = cmsSaveProfileToStream cmsSetAdaptationState = cmsSetAdaptationState cmsSetAlarmCodes = cmsSetAlarmCodes cmsSetColorSpace = cmsSetColorSpace cmsSetDeviceClass = cmsSetDeviceClass cmsSetEncodedICCversion = cmsSetEncodedICCversion cmsSetHeaderAttributes = cmsSetHeaderAttributes cmsSetHeaderFlags = cmsSetHeaderFlags cmsSetHeaderManufacturer = cmsSetHeaderManufacturer cmsSetHeaderModel = cmsSetHeaderModel cmsSetHeaderProfileID = cmsSetHeaderProfileID cmsSetHeaderRenderingIntent = cmsSetHeaderRenderingIntent cmsSetLogErrorHandler = cmsSetLogErrorHandler cmsSetPCS = cmsSetPCS cmsSetProfileVersion = cmsSetProfileVersion cmsSignalError = cmsSignalError cmsSmoothToneCurve = cmsSmoothToneCurve cmsstrcasecmp = cmsstrcasecmp cmsTempFromWhitePoint = cmsTempFromWhitePoint cmsTransform2DeviceLink = cmsTransform2DeviceLink cmsUnregisterPlugins = cmsUnregisterPlugins _cmsVEC3cross = _cmsVEC3cross _cmsVEC3distance = _cmsVEC3distance _cmsVEC3dot = _cmsVEC3dot _cmsVEC3init = _cmsVEC3init _cmsVEC3length = _cmsVEC3length _cmsVEC3minus = _cmsVEC3minus cmsWhitePointFromTemp = cmsWhitePointFromTemp _cmsWrite15Fixed16Number = _cmsWrite15Fixed16Number _cmsWriteAlignment = _cmsWriteAlignment _cmsWriteFloat32Number = _cmsWriteFloat32Number cmsWriteRawTag = cmsWriteRawTag cmsWriteTag = cmsWriteTag _cmsWriteTypeBase = _cmsWriteTypeBase _cmsWriteUInt16Array = _cmsWriteUInt16Array _cmsWriteUInt16Number = _cmsWriteUInt16Number _cmsWriteUInt32Number = _cmsWriteUInt32Number _cmsWriteUInt64Number = _cmsWriteUInt64Number _cmsWriteUInt8Number = _cmsWriteUInt8Number _cmsWriteXYZNumber = _cmsWriteXYZNumber cmsxyY2XYZ = cmsxyY2XYZ cmsXYZ2Lab = cmsXYZ2Lab cmsXYZ2xyY = cmsXYZ2xyY cmsXYZEncoded2Float = cmsXYZEncoded2Float cmsSliceSpace16 = cmsSliceSpace16 cmsSliceSpaceFloat = cmsSliceSpaceFloat cmsChangeBuffersFormat = cmsChangeBuffersFormat cmsDictAlloc = cmsDictAlloc cmsDictFree = cmsDictFree cmsDictDup = cmsDictDup cmsDictAddEntry = cmsDictAddEntry cmsDictGetEntryList = cmsDictGetEntryList cmsDictNextEntry = cmsDictNextEntry _cmsGetTransformUserData = _cmsGetTransformUserData _cmsSetTransformUserData = _cmsSetTransformUserData cmsGetHeaderCreator = cmsGetHeaderCreator cmsPluginTHR = cmsPluginTHR cmsGetPipelineContextID = cmsGetPipelineContextID cmsGetTransformInputFormat = cmsGetTransformInputFormat cmsGetTransformOutputFormat = cmsGetTransformOutputFormat cmsCreateContext = cmsCreateContext cmsDupContext = cmsDupContext cmsDeleteContext = cmsDeleteContext cmsGetContextUserData = cmsGetContextUserData cmsUnregisterPluginsTHR = cmsUnregisterPluginsTHR cmsSetAlarmCodesTHR = cmsSetAlarmCodesTHR cmsGetAlarmCodesTHR = cmsGetAlarmCodesTHR cmsSetAdaptationStateTHR = cmsSetAdaptationStateTHR cmsSetLogErrorHandlerTHR = cmsSetLogErrorHandlerTHR cmsGetSupportedIntentsTHR = cmsGetSupportedIntentsTHR cmsMLUtranslationsCount = cmsMLUtranslationsCount cmsMLUtranslationsCodes = cmsMLUtranslationsCodes _cmsCreateMutex = _cmsCreateMutex _cmsDestroyMutex = _cmsDestroyMutex _cmsLockMutex = _cmsLockMutex _cmsUnlockMutex = _cmsUnlockMutex cmsGetProfileIOhandler = cmsGetProfileIOhandler cmsGetEncodedCMMversion = cmsGetEncodedCMMversion _cmsFloat2Half = _cmsFloat2Half _cmsHalf2Float = _cmsHalf2Float _cmsFreeInterpParams = _cmsFreeInterpParams _cmsGetFormatter = _cmsGetFormatter _cmsGetTransformFormatters16 = _cmsGetTransformFormatters16 _cmsGetTransformFormattersFloat = _cmsGetTransformFormattersFloat _cmsQuantizeVal = _cmsQuantizeVal _cmsReadDevicelinkLUT = _cmsReadDevicelinkLUT _cmsReadInputLUT = _cmsReadInputLUT _cmsReadOutputLUT = _cmsReadOutputLUT _cmsStageAllocIdentityCLut = _cmsStageAllocIdentityCLut _cmsStageAllocIdentityCurves = _cmsStageAllocIdentityCurves _cmsStageAllocLab2XYZ = _cmsStageAllocLab2XYZ _cmsStageAllocLabV2ToV4 = _cmsStageAllocLabV2ToV4 _cmsStageAllocLabV4ToV2 = _cmsStageAllocLabV4ToV2 _cmsStageAllocNamedColor = _cmsStageAllocNamedColor _cmsStageAllocXYZ2Lab = _cmsStageAllocXYZ2Lab cmsMD5add = cmsMD5add cmsMD5alloc = cmsMD5alloc cmsMD5finish = cmsMD5finish _cmsComputeInterpParams = _cmsComputeInterpParams cmsGetToneCurveSegment = cmsGetToneCurveSegment cmsDetectRGBProfileGamma = cmsDetectRGBProfileGamma _cmsOptimizePipeline = _cmsOptimizePipeline _cmsReasonableGridpointsByColorspace = _cmsReasonableGridpointsByColorspace _cmsGetTransformFlags = _cmsGetTransformFlags _cmsGetTransformWorker = _cmsGetTransformWorker _cmsGetTransformMaxWorkers = _cmsGetTransformMaxWorkers _cmsGetTransformWorkerFlags = _cmsGetTransformWorkerFlags cmsGetTagOffsetAndSize = cmsGetTagOffsetAndSize cmsGetHeaderCMM = cmsGetHeaderCMM _cmsSetHeaderCMM = _cmsSetHeaderCMM cmsGetTransformPipeline = cmsGetTransformPipeline cmsGetTransformGamutCheckPipeline = cmsGetTransformGamutCheckPipeline cmsGetTransformInputColorants = cmsGetTransformInputColorants cmsGetTransformOutputColorants = cmsGetTransformOutputColorants lcms2-2.19.1/src/cmscgats.c0000644000175000017500000025337215176573557014436 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // IT8.7 / CGATS.17-200x handling ----------------------------------------------------------------------------- #define MAXID 128 // Max length of identifier #define MAXSTR 1024 // Max length of string #define MAXTABLES 255 // Max Number of tables in a single stream #define MAXINCLUDE 20 // Max number of nested includes #define DEFAULT_DBL_FORMAT "%.10g" // Double formatting #ifdef CMS_IS_WINDOWS_ # include # define DIR_CHAR '\\' #else # define DIR_CHAR '/' #endif // Symbols typedef enum { SUNDEFINED, SINUM, // Integer SDNUM, // Real SIDENT, // Identifier SSTRING, // string SCOMMENT, // comment SEOLN, // End of line SEOF, // End of stream SSYNERROR, // Syntax error found on stream // IT8 symbols SBEGIN_DATA, SBEGIN_DATA_FORMAT, SEND_DATA, SEND_DATA_FORMAT, SKEYWORD, SDATA_FORMAT_ID, SINCLUDE, // Cube symbols SDOMAIN_MAX, SDOMAIN_MIN, S_LUT1D_SIZE, S_LUT1D_INPUT_RANGE, S_LUT3D_SIZE, S_LUT3D_INPUT_RANGE, S_LUT_IN_VIDEO_RANGE, S_LUT_OUT_VIDEO_RANGE, STITLE } SYMBOL; // How to write the value typedef enum { WRITE_UNCOOKED, WRITE_STRINGIFY, WRITE_HEXADECIMAL, WRITE_BINARY, WRITE_PAIR } WRITEMODE; // Linked list of variable names typedef struct _KeyVal { struct _KeyVal* Next; char* Keyword; // Name of variable struct _KeyVal* NextSubkey; // If key is a dictionary, points to the next item char* Subkey; // If key is a dictionary, points to the subkey name char* Value; // Points to value WRITEMODE WriteAs; // How to write the value } KEYVALUE; // Linked list of memory chunks (Memory sink) typedef struct _OwnedMem { struct _OwnedMem* Next; void * Ptr; // Point to value } OWNEDMEM; // Suballocator typedef struct _SubAllocator { cmsUInt8Number* Block; cmsUInt32Number BlockSize; cmsUInt32Number Used; } SUBALLOCATOR; // Table. Each individual table can hold properties and rows & cols typedef struct _Table { char SheetType[MAXSTR]; // The first row of the IT8 (the type) int nSamples, nPatches; // Cols, Rows int SampleID; // Pos of ID KEYVALUE* HeaderList; // The properties char** DataFormat; // The binary stream descriptor char** Data; // The binary stream } TABLE; // File stream being parsed typedef struct _FileContext { char FileName[cmsMAX_PATH]; // File name if being read from file FILE* Stream; // File stream or NULL if holded in memory } FILECTX; //Very simple string typedef struct { struct struct_it8* it8; cmsInt32Number max; cmsInt32Number len; char* begin; } string; // This struct hold all information about an open IT8 handler. typedef struct struct_it8 { cmsUInt32Number TablesCount; // How many tables in this stream cmsUInt32Number nTable; // The actual table // Partser type cmsBool IsCUBE; // Tables TABLE Tab[MAXTABLES]; // Memory management OWNEDMEM* MemorySink; // The storage backend SUBALLOCATOR Allocator; // String suballocator -- just to keep it fast // Parser state machine SYMBOL sy; // Current symbol int ch; // Current character cmsInt32Number inum; // integer value cmsFloat64Number dnum; // real value string* id; // identifier string* str; // string // Allowed keywords & datasets. They have visibility on whole stream KEYVALUE* ValidKeywords; KEYVALUE* ValidSampleID; char* Source; // Points to loc. being parsed cmsInt32Number lineno; // line counter for error reporting FILECTX* FileStack[MAXINCLUDE]; // Stack of files being parsed cmsInt32Number IncludeSP; // Include Stack Pointer char* MemoryBlock; // The stream if holded in memory char DoubleFormatter[MAXID];// Printf-like 'cmsFloat64Number' formatter cmsContext ContextID; // The threading context } cmsIT8; // The stream for save operations typedef struct { FILE* stream; // For save-to-file behaviour cmsUInt8Number* Base; cmsUInt8Number* Ptr; // For save-to-mem behaviour cmsUInt32Number Used; cmsUInt32Number Max; } SAVESTREAM; // ------------------------------------------------------ cmsIT8 parsing routines // A keyword typedef struct { const char *id; SYMBOL sy; } KEYWORD; // The keyword->symbol translation tables. Sorting is required. static const KEYWORD TabKeysIT8[] = { {"$INCLUDE", SINCLUDE}, // This is an extension! {".INCLUDE", SINCLUDE}, // This is an extension! {"BEGIN_DATA", SBEGIN_DATA }, {"BEGIN_DATA_FORMAT", SBEGIN_DATA_FORMAT }, {"DATA_FORMAT_IDENTIFIER", SDATA_FORMAT_ID}, {"END_DATA", SEND_DATA}, {"END_DATA_FORMAT", SEND_DATA_FORMAT}, {"KEYWORD", SKEYWORD} }; #define NUMKEYS_IT8 (sizeof(TabKeysIT8)/sizeof(KEYWORD)) static const KEYWORD TabKeysCUBE[] = { {"DOMAIN_MAX", SDOMAIN_MAX }, {"DOMAIN_MIN", SDOMAIN_MIN }, {"LUT_1D_SIZE", S_LUT1D_SIZE }, {"LUT_1D_INPUT_RANGE", S_LUT1D_INPUT_RANGE }, {"LUT_3D_SIZE", S_LUT3D_SIZE }, {"LUT_3D_INPUT_RANGE", S_LUT3D_INPUT_RANGE }, {"LUT_IN_VIDEO_RANGE", S_LUT_IN_VIDEO_RANGE }, {"LUT_OUT_VIDEO_RANGE", S_LUT_OUT_VIDEO_RANGE }, {"TITLE", STITLE } }; #define NUMKEYS_CUBE (sizeof(TabKeysCUBE)/sizeof(KEYWORD)) // Predefined properties // A property typedef struct { const char *id; // The identifier WRITEMODE as; // How is supposed to be written } PROPERTY; static const PROPERTY PredefinedProperties[] = { {"NUMBER_OF_FIELDS", WRITE_UNCOOKED}, // Required - NUMBER OF FIELDS {"NUMBER_OF_SETS", WRITE_UNCOOKED}, // Required - NUMBER OF SETS {"ORIGINATOR", WRITE_STRINGIFY}, // Required - Identifies the specific system, organization or individual that created the data file. {"FILE_DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. {"CREATED", WRITE_STRINGIFY}, // Required - Indicates date of creation of the data file. {"DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. {"DIFFUSE_GEOMETRY", WRITE_STRINGIFY}, // The diffuse geometry used. Allowed values are "sphere" or "opal". {"MANUFACTURER", WRITE_STRINGIFY}, {"MANUFACTURE", WRITE_STRINGIFY}, // Some broken Fuji targets does store this value {"PROD_DATE", WRITE_STRINGIFY}, // Identifies year and month of production of the target in the form yyyy:mm. {"SERIAL", WRITE_STRINGIFY}, // Uniquely identifies individual physical target. {"MATERIAL", WRITE_STRINGIFY}, // Identifies the material on which the target was produced using a code // uniquely identifying th e material. This is intend ed to be used for IT8.7 // physical targets only (i.e . IT8.7/1 and IT8.7/2). {"INSTRUMENTATION", WRITE_STRINGIFY}, // Used to report the specific instrumentation used (manufacturer and // model number) to generate the data reported. This data will often // provide more information about the particular data collected than an // extensive list of specific details. This is particularly important for // spectral data or data derived from spectrophotometry. {"MEASUREMENT_SOURCE", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide // a guide to the potential for issues of paper fluorescence, etc. {"PRINT_CONDITIONS", WRITE_STRINGIFY}, // Used to define the characteristics of the printed sheet being reported. // Where standard conditions have been defined (e.g., SWOP at nominal) // named conditions may suffice. Otherwise, detailed information is // needed. {"SAMPLE_BACKING", WRITE_STRINGIFY}, // Identifies the backing material used behind the sample during // measurement. Allowed values are "black", "white", or {"na". {"CHISQ_DOF", WRITE_STRINGIFY}, // Degrees of freedom associated with the Chi squared statistic // below properties are new in recent specs: {"MEASUREMENT_GEOMETRY", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated // along with details of the geometry and the aperture size and shape. For example, // for transmission measurements it is important to identify 0/diffuse, diffuse/0, // opal or integrating sphere, etc. For reflection it is important to identify 0/45, // 45/0, sphere (specular included or excluded), etc. {"FILTER", WRITE_STRINGIFY}, // Identifies the use of physical filter(s) during measurement. Typically used to // denote the use of filters such as none, D65, Red, Green or Blue. {"POLARIZATION", WRITE_STRINGIFY}, // Identifies the use of a physical polarization filter during measurement. Allowed // values are {"yes", "white", "none" or "na". {"WEIGHTING_FUNCTION", WRITE_PAIR}, // Indicates such functions as: the CIE standard observer functions used in the // calculation of various data parameters (2 degree and 10 degree), CIE standard // illuminant functions used in the calculation of various data parameters (e.g., D50, // D65, etc.), density status response, etc. If used there shall be at least one // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute // in the set shall be {"name" and shall identify the particular parameter used. // The second shall be {"value" and shall provide the value associated with that name. // For ASCII data, a string containing the Name and Value attribute pairs shall follow // the weighting function keyword. A semi-colon separates attribute pairs from each // other and within the attribute the name and value are separated by a comma. {"COMPUTATIONAL_PARAMETER", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name // of the calculation, parameter is the name of the parameter used in the calculation // and value is the value of the parameter. {"TARGET_TYPE", WRITE_STRINGIFY}, // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc. {"COLORANT", WRITE_STRINGIFY}, // Identifies the colorant(s) used in creating the target. {"TABLE_DESCRIPTOR", WRITE_STRINGIFY}, // Describes the purpose or contents of a data table. {"TABLE_NAME", WRITE_STRINGIFY} // Provides a short name for a data table. }; #define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY)) // Predefined sample types on dataset static const char* PredefinedSampleID[] = { "SAMPLE_ID", // Identifies sample that data represents "STRING", // Identifies label, or other non-machine readable value. // Value must begin and end with a " symbol "CMYK_C", // Cyan component of CMYK data expressed as a percentage "CMYK_M", // Magenta component of CMYK data expressed as a percentage "CMYK_Y", // Yellow component of CMYK data expressed as a percentage "CMYK_K", // Black component of CMYK data expressed as a percentage "D_RED", // Red filter density "D_GREEN", // Green filter density "D_BLUE", // Blue filter density "D_VIS", // Visual filter density "D_MAJOR_FILTER", // Major filter d ensity "RGB_R", // Red component of RGB data "RGB_G", // Green component of RGB data "RGB_B", // Blue com ponent of RGB data "SPECTRAL_NM", // Wavelength of measurement expressed in nanometers "SPECTRAL_PCT", // Percentage reflectance/transmittance "SPECTRAL_DEC", // Reflectance/transmittance "XYZ_X", // X component of tristimulus data "XYZ_Y", // Y component of tristimulus data "XYZ_Z", // Z component of tristimulus data "XYY_X", // x component of chromaticity data "XYY_Y", // y component of chromaticity data "XYY_CAPY", // Y component of tristimulus data "LAB_L", // L* component of Lab data "LAB_A", // a* component of Lab data "LAB_B", // b* component of Lab data "LAB_C", // C*ab component of Lab data "LAB_H", // hab component of Lab data "LAB_DE", // CIE dE "LAB_DE_94", // CIE dE using CIE 94 "LAB_DE_CMC", // dE using CMC "LAB_DE_2000", // CIE dE using CIE DE 2000 "MEAN_DE", // Mean Delta E (LAB_DE) of samples compared to batch average // (Used for data files for ANSI IT8.7/1 and IT8.7/2 targets) "STDEV_X", // Standard deviation of X (tristimulus data) "STDEV_Y", // Standard deviation of Y (tristimulus data) "STDEV_Z", // Standard deviation of Z (tristimulus data) "STDEV_L", // Standard deviation of L* "STDEV_A", // Standard deviation of a* "STDEV_B", // Standard deviation of b* "STDEV_DE", // Standard deviation of CIE dE "CHI_SQD_PAR"}; // The average of the standard deviations of L*, a* and b*. It is // used to derive an estimate of the chi-squared parameter which is // recommended as the predictor of the variability of dE #define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *)) //Forward declaration of some internal functions static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size); static string* StringAlloc(cmsIT8* it8, int max) { string* s = (string*) AllocChunk(it8, sizeof(string)); if (s == NULL) return NULL; s->it8 = it8; s->max = max; s->len = 0; s->begin = (char*) AllocChunk(it8, s->max); return s; } static void StringClear(string* s) { s->len = 0; s->begin[0] = 0; } static cmsBool StringAppend(string* s, char c) { if (s->len + 1 >= s->max) { char* new_ptr; s->max *= 10; new_ptr = (char*) AllocChunk(s->it8, s->max); if (new_ptr == NULL) return FALSE; if (s->begin != NULL) memcpy(new_ptr, s->begin, s->len); s->begin = new_ptr; } if (s->begin != NULL) { s->begin[s->len++] = c; s->begin[s->len] = 0; } return TRUE; } static char* StringPtr(string* s) { return s->begin; } static cmsBool StringCat(string* s, const char* c) { while (*c) { if (!StringAppend(s, *c)) return FALSE; c++; } return TRUE; } // Checks whatever c is a separator static cmsBool isseparator(int c) { return (c == ' ') || (c == '\t'); } // Checks whatever c is a valid identifier char static cmsBool ismiddle(int c) { return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127)); } // Checks whatsever c is a valid identifier middle char. static cmsBool isidchar(int c) { return isalnum(c) || ismiddle(c); } // Checks whatsever c is a valid identifier first char. static cmsBool isfirstidchar(int c) { return c != '-' && !isdigit(c) && ismiddle(c); } // Guess whether the supplied path looks like an absolute path static cmsBool isabsolutepath(const char *path) { char ThreeChars[4]; if(path == NULL) return FALSE; if (path[0] == 0) return FALSE; strncpy(ThreeChars, path, 3); ThreeChars[3] = 0; if(ThreeChars[0] == DIR_CHAR) return TRUE; #ifdef CMS_IS_WINDOWS_ if (isalpha((int) ThreeChars[0]) && ThreeChars[1] == ':') return TRUE; #endif return FALSE; } // Makes a file path based on a given reference path // NOTE: this function doesn't check if the path exists or even if it's legal static cmsBool BuildAbsolutePath(const char *relPath, const char *basePath, char *buffer, cmsUInt32Number MaxLen) { char *tail; cmsUInt32Number len; // Already absolute? if (isabsolutepath(relPath)) { memcpy(buffer, relPath, MaxLen); buffer[MaxLen-1] = 0; return TRUE; } // No, search for last memcpy(buffer, basePath, MaxLen); buffer[MaxLen-1] = 0; tail = strrchr(buffer, DIR_CHAR); if (tail == NULL) return FALSE; // Is not absolute and has no separators?? len = (cmsUInt32Number) (tail - buffer); if (len >= MaxLen) return FALSE; // No need to assure zero terminator over here strncpy(tail + 1, relPath, MaxLen - len); return TRUE; } // Make sure no exploit is being even tried static const char* NoMeta(const char* str) { if (strchr(str, '%') != NULL) return "**** CORRUPTED FORMAT STRING ***"; return str; } // Syntax error static cmsBool SynError(cmsIT8* it8, const char *Txt, ...) { char Buffer[256], ErrMsg[1024]; va_list args; va_start(args, Txt); vsnprintf(Buffer, 255, Txt, args); Buffer[255] = 0; va_end(args); snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer); ErrMsg[1023] = 0; it8->sy = SSYNERROR; cmsSignalError(it8 ->ContextID, cmsERROR_CORRUPTION_DETECTED, "%s", ErrMsg); return FALSE; } // Check if current symbol is same as specified. issue an error else. static cmsBool Check(cmsIT8* it8, SYMBOL sy, const char* Err) { if (it8 -> sy != sy) return SynError(it8, NoMeta(Err)); return TRUE; } // Read Next character from stream static void NextCh(cmsIT8* it8) { if (it8 -> FileStack[it8 ->IncludeSP]->Stream) { it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream); if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream)) { if (it8 ->IncludeSP > 0) { fclose(it8 ->FileStack[it8->IncludeSP--]->Stream); it8 -> ch = ' '; // Whitespace to be ignored } else it8 ->ch = 0; // EOF } } else { it8->ch = *it8->Source; if (it8->ch) it8->Source++; } } // Try to see if current identifier is a keyword, if so return the referred symbol static SYMBOL BinSrchKey(const char *id, int NumKeys, const KEYWORD* TabKeys) { int l = 1; int r = NumKeys; int x, res; while (r >= l) { x = (l+r)/2; res = cmsstrcasecmp(id, TabKeys[x-1].id); if (res == 0) return TabKeys[x-1].sy; if (res < 0) r = x - 1; else l = x + 1; } return SUNDEFINED; } // 10 ^n static cmsFloat64Number xpow10(int n) { return pow(10, (cmsFloat64Number) n); } // Reads a Real number, tries to follow from integer number static void ReadReal(cmsIT8* it8, cmsInt32Number inum) { it8->dnum = (cmsFloat64Number)inum; while (isdigit(it8->ch)) { it8->dnum = (cmsFloat64Number)it8->dnum * 10.0 + (cmsFloat64Number)(it8->ch - '0'); NextCh(it8); } if (it8->ch == '.') { // Decimal point cmsFloat64Number frac = 0.0; // fraction int prec = 0; // precision NextCh(it8); // Eats dec. point while (isdigit(it8->ch)) { frac = frac * 10.0 + (cmsFloat64Number)(it8->ch - '0'); prec++; NextCh(it8); } it8->dnum = it8->dnum + (frac / xpow10(prec)); } // Exponent, example 34.00E+20 if (toupper(it8->ch) == 'E') { cmsInt32Number e; cmsInt32Number sgn; NextCh(it8); sgn = 1; if (it8->ch == '-') { sgn = -1; NextCh(it8); } else if (it8->ch == '+') { sgn = +1; NextCh(it8); } e = 0; while (isdigit(it8->ch)) { cmsInt32Number digit = (it8->ch - '0'); if ((cmsFloat64Number)e * 10.0 + (cmsFloat64Number)digit < (cmsFloat64Number)+2147483647.0) e = e * 10 + digit; NextCh(it8); } e = sgn*e; it8->dnum = it8->dnum * xpow10(e); } } // Parses a float number // This can not call directly atof because it uses locale dependent // parsing, while CCMX files always use . as decimal separator static cmsFloat64Number ParseFloatNumber(const char *Buffer) { cmsFloat64Number dnum = 0.0; int sign = 1; // keep safe if (Buffer == NULL) return 0.0; if (*Buffer == '-' || *Buffer == '+') { sign = (*Buffer == '-') ? -1 : 1; Buffer++; } while (*Buffer && isdigit((int)*Buffer)) { dnum = dnum * 10.0 + (*Buffer - '0'); if (*Buffer) Buffer++; } if (*Buffer == '.') { cmsFloat64Number frac = 0.0; // fraction int prec = 0; // precision if (*Buffer) Buffer++; while (*Buffer && isdigit((int)*Buffer)) { frac = frac * 10.0 + (*Buffer - '0'); prec++; if (*Buffer) Buffer++; } dnum = dnum + (frac / xpow10(prec)); } // Exponent, example 34.00E+20 if (*Buffer && toupper(*Buffer) == 'E') { int e; int sgn; if (*Buffer) Buffer++; sgn = 1; if (*Buffer == '-') { sgn = -1; if (*Buffer) Buffer++; } else if (*Buffer == '+') { sgn = +1; if (*Buffer) Buffer++; } e = 0; while (*Buffer && isdigit((int)*Buffer)) { cmsInt32Number digit = (*Buffer - '0'); if ((cmsFloat64Number)e * 10.0 + digit < (cmsFloat64Number)+2147483647.0) e = e * 10 + digit; if (*Buffer) Buffer++; } e = sgn*e; dnum = dnum * xpow10(e); } return sign * dnum; } // Reads a string, special case to avoid infinite recursion on .include static void InStringSymbol(cmsIT8* it8) { while (isseparator(it8->ch)) NextCh(it8); if (it8->ch == '\'' || it8->ch == '\"') { int sng; sng = it8->ch; StringClear(it8->str); NextCh(it8); while (it8->ch != sng) { if (it8->ch == '\n' || it8->ch == '\r' || it8->ch == 0) break; else { if (!StringAppend(it8->str, (char)it8->ch)) { SynError(it8, "Out of memory"); return; } NextCh(it8); } } it8->sy = SSTRING; NextCh(it8); } else SynError(it8, "String expected"); } // Reads next symbol static void InSymbol(cmsIT8* it8) { SYMBOL key; do { while (isseparator(it8->ch)) NextCh(it8); if (isfirstidchar(it8->ch)) { // Identifier StringClear(it8->id); do { if (!StringAppend(it8->id, (char)it8->ch)) { SynError(it8, "Out of memory"); return; } NextCh(it8); } while (isidchar(it8->ch)); key = BinSrchKey(StringPtr(it8->id), it8->IsCUBE ? NUMKEYS_CUBE : NUMKEYS_IT8, it8->IsCUBE ? TabKeysCUBE : TabKeysIT8); if (key == SUNDEFINED) it8->sy = SIDENT; else it8->sy = key; } else // Is a number? if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+') { int sign = 1; if (it8->ch == '-') { sign = -1; NextCh(it8); } else if (it8->ch == '+') { sign = +1; NextCh(it8); } it8->inum = 0; it8->sy = SINUM; if (it8->ch == '0') { // 0xnnnn (Hexa) or 0bnnnn (Binary) NextCh(it8); if (toupper(it8->ch) == 'X') { int j; NextCh(it8); while (isxdigit(it8->ch)) { it8->ch = toupper(it8->ch); if (it8->ch >= 'A' && it8->ch <= 'F') j = it8->ch -'A'+10; else j = it8->ch - '0'; if ((cmsFloat64Number) it8->inum * 16.0 + (cmsFloat64Number) j > (cmsFloat64Number)+2147483647.0) { SynError(it8, "Invalid hexadecimal number"); return; } it8->inum = it8->inum * 16 + j; NextCh(it8); } return; } if (toupper(it8->ch) == 'B') { // Binary int j; NextCh(it8); while (it8->ch == '0' || it8->ch == '1') { j = it8->ch - '0'; if ((cmsFloat64Number) it8->inum * 2.0 + j > (cmsFloat64Number)+2147483647.0) { SynError(it8, "Invalid binary number"); return; } it8->inum = it8->inum * 2 + j; NextCh(it8); } return; } } while (isdigit(it8->ch)) { cmsInt32Number digit = (it8->ch - '0'); if ((cmsFloat64Number) it8->inum * 10.0 + (cmsFloat64Number) digit > (cmsFloat64Number) +2147483647.0) { ReadReal(it8, it8->inum); it8->sy = SDNUM; it8->dnum *= sign; return; } it8->inum = it8->inum * 10 + digit; NextCh(it8); } if (it8->ch == '.') { ReadReal(it8, it8->inum); it8->sy = SDNUM; it8->dnum *= sign; return; } it8 -> inum *= sign; // Special case. Numbers followed by letters are taken as identifiers if (isidchar(it8 ->ch)) { char buffer[127]; if (it8 ->sy == SINUM) { snprintf(buffer, sizeof(buffer), "%d", it8->inum); } else { snprintf(buffer, sizeof(buffer), it8 ->DoubleFormatter, it8->dnum); } StringClear(it8->id); if (!StringCat(it8->id, buffer)) { SynError(it8, "Out of memory"); return; } do { if (!StringAppend(it8->id, (char)it8->ch)) { SynError(it8, "Out of memory"); return; } NextCh(it8); } while (isidchar(it8->ch)); it8->sy = SIDENT; } return; } else switch ((int) it8->ch) { // Eof stream markers case '\x1a': case 0: case -1: it8->sy = SEOF; break; // Next line case '\r': NextCh(it8); if (it8->ch == '\n') NextCh(it8); it8->sy = SEOLN; it8->lineno++; break; case '\n': NextCh(it8); it8->sy = SEOLN; it8->lineno++; break; // Comment case '#': NextCh(it8); while (it8->ch && it8->ch != '\n' && it8->ch != '\r') NextCh(it8); it8->sy = SCOMMENT; break; // String. case '\'': case '\"': InStringSymbol(it8); break; default: SynError(it8, "Unrecognized character: 0x%x", it8 ->ch); return; } } while (it8->sy == SCOMMENT); // Handle the include special token if (it8 -> sy == SINCLUDE) { FILECTX* FileNest; if(it8 -> IncludeSP >= (MAXINCLUDE-1)) { SynError(it8, "Too many recursion levels"); return; } InStringSymbol(it8); if (!Check(it8, SSTRING, "Filename expected")) return; FileNest = it8 -> FileStack[it8 -> IncludeSP + 1]; if(FileNest == NULL) { FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX)); if (FileNest == NULL) { SynError(it8, "Out of memory"); return; } } if (BuildAbsolutePath(StringPtr(it8->str), it8->FileStack[it8->IncludeSP]->FileName, FileNest->FileName, cmsMAX_PATH-1) == FALSE) { SynError(it8, "File path too long"); return; } FileNest->Stream = fopen(FileNest->FileName, "rt"); if (FileNest->Stream == NULL) { SynError(it8, "File %s not found", FileNest->FileName); return; } it8->IncludeSP++; it8 ->ch = ' '; InSymbol(it8); } } // Checks end of line separator static cmsBool CheckEOLN(cmsIT8* it8) { if (!Check(it8, SEOLN, "Expected separator")) return FALSE; while (it8->sy == SEOLN) InSymbol(it8); return TRUE; } // Skip a symbol static void Skip(cmsIT8* it8, SYMBOL sy) { if (it8->sy == sy && it8->sy != SEOF && it8->sy != SSYNERROR) InSymbol(it8); } // Skip multiple EOLN static void SkipEOLN(cmsIT8* it8) { while (it8->sy == SEOLN) { InSymbol(it8); } } // Returns a string holding current value static cmsBool GetVal(cmsIT8* it8, char* Buffer, cmsUInt32Number max, const char* ErrorTitle) { switch (it8->sy) { case SEOLN: // Empty value Buffer[0]=0; break; case SIDENT: strncpy(Buffer, StringPtr(it8->id), max); Buffer[max-1]=0; break; case SINUM: snprintf(Buffer, max, "%d", it8 -> inum); break; case SDNUM: snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break; case SSTRING: strncpy(Buffer, StringPtr(it8->str), max); Buffer[max-1] = 0; break; default: return SynError(it8, "%s", ErrorTitle); } Buffer[max] = 0; return TRUE; } // ---------------------------------------------------------- Table static TABLE* GetTable(cmsIT8* it8) { if ((it8 -> nTable >= it8 ->TablesCount)) { SynError(it8, "Table %d out of sequence", it8 -> nTable); return it8 -> Tab; } return it8 ->Tab + it8 ->nTable; } // ---------------------------------------------------------- Memory management // Frees an allocator and owned memory void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8) { cmsIT8* it8 = (cmsIT8*) hIT8; if (it8 == NULL) return; if (it8->MemorySink) { OWNEDMEM* p; OWNEDMEM* n; for (p = it8->MemorySink; p != NULL; p = n) { n = p->Next; if (p->Ptr) _cmsFree(it8 ->ContextID, p->Ptr); _cmsFree(it8 ->ContextID, p); } } if (it8->MemoryBlock) _cmsFree(it8 ->ContextID, it8->MemoryBlock); _cmsFree(it8 ->ContextID, it8); } // Allocates a chunk of data, keep linked list static void* AllocBigBlock(cmsIT8* it8, cmsUInt32Number size) { OWNEDMEM* ptr1; void* ptr = _cmsMallocZero(it8->ContextID, size); if (ptr != NULL) { ptr1 = (OWNEDMEM*) _cmsMallocZero(it8 ->ContextID, sizeof(OWNEDMEM)); if (ptr1 == NULL) { _cmsFree(it8 ->ContextID, ptr); return NULL; } ptr1-> Ptr = ptr; ptr1-> Next = it8 -> MemorySink; it8 -> MemorySink = ptr1; } return ptr; } // Suballocator. static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) { cmsUInt32Number Free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used; cmsUInt8Number* ptr; size = _cmsALIGNMEM(size); if (size == 0) return NULL; if (size > Free) { cmsUInt8Number* new_block; if (it8 -> Allocator.BlockSize == 0) it8 -> Allocator.BlockSize = 20*1024; else it8 ->Allocator.BlockSize *= 2; if (it8 ->Allocator.BlockSize < size) it8 ->Allocator.BlockSize = size; it8 ->Allocator.Used = 0; new_block = (cmsUInt8Number*)AllocBigBlock(it8, it8->Allocator.BlockSize); if (new_block == NULL) goto Error; it8->Allocator.Block = new_block; } if (it8->Allocator.Block == NULL) goto Error; ptr = it8 ->Allocator.Block + it8 ->Allocator.Used; it8 ->Allocator.Used += size; return (void*) ptr; Error: SynError(it8, "Allocation error"); it8->Allocator.BlockSize = 0; it8->Allocator.Used = 0; it8->Allocator.Block = NULL; return NULL; } // Allocates a string static char *AllocString(cmsIT8* it8, const char* str) { cmsUInt32Number Size; char *ptr; if (str == NULL) return NULL; Size = (cmsUInt32Number)strlen(str) + 1; ptr = (char *) AllocChunk(it8, Size); if (ptr) memcpy(ptr, str, Size-1); return ptr; } // Searches through linked list static cmsBool IsAvailableOnList(KEYVALUE* p, const char* Key, const char* Subkey, KEYVALUE** LastPtr) { if (LastPtr) *LastPtr = p; for (; p != NULL; p = p->Next) { if (LastPtr) *LastPtr = p; if (*Key != '#') { // Comments are ignored if (cmsstrcasecmp(Key, p->Keyword) == 0) break; } } if (p == NULL) return FALSE; if (Subkey == 0) return TRUE; for (; p != NULL; p = p->NextSubkey) { if (p ->Subkey == NULL) continue; if (LastPtr) *LastPtr = p; if (cmsstrcasecmp(Subkey, p->Subkey) == 0) return TRUE; } return FALSE; } // Add a property into a linked list static KEYVALUE* AddToList(cmsIT8* it8, KEYVALUE** Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs) { KEYVALUE* p; KEYVALUE* last; // Check if property is already in list if (IsAvailableOnList(*Head, Key, Subkey, &p)) { // This may work for editing properties if (cmsstrcasecmp(Key, "NUMBER_OF_FIELDS") == 0 || cmsstrcasecmp(Key, "NUMBER_OF_SETS") == 0) { SynError(it8, "duplicate key <%s>", Key); return NULL; } } else { last = p; // Allocate the container p = (KEYVALUE*) AllocChunk(it8, sizeof(KEYVALUE)); if (p == NULL) { SynError(it8, "AddToList: out of memory"); return NULL; } // Store name and value p->Keyword = AllocString(it8, Key); p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey); // Keep the container in our list if (*Head == NULL) { *Head = p; } else { if (Subkey != NULL && last != NULL) { last->NextSubkey = p; // If Subkey is not null, then last is the last property with the same key, // but not necessarily is the last property in the list, so we need to move // to the actual list end while (last->Next != NULL) last = last->Next; } if (last != NULL) last->Next = p; } p->Next = NULL; p->NextSubkey = NULL; } p->WriteAs = WriteAs; if (xValue != NULL) { p->Value = AllocString(it8, xValue); } else { p->Value = NULL; } return p; } static KEYVALUE* AddAvailableProperty(cmsIT8* it8, const char* Key, WRITEMODE as) { return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as); } static KEYVALUE* AddAvailableSampleID(cmsIT8* it8, const char* Key) { return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED); } static cmsBool AllocTable(cmsIT8* it8) { TABLE* t; if (it8->TablesCount >= (MAXTABLES-1)) return FALSE; t = it8 ->Tab + it8 ->TablesCount; t->HeaderList = NULL; t->DataFormat = NULL; t->Data = NULL; it8 ->TablesCount++; return TRUE; } cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE IT8, cmsUInt32Number nTable) { cmsIT8* it8 = (cmsIT8*) IT8; if (nTable >= it8 ->TablesCount) { if (nTable == it8 ->TablesCount) { if (!AllocTable(it8)) { SynError(it8, "Too many tables"); return -1; } } else { SynError(it8, "Table %d is out of sequence", nTable); return -1; } } it8 ->nTable = nTable; return (cmsInt32Number) nTable; } // Init an empty container cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID) { cmsIT8* it8; cmsUInt32Number i; it8 = (cmsIT8*) _cmsMallocZero(ContextID, sizeof(cmsIT8)); if (it8 == NULL) return NULL; AllocTable(it8); it8->MemoryBlock = NULL; it8->MemorySink = NULL; it8->IsCUBE = FALSE; it8 ->nTable = 0; it8->ContextID = ContextID; it8->Allocator.Used = 0; it8->Allocator.Block = NULL; it8->Allocator.BlockSize = 0; it8->ValidKeywords = NULL; it8->ValidSampleID = NULL; it8 -> sy = SUNDEFINED; it8 -> ch = ' '; it8 -> Source = NULL; it8 -> inum = 0; it8 -> dnum = 0.0; it8->FileStack[0] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX)); it8->IncludeSP = 0; it8 -> lineno = 1; it8->id = StringAlloc(it8, MAXSTR); it8->str = StringAlloc(it8, MAXSTR); strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); cmsIT8SetSheetType((cmsHANDLE) it8, "CGATS.17"); // Initialize predefined properties & data for (i=0; i < NUMPREDEFINEDPROPS; i++) AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as); for (i=0; i < NUMPREDEFINEDSAMPLEID; i++) AddAvailableSampleID(it8, PredefinedSampleID[i]); return (cmsHANDLE) it8; } const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8) { return GetTable((cmsIT8*) hIT8)->SheetType; } cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type) { TABLE* t = GetTable((cmsIT8*) hIT8); strncpy(t ->SheetType, Type, MAXSTR-1); t ->SheetType[MAXSTR-1] = 0; return TRUE; } cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val) { cmsIT8* it8 = (cmsIT8*) hIT8; if (!Val) return FALSE; if (!*Val) return FALSE; return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL; } // Sets a property cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val) { cmsIT8* it8 = (cmsIT8*) hIT8; if (!Val) return FALSE; if (!*Val) return FALSE; return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buffer[1024]; snprintf(Buffer, 1023, it8->DoubleFormatter, Val); return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buffer[1024]; snprintf(Buffer, 1023, "%u", Val); return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer) { cmsIT8* it8 = (cmsIT8*) hIT8; return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer) { cmsIT8* it8 = (cmsIT8*) hIT8; return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL; } // Gets a property const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* Key) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE* p; if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p)) { return p -> Value; } return NULL; } cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp) { const char *v = cmsIT8GetProperty(hIT8, cProp); if (v == NULL) return 0.0; return ParseFloatNumber(v); } const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE* p; if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p)) { return p -> Value; } return NULL; } // ----------------------------------------------------------------- Datasets // A safe atoi that returns 0 when NULL input is given static cmsInt32Number satoi(const char* b) { int n; if (b == NULL) return 0; n = atoi(b); if (n > 0x7ffffff0L) return 0x7ffffff0L; if (n < -0x7ffffff0L) return -0x7ffffff0L; return (cmsInt32Number)n; } static cmsBool AllocateDataFormat(cmsIT8* it8) { cmsUInt32Number size; TABLE* t = GetTable(it8); if (t->DataFormat) return TRUE; // Already allocated t->nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); if (t->nSamples <= 0 || t->nSamples > 0x7ffe) { SynError(it8, "Wrong NUMBER_OF_FIELDS"); return FALSE; } size = ((cmsUInt32Number)t->nSamples + 1) * sizeof(char*); t->DataFormat = (char**)AllocChunk(it8, size); if (t->DataFormat == NULL) { SynError(it8, "Unable to allocate dataFormat array"); return FALSE; } return TRUE; } static const char *GetDataFormat(cmsIT8* it8, int n) { TABLE* t = GetTable(it8); if (t->DataFormat) return t->DataFormat[n]; return NULL; } static cmsBool SetDataFormat(cmsIT8* it8, int n, const char *label) { TABLE* t = GetTable(it8); if (!t->DataFormat) { if (!AllocateDataFormat(it8)) return FALSE; } if (n < 0 || n >= t -> nSamples) { SynError(it8, "Invalid or more than NUMBER_OF_FIELDS fields."); return FALSE; } if (t->DataFormat) { t->DataFormat[n] = AllocString(it8, label); if (t->DataFormat[n] == NULL) return FALSE; } return TRUE; } cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE h, int n, const char *Sample) { cmsIT8* it8 = (cmsIT8*)h; _cmsAssert(n >= 0); return SetDataFormat(it8, n, Sample); } // Convert to binary static const char* satob(const char* v) { cmsUInt32Number x; static char buf[33]; char *s = buf + 33; if (v == NULL) return "0"; x = atoi(v); *--s = 0; if (!x) *--s = '0'; for (; x; x /= 2) *--s = '0' + x%2; return s; } static cmsBool AllocateDataSet(cmsIT8* it8) { TABLE* t = GetTable(it8); if (t -> Data) return TRUE; // Already allocated t-> nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); t-> nPatches = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS")); if (t -> nSamples < 0 || t->nSamples > 0x7ffe || t->nPatches < 0 || t->nPatches > 0x7ffe || (t->nPatches * t->nSamples) > 200000) { SynError(it8, "AllocateDataSet: too much data"); return FALSE; } else { // Some dumb analyzers warns of possible overflow here, just take a look couple of lines above. t->Data = (char**)AllocChunk(it8, ((cmsUInt32Number)t->nSamples + 1) * ((cmsUInt32Number)t->nPatches + 1) * sizeof(char*)); if (t->Data == NULL) { SynError(it8, "AllocateDataSet: Unable to allocate data array"); return FALSE; } } return TRUE; } static char* GetData(cmsIT8* it8, int nSet, int nField) { TABLE* t = GetTable(it8); int nSamples = t -> nSamples; int nPatches = t -> nPatches; if (nSet < 0 || nSet >= nPatches || nField < 0 || nField >= nSamples) return NULL; if (!t->Data) return NULL; return t->Data [nSet * nSamples + nField]; } static cmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val) { char* ptr; TABLE* t = GetTable(it8); if (!t->Data) { if (!AllocateDataSet(it8)) return FALSE; } if (!t->Data) return FALSE; if (nSet > t -> nPatches || nSet < 0) { return SynError(it8, "Patch %d out of range, there are %d patches", nSet, t -> nPatches); } if (nField > t ->nSamples || nField < 0) { return SynError(it8, "Sample %d out of range, there are %d samples", nField, t ->nSamples); } ptr = AllocString(it8, Val); if (ptr == NULL) return FALSE; t->Data [nSet * t -> nSamples + nField] = ptr; return TRUE; } // --------------------------------------------------------------- File I/O // Writes a string to file static void WriteStr(SAVESTREAM* f, const char *str) { cmsUInt32Number len; if (str == NULL) str = " "; // Length to write len = (cmsUInt32Number) strlen(str); f ->Used += len; if (f ->stream) { // Should I write it to a file? if (fwrite(str, 1, len, f->stream) != len) { cmsSignalError(0, cmsERROR_WRITE, "Write to file error in CGATS parser"); return; } } else { // Or to a memory block? if (f ->Base) { // Am I just counting the bytes? if (f ->Used > f ->Max) { cmsSignalError(0, cmsERROR_WRITE, "Write to memory overflows in CGATS parser"); return; } memmove(f ->Ptr, str, len); f->Ptr += len; } } } // Write formatted static void Writef(SAVESTREAM* f, const char* frm, ...) { char Buffer[4096]; va_list args; va_start(args, frm); vsnprintf(Buffer, 4095, frm, args); Buffer[4095] = 0; WriteStr(f, Buffer); va_end(args); } // Writes full header static void WriteHeader(cmsIT8* it8, SAVESTREAM* fp) { KEYVALUE* p; TABLE* t = GetTable(it8); // Writes the type WriteStr(fp, t->SheetType); WriteStr(fp, "\n"); for (p = t->HeaderList; (p != NULL); p = p->Next) { if (*p ->Keyword == '#') { char* Pt; WriteStr(fp, "#\n# "); for (Pt = p ->Value; *Pt; Pt++) { Writef(fp, "%c", *Pt); if (*Pt == '\n') { WriteStr(fp, "# "); } } WriteStr(fp, "\n#\n"); continue; } if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) { #ifdef CMS_STRICT_CGATS WriteStr(fp, "KEYWORD\t\""); WriteStr(fp, p->Keyword); WriteStr(fp, "\"\n"); #endif AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED); } WriteStr(fp, p->Keyword); if (p->Value) { switch (p ->WriteAs) { case WRITE_UNCOOKED: Writef(fp, "\t%s", p ->Value); break; case WRITE_STRINGIFY: Writef(fp, "\t\"%s\"", p->Value ); break; case WRITE_HEXADECIMAL: Writef(fp, "\t0x%X", satoi(p ->Value)); break; case WRITE_BINARY: Writef(fp, "\t0b%s", satob(p ->Value)); break; case WRITE_PAIR: Writef(fp, "\t\"%s,%s\"", p->Subkey, p->Value); break; default: SynError(it8, "Unknown write mode %d", p ->WriteAs); return; } } WriteStr (fp, "\n"); } } // Writes the data format static void WriteDataFormat(SAVESTREAM* fp, cmsIT8* it8) { int i, nSamples; TABLE* t = GetTable(it8); if (!t -> DataFormat) return; WriteStr(fp, "BEGIN_DATA_FORMAT\n"); WriteStr(fp, " "); nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); if (nSamples <= t->nSamples) { for (i = 0; i < nSamples; i++) { WriteStr(fp, t->DataFormat[i]); WriteStr(fp, ((i == (nSamples - 1)) ? "\n" : "\t")); } } WriteStr (fp, "END_DATA_FORMAT\n"); } // Writes data array static void WriteData(SAVESTREAM* fp, cmsIT8* it8) { int i, j, nPatches; TABLE* t = GetTable(it8); if (!t->Data) return; WriteStr (fp, "BEGIN_DATA\n"); nPatches = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS")); if (nPatches <= t->nPatches) { for (i = 0; i < nPatches; i++) { WriteStr(fp, " "); for (j = 0; j < t->nSamples; j++) { char* ptr = t->Data[i * t->nSamples + j]; if (ptr == NULL) WriteStr(fp, "\"\""); else { // If value contains whitespace, enclose within quote if (strchr(ptr, ' ') != NULL) { WriteStr(fp, "\""); WriteStr(fp, ptr); WriteStr(fp, "\""); } else WriteStr(fp, ptr); } WriteStr(fp, ((j == (t->nSamples - 1)) ? "\n" : "\t")); } } } WriteStr (fp, "END_DATA\n"); } // Saves whole file cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName) { SAVESTREAM sd; cmsUInt32Number i; cmsIT8* it8 = (cmsIT8*) hIT8; memset(&sd, 0, sizeof(sd)); sd.stream = fopen(cFileName, "wt"); if (!sd.stream) return FALSE; for (i=0; i < it8 ->TablesCount; i++) { TABLE* t; if (cmsIT8SetTable(hIT8, i) < 0) goto Error; /** * Check for wrong data */ t = GetTable(it8); if (t->Data == NULL) goto Error; if (t->DataFormat == NULL) goto Error; WriteHeader(it8, &sd); WriteDataFormat(&sd, it8); WriteData(&sd, it8); } if (fclose(sd.stream) != 0) return FALSE; return TRUE; Error: fclose(sd.stream); return FALSE; } // Saves to memory cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded) { SAVESTREAM sd; cmsUInt32Number i; cmsIT8* it8 = (cmsIT8*) hIT8; memset(&sd, 0, sizeof(sd)); sd.stream = NULL; sd.Base = (cmsUInt8Number*) MemPtr; sd.Ptr = sd.Base; sd.Used = 0; if (sd.Base && (*BytesNeeded > 0)) { sd.Max = (*BytesNeeded) - 1; // Write to memory? } else sd.Max = 0; // Just counting the needed bytes for (i=0; i < it8 ->TablesCount; i++) { cmsIT8SetTable(hIT8, i); WriteHeader(it8, &sd); WriteDataFormat(&sd, it8); WriteData(&sd, it8); } sd.Used++; // The \0 at the very end if (sd.Base) *sd.Ptr = 0; *BytesNeeded = sd.Used; return TRUE; } // -------------------------------------------------------------- Higher level parsing static cmsBool DataFormatSection(cmsIT8* it8) { int iField = 0; TABLE* t = GetTable(it8); InSymbol(it8); // Eats "BEGIN_DATA_FORMAT" CheckEOLN(it8); while (it8->sy != SEND_DATA_FORMAT && it8->sy != SEOLN && it8->sy != SEOF && it8->sy != SSYNERROR) { if (it8->sy != SIDENT) { return SynError(it8, "Sample type expected"); } if (!SetDataFormat(it8, iField, StringPtr(it8->id))) return FALSE; iField++; InSymbol(it8); SkipEOLN(it8); } SkipEOLN(it8); Skip(it8, SEND_DATA_FORMAT); SkipEOLN(it8); if (iField != t ->nSamples) { SynError(it8, "Count mismatch. NUMBER_OF_FIELDS was %d, found %d\n", t ->nSamples, iField); } return TRUE; } static cmsBool DataSection (cmsIT8* it8) { int iField = 0; int iSet = 0; char Buffer[256]; TABLE* t = GetTable(it8); InSymbol(it8); // Eats "BEGIN_DATA" CheckEOLN(it8); if (!t->Data) { if (!AllocateDataSet(it8)) return FALSE; } while (it8->sy != SEND_DATA && it8->sy != SEOF && it8->sy != SSYNERROR) { if (iField >= t -> nSamples) { iField = 0; iSet++; } if (it8->sy != SEND_DATA && it8->sy != SEOF && it8->sy != SSYNERROR) { switch (it8->sy) { // To keep very long data case SIDENT: if (!SetData(it8, iSet, iField, StringPtr(it8->id))) return FALSE; break; case SSTRING: if (!SetData(it8, iSet, iField, StringPtr(it8->str))) return FALSE; break; default: if (!GetVal(it8, Buffer, 255, "Sample data expected")) return FALSE; if (!SetData(it8, iSet, iField, Buffer)) return FALSE; } iField++; InSymbol(it8); SkipEOLN(it8); } } SkipEOLN(it8); Skip(it8, SEND_DATA); SkipEOLN(it8); // Check for data completion. if ((iSet+1) != t -> nPatches) return SynError(it8, "Count mismatch. NUMBER_OF_SETS was %d, found %d\n", t ->nPatches, iSet+1); return TRUE; } static cmsBool HeaderSection(cmsIT8* it8) { char VarName[MAXID]; char Buffer[MAXSTR]; KEYVALUE* Key; while (it8->sy != SEOF && it8->sy != SSYNERROR && it8->sy != SBEGIN_DATA_FORMAT && it8->sy != SBEGIN_DATA) { switch (it8 -> sy) { case SKEYWORD: InSymbol(it8); if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE; InSymbol(it8); break; case SDATA_FORMAT_ID: InSymbol(it8); if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; if (!AddAvailableSampleID(it8, Buffer)) return FALSE; InSymbol(it8); break; case SIDENT: strncpy(VarName, StringPtr(it8->id), MAXID - 1); VarName[MAXID - 1] = 0; if (!IsAvailableOnList(it8->ValidKeywords, VarName, NULL, &Key)) { #ifdef CMS_STRICT_CGATS return SynError(it8, "Undefined keyword '%s'", VarName); #else Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED); if (Key == NULL) return FALSE; #endif } InSymbol(it8); if (!GetVal(it8, Buffer, MAXSTR - 1, "Property data expected")) return FALSE; if (Key->WriteAs != WRITE_PAIR) { if (AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer, (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED) == NULL) return FALSE; } else { const char *Subkey; char *Nextkey; if (it8->sy != SSTRING) return SynError(it8, "Invalid value '%s' for property '%s'.", Buffer, VarName); // chop the string as a list of "subkey, value" pairs, using ';' as a separator for (Subkey = Buffer; Subkey != NULL; Subkey = Nextkey) { char *Value, *temp; // identify token pair boundary Nextkey = (char*)strchr(Subkey, ';'); if (Nextkey) *Nextkey++ = '\0'; // for each pair, split the subkey and the value Value = (char*)strrchr(Subkey, ','); if (Value == NULL) return SynError(it8, "Invalid value for property '%s'.", VarName); // gobble the spaces before the coma, and the coma itself temp = Value++; do *temp-- = '\0'; while (temp >= Subkey && *temp == ' '); // gobble any space at the right temp = Value + strlen(Value) - 1; while (*temp == ' ') *temp-- = '\0'; // trim the strings from the left Subkey += strspn(Subkey, " "); Value += strspn(Value, " "); if (Subkey[0] == 0 || Value[0] == 0) return SynError(it8, "Invalid value for property '%s'.", VarName); AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR); } } InSymbol(it8); break; case SEOLN: break; default: return SynError(it8, "expected keyword or identifier"); } SkipEOLN(it8); } return TRUE; } static void ReadType(cmsIT8* it8, char* SheetTypePtr) { cmsInt32Number cnt = 0; // First line is a very special case. while (isseparator(it8->ch)) NextCh(it8); while (it8->ch != '\r' && it8 ->ch != '\n' && it8->ch != '\t' && it8 -> ch != 0) { if (cnt++ < MAXSTR) *SheetTypePtr++= (char) it8 ->ch; NextCh(it8); } *SheetTypePtr = 0; } static cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) { char* SheetTypePtr = it8 ->Tab[0].SheetType; if (nosheet == 0) { ReadType(it8, SheetTypePtr); } InSymbol(it8); SkipEOLN(it8); while (it8-> sy != SEOF && it8-> sy != SSYNERROR) { switch (it8 -> sy) { case SBEGIN_DATA_FORMAT: if (!DataFormatSection(it8)) return FALSE; break; case SBEGIN_DATA: if (!DataSection(it8)) return FALSE; if (it8 -> sy != SEOF && it8->sy != SSYNERROR) { if (!AllocTable(it8)) return FALSE; it8 ->nTable = it8 ->TablesCount - 1; // Read sheet type if present. We only support identifier and string. // is a type string // anything else, is not a type string if (nosheet == 0) { if (it8 ->sy == SIDENT) { // May be a type sheet or may be a prop value statement. We cannot use insymbol in // this special case... while (isseparator(it8->ch)) NextCh(it8); // If a newline is found, then this is a type string if (it8 ->ch == '\n' || it8->ch == '\r') { cmsIT8SetSheetType(it8, StringPtr(it8 ->id)); InSymbol(it8); } else { // It is not. Just continue cmsIT8SetSheetType(it8, ""); } } else // Validate quoted strings if (it8 ->sy == SSTRING) { cmsIT8SetSheetType(it8, StringPtr(it8 ->str)); InSymbol(it8); } } } break; case SEOLN: SkipEOLN(it8); break; default: if (!HeaderSection(it8)) return FALSE; } } return (it8 -> sy != SSYNERROR); } // Init useful pointers static void CookPointers(cmsIT8* it8) { int idField, i; char* Fld; cmsUInt32Number j; cmsUInt32Number nOldTable = it8->nTable; for (j = 0; j < it8->TablesCount; j++) { TABLE* t = it8->Tab + j; t->SampleID = 0; it8->nTable = j; for (idField = 0; idField < t->nSamples; idField++) { if (t->DataFormat == NULL) { SynError(it8, "Undefined DATA_FORMAT"); return; } Fld = t->DataFormat[idField]; if (!Fld) continue; if (cmsstrcasecmp(Fld, "SAMPLE_ID") == 0) { t->SampleID = idField; } // "LABEL" is an extension. It keeps references to forward tables if ((cmsstrcasecmp(Fld, "LABEL") == 0) || Fld[0] == '$') { // Search for table references... for (i = 0; i < t->nPatches; i++) { char* Label = GetData(it8, i, idField); if (Label) { cmsUInt32Number k; // This is the label, search for a table containing // this property for (k = 0; k < it8->TablesCount; k++) { TABLE* Table = it8->Tab + k; KEYVALUE* p; if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) { // Available, keep type and table char Buffer[256]; char* Type = p->Value; int nTable = (int)k; snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type); SetData(it8, i, idField, Buffer); } } } } } } } it8->nTable = nOldTable; } // Try to infere if the file is a CGATS/IT8 file at all. Read first line // that should be something like some printable characters plus a \n // returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line? static int IsMyBlock(const cmsUInt8Number* Buffer, cmsUInt32Number n) { int words = 1, space = 0, quot = 0; cmsUInt32Number i; if (n < 10) return 0; // Too small if (n > 132) n = 132; for (i = 1; i < n; i++) { switch(Buffer[i]) { case '\n': case '\r': return ((quot == 1) || (words > 2)) ? 0 : words; case '\t': case ' ': if(!quot && !space) space = 1; break; case '\"': quot = !quot; break; default: if (Buffer[i] < 32) return 0; if (Buffer[i] > 127) return 0; words += space; space = 0; break; } } return 0; } static cmsBool IsMyFile(const char* FileName) { FILE *fp; cmsUInt32Number Size; cmsUInt8Number Ptr[133]; fp = fopen(FileName, "rt"); if (!fp) { cmsSignalError(0, cmsERROR_FILE, "File '%s' not found", FileName); return FALSE; } Size = (cmsUInt32Number) fread(Ptr, 1, 132, fp); if (fclose(fp) != 0) return FALSE; Ptr[Size] = '\0'; return IsMyBlock(Ptr, Size); } // ---------------------------------------------------------- Exported routines cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, const void *Ptr, cmsUInt32Number len) { cmsHANDLE hIT8; cmsIT8* it8; int type; _cmsAssert(Ptr != NULL); _cmsAssert(len != 0); type = IsMyBlock((const cmsUInt8Number*)Ptr, len); if (type == 0) return NULL; hIT8 = cmsIT8Alloc(ContextID); if (!hIT8) return NULL; it8 = (cmsIT8*) hIT8; it8 ->MemoryBlock = (char*) _cmsMalloc(ContextID, len + 1); if (it8->MemoryBlock == NULL) { cmsIT8Free(hIT8); return NULL; } strncpy(it8 ->MemoryBlock, (const char*) Ptr, len); it8 ->MemoryBlock[len] = 0; strncpy(it8->FileStack[0]->FileName, "", cmsMAX_PATH-1); it8-> Source = it8 -> MemoryBlock; if (!ParseIT8(it8, type-1)) { cmsIT8Free(hIT8); return NULL; } CookPointers(it8); it8 ->nTable = 0; _cmsFree(ContextID, it8->MemoryBlock); it8 -> MemoryBlock = NULL; return hIT8; } cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName) { cmsHANDLE hIT8; cmsIT8* it8; int type; _cmsAssert(cFileName != NULL); type = IsMyFile(cFileName); if (type == 0) return NULL; hIT8 = cmsIT8Alloc(ContextID); it8 = (cmsIT8*) hIT8; if (!hIT8) return NULL; it8 ->FileStack[0]->Stream = fopen(cFileName, "rt"); if (!it8 ->FileStack[0]->Stream) { cmsIT8Free(hIT8); return NULL; } strncpy(it8->FileStack[0]->FileName, cFileName, cmsMAX_PATH-1); it8->FileStack[0]->FileName[cmsMAX_PATH-1] = 0; if (!ParseIT8(it8, type-1)) { fclose(it8 ->FileStack[0]->Stream); cmsIT8Free(hIT8); return NULL; } CookPointers(it8); it8 ->nTable = 0; if (fclose(it8 ->FileStack[0]->Stream)!= 0) { cmsIT8Free(hIT8); return NULL; } return hIT8; } int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames) { cmsIT8* it8 = (cmsIT8*) hIT8; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); if (SampleNames) *SampleNames = t -> DataFormat; return t -> nSamples; } cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE* p; cmsUInt32Number n; char **Props; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); // Pass#1 - count properties n = 0; for (p = t -> HeaderList; p != NULL; p = p->Next) { n++; } Props = (char**)AllocChunk(it8, sizeof(char*) * n); if (Props != NULL) { // Pass#2 - Fill pointers n = 0; for (p = t->HeaderList; p != NULL; p = p->Next) { Props[n++] = p->Keyword; } } *PropertyNames = Props; return n; } cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE *p, *tmp; cmsUInt32Number n; const char **Props; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) { *SubpropertyNames = 0; return 0; } // Pass#1 - count properties n = 0; for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { if(tmp->Subkey != NULL) n++; } Props = (const char **) AllocChunk(it8, sizeof(char *) * n); if (Props != NULL) { // Pass#2 - Fill pointers n = 0; for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { if (tmp->Subkey != NULL) Props[n++] = p->Subkey; } } *SubpropertyNames = Props; return n; } static int LocatePatch(cmsIT8* it8, const char* cPatch) { int i; const char *data; TABLE* t = GetTable(it8); for (i=0; i < t-> nPatches; i++) { data = GetData(it8, i, t->SampleID); if (data != NULL) { if (cmsstrcasecmp(data, cPatch) == 0) return i; } } // SynError(it8, "Couldn't find patch '%s'\n", cPatch); return -1; } static int LocateEmptyPatch(cmsIT8* it8) { int i; const char *data; TABLE* t = GetTable(it8); for (i=0; i < t-> nPatches; i++) { data = GetData(it8, i, t->SampleID); if (data == NULL) return i; } return -1; } static int LocateSample(cmsIT8* it8, const char* cSample) { int i; const char *fld; TABLE* t = GetTable(it8); for (i=0; i < t->nSamples; i++) { fld = GetDataFormat(it8, i); if (fld != NULL) { if (cmsstrcasecmp(fld, cSample) == 0) return i; } } return -1; } int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return LocateSample(it8, cSample); } const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return GetData(it8, row, col); } cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col) { const char* Buffer; Buffer = cmsIT8GetDataRowCol(hIT8, row, col); if (Buffer == NULL) return 0.0; return ParseFloatNumber(Buffer); } cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return SetData(it8, row, col, Val); } cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buff[256]; _cmsAssert(hIT8 != NULL); snprintf(Buff, 255, it8->DoubleFormatter, Val); return SetData(it8, row, col, Buff); } const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample) { cmsIT8* it8 = (cmsIT8*) hIT8; int iField, iSet; _cmsAssert(hIT8 != NULL); iField = LocateSample(it8, cSample); if (iField < 0) { return NULL; } iSet = LocatePatch(it8, cPatch); if (iSet < 0) { return NULL; } return GetData(it8, iSet, iField); } cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE it8, const char* cPatch, const char* cSample) { const char* Buffer; Buffer = cmsIT8GetData(it8, cPatch, cSample); return ParseFloatNumber(Buffer); } cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val) { cmsIT8* it8 = (cmsIT8*) hIT8; int iField, iSet; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); iField = LocateSample(it8, cSample); if (iField < 0) return FALSE; if (t-> nPatches == 0) { if (!AllocateDataFormat(it8)) return FALSE; if (!AllocateDataSet(it8)) return FALSE; CookPointers(it8); } if (cmsstrcasecmp(cSample, "SAMPLE_ID") == 0) { iSet = LocateEmptyPatch(it8); if (iSet < 0) { return SynError(it8, "Couldn't add more patches '%s'\n", cPatch); } iField = t -> SampleID; } else { iSet = LocatePatch(it8, cPatch); if (iSet < 0) { return FALSE; } } return SetData(it8, iSet, iField, Val); } cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buff[256]; _cmsAssert(hIT8 != NULL); snprintf(Buff, 255, it8->DoubleFormatter, Val); return cmsIT8SetData(hIT8, cPatch, cSample, Buff); } // Buffer should get MAXSTR at least const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer) { cmsIT8* it8 = (cmsIT8*) hIT8; TABLE* t; char* Data; _cmsAssert(hIT8 != NULL); t = GetTable(it8); Data = GetData(it8, nPatch, t->SampleID); if (!Data) return NULL; if (!buffer) return Data; strncpy(buffer, Data, MAXSTR-1); buffer[MAXSTR-1] = 0; return buffer; } int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch) { _cmsAssert(hIT8 != NULL); return LocatePatch((cmsIT8*)hIT8, cPatch); } cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return it8 ->TablesCount; } // This handles the "LABEL" extension. // Label, nTable, Type int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType) { const char* cLabelFld; char Type[256], Label[256]; cmsUInt32Number nTable; _cmsAssert(hIT8 != NULL); if (cField != NULL && *cField == 0) cField = "LABEL"; if (cField == NULL) cField = "LABEL"; cLabelFld = cmsIT8GetData(hIT8, cSet, cField); if (!cLabelFld) return -1; if (sscanf(cLabelFld, "%255s %u %255s", Label, &nTable, Type) != 3) return -1; if (ExpectedType != NULL && *ExpectedType == 0) ExpectedType = NULL; if (ExpectedType) { if (cmsstrcasecmp(Type, ExpectedType) != 0) return -1; } return cmsIT8SetTable(hIT8, nTable); } cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample) { cmsIT8* it8 = (cmsIT8*) hIT8; int pos; _cmsAssert(hIT8 != NULL); pos = LocateSample(it8, cSample); if(pos == -1) return FALSE; it8->Tab[it8->nTable].SampleID = pos; return TRUE; } void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); if (Formatter == NULL) strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); else strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter)); it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0; } static cmsBool ReadNumbers(cmsIT8* cube, int n, cmsFloat64Number* arr) { int i; for (i = 0; i < n; i++) { if (cube->sy == SINUM) arr[i] = cube->inum; else if (cube->sy == SDNUM) arr[i] = cube->dnum; else return SynError(cube, "Number expected"); InSymbol(cube); } return CheckEOLN(cube); } static cmsBool ParseCube(cmsIT8* cube, cmsStage** Shaper, cmsStage** CLUT, char title[]) { cmsFloat64Number domain_min[3] = { 0, 0, 0 }; cmsFloat64Number domain_max[3] = { 1.0, 1.0, 1.0 }; cmsFloat64Number check_0_1[2] = { 0, 1.0 }; int shaper_size = 0; int lut_size = 0; int i; InSymbol(cube); while (cube->sy != SEOF && cube->sy != SSYNERROR) { switch (cube->sy) { // Set profile description case STITLE: InSymbol(cube); if (!Check(cube, SSTRING, "Title string expected")) return FALSE; memcpy(title, StringPtr(cube->str), MAXSTR); title[MAXSTR - 1] = 0; InSymbol(cube); break; // Define domain case SDOMAIN_MIN: InSymbol(cube); if (!ReadNumbers(cube, 3, domain_min)) return FALSE; break; case SDOMAIN_MAX: InSymbol(cube); if (!ReadNumbers(cube, 3, domain_max)) return FALSE; break; // Define shaper case S_LUT1D_SIZE: InSymbol(cube); if (!Check(cube, SINUM, "Shaper size expected")) return FALSE; shaper_size = cube->inum; if (shaper_size < 2 || shaper_size > 65536) return SynError(cube, "LUT_1D_SIZE '%d' is out of bounds", shaper_size); InSymbol(cube); break; // Deefine CLUT case S_LUT3D_SIZE: InSymbol(cube); if (!Check(cube, SINUM, "LUT size expected")) return FALSE; lut_size = cube->inum; InSymbol(cube); break; // Range. If present, has to be 0..1.0 case S_LUT1D_INPUT_RANGE: case S_LUT3D_INPUT_RANGE: InSymbol(cube); if (!ReadNumbers(cube, 2, check_0_1)) return FALSE; if (check_0_1[0] != 0 || check_0_1[1] != 1.0) { return SynError(cube, "Unsupported format"); } break; case SEOLN: InSymbol(cube); break; default: case S_LUT_IN_VIDEO_RANGE: case S_LUT_OUT_VIDEO_RANGE: return SynError(cube, "Unsupported format"); // Read and create tables case SINUM: case SDNUM: if (shaper_size > 0) { cmsToneCurve* curves[3]; cmsFloat32Number* shapers = (cmsFloat32Number*)_cmsMalloc(cube->ContextID, 3 * shaper_size * sizeof(cmsFloat32Number)); if (shapers == NULL) return FALSE; for (i = 0; i < shaper_size; i++) { cmsFloat64Number nums[3]; if (!ReadNumbers(cube, 3, nums)) return FALSE; shapers[i + 0] = (cmsFloat32Number) ((nums[0] - domain_min[0]) / (domain_max[0] - domain_min[0])); shapers[i + 1 * shaper_size] = (cmsFloat32Number) ((nums[1] - domain_min[1]) / (domain_max[1] - domain_min[1])); shapers[i + 2 * shaper_size] = (cmsFloat32Number) ((nums[2] - domain_min[2]) / (domain_max[2] - domain_min[2])); } for (i = 0; i < 3; i++) { curves[i] = cmsBuildTabulatedToneCurveFloat(cube->ContextID, shaper_size, &shapers[i * shaper_size]); if (curves[i] == NULL) return FALSE; } *Shaper = cmsStageAllocToneCurves(cube->ContextID, 3, curves); cmsFreeToneCurveTriple(curves); } if (lut_size > 0) { int nodes; /** * Professional LUT generation tools (e.g., Nobe LutBake) list 65×65×65 as their highest supported size. */ if (lut_size < 2 || lut_size > 65) return SynError(cube, "LUT size '%d' is not allowed", lut_size); nodes = lut_size * lut_size * lut_size; cmsFloat32Number* lut_table = (cmsFloat32Number*) _cmsMalloc(cube->ContextID, nodes * 3 * sizeof(cmsFloat32Number)); if (lut_table == NULL) return FALSE; for (i = 0; i < nodes; i++) { cmsFloat64Number nums[3]; if (!ReadNumbers(cube, 3, nums)) return FALSE; lut_table[i * 3 + 2] = (cmsFloat32Number) ((nums[0] - domain_min[0]) / (domain_max[0] - domain_min[0])); lut_table[i * 3 + 1] = (cmsFloat32Number) ((nums[1] - domain_min[1]) / (domain_max[1] - domain_min[1])); lut_table[i * 3 + 0] = (cmsFloat32Number) ((nums[2] - domain_min[2]) / (domain_max[2] - domain_min[2])); } *CLUT = cmsStageAllocCLutFloat(cube->ContextID, lut_size, 3, 3, lut_table); _cmsFree(cube->ContextID, lut_table); } if (!Check(cube, SEOF, "Extra symbols found in file")) return FALSE; } } return TRUE; } // Share the parser to read .cube format and create RGB devicelink profiles cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFileTHR(cmsContext ContextID, const char* cFileName) { cmsHPROFILE hProfile = NULL; cmsIT8* cube = NULL; cmsPipeline* Pipeline = NULL; cmsStage* CLUT = NULL; cmsStage* Shaper = NULL; cmsMLU* DescriptionMLU = NULL; char title[MAXSTR]; _cmsAssert(cFileName != NULL); cube = (cmsIT8*) cmsIT8Alloc(ContextID); if (!cube) return NULL; cube->IsCUBE = TRUE; cube->FileStack[0]->Stream = fopen(cFileName, "rt"); if (!cube->FileStack[0]->Stream) goto Done; strncpy(cube->FileStack[0]->FileName, cFileName, cmsMAX_PATH - 1); cube->FileStack[0]->FileName[cmsMAX_PATH - 1] = 0; if (!ParseCube(cube, &Shaper, &CLUT, title)) goto Done; // Success on parsing, let's create the profile hProfile = cmsCreateProfilePlaceholder(ContextID); if (!hProfile) goto Done; cmsSetProfileVersion(hProfile, 4.4); cmsSetDeviceClass(hProfile, cmsSigLinkClass); cmsSetColorSpace(hProfile, cmsSigRgbData); cmsSetPCS(hProfile, cmsSigRgbData); cmsSetHeaderRenderingIntent(hProfile, INTENT_PERCEPTUAL); // Creates a Pipeline to hold CLUT and shaper Pipeline = cmsPipelineAlloc(ContextID, 3, 3); if (Pipeline == NULL) goto Done; // Populates the pipeline if (Shaper != NULL) { if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, Shaper)) { cmsStageFree(Shaper); goto Done; } } if (CLUT != NULL) { if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) { cmsStageFree(CLUT); goto Done; } } // Propagate the description. We put no copyright because we know // nothing on the copyrighted state of the .cube DescriptionMLU = cmsMLUalloc(ContextID, 1); if (!cmsMLUsetUTF8(DescriptionMLU, cmsNoLanguage, cmsNoCountry, title)) goto Done; // Flush the tags if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Done; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, (void*)Pipeline)) goto Done; Done: if (DescriptionMLU != NULL) cmsMLUfree(DescriptionMLU); if (Pipeline != NULL) cmsPipelineFree(Pipeline); cmsIT8Free((cmsHANDLE) cube); return hProfile; } cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFile(const char* cFileName) { return cmsCreateDeviceLinkFromCubeFileTHR(NULL, cFileName); } lcms2-2.19.1/src/Makefile.am0000644000175000017500000000162215176573557014507 0ustar martimarti# # Makefile for building lcms 2 library # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign # CFLAGS = -pedantic -Wall -std=c99 -O3 includedir = ${prefix}/include # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2.la LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBRARY_AGE = @LIBRARY_AGE@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include liblcms2_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_la_LIBADD = $(LCMS_LIB_DEPLIBS) liblcms2_la_SOURCES = \ cmscnvrt.c cmserr.c cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c cmsio1.c cmslut.c \ cmsplugin.c cmssm.c cmsmd5.c cmsmtrx.c cmspack.c cmspcs.c cmswtpnt.c cmsxform.c \ cmssamp.c cmsnamed.c cmscam02.c cmsvirt.c cmstypes.c cmscgats.c cmsps2.c cmsopt.c \ cmshalf.c cmsalpha.c lcms2_internal.h lcms2-2.19.1/src/cmsio0.c0000644000175000017500000020045415176573557014015 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Generic I/O, tag dictionary management, profile struct // IOhandlers are abstractions used by littleCMS to read from whatever file, stream, // memory block or any storage. Each IOhandler provides implementations for read, // write, seek and tell functions. LittleCMS code deals with IO across those objects. // In this way, is easier to add support for new storage media. // NULL stream, for taking care of used space ------------------------------------- // NULL IOhandler basically does nothing but keep track on how many bytes have been // written. This is handy when creating profiles, where the file size is needed in the // header. Then, whole profile is serialized across NULL IOhandler and a second pass // writes the bytes to the pertinent IOhandler. typedef struct { cmsUInt32Number Pointer; // Points to current location } FILENULL; static cmsUInt32Number NULLRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) { FILENULL* ResData = (FILENULL*) iohandler ->stream; cmsUInt32Number len = size * count; ResData -> Pointer += len; return count; cmsUNUSED_PARAMETER(Buffer); } static cmsBool NULLSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset) { FILENULL* ResData = (FILENULL*) iohandler ->stream; ResData ->Pointer = offset; return TRUE; } static cmsUInt32Number NULLTell(cmsIOHANDLER* iohandler) { FILENULL* ResData = (FILENULL*) iohandler ->stream; return ResData -> Pointer; } static cmsBool NULLWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void *Ptr) { FILENULL* ResData = (FILENULL*) iohandler ->stream; if (size > (cmsUInt32Number)(0xFFFFFFFFU - ResData->Pointer)) return FALSE; ResData ->Pointer += size; if (ResData ->Pointer > iohandler->UsedSpace) iohandler->UsedSpace = ResData ->Pointer; return TRUE; cmsUNUSED_PARAMETER(Ptr); } static cmsBool NULLClose(cmsIOHANDLER* iohandler) { FILENULL* ResData = (FILENULL*) iohandler ->stream; _cmsFree(iohandler ->ContextID, ResData); _cmsFree(iohandler ->ContextID, iohandler); return TRUE; } // The NULL IOhandler creator cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID) { struct _cms_io_handler* iohandler = NULL; FILENULL* fm = NULL; iohandler = (struct _cms_io_handler*) _cmsMallocZero(ContextID, sizeof(struct _cms_io_handler)); if (iohandler == NULL) return NULL; fm = (FILENULL*) _cmsMallocZero(ContextID, sizeof(FILENULL)); if (fm == NULL) goto Error; fm ->Pointer = 0; iohandler ->ContextID = ContextID; iohandler ->stream = (void*) fm; iohandler ->UsedSpace = 0; iohandler ->ReportedSize = 0; iohandler ->PhysicalFile[0] = 0; iohandler ->Read = NULLRead; iohandler ->Seek = NULLSeek; iohandler ->Close = NULLClose; iohandler ->Tell = NULLTell; iohandler ->Write = NULLWrite; return iohandler; Error: if (iohandler) _cmsFree(ContextID, iohandler); return NULL; } // Memory-based stream -------------------------------------------------------------- // Those functions implements an iohandler which takes a block of memory as storage medium. typedef struct { cmsUInt8Number* Block; // Points to allocated memory cmsUInt32Number Size; // Size of allocated memory cmsUInt32Number Pointer; // Points to current location int FreeBlockOnClose; // As title } FILEMEM; static cmsUInt32Number MemoryRead(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; cmsUInt8Number* Ptr; cmsUInt32Number len = size * count; if (size == 0 || count == 0) return 0; if ((len / count) != size) goto ReadError; if (Buffer == NULL) goto ReadError; if (len > ResData->Size) goto ReadError; if (ResData -> Pointer > ResData -> Size - len) goto ReadError; Ptr = ResData -> Block; Ptr += ResData -> Pointer; memmove(Buffer, Ptr, len); ResData -> Pointer += len; return count; ReadError: cmsSignalError(iohandler->ContextID, cmsERROR_READ, "Read from memory error"); return 0; } // SEEK_CUR is assumed static cmsBool MemorySeek(struct _cms_io_handler* iohandler, cmsUInt32Number offset) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (offset > ResData ->Size) return FALSE; ResData ->Pointer = offset; return TRUE; } // Tell for memory static cmsUInt32Number MemoryTell(struct _cms_io_handler* iohandler) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (ResData == NULL) return 0; return ResData -> Pointer; } // Writes data to memory, also keeps used space for further reference. static cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (ResData == NULL || Ptr == NULL) goto WriteError; if (size == 0) return TRUE; // Write zero bytes is ok, but does nothing // Check for available space. Truncate the output in case the space // is not enough instead of erroring out. See // https://github.com/hughsie/colord/issues/147. if (size > ResData->Size - ResData->Pointer) size = ResData->Size - ResData->Pointer; memmove(ResData ->Block + ResData ->Pointer, Ptr, size); ResData ->Pointer += size; if (ResData ->Pointer > iohandler->UsedSpace) iohandler->UsedSpace = ResData ->Pointer; return TRUE; WriteError: cmsSignalError(iohandler->ContextID, cmsERROR_WRITE, "Write to memory error"); return FALSE; } static cmsBool MemoryClose(struct _cms_io_handler* iohandler) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (ResData ->FreeBlockOnClose) { if (ResData ->Block) _cmsFree(iohandler ->ContextID, ResData ->Block); } _cmsFree(iohandler ->ContextID, ResData); _cmsFree(iohandler ->ContextID, iohandler); return TRUE; } // Create a iohandler for memory block. AccessMode=='r' assumes the iohandler is going to read, and makes // a copy of the memory block for letting user to free the memory after invoking open profile. In write // mode ("w"), Buffer points to the begin of memory block to be written. cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode) { cmsIOHANDLER* iohandler = NULL; FILEMEM* fm = NULL; _cmsAssert(AccessMode != NULL); iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); if (iohandler == NULL) return NULL; switch (*AccessMode) { case 'r': fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM)); if (fm == NULL) goto Error; if (Buffer == NULL) { cmsSignalError(ContextID, cmsERROR_READ, "Couldn't read profile from NULL pointer"); goto Error; } fm ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, size); if (fm ->Block == NULL) { _cmsFree(ContextID, fm); _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_READ, "Couldn't allocate %ld bytes for profile", (long) size); return NULL; } memmove(fm->Block, Buffer, size); fm ->FreeBlockOnClose = TRUE; fm ->Size = size; fm ->Pointer = 0; iohandler -> ReportedSize = size; break; case 'w': fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM)); if (fm == NULL) goto Error; if (Buffer == NULL) { cmsSignalError(ContextID, cmsERROR_WRITE, "Couldn't write profile to NULL pointer"); goto Error; } fm ->Block = (cmsUInt8Number*) Buffer; fm ->FreeBlockOnClose = FALSE; fm ->Size = size; fm ->Pointer = 0; iohandler -> ReportedSize = 0; break; default: cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown access mode '%c'", *AccessMode); return NULL; } iohandler ->ContextID = ContextID; iohandler ->stream = (void*) fm; iohandler ->UsedSpace = 0; iohandler ->PhysicalFile[0] = 0; iohandler ->Read = MemoryRead; iohandler ->Seek = MemorySeek; iohandler ->Close = MemoryClose; iohandler ->Tell = MemoryTell; iohandler ->Write = MemoryWrite; return iohandler; Error: if (fm) _cmsFree(ContextID, fm); if (iohandler) _cmsFree(ContextID, iohandler); return NULL; } // File-based stream ------------------------------------------------------- // Read count elements of size bytes each. Return number of elements read static cmsUInt32Number FileRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) { cmsUInt32Number nReaded = (cmsUInt32Number) fread(Buffer, size, count, (FILE*) iohandler->stream); if (nReaded != count) { cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size); return 0; } return nReaded; } // Position file pointer in the file static cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset) { #ifdef CMS_LARGE_FILE_SUPPORT # ifdef CMS_IS_WINDOWS_ if (_fseeki64((FILE*) iohandler->stream, (long long int) offset, SEEK_SET) != 0) { # else if (fseeko((FILE*) iohandler->stream, (off_t) offset, SEEK_SET) != 0) { # endif #else if (fseek((FILE*) iohandler ->stream, (long) offset, SEEK_SET) != 0) { #endif cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Seek error; probably corrupted file"); return FALSE; } return TRUE; } // Returns file pointer position or 0 on error, which is also a valid position. static cmsUInt32Number FileTell(cmsIOHANDLER* iohandler) { #ifdef CMS_LARGE_FILE_SUPPORT # ifdef CMS_IS_WINDOWS_ long long int t = _ftelli64((FILE*) iohandler->stream); # else long long int t = (long long int) ftello((FILE*) iohandler->stream); # endif if (t < 0) { cmsSignalError(iohandler->ContextID, cmsERROR_FILE, "Tell error; probably corrupted file"); return 0; } #else long t = ftell((FILE*)iohandler ->stream); if (t == -1L) { cmsSignalError(iohandler->ContextID, cmsERROR_FILE, "Tell error; probably corrupted file"); return 0; } #endif return (cmsUInt32Number) t; } // Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error static cmsBool FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer) { if (size == 0) return TRUE; // We allow to write 0 bytes, but nothing is written iohandler->UsedSpace += size; return (fwrite(Buffer, size, 1, (FILE*)iohandler->stream) == 1); } // Closes the file static cmsBool FileClose(cmsIOHANDLER* iohandler) { if (fclose((FILE*) iohandler ->stream) != 0) return FALSE; _cmsFree(iohandler ->ContextID, iohandler); return TRUE; } // Create a iohandler for disk based files. cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode) { cmsIOHANDLER* iohandler = NULL; FILE* fm = NULL; #ifdef CMS_LARGE_FILE_SUPPORT long long int fileLen; #else long int fileLen; #endif char mode[4] = { 0,0,0,0 }; _cmsAssert(FileName != NULL); _cmsAssert(AccessMode != NULL); iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); if (iohandler == NULL) return NULL; // Validate access mode while (*AccessMode) { switch (*AccessMode) { case 'r': case 'w': if (mode[0] == 0) { mode[0] = *AccessMode; mode[1] = 'b'; } else { _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "Access mode already specified '%c'", *AccessMode); return NULL; } break; // Close on exec. Not all runtime supports that. Up to the caller to decide. case 'e': mode[2] = 'e'; break; default: _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "Wrong access mode '%c'", *AccessMode); return NULL; } AccessMode++; } switch (mode[0]) { case 'r': fm = fopen(FileName, mode); if (fm == NULL) { _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName); return NULL; } fileLen = cmsfilelength(fm); if (fileLen < 0) { fclose(fm); _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "Cannot get size of file '%s'", FileName); return NULL; } #ifdef CMS_LARGE_FILE_SUPPORT if (fileLen > (long long int) 0xFFFFFFFFLL) { fclose(fm); _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' is too large", FileName); return NULL; } #endif iohandler -> ReportedSize = (cmsUInt32Number) fileLen; break; case 'w': fm = fopen(FileName, mode); if (fm == NULL) { _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "Couldn't create '%s'", FileName); return NULL; } iohandler -> ReportedSize = 0; break; default: _cmsFree(ContextID, iohandler); // Would never reach return NULL; } iohandler ->ContextID = ContextID; iohandler ->stream = (void*) fm; iohandler ->UsedSpace = 0; // Keep track of the original file strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1); iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0; iohandler ->Read = FileRead; iohandler ->Seek = FileSeek; iohandler ->Close = FileClose; iohandler ->Tell = FileTell; iohandler ->Write = FileWrite; return iohandler; } // Create a iohandler for stream based files cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream) { cmsIOHANDLER* iohandler = NULL; #ifdef CMS_LARGE_FILE_SUPPORT long long int fileSize; #else long int fileSize; #endif fileSize = cmsfilelength(Stream); if (fileSize < 0) { cmsSignalError(ContextID, cmsERROR_FILE, "Cannot get size of stream"); return NULL; } #ifdef CMS_LARGE_FILE_SUPPORT if (fileSize > (long long int) 0xFFFFFFFFLL) { cmsSignalError(ContextID, cmsERROR_FILE, "Stream is too large"); return NULL; } #endif iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); if (iohandler == NULL) return NULL; iohandler -> ContextID = ContextID; iohandler -> stream = (void*) Stream; iohandler -> UsedSpace = 0; iohandler -> ReportedSize = (cmsUInt32Number) fileSize; iohandler -> PhysicalFile[0] = 0; iohandler ->Read = FileRead; iohandler ->Seek = FileSeek; iohandler ->Close = FileClose; iohandler ->Tell = FileTell; iohandler ->Write = FileWrite; return iohandler; } // Close an open IO handler cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io) { return io -> Close(io); } // ------------------------------------------------------------------------------------------------------- cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; if (Icc == NULL) return NULL; return Icc->IOhandler; } // Creates an empty structure holding all required parameters cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) _cmsMallocZero(ContextID, sizeof(_cmsICCPROFILE)); if (Icc == NULL) return NULL; Icc ->ContextID = ContextID; // Set it to empty Icc -> TagCount = 0; // Set default version Icc ->Version = 0x02100000; // Set default CMM (that's me!) Icc ->CMM = lcmsSignature; // Set default creator // Created by LittleCMS (that's me!) Icc ->creator = lcmsSignature; // Set default platform #ifdef CMS_IS_WINDOWS_ Icc ->platform = cmsSigMicrosoft; #else Icc ->platform = cmsSigMacintosh; #endif // Set default device class Icc->DeviceClass = cmsSigDisplayClass; // Set creation date/time if (!_cmsGetTime(&Icc->Created)) goto Error; // Create a mutex if the user provided proper plugin. NULL otherwise Icc ->UsrMutex = _cmsCreateMutex(ContextID); // Return the handle return (cmsHPROFILE) Icc; Error: _cmsFree(ContextID, Icc); return NULL; } cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; if (Icc == NULL) return NULL; return Icc -> ContextID; } // Return the number of tags cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; if (Icc == NULL) return -1; return (cmsInt32Number) Icc->TagCount; } // Return the tag signature of a given tag number cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; if (n > Icc->TagCount) return (cmsTagSignature) 0; // Mark as not available if (n >= MAX_TABLE_TAG) return (cmsTagSignature) 0; // As double check return Icc ->TagNames[n]; } // Return location of the tag cmsBool CMSEXPORT cmsGetTagOffsetAndSize(cmsHPROFILE hProfile, cmsUInt32Number n, cmsUInt32Number* offset, cmsUInt32Number* size) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; if (n > Icc->TagCount) return FALSE; if (n >= MAX_TABLE_TAG) return FALSE; if (offset != NULL) *offset = Icc->TagOffsets[n]; if (size != NULL) *size = Icc->TagSizes[n]; return TRUE; } static int SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig) { int i; for (i=0; i < (int) Profile -> TagCount; i++) { if (sig == Profile -> TagNames[i]) return i; } return -1; } // Search for a specific tag in tag dictionary. Returns position or -1 if tag not found. // If followlinks is turned on, then the position of the linked tag is returned int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks) { int n; cmsTagSignature LinkedSig; do { // Search for given tag in ICC profile directory n = SearchOneTag(Icc, sig); if (n < 0) return -1; // Not found if (!lFollowLinks) return n; // Found, don't follow links // Is this a linked tag? LinkedSig = Icc ->TagLinked[n]; // Yes, follow link if (LinkedSig != (cmsTagSignature) 0) { sig = LinkedSig; } } while (LinkedSig != (cmsTagSignature) 0); return n; } // Deletes a tag entry static void _cmsDeleteTagByPos(_cmsICCPROFILE* Icc, int i) { _cmsAssert(Icc != NULL); _cmsAssert(i >= 0); if (Icc -> TagPtrs[i] != NULL) { // Free previous version if (Icc ->TagSaveAsRaw[i]) { _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]); Icc->TagSaveAsRaw[i] = FALSE; } else { cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i]; if (TypeHandler != NULL) { cmsTagTypeHandler LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameter LocalTypeHandler.ICCVersion = Icc ->Version; LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]); Icc ->TagPtrs[i] = NULL; } } } } // Creates a new tag entry static cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos) { int i; // Search for the tag i = _cmsSearchTag(Icc, sig, FALSE); if (i >= 0) { // Already exists? delete it _cmsDeleteTagByPos(Icc, i); *NewPos = i; } else { // No, make a new one if (Icc -> TagCount >= MAX_TABLE_TAG) { cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", MAX_TABLE_TAG); return FALSE; } *NewPos = (int) Icc ->TagCount; Icc -> TagCount++; } return TRUE; } // Check existence cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) (void*) hProfile; return _cmsSearchTag(Icc, sig, FALSE) >= 0; } // Checks for link compatibility static cmsBool CompatibleTypes(const cmsTagDescriptor* desc1, const cmsTagDescriptor* desc2) { cmsUInt32Number i; if (desc1 == NULL || desc2 == NULL) return FALSE; if (desc1->nSupportedTypes != desc2->nSupportedTypes) return FALSE; if (desc1->ElemCount != desc2->ElemCount) return FALSE; for (i = 0; i < desc1->nSupportedTypes; i++) { if (desc1->SupportedTypes[i] != desc2->SupportedTypes[i]) return FALSE; } return TRUE; } // Enforces that the profile version is per. spec. // Operates on the big endian bytes from the profile. // Called before converting to platform endianness. // Byte 0 is BCD major version, so max 9. // Byte 1 is 2 BCD digits, one per nibble. // Reserved bytes 2 & 3 must be 0. static cmsUInt32Number _validatedVersion(cmsUInt32Number DWord) { cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord; cmsUInt8Number temp1; cmsUInt8Number temp2; if (*pByte > 0x09) *pByte = (cmsUInt8Number) 0x09; temp1 = (cmsUInt8Number) (*(pByte+1) & 0xf0); temp2 = (cmsUInt8Number) (*(pByte+1) & 0x0f); if (temp1 > 0x90U) temp1 = 0x90U; if (temp2 > 0x09U) temp2 = 0x09U; *(pByte+1) = (cmsUInt8Number)(temp1 | temp2); *(pByte+2) = (cmsUInt8Number)0; *(pByte+3) = (cmsUInt8Number)0; return DWord; } // Check device class static cmsBool validDeviceClass(cmsProfileClassSignature cl) { if (cl == (cmsProfileClassSignature)0) return TRUE; // We allow zero because older lcms versions defaulted to that. switch (cl) { case cmsSigInputClass: case cmsSigDisplayClass: case cmsSigOutputClass: case cmsSigLinkClass: case cmsSigAbstractClass: case cmsSigColorSpaceClass: case cmsSigNamedColorClass: case cmsSigColorEncodingSpaceClass: case cmsSigMultiplexIdentificationClass: case cmsSigMultiplexLinkClass: case cmsSigMultiplexVisualizationClass: return TRUE; default: return FALSE; } } // Read profile header and validate it cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc) { cmsTagEntry Tag; cmsICCHeader Header; cmsUInt32Number i, j; cmsUInt32Number HeaderSize; cmsIOHANDLER* io = Icc ->IOhandler; cmsUInt32Number TagCount; // Read the header if (io -> Read(io, &Header, sizeof(cmsICCHeader), 1) != 1) { return FALSE; } // Validate file as an ICC profile if (_cmsAdjustEndianess32(Header.magic) != cmsMagicNumber) { cmsSignalError(Icc ->ContextID, cmsERROR_BAD_SIGNATURE, "not an ICC profile, invalid signature"); return FALSE; } // Adjust endianness of the used parameters Icc -> CMM = _cmsAdjustEndianess32(Header.cmmId); Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass); Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace); Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs); Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent); Icc -> platform = (cmsPlatformSignature)_cmsAdjustEndianess32(Header.platform); Icc -> flags = _cmsAdjustEndianess32(Header.flags); Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer); Icc -> model = _cmsAdjustEndianess32(Header.model); Icc -> creator = _cmsAdjustEndianess32(Header.creator); _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes); Icc -> Version = _cmsAdjustEndianess32(_validatedVersion(Header.version)); if (Icc->Version > 0x5000000) { cmsSignalError(Icc->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported profile version '0x%x'", Icc->Version); return FALSE; } if (!validDeviceClass(Icc->DeviceClass)) { cmsSignalError(Icc->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported device class '0x%x'", Icc->DeviceClass); return FALSE; } // Get size as reported in header HeaderSize = _cmsAdjustEndianess32(Header.size); // Make sure HeaderSize is lower than profile size if (HeaderSize >= Icc ->IOhandler ->ReportedSize) HeaderSize = Icc ->IOhandler ->ReportedSize; // Get creation date/time _cmsDecodeDateTimeNumber(&Header.date, &Icc ->Created); // The profile ID are 32 raw bytes memmove(Icc ->ProfileID.ID32, Header.profileID.ID32, 16); // Read tag directory if (!_cmsReadUInt32Number(io, &TagCount)) return FALSE; if (TagCount > MAX_TABLE_TAG) { cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", TagCount); return FALSE; } // Read tag directory Icc -> TagCount = 0; for (i=0; i < TagCount; i++) { if (!_cmsReadUInt32Number(io, (cmsUInt32Number *) &Tag.sig)) return FALSE; if (!_cmsReadUInt32Number(io, &Tag.offset)) return FALSE; if (!_cmsReadUInt32Number(io, &Tag.size)) return FALSE; // Perform some sanity check. Offset + size should fall inside file. if (Tag.size == 0 || Tag.offset == 0) continue; if (Tag.offset + Tag.size > HeaderSize || Tag.offset + Tag.size < Tag.offset) continue; Icc -> TagNames[Icc ->TagCount] = Tag.sig; Icc -> TagOffsets[Icc ->TagCount] = Tag.offset; Icc -> TagSizes[Icc ->TagCount] = Tag.size; // Search for links for (j=0; j < Icc ->TagCount; j++) { if ((Icc ->TagOffsets[j] == Tag.offset) && (Icc ->TagSizes[j] == Tag.size)) { // Check types. if (CompatibleTypes(_cmsGetTagDescriptor(Icc->ContextID, Icc->TagNames[j]), _cmsGetTagDescriptor(Icc->ContextID, Tag.sig))) { Icc->TagLinked[Icc->TagCount] = Icc->TagNames[j]; } } } Icc ->TagCount++; } for (i = 0; i < Icc->TagCount; i++) { for (j = 0; j < Icc->TagCount; j++) { // Tags cannot be duplicate if ((i != j) && (Icc->TagNames[i] == Icc->TagNames[j])) { cmsSignalError(Icc->ContextID, cmsERROR_RANGE, "Duplicate tag found"); return FALSE; } } } return TRUE; } // Saves profile header cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) { cmsICCHeader Header; cmsUInt32Number i; cmsTagEntry Tag; cmsUInt32Number Count; Header.size = _cmsAdjustEndianess32(UsedSpace); Header.cmmId = _cmsAdjustEndianess32(Icc ->CMM); Header.version = _cmsAdjustEndianess32(Icc ->Version); Header.deviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Icc -> DeviceClass); Header.colorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> ColorSpace); Header.pcs = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> PCS); // NOTE: in v4 Timestamp must be in UTC rather than in local time _cmsEncodeDateTimeNumber(&Header.date, &Icc ->Created); Header.magic = _cmsAdjustEndianess32(cmsMagicNumber); Header.platform = (cmsPlatformSignature) _cmsAdjustEndianess32(Icc -> platform); Header.flags = _cmsAdjustEndianess32(Icc -> flags); Header.manufacturer = _cmsAdjustEndianess32(Icc -> manufacturer); Header.model = _cmsAdjustEndianess32(Icc -> model); _cmsAdjustEndianess64(&Header.attributes, &Icc -> attributes); // Rendering intent in the header (for embedded profiles) Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent); // Illuminant is always D50 Header.illuminant.X = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->X)); Header.illuminant.Y = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y)); Header.illuminant.Z = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z)); Header.creator = _cmsAdjustEndianess32(Icc ->creator); memset(&Header.reserved, 0, sizeof(Header.reserved)); // Set profile ID. Endianness is always big endian memmove(&Header.profileID, &Icc ->ProfileID, 16); // Dump the header if (!Icc -> IOhandler->Write(Icc->IOhandler, sizeof(cmsICCHeader), &Header)) return FALSE; // Saves Tag directory // Get true count Count = 0; for (i=0; i < Icc -> TagCount; i++) { if (Icc ->TagNames[i] != (cmsTagSignature) 0) Count++; } // Store number of tags if (!_cmsWriteUInt32Number(Icc ->IOhandler, Count)) return FALSE; for (i=0; i < Icc -> TagCount; i++) { if (Icc ->TagNames[i] == (cmsTagSignature) 0) continue; // It is just a placeholder Tag.sig = (cmsTagSignature) _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagNames[i]); Tag.offset = _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagOffsets[i]); Tag.size = _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagSizes[i]); if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE; } return TRUE; } // ----------------------------------------------------------------------- Set/Get several struct members cmsUInt32Number CMSEXPORT cmsGetHeaderCMM(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; return Icc->CMM; } void CMSEXPORT _cmsSetHeaderCMM(cmsHPROFILE hProfile, cmsUInt32Number CMM) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; Icc->CMM = CMM; } cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> RenderingIntent; } void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> RenderingIntent = RenderingIntent; } cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return (cmsUInt32Number) Icc -> flags; } void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> flags = (cmsUInt32Number) Flags; } cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc ->manufacturer; } void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> manufacturer = manufacturer; } cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc ->creator; } cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc ->model; } void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> model = model; } void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(Flags, &Icc -> attributes, sizeof(cmsUInt64Number)); } void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(&Icc -> attributes, &Flags, sizeof(cmsUInt64Number)); } void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(ProfileID, Icc ->ProfileID.ID8, 16); } void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(&Icc -> ProfileID, ProfileID, 16); } cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(Dest, &Icc ->Created, sizeof(struct tm)); return TRUE; } cmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> PCS; } void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> PCS = pcs; } cmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> ColorSpace; } void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> ColorSpace = sig; } cmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> DeviceClass; } void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> DeviceClass = sig; } cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> Version; } void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> Version = Version; } // Get an hexadecimal number with same digits as v static cmsUInt32Number BaseToBase(cmsUInt32Number in, int BaseIn, int BaseOut) { char Buff[100]; int i, len; cmsUInt32Number out; for (len=0; in > 0 && len < 100; len++) { Buff[len] = (char) (in % BaseIn); in /= BaseIn; } for (i=len-1, out=0; i >= 0; --i) { out = out * BaseOut + Buff[i]; } return out; } void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; // 4.2 -> 0x4200000 Icc -> Version = BaseToBase((cmsUInt32Number) floor(Version * 100.0 + 0.5), 10, 16) << 16; } cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsUInt32Number n = Icc -> Version >> 16; return BaseToBase(n, 16, 10) / 100.0; } // -------------------------------------------------------------------------------------------------------------- // Create profile from IOhandler cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = io; if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } // Create profile from IOhandler cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = io; if (write) { NewIcc -> IsWrite = TRUE; return hEmpty; } if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } // Create profile from disk file cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *lpFileName, const char *sAccess) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = cmsOpenIOhandlerFromFile(ContextID, lpFileName, sAccess); if (NewIcc ->IOhandler == NULL) goto Error; if (*sAccess == 'W' || *sAccess == 'w') { NewIcc -> IsWrite = TRUE; return hEmpty; } if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess) { return cmsOpenProfileFromFileTHR(NULL, ICCProfile, sAccess); } cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char *sAccess) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = cmsOpenIOhandlerFromStream(ContextID, ICCProfile); if (NewIcc ->IOhandler == NULL) goto Error; if (*sAccess == 'w') { NewIcc -> IsWrite = TRUE; return hEmpty; } if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char *sAccess) { return cmsOpenProfileFromStreamTHR(NULL, ICCProfile, sAccess); } // Open from memory block cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void* MemPtr, cmsUInt32Number dwSize) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty; hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; // Ok, in this case const void* is casted to void* just because open IO handler // shares read and writing modes. Don't abuse this feature! NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, "r"); if (NewIcc ->IOhandler == NULL) goto Error; if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize) { return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize); } // Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig static cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig) { cmsUInt8Number* Data; cmsUInt32Number i; cmsUInt32Number Begin; cmsIOHANDLER* io = Icc ->IOhandler; cmsTagDescriptor* TagDescriptor; cmsTagTypeSignature TypeBase; cmsTagTypeSignature Type; cmsTagTypeHandler* TypeHandler; cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc); cmsTagTypeHandler LocalTypeHandler; for (i=0; i < Icc -> TagCount; i++) { if (Icc ->TagNames[i] == (cmsTagSignature) 0) continue; // Linked tags are not written if (Icc ->TagLinked[i] != (cmsTagSignature) 0) continue; Icc -> TagOffsets[i] = Begin = io ->UsedSpace; Data = (cmsUInt8Number*) Icc -> TagPtrs[i]; if (!Data) { // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user. // In this case a blind copy of the block data is performed if (FileOrig != NULL && Icc -> TagOffsets[i]) { if (FileOrig->IOhandler != NULL) { cmsUInt32Number TagSize = FileOrig->TagSizes[i]; cmsUInt32Number TagOffset = FileOrig->TagOffsets[i]; void* Mem; if (!FileOrig->IOhandler->Seek(FileOrig->IOhandler, TagOffset)) return FALSE; Mem = _cmsMalloc(Icc->ContextID, TagSize); if (Mem == NULL) return FALSE; if (FileOrig->IOhandler->Read(FileOrig->IOhandler, Mem, TagSize, 1) != 1) return FALSE; if (!io->Write(io, TagSize, Mem)) return FALSE; _cmsFree(Icc->ContextID, Mem); Icc->TagSizes[i] = (io->UsedSpace - Begin); // Align to 32 bit boundary. if (!_cmsWriteAlignment(io)) return FALSE; } } continue; } // Should this tag be saved as RAW? If so, tagsizes should be specified in advance (no further cooking is done) if (Icc ->TagSaveAsRaw[i]) { if (io -> Write(io, Icc ->TagSizes[i], Data) != 1) return FALSE; } else { // Search for support on this tag TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, Icc -> TagNames[i]); if (TagDescriptor == NULL) continue; // Unsupported, ignore it if (TagDescriptor ->DecideType != NULL) { Type = TagDescriptor ->DecideType(Version, Data); } else { Type = TagDescriptor ->SupportedTypes[0]; } TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type); if (TypeHandler == NULL) { cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]); continue; } TypeBase = TypeHandler ->Signature; if (!_cmsWriteTypeBase(io, TypeBase)) return FALSE; LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; LocalTypeHandler.ICCVersion = Icc ->Version; if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) TypeBase); cmsSignalError(Icc ->ContextID, cmsERROR_WRITE, "Couldn't write type '%s'", String); return FALSE; } } Icc -> TagSizes[i] = (io ->UsedSpace - Begin); // Align to 32 bit boundary. if (! _cmsWriteAlignment(io)) return FALSE; } return TRUE; } // Fill the offset and size fields for all linked tags static cmsBool SetLinks( _cmsICCPROFILE* Icc) { cmsUInt32Number i; for (i=0; i < Icc -> TagCount; i++) { cmsTagSignature lnk = Icc ->TagLinked[i]; if (lnk != (cmsTagSignature) 0) { int j = _cmsSearchTag(Icc, lnk, FALSE); if (j >= 0) { Icc ->TagOffsets[i] = Icc ->TagOffsets[j]; Icc ->TagSizes[i] = Icc ->TagSizes[j]; } } } return TRUE; } // Low-level save to IOHANDLER. It returns the number of bytes used to // store the profile, or zero on error. io may be NULL and in this case // no data is written--only sizes are calculated cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; _cmsICCPROFILE Keep; cmsIOHANDLER* PrevIO = NULL; cmsUInt32Number UsedSpace; cmsContext ContextID; _cmsAssert(hProfile != NULL); if (!_cmsLockMutex(Icc->ContextID, Icc->UsrMutex)) return 0; memmove(&Keep, Icc, sizeof(_cmsICCPROFILE)); ContextID = cmsGetProfileContextID(hProfile); PrevIO = Icc ->IOhandler = cmsOpenIOhandlerFromNULL(ContextID); if (PrevIO == NULL) { _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); return 0; } // Pass #1 does compute offsets if (!_cmsWriteHeader(Icc, 0)) goto Error; if (!SaveTags(Icc, &Keep)) goto Error; UsedSpace = PrevIO ->UsedSpace; // Pass #2 does save to iohandler if (io != NULL) { Icc ->IOhandler = io; if (!SetLinks(Icc)) goto Error; if (!_cmsWriteHeader(Icc, UsedSpace)) goto Error; if (!SaveTags(Icc, &Keep)) goto Error; } memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); if (!cmsCloseIOhandler(PrevIO)) UsedSpace = 0; // As a error marker _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); return UsedSpace; Error: cmsCloseIOhandler(PrevIO); memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); return 0; } // Low-level save to disk. cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsIOHANDLER* io = cmsOpenIOhandlerFromFile(ContextID, FileName, "w"); cmsBool rc; if (io == NULL) return FALSE; rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); rc &= cmsCloseIOhandler(io); if (rc == FALSE) { // remove() is C99 per 7.19.4.1 remove(FileName); // We have to IGNORE return value in this case } return rc; } // Same as anterior, but for streams cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream) { cmsBool rc; cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsIOHANDLER* io = cmsOpenIOhandlerFromStream(ContextID, Stream); if (io == NULL) return FALSE; rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); rc &= cmsCloseIOhandler(io); return rc; } // Same as anterior, but for memory blocks. In this case, a NULL as MemPtr means calculate needed space only cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded) { cmsBool rc; cmsIOHANDLER* io; cmsContext ContextID = cmsGetProfileContextID(hProfile); _cmsAssert(BytesNeeded != NULL); // Should we just calculate the needed space? if (MemPtr == NULL) { *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL); return (*BytesNeeded == 0) ? FALSE : TRUE; } // That is a real write operation io = cmsOpenIOhandlerFromMem(ContextID, MemPtr, *BytesNeeded, "w"); if (io == NULL) return FALSE; rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); rc &= cmsCloseIOhandler(io); return rc; } // Free one tag contents static void freeOneTag(_cmsICCPROFILE* Icc, cmsUInt32Number i) { if (Icc->TagPtrs[i]) { cmsTagTypeHandler* TypeHandler = Icc->TagTypeHandlers[i]; if (TypeHandler != NULL) { cmsTagTypeHandler LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc->ContextID; LocalTypeHandler.ICCVersion = Icc->Version; LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc->TagPtrs[i]); } else _cmsFree(Icc->ContextID, Icc->TagPtrs[i]); } Icc->TagPtrs[i] = NULL; } // Closes a profile freeing any involved resources cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsBool rc = TRUE; cmsUInt32Number i; if (!Icc) return FALSE; // Was open in write mode? if (Icc ->IsWrite) { Icc ->IsWrite = FALSE; // Assure no further writing rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile); } for (i=0; i < Icc -> TagCount; i++) { freeOneTag(Icc, i); } if (Icc ->IOhandler != NULL) { rc &= cmsCloseIOhandler(Icc->IOhandler); } _cmsDestroyMutex(Icc->ContextID, Icc->UsrMutex); _cmsFree(Icc ->ContextID, Icc); // Free placeholder memory return rc; } // ------------------------------------------------------------------------------------------------------------------- // Returns TRUE if a given tag is supported by a plug-in static cmsBool IsTypeSupported(cmsTagDescriptor* TagDescriptor, cmsTagTypeSignature Type) { cmsUInt32Number i, nMaxTypes; nMaxTypes = TagDescriptor->nSupportedTypes; if (nMaxTypes >= MAX_TYPES_IN_LCMS_PLUGIN) nMaxTypes = MAX_TYPES_IN_LCMS_PLUGIN; for (i=0; i < nMaxTypes; i++) { if (Type == TagDescriptor ->SupportedTypes[i]) return TRUE; } return FALSE; } // That's the main read function void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; cmsBool avoidCheck; cmsIOHANDLER* io; cmsTagTypeHandler* TypeHandler; cmsTagTypeHandler LocalTypeHandler; cmsTagDescriptor* TagDescriptor = NULL; cmsTagTypeSignature BaseType; cmsUInt32Number Offset, TagSize; cmsUInt32Number ElemCount; int n; if (!_cmsLockMutex(Icc->ContextID, Icc->UsrMutex)) return NULL; avoidCheck = _cmsAvoidTypeCheckOnTags(Icc->ContextID); n = _cmsSearchTag(Icc, sig, TRUE); if (n < 0) { // Not found, return NULL _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); return NULL; } // If the element is already in memory, return the pointer if (Icc->TagPtrs[n]) { if (Icc->TagTypeHandlers[n] == NULL) goto Error; // Sanity check BaseType = Icc->TagTypeHandlers[n]->Signature; if (BaseType == 0) goto Error; if (!avoidCheck) { TagDescriptor = _cmsGetTagDescriptor(Icc->ContextID, sig); if (TagDescriptor == NULL) goto Error; if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error; } if (Icc->TagSaveAsRaw[n]) goto Error; // We don't support read raw tags as cooked _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); return Icc->TagPtrs[n]; } // We need to read it. Get the offset and size to the file Offset = Icc->TagOffsets[n]; TagSize = Icc->TagSizes[n]; if (TagSize < 8) goto Error; io = Icc->IOhandler; if (io == NULL) { // This is a built-in profile that has been manipulated, abort early cmsSignalError(Icc->ContextID, cmsERROR_CORRUPTION_DETECTED, "Corrupted built-in profile."); goto Error; } // Seek to its location if (!io->Seek(io, Offset)) goto Error; if (!avoidCheck) { // Search for support on this tag TagDescriptor = _cmsGetTagDescriptor(Icc->ContextID, sig); if (TagDescriptor == NULL) { char String[5]; _cmsTagSignature2String(String, sig); // An unknown element was found. cmsSignalError(Icc->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown tag type '%s' found.", String); goto Error; // Unsupported. } } // if supported, get type and check if in list BaseType = _cmsReadTypeBase(io); if (BaseType == 0) goto Error; if (!avoidCheck) { if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error; } TagSize -= 8; // Already read by the type base logic // Get type handler TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, BaseType); if (TypeHandler == NULL) goto Error; LocalTypeHandler = *TypeHandler; // Read the tag Icc->TagTypeHandlers[n] = TypeHandler; LocalTypeHandler.ContextID = Icc->ContextID; LocalTypeHandler.ICCVersion = Icc->Version; Icc->TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize); // The tag type is supported, but something wrong happened and we cannot read the tag. // let know the user about this (although it is just a warning) if (Icc->TagPtrs[n] == NULL) { char String[5]; _cmsTagSignature2String(String, sig); cmsSignalError(Icc->ContextID, cmsERROR_CORRUPTION_DETECTED, "Corrupted tag '%s'", String); goto Error; } if (!avoidCheck) { // This is a weird error that may be a symptom of something more serious, the number of // stored item is actually less than the number of required elements. if (ElemCount < TagDescriptor->ElemCount) { char String[5]; _cmsTagSignature2String(String, sig); cmsSignalError(Icc->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d", String, TagDescriptor->ElemCount, ElemCount); goto Error; } } // Return the data _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); return Icc->TagPtrs[n]; // Return error and unlock the data Error: freeOneTag(Icc, n); Icc->TagPtrs[n] = NULL; _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); return NULL; } // Get true type of data cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsTagTypeHandler* TypeHandler; int n; // Search for given tag in ICC profile directory n = _cmsSearchTag(Icc, sig, TRUE); if (n < 0) return (cmsTagTypeSignature) 0; // Not found, return NULL // Get the handler. The true type is there TypeHandler = Icc -> TagTypeHandlers[n]; if (TypeHandler == NULL) return (cmsTagTypeSignature) 0; return TypeHandler ->Signature; } // Write a single tag. This just keeps track of the tak into a list of "to be written". If the tag is already // in that list, the previous version is deleted. cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsTagTypeHandler* TypeHandler = NULL; cmsTagTypeHandler LocalTypeHandler; cmsTagDescriptor* TagDescriptor = NULL; cmsTagTypeSignature Type; int i; cmsFloat64Number Version; char TypeString[5], SigString[5]; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE; // To delete tags. if (data == NULL) { // Delete the tag i = _cmsSearchTag(Icc, sig, FALSE); if (i >= 0) { // Use zero as a mark of deleted _cmsDeleteTagByPos(Icc, i); Icc ->TagNames[i] = (cmsTagSignature) 0; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TRUE; } // Didn't find the tag goto Error; } if (!_cmsNewTag(Icc, sig, &i)) goto Error; // This cannot be RAW if (Icc->TagSaveAsRaw[i]) { cmsSignalError(Icc->ContextID, cmsERROR_ALREADY_DEFINED, "Tag '%x' was already saved as RAW", sig); goto Error; } // This is not a link Icc ->TagLinked[i] = (cmsTagSignature) 0; // Get information about the TAG. TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig); if (TagDescriptor == NULL){ cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag '%x'", sig); goto Error; } // Now we need to know which type to use. It depends on the version. Version = cmsGetProfileVersion(hProfile); if (TagDescriptor ->DecideType != NULL) { // Let the tag descriptor to decide the type base on depending on // the data. This is useful for example on parametric curves, where // curves specified by a table cannot be saved as parametric and needs // to be casted to single v2-curves, even on v4 profiles. Type = TagDescriptor ->DecideType(Version, data); } else { Type = TagDescriptor ->SupportedTypes[0]; } // Does the tag support this type? if (!IsTypeSupported(TagDescriptor, Type)) { _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); _cmsTagSignature2String(SigString, sig); cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); goto Error; } // Does we have a handler for this type? TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type); if (TypeHandler == NULL) { _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); _cmsTagSignature2String(SigString, sig); cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); goto Error; // Should never happen } // Fill fields on icc structure Icc ->TagTypeHandlers[i] = TypeHandler; Icc ->TagNames[i] = sig; Icc ->TagSizes[i] = 0; Icc ->TagOffsets[i] = 0; LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; LocalTypeHandler.ICCVersion = Icc ->Version; Icc ->TagPtrs[i] = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount); if (Icc ->TagPtrs[i] == NULL) { _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); _cmsTagSignature2String(SigString, sig); cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Malformed struct in type '%s' for tag '%s'", TypeString, SigString); goto Error; } _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TRUE; Error: _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return FALSE; } // Read and write raw data. Read/Write Raw/cooked pairs try to maintain consistency within the pair. Some sequences // raw/cooked would work, but at a cost. Data "cooked" may be converted to "raw" by using the "write" serialization logic. // In general it is better to avoid mixing pairs. cmsUInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; void *Object; int i; cmsIOHANDLER* MemIO; cmsTagTypeHandler* TypeHandler = NULL; cmsTagTypeHandler LocalTypeHandler; cmsTagDescriptor* TagDescriptor = NULL; cmsUInt32Number rc; cmsUInt32Number Offset, TagSize; // Sanity check if (data != NULL && BufferSize == 0) return 0; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; // Search for given tag in ICC profile directory i = _cmsSearchTag(Icc, sig, TRUE); if (i < 0) goto Error; // Not found, // It is already read? if (Icc -> TagPtrs[i] == NULL) { // Not yet, get original position Offset = Icc ->TagOffsets[i]; TagSize = Icc ->TagSizes[i]; // read the data directly, don't keep copy if (data != NULL) { if (BufferSize < TagSize) TagSize = BufferSize; if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) goto Error; if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) goto Error; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TagSize; } _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return Icc ->TagSizes[i]; } // The data has been already read, or written. But wait!, maybe the user choose to save as // raw data. In this case, return the raw data directly if (Icc ->TagSaveAsRaw[i]) { if (data != NULL) { TagSize = Icc ->TagSizes[i]; if (BufferSize < TagSize) TagSize = BufferSize; memmove(data, Icc ->TagPtrs[i], TagSize); _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TagSize; } _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return Icc ->TagSizes[i]; } // Already read, or previously set by cmsWriteTag(). We need to serialize that // data to raw to get something that makes sense _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); Object = cmsReadTag(hProfile, sig); if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; if (Object == NULL) goto Error; // Now we need to serialize to a memory block: just use a memory iohandler if (data == NULL) { MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile)); } else{ MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w"); } if (MemIO == NULL) goto Error; // Obtain type handling for the tag TypeHandler = Icc ->TagTypeHandlers[i]; TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig); if (TagDescriptor == NULL) { cmsCloseIOhandler(MemIO); goto Error; } if (TypeHandler == NULL) goto Error; // Serialize LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; LocalTypeHandler.ICCVersion = Icc ->Version; if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) { cmsCloseIOhandler(MemIO); goto Error; } if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) { cmsCloseIOhandler(MemIO); goto Error; } // Get Size and close rc = MemIO ->Tell(MemIO); cmsCloseIOhandler(MemIO); // Ignore return code this time _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return rc; Error: _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return 0; } // Similar to the anterior. This function allows to write directly to the ICC profile any data, without // checking anything. As a rule, mixing Raw with cooked doesn't work, so writing a tag as raw and then reading // it as cooked without serializing does result into an error. If that is what you want, you will need to dump // the profile to memry or disk and then reopen it. cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; int i; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; if (!_cmsNewTag(Icc, sig, &i)) { _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return FALSE; } // Mark the tag as being written as RAW Icc ->TagSaveAsRaw[i] = TRUE; Icc ->TagNames[i] = sig; Icc ->TagLinked[i] = (cmsTagSignature) 0; // Keep a copy of the block Icc ->TagPtrs[i] = _cmsDupMem(Icc ->ContextID, data, Size); Icc ->TagSizes[i] = Size; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); if (Icc->TagPtrs[i] == NULL) { Icc->TagNames[i] = (cmsTagSignature) 0; return FALSE; } return TRUE; } // Using this function you can collapse several tag entries to the same block in the profile cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; int i; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE; if (!_cmsNewTag(Icc, sig, &i)) { _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return FALSE; } // Keep necessary information Icc ->TagSaveAsRaw[i] = FALSE; Icc ->TagNames[i] = sig; Icc ->TagLinked[i] = dest; Icc ->TagPtrs[i] = NULL; Icc ->TagSizes[i] = 0; Icc ->TagOffsets[i] = 0; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TRUE; } // Returns the tag linked to sig, in the case two tags are sharing same resource cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; int i; // Search for given tag in ICC profile directory i = _cmsSearchTag(Icc, sig, FALSE); if (i < 0) return (cmsTagSignature) 0; // Not found, return 0 return Icc -> TagLinked[i]; } lcms2-2.19.1/src/.deps/0000755000175000017500000000000015176574562013460 5ustar martimartilcms2-2.19.1/src/Makefile.in0000644000175000017500000006511715176574547014531 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms 2 library # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = liblcms2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_liblcms2_la_OBJECTS = cmscnvrt.lo cmserr.lo cmsgamma.lo cmsgmt.lo \ cmsintrp.lo cmsio0.lo cmsio1.lo cmslut.lo cmsplugin.lo \ cmssm.lo cmsmd5.lo cmsmtrx.lo cmspack.lo cmspcs.lo cmswtpnt.lo \ cmsxform.lo cmssamp.lo cmsnamed.lo cmscam02.lo cmsvirt.lo \ cmstypes.lo cmscgats.lo cmsps2.lo cmsopt.lo cmshalf.lo \ cmsalpha.lo liblcms2_la_OBJECTS = $(am_liblcms2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = liblcms2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(liblcms2_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cmsalpha.Plo \ ./$(DEPDIR)/cmscam02.Plo ./$(DEPDIR)/cmscgats.Plo \ ./$(DEPDIR)/cmscnvrt.Plo ./$(DEPDIR)/cmserr.Plo \ ./$(DEPDIR)/cmsgamma.Plo ./$(DEPDIR)/cmsgmt.Plo \ ./$(DEPDIR)/cmshalf.Plo ./$(DEPDIR)/cmsintrp.Plo \ ./$(DEPDIR)/cmsio0.Plo ./$(DEPDIR)/cmsio1.Plo \ ./$(DEPDIR)/cmslut.Plo ./$(DEPDIR)/cmsmd5.Plo \ ./$(DEPDIR)/cmsmtrx.Plo ./$(DEPDIR)/cmsnamed.Plo \ ./$(DEPDIR)/cmsopt.Plo ./$(DEPDIR)/cmspack.Plo \ ./$(DEPDIR)/cmspcs.Plo ./$(DEPDIR)/cmsplugin.Plo \ ./$(DEPDIR)/cmsps2.Plo ./$(DEPDIR)/cmssamp.Plo \ ./$(DEPDIR)/cmssm.Plo ./$(DEPDIR)/cmstypes.Plo \ ./$(DEPDIR)/cmsvirt.Plo ./$(DEPDIR)/cmswtpnt.Plo \ ./$(DEPDIR)/cmsxform.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblcms2_la_SOURCES) DIST_SOURCES = $(liblcms2_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ # CFLAGS = -pedantic -Wall -std=c99 -O3 includedir = ${prefix}/include infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2.la AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include liblcms2_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_la_LIBADD = $(LCMS_LIB_DEPLIBS) liblcms2_la_SOURCES = \ cmscnvrt.c cmserr.c cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c cmsio1.c cmslut.c \ cmsplugin.c cmssm.c cmsmd5.c cmsmtrx.c cmspack.c cmspcs.c cmswtpnt.c cmsxform.c \ cmssamp.c cmsnamed.c cmscam02.c cmsvirt.c cmstypes.c cmscgats.c cmsps2.c cmsopt.c \ cmshalf.c cmsalpha.c lcms2_internal.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -$(am__rm_f) $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ echo rm -f $${locs}; \ $(am__rm_f) $${locs} liblcms2.la: $(liblcms2_la_OBJECTS) $(liblcms2_la_DEPENDENCIES) $(EXTRA_liblcms2_la_DEPENDENCIES) $(AM_V_CCLD)$(liblcms2_la_LINK) -rpath $(libdir) $(liblcms2_la_OBJECTS) $(liblcms2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsalpha.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscam02.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscgats.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscnvrt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmserr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsgamma.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsgmt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmshalf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsintrp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsio0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsio1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmslut.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsmd5.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsmtrx.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsnamed.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsopt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmspack.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmspcs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsplugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsps2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmssamp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmssm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmstypes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsvirt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmswtpnt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsxform.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/cmsalpha.Plo -rm -f ./$(DEPDIR)/cmscam02.Plo -rm -f ./$(DEPDIR)/cmscgats.Plo -rm -f ./$(DEPDIR)/cmscnvrt.Plo -rm -f ./$(DEPDIR)/cmserr.Plo -rm -f ./$(DEPDIR)/cmsgamma.Plo -rm -f ./$(DEPDIR)/cmsgmt.Plo -rm -f ./$(DEPDIR)/cmshalf.Plo -rm -f ./$(DEPDIR)/cmsintrp.Plo -rm -f ./$(DEPDIR)/cmsio0.Plo -rm -f ./$(DEPDIR)/cmsio1.Plo -rm -f ./$(DEPDIR)/cmslut.Plo -rm -f ./$(DEPDIR)/cmsmd5.Plo -rm -f ./$(DEPDIR)/cmsmtrx.Plo -rm -f ./$(DEPDIR)/cmsnamed.Plo -rm -f ./$(DEPDIR)/cmsopt.Plo -rm -f ./$(DEPDIR)/cmspack.Plo -rm -f ./$(DEPDIR)/cmspcs.Plo -rm -f ./$(DEPDIR)/cmsplugin.Plo -rm -f ./$(DEPDIR)/cmsps2.Plo -rm -f ./$(DEPDIR)/cmssamp.Plo -rm -f ./$(DEPDIR)/cmssm.Plo -rm -f ./$(DEPDIR)/cmstypes.Plo -rm -f ./$(DEPDIR)/cmsvirt.Plo -rm -f ./$(DEPDIR)/cmswtpnt.Plo -rm -f ./$(DEPDIR)/cmsxform.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/cmsalpha.Plo -rm -f ./$(DEPDIR)/cmscam02.Plo -rm -f ./$(DEPDIR)/cmscgats.Plo -rm -f ./$(DEPDIR)/cmscnvrt.Plo -rm -f ./$(DEPDIR)/cmserr.Plo -rm -f ./$(DEPDIR)/cmsgamma.Plo -rm -f ./$(DEPDIR)/cmsgmt.Plo -rm -f ./$(DEPDIR)/cmshalf.Plo -rm -f ./$(DEPDIR)/cmsintrp.Plo -rm -f ./$(DEPDIR)/cmsio0.Plo -rm -f ./$(DEPDIR)/cmsio1.Plo -rm -f ./$(DEPDIR)/cmslut.Plo -rm -f ./$(DEPDIR)/cmsmd5.Plo -rm -f ./$(DEPDIR)/cmsmtrx.Plo -rm -f ./$(DEPDIR)/cmsnamed.Plo -rm -f ./$(DEPDIR)/cmsopt.Plo -rm -f ./$(DEPDIR)/cmspack.Plo -rm -f ./$(DEPDIR)/cmspcs.Plo -rm -f ./$(DEPDIR)/cmsplugin.Plo -rm -f ./$(DEPDIR)/cmsps2.Plo -rm -f ./$(DEPDIR)/cmssamp.Plo -rm -f ./$(DEPDIR)/cmssm.Plo -rm -f ./$(DEPDIR)/cmstypes.Plo -rm -f ./$(DEPDIR)/cmsvirt.Plo -rm -f ./$(DEPDIR)/cmswtpnt.Plo -rm -f ./$(DEPDIR)/cmsxform.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/testbed/0000755000175000017500000000000015176574562013312 5ustar martimartilcms2-2.19.1/testbed/alpha_test.c0000644000175000017500000001460015176573557015606 0ustar martimarti #include #include #include #include "lcms2_internal.h" /** * Premultiplied alpha. This conversion generates irreversible information loss. * * 8 bits: * prgb = rgb * (alpha/255) * rgb = prgb * (255 / alpha) * * 16 bits: * prgb = rgb * (alpha/65535) * rgb = prgb * (65535/alpha) * */ uint8_t to_premul8_float(uint8_t rgb8, uint8_t a8) { double alpha_factor, rgb; if (a8 == 0) return rgb8; alpha_factor = (double) a8 / 255.0; rgb = ((double) rgb8 * alpha_factor); return (uint8_t)round(rgb); } uint8_t from_premul8_float(uint8_t rgb8, uint8_t a8) { double alpha_factor, rgb; if (a8 == 0) return rgb8; alpha_factor = 255.0 / (double)a8; rgb = ((double)rgb8 * alpha_factor); if (rgb > 255.0) rgb = 255.0; return (uint8_t)round(rgb); } uint16_t to_premul16_float(uint16_t rgb16, uint16_t a16) { double alpha_factor, rgb; if (a16 == 0) return rgb16; alpha_factor = (double)a16 / 65535.0; rgb = ((double)rgb16 * alpha_factor); return (uint16_t)round(rgb); } uint16_t from_premul16_float(uint16_t rgb16, uint16_t a16) { double alpha_factor, rgb; if (a16 == 0) return rgb16; alpha_factor = 65535.0 / (double)a16; rgb = ((double)rgb16 * alpha_factor); if (rgb > 65535.0) rgb = 65535.0; return (uint16_t)round(rgb); } /** ** Optimized versions * * alpha_factor goes 0..1.0 in 1.15 fixed point format * (a16 / 0xffff) which equals to _cmsToFixedDomain() inline (15.16) * * rgb 16.0 fixed point x alpha factor 1.15 = (a*b + 0x8000) >> 15 * */ uint16_t to_premul16(uint16_t rgb16, uint16_t a16) { uint32_t alpha_factor, rgb; if (a16 == 0) return rgb16; alpha_factor = _cmsToFixedDomain(a16); rgb = ((uint32_t) rgb16 * alpha_factor + 0x8000) >> 16; return (uint16_t)rgb; } uint16_t from_premul16(uint16_t rgb16, uint16_t a16) { uint32_t alpha_factor, rgb; if (a16 == 0) return rgb16; alpha_factor = _cmsToFixedDomain(a16); rgb = (((uint32_t) rgb16) << 16) / alpha_factor; if (rgb > 0xffff) rgb = 0xffff; return (uint16_t)rgb; } uint8_t to_premul8(uint8_t rgb8, uint8_t a8) { uint32_t alpha_factor, rgb; if (a8 == 0) return rgb8; alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(a8)); rgb = ((uint32_t)rgb8 * alpha_factor + 0x8000) >> 16; return (uint8_t)rgb; } uint8_t from_premul8(uint8_t rgb8, uint8_t a8) { uint32_t alpha_factor, rgb; if (a8 == 0) return rgb8; alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(a8)); rgb = (((uint32_t)rgb8) << 16) / alpha_factor; if (rgb > 0xff) rgb = 0xff; return (uint8_t)rgb; } static void dif16to(void) { int32_t gpremul, gpremul1; int32_t max, max1, max2, a, g; printf("Premul TO diff\n"); max = max1 = max2 = 0; for (a = 0; a < 65536; a += 255) for (g = 0; g < 65536; g++) { gpremul = to_premul16_float(g, a); gpremul1 = to_premul16(g, a); if (gpremul != gpremul1) { int32_t dif = abs(gpremul - gpremul1); if (dif > max) { max = dif; max1 = gpremul; max2 = gpremul1; } } } printf("Error max=%d on pre:%d pre1:%d\n", max, max1, max2); } static void dif16from(void) { int32_t gpremul, gpremul1; int32_t max, max1, max2, maxa, maxg, a, g; printf("Premul FROM diff\n"); max = max1 = max2 = maxa = maxg = 0; for (a = 0; a < 65536; a += 255) for (g = 0; g < 65536; g++) { gpremul = from_premul16_float(g, a); gpremul1 = from_premul16(g, a); if (gpremul != gpremul1) { int32_t dif = abs(gpremul - gpremul1); if (dif > max) { max = dif; max1 = gpremul; max2 = gpremul1; maxa = a; maxg = g; } } } printf("Error max=%d on pre:%d pre1:%d (a:%d g:%d)\n", max, max1, max2, maxa, maxg); from_premul16_float(maxg, maxa); from_premul16(maxg, maxa); } static void dif8to(void) { int32_t gpremul, gpremul1; int32_t max, max1, max2, a, g; printf("Premul TO8 diff\n"); max = max1 = max2 = 0; for (a = 0; a < 256; a++) for (g = 0; g < 256; g++) { gpremul = to_premul8_float(g, a); gpremul1 = to_premul8(g, a); if (gpremul != gpremul1) { int32_t dif = abs(gpremul - gpremul1); if (dif > max) { max = dif; max1 = gpremul; max2 = gpremul1; } } } printf("Error max=%d on pre:%d pre1:%d\n", max, max1, max2); } static void dif8from(void) { int32_t gpremul, gpremul1; int32_t max, max1, max2, maxa, maxg, a, g; printf("Premul FROM8 diff\n"); max = max1 = max2 = maxa = maxg = 0; for (a = 0; a < 256; a++) for (g = 0; g < 256; g++) { gpremul = from_premul8_float(g, a); gpremul1 = from_premul8(g, a); if (gpremul != gpremul1) { int32_t dif = abs(gpremul - gpremul1); if (dif > max) { max = dif; max1 = gpremul; max2 = gpremul1; maxa = a; maxg = g; } } } printf("Error max=%d on pre:%d pre1:%d (a:%d g:%d)\n", max, max1, max2, maxa, maxg); from_premul8_float(maxg, maxa); from_premul8(maxg, maxa); } static void toFixedDomain(void) { int32_t g; for (g = 0; g < 65536; g++) { uint32_t a = _cmsToFixedDomain(g); uint32_t b = (uint32_t)round(((double)g / 65535.0) * 65536.0); if (a != b) printf("%d != %d\n", a, b); } } static void fromFixedDomain(void) { int32_t g; for (g = 0; g <= 65536; g++) { uint32_t a = _cmsFromFixedDomain(g); uint32_t b = (uint32_t)round(((double)g / 65536.0) * 65535.0); if (a != b) printf("%d != %d\n", a, b); } } // Check alpha int main() { toFixedDomain(); fromFixedDomain(); dif8from(); dif8to(); dif16from(); dif16to(); return 0; }lcms2-2.19.1/testbed/bad.icc0000644000175000017500000000046615176573557014531 0ustar martimartiSHELL = /bin/sh CFLAGS = -g -O4 -fomit-frame-pointer -Wall -I../include testcms.o: testcms.c testcms: testcms.o ../src/liblcms.a $(CC) $(CFLAGS) testcms.o ../src/liblcms.a -o $@ -lm all: testcms test test: testcms ./testcms install: # Nothing to install clean: -rm testcms.o testcms testcms.exe lcms2-2.19.1/testbed/bad_mpe.icc0000644000175000017500000000045415176573557015367 0ustar martimartisyoekTRCscnrMCHLab ps2sacspmpetgamtQgaQggXXXXXXHSV m)CHE D2B0(clutDt@textvcurzlurvfCHE D2B0(clutr^para@I@palcms2-2.19.1/testbed/crayons.icc0000644000175000017500000002107015176573557015453 0ustar martimarti"8lcmsmntrRGB XYZ  acspAPPL-lcms#|i/dE descbcprtl wtptchad,rXYZbXYZgXYZrTRC gTRC bTRC chrm"$mluc enGB(enUSFCrayon ColoursCrayon Colorsmluc enUS XYZ -sf32 J*XYZ o8XYZ $XYZ bcurv  !#$%&()*+-./02345789:;=>?@BCDEGHIJLMNOQRSTUWXYZ\]^_abcdfghiklmnoqrstvwxy{|}~    "#%&()+-.0134689;<>@ACEFHJKMOPRTUWYZ\^`aceghjlnoqsuvxz|~   !#%(*,.1358:<>ACEHJLOQSVXZ]_adfikmpruwy|~   #&),.147:=?BEHKNQTVY\_behknqtwz} "%),/369=@CGJMQTW[^behlosvy} "%)-148<@CGKORVZ^bfimquy} !%)-159>BFJNSW[_chlpty}  $(-16:?CHMQVZ_chmqv{  !&+/49>CHMRW\afkpuz      " ' , 1 7 < A F L Q V [ a f k q v {      $ ) / 4 : ? E J P V [ a f l r w }      $ * / 5 ; A G M S Y _ d j p v |     & , 2 8 > E K Q W ] d j p v }      ! ( . 5 ; B H O U \ b i o v | ")/6=DJQX_flsz  '.5<CJQX_fmt{  '/6=DLSZbipx #*29AHPW_gnv}'.6>FNU]emu} #+3;DLT\dlt| (08AIQZbjs{ #,4=ENW_hpy &/7@IRZclu~ &/8AJS\enw $.7@IR\enw )2;ENXakt~  *3=FPZcmw '0:DNXblu )3=GQ[epz'1;EPZdoy *4>IS^hs}'2<GR\gr|    ) 4 ? J T _ j u !!!!%!0!;!F!Q!\!g!r!~!!!!!!!!!!!""""%"0"<"G"R"^"i"t""""""""""""####*#5#A#L#X#c#o#z###########$$$$($3$?$K$V$b$n$y$$$$$$$$$$$%%%%)%5%A%M%Y%e%p%|%%%%%%%%%%%& &&#&/&;&G&S&_&k&w&&&&&&&&&&&' ''!'-'9'F'R'^'j'v'''''''''''( ((#(/(;(H(T(`(m(y(((((((((())))()4)A)M)Z)g)s)))))))))))* **$*1*>*J*W*d*q*}**********+ ++$+1+>+K+X+e+r++++++++++,,,,(,5,B,O,\,i,v,,,,,,,,,,---!-/-<-I-V-d-q-~---------....,.9.G.T.a.o.|.........////,/:/G/U/b/p/~/////////000"0/0=0K0Y0g0t00000000001 11(161D1R1`1n1|111111111222$222@2N2\2j2y222222222333#313?3M3\3j3x333333333444$434A4O4^4l4{4444444445 55)575F5T5c5r555555555666!606?6N6\6k6z666666666777,7;7I7X7g7v7777777778 88*898H8W8f8u8888888889 99+9:9I9X9g9w99999999::::.:=:M:\:k:{::::::::;;;%;4;D;S;c;r;;;;;;;;;<<<-<=>>'>7>G>W>g>w>>>>>>>>???'?7?G?W?g?x????????@ @@*@:@J@Z@k@{@@@@@@@@AAA/A?AOA`ApAAAAAAAABBB&B6BGBWBhBxBBBBBBBBCCC/C@CQCaCrCCCCCCCCD DD+D;DLD]DnDDDDDDDDEEE(E9EJE[ElE}EEEEEEEFFF(F9FJF[FlF}FFFFFFFGGG)G;GLG]GnGGGGGGGGH HH-H?HPHaHsHHHHHHHHII"I3IEIVIhIzIIIIIIIJJJ*J;JMJ_JqJJJJJJJJKK"K4KFKXKiK{KKKKKKKL LL.L@LRLdLvLLLLLLLMMM+M=MOMaMsMMMMMMMNNN)N;NMN_NrNNNNNNNOOO)O;ONO`OrOOOOOOOPPP+P=PPPbPuPPPPPPPQ QQ/QAQTQgQyQQQQQQQRR"R4RGRZRmRRRRRRRSSS)SUQUeUxUUUUUUUVV%V8VKV_VrVVVVVVVW W W4WGW[WnWWWWWWWX XX1XEXXXlXXXXXXXY YY0YDYXYkYYYYYYYZ ZZ1ZEZYZlZZZZZZZ[ [[3[G[[[o[[[[[[[\\#\7\K\`\t\\\\\\]]])]=]Q]e]z]]]]]]^^^0^D^Y^m^^^^^^^__%_9_N_b_w______```/`D`X`m```````aa'a;aPaeazaaaaaab b b5bIb^bsbbbbbbccc/cDcYcnccccccddd+d@dUdjdddddddee)e>eSehe}eeeeeeff'f=fRfgf}ffffffgg(g=gSghg~gggggghh*h?hUhjhhhhhhiii-iCiXiniiiiiijjj2jHj]jsjjjjjjk k"k8kNkdkzkkkkkkll*l@lVllllllllmmm3mIm_mummmmmmnn'n=nSnjnnnnnnooo3oIo`ovoooooopp*p@pWpmppppppq q"q8qOqfq|qqqqqrrr2rHr_rvrrrrrrss,sCsZsqsssssstt(t?tVtmttttttuu&u=uTukuuuuuuv v$v;vRvjvvvvvvw w$w;wRwjwwwwwwx x%xyVynyyyyyyzz*zBzZzqzzzzz{{{/{G{_{v{{{{{|||5|M|e|}|||||} }$}<}T}l}}}}}}~~-~E~]~u~~~~~7Og)AZrԀ5Nfȁ*C[tւ 9Qj̓0HazĄ݄(AZrօ!:SlІ4Mgˇ0Ib{Lj,F_xĉމ*C]vŠ܊(B[u‹ۋ(B[uŒ܌)B\vÍݍ+D^xƎ-Ga{ɏ1Keΐ6Pkӑ"\{4Sr ,Kj‰¨$CbÁà<[{ĚĹ6UuŔų0PoƏƮ ,KkNJǪ(GgȆȦ$DdɃɣ"Aaʁʡ @_˟˿?^~̞̾>^~͞;?_Οο @`πϠ!BbЂТ$Deхѥ'Gh҈ҩ +LlӍӭ0PqԒԲ5Vw՗ո;\}ֿ֞!Bcׄץ)Jk،ح1Rsٔٵ:[|ڞڿ"Deۆۨ -Noܑܲ8Y{ݜݾ"Deއި /Prߔߵ<^(Jl7Yz$Fh4Vx#Eg4Vy$Fi7Y{(Jm<^ .Qs!Df7Z}+Nq Cf8[~ .Qt$Hk?b6Z} /Rv'Ko!Dh>b9]4X| 0Tx,Pu)Mr'Ko%ImchrmT{L&f\lcms2-2.19.1/testbed/ibm-t61.icc0000755000175000017500000006123415176573557015165 0ustar martimartiblcms@mntrRGB XYZ  .acspAPPL????????-lcmsΌ΋Ԓ:*#-wdeschcprt*dmndedmddglumiwtptbkptclrt$~vcgtrXYZ gXYZ bXYZ rTRC  gTRC  bTRC  targRDevDRCIEDRmetab,pdesc*Huey, LENOVO - 6464Y1H - 15" (2009-12-23)textCopyright (c) 2009 Richard Hughesdesc IBM Francedesc ThinkPad T61XYZ XYZ @ڲXYZ WUclrtRed4QGreen3QBlueT vcgt~C r [ L D E LXk&/42-" !"#b$:%%&'([).**+,-i.H/+00123456i7Q899 ::;<=>~?c@HA-BBCDEFGoHRI6JJKLMNxOWP5QQRSTUrVSW5XYYZ[\]^_p``aQbCc6d+e"fghhijklmnopqrstuvwxyz{}~*9I[m͊ "8Nezח6Oh͢ .Sy߫>dߴ*Lnӻ>_9Uqʎ˩,?Paq׃ؔ٦ڶ"&'(&# |m\K9&c.fL 7 '   &09AFHE=1  rO,  !"#|$X%4&&'()w*N+&+,-.}/R0'0123~4U5.66789n:I;%<<=>?o@JA%BBCDEpFMG)HHIJKvLQM-NNOPQsRPS-T TUVWXpYTZ;[#\ \]^_`abc}dqehf^gUhMiEj@k;l6m1n,o'p#qrstuvwxy z#{(|.}3~9@HNV_hr|̍ݎ0Ha}֙7Y{š;gƨ#NyӰ1^ҶAeҾ>cÆīFp˜GqҚ3X~ڤ4Ts#'+.0233430-)$o>J q N +uL \&v8w4c  !"<"#$T%%&f''(w)()*+@+,-\../~06012_3345D567t8089:e;";<=Z>>?@NA ABCACDEvF3FGHdIIJKHLLMrN,NOP[QQRSRTTUVTWWXYgZ/Z[\]S^^_`aXb+ccdef_g:hhijklqmRn4oopqrstvu^vFw0xyyz{|}~{vspopsw}ʒߓ/MlԜ Iu٤JȩGѮ tʲ wζ%}׺2P~VG`ΣXի~V0 .ZXYZ g:XYZ ge #/XYZ '! curv566789<?CHMT\dny2Mi6_DxYY.xd `  m * R b @%yqopw,C^}5a !.!"k# #$X%%&Z' '(w)1)*+s,:--./0[1:233456789:;= >?7@TAsBCDEG!HHIoJKLN O2PYQRSTV+WYXYZ\(]a^_abbcef[gijzkmDnpqstuwyxz||}/ą^A던JƔZ*՝q_Y_qϱ2]׿'BȨ͏}aI޻(FEcurv>>>?@CEIMSY`ir}0Je+R{/`8r-n? of  m % G  w K %w`OD>=BKYk -V%g !]" "#j$$%&I''()Q**+,-].7//0123456789|:z;y}?@ABCDEFGHIJKMN'OEPhQRSUаq_ާ+cd*#Rcurv   )2=IVdt 'DcCn/c J O&r`  ^  m * Q  ^9vdVLFCDGMU`p+ M !v""#F#$%+%&~','()M* *+,W-$-./01e2M3:4-5$6 78#9+:7;G?@ABD E'FCG`H|IJKLMOP(Q?RUSlTUVWXZ[<\i]^` aKbce?fh iyjl\moLprWsuvw xz8{}q^ v1񌶎R0Bp԰ @dϾq7ǡ̞.ѺCLH!HtFtextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "LUMINANCE_XYZ_CDM2" LUMINANCE_XYZ_CDM2 "127.028906 131.252608 110.265656" 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 250 BEGIN_DATA 1 100.00 100.00 100.00 96.782 100.00 84.010 2 100.00 100.00 100.00 96.777 100.01 84.020 3 100.00 100.00 100.00 96.788 100.01 84.020 4 100.00 100.00 100.00 96.772 100.01 84.031 5 31.885 32.743 34.098 7.1032 7.3802 6.8529 6 100.00 0.0000 100.00 55.780 36.372 72.216 7 100.00 100.00 0.0000 80.854 85.328 14.457 8 0.0000 100.00 100.00 56.563 77.910 81.478 9 0.0000 100.00 0.0000 40.875 63.371 11.930 10 0.0000 0.0000 100.00 15.810 14.641 69.711 11 100.00 0.0000 0.0000 39.878 21.756 2.7475 12 0.0000 0.0000 0.0000 0.17553 0.17594 0.25002 13 0.0000 51.304 100.00 22.522 25.400 72.122 14 100.00 0.0000 52.136 42.427 23.732 13.824 15 100.00 53.349 100.00 66.148 52.993 75.881 16 100.00 50.680 0.0000 49.155 36.601 5.9995 17 0.0000 0.0000 51.028 2.4104 1.9441 10.620 18 0.0000 47.489 0.0000 5.7397 9.0981 2.2239 19 0.0000 100.00 51.303 44.137 65.955 27.134 20 100.00 100.00 51.850 84.316 88.033 29.972 21 49.802 0.0000 0.0000 6.4137 3.5753 0.86717 22 51.124 100.00 0.0000 47.587 67.171 12.592 23 48.380 100.00 100.00 65.011 82.675 82.298 24 51.210 0.0000 100.00 25.331 19.848 70.617 25 100.00 50.901 49.331 52.066 39.002 18.084 26 51.774 100.00 50.462 52.565 70.678 27.391 27 49.649 52.597 100.00 33.463 33.521 73.671 28 51.542 52.524 0.0000 15.593 17.815 3.9856 29 0.0000 49.855 52.382 9.3552 12.535 16.059 30 50.495 0.0000 52.232 10.396 6.3389 12.078 31 100.00 0.0000 26.371 40.575 22.270 5.3257 32 0.0000 76.339 100.00 33.117 42.238 75.617 33 100.00 26.813 100.00 58.154 40.221 73.093 34 100.00 100.00 26.811 81.805 86.044 18.357 35 0.0000 100.00 26.561 41.683 64.002 15.669 36 0.0000 74.410 0.0000 16.553 26.310 5.8403 37 73.129 100.00 100.00 77.078 89.284 83.240 38 24.348 0.0000 0.0000 1.5806 0.94588 0.39630 39 24.581 100.00 0.0000 42.402 64.305 12.083 40 0.0000 0.0000 23.698 0.60600 0.52986 2.3141 41 100.00 24.746 0.0000 41.937 25.103 3.4946 42 0.0000 0.0000 74.250 5.8374 4.7142 26.433 43 0.0000 22.539 0.0000 1.3574 2.0990 0.67487 44 100.00 74.753 75.649 68.886 62.128 43.069 45 100.00 76.339 0.0000 62.462 57.635 10.241 46 24.206 31.137 100.00 20.445 20.011 70.880 47 25.917 100.00 72.959 50.277 70.535 45.749 48 76.337 0.0000 100.00 38.220 26.844 71.585 49 0.0000 24.325 100.00 17.209 16.902 70.232 50 26.062 0.0000 27.693 2.6404 1.6716 3.2251 51 76.301 0.0000 0.0000 17.471 9.5861 1.8037 52 55.636 60.634 54.991 25.396 27.543 20.720 53 100.00 26.133 71.401 48.116 30.123 30.439 54 100.00 77.105 100.00 78.967 73.238 79.928 55 23.671 0.0000 100.00 17.792 15.732 69.897 56 72.829 0.0000 29.441 18.321 10.226 5.0650 57 0.0000 100.00 76.177 48.934 69.941 49.240 58 100.00 100.00 76.418 89.056 91.989 51.716 59 0.0000 29.974 25.001 2.8197 3.9290 3.7811 60 0.0000 57.015 27.590 9.3374 14.253 6.6740 61 0.0000 28.308 73.540 8.3865 8.2748 30.381 62 76.657 100.00 0.0000 58.486 73.085 13.506 63 64.153 30.592 100.00 34.100 27.580 72.132 64 71.382 21.927 0.0000 16.352 10.568 2.1399 65 100.00 0.0000 76.747 46.215 26.809 31.233 66 27.952 76.398 100.00 38.158 47.484 76.623 67 25.044 23.803 0.0000 3.1989 3.4516 0.94842 68 72.705 100.00 67.176 65.219 78.350 41.182 69 24.328 100.00 100.00 58.674 79.222 81.658 70 64.851 75.219 27.792 34.393 40.055 11.987 71 29.088 75.418 0.0000 21.568 32.158 6.9815 72 34.835 0.0000 75.524 9.7135 6.9067 27.814 73 26.706 100.00 26.286 43.777 65.280 15.882 74 100.00 26.507 23.928 42.870 25.991 6.1375 75 72.058 68.299 100.00 51.802 51.213 76.973 76 100.00 77.005 25.017 63.975 59.343 13.512 77 0.0000 76.928 72.429 24.440 33.728 36.299 78 78.340 69.846 0.0000 35.875 37.663 7.7361 79 66.707 33.434 33.732 18.891 14.189 7.8290 80 34.882 32.846 73.035 13.171 12.155 30.726 81 75.109 100.00 24.682 60.342 74.358 16.877 82 31.212 66.797 38.917 18.813 25.858 12.802 83 68.904 0.0000 75.143 22.341 13.755 28.600 84 76.754 53.206 80.475 38.684 33.327 43.582 85 29.586 54.279 73.897 18.407 21.380 34.674 86 75.371 75.671 53.308 43.274 45.919 23.595 87 56.532 76.867 0.0000 29.508 38.086 8.0739 88 54.003 77.595 77.133 38.695 45.551 43.420 89 24.398 54.999 100.00 26.998 30.453 73.147 90 100.00 76.564 50.245 65.863 60.652 23.156 91 66.860 18.485 62.967 20.587 13.490 21.742 92 24.183 49.695 0.0000 8.8779 12.706 2.9761 93 78.333 0.0000 52.106 23.870 13.663 13.120 94 0.0000 23.637 48.179 3.7379 4.0541 11.297 95 22.616 0.0000 51.502 3.9387 2.7979 10.933 96 0.0000 54.844 76.717 15.263 18.585 36.843 97 100.00 53.854 25.700 51.217 39.263 9.5218 98 100.00 24.647 46.990 44.331 26.934 13.674 99 0.0000 75.599 49.685 19.861 29.364 18.736 100 52.521 50.873 28.108 17.420 18.438 7.5397 101 78.092 100.00 46.699 64.577 77.105 25.944 102 50.291 100.00 24.042 49.033 68.153 15.815 103 50.424 22.665 16.009 9.2454 6.8360 2.6549 104 49.722 100.00 78.883 57.544 74.988 52.621 105 79.368 49.717 100.00 48.282 40.940 74.559 106 100.00 51.006 76.266 56.735 42.868 39.442 107 26.966 48.404 51.309 12.011 14.642 15.944 108 12.885 47.590 21.789 7.5012 11.020 4.7464 109 46.216 23.744 47.696 10.450 8.0488 12.057 110 26.537 79.034 57.906 27.559 38.504 25.533 111 20.035 78.679 16.337 22.591 34.435 8.7121 112 16.510 13.523 16.825 1.7900 1.7041 1.7702 113 80.772 52.239 39.693 33.078 27.980 12.670 114 52.025 78.476 100.00 47.545 54.688 77.922 115 53.644 19.450 81.363 18.926 13.807 39.159 116 76.390 76.738 79.766 50.525 52.251 47.617 117 16.719 20.668 80.444 10.058 8.9001 36.936 118 49.975 75.940 54.965 31.330 39.094 23.463 119 69.366 54.269 19.639 25.409 24.153 6.8096 120 78.357 44.403 54.054 30.871 24.243 18.910 121 86.769 22.037 79.950 37.403 24.170 38.874 122 23.991 100.00 48.167 45.424 66.697 25.173 123 52.705 49.623 76.910 24.219 23.477 37.566 124 83.235 21.483 18.262 25.590 15.580 4.1464 125 21.860 81.987 82.201 34.008 45.513 49.781 126 26.586 30.174 50.611 7.3390 7.3835 13.410 127 46.176 21.625 100.00 24.801 21.044 70.937 128 46.137 76.930 18.751 27.310 36.755 9.5612 129 91.475 88.357 12.710 61.517 65.249 13.071 130 47.690 27.399 0.0000 8.0330 6.7579 1.5938 131 18.097 39.910 80.111 13.722 14.465 39.178 132 50.349 0.0000 22.838 7.8953 4.4977 2.9459 133 17.466 14.543 39.302 3.1271 2.8099 7.1455 134 88.169 58.584 62.262 44.929 37.898 26.976 135 79.316 19.798 100.00 41.429 29.927 72.136 136 35.363 60.522 16.345 15.432 20.828 5.9239 137 12.495 34.970 8.4353 3.9039 5.6312 1.7456 138 11.590 84.378 36.985 27.019 41.132 15.132 139 85.444 85.726 34.888 55.147 59.454 17.245 140 85.787 17.402 36.424 28.453 16.913 8.3840 141 58.643 35.988 52.638 18.012 14.705 15.942 142 81.323 85.139 100.00 68.844 71.876 80.538 143 75.581 44.352 0.0000 23.219 19.240 3.9417 144 15.160 63.749 47.500 15.748 22.422 15.763 145 15.120 11.073 59.779 4.9766 4.1407 17.560 146 86.028 63.414 16.582 40.018 36.610 8.5068 147 18.812 62.643 85.866 23.314 28.403 49.950 148 18.635 62.340 7.9476 13.120 19.901 4.7801 149 36.339 46.262 87.864 21.038 21.293 50.395 150 65.242 88.476 43.595 46.005 56.607 20.611 151 80.989 100.00 84.297 74.943 85.016 60.461 152 64.260 64.440 85.027 37.886 38.184 50.670 153 35.612 10.187 17.227 4.2728 2.8720 2.0278 154 45.235 41.275 11.575 10.744 11.202 3.1960 155 85.017 19.190 57.638 30.797 18.973 18.858 156 89.001 65.879 87.121 55.655 49.365 55.199 157 88.405 92.832 62.808 68.473 73.860 35.158 158 17.469 44.939 63.608 11.395 13.546 23.474 159 80.504 39.649 23.740 27.475 20.347 6.3547 160 43.343 42.624 45.299 13.137 13.443 12.245 161 62.199 90.166 13.536 43.288 55.885 12.147 162 70.382 64.985 39.990 32.692 33.527 14.444 163 63.092 9.8060 47.998 15.628 9.5134 11.663 164 66.260 33.082 79.344 26.255 19.929 38.922 165 12.275 38.293 42.578 6.3997 8.1986 9.9833 166 44.729 63.293 89.315 30.599 33.805 55.854 167 86.795 39.767 90.083 44.341 32.719 54.910 168 33.191 13.557 63.471 8.2257 6.2326 20.467 169 0.0000 80.502 22.254 20.757 32.527 9.3004 170 35.165 87.442 45.762 34.459 48.798 20.511 171 53.417 63.795 12.922 21.988 26.302 6.5595 172 89.333 37.028 40.649 35.328 24.164 11.600 173 61.924 10.479 11.308 12.127 7.1155 2.0297 174 12.932 63.448 65.784 18.065 24.136 28.144 175 35.002 91.990 14.251 36.328 53.552 11.796 176 64.449 90.256 86.679 56.213 66.205 59.305 177 10.665 88.325 62.489 33.596 48.909 30.886 178 63.940 84.034 63.097 44.778 53.082 32.060 179 32.000 18.251 87.257 14.031 11.523 46.040 180 35.653 63.179 55.913 20.158 25.389 21.282 181 65.306 14.719 95.163 29.039 20.848 61.885 182 12.598 97.956 15.904 39.378 60.643 12.953 183 43.443 13.667 2.3608 5.4401 3.6576 0.92719 184 98.776 12.908 14.035 39.533 22.251 3.7953 185 42.232 44.658 62.606 15.929 16.220 23.280 186 5.7304 86.513 87.282 36.670 49.953 57.088 187 71.195 63.035 64.720 35.902 35.055 29.083 188 14.721 0.0000 24.188 1.2792 0.89876 2.4744 189 45.845 91.742 61.379 43.699 58.499 32.373 190 20.168 99.403 86.193 52.928 73.203 61.291 191 15.692 16.462 98.892 17.172 15.886 69.143 192 49.711 33.832 30.462 11.632 10.157 6.1786 193 92.778 86.752 83.442 72.329 72.554 55.382 194 36.175 85.461 71.738 37.083 49.576 38.944 195 56.241 41.455 91.468 27.602 24.111 56.814 196 63.698 49.811 44.158 23.262 21.617 13.662 197 13.503 85.866 0.84329 26.655 41.607 8.7405 198 50.699 14.090 33.318 9.4038 6.1358 5.8677 199 92.677 38.376 11.214 36.660 25.036 4.8570 200 88.086 68.014 37.675 46.350 43.023 14.745 201 86.614 18.702 0.67590 25.468 15.095 2.6278 202 16.608 0.33745 82.586 8.6870 6.8624 35.442 203 32.618 49.231 35.380 11.728 14.545 8.8331 204 39.446 87.298 89.309 44.627 57.160 61.307 205 89.388 7.1485 88.115 40.442 25.084 47.530 206 65.767 34.460 14.625 17.275 13.256 3.7698 207 84.147 1.8202 16.654 24.638 13.568 3.3843 208 16.889 65.227 27.821 14.968 22.334 8.5395 209 44.534 84.792 4.0875 31.689 44.876 9.3930 210 66.804 16.467 27.933 16.085 9.9479 5.2045 211 58.514 1.6609 86.699 20.583 13.786 42.312 212 4.6391 51.042 39.609 8.8369 12.694 10.054 213 36.900 7.6973 46.164 6.3700 4.2844 9.9811 214 0.87002 15.107 86.749 10.426 9.1195 44.882 215 30.735 26.754 16.517 4.9434 4.9146 2.4919 216 48.174 63.612 69.758 26.386 29.858 32.524 217 13.565 42.325 96.225 19.720 20.671 65.570 218 50.679 66.092 39.202 23.997 28.917 13.327 219 19.235 27.685 65.367 8.1114 7.8623 23.101 220 49.578 25.709 65.082 14.319 11.100 23.330 221 14.832 83.246 100.00 40.590 53.196 77.677 222 82.546 2.4242 67.048 29.152 17.129 23.053 223 33.942 16.843 32.549 5.2516 4.1097 5.4367 224 81.040 38.112 70.346 33.904 24.732 30.546 225 15.556 11.826 1.2429 1.2368 1.2292 0.48138 226 16.070 28.919 29.585 3.9659 4.7704 4.9137 227 49.118 89.394 35.809 38.873 52.843 16.831 228 99.042 12.511 70.128 45.566 26.901 27.920 229 62.910 46.590 2.6010 17.842 16.999 3.6820 230 2.6256 14.517 68.056 5.8511 5.1761 23.910 231 1.1839 16.197 20.949 1.2511 1.5596 2.3249 232 89.271 1.0849 39.328 30.650 17.054 8.2370 233 100.00 31.073 85.483 52.649 34.793 46.962 234 95.707 39.925 60.884 45.356 31.307 23.501 235 72.034 26.792 47.480 21.993 14.839 12.971 236 74.942 79.821 13.360 41.681 47.180 10.494 237 2.1562 64.147 13.993 11.998 18.939 5.1968 238 29.116 42.872 16.700 7.8853 9.9731 3.6404 239 71.555 16.349 81.097 26.938 17.794 38.944 240 0.49326 39.374 86.691 13.684 14.195 47.050 241 2.2551 37.126 61.253 7.6245 8.7861 20.592 242 32.266 80.382 29.691 26.509 38.248 12.348 243 87.493 76.037 64.364 54.202 52.866 32.110 244 3.9929 62.442 91.329 23.002 27.808 57.715 245 43.125 31.672 87.678 19.105 16.428 48.611 246 51.638 6.7350 70.225 14.187 9.3494 25.409 247 66.079 45.918 66.274 26.496 22.757 27.299 248 0.74401 10.382 39.234 1.8689 1.7543 6.7768 249 32.358 69.996 77.444 27.183 34.110 41.254 250 38.655 2.4066 90.080 14.980 11.200 47.523 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 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.0000 0.010727 9.3233e-03 0.0000 3.9216e-03 0.013642 0.012421 4.1199e-04 7.8431e-03 0.016648 0.015579 2.9755e-03 0.011765 0.019730 0.018814 5.6001e-03 0.015686 0.022904 0.022095 8.2551e-03 0.019608 0.026169 0.025467 0.010986 0.023529 0.029526 0.028901 0.013748 0.027451 0.032990 0.032410 0.016571 0.031373 0.036545 0.035996 0.019455 0.035294 0.040223 0.039658 0.022400 0.039216 0.044007 0.043412 0.025406 0.043137 0.047929 0.047242 0.028473 0.047059 0.051942 0.051164 0.031601 0.050980 0.056031 0.055146 0.034806 0.054902 0.060227 0.059174 0.038056 0.058824 0.064485 0.063233 0.041352 0.062745 0.068788 0.067277 0.044694 0.066667 0.073136 0.071305 0.048066 0.070588 0.077470 0.075288 0.051438 0.074510 0.081773 0.079225 0.054810 0.078431 0.086015 0.083085 0.058183 0.082353 0.090196 0.086870 0.061555 0.086275 0.094331 0.090593 0.064897 0.090196 0.098375 0.094240 0.068193 0.094118 0.10236 0.097810 0.071473 0.098039 0.10623 0.10134 0.074708 0.10196 0.11006 0.10481 0.077928 0.10588 0.11380 0.10825 0.081102 0.10980 0.11746 0.11164 0.084245 0.11373 0.12108 0.11502 0.087343 0.11765 0.12462 0.11839 0.090425 0.12157 0.12810 0.12177 0.093462 0.12549 0.13153 0.12512 0.096468 0.12941 0.13491 0.12850 0.099458 0.13333 0.13822 0.13187 0.10242 0.13725 0.14151 0.13524 0.10536 0.14118 0.14476 0.13861 0.10829 0.14510 0.14800 0.14197 0.11119 0.14902 0.15122 0.14533 0.11408 0.15294 0.15442 0.14868 0.11695 0.15686 0.15764 0.15203 0.11978 0.16078 0.16086 0.15535 0.12261 0.16471 0.16410 0.15866 0.12541 0.16863 0.16738 0.16197 0.12821 0.17255 0.17067 0.16526 0.13098 0.17647 0.17401 0.16855 0.13373 0.18039 0.17739 0.17182 0.13648 0.18431 0.18079 0.17508 0.13919 0.18824 0.18425 0.17835 0.14191 0.19216 0.18773 0.18160 0.14461 0.19608 0.19124 0.18485 0.14731 0.20000 0.19477 0.18810 0.15000 0.20392 0.19832 0.19133 0.15268 0.20784 0.20188 0.19460 0.15537 0.21176 0.20545 0.19786 0.15807 0.21569 0.20899 0.20114 0.16077 0.21961 0.21254 0.20443 0.16349 0.22353 0.21608 0.20774 0.16622 0.22745 0.21962 0.21103 0.16895 0.23137 0.22315 0.21434 0.17169 0.23529 0.22666 0.21767 0.17443 0.23922 0.23017 0.22100 0.17719 0.24314 0.23365 0.22434 0.17996 0.24706 0.23714 0.22768 0.18273 0.25098 0.24063 0.23104 0.18552 0.25490 0.24411 0.23438 0.18833 0.25882 0.24761 0.23774 0.19113 0.26275 0.25110 0.24109 0.19394 0.26667 0.25460 0.24443 0.19677 0.27059 0.25809 0.24779 0.19957 0.27451 0.26160 0.25113 0.20241 0.27843 0.26509 0.25447 0.20523 0.28235 0.26860 0.25783 0.20807 0.28627 0.27208 0.26117 0.21091 0.29020 0.27556 0.26453 0.21376 0.29412 0.27904 0.26789 0.21662 0.29804 0.28251 0.27124 0.21949 0.30196 0.28598 0.27462 0.22234 0.30588 0.28943 0.27797 0.22522 0.30980 0.29287 0.28133 0.22811 0.31373 0.29628 0.28470 0.23099 0.31765 0.29970 0.28806 0.23388 0.32157 0.30312 0.29142 0.23677 0.32549 0.30652 0.29477 0.23966 0.32941 0.30993 0.29812 0.24256 0.33333 0.31331 0.30147 0.24543 0.33725 0.31669 0.30481 0.24831 0.34118 0.32009 0.30816 0.25119 0.34510 0.32351 0.31148 0.25406 0.34902 0.32691 0.31482 0.25695 0.35294 0.33033 0.31817 0.25983 0.35686 0.33378 0.32154 0.26271 0.36078 0.33721 0.32491 0.26558 0.36471 0.34066 0.32830 0.26847 0.36863 0.34415 0.33170 0.27134 0.37255 0.34766 0.33510 0.27422 0.37647 0.35119 0.33854 0.27709 0.38039 0.35476 0.34199 0.27994 0.38431 0.35833 0.34546 0.28278 0.38824 0.36191 0.34894 0.28560 0.39216 0.36553 0.35247 0.28843 0.39608 0.36918 0.35601 0.29123 0.40000 0.37281 0.35956 0.29407 0.40392 0.37647 0.36313 0.29689 0.40784 0.38015 0.36672 0.29970 0.41176 0.38384 0.37031 0.30253 0.41569 0.38755 0.37394 0.30536 0.41961 0.39129 0.37758 0.30819 0.42353 0.39506 0.38125 0.31104 0.42745 0.39883 0.38492 0.31389 0.43137 0.40259 0.38863 0.31678 0.43529 0.40635 0.39236 0.31966 0.43922 0.41012 0.39612 0.32256 0.44314 0.41392 0.39988 0.32547 0.44706 0.41775 0.40365 0.32839 0.45098 0.42161 0.40743 0.33132 0.45490 0.42547 0.41122 0.33426 0.45882 0.42931 0.41505 0.33722 0.46275 0.43316 0.41888 0.34022 0.46667 0.43700 0.42271 0.34321 0.47059 0.44088 0.42654 0.34623 0.47451 0.44477 0.43037 0.34923 0.47843 0.44866 0.43420 0.35229 0.48235 0.45257 0.43804 0.35534 0.48627 0.45647 0.44189 0.35839 0.49020 0.46040 0.44575 0.36147 0.49412 0.46435 0.44962 0.36455 0.49804 0.46828 0.45351 0.36765 0.50196 0.47225 0.45742 0.37076 0.50588 0.47625 0.46133 0.37391 0.50980 0.48026 0.46525 0.37707 0.51373 0.48429 0.46918 0.38025 0.51765 0.48835 0.47315 0.38347 0.52157 0.49242 0.47710 0.38672 0.52549 0.49653 0.48109 0.39001 0.52941 0.50065 0.48508 0.39330 0.53333 0.50478 0.48907 0.39660 0.53725 0.50893 0.49306 0.39989 0.54118 0.51312 0.49708 0.40323 0.54510 0.51730 0.50111 0.40658 0.54902 0.52148 0.50510 0.40996 0.55294 0.52567 0.50913 0.41337 0.55686 0.52987 0.51318 0.41677 0.56078 0.53408 0.51722 0.42019 0.56471 0.53829 0.52128 0.42361 0.56863 0.54250 0.52534 0.42704 0.57255 0.54675 0.52943 0.43049 0.57647 0.55099 0.53352 0.43394 0.58039 0.55521 0.53761 0.43740 0.58431 0.55946 0.54173 0.44089 0.58824 0.56370 0.54586 0.44437 0.59216 0.56796 0.55000 0.44788 0.59608 0.57218 0.55416 0.45139 0.60000 0.57642 0.55834 0.45493 0.60392 0.58067 0.56255 0.45847 0.60784 0.58494 0.56680 0.46201 0.61176 0.58923 0.57105 0.46558 0.61569 0.59348 0.57533 0.46918 0.61961 0.59774 0.57961 0.47279 0.62353 0.60201 0.58395 0.47642 0.62745 0.60630 0.58830 0.48006 0.63137 0.61059 0.59265 0.48371 0.63529 0.61488 0.59702 0.48739 0.63922 0.61917 0.60142 0.49107 0.64314 0.62342 0.60581 0.49477 0.64706 0.62773 0.61022 0.49850 0.65098 0.63204 0.61465 0.50224 0.65490 0.63639 0.61907 0.50600 0.65882 0.64080 0.62354 0.50980 0.66275 0.64524 0.62802 0.51360 0.66667 0.64971 0.63252 0.51743 0.67059 0.65420 0.63700 0.52129 0.67451 0.65867 0.64154 0.52515 0.67843 0.66310 0.64611 0.52905 0.68235 0.66748 0.65074 0.53297 0.68627 0.67182 0.65537 0.53692 0.69020 0.67620 0.66001 0.54089 0.69412 0.68064 0.66461 0.54488 0.69804 0.68513 0.66917 0.54890 0.70196 0.68966 0.67373 0.55294 0.70588 0.69419 0.67831 0.55702 0.70980 0.69873 0.68292 0.56115 0.71373 0.70323 0.68756 0.56532 0.71765 0.70768 0.69216 0.56950 0.72157 0.71211 0.69676 0.57372 0.72549 0.71653 0.70127 0.57800 0.72941 0.72093 0.70578 0.58231 0.73333 0.72535 0.71025 0.58666 0.73725 0.72979 0.71473 0.59103 0.74118 0.73425 0.71920 0.59541 0.74510 0.73870 0.72366 0.59982 0.74902 0.74314 0.72811 0.60426 0.75294 0.74755 0.73257 0.60871 0.75686 0.75198 0.73704 0.61318 0.76078 0.75639 0.74150 0.61769 0.76471 0.76080 0.74595 0.62222 0.76863 0.76518 0.75042 0.62679 0.77255 0.76954 0.75486 0.63143 0.77647 0.77388 0.75933 0.63613 0.78039 0.77823 0.76378 0.64086 0.78431 0.78256 0.76825 0.64567 0.78824 0.78689 0.77272 0.65052 0.79216 0.79124 0.77720 0.65541 0.79608 0.79556 0.78170 0.66029 0.80000 0.79983 0.78624 0.66516 0.80392 0.80406 0.79078 0.67007 0.80784 0.80830 0.79536 0.67507 0.81176 0.81254 0.79992 0.68019 0.81569 0.81678 0.80446 0.68537 0.81961 0.82100 0.80902 0.69059 0.82353 0.82519 0.81360 0.69581 0.82745 0.82936 0.81814 0.70105 0.83137 0.83352 0.82267 0.70628 0.83529 0.83767 0.82718 0.71151 0.83922 0.84186 0.83166 0.71676 0.84314 0.84602 0.83616 0.72204 0.84706 0.85020 0.84063 0.72734 0.85098 0.85435 0.84511 0.73268 0.85490 0.85849 0.84959 0.73803 0.85882 0.86261 0.85408 0.74342 0.86275 0.86674 0.85853 0.74882 0.86667 0.87086 0.86300 0.75427 0.87059 0.87497 0.86746 0.75975 0.87451 0.87903 0.87190 0.76527 0.87843 0.88307 0.87630 0.77086 0.88235 0.88710 0.88067 0.77655 0.88627 0.89110 0.88501 0.78235 0.89020 0.89506 0.88931 0.78833 0.89412 0.89903 0.89355 0.79445 0.89804 0.90295 0.89776 0.80072 0.90196 0.90687 0.90193 0.80719 0.90588 0.91075 0.90605 0.81386 0.90980 0.91461 0.91014 0.82068 0.91373 0.91846 0.91420 0.82760 0.91765 0.92227 0.91824 0.83465 0.92157 0.92607 0.92226 0.84178 0.92549 0.92985 0.92625 0.84898 0.92941 0.93362 0.93024 0.85621 0.93333 0.93738 0.93420 0.86349 0.93725 0.94113 0.93817 0.87086 0.94118 0.94487 0.94212 0.87826 0.94510 0.94861 0.94606 0.88579 0.94902 0.95235 0.95000 0.89339 0.95294 0.95607 0.95392 0.90111 0.95686 0.95979 0.95782 0.90887 0.96078 0.96352 0.96175 0.91670 0.96471 0.96721 0.96564 0.92459 0.96863 0.97090 0.96950 0.93259 0.97255 0.97456 0.97336 0.94067 0.97647 0.97824 0.97720 0.94890 0.98039 0.98189 0.98103 0.95718 0.98431 0.98553 0.98486 0.96556 0.98824 0.98917 0.98866 0.97404 0.99216 0.99278 0.99245 0.98260 0.99608 0.99640 0.99623 0.99126 1.0000 1.0000 1.0000 1.0000 END_DATA dict 0@EDID_md5f09e42aa86585d1bb6687d3c322ed0c1lcms2-2.19.1/testbed/new.icc0000644000175000017500000020330415176573557014570 0ustar martimartilcms@mntrRGB XYZ  .acspAPPL????????-lcmsΌ΋Ԓ:*#-wdeschcprt*dmndedmddglumiwtptbkptclrt$~vcgtrXYZ gXYZ bXYZ rTRC  gTRC  bTRC  targRDevDb,RCIED@RmetaTpdesc*Huey, LENOVO - 6464Y1H - 15" (2009-12-23)textCopyright (c) 2009 Richard Hughesdesc IBM Francedesc ThinkPad T61XYZ XYZ @ڲXYZ WUclrtRed4QGreen3QBlueT vcgt~C r [ L D E LXk&/42-" !"#b$:%%&'([).**+,-i.H/+00123456i7Q899 ::;<=>~?c@HA-BBCDEFGoHRI6JJKLMNxOWP5QQRSTUrVSW5XYYZ[\]^_p``aQbCc6d+e"fghhijklmnopqrstuvwxyz{}~*9I[m͊ "8Nezח6Oh͢ .Sy߫>dߴ*Lnӻ>_9Uqʎ˩,?Paq׃ؔ٦ڶ"&'(&# |m\K9&c.fL 7 '   &09AFHE=1  rO,  !"#|$X%4&&'()w*N+&+,-.}/R0'0123~4U5.66789n:I;%<<=>?o@JA%BBCDEpFMG)HHIJKvLQM-NNOPQsRPS-T TUVWXpYTZ;[#\ \]^_`abc}dqehf^gUhMiEj@k;l6m1n,o'p#qrstuvwxy z#{(|.}3~9@HNV_hr|̍ݎ0Ha}֙7Y{š;gƨ#NyӰ1^ҶAeҾ>cÆīFp˜GqҚ3X~ڤ4Ts#'+.0233430-)$o>J q N +uL \&v8w4c  !"<"#$T%%&f''(w)()*+@+,-\../~06012_3345D567t8089:e;";<=Z>>?@NA ABCACDEvF3FGHdIIJKHLLMrN,NOP[QQRSRTTUVTWWXYgZ/Z[\]S^^_`aXb+ccdef_g:hhijklqmRn4oopqrstvu^vFw0xyyz{|}~{vspopsw}ʒߓ/MlԜ Iu٤JȩGѮ tʲ wζ%}׺2P~VG`ΣXի~V0 .ZXYZ g:XYZ ge #/XYZ '! curv566789<?CHMT\dny2Mi6_DxYY.xd `  m * R b @%yqopw,C^}5a !.!"k# #$X%%&Z' '(w)1)*+s,:--./0[1:233456789:;= >?7@TAsBCDEG!HHIoJKLN O2PYQRSTV+WYXYZ\(]a^_abbcef[gijzkmDnpqstuwyxz||}/ą^A던JƔZ*՝q_Y_qϱ2]׿'BȨ͏}aI޻(FEcurv>>>?@CEIMSY`ir}0Je+R{/`8r-n? of  m % G  w K %w`OD>=BKYk -V%g !]" "#j$$%&I''()Q**+,-].7//0123456789|:z;y}?@ABCDEFGHIJKMN'OEPhQRSUаq_ާ+cd*#Rcurv   )2=IVdt 'DcCn/c J O&r`  ^  m * Q  ^9vdVLFCDGMU`p+ M !v""#F#$%+%&~','()M* *+,W-$-./01e2M3:4-5$6 78#9+:7;G?@ABD E'FCG`H|IJKLMOP(Q?RUSlTUVWXZ[<\i]^` aKbce?fh iyjl\moLprWsuvw xz8{}q^ v1񌶎R0Bp԰ @dϾq7ǡ̞.ѺCLH!HtFtextCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "LUMINANCE_XYZ_CDM2" LUMINANCE_XYZ_CDM2 "127.028906 131.252608 110.265656" 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 250 BEGIN_DATA 1 100.00 100.00 100.00 96.782 100.00 84.010 2 100.00 100.00 100.00 96.777 100.01 84.020 3 100.00 100.00 100.00 96.788 100.01 84.020 4 100.00 100.00 100.00 96.772 100.01 84.031 5 31.885 32.743 34.098 7.1032 7.3802 6.8529 6 100.00 0.0000 100.00 55.780 36.372 72.216 7 100.00 100.00 0.0000 80.854 85.328 14.457 8 0.0000 100.00 100.00 56.563 77.910 81.478 9 0.0000 100.00 0.0000 40.875 63.371 11.930 10 0.0000 0.0000 100.00 15.810 14.641 69.711 11 100.00 0.0000 0.0000 39.878 21.756 2.7475 12 0.0000 0.0000 0.0000 0.17553 0.17594 0.25002 13 0.0000 51.304 100.00 22.522 25.400 72.122 14 100.00 0.0000 52.136 42.427 23.732 13.824 15 100.00 53.349 100.00 66.148 52.993 75.881 16 100.00 50.680 0.0000 49.155 36.601 5.9995 17 0.0000 0.0000 51.028 2.4104 1.9441 10.620 18 0.0000 47.489 0.0000 5.7397 9.0981 2.2239 19 0.0000 100.00 51.303 44.137 65.955 27.134 20 100.00 100.00 51.850 84.316 88.033 29.972 21 49.802 0.0000 0.0000 6.4137 3.5753 0.86717 22 51.124 100.00 0.0000 47.587 67.171 12.592 23 48.380 100.00 100.00 65.011 82.675 82.298 24 51.210 0.0000 100.00 25.331 19.848 70.617 25 100.00 50.901 49.331 52.066 39.002 18.084 26 51.774 100.00 50.462 52.565 70.678 27.391 27 49.649 52.597 100.00 33.463 33.521 73.671 28 51.542 52.524 0.0000 15.593 17.815 3.9856 29 0.0000 49.855 52.382 9.3552 12.535 16.059 30 50.495 0.0000 52.232 10.396 6.3389 12.078 31 100.00 0.0000 26.371 40.575 22.270 5.3257 32 0.0000 76.339 100.00 33.117 42.238 75.617 33 100.00 26.813 100.00 58.154 40.221 73.093 34 100.00 100.00 26.811 81.805 86.044 18.357 35 0.0000 100.00 26.561 41.683 64.002 15.669 36 0.0000 74.410 0.0000 16.553 26.310 5.8403 37 73.129 100.00 100.00 77.078 89.284 83.240 38 24.348 0.0000 0.0000 1.5806 0.94588 0.39630 39 24.581 100.00 0.0000 42.402 64.305 12.083 40 0.0000 0.0000 23.698 0.60600 0.52986 2.3141 41 100.00 24.746 0.0000 41.937 25.103 3.4946 42 0.0000 0.0000 74.250 5.8374 4.7142 26.433 43 0.0000 22.539 0.0000 1.3574 2.0990 0.67487 44 100.00 74.753 75.649 68.886 62.128 43.069 45 100.00 76.339 0.0000 62.462 57.635 10.241 46 24.206 31.137 100.00 20.445 20.011 70.880 47 25.917 100.00 72.959 50.277 70.535 45.749 48 76.337 0.0000 100.00 38.220 26.844 71.585 49 0.0000 24.325 100.00 17.209 16.902 70.232 50 26.062 0.0000 27.693 2.6404 1.6716 3.2251 51 76.301 0.0000 0.0000 17.471 9.5861 1.8037 52 55.636 60.634 54.991 25.396 27.543 20.720 53 100.00 26.133 71.401 48.116 30.123 30.439 54 100.00 77.105 100.00 78.967 73.238 79.928 55 23.671 0.0000 100.00 17.792 15.732 69.897 56 72.829 0.0000 29.441 18.321 10.226 5.0650 57 0.0000 100.00 76.177 48.934 69.941 49.240 58 100.00 100.00 76.418 89.056 91.989 51.716 59 0.0000 29.974 25.001 2.8197 3.9290 3.7811 60 0.0000 57.015 27.590 9.3374 14.253 6.6740 61 0.0000 28.308 73.540 8.3865 8.2748 30.381 62 76.657 100.00 0.0000 58.486 73.085 13.506 63 64.153 30.592 100.00 34.100 27.580 72.132 64 71.382 21.927 0.0000 16.352 10.568 2.1399 65 100.00 0.0000 76.747 46.215 26.809 31.233 66 27.952 76.398 100.00 38.158 47.484 76.623 67 25.044 23.803 0.0000 3.1989 3.4516 0.94842 68 72.705 100.00 67.176 65.219 78.350 41.182 69 24.328 100.00 100.00 58.674 79.222 81.658 70 64.851 75.219 27.792 34.393 40.055 11.987 71 29.088 75.418 0.0000 21.568 32.158 6.9815 72 34.835 0.0000 75.524 9.7135 6.9067 27.814 73 26.706 100.00 26.286 43.777 65.280 15.882 74 100.00 26.507 23.928 42.870 25.991 6.1375 75 72.058 68.299 100.00 51.802 51.213 76.973 76 100.00 77.005 25.017 63.975 59.343 13.512 77 0.0000 76.928 72.429 24.440 33.728 36.299 78 78.340 69.846 0.0000 35.875 37.663 7.7361 79 66.707 33.434 33.732 18.891 14.189 7.8290 80 34.882 32.846 73.035 13.171 12.155 30.726 81 75.109 100.00 24.682 60.342 74.358 16.877 82 31.212 66.797 38.917 18.813 25.858 12.802 83 68.904 0.0000 75.143 22.341 13.755 28.600 84 76.754 53.206 80.475 38.684 33.327 43.582 85 29.586 54.279 73.897 18.407 21.380 34.674 86 75.371 75.671 53.308 43.274 45.919 23.595 87 56.532 76.867 0.0000 29.508 38.086 8.0739 88 54.003 77.595 77.133 38.695 45.551 43.420 89 24.398 54.999 100.00 26.998 30.453 73.147 90 100.00 76.564 50.245 65.863 60.652 23.156 91 66.860 18.485 62.967 20.587 13.490 21.742 92 24.183 49.695 0.0000 8.8779 12.706 2.9761 93 78.333 0.0000 52.106 23.870 13.663 13.120 94 0.0000 23.637 48.179 3.7379 4.0541 11.297 95 22.616 0.0000 51.502 3.9387 2.7979 10.933 96 0.0000 54.844 76.717 15.263 18.585 36.843 97 100.00 53.854 25.700 51.217 39.263 9.5218 98 100.00 24.647 46.990 44.331 26.934 13.674 99 0.0000 75.599 49.685 19.861 29.364 18.736 100 52.521 50.873 28.108 17.420 18.438 7.5397 101 78.092 100.00 46.699 64.577 77.105 25.944 102 50.291 100.00 24.042 49.033 68.153 15.815 103 50.424 22.665 16.009 9.2454 6.8360 2.6549 104 49.722 100.00 78.883 57.544 74.988 52.621 105 79.368 49.717 100.00 48.282 40.940 74.559 106 100.00 51.006 76.266 56.735 42.868 39.442 107 26.966 48.404 51.309 12.011 14.642 15.944 108 12.885 47.590 21.789 7.5012 11.020 4.7464 109 46.216 23.744 47.696 10.450 8.0488 12.057 110 26.537 79.034 57.906 27.559 38.504 25.533 111 20.035 78.679 16.337 22.591 34.435 8.7121 112 16.510 13.523 16.825 1.7900 1.7041 1.7702 113 80.772 52.239 39.693 33.078 27.980 12.670 114 52.025 78.476 100.00 47.545 54.688 77.922 115 53.644 19.450 81.363 18.926 13.807 39.159 116 76.390 76.738 79.766 50.525 52.251 47.617 117 16.719 20.668 80.444 10.058 8.9001 36.936 118 49.975 75.940 54.965 31.330 39.094 23.463 119 69.366 54.269 19.639 25.409 24.153 6.8096 120 78.357 44.403 54.054 30.871 24.243 18.910 121 86.769 22.037 79.950 37.403 24.170 38.874 122 23.991 100.00 48.167 45.424 66.697 25.173 123 52.705 49.623 76.910 24.219 23.477 37.566 124 83.235 21.483 18.262 25.590 15.580 4.1464 125 21.860 81.987 82.201 34.008 45.513 49.781 126 26.586 30.174 50.611 7.3390 7.3835 13.410 127 46.176 21.625 100.00 24.801 21.044 70.937 128 46.137 76.930 18.751 27.310 36.755 9.5612 129 91.475 88.357 12.710 61.517 65.249 13.071 130 47.690 27.399 0.0000 8.0330 6.7579 1.5938 131 18.097 39.910 80.111 13.722 14.465 39.178 132 50.349 0.0000 22.838 7.8953 4.4977 2.9459 133 17.466 14.543 39.302 3.1271 2.8099 7.1455 134 88.169 58.584 62.262 44.929 37.898 26.976 135 79.316 19.798 100.00 41.429 29.927 72.136 136 35.363 60.522 16.345 15.432 20.828 5.9239 137 12.495 34.970 8.4353 3.9039 5.6312 1.7456 138 11.590 84.378 36.985 27.019 41.132 15.132 139 85.444 85.726 34.888 55.147 59.454 17.245 140 85.787 17.402 36.424 28.453 16.913 8.3840 141 58.643 35.988 52.638 18.012 14.705 15.942 142 81.323 85.139 100.00 68.844 71.876 80.538 143 75.581 44.352 0.0000 23.219 19.240 3.9417 144 15.160 63.749 47.500 15.748 22.422 15.763 145 15.120 11.073 59.779 4.9766 4.1407 17.560 146 86.028 63.414 16.582 40.018 36.610 8.5068 147 18.812 62.643 85.866 23.314 28.403 49.950 148 18.635 62.340 7.9476 13.120 19.901 4.7801 149 36.339 46.262 87.864 21.038 21.293 50.395 150 65.242 88.476 43.595 46.005 56.607 20.611 151 80.989 100.00 84.297 74.943 85.016 60.461 152 64.260 64.440 85.027 37.886 38.184 50.670 153 35.612 10.187 17.227 4.2728 2.8720 2.0278 154 45.235 41.275 11.575 10.744 11.202 3.1960 155 85.017 19.190 57.638 30.797 18.973 18.858 156 89.001 65.879 87.121 55.655 49.365 55.199 157 88.405 92.832 62.808 68.473 73.860 35.158 158 17.469 44.939 63.608 11.395 13.546 23.474 159 80.504 39.649 23.740 27.475 20.347 6.3547 160 43.343 42.624 45.299 13.137 13.443 12.245 161 62.199 90.166 13.536 43.288 55.885 12.147 162 70.382 64.985 39.990 32.692 33.527 14.444 163 63.092 9.8060 47.998 15.628 9.5134 11.663 164 66.260 33.082 79.344 26.255 19.929 38.922 165 12.275 38.293 42.578 6.3997 8.1986 9.9833 166 44.729 63.293 89.315 30.599 33.805 55.854 167 86.795 39.767 90.083 44.341 32.719 54.910 168 33.191 13.557 63.471 8.2257 6.2326 20.467 169 0.0000 80.502 22.254 20.757 32.527 9.3004 170 35.165 87.442 45.762 34.459 48.798 20.511 171 53.417 63.795 12.922 21.988 26.302 6.5595 172 89.333 37.028 40.649 35.328 24.164 11.600 173 61.924 10.479 11.308 12.127 7.1155 2.0297 174 12.932 63.448 65.784 18.065 24.136 28.144 175 35.002 91.990 14.251 36.328 53.552 11.796 176 64.449 90.256 86.679 56.213 66.205 59.305 177 10.665 88.325 62.489 33.596 48.909 30.886 178 63.940 84.034 63.097 44.778 53.082 32.060 179 32.000 18.251 87.257 14.031 11.523 46.040 180 35.653 63.179 55.913 20.158 25.389 21.282 181 65.306 14.719 95.163 29.039 20.848 61.885 182 12.598 97.956 15.904 39.378 60.643 12.953 183 43.443 13.667 2.3608 5.4401 3.6576 0.92719 184 98.776 12.908 14.035 39.533 22.251 3.7953 185 42.232 44.658 62.606 15.929 16.220 23.280 186 5.7304 86.513 87.282 36.670 49.953 57.088 187 71.195 63.035 64.720 35.902 35.055 29.083 188 14.721 0.0000 24.188 1.2792 0.89876 2.4744 189 45.845 91.742 61.379 43.699 58.499 32.373 190 20.168 99.403 86.193 52.928 73.203 61.291 191 15.692 16.462 98.892 17.172 15.886 69.143 192 49.711 33.832 30.462 11.632 10.157 6.1786 193 92.778 86.752 83.442 72.329 72.554 55.382 194 36.175 85.461 71.738 37.083 49.576 38.944 195 56.241 41.455 91.468 27.602 24.111 56.814 196 63.698 49.811 44.158 23.262 21.617 13.662 197 13.503 85.866 0.84329 26.655 41.607 8.7405 198 50.699 14.090 33.318 9.4038 6.1358 5.8677 199 92.677 38.376 11.214 36.660 25.036 4.8570 200 88.086 68.014 37.675 46.350 43.023 14.745 201 86.614 18.702 0.67590 25.468 15.095 2.6278 202 16.608 0.33745 82.586 8.6870 6.8624 35.442 203 32.618 49.231 35.380 11.728 14.545 8.8331 204 39.446 87.298 89.309 44.627 57.160 61.307 205 89.388 7.1485 88.115 40.442 25.084 47.530 206 65.767 34.460 14.625 17.275 13.256 3.7698 207 84.147 1.8202 16.654 24.638 13.568 3.3843 208 16.889 65.227 27.821 14.968 22.334 8.5395 209 44.534 84.792 4.0875 31.689 44.876 9.3930 210 66.804 16.467 27.933 16.085 9.9479 5.2045 211 58.514 1.6609 86.699 20.583 13.786 42.312 212 4.6391 51.042 39.609 8.8369 12.694 10.054 213 36.900 7.6973 46.164 6.3700 4.2844 9.9811 214 0.87002 15.107 86.749 10.426 9.1195 44.882 215 30.735 26.754 16.517 4.9434 4.9146 2.4919 216 48.174 63.612 69.758 26.386 29.858 32.524 217 13.565 42.325 96.225 19.720 20.671 65.570 218 50.679 66.092 39.202 23.997 28.917 13.327 219 19.235 27.685 65.367 8.1114 7.8623 23.101 220 49.578 25.709 65.082 14.319 11.100 23.330 221 14.832 83.246 100.00 40.590 53.196 77.677 222 82.546 2.4242 67.048 29.152 17.129 23.053 223 33.942 16.843 32.549 5.2516 4.1097 5.4367 224 81.040 38.112 70.346 33.904 24.732 30.546 225 15.556 11.826 1.2429 1.2368 1.2292 0.48138 226 16.070 28.919 29.585 3.9659 4.7704 4.9137 227 49.118 89.394 35.809 38.873 52.843 16.831 228 99.042 12.511 70.128 45.566 26.901 27.920 229 62.910 46.590 2.6010 17.842 16.999 3.6820 230 2.6256 14.517 68.056 5.8511 5.1761 23.910 231 1.1839 16.197 20.949 1.2511 1.5596 2.3249 232 89.271 1.0849 39.328 30.650 17.054 8.2370 233 100.00 31.073 85.483 52.649 34.793 46.962 234 95.707 39.925 60.884 45.356 31.307 23.501 235 72.034 26.792 47.480 21.993 14.839 12.971 236 74.942 79.821 13.360 41.681 47.180 10.494 237 2.1562 64.147 13.993 11.998 18.939 5.1968 238 29.116 42.872 16.700 7.8853 9.9731 3.6404 239 71.555 16.349 81.097 26.938 17.794 38.944 240 0.49326 39.374 86.691 13.684 14.195 47.050 241 2.2551 37.126 61.253 7.6245 8.7861 20.592 242 32.266 80.382 29.691 26.509 38.248 12.348 243 87.493 76.037 64.364 54.202 52.866 32.110 244 3.9929 62.442 91.329 23.002 27.808 57.715 245 43.125 31.672 87.678 19.105 16.428 48.611 246 51.638 6.7350 70.225 14.187 9.3494 25.409 247 66.079 45.918 66.274 26.496 22.757 27.299 248 0.74401 10.382 39.234 1.8689 1.7543 6.7768 249 32.358 69.996 77.444 27.183 34.110 41.254 250 38.655 2.4066 90.080 14.980 11.200 47.523 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 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.0000 0.010727 9.3233e-03 0.0000 3.9216e-03 0.013642 0.012421 4.1199e-04 7.8431e-03 0.016648 0.015579 2.9755e-03 0.011765 0.019730 0.018814 5.6001e-03 0.015686 0.022904 0.022095 8.2551e-03 0.019608 0.026169 0.025467 0.010986 0.023529 0.029526 0.028901 0.013748 0.027451 0.032990 0.032410 0.016571 0.031373 0.036545 0.035996 0.019455 0.035294 0.040223 0.039658 0.022400 0.039216 0.044007 0.043412 0.025406 0.043137 0.047929 0.047242 0.028473 0.047059 0.051942 0.051164 0.031601 0.050980 0.056031 0.055146 0.034806 0.054902 0.060227 0.059174 0.038056 0.058824 0.064485 0.063233 0.041352 0.062745 0.068788 0.067277 0.044694 0.066667 0.073136 0.071305 0.048066 0.070588 0.077470 0.075288 0.051438 0.074510 0.081773 0.079225 0.054810 0.078431 0.086015 0.083085 0.058183 0.082353 0.090196 0.086870 0.061555 0.086275 0.094331 0.090593 0.064897 0.090196 0.098375 0.094240 0.068193 0.094118 0.10236 0.097810 0.071473 0.098039 0.10623 0.10134 0.074708 0.10196 0.11006 0.10481 0.077928 0.10588 0.11380 0.10825 0.081102 0.10980 0.11746 0.11164 0.084245 0.11373 0.12108 0.11502 0.087343 0.11765 0.12462 0.11839 0.090425 0.12157 0.12810 0.12177 0.093462 0.12549 0.13153 0.12512 0.096468 0.12941 0.13491 0.12850 0.099458 0.13333 0.13822 0.13187 0.10242 0.13725 0.14151 0.13524 0.10536 0.14118 0.14476 0.13861 0.10829 0.14510 0.14800 0.14197 0.11119 0.14902 0.15122 0.14533 0.11408 0.15294 0.15442 0.14868 0.11695 0.15686 0.15764 0.15203 0.11978 0.16078 0.16086 0.15535 0.12261 0.16471 0.16410 0.15866 0.12541 0.16863 0.16738 0.16197 0.12821 0.17255 0.17067 0.16526 0.13098 0.17647 0.17401 0.16855 0.13373 0.18039 0.17739 0.17182 0.13648 0.18431 0.18079 0.17508 0.13919 0.18824 0.18425 0.17835 0.14191 0.19216 0.18773 0.18160 0.14461 0.19608 0.19124 0.18485 0.14731 0.20000 0.19477 0.18810 0.15000 0.20392 0.19832 0.19133 0.15268 0.20784 0.20188 0.19460 0.15537 0.21176 0.20545 0.19786 0.15807 0.21569 0.20899 0.20114 0.16077 0.21961 0.21254 0.20443 0.16349 0.22353 0.21608 0.20774 0.16622 0.22745 0.21962 0.21103 0.16895 0.23137 0.22315 0.21434 0.17169 0.23529 0.22666 0.21767 0.17443 0.23922 0.23017 0.22100 0.17719 0.24314 0.23365 0.22434 0.17996 0.24706 0.23714 0.22768 0.18273 0.25098 0.24063 0.23104 0.18552 0.25490 0.24411 0.23438 0.18833 0.25882 0.24761 0.23774 0.19113 0.26275 0.25110 0.24109 0.19394 0.26667 0.25460 0.24443 0.19677 0.27059 0.25809 0.24779 0.19957 0.27451 0.26160 0.25113 0.20241 0.27843 0.26509 0.25447 0.20523 0.28235 0.26860 0.25783 0.20807 0.28627 0.27208 0.26117 0.21091 0.29020 0.27556 0.26453 0.21376 0.29412 0.27904 0.26789 0.21662 0.29804 0.28251 0.27124 0.21949 0.30196 0.28598 0.27462 0.22234 0.30588 0.28943 0.27797 0.22522 0.30980 0.29287 0.28133 0.22811 0.31373 0.29628 0.28470 0.23099 0.31765 0.29970 0.28806 0.23388 0.32157 0.30312 0.29142 0.23677 0.32549 0.30652 0.29477 0.23966 0.32941 0.30993 0.29812 0.24256 0.33333 0.31331 0.30147 0.24543 0.33725 0.31669 0.30481 0.24831 0.34118 0.32009 0.30816 0.25119 0.34510 0.32351 0.31148 0.25406 0.34902 0.32691 0.31482 0.25695 0.35294 0.33033 0.31817 0.25983 0.35686 0.33378 0.32154 0.26271 0.36078 0.33721 0.32491 0.26558 0.36471 0.34066 0.32830 0.26847 0.36863 0.34415 0.33170 0.27134 0.37255 0.34766 0.33510 0.27422 0.37647 0.35119 0.33854 0.27709 0.38039 0.35476 0.34199 0.27994 0.38431 0.35833 0.34546 0.28278 0.38824 0.36191 0.34894 0.28560 0.39216 0.36553 0.35247 0.28843 0.39608 0.36918 0.35601 0.29123 0.40000 0.37281 0.35956 0.29407 0.40392 0.37647 0.36313 0.29689 0.40784 0.38015 0.36672 0.29970 0.41176 0.38384 0.37031 0.30253 0.41569 0.38755 0.37394 0.30536 0.41961 0.39129 0.37758 0.30819 0.42353 0.39506 0.38125 0.31104 0.42745 0.39883 0.38492 0.31389 0.43137 0.40259 0.38863 0.31678 0.43529 0.40635 0.39236 0.31966 0.43922 0.41012 0.39612 0.32256 0.44314 0.41392 0.39988 0.32547 0.44706 0.41775 0.40365 0.32839 0.45098 0.42161 0.40743 0.33132 0.45490 0.42547 0.41122 0.33426 0.45882 0.42931 0.41505 0.33722 0.46275 0.43316 0.41888 0.34022 0.46667 0.43700 0.42271 0.34321 0.47059 0.44088 0.42654 0.34623 0.47451 0.44477 0.43037 0.34923 0.47843 0.44866 0.43420 0.35229 0.48235 0.45257 0.43804 0.35534 0.48627 0.45647 0.44189 0.35839 0.49020 0.46040 0.44575 0.36147 0.49412 0.46435 0.44962 0.36455 0.49804 0.46828 0.45351 0.36765 0.50196 0.47225 0.45742 0.37076 0.50588 0.47625 0.46133 0.37391 0.50980 0.48026 0.46525 0.37707 0.51373 0.48429 0.46918 0.38025 0.51765 0.48835 0.47315 0.38347 0.52157 0.49242 0.47710 0.38672 0.52549 0.49653 0.48109 0.39001 0.52941 0.50065 0.48508 0.39330 0.53333 0.50478 0.48907 0.39660 0.53725 0.50893 0.49306 0.39989 0.54118 0.51312 0.49708 0.40323 0.54510 0.51730 0.50111 0.40658 0.54902 0.52148 0.50510 0.40996 0.55294 0.52567 0.50913 0.41337 0.55686 0.52987 0.51318 0.41677 0.56078 0.53408 0.51722 0.42019 0.56471 0.53829 0.52128 0.42361 0.56863 0.54250 0.52534 0.42704 0.57255 0.54675 0.52943 0.43049 0.57647 0.55099 0.53352 0.43394 0.58039 0.55521 0.53761 0.43740 0.58431 0.55946 0.54173 0.44089 0.58824 0.56370 0.54586 0.44437 0.59216 0.56796 0.55000 0.44788 0.59608 0.57218 0.55416 0.45139 0.60000 0.57642 0.55834 0.45493 0.60392 0.58067 0.56255 0.45847 0.60784 0.58494 0.56680 0.46201 0.61176 0.58923 0.57105 0.46558 0.61569 0.59348 0.57533 0.46918 0.61961 0.59774 0.57961 0.47279 0.62353 0.60201 0.58395 0.47642 0.62745 0.60630 0.58830 0.48006 0.63137 0.61059 0.59265 0.48371 0.63529 0.61488 0.59702 0.48739 0.63922 0.61917 0.60142 0.49107 0.64314 0.62342 0.60581 0.49477 0.64706 0.62773 0.61022 0.49850 0.65098 0.63204 0.61465 0.50224 0.65490 0.63639 0.61907 0.50600 0.65882 0.64080 0.62354 0.50980 0.66275 0.64524 0.62802 0.51360 0.66667 0.64971 0.63252 0.51743 0.67059 0.65420 0.63700 0.52129 0.67451 0.65867 0.64154 0.52515 0.67843 0.66310 0.64611 0.52905 0.68235 0.66748 0.65074 0.53297 0.68627 0.67182 0.65537 0.53692 0.69020 0.67620 0.66001 0.54089 0.69412 0.68064 0.66461 0.54488 0.69804 0.68513 0.66917 0.54890 0.70196 0.68966 0.67373 0.55294 0.70588 0.69419 0.67831 0.55702 0.70980 0.69873 0.68292 0.56115 0.71373 0.70323 0.68756 0.56532 0.71765 0.70768 0.69216 0.56950 0.72157 0.71211 0.69676 0.57372 0.72549 0.71653 0.70127 0.57800 0.72941 0.72093 0.70578 0.58231 0.73333 0.72535 0.71025 0.58666 0.73725 0.72979 0.71473 0.59103 0.74118 0.73425 0.71920 0.59541 0.74510 0.73870 0.72366 0.59982 0.74902 0.74314 0.72811 0.60426 0.75294 0.74755 0.73257 0.60871 0.75686 0.75198 0.73704 0.61318 0.76078 0.75639 0.74150 0.61769 0.76471 0.76080 0.74595 0.62222 0.76863 0.76518 0.75042 0.62679 0.77255 0.76954 0.75486 0.63143 0.77647 0.77388 0.75933 0.63613 0.78039 0.77823 0.76378 0.64086 0.78431 0.78256 0.76825 0.64567 0.78824 0.78689 0.77272 0.65052 0.79216 0.79124 0.77720 0.65541 0.79608 0.79556 0.78170 0.66029 0.80000 0.79983 0.78624 0.66516 0.80392 0.80406 0.79078 0.67007 0.80784 0.80830 0.79536 0.67507 0.81176 0.81254 0.79992 0.68019 0.81569 0.81678 0.80446 0.68537 0.81961 0.82100 0.80902 0.69059 0.82353 0.82519 0.81360 0.69581 0.82745 0.82936 0.81814 0.70105 0.83137 0.83352 0.82267 0.70628 0.83529 0.83767 0.82718 0.71151 0.83922 0.84186 0.83166 0.71676 0.84314 0.84602 0.83616 0.72204 0.84706 0.85020 0.84063 0.72734 0.85098 0.85435 0.84511 0.73268 0.85490 0.85849 0.84959 0.73803 0.85882 0.86261 0.85408 0.74342 0.86275 0.86674 0.85853 0.74882 0.86667 0.87086 0.86300 0.75427 0.87059 0.87497 0.86746 0.75975 0.87451 0.87903 0.87190 0.76527 0.87843 0.88307 0.87630 0.77086 0.88235 0.88710 0.88067 0.77655 0.88627 0.89110 0.88501 0.78235 0.89020 0.89506 0.88931 0.78833 0.89412 0.89903 0.89355 0.79445 0.89804 0.90295 0.89776 0.80072 0.90196 0.90687 0.90193 0.80719 0.90588 0.91075 0.90605 0.81386 0.90980 0.91461 0.91014 0.82068 0.91373 0.91846 0.91420 0.82760 0.91765 0.92227 0.91824 0.83465 0.92157 0.92607 0.92226 0.84178 0.92549 0.92985 0.92625 0.84898 0.92941 0.93362 0.93024 0.85621 0.93333 0.93738 0.93420 0.86349 0.93725 0.94113 0.93817 0.87086 0.94118 0.94487 0.94212 0.87826 0.94510 0.94861 0.94606 0.88579 0.94902 0.95235 0.95000 0.89339 0.95294 0.95607 0.95392 0.90111 0.95686 0.95979 0.95782 0.90887 0.96078 0.96352 0.96175 0.91670 0.96471 0.96721 0.96564 0.92459 0.96863 0.97090 0.96950 0.93259 0.97255 0.97456 0.97336 0.94067 0.97647 0.97824 0.97720 0.94890 0.98039 0.98189 0.98103 0.95718 0.98431 0.98553 0.98486 0.96556 0.98824 0.98917 0.98866 0.97404 0.99216 0.99278 0.99245 0.98260 0.99608 0.99640 0.99623 0.99126 1.0000 1.0000 1.0000 1.0000 END_DATA textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "LUMINANCE_XYZ_CDM2" LUMINANCE_XYZ_CDM2 "127.028906 131.252608 110.265656" 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 250 BEGIN_DATA 1 100.00 100.00 100.00 96.782 100.00 84.010 2 100.00 100.00 100.00 96.777 100.01 84.020 3 100.00 100.00 100.00 96.788 100.01 84.020 4 100.00 100.00 100.00 96.772 100.01 84.031 5 31.885 32.743 34.098 7.1032 7.3802 6.8529 6 100.00 0.0000 100.00 55.780 36.372 72.216 7 100.00 100.00 0.0000 80.854 85.328 14.457 8 0.0000 100.00 100.00 56.563 77.910 81.478 9 0.0000 100.00 0.0000 40.875 63.371 11.930 10 0.0000 0.0000 100.00 15.810 14.641 69.711 11 100.00 0.0000 0.0000 39.878 21.756 2.7475 12 0.0000 0.0000 0.0000 0.17553 0.17594 0.25002 13 0.0000 51.304 100.00 22.522 25.400 72.122 14 100.00 0.0000 52.136 42.427 23.732 13.824 15 100.00 53.349 100.00 66.148 52.993 75.881 16 100.00 50.680 0.0000 49.155 36.601 5.9995 17 0.0000 0.0000 51.028 2.4104 1.9441 10.620 18 0.0000 47.489 0.0000 5.7397 9.0981 2.2239 19 0.0000 100.00 51.303 44.137 65.955 27.134 20 100.00 100.00 51.850 84.316 88.033 29.972 21 49.802 0.0000 0.0000 6.4137 3.5753 0.86717 22 51.124 100.00 0.0000 47.587 67.171 12.592 23 48.380 100.00 100.00 65.011 82.675 82.298 24 51.210 0.0000 100.00 25.331 19.848 70.617 25 100.00 50.901 49.331 52.066 39.002 18.084 26 51.774 100.00 50.462 52.565 70.678 27.391 27 49.649 52.597 100.00 33.463 33.521 73.671 28 51.542 52.524 0.0000 15.593 17.815 3.9856 29 0.0000 49.855 52.382 9.3552 12.535 16.059 30 50.495 0.0000 52.232 10.396 6.3389 12.078 31 100.00 0.0000 26.371 40.575 22.270 5.3257 32 0.0000 76.339 100.00 33.117 42.238 75.617 33 100.00 26.813 100.00 58.154 40.221 73.093 34 100.00 100.00 26.811 81.805 86.044 18.357 35 0.0000 100.00 26.561 41.683 64.002 15.669 36 0.0000 74.410 0.0000 16.553 26.310 5.8403 37 73.129 100.00 100.00 77.078 89.284 83.240 38 24.348 0.0000 0.0000 1.5806 0.94588 0.39630 39 24.581 100.00 0.0000 42.402 64.305 12.083 40 0.0000 0.0000 23.698 0.60600 0.52986 2.3141 41 100.00 24.746 0.0000 41.937 25.103 3.4946 42 0.0000 0.0000 74.250 5.8374 4.7142 26.433 43 0.0000 22.539 0.0000 1.3574 2.0990 0.67487 44 100.00 74.753 75.649 68.886 62.128 43.069 45 100.00 76.339 0.0000 62.462 57.635 10.241 46 24.206 31.137 100.00 20.445 20.011 70.880 47 25.917 100.00 72.959 50.277 70.535 45.749 48 76.337 0.0000 100.00 38.220 26.844 71.585 49 0.0000 24.325 100.00 17.209 16.902 70.232 50 26.062 0.0000 27.693 2.6404 1.6716 3.2251 51 76.301 0.0000 0.0000 17.471 9.5861 1.8037 52 55.636 60.634 54.991 25.396 27.543 20.720 53 100.00 26.133 71.401 48.116 30.123 30.439 54 100.00 77.105 100.00 78.967 73.238 79.928 55 23.671 0.0000 100.00 17.792 15.732 69.897 56 72.829 0.0000 29.441 18.321 10.226 5.0650 57 0.0000 100.00 76.177 48.934 69.941 49.240 58 100.00 100.00 76.418 89.056 91.989 51.716 59 0.0000 29.974 25.001 2.8197 3.9290 3.7811 60 0.0000 57.015 27.590 9.3374 14.253 6.6740 61 0.0000 28.308 73.540 8.3865 8.2748 30.381 62 76.657 100.00 0.0000 58.486 73.085 13.506 63 64.153 30.592 100.00 34.100 27.580 72.132 64 71.382 21.927 0.0000 16.352 10.568 2.1399 65 100.00 0.0000 76.747 46.215 26.809 31.233 66 27.952 76.398 100.00 38.158 47.484 76.623 67 25.044 23.803 0.0000 3.1989 3.4516 0.94842 68 72.705 100.00 67.176 65.219 78.350 41.182 69 24.328 100.00 100.00 58.674 79.222 81.658 70 64.851 75.219 27.792 34.393 40.055 11.987 71 29.088 75.418 0.0000 21.568 32.158 6.9815 72 34.835 0.0000 75.524 9.7135 6.9067 27.814 73 26.706 100.00 26.286 43.777 65.280 15.882 74 100.00 26.507 23.928 42.870 25.991 6.1375 75 72.058 68.299 100.00 51.802 51.213 76.973 76 100.00 77.005 25.017 63.975 59.343 13.512 77 0.0000 76.928 72.429 24.440 33.728 36.299 78 78.340 69.846 0.0000 35.875 37.663 7.7361 79 66.707 33.434 33.732 18.891 14.189 7.8290 80 34.882 32.846 73.035 13.171 12.155 30.726 81 75.109 100.00 24.682 60.342 74.358 16.877 82 31.212 66.797 38.917 18.813 25.858 12.802 83 68.904 0.0000 75.143 22.341 13.755 28.600 84 76.754 53.206 80.475 38.684 33.327 43.582 85 29.586 54.279 73.897 18.407 21.380 34.674 86 75.371 75.671 53.308 43.274 45.919 23.595 87 56.532 76.867 0.0000 29.508 38.086 8.0739 88 54.003 77.595 77.133 38.695 45.551 43.420 89 24.398 54.999 100.00 26.998 30.453 73.147 90 100.00 76.564 50.245 65.863 60.652 23.156 91 66.860 18.485 62.967 20.587 13.490 21.742 92 24.183 49.695 0.0000 8.8779 12.706 2.9761 93 78.333 0.0000 52.106 23.870 13.663 13.120 94 0.0000 23.637 48.179 3.7379 4.0541 11.297 95 22.616 0.0000 51.502 3.9387 2.7979 10.933 96 0.0000 54.844 76.717 15.263 18.585 36.843 97 100.00 53.854 25.700 51.217 39.263 9.5218 98 100.00 24.647 46.990 44.331 26.934 13.674 99 0.0000 75.599 49.685 19.861 29.364 18.736 100 52.521 50.873 28.108 17.420 18.438 7.5397 101 78.092 100.00 46.699 64.577 77.105 25.944 102 50.291 100.00 24.042 49.033 68.153 15.815 103 50.424 22.665 16.009 9.2454 6.8360 2.6549 104 49.722 100.00 78.883 57.544 74.988 52.621 105 79.368 49.717 100.00 48.282 40.940 74.559 106 100.00 51.006 76.266 56.735 42.868 39.442 107 26.966 48.404 51.309 12.011 14.642 15.944 108 12.885 47.590 21.789 7.5012 11.020 4.7464 109 46.216 23.744 47.696 10.450 8.0488 12.057 110 26.537 79.034 57.906 27.559 38.504 25.533 111 20.035 78.679 16.337 22.591 34.435 8.7121 112 16.510 13.523 16.825 1.7900 1.7041 1.7702 113 80.772 52.239 39.693 33.078 27.980 12.670 114 52.025 78.476 100.00 47.545 54.688 77.922 115 53.644 19.450 81.363 18.926 13.807 39.159 116 76.390 76.738 79.766 50.525 52.251 47.617 117 16.719 20.668 80.444 10.058 8.9001 36.936 118 49.975 75.940 54.965 31.330 39.094 23.463 119 69.366 54.269 19.639 25.409 24.153 6.8096 120 78.357 44.403 54.054 30.871 24.243 18.910 121 86.769 22.037 79.950 37.403 24.170 38.874 122 23.991 100.00 48.167 45.424 66.697 25.173 123 52.705 49.623 76.910 24.219 23.477 37.566 124 83.235 21.483 18.262 25.590 15.580 4.1464 125 21.860 81.987 82.201 34.008 45.513 49.781 126 26.586 30.174 50.611 7.3390 7.3835 13.410 127 46.176 21.625 100.00 24.801 21.044 70.937 128 46.137 76.930 18.751 27.310 36.755 9.5612 129 91.475 88.357 12.710 61.517 65.249 13.071 130 47.690 27.399 0.0000 8.0330 6.7579 1.5938 131 18.097 39.910 80.111 13.722 14.465 39.178 132 50.349 0.0000 22.838 7.8953 4.4977 2.9459 133 17.466 14.543 39.302 3.1271 2.8099 7.1455 134 88.169 58.584 62.262 44.929 37.898 26.976 135 79.316 19.798 100.00 41.429 29.927 72.136 136 35.363 60.522 16.345 15.432 20.828 5.9239 137 12.495 34.970 8.4353 3.9039 5.6312 1.7456 138 11.590 84.378 36.985 27.019 41.132 15.132 139 85.444 85.726 34.888 55.147 59.454 17.245 140 85.787 17.402 36.424 28.453 16.913 8.3840 141 58.643 35.988 52.638 18.012 14.705 15.942 142 81.323 85.139 100.00 68.844 71.876 80.538 143 75.581 44.352 0.0000 23.219 19.240 3.9417 144 15.160 63.749 47.500 15.748 22.422 15.763 145 15.120 11.073 59.779 4.9766 4.1407 17.560 146 86.028 63.414 16.582 40.018 36.610 8.5068 147 18.812 62.643 85.866 23.314 28.403 49.950 148 18.635 62.340 7.9476 13.120 19.901 4.7801 149 36.339 46.262 87.864 21.038 21.293 50.395 150 65.242 88.476 43.595 46.005 56.607 20.611 151 80.989 100.00 84.297 74.943 85.016 60.461 152 64.260 64.440 85.027 37.886 38.184 50.670 153 35.612 10.187 17.227 4.2728 2.8720 2.0278 154 45.235 41.275 11.575 10.744 11.202 3.1960 155 85.017 19.190 57.638 30.797 18.973 18.858 156 89.001 65.879 87.121 55.655 49.365 55.199 157 88.405 92.832 62.808 68.473 73.860 35.158 158 17.469 44.939 63.608 11.395 13.546 23.474 159 80.504 39.649 23.740 27.475 20.347 6.3547 160 43.343 42.624 45.299 13.137 13.443 12.245 161 62.199 90.166 13.536 43.288 55.885 12.147 162 70.382 64.985 39.990 32.692 33.527 14.444 163 63.092 9.8060 47.998 15.628 9.5134 11.663 164 66.260 33.082 79.344 26.255 19.929 38.922 165 12.275 38.293 42.578 6.3997 8.1986 9.9833 166 44.729 63.293 89.315 30.599 33.805 55.854 167 86.795 39.767 90.083 44.341 32.719 54.910 168 33.191 13.557 63.471 8.2257 6.2326 20.467 169 0.0000 80.502 22.254 20.757 32.527 9.3004 170 35.165 87.442 45.762 34.459 48.798 20.511 171 53.417 63.795 12.922 21.988 26.302 6.5595 172 89.333 37.028 40.649 35.328 24.164 11.600 173 61.924 10.479 11.308 12.127 7.1155 2.0297 174 12.932 63.448 65.784 18.065 24.136 28.144 175 35.002 91.990 14.251 36.328 53.552 11.796 176 64.449 90.256 86.679 56.213 66.205 59.305 177 10.665 88.325 62.489 33.596 48.909 30.886 178 63.940 84.034 63.097 44.778 53.082 32.060 179 32.000 18.251 87.257 14.031 11.523 46.040 180 35.653 63.179 55.913 20.158 25.389 21.282 181 65.306 14.719 95.163 29.039 20.848 61.885 182 12.598 97.956 15.904 39.378 60.643 12.953 183 43.443 13.667 2.3608 5.4401 3.6576 0.92719 184 98.776 12.908 14.035 39.533 22.251 3.7953 185 42.232 44.658 62.606 15.929 16.220 23.280 186 5.7304 86.513 87.282 36.670 49.953 57.088 187 71.195 63.035 64.720 35.902 35.055 29.083 188 14.721 0.0000 24.188 1.2792 0.89876 2.4744 189 45.845 91.742 61.379 43.699 58.499 32.373 190 20.168 99.403 86.193 52.928 73.203 61.291 191 15.692 16.462 98.892 17.172 15.886 69.143 192 49.711 33.832 30.462 11.632 10.157 6.1786 193 92.778 86.752 83.442 72.329 72.554 55.382 194 36.175 85.461 71.738 37.083 49.576 38.944 195 56.241 41.455 91.468 27.602 24.111 56.814 196 63.698 49.811 44.158 23.262 21.617 13.662 197 13.503 85.866 0.84329 26.655 41.607 8.7405 198 50.699 14.090 33.318 9.4038 6.1358 5.8677 199 92.677 38.376 11.214 36.660 25.036 4.8570 200 88.086 68.014 37.675 46.350 43.023 14.745 201 86.614 18.702 0.67590 25.468 15.095 2.6278 202 16.608 0.33745 82.586 8.6870 6.8624 35.442 203 32.618 49.231 35.380 11.728 14.545 8.8331 204 39.446 87.298 89.309 44.627 57.160 61.307 205 89.388 7.1485 88.115 40.442 25.084 47.530 206 65.767 34.460 14.625 17.275 13.256 3.7698 207 84.147 1.8202 16.654 24.638 13.568 3.3843 208 16.889 65.227 27.821 14.968 22.334 8.5395 209 44.534 84.792 4.0875 31.689 44.876 9.3930 210 66.804 16.467 27.933 16.085 9.9479 5.2045 211 58.514 1.6609 86.699 20.583 13.786 42.312 212 4.6391 51.042 39.609 8.8369 12.694 10.054 213 36.900 7.6973 46.164 6.3700 4.2844 9.9811 214 0.87002 15.107 86.749 10.426 9.1195 44.882 215 30.735 26.754 16.517 4.9434 4.9146 2.4919 216 48.174 63.612 69.758 26.386 29.858 32.524 217 13.565 42.325 96.225 19.720 20.671 65.570 218 50.679 66.092 39.202 23.997 28.917 13.327 219 19.235 27.685 65.367 8.1114 7.8623 23.101 220 49.578 25.709 65.082 14.319 11.100 23.330 221 14.832 83.246 100.00 40.590 53.196 77.677 222 82.546 2.4242 67.048 29.152 17.129 23.053 223 33.942 16.843 32.549 5.2516 4.1097 5.4367 224 81.040 38.112 70.346 33.904 24.732 30.546 225 15.556 11.826 1.2429 1.2368 1.2292 0.48138 226 16.070 28.919 29.585 3.9659 4.7704 4.9137 227 49.118 89.394 35.809 38.873 52.843 16.831 228 99.042 12.511 70.128 45.566 26.901 27.920 229 62.910 46.590 2.6010 17.842 16.999 3.6820 230 2.6256 14.517 68.056 5.8511 5.1761 23.910 231 1.1839 16.197 20.949 1.2511 1.5596 2.3249 232 89.271 1.0849 39.328 30.650 17.054 8.2370 233 100.00 31.073 85.483 52.649 34.793 46.962 234 95.707 39.925 60.884 45.356 31.307 23.501 235 72.034 26.792 47.480 21.993 14.839 12.971 236 74.942 79.821 13.360 41.681 47.180 10.494 237 2.1562 64.147 13.993 11.998 18.939 5.1968 238 29.116 42.872 16.700 7.8853 9.9731 3.6404 239 71.555 16.349 81.097 26.938 17.794 38.944 240 0.49326 39.374 86.691 13.684 14.195 47.050 241 2.2551 37.126 61.253 7.6245 8.7861 20.592 242 32.266 80.382 29.691 26.509 38.248 12.348 243 87.493 76.037 64.364 54.202 52.866 32.110 244 3.9929 62.442 91.329 23.002 27.808 57.715 245 43.125 31.672 87.678 19.105 16.428 48.611 246 51.638 6.7350 70.225 14.187 9.3494 25.409 247 66.079 45.918 66.274 26.496 22.757 27.299 248 0.74401 10.382 39.234 1.8689 1.7543 6.7768 249 32.358 69.996 77.444 27.183 34.110 41.254 250 38.655 2.4066 90.080 14.980 11.200 47.523 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 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.0000 0.010727 9.3233e-03 0.0000 3.9216e-03 0.013642 0.012421 4.1199e-04 7.8431e-03 0.016648 0.015579 2.9755e-03 0.011765 0.019730 0.018814 5.6001e-03 0.015686 0.022904 0.022095 8.2551e-03 0.019608 0.026169 0.025467 0.010986 0.023529 0.029526 0.028901 0.013748 0.027451 0.032990 0.032410 0.016571 0.031373 0.036545 0.035996 0.019455 0.035294 0.040223 0.039658 0.022400 0.039216 0.044007 0.043412 0.025406 0.043137 0.047929 0.047242 0.028473 0.047059 0.051942 0.051164 0.031601 0.050980 0.056031 0.055146 0.034806 0.054902 0.060227 0.059174 0.038056 0.058824 0.064485 0.063233 0.041352 0.062745 0.068788 0.067277 0.044694 0.066667 0.073136 0.071305 0.048066 0.070588 0.077470 0.075288 0.051438 0.074510 0.081773 0.079225 0.054810 0.078431 0.086015 0.083085 0.058183 0.082353 0.090196 0.086870 0.061555 0.086275 0.094331 0.090593 0.064897 0.090196 0.098375 0.094240 0.068193 0.094118 0.10236 0.097810 0.071473 0.098039 0.10623 0.10134 0.074708 0.10196 0.11006 0.10481 0.077928 0.10588 0.11380 0.10825 0.081102 0.10980 0.11746 0.11164 0.084245 0.11373 0.12108 0.11502 0.087343 0.11765 0.12462 0.11839 0.090425 0.12157 0.12810 0.12177 0.093462 0.12549 0.13153 0.12512 0.096468 0.12941 0.13491 0.12850 0.099458 0.13333 0.13822 0.13187 0.10242 0.13725 0.14151 0.13524 0.10536 0.14118 0.14476 0.13861 0.10829 0.14510 0.14800 0.14197 0.11119 0.14902 0.15122 0.14533 0.11408 0.15294 0.15442 0.14868 0.11695 0.15686 0.15764 0.15203 0.11978 0.16078 0.16086 0.15535 0.12261 0.16471 0.16410 0.15866 0.12541 0.16863 0.16738 0.16197 0.12821 0.17255 0.17067 0.16526 0.13098 0.17647 0.17401 0.16855 0.13373 0.18039 0.17739 0.17182 0.13648 0.18431 0.18079 0.17508 0.13919 0.18824 0.18425 0.17835 0.14191 0.19216 0.18773 0.18160 0.14461 0.19608 0.19124 0.18485 0.14731 0.20000 0.19477 0.18810 0.15000 0.20392 0.19832 0.19133 0.15268 0.20784 0.20188 0.19460 0.15537 0.21176 0.20545 0.19786 0.15807 0.21569 0.20899 0.20114 0.16077 0.21961 0.21254 0.20443 0.16349 0.22353 0.21608 0.20774 0.16622 0.22745 0.21962 0.21103 0.16895 0.23137 0.22315 0.21434 0.17169 0.23529 0.22666 0.21767 0.17443 0.23922 0.23017 0.22100 0.17719 0.24314 0.23365 0.22434 0.17996 0.24706 0.23714 0.22768 0.18273 0.25098 0.24063 0.23104 0.18552 0.25490 0.24411 0.23438 0.18833 0.25882 0.24761 0.23774 0.19113 0.26275 0.25110 0.24109 0.19394 0.26667 0.25460 0.24443 0.19677 0.27059 0.25809 0.24779 0.19957 0.27451 0.26160 0.25113 0.20241 0.27843 0.26509 0.25447 0.20523 0.28235 0.26860 0.25783 0.20807 0.28627 0.27208 0.26117 0.21091 0.29020 0.27556 0.26453 0.21376 0.29412 0.27904 0.26789 0.21662 0.29804 0.28251 0.27124 0.21949 0.30196 0.28598 0.27462 0.22234 0.30588 0.28943 0.27797 0.22522 0.30980 0.29287 0.28133 0.22811 0.31373 0.29628 0.28470 0.23099 0.31765 0.29970 0.28806 0.23388 0.32157 0.30312 0.29142 0.23677 0.32549 0.30652 0.29477 0.23966 0.32941 0.30993 0.29812 0.24256 0.33333 0.31331 0.30147 0.24543 0.33725 0.31669 0.30481 0.24831 0.34118 0.32009 0.30816 0.25119 0.34510 0.32351 0.31148 0.25406 0.34902 0.32691 0.31482 0.25695 0.35294 0.33033 0.31817 0.25983 0.35686 0.33378 0.32154 0.26271 0.36078 0.33721 0.32491 0.26558 0.36471 0.34066 0.32830 0.26847 0.36863 0.34415 0.33170 0.27134 0.37255 0.34766 0.33510 0.27422 0.37647 0.35119 0.33854 0.27709 0.38039 0.35476 0.34199 0.27994 0.38431 0.35833 0.34546 0.28278 0.38824 0.36191 0.34894 0.28560 0.39216 0.36553 0.35247 0.28843 0.39608 0.36918 0.35601 0.29123 0.40000 0.37281 0.35956 0.29407 0.40392 0.37647 0.36313 0.29689 0.40784 0.38015 0.36672 0.29970 0.41176 0.38384 0.37031 0.30253 0.41569 0.38755 0.37394 0.30536 0.41961 0.39129 0.37758 0.30819 0.42353 0.39506 0.38125 0.31104 0.42745 0.39883 0.38492 0.31389 0.43137 0.40259 0.38863 0.31678 0.43529 0.40635 0.39236 0.31966 0.43922 0.41012 0.39612 0.32256 0.44314 0.41392 0.39988 0.32547 0.44706 0.41775 0.40365 0.32839 0.45098 0.42161 0.40743 0.33132 0.45490 0.42547 0.41122 0.33426 0.45882 0.42931 0.41505 0.33722 0.46275 0.43316 0.41888 0.34022 0.46667 0.43700 0.42271 0.34321 0.47059 0.44088 0.42654 0.34623 0.47451 0.44477 0.43037 0.34923 0.47843 0.44866 0.43420 0.35229 0.48235 0.45257 0.43804 0.35534 0.48627 0.45647 0.44189 0.35839 0.49020 0.46040 0.44575 0.36147 0.49412 0.46435 0.44962 0.36455 0.49804 0.46828 0.45351 0.36765 0.50196 0.47225 0.45742 0.37076 0.50588 0.47625 0.46133 0.37391 0.50980 0.48026 0.46525 0.37707 0.51373 0.48429 0.46918 0.38025 0.51765 0.48835 0.47315 0.38347 0.52157 0.49242 0.47710 0.38672 0.52549 0.49653 0.48109 0.39001 0.52941 0.50065 0.48508 0.39330 0.53333 0.50478 0.48907 0.39660 0.53725 0.50893 0.49306 0.39989 0.54118 0.51312 0.49708 0.40323 0.54510 0.51730 0.50111 0.40658 0.54902 0.52148 0.50510 0.40996 0.55294 0.52567 0.50913 0.41337 0.55686 0.52987 0.51318 0.41677 0.56078 0.53408 0.51722 0.42019 0.56471 0.53829 0.52128 0.42361 0.56863 0.54250 0.52534 0.42704 0.57255 0.54675 0.52943 0.43049 0.57647 0.55099 0.53352 0.43394 0.58039 0.55521 0.53761 0.43740 0.58431 0.55946 0.54173 0.44089 0.58824 0.56370 0.54586 0.44437 0.59216 0.56796 0.55000 0.44788 0.59608 0.57218 0.55416 0.45139 0.60000 0.57642 0.55834 0.45493 0.60392 0.58067 0.56255 0.45847 0.60784 0.58494 0.56680 0.46201 0.61176 0.58923 0.57105 0.46558 0.61569 0.59348 0.57533 0.46918 0.61961 0.59774 0.57961 0.47279 0.62353 0.60201 0.58395 0.47642 0.62745 0.60630 0.58830 0.48006 0.63137 0.61059 0.59265 0.48371 0.63529 0.61488 0.59702 0.48739 0.63922 0.61917 0.60142 0.49107 0.64314 0.62342 0.60581 0.49477 0.64706 0.62773 0.61022 0.49850 0.65098 0.63204 0.61465 0.50224 0.65490 0.63639 0.61907 0.50600 0.65882 0.64080 0.62354 0.50980 0.66275 0.64524 0.62802 0.51360 0.66667 0.64971 0.63252 0.51743 0.67059 0.65420 0.63700 0.52129 0.67451 0.65867 0.64154 0.52515 0.67843 0.66310 0.64611 0.52905 0.68235 0.66748 0.65074 0.53297 0.68627 0.67182 0.65537 0.53692 0.69020 0.67620 0.66001 0.54089 0.69412 0.68064 0.66461 0.54488 0.69804 0.68513 0.66917 0.54890 0.70196 0.68966 0.67373 0.55294 0.70588 0.69419 0.67831 0.55702 0.70980 0.69873 0.68292 0.56115 0.71373 0.70323 0.68756 0.56532 0.71765 0.70768 0.69216 0.56950 0.72157 0.71211 0.69676 0.57372 0.72549 0.71653 0.70127 0.57800 0.72941 0.72093 0.70578 0.58231 0.73333 0.72535 0.71025 0.58666 0.73725 0.72979 0.71473 0.59103 0.74118 0.73425 0.71920 0.59541 0.74510 0.73870 0.72366 0.59982 0.74902 0.74314 0.72811 0.60426 0.75294 0.74755 0.73257 0.60871 0.75686 0.75198 0.73704 0.61318 0.76078 0.75639 0.74150 0.61769 0.76471 0.76080 0.74595 0.62222 0.76863 0.76518 0.75042 0.62679 0.77255 0.76954 0.75486 0.63143 0.77647 0.77388 0.75933 0.63613 0.78039 0.77823 0.76378 0.64086 0.78431 0.78256 0.76825 0.64567 0.78824 0.78689 0.77272 0.65052 0.79216 0.79124 0.77720 0.65541 0.79608 0.79556 0.78170 0.66029 0.80000 0.79983 0.78624 0.66516 0.80392 0.80406 0.79078 0.67007 0.80784 0.80830 0.79536 0.67507 0.81176 0.81254 0.79992 0.68019 0.81569 0.81678 0.80446 0.68537 0.81961 0.82100 0.80902 0.69059 0.82353 0.82519 0.81360 0.69581 0.82745 0.82936 0.81814 0.70105 0.83137 0.83352 0.82267 0.70628 0.83529 0.83767 0.82718 0.71151 0.83922 0.84186 0.83166 0.71676 0.84314 0.84602 0.83616 0.72204 0.84706 0.85020 0.84063 0.72734 0.85098 0.85435 0.84511 0.73268 0.85490 0.85849 0.84959 0.73803 0.85882 0.86261 0.85408 0.74342 0.86275 0.86674 0.85853 0.74882 0.86667 0.87086 0.86300 0.75427 0.87059 0.87497 0.86746 0.75975 0.87451 0.87903 0.87190 0.76527 0.87843 0.88307 0.87630 0.77086 0.88235 0.88710 0.88067 0.77655 0.88627 0.89110 0.88501 0.78235 0.89020 0.89506 0.88931 0.78833 0.89412 0.89903 0.89355 0.79445 0.89804 0.90295 0.89776 0.80072 0.90196 0.90687 0.90193 0.80719 0.90588 0.91075 0.90605 0.81386 0.90980 0.91461 0.91014 0.82068 0.91373 0.91846 0.91420 0.82760 0.91765 0.92227 0.91824 0.83465 0.92157 0.92607 0.92226 0.84178 0.92549 0.92985 0.92625 0.84898 0.92941 0.93362 0.93024 0.85621 0.93333 0.93738 0.93420 0.86349 0.93725 0.94113 0.93817 0.87086 0.94118 0.94487 0.94212 0.87826 0.94510 0.94861 0.94606 0.88579 0.94902 0.95235 0.95000 0.89339 0.95294 0.95607 0.95392 0.90111 0.95686 0.95979 0.95782 0.90887 0.96078 0.96352 0.96175 0.91670 0.96471 0.96721 0.96564 0.92459 0.96863 0.97090 0.96950 0.93259 0.97255 0.97456 0.97336 0.94067 0.97647 0.97824 0.97720 0.94890 0.98039 0.98189 0.98103 0.95718 0.98431 0.98553 0.98486 0.96556 0.98824 0.98917 0.98866 0.97404 0.99216 0.99278 0.99245 0.98260 0.99608 0.99640 0.99623 0.99126 1.0000 1.0000 1.0000 1.0000 END_DATA textCTI3 DESCRIPTOR "Argyll Calibration Target chart information 3" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 2009" KEYWORD "DEVICE_CLASS" DEVICE_CLASS "DISPLAY" KEYWORD "COLOR_REP" COLOR_REP "RGB_XYZ" KEYWORD "LUMINANCE_XYZ_CDM2" LUMINANCE_XYZ_CDM2 "127.028906 131.252608 110.265656" 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 250 BEGIN_DATA 1 100.00 100.00 100.00 96.782 100.00 84.010 2 100.00 100.00 100.00 96.777 100.01 84.020 3 100.00 100.00 100.00 96.788 100.01 84.020 4 100.00 100.00 100.00 96.772 100.01 84.031 5 31.885 32.743 34.098 7.1032 7.3802 6.8529 6 100.00 0.0000 100.00 55.780 36.372 72.216 7 100.00 100.00 0.0000 80.854 85.328 14.457 8 0.0000 100.00 100.00 56.563 77.910 81.478 9 0.0000 100.00 0.0000 40.875 63.371 11.930 10 0.0000 0.0000 100.00 15.810 14.641 69.711 11 100.00 0.0000 0.0000 39.878 21.756 2.7475 12 0.0000 0.0000 0.0000 0.17553 0.17594 0.25002 13 0.0000 51.304 100.00 22.522 25.400 72.122 14 100.00 0.0000 52.136 42.427 23.732 13.824 15 100.00 53.349 100.00 66.148 52.993 75.881 16 100.00 50.680 0.0000 49.155 36.601 5.9995 17 0.0000 0.0000 51.028 2.4104 1.9441 10.620 18 0.0000 47.489 0.0000 5.7397 9.0981 2.2239 19 0.0000 100.00 51.303 44.137 65.955 27.134 20 100.00 100.00 51.850 84.316 88.033 29.972 21 49.802 0.0000 0.0000 6.4137 3.5753 0.86717 22 51.124 100.00 0.0000 47.587 67.171 12.592 23 48.380 100.00 100.00 65.011 82.675 82.298 24 51.210 0.0000 100.00 25.331 19.848 70.617 25 100.00 50.901 49.331 52.066 39.002 18.084 26 51.774 100.00 50.462 52.565 70.678 27.391 27 49.649 52.597 100.00 33.463 33.521 73.671 28 51.542 52.524 0.0000 15.593 17.815 3.9856 29 0.0000 49.855 52.382 9.3552 12.535 16.059 30 50.495 0.0000 52.232 10.396 6.3389 12.078 31 100.00 0.0000 26.371 40.575 22.270 5.3257 32 0.0000 76.339 100.00 33.117 42.238 75.617 33 100.00 26.813 100.00 58.154 40.221 73.093 34 100.00 100.00 26.811 81.805 86.044 18.357 35 0.0000 100.00 26.561 41.683 64.002 15.669 36 0.0000 74.410 0.0000 16.553 26.310 5.8403 37 73.129 100.00 100.00 77.078 89.284 83.240 38 24.348 0.0000 0.0000 1.5806 0.94588 0.39630 39 24.581 100.00 0.0000 42.402 64.305 12.083 40 0.0000 0.0000 23.698 0.60600 0.52986 2.3141 41 100.00 24.746 0.0000 41.937 25.103 3.4946 42 0.0000 0.0000 74.250 5.8374 4.7142 26.433 43 0.0000 22.539 0.0000 1.3574 2.0990 0.67487 44 100.00 74.753 75.649 68.886 62.128 43.069 45 100.00 76.339 0.0000 62.462 57.635 10.241 46 24.206 31.137 100.00 20.445 20.011 70.880 47 25.917 100.00 72.959 50.277 70.535 45.749 48 76.337 0.0000 100.00 38.220 26.844 71.585 49 0.0000 24.325 100.00 17.209 16.902 70.232 50 26.062 0.0000 27.693 2.6404 1.6716 3.2251 51 76.301 0.0000 0.0000 17.471 9.5861 1.8037 52 55.636 60.634 54.991 25.396 27.543 20.720 53 100.00 26.133 71.401 48.116 30.123 30.439 54 100.00 77.105 100.00 78.967 73.238 79.928 55 23.671 0.0000 100.00 17.792 15.732 69.897 56 72.829 0.0000 29.441 18.321 10.226 5.0650 57 0.0000 100.00 76.177 48.934 69.941 49.240 58 100.00 100.00 76.418 89.056 91.989 51.716 59 0.0000 29.974 25.001 2.8197 3.9290 3.7811 60 0.0000 57.015 27.590 9.3374 14.253 6.6740 61 0.0000 28.308 73.540 8.3865 8.2748 30.381 62 76.657 100.00 0.0000 58.486 73.085 13.506 63 64.153 30.592 100.00 34.100 27.580 72.132 64 71.382 21.927 0.0000 16.352 10.568 2.1399 65 100.00 0.0000 76.747 46.215 26.809 31.233 66 27.952 76.398 100.00 38.158 47.484 76.623 67 25.044 23.803 0.0000 3.1989 3.4516 0.94842 68 72.705 100.00 67.176 65.219 78.350 41.182 69 24.328 100.00 100.00 58.674 79.222 81.658 70 64.851 75.219 27.792 34.393 40.055 11.987 71 29.088 75.418 0.0000 21.568 32.158 6.9815 72 34.835 0.0000 75.524 9.7135 6.9067 27.814 73 26.706 100.00 26.286 43.777 65.280 15.882 74 100.00 26.507 23.928 42.870 25.991 6.1375 75 72.058 68.299 100.00 51.802 51.213 76.973 76 100.00 77.005 25.017 63.975 59.343 13.512 77 0.0000 76.928 72.429 24.440 33.728 36.299 78 78.340 69.846 0.0000 35.875 37.663 7.7361 79 66.707 33.434 33.732 18.891 14.189 7.8290 80 34.882 32.846 73.035 13.171 12.155 30.726 81 75.109 100.00 24.682 60.342 74.358 16.877 82 31.212 66.797 38.917 18.813 25.858 12.802 83 68.904 0.0000 75.143 22.341 13.755 28.600 84 76.754 53.206 80.475 38.684 33.327 43.582 85 29.586 54.279 73.897 18.407 21.380 34.674 86 75.371 75.671 53.308 43.274 45.919 23.595 87 56.532 76.867 0.0000 29.508 38.086 8.0739 88 54.003 77.595 77.133 38.695 45.551 43.420 89 24.398 54.999 100.00 26.998 30.453 73.147 90 100.00 76.564 50.245 65.863 60.652 23.156 91 66.860 18.485 62.967 20.587 13.490 21.742 92 24.183 49.695 0.0000 8.8779 12.706 2.9761 93 78.333 0.0000 52.106 23.870 13.663 13.120 94 0.0000 23.637 48.179 3.7379 4.0541 11.297 95 22.616 0.0000 51.502 3.9387 2.7979 10.933 96 0.0000 54.844 76.717 15.263 18.585 36.843 97 100.00 53.854 25.700 51.217 39.263 9.5218 98 100.00 24.647 46.990 44.331 26.934 13.674 99 0.0000 75.599 49.685 19.861 29.364 18.736 100 52.521 50.873 28.108 17.420 18.438 7.5397 101 78.092 100.00 46.699 64.577 77.105 25.944 102 50.291 100.00 24.042 49.033 68.153 15.815 103 50.424 22.665 16.009 9.2454 6.8360 2.6549 104 49.722 100.00 78.883 57.544 74.988 52.621 105 79.368 49.717 100.00 48.282 40.940 74.559 106 100.00 51.006 76.266 56.735 42.868 39.442 107 26.966 48.404 51.309 12.011 14.642 15.944 108 12.885 47.590 21.789 7.5012 11.020 4.7464 109 46.216 23.744 47.696 10.450 8.0488 12.057 110 26.537 79.034 57.906 27.559 38.504 25.533 111 20.035 78.679 16.337 22.591 34.435 8.7121 112 16.510 13.523 16.825 1.7900 1.7041 1.7702 113 80.772 52.239 39.693 33.078 27.980 12.670 114 52.025 78.476 100.00 47.545 54.688 77.922 115 53.644 19.450 81.363 18.926 13.807 39.159 116 76.390 76.738 79.766 50.525 52.251 47.617 117 16.719 20.668 80.444 10.058 8.9001 36.936 118 49.975 75.940 54.965 31.330 39.094 23.463 119 69.366 54.269 19.639 25.409 24.153 6.8096 120 78.357 44.403 54.054 30.871 24.243 18.910 121 86.769 22.037 79.950 37.403 24.170 38.874 122 23.991 100.00 48.167 45.424 66.697 25.173 123 52.705 49.623 76.910 24.219 23.477 37.566 124 83.235 21.483 18.262 25.590 15.580 4.1464 125 21.860 81.987 82.201 34.008 45.513 49.781 126 26.586 30.174 50.611 7.3390 7.3835 13.410 127 46.176 21.625 100.00 24.801 21.044 70.937 128 46.137 76.930 18.751 27.310 36.755 9.5612 129 91.475 88.357 12.710 61.517 65.249 13.071 130 47.690 27.399 0.0000 8.0330 6.7579 1.5938 131 18.097 39.910 80.111 13.722 14.465 39.178 132 50.349 0.0000 22.838 7.8953 4.4977 2.9459 133 17.466 14.543 39.302 3.1271 2.8099 7.1455 134 88.169 58.584 62.262 44.929 37.898 26.976 135 79.316 19.798 100.00 41.429 29.927 72.136 136 35.363 60.522 16.345 15.432 20.828 5.9239 137 12.495 34.970 8.4353 3.9039 5.6312 1.7456 138 11.590 84.378 36.985 27.019 41.132 15.132 139 85.444 85.726 34.888 55.147 59.454 17.245 140 85.787 17.402 36.424 28.453 16.913 8.3840 141 58.643 35.988 52.638 18.012 14.705 15.942 142 81.323 85.139 100.00 68.844 71.876 80.538 143 75.581 44.352 0.0000 23.219 19.240 3.9417 144 15.160 63.749 47.500 15.748 22.422 15.763 145 15.120 11.073 59.779 4.9766 4.1407 17.560 146 86.028 63.414 16.582 40.018 36.610 8.5068 147 18.812 62.643 85.866 23.314 28.403 49.950 148 18.635 62.340 7.9476 13.120 19.901 4.7801 149 36.339 46.262 87.864 21.038 21.293 50.395 150 65.242 88.476 43.595 46.005 56.607 20.611 151 80.989 100.00 84.297 74.943 85.016 60.461 152 64.260 64.440 85.027 37.886 38.184 50.670 153 35.612 10.187 17.227 4.2728 2.8720 2.0278 154 45.235 41.275 11.575 10.744 11.202 3.1960 155 85.017 19.190 57.638 30.797 18.973 18.858 156 89.001 65.879 87.121 55.655 49.365 55.199 157 88.405 92.832 62.808 68.473 73.860 35.158 158 17.469 44.939 63.608 11.395 13.546 23.474 159 80.504 39.649 23.740 27.475 20.347 6.3547 160 43.343 42.624 45.299 13.137 13.443 12.245 161 62.199 90.166 13.536 43.288 55.885 12.147 162 70.382 64.985 39.990 32.692 33.527 14.444 163 63.092 9.8060 47.998 15.628 9.5134 11.663 164 66.260 33.082 79.344 26.255 19.929 38.922 165 12.275 38.293 42.578 6.3997 8.1986 9.9833 166 44.729 63.293 89.315 30.599 33.805 55.854 167 86.795 39.767 90.083 44.341 32.719 54.910 168 33.191 13.557 63.471 8.2257 6.2326 20.467 169 0.0000 80.502 22.254 20.757 32.527 9.3004 170 35.165 87.442 45.762 34.459 48.798 20.511 171 53.417 63.795 12.922 21.988 26.302 6.5595 172 89.333 37.028 40.649 35.328 24.164 11.600 173 61.924 10.479 11.308 12.127 7.1155 2.0297 174 12.932 63.448 65.784 18.065 24.136 28.144 175 35.002 91.990 14.251 36.328 53.552 11.796 176 64.449 90.256 86.679 56.213 66.205 59.305 177 10.665 88.325 62.489 33.596 48.909 30.886 178 63.940 84.034 63.097 44.778 53.082 32.060 179 32.000 18.251 87.257 14.031 11.523 46.040 180 35.653 63.179 55.913 20.158 25.389 21.282 181 65.306 14.719 95.163 29.039 20.848 61.885 182 12.598 97.956 15.904 39.378 60.643 12.953 183 43.443 13.667 2.3608 5.4401 3.6576 0.92719 184 98.776 12.908 14.035 39.533 22.251 3.7953 185 42.232 44.658 62.606 15.929 16.220 23.280 186 5.7304 86.513 87.282 36.670 49.953 57.088 187 71.195 63.035 64.720 35.902 35.055 29.083 188 14.721 0.0000 24.188 1.2792 0.89876 2.4744 189 45.845 91.742 61.379 43.699 58.499 32.373 190 20.168 99.403 86.193 52.928 73.203 61.291 191 15.692 16.462 98.892 17.172 15.886 69.143 192 49.711 33.832 30.462 11.632 10.157 6.1786 193 92.778 86.752 83.442 72.329 72.554 55.382 194 36.175 85.461 71.738 37.083 49.576 38.944 195 56.241 41.455 91.468 27.602 24.111 56.814 196 63.698 49.811 44.158 23.262 21.617 13.662 197 13.503 85.866 0.84329 26.655 41.607 8.7405 198 50.699 14.090 33.318 9.4038 6.1358 5.8677 199 92.677 38.376 11.214 36.660 25.036 4.8570 200 88.086 68.014 37.675 46.350 43.023 14.745 201 86.614 18.702 0.67590 25.468 15.095 2.6278 202 16.608 0.33745 82.586 8.6870 6.8624 35.442 203 32.618 49.231 35.380 11.728 14.545 8.8331 204 39.446 87.298 89.309 44.627 57.160 61.307 205 89.388 7.1485 88.115 40.442 25.084 47.530 206 65.767 34.460 14.625 17.275 13.256 3.7698 207 84.147 1.8202 16.654 24.638 13.568 3.3843 208 16.889 65.227 27.821 14.968 22.334 8.5395 209 44.534 84.792 4.0875 31.689 44.876 9.3930 210 66.804 16.467 27.933 16.085 9.9479 5.2045 211 58.514 1.6609 86.699 20.583 13.786 42.312 212 4.6391 51.042 39.609 8.8369 12.694 10.054 213 36.900 7.6973 46.164 6.3700 4.2844 9.9811 214 0.87002 15.107 86.749 10.426 9.1195 44.882 215 30.735 26.754 16.517 4.9434 4.9146 2.4919 216 48.174 63.612 69.758 26.386 29.858 32.524 217 13.565 42.325 96.225 19.720 20.671 65.570 218 50.679 66.092 39.202 23.997 28.917 13.327 219 19.235 27.685 65.367 8.1114 7.8623 23.101 220 49.578 25.709 65.082 14.319 11.100 23.330 221 14.832 83.246 100.00 40.590 53.196 77.677 222 82.546 2.4242 67.048 29.152 17.129 23.053 223 33.942 16.843 32.549 5.2516 4.1097 5.4367 224 81.040 38.112 70.346 33.904 24.732 30.546 225 15.556 11.826 1.2429 1.2368 1.2292 0.48138 226 16.070 28.919 29.585 3.9659 4.7704 4.9137 227 49.118 89.394 35.809 38.873 52.843 16.831 228 99.042 12.511 70.128 45.566 26.901 27.920 229 62.910 46.590 2.6010 17.842 16.999 3.6820 230 2.6256 14.517 68.056 5.8511 5.1761 23.910 231 1.1839 16.197 20.949 1.2511 1.5596 2.3249 232 89.271 1.0849 39.328 30.650 17.054 8.2370 233 100.00 31.073 85.483 52.649 34.793 46.962 234 95.707 39.925 60.884 45.356 31.307 23.501 235 72.034 26.792 47.480 21.993 14.839 12.971 236 74.942 79.821 13.360 41.681 47.180 10.494 237 2.1562 64.147 13.993 11.998 18.939 5.1968 238 29.116 42.872 16.700 7.8853 9.9731 3.6404 239 71.555 16.349 81.097 26.938 17.794 38.944 240 0.49326 39.374 86.691 13.684 14.195 47.050 241 2.2551 37.126 61.253 7.6245 8.7861 20.592 242 32.266 80.382 29.691 26.509 38.248 12.348 243 87.493 76.037 64.364 54.202 52.866 32.110 244 3.9929 62.442 91.329 23.002 27.808 57.715 245 43.125 31.672 87.678 19.105 16.428 48.611 246 51.638 6.7350 70.225 14.187 9.3494 25.409 247 66.079 45.918 66.274 26.496 22.757 27.299 248 0.74401 10.382 39.234 1.8689 1.7543 6.7768 249 32.358 69.996 77.444 27.183 34.110 41.254 250 38.655 2.4066 90.080 14.980 11.200 47.523 END_DATA CAL DESCRIPTOR "Argyll Device Calibration State" ORIGINATOR "Argyll dispread" CREATED "Wed Dec 23 22:15:31 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.0000 0.010727 9.3233e-03 0.0000 3.9216e-03 0.013642 0.012421 4.1199e-04 7.8431e-03 0.016648 0.015579 2.9755e-03 0.011765 0.019730 0.018814 5.6001e-03 0.015686 0.022904 0.022095 8.2551e-03 0.019608 0.026169 0.025467 0.010986 0.023529 0.029526 0.028901 0.013748 0.027451 0.032990 0.032410 0.016571 0.031373 0.036545 0.035996 0.019455 0.035294 0.040223 0.039658 0.022400 0.039216 0.044007 0.043412 0.025406 0.043137 0.047929 0.047242 0.028473 0.047059 0.051942 0.051164 0.031601 0.050980 0.056031 0.055146 0.034806 0.054902 0.060227 0.059174 0.038056 0.058824 0.064485 0.063233 0.041352 0.062745 0.068788 0.067277 0.044694 0.066667 0.073136 0.071305 0.048066 0.070588 0.077470 0.075288 0.051438 0.074510 0.081773 0.079225 0.054810 0.078431 0.086015 0.083085 0.058183 0.082353 0.090196 0.086870 0.061555 0.086275 0.094331 0.090593 0.064897 0.090196 0.098375 0.094240 0.068193 0.094118 0.10236 0.097810 0.071473 0.098039 0.10623 0.10134 0.074708 0.10196 0.11006 0.10481 0.077928 0.10588 0.11380 0.10825 0.081102 0.10980 0.11746 0.11164 0.084245 0.11373 0.12108 0.11502 0.087343 0.11765 0.12462 0.11839 0.090425 0.12157 0.12810 0.12177 0.093462 0.12549 0.13153 0.12512 0.096468 0.12941 0.13491 0.12850 0.099458 0.13333 0.13822 0.13187 0.10242 0.13725 0.14151 0.13524 0.10536 0.14118 0.14476 0.13861 0.10829 0.14510 0.14800 0.14197 0.11119 0.14902 0.15122 0.14533 0.11408 0.15294 0.15442 0.14868 0.11695 0.15686 0.15764 0.15203 0.11978 0.16078 0.16086 0.15535 0.12261 0.16471 0.16410 0.15866 0.12541 0.16863 0.16738 0.16197 0.12821 0.17255 0.17067 0.16526 0.13098 0.17647 0.17401 0.16855 0.13373 0.18039 0.17739 0.17182 0.13648 0.18431 0.18079 0.17508 0.13919 0.18824 0.18425 0.17835 0.14191 0.19216 0.18773 0.18160 0.14461 0.19608 0.19124 0.18485 0.14731 0.20000 0.19477 0.18810 0.15000 0.20392 0.19832 0.19133 0.15268 0.20784 0.20188 0.19460 0.15537 0.21176 0.20545 0.19786 0.15807 0.21569 0.20899 0.20114 0.16077 0.21961 0.21254 0.20443 0.16349 0.22353 0.21608 0.20774 0.16622 0.22745 0.21962 0.21103 0.16895 0.23137 0.22315 0.21434 0.17169 0.23529 0.22666 0.21767 0.17443 0.23922 0.23017 0.22100 0.17719 0.24314 0.23365 0.22434 0.17996 0.24706 0.23714 0.22768 0.18273 0.25098 0.24063 0.23104 0.18552 0.25490 0.24411 0.23438 0.18833 0.25882 0.24761 0.23774 0.19113 0.26275 0.25110 0.24109 0.19394 0.26667 0.25460 0.24443 0.19677 0.27059 0.25809 0.24779 0.19957 0.27451 0.26160 0.25113 0.20241 0.27843 0.26509 0.25447 0.20523 0.28235 0.26860 0.25783 0.20807 0.28627 0.27208 0.26117 0.21091 0.29020 0.27556 0.26453 0.21376 0.29412 0.27904 0.26789 0.21662 0.29804 0.28251 0.27124 0.21949 0.30196 0.28598 0.27462 0.22234 0.30588 0.28943 0.27797 0.22522 0.30980 0.29287 0.28133 0.22811 0.31373 0.29628 0.28470 0.23099 0.31765 0.29970 0.28806 0.23388 0.32157 0.30312 0.29142 0.23677 0.32549 0.30652 0.29477 0.23966 0.32941 0.30993 0.29812 0.24256 0.33333 0.31331 0.30147 0.24543 0.33725 0.31669 0.30481 0.24831 0.34118 0.32009 0.30816 0.25119 0.34510 0.32351 0.31148 0.25406 0.34902 0.32691 0.31482 0.25695 0.35294 0.33033 0.31817 0.25983 0.35686 0.33378 0.32154 0.26271 0.36078 0.33721 0.32491 0.26558 0.36471 0.34066 0.32830 0.26847 0.36863 0.34415 0.33170 0.27134 0.37255 0.34766 0.33510 0.27422 0.37647 0.35119 0.33854 0.27709 0.38039 0.35476 0.34199 0.27994 0.38431 0.35833 0.34546 0.28278 0.38824 0.36191 0.34894 0.28560 0.39216 0.36553 0.35247 0.28843 0.39608 0.36918 0.35601 0.29123 0.40000 0.37281 0.35956 0.29407 0.40392 0.37647 0.36313 0.29689 0.40784 0.38015 0.36672 0.29970 0.41176 0.38384 0.37031 0.30253 0.41569 0.38755 0.37394 0.30536 0.41961 0.39129 0.37758 0.30819 0.42353 0.39506 0.38125 0.31104 0.42745 0.39883 0.38492 0.31389 0.43137 0.40259 0.38863 0.31678 0.43529 0.40635 0.39236 0.31966 0.43922 0.41012 0.39612 0.32256 0.44314 0.41392 0.39988 0.32547 0.44706 0.41775 0.40365 0.32839 0.45098 0.42161 0.40743 0.33132 0.45490 0.42547 0.41122 0.33426 0.45882 0.42931 0.41505 0.33722 0.46275 0.43316 0.41888 0.34022 0.46667 0.43700 0.42271 0.34321 0.47059 0.44088 0.42654 0.34623 0.47451 0.44477 0.43037 0.34923 0.47843 0.44866 0.43420 0.35229 0.48235 0.45257 0.43804 0.35534 0.48627 0.45647 0.44189 0.35839 0.49020 0.46040 0.44575 0.36147 0.49412 0.46435 0.44962 0.36455 0.49804 0.46828 0.45351 0.36765 0.50196 0.47225 0.45742 0.37076 0.50588 0.47625 0.46133 0.37391 0.50980 0.48026 0.46525 0.37707 0.51373 0.48429 0.46918 0.38025 0.51765 0.48835 0.47315 0.38347 0.52157 0.49242 0.47710 0.38672 0.52549 0.49653 0.48109 0.39001 0.52941 0.50065 0.48508 0.39330 0.53333 0.50478 0.48907 0.39660 0.53725 0.50893 0.49306 0.39989 0.54118 0.51312 0.49708 0.40323 0.54510 0.51730 0.50111 0.40658 0.54902 0.52148 0.50510 0.40996 0.55294 0.52567 0.50913 0.41337 0.55686 0.52987 0.51318 0.41677 0.56078 0.53408 0.51722 0.42019 0.56471 0.53829 0.52128 0.42361 0.56863 0.54250 0.52534 0.42704 0.57255 0.54675 0.52943 0.43049 0.57647 0.55099 0.53352 0.43394 0.58039 0.55521 0.53761 0.43740 0.58431 0.55946 0.54173 0.44089 0.58824 0.56370 0.54586 0.44437 0.59216 0.56796 0.55000 0.44788 0.59608 0.57218 0.55416 0.45139 0.60000 0.57642 0.55834 0.45493 0.60392 0.58067 0.56255 0.45847 0.60784 0.58494 0.56680 0.46201 0.61176 0.58923 0.57105 0.46558 0.61569 0.59348 0.57533 0.46918 0.61961 0.59774 0.57961 0.47279 0.62353 0.60201 0.58395 0.47642 0.62745 0.60630 0.58830 0.48006 0.63137 0.61059 0.59265 0.48371 0.63529 0.61488 0.59702 0.48739 0.63922 0.61917 0.60142 0.49107 0.64314 0.62342 0.60581 0.49477 0.64706 0.62773 0.61022 0.49850 0.65098 0.63204 0.61465 0.50224 0.65490 0.63639 0.61907 0.50600 0.65882 0.64080 0.62354 0.50980 0.66275 0.64524 0.62802 0.51360 0.66667 0.64971 0.63252 0.51743 0.67059 0.65420 0.63700 0.52129 0.67451 0.65867 0.64154 0.52515 0.67843 0.66310 0.64611 0.52905 0.68235 0.66748 0.65074 0.53297 0.68627 0.67182 0.65537 0.53692 0.69020 0.67620 0.66001 0.54089 0.69412 0.68064 0.66461 0.54488 0.69804 0.68513 0.66917 0.54890 0.70196 0.68966 0.67373 0.55294 0.70588 0.69419 0.67831 0.55702 0.70980 0.69873 0.68292 0.56115 0.71373 0.70323 0.68756 0.56532 0.71765 0.70768 0.69216 0.56950 0.72157 0.71211 0.69676 0.57372 0.72549 0.71653 0.70127 0.57800 0.72941 0.72093 0.70578 0.58231 0.73333 0.72535 0.71025 0.58666 0.73725 0.72979 0.71473 0.59103 0.74118 0.73425 0.71920 0.59541 0.74510 0.73870 0.72366 0.59982 0.74902 0.74314 0.72811 0.60426 0.75294 0.74755 0.73257 0.60871 0.75686 0.75198 0.73704 0.61318 0.76078 0.75639 0.74150 0.61769 0.76471 0.76080 0.74595 0.62222 0.76863 0.76518 0.75042 0.62679 0.77255 0.76954 0.75486 0.63143 0.77647 0.77388 0.75933 0.63613 0.78039 0.77823 0.76378 0.64086 0.78431 0.78256 0.76825 0.64567 0.78824 0.78689 0.77272 0.65052 0.79216 0.79124 0.77720 0.65541 0.79608 0.79556 0.78170 0.66029 0.80000 0.79983 0.78624 0.66516 0.80392 0.80406 0.79078 0.67007 0.80784 0.80830 0.79536 0.67507 0.81176 0.81254 0.79992 0.68019 0.81569 0.81678 0.80446 0.68537 0.81961 0.82100 0.80902 0.69059 0.82353 0.82519 0.81360 0.69581 0.82745 0.82936 0.81814 0.70105 0.83137 0.83352 0.82267 0.70628 0.83529 0.83767 0.82718 0.71151 0.83922 0.84186 0.83166 0.71676 0.84314 0.84602 0.83616 0.72204 0.84706 0.85020 0.84063 0.72734 0.85098 0.85435 0.84511 0.73268 0.85490 0.85849 0.84959 0.73803 0.85882 0.86261 0.85408 0.74342 0.86275 0.86674 0.85853 0.74882 0.86667 0.87086 0.86300 0.75427 0.87059 0.87497 0.86746 0.75975 0.87451 0.87903 0.87190 0.76527 0.87843 0.88307 0.87630 0.77086 0.88235 0.88710 0.88067 0.77655 0.88627 0.89110 0.88501 0.78235 0.89020 0.89506 0.88931 0.78833 0.89412 0.89903 0.89355 0.79445 0.89804 0.90295 0.89776 0.80072 0.90196 0.90687 0.90193 0.80719 0.90588 0.91075 0.90605 0.81386 0.90980 0.91461 0.91014 0.82068 0.91373 0.91846 0.91420 0.82760 0.91765 0.92227 0.91824 0.83465 0.92157 0.92607 0.92226 0.84178 0.92549 0.92985 0.92625 0.84898 0.92941 0.93362 0.93024 0.85621 0.93333 0.93738 0.93420 0.86349 0.93725 0.94113 0.93817 0.87086 0.94118 0.94487 0.94212 0.87826 0.94510 0.94861 0.94606 0.88579 0.94902 0.95235 0.95000 0.89339 0.95294 0.95607 0.95392 0.90111 0.95686 0.95979 0.95782 0.90887 0.96078 0.96352 0.96175 0.91670 0.96471 0.96721 0.96564 0.92459 0.96863 0.97090 0.96950 0.93259 0.97255 0.97456 0.97336 0.94067 0.97647 0.97824 0.97720 0.94890 0.98039 0.98189 0.98103 0.95718 0.98431 0.98553 0.98486 0.96556 0.98824 0.98917 0.98866 0.97404 0.99216 0.99278 0.99245 0.98260 0.99608 0.99640 0.99623 0.99126 1.0000 1.0000 1.0000 1.0000 END_DATA dict 0@EDID_md5f09e42aa86585d1bb6687d3c322ed0c1lcms2-2.19.1/testbed/test1.icc0000755000175000017500000210074015176573557015044 0ustar martimartilcmsprtrCMYKLab )5acspMSFT-lcms desccprt#wtptA2B0,A2B2,A2B14B2A0F<8B2A1~8B2A28gamtXdmnddmddltdesc,Test profile, not suitable for real use-Test profile, not suitable for real usetextNot suitable for real useXYZ Zg0mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{T?~ò~i~L}~cbA~Dad~ty~W~O>~\/~|~`Cx}%H}1X}%z}K} {N}׋<_~7A~-ψ||Dz|+E|[s|z} ^}wO@}-~ċ {Gu{Dz{]Ĭ{f{Zx|[]|ϕM?}R<}Ǝz]YzHħz|z={LNw{\|=>|v|ېI8z/r z;bz'sMzd6zɬqv{D[{0> |;|yyaIy?yazYvzݮ[{^=c{ФI{R*y߄yfUy`VyyuKzZi{ <{z%zȎ~+~}͇}W0}3}HtЄ}Zk}=~zɇ}!~Єd*s}Y<9wpSwuuVrUW؈|;,뇔{RsѲ;:8q)PCV:4.8Ȅ2񡂡?Up Vu9S c bփR.ՁNn U388A/ͬδz6߆өn1T\e7݀tXT)$̯̕6;eCʷˆ imw3SƀV7M \lGNػځNāa5tNzlߴS<H6*-N}o2ن N%է>w֣A}⇤\fXMݘ2, KԐ3g°[} 0e6M _1 ? 1ӣǾI^I|B̯dܪwLe1$: rW] 1S{z|diL g0\ U{[G{!{ ޔ`{&yE{xbie{Jr|/c5}~ ~:f#MKx+Ca|uI~.yW ώәߎ%¡唘[w!^T`^H*- 5GȨ瘎=Π4rv_ҍRGf,ދ̋|,ƕ{ Ҙtٕ^1Fő,;'\A*ىJ nyg؜(VN#q6\DՊB*|i˽?zzhzMџzEzrn8zY,{dBS| '|⃔*Z Ђ`>mۘ:Xc€A'4 uh¨h$nk)l]'Wf@&8[/Թ|zY9_N3kV41@49%wUh 3?Vkؔ.Uٓ|??R~%nVӎȩ5U.k~j9V"U"똬>Ð?%' Ȃ}ˡWml}ʗiRT>OlT$iƝaʚ=\},?iT- =$e0yYq,<-A_|?h@SG=ҩ$leLy)yywydGzPOsz:{ )|qʬί(h䁙~ڀvcc&OS#9tL߮=.v10b䞼 N8ՙ,K.Fpj癪7̥0uPhbQM88Ajʗ׋xAʜڨ†󤔗tuϔaMKMB=(7kua ,̘/1Hsʠ5`\Lk7M (_XĀ⫹}£rs@C`)6OLA;6}Ȕ@(Bat{C rȟH_֧Kť6#̕O&3"^ļ֢qrb_cKu6{ݤ < (ytյy:}Ѱy2ldygZ8dyF冷zj1{r{(B€}b kYdrFl1l;nˉՍވI|ϯkUYz4EƄ0ˀh|RjΌcX}-EYW0,\>շFiba{{4j$W]D?50>R*>6Ā;ٱџziWyZD}p/'g^ȶ6pDzi/W%ԞD9I/Ĝ' J״"ԯzWhy1VߣKC/1ŀٵ˰tzhVﭠCߟ8//)cyxr|xaixPqyS> sy)zjfY{ C7ċ恶q¹JaJm~P ~=_~)]f2ÀDÒG'q^`۳uOY=RZ)#JNO©k#_p鷼`k&O:%=j(Hڧ,O[pt` N֐&<èi(ץc^PbB7pM@s_ϱ ,N&q<Е(¤+8fը*p_oN<}:(nN&Q̺o_Nw }gu~_jx&thxQy7Qẙzi%u7{Z{=v|k|v՟wӾ xѦx Ryosz'kYuzیM1<} #}oha}?'O|}g3}f }É\}Y}|ȸזP|D|mg|˨N|3,}X S}(d}5<|0|nƕ|4~|8f|eNT|2|L |Qvww~~x }1xfyzM(zI28%{1 ։$|y<Ǽ|>ډcΒhU~|nWdQL\15 쇋Z⊩!_+7/0 zXcⅩFK&0D!D $~uI&%ڏ͆.yl bDŽ̋vJQ/nFY k솷&ڸWlΆN]xa„I.~ ҃ᆤh/jhwo`ӃX^H.Е QLr71Nu vf`ҟGHUXu-{8IF,mźg߄ދuނ_gfGǁ-pȑ=ͅtؠ/IzKhu5^ՂGJ,^&J5uYv vw6rw]xEry+Nz|},SP~˛S~~~Sr ~O\~mD΋o~*'C~,lWح46uxp[(/C񊁃)cM &oA(7ȍpofZ0C(e_׃GgϐNanً(AY@RBS( Ѓj<ŏJmQXm@A<'|;Ȇ<[9%_5,~4m,WƈA' U<ϻ6ʱ^ly0W(W@@&֚$`|źm[xR`k7NV@-&H;/ݲàztáHuNvz t9t|uOqEu^sJvJw5Wxk@kx0| |$p|spv4|p]ڜ9|J"|4}-И5}ls?䄅lfo1]Μ=*ڙʜ]1zlʫrզЮb*|Pܟ s>Ԧ*d0vsQysjٶCt+['tJu8vF$R+v Xw {.yzj `xbiAY3I?N7#ףV> J߻bSxPgi5YuߓHU7]ӑ#âk t€ޢ_x ڟdhY9>kH§79,# MbwյZhưkYeH^7 # { >w9hX#H97# `- a{n1rmŶs7_XsPst'@t/E!udukoMw${h@zmz_^kyPpIy@z /RzVG1z_ /|F"{rmÞ_G=PN @}:m/PGw}Iu!{pm}s_gP%ԅ@^/Jn{[emep^P‹@Oߊ/P܊߫Ћ0${9%mT^PՑ@O/aґ {ńumGꜳ^`GP f@[%]/yyK!;΄7z0m?[^,Pa@guY/Vx@jzĝ>m>᫓_ 8[P*̦3@פ/E1gȥFvpswKsxt̢*xu$yvqczwW{Ox;/|1y}!yt~hku~v|}we}ʈxK}p.y3}V[z}:z~ {T}1r̚td_u Fv ~wnxBU>xy8yĂyՂ iq8rsltюLuvmvT*w!7xxpu2q/r+sŖՄtl|viS#w 7wwq?lo pqˣrzwtkXu53R.vA6BvvKNn뷌p[q1r0z̓0!{ ){ͮwӹx*NxelxTyZy,4byqJz!K/z\r zˇ6wswwܳ5x'xx ay'Iyk.yN Bz-Uw>JwQ#_wwwwx$/a x{ITy'.}yAo y~p3qrrڌsvGu `\v5HwU-ńxR܆Oy`Fzꅻzs {u{Wu{_[| Gh|i,؃|/}u\1_rك,tT^QkFǂD+n9 ­Ǐ*1ɂ|q|sB6]5kEՁJ+,x~(Ta؂ uz)Qr-\5TEh*x }0@Wd8EqZ[QDD)D=DI7ˀNdK [p=DZC~")Q~B?θڬ&2`Nos~NY~C ~wp(~^~ܾxӾc$~5n~@IYE~ sB~0(y}^~&\Wo5p!rs.lˋtTWu@v&;w*$yXySCGyyz?k֊_zVf{$@ {%{ۈ}iI ]~׊Sij̉7UJ?6$΀,Mԋˋ>j}*iT·>>k $PYفKIŠ˔8o-|:7h1kS߆a=#ċ%ʁs Y{ygʆq[S1<#,!V5q zٟg՜{Rj"0Ճ'=r'@ zVfQPQƄ;Ο_"a?) Œn;y]eQD;d1!"ospA(~|݈C|BxGgtXUѕB{5.l ʓ@lןzwߕWfɗ/SU/B{@. 'F΀F(wD f9tTAA-ma8KΞNvҤeTQA-X9ub;k)v"xFeAS*A/:-}v 4n~W{oo]p/_yqKNrhSU7Ct214+}pO@bqSb&C%1#!}ip aƫɗRB1Ҡޔz~.Nx}joدPa=RB\p1Jf|yv}6GoЯ+Va]RdB1vɔŅ(rHlemX9nIӷo:up)S4q-p)t{rwtpeÿtX:tIu@:vu)v!uxr:{er{EX&zIֵ$z:{){8n{}.re&WjBIҀ:f)0!rvҊ e_WEIu:QsQ)GIUrQheJWNTIg":Al^)!'XPr0Pe?bW Icϓ:?)8`-!GrӠ`e=̞W՛Id:::ҙ)}yM:qv6eCPWC(Ikwk:E)Q)ЧʜERٵqlrn7touIq-vkrjwtRxu6zyvzyv׷oWwppxGIrAxKsy4ttyivzQPw4z5hx!{>xzmogp–rIs^htOuJ4lvwA"kJmo:pu~r1gWsvNt3uru0zjo;l@̩Tm֔?o^}Rp⏔f%r^Ms2tGtԆ&ik8#lϝan\Q|o*e qh?Lr1s? eshԻjgk+Im{od&p3Lq1:rZ sGhi˶ kSÐ^l֫z/njcWomKpqC0q grybιg`ia}ajںclM`ymmڮbohJpP0p q%Zyk}zdmKzn{hptyU{qb||sJ}t/}v 9dv7wv{>${* I|}9z Xz Əy|zhz1Tzy>z$zjR{݂\y yVy|yh9ySyA=z|$ y͘_{^؋iڜk~mpyofipQbr$; s!tNw$setU u2x?veqvQw;xx jx{j|ۚՇ{|ن} w}!dq4}FP)}u:Qr} U}~цZ>vScyO\yI98ƃoÏۘ"ubgbo֊dNkuJ82n2f{.י~~0\to3a0Mx8EERX 2ȃEvsš`ā7&M͕7ǀvQlWJ#&r&`VLS977ߛD-`3^|r<_|Kz6Xy iNԓ&k#yln̐nj\oIqt3֍rrz쓔rZsM't3mu[čXuHUEv3(ww~{Nb{}~!{mX{Z |G|_2~c|~||lZ+ |~5l YւXFΉӂ 10&,{^kY-F1YPƇXRQ?{7~j5X^ՏFEmԍ0ˇ)MIZ0zy͚iz^=W! DՇ[0^Wh̉إy܊Dh܈ɟWD@I/慽)aV{yVܫ9hNRVCՆ/8kH(؞ĥלLjsߚl4cėmR oI?씆p+Jqlq/}А@qcHrQsˑ{@*Y{q/{%Ϛ̂=nq-ya&P{7>*)ޏ
ґƗYp`O֑ =z)w>{UƓGxp<@` O33`=%j)"]Ƙ~ϙo_z`Nu<(όؒikU~"RCo^͜Nܚ<&O(k8KW=}Ôn^VM[Q;όƠ(!7h7vm\-=nknlpvZoRiʯ(p\WpMTq>p^r-:Isj㣧sF7uav |vi`w\Gw`Mw>(x--xxT^zXu~]h}~[w}M4}=Ǣ},Рj}Z}~uDhX.[τLm=rd,2kٞ;th(urZXL_yX=h,_hҝ#te=gZn#CL<ԟ,0;ڜYVjBt]םg-;Z2VKآ<억+뜓vƐSdt.~gZ.K]<{)+뛾њ|j2f]λ@hP㷖ipC#j4*k#>l!Hksi=n2]Ϻ9nPBoCEwpn4[.q1#sJqpx)iͼud]uPմuC&v4Qv|#vv&|"ir|k]af|P]{Bw{4-{#{g{hiz1]5#PVKB+4#0liN<]PDB 3#:槫i)]GP?Bl3񨛍#2E"Y߀i Y]PDYUBM3ǔ#^?YHh]#IPQ|B%3 n#"V PlmfDn0huojqcl{rndUtOp}LlurP1vs x1s\iqTXkrgmmswogtyquc>rvKasw0txU vtwɈg|`i|\k|_&m|}xoV|bp|JYro}/s+} !t|ǻePh Pj `kw*m̓`o/ITq.q vsdF4)f|Th~juln_nCH`oˆA.p+ rxRc!e?p8gUiS tkG^m!3Gn)-in hq öad@*fUhTksjR]l3FmT,m˒ pa< cĜSeLgri\kmF$l,Ol٘\ pj`b盲d%fNrhکs\]j¥>El7>+l mp_te`uglvqiwZkrxBm\Zy,oESzq+zs}s}Fr=osfq;Zturpuvsqvst[jwquDvx]v*8yw{[xp.zk>qrzrz?s{Bot{ZDu{Csv|2)XwN|?zy|l)n]ʨo31p샖rnxsOY'txBun(u.x1lя)'n2Ôo|PlpmFqXs4RAt-;'tDywdlxklmnM#Col0pِW)r@s'>rVgvރjl$mTInkGoV`q.V@>r8&qޒ#'wJ|i߮>kLl~vmϣjwo"aUpn7?q]&IpwYVib$jɴ#k}m/>inzUoţg?p %pw=p|dM}g}TiW|}kgh}meTD~VoS>~q$r&gtSzn3{'p{zqh{u{rg|:sSS|u=8},v#C}vxqxxyMyyyzKz&zfzzvRf{z*:FEeWqcbEa?b!PX>V e*5qE|czieYlDgx\dirLIkM:6 l%ّ8n ZduΤ[fˌWg/GR6Ґě.'K͒F؋RFn9ab]cU:eGi;gW8Mh'6j*inbmi?ajTFkG@m*87`nS'?1oq-n-simpa9qsTr7Fޢs7ퟹs'rt.sx0lx`xSS,xFjzx73yA&ݜyl2x0|cl(l`8PS+E&71~&p~~k_٣wS%DžE P6؛&o(ƀkd}_ҍRߟ猲E:6&;%Jۀk$_T&R3D_Y6@%a'j𤡝_VRD؛V63%j a|`U|bRIde`"m$gsinji]plFrEo,s&p v*q d%jѭKflhn,jorFlq`\nrEpItS+pu] mthukIaud vNf}vshwpjx\[lyDnpy+nz rz-w_K]aCdlȃfoiiZRkMCl)*Bl~vq~]U `ܕbie nRgbY5iBk9)krY?q[^pa-1cm-fX\Zyc]Vj_1bpl=dޕ1WjgAqh(`h|sYY\b|^_avknc眙Vf,@gɗ''f"Ds XԵ~[?^D~`!jcVe`~@Mf'neș_t̳7n_GpOb1qd~hrgwjt?iUulM?vnw&wZo2{ ql,i{mkoPmP}kpnir pUsxr2>ts%Wutxyruɰ1isk~tߎ{m u{nvhzp0w`Sqx.=rx$ry&yzFg~&if~-k!~.zl~)g8ni~0Ro~;=q~<#p~[zS~+eGgliiy.k flхQnlgonp,\qEUIrL64rcqˈKmkUܐHH;ʂ9V)07vdh'mO'aՊUTEG9vv(ϋQu߀mB a5UyGiӏ8t(pnjрla_}TԘ_G 8r(9ŕ'Ɏ0'ebW[Z^M#`e@[b1dh e emdc'YdMmf@l{hV1Ҝi j Oird+juY kMl?n1o Кo }lo{wcqXkrzLhs?y0z' M-z1 z*b,VWqaKuH>|0UN % b&-WyK$>(܆f/2mD t ΀a՜^+V̚JJӘ=ؕ/Dv~ %z!a˖V$Jŗl=(/Jg[ 숟Y#ZdNR\Bd^5`',b#abhEcZqXpga}McB#jd5.f:':g`gpҦhQvXhhMJ iAЩj588k'l sl|9mxgzWo:Lߪ&oAWp4Uqm&ߣq Nq\rA~WRvLvAv4w3&wm ]w)Ÿx>V}#LP*}J@դ}N4^7}?&t}3}~^V-L)@u4Al&t4G->!zVҋCL2@g42&]!6MVb4~L z"@U4.#&g/&jp&aSYc]6f/`7hqcLkjfFW(li%A*nbk'nmtnų*]daq`fc6h~Kekjh m(Vj@o.@5kq'lr^cu5sANZo]pJM`q|c&rinet TguC?>ivV&Qiew ux"tWy[y܍^ z9{Y`zhc{Se{k>Ng{%f{v$|UxFX΃u[y^łyfaRd=veʁX$dvmRSvfVZx] je_(Qbp pE [pqL.~sǤbmdo7fpxshqa8js&Mlti8mu|m.u~-xe4_wbPx0dxr_fyQ_hyLjzc7kzjz~T|f]}``]-b|&pd^fဤKhԀw6jKkht~uԠc[{+^B `oc ]e@Jg56ChXf~_Yt2\̀_>oa$]coJe܌5fe3~Xas[Y^ [nJ`l\ZbaIhdi57e7:d6~Wة6Z ~]#m_{N[aĜXHcš4dc x~ɀ|6pXq\`}gr_ltbZuDedGvgh2whj`^wkZrmbne|1pAgikqiYrkFtm28to`tovȘjl ?l@m{moUjo&pXpr(Fqst1rt|cr&tzhuiv~ykgwFi:lwWnlxEoyA0pyoy~qeggyl*zGn@{mzsj~t lyp{tn`uoP2vq>w]r]* wsE=yr}ps}kqto)ru_svOOtzwK=guOw)uxivwnk||Po}n p}W^q}zN]r}h-jKO0j,lksjgg>i[ kfM#l=xnd-o}oNq6rp?ofqYr8LJs>=4pt#,mt6t] vq}BwexYy"K]yh[img"ndgQf7\@gPPiCk=4l#mn^l^sf~qm[^nObp*Beq<3슀r #or7rxe}uLZvNvA.wP3fw#w SwN|d|Y0}KNg}{A }2އ}"ن} }dZYRwMh /@vT2Z"X3!GcއEY M/$@?,;2/g"6僠c|X!|L˅MS?O1sn"*ۂ] \URBYXF[E9]+}_I`JamI\]QY_UF7ay9cr+Qe Peߘer1[_dCPeEg9i&*jV&jjwZ@kZP8lDѕm8jan*joݔ3o.p#{eZ LrOs[D0t7ƒ|t*u-u!1*u.YsyO}zCC.z7Qz)zq-z;{XkN>;CL#6폗). PX\`N/:;B66(܍~sG+X7N rBÏ6o(WrT PaTMFbV;M Y=.[i \]`|q.Oƨ[*EĦ]7:_2.` [mb+ǥbleuO=SaE-c:Ae.~fy gVѢg iz<NǤ hDYi9k-IllƠ?l(wo+}NK oqD+kpN93q-+Lqqq5u Mנjv`Cʞv8(wU,뛞wXw؛w^qzTMs}UC}8},7}&]}љ} ~M$YCJsq82, w{{L)C(8dЋ,ٗDݏgZS]W|`[5wPc,^debCPhe;ih#%ipjygl˧V^ Y`\cv _fxcbiOe"k:fm"eeolyqgRhGVUjsYlLt\nb2_oNb^q9ds!btyvbOSrݔzS sڄ| X_|VEb(|1c|cD|dQGg{Q*gh{4jz{oY|\jn^_eaFO'cgd=e ;*Me$,h;WO{Z}m]^_Ndax"W`ixGkZyT6lxy#ml9z qze~bYr7d9dfVpgFiT6j_"i p}`(&q^bZddL4Uf F=g5ph"g nτC} ^p`ԏcdbЎU dkEfP4g ".e؋ m<|]Wp2_ baJTcdaE)d4xe!dbQ knd xyRmzbV` {YQ{])BG|h`0}Ab~ld#dy wv`[Hkw(^/_w`PxcAy}e0tzGg{h~)i|v}s cjte]u gOui@vk/w}m5wm{nuDpkisq:m}\rOnOsEp`?t.q/!trtryt(tmWt7hKnu:[ovNpv?jo}.pR}o}x<~r:i3fjZl Lxm%"=n-nnumx8qgFfiCYxjKk=(l,l߉+kx:qfqehXip"KejŒ\]2D^$g`Oؔ`ԑ biqRˑ ^?Hܐy`g> bm1؏d9#䏯eeggvRBe@Hf=(Kh1/i#TjJjl{<Q9lUGDimߡ;Md|Qg"lUAi{[ XkH[m4\o]Jq$}KtEERހC2SXW)} :qJ@wEhIW;ME\P{2.Q5!gUʆ}08?e=vvBgnG5VKDNԌ1O1T|436;vqABgF KVlJ?cDMY1M^PSϏ|8ZMC]aR v[_V9f}bZ/Ud]C=ga/Oh@diufTmґyUWXZu-[^Je^avTa1dxBcjgJ.d]iNf`jrPaITmcsWfPdZhSV]jAc_m-`ncowbLjGPslqTnVbWRoR)ZYqx@j\r-] t8ats{vHt~Lu{pPvca`T,wW~+V ^dXB[|~G nKDm_OOR~C>XTԄ+TLU]?{DʏmI0J_M&OP=R܊+-RG*]뉛>{C mVG^KNO E=QE*P^i@aN zdRlf&V]h9YMVj.];k`'lcpdhq'\WyH_Zwkca]\{dQ`LYfrc:h)fu'BhhCnhvhnXb`Fw[[bj-^ec[\`gKibj: dl &dmkmzT0iivWykBhZtm Z]0nJ?_pJ9aUq%`r ixr~#2PkrtSsgAW)tXZuI\\v8L^Kwq%g]x ~i1x:M!{sP|f6TG|oWWV|H{Y|7[}C$Z} Ri|~ ~JMrNYa.Yy@[tӄypqsMerQXxsUUJuX;v-\ *wC^x0`~bZxolUcnjYW_o\.Iq6_!; rja*RsZdCt d~g!|mh]bRjx`V6l#cHmei:&ng)oi7p}i~l*l5df`fhThiGj6k9FkmM(ln]mnn~eqja#nF_cfoSedpFgr8hns"(mhsjs~.wi^v^`vwPRbwEd\x7ey'eyxhyg~0{h[K~]]~R` E6a 7c+'Gb/qff$~h%Y]D[Qy^ D_ㅉ6a)&`a&eTD0}gW-\Z3P\^6D"^2"6 _?j&g^ad8~5dz MZYzPN{TA|dW2t}LZ!~] ̀]xe{cEuTXvXLw[@*x]1y`S!zgb |b=jH~aq\W]r_Kta?/uc0ue vxg |yAgoV`md2VoQf4Jph>7qi0r~kYrl? 0vXl t_j\kUlm_Imin=,no/xoOpKoq sqny^vgFsTitHjutX\L`NOCS>7 Va(YVZ\q[i5~WxNS|MVBy`Yq6,\(^I3_C`nmVH{ZZLT|]@A{|_5>}_a'S~ck~d/eVs$U+waK1xc@VyUe4Xyg&zhzi/s}jox Tt9iGJ)uRj?Uv/l63bvml%w7nXGwn^Z{io|rS&q,pICroq>sdr2tsg%7t=stsbyCuRQnwx Hsox=py1qyk$qyr&yxJ{sQl'tGm=Xn1o$eoRBp:\x'Q%j?GolM|np3}6oh(q}}p"}pl ~pvUFy1t]=z-u3\zu'{vrzv |6vl{GFOv{lAUx5:W+>Z:[\Ґ^.i#yt=o}[4P]*_gd`a*c:nV}X<b3tid&)Det"fKfght;ˇi]2j(kkBk?kn0y;;)p)1p'wqyq熮qtS}:|w 1]w|'vew.wIwnz+: ~'0~O' ~1~\~.~mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{OX͙~ʹ~y~eL~j~Qc=9~|4~cl@~]̳~nf~C~لOiZ/gP8v}6q}0}>ϲ:}i^},~"hN~uO 7A胬|.A|33|M|WE|ߓ}OgV}ьN~|M6g\7{cߥ{fǪ{ `{ɞi|+~|fn}CAN.}{5~zʸU/zDzCz{,a{}|$Ye|ȕM}5[~_wzRêzF2 z] z;{|{d|`L}5P4~=cyy@yz:z$| {[@dH|Lo|4}uyZy2yƔyj;zdj{w{ @c{̡L |34=}S~6׆}}p}UR*}u{}că~5Lx~5(=}p@kcyԃ-bKÂ4؂zGetMڽos ČX9wxʂʈaiJ͂&L43oۅO_tz莴r wA`ցNjdJh3\lԟ[7—vx`9Iue3${K͂:X2-{6 uȀ_JH䀯:2ՃsV/&ĤuU^THiS2`rփȥ$ƁWSJЀatk.\^)H;20T7Yn#s]ƞGЕV1||c|:;h|G|rʼni} ]}G{~2Q9*ǔR<6W[䂶q҈=\+3F遢1˄ڣ9Wr݌>WpxpЇh[HwFF1T4B،lkȉR9oهZ؊&Eo0샠ᤔÇ [ޘ:OnkY΅J4D=[05 ֵK\wʤĘRL~nY+ΒDsЌ0EڇDէи\Qڗݧ*mwzXbDsl0VŒj¦ψԖч{Ά=[l)X6NC'/тNA̩ՊMĠ'-7lgWԃٜmCx/O{Y{Q{F '{s~{ju|wV"}9B~P/BB̝ҹ<Ւ4 $~ӁiڍcUƋY1A7.zB!DE.Z.7} }iцJUAtp .!c˒ɒW|-Qh )TX@ۆ.e^fDi{ 3gQSm@]a..4ت`"סp 91zL fS6t@0-؆d VבAȣyf cRƈ?熏 -؄.eNĠ!|iDxFeDRk6?A -LŅq͒rƋwx{(e R?p-@ zɠz|zzur{Vb| P*[|=~ ,j;ӽp|Μsn%tŕb ǀO=n5,IY6ܟn웅φAusPaRPNل[= ,,ĻݔОD[ٚ̏~sd`TNf4<,è靎e!4ڔ&rٹޔVj)0Jp ^*L ;+Ņ􈉰(z&z ~z}HzjlJ!z[{J |9j})Ћį\RfԨف|PZk2"Z}Iʀ69!K)k9wkR{|GsGk]HYEsI 8䎛)ςϝ.4js2{{5j\pYTH`8n)GɬjԋIz,iX͕HTŊV8q*фDb7ɥR zi#fXVQH0k8Z* nԫ^D-yhTWGŐM8>*håڊʨly1hTW|Gj8*5%*؇TLdWɴ艴ux՜MAhF WxKGn/38*yǓyqb -RƇC`q:5ل(!ރ,ǘiq[LOa3R#C'Ή@4C(HaB%7y֙paDQ՚~UB84폿(in.֮z@ILp5`%QB֔4Ff(/\ ̀Ҥp^`žQqBT4(YϞM g<4˨s0p(Wd`PQ[HB 4ꎶ( Qy2yPxybiy[gzhL죡{O>|b1}%to<&؆ѻxE\i[~L,>1%܍2k3w+;iM"AZLb>-1@K&68P.TwOh~_t1S&HNBHƸyw3hzZ%XeK'T>k<1˒3&Nj„B]{vᖛhfғYK֟}>_ 1ݒU&RN:hvıQh?AKYإ/KĞ>X-1܉e',ƓM v͡Fh,YɤRK>UD1q'QZtvQh'9Y̤,KǞW>n20'onщ$yp{6y(nfhy/`췎ySxzND~}46~}y-z4*z{;24{Ё||vBd}.MU~6:hxYjxyxҪ^zzɈ}{d{c|_L}}[5L~?w31֮wȗxhبyyTzAzb{K|G4~ ivGUvޢrwާwxAMyy(zrb {K|,o4$}uoӿv'vͦצ7wϏ/xnxyia9z|J_{m3}u{ҝuv7$v=w䣍wQxs`z I{K33M|ˆhtqѰu'u¸{7v+`wqvx_yI^z2|t'tUAtɛLujnv$wux+_jy[Hz2|6♄x͍xxx8yd \z uz_{IU|3|~uႎ\?(e+kt 9^sHu2ZIQAAًnŀM>.s)]5GdX2Vݿ(%ǔ|B\PtKnr\1\Gņt1݀4DBAdz~{~ҝ~JA~q~[~ F{9m1t0~t~1c}X}Ӟņ=}ߚHp~ [9~V6E~Œ;1Q~2l}~\}^ǚ}C!^}Zo}Z}E~\0~ }Ė}:||ͭM|禛o9}-Z}E!~+0~f}J|'|5D|o;|Xn|դ`Y};D}ȓ=0c~tvٿ|wW-wݗ_x|yCmцz4Y{FD{|0Z~kud5<іZelgX@{C̄,/n*&T5ɇʕ4ЅkWm,C+w/ԁΉB7Ώˍvj3V|Bۅ/9K]́ih"4Ɇ~d1jUދBPy.ӄ[iLz6W b}yiGU]TA؋.l f3D^'DŽΧɃڢ|hsTفݓ=AWr~.'ʠǼcՐj{wh 2TiA .VΈ uͷ6,ׁEخ|lKe}v̊ c)bP‡>P,ńK'&t1uegFU7}EqЄ6L(z򂅤j?tqdȖJJTȊ;E%6(d(pcc`OޗCtN<9d<7TJ8DԎ'6ه(ϣ奖ԜVsϘcƕ"S푟 D5g(Nz]s]F+c_gSAD`5ۊ n([B?Hjr>c eSWD3_5ĉό(ٙltiNw@2Ǐ&z)"{ɪ{.ZblYLJ]b?N@GԄ2҃&GΓ\rys᥎qup[wF\x됔1zf۳n#o²apݻr;su~p`u [vwEx1Qza rÚs9(tN@uhdvpbw[3yNF>z1~|գ}f|r}|h}|}|~|oi~m}OZQ~}Ef]~71!~#{|(|`R|(e}kn\}pYq}D~p0uҞztDzi`{5n{.|mU|%X}%fD}焋0/~܂g.yƽyͩz9ݕz{-l[{tW|sC}L/~Ux٦y0ymByؚZzd}kw{W-{َC|ȊI/}ax5Lxz}xǦy4'y˜jzV{VmB|W/W}9whxxGx~ayKjzmVzBR{)/&}0ͯwj^\w_w趔xEZ}x$iyUz^- dƵ*% -6 v2~ٟxcG~̙P~Ҕ>p,Qtո1~_u~ob~iP[~}>2~,չwpFqLrІtsъiunaZvOx=Pz+|~Dy,yzC7zrJ{6`{Nl|[OLR;a^+ s6Z IMȈ 9-ەo`]L$;و4+ mvUjF|n)j] )FK2:؂fh*|HwT̡n\gK]Ғ :^*Rb!8†­)lmNj\a0K :kĎ *ځZo#+q NrQ{ҒsjCuYߎvIxf8dzs)|쪓xqx狏yX{eyj:/zYA{KH|,8H}B)5~×C,؀^z:Oir)X H7)'Ֆ+ňzey[HOh6YW*kG}7) ߁+KА]qxtfgOW`YG5X7]) Uܧ*rߗ1 וpwg) t%lǎۢv}Tf UF/Ґ 7) /ʥ#ޖ<׮ֆIjuNeD'UbsE놁6ۄ) wͣ o[pqq™ssJb4StR#vpCJx>4hqz_&|6w'xp}xq<`y'aByRzB{4A}&ˈ~Ďjiǚ`"pLa:~Q$BF4&H⟲ƍ~~[oՖI`sHQ CXB>&3'T"Ϗᛞ~,Hos_ߒkPxxAi3L9'*BD}ƒn~T_WPHhA3ɈH'@y̚Vn}2)m^ݑO.)A|,39#'S3~DZi|şPm^sO’AAŎG3ԉ'b@8Įڊ<|9n@m$H^FOJaAq3!'nߐo~pBvqhrYڜtKWv9=ʓx0ezN$|ېvڃlwCuʣwgɟxxYqyPKWDzR={r0j|$Љ~hy~yr~)uUk}gMl}Y`~KA~Z=m~03%ӏ`P^t_fĝadXeJTM=;0q%Q6vX¤yt?f1X7qJY%=Y0%=ÔGɒsːKe͎WЗ͋J‰<쏦0rl%!:-$0s>1+e[22W|5:Iݓ-<<׏30%҆צǟseW7.I_<0|%cōrjrrY?dΚ=V7IqD7<:01&WFnxaokƬq&^rQt1Eu8 w,8z="'|҄nvxJvxkw^ͦwQСxDky8{-%'|#0~SLM};w}|kh|^|Q}/DЛU}8~&-N3~#xX(.w\Mj~^-QJDVM8-o[#͉热0wChjF]̣QDvt8 -$YuvjSʍ]ԋP˝ˊDS@8do-$Rz嘞vj+P]N/P*D6 h8-i/$ ްivi릧|] PnDF8zB-ό$Yv;i5i]PX D 8ό-⌛$͇my0nem}oaεJpV r=JG\s>u3ʜw)z1 |yiuomua3vQV"GwJ_x'>ۡyg4z*|q!~>y>|m{aֲ{V {JU|R>j|4(}*U~" ym\aɁU׀JRX4EY*π~"y߀xm?saaUɅQJ-k>Y4`ɂ*ґH"֊8xƻ&Dm-gat؋UJ"ňG>y4zK+R##xlm$apU%2J >ʉ4Nq+2Q#b:]x am"]jasPU6Jn4>;?4ɉY+VB#݃x{&m'ꝑa|UJ$/?4Y+m臉#yڥqm*ƦsQnIJ+tpW uq釴w0sr&xuB\ywGm{y#2}{ضoxqkxrytOyuz4q"w=z[x{Fz|2%|}n[oQDqT{rށ5WtopvZwр=Ey1{4lnE ocqք sCunu Zv鄶EZx81D{QzӢkG}mŬ nprr;mt!Y?vDxJX0z2XjIlvmɛȖTo#q_lsVXuoGD?wJ0z;PikI mXMnşpl-r2WtڑCCw60[yφ"Јhjwlhqn'p kxr+-WUtdCovΎ{0'yuSh|jSHkēm8ojqVsgCvv/y,Szl$zm{(o,{qT"|Ls j|tV}vB~y/{`x/v}xw0Rx?z>-| 'qro(ksKLt?xufFdvRx11?y؍*-{®q*r ٝrܰsƪ'wotd]vL!QwΖS?=y$-{n`{kR݂m?o ^pvrcȁxtQrv>x,{Iuɀvc_vڈKFwu;xbDyP[]z>|,y}&~٪~ƙX~~6~~t~~b ~OZ~=,FII}t6}}}s}ᄯa0~%N~{=~,||9|`|{r|䊜`^}ENb}<~O+v{{ꕦ{'{ГOq|s_|M} <]}c+~жzؤzz͂{q{n_{1Me|x<}@+~- zK8fzZzdDCzfpSzᛂ^p{kL| `;|ۋ+}׆yWy*zy}zozk]zL{F;|+}ׯf;jNlYn~pGn)r#\)t#KWQvI:@x){sjt]u~vmOw[y JAzJ9ك{)}m |H}#[%}>}V}blo}[,}J-D~;9~)ւR (`)ᄡ|kqDZۂIX 95i)Ɓc,/͌ {qjzYUI#8J)v9?^zCi聱XY">H=8o)_ǚv͊{Hyi9X"HYT8o8)0w%dۂԁáyH hX .(G鏆8AҊ)ۅeăd<}E`UxhbWG48C))jNl?--nuvoeqUm sELv6 x'v{5s>teu t:vdꋍw?TډxE=y5dž{~'}Yl){I`{Ń{t|Ed(d|T<}DD}5~<'@~zۃHrtns$҂jcdPS؁DC_45Y'rX\#_r@ψbP6SC䅑5,CC'ȝ͍ڔ.Ӏڊqb\R0*C4'z)/[-rpވYbapLR+C͉1(%ۄyHgАvY4hPZckLA'>Ԇ1%3c0 v?th:YَK⊋=>g8o1&ƃ'惆uʑ4|gYRJK>)ċ1y"&$lO]Ψ?/^ugѠKgFEY*IKD=c-1c@&4%􈀦li|Qkom]bvIoGUqPG)s:fu.;x#!{Wql{rsoGsb#tTvG_w:Cy>.Oo{#y}1 x{kyEn̝Dyaz2TWfzG{:`8|.\z}#Ƈ~ĀJz͟ln a SMFƑ:7G.e$zf P[AE;Z1ٓ0U)Fj"0΂op~7f ![BPY_EE;T\1撠C)k"djpmfr=[M,1P\ǑES;`Ћ1')}"Ρmfni=pkqr^mtolVurX wtDyw'0|Yz>̾jqźjlr`ntpu0rnvgkbtgwWIv~yCtxz0b{x|bh|~j|l|^n|~pp|j\s}AVtu[}Bw}0z~l;fׇ i 9kDmh5})oviNqꂿUtXBEv=/yVǧeP{qgi卞|l{nohLp(TsuSAv@Z/ryX_dִ2f}}hƖMk/zmtLgdojT3rxAKuI/8xσ[c&5e[}gܞrQj.xylfoDSr d@u/x\ębp vdܫg%iwy3kyenbSq@to.wUad`RfWh-xkkemn)Rq\@?t@.wZtf4uhvjxxm0xyosekz.qR|{itP?|w-~zK'rp{sqԜu#svFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv|cwy|Qy }>z}-R|~H(oYpq݃^s=uPt;bvSPPx <>Ay-|0m{opzrt?s^auQOw+T=y>,{¹luSmoou{psGrlatqOvk?=txj,{ @k mܖnlprxqؔM`WsNuȌ=&x,zj׫4lgmomqq0_s*9N uI_|2so|u]}@vLO}xT;"~z-*|Ly(x*yyr z$yzz~n{D{]{{K||r:}}?* ~%FwzKxx~yDQmz\'z݀K{Ҁw:^|0*~Tۮvvfw`\}xlx[^yᅜJzV:|<*}ktufvV|wkwZyRJz79{*}1Ь&tt̛ku}l{vDEjw7ZxUIy|9{*u|sh$ t$tӟ{2ujYvVYwɓI7y9Kz*h|ersMtTzuuiv>YwKHx9 zL*^|쥋|e;gȈDj,xl{hQnW3qWGrs7rv(jz\nSoqtwƂ\rg~tW v4Fw7#y(k|>wEhpx #xvyofz/VZ{Fh{6ۀ|(k~#H߀ SuezUF6(k^~ˆK~/Y~sIt~]Jd~dMU ~XE}~σY6_5G(k}\}1q}uvs}jd9}~Tv}E~6(~(k8e|ٚR|˜ |vs>|c|S} D}k 5~ (k~ǃJ|4ȑ|$|Cr{c|$Ss|Dj|5}(k~k{{ {4{r{yb{_S|D|5}By(k~!E1d鋩gl}݋hio:Al(`nPއq As3rv%zajmy!o}pnrE_zsPYuAw3Fy&!|0u߉v|1twmkx_^ÆkyFO˅zzDA6{U3|&>}ݖ"#~~G{& ~_lن~q^.~OJ[~@惑~2%&XIf5ˆWȅzG҅+ln]| NۃV@P2&nȔkɎcэZyދkIV\σ)NZ|)@Gꅎ2y&Dž xzj3 \7qMЋ@C2& G_2yxhj~[Ԓ!MnF?ƋJ2x&K:Ʉw i[SOdM#ǒ?Y2m-&(dg sYieߐkXnWJpc{"r}~zsIzgh{L[p{O|4B+|7;S}o,Ox~0"Յ~~vrf=BZܒNـB*7ij,\P#;}}~r4fxO"ZhNMBe@(78,iA#FaN}qǖ*lf Zۋ M2HB-7߅,yY#p9|qeےNYƐ*M}"A튘6؈U,ۅ#||(qW,esY!MANJje6Ç,}#5tPcjOf=_`rhTkHm=op2s(Hv "zbtu5k#jl_-$nnSjpDHrB=tytn2ݑOv)yL |triIs ^ٟtSuSHt#v=_.x02y)B{! }~st(o.w]^`cCcHlVf+;t)i0aldOȯ>tsw[-wnw\-_AMb0ke#SsShA!a7kO|o>#r -v0[Dn^aaShdL%rg{`j哟On-=rfv-vm3Zp]­ `܄cr f؝C` jRNnb=q-vBw~o`^q&ccrfBti quk_wInN1yq<{u8,-}pymjynlpptnRrp/qsr_;utMwv2u6x)Gz_юzb〾eqhbmk~Rր$nCq4u7&y7}Gh}kj}lp}oa~8qR7~sTC#*u4xA' {*{&q{{r~{t&o|2ug`|vQ}AxB}y4N~{.'|y6z?wyz}z!{Loz{`{?|9Q{|BZ|}R4%}}',~w݊|x%|xnnyH _JzP]zLA{3}'9~u)vNovꊍ{wqm9x+2^xOyA{^3|f'C}䁀uA؈u5zvElw>&]xOXy,ABz\3{Ѕ+'L}lltq5u#zUuŖkv{]cwhNx@yҊv3{U'S} sڤtyu01kvu:\vҕ8Nx*@y\3Wz'Y|u_wbviehͅhoZRkXLEni>[Wq0u<$yB˅h.j@ul^h,n{YpKуXr>ul0Ђx $ւ{!pQVqtՂs!g"yK펭gXwOiknjk_EmRekp'E$r9u&-Jw"ք{1ov勋pkTr ^!sQuE"v8腦x-Pz#|`vvwj/xV]y'QTzDąz8{-S}#U~Aq~0uQh~ri\~]BR~PM~Dzk~8"-Z\# ވ9tCLh?\8 PyBXDKh8-]r#LFt5^ hwZ\?O@OgC邡N8Z-ZqW#Ӂ ~؆'sh[ԃ4OC8 ^^-Y#~se"g[uOOCWq8-Sf$QUx3f_)m2bb!dW:gKoj?ln4}q})鉪u= hyPwfmFhbNjVmm͉/}4/U4+d *u"5wtjCԉ _w TYI=6>gg4+* "cjt<ѐlj)(_?JtTO}I o>-4* "(5sIi^SىHӇ؍"> %3*R"ӂmBo^cxaYZdcNgbDLj9ѓAm/qi&όKuByTlec4gYPj#NDlD6 o 9ؑq0[t'w{l1:lbnXoN^qCsp9ŐOu01 w'az|k|s0bt9XuLM"vwCw9y#09z'|A W}k8yalzJWzM{PCv{9~|09}j'~E "jʚրKa=LRWX:M@C69h0<'އ p0jm醤`f,WtMɄB9F0G!n'k!%j'*`V֓iLƑ Bǎ-^9]07(݃+!R|i`"IV˓Y;L`Bōu9*s0Pg(6oZ!v%pb^Y}s`P7cFѠf=ij48m+wqM#uETyUbdY/"fPgi0F\k=q nb4_qK+tZ$hhw-zak$XԥtlOšnxFpj=]wr4mt,1w@$Ō,y|sapqVX}rsOisFS#u =;v4mx=,W_z%{ }a#wxX8Ax!O)xFy=%z~4l}{,vG|%Q#}K~`ݤ]}X }Oq}E~= ~J4ui~,Q%Rυ`fzWANuEO<4u,~E% `v*W؟ON囨xE֗ĆJ<̅/4hׄ*,ۃ>%W D`YWӞNEӗp?|sk2}v%z0xtkumwvoiVw(qh[3xVsCLyu7?){#wI1|y%~|Eqtrruutvh{uUwZyvxLrxy{1{|U& }}Ǝo|q}Strh}gts}YuH~Kw~M>ox~1z~&%}=T"n!Hot pyfruXt4KSu> w1z:^&9|Zl΍|)nTrsVo͋!eqZXis(Ju=w-$1ky&J|$k•vmWrnڑempr/WrFJntYl=v1Wy{&X{Tj&lrAndogWq"J$s=[v1/x&c{imZ{8]o\2a\b~DdU/^h G΁k:o~.2s#lxA~bz~einh aAjTmcGfp=:Js@.|v#z.|`jy|lm}n`}\pS}rF~Qt:^~v.pyU#〽{z.rxztl{uM`.{v~SK|4wFt|y :}zn.g~{$}xDzwx{Ykyu{_Uz|ERz|F{};9|}.c}~f$<*vvwqkxS^xɁR&yEzF9{À.P}$_~XauzNv&vAjWv^wjQx@3P5i+U"Mv~h"la~sa~[VP~<"K~AG?~oy5L~+Z3"ǁ v)}rk}a}zU}bJ}tW?}5~,+_~"Zu|k|ד/`|ʑU|J`|ˌ?[}5}U+W~;#pu^Zf]p\ms`Qd6Fzg;ϊk1zMox'هsqxZo4a`fd [䍉fQL$iFtl};9o1r(pve >z#nheUj[LlPĊQnFq;|s1gv(B;x j1{n;odqZrP7t Eou;:Jwd1o-y9(b+{5 H}@m,vpc=w^Y6xAOy EI z:{1\|0(}=}_!~l䈺}McY}Yh}O-~D~U:~1\~(nZ!@lZbԆƒX׃YNڂDX:1nF(!qQkubXNUDu:I1K(Á*!kᐿbI9XmSNMHDA[:m1F(р!-eޛ1Y\\S`AI픟c@"gh6fkL-Wo_%Wsxbe"G`}\k?c)S.eIh?Xk6jo+-Wr%[vJzd'g,[ԕ?iLR3kI=m?pJ6VDr-u%x{dm[8KoPRYpH͏=r?d t62v-x%܆zc}csWt3ZuIQv`HXwz?$x6z-{d&|~[bzZ=K{:Q7u{Hw|+>p|5r}T-~&(~8rbY5PgGm>v~5؇n-n&Hi 7_b*φYSPG}>n5Ճ=- &h} f6$aYoP㊄Gf݈>r85Ɔ-̄lq& ځ[\XSP\1J垦_BHic&9f1',k )_koL"^s^xhZڢ_pRԟbJ}dBh9 kG1=|n)r`"ϋGv:>zZkeR^gJ!j8Al9^dom1ArM)׍ZuK#-xw†{Z kQmI1o[ApqR91sq1&ـX/zP[Hޔ8@ő=e8Ў1108*_K_$J[cXoP͖)aHɓ~S@8֍z1E*t$c,4i\U+2_Y&c]}Lf0`litd[lhK;pm(;tq,xv媋X_a\ob`3_eW|'cWhLkfkIZjnaJnq:s4u4+wy>UgiY>k\m~z`ojxdqYhsIm7v :@qx+w{vR=ssKVct&Zduy^lviSbwYgy I:kz]9p{+v7}BOw}BS}nX"}x4\d}h[`}XIe~>Hj~9o~+unM Q†=V8w=Zg}_]WdQEH8i9To +t"K)sOׅT*vzY@uf^WcCGhV9"nt+tiIN$!SMuXfD]7VbeGg8m+t+Hp7M{RK\upW!e\;8VXaGDgb8mr+scU5fiY:Ih]'ukxaeqn,dUqhF/t(m77+wq)[{Xw +`0^呣caEeetc0QgCnll05q)|v#bQ1MU"|YnM]Џ_b,,Qf֊Ckp5p)vMUPjT|Xsm\*_OaZPf!Bk)O5zp)uR[k5UVmYV{'n]=mpa^gsdOuLiASwmI3vzq&}w+g^jbiazl dlnLg]pjOsIn@vqk3Fy/u'&|yQdagx fixialkknB\npNuqpr@tut3#wx<'{{Satpad@qwfsWiit[lv5Mow@ s4yb2v{1'*z}.^y.[ayvfdzhg{%[j{Mng|l?r }&2u}'>z~ގ\ƁR_uwc h f1gZYi"Lm+?Rq2u)'Oyk]Zi{^MtagWdԇmYh]IL!l()?p* 2t}']x聫Y\t`L/fc'Y3g`!KkU>o}2ts'ix}ƌX|Y[7s_YvfJbҒXfKdj>n2Ks'rx'rU~LsYqqu)]Odva#WFx eIyiOr7)t.̂wY&y߂=|eǀq,\rS€t JWuz@߀w7sx.zN&Ł | *l}e~w\M5xS3OyIXzf@{j{77R|.}&E~ i dv}d~}[}~R~~Im~!@$~P07(~_.~' +c|([j|Rq|*I>}{@}U7}[.~='~k c{*[{ʊOR|#H|Q?|U6}.}'$~x W^㓈TVXN \fE%`a<~d3h*ˊm#Mr&w^[U^MwvbDep;ȋyi 3 l*dp#u yU]XgbUEddL=gD:jb;}md2.p+s#wl&z\hT jLClCȈo6;+q2̆t.+zv$0{y|e\ oT&pKErECKAs:5u28w+$Fy$aw{}[u uaS{~v|KGwBx:y2z+17|@$}+~Z{S |'Js|B|:n}w2~+GM~$<gZFpRJhTB\:4݀2P7+?$ہ2 Z3HHR'Jy B_τ:b2ZM+|߂$/TܜT#MZWE [>_6&d.`5h'Emm| r҈~wToRaX1R^DteA6lC*sJ>9Dz|JoP`V+R]LD,d}b6k^*rރK(f9k'y7oԃ-}t$ysyTJnXc]EXa@`MUeBj]7`o7-ct@>$ywlsQltWU+buYdVwU]KBxb?zf4|k*W~p!dvuoXkp\La.r_VtscJvbgC?Vx~k04zoO*l}Ds!xtkq`jmcj`4ofVUAqiKJtlX>vo4Oy!r*u{v" ~z{sLhh9igjju_llT|odnIlqqS>{ts4!wve*zy8"M}|/re)ohRgqs^ jsSmBtHpv)>*s2w4vfy*y{"} }q!bwvgexa]phy7RkpzH^nz=q{3uK|*x}"|`pS`k~fc\f5Rei@Gm1W=yp3tW*x("{р8o^f4a\AeAQh3Gxl=!oɂ3sY*w"{]2o9]$e`[deQgG.k%`[nb 5f,Mk$bCq5ՄvaCjWY[OPGJ^G6b=f4Ձ{j,[o8$sRqx`C|^X |aO}dF~.g=~kC4n,Z\rv$OvaIz[_Tye^W"zgN{j_E{l=|o4T}r,N~u% xI{^pvOlVNwnMxoEFyq<{t4|Nv6,B}x%0zkn}G]srUult!MGvunDx!vb.8XfH0j(fo "5sxV]IO;`uGc?vg7(j/nX(Ճr6"vFgzLUҁcNvfSF܂7i?#4k7P(n/,q(?u%"rxЂ{U)j Ml&F9nL>1p7 ar/u_(w"`z)}T_|p[M}qE~sz>-~|u6~v/Mx(z#t|ts~;SzvyL{wEB|{xt=} yn6{}z/k~2{)~|#D~!{3SAx|YLz/|D{&}-={}6@|}/:}R~x)~#o~RwqKxDz=qzX6U{/h||)'}c#~~NؓOHJSAqX:=\2av+#f%AzkqovM̐UGRY}@]_9}?aq2le+jO%lo RsGxM[F,_?Ռ)b8f2i+y1m%q [v/; z>LxaE|d?1g8{j1ɇm+eoqF%jt xM{Kڈ^gESj!>{l8o1q+\t%τwb }zA|KAmDƅo>@qn7Ąs^1s9up+cw%y!&| aN~JsDL t=v"7w{1Lx+Zmz&|![}~JLy/C炗y=z7V^{X1-|2+E} &2~!~ځ,I|~CR~=U~71l~1$0+T|&(!ĀTmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92EJL`KqJڪMϩVȨaŪk¬u}ŶʲЫ֤ܚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚ82EJK`IqHۭJЬRɬ]ƯgñqyIJˬХ՝ړޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ82EJJ_HpFܯGҰNʱWȶbźlxŭ˧ϠӘ׏ڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏ82DKI_FoDݳCӶH̷Q\lxƩʢΛєԌ׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌72DKG^DnA߸>ֽBJ¾\lxƥɞ̘ϑҊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊ72DKF^Bm>};yN_kzpwtuwsyr{q}poˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀ )A$U5eFpTy{avhrnoqmtkwjyizh|g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@OTNdOuQڥXѢbɟmşwžùǶ˳ϱԮקէէէէէէէէէէէէէէ9*F@NTMdNtOۧUҥ_ʣiŢt¡}øȵͱӮاڡ֡֡֡֡֡֡֡֡֡֡֡֡֡֡9*F@MTLdLtNܪSҩ[˦fƥpåzøɳϰիڠܛ؛؛؛؛؛؛؛؛؛؛؛؛؛؛8*E@LTKcKsLݭPԬX̪bǪlĪv~¸ɳϬգښܖؖؖؖؖؖؖؖؖؖؖؖؖؖؖ8*E@KSJcIrJްMհUΰ^ɰhƲsò|ɮϥ՜ڕّّّّّّّّّّّّّّܑ8*E@JSHbHqH߳JֵQжZ̸eʽq{ȦΝԔ؎یٌٌٌٌٌٌٌٌٌٌٌٌٌٌ8*E@ISGaFpFGٻNӿWcpyǠ͗Ҏׇه؇؇؇؇؇؇؇؇؇؇؇؇؇؇7*D@HREaDoC}DJTbnxǛ̓Њԃւււււււււււււււ7*DAFRD`BnA{BFRamxƘʐΈтӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀ7*DAEQB_?l>x@FQ`mxŕȎˇ΂6*CACP?]Rcpzċņǂ5*BA?7J0R/U,h0BWgs|2*8=/E)H%R)l1EZit|~~~~~~~~~~~~~~~0*/8&<;#W*o5J]ku{~}{zyyyyyyyyyyyyyyy.*%0-A#Z.o<O_lt~x{{y}xvāuÃtÄs†s†s†s†s†s†s†s†s†s†s†s†s†s†s†$%#,F&[5lDzSb|lxquusxqzp|o~ǹm̂l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄ 1G,Y]?fCmMoNYfqyĆǀ|zyyyyyyyyyyyyy5"B7AE=P;Y69A4H3M6P6g;{HXgr{|zzzzzzzzzzzzzz2":43=.B/A.U3k;~J[is{}{ywwwwwwwwwwwwww1"31+6&6&A,Z3n=M^ktz}|zywussssssssssssss.!*+",-#G+]6oB}R`l~s{wx{v~tǀsƂqńpćnĊnËnËnËnËnËnËnËnËnËnËnËnËnË* "3#J.^FJFVHbKmOwU^lȷqw}Ɣɐˌ̊ɊƊƊƊƊƊƊƊƊƊƊƊ6C.F>EJEUFaIkNtU{ajĺpu{ŎȊʆˆɆƆƆƆƆƆƆƆƆƆƆƆ5B.E=DICTD_GhMpVudzinty~ĈDŽɀʁȂƂƂƂƂƂƂƂƂƂƂƂ5B.D=BHASB]FeMkXmazgmrw}Â}z{}}}}}}}}}}}}5B.B<@G>Q@YD`NcYg`yfkpv{}xvuwwwwwwwwwwww4A.@;=E;N>UDYOZQlZ}biqw~|yvtrrrrrrrrrrrr3A/=::C8J;OENF_KqR[fpx|ywvtttttttttttt3>.975?5D9EBHDRHZNaVgbmgmrx~‚ƒ3A&B3@=@GBOGWM]X``lf~kqv|}{}3A&A2?<>EAMESNVZW^kd}jotzzwtwzzzzzzzzzzz3A&?1<:IDMOMWV]jc{hmsx~ytqnqttttttttttt3@&<0989?%9.656::WEgKuS^h|qxwt}pȂnLJkŋiĐhĖfÞeåeåeåeåeåeåeåeåeåeåeå//*"$!# -55I4N?\JfUoy^urd{nk~jphueyc}bځ`ڄ_ه]؋\א[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔  !.,?7MDXOaxYhq_mjdqgjtdowbty`xz_{{]~|\}[~ZYXXXXXXXXXXX   $//==IIRxTZpZ_i_ddegaji^nk\rm[vnZyoX|pW~pVqUrTsStStStStStStStStStStSt'-49~BCwMJnSPgYUb^X^d[[h]Yl^Wp`VsaUvbTxbS{cR}dQdPeOfOfOfOfOfOfOfOfOfOfOf*(~82vD:mKAeQF_WI[]LXbNUfPSjQRmRPpSOrTNuTMwUMyUL{VK~WJWJWJWJWJWJWJWJWJWJWJW->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;VG[Ta`hkpuz䇃߂~zwtrpnmll¤nĤoĤoĤoĤoĤoĤoĤoĤoĤoĤoĤ->K.Q:TGXS^_djluv~䊀߅ۀ|yvsqonmn§p§q§q§q§q§q§q§q§q§q§q§->J-O:QFVR[^aihtq~|߉ۃ{wtrpooqrssssssssss->J-M9OESQX\^herm|wߌۇց}yurporstuuuuuuuuuu->I-L9NDQPV[\fbqi{s}ۊքzvsqqtuvwwwwwwwwww->I,J8LCOOTZYe_ofyoyێևҁ|xussuwxyyyyyyyyyy->H,H7JBMMRXWc]mcwkuܒ~ӌ̆ƀ|yvvwyz{{{{{{{{{{->G,G7HAKLPVUa[kati~ޟsԘ}ˑĊ|zyz{}}}}}}}}}}}->F+F6GAIKNUS^Yh`qhz٥s͜zŕ~}}~->E+D5E@HILSR\Xe_mްivҩqȠx~-=D*C5D>FHKQPYWa^iڴisͬo¤v|-=C*B4B=EFJOOVV]`dԸgrȯmtz-=A*@3A2?;BBGINOWS^_˾dqjpv|~,=?(=1>9A@FEMIXK\^cphntz{xwz||||||||||,==';0<7?)F:MKUZ\hbwgm~svypŁjĉfÒbÜ`æ_ô_¨aaaaaaaaaa,51 .#-"3:.B@IPN_Ul\wc~jvqoyk΀g̈dʐbɘ`ɡ_ɫ_ɹ\â\â\â\â\â\â\â\â\â\â,0,'&- 73>EETLbRnXx}`vipqkxheцbύ`Δ^Λ]ͣ\ͭ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ,+$+&48>KGV}Q^vYen_jhendkraqt_vv]{x[yYzX|W}V~TSSSSSSSSSS   +06=@H}KQuTXmZ]g`bcfe_kg\piZtkXxlW|nUoTpSqRqQrPsPsPsPsPsPsPsPsPsPs־ "!..9:|DCtNJlTPeZT`_X]eZZj\Wn^Ur_Tv`RyaQ}bPcOdNdMeLfLfLfLfLfLfLfLfLfLf %1*|<4sF;jLAcSF^YIZ^LVcNThPRlQPoROrSNvTLyUK|UJVIWHXGXGXGXGXGXGXGXGXGXGX'{3$q<,hC2aJ7[P;VV=S\@P`ANdCLhDJkEInFHqFGtGFvHEyHD|ICIBJBJBJBJBJBJBJBJBJBJ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9G%N1U=[HaSh^ohxp~xz~vspnkjhgffǔfДhГiДiДiДiДiДiДiДiДiД( 9F$M0T >(@0C8H?NEUK޻^TдdeŬksqx~' 7=='?/B6G0C4L6R?YQ¾`bfpl}rx~}xustwx¨x¨x¨x¨x¨x¨x¨x¨x¨' 588#9(<,B.L-O=WP^`doj|pv||vrommp§r§r§r§r§r§r§r§r§r§& 466!6%9'@&I(NNLVY]eco~jxvpnwhc·_ΐ[͚YͥWβV“VДWϕWϕWϕWϕWϕWϕWϕWϕWϕ& ,& '4#=3EBKPR\Xf|_ntfulmzfua}]܆ZۏX٘VءTجTطSɋS֋S֋S֋S֋S֋S֋S֋S֋S֋$ &  &2(;8CFKRR\|Yds^kjdpeluatx^|{[}YVߒUޚSޢRݪQݶQݿQݿQݿQݿQݿQݿQݿQݿQݿ!   &1,;:DGLQ|SZsY`k_fefjamm]tpZzsXtVvTxSyQzP{O|N|N|N|N|N|N|N|N|N|  ' 2.=;EE{MNrTUkZZd`_`gb\meYrgWxiU~jSlQmPnNoMpLqKrKrKrKrKrKrKrKrKr )!4.?9{GAqNHjTNcZR^`VZfXWlZUq\Sv^Qz_O`NaLbKcJdIeHfHfHfHfHfHfHfHfHfͻ, 7+zA4pG;hMAaTE\ZIX_KUeMRjOPnQNrRLwSK{TIUHVGWFWDXDYDYDYDYDYDYDYDYDY".y8%n>-fE2_L7YR;UX>Q]@ObBLfCJjDInEGrFFvGEzHC~HBIAJ@K?K?K?K?K?K?K?K?K?K $w-l3c:$\B(VI,QO/NU1KZ3H^5Fb6Df7Ci8Al8@p9?s:>w:={;<~<:<:=:=:=:=:=:=:=:=:=u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁v$w5yBI'Q2X=_HfQ~nZywbuiqnmskvhyf{d}cba`Ă_΂_׃aۃc݃d݃d݃d݃d݃d݃d݃d݃d݃w$x5|AH'O2V=]GdQlZ|tbxitoptlxj{g~fdba`Dž`Ӆbمd܅eۆeۆeۆeۆeۆeۆeۆeۆeۆx$x5~@G&N1U<[FbPiYqb{{ivprunyk}ifecbaˇbՇdڇeوgىg؉g؉g؉g؉g؉g؉g؉g؉y#y4?F&M0S;ZE`OgYna~xiyptvp{mjgedbÉbЊd؊f؊g׋h֌i֌i֌i֌i֌i֌i֌i֌i֌y#z4>E%L/Q:WD]NeXkati|pwvs|okhfdcnjcԌf֌hՍiԎjԎkԎkԎkԎkԎkԎkԎkԎkԎz#{4=D$J.N8TBZLaVi_phzp{wv|qmjgfeǎfԏhӏjӐkґlґmґmґmґmґmґmґmґmґ{#|4<C$H-L7RAXJ_Tf]nfwo态v{}uqnkihhϓkѓlГmДoГoѓoѓoѓoѓoѓoѓoѓoѓ|#}4;A#F,K5P?VH]Qc[kdumކ~u؀|zvromlkȖmϖoΖpϖqϕrϕrϕrϕrϕrϕrϕrϕrϕ|#}4:@"E+I4NEK2TC[Saahmnwtz{upmjiÜk˛n̚o̙o̙o̙o̙o̙o̙o̙o̙!+ 3214;?I0RBYQ`_fklur~xztojgdcd͘g͘h͗h͗h͗h͗h͗h͗h͗h͗!) 0.,/8 =H.P@XO^]dhjrpz{vt}nhda^]]Д`ДaДaДaДaДaДaДaДaД!( , (& (2 >G,O=VL\Ybehn{ovtu|m|hc_[YXWԎYӏZӐZӐZӐZӐZӐZӐZӐZӐ!'' !  0=F,N:UH[Ua`|gitnpmuvg|{b˄~^ʍZʗWʣUʯT˾SՆTوUىUىUىUىUىUىUىUى% /:"C1J>PJWT|^]tedlljftoa|s\لvYَyU٘{Sڣ|Qڰ}P۾}P|P~QQQQQQQQ  .9'B5IAPK{WSr]Zjc`dje_ri[zlWnSqPrNtLuKvJvJvKuKuKuKuKuKuKuKu !.9*B6JA{RIrWPi\VccZ]i^YpaUwcRfOgMiKkJlImHmGnFnFnFnFnFnFnFnFnӺ "/:+C5zL>qQEhVKa[O\bSWhVToXQuZN|\L]J_H`GaFbEcDdCdCdCdCdCdCdCdCdֲľ %2<)yE2oJ9gO?_UCZ[GUaJRgLOlNMrOKxQI~RGSETCUBVAW@X@X@X@X@X@X@X@X@XƸ  (4w<%mB,eG2]M6WS:SY=O_?LdAJiCHnDFsEDyFB~GAH?I>J=K$[D)TJ,PQ/LW2I\3F`5De6Bi7An8?s9=w:<|;;<9=8=7>6>6>6>6>6>6>6>6>|q$ h+_2W9Q?LF!HM#ER%BW'@[(>_)vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj$i2 l>vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj#i1 n>wE|M(~T3|\E%L.S8ZAaKiS|q[v|bqhmmiqfucxaz`{_|_}b}c~df߀g߀g߀g߀g߀g߀g߀g߀g߀o!o0 ~6<D$L-R6Y@`IfRnZ|yawhrnmsjwgze|c~bÀbӁd߁eނg݂h݃i݃i݃i݃i݃i݃i݃i݃i݃p!r/ 4;C"K+Q4W=]FdOkXu`|hwnrtnyk}hfee˄f܄hۅiۅkۅlۅlۅlۅlۅlۅlۅlۅlۅq!t. 3:C!I)N2T;[DbMiUs^ۂ|f|owurzoljiiĈi؈kوlوmوoڇoڇoڇoڇoڇoڇoڇoڇq v, 2:B G'L/R8X@_IgRڏp\чxfʁo|vw|tqomllϋn׋o؊p؊qىqىqىqىqىqىqىqىr x+ 09AE%J-P4V<\EܛeOғm\ʌufÆ}ov|}xusqppɍqՍs֌t֋t؊t؊t؊t؊t؊t؊t؊t؊s z* /9?C#H*N1T8\@՟bN˘k[Ñrfzow}}ywuttŏuԎvՍwՍw֋w֋w֋w֋w֋w֋w֋w֋s |) /8=A!F'L-R3ܪY?УaMƜiZpewov}~{yxxyӐzԏzՍ{֌{֌{֌{֌{֌{֌{֌{֌t~( .8<?D$J)Q.֮W>˧_MgZneun|v}~}}~Б~ӏ~Ԏ~Ս~Ս~Ս~Ս~Ս~Ս~Ս~Սt'.7:=B H$߷N,ѱU=Ǫ^LeYldsnzv|̑ӐԏՍՍՍՍՍՍՍՍu&- 68;?FڻK+ʹT<®\KcXjcqmwu~|}{ɑ|Ӑ|ԏ}Ս}Ս}Ս}Ս}Ս}Ս}Ս}Սu%- 568=EվI*ȸS;[JbWhbolut|{|yvtƑuӐvԏxՍxՍxՍxՍxՍxՍxՍxՍv$, 235:?H)ĻQ9YH`Ugamktszz{vronÐnӏpԎrՍrՍrՍrՍrՍrՍrՍrՍw", 0 /17 ;F'P8XG_Te_kirqxx~ztoliggՎiՍl֌l֌l֌l֌l֌l֌l֌l֌x!+, * + 29E%N6VE]Rc]igpovvy}|snieca`ҋc׋e؊e؊e؊e؊e؊e؊e؊e؊z )'$$'7C#L4TB[ObZhdnlytrs{xm}hc_][ZЇ\ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ~& %5A!K1R?YL`Wf`zlgssmlzsgwb{^~ZXVUρVނX݂X݂X݂X݂X݂X݂X݂X݂ &6@I-Q;XH^R{eZskalrgfylaǁp]ƊtYƔvVşxSƬyRƻzQyQzS|S|S|S|S|S|S|S| &4? G-O9VD{]LsdTlkZfr_ayd\ԂgXԋjUԕmRԠnPԭoNռpMoMpNrNrNrNrNrNrNrNrع  ' 4>$G0N:zTCqZJiaPdhU_pYZx\V_SbPdMeKgJgIgHgJgJgJgJgJgJgJgJg ۱ʽ (5?&G1yN9pT@hZFa`K]gOXnRTuUQ}WNYK[H\F^D_C_B`A`A`A`A`A`A`A`A`ާ˶ +6@&xH/oM6gS<`X@[_DVeGRlIOrKKyMHOEQCRAS?T=U=VLh@InAFuCC|D@F=G4>3?3?3?3?3?3?3?3? y o( g0_7X>RDLJ"HP$DU&AZ'>_);d*:i+8n,6t-4z.3/1000.1-2-2-2-2-2-2-2-2 ujb!Z) S1M8H>CD?JwFxN(wV1t_:nhAjsHf~NbS_V\ZZ\X^W`UaTbScSdRdTdVdXdYeZfZfZfZfZfZfZfb$^/j5 t<zD|L'{T0w\9reAloHh{NdS`X][[^Y`XbVcUdTeSfTfVfYfZg[h\h\h\h\h\h\h\hc$_.m3 w:}BJ&R0|[8wcAplHlwOgTcY`\]_[bYdXfWgVhUhViYh[i\j]k^k^k^k^k^k^k^kd#a-p2 {8@I%Q.Y7|a@viHpsOlUhZd^aa_d]f[hZjYkYkYk[l]m^n_n`o`o`o`o`o`o`oe#d+s0 ~6?H$O-W6^>|fFvpNq{UmZi_ecbf`i^k]l\m\n]n^o_qaqbrcrcrcrcrcrcrcrf#g)w. 5>G"N+U3\_JeUl^sfzlrw|{wtrƒrڃsށt߀uuuuuuuo#+,,16ɻCM.V<]IdTj]qexkqvyzu~qnlkՂmށo߀pppppppq!)'&*5ĿAL-T;[GbRi[ocvj~|oxtsyo|khfeрfh~j~j~j~j~j~j~j~u % "3 @J+S9ZEaPgYm`~tgxzmrrmvhyd|a~_~_~_}b}c|c|c|c|c|c|c|x0 >H(Q6XB_MeVk]xrdryilngrbu_x\zZzYzXz[z]y]y]y]y]y]y]y} . ;F%O3V?]IcRxjYqp_kwdfiam]pYrVtTtStStTuVuVuVuVuVuVuVuٸ +9D"M/T;[DxbMqiSkoYev^`~b\‡fXhUkRlPmOmOlOnPoPoPoPoPoPoPoگͻ +9CK*S5yZ?qaFjhLeoR`vV[~ZWχ]Sϑ_PϜaNϩcLϸcKcLbJeKfKfKfKfKfKfKf ަδ¿ - 9B J*wP3oX;i_AcfF^nJZuNV}QR߆SOߐVMߛWKXIYHYHYGYF[F[F[F[F[F[F[ѭ¸ .:C!vJ*nP1fV7`\<[d@WkCSrFPzIMKJMHNEPCQBQARAR@Q@Q@Q@Q@Q@Q@QԥIJ$1~;tB lH'eO-^U1Y[5Ub8Qh;Mo=Jv?G~ADCBE@F>G4>3?3?3?3?3?3?3? v$n- f5_<XCSINO!JU$F[&C`'@f)>k*;r+9y-6.4/1001.2-3,3,3,3,3,3,3,3}rha'Z/ T7N>IDEJAO>U;Y9_6d4i2p /w!-"+#($'%&&%&%&%&%&%&%&%&xo d\T N'H/C6 ?< sHrQ&oZ.jc6enxqFs{MnSjXg]e`ccae`g_h_i`iajbjcjdieieieieieiei^#i"v#, 6>EL"S*Z2߅e;~mExvMtTpZl^ibgeehdjckclcldmflglhkhkhkhkhkhkhk_#k y"+4 <CJP&X.׊a:΄jE~sMy{Uu[q`ndlgjjhlgngogohoiojnkmkmkmkmkmkmkm_#n{!*2 :AGM!ږU-Ϗ^9ȉgDoM~wUy[v`sephnllnkpkqkrlqmpmpnonnnnnnnnnnnna!p~ )1 8 >DߠJӚR+ʓ\8dCmMtT~|[zawetirmpporosospsprqqqpqpqpqpqpqpqpc r'/6 ;@ڤFΞQ*ŗZ7bBjLrTy[`|eyjwmupssstsutttsuruqupupupupupupet&-4 7 =ԧDɡO)X6`BhKoSvZ~`e}j{nyqxswuwvxuxtxsxqxqxqxqxqxqxqgw$+03ܮ7 ϪCťN(W5_AfJmStZ{`ejn~q}t|u}|v|}v|}t}|s}|r}|q}|q}|q}|q}|q}|qiy#),/ײ4 ˭AL'U4]@dIkRrYy_dimq|tyvwvvvvtwsxrxqxqxqxqxqxqk{!&'ߴ)ҵ2 ǰ@K&S3[>cHiQpXw^~di~mzqvssuqvovptqsrrsqsqsqsqsqsqm~" ں!͸1 ´>I$R1Z=aGhOnWu]|c}hxltpprmtjuiuitksmqmqmqmqmqmqmqpӽȻ/<G#P0X;_EfNlUs[}zawfrjnnjqfsdscscreqgpgpgpgpgpgpgpsپ -:F!O-V9^CdLjS|qYvx_qclhhkdn`p^q]q]p^p`oaoaoaoaoaoaow׵ *8DM+U6\@bI|iPvoVpv[k}`fdbg^j[lXmWmWlWlZlZlZlZlZlZlZl| ح ͸ '6AK(S3Z<}aEvgKpmQjtVe|[`_\bXeUfSgRgRgQhShThThThThThTh ۥαŻ#3 ?H$Q.}X8v_?ofFilKdsP_{T[XW[T]Q_O`M`M_LaMbMbMbMbMbMbMb Ъŵ / <F~O)vV2o^9hd?ckD^sIZzLVʃORʍROʘTMʥVKʳWJWIVIXGYHZHZHZHZHZHZԢǯ !0 ;}DuM$nU+g\2bd7]k;Yr?UzCRڃENڍHLژJIڥKH۳LGLFLFLDOCOCOCOCOCOCOۚʩ %3 {<sDkK"dR(^Y-Y`2Uh5Ro8Ow;L=I?GADBBCAD@D@D@D@C@C@C@C@C@Cͣ (x2 p;iCbJ\P#VW'R^+Oe-Ll0Is2F{4C6A7>9=:;;:<9<8<8<8<8<8<8<8<|t&l0 e8^@XGSMOT KZ"Ha%Eg&Bm(@u*=}+:-8.6/40312212121212121212yog"`,Z4 T<OCJIGOCU@[>a;f9m6t 4}!1#/$-%,&+&*')')')')')')'~ukb[T&N.I5E< AC >H;N8S5X3^1d.j,r*z'%$#"!!!!!!~pg^ VOI C'?.:47:3?0D.I ,N )S 'X %^ #d !l t }L*H3O4T7ZA\JZTW`$Tk*Px/M3J6G9F;EC?B?B@AAAAABABABBADAFBGBGBGBGBGBGBM)J2Q2W6\?^I]SZ^$Wi*Su/P4M7J:HFNW&~a1xj:ssBo|HlMiQfUdXcZa\`^`_`_a_a_c_d_d^d^d^d^d^d^[ ht~#+4 ;CJڊT%Ѓ]0~g:xoBtxHqNnRkViZg\e_dadbdbdbebfag`h`h`h`h`h`h`]jw!)18 ?ݔGҎQ$ʈ[/ƒd9~lAytHu|NrSoWm[k^j`hchdhehdidjckbkakakakakaka_mz'.5; ֘C̓O"čX.a8iA~qHzyNwStXq[o_nbmdlflflfmendncnbnbnbnbnbnbao|$+1ݠ6 ќAǗM!V-_7g@nH~vN{}SxXv\t_rbqepgphpgqfrerdrcrcrcrcrcrccq!',ؤ2̟@ÚK U,]7e?lGsM{S}Wz\x`vcuftgththugvfueududududududet#ߦ&ҧ0ȣ>IS+[6c?jFqMxRW\}`{czf~yh{yizyiyzhzzfzyezydzydzydzydzydzydgv۫Ϊ/Ħ=HQ*Y4a>hEoLvR}W[_~czfw~hu}is~is~ht~ft}eu|du|du|du|du|du|dixծʭ-;FP)X3_bpC^wGZKVNSPPRMTLTKTKTJUJVJVJVJVJVJV֘ɥ(6 AyJrR&lZ-fa2ah7\oqHjPdX%__*[g/Wn3Sv6P9Lӈ;JӔ>GӠ?EԮ@DԿAC@D@BBADADADADADADјå }&u2n<gEaM\U W]$Td'Pk*Ms-J|0H2E4C5A6@7?7?7?6=8=8=8=8=8=8ơyq'j2d; ^CXKSRPYL` Ig#Go%Dw'A)?*=,;-9.8/7/7/6/6/6/6/6/6/{tmf&_/Z8 T@PGLNHUE[Bb@h=p:x8 6"4#2$1%0&/&.&.&.&.&.&.&yphaZ#T+O3J;FB CI @O=U:[8a5h3o0x.,*)('&&&&&&xlc\UOI&D.@4<;9A6F3L1Q .W ,] *d (l %u #! yk^VO IC> 9'5-23.8+=(B&G$L"Q W^enx        B-B2H2L6N<PGPRN_KkHw$E'B*A,?.?/>0=1=2<2<3;3;4;4;4<3<3=4?5?5?5?5?5?5C,D0J0N4Q:SFRQQ]Ni Kt$H(E+C-B/A0@1?2?3>4>4>5=5=5>5>5?4?6A7A7A7A7A7A7D,G.M.Q2T9WDVOTZQf Nr%K})H,F.E0D2C3B4B5A6A6@7@7@7@7A6A7A8C9D9D9D9D9D9E+I,P,U/Y7\B[MXWVc Ro%Oz*L-J0H2G4F5E6E7D8D8D9C9D9D9D9D:E;FH?J@J@J@J@J@J@G*P'X&^*c3f= fGdQ`[ \g&Yr+V}/S3Q5P7N9M;LK>L=K?KAJBLCMCNCNCNCNCNCJ(T$\#c(h0l; lDjNfXab%^m+[x0X4V7T9S;Q=Q>P?O@O@OAOAOCNENFPFQGQGQGQGQGQGM%W!` h&n.r8 rApKmTh^$di*at0^~4[8Y;W>U@TBSCRDRERFRFRHRIRJTJUJUJUJUJUJUJP#[dm$s+w5x>wGtPoZ"ke)go/cy5`:]>[AYCXEWGVIVJUKUKVLVMVMXMYMYMYMYMYMYMS ^hq"x(|1~: }CzLvWra(mk/it6e};b@`C^F]H[KZLYNYOYOZPZPZP[P\P]O]O]O]O]OValu |%.7 ?H}Sw]'rg0np7jxHQ%X._5f<}mAxtFs{KoOkRgUdXaY_Z_Y_Y_XaWaWaWaWaWaWo  ߍҘʢ© /<FO#V,]3}d9wk?rqDnyHiLePaS^U[WZXYWYWYV[U[U[U[U[U[Us ̜ؑå ,9DM T)}\0wb6qi|HuP!oX'j_-ee2`l6\t:X|>UAQDNFLHJHIHIHHIHJHJHJHJHJHJΔ¡ /{; tEnNhV!c]'^d+Zk/Vr3S{6O9LG?F@E@E?DACBCCCCCCCCCC֍ƛ y*r7lBfKaS\[Xb#Ti'Qq*Mz-J΃0HΎ2EΚ4CΨ5Bθ6A5A5@7?9>9>9>9>9>9ʖx sn&h3b> ]HYPUXQ`NgKo Hx#Fށ%Cތ'Aޘ)?ަ*>ߵ*=*=*<+;-:.:.:.:.:.vnic'^2X;TD OLLSI[FbDjAr?{<: 8!7"6#5#4#4#4#4#4#4#4#uid^Y&T0O8K@GG DN AU?\A;G8N5T 3Z 1a /i ,r *} (&%$#""""""sgYSMHC?&:-73390?.D+J)P'V$]"e ny         tgXMGB <840%,+)0%5#: ?DIOV^hr~      9/<0A1D4D:DEEQ C]Ai>v<:9 8!7#7#6$6%6%5&5&5&5&5&6&6&6&6'6(6(6(6(6(9/>/D/F2H8HCHO G[DgBs?=$=%=&<'<(;);););*;*;)<)<*;+;,;-;-;-;-;-<-D)J)N,Q4R>RJ PUMaJmHxE"C$B&A'@(@)?*?+?+?+?,?,?+?,?->/>0?0?0?0?0?0@*H&N&R)V2W<WG UQR]PiMt J#H&G(F)E*D+D,C-C-C.C.C.D-C0B1B2B3C4C4C4C4C4C'K#R"X'\/]9^C [NXXUdRo Pz$M'L)J+I-I.H/G/G0G0G0H0G2G4F5F6F7H7H7H7H7H7F$O V]$a,c5d@ bJ^T[_Xk Uu%S(Q+O-N/M0L1L2K3K4J5K5K6J8J:J:K;L;L;L;L;L;J!S[b"g)i2j< hFePa[^f [q%X{)V,T/R2Q4P5O7N8N9N:N:O;N=N=N>O>P>P>P>P>P>MV_g l&o.p8oB lKiWebal%]v*[~/Y2W5V7T9S;SR?R?R?RARASASATATATATATAPZdlq#u*v3v= sGoSk^fg&cq+`y0^4\7Z:YW@VBVCUCVDVDWDWDXDXDXDXDXDXDS]hpv z&|.|8zD uOpZlc&hl,fu1c}5a9_<]?\A[CZEZFYGZGZG[G[G\F\F\F\F\F\FU`ktz")ނ3@ zLvVq`%nh,kq2hy6f:d=b@`C_E^G^I]J]J^J_I_I`H`G`G`G`G`GXcnw~#և.̃= I{Sv]%se,om2mu7j|;h>fAeDcGbIbKaLaLbLcKcJdIdIdIdIdIdIZfqz݋Ћ,Lj; GQ{Z$wb+tj1qr6oy;m?kBiEhHfJfLeMeNfNgLgKhKhJhJhJhJhJ\ht}֏ˎ*Œ8 DOX#|`+xh1uo6sv;q}?oBmElHkKjMiNiOjOkNkLkKkKkKkKkKkK^kv ۏ Вǒ'6BMV"^*}e0zl5ws:u{>sBrFpIoLnN}nO{mPznPyoNyoMyoLyoKyoKyoKyoKyoK`m y ۋ ԑ ̕•%4AKT!\)c/~j5|q9zx=xBvEuI|sLyrNvrPurPsrPtsOtsMtsLtsLtsLtsLtsLtsLbo { ކՎϔ ǘ#2?IR Z(a.h4o9v=}~A}{EzyIvxLswNqwPovPnwPnwOnwNnwMowLowLowLowLowLd r ~ڈАʗ›!0=GPX'_-f3m8t={{AxEtHq}Km|Nk|Oi{Ph|Ph|Oi|Ni|Mj{Lj{Lj{Lj{Lj{Lf uԋ˓Ě.; ENV%],d2k7zrmBiFeIbK_M^N\N]M]L]K^K^K^K^K^Km|Ոʒ )6 AJR!~Z(y`.tg3on8kuQ@OBMCLCLCKCKDKDKDKDKDKD}ϋ–-}9 wCqLkSfZ"ba&^h+Zo.Vw2S5O8L:JE?E?E?E?E?ڃǑ {(u5o@ iIdQ_X[_ Wf$Tn'Qv*M-J0H2E4C4B5C4B5A7@7@7@7@7@7΋{tp"k0f<aE \NXVT]QdNlKt"H~$EȈ'Cȕ(AȢ*?ȱ+>+>*>+=-<.<.<.<.<.ē{pg d`*\6XATJ PR MZJbGiErB|@؇=ؓ<ء:ٰ 9 9 9 8"7#7#7#7#7#{pe]ZV'R2N<JDGMEU B\ @d>l;v9754221111111{ocXTQM&I/E8A?>G94 0,)&""',16<AHOW a l y 116.:/;2;9;C9O8\ 6h 4t2100//.........//......3/9,=->0?6?A=M<<;::9999999:9!9#9$9$9%9%9%9%<'C#H"L&O/P9NCLO J[HfEqC|BA@?? > >!>!>!>!>!?!>#=%='=(=(=(=(=(=(?#G LQ$U,V5U?SJ PVNbKmIwGFE D!C"C#C#B$B$C$C$C%B(B*B+A+A,A,A,A,A,C JPW![(\2[;YF VQT]QhOrM|K J!I#H$G&G'F(F(F)F*G*F,F.F/F/F/F/F/F/F/FNV\`%b-b7`A]L ZXXcUnRwP"O$M'L(L*K+J,J-J.J/K/J1J2J2K3K3K3K3K3K3JRZaf!h)h2g<dH aT^^[iXr V{$T'R*Q,P.O/O1N2N3N4N4N5O6O6O6O6O6O6O6O6MU_fkm$n,m6kCgOdZ`d]m"[v&Y~)W,V/U1T3S4R6R7R8R8R9S9S9S9T8T8T8T8T8OYcjort&t1q?mKiVf`ci"`q'^y+\.[1Y3X5W7W9V:V;VZ?Z?[>[>\=\<\<\<\<\`>`=`=`=`=Wb l t z ~ ҁȁ'6|B xMuVr_"of'ln,ju0h|3g6e9db@bBbBbCcBcAd@d?d?d?d?d?Yd n w}Ԃ ̄Å$4@ |KyTv\!sd&qk+or/my3k6j9h I}RzZ wa&uh+so/qw3o~6n:m=k?|kByjCxjDvjEvkCvkBvkAvl@vl@vl@vl@vl@] it|ЃɈÊ /< GP~X|_%yf*wm.ut2t|6r9|q=yp@voBtnDrnEpnEpoDpoCqoAqo@qp@qp@qp@qp@_kvˆŋ -: ENV]$~d)|k-zr2}xy5zw9wvf~Ac~Ca}D`}D_}C`}B`}Aa}@a}@a}@a}@a}@gtLj&3? HPX z_%ve*rl.ns2j{6f9c<`?]A[BZCZBZA[@[@[?[?[?[?jx̓Œ#1< FNzVu]#pc(lj,hq0ey4a7^:Z=X?V@T@T@T?U?U>U>U>U>U>o|ȇ .9 CyLtSoZ ja%fh)co-_w0[4X7U9R;P=O=O,=-=-=-=-=-ljsj gc(_5[?WH TP PXM_JfHnExBÂ@Î>Ü<ë ;ü!:!;!9"8$8$8$8$8$uj^YW!U.Q9NCKLISF[ Cc Ak>u<р:ь8њ6ѩ5ѻ45433333uj^TL JH&F2D<BE?M=U;]9f7o 5z 3 1 0..--,,,,,vj^SIEB@$=.:68>6F3M1U/]-e+p){(&%$#""""""wj]QF?<96 3(10.6+=)D'J%R#Z cn{xj]PD:52 .+(!&'#- 39?EMU_jx       yk^PC8/+'$!#(-28? F OYer,/0,2,30160A/M-Z+f)s(~ ' ' ' & &&&&&&&&&&''&&&&&&.,3)5*6-645?3K2W0d.p ,{ , + +****)))))**+***))))1)6&9&:);2;=9H7T5`3l 2w 0 0//.........//.......4&9#=#>&A/A9?E=P;\9h 7s 6~5443333333334332322228#= AE#G,G6F@DLAX?d >o>=========< qInRl[ibgj"fq%dx(c+a.`0_3_5^6^8^8_7~_6~`5~`4~`4~`4~`4~`4U`ipuxz{z/x<uF sPpXn`kg!jn%hu(g|+f.d1c4c6|b7zb9yb9xc8xc7xd6xd5xd5xd5xd5xd5Wblsx{} ~~,|9yD wNtVr]pd nk$lr(kz+j.~i1{h4xg6vf8tf9sf:rf9rg8rg7rh6rh5rh5rh5rh5Yenv{ *7}B {KxTv[tb ri$qp'~ow+{n.xm1vl4sk6pj8nj:mj:lj:mk8mk7mk6mk6mk6mk6mk6[gqy~ (5@ I}R{Yy`wg#|un'ytu*vs}.sr1pq4mp6ko8io:ho:go:go8ho7ho6ho6ho6ho6ho6^jt|%3> GPW~^{|e"xzl&tys*qx{-nw0kv3hu6ft8ds9bs:bs:bs8cs7cs6cs6cs6cs6cs6amw#0<ENU{\wc!sj%oq)l}y,i|/f{2cz5`y7^y8]y9\y9]y8]x7^x6^x5^x5^x5^x5dpz .9C LzSuZqa nh#jo'gw+c.`1]3[6Y7W8W7W7X~6X~5X~5X~5X~5X~5ht~+7A yItQpXl_hf!em%at(^},[/X1U3S5R5Q5Q5R4R4R3R3R3R3ly '~4y>sG oOjVf]cc_j"\r%Y{(U+R.P0N1L2L2L2L2L1L1L1L1L1q~|#w0r;mD hLdT`Z]aYhVp!Sy$P'M)J,H-G-F-F-F.F.F.F.F.F.w}wso,j7eAaI ]QZXW_SfPnMvJ!H$E&C'B(A'A'@(@)@)@)@)@)~ul ie'a3^=ZFVN SU P\McJkGtE~B@> < < < ;!:":#:#:#:#yma]Z X-T8QBNJLRIY F` DhAq?|<:8767554444{ocXP ML%J1G;EDCLAT>\=<&;19;8E6M5V3^1h0s.,ۍ*ܝ)ܭ(('&& & & & ~qeYMC:5 31 0*.3-<+D*L(T']%g#s" reYLA8/- +(&$$+"2!9AIQZersfYK@5,&$ !"(.5<CL V b ougZK?3)!  # (.5=FQ]k{',**+**.&4%?#K!X dp{     )*,'.'-*,2+=)I'U%a#m"x"!!!!!!!!!!!!!"" " ! ! ! ! ! ,&0$1#1&2/1:/F-R+^)i(u''&&&& & & & & & & & ' ' & & & &&&&/#3 57#8,876B4N2Z0e.p-{-, , , + + + + + + , , , , ,,,,,,,37:= ?(?2=>;I9U7a5l4v3 2 2 2 1 1 1 1 1 1 2 2 2111111117;?CF$F.D9BD?P=\FJDVCbAl @u ?~ >==<<<;;;<<<<<<<<<<>DJOQR#Q-O8MEKQI\Gf FpExDCBBAA@@@@AAAAAAAAABG OSVWV%U1S?RLPW Na LjJrIzHGGFFEEEEE F!F!F"F!F!F!F!F!EK S W Z[ZZ+Z;XHVS T\ RePmOuN|MLKJJ!I"I#I$J$J$J%K$K$K$K$K$K$H OV[ ^ ^ _`'_6^C[N YXWaUiTpSxRQP O"N#N%N&N'N'N'O'O'P&P&P&P&P&J SZ_bc ce#e2c@aK ^T\][eYlXsVzU T"T$S&R'R)R*R*S*S)T)T(T(T(T(T(LV]cghhj i/h<eG cQ aZ_a^i\p[wZ~!Y#X%W'W)V+V,V,W,W+X*X*X)X)X)X)OY`gjllmn,l9jDhN fWd^be`l_s^{!]$\&[([*Z,}Z-|Z.zZ.z[-z\,y\+z\*z\*z\*z\*Q[djnpp qq)p7nBlK jTh\fceicpbx!a$`&}_){_+x^-v^.u^/t^/t_.t_,t`+t`+t`+t`+t`+S^gmqss uu't4r?pI nRlYj`ighnfu!}e}$zd&wd)uc+rb-pb/ob/nb/nc.nc-nc,nc+nc+nc+nc+U`iptwwxy$x2v=tG rOpWo^md}lkzks wjz#ti&rh)og,mg.kf/if0if0ig/ig-ig,jg+jg+jg+jg+Xclsxzz{|"|/z;xE wMuUs\{rbxpiuop rnx#om&ml)jl+hk.fk/dj0ck0ck/dk-dk-ek,ek,ek,ek,[fov{~~-9}C {K ~zSzxZvwasugptnmsv"jr&hq(ep+bp-`o/_o/^o/^o/_o-_o,`o,`o,`o,`o,^iry+6@~I yQu}Xr|_n{ekzlhyt"ex}%bw'`v*]u,[u.Zt/Yu/Yt.Yt-Zt,Zt+Zt+Zt+Zt+amv} (4~>yG tOpVm]icfjcr `~z#]}&Z|)X{+V{,T{-S{-Tz-Tz,Ty+Uy*Uy*Uy*Uy*eqz $}1x;sD oL kTgZdaah^p[x!X$U&R)P*O+N+N+N*O*O)O)O)O)ju{!w-r8mBiJ eQbX^_[fXmUvR!O#M%K'I(H(H'I(I'I'I'I'I'o{~wso)k5f?bG_O \VX\UcSkPsM}JG!E#D#C#C#C$C$C$C$C$C$utn jf%c1_;[DXKUS RZ OaMhJqG{DB@>====<< < < |{oc_\Z+W6T@QHNOKW I^ Ff DnAx?<:988776666sgZS QO$M0J:HCFKDRAZ?b=k :u 8 64321100000ui^SGCB@'?2><5-% $#"%!. 7@JS^jx{naTH=3*" &-5=FP[i x }obUG;1'  # ) 08ALXfwqcVH:/% #*2<GTcs")#'#( +1=IVbnx$'&$&$$'"/ :FS_ju'#) ) (#)-'7%C#O![fq{+--. /)/4,?*K(W&b%m$w############$$$$$ $ $ $ $ .1256%6/4:1F/R-],h+r*{***)))))***** + * * * * * * 258;= <*;59A6M4X3c2m2v11000//// 0 0 1 1 111111169>ACB#A.>:=Ft ={ = < <<;;;;;;<<<<<<<<= BH K LLJJ,K;JHHSG]Ff Dn Cv C}BAA@@@@@@AAAAABBB@ FLOP O OQ'Q6PCONMXLa Ji IpHxGGFFEEEEEEFFFFGGGBJPTVU UV"W2V?TJSTQ] PdNlMsLzLKJJIIIIJJKKKKKKEMTY[[Z[\.[;ZFXPVY U`ShRoQvP}PONNNN N!N!O O OPPPPGQX]``^ `a*`7^C]M[U Y]XdWkVrUyTSSRR!R"R#}R#|S"|S!{T!{T {T {T {T JT\addc de'd4c@aJ_R ^Z]a[hZoYvX}XW}V {V"yV#wV$vV$uW$uW#uX"uX!uX!uX!uX!MW_dghghi$h2g=eGdO bW a^_e^l]s}]z{\y[v[!tZ#rZ$qZ%pZ%o[%o[#o["o["o[!o[!o[!OZbgkljkl!l/k:iDhM fU e\db}bizbpxaxu`s_p_!n^#l^%k^&j^&i^%j_$j_#j_"j_"j_"j_"R]eknonopp,o8mBlK jR ~iY{h`wffufnreupd~mckc"ib$gb%eb&db&db&eb$ec#ec"ec"ec"ec"U`hnqsqrst*s6r@pH}oP ymWvl^skdpjlmiski|hhfg!dg#bf%`f&_f&_f&`f$`f#`f#af"af"af"Xckquwuv wx'w3v=|uFxsN urUqq\npckojinqfnzcmal!_k#]k%[k&Zk&Zk%[k$[j#\j"\j"\j"\j"[fnty{yz {|$|1|{;wzDsyL pxS lwZivaguhdtoasx^r\q Zq"Xp$Vp%Up%Up%Up$Vo#Vo"Wo"Wo"Wo"_irx}~!{.w9rBnJk~Q h}Xd|_b{f_zm\yuYxWxTw!Rv"Qv#Pv$Pv#Pu#Qu"Qt!Qt!Qt!Qt!cmv}}yu+q6m?iGeO bV _\\cZkWsT}QO~M~ K}!J}"J}!K|!K{ K{ K{ K{ K{ gr{|vrn'j2f<cD`L\S ZZ WaThQqOzLJHFEEEEEEEEmxtn if"c.`8\AYIVPTW Q^ NfLnIxFDB@????????s~{le`][)X4U=REPMMTK[ Hc Fk CuA><:99998888zuh[V SQ#O/L8JAHIFPCXA_?h=r :} 8 6433322222ymaUKGED'B2A;?C=K;S9[7d5n3y1/.- ,, + + * * * }qdYMB; 875)423;2D1L/U.^,h*t)'&$###""""sg[OD:0* ('&'%0$9#B"K!U _lz͊͜ήuh\PD90(  "+4=HS_m~ߑ wj]PD8.%   ! ) 1 ;EQ^nyk^QC7-#  %.7BN]n{m`RD7+!  !)3>K[l&$%'.:G S _ k u           #!!$,7DP\gr{""! )4@LXcnw%&$%&%$0!;HT_is|)*),,!,+)7'C%O#Z"d!n!w!!!    !!!!""#######,.0332%00.<,I*U*_)i)r(z(((((((((()****** * * 02 6 8975(352B2O1Z1d0m0u0|/////////00 0 0 0 0 0 0 0 3 6< > =<99-:<:I9T9^8g7o7v6}6655 5 5 5 5 5 6 6 6777777;@BB ?>@'A6ADAO@Y?a>i=q=x< < ; ; ; ; :;;;<<<<<<<:@EHHF EG"H1H?GJFTE]DdClBs Bz A A @@@@@@@AAABBBB<DJNOMKMN-N:MFLOKXJ`Ig Hn Gu F|FEEEEEEEFFFGGGG?HOSUSQ RS)S6RBQKPTO\Nc Mj LqKxKJJIIIIJJ~K~K}K}K}K}KCLSXYXV WX%X2W>VHUQTXR_ Rf QmPtO{ONN}N{MzNxNwNwOvOvOvOvOvOFPW\^]Z[\"\/[;ZEYMXUW\ Vc UjTq~Tx|SzRxRvRtRrRqRpRpSpSpSpSpSpSISZ_ba^_``,`8^B]K\R[Y Z` }Yg{XnxXuvW}tWrVoVnVlVkVjVjWjWjWkWkWkWLV^beebbcd)c5b?aH`P}_W z^] w]d u\ks\rp[{n[lZjZhZfZeZeZeZeZeZeZeZeZOYafhief gh'g2f=eF{dMxcT ub[ raa paim`pk_yi_g^e^c^a^`^`^`^`^`^a^a^a^R\dillij jk$k0~j:ziCvhKsgRpgY mf` kefhdnfdvdcbc`b^b\b[b[b[b[b\b\b\b\bU_glpolmno!}o-yo8unArmInlPkkW ik^ fjedilait_h~]g[gYfWfVfVfVfWfWfWfWfWfYbjpsspqr|sxs*ts5ps?mrGjqNgqU dp\ boc_oj]nrZm|XmVlTlRkQkQkQkRkRjRjRjRj\fntwvuvzwvxry'oy2kx<hxDewLbwS_vZ ]ua ZuhXtpUsySsQrOrMqLqKqLqLpMpMoMoMo`jrx{zzz{t| o~l~$i/f9bB_~I]}PZ}W W|^ U|e R{nPzwNzKyIyHxFxFxFwGvGvGuGuGueow}~sl he b,_6\?YFWNTUR\ Oc Mk KtHFDBA@AA~A}A}A}A}ju}yjd`]['X2U;SCPJNRLYI`Gh Er B}@><;:;;;;;;q{se\W TR"P-M6K?IGGNEUC]Ae>o <:9)827;5C4K2S1\/f-q+*('&&%%%%%xk_SH=4/-, +)*2):(C'L&U$_#k"x {nbVJ?5,$ &/8AJUaoƑǤǹ~qdXK@5+#   ! * 4 > I U brԄԘԫsfYL?4*!    (1<GTctuhZM@3(  %.9ESdvwj\O@3'  *5CRcv#!! $ +7DQ]hr{ ) 4 AMYdnw%0=I U ` j s |   ",8DP[fow""!"" '2>KV`jrz&% ( )(& $+!8 DP[emu}   !"""#####) *./ -+("&/&='J'U(_(h(o'w'~''''''((())******-0342 .,.(/70D0O0Y0b0j/q/x///...///00011111058:95 46"818?8J8T7]7d6l6s6y55555555 5 6 6 7 7 7 7 7 3:?BB>;>?,?:?E?O>X=_=g^qF\pMYpTWp[UobSoj Pns Nn~LmJmIlHlGlGlHkHkHjHjHj^gnrrqzqqrktfucv`w(^w3[x<YwCVwKTwRRvYPv`NuhKuq It| GtEsCsBsAsBrBrBqCpCpCpclsvuvuvixcz^|\}Y~$W/U8S@PHN~OL~VJ~]H}eF}nC|y A| ?{ >{<{<{v;9 8 6 6 6 6 6 6 6 6 ox~wk^UNJHG%E/D8B@@G?O=V;_9h7s5310////// / v}peZOFA >=;(:19:7B6J5R3Z1d/o-{,*)(''''''~vj^TI@7210!.*-2,:+C*K)T(^&i%v#" }ocWMC80($#!! )1:BLVao~uh[PE;1' &.7ALW e t zl`SG<1' $,6@LYhy̌˟˳|obUH;0&  "*4?KZj}ݑݤ޶qdVI</$  '1=KZltfXK=/$  #.;J[m  (5ANZenw %1>JVaks{  "-9FQ\fow~( 4 ALWajrz   ".:F R \ e m u |   &3?KV_how}""%$! *8EPZbjqx~   !!""#####%(*+(! !$$%2&?'J'T']'d'l'r'y'''''(((()******(.353-*-.,/:/E0O/X/_/f/m/s.z.....///0011111-5:=<73 46'747@7J7S6Z6a6h5o5u5|555555566777772;ADC?; ;<"=0=;=E=Nk >k `inmmxmlnap[rVt RuPvNw'Lw1Kx9IxAHxIFxPDwWBw_@wh>ws<83245*555@5I5P5W5^5d4k4r4y4~4}4{5y5x5w6v6t7t7t7t7t75=BDB>98::&;1;;;D;L;S:Z~:`}:g{:ny:uw:~v:t:r:q:o;n;m;m<l<l<l<l<9BGHFC?> ??!@-@7@@}@H{@Oy@Vw?]u?cs?jq?rp?zn?l?k?i?h?g@f@f@e@e@e@e@>FKLJGCCCD~D){E4yE=vEEtDLrDSpDYnD`lCgkCoiCwgCfCdCbCaD`D`D_E_E`E`D`DAINOMKGGG|HxH&uI0sI:pIBnIIlHPjHVhH]fHdeHlcHuaG`G^H]H[H[H ZHZIZIZHZHZHELRQPNJJzKvLrL#oL-mM6jL?hLFfLMdLSbLZaLa_Li^Lr\L|ZLYLWLVLUL UL ULULULVLVLHPUTSQMzNuO pOmP jP*gP3eP<cPCaPJ_PQ]PX\P_ZPgYPpWPzUPTPRPQP PP PP PPQPQOQOQOKSWVUT|PuQpR kShTeT'bT1`T9^TA\THZTOYTVWT]VTeTTnRTxQTOTNTLTLT KT LTLSLSMSMSNVZYXWwTpUjVfWbW`X$]X.[Y7YY?WYFVYMTYTSY[QYcOXlNXvLXJXIXHXGXGXGXGWHWHWHWQY\[[}ZrXkYeZ`[]\Z\!X]+V]4T^<S^DQ^KP^RN^YL^aK]jI]tG]E]D]C]B]B]B\B\C[C[C[U]_^^x]m\e]__Z` WaUbRb(Qc1Oc9NcALcHKcOIcVGc^EcgDcqBc}@b?b>b=b`>`>`Yaaaataia_bYdTf QgNgLh$Ki-Ii6Hi>FjEEjLCjTBj\@ie>io=:731 12 3+353>}3F{3My3Tw3Zv3at3gr4oq4wo4n4l4j5i5h5g6f6f6f6f6f67>BA?<8677|8'z81w9:u9Bs9Iq9Pp9Wn9]l9dk9ki9th9~f9d9c:b:a:`;_;_;_;_;_;;BEDC@=;};y<u=#s=-p=6n=?l=Fk=Mi=Sg=Zf=ad=hc=qa>{_>^>\>[?Z?Z?Y?Y?Y?Y?Y??FHGFD@|?w@ s@oA lA*jA3hA;fBCdBJcAPaAW`B^^Be]Bn[BxZBXBWBVCUCTCTCTCTCTCTCBIKJIG}CvCqD mDjEgE'dE0bE8`E?_EG]EM[ETZF[YFcWFlVFvTFSFRGPGPGOGOGOGOGOGPGEMMLKJxFqGlGhHdHaI$_I-]I5[I=YIDWIJVIQUJYTJaRJiQJtOJNJMJLKKKJKJKKKKJKJKJHPOON{MsIlJgKbL_L\M!ZM*XM2VM:TMASNHRNOPNWON_NNgLNrKN}INHNGOFOFOFOFNFNGNGNLRQQQwPnLgNbO]P ZPWQUQ'SQ0QR8PR?NRFMRMLSUJS]ISeHSoFS{ESCSBSASASASARBRBRBQOTTT}SsSiQbR\SXT TURUOV$NV-LW5KW<JWDHWKGXRFXZDXcCXmAXy@X>X=Xc>=cEg4*!  "+5@N]nvgZNB7,"   )4BQbuɊɟʱn`SF:/$  (4CTg|fYL?2$ '5FXk,9EPZckrx~ (4ALV_fmtz "/;GQZbiouz )6AKT\cjpu{ "/;ENW^djpu{'3>HQX_ejpv|   ,7BJRY_ekqw~   $0;DLSZ`flry!%"*5>GNU[agmt|~}|zyxxx"),*'#$/9AIPV\bi} p| xz y!w!u"t"s#r#p$o$o$n$n$)020.*'# #$%*%4&=}&D|&Kz&Rx&Xw&^u&et'lr'tq'}o(n(l(k)j)i*g*g+f+f*f*/66540-*)*|+%y+/w,8u,@s,Gq,Mp,Tn,Zm,ak-hj-ph-zg.e.d.b/a/a0`0_0_0_0_04;::8520{/w0t0!q1+o14m1<k1Cj1Jh2Pg2We2]d2eb2ma3w_3^3]4[4Z5Z5Y5Y5X5X5Y58>>=<:}7x4t4 p5m5j5'h60f68d6?c6Fa6M`6S^7Z]7b\7jZ8tY8W8V9U9T9S:S:S:S:S9S9<A@@?~=x:s8n9j9g9d:$b:,`:4^:<];C[;JZ;PX;WW;_VN>N>M>N>N=N=?CCCBz@s=m<h=d=a>^>!\>)Z>1X>9W>@U?FT?MS?UR@\P@eO@oNAzMAKAJAIBIBIBIBIAIAIACEEEEvCo@h@cA_A \AYBWB&UB.SB6QB=OBCOCKNCRMDZLDcJDmIExHEGEEEEFDFDFDEDEEEEEFHHH{GrFjBcC^DZE VETFQF#OF+NF3LG:KGAJGIIHPHHXGHaFIkDIvCIBIAI@I?J?J?I@I@H@HIJJJwJnIeE^GYHUIQJOJLJ!JK)IK1GK8FL?ELFDLNCMVBM_AMh@Mt>M=MQS=R\U+=V24\F3]N1]W0]a/]l.]z,]+]*]*])]*\*[+[+ZUUUrUgV^VTWLYE[?]:_6` 4a2b1b#0b+/c2.c:-cB,cJ*dS)d](di'dv&d%d$d#d"d#c#b$a$aXXzYnYcYZZP\H^A`:c4f/h ,i*i)j(j&'j.&k5%k=$kF#kO"lY lelrlllkkjihh\\u\i]_]V^LaCdk7n0q)u"x{}}}~"~*~1~:~DNZh x  ~ ~ } } | { zewejeafVhLkBo9s1w*z#~    # + 3=HTaq~jqjgk[lPpFtQez)5AMV_fmty $1=HRZbiouz +7BLU]djpuz%1<GPW^ejpuz +6@JRY_ejouz$/:CLSY_djou{  (3=EMSY_djpv~   ,6? G N T Z _ e k r y  }|{{{ %/9AHOU[agnu}~|zxwutsqqqp%%#! )3<C~J|PzVy\wbvitqszqonlkjihhgg&***(%"|$z.w6v>tErKqQoXn^lek mi vh!f!e"c"b#a#`$`$_$_$_$,///-*(}$z" v#s# q$)o$2m$:k%Aj%Gh%Mf%Te%Zd&ab&ia&r_'}^']([)Z)Z*Y*X*X*X*X*13332/y-u*r( o(k)i)%g*-e*5c*=b*C`*J_+P^+W\+^[,fY,oX-zW-V.T.S/S/R/R/R/R/R/66665y3s1o/k.h-d.b.!`/*^/1\/9[/@Y/FX/MW0SV0[T1cS1lR2wQ2O3N3M3M4L4L4L4L4L39999|9t7n4i3e2a2 ^2\3Z3&X3.V35U4<S4CR4JQ4PP5XN5`M6jL6uK7J7I8H8G8G8G8G8G8G8;<<<x<p:j7d6`6\6 Y7V7T7#R7+P72O89M8@L8GK8NJ9UI9^H:hG:sF;E;D<C<B<B=B<B<B<B;=>>>u>l=f:`9[:W:S;Q;N; L;(K;/I<6G<=G\C>fB?qA?~@??@>@=@=@=@=@>?>?@@A|AqAh@a<[=V>R>N?L?I?G@%F@,D@3C@:BABAAI@AQ?BZ>Bc=CoE8=E?*VF)VO(WY'Wd&Wr%W$W#W"W"W"W#V#U$UMNuNiN_OVOMPER?S9V3X/Z+[*[(\'\$&\+%\3$]:#]C"]L!]V ^a^n^~^^^]]\[[Q~QpQdR[RRSJTAW;Y5[.^(`$b "c!cd d'd.d6e>eGeQe]ejezeeeedcbbTxUkU`VWVOWFY=\6_0b)d#gjllmm!m)m0m9nBnLnXnenu n n m m l k k jYrYfY\ZTZJ\A_9c1f*i$loru www w# w* w3 w< wGwRw_wowwvvuttt{]m]b^Y^N`EcM]pduWyK~?4)  &3ARdy\PD8,!  &5EWkӂӗөҸUI=0%  '8J]r &2=HRZbiouz !,8CMU]djpuz '2=GPX_ejpuz!-7AJRY_ejotz &1;DLSY_diotz  +5>FMTY_dinu{$.7@GNTY^diov~   '19AHNTY_dkrz~}{yxvuu t s s    * 3 ; B I~ O} T{ Zz `x gw nu vt r p omlkjiii~${-y6w=vDtJsPqVp\nbmjksi}hfecbba```"#$#" ~|z wtq(o0n8l?kEiKhQfXe^cfbo`y_]\[ZYXXXX'((('{%v#s q nki#g,e3c:bA`G_M^T\[[bY kX vV!U!T"S"R#Q#Q$Q$Q$Q#+,,-|,t*o(k%i"f!c"a"_#']#/\#6Z#=Y$CW$JV$PU$WS%_R%hQ&sO&N'M(L(K)K)J)J)K)K)./00w/o.j+e*c'_' \'Z'X($V(+U(2S(9R)@P)FO)MN)TM*\L*eJ+pI+|H,G-F-E.E.E.E.E.E-123|3r3k1e/`-],Y, V,T,R, P,(N-/M-6L-<J-CI-JH.QG.YF/cE0mC0zB1A1A2@2?2?2@2@2@2355y6n5f5a2\0W0T0Q0N0L1J1%H1,G12F19D1@C2GB2OA3W@3`?4k>5x=5<6;6;6:6:6;6;6;6678u8k8c7]6W3S4O4K4 I4F5E5"C5)A5/@56?6=>6D=7L<7U;8^:8i99v897:7:6:5:6:6:697989~:r;h;_:Y9S6N7J8F8 D9A9?9>9&<9-;:4::;9;B8;J7;S6<\52>1>1>1>1>2=2=;<{<n=d=\=U<N:I;E<A=>=<=:>9>#7>*6?15?84?@3@H2@P1@Z0Ae/Ar.B-B-B,B+B,B,B-A-A=>w?k?a@Y?R?I>D?@@K9L3N.P(S$T "U UVV$V,V3W;WDWNWYXfXuXXWWWVUUItJfK\KSKKLDM[6_.b&fjmps vx xyyyz&z/z9zDzPz_zpzzzyxxwj[_[V[L\B`9c0h(l ptw{ ~  (1<IWh{e`\`QaFdPdz͑ͤʹMA5) !1CVk !-8CMU]ciotz (3>HPX^djotz#.8BKRY_ejotz (2<EMSY_dintz",6?GMTY^chntz &08@GNSX]chnt| )2:AHMSX]ciow~}{zyxwxx  #,4;BHNS}X|^{dyjxrv{tsqpnmmlll  ~%|.z6x<wCuHtNsTqYp_nfmnkxjhg e d c c b b b }|| x u r (p 0o 7m >l Dk Ji Oh Ug \e cckbu`_]\[ZYYYY~xtqq oli"g*f2d9c?bE`K_Q]X\_ZhYrW}VTSRQQQQQ ""#w"p!ligfca_&]-\4Z;YAXGVMUTS\RdQnOzNMKJJIIIJ$%&{'q&j%f#b!`^ [YW"U)T0S7Q=PCOJMQLXKaIkH wG F!D"D"C"C#C#C#C"')*v*m*e)`'\%Y#W!U!R!P!N!%M",L"3J"9I"@H"FG#ME#UD$^C$iB%u@&?&>'>'='=(=(='>'*+-r-h-a,\+X(T&Q&N% L%J&H&"G&)E&/D&6C'<A'C@'K?(S>)\=)f<*r;*:+9+8,7,7,8,8,8,,.{/o0e0]/X.S+P*L*I* F*D*B*A*%?*,>+3=+9<+@;,H:,P9-Y8.d7.p6/5/4030202030304//1w2k2b2Z2T1O/K-G.D.A.?.=.;."9/)8//7/660>50F51N41W32b22n13}03/4.4-4-4.4/3/313t4h5^5W4Q4K2F1B2?2<2 938363 43&33-24414;05C05L/6U.6`-7l,7{+7*8)8(8(8)8*7*745q6e7[7T7M6G6B5=6:677 472718/8$.8+-92,99+9A*:I*:S);^(;j';y&<%<$<#<#<$<%;%;6|8m9b9X:Q9J9D9=99:5;2;/<-=,=*=!)=((>/'>6&>>%?G$?P#@["@h!@v @AAAA@@ ?9x:i;^<U<M<G<@<8=4>0@-A*B 'B&C$C#C%"C,!D3 D;DDENEYEeEtEFFFEEDD<s=f>[?R?J?D?=@6A1C,D'F$G !H III"I)J0J8JAJKKUKbKqKKKKKJJI?o@aAWBNBGBAB:C2E-G(I#KMO PPPP%P,Q4Q=QGQRQ_RmR~ Q Q Q Q P POyCjD]DSEKEDE>F6H/J)L$OQSV WXXX X( X0 X9 XC XN XZXhXyXXXWWWVsFdGYHPHHHAI:J2M+P%R UXZ] ` ` ```#`+`4`=`I`U`c`s`___^^^lJ_KUKLLEL=N5P.S'V Y\_b eg ghhhi&i.i8iCiOi]imiihhgfffOZOQOJOAQ8T0W([!^beh knp p qqrs!s(s1s<tHsVsfsyssrqqpaSVSOSEU;X2\*`"dhlo rvyzz {|}~"*5AO_q~~}\XTXIZ?]5a,e#josw { ",8FVh~Y]N_Cb8f.l$qw| #.<L^tSdGhHPW^dioty$.9BKRY_dinty )3=EMSY_dinsy #-7?GNSY^chmsz '09AHMSX]bgms{ !*3;AHMRW\agnu~~}}}} $-4;BGMRW\~b}h{pzyxvutrqpppp'}.|6z<yBwGvLuRsWr]qcokntl~kihgfeeee  ~| ywu!s)q0o6n<lBkGjMiRhXf_egcpbz`_^\\[[[[|vsr q nli#g*f1d7c=bCaI_N^U]\[ cZ mX xW V T S R R Q Q Q }tmjggf c a _ %] ,\ 3[ 9Z ?X EW KVQUYSaRkPvNMLKJIIIIvmfb_^^ [YW U'T.S4Q;PAOGNNLUK^IgHsFEDCBBBBB }!q"h"a!\YWUTQON#L*K0J7I=GCFJERCZBdAp?}>=<;;;;<!#x$l%c%\$W#S QOM KHG E&D-C3B9@@?G>O=X<b:m9{8 7!6!5!5!5!6!6!#&t'h(_(X'S&O$L"I G DB@ ? #> )< /;!6:!=9!D8"L7"U6#_4#k3$y2%1%0%0&/&0&0&1%&(q*e*\*U*O)K(H%D$A$?$ =$;$9$7$&6$,5%34%:3&A2&J1'S0']/(i.)w-),)+*****+*+*,)(|*m,b-Y-Q-L,G+C(?(<(9( 7(5(3(2(#0()/)0/*7.*?-+G,+Q+,[*,g)-u(-'-&.%.%.&.&.'-+x-j._/V/N/H.C-?,;,7,4, 2,0-.--- +-'*.-*.5)/=(/E'0N&0Y%1e$1s#1"2!2!2 2!2"1"1-u/g0\1S1K1E1@0;0603001-1 +1)2(2'2$%3+%32$3:#4C"4L!5W 5c5q666666650q2c3Y4P4I4B3=37314.5+5(6 %7$7"7!8" 8(80879@9I:T:`:n:;;;;::9}2m4`5U6M6F6@6:646.8*9&:#; <===>%>->4>=?G?Q?^?l@|@@@@??>y5i7\8R9J9C9=9791:+<'="?AB CCDD"D)D1D:ECENE[EiEy E E E E E D Dt9e:X;O;G<@<:<4<.>(@#BDFHJ JJKK% K- K6 K@ KJ KV KdKtKKKJJJIn<`=T>K>D>=>7?1@*B$EGILNQ Q Q QQ"Q)Q2R;RFRRR_RoRQQQPPPh@[APAHAAA;B4C-E&H KMPSU X XXYYY%Y-Y6YAYMZZZiY|YYXXWWcDVEMEEE?E7G/I(L"ORUX Z ]_ ` `aab b'b1b;bGbUcdbvbbaa``]HRIJHCH:J2M*P#SWZ] `cfgh ijklm"m*m4m@mNm]momllkkjXMNMHL>N5Q,T$X\`d gknprrs uvwxy#z-z9zGzVyhz|yxxwwTQLQBR8U/Y&^bgk oswz|~ %0>M_sRVGWr2x'  #5I^uیܟܫ $/9CKRY_dinsy*4=EMSY^chmsy $.7@GNSY^chmsy(1:AHNSX\aglsz "+3;BHMRW[afmt}%-5<BGLQV[`gn~w}{zxwvvvuu  '/5}<|A{FyKxPwUv[tasiqqp{nmkjjiiii{ ywv"t)s0q6p<oAmFlKkPjVh\gdeldvca`_^^^]] | wtq omki#h*g1e6d<cAbF`L_R^X]_[hZrX~WVUTTSTT zrli g f db`^%]+\1Z7Y<XBWGVNUTS\ReQoO{NMLKJJJJ~sjd`^] ] ZXV U'S-R3Q8P>O DN JL QK YJ bH mG zF D C B B B B B xlc]YVTTS Q O M "L (K .J 4I :GAFGEODWBaAl?y>=;;:::;sg^XSPNLL JHFE$D*B0A7@=?D=L<T;^9i8v76443344|nc Z S NJHFECA?> =';-:39:8A7I5Q4[3f2s0/.---..x j"_#V#O"J!F CA?= ;976#5)40361>0F/O.Y-d,q+*)( ' ' ( ) t#g$\%S%L%G$B#?!=:7 5310 /&.--3, ;+ C*!L)!V("b&"o%#$###"$"$"$#$$##q%c&Y'P(I'C'?&;$8"5"2"0" .","*")"#(#*'#1&$8%%A$%J#&T"&`!'m '}'((((('~%n'`)V)M*F*A)<(7'4&0&-&+' ('''%'$'!#('"(.!)6 )>*H*R+^+k+{,,,,,++z'j*]+S,J,C,>+9+4*0*+*)+&+#,", ,,-%-,-3.<.E/P/\/i0y000000/v*g,Z-P.H.A.;.6-1-,-'/$/!01 1222"2)31393C4M4Y4g5w5555444r,c.W0M0E0>08030/0)1$2!356 77888&8.969@9K9W:d :t : : 9 9 9 9 8n/_1S2J3B3;36312,3'4!689;= >>>># >* >3 >< ?G ?R?`?o???>>>>i3[4P5G5?59545.5)7#8;<?AC D D DD D'D/D8EBENE[EjE|EDDDDCd6W7L8C8<87818+9%; =@BDG I J KKKK#K+K4K>LILWLfLwKKKJJJ_:R;H;@;:;4;.<'>"ACFIK NPQ QRSSS&S/S9SESRSaSrSRRQQQY>N>E>>>8>0@)B#DGJMP SUWX YZZ[\!\*\4\?\M\[\l\[[ZZYTBJBBB^2c'jpx  &8Kaz7j+p x ,@WnԆԛӫ *4=FMSY^chnsy %.8@GNTY^cgmsz )2:BHNSX]bgls{ #,4<BHMRW[`flt}&.5<BGLQUZ`fmv}|||||  (/6<AFK}O|T{Zy`xgvpuzsqponnnnn~|{y"x)w0u6t;r@qEpJoOmTl[kbijhtfecbaaaaa~yuq omlk$k*i0h6f;e@dEcJaO`V_]]e\oZzYXWVVVVVzrligd ca`_%^+]0[6Z;Y@XEWKVQUXSaRjPvONMLLLLL | p h b _ ]\ ZXWV U&S+R1Q6P;OANGMMKUJ]IgGsFEDCCCCC ti`ZVT S S QONL!K'J,I2H7G=ECDJCQBZ@d?p>~=<;::::|nbZTPMKK J IGED#B(A .@ 3? 9> @= G< O: X9 c8 o6 ~5 4 3 2 2 2 2 wi^UOJGECCB @ ? = < $; *9 0877=6E5M3W2b1n/}.-,+++,rdYQKFB?><; :875!4'3-230:/B.K-T+_*l){('&%%%&~n`VMGB>:8754 20/-#,*+0*7)?(H'R&]$j#y"!   zj]S J D >:7420. ,*)' &&%-$5#="F!P [hwwg Z!P"H"A";"7!3 0-+(&%#!!$ *2:C M!Y!f!u"""""!!s d"W#M$E%>$9$4#0",")!&!$!"! !!""!"(#/#8$A$K%W%d&s&&&&&%%p"a$T&J&B'<&6&1%-%)$&$"%%& &''''%(-(5)>)I)U*b*q*** * * *)l$]&Q(H(@)9(4(/(+'''"()*++ ,,,-#-*-2.<.F .R ._ /n / / / .. . .h'Z)N*E+=+7+1*-*)*$* +-./1 222 2 2' 2/ 38 3B 3N3[4j4{333332d*V,K-B-:-4-/,+,&,"-/1246 8 8 888$8,848>9J9W9e9w988887_-R.H/?08/2/-/)/$013579 ;= >>>>!>(>1?;?F?S?a?s?>>===Z0N2D2<25201+1&2 468;= ?AC CDEEE$E-F6FBFNF]FnEEDDCCU4J5A59534.4(5"7:<?A DFHI J KLMN N(N2M=NJNXMiM}LLKKJP8F8=87817*9$;=@CF IKNPQR STUVW#W,W8WDWRVcVwVUTSSK<B<;;5;-<&?BEHK OQTWXZ[\ ]_`bb&b1b>aLa]ap``_^]G@??:?1@)C!FJNQ UX[^acdegh jlno o*o6nEnUnhmmlkjDD>C5D+G#KOTX\`dgkmoprtuw y|~".=~M}a}w|{zyCG9I/L%PU[`ejnrvy|~ %3DWm=N2Q(V\bhnty~ ):Mb{6W,\!bipw~ 0CXp0b%ipx  %8Ne~͖̩ %/8@HNTY^chmsz )3;BHNSX]bgmt{ $,5<CHNRW\agmt}'/6<BGLQUZ`fnv !(06<AFKOTZ`g~o|zzxwutsttt#*}0{6z;x@wEuItNsTqZpanimskihgfeffg|vt rqpp$n*m0k5j:i?hDgIeNdTc[ac`m^y][ZYYYZZ{snjgedccb%a*_0^5]:\>[DYIXOWVV^ThSsQPONNNNO{phb_][ YXWW V%U*S0R4Q9P?ODNKMRKZJcIoG|FEEDDDEq f ^ Y UTRP ONML K&J+I0H5G:F@EFCNBVA_@k>x=<<<;;; x j_WQM K JI H FEDC!B&A+?1>6=<<C;J:R9\8h6u5443333 qdYQKGDB A A ?><;:"9(8-72695?4G3P1Z0f/s.-,++++}l_TLFB><:: : 8 654 2 $1 )0 // 6. =- E, N+ Y) e( s' & % $ # # # xh[QHB=975332 0 / - , !+ '* -)4(;'D%N$Y#e!s sdWME?:520.-, +)(&%$$*#1"9!B KVcqp`TJB<62/,*(&% #" !'.6?ITapl]QG?94/+(&$"  $,4=GR_niZNE= 61-)%#  ")1:EP ] l | eWL!B!:!4!/!* &#    !!"""&#/#7 #A $M $Y $g $x$$$$##bT!I#@#8#2#,#("$!!!!!#$%& ' ' ' '# '+ (4(>(I(U)d)t))((('^"Q$F%=%5%/%*$&$"##$%&() , ,,,,!,(-0-:-E-R.`.q---,,,Z$M&C':'3'-'(&$&!&&')+, . 0 11222%2-263B3N3]3m322111V'J)?*7*0*+)'(#()*,.0 1 45 67888"8*939>9J9Y9i9}88776Q+F,<,4,.,*+%+ ,-/13 5 7:; < =>?@@%@/@:@F@T@e?x?>>==M.B/9/2/-.(."/0257 : <>ABC D FGHH!H*H5HAHOH`GsGFEEDH2>26201+1%2469< ?BDFHJKL NOQRR%R0R<QJQZQmPONMMC6;645/4'5!8;>A DGJMOQSTUW Y[]]]*]6\D\T[g[~ZYXW?98938+9#<?CG JNQTWZ\]_`bd fhkk#j.j<jMi_hugfed==7<.=%@DIM QUZ]`cfhjkmoqt vy{{'z5yExYxmwvut_C^H]N[UZ]XgWrUTSRQQRR|qid`^\ [[ZZY%W*V/U4T8S=RCPIOPNXMbKmJzIHGGFGG~pf^YVSRP OONN M%L*J.I3H8G>FDEKDSC]Ah@u?>====>uh]UPLJIG FEEDC B%A*@/?4>:=@;G:O9Y8d7q6544445~m ` V N H D B@?> =<;;:!9%7*60554<3C2L1U0`/m.}-,,,,,w g ZPIC> ; 9 8 76 54321"0'/,.2-8,@+I*R)](k'z&%%%%%r bVLD>9631 0 0 / .,+*)#()'/&5%=$F#P"\!i ym^RH@:51.,** ) ( ' %$# " &! , 3 ; D O [ i y      iZNE=71-*(&$## "     # * 2:DP\j{eWKB:4/*'$"   !(09CNZiy    bTI?71,($! &-6ALW e u    _QF=5/*%"  # * 3 < G S aq\NC:3,'#      '/9CP^nXKA80*%!   !!!$","5"@#M#Z#k#~#""!!UH> 5 . ( #   " $ % %&&&!')'2'='I(W(g'{''&&%Q E!;"2","&!"!   "# % &( ) +,,,,&-/-9-F-T-d-w,,++*M"A$8$0$)$$#!"""#$& ( *,. / 02333"3+363B3P3`3s22100I%>&4'-'(&#%$%&(* , .0245 7 8::::':2:>:L:\:o98876D):)1)+)&("'()+. 0 2579;<> ? ACCC#C.C9CGBWBjA@?>>?,6,/,*+%*+-/2 58:<?ACEFH JLMMM(M4LBLQKdK{JIHG;03/-/(-"/147 :=@CFHJLNOQS UXYX"X.W<WKV^VsUTRR8312,1%258< @DGJMPSUWYZ\^a dfgf'f4eDdWdkba`^5705(7 :=B FJOSVY\_adegilnq tww v-v=uOtcs{rpo5:+;"?CH MRW\`dhknqsuwz| $3E[r/@%DIN TZafkoty} );Pg)INT[bipw} 0E\t"T[bjs{ &:Qhˁʖ %.6>DJOTY^cipx  (07>DINSW]biqz "*18=CHLQV\bir}zx $+17<AFKPU[bk~u|zxwvurnl %~+|1z6y;w@vDuIsOrUp\odmnlzjhgfeda`}wspoooom%k*i0h4g9f>eCcHbNaU_^^g\s[YXWWWVTulhda` ____]%\*[/Y3X8W=VCUISPRXQaPmN{MLKJJJJrg_ZWUSR RRRQO$N)M.L3K8J=ICHJFRE\DgCuBA@@?@@tg]UOLJHG G FFFED$C)B-A3?8>>=E<N;W:b9o8766666|k^TMGCA?>= =<<<:9$8)7.635:4A3I2S1^0k/{.----.sdWMF@;87654 44321 0$/)./-6,=+E*O)Z(g'w&&%%%&m^ R H @ : 6 2 0..- , ,+*)( '%&+%2$9#B"K"W!d sh Y M C<61 - * ( ' && %$$"!!" (.6?ITapc UI@82-)&# "    %+3<FR_n_QF<5/*&"          " ) 1 : E Q _ n  \NC:2,'#        ( 0; F Q ^ m   XK@70)%!      % - 6 A MZj|UI>5-'"       "*3>JXgzRF;2+%!   '0;GUdwOC90)#    $-8DRbuL@6-&!      !!"!*!5"A"O"_"r!! H=3+$   !" $ &&&''''2'>'K'\'n&&%$#D90(#  !"$&(* + ----$...:.H-X-j-,+*)@ 6!-!&!! ! " $&(+-/0 2 4555 5*565C5S4f4|3210<#2$*$$# "!!#% ' )+.02468: < >>>>&>1>?=N=a@BD F IIH!H,G:GIF[EqDCBA4*,*'("'(*- 0 369<>ACFHJLNP STTS'S4SCRUQjPOML0-+,&+,.2 59=@CFILNQSUWY\_ bccb,a<`N_b^{\[Y/0*/"037;?DHLORUX[]`bdfimp tts%r4rEpYoqmkj.3%58<AGLQUY]aehkmortwz~ +=Rg~): =BHNTZ`dinrvz} !3G^w#CHN U\cjqv{ (<RjNT \dlt|1H_vȎ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗  9` ˻0ƸOg{ĵ˲ѯխ٫ܩާख़㡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘  9` ˼.ŹMfzŵ˱Ѯլ٪ܧޥ࢚➙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙  9` ˾,ŹLg{Ŵ̰ѭի٨ۥݣߟᛙ⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙  9 ` ˿+ĺLg{Ŵ̰Ѭթئۣݠޝᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚ  8 _ )¹Mh{Ƴ̯Ѫէؤڡܞݚޕ  8 _ )Ni|Ʋ̭ѩԥעٟڛܗݓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ  7 ^ ǿ+Pj|ư̫Чԣ֟؜٘ڔܐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ  7 ^ ľ-Qj|Ʈ̩ХӠ՝ّ֙ؕڎێێێێێێێێێێێێێێێێ  6 _ 0Sl}Ǭ˧ϢўӚՖ֓׏؋ًًًًًًًًًًًًًًًً  5 b 3Um}ƪˤΟЛҗӓԐՌ։׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉  7 e 8Xn}Ƨɡ̜ΗϓѐҍӊӇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇ  : h>[o}ģǝʘ˓͐΍ϊχЅхххххххххххххххх  > mD^p}ßřǔɐʍˊˈ̅̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓  B rI`p}ÕđƍNJLjȆȄɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ H xGbq|ÊĈĆńŃŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁſ% N p9Xlz€€€€€€€€€€€€€€€€€1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ0 S'|̨Dƥ]¤pùǷʵγбӰկ׭٭ګګګګګګګګګګګګګګګ0S&|˩CƦ\¤o~ùȶ̳ϱҰծ׭٬ܫݧۧۧۧۧۧۧۧۧۧۧۧۧۧۧ0S%|˩BƧ[¥n~ĸɵͲѰԮ׭ګܩߨߣܣܣܣܣܣܣܣܣܣܣܣܣܣܣ0S$|˩AƧZ¥m}ķɴαӯ֭ګܩߧ⤑ࠎܠܠܠܠܠܠܠܠܠܠܠܠܠܠ0S#|˪AƨY¦m}ŷʳϰԮثܩߧ⥗栖ݜݜݜݜݜݜݜݜݜݜݜݜݜݜ 0S"|ʪ@ƨX¦l|Ŷ˳аխڪݧच⟘㝚ᙗݙݙݙݙݙݙݙݙݙݙݙݙݙݙ 0S!|ʫ?ƩW§k{Ŷ˲ѯ֫ڧݤߠ◚ᗜޗޗޗޗޗޗޗޗޗޗޗޗޗޗ /R |ʫ>ƪV¨kyŶ̲Ѭ֨٤ܡݜޗޒޒޒޒޒޒޒޒޒޒޒޒޒޒ /R|ʬ<ƫU¨jwŵ̯Ҫ֥ءڝۙݔސގݎݎݎݎݎݎݎݎݎݎݎݎݎݎ /R|˭:ƬT©is~Ų̬ѧբמؚږۑ܍܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋ /R|˯8ƭR«fo~ưͪѤӟ՛ًُ֗ؓڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈ .Q|˰5ǯOð`l~ǭ̧ϡҜӘԔՐ֍׉؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇ .Q|̳0DZLĸVnǩˣΞϙѕґӎԋԈՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅ  -P|̶*ȷDYpªǦʠ͖̚ΒϏЌщч҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅  ,O{ͼ"¼<^r¦Ţǜɗʓː͈̍͋Ά΄ττττττττττττττ  + N zFbtÞřǔȐɎʋˉˇ̅̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃  ) L ~%OfuÖőƎNjljȇɆɄɂʂʂʂʂʂʂʂʂʂʂʂʂʂʂ ( R -WhuÌĊňņƄƃƁǁǁǁǁǁǁǁǁǁǁǁǁǁǁ - Y +Pgu~ˆ†…ÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ 4 [v%E]ny~~~~~~~~~~~~~~~:Uh-x@Vgs~x{|ywÂu„t…srrqqqqqqqqqqqqqqq'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~')F5iިAǜaĜq›~ĹǷʵ̴γвұӱԮԬҬҬҬҬҬҬҬҬҬҬҬҬ'(F4jݨ@ǝ`Ĝqœ|ºŸɶ̴ϲѱӰկ֯תէӧӧӧӧӧӧӧӧӧӧӧӧ'(F3jݩ?ǝ`ĝpž{¹Ƿʵγѱӯ֮ح٪٥դԤԤԤԤԤԤԤԤԤԤԤԤ''F2jݩ>Ǟ_ĝoyøȶ̳бӯ֮ج۫ܦڢ֠ԠԠԠԠԠԠԠԠԠԠԠԠ&&F1jݪ=Ǟ^ĝoxĸɵͲѰծج۪ިߢڞ֜ԜԜԜԜԜԜԜԜԜԜԜԜ&&F0jݪ<Ǟ]ĞnvķʴϱӮ׬۪ި⤐ۚיՙՙՙՙՙՙՙՙՙՙՙՙ&%F0jܫ;ǟ]ğlt~ŷʳаխ٪ި⥗柕ۗזՖՖՖՖՖՖՖՖՖՖՖՖ&%F/jܫ:ǟ\Ġjs|Ŷ˳ѯ֬ۨߤ៙㜚ᗖܔؓ֓֓֓֓֓֓֓֓֓֓֓֓ &$F.jܫ:Ǡ\ġhqzŶ̲Ѯשۤޠᖛᕛݒؑבבבבבבבבבבבב &#F-jܬ9Ǡ[ģfnxŶ̰Ҫצڡܛޖߑߑݏُ׏׏׏׏׏׏׏׏׏׏׏׏ &"E,jܭ7ǡZťc©kuų̭ҧ֢؝ژےݎ݌܍ٌ׌׌׌׌׌׌׌׌׌׌׌׌ %"E+jۭ6ǢYŧ_­fp~ưͪѤԞُ֙ؔڋۈۈ؈׈׈׈׈׈׈׈׈׈׈׈׈ % E*jۯ4ȤUƫXó_n~Ǭ̦РқԖՑ֍׉؆؄ׄքքքքքքքքքքքք %E'j۰1ȨMDzNXpǩˢΝЗђҎӋԈՄՂՁՁՁՁՁՁՁՁՁՁՁՁՁ $D%jڲ.ʯ@Ƚ=]r©ƥɟ˙͔ΐόЉц҄ҁҀҀҀҀҀҀҀҀҀҀҀҀҀ $D!jڴ)ͼ(CasšǛɖʑˎ͈̋Ά΃΁πππππππππππππ #Ci#LeuÝŗƓǏȌɉʇʅʃˁˀˀˀˀˀˀˀˀˀˀˀˀˀ "Bh /Thv”ÐčŊƈƇƅǃǁǀǀǀǀǀǀǀǀǀǀǀǀǀ @ _ 4Zkw‰ˆÆÅÃĂāāāāāāāāāāāāā  = c3Sgt}€€€€€€€€€€€€€  Aax2L_nx|}|{zyxxxxxxxxxxxxxx " BZ(j9wI[i|qyvvzt}rqȁpǃoDžnƆmƈlŊlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋ &=N/[?gNq{[yveqlnrkwizg~fՀeԂdԄcӆbӉaҋaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ "0:=YJy؛[Ǖrŗ{ØúŹǸɷʶ˶~̵}̳|ͯ|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯| !/:}֨DɨOǰSŸYm}Ƭ˥ϟјӒՌ׈ׅ׃քԄффффффффффф%91Z<~׬;ʭDɹEYo~ƨʡ͛ϕЏҊӆԃԁԀӀррррррррррр$9/Z9~ٴ/̸2½@]q~Ťȝʗ̒΍ωЅЂр~}}}}}}}}}}}}"9-Z0z!Hbs~àƙȔɏʋˈ̅͂̀~||||||||||||8)Z$t*Oet›ÖőƍNJȇɅɂʀ~|||||||||||| 7%Zh 2VhuÌĉņńƃƁ}}}}}}}}}}}}6P f6Vjv~†„ƒÁÀ~~~~~~~~~~~~ 4 Eh7Ser{~}||||||||||||  ' Ie%x9O`mux}{z}yĀwÁvƒu„tsrqqqqqqqqqqqq  ,H\1kBvP~~_{iwntsqwpzn}mĺk̓j̅i̇hˉgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌ -A(P9\Hf|Tnw^uqezmk~jphufxe{c~bځaك`م`؇^؊^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍ (7.C=N|KWwV_o]ehbjdinaoq_ss]wu\{v[~wZxYyXzXzW{V|V|V|V|V|V|V|V|V|V|V|V|'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'5/DJQe^~۔mϒwŒēÒ¼~¼}û{Ļzĺyĵyõyõyõyõyõyõyõyõyõyõy&4/CJPe]ڕi͔tŔ~ĕ•ûĺ~ź}ƺ{ƹzƵzƱzızızızızızızızızızız%4/BJOf\ږf̕qŕ|Ė—úŹƹǸ}ȸ|ɵzɰ{Ǭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{$3/AJOf[٘c̖oŖy׺ŹǸɷʶ}˶|˰{ʬ|Ȩ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}$2/AKNgYٙa˗mŗwÙĹǸɶ˵ʹ~α|ά}˨}ɥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~#2/@KMgWٚ^˘jřtÚ}ºŸȶ˴γвѬ~Ϩ~̤ɡơơơơơơơơơơ#1/?KMgUٜ\ʙhŚrÜzùǷ˴βѱӬӧФ͠ʞƞƞƞƞƞƞƞƞƞƞ"1/?KLgSٝYʛeŜoÝxĸɵͲѰծקԣџ͜ʚǚǚǚǚǚǚǚǚǚǚ"0/>KKhQٟVʜbŝlßu~Ʒ˳ϰԭ٨ڢ՞ћΙʗǗǗǗǗǗǗǗǗǗǗ"0/>KKhO٠Sʞ_Ɵiár|ǵͲҮتߢܜ֙җΕʔǔǔǔǔǔǔǔǔǔǔ!//=KJhM٢Pˠ\ơeänx¸ȴΰիݥ曑ݖהӒϑːȐȐȐȐȐȐȐȐȐȐ!//PUQhS{WԞ_ʛkśuÛ~ŷʴϲҨϣˠǝś™%4%C>NUNhPzRա[˞fƝqÞz¹ǵΰԩ֡Н˚șŗ–%4%B>LULgMyNդV̡aơlâv÷ʲҬؚ۠ї̕ȔœÒ$3%B>JTJfJxK֨Qͦ[ǥeħpzö˯֥族ړґ͐ɐƏÏ$3%A>HTGfGwG٭KϬTȬ^Ưh±s}˥Քޏڍӌ΋ʋNjČ$2%A>FSDdCuB۴DҵJ˷Sʾ_n|©˜ҍ؆هӇχˇȈňˆˆˆˆˆˆˆˆˆ#2%@>CRAc?s=޾;?J]o}ãɖΊӁՁ҂ς̃ɄƅÅÅÅÅÅÅÅÅÅ#1%?>@Q>;O7]3j1u)8Ocsďȇʀ|zyz|}}}}}}}}}}!.%<>6L0Y,b'm&jNCdTH^YL[_OXdRUiTSmURqWPtXOxYN{ZM[L\K]I^H_H_H_H_H_H_H_H_H_H_$y3"p;*hB1aJ6\Q;WW?S]BPbDNgFLlHJpIItJHwKF{LEMDNCNBOAPAPAPAPAPAPAPAPAPAP' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K0YCcTidprz~≂܅؂}{ywvtsrqqsttttttttt' ;K0YD`UfdmswጀۈՅ҂}{ywvutsuuvvvvvvvvv' ;K0YD^Udejts}ًԈЅ͂}{yxvuvwwxxxxxxxxx' ;J0XD\Uaegtpߏz؍ҋ·˄ȁ}{ywvxxxyyyyyyyyy' ;J1UDYU^edtlޑv؏э͊ɇƄā~{ywxxyyzzzzzzzzz& ;I1SDWU[eathޓr֑{ЏˍNJĆÃ{ywxyyz{{{{{{{{{& :I1QDTTXd]tcޖm֓wБʏƍɄ{yxyz{{|||||||||& 9H1ODRTUcZs_ޙi֖rϓ|ʑŐË{yz{{|}}}}}}}}}}& 9G1MCOSRcVr[ߝdךmЗwʔŒŽ{ijzī{¦|}~& 8G1KBMRPbSqW^؞gЛqʘ{ŕ’ŷ|ɫ|Ǥ}à~& 8F2IBJQM`PoT}Xڤbҡk˝uƚ˜¶ˬ}΢ɝĚ& 7F2GAHPJ_LmP{Tܫ\ԩeΦoȣzßİΠљʖŔ& 7E2E@FOG]IkLxOߴUٵ_ӵiεv|ġΔҐˏƎŽ& 6D1C?CND[EhHtL~Q[kƽqxÔ͉҇̈ljÉ& 6B1@>@L@YAdDoIwR|bhnvπ̂ǃĄ& 5?0==hOCbUG]ZKY`MVePSjQQnSOrTNvUL{VKWIXHYGZF[E\E\E\E\E\E\E\E\E\ ~)u5#l<*dC/^J4XP7TV:Q[Kd@JhAHlBFpCEtDDxEB}FAG@H?I=J=J=J=J=J=J=J=J=J| q$g,_5Y=!TE&OK)LR,HW/F]0Da2Bf3@j5?n6=s7KKPXUdZpa{iޚsו~Ўʅ}xy{}~ 4B$C0E=HILUQaWl]wcm֞y˕~|~ 4A#A/B;EGISN^ShZra{ۯn̦v~ 4?"?.@:BEFPKZRcYk߽drѶlĬsz4=!<-=8@BDLIUQ\Zaboɼipw4; 9+:5=?BGHNQR[Y`mgmt}x|386)82:;?AGETEWX^kd~krzvorwz}~353'4/65=8H8MEVV\ib{howxnhiosvxz{{{{{{{{300#/)2-;,@:HLN\Vl]zem}vsălgefknqstttttttt1-*)"-!3,XFeOpXzzdsmmvhdЈ`ϒ^Ν\ͩ[ιYȚZʜ\ɝ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ  "'-96J?XHcRmz\urd{mmhud~`؆]֏Z՘XԢWԮVԼV͐VђWѓWѓWѓWѓWѓWѓWѓWѓ   #*.;8IBUL_zVgs^mkdrflwbtz_|}\ZߋWޓUݜTܥRܯRܻQ̅RڅRڅRڅRڅRڅRڅRڅRڅ  $*09:EFOzQXrX^k^ceeh`lk]rnZypWrUtSvQwPxNyMzMzLzLzLzLzLzLzLzLzظ '(35??yJGpQNiWSb]W^d[Zj^Wp`TvbR|dPeNgLhKiJjIkHlGlGlGlGlGlGlGlGlݯż *#~6-vA6mHk2CE@K=P;U9Y7^!5b"4g#2l$1r%/w&.}'-(+)+)+)+)+)+)+)+)+)vs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvst1 rBtO'xX3y`?wiJsqTq|\nckiimgqetdvbxay`{_|^}]}]}_}`|b}b}b}b}b}b}b}b}wtu1 sBwM'{V4|_@zgKwoUsz^qenkkpisgweyd{b}a~`_ŀ^Ё_ڀaހb߀c߁d߁d߁d߁d߁d߁d߁d߁xuv1 tBzL'U4]@~eLznVvw_tfpmmrkviyg|e~cba`DŽ_ӄaڄc݃d܄e܄e܄e܄e܄e܄e܄e܄e܄yvw0 vB~K'S4\@dLlVzt`whsoptmyk|hfecbaɇaՇdڇeڈfوgوgوgوgوgوgوgوgوzxy0 xAI'R3Z@bLiW~qa{{iwqswp|mjhfdcb΋d֋f֋g֌h֌i֌i֌i֌i֌i֌i֌i֌i֌{yz0 |?H&P3X@_LgWnaxj{rwys~oljgedďdҏgӏhӐjӐkӐlӐlӏlӏlӏlӏlӏlӏlӏ|z{0 >F&N2V?]KdVkask~s{zvrnkhfeʓhѓjДkДlДmДnѓnѓnѓnѓnѓnѓnѓnѓ}{|/ <E%M1S>YJ`Uh`pjyt|zuqmiggΗk͘l͘n͘o͘pΗqΖqϖqϖqϖqϖqϖqϖqϖ~|~/ ;C$K0P(B2G;MDTM[UܰeaΨlqßt|§åţƢȟȟȟȟȟȟȟȟ- 49<&@/E8K?SF\MӶb`ƭipqy¨æŤƢȠȟȟȟȟȟȟȟ+ 279$=,B3I9R>XL̺`_gon~v~~¨æŤƢȠȟȟȟȟȟȟȟ* 146!:(@-H1Q7VK^]enl}s{ytwz§|å}ţ~ơȟȟȟȟȟȟȟȟ( 1236"=&G&L5TI\[cljzqywpln§ræuĤwƢxǡzȟzɞzɞzɞzɞzɞzɞzɞ& /./2:DJ3RGZYaigxnvyohdeŤjţmƢpǡrȟtɝuʝuʝuʝuʝuʝuʝuʝ$ + )),7AI0QDXV_fetl|tqib^]ɞbȟfȟiɞkʝn˛n˛n˛n˛n˛n˛n˛n˛#' " $ 0=$F4NDVR]acokztsk~bȌ\ȜYȱWΖ[͘^̙a̙d͙g͘g͗g͗g͗g͗g͗g͗g͗!  .:)C9JHPVWb_lvhulr}c~\،W؝TװT͌UӏWґZѓ\ѓ_ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ  ,7.@=HJOVV`v^ilepdpw^||YVޗSݦQܸQԄSڇT؉V׊X֋Y֋Y֋Y֋Y֋Y֋Y֋Y֋ ٿ ,!70@>HJPTwW]m]defj_pnZzrVvSyQ{O|M|M|P|QRށSށSށSށSށSށSށSށ ۷ ,#71A=IGxQPnWWe^\`fa[oeVxhSkPmNoLqJrIrHrKrNsNtNtNtNtNtNtNt ެ˺!.#9/B9wJBmPIeVN_^SZeVUmZRu\O~_LaJbHdFeEfDgCgEgFgFgFgFgFgFgFgʹ $0 ~;*tB2kH9cN?]UCX]GSdJPkMMrOJyQGSETCVAW@X?Y>Z>Z=Z=Z=Z=Z=Z=Z=Zҭ &|1q8"h>)`E/ZL3TS7PZ:L`Fm@DtBA{C?E=F;G:I9J8J7K7K7K7K7K7K7K7K w# m*d1\8U@"PH&LO)HU+D[-Ba/?g1=m2;s39z5765738291:0;0;0;0;0;0;0;0;| of^! V)P2K:FABH?N5D2I0N.S,X*])c'i%o$w"~!hd#_/^@cKgT%h]/fg9drAb}H`N]R[VZYX[W]V_U`TaTbScRcRcScTcVbWcWcWcWcWcWcWcie#`._@fIjS%k\0ie:gpBd{IbO_T]X[[Z]X_WaVbUdUeTeSfSfUfVeXeYfYfYfYfYfYfYfjf"a.`?iHmQ&n[0ld:inCgyKdQaV_Z]][`ZbYdXeWgVhUhTiUiWhYhZi[i[i[i[i[i[i[ijg"b.c>lFqP&rY1pb;lkDivLgRdXa\_`]b[eZgYhXiWjVkUlWlYk[k\l]l]l]l]l]l]l]lkh!c-g<pEtN&vW1t`;piEmsMj~TfZc^ab_e]h\jZlYmXnWoWoYo\n]o^p_p_p_p_p_p_p_pli!e-k:tCyL&zU1y]\IdSk]vfoxwr~mjhhЌkՍmՍo֌p֋q؊qىrڇrڇrڇrڇrڇrڇrڇspu&, 6@F'L1R;YE`OhYߎscՆ}nxxsomlȑnґpӐrԏsՍt֌t؊uىuىuىuىuىuىuىtqx$+ 5>C$I.P7VA]JߝgTԕobˍxnÅyyurqsДtђvґwӏwՍw֌x؊x؊x؊x؊x؊x؊x؊ur{#) 4<A"F*M3T<[DףcS̚lb“un~y{xvwϖyДzђzӐzԏzՍz׋z׋z׋z׋z׋z׋z׋us}!) 49>D&J.R5ܯYAϨaRŠiarnzy~|}͗~ϕ~Г~ґ~ӏ}Ս}֋}֋}֋}֋}֋}֋}֋vt ( 37;A"H(P.ԴV@ɭ_Qg`omwx˘ΖДҒӐԎ֌֌֌֌֌֌֌wt'2 48=F!ܿL,ιT?ñ]Pe_lltw|}zǘ|Ζ}Д~ҒӐԎ֌֌֌֌֌֌֌xu&/ 04:DH+ȽS=[Nc]jjqvzytqØsϖvДxґyӐzՎ{֌{֌{֌{֌{֌{֌{֌xv%+ , /6<G)Q;YLa[hhotw~yqlikДnђqґsԏuՍv֋v֋v֋v֋v֋v֋v֋yx#&%(07E'O9WJ_Xfemqu{z~qjebcґgӐjԏmՍn֌p؊p؊p؊p؊p؊p؊p؊{|! $5C$M6UG]Udbkm{svr|~jc^[[Ս_Սc֌f׋h؊jوjوjوjوjوjوjو|%6A!K3SCZQb]~igtqpk{xd~]XVUۆXڇ\ڇ_ڇaۆcۅcۅcۅcۅcۅcۅcۅ~ھ %5@!I/R>YK`Wvhampiezp^̆uX̕yȚ{Qͼ|P|SU߀XށZށ\߁\߁\߁\߁\߁\߁\߁ ۵ % 3>%G2N?UIv]Smf[eoa^zgX܆kSܕoPݦqM޻rMqNtPwRxSyUzUzUzUzUzUzUz ݫ͸ % 3='F3N>vUGl[NdcU]mZXw^SbNeJgGiFiHiKjLmNoOpOpOpOpOpOpOp б '4>'G2vN;lTBdZH]bMWkQRuUMXHZE\B^A_@`C`G_HaIcIcIcIcIcIcIcԩµ )5~@%tF-kL5cR:\Y?V`CPhGLqJG{LCN@P>R=T;U;UA;C9E8F6G5H5I4I7I7I7I7I7I7I7Iɫ~u' l/d7\>VE"PK%KR(FX+A_->g/;o18x364361708/:.;.;-<-<-<-<-<-<-<yne^' W0Q7K>FEAL=R9X6_!4f"1n$/w%-&+())(*'+&,&-&-&-&-&-&-&-}ui _WPI&D. ?6 ;= 7C3I0O.U,[*b'i%r#{!|peZQ IC=8&4-03-9*>'C%I #N !T Z a i r |  \W&Q2N<WE[N\X"[c+Yo2Wz8T=RAPEOGNIMKLLKMJNIOIPHPHPIPKPMOOPOPOPOPOPOPOP\X&R2Q:ZC_M_W#^a+\m3Yy:W?TCRGPIOKNMMOLPKQKRJRISJSKSMRORPSQSQSQSQSQSQS]Y&S1T9]BbKbU#`_,_k4\w;Y@VETHRKQNPOOQNRMSLTKUKULUMUPTQURVSVSVSVSVSVSV^Z%T1X7a@eIfS#d]-bh5_t<\BYGVKTNSPQRPTOUNVMWMXLXNXPXSXTYUYUYUYUYUYUYUY_[%U0\4e=jGkQ$iZ-fd6cp=_|C\IYMWPUSSURWQYPZO[N[O\Q[T[U\V]X]X]X]X]X]X]X]`\$V/`2j;oDpN#oW-ka6gl>cxE`K\OZSWVVYT[S\Q^P_P_R_U_W`XaYb[b[b[b[b[b[b[ba]#Z-e/o8tAvK#uT-q]6lg?hsFdL`R]VZYX\V_T`SbRcScUcXdZe\f]f^f^f^f^f^f^f^fb^#^*i-t5z>|H"{Q,xZ6sc?mmGizNdT`X]\Z`XbVeUfTgVgZg\i]j_j`jajajajajajajajc`"b'n*y2<F!O+X5{`>uiGotNjUf[b__c\fZiYjXkZk]m_naobocndndmdmdmdmdmdmda"f%r'~0 ;EM)U3^=}fFvpNr|Um\hbdfaj_m]o]p^p`rbsdsesfrgqgpgpgpgpgpgpeb!i#w%/ 9CL&S0[:cDlMywUt]nciifncqatauavdwfwhwivjujsksksksksksksfc!m {#. 8AJ#Q-Y7`AiJ߁tSz~]teolkqhufxeze{h{j{kzlxmwmvnunununununugd p~", 7@H N)U3]<ݏfGӈoSˁy^{funqtnxk|j~jl~m}o|pzpypwqwqwqwqwqwqwhd s +5>DK%R-ߝZ7ӕcFʎlSÇu^~g{owuszp~ooʂpށq߀r~s|szsysxsxsxsxsxsxifv*4 ;AH O'آV6̚`EÓiRr^zgo}vy|vttńu݃vށvw}w{vzvyvyvyvyvyvyiix(2 7=DݭK$ЦT5Ɵ^DfRo]wgow~}{zyz܄z݂z߀z~z|yzyyyyyyyyyyyyjk{&03 9AֱG#ʫR4\CdQl\tf}ov}ۅ݃ށ~}}}{|z|z|z|z|z|zkm~$,/4 ݺ:еF!ůQ2ZBbOj[reznv||ywׅx݃zށz{}|{|z|z|z|z|z|zkp"&)/ֿ6ʺD O1X@`NgZodwmu{ztqoхq݃s߁u~v}w{wzwzwzwzwzwzls !&4 ľBM/V>^LeWmbuk~ryyr~mig̓iނl߀o~p|rzryryryryryrymv2 @K,T<\IcUk_rhy{orvk{fb`ʀbe~h|j{lymxmxmxmxmxmxn{ڻ / =I)R8ZFaQh[zpdrykkqdv_z[|Y|Z{^{azcyfwfwfwfwfwfwfwp ٳ Ͼ ,;F&P5XA_M|gVso^kwedk^pYsUuTuSvWvZv\u_t`t`t`t`t`t`tr ٩ε )7D!M0U<}]GtePlmWev^^ācYÎhTÝkQîlOmNmPoSpUpXpYpYpYpYpYpYpwޠϮĹ )7BL)T5u\?mdHelO_vTYҁYTю]Pѝ`MҰbKbJbKfMhOiQiRiRiRiRiRiRi ҦIJ * 7B}J)tQ3kY:daA^kGXuKSOOSKUIWGWFWFYG\I^J`K`K`K`K`K`K`ٞǬ , 9|AsI'jP/bW5\_:Vh?RqBM|FIIFKCM@N?O>NBOCQDSETETETETETET˦ . y7p?hF"`M(ZT-T\1Oe5Km8Gw;C=??D>F>F>F>F>F>FП{t* l3d;]CWJ QQ$LX'H`*Dh,@q.<{192543617/8.9-919393939393939}vme$^- X6R=LEHLCS?Z>>>=>=?>>@>C=D>F?F?F?F?F?F?P K*E5J8M=QHRRQ^Oj%Mw+J/H3F6D8C:B@?@@?@?@>A@@B@E@FAHAHAHAHAHAHAQL)G4M6Q;UFVPU\Rh&Pt,M1J5H8F;EC?CABAABAC@C@CCCFBHCIDJEJEJEJEJEJERM)J2P3U9YCZMYX Vd'Sq-P}3M7K:I=G?FAEBDDDECEBFBFCFFFIFKGLHMHMHMHMHMHMHSN(N/T0Z6^@`J^U [`(Xm/Ty4Q9N=L@JBIDHFGGFHEIDJEJGJJIMKNLOLQLQLQLQLQLQLTP'R,Y-_2d<fGdR a\(]h0Zu6V;R?OCMELHJIIKHLHMHMHNKMNOPPRPSQTQTQTQTQTQTQUQ'V)^*d/j:lElO hY(dc0`p7\|=XBUFSIQKOMNOMPMQLQMQPRRTTUVUWUXUXUXUXUXUXUWR&Z&b&j,q7sBsLpV(k`0fk8cw>_D[HXLVOUQSSRTQUQURVTXVYXZZZ[Y\Y\Y\Y\Y\Y\YXS%^#g#p*w5 z@zJxS&s\/nf7ir?e~EaJ^N\RYUXWWXVYVYV[X]Z^\^]^^]_\_\_\_\_\_\YV#b l u(}3 =GP${Y-vb6qm>lyEhKdQaU^Y\[[^Z_Z`Za\b^b`baabac_c_c_c_c_c_ZY!fpz&1 ;DM!V+~^4yi=ttEoLjSfXc]a`_c^d^e_f`fbfdeedecfbfbfbfbfbfb[\iu~$.8BJR'[0݁f:zpEuzNpUl[i`fddgcibjcjdjfighhgifidididididid[_ly!,6 ?GO"܎X-҇b:ʁlE{uNvVr]nbkfijglgngnimjlkjlilglflflflflflf\bp|)3 <DߚKӔU,ʍ_9‡iEqO|{Wx^tcqhnllolplqmonnolojoiogogogogogog]dr&08 ?؟G͙R+Ē]9fDnNwW}^ydvismqqqrqsrqsosmsksjrhrhrhrhrhrh^gu#,3ݨ9 ѣEǝP*Z8cDlNtW|^d|jynwrvtvtwrwpwnvlvjvivivivivivi^ix',֬4 ˧CN)X6aCiMqVy^djo}r|t}|u|}s||q|{o}zm}yk}yi}yi}yi}yi}yi}yi_k{ ݰ$а2 ƬAL'V5_AgLoUw]din|rwtuutsuqvow~mx}kx|ix|ix|ix|ix|ix|i`n~ֶ˴0?K%T3]@eJlSt[}bhymtqptmtmsoqpormsktitititititiaq ٵ ϹŸ.=I#R1[>cHjQrYz`xfrlmoirfserhpjnllmkninininininicu ܢԭ ϸ ɽ+;G!P/Y;aFhOpWxx^rdkifmbo_p^o`ncmfkgjihihihihihihgy ߚӦ̱ǻ(8DN,W8^BfKxmSqvZk`ed`h[kYlXkYk\j_iahcfcfcfcfcfcfk~ ̪֞Ĵ$5 BL(T3\>ydFqkNktTd~Z__ZbVeSfReRfUfXfZe\d\d\d\d\d\dp ݖΣĮ 1 >I#R.zZ8rb@kjGdsM^|SYWT[P]N^M]K_N`Q`S`U`U`U`U`U`U`wӛƨ ,:FzO'rX1j`8dh?^rEX|ITɈMOɕQLɥSJɹTISGUHXJYLZNZNZNZNZNZNZܓʢ ,9yCqM jV(c_/]g5Xq:S{>OوBKٖEH٦GFںHEGDIBMDOEPGRGRGRGRGRGRϛ~-v8nAfJ_R#Y[)Ud-Pm1Lx5I8F:C<@>?>>>=?=B?D@F@F@F@F@F@F֓ģyq+j6 c?]GWORW!M`$Ii(Fs*B~-?/<1:38465655476989898989898Ȟyskd'^1X; SCMKISEZAc>l;v!7#4%2'0(.)-*,*,*/*/*/*/*/*/*um e^W#R,L4H< CD ?L94%0,,2(8%>"DJQYcn|  rdTKD=7 1,($" ',16<BI Q Z fsD$?.<6@8A=AEAQ @]?j4B6D;DCEO D[Ah?u4@4A4A4A4A4A4G"A,E/I0L5M=NHMTKaHn E{%B(?+>.=/<1<2;3:4:5:5:5:5:5>5A7B8D8E8E8E8E8E8H"C,H,N-Q1S9UESQQ]Nj!Kw&H+E.D0B3A4A6@7?8?8?9?9?9@8C:EH@JAKAMAMAMAMAMAMAJ H'Q%X%]*`3c?bJ`U\a#Ym)Uy.R3P6N9L;K=J?J@I@IAJAJBJDLEOFPFQFQFQFQFQFQFL L$U!]!c'g1j< jGgRc\#_h*\t0Y5V9TeDbI`M^P]S[U[V[V\W]W^V`U`TaSaSaSaSaSaSPZepx$.8 BKW#yb/tl8ov@lFhKfPcSaV`Y_Z_[`[aZcYdXdWeUeUeUeUeUeUP]it}!*4= ܋HхT#^.zh8uq@qzGnMkRhVfYe\d^d^d^f]g\hZhYhWhVhVhVhVhVR_lx%/ޕ8 ӐEʋQ"…[.e8{nAwwHtNpSnWk[j^i`hai`j_k]k\lZlXkXkXkXkXkXTbo{(ؙ3̕BĐN!Y-b7k@|sHy|NvTsXq\o`nbmcnboao_o]o[oYoXoXoXoXoXVdr~ݞ ў1ǚ@L V,`7h@pH~yN{TxYv]tascrdsdtbt`s^~s\~rZ~rY~rY~rY~rY~rYXgu֣ˡ/ž>JT+]6f?nGvNT~Y{]ya}xdzxeyxexybyx`yw^yv\yuZyuZyuZyuZyuZyuZZix ݚ ٢ Цƥ,<HR)[4c>kFsM|SX]zav~ds}eq~eq~cr}`s{^tz\ty[uyZuyZuyZuyZuyZ]l { ܓ՝ ѥ ʪ*:FP(Y3a]xCXGTKPNMPKPKPJQLRNRPRQQQQQQQQQQv݉ʗ%4 |@uJmS#g\*ad0\m6Wv:S?OBKEHFGFGFDIEJGKILJLJLJLJLJLѐž y.r< lGeP_Y!Zb'Uk,Qu0Mρ4Iώ7Fϝ9DЮ;B;C:@>>@@BACBDBDBDBDBD݈ǘx tn+h7aB\MWVS_Oi"Ks%G~(D+B-?/>/>/<19496:8;9;9;9;9;9͒~tnhb*]5W? RHMQJZFcCm@x=!:#8$6&5&4&4&2(2+3,3,3,3,3,}qgb\W'R1M:HB DK AT>\;e8o5{20.,+********{oc[UPK#F,B4><:C7K4S1[ .d +o (| &$"! {n`TNIC?:%6,23/:+A(H%O"W `ly         |m_QGA< 72.*#&)"/5;BIQZf t   }m_PB:5/* &"#(-3 9 AIS^l|9'3254868;6C3N1[ /h -v+))((('''''''''(+-/////:'4181;4;9:A7K5X 3e1s/--,,++++* * * * + +,/!1"3"3"3"3"3";&50;/>1?6>=k;x977 6!5"5#4$4%4%4&4&4&5%5&6(8):)<*<*<*<*<*=%=*C(G)I-J6JAIM GZEgBt@> ="<$;&;':(:(:):):):);):+;-=.?.A.A.A.A.A.>%A&H$L%O)R3Q>QI OVLbJoG{ E#C%B'A)A*@+@,?-?-@-@-@/?1A2C3D3F3F3F3F3F3@$E#L R!V&Y/Y:YF VQT]QjNu!L%J(I+G,G.F/E0E1E1F1F2E5D6G7H8J8K7K7K7K7K7A#IQW\#`,`6`A ^M[XXdUp#S|'P+O.M0L2L3K4K5K5K6J8J:JO@OAQAR@S@T?T?T?T?T?FPYbhl$o.o8nDkNh[dg#`q*]{/[4X8W;U=T?SASBSCSDSETEVDWDXCXBXBXBXBXBHS]fmr!u)v3v> sJoWkb#gl+dv1a7^;\>[AYDXFWGWHXHXIYHZH[G\F\E\E\E\E\EKWakrx{$}-~9{FvSq^$mh,jq3g{8d=bA`E^G]J\K\L\M]L^L_J`I`H`G`G`G`G`GNZdov}'ۄ4ЁC|OxZ#sd,pm3lv:j?gCeGcJbMaO`P`PaObNcLdKdJdHdHdHdHdHP\h rzފ Ҋ0Ɇ@M}W#ya,uj4rr:o{@lDjHhLgOfQeReSfQgPgNhLhKgIgIgIgIgIR_k u ~ ֏̎.Ë= JU"~^+{g3wo:tx@rEoImMlPjSjTjTkSlQlOkMkLkJkJkJkJkJTa n x ܉ ؏ ГƓ+; HR!\+d3|m:yu@w}EuJrNqQoToU}oV|oT|pR{pP{oN{oM{nK{nK{nK{nK{nKWc p|܅ԌГ ʖ)9 FP Z*b2j9r?|zEzJxNvQ{uTxtVvtVutUuuSutQusOvrMvqLvqLvqLvqLvqLYfsֈϐʖĚ&7 DNW(`1h8p?xDI}}Mx{QtzTqyVoyVnzUnzSoyQpwOqvMquLquLquLquLquL[iw݂Ћɓę$4ALU'^/e7m=uC{~HvLrPnSkUhVgUhSi~Qj|Ok{MlyLlyLlyLlyLlyL^ lzֆˏė!2?JS%\-c5k;zsAu|FpKkOgRdTbUaTaRcPeOfMg~Lg~Lg~Lg~Lg~La o~ЉƓ /=HQ"Y+a2yi9tq?oyDjHeLaO^R[RZR[P\O^N`LaKaKaKaKaKdtڂˎ,: EOW(y_/sf5mn;hw@cE_I[LWNUOTNTNUMXLYK[J[J[J[J[JhyчŒ(6 BLxT#r\*ld1gl6bu;]@YCUGQIOJNININIPIRHTGTGTGTGTGnʍ#2~>wIqRkZ%eb+`j0[s5W}9S=O@LBJCIBHCGDIDKDMDMDMDMDMDu҆Ó {-u: oEiOcW^_#Yh(Uq-Q{0M4J7G9E:D9C;B=B>D>E>E>E>E>E>}ɍytp&k5e@ `K[TW]ReNo#Kz&GȆ)DȔ,BȤ.@ȸ/?/?0=3;5<6=7=7=7=7=7цxne c`-[:WF SP OYKbGlDwAׄ>ؓ <أ!;ٷ":":#7'6)4+6-6-6-6-6-ŐwlbZXT)P5L?HIES B\ ?fC;K8T6]3h 0t . ,*(''&&%%%%%vi]QIFB>!;*734:0B-J+S(\%f"s         vi[NC>: 62/#+*(1$7!?FNXcpwhZL@72.*&# &+28@H R ]k}xi[K>2+&!  $ *07@JVdu/++2/104/9+A'L#X!f t    !""""/+.02/3126/>+I)V'c%q$~ # #"""""""""""###$&''''0*1-5+7-624:2E/R-`,m *z )(((''''''''(((')+,,,,1)4)9(;*<.:69B7O5\3i 1v0/..--------..--/122223)8&=$@%A)B3A>?J=W ;d 9p7}655443333345433 6!7!8!8!8!8!5'="B F H%J/I:GFER C_ Ak?w=<<;;:::::;:!:#:%:%<&=&>&>&>&>&9$AGKO"Q+Q6OALM KZIfGrE}CBBA A!@"@"@#A#A$@'@)?*@*B*C*C*C*C*C*< EKQVX'X1W<UH RTPaNmLxJI H"G$G%F&E'E(E)F*E-E.E/F/H/I.I.I.I.I.@IPV\_#`,_7]BZO X\VhSrQ} O$N'M)L+K-J.J/J0K0K2J3K3L3M3N2N2N2N2N2CLT\aef'f1e=cJ `W]bZmWw#U'T+R.Q0P2O4O5O6O6O7P8P8Q7R6S5S5S5S5S5FPX `fjl!m+l7jE gRc^`h ^r&\{*Z.X1W4U6T8T:S;S;TX?X@Y?Y?Z>[<[;[:[:[:[:[:LV ` h o swyy.w> tKpVm`!ji(gr-ez2c6a9`<^?]A]B]C]C^A_@_>_=_<_;_;_;_;NX clsx{ ~~+|;yHvSr]!of(mn.jw3h7f;e>cAbCaEaEbEbCcBc@c>c=c|g=|g=|g=|g=R]irzʃņ&6CN|X y`'wi-tp3ry7pwj>wj>wj>T _lv}Ƀć#4ALU^&|f-yn2wv7u;t?|rCxqFupHsoIqpIqpGqqDrpBroArn?rn>rn>rn>rn>V boýŇ 1? JS\%d,k1}s6~{|;zy?vwBrvEouHluIkuIkuGkuEluCmsAmr?mr?mr?mr?mr?Yer|DŽ /< HQZ$b*i0|q5xz:t>p}Bl|Ei{GfzHd{Hd{Ge{DfzCgxAhv?hv?hv?hv?hv?[iv̀È ,: EOW"_({g.vo3rw8m_A\DZEXEXDXCYA[@]>]>]>]>]>bq~È%4@ JyStZ#ob(jj.fr2a|7]:Y>V@SARBRAR@R?U>V=W=W=W=W=gvɃ!0< xGsPmXh`$dg)_p.[y2W6S9P;N=L=L2@2A2A2A2A2|Š|phfc-^9ZDVN RWO_KiHsE~B ?"=#<#<#:&8(7)8*8+8+8+8+Ʌ|qf[WV#S2P>MHIRF[ Ce@o>{;ω9ϙ7ϫ664210!/!/!/!/!}qf[PG FE'D5A@?K=U:_8i5v 3 1 / .--+*)((((~qeYND? =;#9.684B1K/U-_*k(x&%#""!!     qdXLA85 30.'+0(8&@#I!R]iyrdVI>4.+ (%"&-4<DNYg w   sdVH;0'#  !' . 6>HTbsteVG9-#   &.7AM\m$/%/(/'1$6 >IVdr    %.)-+,+.)3$;FSan{       &-,).(/*-/)7'C$P"] jw             !!!!**/&2$3%2*14/?-L*Y(f&r%~%% % % % $ $ % % % % & & &%%&''''.&4"7 9!8%9/8;5G3T1a/m.y - - , , ,,,,,,---,,,-....2#8<>@"A+@6>B xJuSs\qd"ol'mt+l|/j2i5|h8yg:vf;tf#="=#<%;&;&;&;&;&;&zui^[Y$V1S=PGMPJY Gb DlAw><98775433 3 3 3 vk_TL KI(H5E@CJ@S>];g9s 7ǀ 4ǐ 2ǡ1ȵ00.-,++++xk`TJ@:98(756@4K3U1`/l-z+؋*؝(ٱ''& % $ # # # # yl`TH>5- ,+)*(5'?&J$U#a!n ~zl_SG<2*% #!"+4>HR_n      |m_RE9/&!(0 9 C N\l}n`RC7+"  "*3=IWi~paRC5)  #+6CSez/ ,!,.3<F T a o {                      -#)$)"+08CP^kw#*&&(%''#+3@MZgs~&&*", +"(&'0$<"IUbnz     *".000"0,.7+D(Q&]$i#u#########$$%%$ % % $ $ $ $ $ .35588'734?2K/X.d-o,z,,,,,,,, , -- , -,,,,---27:<?@">-<9:E8R7^6j5t5~44 4 4 3 3 3 3 4 44444344446;> CFFF&D2B?@L?Y>d=o}H |Q{zYwy`swhovp!lux%it(fs+cr.`q/^q0]q0]q.^q,^p+_p)`o(`n(`n(`n(Ubmu{.;~E zNuVq^n}fj|m g{v#cz'`y*]x,Zw.Xw/Ww/Ww.Xv,Xv*Yu)Zt(Zt'Zt'Zt'Yfqz +}8xBtL oTl[hcdkat!]}$Z(W*U~,R~-Q~-Q},R}+R|)S{(Tz'Tz'Tz'Tz'^kv~~{'v4r?mI iQeYb`^hW{!T$Q'O)M*K*K)L)L(L'M&N&N&N&cp{zur"o0j;fEbN _V[]XeUnQxN K#I$G&E&E%E%E%F$F$F$F$F$iv~pkhf*b7_A[JXR TZQbNkKuHEB@ ? ?? >!>!?!?!?!?!p}wi`][$Y1V<SEPNMW J_ GhDsA><:998777777xznbUPNM(K5I?FIDRA[?d+<6;A9K7T5_3j1w/-+**) ( ' ''''rfZOD:0.-,)+5+@*J(V'a&o$#ϑ!ϥ н tg[NC9/' &1<HUbrvh[NB7-$&0: F S b txi[M@4*!  $,7BPauyj\N?2'  '1>M_u|l]N?1%  !+9J]s,)(+0 8DQ^lx)&%',4 @N[ht&!" !#'0<J W c o z                ""$$"",8ER^ju&((&&&(#4 @MYepz*---.-",.):&G$T#`"k"u"~""""""###$$%%%%$$$$.12 4553'14/A-N,Z,e,p+y++++++++,-- - - - - , , , , 15 6: <;97+695G5T5`5j4s4|4433 3 3 3 3 4 4 4444444458<@A A?<"=1>A>O>Z=d=nCKQTTRQS"U3TATLSVQ_ PgOoNwNMLLKKKKLLLMLLLL@GPVYZXWYZ/Z=YIXS W[ VdUkTsS{RQQPP P!P!~Q }Q}Q}Q}Q}Q}Q}QBJTZ^_^\ ^`+`:_E^P \X [`ZhYpXwWVV~U!{U"yT#xU#wU"vV vVvVvVvVvVvVENX^bdcacd(e7dCcMaU `]_e^l]t~\}|[yZ wZ"tY$rY%qY%pZ#oZ"oZ pZpZpZpZpZHR[bfhhfgi%i4h@gJfS e[db~cj{brxazv`s_!p^#n^%l]%j^&i^$i^"j^ j^j^j^j^j^JU_ejlljkm"n1m=lGkP jX|h`xggvgosfxpemd!jc#hb%fb&db&db%db#db!ebebebebebLXbinppnprr.r;qE}pN znVvm^slepkmmjujigi!eh#bg%`g&_g&^g%^g#_g!_f`f`f`f`fO\emrutst vw+w8|vCxuL ttT qs[nrckqkhpseo|bn _m"]l$Zl%Yl%Xl%Yl#Yk!Zk[k[j[j[jS`iqvyywy {|({|5w{@szIoyQ lxYhwaevhbup_tz\tZs!Wr#Ur$Sr$Sr$Sq"Tq TpUpUoUoUoWdmu{~}}|x$u2q=mFiO fV c~^`}f]|nZ{wWzTzQy!Oy"Ny"Mx"Mw!NwNvOuOuOuOu\hrzytq n.j9gCcL`S ][ZcWkTuQNKIH GGH~H}I|I|I|I|anx{pk hf)b5_?\HYPVX S`PhMrJ}HECBAAAABBBBgt~uga^\#Z/W:TDRLOTL\ Ie GoDzA?=;;:::::::n{{nbWRQO(M4K>IGGPDXBa?k =w : 86544333333wsg[OGDCA+@7?A=J;S9\7g5s20.- ,, + * * * * * xk_SH=6 43!2,170A/K.U,`*m){'%$##"!!!!!{naUJ?4+$ ""!* 4?JVcsDžǙȮ}pbVJ>4*" %0<H V e x ֍ ؤ ؾ   rdWI=2(  $.:GVg{teWI<0%  !+7EVh~vfXJ;.#  '4CUixhYK;-! "0@Si(%% '-5AO\it~%"!# (0=KXdpz"" ,9FS`kv(4 A N[fqz     !! $/<IUaku~%%$ ##")5CO[fpy() (+ +)&"#.!; I U `!j!t!|!""""###$%%%%%%%%%, -.11 /+)%(3(B*O+Z+e+n,v,~,,,,,,,--....----/15763/.1,3<4I5U5_5h5p4x444444 4 4 5 5 5 5 5 5 5 5 5 35:>@=7 8:&=6>D>P=Z=c=kGPVXYVSTV%W4W@WJVSU[ Tc TjSrRz}R{QxPvPtPsPqPpQpQpQpQqPqPqP@KTZ]^[XY["\1\=\G[PZX Y` ~Yg{XoyWwvVtVrUoUmTlTjUjUjUjUjUkUkUkUCOX]ab`\^`a.a:`E`N~_V {^] x]ev\ls\tp[}nZkZiYgYeYdYdYdYdYeYeYeYeYFR[aefcabde+e7eB|dKxcSuc[ sbbpajm`rk`{h_f^c^a]`]_]_]_]_]`]`]`]`]JV^eiigef hi(~j5zi?viIshQpgY mg` kfghepedycd`c^b\bZbYbYbZbZa[a[a[a[aMYbhmmkik m|n%xn2un=qnFnmOklV hl^ ekecjm`iv]i[hXgVgUgTgTgTfUfUeVeVeVeQ]flqpon}pxrus!rs/os:lsDirLfrTcq[ `pc ]pk[otXnUnSmQmOmNmNlOkOkPjPjPjPjUajqutt|svuqwoxly+iy7fy@cyI`xQ]wX [w` XvhUuqRu|PtMtKsIsHsIrIqJqJpKpKpKpZfovyxxwyo|j} g~d&b2_=\FZNWUT~] R}e O}oL|yJ|G{E{D{C{CzCyCxDwDvDvDv_kt|~}~rfa^\!Z.X8UBSJPRNZKb Il Fw CA?=<<<===~=~=~fq{ym_XTRP'O3M=KEINFVD_Bh?s = : 8 766555666myrfZPI GE D+C6A@@H>QKZj~̫̔|n`RE9.#  '1>K[nބߛߴpaSE8,!  $/<K]qrcTF7*  +9J^tteVG8*  (7J^v$" !$)2>LYepz! #-:HUalv )6CP\gqz $0>KWblu~ + 8EQ\fpx   $0> J V a j s { " ! ! (6COZdmu}&%&'%! -<I U!_"h"p#x###$$$$%%&&&&&&&&)(-0/+" #&'(6*D+O,Y,b,j-r-z--------..//....,.5996/-0!214>5J5T5]5e5m5t5|554445556666555/4<AB@:69;,<:=F=P=Y=a=h @B'C5DBDLDUC]CdCkBsB{B A A A A~A|AzB yB xB xB xB xA xA 6@HMNMIEFH#I2J>JHJQIYI`IhHoHw G }G zGxFvFuFsFrGqGqG qG qG qF qF 9DLQSRNJKM O.O:OEONOVN]~Nd|Ml yMt wL} uLsLqKoKmKlKkLjLjLjK jK jK jK =HPUXVSOPRT+T7TBTK|TSzSZxSbuRi sRq qQz nQlPjPhPfPePdPdPdPdPeO eO eO ALTY\ZWTU WX'Y4}Y?zYHwXPtXXrW_oWf mVn kVw hUfUdTbT`T_T^T^T_T_T_S _S _S DPX]_][XZ [}\$z]1w]<t]Fq]No\Ul\]j\d h[l eZu cZaY^Y\X[XYYYXYXZXZXZW ZW ZW HS[aba_\^{_xa!ub.rb9obClaKjaSgaZe`b c`j `_s ^^}[^Y]W]U]T]T]T]U\U\U[V[ V[ LV_dedcaybudreof+lg7jg@gfIefQbeX`e`]dg [dp Yc{VcTbRbPbObObOaOaP`P`P` P` OZcihggyesgoiljik(gl4dl=blF_kN]kVZj]Xje Vin Six QhNhLgKgIgIgIfJfJeKe Kd Kd T^gmlkkskmmhn epbq$`q0^q:\qCYqKWqSUpZRpbPpk Nou Ko InGnEnDnCmDlDkEk Ej Ej Ej Xclqpozonpes`u]v[wYx+Wx6Ux?SxHQxOOwWLw_JwhHvs Ev Cu Au?u>u=u>s >r >q ?q ?p ?p ^iquttutiv^yX|T}R~Q&O1M;LCJKHTF\CeAp?~|<~ :~ 9~ 7~ 7} 7{ 7z 7y 8x 8x 8x doxyy{ypzd|XPK HG E+D5C>AG@O>X4*!! + 6 A N \ l teWK@5*!  "+6BP_qćĝĵxj\OA5)  !*5CRcxՏէ{l^PB4(  '3BTg~}n_QB4'  $1AUjqaRD4&!/AVm  %.;IVbmv  *7EQ^hrz%2@LYcmu}  ,:GS^gpx  &3@MXajrz  +9FQ[dlt{   " 0 > J U ^ gov~ (7DOYaiqx"!'*)$"1 >!I"S#\$d$l$s$z%%%%&&&''((''''&)1440)#&(+*8+D,N-W-_-g-n.u.}......////////)18<<92- /1&344@5J5S5[5b5i5q5y5555556}6{6{6z6z6z5z5-7?CD@:679":/<;h >g >f?e?e?d?dWaihg{gqgeh\jXlTnRoPo$Np.Mp8KqAJqIHqQFqYDpbBpl@px>p0$  !,:J]rzk\M?0# +:Maym^O@1"  );Of"+8FS^irz&4BNZdmu} ".<IT_hpx   (6CNYbkry "/<HS\elsz  (5ALV_fnt{  -:EPYahov}   $ 2 >IS[cjqx#%$+8CMV]els{       &-0.(" &!3">#H$Q$Y%`%g&n&v&&''''((~)})|(|(|(|($.5861,&&(!*.+9,D-L-T.\.c.j.r.z//}/{/z/x/v0u0s0s0s/s/s/*5;?<83/.02)354?5I5Q5X~5_}5f{6ny5vx5v5t5r6p6o6m6l6k6k6j6j5j50:ACA>:65 78%:1;<|;Ez"z?.x@8uABsAJrAQpAYnA`lAgjAphAygAeAcAaA`A^A^A]A]@]@]@]@9CJKIGDA~AzBvCtE*qE5oF?mFGkFOjFVhF]fFedFmbFv`F^F\E[EYFXFXFWEWEWDXDXD=GNNLKI}ExFtGpHnI'kJ2jK<hKDfKLdKSbKZ`Kb_Kj]Kt[JYJWJUJTJSJRJRJRIRIRHSHAKQPON~LxHrJnK kMhN$fN/dO9bOBaPI_PQ]PX[O`YOhWOrUO}SORNPNNNMNMNMNMMMMNLNLDNTSRQzPrMlOhP eQcR!aS,_S6]T?[TGZTNXTVVT]TTfRSoPS{NSLSKSISHSHRHRHQIQIPIPHRWVUTvSlQgSbT_V]W[W)YX3XX<VYDUYLSYSQY[OXdMXmKXxIXGWEWDWCXCWCVCUDUDTDTLVZYX{XqWfVaX]YYZW[U\&S]0R]9Q^AO^IM^QL^XJ^aH]kF]vD]B]@]?]>]=\>[>Z>Z>Y?YPZ]\[v[m[a[[]V^R` PaNb"Mb,Lc5Jc>IcFGcNFcVDc^Bch@cs>co=o"JV`hpx~ +8EPZckry  %2?JT]elsz  ,8CNW_gmtz  $1<GQY`gnt{  )5@JS[bhou}  !.:DMU \ c j q x  ! &3>GPW^els|#)*&"!-8BKRY`gow~ } { y!w"v"u"t!t!t!!+11.*&! !(#3$=$F%N&U&\~&c|'k{'sy'|x(v(t(r(q)o)m)l)k)k)k(k((28752-)' (*#+/~,9|,Bz-Jx.Qw.Xu.`s/gr/op/yo/m/k/i/h0g0e0d0c0c/c/c/.8=<:730. /{0x2+v35t3>r4Fp4No5Um5\l5dj5lh5ug5e5c5a6`6_6]6]6\6\5\5\43<A@><96{4w5t7q8'o92m9;k:Cj:Kh;Rg;Ye;ac;ib;r`;}^;\;[;Y;X;W;V;V;V:V:V97ADCB@~>y;t:q:m<k=$i>/g?8e?@d@Hb@Oa@W_@^]@f\@oZ@zX@V@T@S@R@Q@P@P?P?Q>Q>;EGFEDyBt>o?k@ gAeB!cC+aC5_D>^DE]EM[ETYE\XEdVEmTExREQDODMELEKEKDKDKCLBLB?HJIH}GuEnBiCeD bE_F]G(\H2ZH;YICWIJVIRTIYSIaQIkOIvMIKIJIHIGIFIFHFHGGGFGFCLLLKyJpIiFdG_I\JZKXL%VL/UM8SM@RMHQNOONWNN_LNiJNsHMFMEMCMBMAMALALBKBJBJGOONNuMlLcJ^LZMVNTORP"QQ,OQ5NR=MRELRMJRTIR]GRfERqCR~AR?R>R=RW{?\F>]O=]W;]a:]l8]y6]4]3]1]1\1[1Z1Y2Y2XTYXXsWiW`XTYN[H]C_@`>a=a ;b):b29b:8cB7cK6cT4c]3ch1cv/c.c,c+c*c*b*`+_+_+^Y\\{[o[e[\\Q^I`CbKYi{w}uptbuUxI|?4+" "+5BP_q}x|i|[NA6,#  "+7ETf{qaSF9.#  !+8HZnyhYK=1%  +:L`wؒجp`QC5(  *<QggXI:* ,?Un%2?KV`hpx -:FQ[cksy  (5@KU^fmtz ".:EOX`gmtz'3>IRYagmsz !,8BKSZagmtz%1;EMU[bhnu|   )4>GOV\cipx   " . 8 A J Q X ^ e lt}~}zxwwww!$# '2<DLSZ`~h}o{xyxvtsronmmmm )+*($  "-~7|@zHyOwUv\tcskq tp n!l!k!i"h"f"e#d#d"d"d!&/10.+($ ~ {"x#)u$3s%<q%Cp&Kn&Rm'Yk'`j'hi(qg({e(d)b)`)_)^*\*\)\)\)\(,55431-|+y(v'r)p*%m+/k,8j,@h-Gg-Ne.Ud.]c.ea/n_/x^/\/Z/Y/X0V0U0U/U/U.U.1:9876z2u0r.n. k/i0!f1+d24c2=a3D`3K_4R]4Z\4bZ4kY5uW5U5T5R5Q5P5O5O5O4O4O36=<<;{:t7o5l3h4 e5b6`7(^71]8:[8AZ9HY9PW9WV:_T:hS:sQ:O:N:L:K:J:I:I9I9I8J8:@??>w=p;j8f8b9_:\;Z;%Y<.W=7V=>T>FS>MR>UQ>]O?fM?pL?}J?H?G?E?D?D>D>D=D=E<>CBB}As@k?e<`<\>Y>W?U@"SA+RA4PB<OBCNBKMCRKCZJCdHCnGC{ECCCBC@C?C?C?B?A@A@@AEEEyDoDgB`?[AWBTC QDOENE(LF1KF9JGAIGHHGPFGXEGaCHlBHx@H>HCKFBLMALV@L_>LjPC%cG#cQ"d\!didyddddca``_YX{XmXbXYXPYG[>^7`1c*f$i !j jj k(k0k9kBlLlXleltllllkihhg]]u\h\^\U\K^Ba9d2g+j$mps ttt!u)u2u;uFuRu_ un u u ut t s q q pbapadaZaObEe2' $1@Re}o_QC6*  $3DXnшФgWI;.! $6I_x_PB4& %9Og"/;GR[dlsz *6ALV_fmtz $0;FPY`gntz *5@JRZagmsz#.9CLT[agmsz (3=FMU[agmsz!,6?GOU[agnu}   %09AIPV\bipx~}|{{{{  )3<CKQW^dl}t|~z x w u s r p p o o o    # - 6~>|F{MySxZvauhsqq{pnlkihfeeee$$#!|y(v1t:rAqHoOnVl]kdimhwfdca`^]\\\\%*))(%}"yxvro#m-k5i=hDfKeRc Yb aa i_!s]!\!Z"Y"W"V#U#T#T"T"T"+...-|+v(r&o#m! j"g#e$)c$1b%9`&A_&H]&O\'V[']Y'fX(pV(|T(S)Q)P)O)N)M)M)M(N(02221v0p-k+h)f( c(`)^*%\+.[+6Y,=X,DW-LU-ST-[S-cQ.nP.zN.L/K/I/H/H/G/G.G-H-4555{5r4k2f/b._-\.Z/X0"V0+U13S1:R2BQ2IP2PN3XM3aK3kJ3wH4G4E4C4B4B4B4B3B2B28888w8m7f6a3]2Y2W3 T4R5Q5(O60N68L7?K7FJ7NI8VG8_F8iD8uC8A9@9>9=9<9<8=7=7=6;;;;s;j:b9]7X6T7Q8 O9M9K:%J:-H;5G;<F=<=:=9=8=7=7<8;8;8:=>>|>o>f=^=X;S:O;L<I=G>F?"D?*C?2B@:A@A@@I>AQ=AZ@@@xAlAb@[@T?N?J@FADBBC@C?D'>D/:EF9EN8FX6Fb5Fn3F|1F0F.F-F-F-E.D.C.CCCCtChC_CWCPCHCDEAF>G nJnWnenvnmmllkjjZtZfZ\YSYHZ?]6`.c&gjmqt w wwww$x-x7xCxPx^xoxxwvuutt~_n_b^Y^M_Bb9e0h'lptw {~ &0;HWh|weid_cRdGgGNU[agmsz#.7@HOU[`fls{ '1:BIOU[`gmu~ !*3<CIPU[ahp~y|{yxvusssss   $.6>}D|KzQyWw]vdtlsuqonlkihhggg  |y(w0u8s @r Fp Lo Sm Yl aj ii rg ~f d b a ` ^]]]]{xxw sp"n+l3j;iBgIfOdVc]af`o^{\[YWVUTTTT""##"y!sonm jge'c/a7`>^E]K\RZZYbWlVwTRQONMLLMM&''({'r&l$h!fdb_]#[+Z3X:WAV HT OS WQ!_P!iN!tM!K"I"H"G"F#E#E"F"F!*++,v+m*f)b&_$]"[!X"V#T$(S$0R%7P%>O&EN&LL&TK'\I'fH'qF'E(C(A(@(?(?(?(@'@'-./}/q/h.a-]+Z(W'T' R(P)N)%M*,K*4J+;I+BH,IF,QE,ZD,dB-o@-}?-=-<-:-:-:-:-:,:,012y2m2d2]1X/U,Q,O- L-J.I/"G/*F01E08C0?B1GA1O@1W>1a=2m;2{928262524242515150345u5i5`5Y4T3P0L1I1G2E3C3B4'@4.?56>5==5D<6L:6U96_76k66x472717/7/7/6050504667r8f8]7V7P6K4G5D6A7 ?8>8<9$;9,:939::8:B6:J5:S4;]2;h0;v/;-;,;*;);*:*:+9,889|:n:c:Z:S:M:F8B:?;<< :<8=7=!6>)4>03>72??1?G0?P.?Z-@f+@t)@(@&@%@$@$?%>&=&=;<x=j=_=V=O=I=B=<>9?6A4A2B1B/C%.C--C4,D<+DD*DM(DX'Ec%Eq#E"E EEDDC B!A>?t@g@\@S@L@F@>A8C4E0F-G +H*H)H"(I)'I1%I9$IA#JJ"JU JaJoJJJJJIHGGBBpCcCXCPCICBD;E5G0I+K&M $N"N!O O%O,O5O=PGPQP]PkP|PPPPONMME{FkF_GUGMGFG?G7J1L+N&P SU VVV V'V0V9WBWMWYWhWyW W W V V U TSIvJgJ[JQJJJCJ;L3N,Q&T!VY\^ ^^^"^* ^3 ^= ^H ^T^b^s^^^]]\[[NpNbNWNNNGN>O6Q.T'W!Z]`c f gggg$g-g7gBgNg\gmgffeeddczRjS]RTRKRBS9U0X([!_beh kn ooopp'q0q;qHqVqfqyqpoonmmsXeWZWQVFWHRZbiou{ !,8CLT\ciou{ '2<FNV\chnt{!+6?HOV\agmsz %/8AHOU[afls{)2:BIOUZ`flt} #,4<CIOTZ`fnw~|{zxxxxx &.6=C~I}O|Uz[yawiuqt|rqonmlkkkk  | z(x0v8t>sDqJpPnVm]ldjmhwgedca`````| y x usp#n+l3j9i@gFfLeRcYba`j_t]\ZYWV V U U V vqnm m j g e &c .b 5` <_ B^ H\ O[ VY ^XhVsUSQPNMMMMMwoifddb_]![)Z1X8W>VETLSSQ[PeNpL}KIGFEEEEE!"|"q"h!b_\[Z WUT%R-Q4O;NBMHKPJXHbGmEzCB@?>=>>>#$%w&l&c%]$Y"VTS QNM"K)J1I7G>F EE MC UB _@!j?!w=!;!9!8"7"7"7"8!8!&')s)g)_)X(T&Q#O"L"J"H"G#E$&D$.B$4A%;@%C?%J=&S<&\:&g9&u7'5'4'2'1'1'2&2&3%)*},o,d-[,U+P*L(J&G'D' B(A(?)#>)+=)2<*9;*@9*H8+P6+Z5+e3+r1+0,.,,,+,,,,+-*-*,-y.k/`/X/Q.L.H,E+A+?, =,;-:.!9.(7./6/65/>4/E3/N10X00c.0p,0*0)0'0&0&0'/(/(..0v1h2]2U2N1H1D0@/<0:1 71625233%23,13304;/4C-4L,4V*5a)5n'5~%5#5"5!5!4"4#3#213r4e4Z5Q5K4E4@4:374452607/7.7"-8)+81*88)9@(9I&9S%9_#9l!:| :::9988746n7a7W7N7H7B7<75829/:,; *<)<(=&=&%=.$=5#>=">F >P>\?i?y???>>=<<7z8j9^:S:K:E:?:9:2<.>)@&A$B"B!B C#C*C2C:DCDMDYDgDwDDDDCBBA;v<f=Z=P=H=B=<=6>/@*B%D!FH IIII&I.J6J@JJJVJdJtJ J J J I H G G>q?b@V@M@E@?@9A2B+E&G!IKNPPPP!P)P1 P; QF QQ Q_ QoPPPPOONM}BkC]DRDJDCCGOW]ciou|"-7@IPW]chnu| &0:BJPV\agmt| *3;CIOUZ`fmt} $,5<CIOTZ_fmv~&.6=CINTY~`|gzoyzwutrrqpppq !})|0y7x=vCtIsNrTpZobmjktjhgeeddccd~{wurq#o+m2l8j>iDgIfOeVc]be`o_{]\[YYXXXY }v q om kige&c-a3`9_?]E\K[RZYXbWlUxSRQPONNNNtlgec c a^\![(Y/X5V;UBTHSOQVP _N iM vK I H G F E E E E xme_\ZZZ W U S $R +P 1O8N>MEKMJUH^GhEuCA@>====>rg_YUSRR PNL J'I.H4G;EBDICRA[?e>r<:8755667{ m!b!Z!TPMLKIGED$B*A1@8??=F<O:X9c7o5~320///00"w#i$^$V$P#K"H FEC A?>!<';.:59<7D6L4 V3 `1 m/ |-!,!*!)!)!)!* + "%s&e'['S'L&G%D$B!?!=! ;!9"8"6#%5#+4$23$92$A0$J/%S-%^+%k*%z(%&%$%#%#%$%%$%$%'o)b*W*O*I)D(@'=&:%7&5&4'2'1("0()/(0-)7,)?+)G))Q(*\&*i$*x#*!****) )!((|*l+_,T,L,F,A+<+8*5*2+0+ .,-,,,*-&)--(-4'.<&.E$.O#.Z!/g/v////..--+x-h.[/Q/I/C/>.9.4.0.-/+0 )1'1&1%2#$2*#21!39 3B3L3W3d4t44333321.t/e1X1N2F2@1;16111+3(4%5#6 !6 77 7'8.868?8I9U9b9q999888761p2a4U4K4D4=48434-5(7$9 :; <===#=+>3><>F>R>_>o> > > > = = < ;}4k6]7Q7H7A7;75707*9%; =?AC CCCD'D/D9 DC DN D[ DjD|DCCCCBAx8g9Y:N:E:>:8:3:-;'=!@BDFI J J J J#J+J4J>JIJVJeJwJJIIIHHr<b=U>J>B=<=6=/>)@#BEGJL O P QQQQ&Q/Q9QDRQR`QrQQQPPOOl@]AQAGA@@9@2A*C$FHKNQ SVW XXYZ!Z)Z3Z?ZLZZZlZYYXXWWeEXEMEED>D5E-G%JMPSV Y\^_ ` abcd#d-d8dEdTdfd{ccbaa`_JSJJICH9I/L'ORUY ]`cfhij k mnpq&q1p>pNp_psoonmllZOPNHM=N3Q)T X\` dhkortuwx z |}(5EVk~}|{zVTNSBT7V,Z"_ch mrvz} ,;MbzUYHZ;]/a$flr w} !1CWpNa@d3i'nu| %7LdFk9p+w +@XtӒҰ>y1# 3Kd )4?HPX^ekqw~ #.9BJRX^djpv} (2;DKQX]chov~"+4=DKQV\agnv %.6=DJOUZ`fnw'/7=CINTY`goz~|zyxwxxwu !)07}=|CzHyMwSvYtariqsomljihiiii|ywvt#s+q1o7n=lCkHjNhTg[eccmbx`_]]\\\\\xtpm kihf%e,c2b8`=_C^I\O[VZ^XhWsUTRQQQQQR ~ s l heca _]\!['Y-X3V9U?TESKQRPZOdMoL}JIHGGFGG ukc^[ Z Y WUSR#Q)O/N5M;LAJHIOHWFaEmCzB@?>===>|nd\VSQP P OMKI%H +G 1F 8D >C EB M@ U? _= k< y: 8 7 5 5 5 5 6 vi^VPMJIIH F D C!B(@.?5><=C;K:T8^6k4y21/---./qdYQLGDCBA @><;%:+82796@4H3Q1\0h.w,*('&'()}m`VNHC@>=;9865"3(2/160=.F-O+Y*f(t&$"! !"#yi!\"R"J"D!?!< 9854 20/.%-,+3*;)C'M&W$d"r  u"e#Y$O%G%A$<#8#5"3 0 .! ,!+!*"("#'")�%#8##A"$J!$U$a$p$$$$$$##"q$b&V'L'D'>'9&5&1%.$+%)%'&%&$'#' "''!(. (6(>(H)S)_)n))))((('%n'_(S)I*B);)6)2(.(*(&)$*"+ +,,,$-+-3-<-E.P.].l.~.. - - -,,|(j*[+P,F,?,9,4+/+++&,"./0 1112!2(20293C3N3[3i 3z 3 3222 1 1w+f-X.M/C/<.6.1.-.).#02356 7778$8,85 8? 8J 8W 8e8v8877766s.b0T1I1A19141/0+0%2 368:< = = = =! =)=1>;>F>R>a>r>===<<<m2]3P4F4>47423-3'4"68:=? A C DDDD$D-D6DADND\DmDDCCBBBh6X7L8C8;75606)7#9;=@B EGI IJKK K(K2K=LILWKhK}KJJIIIb:T;I;@;9:39,:%<?ADG ILOP P QRTT#T,T7TDTRTcTwTSRRQQ\?O?E?>>7=/>'@ CFIL ORTWXY Z[]^_&_1^=^L^]^q]]\[ZZVDKCCBFLRX]cipx &/7?EKQV\ahpy  (08>DJOUZahq{|{y "*18>CHNT~Z|azixsvusqpoooml ~}|$z+w1u7t=rBqHoMnSlZkbilgxfdba`aaa`|wrp nllk%i,g1f7d=cBbH`N_U]]\fZrYWVUTTTUUunifc a`_^ ]&[,Z2X7W=VCUISPRXQaOlNzLKJIIIIJtjc^[YW VTSR"Q(P-N3M8L>KEJLHTG]FhDuCA@@??@@ y l a Z U R PON LKJI#G)F/E4D:BAAH@P>Z=d<r:9876667 re[SNJH G G EDBA @%>+=1<7;>:E9N7W6b4p210/..-.}l_UNHDA@@ @ > < ; 9 "8 (7 .6 55 ;3 C2 L0 V/ a- o+ * ( ' % % & ' wg[QIC?<:998 7542%1,02/:-B,K*U(a&o$#! scWME@;85432 1/-,"+)*0(7'?&H$S"_ m~o_SJB<741/.,+)(' %&$-#4"= FQ]k|}k\P G ? 941-+)'% $"! #*2:DN[izzgY!M"D"<"6"2!.!* ' $"  !!!"!"'"/"8#A#L#X#g#x# # # # " " !vd"V#K$A$:$4$/#+#(#$# #$%& &&''%','5(?(J(V (d (t ( ('''&&q"`$S&H'?'7&1&-&)%%%"%'(*+ ,,,,",)-2 -; -F -R-`-p--,,,++m%]'O(E)<)5)/(+(''#'(*,.01 1 1 1 1&2.272B2N2\2l2211000h)X*L+A,9,2+-+)*%* +,.024 7 7777"7*838>8J8X8h8|776665c,T.H/>/6.0.+-'-"-/1357 :; <=>>>&>/>:>F>T>d>w>==<<;^0P1D2;241.0)/$02469 ; =@A B CDEF"F+F5FAFOF_FsEEDCCBX4K5A59524-3&4 58:= @ BEGHJ KLNOO%O/O<OJOZNmNMLKKJS9G9>97817)7!9<?B EHJMOQRT UWYZY)Y6YDYTXgXWVUTTN=C=<<5;,<$>ADH KNQTWY[]^` bdgg"f.f<fMe`ewdca`_IBAA:?0@&CFJN RVZ]`cegikmo ruwv&v5uFtYtosrponFF@E5F*H LQV Z_chkoruwy{} +<OfFK:L.O#SX^ diotx| !1D[v?R2U&Z`g mt{ &9Pj7\+ahp x.E_~ɞȾ/i#py #:Tr !+5>GNU[afms{ $.8@HNTZ_ekr{(19@GMSX^dks| !*2:@FLQV\cjs~}| #+29?DJOU[ckv~|zywrpo %,28}={CyHxNvTu[scqnozmljihgedc{xv utsr%p,n2l7j<iBhHfNeUc]bf`r^][ZYYYXXyqmif edcc a&`,^1\7[<ZBXHWOVWT`SlQyPONMMMMMukd`]ZX WVVU!S'R,Q1O7N=MCLJJRI[HfFsEDCBBBCCxjaZURPN M LKJI"H'G-E2D8C>BEAM?V>a=n;~:988899o b X Q LIGFD CBAA?#>)=.;4::9A8I7R6]4j3z210///0 x h \RKE A ? >=< ;:98 6%5+40372>1F/P.Z-g+w*)('''' rcVME@<97 6 6 54210"/(..-4+<*D)N'Y&e$u#"  m^RHA;74200 0 / - , * ) %( +' 2& :$ C# M! X e u       {iZNE=830-+**) (&%$##)!1 9BLXfvweWKB:40,)'&%# "!  '.6@JVdt  saSH?72-)&$"  $+4=HTbr       o^PE<5/*&#! ")1;E Q ^ m k[MB:2-($! !!!!"& ". "7 "A "M"Z"i"|""!! gWJ!@!7"0!*!& "  !#$& & & & &"&*'3'='I'V'f'y'&&%%$c T"G#=$4$.#(#$"!"!"#$&( * ++++,',0,:,E,S,c,v,++**)_#P%D&:&2&+&&%#$$$%')+ -/ 00111#2,262B2O2_2r1100//Z'L(@)7)/))(%'!&'(*,. 024 5 6788 8(829=9K9[8n877655U*H,=,4,-+(*$)*+-/ 1 468:; = >@@@$@.@9@G@V@i@?>=<<P/C/9/2/,-', -/13 6 8;=@ACE FHJJJ(J4IBIQIdH{HGFEDJ3?36301*0#1358 ;>ACFHJLNO QTUU"T.T<TKS^StRQPONE7<756/4&57:= ADHJMPSUWX[] _bbb'b4aE`W`m_]\ZYA<:;49*:!<@C GKOSVY\_acegjm psr r-q=pOoenmkih?@9>.?$BFJ OTX]aehknqsux{~ $4F]v~|z?D3E(HLR W]chmqvz~ )<Rl8K,N SY `gntz 0F`~1U$[aiqy %;TqȒų)biq{ /Ie&0:BIPV\bhov  *3;CIOU[`gnv #,4;BHNSY_fnw~%-4;AFLQW^eny|vsr &-4:?EJPV^f~q|}ywusrnige  }&z-w3u8t>rCpIoOmVl^jhhugedba`\[Z~xsom lkkj h&f,e2c7b<`B_H]O\WZaYmW{VUSRRPOOxngc`]\ [[[Z!X&V,T1S6R<QBOINQM[KfJtIHGFFEEExlb[VSQOO NNML!J&I,H1G7E=DDCLBU@`?n>~=<;;;;<~naXQLIGED CCCB@"?'>,=2;8:?9G8P7[5h4x3211123vfYPIC@><;: :9976#5(4.342;0C/L.W-d,s+*))))*n_ S J B = 9 6543 2110/.$,*+0*7)?(I'T&`$o#"!!!!"{ h Z NE=8 3 0 . - -, +*)('!&'%-$4#="F!Q]lu dUJ@93/,)' ' ' & %$"! $+2:DO\k}q_QF=60+(%#"! !     " ) 1 9 C O \ k ~  m\NC:2-(%"  !(09DP] k |  iXK@70*&" %.7 @ K X gxeUH=4-(#   " ) 2 <GTcuaRE;2+%!   &/8DQ`r^OB8/)#     !#!+!5!@!N!]!o! ZK?5-'" ! " # $%%& &(&2&=&J&Z&l&%%$##UG ;N;`:w98765G);*2*+)%'!&'(*, /1468;=?A CEEE!E,D9DHD[CqBA@?>B-8./-)+$**,. 1 47:<?ADFHJL NPPP'O4OCOUNjMLJIH>251./). .137 :=@DGILOQSUXZ ]_^ ^,]<\N[cZ~XWUT:634-2$369=AEILPSVY[]`behk oon%m4mFk[juhfdb8927(9;?DIMRVZ^behkmpsvy} ,>~T~k{zwu8=,>"AFKQW\bfkotx{~ !3Ib1D%HMSZahnty (>Vs*OT[ bjs{2KfƇ©"[b kt}'?[z ",5=ELRX^djrz %.7>EKPV\bjr|'/7=DIOU[ais{vt  (/6<BGMSYaju|smjh !(/5:@E~K|RzYxbvltyrqomle`^\|zx wxwt!r'p-n3l8k>iDhJfQdZcdap_^]\[WTRQtnjfec ccca!_'],\2Z7Y=WCVKUSS\RhPwONMLKIGG|ne^YWUTS STRQ!O&N+L1K7J=IDGLFVDaCpBA@??>=>ocYQMJHGG FFGED!B&A+@1>7=><G:P9[8i7z6554445teXOHC?=<<; ;;:97!6&5,42391A0K/V.c-s,,++++,l]QH@;74322 2 110/-",(+.*5)=(F'Q&^%n$##""#$weVKB:50-,+*) ))('&%$$*#1"9!C NZi|p_Q F = 5 0 + ( %$## " "!  &.6?JWfxk[ M B 9 1 , ' # !     #+3<GTcug W I>5.($           ! ( 0 : E R a s      c SF;2+%!        ' / 9 E Q ` q      _PC8/(#      $ , 6AN]o\M@6-&!      !)3>KZlXI=3+$     '0;HXjUF:0("     $-8FUg}QC7.&         !!*!5!B!R d zM?4+$  !# %&&&'''2'?&N&`&w%$#"!H<1("  !#%') , ....#...;.J-\-r,+*)(D 8!.!&!  !#%'),.03 5 6666)666E5W5m4210/?$4$+$$#!  !# %(*-/2479;> @AA@%@1@@?R>g=<:98:(0()'#%#$%( *-0368;>@BEGJ MMLL+K:JLIaH|GECB6,-+')#'(*- 037:=@CFHKMPSVY [[Z%Y4XFWZUtTRPO30,.',-/2 6:?BFILORUXZ]`cgk lkk,i=gRfjda_]13,1"259 =BGLPTX[_behknquy} $~5|I{axvsp16&8;@ EKQV[`einrvy|~+@Ys+> AG MT[ahnsy~!5Mi#HNT\dmu| )A\|U\enw6Qn߱  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C"K2TE]Zdqjo˸r±twĴ{ͫԢۙᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚ%0:C"K1TE\[cqimɿpruëxʢ|љؐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ%0:C"K1SE[[argknqsvȚyΒ~ԉ؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉%0:C!K1RDZZ`rejmprtĔwʋ{τԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄ%0:B!J0RDXZ^rdiloprvƆz%09B J/QCWZ\qdiknoqtx{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}$0 9BJ/PBUY[pchkmoqt}ww|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|$0 9BJ-O@SY[ocgjmoqszwt{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{$/ 8AI+M@RXZmbgjmoq{tvwq{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{$/ 8AI(L@QWYkazgknp}sxusxn|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|$/ 8AF(LAPUXfatg~korzuuxq{l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~#- 6 =F*K@OQX`akhtm{qytuxr{n~kւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւ#,/;E+I=NLWXaaiionytruwuqzwn}yk{i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|""':B*F9MEVObV~j\wp`sucoxem|gjhhjfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfk& :>'D3K=UE|aKujOppRluTjyVh|WfXdZc[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[ & 6;#A,J4xS:q_?liChoEetGcwHb{Ia~J_J^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8@I+R<\Oedmxsըy̟}ŗŶ̲ү֧~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~"- 7@I+R<[Pddlyrӭwʤzœ~÷ʲҮئڡաաաաաաաաաաաաաա"- 7@H+QG(N9TNYe`{fjmoruxz}tqqqqqqqqqqqqqqq!, 5>G'M8RLWd_zfjloqt|wv|qnnnnnnnnnnnnnnn!, 5>F%M6OLUc_xeiloq~txws{nkkkkkkkkkkkkkkk!, 5>F"K4OLTb^tdimorzttxp{khhhhhhhhhhhhhhh!+ 4 =EI5NLS_]pd}inq{tvwqym}iŁfąfąfąfąfąfąfąfąfąfąfąfąfąfąfą *3 <BI5MJR[]ietj}o|swwszo}lрhЄeχeχeχeχeχeχeχeχeχeχeχeχeχeχeχ )13 B!H5LFQU]`ejlq}qvwvzsy}o|l߀iރg݇e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉%"2A"E3JAQM]Vf^}ndvshrxkn|mlojpgresctctctctctctctctctctctctctctct1>"B/H:PD\K{gQtnVosYlx[i|]g^f_d`baababababababababababababababab 2:?*F3O:x[@qfElmHhsJfwLd{MbNaO`P^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q  05<$|D+sM1lX5gc9ck;aq=_u>]y?\|@[AZAYBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>F%P4ZEdWmiw{}ٖюˈǂ~zwuµqórrrrrrrrrrrrr* 5=F%O4YFcXlku}ߣ{՛͒Nj…|ùyǵvʭuƫvīvīvīvīvīvīvīvīvīvīvīvīv* 4=F%N4XFaYjlsݨxӟ~ʖĎŷ˴|ϫxϥyȤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤy* 4=E%N4WF`YimqܬvФ{Țŷ˴βѤ|џ}ʞ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}* 4<E$M4WF_YgnoڱtϨyş}Ƶ˯ϪҞә̘ʘʘʘʘʘʘʘʘʘʘʘʘ* 4<E$M3VF^Zfomٶsͭwĥ{Ʈ̨ϢҙӔ͓˓˓˓˓˓˓˓˓˓˓˓˓* 3<E$L3UF]Zeolػq̲uí|ƨˡЛӔԏΏˏˏˏˏˏˏˏˏˏˏˏˏ* 3<D#L3UE\ZdojoʹtzƢ˛ϕҏԊΊ̊̊̊̊̊̊̊̊̊̊̊̊* 3<D#L2TE\Zbphmżsx}ŝ˕ϏҋӆΆ̆̆̆̆̆̆̆̆̆̆̆̆) 3;D#L2SEZZ`pflqw|ŗʐΊхҁ΁́́́́́́́́́́́́) 3;D"K1RDYY_pdjoty}Ðȉ̃~}|||||||||||||) 2;D!K1QCWY]ocimptx†}ƀzvvwwwwwwwwwwwww) 2;C K/PBVW[nchlnqt~xw|rmmnnnnnnnnnnnnn) 2:CJ.O@RWZmbgknqtywt{njgfffffffffffff) 1 :BJ+L?QVYka|gknq{tuxp{lhdccccccccccccc(0 9BG(L@QUXhawglo~sxvryn|ifbaaaaaaaaaaaaa'/ 8 AF*L@PSWcapg{mqzutyp|lh̃dˈaʍ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ&-4<F+J>OOW\ahhqnx{s}uxq{mjڃgنd׋a֐`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց#&)<D+H;MIWTa]je|pjvvnqzqm~tkvhwfycza|`|`|`|`|`|`|`|`|`|`|`|`|`|( ;A)F6LAVKaR{kWtq\ov_l{aicgdefcgah_i_j_j_j_j_j_j_j_j_j_j_j_j_j ) 9>&D0K9T@xaFrjJlpMivPf{QdScTaU`V^W]X\X\X\X\X\X\X\X\X\X\X\X\X\X )4:!A)zI0rR6l^:hh=do@atA_yC^}D]E\E[FZGXGXHXHXHXHXHXHXHXHXHXHXHXHXH* 06w>"nG(fP,aZ/]d1[l3Yq5Xu6Vy6V|7U7T8S9R9R9R9R9R9R9R9R9R9R9R9R9R9R9) 5;D!N-YFI3NIT]\nc}imq{usxn|ieb_^^^^^^^^^^^^$,4 =BI3NHRZ[icvio~swwq{lhʃdɈaǎ^ƕ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ#*25 BH4LFQU[bdmkvp}yuszn~kׂgՆdԋaӐ^і\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ!&%3B!G3KBPO[Zecljzrptxto|wlzh|f}c`^ߖ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ3@"D0I=PH[PeWzm]tsaoydk~ghifjdlbm`n]p\q\q\q\q\q\q\q\q\q\q\q\q 3< B,H6O?ZFxeKqmOlsRiyUf~WdXbYaZ_[^\\][^[^[^[^[^[^[^[^[^[^[^[^  39?&F.zN5sX:mc?ilBerDbwF`|G_H]I\J[KZLXMWMWMWMWMWMWMWMWMWMWMWMWM! .4; vC'mL,fT0b`3^i5\o7Zt8Yy9X}:W;V;UR>R>R>R>R>R>R>R>R>R>R>" )~0s8i@bI#[Q&WZ(Ub*Ri+Qo,Ps-Ow.Nz.N}/M/L0K0K0K0K0K0K0K0K0K0K0K0K0K0(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(39BK'V4aBmPw]hr냒{}xtronlk›iʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜ'28AJ'T4_CjQt_~l펈x燏―{wtqomlægæiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡ'1 7@I'S4]ChSrb|pꔅ}㋋݄~zuromikmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥ'0 7@H&R4\DfTpdys瘂ߏوҁ{vspmknppppppppppp&0 6?H&Q4[DdUnewvܔԌ΄}xutpoqsssssssssss&/ 6?G&P4YDcUlgux|٘ѐʇł|ztrtvvvvvvvvvvv&. 6>G%O4XDaVjhszz͔֝ƍ}yvxyyyyyyyyyyy&. 5>F%N3WD`Vhip{ުwП|Ǘ~y{}}}}}}}}}}}&- 5>F$M3VD_Vgin}֬sʣz~&- 5=F$M3UD]Vej߸k~ЯqŦx~%, 5=E#L2TC\Vcjڻi~̲pv|‹Š%, 4=E#L2SC[VajԿh~Ƕntz†„%, 4<D"K1RBYU`jf}¹lrx~€%, 4<D!K0QAXT^ie|kpv|}{yzzzzzzzzzzz%+ 3<D J.P?VS]hc{iotzzwtsttttttttttt$+ 3 ;CJ,O=UQ[gbzgmrx~ytpnmnnnnnnnnnnn$*2 :BI)L;SQZe`xfkpv|xrmjgghhhhhhhhhhh#)1 :BG%K;QPYc_tejosuxn}iea__bbbbbbbbbbb!(08 @E&K;OOW`_of|lqzuszlgDŽcƊ_đ\ęZäZİZİZİZİZİZİZİZİZİZİZİ &.3<E(J;NLV[_hgsm|~rvxp}kԂf҇cь_ϒ\ΙY΢XͫXͫXͫXͫXͫXͫXͫXͫXͫXͫXͫ#&);D)I:MHUU_`hhopxuurzym}ie߉bݎ_ܓ]ۙZڡX٨X٨X٨X٨X٨X٨X٨X٨X٨X٨X٨) ;C(G6LCUM_Vi]ypbsvgn|jjmgodqar_t]uZwXxXxXxXxXxXxXxXxXxXxXx ) ;@&E2KG"R-]:iGtS~_ir}yxtpmkjiȓfϕdѓeԎeԎeԎeԎeԎeԎeԎeԎeԎeԎ&0 5=F!P-[;fHqV|bmw耕zuromkiɞeɞg͘iѓiѓiѓiѓiѓiѓiѓiѓiѓiѓ&/ 4=F!O-Z;dIoXyeqꋌ|䃒}xtpmkf§hƢj˛lΖlΖlΖlΖlΖlΖlΖlΖlΖlΖ&. 4<E M-X;bJlYvhu珉ڀzupmkhkæmȟo̙o̙o̙o̙o̙o̙o̙o̙o̙o̙%- 3<D L-W;`KjZtj~y䓆܋Ճ|wtspknpƢrʜrʜrʜrʜrʜrʜrʜrʜrʜrʜ%, 3;DK,U;_Kh\qlz|ߗՎͅǀ{xvupqtĤuɞuɞuɞuɞuɞuɞuɞuɞuɞuɞ%+ 2;CK,T;]Kf\onvՙ}̑Ŋ|zytuwæyǠyǠyǠyǠyǠyǠyǠyǠyǠyǠ%* 2:BJ+S;\Kd]loۥsΝzŕ~}zy{|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ%* 1 :BJ+R:ZKb^jpөpȠw~}ţţţţţţţţţţ$) 1 9BI*P:YKa^ܵgqάoäu|ĥĥĥĥĥĥĥĥĥĥ$) 1 9AI)O9WJ_]ֹfpɰmszææææææææææ$) 0 9AH(N8VJ^]Ѽeoijkqw~ææææææææææ$(0 8@H'N7UH\\̿coipu{~{}}§}§}§}§}§}§}§}§}§}§$(/ 8@G&M5TF[[bnh~nsz~zxuwx§x§x§x§x§x§x§x§x§x§#'/ 7?F#L2REYZ`lf|lrx~}xtqopr§r§r§r§r§r§r§r§r§r§"'. 6>F K.PDXX^kezjpu|}vqmjijkækækækækækækækækækæ &-5 =DH-OBVV]hcxhnt}zvpkgecdeŤeŤeŤeŤeŤeŤeŤeŤeŤeŤ%,3 <@H.MBUT[eatfl~rvyoƁjʼneŒbĝ_ħ]Ĵ^Ĥ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ#)14 AG.LASRZaanhynzur|k҂eψ`͏\̗ZˠX˫W˺Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙ %$2 @G/K?QNZZbejn}ruux{o~i݄dۊ`ّ]ؘZ֠X֨VմTTTTTTTTTT1@E.JC+H7OAYI}cPwmVptZkz^hadcae_g]hZiXkVlTmTmTmTmTmTmTmTmTmTm 2;A'G1N9zX?sbEnlIisLfzOcQ`S^T\UZWYXWYUZT[T[T[T[T[T[T[T[T[T[Ϳ!17>"}E)uM0nU5i`9ej_w@\~BZCYDWEVFUGSHRIQJQJQJQJQJQJQJQJQJQJϸ#-3y;pC"iJ'bR*]\-Ze0Xm1Vs3Ty4S~5R6P7O8N8M9L:K:K:K:K:K:K:K:K:K:K:"( v/m7e?^GXN!TW#Q_%Ne&Ml'Kq(Jv)I{*H*G+F+E,D,C-C-C-C-C-C-C-C-C-C-t# i*`2Y:SBNIKQHXF]DcCgAl@p?t >x =| qJ}U^g{nvsrxo}ligƆeψb׊aوb݂ccccccccc}y&|. 2:CL'X3c?nLzWbk~syztpljhƏfђbђdՌeۆf݂f݂f݂f݂f݂f݂f݂f݂f݂}z&, 1 :BK&V3a@lMvZfp삔y{uqmkișd˛eΗgґh؊iۆiۆiۆiۆiۆiۆiۆiۆiۆ~{&+ 1 9BJ&T3_AiOs]~j쌈u煑~xrmlkŠgǠh˛jДlՍlىlىlىlىlىlىlىlىlى~{%* 0 8AI&R3]AgPq_{m參zއ~xtqonkţkȟm͘oґp֌p֌p֌p֌p֌p֌p֌p֌p֌|%)/ 8@H%Q2[AdQnavpܑ~҉˂}xusrpæoƢq˛sГtԎtԎtԎtԎtԎtԎtԎtԎtԎ|%(/ 7?G$O2YAbRkbޞrsҕzʍÇ}ywvvsåuɞwϖwґwґwґwґwґwґwґwґwґ}%'. 6?G#N1WA`Rhd֢pt̙wÒ~{zywyǠz͘{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ~$&. 6>F#M0V@^RݮfdХnsƝu|~}{}Ƣ~̙ДДДДДДДДД~$&- 5=E"L0T@]Qײdc˩lsszŤ˛ϕϕϕϕϕϕϕϕϕ$%- 5=E!K.R?[Qѵccƭjrqw~ĥʜΗΗΗΗΗΗΗΗΗ#%, 4 <DK-Q=ZP͸abhqo~u|æɝ͘͘͘͘͘͘͘͘͘"$,3 <CJ+Q;XOȼ`agpm}sy|zzæ{ɞ|͘|͘|͘|͘|͘|͘|͘|͘|͘!$+3 ;BI(O9WN^`eok|qx~}xussæuɞv͙v͙v͙v͙v͙v͙v͙v͙v͙ #*2 :AH%M8UL]^cnj{ov|{vqnlmæoɞp͘p͘p͘p͘p͘p͘p͘p͘p͘")08@F K6TK[\blhxnsz{uokhffŤhʜi͗i͗i͗i͗i͗i͗i͗i͗i͗!'/6 >CJ4RHZZ`ifvlr{xtnieb`_Ša̚bϕbϕbϕbϕbϕbϕbϕbϕbϕ %+18C I3QFXW^edrj||ptwn~hÇc_\[³ZŚ[ϕ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ!"%7C"H3ODVS]`ck~juup}nwgbЇ^БZМXЧVеUǑVԎV֋V֋V֋V֋V֋V֋V֋V֋V֋&7B#G2L@UM]Xeaylirtol|tgxb{^~[XߧUޱS޾R҃Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂ &8@"F0K!D,J5S>y]ErfJmoNhvRd~UaW_Z\[Z]W^U`SaRaPbPbPbPbPbPbPbPbPb ָ ) 5;B&}I.uQ4o[:ie>enAbuD_|F\HZIXKVLUMSNQOPPOQOQOQOQOQOQOQOQOQگƼ+ 18y@ pG&iO+cX/_b2\k4Zr6Xx8V9T;RN>M?K@JAJAJAJAJAJAJAJAJAȵ & -u5l=eD^L"XT%U]'Re)Pl*Ns+My,L-J.I/H0G0E1D2C2C2C2C2C2C2C2C2C2 }!r( h0`8Z@THOOLWI]Gc Ei Do!Bt"Az"@#?$>$=%<%;&;&;&;&;&;&;&;&;&znd# \+ U3O;IBFIBO@U>Z<_;d9h8m7r6w5|43222222222pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl(k1 u6 {<FP!^*~k3{x;xBuHrMpQmTkWiZg\e^b_`a^b\c[dZdZbZbZbZbZbZbZbZbqm(n0 x4 ;DN![+h4u=|EyLvRrVoZm^jahcfecgai_k]l[m\h\g\g\g\g\g\g\g\grn(q. {2 :CL!Y+e5r?~H|PyVu\r`ndlhikgmdpar_s\t\q^l^k^k^k^k^k^k^k^kso't-~1 9BK!V+c6oA{KS|[xatgpkmojshvexbz_|]{_v`p`n`n`n`n`n`n`n`ntp'v+/ 8@I!T,`7lCwMW`zgvnrsnxk|hf͂b؄_܅`azctcrcrcrcrcrcrcrcrtp&y*. 7?H R,^8iDtP[e}nwur|njgeʍbԎb؊c܄e~fxfvfvfvfvfvfvfvfvuq&|(- 6>G P+[8fEpR{_ꅅj~tx}rmjhhÑgђeԏgىh݂i|jyjyjyjyjyjyjyjyvr&', 5=FN+Y8cFmTwboڀ{zuqnlkk˕iДkՍlۆmm|m|m|m|m|m|m|m|vs%&, 4<DL*W8aGjVre،{sυ|zvspooĘm͘oӐp؉qނqqqqqqqqwt%%+ 3 ;CK)T8^GgWڙogϑxsNJ}zwtsrr˚sГt֌u܄uށuށuށuށuށuށuށuށxv$#*2 :BJ(R7\GޥdXѝmfȕus|}{ywvwʜwϖxԎxۆx݃x݃x݃x݃x݃x݃x݃x݃xx##*1 :BI'P6ZFةcW̡kfšrrz|}{{{ƞ{͘|Ӑ|و|܅|܅|܅|܅|܅|܅|܅|܅yz"")1 9AH&O4ߴYEҭaVǥieprw|~ž̚Ғ؉ۆۆۆۆۆۆۆۆy{!"(0 8@G$N3۸WDͰ`V©gdnqu{|˛ѓ؊ڇڇڇڇڇڇڇڇz} !(/ 7?F"N0ռVCȴ^Ufclps{z~~ʜД֋ووووووووz!'.6 >EL/пTBķ]Sdbjoqzw~}zxwʝyϕy֌y؉y؉y؉y؉y؉y؉y؉y؉{ &-5 =DI.SA[Rbainoxu|{wsqpȝrϕsՌt؉t؉t؉t؉t؉t؉t؉t؉|%,3 ;BH,R@ZQa_glmwtzzupljiślДm֌m؉m؉m؉m؉m؉m؉m؉m؉}#)18 :F*P>XO_]ejktq}xztnifcbØeѓf֋gىgىgىgىgىgىgىgى~!&,19D(N;VL]Zcgiqoyzvs}mhc`^\”^Ӑ_ى`چ`چ`چ`چ`چ`چ`چ`چ  ,;D%L8TI[Wachl{nusu{l|gb^ZXWX׋Y܅Y݃Y݃Y݃Y݃Y݃Y݃Y݃Y݃,;D%K5RDYR`]|fftmnlttf|yaͅ}\̎Y̙V̥T̳SąS݃S~T}T}T}T}T}T}T}T} , <C%H3P@YK~`Tvh\oobhwhcl^ވpZޑsWޛuTާwRߴxPxOxOuOtOtOtOtOtOtOtOt۸ - ;A$G/N:~XCwaJpiPjqUeyYa\]_ZaWcUeRfQgOhNhMhMhMhMhMhMhMhMh ݮ̼ / 9?!F*|M2uW9n`?iiCdqGayJ]LZOXQVRSTQUPVNWMWLWLWLWLWLWLWLWLWδ / 6=xD$pL*jT/e^3ag7]o9ZvV?SAQBPCNEMEKFJGIGIGIGIGIGIGIGIGѮ"+ ~2u:lBeI"_Q%ZZ(Wc+Tk-Rr/Py0O1M2K4J5H5G6F7D8D8D8D8D8D8D8D8D8{' q.h6a>ZFUMQUN] Kd"Ik#Gq$Fx%D&C'A(@(?)=)<*<*<*<*<*<*<*<*<*wm"d* \2U9PAKHHOEVB\@a>guEqKoPlTjXh[f]d`ab^c\e[fZc[`][][][][][][][][ie(n+x. 6?HS%`/l8|yAxItPqVnZk_hbfedhbk_m]n[m\h^d________________jf(q){, 5 >GP%]/i:uD|MxUs\oblgikfocrau`w\x^r_m`hbcbcbcbcbcbcbcbckg't'+3 <EN%Z0f;qF|Q|Zvbqilphudzb~aa_~awbrcmdgdgdgdgdgdgdgdglj&w&*2 ;CL$W0bF M-X<٠aL͘jYőreznv}}ywuttƏu֋v݃v|vtvtvtvtvtvtvtvtou%-5 =EL+߫W;Ҥ_KȜhYodwnv}~{yxxzՍzۅz~zvzvzvzvzvzvzvzvpv%,4 <CK)گU:ͨ^J fXmdun|v}~}}ӏ~ڇ~~w~w~w~w~w~w~w~wpx$+2 :BJ'ԳS9ȫ\IdWkcrmyu|Αو߁yxxxxxxxqz#)1 9@ݼH%϶R8ï[HbVjbplwu~||{ˑ|؉}ނ}z}y}y}y}y}y}y}yq|"(/7 ?F$ʺP7YGaUhankut|{|xvtȑv؊w݂wzwzwzwzwzwzwzwzr &-5 <D#ŽO5XF_Tf`mjsszzzuromŐp؊p݃q{q{q{q{q{q{q{q{s$*15B!M4VD^Rd^khqqxx~ytokhgŽi؊j݂k{k{k{k{k{k{k{k{t %*2 AL1TB\Pb\ifonvuy}{smheb`bوcށezezezezezezezezv0 ?J/R?ZMaXgbmkytqr{wl|gb^\Z[ڄ]^x^x^x^x^x^x^x^xz / =H,P;XI_Te^ylfrrlkzrfvaz\}YWUUVzXuXtXtXtXtXtXtXt 1 =F'N7VD]OzdXrj_kreeyj`ɂo[ɋrWȖuTȢwRȯxQxPwQsRoRoRoRoRoRoRoRo ߮м 1 =D&L3T>{\GscOkjVer\`z`[كdWٌgSٗjP٣lNٱmMmLlMjNgNgNgNgNgNgNgNg Ѵſ"3;B$I.{S6s\>ldDglIbtM^|QZTVVSYQZN\M\L]K]J\J\J\J\J\J\J\J\Ԭŷ$2:A xH'pP.jZ4ec8`k<]t?Y|BWDTFQHOJMKKLJMIMHMHMHMHMHMHMHMHMڣDZ'/ }7t?lG fN%`W)\`-Yi0Vq2Sx4Q6O7M9K:I;HD>D>D>D>D>D>D>ˬ$z, p4h<aD[KVS S["Pc$Mk&Ks'Iz)H*F+D,B-A.@.?/>0>0>0>0>0>0>0>0 v l( d0 ]8W@QGMNJVG\DcBi@p?x=; :!8"7"6#5#5#5#5#5#5#5#5#} rh_#X+ Q3 L: GACH@N=T;Z9_7e5k3r1z/.,+********xn cZRK$F,A3 <: 9@ 5E 2J 0P .T,Y*^(d&j%q#x" \"W-X3_6 c= eFfPe^dn"a|'_+^.\1[3Z5Y6X7X9W9V:U;TU>T?S?R@R@R>R>R>R>R>R>R>]!X,\0d3 h: kClNlZjj$gx)d.b2a6_8^:]<\>[?ZAYBWCVDUDTETETDTBTBTBTBTBTBTB^!Y,_.f2 l8 oAoLqWng%ku+h0e5d9b<`>_A^B]D\FZGYHWIVJUJUJVGVEVEVEVEVEVEVE^!Y+b-j0o6 r@tJuUrd&or-l3i8fxHyRw`'tn.p{5m;jAgEeIcLaN`Q^S]U[VZXXYYVZS[O[M[M[M[M[M[M[M` ])h)q+x3 |<}F~P}](yj0uv8q?mEjKgOeSbV`Y_\]^\`ZaZ`[[\W]S^Q^Q^Q^Q^Q^Q^Qa`'k&u)|1 :DMY(f2zr;u~CqKmQiVf[c_`c^f\i[kZk\f^a_\`XaUaUaUaUaUaUaUbc%o$y(0 9BKV(b3n=zyGuPpXk^fdci`m_o^p^q]q_kafbac\cXcXcXcXcXcXcXcf#r"}'. 7@IS(_4j?tKx~Ur^mejjgmepcsbtauavcqdjeef`g\g\g\g\g\g\g\ch!u %-5 >GO([4fAoN}yXw`sgollpisgvfxeyeyfvhoiiicj_j_j_j_j_j_j_dk x$,4 <EM'Y4bB׉lN΃uX}~axhtmprnulxj{i|i}jzlrllmfnbnbnbnbnbnbnbem{#*2 ;CK%V3ږ`AώiNLjrXza}hynusrwpzn}m~mn~pupoqhqdqdqdqdqdqdqdeo~")1 9AI#ޡT1Қ^@ȓgMoXwah}nzswxt{s~qqr؁txtqukufufufufufufuffq!(/7 ?H ئR0̞\@×eMmWta|hn~t{xy|wvuvтxzxsxlxhxhxhxhxhxhxhgs &.5 =߯FҩQ/ǢZ?cLjWr`yhntx}||zzz̓|||u|n|i|i|i|i|i|i|igu%,4 ;۳DͭO.æY>aKhVp_wg~nsx|ʄ}vojjjjjjjhx#*19 շBɰN-W=_JgUn_uf|msx|}{yDŽz{w{p{k{k{k{k{k{k{kiz!'.޽5 к@ĴL,V;^IeTl]sfylrw|{wtrăttxuqvlvlvlvlvlvlvlk}#)0 ˽?J*T:\GcRj\qdwkq~vy{t~pmkmnxoqplplplplplplpln!-=I(R8ZEaQhZobui~|oxtsyn|jgeehxiqjljljljljljljlq+;G&Q6XC`NfXm`~sgwzlrrlvhyd|`}_~^}avbpclclclclclclclt (9E#O3W@^KdT~k\wqcqxikmfrau]x[yYyXyZs\n]j]j]j]j]j]j]jy ܮһ %6B L/T<\GbPwiWpp^jwceh`l\oXqUsSsRsToVjWgWgWgWgWgWgWg ҳɾ#3 @J*R7ZAxaJphQjoWdv\_`ZňdVĒgSĞiPĬjOļkNjOhPdQaQaQaQaQaQaQa Ԫȶ %5 >H%P0xX:p_BigIcnO^vSYWUӉZRӓ]OӠ_Mӭ`KԾ`J`K^L\LZLZLZLZLZLZLZڢʯ (4=D"wN*oW2i_8cg=_oBZwEVISKPNMPKQIRHRHRHQHOHOHOHOHOHOHOͩ *3|;tClK#fT)a]-]f1Yn5Vv7S:PK@IAGBFCECDCDBDBDBDBDBDBDBѢ (y1 p9iAbI\P WY#Tb&Qj(Os*L{,J.H/F1D2C3A4@4?4?5?5?5?5?5?5?5Ī~u%l- d6]>XERMOUL\IdGkDs B|"A#?$=%;&:&9'8'8(8(8(8(8(8(8(zpg!_)X1 R9 MAIHEOBU@\=b;i9p7y5320//.......vlbZS$M+G3 C: ?A ;G 8M 5S3X1^/d-k+s)|'%$#"""""""~pg] TMGA$<+72480=-C*H (M &R $W "] c k s |          R%M/Q2W5Z< [EZOY]XmV{U"S%R'Q)P*P+O,O-N.N.N/N/M0M0L0L0L/L/L/L/L/L/L/S$M/T0Y4]: _C^N]Z[jZy!X$V'U)T+S-R.R/Q0Q1P2P2O3O3N4N4M4N2N2N2N2N2N2N2S$N.V/\2`8 bAbL`X_h]v"[&Y)X,V.U0U1T3S4S5R6R7Q7Q8P8O8O7P5P4P4P4P4P4P4T#P-Y-_0c6 f@fJeUceas#^(\,[/Y1X4W5V7U8U9T:T;SkHjShafp%c}*`/^3\6[8Z:XW?VAUBUCTDSDTAU?U\A[CYEXGWHVJVKULVJWFXCY@Y?Y?Y?Y?Y?Y?W"Y'c&k(q0t9 uCuMuY!qg)mt0j6fHR!~_+yk5su>nFiMeTaY_\]_\a[b[cZc\`_Z`UaQbMbKbKbKbKbKbKY!b nx#+3 <EN![+~f6xpArzKmRiXf\d_bb`d_f^g^h_fc_dYeUePeOeOeOeOeOeOZ eq|")1 :CL X+b7~lCxvLsSoYk^ibfeehcjbkblbkfdg]hXiSiRiRiRiRiRiR[ gt '/7 @IU*ۊ_7фiC}rLx{TtZq_ndkgijglfnfofojhkal[lVlUlUlUlUlUlU\jw%-5 >FޖR)Ґ\7ʉfBÃoL~wTy[u`rephmllnkpjqjqnkodo^pXpWpWpWpWpWpW^lz#+3 ;EכP(̔Z6čcBlLtT~|[z`wetirmppornsosrnsfs`sZsYsYsYsYsYsY_n}")09 ޥCџN'ǘX5aAiKqTy[`|eyjvmuqssstsuvpwhwbw\wZwZwZwZwZwZaq &.6 ة@̣L&œV4_@gJoSvZ~`e}j{nyqxtwuwvzr{j{d{]{\{\{\{\{\{\cs#*2Ҭ>ǦK$U3^?eJmRtY{`ejn~q}t|v}|v}~ske~^~]~]~]~]~]~]eu &۴.ί=êI#S1\>dIkQrYy_dinq|tyvwvvtylyfz_z^z^z^z^z^z^gw!շ*ɳ;H"R0Z=bGiPpXw^~di~myqvsrupvousmsft`t_t_t_t_t_t_izݹϺ(ķ9F P/X;`FgOnVu]|c}hxlsporltjuiulmmgn`n_n_n_n_n_n_l} տʾ&7DN-W9^DeMlUs[|zawfrjmniqfscsbsflgfh`h_h_h_h_h_h_o ڭ Ӹ #5BL*U7\AcJjR|qYvx^pckggkcn_p]p\p_kaeb`b^b^b^b^b^b^s ۥѱ˻ 2 @J'S4Z>aG|hOuoUovZj}_ecag]jYkWlVlXhZc[^\]\]\]\]\]\]x ߜҩɴ¾/ =H#Q/X:|_CufJomPitUd|Z_^[aWdTeRfQfRcT_U[VZVZVZVZVZVZ~ ֡ʭ +:EN*}V4u]=neDhlIcsN^{SYVUYR\O]M^L^L\NYOUPUPUPUPUPUPUݘͦ (7B}K$uT-m\5gc*=+;+;+:+:+:+:+:+:+:+~wog&`/Y7 T?OGKNGVD]Bd@l=u;~9765332 2 2 2 2 2 2 {r jaZ"T*N2I: EA AH >N;U8[6b4i2r/{-+*)('''''''zmd\TMH$B,>3:96@3E0K .Q +W )] 'd $l "v yk_VN GA<7$2*/0+6';%@"E JPV\dmw         I'D1K1P4R:RC QNO\MkLyKIHH G!G"F#F#F$F$F%F%F%F%F%F%F$F#F#F#F#F#F#I'F/M/R2U9UB TMRYPhOwNLK!J"J#I$I%H&H&H'H'H(H(H(H(H(H'H&H&H&H&H&H&J'H-P-U0X6Y@ XKUVTfRtQO!N#M%M&L'K(K)K*J*J+J+J,J,J,J+J)J(J(J(J(J(J(K&K+R+X.[4]> ]IZTYbWqU~ S#R&Q(P*O+N,N-M.M/L0L0L1L1L1M/M-M+M+M+M+M+M+K&N)V)\+`1b; bF`Q^_\mZz#X&V)U,S.R0Q1Q3P4O5O6N7N8N8O5P3Q1Q/Q/Q/Q/Q/Q/L%Q'Z&`(e/h9 hCgNeZbh _v%]*Z.X1W4U6T8S:R;Q=Q>P?P@Q>S;T8U5U3U3U3U3U3U3M$T$]#e%j-m6 n@mKkVhd!eq(b}-_2\6Z:X=W@UBTDSFRHQIRHTDV@X=Y:Y8Y8Y8Y8Y8Y8N$X!a j#p+s4 t>tHrRo_#kl*gw1c7`=]AZEXIVLTNTPTPSQTNWJZE\B\>\<\<\<\<\<\HT"~_.xi8ss@n|GkLhQeTcWbZ`\`^_^__bYeSgNgJgFgFgFgFgFgFWdp{"*2; DފQ!Ԅ\-~f8xoAtwHpMmRjVhYf\e_d`cacbe]iWjQkLkIkIkIkIkIkIYgs~ '/8 B֏N ̉Y-Ńc7}k@ytHu|NrSoWm[k^i`hcgdgdiamZnTnOnKnKnKnKnKnK[iv$,4ܚ?ϔLƎW,`7i@~qHzyNwStXq\o_mbldlfkfmdq\rVrQrMrMrMrMrMrM]ky!(0՞=ʘJT+^6f?nG~vN{}SxXv\t_rcqepgpgpft^vXvRvNvNvNvNvNvN_n{#ݥ+ϡ;ŜHS*\5d?lGsMzS}Wz\x`vcufthththx`zYyTyOyOyOyOyOyOap~ר(˥9FQ)Z4b>jFqLxRW\}`{czf}yh{yizyi||a~~Z~}U~}Q~}Q~}Q~}Q~}Q~}QcrߪѬ&Ǩ7 DO'X3`=hEoLvR}W[_~czfw~hu~is~ivbx[xVyQyQyQyQyQyQeuٯ̯$«5 CN&V1^;fDmKtQ{V[|_xbteqhnimiocr\sVsRsRsRsRsRsRhx ޠ ֩ Ҳ Dz"3 AL$U0]:dBkIrPyU{Zv^rbnekghhghicl\mWmRmRmRmRmRmRk{ ֣Ь ˵ 1 ?J"S.[8b@iHpNzwSu~Xp\l`hcdebf`fbbe\gWgRgRgRgRgRgRn ٛϦɯĹ/=H Q+Y5`>gEznKtuQo|UjYf]b`^b\cZc[`_[`VaRaRaRaRaRaRr ߓџɪ,:EO(W2^:yeBslHnsMizQdV_Y\\X^V_U_U]XXZT[P[P[P[P[P[Pw֘ˤ(7CL$U.y\6rc=mjCgqHbyL^PZTVVSXPYOYOXQTSPTMTMTMTMTMTM}ߏΝè#3 ?IyR(rZ0ka7fh.=.=.=.=-=-=-=-=-=-şztm f*_4Z= TEOLLUI]FeDnAw?=; 9!8"7"6"6"6"6"6"6"6"6"wo g`Z'T0O8J@ FH CO@V=^;e8n6w420/.-,,,,,,,uia [TN"I+D2@:+C(I%O#V!]eoz           ugXNHA ;61-")(%-"28=BHNU]g r }        ?*?0D0H3I9HBFM E[CiAw@?>>====<<<<<==========@*A.G.J1L7K@JK HYFgDuCBAA@@??????????@@@@@@@@*C,I,M/O5P>NI LVJdHrGFEDDCCBB B B!B!B!B!B!C CCCCCCCA)F*L)Q,S2T<TG QRO`MoL|JIHG!G"F#F#F$E%E%E&E&E&E&F$F#G!G!G!G!G!G!B(I'P&U(X/Z9ZD WOU\SjQwON!M#L%K&J'J)I*I*H+H,H,H,I*J(J'K%L%L%L%L%L%C(M$T#Z%^,`6`A ^L[WYfWrU~"S%Q(P*O,N.M/L0L2K3K4J4K3M0N-O+P)P)P)P)P)P)F%P!X _!d*f3f= eHbS`a]m Zy%X)V-T0R3Q5P7N9N;MR@QAPBPCPDPCR?U;W7X4Y2Y1Y1Y1Y1Y1M W`io%r-t7sAqKnXjd$en+ay3^8\IS'[0b8i>pDxI~MzQvUrXoZl\k\kYnRqMrHrGrGrGrGrGf u܏Ҙ̡Ȩ-<GQ%Y/`6g=nC}vHy}LtPpTlWiYf[e[eYhRkMlHlGlGlGlGlGi x֒͜Ƥ+:EO#W-_5f;}lAxsFs{KnOjRfUcX`Y_Z^XbRdMfHfGfGfGfGfGl|ފЖȟ(7 CM!U*\2|c9wj>rqDmyHhLdP`S]UZWYWXV[P]L_G`F`F`F`F`Fp֏ʚ$4 @JS'|Z.va5ph;ko@gwDbH^LZOWQTSSSRRUNWJYFYEYEYEYEYEuϓğ 1=H|P"uX*o_0jf6em;`u?\~CXGUJQLOMMMMMNIPFRCRBRBRBRBRB|׌ș ,: {DtNnV$h]*cd0_l4Zt9V|K=K=K=K=K=͒&z5sAlJfSa[#\b(Xj,Tr0P|3Mņ6JĒ9Gğ;EĮ#<$;$:$9$9#9$9$9$9$9$9$~si d_ Y+T5O>KF GN DWB_?g=p:{8653211111111~qe^ YSN'J0E9A@>H;O 8W 6^ 3g 1p .|,+)(''&&&&&&~pdXR MGC">*:2793?0F-M+T([&c#m!y            ~pcUKF@;73#/)+0(5%;"AGNU^htpbTF?94 /+'#!%*/4:@FN V `lx6-9.>.@2@8>A@J>W *C*F-G2F<EHCU Ab ?p=}<;;::::99999::::::::::9+A'F'J)K/L9KEHQ F^DlByA@@??>>>>==>>>>???????=(E$J#N%Q,R6QAOM LZJgHtGFEDCCBB B B!A!B"B"B CCDDDDDD@%H!O S!W)Y3X>VI RUQcOoM{KJI!H"G$G%F&F'E(E)E)F(G&H$I"I IIIIIC"LSY]&_0_:]E ZPX^UjSvQ!O$M&L)K+J,I.H/H1H1H1I.K+L)M&N%N#N#N#N#N#GPW^c#f,f6dA bL_Y\eYp V{%T)Q-P0O2N3M5M6L7L8L8M5O1Q.R+S)S'S'S'S'S'JT\ci l)m2l= iGfTc`_k"\u(Y-W0U3T6S8R:Q;PU?UATBTBUAW[AZCYDYEXFXF[@^;_7`3a1a1a1a1a1S]hpw|$-;zIuTq_$mh+jp1gy6e:c=a@`C^E^G]H]I\I_Db>c9e6e3e3e3e3e3U`kt{އ'ф7F{Qv[#re+om1lu6j|:h>fAdDcGbIaKaLaLcGeAgm:n7n7n7n7n7Ye q z ݎϏ ƍ2AMV"|_*xg0uo6sv:q}?oBmFlIjKjMiOiOjLmEo?p;q8q8q8q8q8[gs}ކٌ Ց ʒ0?JT!])}e0zl5ws:u{>sBrFpIoLnN|mO{mPznM|qF~sAt=u:u:u:u:u:]jvىҏϔ Ŗ.= HR [(c/~j5|q9zx=xBvEuI|sLyrNvrPtrPtrOvuGxwBzx>{y:{y:{y:{y:{y:_ lyރӋ͒ɗ,; GPY'a.h4o9v=}~A}{EyzIvxLswNpwPnwPmwOpyHr{Ct|>u};u};u};u};u};a o|نώȕÚ*9 ENW&_-f3m8t={{AwEtHp}Km|Nj|Oh|Pg|Pj~ImCn?olBhFeIaK^M]N\M^H`Cb?cHQ ~Y'x`-sg2on7ju];];];];];n~΋ĕ .; F~NxV#r]*md/ik4ds8`{<\?YBUESGQGPGQDS@UΨ&<κ&<&<%;%;%;%;%;%;%;%Óyod ^[ W-S:PDLN IW F_ChAq>|<߉:87665444444ymbXUQ M+I5E>BG?O=X :` 8j 6t 320.--,,,,,,,yl`UN JFC'?0;88@5G3O0W._+i)t' % $ # " ! ! yl_RHC?;7!4)00-7*>'D%K"S \frzl^PD<73 /+(!%'!-28?FMV`l {    {l^OB61,'# !&,1 7 >FOYft./3,7-80764?1K/X,f*t ) ( ( ( ( ' ' ' ' ' ( ( ( ( ( ) ) ) ( ( ( ( ( 0-6*9*;.:48<6I3V1c /q -~ - , , , , , , + , , , , , , - - - , , , , , 2+9(=(?*>0=:}==<<;;;;;;;;;<<======="DIMP&Q0P;NFKS H`FlExDCBAA@@????@@ABBBBBBB@HNRV#X,W7UBRM PZMgLrJ}HGFE D"D#C$C%C&C&D$E"F GGHHHHHDLRX]_(^2]=ZI WUUbRmPwNL"K$J&I(I)H*H+H,H,H+J(K%L"M MMMMMGOV^be$e-d8aC _Q\]XhVrT{"R&P(O*N,N.M/L0L1L2L1N-P*Q'R$R"R"R"R"R"JS[bhjk(k2i>fL bX_c\m Zv$X~(V+U.S0R2R3Q5Q6P7P7R3T.V+W(W%W%W%W%W%MV_ glpq"q,p:lH hTe_bh!_q&]y*[-Z0X3W5V7V8U:U;U;V7X2Z.[+\(\(\(\(\(PY c k ptvw%v6rD nPk[gd!em'bu+`|/_2]4\7[9Z;Y=Y>Y>Z;]5^1_-`*`*`*`*`*R\ f n t x{| {3wA tMpXla!ji'gq+ex/d3b6a8_;^=^?]@]A^?a8b3d0d,e,e,e,e,U_irx|  ́0|? xKuUq^!nf&ln+ju/h}3g6e9db@aBaBbAd;f5g1h.i-i-i-i-W alu{ӀЃ Dž-< }HyRv[ sc&pk+nr/my3k6i:hyn8zo4{p0|p0|p0|p0|p0[fr{ςɇĊ(8DNW|_$yf*wm.ut2t|6r9|q=yp@voBsnDqnEpnErp?sr9us5vt1vt1vt1vt1vt1]it}˅Ċ&5BLU]$~d)|k-zr2}xy5zw9vv HQY!`'{g+wn0su4o}7k;h>eAb~C`~D_~D`@b:d6e3f2f2f2f2dr~LJ .; FOWz^%ue*ql.ms2i{6f9b=_?\AZBYBZ?\:^6_2_2_2_2_2hv͂Œ +8CLyTt\"pc'kj,gq0dy3`7\:Y=W?T@S@T=V9W5Y2Y1Y1Y1Y1m{ȇ'5@ yJsRnYi`$eg(ao,^w0Z3V6S9Q;O&=&=&=%=$=#=#=#=#=#Ljsh`^[,W8TCPLMU J]GfDoAy?ȅ<ȓ:Ȣ9ɳ887766666th]S OM"K0I<FFDOAX?a5;>9G7P4Y2b0m.y,+ ) ( ' ' ' & & & & & th[OE> <96%4.17.?,G)O'W%a#l!zugZMB851.+)&%-#4 ;CKS]jxvgZL?5-*& # #)/5=E N XetwhZK>2'#   "(.5=GR^m~*-.+0+0..5)=%I#W!dr,+0(3(3+11-:+G(T&a$o"|""!!!!!!!!!""""""""""".(3%6%7'5-482D/Q,^*k)w('' ' ' ' ' ' ' ' ' ' '(((((((((2%7":!;#;);49@6M4Z1f0s. . . - - - - - - - - - . . . . . . . . . . 5";?@B&B1@<>H;U9b7n 6y 5 4 4 43333333444455 5 5 5 5 9?CFI#I-H8EDCP@] >i =t <;;::9999999::;;;;;;;=CHLOP(O3M?JJGW Fd DoCyBA@??>>>>>>?@@AAAAAAAGLRVW$V.T9QEOR M^ KiItH}FEEDDCC C!C!C!DEFGGGGGGDKQW[]]([3Y?WMTY RdPnNwLKJ J!I#H$H%H&H'G'I%J"KLLMMMMGO V \`bc!b,`:^H[T X_ViTrRzQ!P#O%N'M(M*L+L,L,M*O&P#Q RRRRRJR Z ` eghg$f5dDaP ^[\dZmXu W}#U%T(S*R,R-Q/Q0Q0Q/S*U&V#V!WWWWM U]di k lml1j@gL dWa`_i]q!\x$Z'Y*X,W.V0U2U3U3U3W-Y)Z%[#[![![![!O Wahmpp rq.o=lI iTg]debm!at%_|(^+]-[0[2Z4Y5Y6Y6\0]+^(_%_#_#_#_#Q Zdlqtu vv*t:qF nQkZibgi!eq%dx(b+a.`1_3^5^7^7^8_3a-b)c&d%d%d%d%S]gotxyzz(x7vD sNpWm_kg!jn%hu(g}+e.d1c4b6|b8zb9yb9yc4ze/{f+|g(|g&|g&|g&|g&U`jrx{}~~%}5zA wLtUr]pd nk$lr(kz+j.~i1{g4xg6vf8tf9sf:sg6ti0uj,vk)wk'wk'wk'wk'Wcmu{#2~? {JySv[tb ri$qp'~ow+{n.xm1ul4sk7pj9nj:mj:mk7om1pn-qn*qo(qo(qo(qo(Yepx~ 0=H}Q{Yy`wg#|un'ytu*vs}.sr1pq4mp7jo9ho:go:gp7iq2kr-ls*ls(ls(ls(ls(\hs{ .;EOW~^{|e"x{l&tys*qx{-nw0kv3hu6et8ct9at:at8cv2ev.fw+gw)gw)gw)gw)_lv +8C LUz\vc!sj%oq)l~y,h}/e|2b{5_z7]z8\z9\z7^{2_{.`|+a|)a|)a|)a|)boz(6A JzRuZqamh#jo'fw+c.`1]4Z6X7V7V6X1Y-[*[)[)[)[)fs~$2> yHtPoWk^he!dm%`u(]~+Z.W1T3R4Q5P4R0S,T)U(U(U(U(kxƒ ~/x;sE nMiUe\ac^j![r%W|(T+Q.N0L1K1J1L-M*N(N&N&N&N&p}~ zu*p7lA gJ cR_Y[aXhTp Qz#N&K)H*F,E,E+E)F'G%G$G$G$G$w„tol$h2d=_F [O XVT^QfNnKxH E"C$A%@%?%?#@"@!@ @ @ @ ~wjca^,Z8WBSKPS M[JcGkDuB?=;:99999999ymbVSR#P0M;JEGNEWB_ @h =r ;~8Ì6Û5ë333221111{ncXMD CB%@2?==G;P9Y6c4n2z0҈.Ҙ -ө ,Ӿ , + * ) ) ) ) ) |ocWLB9 542'120=.G-P+Z*e(q&%#"!  }pcVK@6/-+)"'+%4#<!ENXdqqcVI=3*&$ !")19AJUa o   rcVH;0&  $ + 2;DO\k}sdVG:.# $+3=IVfx%+()))(,#2;GUbp|()+&,&+)(/"8 DR_ly*&.#/"/%,+*5'A$N"[ ht."243 2&22/>,J*W'd&p%{$$$$$$$$$$$$%%%%%%%%%2688:#9-8:5F2R0_.k-v,,+++++++++,,, , ,,,,,,5:=?AA)@4=A:M8Z6e5q4{3 3 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 4 4 4 9>AEHH$G/D;BG?T>`>>>>>>?@@AAAAA@F K Q STT"R-P;OIMUK` IjHsG{FEEDCCCCCCEEFFGGGGDJPU X YXW$W5UDTPR[ PeNmMvL}KJIIH H!H"H"H"IKKLLLLLG MTZ]] \]]0\?ZLXW V`TiSqQxPOO N!M#M$M%L&L&N"OPQQQQQIPX^bca bc,b;`H]S [\ZdXlWtU{T T"S$R%Q'Q(Q)Q*R&T"UVVVVVLS\bfhggh(g8eEcP aY_a]h\pZwY!X#W%W'V)V*U+V,W)X$Y ZZZZZNW_fjlklm%l5jBgM eVc^be`l_t^{!]$\&[(Z*Z,}Z-|Z.{[+|\&|]"}^}^}^}^}^PYcjnpppq"p2n?lJ jSh[fbeicpbx!a$`&}_){^+x^-v^.u^/t^-u`'va#wb wbwbwbwbR\fmrtttut/r=pG nQlYj`ighnfu!}e}$zd'wc)uc,rb.pb/ob/nb.od(pe$qf!qfqfqfqfT_ipuxxx yx-w:uE rNpVo^md}lkzks wj{#ti&rh)og,lf.jf/if0hf/jh)ki%li"lj lj lj lj Wblsx{|| }|*{8yC wLuTs[{rbxpiuop rnx#om&ll)jl,gk.ek/dk0bk/dl*fm&fm#gn gn gn gn Yeov|(5~A|J ~zRzxYvw`svgptnmsv#jr&gq)dq+bp-`p/^p/]p/_q*`q&ar#br br br br \irz%3>~H yPu~Wq}^n{ekzlhyt"ex}%bw(_v*\v,Zu.Yu.Xu.Yv*[v&\w#\w \w \w \w `lv~!0~;yE tNpUl\icfjbr _{#\~&Y})W|+U|,S|-R|-S|)U|%V|"W| W| W| W| dpz},x8sBnK jSgZca`h]pZy!V$T&Q(O*M*M*M'O$P"PPPPiu~ yu(q5l?hH dP aW]^ZfWnTwQ N#K%I&H'G'G$H"I JJJJn{upm#i0e;aE]M ZT W\TcQkNtKHE C!B"A"A BBCCCCuyjec`+]6Y@VISQ PY M`JiGrD}B?=<;;;;<<<<|}qdZWU#S0P;MDKMHUE] Ce @o >z;97655444444th\PI HF'E3C=AG?P=X:a8k6w4 2 0 / . . - , ,,,,vj^RG=876'534=3G1Q0[.e,q*)̐'̡&ʹ%%$#####xk_RG=4+ &%%%$0#;#E"P![ hvއߙ߬yl_RF;1)!'09CNZgw {m_RE9/% % - 5 ?JWfw}n`RD7,"  '0:ESbupaSC6*  !)4@N^r )"'"'*09E S ` m y             #&%$%$#',5BP]jv         &#( ( &""( 2?LYeq|*,,+)$(/%;"HTamw-0101 0*.6+C(O&\$g#r#|""""""""""###$$$$$$$146798%613=1J.V-b,m+w+*********++,,,,,,,,59: >@? =*;78D6Q5\4g3r3{222111 1 1 1 2 2 3 3 3 3 3 3 3 3 9= @ D FED#A/?<>J=W>>>>>>?@@@@AAA? DJNPO LLM0M?LLKWIa Hi GqFyFEDDCCCCCDEFFFFFFBGOSUUR ST+T;RHQRP\ Nd MlLtK{JJIIHHHHIJKKLLLLEKSX[[XXZ'Z7XDWOUX T` ShQoPvP~ONNMMM M MOPPPQQQGOW]``^]_#_3^@\KZT Y\XdVkUrTzTSRRQ!Q"Q"~R!~S~T~U~U~U~U~UJR[adecbc c0b=aH_Q ^Y \a[hZoYvX~WW}V!{V"yV#wV$vV$vWwXwYwYwYwYwYLV_ehihg hh-g:eEcN bW a^_e^l]s~\{{\y[vZ!tZ#rZ$qZ%oZ%p[ q\q]q]q]q]q]OYbhlmlk ll*k7iChL fT e[cb}bizapxaxu`s_p^"n^$l^%k^&i^&j_!k`kalalalalaQ\ekoqqoop'o5n@lIjR ~iY{h`wffufnrevpd~mckc"ib$fb%eb&db&dc"edfdgdgegegeS_hosuusst$s2r>pG}oO ymWvl^skdpjlmjski|hhfg"cg$af%`f&_g&_g"`hahbhbhbhbhWbkrwyywxx!x/w;|uExtM trUqq\npckojhnqfnzcm`l!^l#\k%Zk&Yl&Zl#[l\m]m]m]m]mZfov{~~||}}-||9wzCsyK pxS lwZivafuhctoasx^r[r Yq"Wq$Uq%Tq%Tq"VqWqWqXqXqXq^isz {)v6r@nIj~P g}Wd|^a{f^zm[zvYyVxSx!Qw"Pw#Ow#Ow!PwQwRwRwRwRwbnw} xt&p2l=hFeN aU ^\[cYkVtS~PNL J!I!I~J~K~K~L~L~L~gs||uom!i.e9bB^K[R XY VaShPqM{JHFDCCDDEEEEmxylfca)^5Z>WGUORV O^ LfJoGyDB@>===>>>>>ssd\ YW"U/R9PCMKJSHZEc Cl @v>;9877666777{wk_RMKJ'H3F=DFBN@V>_;h9s7 4 2 1 0 0 / / / / / / {ocWKA>=;):49>7G6P4Z2d0o.|,*)(('&&&&&~qeYMB8/ -,+)*3)=(G'Q&\%h#v"Ɔ ƘƫsgZNB8/& %/:DP]k|׏ؤٻuh[NB7-$ # - 7 B O ]mwi[NA5*!  "*4?L\myj\N@3(  &0<IZm{l]O@2&  !+7FXk&$$'- 6CP^kv#!!#)2 @ MZgs}""!$/<IV b n y         %&%! !+7EQ^it})*)'(''#3 ?LXdnx-.. //.!,-)9&F$S"^"i!s!|!!!!!!!!""##$$$$$$$02 36 652%02-?,L+X+c*m*v**********++,,,,,,,4 69<< ;85)473F4R3]3g3p2x222211122 2 3 3 3333337:>AA? <:;1<@DGHF@ BD+D;DHCSB\BeAl@t @{ ? ? >>>>>>??@@ A A A A =CINONIIJ&K6KCJNIWH`Gg Fo Fv E}EDDCCCCDEFFF F F F @GOSUTPOP"Q2Q?PJOSN\Mc Lj Kq JyJIIHHHHHJJKKKKKCKSXZZWTVV.V;UFTPSXR_ Qf PmOtO|NNM~M|MzMyMxNxOxOxPxPxPxPFOW\__\Y Z[*[8ZCYLXUW\ Vc UjTqSy}SzRxRvQtQsQqQqRqSqTrTrTrTrTHS[`cca^ __'_5^@]J\R[Y Z` }Yg{XnxXuvW~tVrVoVnUlUkVkVkWkXlXlXlXlXKV^dghfbcd$c2b=aG`O}_V z^] w]d u\ks\sp[{n[lZjZhYfZeZeZe[f[f\g\g\g\NYagjljggg!g/f;eD{dMxcT ub[ raa paim`pk_yi_f^d^b^a^_^_^`_a_a_b_b_b_Q\djnpnkjkk,~k8zjBviJshRpgY mf` keghdnfdwdcac_b]b[bZbZb[c\c\c]c]c]cU_hnrtsoo o}p)yo5un?rmHnlPklW ik^ fjedilaiu_h\hZgXgVgUgUgVgWgWhXgXgXgXckrvxwss |txt&tt2ps=msFjrNgqU dp\ apc_oj\nsZn|WmUlSlQlPlOlQlQlRlRlRlRl\gov{||xzyuyrz#nz/ky:hyCdxKawR_wY \v` YuhWtpTtzRsOsMrLrJrJrKrLrLrMrMrMr`kt{z~snkh,e7b@_H\~PY~WW}^ T|f Q|nO{xL{JzHzFzEzDzEyFyFxGxGxGxepywkf c`'^3[<XEVMSTP[Nc Kl IvFDB@?>??@@@@kvse] ZX!V-S8QANILPJXG`Ei Bs @ ><:98889999r}zm_TONL'J2H<FDDLBT@\>f;p9|7 5 3 2 2 1 1 1 1 1 1 zrfZNE B@?*>4<>;G9O7X5a3l1y/-,+**)))))vj^RF<5 32!1+/5.>-H,Q+[)g't&$#"!!  zm`UI>3*$ "! !* 3=GR^l|}obVJ>3*! %/:F R ` p ΃ Η ά qdWJ>2(  $.9ERbsވߝ߳seXJ=1&  "+6CRbvugYK</$  '3@QcwwhZL<."  #/>Obw#!!$*3AN\ht~  %0=KXdpz! , 9FS_ku~ (4 A N Zfpy ##!#/;IU`jt|'' % & %# (5BOZenw+ ++- ,)& #-!:HT _ h q!y!!!!!"""##$$$$$$$$//232/+'"'2)A*N*Y*b*k*s*z******+++,,,--,,,238995. /1,3;3H4S3\3e3m3t2{222222223344444458>BB?88:&;6EIJGA?A!B1C>CIBSA[Ab@j@q?x?? > > > > >?? @ @ @ AAA<CJOPNIFHI,I:IEHNGWG^FeFlEs E{ D D DCC~C|D{DzE zF zF zF zF zF >HOTUTPL MN(N6NAMKMSLZKaKhJo Jw ~I |IzHxHwHuHtIsIrJrJ rJ rJ rJ rJ BLSXZYVRRS$S2S>RGQPQWP^~Oe{Ol yNs wN{ uMsMqMoMnMlMlMlNlOlO lO lO lO EPW\^^[VVW!X/W;VDVM|UTzT[wTbuSh sSp qRx oRmQkQiQgQfQeReRfSfS fS fS fS ISZ_bb_ZZ[[,[8}[AzZJwYQtXXqX_oWf mWm kVv iVgUeUcUaU`U_U`V`VaWaW aW aW LV^cffd^^__)|_5x_?t^Gq]Oo\Vl\\j[c h[k fZs dZ}bZ_Y^Y\Y[YZY[Z[Z\Z\Z \Z \Z OYafijhbb ~czc&vc2sc<obElaLjaTg`Ze`ac_i a_q _^{]^Z^X]W]V^U^V^V^W^W^ W^ W^ S]djmnmg~g xgtg#qh/ng9kgBhfJefRceX`e_^dg \do ZcyXcUbSbRbQbPbQbQbRbRb Rb Rb V`hnqsqkxkrknlkl,hl7fl@ckH`kO^jV\j]Yie Wim Uiw ShPhNgMgKhKhKgLgLgMg Mg Mg Zdlrvwvyqqqkqhqfr(cr4`r=^rE[qMYqTWp[TpcRok Pot MnKnInGmFnEnFmFmGmGl Gl Gl _iqw{|{uxkwew ax_x$]y0Zy:XyBVxJSxQQwXOw`LvhJvr Hu} EuCuBu@u@u@t@tAs As As As dnv|re]YW U+S6Q>OFMNKUI]FfD~pB~{ ?~ =} <} :}:~ :| :{ :{ :z :z :z it|{n`UPNM&K0I:HBFJDRBZ@c=m;x97 5 4 3 3 3 3 3 3 3 pzuhZOG DCA*@4?==E;M:V8_6i4u20.-,,+++++xzmaUI?976"4,352>1G0P.Z-d+q)'&$###""""reYNB7.)('"&,%5$?#H"S!^ jyuh\PD9/&!*4>ITbq yk^RF:/%   (2=IWfwƋƠŶ{m`SF:.$ '1<IXi|ֿ֧֒~oaTF9-"  $.:IYkqcUG9,  !+8HZmteVH9+  (6GZn  !'0>LYepz!-:HUalv (6CP\gqz  $0>KWblu}  * 8EQ\fow !  #0>J V ` i q y %##$! '5COYcks{('**'" -< I S!]!e"m"t"|"""####$$%%%%%%%,-243.% %'')6*C+N+W+`+g+o+v+}++++++,,---.---03:=<91.0!203=3I3R3Z3b3i3p3w2222223344444443:ADDA;789+:8;D;M:V:]:d:k9r9z9999999:}:|;|;|;|;|;7@GJKIC> ?@&A4A?AIAQ@Y@`@g?m?u?}>}>{> z> x> w? u? t@t@t@s@s@s@;ELOPOJDEF"F0G<FEFNFUE\~Ec|DjzDqyDywDuC sC qC pC nD mD mE lElElElElE?IPTUTPJIJK,L8KBKJ|JRyJXwJ_uIfsImqIvoHmH lH jH hH gH fI fI fI fJfIfIfICMSXYXUNNOO)P5{P?xOGvOOsNUqN\oMcmMjkMriM|gL eL cL bLaM`M`M `N `N `N`N`NGPW[]]ZSR S|S%yT1uT<sSDpSLmRSkRYiR`gQheQpcQyaQ `P ^P \P[QZQZQ ZR [R [Q[Q[QJSZ_aa^WV zWvW"sX.pW9mWAjWIhVPfVWdV^bUe`Um^Uw\U ZU YU WUVUUUUU UU VU VU VUVUMW^beec\{[u[q[n\+k\6h[?e[Gc[NaZU_Z\]Zc[ZkYYuWY UY TY RYQYPYPY QY QY QY QYQYQZafhig}`u_o_k_h`(f`3c`<a`D__L\_S[_ZY_aW^iU^sS^~ Q] O] M] L^K^K^ L^ L] L] L]L]T^ejmmlxeodidedbd%`e0^e:\eBZeJXdQVdXTd_RdgPcqNc{ Lc Jc Hc Gc Fc Fc Fb Gb Gb GbGbXbinqrqtkiici _i\j!Zj-Xk6Vk?UkGSjNQjUOj]MjeJinHiyFi Di Ch Ai @i @h Ah Ag AgBgBg]fmsvwvpreq\pXpVpTq(Rq3Pq<OrDMqKKqSIqZGqbEplCpwAp?p=o ;p ;p :o ;n;n;m;m;mbksy{|{|mz`xVwPwNxLx$Ky.Iy7Hy@FyHDyOByWAy`?xiC=K;S9\7f5q310.----~-}-}-}nx}pcUKA;98"7,654=3F2O1X/b-n+{*(&%%%%%%%vvi\PD:1-,+$*-)6(?'H&R%\#h"w zmaUI=3*! $-6?JUapqdXL@5*" "+ 5 @ K X gxugZNA5+!  "+6AN\mxj\OB5*   "+5AP`rχϝϳzl^PB5) (4AQcw|n`QC5(  $1ASf|paSE6'  !.@Sh  $.<JVcmw *7ER^ir{ %3@MYdmv}  -:GS^hpx  &4AMXbjry  ,9FQ[dlsz   " 1 > J U^fmt{" #$! )7DNW`gnu|&'-/-'"1 =!H"R"Z#b#i#o#w#~#$$$$%%&'''''')06872+%')+*8*C+L+U+\+c+j+q,x,,,,,,-.....~.~..7=??<5/ /1&232>3H3P3X3^3e3l3s3|333}3|3z3y4w5v5u5u5u5u53=CEFC=668!9.999C9L9S9Z9a~9h|9oz9wy9w9u9t9r9q9o:n:n;m;m;m:m:9BHKKID><=>*?5??~?H|?Oz?Vx?]v>dt>kr>sp>|o>m>k>j>i?g?g?f@f@f@f?f?=FLOPOJDA BC&}D2zD<wDDuDLrDSpCYoC`mCgkCoiCyhCfCdCcCaC`D`D`D_D_D`D`DAJPSUSOIG }GyG"vH.sH8qHAnHIlHPjHVhH]fGdeGlcGvaG`G^G\G[HZHZHZIZIZHZHZHDMSWYXTN}KwKsLpL+mL5kL>hLFfLMdLSbLZaLb_Lj^Ls\K~ZKXKWLVL UL TLTMULULULULHQW[\\YSwOqOnPjP(hP2eP;cPCaPJ_PQ]PX\P_ZPgXPqWP{UPSPRPPP PP OPPPPPPPPPPPKTZ^``]|WrTlShTeT$bT/`T8^T@\THZTOYTVWT]UTeTTnRTyPTNTMTKTKT JTKTKTKTKTKTNW^bddbw[mXfX bX_X"]Y,[Y6YY>WYFVYMTYTRY[QYcOYlMYwKXIXHXGYFYEYFYFXFXGXGXR[afhigr`h^a] \]Z]W])V^3T^;R^CQ^JO^RN^YL^aJ^jH^uF^D]C^A^@^@^@]A]A]A\A\V_fjmmlogdd[bVbTbRc%Pc/Nd8Md@KdHJdOHdWFd_EdhCdsAc?c=cr@=rH;rP:rY8rc6rm4rz3r1r/r.r.r.q.p.o.o.ofovz|~}r}d|W{LzBy)G(P'Z&f$s#! t}~qeXL@6,% #"!% .6@IT`n~}wi]PE9.% $-7ALXg w {m`TH<0& $.8DP^nqcVJ=1&  %/9FTdvtfXK>1&  $.:GWi}ɔȪwhZM?1%  "-9IZn߅ߜ߲yk\N@1$   +:K^sm^PA2$ ):Mbx!+9GT_js{ '4BO[env~  "/=JU`iqy  )7DPZcksz "0=IT]emsz  (6BMW_fmtz -:FPX`gnu{   %2?IRZahov}#(*'!,8CLT\bipw     $,131-%  &!2"="G#O#V#]$d$k$r$z$%%%&~&}'{'y(x(x(x(x(+39;:6/('( )-*8+B+J+R+X,_,f,m},u{,~z,x,v-u-t-r.q.p/o/o/n/n/1:?AA>81./0(132=2F}2M{2Ty2[w2au2it2pr2yp3o3m3l3j4i4h5g5g5f5f5f46?DGGD?94 56$|7/y79w8Bt8Ir8Pq8Wo8^m8el8mj8uh8g8e8d9b9a:`:`:_:_:_:_:;CIKLJE?: {:w; t<+r<5o=>m=Fk=Mi=Sh=Zf=ad=ic=ra=}`=^=]>[>Z>Z?Y?Y?Y?Y?Y>?GLPPOKEz@u?q@m@(kA2iA;gABeAIcAPaAW`A^^Af]Bo[BzZBXBWBUCTCTCSCSCTCTCTCBJPSTSPJuEnCkDgE$eE.bE7aE?_EF]EM[ETZF[YFcWFlVFwTFSFQFPGOGNGNGNGNGOGOGFNTWXWT{NpJiH eHbI!_I+]I4[I<YICWIJVIRUJYTJaRJjQJuOJNJLKKKJKIKIKIKJKJKJKIQW[\\YvSkNdM _L\MZM(XM1VM:TMASNHRNOPNWON_MNhLNsJOIOGOFOEODPDOEOEOENENLU[^``^rWgS^QYQWQTQ%RR/QR7OR?NRFMSMLSUJS]ISfGSpES}DSBSAT@T?T?T@S@S@S@RPX^bee}bn\cYYVTVQVOV"MW,LW4JW<IXDHXKGXSEX[DXdBXn@X{?X=X^a<^l;^x9^7^6^5^4_4^5]5]5\5\Yaglnnvlgi\fQdHb DbBbAc$?c->c5=d=s4r 1s0s/s#.s+-t4,t<+tD)tM(uW'uc%uo$u"u!u uutsr q qksy|~tgZM~C~8}/}(} &}$}#~%"~-!~6!~?HR^kz~|{{{rz{m`TH<2( &.7ALXeu {seYLA4*!   & / 9 DP^nwj]PD8,"  '1<HVew{m`SF9-#   (2>L[lqcUG:-"  '2@O`tËáøseWI;-! &2ASf|ٔ٫vgYK<.!  $2CVkj[L>/   #3FZq(7DQ\fow~$2?LWajry ,:FR\eltz  &4@LV_gnt{  -:EOX`hnt{  %2>IRZahnt{  *7BKT[bhnu{  !.: D M U \ b i o v ~  $%" '3>GOV\cipx}||{{!)-/,' !-8AIPW^dks|}|zxwv t!r!q"q!q!q!(05751+# !'"2#<#D~#K|$R{$Yy$_w$fv%nt%ws%q&o&n&m'l'j(i)h)h)h(h(.6;==93-' '("|)-y*7w*?u*Gs+Nq+Tp+[n+bl+jk,ri,}h,f-e-d.c.a/`/`/`/`/`.4<ACC@:4.z-w.s/)q03o0;m0Ck1Ji1Qg1Wf1^d1fc2oa2y`2_2]3\3[4Z4Y5Y5Y4Y4Y48@EHHF@;y5s3o4l4%i5/g57e6?c6Fb6M`6T_6[]7c\7k[7vY7X8V8U8T9S9S:S9R9S9S9<DILLKF}@s;l8 h9e9"c:+`:4^:<]:C[:JZ;PX;XW;`V;hUM>M>M>M>M=M=@HMPQOKyEn@f= b=_=\>(Z>1X>8W>@U?FT?MS?UR@]P@fO@pN@|LAKAJAIBHBHBHBHBHAHADKPTTSPuJjFaB\AYBWB%UB.SB5QB=OBCOCKNCRMDZKDcJDnIEzGEFEEFDFCFCFCFCFCECEGOTWXX~UqOfJ\FWFTFQF"OF+NF3LG:KGAJGIIHPHHXGHaEIlDIxBIAI@J?J>K>J>J>I?I?IJRX[]\{YmSbOWLQJ NJLKJK(IK0GK8FL?ELFDLNCMVBM_@Mj?Mv=NRT2]F1^N0^W/^b-^n,_}*_)_(_'_'_'^'](](\\djnoyonn`kTiIg?e5c 2c0c/d!.d)-d1,d9+eB*eJ(eT'e_&fk$fz#f"f fff e d c!cbjpsuuuit\rOqDo:n0m)l 'l&l%m$$m,#m4"m=!nF nPn[ngnvnooonmlkkiqvy|{q{d{WzJy?x5x+w"vvwww&w.w7x@xJxVxcxrxxxxwvuutqx|wj]PD8.$ '0 9 D P ] l~y~}obUI=1&  )2=IVevtfYL@4(  "+5@N\nxj\OB6) "+6DScw{m_QD6*  !+8GXk~pbSF8*   +:K^sҋҤӻsdVG9* *<Od|fXI;+  +>Sj&4AMXbksz !.<HS]fmu{  )6BNW`hov| #0<GQZbiov|)5AKT\ciou{ ".:DMU\ciou{ '2=FOV\chou|  *5?HPV\ciov  !  # . 8 A I P W ] c jqz~|{zxvuttt&**(#'2;CKQ~W|^{eylwtv~trqonmkjjjj&-131,& "~,{6y>wEuLsSqYp`ngmpkzjhge d!c!b"a"a"a"a",48985/(!{ w!t"'q"1o#9m#Ak#Hi#Nh$Uf$[e$cc%kb%ua%_&^&]'[([(Z)Y)Y)Y)Y(29=??<60y*r&n'k(#i(,f)5e)<c)Ca*J`*Q^*W]*_\+hZ+rY,}X,V-U-T.S.R/R/R.R.R.6=BDDA<{7r1k, g-d-a.(_.1].9\/@Z/FX/MW/TV0\U0dS1nR1zQ1P2N2M3M4L4L4L4L3L3:BFIIGBw=m7d2 `2]2Z2%X3-V35U3<S4CR4JQ4QP4YO5aM5lL6wK6J7H7G8G8F8F8F8F8F7>EJMMK~GsBi=_7Z6W7T7"R7*P72O89M8@L8GK8NJ9VI9_H:iG:uE;D;C<B<A=A=A=A<A<A<BINPQP{LoFeBZ=T;Q;O;M;'K;/I<6G<=G\C>gB?s@???>@=@Ce=Cq;C:D9D8E7E7E7E7D8D8CIPUXYXvVhP]LSHJE FDDDBD"AE)?E1>E8=E?I=I;J&:J.9J58K=7KD6KM4LV3L`2Ll1Mz0M.M-N,N,N,M-M-L-LPX]ab{ap_b[XXNUCQ;O 8O6O5O#4P+3P22P:1PB0QJ.QS-R],Ri+Rx)R(S'S&S&S&S'R'Q'QU\bfgxfme`aU^J[?X5V1U0V.V-V',V/+W6*W>)WG(WP&XZ%Xg$Xu#Y!Y YYYX X W!WZbgkluljk]hQeFc;`1^*] (]&]%^#$^*#^2"^:!^C _L_W_c`q`````_^^]`hnp|rrrfqXnLlAk6i-g#fffff%f-g5g>gHgSh_hnhhhhhgfeegosvxxmx`wSvFt;s1r'qqp pppq'q/q8qBqN q[ qi qz qqqppo n nouy~|t~f~Y~M~@}5}*|!||| | | ||!|)|2|=|H|U|c|t|{{zyyyxw|yl^QE9-#  #,6BN]m~~qcVI<0$  $.9FUexugYL?2&  %/<K[nxj\NA3&  $0?Pbx{m_PB4&  $2CUj̜̃˵paRD6' $5H\scUF8(%8Mc|#0=IT^fnv|  +8DOYaipw}%2>IS\cjqw}  ,8CMV]dkqv|%1<FOW^djpv| *5?HPW^diou|#.8AJQW]ciov} &1:CJQW]cipw~}{zzyxx  )3<DKQW]c}j{rz|x v t s q p o nmmm#&&$   " ,~ 5|=zExKwQuXs^qepnnwlkihfedccbb$*./-("}yv's0q8o?mFlLjShYgaeidrb~a_^\\ZZYYY*15641+%ysol"i+g3e;dAbH`N_U]\\d[nYyXV U T!S!R"R#R#R"R"/6:<;82z-r&j f c!a!&_"/]"6["=Z#DX#JW#QU#XT$aS$jQ%vP%O&N'L'L(K(K)K(K(K(4;?A@>9u3l-c'^&\&Y'"W'+U(2T(9R(@Q(FP)MN)UM)]L*gK*sI+H+G,F-E-E.D.D.E-E-8?CEEC{>q9g4^.X+U+R,P,'O,/M-6L-<J-CI-JH.RG.ZF/dE/pC0~B0A1@2?2?3?3?2?2?2<CGIIHxDm>c9Z4R0 O0L0J0$I1+G12F19D1@C2GB2OA3X@3b?4m>4{=5<6;6:79797:7:6:6@FKMNLuHjC`>V9M5 I4G5E5!C5(A5/@56?6=>6E=7M<7U;8`:8k99y897:5:5;4;4;5;5:5:CJNQR~PsMgH\DR?H:D9A9?9>9&<9-;:4::;9;B8;J71>0?/?/?/?0?0>0>GMRUV|UqRdLYIOEE@?> <>:>9>#7>*6?15?84?@3@H2@Q1A[0Ag.Bu-B,C+C*C)D*C*C+B+BJQVYZyZnWaRWNMKCG:C 6C4C3C 2D'1D/0D6/E=-EF,EO+FY*Fd)Gr(G&G%H$H#H$H%G%G&GOUZ^_w^k\_XUUKQ@M5J0I.I-I,I$+J+*J3(J;'KC&KL%KV$Lb#Lp!L MMMNMLL KSZ_c~dtcia\^R[GXf3e)c a` ````&`.a7a@aKaX af bv b a aaa ` _ _fmq~suujt\sOrCp8o-n$lkkj j j j! j) j2j<kGkSkakqjjjiiihhmsw{zp{c{VzIz=y1x'wvvv v vvvv$u,u6uAuNu\ulu~ttssrrquz~vi[NA5)  &/;GUex~}}|{n`RE9,!  (2?M]prdVH;." )5CTf{ugYK=0# )8HZoxj\M?1# +<NbzƔƭl^OA2$  -@Tk`RC4%  1F\t ,9EPYbjqw~'3?JT]dkrx~ ".9ENW^elrw~ (3>HQX_ekqw} "-7AJRY_ejpv} &1:CKRX^dipv~  *4<DKRX]cipw  #,5>EKQW]cjqz}{ywutrrrqq  %/7>~E}K{QyWx]vdtkrtpnlkihgff e e  ##  |y(v0t8r ?p Eo Lm Rl Xj _h gg pe zc b ` _ ^ \\[[[!(++)${u q n!k*i2g9e@dFcMaS_Z^b\k[vYXVUTSRRRR(.221-'z!rk gda%_-]4\;[BYHXOVVU^SgRrPONLKKJJJJ-47874}/t)l#d^[Y!W)U0T7R=QDOKNRMZKcJnI|GF E!D!C"C"C"C"C"28<>=:y5o0f*^$W T Q O!%N!,L!3K":I"@H"GG"NF#WD#`C$kB$yA%?&>&='='=(=(='='6=@BB?v;l6b0Y*Q% M%K%I%!G&(E&/D&6C&=B'DA'K?(T>(]=)i<)v;*9+8+7,7,7,7,7,8,:@DFF}Ds@h;_6U1L+G)E*C*A*%?*,>+3=+9<+A;,H:,Q9-[8.f6.s5/4/30201111212030>DHJJ{IpEe@[;R6H1B. ?.=.;."9/)8//7/660>50F41O31Y22d12q03/4.4,5,5,5-5-4.4AHLNNyMnJbEX@N<E7=3 93736343&33-24414<05D/5L.6V-6b,7o+7*8(8'9&9'9(9(8)8EKORSwRlO_IVFLBB=88482818/8$.8+-92,99+:A*:J);T(;_'!>"=#=#<IOSVWuVjS]OSLJH@D6@/= -=+=*>!)>((>/'>7&??$?H#@R"@]!Aj AzABBBBBAAMSX[}\r[gX[TQRHN=J3G*C &C%C$C#D%"D,!D4 E<EEEOFZFhFxGGGHGGFFRX]`zap`e^YZOXDT9Q/N&K JJJJ!K(K0K8KBLLLWLeMuMMMNMMLLW]bewfmfcdVaJ^?[5X+V"TR RRRR$R,R4R>SHSTSb Tr T T TT T S R R]dh~ktlkl_jRgEd:b0`&^][Z ZZ [ [' [0 [: [E[Q[^[m[[[[ZZZYdkn{prrgqYpLn@l5k*i!gff e eedd#d,d5d@dLdZdid{dccbbbalquxwmx`wRvFu9t.t#rqq qqp ppoo&o0o;oGoTodounmmlkkksx}{s}e~X~K~>~2~&}|| |}}| ||||!|)|4{@{N{^{ozzyxwvvzxk]OB5)  ",8FVh|}oaSE8+  ".=M^srdVH:,  #1ASgugYJ<-   $5G[rj[M>/! '9Md~ܙܰ]O@2" *?Um  (4ALU]elrx~#/;FPX_flrx~ *5@JRY`flrx~$/9CLSZ`fkqw~ )3=EMTZ_ejpw",6>FMSY^djpw &/7?FLRX]cjqy~|zxxwww (19@FLRW}]{czkxsv}tqpnlkjjjj !~*{2y9w@uFsLrQpWn^mekniwgecb`__^^^  ~ yur#o+m3k:i@gFfLdRcYa`_i^s\ZYWVU T T T T %((%!{tn if d %b -` 4^ :] @[ GZ MX TW \U dT oR {PONLLKKKK&+//-)}$tle_\ZX'V.T5S;RBPHOPNWL`KkIxHFEDCCCCC+14541x+o&f ^W TQO#N*L1K7I>HDGLETD]CgAt@?=<;;<<<069;:~7s2j-a'Y!Q LJHF&E-C3B:AA@H>P=Y<d;q987 6 5!5!5"5!6!4:>??{<p8g2]-T(L"FCA?"> )= 0; 6:!=9!E8"M7"W6#b4#n3$~2$1%/%/&/&/&0&0&8>BCCxAn=c8Z3Q.H(@$ =#;$9$8$&6$,5%34%:3&B2&J1'T0'_/(l.({,)+***)*)+*+**+*<BFGGvElBa=W8N3D.<) 7(5(3(2(#0()/)0/*7.*?-+H,+R+,]*,j(-y'-&.%.$/$/%/%/&.?EIK~LtJjG^BT=K9A48/2- 0-.--- +-'*..).5)/=(/F'0O%0[$1h#1w"2!23333 3!2CIMO|PsOhL\FRCI??;66.2 +2)2(2&2$%3+$32#4:"4C!5M 5X6e6u77788877GMQS{TqSfPZLPIGE=A3=*9 %7#7"8!8" 8(80989A:K:V;c;r;<<==<<;KQUXyYnXdVXQNOEK:G0C'@ > >>>>%>-?5?>?H@S@`ApAAABBAA@PVZ]v^l]b[VWLUAQ6N,K#HE DDEE"E)E1E;FEFPG^ Gm G G GGG G F FU[`}bscjb`aS^GZUJVWVeUwUUUTTSSbhlwnoocnVlIj=h2f'ecba `` ____&_/_:_E_S_a^r^]]\\[[jo}rutju]tOsBr6p+o nml lkk jjjj!i*i4i@iNi\imhhgfeedqvzyp{b{U{Hz;z/z#yxw wwwwv vvvv#v.u:uGuVuht|tsrqppy}vhZL?2%  &2?O`u~~zl^PB5'  (6EWk~paSE7)  *:L`xsdVG9* .@TjgXJ;,  2F]vԒի[L=/ $8Ng $0<GQY`gmsy  +7BKS[agmsy&1;EMU[aglrx  *5>GNU[aflrx $.8@HNTZ_ekqx (19AHNSY^djqz~ "*2:AGMRX]dks}}{xvusqpppp  $,3:}A{GyLwRvWt]rdpmovljigedccbc ~zv%t-q4o:n@lFjLiRgXf_dgbq`|^\[YXXXWW~ w rnjh'e.d4b;`@_F]L\SZZXbWlUwSRPONMMMM"%%"}un g c_]![(Y/W5V;TASGQNPUN^MgKsI H G E D D C C D $),,*&w!nf_Y U S Q "O )M /L 6K <I BH IF QEZDdBp@?><;;;;<)/221|-r(i#aYQLJHF$E+C1B7A>@E>M=V<a:m9|76543444.4786x4n.e*\$TLF B@? ='<-;49:8B7J6S5^3j2y0/.---..28;<<v9k4b/Y*P%G@ <:86#5)40372>1G/P.[-g,v*)(' & ' ( ( 6<?A}@t>i:_5V0M+D%; 6320 /&.--4, ;+ D*!N)!X'"e&"t%###"$!$!%"%"$#$:?CE{DrCg?]:S6J1A,8&1# .","*")"#(#*'#1&$9%%A$%K#&V"&c!'r'(())))(>CGIzIpGfDZ?Q;G7>25-,( ('''%'$'!#('"(.!)6 )?*I*T+`+o,,------AGKMxMnLdIXDO@F==834*/$, !, ,--%-,.4.</F/Q0^0m11122211EKOQvRmPbNVIMFDC;?1:'62 2222"3)314:4D4O5\5k6}66 7 7 666IOS~VuVjU`SUOLLBI8E.A$=:88899&9.97:A:L ;Y ;h ;z ; <<<< ; ;NTX|[r[hZ^XSUIR>N4K*G!DB@ ??? @# @+ @4 @> AJAVAeAvAAAAAA@TY^y`p`f`]^Q[EW:T/Q%OLJH GGGG H(H1H;HGHSHbHsHHHGGGGZ`cwenfefYdL`@]5[*Y WUS RQ PPPP%P.P8PCPPP^PoPOONNMMaf}itllmakSiFg:d/c$a_^ \\[ ZZZY!Y)Y3Y?YLYZYkX~XWWVUUhmzprrgrZqLp?n3m(kjh ggff e eddd$d.d:cGcUcfczba`__^otxwnx`xRwEw8v+v tssrrrqq qpppp'p3o@oPo`ntnmlkjiw|{s}e~WI</"~~~~~~ ~ ~~~ ~+}9}H}Y|m|{zyxwwi[M?2$ "/?Pd{{m^PB4& $4FYppaSD6' '9Md~dUG8),@Vǫ͋XI:,2H`{ !,8CLT[bhntz '2=FOV\bhnsy",7@IPV\bgmsy &0:BJPV[aflrz *3;CIOUZ_ekr{ #,4<CINSY^dks}}{yxwwu&-5<BGMR}X{^yexmvvsqomljihhi  |'z.w5u;tArGpLoRmXk_ifgpe{cb`^]\\[[  { wso!l(j/h5g;eAcFbL`R_Y]a[jYuWUTSQPPPP wqkgda"^)]/[5Y;XAVFUMSTR\PeNpL}KIHGFFFE ""woh a ]YVT#R*P0O5N;LAKHIOGWFaDlCyA@>=<<<<"'))'{#qiaZ S OLJH$G*E0D6C=AC@K> S= ]; h: v8 7 5 4 3 3 3 4 ',//.w*m%d \TLF C A ? > %< +; 2: 88 ?7G6P4Z3f1t0.-,+,,-,145}4t1j+`'X!OG@ ;976!4'3-241;0C.M-W,c*q)'&%$%&&169:{9q6g1]-T(L"C;5 21/.$,*+1*8)@(J'T&`$o#!   4:=>y=o;e7[2R-I(@#80 ,*)' &'%-$5#>"G!R ^l~8=ABwBm@c<Y7O3F.=)5$- ' %#!!$ +2;E O!\!j"{""#####<ADFuFlDbAW<M8D4<03+*&#" !!""!"(#0#8$B%M%Y&h&y&'''(''@EH}JtJjI`FUAL>C::612(- ) ''''(%(-(6)@)K*W*f+w+ , , , , , +DIL|NsOiN^KSGJDB@9=/8%40- ,---#-*.3.= /H /U 0c 0t 0111100HMQzSqTgR]PRLIJ@F5B+>":74 33 3 3 4( 41 5;5F5R6`6q6666665MRVxXoYeX[UQRGOHPW]ciot{#.8BJQX]chnt{ (2<DKQW]bgmt{"+5=EKQV[afmt| %.6>DJPUZ_flu~~| '/7=CINSY_em~w|zxusrqppn !)07}={ByHxMvRtXr_qgopl{jhfecbaaa|xu#r)p0n6m<kAiGhLfRdYc`ai_t][YWVUUTU  {u plhf#c*a0`6^;]A[FZLXSV[TdRnQ{OMLKJIIIy qke a]ZX$V*T0S6Q;PANGMNKVI_GiFvDCA@??>?zrjb\WSPNL%J+H0G6F<DBCIAQ?Z>e<r:9866555 $&&$u ld\T N JGDB @%?+>1<7;>9E8M6V5a3n1~0/-,,,,%*,-{+r'h"_WOHA >;98!6&5,322 91 A/ I. S, ^+ l) |( & % $ # $ % */22y1o.e)\$SKC<5 3 1 / . "- (+ .* 5) ='F&P$\#j"{ /367v6m3c/Y*P%H ?80,*('%$$*#2":!C NZhx37:~;t;k8a4W/N+E&=!4-& #" !'/7AKWev6;>|?s?i=_9U5L0C,:'2"*" $,4>IUct  :?B{DqChB^>S:J6A29-1)(%  ")2<F S a !q ! " " " " " !>CFyHpHgF\DR?I;@884/0','# !!"" "'#/ $9 $D %P %^ &o&&&&&&&BGJxLoLeK[HPDGA?>7;-6$1-*( ' ( ( (% )- )7*B*N+\+l++++++*FKOvQmQcPZMOJGG>D3@)< 841 / ..//#/+050?0L1Y1i1|11000/KP}TuVkVbUXSNPEM:I/E%B>;9 7 6666 6)627=7I7W7g7y766655PV|Zr[i[`[WYLV@R5N*K HFC A@ ?>>>>&>/>:>F>T>d>v==<<;;W\y_paha_aT^G[:W/U%RPM KJI H GGFF"F,F7FCFQF`EsEDDCBB]bwenggh[fNcAa4^)\ZWVTSRQ QPOOO'O2O?OMN]NoNMLKJJe|itlmnbmTkGi:g-e"db` _^^]\[ ZZYY"Y-Y:YHXXXkWWVUTSlypsshsZrLq?p2o%nlk jjiihgff feee'd4dCdSdec{ba`_^}twwny_yQyCy6x)xwv uuuvuttsss rrr r,r;qLq_qtponlk{{r~d~UG9+  #2CVl~}|vhYK<.   '8Lb|j\M?0! -@Vo_PA3# 3Ib~SD5& %;Snߌݩ$/:CKRY^diou| )4=ELSX^cinu} #.7?FMRX]bhnu~'08@FLQV[agnv !)29?EJPUZ`gox}|{zwu #+28>DINS}Y{`yhwqu|spomkjiig }$z+x2v8t=rBqHoMmSlYjahjftda_^\[[ZZz uqnk%i+g1f7d<cAaG_M^S\[ZdXnV{TRQPONNM |unieb_]%[+Y1X6V;UASGQNPUN^LhJuHGEDCBBB{ sle_ [WTQO%N+L0K6I<HBFHEPCYAc?o>~<;:9888uld ]VQ MJGE D&B+A1?6>=<D;K9T7_6k4z210//.."$$z!qg_WP IE A><:!9&7,62483?1G0P.[-g+v*('&%%%#(**w(m%d [RKC = 96310"/'--,4*;)C(M&X%e#t"  (-/~/t.j+a&X!OG?81 .+)('#%)$ 0# 7! @ J U b r       -14|4r3h1_,U'L#D<4-& $ " !   % , 4=GSaq158z9p8g6]2S-J(B$91*# !)1:EQ_o     59<x=o=e:[7R2I.@*7%/!(  &.8BO \ l   8=@wAmAd?Z<P8G3>06+.''# # , 5 @ L Zi|<ADuElEcDYAO=F9>652..%*%!    "*3 > J!W!g!y!!!!! @E}HtJkJbIXFNBE?=<59+4"/+( $ ###$ $(%1%<%H&U&e&w&&&&%%EI{MsOjO`NWKMHDEO2L(HEB@=<; :999 9)949@9N9]9o887765UZv]m_e_]_R\DX8U-R"OLJ HFED C BAAA&A1A=AJAZAl@??>=<\|`scledfYdKa>^2[&YVT RQONML KKJJ"J,J9JGJVIhI~HGFEDcygrjkl`kRiDf7d*b`^ ][ZYXWVV UTTT'T4TBSRSdRyRQPON~jwnpqfqXpJoK=S;]9i7x6432211zph_ XQL HDA?=!<&:,91776>4F3O1Y/e.s,+*)((( !!ulcZR KD@ <8643!1'0,.3-:+B*K(U&a%p$"! "&(|'r%i"_WNF? 84 1.,*)"'(&.$6#>"G R^m~'+-y-p+f(]$TKC;4 - ) &$"! $*2:DO\j| +/1w2n1d.[*Q%I @81)#    ' . 7 A M Z i { /36v6l5c3Y/P+G&>!6.'       # + 4? J X g y37~:t;k:a8X5N0E,='5#-&    ( 2 <HUev6;|>s?j?`=W9M6D1<.4*,&%"   &/:FSbt:?{BrChC_BV?L;C7;430,,$)$   $-8DQ`r>CyFpHhH^FUDK@C=;:37*2 -)% "   " +!6!A!O!^"p"!!! CHxKoLfM]KTIJFBC:@/;%73/ ,)' &%&&!&)&3'?'M'\'m''&%%$HLvPnQeR\QSOJLAI5D+@!<96 20/ .----'-1-=-J-Y-k-,,+**M}RuUlWcW[VSUGQ;M0I%FC? =:87 6 5444$4.4:4G4W4h4}32110S{Xs[j]b][]OZBV6R*O LIGDBA?> ==<s0r#qo nmmmmlkjiiih hhg!g/g?fRffedcbawxmz_zPzBz3{%{zyyyyzzzxxwwwwwwww&v6vIu_uwtsrqq~cTE6(,?UmfWH9*!3IbZK<- '=UpM?/  /HbЀНи  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ݯŌh̜λŽzې[=eu4TӔ~I,Nʳ~emŮ滑tcĚsE&4}U0 `t5 R4Oi  R;5L[ML^`6`ʼϚmZF|>&T<.Sm1 aZ]5\} T}EDd/"7IXkA(?cղ廗wb۞g6 ?^ف9/Z$^w%j}[+L<0 -a''U'%ʝv]J<2-,09GԻ縏jK/og4<ւ;1oBPi7/"y4Ftjc)"aW7hӮ|uqprwۺiiȓe=ێLn|,E*"D}6jXFG5% ' p pUB3& &ӼҩeH,q<O5u#gCH.8thB`z]a$fɬ}vqligfgkpzŪyawݦwP, 1Np`o7@r_M;*3^+ ƣhM2|Fq|/;d tjK0/Ryt6m|i hpaPliZI9X)V/)G .>RhҰw]B( J}EP h6HuiR>3+X"\Jzwz LWhtңzX:)#RiC4yO]:*Ot3grD\A_KW $1?N`t¾~S?0# vuFNDkyf!SJ?w+ EM.*-E`ct˷|xtplhejH- 1B)kZN4 =eNCzt _t,8ESbrٲymd]VQKFA<82-(#K% f=3l 5[/^w^C@^N,>Rj|þm[L@7/(" 4v$Q|yfQ#:62/.1%B} 9b"Hri(N\3.2Rwr/BXpon~dVKC<60+'" RmQ:B#h >m7/Ptr*AZuXDTdu{xvtrsuxO:0(! #i 9c4[I9]{ !8RoX)9IZl~wqlhda^[YXWWY^eq1 V/W|7+a ,Pv0 #;Wvc*;L_tſld^YUQOLJHGFHKPYf&VP:y !2X1Z'KqI/Jhu&8J^urZSOKHFDCBABCGNYi}.VA{ 4`?%Jqf*Db5+>QhvPJGEDDDEFGKQZhA6ce 'Ls/*DbP6Ja{҇|SGIMQV`sV5Pmo>_{desc Little CMS Little CMSdesc2.x 2.xlcms2-2.19.1/testbed/test2.icc0000755000175000017500000237624015176573557015057 0ustar martimarti lcmsprtrCMYKLab 5acspMSFT-lcms desccprt#wtptA2B0,_fA2B2,_fA2B1a_fB2A08B2A18B2A22d8gamt kdmnd dmdd ,tdesc,Test profile, not suitable for real use-Test profile, not suitable for real usetextNot suitable for real useXYZ IÂmft2 -Ge % M u EtHHt !"$,%Z&'(*+E,s-.0132e345728]9:;=>;?i@ABD"EPFzGHIKLCMjNOPRS&TKUjVWXYZ\]*^F_b`abcdf g&hAi]jyklmnp q-rMsntuvwxy{ |"}9~Phʄ*AXoĐؑ.<=<:852/+'# ׮ϯǰo]K9'ǼȪɗʄp\H3ҵӒnI#تـT'ݘg5e0[%k&V7Yy.Pw/P^X"7Ni * Jl.[8^!"+#V$%&())*S+~,-/011a23467;8e9:;=>J?z@ABD!EGFlGHIKL$MGNjOPQRSUV5WRXoYZ[\^ _%`>aXbrcdefgij;k[l|mnoprst5uPvkwxyz|}"~Ca{˄8Rmӏ,9FR]hr{|wroljiijkmosvspmkihfeeeeeeeefeedb`]O?.ժ֏rS3ܟuJZ&Br,T t(=KT\ fnf>j#6Ld~  5RpAa / S!x"#$&'#(E)g*+,-/0>1`23457889]:;<=?@A:BUCqDEFGHJ K#L:MPNgO}PQRSTVWX3YDZU[f\x]^_`abdef5gKhcizjklmnpq0rLsituvwxz{2|O}l~Á6Rm֌2G\oəٚ $'+/38=BGMSZ`gnu|“ÚĢŪƬǧȢɜʖˏ̆}sgZL=+بٍqS4ߩS!K_!_Mt*Jf8T[:i&8Ng *@Vl $<T m!"#$%&().*E+\,s-./0124 5"687M8c9x:;<=>?A BC4DHE\FpGHIJKLMOPQ-R@SRTeUwVWXYZ[\^ _`.a@bRcdduefghijkmno"p3qCrTsdttuvwxyz{|},:IWftȍ֎ $0|7{̑|֩ڽ|}|u|YԢ|1|,.||/iG|=TN|A;|z3}ط}7u`|є|ɲ|OC|.za|f{Q{ר9&{pjx$N~~"dVfqth}^E2#TCG.c0ϽaĨ܄s>ӄ]LDq#߅f{s]jY dǂcA4QVBւ3mr!.\NDO$D텃_/ {͂S_ꏙTmpځG[~C$H4끃 \ ف~O0ׂ΀oZ1C$[$u:{s6Eƾǡ㵏Xo2ߚ풪vmlmY"|8A "(爂.jJ*֐=?~^vk[WC䓒?5pS%;|=FrG7碽|)\itU{S3='?~t >X ٝ$yRgG^SS~ӛe;~wV}rƂུ˜@47w%%n yې_3I-U kꞝ` JxCfbSP"<9كXܸ{Ĩ(٩J'vZڜd.Q:ƀNGؑא$W ΰ^|NڃxtblȞ>Od8D~ZՒt3YmلÂGaqhP~_v2L57 |ٍӟ%p|~?u"ҐQMo ]L+I;3-~Y{'|c|䏆}s}Ԍg~*~|щjV(L@*Մ!ڈfS؃Rʂˋ劁{SL ikPUՇ?b!፳5)*,5f61Fy戻h-Tdž߇>[!ЎbIc!sΌ\Ysx[%vfۇ$S@=񅨊!͏ӊmF8זɐvڇme.RK=J!}ېaџbj̜̋>͔bÈTtԇcQ.>;ÄGlʑY͐=m ⌢@ WrrayOR{90ɐn=fЌ{lҦ{݉iGpn;p_M 7ǂϕm+ܐ¼.h?Gĭu娼~]n+堓]u1KipU5#gyS˺N0?uغxD+{=SkZ„PH)2X~3g}aRyދ %PyG!1i@m\X_F=0(⠐|γ{!{|*E|}_x~'vQe׀TS =!?#ق۔trdӓL͎̄~uAĂkdcD#Q_< É7Ay3*7pՇˇ,c3sՌ;c! PމF;9 ɉ``,LёCZ[/)dErJa͊,O͈H;" JǗ7Ɖ󈲐(ӛs )]xwjt[.J~7ǑQ`O2o󟉘avh@UYh$.Hv5HX6d*O9~$Wt8_fsՔ_WfG3q AԞlH`=LTdrFdqpU9E\V1u6<j2$' ;~@9pcbKS^֛QC?/2@N4ƥjf_ѕW{2m_ƌ٣PK@m(,U}̱NSry-kݏ`]MNe5=̥)8 -czJJzH{L{[|~w}Wi~hZ\Iߐ5X\Ў06#4ϣBSdZ€xv hU8qYLuHΏb 51DOWݛsg~Sə-ta}fX(.GɎq4tщ@v"Ǣrћˉƀrψ\eVҐ"FŎ3ŒPMc51ў{/P~ygqfCjd|U>E΍wm3gp'{3P|oԐb6aSݏpDNQ1%8|f-աԝؔ qaę/zlm}`4RQ#Ba/ mϫsᤓ[졞x+k-^Q?P$@ыF-gT߯ I .vi\IpN7>x+KϚ tTF_fz-tQgZڥ@Y搼K;(fEQ ЇǦWȼ?dʚ³re\ĬWː ILg9jͥ=%Ǚ QkLZ7z!0z{ JM{||&p8}c~TȕE#1Ƒ ^ƪfǢznSaMSP-Dn1;UbuƄnUyTm$`qRoC _0drL) C>Tġwkbt_KQ0B/lE5/ǎf==v\6jҋQ]OsA&qR/*Bb=ì(ԕq`ztѐhSc][֖hNV?8-N3_lƢ\ϝZDL~v%r*fuY@L}=e+q0稲 *}EpJdĘ'X0MpJ˒dѕ,,GGτܑ:Pr|.hqكe7Y Lv=-q,rM'W0dDNzo=dTXF}KEW=y+vՐ&G\Ve yDn'bgVJRM<+΋g*㏁ȘIůҫwlD>aLLUCfH΍:ȓ?Y):`nyvcșIٗ"vvejء_MdScFۖd9Ǒ'{6 ߉Leﯿժt?~iHk]Q普E=7W% 뉣bwӥS~Nzs+g\xP"m7Cb5~#;u հn|ةDq6He¡Z kN KPA H2Ÿ| 8<PE{U݆JV`{ocdXSa L3/>`00r} .{lҺ{D{u {jI|7`|T~ G枰9P'wZ~. sOi^æ(S܀Fݝ8Κ&'j  ؽˆ츽9}[rͮ>huɂ]mR]%eEޝ38 [&U0E^,{q2g"\:†VQuoDŜ|K7DF&>cggڷz6KpGhOeƨZZ#OɟΉC͊:6݋&.j3Z|ylԐndRkYkNJJ.BFBz5@G$͓` ǏQXQxm?bݧWGL@ӑ3͒"ѓ3 S^I5=vڱUl9lal=VKF ?BUIG=(09 H |x~sX iBX^kSrqDgf\VpZK마?!-2"N څuT8|Ƅlr޻i<ƒ_kU_Jߦ;?S1 R!D 񕫈{Y(qXh%^`T'υI+>O1S/!~G ?NH*B3zp鹻go].R#UHxJU=ˊ=0a!AZ xeѓ y*oعAe[QG";Ѡ3/ /djxȖHnǸ㔋dóZP[#EƤD:jG.B,HL>ywsmbc1YO(D۔9P,ϗW,PvmldbX\pMxC7 *͚me݊XO4uVpfkP_a0V]LbdAw5w(|l4f~7Wt#qj'\`穖UNKT3@u.3%^t|' ]|{\|||};|e}}db~~!~~ډun_F}E;" {d {˃+|7|}A^X}ɃXn~\ntC~^>Ƅ!E>"ڃYz;zC{?{ω|lƙ}'}Rs$~J]BDj K#vy6ޗyɓ'zdϻ{{O!|Fх|jq}N\@~hxCd`#RYxdyxy&zA2z`{΄|=p|[H}ČwHӲx.4xа]y (ya y8{ zj%h>zޞS{K;{4zk5x=lx ]xy=ygyUx^z9ezQzŠ;8zx3xTy38y-Byg+yyڷvz Ccz9NzFw6yy$Mwڌ`z0͂~zɃ5{ׂ ||}Xk~,Epς/[YBmH!v;x́sdǁBR,S+]с%Co|"ZtBAC!"wř^ VFxSHhnjΆIYp1iA݇J!ҌH)GÍг&Y摌ފm Xi@ [!ł_~~i~ٖձ4~ߔ~m~x2kxWoߋ@Onp!ہ]~nϷ~k[@~d~e m~d~}||f~i~U9>ဂ~|͑~s~6~~<~z~*sg~VT~6<~Ӑ~,c~}K}ͨ}1}7w}Oe}ӘR?}:~?4}y ~a^F~(~}" } f}|ㆯ}h;u}^c}cP }g8}=r{׶~ʜ~k ~ }ָ8}l}N2r}#`}MP|5|upz]կt ~ ~^ܣz}{}}7Wj݄V?pqL QVڄKH^|М˄wH {ՃiuUg>M F0ؔ!SWӍ֪LŋkՃ\mzIhOʈT>Z <֚x]ז )$xĂWg$USa=^;m 3Ԏ %>jOЃVh.ǖ܂4/vɑe/Qpb;ہs%ҝĩ'#sGޟzAτŘtrQ%cP#̑9؀v|Ѳi(d;肖ϒBۂtbSrMaN_/Z7ΔdT~؏v(>3xR1*p ^LB5}*gwaȄҬpR}mu?o\@Iw`2~C4{ʋj ;Ȅ ცÜ<ڋ[ {tԲk/YUF~0l}zұDxrx7qy~Gzј!{ȉ'|x>}gF4S=xjJыUێL|–Q楢ˉi`WzwcTeRņdE6ۂ}J=Ɗ!o'ņ<{ԅ4l/\=UJr4聭uBO3 eOy3j\ОZ⛠HX$2+~IG PeƈǶMd)w'gуWt}Eu/(H}!UQʶ6Ɉxc 5te?WU"!C-Ym {∬wNx1ky 2zĎ{ |$r}`b[s~Pt:ʈ}E F~:~~~Ȝޏrsxcq{a ЁNĂ9.dÅ -'=Ҩ͐Wv5F*~pc_lj1M׈h9l\ߍ[>SH菰I:|u}.(n^nLo8IfE׎ٿ͓qQm鍟{l]K̊7{ޏ rϰ~Vpyw k[QUYJ%(59 s;3S`ߎnΓ)ƚU\wBhوYI˒ HN3g.2K6CBQގ:"Hru2/fχ/W^IFp1탙EGseَ-](zs CdC3U=՚Drc/ؘkKڻqV͌i~͊kppb%cRnA,ڂa ~^5`W_~{ӌt|Wlnw_񆩪PV=?2qJ*Kh <}?bvٙwwxFyzz{lÏ2|]~{KЌ 7pˌӹ}<9+}ږ}~Hd~ybvPkO[Ɍ3JZ6R¸ уv}@H]w׏փ!igZHI/5'b/Q՗ՉQ^~@ v-5'hbTY4H4ӉΈpKƛʎtÒS㐅6t\fጴW?Gz`E40|-S@+fPĒ>ސ rd*V$oE툿32]j5x^/f&O,} pv7bዴT+GD#0=%z󠹈Ñ{Ï^gn|P`DRMjBB],.ʕqM_Rc䧅ʑ^y%6llq^ӊP8@H ,B {}s۞ wu jҤ\dM=)h] d䇳KA(uzh fZ@P{Kg?; $&Ѓ> #~.BvuEwa)xYyyFz>sZ{`f?|Wh~PF3Db'|{|i}V}~~1r~dْVV(8E;2rچ 3͂ Ղny\rO}XrFpzcT􏔃Dߍ1S R#4o:ɛØv {φojSbDS놝CՌۇ0M7󏙩֝& ߋz 3mwˊY`jRgEBٌ3#0;o։pahYN%rAt x"kM^⍛PAW.֏DҍN%^l$Q*Jv%fmi\ŏrNҍ5?e,@|x0 9tJgZ M=܊s'*X Ʌ%RUȝҙ~ġr_(eˑHX뎱KV1;͉(U Mr۠ݝOIϙ|̨p8ϥcVmHe9 %pPϟև ܴzǖհnVAa~T1QFX6""ˆeSj㪄v}4wG[x{!xxByl8{ _|kQn~ B5~/cPT| ڦE|`5|j}(v/}ję?~Z^c[MPA+E.U7IvkmuFyi^]KOaH@--e騈Lʊ+QF~s݅gٗr[ N"g'?/ۇy,@{ "{9K}kr$?f[LIZCbLꑾ0>=. ,H/Ik*ۆW{Vp\Ɏ+d΍PXیKJ/x<Ǝ*vZy~yRXߗ4yɔTnrbnVpIz;^( FϧzƝكܛx5lș#`T GÐE9^@&o ɆՇK.ɤhݟšvybfj _&֛SwEԏ嘚7T *$bq?uή:ިti hg] FP̒Ck 4!mߖW~IrΜqg,ڪ[1NْO=AHU*2RU&Θ3&v܎Nwvxz1.xo̢dydzX||>Kg~<*5k{b|&B4|]x٥t|ne}8c72}W~Jy<)ߒTƁ 䬸𨂀wm a蝁9VkI~;)9ʼn.İ+Mɀ݅AvkI`zфUfHNG:.A(ۊM$Et|Hj_*aSSG$9M( %-PLܫ.}ڎs hy,]lBR2E 7&o` Iݯo}|qlfȞӑH[JUPWȏC䔓66k$~ɔ$ FZDěVzQ`ore4ZNhBD'4픾"([uՃqx4.nPK"cQ(XfL|@kϘP2 )zT) ˪רtw/֐4E(Ղl&77uWGjU`>uTIŦY< \9-ZOpX)wcxzQxpy1fjy\q}zQ|KD~!6Ҁ%;oK //=t|8]|]y6|oz|e}.[5}PU~CR6$u JOĀY%x[nPd~܀ZO4B5A+b$+ c `B|@vޮm kuc)$0X8LMYAܚͅ4r`# zo÷.u "kǩňa٥wWiL@ʚ3#; `}$}wtSj`J`bUK0g?^}2_!˓0 ӎZQؕ#|'r=hd^㤕;TdI =ʙ0Ǖxzozx,{iYqg3]~>R>H E7c~;00 |wf|nܷ|eг|\O}R}H̥~=/ܝǃsAӊ? (A1l*.v'mcdز?L[vEQ GŤp<4/1߅Ì ]T~uɻtl:JczZP?F߄_;7ۅ.k *u}tω4kSbŇYZBO9Er:=-ܛ+/:ɐ Ć}\sGj״az7XaN:D8t,ٗ,|F듹rْwi2`Gʐ%Vͪ(L{B7+,Ζ 0{(.q幍h1_)gU{KAa6%)~BϖgMzpǹ_g1]'TYFLJP͗?[4<#'ҙ/^̏rx߾OoSMf*P\R):H¥>@=2y$r%$ˌwwnUIIdܨ[_mQGh<á&S0"%\/qybvۢyw6zyg{5z,Z{{X||ph}u}q~R~\ cCف lwwfٛx3ykzz/@z{΀|apo}Z~BQ vזww3xVy1kzpz{Do7|ׅ"Y}ez*U{"Zm|X}*@~k 䀽ktQuxtv{!woxn ybGoz`l{^W|x@V}6 TsϢ tџuߜp.v֙wӖ֎xŔ]}VyjzVP{Í>|׌ ~[@sLt[.uwܭvjWw^njAxGzy6hzTt{B<{|Ls5<̏t'u"ҫsvv/wџJxxxfyRzb;{ mzېMsG]t#u%uٯovwbvyxNdSyPy(8z+'GycإsXtkL0u8uQv w^_sx MaxMy 6)yAcRwڌcֆt,Թt ujvv v'w>cqw̮_PxBK_x 3x\v֊Lu[Yvgx9"ygzb{ڀL}m%~[XTy@E6ՈY޲}}X~$~Z~P~Ȱ7~2K~&~kڀ jW8W?}Ã1ܲ|†+^}ǽ}MbX}}Ύ~J}"~ȄjOV)>-Vڤ{|O| N|eX|}\}A{~}iH~U@> )(-،zіA{/{e{D|I| z}Ag}֋eT~_=fj7$(ez/l z·z{X}{$u|"w|f!}/R}؍n;~ƎeZy"z$>zz{@{u|[d|P}$9}~ y ©yzBzz֡{4s{,b| .N|ww8|2Q|6yyy쵭z"Cz]1zzࣆq@{6x_{L{֘5{ݗzzgBz-mzLBzm-z  z`nz]9{J{7p3!zO5yWzV+z:Tzu䜲z{2zwq|zDlizEZzGz0zO x?MՓHt(v"„Nwoۃxʃyg{7zM|h]}T=zj>+ӟ|7}уG}~)~HVyg:St<kѧ_B$܂U×1郤ԃw҃eR`,;߂ÆˋϨ:@Fҁ{J!LPvd-BQMq@;!n͢*/C𒏰ـߢ:n{^:PtOcQrPI:q:=LˋF_%{D͓bra~͎EN8`+=ɐWŞb^C{pC0!_j9LUW6s_"ȩ{1v9L~}~қn&~]t~@K!~4~o-}J ±ƨ USYP~~?{g~|k~L[N~-I ~ G2}|"|,mu  ~vx~GPii}NX}FR}l"0 |3z‰xJĚԅ~v~g0}Vn}P1C|٥O-{ݞ ygbt!`ufvRvqwHyQY zt܆{|c}PɅm:Hȋ={c Q{Y|}<|}݂F~s]vbobtO19ԅtLoƦ6'[uƆq a*pNwL9C*ļR6_م LtZćp_J_ЃMs87ۈ&"-ʇIFȅ9} n׃^;Li 7|Jx‡ @4;N^KՄ{u'lۂ\~JقV5A=҆&۞{jϕOn yZjoZAI3T; Wȓͅ0wBhXtYGD1j7=@f¦du6fuVE1X/}&Ѫօ׶#ǩrVc.TBz,~ O|RN׆ƻ!~󂪲pŭaрݪBQЀl@ 0*n}Ŝ zنſ;sx!tvHwTx}z o{^}1MJ97,,`xzHُ$zM{1j|N.}| }m~]@Kڇ7[؋! @0wсCj_Dizt`l4f=\YJԃ6/z׎̈,s چq/xjZ؆I5ZLj6'QQ񑷊" wKiY&CHm04 ]o`P?Гfu \g&\W܅F)2/YF)-8V㛈yy>y>5e-rie֑UބmE)}0CDH$Nx0wO~Zpކskc X?S[wCk[..Y.0QHt m|FKnȆ`@QٙAY,z .~ڈs@7ز~B1y#lqפd^nOed>,)ـN }R#ѿEV-P?Xwgjd\g6M+<7'LĚT|s @tHuQ9vڃmx0vŽyiR{.YȌ|HΊ4Xa\Yyi"z!zَd{A|Ru(}J'+ݎTVzחʓؘWL}+rVq'eYAKH<#) 91Þ+džٕm{]oʐƖcŎdWkI֊“:ψ', 0dƥ4F'ym吀aێ]Ux>G݊K8ƈO%;_/m֎F4MNwuܥkɐ]_$S6Et6ɝ"T6䗦.t[t;WIuҭWi>}]ɍ5Q:CQ3LՕiCmrٓHsIu(~vXswhVyy\MzN|?S ,T-qIxSy֞y}&zrh@{Lf䖼|NZF}Ml>A E+҅>l-}ΐm'~T~e{F~peYLA_=;I*o,1yorNL/z%o^ȃ$cI\XBփK<6)!AǗ߉.fЈ0#x܇mԗUb.Vݒ8Iɏ臡;>ӈ)GV?iX6u#LvǙZ}l `”0U#H+J9č('c < /ɒtoj2"D^擓aSG F\Ď8"% *ܡ웾lɚ~}MsHhv•'](,QDEv6X#MօM0䢗z|ORXqoef|[VܘO>B֗*4Rj!9;vrЃm çzdV3ocd`YBM}@`w1i>s\;F7_.䯘x]mݘZ_bFWogK>H"/-|~ےAs*t!l uuv:kjwh`֜_xUczyH|q:)L'ʒ ̐ͬnx2dx~;yet3zj=z_|{TT}6G~9)O' }9%}t|äv}rס.~h~{^/)SFr@n83&RP KjoJ{Q,qbr4gl"J\ƚQŗ)3EC}>7?%1 cfˇEyoejC[ccJPshD<6V5%\t wBPvxUn[<dWߊrYӊ&NӕҊB ~4鐋#u@ 57pv0lڏbvXe2M^@ؒ36f!Xے؉7MZ ~楳u4ߖ k%a|VcKl?5&1dJ%(O"C}[siJ(_Z՘TxI=]/Y猁JR{rq֡Yg<]uRG];p,܎ыu2σ{uz pCf2[͚PeEĔ&9**h$o+s}رtuUul "v~b`wXȡxN=}z}Bm|4Q"w q_x\|ɰExt2ysjLzazW{M}@~3:!Օއ0 ~|{~}4s>}qi}}`n~*VbJ~K?Ё^2a!: rほzqƪ|hw_U}0J>"1o ? n\9ygKpɅg5]Ԣ1S՞IN=Ϙ80J )x#o)Beƥu\XRV$fH|6{߰ܣeril=_֤`V&uKbAWSo5P a'Ϛ8zuq*C3E&Frb􉩀ssTjϴVb5Y=CP1蕐F6<1wJq$'•Kr@Ƞi0`دfWϫvNvDG:Ȝ/]&!𗬖qh\_DYV(MXVC9a`-} k> v#rxwswumxvyx zy{{{m||X~:~p@^o~tzqu{lv|Dw|x}Wy~fz:lO|W}j?}w^s 2`t9&uu*v9wx}zk {KJV||>~6qJۗq6st^u7Hvʈmw| y@/iz{Ug{ֆn>}^k_p|qԺs\tau+wzwxhhhUyDT`{A=m|e~Ao;q%θNrFsu/vmxawfxxRzN\;{}b}vo &~prUsbtuޖvwHdZxQPy9z| {ҟnɯP3p/eqOr棟Qt%݄OuW{sv)bZw3O5x̓p8yylnp 0ZqodrsѦt{qv`.w!M$x5xx1np7}qKrvsvtXo u]vJuwYU3Tw*v䊩oYͰp|ɬq!r ?sT}yu5\uɹvvuvwzyx{jxxYNyFyi0AyF x^*us:ui}vv߆w[wwͯ9gx>W x-DlxO-x8 EwḘprY`^t3Iu9wSÁOxvzd|1QWw~:bʰ5xR 4y=r4z9T:{C| l|t~ cV'P.9ۂȬ~)|"ju;OUv@s߁bG9O܃9˄΄_1ƞ}͇}.o~&}~LPm~q~q `x}M8:&TĎ|ҏx}Wt}<.}k*})}ފMo~7_Y~LP7}$L^n|e|R:|Ù_|Ē h|}|}5 m}]}~K[~54}dh{yx{ȝ|s|H3|nz|k|[}SQI}Ď3~+{~پ){?װ{xƢ{{֞{x|+6i|kY|xG}2}$s |{,a{Rܠ{s{{vX{Şg{Wz|&'E|N/| {&{T#{iS{w.k{|3X{t0s{e{ T{C{-{ uyƇ{٪ {G{;]{m@{M:q{D1b{8cR{'c@z*z >x?zp>qŨ9s&u8v_xapz_{M}7oۈyj()wD\xEyWRzIH{F}|No}y^~LjR6j56~qp~Ϥ6)a|)fm]`KJ#6>vt)0քOzdQl2\3J,[m5HنËͺ@=͂HZx!judZk6I 4 =¸.Qh$ZEc vٍhX߀GӋ&25ŜAV~.s1 Z*/txQyf_#VE 0߀:"S :8/a̞KscrmЗd`nToCK9.~7s%SL4)}pSh)bGR~ߘFA~,~ |΁Q f{m_~Px~Z=?L}䜾)| z{iڿ > y]k~ޫ>]~Z NH}ॼ<}<\'s{暬Uy݄nvorgq?Pr [tlfv3xwjy[Ib{Iއ}5)Y`EvUHw]ÊCxtD`yt~zwM{is|Y~KHD40{ʈĊ-.}ȊA}L~~u~w~uhRFXց1G}3C;6ۊ1Pʙe)ătftWI JFf2ăd*Yۣx0ʆd_rZOd愺UJEP145C򈲑א#h}WPQp]gb T,C2/ǍX,+\k{4ВjnD`vR:뎷Aj-؂Q$𠿝|,@y6XlM_2PdI@2+ր0 بݏ kw.jG1k\k1N`j>)W) }نԥև̆ލ٪f٧tǤhZ[K3t;J&~"|S,Ɉ*cЇ ̅ԳyrHfVXÌ.9$$8}}{ìoO~$pqr)t!~ꍾur;wse ZyJV:d{ 7*ڎui}ڊ5r4ʖfvYqg KW<D(Z8 |(d򒯌颕|V0{p@od+W{IȖ:R&;_Kw@_J~yʉˤn7VaކܠU9G1F7n#2;}Ѓ뎟鎸ƃBwl4_򆗧S=&EϤ5R <|}dښ)o&np&re.sw'?uk:w4^ЏyP{A}-,_Պa>"tԗvwF5xSucyhiz]l7| O}?ዳ,HgkM2z֔34{}$|.~Y|t}khC~4\r)NHh>ʊ9+Պg~?זӡ o34~pr-ysoVu6d1vXxKLz6N$O ·Ϛ%z yHo!veZڐOC 4"k])ܜJs)xZn/cLY'M AU$37E T  }g"#(X~vؚlnoKb(WMǖL?p13?ɂU"r~|tšjvO`%ǞU>IC=.E. 4ҁ,2|Jrh4^cHSoHH ;ģ","z*OYovҥKpz#+rpKsgAfu\ۙvQ'|O~(C3k54c #YV _ʥ~~Ѣ~u lecXܗRqN=ρHB48"j g}ktуk#aWL@ȅ3GȇN!⎈C Epq4{erD7ҏ( )W} ns٠GjamW^!M&B;_5̢̎'R.gpox>q-p7rggss^FuTՙz1=]}R?TNc9t|w&ueovSfDwK]jbxOS]yIk{)=ʘ}#0NwH2n~D_yuymާzHez\7{R|H}<ʗ/iV2BW}$}t˩~lC~icŢ~Z럫A8"}6#)[]щJwރrB}=j}zb୾}Z~Rx&~I~a@":}5*.>(nF,op:qHi|aϬY QYGHbƂ? [44P-'ј$djpD*8:Ď/֙}#_Blֳ*dɯ-\ͫ T\BIKףhB㒾9#lf.#|?iVl@nC%:pqs(CtuUvI&cw݈_Py:{a~̰k̾NmKo( 6pOhr\ssCuzbwOFx9z_:|rHʀj{lܭxn"pqLsHptܑ`v]Mpw97yBAKzDy#j=al 5m좺oq%z~rnt<^ u@Kw50x%xj{kŮmGo)׋np|=r7ls[u IvE+3ww0åj.%kҷmopDyqBjsGWYetqGui0~uÙ \ufj_ƶk[mSolp`uwqgr㩢W+sDt.(t 'tͪxblyn(yq'zRszu"V{vv|xe}zQ |:܀F˓vt߽w{v+0xSwyxēyzz{8t{|}c|}P~-69ف*Utu|һv}a1w }!w~xysz;bi|Og}Q9~G =Jsڹt„uބ} vԄ\ w̄E|F)|J ,{3|!Ț|'|'|"v'|i"|[|tL|v<{ݛ&{Zz+|;0|*|{t*{٫eg"{ŨkY{J{}9{$myĘx@eKkmoȌLqstAufwWyF|72U{qFxrS>Rsu261v=wrlLyTezV*|Ex~1Oox_#yʕ;zo${{}|Rpڄ]}7c~;TބjDM0S؇ot KE%{o(oKb:Sy&C#:/d2!| Ch2y˅m~`ZRNBkJ.֋}v|GVً탲v9wkʉ^zP_5@uQ,݁Պ3ߊǃ|@?H󁜁uvi*\덛N{Č>*U ׀o4+Eǘa\sg}Z؀HL <Ґ(p- ~XjbEo}qzeXJh:&r~@2|ޝvMҒBө0N{}ʤoǀ5cuAVH6Hh~ԛ8W~r0t&{$upaveB'xhYizK{<ȊV~W)ӊp݉{`Iv񍒑w,xyyopzcҌA{X%},J9~;~(݉9 x1D|Ӌِ}a*7}w؍~~mw bFWV?Ii[:B'󈕆 􉙈“\Ԋ'݂{Pv5;k_`ŠrU5]H#9|օ' {$p"P$~ptXB%j^SvF} 7%iP f c?~|rl6hQ]!QD6+(q#<v j愛z⌕p4fMʑ[FO҇fB\4wXs! pсރALՂΛXy =nʊԘjds_YmMAl2wR1QÍwl bb]WV›Kӆl>ƅ+/܃ϛ ʂ'Z.~㍚|u4njmz`٤UqMI S(7HVѓ< D._G0&wRnڑe<[FQ+[F:_9ˆ+cxJMv.m!åAcȣYÍmOOܡD^70s)D0D_k|m\tž(o kɛpbƙFrX—txNAvB7x4D{" υ`Tp{qsosAjrtaiUuWs.wM yW@W{o31~:!4$Quz9v}r&wwixv`lyV1KzKޓ>|/?ۑ{}2* QH&.^zxɝ{5p<{g|^}DTؔ_~.JRJ>1$ xTwZ oa]f8]J-SxIUj=0*F~5ͅuĜKmvdS([GQŅG<.x]|1t/Ck-bЖ͉YؔaP;E&:=X,팵ɐ'vʁ{ ǐrIj#1a/RX-%NlD=8+>1{א4р#yoyph{Y_Vs4LOBs)64);J"wNvo&ǜEf$%]%T;KJ@`4rf&v3me9[%R͒VH됱=>`2l:^$%pzMl$rmko9bpZP rPutcGv};x.Q|Ɂ ry+pqoqiߣs#atlYuOƛwRE y!:{R-U ~W攴&ۑ5Iwup8vhw`MxW*yNz[D${9},d4j"v ynzpgQ{&^ {V=|Ml}CǗ7~8v+sKPNOluw9~m(~f]].UcWUL6ɁBQ 7i6*j:6ttlBvdU\6Sٚ;JAr5{) iݐ6rեۈjۢ߈qbˈjZWR1"RI?c4=f'j⍄䎍S 8qWjiaiaOPYPGm=Ȕ!2O%Đ/;og8`W!ODEÖ<&0Бӓ#|Snb՚GfRיu^UUϛM0Cؖb:̘.o!-V ӌYlndᡰh\۞TGKȞB( /8;},˔ W凫nڳZlgįn`۬PoRY3pQrdHӢt6?vI4x( |)Sn=pf⮿q_5rX9t%PzumGΡv>x3ќ{''-~v85[bm?teu^:vW1wOtxFԠy=Ɲ{{2!}&U{j8kXydɬy]MzZV {NR{E|<~b10[%zƗI߁jjy}gc}\n~>T~M4^DC;Ёu1ID$$}3SVibwD-[OcSkK͡C::</#LXnJvT]ha>Y(R JHAy8]-B!8Flg__*XNPƣ`-H۠'@07],or 01f(+>^ÐWJAJO]G[>35k5* C dݗG]R}Uɦ.MEm<Ŝh_3mt(`͘$qZ \Tc\FQTvϜLY{D4;&-199&W` 'ohbpk4r[mڣksp&u rvrtvwvdyxQf{{:T~}^v mqZo-rptrKv7sw'uay twzcTx|P5z}9o|vmkyJ6mz4oO{1p{kr|ԂtT}s v~obwDOyˀG8{Ƃj k򁹫m㝑oqz'sxT)OxxZyxtpqrçsvUtCiPuX[v&#Lv؛<w[&v7x pkqrysh1tRt6gNtYuGJv2c9vk$?ukyQg1jIlʍoqVtCsguW:xFz1}aۮ}nףH~p~Qrr ~t~us/weey%VgEzEc*}0Oֆ!|Nu̡V|v|x,>}Ty<~E}zUqt~{ld!~|UT}D8:/FSz|؟T{P}c"{}U|*~|s|o}b}HS~`CN2.̀-oyTz3z{{z{n|`|RT}r`A~h-lOsix$2yycz,}xzl{6_{Ո!P|@d}s,Q~u<qjĤ`wtxNUx4>yw'vyj z}/]{RN{>|vm*@} I~V#w wkxLʀ=x͕7tyHhy͒4[:zXLz<{8(C{q|wvwBȉwҝ~5xMrx™fywBmzu.օ} }!n8|Poq̄sqyVu%mv`QxQ zA~|-DŽWu3tu#w6xWwykz^{P}o@J,ăՇơG{a|5|}[u怜~ i݀~]YO9(?b+΂6MΟK9VdJt+h:[BM݀:>D„*火s承8~撳~G~3}G~r3~fU~ՇUY-L*V8<̇):|| ?H@}Ԑ}ӎ4}{9}Sp,~d\~X~AIJS~}:~̋'( 0Ɔ6}! }9>}OlyO}V'nF}Wb}kVE}H} 97}ӎ% }n}фY||ǜȂA|֛wY|ؙQlV|ϗ`|ؖTa|┰F|퓷7>|哗"|O9 |||q|b|Cu/|5j/|s1^v|hbR:|YDl|@4{zɕ|S|lGk|j~$|bEsK|IhN| \|PU{ܢBk{2q{ay8/ =g?$ikgl8~ˈnbtphkr\7&u%New>zZ+h}]׆3ndm}osqC}rrrtf݆v[Zʆ-x;Mz;=|*V N sЏyuv^{ldwpօxe^z Yj8{qK҅}<#)O1 pVĆz܆DzȄ{yJ|Qo"}cÄ|}W:~Jx ;Y9(U鄂 _]䅠W)Kw=@myɁb/{VnAyI%1/:=U['j ͅ|ꄱƊDSӆzudXk@`[7TeIG{N8`j%Ȋ P!~U""ti?^s늟ŔMEwJ6b#nρNP/()|t&r+)ǵ4\<]Q 鎨CY54k!n 2R֍Q6xz zpGeZπO6FB39~}N悤:2xjǟzn-Ecր1X7M?>R0~+}& Ђ\$Ev:lWLb[}VТ KC<=~.e}|{;Ygi΀̎lv؍un=l׌fpjaՋrVOtI("wa:RzK'B~C ύmHUlo 2IpuFJrkHPt9`\|uTwG2y9$|&7_ <ɆDr5tH} us/viÊBx)^{y~SzFF|8~%7 $xĄy{ʋzr{kh(6|I]mv}9R:~LEfR6$B 17c~.&zpaf1[vPӆ΁D#a5φ1;#]芉R%x;+nFdƇ^Z,1O{B4E@O!vӅOzkvQHlbކXMrME>c@2Jo,I&ΆÉc}ՐtjՆHaVJ K?0̓ZHّ--݉P+{crj i_ATI{=+5.тs܁)yyp f,~]6)?RFEGa:,A׀ ꧃wԇnцIe.[lѡlPݠÊT8\)񀨜\~8 _gixknӒnep![8rNPd}tC荌w+5z6# ~.l~nvphm\mr dsYՎuOwBy4|z" Tυr9}iVsutkݐZv%bwvXxMzvA|V3~!)Ww{˒@xshyjLPzla${cW|rL}@S42g%j KA} z4<}q֏~IhȎQ~_yU/K5 ?Â:1]=?ւxudp =gv]SIÄ=酈/׈P<d1Svkn6@Ve)߈9\s(R <5Go;'$.e;/yj*}tt7lycnEMZS،PfFo:k-,]~5{#s Oj/aɒXVND2֑c83 *]'|4yΏҜq:` hݚ _pV=LBH5 'ÄSQwom&{gB]!,TʼnLJˈ5@IƟ3gt%hݙK5~IgvƜ/io kfm]oTDUr Jth>Cbv0zz(h% }HluinZmpe+q\ sNRVuHꑹw%=#nyr/|jl ZH{՛qsrlKt.c˕uy[>vQ\xNGĐy< |.~zzavrwj̖xbWyYؓzPiY{F}:䎅~-]冼Pzx{q |SiY|`}X}~mOZLEFǀZ9,ۉVdςKwPokKg_C# Vё:}MxC83+ˇN̋χ݁9uɘ=Vm˖Uce`{]~UKAݍW6p)@&Pt(lċdGˋ[֑eSUCIXO@,4ËS'Dre>;jpQbTZ!tQDH:Ԑ&>b*c2芬%@Qph`_X:O&LF:c:3|&ߐJcmrEf^PWDO/eFe'=#)2.J%j ylфDdh]UUmM}VoDF;fK0ta#4B勫Ѐj>c Չ[КZSKĉC9.Ώ!g"h;i ɏsa`#ZARIJzP{H|~@}7י--V9$ ̄hc8}\x~8Uۢ~N%qGD['? ؁6]oh+rizL\!?b U[/-ThDME=iB4܅*0ψ&,( RqT݀`k]Y̤uSKD-2&;ޙ3R(6 s su_e錬XtQ3J&|B:7A{1S܎&pw^!W gPPHu,]@ʛe8J擨/?}$]d \}Wsvntw^vyKy${{5{}x4ځgtA,j uvl7w 7nx:p yo{qzms{\u|Jkx"~.4?z(1e|jhF}Wj}7l~)n~yp5kkr[HtۀNIJw3sy}kd6fOi.jIkSE&mv!xCoiqYs̓H8v2xyQ|" %bȪeN g/j5flhv2ngp5X'rχFu 18w1 z|iax Yd.giJk'smeo͌V1qߋwDsz/Lu8 x͈`l cYVf!4hk+jqlϓ2cnSTXpCCr6-vt= wIUJ`b£_Teugƞ}njZolan1wR[pTAUq֒+grYiu_xbǔe8gjc{i9m~kQ_gmPo9>p1(pIu`@_θJbVd.gyi%ktk ]_lpMnifxihtxkHynt0zqf{sW|vE~dx02{XtQku_mvyoNweq8xPs0ryTue zuw U{xD}[{#/=z}["ermrPsstuAuv}wwpx&y=cyazTxz| C_|U}.S~[Dpyrznsv{Dt|| u|oOv}bxE~gSyLB;{Os-u}?!J*Ϩ%op:rs sXzDtmuՂ`w-ZQxA&zPD,|- †mqoSprIRx4sktن^v2oPwK?y=a+z؇W }lnK^pqiv r3isf\uRN$v=x )yM |*kΗ_m|0Ho:p>t qgs+zZty8L\u6<3w'(wzegVk:=l❧0n}oqq8erwXs:Jpt:Eu %vAxjln={ioopecnq=Vs :H't7tƘ5"Zt3cI|#jɱ-lUDmYyso%mpIa~q_eTrg9F#s85srC~i{c|fc|i2r|kz}VnJnz}pa{~sIRmuBx-G{ yyjz;l znȄ{{py:| rl|t`}uvQi~cx@z,F} أwqaxrގ-yltnzuwzw6k\{x^|azP#}\{?~}}+Q` U ~v"xPwy59xz( x{uy{iz^|]{F}N|N~>}**hD: 'φRotJuTv >w_tx\hy</Mr{E=|)~0 ākjHs_Sty(8u}1vrw\f-xAYy5KzD;{ '|ׇ 7rFxszÆt{udpvd)wg,WxSIyMd:8z`{%{E/}qݎ{rs钁yt֑Unu*bEvUwx)H*x]|8yDQ#y{Ӄp𜀌frۂsJ6wt1lu `UuwTvFFw}!6x,!wY|p4qrztsĞxit{^/uLQvDv4&w7v s=N~peh(qz}rzss`h t\LtġPue-B u؟1ust <yc?f>)h_%kit6mhfpe\ZrNR/u>~x]*c{ Љ-:~jfAlbn=}p)rr"g%:tZv*M%xH=Iz)V} ;t}Tp{}q~s{~iuq>~vxewYyK{-<}=(Ty օ{w|Aw|yz"}#yo}|zd }{X~n} Jh~E:'^^W -U̖zX}z~{~~xa{m|Obw|ʀ!V}YI~ 9~&wJ y&HyȄIzrRvgzTk{R_`{τvT|]Go}8S}ޅ$~ˁExxӊ~yt^ziz{F^zR{wE| 6|*"}Vslw^ x4|xȐKryyBehy\z#Q*zC{4{ {/}%ЎVvǙmwvzx+pxnf'y"ZynOQyՑBz8l2zQy\e4v_/gwzxwȝnix0(d xXxؙ*M7y&?ya0wya |x v$fvɧvwrlwˣb4x WxNCK^x.=x.=xGrv .ccf+.hx k2mׅ=mbpVrI!uG:xx@& { QYi؄~k}^mve/ol=qa'sUuHNw9Dz%Ӆ}@zo q7~rttJju_wRT>xGz8} $̄߀:7euʆ4v|큶wsyiz^({0Rˁ|hE‚}6#у8C|d]|{+{}GqRy}glp~\6Q\Dy5߁_"悩0DUnHy7woj|evZfOB`4Vtv!0Oms~ }~]|w;~Cmt~ c~X~M~·A2Q 逃}dw~}uZ}؎)k}a}ڌW3}kL}?c~0~3~8~l|ɖn|}asr};[i}?V_}1]U`}0JF}-=}/.}|_|\zz|qZ|՛/g|̙]|ST|H7||;^|X,p{zr|x|JUo|{e|d.\|1Q| Ff{ٞM9m{*0z霆xԎ.cË|f*yhppkfpm\SoQ>yrxDyOu5x," |oiQkVx]empnoXe^Fw4Ç}z}!~JĈAnhpvr.mSscu5YvN\xBAzt3u| )}vt}Futw k_x(bRyMX zMFE{@˅4}e2l,ȇv;nzx{ {=sS|j7|`˄}Vn~_K0Q?)1ui<pn ԅRizqt9h?A^́TڃziJ9:=+/V\=ʄ+_px7soچfYs~]SHi^<29./:atN~vO_vm!d[X;`QE%F:O,!(} {tnĒk|b‚UYOz.'Dɏ8rT*HW{rpUi`W Mu8Bހ6(~{}y#Llp#h^*UKTAp4~ѝ%}~S|= ecyFf.q%hhŏ j_m*wl0w9oϊ:jgƉv_.VMjB*7K)ZTʌTv?Hm~f ]uىT҆KNAL`5Ɗ(Jw It@l4dE[98S EIr?3˃&CAr]9djJtbQ YkQG֔=x1#x3ԉpޞh`@XJXOU\Gw dpe|f@hh`͔djXlOCo^EnUq9яt,ZAw]|@\+vhn#jgl_v-nzW;pdMsrnDAIt8}w"+A0z<_ uTmmo+f5jp^rKUsLƏ`uC@w7wy*3!|isrlsdAu \vJTxwKsDyAލ*z6vf|)%A~aqwjxc8(yz[7zpS+_{uJ%-|@}5SX(# .)pR|hڑ}ka<~Y~Qw{HFQ?+X3NJe&RΊĀnđg6q_ʏuWŎ;OF>=?e 2n$E~nm?e^#VfN'E ̈~;0]#-afkMcяi\r#NTjˍ%LMaCN%I9ˈ.鏡!' !i;0q3{tx&eww}.߀lShegj^lbW n4OfEpFr= tX2sv%]z.рkmdn]^p>UїqN7)s`Eu<w1uyl$^|Di|qbr[t@TyuLvD`zx_;Tz0^|1#]yH؅h:cv@aYwKZxcS(ynKzC'k{:)}>/K&"hm'-kFxfb{_Ԙ{Y |Q}J~[A^8-Ǐl mƉ~eT|^PWl6O/HYe[?ېՃ'6ڏ\=, 5'x yc`\U=NYFF>;&E52B*bpTo 5b-![-iTKL4El<3n (\O`!YR9Js C0F:1^g&< wVI_DW񕒗P՗IQ A*8׎|/֚$-mvJZzbϨ:d\yfVQehoOV jvHQl@-n7zqV,ҙbt% w ~78ah[hjIUEkNImG>o?&q6s+Kvz K`lZFXnT'oM3qF1qr>(mt~5v*:y$| XY }_UpY 8qRsIKtE[u=Yw4|yn)*{1P Vπ^ ntWơ#uQwJƜxpؚhrjt7 lutowUfq]xW5sz[Ev5{/x} ~m_aw%d8xfy%iz4kz{ rm{e>p |Ur}Du~.w |V!_&rb[veΊg~lj iqVlocn T~qUWCrs.2v\ {u˫]"4`džɔcrf@ |XhхoZkCamKRp1Arń,u( yۅP\r1_k&[bMe!+z)gGm@j7s_lPo@?qZ*sSr x<R[kU^\7ag$:dx fkHi5]kUO$n>p?(qIvƄp Z]`bc8Pveޗ:iEhTI[jÓeM=l Ń~Bk?fϡNli4nkpm~qpJq7serucu-tTwvCTydy-|{h hnY:jplqEnxs|fpEu6orvbUtxgSAvyB1xE{,z} /HfuhwjxXly'znz`r|KQt}VAw"~+y l~d}g~ i[~{kc~xmnilVoq_HqWPs@vo+*xer R}Acc1/eg]jvl8jcnG]opdNry>t̄)vޅM {ˡaߖd@f֋E/itk*hSm>U[so[MqjLzp{)|} ܂Q$kt̕muoHw px4trZy^hszz\Fu{MwK|=yK~H({ WYj|k|0m}.~8oV}s.p~Yg@r~ZtOLvDgQnIxwn_dxbQxea~yh-szMkh{*m[|'pM}asV=rvI(|yiZ5u+fvhrwj}wm rGxohfyqZSzsLE|rpiedka^ulݣ_kn~aoMVtpk3Jqy=Rr?-rxpr|z_t|bIF}=e's9ށiv"%yzш,zWeÉzh{zjyva| ll,|na}Qq-Ua~sG~u8Cx$i{_zqxflym~yotzq{j{CsA_|uT|vF}x7{#"}僶vr,wks|xJuryvbhyw^ zyR{zgEp|{6b}}"ۀEkčtxIuy{vzq>w{pgYx|L\ys}(Q3zl~D*{#5K|ـ}!~6su?t}yu=oKvwevwaZxOpOzyIBzZ3{ }Dir,-;sN wtxmGunc}v]XwIMx9@y5M2 zE{;~JՇbq9~-rUusxketpraudWvLKw2S?xZ0`x y 0Qpo/|+q7srDi{sZ_tzU/ujJv@)=Gw.vwvڐ32oڛz plpr#gbr]sՖS#tH u^;u,v7tՏKotxpOoqerj+[s.QXs朻F }K/~2]Rzi€Gwxxoy`2fyQ]pzp}SLzH{bbre)iԆVg`jnVmLo?Cr1ZucyqUfe;y3g|qLihOk_En4UCprJr>luT02x= {#ŀH |7=|4;1|!#{ϕ@4{`q{6Di {cLa{kX{O{FM{y<#{^/{!b!8zrv zzz-_rubpjebgZj1PlF~o:rv,ˊ̓O2„%- nifӃG_^WE8OZsFQnt30wC%zN׎+Vրl`nqeLo^b(qjVNrO wtFRv*=:w1يz$N|")jōshct\uULw M;xXEy;Љ{?0}#|3ibxbyl[.z^S{PK+|TC_}n:6~/(f!#?gO}`f~^YmQ׉ J6?vAR8qg-j 62 eaX^WÈ P.&mH]?톴6Ɔv+1m ŇCc/\މ0ފG534)넨Wu=ǃb-[ tj,v!z( /rb'm}\`oUqpNؒ1r&Gs?ou{6wf+ˎy| ԐaurZs]T7tM}vF[wb>.x5tz*t| 6_铳vY^nwR&xKz D{-<|p3ߌ})&gY Ӌ^l{W̑r|QL:}gJ.~;C :׌02'csGt Džq\V*{O]H6Ab ^91E0m)%TLkӄW[oTʆN#Fv?I7xF.VS#Ӊ=^H*YrSwRЏ+LHE΍I=̋5,!{C,lWʏ˓Q0%JoWCw8<3ƉҖX*mٕ@y\*`VGbPӞgdJ'gClis;^k3n(]jq6 u6{}[ldrUvfcOhZILj^BNls:w%n2 q&'e@s2w_, ~ӀZ<]hlTJj$NkG mA8_o9pq1s&uv_6yۀX lzRHnM3oFq)?-r8?t/v%cy4t|ƒ6WpQ qKTs\EXt>v;7 w.˓dy$Q|:KׄV7uP;v3JbMw]CЖx=-y5}{E-8u}"ő]?xTyNЙ zHЗl{B.|;}=}3Ò~+n  G茍ST~MB20GO@9u2 !)84.HyQԙ KxE•䄱?UZ8=00fll'=_BqրPRgAJ ܉DMC=?6Z.k%ŏ юC TFNԏHOBzƐk;.A4,#܎ѕ peZREgY]•i(a`-kd}?lhpbnkbqnBSsoqBjvKt ,yvK!z^bb"*ddޓfgQijO{xk4lnmiogasoqR_r4tDABuv+Kx5xka| _ib7ldn$ogpyirm&ks`nmuQpw@&syl*v{+}~u]-qΙ_s#bte5uwgw1k}jhxr^{myOoz?r|J)u\}|8%Zy]zU`{cj{v7f7|ih}+\k}NsnV~>q=>) szӁAXk}[с^aށt7dŁgg[4jKLm>iIhhS}uV+Yĥ_u>\j/_^Jb"bQdpCf!3,gњf=iZ kw]hlamndwpgklqj^snOup?xjs)1{v{硦g)ahd~jgtNljvnllipVo]r^qN~tt=w$v(Rz0x}vd}i[fkhhmjot_lqhNnsd[quRM=sTw1~;Xb~e~d~gb~si{4ik^umRoE5qŁ5t!;uH/|'Ia(0c{eqh)gjP\l^PnnCtpr4 r{U;s~[_⌂pbCyd:of䊥eiZk(Om83Ao$2vp5Lq ^ܔZa9wcmeҐchXj MNl@mڍ0oSn^+-`]ubke{ag Vi KGj=l\.Imfl]U}&_psb3id=_f<#UhI~i嚛< kx|s0z:~6|Zq=)mUzyyn{TppG|gq|^{s}nTHtX~,Iu=w&.x,zY2k0w|mT_nnep\\qĂ*RjsGto;Luă,w"Ywo~juwllm}co SZp7Pq.Fs.F9tf+2u9u| is~k ;klbnXozNpČ=DKq 7sH)Qsۍt hyh2qhjA>hkӔT_m0}VnLo,BKp֑5qU&rrwh4otigk^'lbUmKn@o3pc$p%|q|[W{.}@^Mr}a]i~dA`Y~~g:V#jKcm$>p0r6s]U5v za,yo{#cq{fDh|Jh^|k-T}mJ!~up==wr/JuCxxtgwy(iolyk4ftzm4]m{hoBSo|8qMH}su<~*u..xC;"{^~7vlluwEnmx%p;dxq[ys}Rzu#G{v;X|x-~4z>}|Strtut&kvzudchoXjO]mUDo8r*̓uyw}f}o~Ihh4~j_ lW@xnMpCs7āVuT)xz{v|ln=|{mf|or^+}qqU}rL`~tBn&vV6xM(-z~NtHz=qlzrd{YtW\{uTV|svK}xXA*}y5k~{p'})MrdxwjjyEx\cyyZZzzKR{{IIZ{|P?|l}v3}<~&~Mipw1}?hw}a)x~tXyG PyGzi={(H2-{܂u$c|}~ _nucfv_^wpW8xOxhEyV<#yn0z"{ |-Ylte u]veUnw }M>wDx7:ex$.y)R yc zjtctΐ)[uStvKGvnB$w"8hw!,wǑBw ay/Xhsma9tUYtQuFRIu@iv b6vj*vpkuYxr[k1g^cac[ӆdSfJi@̆l5#Vo'Xrvq `icDbmjeZlShR]DjzIDRl?o4r8&<8uPyÀodehg`惼jXlQ n'H pA>}1r2t%)w{mk(fj l_InWw2p@ONrFs=;u1ƃ]w$kzs߇~kLpldŀkq]s-UtN4vE`w{;jy0z#}I,j,~ub~v[)wT?VyLz#C{P:c|/~9! hs}f{Ha8}|Z}|Rm~"}J~V~bA~I8~݀`-bF~ Wf|4_e|yXb|P|iH}1@E}k6}x+}(~H /d{'*]{oDV{mN{G?| >|OZ5=|x,)|)| }pbzJ[zTzԍMzEP{<{663={EJ'{=zב@|)`yYyҔ|Rz9KUz (Cz*Z:z1#1xz#%yjyzi\bȍ^\saXTcMhfDeit;!l_/֋/oY"=tr Lvh)`a`ZcZebSK_gKƉjC,l:o.q!&u Ǝ(yfel_≨gjYO8irQkwJmARo8Bq-tr w} |e jj@^SkWŇmPyXogI q6@s7u,7wJ;z, Xcjo(\ĆwpVE'rO szGąu?fv6sxU+nzR} 0aPt2[uUTvM[wFXx=DŽ=zK4݄:{)愂}Sz ]`yPY_z3R̃{#Kh|DR3} <~$3 t()6JDŽ.^?~WiQ y IIBj:XN1p}&v3 \z̈́U⁢OhvCH6C@ 78/5$瀟kzZTŠM+FNR|? 6̌-"lJ~퍔qX׀;RGKÑDv=Q4~ɓ+~h f}}p~`]O\BZR^SӒYa[L֑~cEʐf=i24l)oTrTpUx#^`XbReKg`DBi`d8 Ċ80='Dq 'PxhOJDΎD&0=R6Z.EE%h. ڂVe\nPV^K$a,Dc>1f!6th. k#5FnrOOqyU`KOmbsI旀dCXf= Ai 5\ek-n"4pCt T|SSۘ}d=N3Cf.Hh%BYj&;l64Mn`,p!;sPCvp~RhJLjG[kA m:oy3qq*ؑ,s `vEy~oQ$ltK\mF;o?.q-9]*r1אht)vy W|6O'pIr#Dps>#t7Ðvk0=Hx ( yj|U9NHu 0J?( bڌG~UAdj<r05yI.{'$]jْˉXxaU\cYe\ng`zt+i{dgkge[+mjLpcm;sip%wsgtxmr^]``ccB}eMfr|ghfjikYl\nnKQnq:qs%uSu~zv4[Cd]g`i{ckpemdh;pXpjr?J mtJ9p|vk$Xsx?}|]X lc[n^!oy`qro cscWfxtViCv:Hl w8nyU#qz{~#U>t X|u"[vFx(^wMmqaxYadyVUgzZGj}{P7mz|V#p%}]Fz?”jR{yVD|&Y|v#\}$k`}_c~Sf ~Fh6Yk!mҀZz9PTPTU.~X! t[^i^^"aRdDpgX4i j~O &R]||Vr*Yщ+g]\e`PxcBeʇ%3LhhT M QizzU3p=Xe[nZ^ÍlNa}A7d91f"jf}LPo@xTT6n*Wu@cZX]fL`N-?AbM/[cӑF;dUQL[OfvpSPslZVb"YV\hK=^=`-aa}cutfUĎZgY[]iJ]yj`nld c/nsgLVpyjHrm8sup"y8syHb\Pd_xfc whemHjhalkhUnn+Gqap7`t!s{"wqu^{"_dDNbfddiv2fkIkhm`CkoT?mqF[os6Yrv7!$~}g\k?_]mP~botcdpj fr{^i^tRkuE!nhw[5Rqy sz?}L Yr2\t|_uLrbtvjhmew]?gxQ{j9yClz4Yo|r}dX| Wz- Zzz]{sp`| fc\|[}e}EOh}Bkk<~2mLYot~.rU}X́x\*n_da΁YdyNg!"@ia1gkflބ(*SW/svZl]qb`JDWbLqe?7h/jjCRm}U؏tY6j\`^V(a8Jd5=fk.)hD`hQ@{TܖrX;h[q^]˓m}/p~qZl{]Pr`Fi)bĀS_e5UgIiׁM=l-no?u[X͆y|[p^SgNa1]cSYfHWhQ;zjc,mlxm;9BWtwxZ[ln]Oen_֌[bN{QdFfڊ9hu*i$k~VvuYYZl\Jcc^ZaOcJDeaC7f3(_gSj+|Us`Xij[[a]XE_uMb xCc5eGE&ReiϊnVcoYwp]Cmr`csJcY9tfMv9j5@xmN1tzmp~ s{|k\~m_unbl-pe_b}qwh!WsjLtm?vp90`xs|2u~rhca|jet l[hjmjPaolVqanKvs5q>{u#sA/VwYuzMx$ f'izh$kr>j-mhloY_mq%U orJ.qt=Ssv}.Nuxx_zcpyeqphsAgKj t^luSmw)Hox<3qy-Tt-{gvv}katw/wcx nf1xekhEy\f1g"f" QlT?sVytYpt]Mgu`t^YvcT xfI.yViEtt9w9vd|njf|fVh}]j}Ulx~>KXn~Ao5qO~&ruEftclre'd{gX[i,S@j2Ilu?}n*3oo%psramjc̉"beZg̈QuixGk#k=l1mЉ(#CnY r=p`h|b`dڏ`XfOzh>oEi6;kJ/k2 k Cp㇝nt_Mfa—Y^cҖsVNezMg D8h_:i-jXi6 8pj<zwVrOxxZ j2y*]_ajy`oXzcN{~fDO|i8}l)p1s1xu\pv _rhwb;_wdW.xgMryj!C){l7|to(~Lr"uwvrbnsdgtg^vviQUwkL9xHmByp5zrw'|u"wup&h`m&qj5e[rl\tmTkuPoJvq@ws4yUu&{ w4~zs.mnCkdo^ocpq6[jr7rS st#Itu?v8w.3wx%yfzZ|`}q;kt'tz2Xu|9$Ew}}zmobizNgkz_m}{Wn|OO|pT}F>q}H}i>(~rl2WoK$>urFR9u}oFwbgxd\`DyyfX+zBhP{kF{mV=|o1Q~!r#5t}-x5mungfvqiz^w}kgVxcm?NyHo$EzjWc_Z\Q@]Ti`bLcSCǂf=:6iE.lK o hs;h\a_4ZEaS6dTKmfBgiv9 l)-nq 0ugX}Ma`R}cYo~Tf$Q~hSJ(AjAjl8o(,qCtg ?xe{"f^{hW|gjP^|lxH}nf@(~"pW6~rc+tw -|cyl]ymV\zo-N{"pG{{rc>|lt5}1u*o~8wz g~b%w/qP[QwrTxsMAyzu%Ezvz=Szw42{yT(|{}}^̀u`du|vYv]wRwExKswyD xz;yL{2vy}'Az~\{b=~8^{s|fWt} Qu}Iv}~fBZw(!9w0xl%yyp|Ã@\rSUswOQtnHu }@u80vT/vօ#w1wr'C{A4ZqYSrHM_s9 Fs؉N>t^6Btъr-u#!u):ul}XpeR,qBKrDgr=s04sc;+Ws~)st8b&W[lZUR]Mч3`IF|c!=7t`^\Z%a_SjaLldE~+e| _}2G}suTxNykmH{y AzC:zf2wz̃^){{6qP{8 RwLx;TFx?x[8y%0yH*'yP ;y'` zXYQvJw*Dw'=wȍ6wَ.wא'%w0*w xYX5SeGZM[]F`9?9b7 e.Ih#zMkv)naǏuX\iR`^L aKEKc>uf%6kh-kC"umvpcxV`PbJReD g==Fip5Ok,Kn!w:psQ{wU*eO)gIKhBfj;Jl4an+wq _sTv'~SiMkMGmATn:p~2مrI*Kt7IvZyE\rQ7nBL 2oF<1q7?$r9t51?_8b0ܑe?([h j[m'xNNؒ\.IY^Cv`=c.7c[e/h'G1jbm# pE{*My`H Yb7BdZi4"k-fm% ,pHrm jv!ӀJahPEVj@gk9m3oQ,(fq.#֋s0ƌul I)yI)lCQn>qo8O{q52 r*t"12vk2x }yGEpBr>H{9N |3 },Ćs~%$JeI8„˃Bn<'7L1*4s#qO(ׄ> Ă@`/:ą5Έ/NoL("!@ тN]fJ]PIs_|T,a6X7uAc#[je__ gOcURifDl^j:4oms8owYWЇl\[}^7^ls`a~ibd]e^gQgjCjml3mp;,prZxV*_LlXa|[Cdq]gg`i\ScjlP|f@nnBip2ksntzRfƃQUhhz XYjp [Ple^VnZaLpOdKriAg3t41jv lw||^iOnA2R8oxUwqn>Xr{dF[sYP_#u1MbCv@geEw0h,y_jz3(}KuOuvvSwflKVnxcN{/e|ih}HI=}.|M }gsP}jSTo}`W~UU[A~J^|=vaU~.2cf\G8zKkqN7h~R{ ^VTKYhI\<_Y,a(dE/xIOpM(fPŊG]-T_RWGZۈ:]JS+$^WncOdD.vGnKǑdO[[XRPVEX<8Z) Zgkb`}IC(,tFԚlIJ=cN YQzObTYD`W:y7&XS'(Xy1daP1c:TydXoofh\eh!_Zj"cHNlQfA1nj1aqm]uoygc^WՁ#_[xa^KncaWd edrY'h2gcMjj`@m&m30eop sHr@{9CZd^*\av0^dqt|%Vf.})Yvh)tM\&j2j^l&aa{n(Vdd)p Kfq=is.l:uo w_~SmZ{$VqnrtYhpNi \Kq__5s3Tb tIdvH>km;Dmp+prst[Fe}w]g~n`iefb_k\&dmQg,oGiq~:.lsl+nur rw5}XlSuZml]Zogc_pZbrtPesEguo9j$v*lxq\pdy{]UAs#sXt*jZu8a]vCX`pwWNcxaDWeyv7hz(j2{n}IyTRzqUzhX{`[{W,^n|w6PoSgV^PY@Ux\smK_A4a4cr%d`kdu1N‡m"QЇe1Tb\WćSZI];?_3,as $-aň)j)?sML[kP[c)Sl ZV6tQXH'[e=]]1@^!^5 lqLJi*O =a\R9XTSP9WVFY<3[/\o\h of~iQvNjU"mkXdmJ\7[:n_Pp?cF rfm9Jt:i*Qvl{1o}|fQWtxg[liF^!cja YldOnWfDpSi8Br{l)Qtoy"qizc^_rd`jjfcazh{eXsjghlNqlljCnmI7Epo([s r;(w6tTx_dpafhch_fjW h6lM+j^nBlp6ScvkJYfxfw|2Jhi}#i~_p6SpUQiX La]ZX][Py_-Fb5Hopo22qr{#stxwpYapjOhc~ka!emXgoa_4bĊb(c;!dЍvdUp7]?WVZN[E]ܐ><_aV30`u ''`@c\)1xprRpirUaHsYXt\JP]u_FvbnbVp:eMqgDsBi:tld.vn xqp }trkii1ccje\lVgTmiLokClq0m9ro-tqvt7 D{woif]iTbBhk[ilS9kngKFm[pBIoq8ps,ruItPw% zzgco5`lepYLgqQips%Ik@t@lu76nwF+pLxOqzs ^x2~9eaWu'^cjv WmevOgcwGi9x>jy5l{)m|cn~7vOc_A{T\aY{Ucv|`Me[|F%g5}=Wh~V3j_2(dkkk&lZgu.Ta]fZ_}SaL+csJDee@;f΃23h&hŅAjSw̓G_[Ј\X]؈AQ_ވ1J6a6BqcLV9d0;ey$eehьBz^Z_W\S9P ^BH~_鎰@am7b.{c,V"bTgύk}ivRb&wTUZwYERx\dJy_Azb7{e,2}hk *o}gsX*`tZYxu]Qv`IwcN@xf6zh+={k~nhr3f:p]|_ r_Ws'bfP;tSdHfug)?vi5xKk*Pynn{p递u-dsn#b]`omdVlpgNr iGsek0>Ytm>4v@o^)Uwq~ysX~xvbkuh][ljTnVkMnomEq6o\=6rq3t#r(autwdv}{`hmYjoRS+lpKmr%D?os;pu2mrv&sex tz{:~_fsX+hRtQUjuIkvBvmw9nx0ozD%Op{ri}Zy_ ]#dyrVOfBz$OhzH:i{@k|d8Glq}F/m~S#nqUpczʂ[>bTyddMf OFzg? iH6j[-bk^!k[n· }%$YJa RbKdbMDeΆ= g4h$+ihʈhmFWl_~Pa!JbBd ;me6?2e)f7f lub{S1[)|V@Tm|tY\L|\aEY}_q<~cbr3%e'&h|kc-xp#`xX3YylZSz]Kz`RD!{c;{|e2&}hp&Bk#mZs^v],X5v_QwaJUxdLByf:fzi 10{kx%}Xmp[4_v_]6smb=VtgdJP$uff`HvkhmAw{j9p}Lsāy[pg^U qi!Ns jGt(l@juLn8vtpL/wr+#yt { v]|kYnvlSLonLpoErq>s5r6t]t-uu"j<7k0n/k_&wl/lEc ^q]PodKJ+f;iCg=hs 6 i<-i$i~j1 kp ZQSSVMDYoF\X?_M7.b6.e-"n7hgjV#q`X~5X6R~ZLw~]yEyp`>\b6eM-g!yJjrYm tWO{\Q|2_&K|aD,}[c=,~ f)4~h, j UmGowUyaOycIzneB{&g;{i3|k*}n6p2r~W(zTvfQNwbhH1x!iA}xk:ym2zos){q^}sJ]ut}MRUt]k8L[u,lFunV?vo9wqz1xs(Qytzv},yJPr=p8JsqDtr> tt7Guuo/Ovv&wsx_=xFz@ {}Np'uHqvBr w<]rx5sy-tz$uE|Qu~o y=Ln@{Go7{A:p,|:q}e3q~P+rvo#rsO wJlEms?>n^88o1o)p$#!p#%>q3JvfIjwC?k=}lf6mH'08mÊ;(2mی1mPo6u3RTSLkVFY@\W9C_+11`a(G7d'gm [MjxuPX-K7ZEVZ]L>„_8 b]0 d'6ig|>i lxBOu\rI^D:a=cZ6߃e.g&.jEKl 4ol{8MW`H1bBd<'rg5i-k/%mKz/o_ *rx}LJ}e2F}dgA4}h:~Ej4X~l,n#{p~irl uJziE{Bkn?{m91|Cn2|p`*}r "J~rsu byHxntCOyBo=yqT7bzer0zt&)!{u s|nwJ}dyV r~GvslAw\t<wu5xv//y&x2'hyyzT{-{E}}E4tx?uy:1vz3v{-cwB|%w~ w#yHY{惞C,r~7=s8t51t+Yu3A#u^u#nwOszOUANq ;qE6Hri"0r݇;)s1!s r u|>I"T DgV?;Ys9 f\!2k^*a"8d4 f~֑+jycHVWCZo=a\7Ŋc_[1za)ŠdI!f3h@l|.G[AÈu^+<^`m6ob0Ld(g* iaKkfo~ES_@pFb;E@d56]f/h1'[j:lDՊ-n3(sDTd!? e9g3Ai-{k&mn|oVqAvBhY=ii8? k29YmO, o$o7pʄ)r2vtuz@l; n6jOo0`q*,r"~t-ւNum$x{h~c>~q$9~Drn4~s.~u(cBvt wZy ΁}'`<|Lu7|w2|xI,}y}&~}}z}|b~~ ~ Հ:zq{:5z|Z0z}*{+~$I{~Y{e~{ |8xSF3xS.y(yM"My|y8iyD{mft2 -Ge % M u EtHHt !"$,%Z&'(*+E,s-.0132e345728]9:;=>;?i@ABD"EPFzGHIKLCMjNOPRS&TKUjVWXYZ\]*^F_b`abcdf g&hAi]jyklmnp q-rMsntuvwxy{ |"}9~Phʄ*AXoĐؑ.<=<:852/+'# ׮ϯǰo]K9'ǼȪɗʄp\H3ҵӒnI#تـT'ݘg5e0[%k&V7Yy.Pw/P^X"7Ni * Jl.[8^!"+#V$%&())*S+~,-/011a23467;8e9:;=>J?z@ABD!EGFlGHIKL$MGNjOPQRSUV5WRXoYZ[\^ _%`>aXbrcdefgij;k[l|mnoprst5uPvkwxyz|}"~Ca{˄8Rmӏ,9FR]hr{|wroljiijkmosvspmkihfeeeeeeeefeedb`]O?.ժ֏rS3ܟuJZ&Br,T t(=KT\ fnf>j#6Ld~  5RpAa / S!x"#$&'#(E)g*+,-/0>1`23457889]:;<=?@A:BUCqDEFGHJ K#L:MPNgO}PQRSTVWX3YDZU[f\x]^_`abdef5gKhcizjklmnpq0rLsituvwxz{2|O}l~Á6Rm֌2G\oəٚ $'+/38=BGMSZ`gnu|“ÚĢŪƬǧȢɜʖˏ̆}sgZL=+بٍqS4ߩS!K_!_Mt*Jf8T[:i&8Ng *@Vl $<T m!"#$%&().*E+\,s-./0124 5"687M8c9x:;<=>?A BC4DHE\FpGHIJKLMOPQ-R@SRTeUwVWXYZ[\^ _`.a@bRcdduefghijkmno"p3qCrTsdttuvwxyz{|},:IWftȍ֎ $0=_u{|;n`S7Tҽb5%bŪ=җ#-x{+Sam@\_:RZ⁨5bI /M]ׇVy1 k~^m~VQ~ᯃp T%=}vC9Ywx~j~đ/]5~P~賋}s슒}AK~3z6~̇5N\Abrtc]wUVƒS΄^o2K""Ճo$q?cOeU\V'.aDZ쉪CTGq b{KUagsԛ{zZjb` bٚ҄K˃҈~0p^Ib(Ufᡉو"ؕ<ޒyސ/j싘V}o1bBUj9JʈϢ.󇷞%|ry뎒|EPnljqt>7h\Q{섺̺(֍ϋP]_"aG}~L5rhfō[GP*_ 24t]W|pςyey Z}bP!DC{őJ||i})f}œHh~~ŊvPzh]҄Sςʄ5v➌̍5VF}rÇ{hM]pHSw`Yy_R<ݒqR |qMLg'\S|k7Qn5M1-UCwz-`p*ދf[񃋆R%[Jǘ5ޜߙbS⃄Sy!ʏnwe:[?QF .&NPӡyڑΝ\=rwqmUcڋZPo h!ϡ^ӎϘ{{)|}"m}|~rBg]"`RfŻ6.]:ݛG1S:a;'{" qm?g_W\R؄ᢡ I~gzDpVf{Ⴭ\g6R̃$"ˆq&ޑ 7yoɋ8ef\ʄRGP7\\ԡJB&njؓIxڍneX[˅e!RxΡĪԓ,S&@wmފ>d~[R"w[pڔJK͐ev#.lΊ#c1Z9}_Q?t靜l& G|~WPtԌ=@kebDYePq[c@{_ 㚪Ē@|spBj>0azDEXzvOu陓[ߞZ{9ɖqӋJh`>W\AOͮ6]ԣ?&՘pǍܡ胜 yɎpmI0g\U^ą!Vd`NYرzԧ{N~{̔ŝ|YJ|}x*T~nudb [2hQτۃ簢wȦΥGĝ@Ҋ逇Z>w6mF`dUׂ4Z⇜Q̄vㄫ.O[`IizvN+l󍻂c̊SUZ&QɄAhhw+ǟΆ̇х~V*]uNl*.cCӄsZQeQƃi:~ABۛGOzC}:tSkf4bÉZZPQÃkgg!受wߍ΅ό{{s" jd*a㆘Yp܅Q<§9-ᖷ~ 8qzqݏiHCarXd!PjmYHB_biiH_yQWPph?L`6WׄOƧ@ȔOD\۔xonSg_-V"OӦ}5_H7u].КWyvʔmet]·8qUNpߥ <wlz~%=u36l_dq1\ڋAUMÄXm{Px{䦷{,|`|{ڙL}s\ ~jb Y@vPυImyϦx|zܘr}gyi]6a]YPՄ37"cƥfՂt;WyGqɂXi@ǂa ҃)XÈPڄ[yڇΆנ8܁T!xUp*Jh1+`L1XPP߄*Fo^E;;wۖoג;g֎`%΅/XW?PلmIT܍ڇ4?v7WnŒ f_rR,WdžDžfPianØ$gDڏ^}ƚYuNjme񍦈w^݇!WLOքʠ2T񨒗Hs|tial&e7]։oVNنdNU؞ҕ!qQz{ntsA kō`cϋ \UiN[䝰ѣYeS:zE,qȒ j5nbjN[T:MӁ}aɓ" kX'{xpǔ i"asZ.mSM^$<|!4j|Mz|w|}֡},v}ng~f?^܎W*!O兯% pی|u#m1me򒕁,^wV(OINٵjh؃As|tP@l薃ea^rVԉPtүxΩĆƤV{ esf.lՃd‘P]VCP U􊟉/Tԣ6zrQkI/d'5]__V;P>s$Aܨˣyy 4qWpj]ac`'\ŋۅV AOĄΘΓʐ0ЇըWxpڊ{ijb\ ]U^>N6ܗ׏mۨ~ˢw Rrohvha/[_釁TƆ'NQy׎ɘԧɖ}Ǣhkv n ag='`׎Š ZvCTPM‚?dU|?3t m|Rf~卮_Z?YZSԆMDׄ@ϭ ]{s꜎Ple^BXWRKh7L؁}PF}g\}CR}~}Cw1}zpCD~i~b[ؐN2U2%O B}ʋYwu}Mvoonhab!ρ$[U5O"huՄ1փs˯|=unמhKHaT[G UO7GA_4 {̩,tߣWn gza!nZtT퉞7OJiƂORn{~Zt SmF+fՅ`DŽZ焥Tى-O[̐ʺBŋYz.s3lsf3_,ZwȦ[p͠jcՕ]א/|݇w}u~~&t_ydUvك>y*zG$z{,|4P|؊} ~/sj~#d8UwxOyoz4jSz{|EX|3 }r~cIUxtqyyƜ}%́px)k^OR߀!4g߃zܢЪ^=NV]ovÀ[jj)^ 臻QX ضӨiy!l%me7♵cu= i nj\uQ)Tx+3 .k9Be4Ý/sjɒgvz[:&Pt~\KDi.8N J^ti~mqf6Z~O~xy1z8{tf|e_}Yo}~_{*lm℟`ЃÁT9:FX識-ۈQFz8}m*! `cNT)8҉KAŘӉ1_eJe+jyQl|_ރvTwՋRƷYgІ͈NIӇZކrx^kЃ2_uIT .׵iiߨSO=XGЄW3wsk.ÆS_ESkNuX`޳/ΐN@ԎJv-j8S^S[˗g"ұšdIx(owE~pti]2Rb2ɷnټ دƇ,[΅) | shHh s\ȇ[QQ튖ʭ}]9nݗ}kѓ|qf΁'[iPm"],dDߟ{ p4qe5ԌZ_PNUlŷCC˯ZNnQͣkyXunc7cҀYOĉ>On~>xFxy짏 zۛȌ>{׏Ċ|ރވ}w$kxi_sSFɴ~e ~~W:Nptvj…_.S͂߃O0"SE\aᤂH+v u׆}j1^XS}ƅ캃箴È٢_mшSdtil^7TS"0&3ޡd^ފ[\݈@t~ h̄(]܂S΃1r)Ǖ-Oϒן 1n匧}erȅg݃5]R]epyʊєa5,|O0qkfȃD\' QQ݄1k泭nTRCم%zԅp%1eĂ܉[CQeKvަ<_a|lڕyF?nՎ`d~ZI;PLbCE"f Tl|]`wIm"c &Y߈6OxHov{l;ڊ[ߋyCqvu􄰖k4a؍)XO Gwx锆y1zy {x|2}s|~hۇwQ]΅S63E}=Y}٩t~/{~7~ԍv~sh-]cSJlјOŕ ɝboi}qwrBugy\CR郡WCDjjHVj{q]f:\bKۊ4X݂CO[gL|ݑĎqTߚo}7usYi]`׃|EWOz W(ZL:ewˋ{]rh b_(?VŁ`HNUw=cxsm,ynUMz^yl{U^|jzl }p,~~fK[݆R+[|}Ms}~#0~3 ykyoZegl[~Ră3Ɂ&˂xvnjRdч[%:Qcòh};a7YX߅qP%9žu ,y<ֈp鍰h`t߅XC8 PmVۢenƒAщ8*whbo$B`{'>~NՃevT 8nN$fȍ>_%AwWpP,%Έ`S(C}=0)uYemŐf+^„wW:XPSk^&׋Q| t7هl!e;,^CvVOnިkUAwւY0zϗ7s dkdD)]9ʆnU񅝅lN삌Aђ ǔ"X?yю-qLj7c_\xZXUB(NC c)4ԣʀZ=x~pӒjiӌ5b^L$[2T]M,q(̙K~Hw)DSoRhIwa$iZZwSDM,7èFT^@ND鄕:_khp{k tDVmIf}`5ZȆS Mh2Mdʕܣyzh=sClQe@_V5@YITSMٜ>BwNy@r!Tk6\nkޛd]e͖l_ڂYʍK*S߃N^hLDž[dž~wޤޅLqvk#Ge$΄_,1YSm2NHH2}ũw>pjS-db+^#Y/S{넨NḮ@⮴6|v1boŞmiuc]א GXnRcM@8F Ng|*uj.Zg (7a9F:[fV$/P/L(Ї|C]yrҢOlqJfB؎`sxZDNUGNP=~yKȁ=ywXzqxx{y{zİ|q{衞}*|k}~~sFc΀xTvTxq?yDBz 5zҀ9?{y6|vđ=}Q~+jrcfTrlwUxdx.ry>y􅭭z{Ȅ|1}q~jcTtvHvqw:Ɂx7ry+z)`{|T}4q$~ b&T=lucm{vc Ǜwoxpay{bz~g{v |p{}bS~ĄTX]tßWeuМ2zvw_x z:{}|"ot}AWa~ZT$rtO<^uj4Ovw?;xtyz|{;n?|ى`}S'[t>Ou@GFvMBwK?xO 'yQ\zZz{d}m|y_}R?~`tTPuBC>v:gw*?x">yszqy {k|% ^}7Qt~Z4]t:u%voszwJDx)!y /ypw)zj{ގ]2|kP~ _ju.YNu %vwe-x/pKx҂yלSuzh{\|(P%}ƄZvԯhwƵvxz {]L|<}z~pǀbJgT2>~"~~N~~{~~J~? ~ p yaT1v} }J>$}е9}su~1~΋ }~Po[!a{T/3| 7-|gF|Ɗv}!}~}~o|~naT.$F{?O{v| |oͤ:|֌}Q;U}ډ{~onC`T-XfLz3N{ij{{K|ZN|؎}cxzV}'m~`FSmz?WzS{3D{>{|zl}Ox}Uk~9^_~نR~cz- Xz]z+{K V{+|#I|$wk}:yj}֊^~siQuz@bhzBhzӧ{&j{y%U{療|du|퐑iz}G]~2P~-zazȳŵLz{9S{teN{͝ |6t|g}4[}ƈP?~dSϔ{{Cs{$h{I{o{y~| |r|xfh| Z}~O~u؋uh[wuxMHuy@z͖|}J|v~nTa`тSS˂La|ɦT}e}篡~dV~蕕%u{!ꀪm߁P`e܁SႬ􂲃dw؃B1Bukz9blc_kS|"΋-PJ #C׀܆z@҅yBׅl=]_S6JHؐhouOyvA=xTQ6kv_FSǃtc"[Uw -4ՏǍ{ŋcw ܉[jQ^/qR[͖vv̙=yiׁcuvmi]GR ˙ Σ1*Vuk%+7: t=thr4/\TQ0uɸɩ`k,1~훺i~ϗ~~er~ŏng7~ۋ[~Pn&̀c׺2攓~ڟx~|~q ~qe~Zq~O~IλހAg@7~ʣ~{~Qo~@TdD~CYf~T#O/~lgZ^u$*Uvk5Awĩ^yzS{Q|xa~Bk_g8Si̪O{\|g_} a}b~55~܄,mwՀRk2D^SRG\jχ{VᆐB΅т2#r)ق=vσN`jǂ^PS< 7 F$ԇ|(˙cjхAuނÄyiقM^.惟S(Huُ]9x'£wmʊ47ހt>i8ۅh]ԁhS1šY5N%C3VsƈhGg]5Rw0񫬄[׃rBʈ΂YQ}͌rV[g23\$QDAمѩJW,~|#miq sf.[D/PЃ(쩷 fP'iɂ[dzoNd2ZM͇jOh I+"$"\!}b!؎<-x΀ؔjmQ1c|݌ Y$sOM ?|dZn/9!قWwDl b,0X#$N~YAt_uwBaxyތ7{6w|uDK~i$^S ¬zٷnu{p|31|ږ&D}~J׆!tZhᄡ]R킦֌ ً((S$oŃyK%o)ue" d[IdQTr0l4ܐs>ȎfC_Ŋ·|܉+x6nMMdZAQ8\Д_1MdvYm/cZ?˄QJ˱ }giFVGG~و;juukbY^P{PmKy+nЍKɐɋj5 }kՏ1t"2jфaÃ:IX݆!OvPW576.;{rӎiL&`ՉcWtN#𑗧Lev~Ή8zP;q.~2h_PuwVENV:BӬԟlVۛexGoх3Df̓O^sUM_O^'tRݘuv"]x7ڐyIzw[|Zn+}d\{Z'QTOyzeS{6֒{􉗐7|%}v拾~mGctZAtQ:,~٤* Ej_TKu(l Mc(YQ#%cC؄ÖAܙ,7f݃+}ጯtk| br(YVQ ȃט=P]'ݎؐ%ώ9k|sEjb QYC+PsũYŎڕ&QoXۄ[{brjxiއnva=}XPnc^ȑ6ϏzڍHyqeh`RW̃7IOwO@Ӕ_bSvxp.g_uW ÅN!ė1PnIs wKW3n)f#$^s0V3XnN@9-@:nz{T:~x_uNJmsяe%Œ](ȉU4M'OfP2|k nϜ}.twЕ$l0cl\ lTWeM3Єbtuvx'}yj{zss|Gj}aɉd}Xف;P\aU)y^zfz؋˖{q|^z}Kr0~PiՋoa9؀XZPLT o~A~g+~ UTyOqXi `QX@アP<䞽=I^Vq$dVxϏ\pth`Z`+΂WrJP.5"r*VwÎoЌPgɄB_RW P!߃Hsod:S̔%O~/NvqknņfC^ԅWOh@'F і!g}K.u\;τz=Cerԑ kdc]HVOZCxЈƀb@yqanj'cA\/UmdN˄!YiN›`A$̊w֔7p刦ib[ևTN4C9ٓK/}bvnjZosh7Ya-[?T9vqMńOӢ[_|Ηulndg΋ `É=Z>·SMUc⊟9{xؓt=&wm!f^n_TYX\RULt3_њezOsl ueR[^X!Q݃+LRu֌XvÅw~xxyq{jU |c;8~ \?lU?|N,i yzJϣLz}؟/{w%|DpE.}/iR~6bd[؋ЀU 7N_}}ȃ뢀~|f~\vLS~oqBhb 耸[v;TׇNXɐժdj`dӏZ^;X׈1RʅR?LdTƄԒ}3w pyڍ/j{c1]׋`X,R!݅L|uȨ(V| u⚽oXhlbގ͋p\͋/WQRg LI |y{t䚀Nn_AgM5au[ϊV#HgPdK򄓉v!w}ͩ5xUwy:qʟz,kD{`eЖ|_[~4YS{MꅇV-zYHz}V{ v{q|[km}>e8~?_ oY/RSV"2MU}nn}|iw}v?~3p^~jbd9^X㌵S2M#{u|oDiρdt]^4N1zAns䠆nЅ9h2ab]MW֋,R)3MzRVyIy4=sJm+E^g_Նa咆\njpW@vQMeP~ThxcSq Mrt!Uu|vܐ8Qx5 yzzm1|kG`}Ӆ3SXF+prs4uנvuZwё?y5yzl|_ }g$Ri~ڃjpRq̥ksX;t!vwsNxؑwz8j{o^!} Q~upIq+s1AtNuߝvw4xqvy(i{H]|P~pýq̵sTteuۡЍwxi_tSy`h zs[|XP#}ʄ pr+jswæAttuצw 7xC-ryzxfzZ|rO}4%|4r~|t|uֲb}\wg:}y~Bzb~| ||}rn1~`܀ES@zy{Yzн{{|h||}Sc}~2~6~{~m`mnGSv=Xyb)z:s&z灈{%|! |ӁÈ}z~\m.+`ASjׂkhxyDy8JzRPz{_ |!o|y}̄Fl}~_2S`xvw(exW}y-)yɞzg5{w|Xx}@k~9A_J*SV wvԗrdw7wx詨y[Νzvz􌳄{ڊwk|Ɉj}Ɔ^~R9ΔvEmw3gx+x󕳛yݎz/V{uu|ai}YX]~KQBśvܿlv vwОEx6yZz1{Nt| h|\}ㆹP~׃ʉvyvШ~wxaXyAy!z͓ s&{gv|<[}PA~xȆv4nvŮnwqxfnPydyΚ};zqn{o6e|KZ}1HO~"Ɛvw*wѮxj5yoly{znzo{50d|Y|O }؄*kzq Xs5uZ|v?xz$=+{yKU}=lC~_k̀NSΜ0xK/y2.zހ2{8|WW}~~xXfk X^UCR<"%w<]AV<qŐ Ewp2j؀^1RD~侱~1^~aզ~^~莢~Evyj* e^/vRҀ}!μ}[}X}̊4$~E~N~ui]ԀR "|v|}ǣ }@U}{"}ˋj~)tK~ h!Y]R(!FP{v|EЭ||ۓm}}e~s}Ìar~3g~\*,QC{K{<#|%|EJ|R|'} |}cq}Ќf{~I4[L~kPr7a{A{I|ӝx|G|uw|M{[}p7}{eO}튋ZZ~_)O~҃׿m{կH{קH|~|>|Z|y|ٔCn}3 c}Y7~O~x|q|%|'B|6B|BÂ|mx |m%|b}OX;}N~)!ΆqTs5stv6Xx9yт{xu4}i~^ WRxxywxz({|=2} ~ui8e1]6@R[Wy~~΃Qs-NP΂Ct/)h䁦]- Rf5$ɫv҂f)ɂ݉Ӄ~ks?>gg\ɁWRKOʂ}Xi?P_ʈK-}}rVLg@|\mR3ekt"5׋.|q$xRfVz[QS/ZԁNÚ̀oc>QzEoӀ EeLGZ̀^PA]ѣ瀮ۘ_!*uېsyn-dRYOiI,r!zؗ*"]rǖ܁w`:mFHc2'הg1:znmrPi`s\XZP=<՛בpNM+eς-ryÄ(qXhʆ`fX pP$4o'Tފ%ȎS"ֈyĊxU4p*g̅c_{WkOq֐i>Ode Oxvmn2f^VNف5-&KRˍ{<} uNm>e]ꃍU^N'ܞ-ȏߗ֍T|ы|tgxl{#Q{€|ny1}r}k$~c^\U NT\~ˍu.+@ x+q"3KjUic=^\K UJNT; o}`w-Sp<|ib![އU>TN]O˛!ǃڗՆ?|ʔŅvLo(h%aʉL[8 TN-א֋}W{Ftϑ6nb ga`Zw Sل?vM󏖝xψZ8sizgҋs}lGf0`YÆ$S8DŽL~ S2;2ry8ur\kፃaeĉ_-LXRTtLb%8Ǚ~ؖSw0qA j(d\]]W7QKꀭ9W}!v’p%ǑiُcZ(][V͈xQzKKWKir‡#t ȠEuX{Jvuxn{yh5 {Wa}ZN~TTNvCwbxzoyt6'zmŔ{gM}`~yZTN |EGzd2m{{y|Psd[|m}f搘~`wTZ+S2Nxɥw~5E~~x $r{l=,f4ހ_ꌬ0YˉSMפU~!w]qʁkvme)F_b YpSLMR҉Ԥ݃M>~}W!vp&ij̄+d^vX{S MكޣH{ш;u5oiE+c]݊X7RlVLR 7AgzXMt1n"hɈb捋,]uSWzQۄL^Մ$N)yRsSm^gZb\M{VۇUQ;&=Kg8{?xŚir~l[f`G[LUㆋPzKqKyN}ewšgSqk e`QZo+U "OԃNK[Rstz.*ut~w4ox{iaycᔦ{^ }OXX&R"M`F5w4~wy|Ʀ4wC+q:lDWNfԕia\JWyt뉀o idk_g?ZZBUą!PcK߂&8?Iy`~sʟw2n/Fhߗc2^iYɆTKP KjK~V7xprӟm8eg閱bÊe] XSTцOTzfKU[}uw7qlcgTaܒc\􎔊QW툱SAg'NJiځsn)u#pvUsw|uoxvyx̊{6z|||Bn~}`}S]+ؘr`vTsw=uy;vnzWw{xy$|Vz}{|~n }`}SO֜p~kmrg~ؼksOJumRv2xeV.yz{qmU}P`~SB/ԏo rq6rPt{꠭vw$yByzۃcl|_~"S6ς0҅n`ŀp q\s6uC MvxxzIk|_P}S+w{nmuFloNPqsϖuۀwOtyyhzʼn\\|yVP~9KFl?TRn{p qɞYsbuDdwms1xgzk[|.P/}݃;lar=n5zZpaqˣLs}u%}x}vz yBzz{|k|}Fx}~ak~_ 퀒RÁ}v'}/w"}x%~:y~ztYuɗW vMzx4`}'y}sqzċf|[Z}UPM~Sqŧs tZѝu>vZw딽{y/#pgzpe|{5Zl|O~:qծIxsȧt\/u|ːHvawĘyxnz,d{cYP|N}ヹrs0ʥt` urjvMGwZxGxʖtm]yb{X[|PVNy}0~n)~Op7H~r`~tV-~v[bIx=z(v{/{j:}^IR[ہ\|u}vh}_wҤ }y~z` ~{|u~ i3c]πR=qĄ{`{{||R}Z~.O~[w:ڭwvxyI'yO}zx{bm|,cq|Y}ʆO~wC7w/xy3 Iy͚$zuEvk{'ol{䎧b |X }pDNv~8wkw֟$xJy|y*zLWtzj{|`|]#W} M}߿#*mfor$]tz'v x~ysT{g}\&QAhtbuɨRwAdxIy7E{5}N|rie}gHH\EQ؁󻤀zȱ{|X y} t}~r|y0qf[؁9}Qu;,GHio#́{Qp9e򀂂/[r˂WQy ~~O~~υ~zWz.Yo eR [f%Q[Â.}ˍʫ}{~!~3h~TH~3x~ч n)dpZaPǀPi}.}b9}mV}M}4~NwX~^mN~cp^YsO΃/w|ؚ,}ϝ}*h}P}t}fu} l%~Ib~XO2Ub|?F|ŝG)|E}N}&Q~2}\lt}j}싽ao~EW~;N~郏|{e؃\}[qQs̴sЪ[u<v+!xtyptzy|Bo[3}e'/ZQF8ԅyƩ Oz{z=|B}CR}x~ndMZ uQׂX(dXڀ:+fu񀴀wyICmcف́Z*DP{q셤zPRL2Zvalxc=TAYˁ:Pс&ӭ5͊aՇ~KSuAkkbdׄYP> JJCҘځTZ!q|̀ۊ sj{yEan[XCAOo(;#@ޕ 8xˁ{jkrv0id`)WzʅGNi_Ş؁--6ǔ\\yq(ҍKh8_ZV_N :b?ǁ{t(xmҒofR^=&U~My~փW73|ˀwrnhEe5]"~ՊT~!L~~׭&^m֤+oЛDqܒsɉuʇwvym{c}YPǃ ;sitؙԉvTw͇y~zu| l2}b%"Y\P=+x yԘ\zďT{|}~}htA~^kfn^bBqY!wPq?}z.~q,~ϖӈ$202:|JbQsjׁ7aXz:PJ₺UWǕXT~g|zW{7riEaXeP&7aS ʇbnyƄqY`rh`C%=WO$ $5]_N.cxap䇲g@_ZzVcNҀQ凨'pŐ܎Cw)npf̈C^1V.N {9fr|r5uo~vuÂʎ?m e}e]LJU`0M}~PņURO4̈́Vq|XtJlLFd1 \TeToʆBL3ćO֔*EՅ0Pc+{5"sBkpWc[GSqLy~ۃޤ6moۏ"rusMuzʊ_wrlyiw{a}XKO݃.ɑs&t(v'5wxyzhq4{h}`u#WBOoYx9y94@zA{,C|x}p~h3@2_]ẂO揘}N}ӏ̌f~]~zIw%oۀUgn_TvW0[;OvNsĂ^L3krz[(y~wvn~n1f^̓V߂OXiʌ쉉},uFׅ(meP^ yVCxNց~Kw{\Mxnwt {ćsYlj#d]3U@NsӍ^ŋ%zv(rBkOc\h-T΁|MsxC˖FDAf;y"Ɏqj)Ib)[7T rL߀#̆zv. wp 0Ch݃aĊZ]=S,L\ؕ ,O@}ۇ˗ZveEznꑠg`qlY`J)RjCwKM8n]p:}r!Vs}1uu+wng0yfF{^c}VO`st^uՐqwZ|^xthz@m~{eЈ}q^,#V_N~wCx&yz{}{t|lÉ}e& ]HJV N˃ٗd|]|}~zb~s @kdti]$nU2ri~x;t2wvqwjWycF{\Q~U"~EN;S<s0t:u}{VwLvxp3@z3i{bx}r[Ԉ*/TՅN%ʐ"wg|x_'yZ|y~zZv {]o`|zh"}b~[^BT|Nu{\|6:|{k}ru~n~h iat4kZQTGAM8ڙχ?& oFzgဈt Xm gb|`܈Z~TTM살i#xƃy6;r|l]hfp[`WY݆[SoM};v!͕䇞~r:wqʎ+k{؅ei%_-Y#ZRރLہ#]kl}A}vӐ3pjq]dv$^Z Xu KRCLG:ψޗN #| SuɌsoB"i`cy]vZW.QKƀ̃里pz%tYugnG药h-bXHW\f&VP؂4|KTk?;uy”Ts8,-m0g#6a_[|U҃P/υJoq]}^rw.trvflx?fz+_ԍ|/Y2~IStfxMst}gv,wDwqK+xkH.zUet@{_Pd}YMNS4܁Mv<􇸡"wLȝxJ|(yIv4hzGpY{Fji|hd܎}^ҋ~XJRYMg΃*Ƞ:{֜{{2|muM}o}iՐ~d4^^LIXpCRނLMYg\ɟl~ߜ%0zDtmnْ7iހc]ʊtX/0RlMM~ћqy3)sdmےh.8bz]߂W]!RbL炏Ğ S}Ț҆xrN`l̑g0aҋn\NW7VՄ QdLO ̂-|Nxw qM kӐOfF*`s[مlVdWPdKŁ灉{ߌvpFjѐeR`ZƈbU߅P`tKL#gÑzz5tזAo .Wi"d>I{_YχTDžhO?J„WQyq@{sԕn"ۏhɎ cOF^0(XS4OJn%p{r-vsq\Qu.l_vgxa{zn\|jW;~}QDL݅t zuIuvpp^wkxf~+zwas|\L}VlQ?LԄewsz)xWu;$y9pzz2k{-e]|U`}[~V[SQ,L˄N~zy`{ctpB|oH|ja}ieM~A`m1([I(VJā6QUWLÃ~}Ϥ~x5~nsl~n3i1dƀ&_xZ݌J_V7 Q-5LU|=twwrǜmhڕ|c_,ӂDZBUPƅUL]܃|+vݟՄqڜYl˜r#gc ^_BYTP?'KςW{<*u?pz kᆂgTb?]!XTrO„AKNރz\}upkbf;Ԉaiy<\ٍ?X9SчCO95J݁ryyt&Wo|j Ie>a`t[ƇWYRNDžJy$x/sDn@8i.dd _[%\RG@NgZJ%4q-jdrm %soucrbvtkxKvFyxyR{zlL}K|_8~RfπoarF‘pskruê t?wJuxؑgw|zKy-{xVz}k|~z^~RUbmyozʴqk{as(|Tt}Uv~x~wfzV{j|9,^\~RE]lCpn:pCr!tɎuӂwҁvhyj${]}R7j꼿mBo/q(+s'?@u|w!ury#6i{{7w]};R)DƻiӐ>lծn_bpmRr~t<vt/xhz\|˃Q~ۂRhwkSDmÓo_qʉt~Nv(rx9gwzQ\|[P~l hj՛m:o^ꓐq sK|uqwՊfvy3[+{P ~hCjlTvjkvl8wo|xqҚyt9Gzvk|xvV}Czj~|]~Q=YtQqutsbvu3wv̘xxmz y`{S{}ub||i\~~i]`lQȀҁ+irxҸtyЭumzۢYv{× w|yB}Dz~aty|1h}\~QlqqXr΀2tQuuw @xxyNs{twg}\~Q zp;q8sHtv4-w}yG8rz߃gX|+\6~Qxo@pnjŨCr*tvKuSEw2|mxq]z^fo|[}PIinHƱNpߦEq;s"ouVvzxKp yeg{}i{m oCprzyt utwPjx`z0W {ćM}azjW{SlǪa{oU~|[q|t}v;~~>xyse zg|\v~Q_y5q!-yrߨzt{CvTX{ww|y}}{3ry~g|g8]~W\KQ@=U wwڱjxx yqz bz:{{|7{|||}q}~f~[րQ#ف+vo~we~JxaSyDnz({d{v|!p}1e~Qg[6gQ{FuG/vR飙we+x^]yWz`zP{xo|1e@}ւZ~P$9StVuyʡvۗ`wFx yɇ"xz8n|Ld`}[ZZ,~lPdys(tɐvw%fx5݁ayPZwtzvmW{Scb|YT~IO8òvstOTuvwxߍvz jl-{;Mbv|v1X}N~Ńr̞˦Is>u5vPL=wix~Uxtyjzߋ8aj|W}[qqs,4v{yx]pfzé7|[(~P +~p~Wrn~tI~u w`yEyzo-|e~HZ$P||v}xI}vyN_}z]~'{p~|{x }n~ds!ZMP@ɱ{}9${}|p~J|~ċ=}MAm}w~[3m~c1Y@Pz%zoomz[{}JK{.|~,}v}l~cc2#YڂtP[TFyz$2z7{N={ۆ~|yu`}#kk}݄bZ~XbIOҀx͏y|Rez.zƋ{Ys}.{.s|j}dah~*`X~O ԪxXy—yAzHz{{:r|8]i|`}WN~oNZxzS3xz0o{2f|D2^F|6U}HM3~Tpwxwny ՉVy8\z$w^zn{Xze{]1|[T}VL~˄zjYlo*Fpqo# suw?xEmxzcy|Ym PskU)pDr !sقgu˂5wJnxv7zl|rc~:Y|PG|v!dwWxmny~Rz~HI|u}v#>}~}vj}ύn3~e~A]~jUY~ɅVMAI<} Ȗ}**}I}Z}J}h;t}l}d}D\~,Tn~hL~tr}%}}#Ԅ},{}2ss}MCk}pct}[~}ډS~LF~JY`j݈lוo:qvCs{usdxDjmUza|XF-O͂ԁ̈pc^qϔJsĆuWx[wzބxrm6zi|^`6~9XʀOkϣ:uuCv؅xny6@}zkyʃ{q|h܃~.`RWUOxz\9{Y|d*}}x6~p@hz_*WU恗OQTƀJ؄HɀćPׁ.wxbo%gF_,VQO.Tl9^R/~Q/v?ل7nbfNW^h+XV_N܂ɜփF㔣W|ၧtTm0 'eEօ]]U~MSŐ(b>CJ{)s؉lWdO^ \2TzMKԃ/udOsԁ1z1ĎrpsKj,|cH[ƆT(Lc[0eÁ˘$d?x~Jq %i֌bVZdSH1L7~e-5~ွwg@MohaGY R~؆?K~Zj͖*mouڊq@^swH>vos&x^gGz_7}V*XNG%o͋qksuD~{vv@qxnnzfx|^^~EV"N˂ۂ tjv>wix|zuD{`m|eل~^V23NtHyzɊ{"|x{Ά}Ct8~l҅~e;]xU܂N$~琝Pezjs4#kVdg}]UXPNm4ڏ7·5ŀDy]TrejރFc+\RvTۃMC%4q xʆpÃi<[b[>TDWMH$" }ą3vJoshÇcaZZŁ{YS݄SL@Pd񃢅|lˍuzpnlgXa`Y dRmL#уwb[!h<o[z_tdmffdo_GkX܀mRyKnˇ3ć7e4 y@rڃJ.kreWT^WA\QdKCtkDxms͏o=qy錉srv1k\xvdGz]d}!UrN#,XoAqsxFu*x݋vqȊ xjވz|c4|^\x~QUANC:ݑBtuׅsw1~]xzwڊypZ{j|b}[CzTɄMڂy?yz4z}_}{vˉ|o}iJ5~bQ[yT|M҂v?Q}x~,(~|B)uƉ)o ̀haT'[9T5&NM܎7Pqkzytm+g炣`؄ĂZ[SMKֆZ\FۆyfsJQl†fqd_B;Y0S$LGN3ZҊq~Qxhrpk%Beut_ɅX肶Rg/Lo⏟dm}?w'qpjdp{N^,XXBQ8K7(h|:uň*oiQTcJ8]舊WΆPʅ?K)փ\L0Ӗ@zE>t͒'nsVh?bL\.VCgPUiJ͍k̖tm+pzrtt5n vcg׋xa:zZ}KSMg+既p cq$syu/svmLxg#z`|mZB~hSVeMQktGbu~ؒ/vxx8r ylzfx)|``S}YІ}S_ׁM<7xtoye}GzYw8{Lqˍ0|@kF}Bel~L_gYaS_M)тr|h}/|l}vc~\p_~jߊe 3^ XzR߃PMs7.ʀ{t3u|goȋi܉ہd#^,zSX^RcqLA .#z2tC]n 0hƉPc&]TWlQƂ탂Lxh~hys"ImgňΆ#b=\zW Q6rKn*}ywюq&lk$1fY:aJG[ZVNzwPKБ |*vlpk2e_`80 ZUbZO灏J5ȀՑzt?u]]o_j#ed[_K̊Yׄ&T&OK,tJYl&5nylpt\rotiZzvcҍx]}{3XG}R^LtZp|~C/r$yfssuqn?+whxc<2z]|Ww~R0L›t>}T1ux4tvrx5m}Rygzby|c]&}WQ䅬1LҁȚw|]?yw@zq֒{lx{gF} b~&\}RW#PQ0L$Ú{{d_|ivS}p%}k䏧~nfL%as\ ܀VʆɁyQzVLă:@tzTuA7omje6`e[`EVDug7pΌ7kSfό aԊ]dX[ŋWkS?jNكJuBpݙloqGgݓscF_*Z ]VrRNZ>J@8t,okpfߒ/b`^79ZUQ}]MăI܃sojfjaN]fɉ1YTU- Q;MCIncfN{pi7qlHssonuqMvt@xvuzry"il|{}]~}P lkm๠n]p]p_r@r2t*t vuw~wyty{}h{}6\~ ~P4aju^lvnx'6qyW s zu{bw%|sy?}h{n~\O}P̀ h|ȵkL}Zm}o~rr~Ht:a~2vlrx5g[z逕[}&Pl gpilɝnރq(Tsi} uqxfzk3[|Pvf8?h[ks nDpoZrĆ{u"pweyZ|MPa~лe4Eh jmmSoo݋r@%zto`wdy|gZ{ڃO~>*d&gmڣ-jTVlג4oV߃qōxt9Zn-v#cyYZ{qN}؂}d;gOi薌lsn|qhw3sߎlvH5bxbX{NX}}Ǵd"nfПKiџ"lO(nǗq0NusknuMax\WznM}, d+f訦iLl.n~9p~t.scXj'u?`gx3Vzt0M]|Drfm:tAiDul?vnwq yBt.~!zvr|*y gU}{[i}P06qmqrot'qޝ'usҒvu·xew}yyq{{`f}@}1[`~~PqEo]tqu;rwqtfx1uzw{:{y;|rpz}e|~Z~vPbtLauvNdkxNnbzSzX|GNf~9riPȥHk(\m~Wo܇q4}s폗tujrwiayWM{XM}ڂԭsi'Rkqƙlm˜}{oș@q|srui wi_yCVZ{$MM}{i,1|keOmfo@qzsxq?un gw]E^yNU{BL}:I.wf xmiQ0yRl<znߏzq{tz|vo}yeK{ZD}P vf\um7SvoSwqxsyuzwky|y_o}A{Ad~}-Z~O ót%sҩuhuEvvȖwxXxy{_zzx{Y|nB|}cc}~YQO݀rzgt{-@u{uv|x}vyL~)wpz~m_|cZ}y?YZ~OȀHnqTr tv6uЁSw%qxv\yl{lb|Y~zO񁺭p?D0q˚sQ9u ӇvrS~dwuyZOkpza|~3Xe~O: oVZqhrEvto,z_z}q{h|B` }W/~ׂN$t^Duivꉌ)w򈮁xxypp{g|-_*}CGVo~Y[Ngmsˑu TvSIwbՀ+xi^wywo=zzf{ ^W|υU}%M`~򂱠s^Ә'tݏuv~xv;ynz&e{D]j|iT}~L~ s#oWteuj`v}wLtxǏly֍8dXz\C| T}!LW~,#:s tB]u}уv{wssxknysc?zW[D{>S]|φ7K}ۃRhf瞴iNlVnq|4t s|'vjbYy'aY{X~>O.7̥"l'`nהq1su{*wrhyi{`})Wg#O ρ}r~t ]~xu~wxyVzq{hҀ}`~~WUNlkm|hxD|y@}dzDj}{3C~|$x~}p~~hs~_VNȁ{:}f{~iX|b~ |I}Aw}o~E}g>~ۀ^|CVNz@z烀{m|O~|0vm}nz}fG~M^;~V mN1E>Syh z({zڄ{x5}{u|mE}$Be>}ʄ]c~xUQ8M~x֎\ytzTO~z{{ss| l&|dH}P\\~-T~LFxby"Ny吤zzz[{5r{~j|=cC|[}^S~=L`~قx>xޗFylz6xz~q({NFi{b|Z}9S}݅SK~x+Awnaxyo yUwzwo{h{1a |>hY|戡R]}K~$V}ig9~iԏτlDŽVo qw܃to߃Ovgy?_J{V̂~hNl nspㆁAr~΂tv͂vnyfȂi{^J}5Vi9BNn4Rar|sfu8;=v}x}]az&}ksS}nlb}Ge}^}ڊ{X ~ QV~LK ~e%gGYj5ElفoRzqsw)tPl3ovdyk]&|UM~MD-lnňdpȆryʅtrSvk`yc{$\}OTlMyqsBPtvyxxqyj{0cB||\~T3M<ՓGRv1wkNx~cz w2{'p|Ci@}fb~[{TS'Mq܂؅>{wׄ|3$[|}6}vZ~Eo~h邌a=C[T MZUUOU_{߃$uMXnDgaZet'S?\L ܃7FztPmQf؁d`)%YRRွLXˍApERy9ŕ?l7/eۀ_QXvnRHDK̀j!~ٌowwEqkd׀q^j8X.{QքRKT/* 0wȑ}1vp?iڀYec ]\Ј)W5PqJGY͗ {9uJϑo]hȀb\suV^BuPFjJ~~h6j׌}m+|A5ouro:t}hwăqy[d|4Sh~Lz^lӇ㌉n܁ap{31rttnXvgy a-{2Z}gSL ȍqYirStz"9v3swmyfg9{`%|Z=~SNgQLՂ `uc[wXVxWyJyr=zlF{ftY}!_~hYS LÂ=KnUzd&_{6~-i| wh|qe}k}~ce._]Y+-RɂLႆm~߂ΈL|݇vp҅xjҀdĄ1^LXROYLQl?z̓G{Rum Go;i@,căw]ŃW߂ QKĀB.KzF\t>tmn{hwb؂\GW:Q( KCu#ڇ|~dž3yۊcs mWgAaむ\ӅV2P.JӀ NhQ}]IwxqlPfVՊ`Ђ[c`UÆ O3JptƔ|vi ;p7kIeTv"_ばuZAT̀bOI؅1J_h9kC|k{mvoprQjPte"wB^!yX熤|kR8 LJ܁mۑo{ngqusptj.{w dxy%^jv{PXv }R;L=isq9ďrze`tqtv o40wipyMc׈7{]|X w~Q1sL0?G~uZ~vyOgwsynLOzWh{c'x|]W)~MWQL$|{yt}zZxB}{Br|%mkx}g݈}b{~\΅WBcQHL9܎}|P#~w~q9*l\ff/a\=VفQɂYKĂ耰ʁ{guڋpik=$:e߆҂[`|[OiVRPFK=E`y…ptg>oSj4dHw_ׅ6ZU}ՃP ̓JŀуC~x8ssn8yi'.cʆ^􄔅ỸrHTЂ`O^ J]jj|ό&wfˌrHqmgb܅U]X߂S셔NހJ{‘vv:hq-k􇥍af:a]FXS>bNRIizl u甄nGpNpk͐rfu0ahw[z$V|Q OK7~ޗmyЕozurqloNsWk 3uAeލ'wH`ً'y^[7{V?V}P΅K/}閵qEx唐rt.rto!]vjQQwe{%d:|*_i}@[#~ZWSP߀ÓK Ӄs{Zod| k|g]u}cg~Z_= [@|WZRPNK_JÂ^2r~nj6fsĀ b^w^iZ~aV`ˁReĂdN>ǂJQYq]miIe!ga‚]Yˉ^UɇFQC3MփN\Iq}p0lʔS hۑd`ڍ3\ۊZYل0U%DŽQe˃MdރI p3vkؓψgߑscď _茬[p X9QT`F*PSLނu5I@ojXg"bT_6[0WۆSՆ(P]LkHiнkbTmeToghq>kʒsnuq} w tqyUw}f{z8[ ~ |OtTii|kk&mnop"rsCut+u|{vcwpxye{&{Z}}OĹgzpܮiralFthnvpw3sHy/zuzp x|.e?z}ZM}~O.exh:yjzKme{ 9o{re|yt}o#ww~dzRY|O=c@fiՖlEnTqxt.nEvڀdyY|?O~ b6e˟h`k^'n"!pׄwFsm,vO c3yY {́O/~}Q)al dgNJ%jpm~pE~usikuԅKbGx%XJ{YN~`cՑSg #vicl匡~otr&juaiakx1WzM}`1..cTʙf]i}>lr|oQ-s6r/iut`qwχVzMX}Sg_u3cqfSeiBd~l0azo jqquh^t_:wyUz=L}_覣]bf$TOi kyn˔pqqg2thi^-w-U ybLv|pbmqyerhtkkunwqyy0to/{wd|zTY~|O,mi`ok֠3qgnfCsptsvuZxxqwnOz`yc|k{Yk~k}O$rlpGmr osqu3swEXuxwwz{myy|cT{}Y}O ajAw#:lnx4nyP.pzYr{it|dvv}^ly ~Jb{Z5X}Oh}pk~N,mk~o#hq~tuv;m_Ão͋Gzr5qtJhw_ypEVk{ƒMa~*=elgTjm8l oYyqȌpWt:glv^y U{aL}yIdНjgz6j1 2l_qowq| nscf"vP]x T{ `Le}]ddO\gVili|nі=v;q8msev\xgMTzL}QtZbupeΛvizwkSxoyqvr{Htl|wb~>zpX}NFҬrYiFAskKun=v_pwr~yu4unzwk|yb}|X8C~Nڀ5po¡rqssju)u!vv}x3xtwyz:j{m{au}"}W~Nunv8pw\rext yZuz|PwU{sny|j z~ `|W~\ Nmi|oK}q5}r~3t~{&v;rmxMiUz,)`P|W;}N>"l,ʜLn2p@rsyu҂yq6wchTy=_{V}}NQVk"䚅mI4oyRqlހsWy!;^{U}Mx~ځajk䘶lSnƌfpƋ)wrvtnvmf=x)]zUJ|L~lAilnD"3pIP}rK}utImvHe,xF]zF4T|.^Lc~ ix"k͘npb|jqt-sl)uQcw[y쇆S{օ#K}̛i~pk(TmŚ=oQ{ qirsjubwZyS {K}hxc Gygfz%i7zl${o{|qs}iti~iw`~zWq}INU Hvi0wkZxn#ypvXzrz{ur|wti"}y`1~|W~>N?>kuoE v;qwas^x{tł!yvyzxEq4{zhb}{_~`}V,N*ـásuVgtvNv'wوwcy xzFxsy{up:{%|g|y}_ }~Vc-N{r${Os{u|v[}Vw}wXy ~oFzl@f{^}YeV~ŀN%cBp* rI"tlu~&vv x]n ýe{M]|ׁU~LMoYqtssPitӅ|vOtwɄlyD6dz˃\|X1T}ςL8 o@p틚rt.{Cuskw?kxņczR\5{ℂT5}[nLn~łVn phHrqsyu@r$v͊rjxYbyU[Z{zS|.K~_ng2pqѓ}samx^t_pvuNi\x@ay#ZL{R|K~ؕXn8ፓoMq~qs&wtov&hBwp`y?Ycz̈(R|IK&}}cl}gf`}ij~+lJ~o7wrotgTw^zV[X}sME{Bi+ {kz|dn ~|p]~}rv~!un~wgfky^g!|U~]Mׁpynڔzdp{r4{tm}|v=u}Bxm~ye~{]}Ud>M7x2t yuՋyw.zxw|d{yt|h{ m}A|Te#~#}]M ~UOMځ?*vzwz*x{y|{8z}Hs{~ l,|~dl}\~:UMruv刖w/xsyy怸rbzk{4c|f\~ TwM"ՕtŅ?u†w-xv}tgw֍mgxfz6_{#aX|DQ}RK~Rr𙼇t'|u`Byvvs*wlCxeyK^zЉW{Q"}KJ~bpcofljہoilrl{@voisr~QU~O~YJ1!o|e|t|v|鐄p}kX}=Je}s`!} Zg}PT~AO1~I~҃Dze&g}܈jwƇmQq/pkÆireu_\xjYb{KRf~$KB k ipRl|ŇnYvÆpq6rjuyTey`szyn4x{h}|b}]d~W^QhK$(H{}t|Fx}rr}m~hg]b \`̀mVρPdKa7d݃e|*3vĂɀq7nk$fria#z[@V.5PrnJ怺m8zׂa&upɃj߁wey1`FZۀeUAOkJvH wyɇtVnY*؆=T:N4I8|N,v{q؀8l]g bsЊE]X`wSc\NGJIv<^N'e|hw쌑k+rPmmYplgֈs!bwu\xW{Q~gK7I4j{팙lYvnnqEpl sguiaنw\$K#V|}4zewqP{?rn|m|h}c~_)ZZc+UOۂ!Jف{UV~WvF~q_lgFc:^J$YVցT6O_kJgz_uǂ}phk/fbb]}XSSN*JxˆHs(oJejz{eՅ.a0!\wWلJOu&ycqyz_mJX{Yh|Hd}1`\e~\#1 WSCNJ]݂tF|pn}l<~WgF~cȇ_yŀ[WVDRqNAekIes{o[-k?Jf򈝁b^^1Z=V^~REMځIr΄5nN0j>H,ea̓]҅YلUQ~MjtIBHq?m2ni$d~`DE\X eTQ oLH@mpl‹:l*h.Gd`̈_\XBTDPm-LvńWHshowj]kWlgݒ0odq_ҍt"[vWXy|S|CNnJLrڗlkUnKmmk68og2$qcds_Iv[P(x]V>zRe};NIJԁr ?nn$0ptj/rDf*t"b͎1u^njDwZiyV|Ru~)N' =JchЎheQ4at^1Z"W, S*P-LLw;\HckqgڎVWdW?`]J.YVd R愓JO-LӃHjfˈ$c|_bD\YRURJKOÄKx,HjGi]k ax\me-ohq)ls^o[xurmx,ucszxX}{NQH~fe/$hhkDjmmwop^rirwtulwxbzHzXz}|NY.dglcFfn}ippl3rnt{qzvvt(xlvzlb:y|LX*|}N`qbPs|me-tܚHhvHjwmx~@pzGtsa{kCvB|ay6}W|! Ng `uzqc{(f{bi|]l}D}o}sr~jvuaxW{ Nm~k^9b6DeQh[kӁg{njrqiiwuW`Zx6;W{GN ~Pا]ߝa4 dg=k]z>nFqmqm)het_wV^zӂMp}G\ŽI`A Uc͋ˊlg"juWxmp?pght^wJSUzhL}%\"@_c4ڈfJi)wm;Qo p~yf[s]vU z Lf}* 0[К[_Ub敱fEH~ivlwmp*e%s`\v6T8yK|܂]H[j_ j2bjej}IiXltlrloގds[vHSyvK|m!^onapfe~rh؇slD~3uotwrkKyua|yW~`{M瀲~$je> lh ;njpm9rpV}trsvuj}y,xa{zWT}}MDnBhlMjn&m%pYo[rcqtv{svosv+xlixzZ`qz|PW}k~M٦]fri4t1ku,nwpxzryrud{Khw|_zv}V|M}=ydyXgz+ej[{l{тSo~|yr }cqt~$h*wD~_]yzVu|M$cÙf^iB-k`nxJqOosg6v^yt U| M~bD 4eKh\!{k*Qm]vpnspf0v2]xUD{L~Kiaq(hdz&Ig"jm$}mJ&up"mrekr'ct[6wˆS7zK}6oK`G~0cQΉ^fb"\iDsyl!qniq؍rbtZNw~RzAPK0|@q5^蜟rbJLseʋu5i@vlozx#oqyrh{{v_}Yy/V5|5MCuoeVphr7jDsmuzpMykw0rpxuhzx&_A|zV8~}v}ex~]{1[UZ}gMhǜDh~UAj~l o;d|qtsm"vaexS\zT|M !'fHiylănr{lp΃Yss" kuudwЂ\7z0KT4|wLz~fhPJkBmzp'r]r'jtZcwW[yS|K~Aerď%h pjm(xooq ritb&v_ZyVR{K}8eDggkjT~~lϏw;oCoqht$(a v=YxPR={PcK }SdߚgsDj }lun(nq`gzsҌf`vBXxQ{J}DuF_gzvCbwBf"xQi\~yelvzon{s ff}'v,^~y\U{|lM!xs4ertsh.Muj_vm}xIpPuyrm{ue|{x7]~zU'}fM )qRkm^rmtBoτuq|w7ttxvmzBx*e{z=\}s|\T~XMHtoqbq>rgrttv!{av/wswy=l3y{zdN{.|K\}|}T~@LInw>5oxGqyWysqz\z;u5{crv|akXx}_cz~P\|i=TK~5Ll|n}yep}r~xxtb~qv;mjLxbyI[Z{倩S}LM]kmołv~qlw|sdpwlexQhMy7kz&myu{pWr|rj}ucT~xJ[0zT'J}Lh"uk6rvmawoWxqxezsq+{-uj|Nxb}uz7[]~|dS~tL{spȋuFrk'vt~wuwIy wWp3zIxiJ{zb||+Z~}SaQLΑtrvFzswhuZx|vyv6xzoCym{h~z}af|.~Zl}!SK~!L}Qq>{r|MOtW|{~u}tw@~5n"x~gzi`{Y}|R~~L!߁p8p Yqρs~/zu Qsvvlxfuy_{ Y|R:}KbȌoQ*q[rmxtU rdu넯kwwLe}x^z~Xp|Q}K$~nY|yR~LgxupGyTqz3syf{ u\s/{w l|xf_}zh_~i|Y2E}Rw'mL $wuex v~y wxEyyr/zzRk{{e||_#}}X~R72KNuzq>v{7}6x |vy|pz}j{!~Bd|$~^`}/X.~;ZQBK@tcu{w8uxUJoykiz}c{%]|cW}Q6~K"{sLNu5"znvut`wnxǃhypbz>\|V}:P~KJMwvwӎvqxAlyfgz b]z≏]m{UX@|oS8}=N}RI?~ b~exhs kmƄenhqbt\w.VTzSPЃ,}rJу i]f|i2wkr.nSlbpgX,szav \4xV{P~>J͂)k{m>vonq8qlisfPuaX;x$[,zjV-"|P^%Jɂ1;぀oz|qMuxsp6ttk-qveځrxl`wz7[2| Ú}P*JŁ΁~9sy]MuRtkavo=sxjOyez` |CZ}Ur  O=kJs}GxCxDyKs5nzTn{TiG|Sd.}M_? ~DZ D;T1O"J} |~|v~]}*q~}l~~nh0c2;^bs/YRTdPO%AJSz}Fu} p}ہKk~}g.~^bJ~]~X/4S|_N͂}IyN|tU|o}7j}wf+}˄Da_~ \~bW~SH `NAeIaw{s|Znc| i|ve}F`\}L[}酴W~F R~_M Ifv{q{&mG|>:h|Ed|҉W_}}'][}~gVi}VQ~PBM?~/H+|ߊGcwuesShn[ki"n~deqt_tyZZ wU,yzO}J1j{ψg+virfrl&mnhՆ#q)cޅs_v_Y\yTЃ{Ojd~J4-zhk9um]qnDolqh-sc9v^+x?YtzTzD|O<7J6xyoLtօqpi#rktgC8vbxX]gz/X |T$~OgJ9&xfsTsĄwtolv=jӃwfxOy,aӂz]V|Xe}SԂ)NJ;Ɂw1wSrsxtnP#yi˂ze{`<|\}WSa#Ny5IZ?v {7qz|m/R|h}d~O` [ʁdWE:yR߁1N)I䂀tȁ0pPl g\gc)_: [ ՁyVRf.MŀyIFxs< o,k 'f+b-^_o+ZIP)V:$Qڀ(MY HrTm}iYMe/a]oEYoτU<Ä{Q+ LHŃq(lڀhۉCd`\q3X^T\PcLlo H~}Fv@dqlfm׌=iiyl`eVo(`߈r \tW܆wSB{NZ~IuGCgq$jEm lho*dq`Ft)\ vWvyjR|"N4"~IKhtLkpml+ogqct _vA[,xzWJzRp}*NvI݁sOo.o&qkDrg$tc?v_6xe[ hzCV|5Rc~-M%IvrKrn4tejbufXwvb(x^tezZ|VF}RW$MЂI/q8svm*wibxehz1a]{a]|Yׄ}Ub~Q̀!M7LImp/}z l#{h\{doY|`}\؄~YjcU Ԁ?QCEM%I25o }k~HgfM~cl_\muXk݀TP{PցɂLˁGvĤm3j ?xflb_ l&[L܂UWVS҂PYVLjނHol҅?h􄣄eY ap^ڄlZoNGV̄!SCSO僸K}yH`:kgdi\`]JZY҆ VCSR O1{K(H+փ^oeLkڑwghtjtdNm"a1o]V.rYu|U-xtQu{yM/a~pIVnhkXQ\ `mc׋z+grQk1fjnЇbrj[u[S.yK}fW[_=c{8xg0Wqj֋xinsarZ%uRvy;K#|Wh^[f_d~c(0w~fߐoj[hn `qYRucQxJ|u]CjGZwl ^:mb oeĀqizx7hn>yBkHqnJjqij{sJmsuJpl/wYsd"yvp\*{yoT~%|OLZ~-igkj&mlpozr&qyrtXskivv4cxx[{E{S}}RLZgom]ioÈ)lbqns}yrq uVqsfw"juxbx;z[=z|S}=~KL[!eshCuNjvkm~wxXoy.pr}zjit{b=w|Zz:~S`|5L[_W_cy"fz2i{s}lw|+wo|oq}htQ~Farw~Z7yR|`)L ~be僢hр|k=unUmnq gs`vxYy8Rb{K~,aedυ +g{0jτPtxmmpkfs/1_uXxĂgQ{zK~E`߇VdgD$yj0>s;m Xlloqer^uX:x`QR{J}ꌏ`|(c"fߍvxaiˌqlk5o~LdrT]u2zWYx Pz˃J^}i:`7R.cbv}fwipplDj)o"cq]t)Vw†:PzQJ}"q[Ȏs3_]^tc ufxw$jq`xmjz*qb{t[}xSbp{LJRoaqAdrg~tmjwumpvwpi]y_sa{,vZ}yS~|KpmgoojqMl}sovtqjovshxv3aWzxZ#|z{R~z}{Kyӑkmw mo`QoqR|Zqs2usunuvgwx`yzY{|R~ ~gK1gis6l.tn~v{.pw`trxmtzg%w{f`)y6|YL{n~Rh}FKÀh`xԆjym[zyo{lsgq|Clt}f9vU}_jx~XzpQ}).KU*g~Qqi~lg~xonJrq"ksre:uD^xXzgQu|K"~߁Q~fhփ}kXw%n'ppnjr҂dOu,]w]Wy(P|=J~re`ih!:|:j݇umdooچ0isrJ~c^t]w VykPs{܂JV~?dgzjotslnuohbhHq݈8bQtI\vVy3O{yJ}OdbgUCygjs>lmYoegFq{ahs'[Evm{UGxON{A%I}su\}v_Twc{uxftyjtmzmgK|*qV`V}stY~xMRy1{KLYsbte v/hzXwqjsxmm#zpf{_s_|vY~3yR4|K8qg/s/jtly>v-nrwq`lUysezv7_;|xX}{2Q;}KԀ Jomqo~sSqxtrqvtk}x.ve=yx^{szX>}|Q~~Kvdn(rz]ps}NrunwsvpuxOjwHydy{(^%z|W|}Q~aVK %lwƁnx{pyurzot{iv|cxR}]pz0~oWR|SQ}4K2kw|mm}jz}o}tgq~]ns~huRbw\y:V{P}iJ5sj ~lقy(o#s-q6mys8gu2aw"[yV({P!|JX~Ł̃iʆ}l#~wnvqplUrft`v[*xUz O|I~biD| kvdmppkr*elt4*_v4@ZCxCJTzMSO |UڀzCP@}AJvAyg{zzjCv.{lp|>o&kn|qe}s`~pvqZ0xU{OՀ~Jrx:lzBy:nuz7po{rj{te4|v`}xZ~zU'b|OO~Jn<~kvqGywrsxtnyvizwd{yF_m|zZ}|mT~~OyJj0}uvuwvwrwxWmy yhzzc{#{^|,|Ys}@~T^~S=O!haJ*u{tWzgvtu{5qw|lqx<|gyY}bzw~B]{~X|S}̀qN~'IzDse~u'tKpUv<k\wzfxPayր] zX!|)BS^}RNO~wIq$xrNstAo(u5jEvփex`yH\@zwWt{R|悩M~I$0iwrrs(muivPmr`lhncq^tYiKwTPzN}I؂g{7~ hv8~xjrq~ll;oFgqbt^BvXy"S{Ń}~PIہy|lqu}nypz}pk~rg~tb;v]xxXzSv|NIށ)x{ps{rvo||utj}ufN}wma~#y]~zX$O|cSd~NI@owyurzvcnZ{owi|xe[|z9`}^{{\I~|W~}Rd9N1|IӁvExyAqyz2m/z{#h{J|dY{|_|}[}d~V~!R~ހ]M7IP_ tw}zpax~ly~gz ck{L_|Z|ҀwVX}R~dpMr/ISsw o2xjy fyb{z^*{*Z|KBU}!\Q}vM~˂Hr]vkmwvaixy-eyUavz#]>zaY5{̄T|P}yL~r!H~DqulvhwKdx؇`y\sziX{\TX|KPV}<_L1~%HI~wd`2rcBnfTj|ine&lao\rWÃovKSNyN<}I=4{vzdOqgm˃iiKSl|e"o7`yr \tW_wRÂzMꂳ}IH€uhGhZqFjlFmh~8o~dU(q_tS[vWy[R|{MȂ2~IQVtIlconokpxgrc(t_E9v[LxVgzR6}MCIZfs0penrksf؀ub2w=^]xZzV8|gQ~&MIIbr ~Nt\m~ui~w!e%xb[y]{3Y|U&}Qv=MFπI2)p}HZmGzՃid{de{탳a|[^e|Z}.W}uSM~XO~9K$H#lzKQhSz܆d{ga{׆:]|?Y|rVh}' R}O(~EKr~փG_qbahmd]iʈ gOeŇpjOamN]ކpkYysUvQ`iz*L}xHpelcgijoeMmaTo]Q6rYqu\U?:xGQ!{@Lփj~.Hă ohkφk(h4mdY;o`r?\̄[tYwT냑yP5|ML~HԂXn(lpjng\pc)r` t\;{vX/xT{P}TLnHAmpjqfhsb܃"uq_ew.[xXpzT8D|Pu~NLHlshu>elva;x,^ yZ{Wy|oS}PPLWHƁw$kwFgx|dyasz]T{Z2=|V΁*~S51OLL `H~gjzf{c|`3}`\~#Y}~V/RqO\8KHRQ*MWJzG3kbh'xee xhHafk-^ZZnZˈMqWWIt*SWw^OͅvzK償}H5ـjfgd%hdS>k`Hm]ȈXpXZNisVuS=xO{KՄ~HLbGi݊iSfkcm`X=pG]=brY؆uVwoRyOjB|Kǃ%Haiyle܈nbp_1r\ktYTvV"yRV{RO:}KHuh7?oeqb.s_/uW\ ~wXӄxUFzRW|O+~vKMH*gHs;d/taRvO^9Kw[QyTX- zU(|VQ}N‚bKy-HdQf`vacHw`ly]az@Z{sWz{|T}QlNgIK0uH"ReU"ybWz_H{\|YσT}VԂ~hSxJP 6N!JEGdSK|ah}^~A[̃"~YV+N#Sg쀺P}WM1J|GcB`c:w]Z}LX?UoRWBOM/JGGK&b4!_pF\JjZ 상WT́1R3ԃOmLX}I-dG_ LcUf Yˍh.^ jb}mf)udojmKrnduq\xuT|eyK}a\c` \f$cNhf|~kj_thnml}qqd=ttP\x\wS{zL~C^VcoaDfVd2i1gKk{bjmnswmqIkpsctXv[wyfS{p|L~g[jR_lpZb[nepz.i+rrqltjpvbsy[?wH{S{}L2~Ykp]rx`tLdHu{ygvqokxmjoGyb\s{QZv|SWz~"LD~`|W{wiD[`xM7_Ay5~czwfzpQj{in|aro}ZIvI~fRz+2K}U}Z}^1~,}db5~}vlf*~o/j%hnu`qYuRhy?K}}T̃Yo ]<*| aZu:ejn$iwag;my`qwYuhQyX;K}3HS~SXD\z`t dՆJmhyfWm_NqXku Qdy(J|߁dSW͍)\qyZ`Jrdtkh{e_l+^mpWthPxJ[|ċS=j8W}~[x(_qdk h;JdlD|]p`VtzP>xJ|SSgV}iiZ:kH^mbbzofr@qjyjtzndbwBr?[z.v/S#}>zK\}~d]g`qidc5kgcedf\Xgi1~jDkwm nproqVi6rt auvZ0yyR|I|:K~ߓ_jbl4en`}hpvkronthorva uGyYx{0R{}EK$N>]pe5`qzd s|rghuujvnmx0gqAy`xt{EVQuOyI|߇WaC[Pz_0tbtnfhbjz>bTn+[qUuWOtyGI|.kWNl[5nf_7}[p;cvbrgo&t7jhvqn`xrY{jv{R:~zVKC~> h]j`؃la{|\e0|Jvhl|pk}zin~cq~]8u3Vx;P{YLJ~Yԇ#]h`Ԁ{d4tgnjՀhnbqO \tVowǁ'P3z4JJ}A\x`ycu!sf݄mj5>gmapу^[t!Uwf{Oz I}["}_9x7cSrFfkilifm`pjZsƄUwO,zII}Gn["|_!vbYq fkiXel3`)pZ;sviTlvӄNzIg}C;nX%op [qx_y3scrtglv~kBezxjo^z{rX|vQ[~zJ~l9^maJ~odxqgqsyk k6un\dwq^3ytW| xVQ%~]{J~ic̃kf}un iVwp/l prTnjutqzd>vt8]y'wWW{{yP}|JLegi4jk|0lvmunp2oq1rkistcvv];xyyVz{ZP}t}JȆeo/hipzjrtmtVopv hrwbu6yk\w{Vzm|P} ~wJ#^d)tWfuyiwslwxSmo'ygqzb4t~{\ w4}V/y~

|fJ)bz}ezx=h{irak|lnV|fq}aVs~B[lv~UyeO|RJK~LaI|yd|vgq4jkmfptS`sDZvU(xOe{0I~Kd`ńQ{cufpijlCeo_r‚Zu~Tx?N{PI}큿I`-9ycZtFfwniiyluadom^rTY?uMq%ptkruf#tw`w)yLZy_{ U\{|O}~JUfhKszju.um+v}oowjqye>t*za_vn{Z\x|T{ ~0Op}RuJQfxytiyt0l$znn{ciq |;dDsr}_u}Yx+~TizO|ՀXI #}e}xh~Ark4~mm~hpKTc\r^Su1YwnSz N|c,I~|dvgqjrlmggoPbpr3:]t%Xbw-SfyN9|IK~>zd[`u_g(phiSkIlflo$Eajq\t5BWvȃRyP:M{I}'y:ctfo@ikj8lern `qH[sΆ1Vvo?RyNMK{oWH}iHuZ|pv]vwaKq#xdkyhezl4`p|=oZ}sUH~wrO^{EJ.)s_-{?tbTuvep9wUhjxkeIzn_{ur9ZX|uT~SxOg|1J)kqd>zsfttioNvl]jwody#q_lztY|@wXT}z9O8d}J$~1oiIxqlkssmn\tpiLv{rUdx/t^yvY{y8TQ}6{O ~}JA|mnBwoprqqmtsshulucawAwh^hy y;Y'z{ T||N~~JP{slos%vJntqlpul]rwUgtxbvoz]xS{yXz@|S|'~/N~Iz*kwumZxp/oyk6qzfs{au|\w}Wy~S&{yN3}iIkTxj |sl`}on}j%p~er~`u!\'wW[y$(R{%M}3I4~w^i0+rwk9mmHip&\drSr_ty[bvVxR4zMu|H~uhq%jAlmQgocwqɄA^sZvUxAMQzfL|lH~HGth ojv!klΈ_fobqP^ s&YuuUNw䄻PzL|&AHz}|yG[wy^r|zb'mC{pehK|3i9c}l^~ pkXtSʀ wN#{IB{wB_vpx7bqy)flkz&i3g{ lIbx|/on]}ArXt~YuS}py3N_|IzhubduUvgIpwjkxlfzoWa{Lr]|tX}wS5~zN9$}^Im8y"siGt/ukovYmjwp(fyrmaFz\t\{wW}yaR~O{N~+I wqmssonuqivseawuz`yqwZ\'zy9WY|W{R}|ME~Ivprqr>tmlsuhuvdwwxo_xy[|z'{XV{|RL}A~s{ gruV{cyv|_x}e[yg~+X z~T|PN}ML=~SHX΂nq~Ajs~fjtbv^wj[ xπQWaz(S{$O|⁓K~5Ht[lp.hruEeKs[auqj]vׂxZ6xCVyR{OQ|K}G$kp?gqޅdRsni`t]$vVY~wȄVy.2R[zN|-K1})G~r]im`jce܀gCaj]>nY~q}UPHd[lxqpi/ysezstb{EvW^|wZ|yWT}{%S~|OQ~^L)HskwuGh#xvdywazly.]{LzmZ |/{V} |S}~3O|~vKH3jvy(gwzcx{ `?y{\z|Ym{}V|x~R}kO&~V|K|EeG)Ciu|fv}bw~_]x~\"y7XzUt{PR |N}vK1~G҂hQudv(awA'^fxSg[CyXWzbT{b Qq|t?N=}pJ~Gg=tO$cu`v]wȃZx҃WHyT1z郟P| wM}+MJ~BGsBl6^i9aeуeb&hG^xk~ZVnWP:r2Sd/uO.yJK>|GփVbkbyhgeZe~h5a}vk^qmZrppVrtS~w+O_zeK}G့kf'g+hdT@kN`ԁ[m]upzYs!VuRӁxO2{wK{4~JHtj"iflcnh`#:p\qrYxuNV!wR+z Ol|Kp~HPi%~5mne~owb~qx_z#sy\ZtupXwpU+ykR>{vN܀}KfLH-h!|qd}^ra}t^~1v3[~wXV yU0}{*Q|N_~K7Հ9HHg-{tc|Yv `|wu]}`xZ}z'W~b{T~|Q]b~-NAJ_GՀ݂)fzx&b{ryC`|zX\|{cZ}1|cV}}gT ~S~eP~oMfxJzG|mey{az|c_&{B}*\${}YS|~VT}0ISx}Px~bM~_Jt Gt'cy`y^"z[8{GwX{U|@R}6O}M~HJ:GL܂bxN__y&]AyZmzW{kT| RN|Os}sL~1I~G* g`dqc+af+^]iG[l^XV_oU*rQvQN4,yJ}HG_f͆vcc͆fQa i ]5k[nWzqTʄ tQdwNzJX}G}-f fcii`akk]`"nrZpWpsTndv7Q#,yM{J~GAeKj;baol_9n\ qYsGVuT wP߂zYMɂi|J\M|Mj]~JvuhGbt_u]Q%wZCxxX _yUF{PR|Oр~)MJ;G'Ta~w=^&xw\}RyYzWZ{T}R~)Ol@PLՀetJGRȂ`~z]]~X{S[~|@Y~}"V}TV~QNvL~IIŀ4G)u_}E}\}~:Z}~X.~(U~zSd~Q~1N~?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~O3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBQQSbUtWYZ[\]ߣ_ݣ`ڢaءbԟdҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgO3PAQQSbUsVXYZ[\ߨ[ۧ\إ^ԢbҠdўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfO3OAPPRaTrVXYZZY۪Yب[ԥ_ңbѡdРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfN2OAPPR`SqUWXYXܬVجWԩ\Ҧ_ѤbУdСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfN2O@POQ_SpTWXWޭUذRԭXҪ\Ѩ`ЦbϥdϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeN2N@OOP^RnU}WWUٴOԱSѮYЫ]ϩ`ΨbΧcΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeM2M?NNO]RlUyVUܳPշMѲTϯYέ]ͫ_ͪaͩc̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨dM1M>MLN[RhTxT߱Q׿FѸOϴUͱZ̯]̮_ˬa˫c˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪dL1L=LKNXRdSzRھGHκP̶V˴Zʲ]ʱ_ɯ`ɮbɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcK0J+"?,Q6_>iDqJvPzS}UVWXYYZZZZZZZZZZZZZZZZZJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P8QGSWUgWwY[]^`dgilߙoۘrؘu֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙wK*O8PGRVTfVvYZ\]_behkܜn؛rԛuқvқvқvқvқvқvқvқvқvқvқvқvқvқvқvK*O8PFRVTfVvXZ[]^adgݢj١mӞrϝuΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvK*O8PFQUSeVuXY[\^adݪh٩iԧlͤqɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuK*N7OFQUSdUtWYZ\_bޱfڰfհgЫiʧkťoŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsL*N7OEQTScUsVXZ]`a۷cֶeѱfͬgʧhťkĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnL*N7OEPSRbTqVY[]]ܹ]ֹ_ѴbαḓfʩgƧiħkħkħkħkħkħkħkħkħkħkħkħkħkħkħkL*N7NDPSQaSpV|YZZݸYּYҸ]δ`̰cʭeɪfȩhƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjM)M6NDORQ`SnVyYYߵXٿTҼXη\̴`ʱbɮdȬfȪgƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiM)M6MCNPP^TkWuWW۾RSϻX̷\ʴ_ɲaȰcǮeǬgĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhL)L5LBMOP\TgVuU޹SLS̼Xɸ\ȶ_dzaƲcưdůfîgîgîgîgîgîgîgîgîgîgîgîgîgîgîgK(K4K@KMPXTbTxREMSɽXǺ\Ʒ^Ŷ`ŴbijdòefffffffffffffffK(J3I>LIQRSeQzDENTƿYļ\ú^ù`÷b¶cdeeeeeeeeeeeeeeeI'H1G;MDPQPhF|IPUY\^_`bbcccccccccccccccE"B*H.K@GW/k6{AJQVY[]_``abbbbbbbbbbbbbbbAB"H,FC*X2j:wCKQVY[]^^_`aaaaaaaaaaaaaaa>DD/$E-W6f>rEzLRVXZ[[\]^_______________>A/2'E1T:aAjGqMvRzT|V~WXYZ[[\\\\\\\\\\\\\\\>5 !2+B5O=YDaIgLkOnQpSrUsVtVuWuXvYvZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwC#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#O0P>RLT[WkYy[]_dhlprtvxߔ{ܔ۔۔۔۔۔۔۔۔۔۔۔۔۔C#O0P=RLT[VjXx[]^bgkpruwޕz۔ؕוווווווווווווC#O0P=QKSZViXwZ\^`ejpsuݖyڕ֗ӗҗҗҗҗҗҗҗҗҗҗҗҗҗD#N/O=QKSYUhWvY[]_diosݛwٙ~ԘљΚΚΚΚΚΚΚΚΚΚΚΚΚΚD#N/OH/[7j>vFNSWZ]^_`abcddddddddddddd=BE!?6)I2Z:gAqHxO~TWY[\]^_`aaaaaaaaaaaaaa=A?$#7-I6W>bDjIpOuSyU{W}X~YZ[\]^_____________==&'70F9Q@ZFbKgMkPnRpTqVrWsXtYuZu[v\v\w\w\w\w\w\w\w\w\w\w\w\w\w; '+54AOKQWTcVnYx]bf߶iֽn̴sĭy=J'L2M>OJQVSbWlZu^|ceglƻpv|=K&L2M=NIPUT`WiZq_wc}޾dfimrx=K&K1LK&K1K;LFPQTZXa[g]t]`cegjlotz>J%J0J:LDPNTVW[XjXwV\bdfhjlot{>I%I/I8LBQJTPV^TmK{SY^bdfhjlpuyyyyyyyyyyyy>H$H-H6L>QDSQRbGpI}QW\`ceghjmrtttttttttttt?G#F+H3M9PAPTGe@sHPV[_adeghjnpppppppppppp@E!E(I.M1NDGW:g?uHPVZ^`cdefhkmmmmmmmmmmmm@CE$I'K4GH3Y:h@uH~PUZ]`acdegijjjjjjjjjjjjBAEH#F7-J5[fDoKvQ{UXZ\]_`abdeeeeeeeeeeee< A A0*)<1K:WAaFiKoQsTwVyX{Z|[~\]^`abbbbbbbbbbbb<> 5",,;5HOHSRV[Yc^icp߽dgmrx7CJ)J2L=OFSPVXY^_cao`ekpu|7CI(J1L;ODSMVTZX_]_n^~chmrx7CI'I0L9OBSIVNZT\aYl]|bfimqw}7DH&H/L7O>SDUJVXSdUp]{adgjmpu{7DF%H-L4O:S=SMO[JhQtY~^cfhjmptzƒ7EE#H*L0O3P@MPA_GkOvV[`dfhkmqv|ŁŁŁŁŁŁŁŁŁŁŁ7ED!H&L*M3LD9S@aFmMxTZ^befhkmqv{{{{{{{{{{{8BDH!K$J68G9V@cFnMxSY]`bdfhkmquuuuuuuuuuu8@DHG'<92I:X@dFnMvS|X\^`bdfhjmppppppppppp9 @DE>*,<4K;XBbGkMrSwW{Z~\^`bcegilllllllllll: @ B >$-.=6K=VD_IfMlRpUtXvZx\z]{_|a}b~dfhhhhhhhhhhh;?='.0<8H?REYJ`MdPhSjUmWnYp[q\r^r_satcudvdvdvdvdvdvdvdvdvdvdv:; *.3:;DALFRHWK[N^Q`SbUcWdXeZf[g\g^h_iajajajajajajajajajajaj7'# .+65==@DCJENHQKSNUPWRXSYUYVZW[Y[Z\~[\|]]|]]|]]|]]|]]|]]|]]|]]|]]|]]|]].'1'7/96=@3"!,/4;;FBOHVL\OaRdUgXjZk]m_naocpeqgr~js|lt|lt|lt|lt|lt|lt|lt|lt|lt|lt5<6$"..79>CDJGPIULYP\S^V`XaZc\d]e_faf~cg|ehzgizgizgizgizgizgizgizgizgizgi56 (!1,95>=ACDHFLJOMRPTRUTVVWXX~ZY|[Z{][z_[xa\wb]wb]wb]wb]wb]wb]wb]wb]wb]wb]1  !+4(70;6>;A@CCGEJGLI}OJ|QKzRLyTMxUMvWNuXNtZOs\Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]P  $*."2)6.:2=6@8|C:zFuL?sN@rO@qQApRAoTBnUBmWClXDlXDlXDlXDlXDlXDlXDlXDlXDlXDc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzue- v5=F(N3T>XH[R^[ebjhplupxr}t~v|w{w{xzxzxzxzx{w|w|w|w|w|w|w|w|w|wg- x4=F(N2T=WHZR][bbiiontrxt}wx}y}z|{|{{{|{|z}yzzzzzzzzzzzzzzzzzzi- z4=F'N2SVHYQ\Z_cgkorޘv{ؒэ̉džÄs+ 3=H"L+O4S=VEYN\W`_ggߤmrמw{ϗɓďt* 3=H!L*O2S;VCYK[Sa[eg٪lrФt|ȝ|™v* 3=H!K(O0R8V@YH\OaWݵcfҲjrɩq|yw* 3=H K'O/R6U=XC\I_W`e͸grðn|v~x* 3>GK&O-R3U9X?\D[U^deql{szy) 3>GK$O+R0U5X8ZCTT\ccpj{pw{) 3>GK"O(R,U0X1VASSZbaogznt|}) 3>GK N$R'T(U0L?QQY`_mexkry~yx}) 3@GKN Q!R(J3L?POW^]kcviov|ˉvɔqǠmƬsx{{{{{{{{{( 3 AGKNOI+A7ICPNV\\hasf{lryzՂtӌoҗjҤhаmǰp°p°p°p°p°p°p°p°p°(2 CGJLH!8.?;FGMRR]Zf`newi}ms~yx؁t֊p֔m֟g֬eԵeԵeԵeԵeԵeԵeԵeԵeԵ'3 C GIG/%72>>DJKUP^Wf]mbsfxj|ns}yy݀v݈sݑoܛkۡkۡkۡkۡkۡkۡkۡkۡkۡ'5B F F7.(65=ADLJUO^VeZj^obsfvjyn{~r}zx~w}usq~q~q~q~q~q~q~q~q~&8BD<%.+77=BDLJTO\TaXf\j_mcpfrit}muzqwwuxuzxrxqxqxqxqxqxqxqxqxqx%<A=& 0,88>BEJJRMWR\V`Yc\f_hbiek}hlzknwoourprwpq{qq{qq{qq{qq{qq{qq{qq{qq{q&<< )!2-97@?EGHMKROUSXV[Y]\__`}aa{dcyfdvietlfrofprgprgprgprgprgprgprgprgprg$9# !+!4+<4?;BAEFIJLMPPSRUS}XU{ZVy]Ww_XuaYtdZrf[pi[nk\nk\nk\nk\nk\nk\nk\nk\nk\,  %.4(8/;5?:B>FAID~LF{OGyRIwTJvVKtXLrZMq\Mo^Nn`OlcPkePkePkePkePkePkePkePkePkeP %*/#4)8.;2?5|B8yF:wI;uKpQ?nS@mUAlWAjYBi[Ch]Cg_Dg_Dg_Dg_Dg_Dg_Dg_Dg_Dg_D  $).!3%|7)w:+t>-qA/oD0mF1lH2jJ3iL3hN4gP5fQ5eS6cU6bW7aY7aY7aY7aY7aY7aY7aY7aY7aY7X+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndX+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndX+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndZ+i0w7? F*M4R=WF]NdT~kY{q]xw`u}bscqeoeofogogngngnfofoeoeoeoeoeoeoeoeoe\*l/z7? F)M3R=WF[NcTjZ}p^zwaw}dufsgqhqipipipioiphphpgnhnhnhnhnhnhnhnh])n/|6>F)M2RF(M2R;WEZM`Uh[n`ud}{gzixkulsmrmqnqmqmrlpmlnkokokokokokokokoa(r. 6>F'M1S:WD[L^Tf[mateyi}kzmwnuorprpqoropomplrlrlrlrlrlrlrlrlrc't- 6>F&N/T9WBZK^Td[lasfxjm}oyqvrsrqrrqpqnsntoupvpvpvpvpvpvpvpve'v- 5>G%O.S7WAZJ]RbZkarfwkoqzsvtruovnvqurwsxsytytytytytytytytyf&x- 5>H$P-S6V?YH\P`Yj`qfvlptyvuxtyszszuzv{w{x|x|x|x|x|x|x|x|x|h%z, 5>I#O+S4VJ"O)R2V:YB\K^Sg[oeْxmҌs̈xDŽ|~~}~k$}, 5?K O(R/U7X?[G^OeZٟmeИvnʓ~tĎz~l$+ 5@KO&R-U4X<[C^LܫcZҥkeʞsn˜{u{m$+ 4AKN$R+U1X8Z>߳\Kճ`Y̫heäpnxu{n#+ 4AKN"R(U.W3Y:ڿWJϹ^XƱfdmnuv}|p#+ 4BKN Q%T*W-W9SI\Wdckmruz|q"* 5CKNQ"T%V'P7QHZVbcimouw|s"* 5EJNQSS#G6OFXU`aflmtt{|~z|u!* 6 FJMPRK!G4NEVS]`djksqzyzuqrvz||||||||w!)7 FJMOKA#H2MBTQ[]bhhpowv}~xÈrmihlqrrrrrrrrz )9 F JL J5?&H1M?SNZZ`efmmt}tzv|~o҆jБeΞa̫^ʺbļghhhhhhhh~):F I I ;4=*E5L@RKYV_`dhjozqtsxyl|gb]ߦX޵X\^^^^^^^^*=EG? *4"<.C9ICOMWU]]bcgi~lmxrqryulwhydyay]yW{V{V{V{V{V{V{V{V{+@DA*3%;1B;HEMMTTYZ^`cdghzlkurmpxolpiqfqcp`q^r^r^r^r^r^r^r^r,@@%!+4(;2BGCLGPJ~TL{WOxZPu^RraTpdUmhVkkWioXfsYcyZb{Zb{Zb{Zb{Zb{Zb{Zb{Zb{Z  '04&8-<3@8D<H?{LAxPCvSEsVGqYHo\Im_JkbKieLghMekNboOaqOaqOaqOaqOaqOaqOaqOaqO  %+0"5(9,=0|A4xE6uI8rL:pO;nQhY?g\@e_AcaBbdC`hC_iD_iD_iD_iD_iD_iD_iD_iDӾ %+0!}4%w8(s<*p@,nD.kG/iJ1hL2fN2eQ3cS4bV5`X5_[6]]7[`7[a8[a8[a8[a8[a8[a8[a8[a8 %y*s/n3j7!g;"e>$cA%bC&`E&_H']J(\L([O)YQ*XS*WV+UX+UY,UY,UY,UY,UY,UY,UY,UY,R,Z, h2r:xA!{H*zN3wV:u^@rfFomJktMi|OfQdRbS`S_T_T_T_T_T_T`S`S`R`R`R`R`R`R`R`RR,Z, h2r:xA!{H*zN3wV:u^@rfFomJktMi|OfQdRbS`S_T_T_T_T_T_T`S`S`R`R`R`R`R`R`R`RS+[+ j2t:zA!}H*|N2yT:v]AseFplJmtNj{PgReScTaT`U`U`U`U`U`UaTaTaSaSaSaSaSaSaSaSU+^+ l1v9}@!G*M2|S:y[AvdGskKosOlzQjShUfVdVbWaWaWaWbWbWbVbVbUbVbVbVbVbVbVbVW*`* o1y8@ F)M2R:|ZAybGvjLrqPoySmUjWiXfXdYcYcYcYcYcYdXdWbYbYbYbYbYbYbYbYX)c)q0|8? F)L1R:XA}`HyhMvpQrwToWmXkZi[f[d[d\d[d[eZfYd[a\a\a\a\a\a\a\a\Z(e(t07>F(M0R9WA_H}gMynRvvVs}XpZn\k]i]f^e^e^f]g\d]c_b`b`b`b`b`b`b`b`]'h(w/7>F'M/R8W@\GeN}mSytWv|Zs\q^n_k`i`f`g`g_f_eadcedededededededed_'j'y.6?G%N.S6W?[FcMkS}sXz{[w^s`pbmbjcibgbgbfdgehfigigigigigigigiga&m&|.6?H$O,T5X=[EaLjSrX~z\z`ubqdnfkgighhigkhkiljmkmkmkmkmkmkmkmkb%o&- 6@I"P*U2Y;\C_KiRrXz]|bweshqjoknlmlnlolpmqnqnqnqnqnqnqnqnqnd$q%- 7AJ!R(U0X8[@^HgPpXۆy_Հd|hykwmuotpsprptpuquqvqvqvqvqvqvqvqvqf$s$, 7BKR&U-X5[=^EeOْnXҌw`̇fǃjn}p{rysxtxtytytztzszszszszszszszsg#u$, 7CMQ#U*W1Z9]BڟcNјkXʒt`č|gloruv~w}w~w~v~v~u~u~u~u~u~u~u~ui#w#, 8DNQ!T'W-Y4ݪZAӥ`N˞iXØqaygmqtwyzzyyxwwwwwwwwj"x#, 8ENQT#V)X1زT@ͪ]MŤfXnavh~mrvx{||{{zxxxxxxxxk!z", 9FNQSU$ݴS0ҸR?Ȱ[LdWl`sh{nrwz|}~}|{zzzzzzzzm!|"- : GMPRTG.̿P>¶YKbVi`qgxnsw{}~|{{{{{{{{o ~!-: IMPQ޹OD-NIKJ5 ;A'I6QDYP`Zgbniuo{~ttxo{j}f~c~d}h}l|l{l{l{l{l{l{l{x/@HH>/;C$H3PAWM^We_lfysls{pmɅtgǐwbŜz^é{[{Zz^zbybybybybybybyby|/BFB" /9B%J0O=VI\RcZ{jasqglykf܃o`ڎr[כtWԨuSҸuQuTuXvXvXvXvXvXvXvXv0CB"$ /8A)H3N}PBxUEtZHp^KmcMigOflQbrR^yTZTWUSUPUPUPUPUPUPUPUPU! */4#9)>/B4}G8xL;tQ>pU@mYBj]DhaFeeGbjI^oJ[tKX{LTLQMQMQMQMQMQMQMQM պ %+0 5%:*z?.vD1rH4oL6lP8iT9gX;d[]g?Zk@WoATtBQ{CQ{CQ{CQ{CQ{CQ{CQ{CQ{Cش &,~1 w6#r;'n?)kD+hG-fK.dN/bR1`U2^X3\\4Z_5Wc5Ug6Sk7Po8Oo8Oo8Oo8Oo8Oo8Oo8Oo8ϼ !z't,n1i5f: d>"aA#_D$]H%\K&ZM'XQ(VT)TW)RZ*Q^+Oa,Me,Le,Le,Le,Le,Le,Le,Le, |u o i&e+`/]3[7Y:W=U@TCREQHOKMNLQJTIW G[!G[!G[!G[!G[!G[!G[!G[!K,R,Y. d6j=lD!kL(jV/h^4eg8ao;^x>\@YAVBTCQCPCNCNDODPCPCQCQBRBSASASASASASASAL,S,[. e5k=mD!lK(kU/i^4ff9co<`w?]@ZBXCUCSDQDODOEPDQDQDRDRCSBTBTBTBTBTBTBTBN+V+]- h4n<pC!oJ(nS/l\5ie9fm=cu@`}B]CZDXEUFSFRFQFRFRFSFSETEVDVDVDVDVDVDVDVDO*X*`, k4q;sB!sI(qQ/o[5lc:ik>etAc|C`E]FZGXGVHTHSHSHTHTGVGWFXFTGTGTGTGTGTGTGQ)Z)c+ m3t:wA wH(tO/rY5ob;lj?hrBezEcF`H]I[IYJWJUJUJUIWIXHYGVIUJUJUJUJUJUJUJT(\(f* q2x9{A |H'zO/vW5s`;oh@lpCixFfHcJ`K^K[LYLXLVLXKZKYJWKVMVNVNVNVNVNVNVNV'_'i) t1|9@G&N.zT5w^;sf@pnElwHiJfLcMaN^N]N[NZNZMZLYNXPXQXRXRXRXRXRXRXRX'b&l( x09@G%M-S4{[;xdAtmEpuIl~LiNfOdPbQ`Q_Q]P]O[PZR[T\U]V]V]V]V]V]V]V[&d%p'|09@G$M+S3X:}b@xkFttJp}MmPjQgReScTaT_T^T^U_W`XaYbZbZbZbZbZbZbZ]%g$s&/9AG"M)R1W9_?}iExsJt|NpQlTjVgXeYdYcZcZdZe[f\f]g]g]g]g]g]g]g]_$i#v%/ 9AH N'S/W6]>gD~qJx{PtTqWnZm\k]j^i_h_i^j_k`k`l`l`l`l`l`l`l`a#l"x$/ 9BIO$S,W3\;eCڄnK~xRzVwZu]s_qaobncncncococpcpcpcpcpcpcpcpcb"n!{$0 :BJP!U(X/Z8ّbCъkL˅tSƁ}X}\{`ybwduftgsgsftftftftftftftftftftfd"p }$0 :CLSV$X+۞X8җ`CʑiLČqSyY^b~e}g{iyjxjxjxixixhxhxhxhxhxhxhxhf!r$0 : DNSU ߥU)դT7̝]BėfLnTvZ_cfikl~m}m}l}k}j}j}j}j}j}j}j}jg s$0; EPRSڭL(ϩQ6Ƣ[AdKlTtZ|`dhkmnoonmlkkkkkkki u$0; G OQPԶD'ʮO4YAbKiSqZy`eilnpqqponmmmmmmmjw$0< I N O۵GϻC%ŴM3W?_JgSoZv`~eimpqrrqponnnnnnnly$0=K M L 4A$K2U>]IeRlZt`|ejmpr{sxsxrzq}p~o~o~o~o~o~o~on|#0>KK޸D2?"I0R=[HcQjYq_yeim|pwrstptosrrupwowowowowowowop~#0>IG$0< G.P;YF`OgWo^vchyltporkshsfsjqmpoooooooooooooos#0?Gߺ;%/:E+N8VC^MeUl\~taw|frjlnhpcq`r^qapdofofofofofofofov"/?A&3 :C(L5T@\JcQ}jXvr^pzcjgej`l\nXnVnWm[m]m]m]m]m]m]m]mz -;޿+'4>D%K1SHG?C?@@=@=@=@=@=@=@=@ѷ"(.w3p8!k>$gC'dH)aM+^Q,\V.YZ/V_1Sd2Pj3Kp4Hw5D~6A6>7>7>7>7>7>7>7Ӳɾ  {"t(n.h3d9a=^B![F"YJ#WN%TR&RV'O[(M`)Je*Fk*Cp+@v,>{,>{,>{,>{,>{,>{,>{,˺~ wp j"d(`-\2Y7W;T?RBPFNJLMJQHVEZC_ @d =i!;m!;m!;m!;m!;m!;m!;m!ÿzpj d_Z V& R* P/N2L6J9H<F@ECCGAK?O>S;W9\7_7_7_7_7_7_7_E-L,P-U2 [:]B^K]U$[_(Yh,Vq/Rz0O2L3I4G4E4D5B5@5?5?4@4A4C3D3F2F2F2F2F2F2F2G,N+R,W1 ^8`@`J`T$^])\f-Yo0Ux2R3O4L5J5H6F6D6C6A6A6B5D5E4G4G3G3G3G3G3G3G3H+O*U+Z0 a7c?cHcR%a\)^e-[n0Xv3U4Q5O6L7J7I7G8E8D7C7D7F6H6I5F5F6F6F6F6F6F6J*R)W*]/ d6g>fGfP%dZ*ac.^l1[u4X~6T7R8O8M9K9J9H9G9F9G8I8J7H7G8G9G9G9G9G9G9M)T(Z)a- h5k=kEiN%hX*ea/bj2_s5[|7X9U:S:Q;O;M;L;J;J:K:J9J9I:HJ@J@J@J@J@J@J@R'Z&a&i* q4u<vCtJ$pS*n\0jf4gn8cw:`<]>Z?X?V@U@T?T?R>Q=N?MANCODODODODODODODT%]$e%n* v3z;{BzI#vP)rZ/oc4kl9gua@^A\B[BZBXBWAVATBRDSFTGUHUHUHUHUHUHUHW$`#h#r)z2:AH!}N(wV/ta4pj9lt=h~@eBbC`D_E\FZGYGYGYGXIYJZK[L[L[L[L[L[L[LY#c"l"v)2 :AGM&~T-y^3th9pr=l|AiDfGdIbJaK`L_L^L^L]N_O_P`P`P`P`P`P`P`P["e!o!z(2 :@GL$R+[1|f8vo>qyCnGlJjMhNgPeQdQdRdQcRdSeSeTeTeTeTeTeTeT]!h r }(1 9@FL Q'Y/ڂc8|l?xuEt~JrMpPnRlTkUjViViViViVjWjWjVjVjVjVjVjV_ ju '1 9 @FKO#ڏV/щ`8˃i@qF{zKxOvRtUrWqXoYoZnZnZnZnZoYoYoYoYoYoYoYa lw '19 @FKܛJ"ҕS.ː]8Êf@nGvL~Q|TzWxZv[u]t]s]s]s\s\s[s[s[s[s[s[s[cnz&09 A GK֡E!͛Q-ĕZ7c@kGsM{RVY}\|^z_y`x`w_w_w^w]w]w]w]w]w]w]ep|&09A H ܦEѦC ǠN,X7a@iGqMxRWZ]`a~b}b|b{a{`z_z_z_z_z_z_z_fr~%09AI ױ5̫A¥L+V6_?gGnMvS~W[^acdddcb~`~`~`~`~`~`~`ht%/9AߪFҶ3ǰ?J)T5]>dFlMsS{X\_bde|fze|d}cbaaaaaajv$.8Aڵ5ͼ1=H(R3Z=bFjMqSyX\`c|exfugrftevdxcybybybybybybly#-6=. ;F&P2X<`DgLoRvW\~`yctepgmgkglfodqcrcrcrcrcrcrcn|!*1ܷ+, 9D$M0V:^CeJlPtV||[v_qbmeifegcfcegdjcjcjcjcjcjcjcq%% ) 6A"K-T7[@cHjNzqTtyYo]j`ecae^e[e[d^cacbbbbbbbbbbbbt &3?H*Q4Y=aEyhKsoPmwUhYc]^_ZaVbSbRaUaXaY`Y`Y`Y`Y`Y`xٴ*4=F&O0W9x_@qfFlmLfuPa~T\ʼnWWÕZR\O]L]K\L\O]P]P]P]P]P]P]} ѹ ,7 >E"M+yU3r]:kd@ekE`sIZ|MUևPPԔSLҡTIϱUFUEUDVGWHWHWHWHWHWHWձ˿ , 5<C~L&wT-pZ3ja8dh=^oAXxDSGNIJKGLDLBK?L@N@O@O@O@O@O@O ٪θ * 29?xG%rO*lV/g\3bc6]i9WqM@HAEBCABA@AfD!bJ$^P&ZU(V[*Sa,Nh.Ip/Dy1?2;3734323232323232323اʹ¿ ~ v&o-h2c8_>\DXIUN!QS"NX#K^%Fe&Am'=v(9)5*1*.+-+-+-+-+-+-+ϰżyrk f'`-[2W7T<QANEKJHOETCZ>a:i7q 3x 0!-!,!,!,!,!,!,!Ǹulf`[V% R* N/ K4I8F<D@BE@J>O;T7[4a1h.n+v+x+x+x+x+x+xvkb[UOJG D$B)@->1=5 ;9 9= 7B 5G 2L /R ,W *] 'c'd'd'd'd'd'dA-F,I-K0L7 P@QJQTO^Lh!Hq#E{$B%?&='<':'8'7'5'4'4'3'3&3&5%4$3$3$3$3$3$3$B,G+K,M/O5 S?TISSQ]Of!Kp$Hz%E&B'@(>(<(;(9(8(7(7(6(6'6'5&5%5&5&5&5&5&5&D+I*N+P.R4 V=WGVRU[Re"On%Kx&H(E(C)A)?*>*<*;*:*:)9)9(8(6'7'7(7(7(7(7(7(E*L)Q)S,V2 Z<[EZPXY Vc#Sl&Ov(L)I*G+E+C+A+@+?+>+>+=*<*:)9)9*8,8,8,8,8,8,H(O'T(W*\1 _:_C_M]W Za$Wj'Ts)P}+M,K,I-G-E-D-D-C-C-A,@+?+<-;.;/;/;/;/;/;/K'R&X&\(a0 e9eAcJbT _^%\g(Yq*Uz,R-P.N/L/J/I/I/H/G.E.E-A/?1>2@3@3@3@3@3@3N&U$\$a'g/ k7k?iGfQ d[%ae)^n,Zx.W/T0R1Q1P2O2N1L1L0K/H1E4D6E7G8G8G8G8G8G8P$Y#_#f&l- p6q=oElN iX%fb)bl-_u/\1Y2W3V4U4T4R4Q4O4O4M7L9K:L;M[?Z@Z@Y@YAXBXCYCZDZDZDZDZDZDX!bjs$z*2 9@F}N yY&tc.om3lv8i;g>e@dBcCaD`E_E_E_E^F^G_G`G`G`G`G`G`GZdnw#~)18 >DLـV&z`.vi4rr:oz=mAkCjEhGgHfIeJdJdJcJdJdJdJdJdJdJdJdJ\gqz"(06 <AڌHцR&ʁ\.}f5yn;vv?sCqFoHnJmLkMjNiNiMhNiMiMiMiMiMiMiMiM^it}"&.5: ޖ=ӒDʍP%ÈZ.c5k;|s@y{DwHuJsMrOpPoQnQnQmQmPmPmOmOmOmOmOmO`kv!%-37؜6͗BŒM$W-`5hI"S,\4d;kArFzJNQTV}X|X~{X}zW~yVyUxTxTxTxTxTxTeq}!$%Ԯ ɫ/ <G!Q+Z3b;iApFxKORUW|YyZvYuXw~Wx}Vz|Uz|Uz|Uz|Uz|Uz|Ugsݫϳİ- :EO)X2_:g@nFuK~OS}VyXuZr[o[nZpXrWsVsVsVsVsVsVivճ ʹ+8CL(U1]9e?lEsJ{OzRvVqXnZj[h[gZhYkXlWlWlWlWlWlWlyتϷÿ(5@J&S/[7c>jD}qIxyNsRoUjXfZc[`[_ZaYcXeWeWeWeWeWeWo| ҮȻ$2>H#Q-Y5`<|gBwoGqvKlPhScV_X[YYYWXXX[W]V]V]V]V]V]Vr֧ͳ / ;E N)V1{^8ue>plDjtHe}LaP\SXUTVQVOUOURUUUUUUUUUUUUUvѬǸ+ 8BK&zT-t\4nc:ij?drC_{GZKUNQPMQJQHPHPJQLQLQLQLQLQLQ{  զ˱ *5?zI!sQ(mZ.ga4bi9]p=XyAS˃DOʏGKȝHGūJDþJCIBJBKDKDKDKDKDKDK ڠϬŸ +5 |>tFmO"gW(b_-]f1Xn5Sv8N߁;Jݍ>Fܛ?Bڪ@@ؽA>@=@;B6<588696969696969סͮù'x/ p6j>eF`M\T!XZ#Sa&Ni(Jr*E|,A-=.;.9.8.7-5-5-5-5-5-5-ܜЩƵ ~w#p+ i2c9_@[FWLSSOYK` Gh"Bp$>{%9&5'3'1(0(/'/'/'/'/'/'Ҧɲ{ smg% a, \3X9T?QEMJJPGVC]?e:n6x2.+ ) ( ( ( ( ( ( ˯{qib]X%S+ O1 L7 J<GADFAL>R:Y6`2i.s*}'$""""""Ķ}pg_YSMI"F'C,A1>6<; :@ 7E 4K 0R ,Y )a %j "s{sf]VOJ FB>;!9&6*4.22/7-<)A&H"OV^ekkkkkk<,@,C-C0B6A> CICTA^=h:r7|531/.,++**)((&$$#####>+B+D,E/E4E= FHFRD]Af=p:z86421/..-,,,*((&%%%%%?*D*G*H-H3I< JFJQH[EeAn>x<9864322110/-,+('''''A)F(J(L+L1M: ODNNMXJbFlCv@><:8776655220-+ * * * * * D'J&N'P)R/S7 TATKRVO`LiHsE}C A ?!=!=!YHWSU]RgNpKz!H"F"D#C#C#B#A"A"?">!= :#7%7&6'6(6(6(6(6(J$P#V"[%^,`3 `;_E]OZZWdTm!Qw"N#L$J%I%I%H%G$F$E#D"A%@'>)>+=,=,=,=,=,=,M#T!Z `$d*f1g9 eAbL`V]aYj"Vt$T~%R&Q'P'O'M(K(J(I)I)H*G,F.E/E0E0E0E0E0E0O!W^e#j)l.m7 l?hGeRb]_h"\r%Z{'W)U*T,S-R-Q.P.O/O/O/M1L3L4L4M4M4M4M4M4R [bj"o'r-t4 s<pDlNiZfd#bn'_w*]-\/[0Y1X2W3V4U4U4U4T6S7R8S8S8S8S8S8S8U^fn!t&w+z2z9 x@tKpVl`$ij)fs-d{0b2a4`6_7]8\9[9Z:Z:Z:Y;Y`>_>_>^?^?_?_?_?_?_?_?Ycmv|#',2܇9 уD~OzY%vb+sk0ps4n{7m:ki@gAfBeBdBdBcBcBcBcAcAcAcAcA[epy"$(-ԍ5 ˉAÅLV%}_+yh1vo5tw9r

oAnBlDkEiFiFhEgEgDgDgDgDgDgDgD]gr| "#ە%ϓ2 ŏ?JT$]+e1|m6zt:w|=u@tBrEqFoHnHmHlHkGkGkFkFkFkFkFkF_iu~՚!ʘ0 <GQ$Z+b1j6q:}y>{AyDwFuHtJrKqKpJpIoHoGnGnGnGnGnGalwݚОŜ.:EO#X*`1h6o:v>B~E|HzJxL|wLzvMxuLxtKysJzrIzrIzrIzrIzrIzrIcny֟ ˢ+8CM"V)^0f6m:t?|BFI|Kx~Mu|Ns{NqzNqyLrxKtwJtvJtvJtvJtvJtvJep|ٚУŧ)6AK T(\/d5k:r?zC}FyIuLrNnOlOjOj~Ml}Lm|Kn{Kn{Kn{Kn{Kn{Kgsԝ˦&4 ?IR'Z.b4i9p>{xBwFsIoLkNhOeOcOcNeMgLgKgKgKgKgKiv٘ϡŪ#1 =GP%X,`3g8zn=uuAp~ElHhKdM`O^O\O[N]M_L`K`K`K`K`Kly Ԝʥ . :DM#V*~]0xe6sl;ns?j|CeGaI]LYMVNTMTLULXKXKXKXKXKXKp } ڗϡŪ+7AK }S'w[-qb3li8hq|HvQ#pY)k`.fg3ao7\w;X>SAODKEHFFEFEEEGFHFHFHFHFHFyږϡū !/ {;tEnNiV$d^)_e-Zm1Vu5Q8M;I=E>C?A?@>??>@?@?@?@?@?@Ԝʧ {+t7 mAgJbS]["Xc&Tk*Os-K}0G҉2CЗ4@Υ6>̷6<6<5:7888989898989ڗΣĮ|u*n4 h>cG^PYWT_Pg!Lo$Hy&D)A*=+;,9,8+6-4/3/3/3/3/3/ҟȪ}un'h0b9 ]AYIUPQXM`IhDq@| =":#8#6#5"4!1$0$0$0$0$0$֛˧²~t mg"a+[3 W; SBPILPHWD^@g6H3S 1^ .h ,r)|'%$""   9+<*>+>.<3<<:G7Q 5\ 2f0p-z+)'&%$$##"!!;*?)A)A,@2@;>D =O :Z 7d5n2x0.,+*)((''&$#" =(A'C'D*E0E8CB BL @W=a:k7u5~310/..--,+))&#!     @&D%G%I'J.K6I? HI FTC^@h=r;{97655443210.+(('''''B$H#L#N%Q,Q3O< NF LQJ[GeDoAx?><<;;:98762100/////F#K!P T#X*X1U8TB SMPXMbJlHuF~DCCBA@?>=<:98 8!7"7"7"7"7"I!OTZ"^(_.]5Z> YIVTS_PiNrL{KJIGFEDDCCB!A#@$?%?&?&?&?&?&LSY`!d&e,d2b: _D\PZ[WfUoRxQP O!N"M#L#K$K$J$J$I&H(G)F)F*F*F*F*F*OV]ei$k*k/i6f@ dLaW^b\kZs X|#W$V&U'T(S(R)Q*P*P*O+N,N-M-M.M.M.M.M.QYbin"q'r,q2o< lHhSf]cf ao#_w&^(\)[+Z,Y-X.W/V/V/U/T0T1S1S1S1S1S1S1T\ems v$x(x.v8 sDpOmYjb!gk%es(d{*b-a.`0_1^2]3\3[4[4Z4Y4Y4Y4Y4Y4Y4Y4V_iqw{!}$(}4z@vLsVp_"ng&ko*jw-h/g1e3d4c6b7a7`8_7^7^7]7]7]7]7]7]7Xaktzօ#̄1À>}IySv\"td'ql+os.m{1l3k5i7h9f:e;d;c;b:b:b9a9a9a9a9a9Zcnv}݇Њ Ɖ/;FP|Y"ya'wi+tp/sx2q5o7n9l;kg=g=fzj=zi=zi=zi=zi=zi=^hs|ڊѐƓ*7 BKT!\'d+k/|r3zz6y9w<u>|t@yrAvqBtpAso@sn?tn?tm>tm>tm>tm>tm>`ju~ Վ̔'5 @IR Z&b+i/p3x7~:||=xz?uyArwCovCmuCmtBmsAmr@nq?nq?nq?nq?nq?bmxڊВǘ%2 =GPX%`+g/n3}v7y~:v>r@oBk}Ci{DgzDfyCfxBgwAhv@hv@hv@hv@hv@dp { ֎̕œ"0;ENV$^*e/|l3wt7s|:o=l@hBeDbD`D_C_~B`}Ab{@b{@b{@b{@b{@f s ~ Ғș -9CLT#\(zc-vj2qr6mz9i=e?aB^C[DYDXCXBYA[A[A[A[A[Ai v ٍΖÞ*6 @J~R yZ&ta+oh0kp4gx7c;^>Z@WBTBRBQBQAQ@S@S@S@S@S@mzӒɛ&3 >}GwPrX#m_(if,en1`v4\8X;T=P?M?K?J?J?I>K>K>K>K>K>rڌϗĠ!/}: vDqMlUg]$bd(^k,Zs0U}3Q6M8J:F;D;D:C:B;C;C;C;C;C;wԒʝ|*u6 o@jJeR`Z\b#Wi&Sq*O{-K0G2D3A4?4>4=4<5;6;6;6;6;6~ۍϙţxr$m1g< bF]OYWU_QgMo"Iy%EDŽ(AƑ*>Ġ+<°,:,9+8,7.6/6/6/6/6/ԕɠ|pje,`7[A VJRSN[KcGlCv@ہ<ڎ!9؞"7֮"5"4"3#2$1&1&1&1&1&ڐ͝ħtke_(Y2U;QD NM JUF]Ce@n[ :d7n3z0.,*)((((((ʣ~pd\ VQL$H,D3A:>@;G8O4W1` -k *w & $ " !      ītg[TN JEA#>);/855;2A.H+Q&Z"eswj^RKFA =:64#1(/.,3)9%@ HQ\hu {m`TJC>962 /,*(!%%"*06>G Q[envvvvv3,5+6,4/15.=+G&R"]hr|    5*7)8*7-433<0E+P'[#f!py            7)9(:(:+818:5C1N,Y)c'm%w # !              9'<%=&=(=.=7;A8K3V0` .j +t )} ( ' & % % $ $ # # !          <%?#A#A%C,C4A>>H:R7] 5g 2p 1y / . - , , + + * ) ( ' % " !      >#B!E G#J*J2H:EDAO >Y |=<<;;98766543222222EJNTX%X,V3R<OF MQ J\ HgFpEyDCBAA@??>>=<;::9999HNSZ^#_)]/Y7VATM RY OcNlLtK|KJIIHGFEEDCBA A A A A A KQX_c!e&d+a3^=\I YTX^VgToSwRQPOONM L K K!J"I#H$H$G$G$G$G$NU]dhj"j'h-f8dD aO_Z]c\kZsYzX W!V"U#T$S%R%Q%Q%P&O'N'N'N'N'N'N'PXahloo!n'm4k@ iKfVd_bg`o_v!^~#]$\&['Z(Y)W*V*V*U*T*T+S*S*S*S*S*SZdkprsu"t1r= oHmRj[hcfk er#cz%b'a)`*_,^-\-[.Z.Y.Y.X-X-W-W-W-W-U]gnsvw zz.x: uErOpXn`lh!jo$iv'g~)f+e-c.b0a0_1^1^1]0\0\/\/\/\/\/W` iqvy} ǀ+~7 {BxLuUs]qe"ol%ms(l{*j-i/h1f2e3d4~b4}b3|a2{a2{`1{`1{`1{`1{`1Yb lsy ~͂…(5@}J{Sx[vb"tj&rq)px+o.m0l2~k4{i5yh6wg6vf5ue4ue3td3td3td3td3td3Zd n v |Ђdž&3> HQ}Y{`"yg&wn)uv,s~/~r1{q4xo6un7rl7pk7oj7oi6oi5nh4oh4oh4oh4oh4\ g q yր̆‹#1< ENW^"~e&|l)zt,{y|/xw2uv5qt7ns8lq9jp9io8in7hm6il5il5il5il5il5^ i s |҄Ɋ .: CLT\!c%}j)yq-u~z0r}3n{5kz7hx9ev:cu:bt9bs8br7bq6cq6cq6cq6cq6a lvψŎ ,7 AJRZ {a%wh)so,pw/l2h5e7b~9_}:]{:\z9[y8\x7\w7\v6\v6\v6\v6cozքˌ)5?HPzXu_#qf'mn+ju.f~2b4^7[8X9V:U9U~8U}7U|7U|6U|6U|6U|6fs~҈Ǒ%2< ~FyNtVo]!ke%gl)ct-`}0\3X5T7Q8O8N8N7N6N6N6N6N6N6jwڃ΍Ö!.~9 xCrLnTi[ec"aj&]r*Y{-U0Q2N4K5H5G5G4G4F4F4F4F4F4o|ԉɓ}*v6q@ lIgQcY_`[h"Wp%Sy(O+K.G/D0B1A0@0@1?1?1?1?1?1u܃Ϗřyt%o2j< eF`N\VX^TePm Lv#I%E(B)?*<+;*;*:+9,9,9,9,9,|Պʖ~p kf,a7]A YJ URQ[McJkFtC? <"9#7#6"6"5$3%3%3%3%3%݅ϒŝwh_\$X0T;PEMN IV F_Cg@q=|:Έ7͗4˧2ɻ110.....ԎɚpbXTP)L4I>FGCP@Y=b :k 8v520.ߵ,+*)))))͘ãvh[S OJ#F,C5@==E:N7W4`1k.w , ) ( & % $ # " " " " ơzm`TMHD@$=,:37:4A1I-R*\'h#t ~pdWMFA =96!4(1..4+:'B#KUao     tgZOE>95 2/,*!'&$,!29BL X fuxj]QG>62.+' %" #)0 8ANZfq}.+0*/+,.'4$<FQ\f p y0*2)1)/,*1):%D OZdnw        2(4&4'2*//.8,B'L!Wakt}   5%7$7$5&5-562?.I)T%^!hqz       8#:!;!:#<*<39<6F1P-[*e'n%w%~$$#""!!     :!=>@!B'B0@9=B9L5W2a/k.s-{-,,++*)('&%% $ # # # # # # =ACGI%I,G5D>@Hu =| = < < < ; : : 98876554444DINTW W%T,P4M>KJIUH_ Gh Fp FwEEDDCBAA@?>==<<<<<GLSY\\!Z&W.U9TERP QZ PcOkNsMzLKKJIHGFFEDCCBBBBJOW]aa_]']4\A[L YVW_VgUnTvS}RQPPONLLKJIIHHHHLR [aeecd"e0d=bH `R^[]c[kZrYyXWVUT S!R!Q!P!O"N"N"M"M"M"M"OV _ehh h kk-j9hD fNdWc_ag`n^u]}\ [!Z"Y#X$V%U%U%T%S%S$R$R$R$R$QY b h k mn pq*p6nA lKjTh\gdekdrby a"`#_%^&\'[(Z(Y(~X'}W'|W&|W&|W&|W&|W&S [ d j nrsvw'u4s> qHoQmYlajhhogv!e~#d%c'b(~a*{_*y^*x]*w\*v\)v[(u[(u[(u[(u[(U ^g mrvxz{${1y< vFtOrWp^nemlkt"j|$i'}g)zf*we,uc,rb-qa,p`+p`+p_*o_)o_)o_)o_)W `iov{}!/~:{D yLwUu\scqj pq"|ny%ym(vl*tk,qi-nh.lg.ke.je-jd,jc+jc+jc+jc+jc+Yclsz ,8A ~J|RzZxa}wh zuo#vtw&sr(pq+no-kn.hm/fk/ej/di.dh-dg,dg,dg,dg,dg,[fnw~ *5? HPX{~_x|f t{m#qyu&nx~)kv+hu-es/br0`p0^o0^n/^m.^l-^l-^l-^l-^l-]hq{Ȃ'3= F~NzVv]rdok#ks&h~|(e|+b{-^z/\x0Yv0Xt0Xs/Xr.Xq.Xq-Xq-Xq-Xq-`kuŇ$0; ~DyLtTp[mbii!fq%bz'_*[,X.U~/S|0Q{0Qy/Qw.Qv-Rv-Rv-Rv-Rv-coz̄ -~8xA sJoRkYg`ch `o#\x&Y(U+R-O.L.K.K-J~-K}-K|,K|,K|,K|,hsȉ })w5r? mGiOeWa^]fZm Vv#R&O(K*H+F,D+D+D+D+D+D+D+D+myυďzu%p1k;gD bM^U[\WdSkPtL~!H$E&B'@'>'>&='='='='='='sրʌ|qlh,c7_A[I XQTYPaMiIrF|B? @;"9,754>2G0Q-[+f(r&$"!àwi\PE=963"1*.2+9(B%K"V bp{m`TI?830-*'%%,!2:DO\ k {qdWLB91-)& # $*2 ;FTbsugZND;2+&"  ")2<IWfs)*))'*#-3;D OZdnv~+(,'*(&+ 09BM X bkt|.&.%-%)(&.%7 @JU_ h qy0$1"0"-$-++4)=#GR\env} 3!443!4(310:+D&N"Xbksz6879;&:-764@/J+T(^&g$p$w#~"""!  9;<@A"A*>2;;6E3P0Z/d.l-t-|,,,,++**)))('' & & & & <?BFHG%D-@6=@9K8V7`7h7p7w7~6666554322 1 0 0 / / / / ?CGLNM I'E0B:BFBQA[Ad@k@s@y ? ? > > = = < ; : : 9877777BFMRSRNJ(K5LAKLJVJ_ Ig Hn Gu G| FFEEDCBA@??>====EI Q VXVPR#T1T=THRRQ[ Pc OjNqNxMLKKJIHGFEDDCCCCHMU Z [ YW Z\-\9[DZN XW W_VfUmTtS{RQPPNMLKJJIHHHHJ QY ]^`_ ac)c5a@`J ^S ][\c[jYpXwWVUTSRQPO~N~N}M}M}M}ML T\`dfegi&h2g=eG dP bXa_`f^m]t\|[ZYX~W{U yT xSwSwRvRvQvQvQNW_chkjln#n/l:kD iM gUf]ddcjbqay`~^{] y\!w["tZ"sX"rX"qW!qV pV pV pV pV PZagmppqr r-q8pB nK lSjZiaghfo}ewzdxc ub!sa#p_$n^$l]$l\#k[#kZ"kY!kY!kY!kY!R\dkqtuv ww*v6t?rH qPoXm_}lezkmwjtth}rg!of#me$jd%hb&fa&f`%e_$e^#e]"e]"e]"e]"T^fntxz{||({3y=wF uNtV{r]xqcupkrnrom{ll"ik$gj%dh&bg'`e'`d&`c%`b$`b#`b#`b#`b#Vajry}%1~;|D ~{LzyTvx[svbouimtpjry gq"dp$ao&^m'\k'Zj'Zi'Zh&Zg%Zf$Zf$Zf$Zf$Ydmv}".9}B yJ tRq~Ym|`j{ggzndxvaw"^v$[t&Xr'Vq'To'Tm'Tl&Tk%Tj$Tj$Tj$Tj$]gr{+}6x?sH oPlWh^eebl^u[~~!X|#Uz%Ry&Pw'Nu'Ms&Nr&Nq%Np$Np$Np$Np$`kwƀ |(w3r=nE jMfUc\_c\jYsU|R!O#L%I~%H|%Gz%Gy$Gw$Gv$Gv$Gv$Gv$eq|Åzu$p0l:hCdK `S]ZYaViSqO{LI!F"C#A#A"A"@"@~"@~"@~"@~"jwʂzrmi,e7a@]H ZP VWS_PgLoIyFB@=;;::::::p~ʼnvjd`&]2Y<VDSMOU L\ IdFmCw@=:865544444yˆtcZVS,P6M@KHHPEYBa ?j &H$S#_!lzߞݲtfYMB7-* '% #( 09CO\jz xj]QF<2)%" "*2< HUev}naTI?5-% "*3?N^pseXKA7/'   !+6DUfv$)#(),19CMXaks{&'%&"&).7 AJU_hqx)%(#%# %,5> GR\enu|,"+ ( #!#)!2;EO Xbjry..,*+&)/%8AKU^go v | 11/12#0+-3(=#FQZcksy454887&3//8*B'L%V$`#h#o$v$}$$$$$##"!!!!!    78;>> = < < ; : 9 8 8 8 8 @ DK N M GEIK-L9LDLMKVJ^IeIl Hr Hy G F F E DCBA@??>>>>C HORQQN QS(T5T@SIRRQZPa Oh No Nu M}LKKJIHFFEDCCCCELRUXYVXZ%[1Z<YFXOWW V^ Ue TkSrRyQQPON~L|KzJyJxIxHwHwHwHGOUZ^_]^`!a.`9_C^L\T [[ ZbYhXoWvVU}T{SxRvQtPsOrNrMqMqLqLqLIRX^ceccef+e6d@cIaQ `X __^f]m~\t{[|yZvYtXrWpUnTmSlRkQkQkPkPkPJT[cgjii jj(j4i=gFfN eU c\}bczajx`qu_zs^p]n\l[jYhXgWfVfUfUfTfTfTMW_flnnmno&n1m;lDjL ~iS zhZwgaufhreopdwmckbh`f_d^b\a[aZ`Y`Y`X`X`XPZbjprsrss#s/r9qA|oI ynQ umXrk_pjfmimjhuhgefce`d^b\a[_[^[][][\[\[\S]fntwwwxx x,w6|v?wtG tsO qrVmq]kpdhokemsbl}`k]j[hXgWeVdVbVaV`V`V`V`V`jrx|||}}}){|4w{=szEoyM lxTiw[fubcti`sq]r{ZpWoUnSlQjPiPgPfPePePePeYdow} z&v1q;mCjK f~R c}Y`|`]{hZypWxyTwQuOtLrKpJnJmJkJjJjJjJj]is|yt#p.l8hAdIaP ^W [^XfUnRwN~K|I{FyDwCuCsCrCqCpCpCpbnyzrmi+e5a>^F[N XU U\RdOlLuHEC@>=}={=y=x=w=w=whutk ea&^1Z:WCTKQRNZ Kb HjEsB~?=:97777777o|pc\X U,R6P?MGJOGWE_ Bg ?q <|97532210000wDŽ}n_S NK%I0F9DBBK@S=[;d8n6y 3 1 / - , , + * ***̀Œzk[LB@='<2:;8D6M4V2_0i.u,)(&%%$####NJsdVH;31/&-0,9+C)M(W&b$n"} zk]PC7,# !"+5?KWdrӃҖЪ pcVI>3)  '0: F TcsuhZNB8.%  !)4@O_qzl^QF;2)!  ",8GYlpbUH>4+#  $0?Qdv'''*/6@JU_hpx~!%$%',4>GR\fmu{##!!!#* 2;EOYbjqx~% #'/ 8AKU_gnuz)'"! $,4= GQ[cjqw},*&(( %( 09CMV _ g n t z /--/.+#&+!3=HR[cjpv|21 4 540+$$,"7$B%M&V'^(f(l(s(y(((((''&%%$$####5 49 ; 94,+%.20=2H2R3Z3b3h3o3u3{222210/..--,+++8 9?@=526 9-;9CDCA= @B(D4D?DIDQDYC`CgBmBtB{AA@? > = < ; ; : 9 9 9 9 =BGILKGHK$L0L;LEKNKUJ]IcIjHpHw G F F E D C B }A {@ z? y> y> y> y> >FKPSSNPR S-S8RARJQRPYO`Nf Nm Mt L| L K }J{IxHvGuFtEsDrCrCrCrCAINUYZUVXY*Y5X>WGVOUVT]Sc Sj Rq |Qy zPxPvOsNqLoKnJmIlHlHlGlGlGCLSZ^_\\ ]^&^2];\D[LZSYZ }Xa {Wg xVn vVvtUqToSmRkQiOhNgMfLfLfKfKfKFOW^cdaabc$b/b9aA`I}_Qz^X w]^ u\e r[lpZtnY}lXiWgVeUcTbRaQaPaPaOaOaOIR[bghfefg!g,f6e?{dGxcNubU ra\ o`c m_jk_ri^{f]d\a[_Y]X\V\U[T[T[S[S[SLU_fklkjkkk*~k4zj=viEshLpgS mfZ jea hdhfcpcbyaa^`\_Z^X\WZVYVXVWVWVWVWOYcjopono o}p'yo1uo:qnBnmJklQ hkX fj_ cifahn^gw[fYeWdTbS`Q_Q]Q\Q[Q[Q[Q[R]gotssst }txu$tt/pt8ls@irHfrOcqV ap] ^oe[nlYmuVkSjQiOgMeKdKbLaL`L_L_L_Ublsxwwx~ywzrz!nz,kz6gy>dyFaxM^wT [v[ Yuc VtkSssPq~NpKnImGkFiFhFfFeFdFdFdZgpx|{|~xplh)e3a<^D[KY~RV}Y S|a P{iMzrKx|HwEuCtAr@p@n@l@k@j@j@j`lv~}rj ea%^/[9XAUHRPPWM_ Jg GpEzB?}=|;z:x:v:t:r:q:q:qfr|{nc]Y V+S5Q=NELMIUG\De An >x <975444|3{3z3z3zmyyj^T PM%K0H9FADIBQ?Y=b;k8v5 3 1 / . . - - - - - vugZMFC@)?3=<;D9L7U5^3h1s/,*)'''&&&&reVI<75!3*240</E-N,X*b(n&{$"!ˆ|oaRD8, )' %)$2";!EOZftvhZL?4)$-7BN [ i yŊÝ|n`RF:/% '2>KZiz׍ԡҶseWK?4+!  +8FVhzxi\OC8.% $1@Rdw}n`RF;1( )9K_q&% %(+4=HS]fnu{#""$)2;EPZckqw}! '/8BLW`gnty~  %,4>HS\cjpv{"!)0:DNW_flrw|%"$, 5?IS[bhnty(% % &#&/ 9 C MV^dkqv|+ (+ , )"'3>HQY`g m s y  .-21, $ ""&.(9)C*L*U+\+c+i+o+u,|++++*)(('&&%%%13762/* .1)243>4H4P5X5_5e5k4r4x44433210/.----38;<>;68:$<0<:=D=L=T=[=by=w<v;t:t9s9s9s98@EKNMHHIK(K3K<KEJMITI[HaHhGn~Gv|F~yFwE uD sC qB pA n@ m? m> m> l= l= ;CJQTSNN PQ%Q0Q9PBPJOQNX}N^{MeyLlwLsuK| sK pJ nI lH jG iE hD gC gC fB fB fB >FPVZXTTUV"V-V7U?UG|TNySUwR\uRbsQiqPq nPy lO jN hM fLdKcJbIaH aG aF aF aF AJT[^]ZYZZ[*[4}Z=zYDwXKtXRqWYoV`mUg kUo iTw gT eSbR`Q^O]N\M\L\K[J[J[JDNX_a`^]^__'{_1x^:t^Bq]Io\Pl[Wj[^hZe fYm dYu aX _W]V[UYSXRWPWOWNWNWMWMGR\cedbbb czc$vc/sc8ob?laGjaNg`Ue`\c_c a^k ^]s \]~Z[XZVYTWRVRTRSRRRQRQRQJV`ghgffgzhuh!qh,ng5kg=hgEefLceS`eZ^da \ci Ybr Wa|U`R_P]N\MZLYLWMVMUMUMUN[dkkkjk|lulpmlm)im3fl;clC`lJ^kQ[jXYi_ Vhg Tgp RfzOeMdKbIaG_G]G\G[GZGZGZS_ionnn~ovqorjrfr&cr0`r9^rA[qHXqOVpVTo^Qne Omn Llx IkGjEhCfBeAcAaB`B_B_B_Xdmrrrryupvix dx`y#]y-Zy6Xy>UxFSwMPwTNv\KudItl Fsv Dr Ap?o=my ;x 9v 8t 6r 6q 6n 6m 6l 6k 6k epy{zz|rh\U QN%L/I7G?EGCOAW?_ ;8#7,553=2E0N/W-a+l)x'%$"!"!!!!}wj^QE8/-+$*-(5'>%G$P"[!fssg[NA5) "+4=GR^k{ }pdWI<1&   '1;FR`oyk]OC7,"",7CQ`qʄȗƫpbTH<1'  &1>N_qߛݬ۾ugYL@5+" +9J]ozk]PC8.%  $4EXk}$ ##$)1;FR\dkqw|!  !&/9CNX`gmsx}$,5@KT]djouz~!)2<FPX_fkqv{  %.7AKS[bgmrw|   (2<ENV]cinsx~!   !+6@IQY_e k p v { $ #!  $/:CLT[agmrx&&)% * 5!>"G"O#V#]#c#i$o$u$|$$$##"! ),.--*$ &)%+0,:,C-K-R-Y-_.e.k.r.y.---,+*)(~(}'}'}'+12896103 4+565?6G6N6U6\6b6h5o5v5~554}3{2z1x0v/u.u.u-u-/5:@B?:9;<'=2=;=C=K=R=Y<_l=j<i;h:g9g8g8g86=GMNLHGHI I+I4I=~ID|HKyHRwGYuG_sGfqFmoFumEkEiDgCeBdAb@b?a>a=a=a=9CLRRQLLMNN(N1{N:xNBuMIsMOqLVoL]mKdkKkiJsgJ}eIcIaH _G ^E \D \C \B[A[A[A<GQVVURQR R}S%yS.vS7sR?pRFnQMkQSiPZgPaeOicOqaO{_N ]M [L ZK XI WH WF WE VE VD VD ?KUYYXVUV |WwW"tW,pW5mW<kVChVJfUQdUXbU_`Tg^To\SyZR XQ VP TO SM RL RJ RI RH RH RH BPY\\\ZZ~[w[r\o\)k[2h[:f[Ac[HaZO_ZV]Y^[YeYXnWWw UW SU QT OS NQ MP MN MM ML ML ML GT]___^^y_r`m`i`&f`0d`8a`?_`F\_MZ_TX^\V^dT]lR\v P[ NZ LY JW HV HT HR HQ HP HP HP LXabccb{csdme hede$ae-^f5\e=ZeDXeKUdSSdZQcbObjMatJ` H_ F^ E\ CZ BY BW CV CU CT CT Q]effffvhnigj bk^k [k*Yk3Wk;TkBRkIPjQNiXLi`JhhGgrEf~ Ce Ac ?b >` =^ =\ =[ =Z =Y =Y Vbiiiijrminap\qXqUq'Sq0Pq8Nq@LqGJpNHpVFo^DngAmp?l|=k ;j 9h 8f 7d 7b 8a 8` 8_ 8_ \gmmmm}noqet[wUx QxNx#Kx-Ix5Hx=FxDDxLBwS@v\>vd;un9tz7r5q3o2m1l1i1h1f1f1fcnqqqqyskwbyW}MHFC)B1@9>A=H;P9Y7~b5}l3|x1{/y-w,v+t+q+o+n+m+mjuvuuvvxi|^SH?=:#9,745<4D2L1U/_-i+u*(&%$}$z$x$w$v$vr{zzz~{rfZOD820/&-.+6*>)F'P&Z$d"q!{zncVK@4) %#"& /7?IS^kywk_SG<1& %-6? J V cqsh\PD9.# !*4>JXfv}qfZL?4)  '1<IXiz|m_QE9.$!,9HYj}ԒӧжrdVI=2( &4DWkwi[MA5+! /?Sh|"!!"%/:EPYagmsx} #,7BMU]djoty~ !)3>HQY`fkpuz~&/9CLT[bglqvz  !*4>GOW]chmrv|  $/8AJQX^dinsx~ (2<DLTZ`ejou{  !, 6 ? G OV\aglry  &1:BJQW]ciou}$$))&"!#,$5%>%F&M&S&Z&_&e&k&r'z'&&&~%|$z#x"w"w!v v $(/330,)+-'.1.:.B.I.P/V/\/b/h/o/w}/{/y.w.u-s,r*p*o)o(n'n')-7;;852 35#5-666>6E6L6S~6Y|6_{6ey6lw6tu6}s5q5o4m3l2j1i0h/h.g-g-,5>AA?<9:;<)<2<:~`=^<];\:\9[8[7[73@IJJIFEE FzF#wG,tG4qG<oFCmFJjFPiEWgE^eEecEmaEv_D]D\CZBX@W?W>V=V<V;V;8DMNNMJIJyKuK qK)nK2kK9iK@gKGeJNcJTaJ\_Jc^Jk\IuZIXHVGUFSDRCQAQ@Q@Q?Q?<IPQQQONzOtOpPlP&iP/fO7dO>aOD_OK^OR\OZZNaYNjWNsUM~SLQKOJNHMGLELDLCLCLCAMSTTTS}RuSoTkTgT$dT,aT4_T;\TB[TIYTPWSXUS_SShRRqPR|NQLOJNIMHKGIGHGGGFGFEQVWXWWxWqXjX fYbY!_Y*\Y2ZY9XY@VYHTYORXVPX^NWfMWpKV{IUGTESDQCOCNCLCKCJCJJUYZ[ZZs[l\e]`^\^Y^'W^0U^7S^>Q^FO^MM^TK]\I]eG\nE[yCZAY@X?V>T=R>Q>P>O>OOZ]]^^|^n`fa`cZcVdSd$Qd-Od5Md<KdCJdKHdRFcZDbcBbl@aw>`<^;]9[8Y8W8V9U9T9TT_`aaaxbkebfZhTi PjMj!Kj*Hj2Gj9EjACjHBjP@iX>iaq>=qE;qM:pU8p^6oh4ns2m0l/j-h-f-d-b-a-`-`ahhhh{ipken[qRsGw@y=y;y"9y+8y26y:5yA4xI2xR1w[/we-vq+u~)s(r'p&n&l&j&h&g&ghlllmxmnoatWwNzC}9 421&/..6,=+E)N(W&b%m#~{!| {yvtrqoopqqqqurju_zT~I?4+ (& %(#0"7!?HR]iw}{zxxwvvv|vryg}[PE;0% (08AKWc q }|{{z}ncXLA7,"  '09CN[hxvk`TI>3)  %.8CP^nsh]QF;0& "+6BQas~rf[NB6+!  (3AQcvʋɢǸ}paSF:/%  #0?QdxufXJ>2( ,=Pdx #-9DMV]djoty}!*5@IRY`fkpuy~'1;EMU\bglquz #-6@HPW]chlqv{  '1:CKRX^chmqv|  ",5=EMTY_dimrx~&/8@HOUZ`ejou{  )2;CJPV\afl r y   #-6>ELRX]ciov~}{zyxx $#!(19AHNTZ_e l s {} { ywusrqppp"+--+'" $%#&,'5'='D'J(P(V~(\|(bz(ix(pv(yt(r(p(o'm&k$j$i#h"h"h!!+24420,,-.(/1/9~/@{/Fy/Mw/Su/Yt/_r/fp/nn/vm/k/i/g.f-d+c*b)a)a(a(%29::863344$|5-y55v5<t5Cr5Ip5Pn5Vm5]k5di5kg5tf5~d5b4`4_3]1\0\/[.[-[-+8=??>;99 }9y:!u:*r:2p;9n:@l:Fj:Mh:Sf:Ze:ac:ia:r_:|]:\9Z9Y7W6V5V3V2U2U21=ACCB?>|>w?s?o?'l?/j?6h?=f?Dd?Jb?Q`?X_?_]?g[?pY?zX>V>T=S<R:Q9P8P7P6P66BEFGFC~BwCrCmDjD$gD,dD3bD:`DA^DG\DN[DUYD]XDeVDnTCyRCQBOAN@L>L=L;K:K:K9;FHJJIGyGrGmH hHdH!aI)_I1\H8ZH>XHEWHLUHSTH[RHcQHmOHwMGKFJEHDGBGAG?G>G=G=?IKMMM~KtKnLhL cM_M\M'YM.WM5UM<SMCRMJPMROMYMMbLMkJLvHLFKEIDHCFBDBCBBBABACLNOPPzOpOiPcQ^RZRWR$TR,RR3PR:NRAMRHKRPJRXHR`GQiEQtCPAO@N?L>J=I=G>F>E>EHPQSSSvSkTdU^VXWUWQW"OW*MW1KX8IX?HXFFXNEWVCW^AVh@Vr>U]\<\f:[q9[}7Y5X4V3U3S3Q3O4N4NSWXYYzZoZc]\_SaMbHcEcCc$Ac,?c3=d:j;j!:j)8j06j75j>4jF2jN1iW/ia.hl,gy+f)e(c'a'_']'[(Z(Z^_``}`rahc^fUhLkBn9q 5r3r2r%0r,/r3-r;,qB+qK)qT(p^&pi%ov#n"l!j hf d c a accddydoeegZkQnHq>t4x,z*z(z 'z(&z/$z6#z>"zF yPyZxfwsvtrpnljiihhhhviljbmWqMuDx:{0% ")19AKVbo~ ~ | y w u s r qmmm}msnip_tTxI|@6,"" * 2 : DO[hw~}|{srrzrqtfx[}PE;2( !*2<GSaoyxxyxm}bWMB7.$  )2<IWfvvj_TI?4*! &1<JZk~sh]RG<2'  ".:K]q~rg\PC7,! +9J^s܉ڞگٽ~sdUG;/$(8J_s",7AJRZ`fkpty~(3=FNV\bglpuz%.8AIQW]chlquz  *3<DLSY^chlqv{  $.6?FMTY_chlqw} (19AHOUZ_chmrx#,4<CJPUZ_diou|%/7>EKQV[`fkry}||| ) 2 9 @ G M R X ]cipx~|zx v u s s r r  #,5<BINTZ~_|fzmxuv~trpomlkjii%''&#( 0 8!>}!Ez!Ky!Pw!Vu!\s"cq"jp"rn"{l"j!h!f eccbba',..-+'%&'$|(,y(4w(;t(Ar(Gp(Mo(Sm(Yk)`j)gh)pf)yd)b)`(_']&\%\$[#["["#.24421., {-w. t.(r.0o.7m.>k.Di.Jh/Pf/Vd/]b/ea/m_/w]/[/Z.X-W,V*U)U(U(U'*3689754z3u3q3n4%k4-i44g4:e4Ac4Ga4M_4T^4[\4cZ4kY5uW5U4T3R2Q1P/P.O-O,O,/7:<=<9z8t8o8k8h8"e9*b91`97^9>\9D[9JY9QX9YV9aU9jS9tQ9P9N8M7L5K4J2J1J1J04;>?@?}=u<o<j< f=b=_=']=.Z=5X=;W=AU=HS=OR=WQ>_O>hN>rL>~K=I<H;G9F8F6E5E5E49>ACCCy@q@jAeA`A]BZB$WB+UA2SA8QA?OAFNBMMBULB]JBfIBqGB}EAD@C?B=A<A:A9A8A8=ADEF~FuDlDfE`F[FXFUF"RF)PF0NF6LF=JFDIGKHGSFG[EGeDFoBF{AE?D>C=A<@<>===<=;ADGHI{IqHhHaI[JVK RKOKMK'JK.HK4GL;ELBDLICLQALZ@Lc?Kn=KzQOW09WE8WM7VV5V_4Vj2Uv1T0S/Q.O-M.L.J.I.HLOQQ{RqRfS\VUWMYE[@\ =\;]9]&7]-6]44];3]B2]J1\S/\].\h,[t+Z*Y)W(U'S(Q(O(N)NPSTUwUmVcWYZR[J]B`:c6c4d2d#0d*/d1-d8,c?+cG)cP(cZ'be%ar$a#_"^!\ Y!W!V"U"TUWXXsYjY`[W^O`Fc>e5i.k+k*k(k&'k-%k4$k<#kD!jM jWibioh}fec`^\[[Z[\{\p]g^]`ScKfBi:l0o&r"s ss"s)s0s7s?rIrSq_qkpznlj hfdcb_``v`madbZePiGl>o5s,v"y| |||#|*|2|: {C {N zZzfxuwuspnmlkde~dsejebhWlLpCs:w1z(~ $,4=GS`o}{xvutjiziqjik^oSsIx?|6,#$,5?KXgwooxopoesZyP}E;1( #,6AO^ouuwumyb~WLA7-$ !+6CRcv||uj_TI?4*! )6DVi}si^RG=3( &4EZn҄ИЪϹ~sh^SE8-!  #3DZq*4=FNU\bglquz&/9AIQX^chlquz !+4<ELSY_chlqu{  &/8@GNTZ_chlqv| !*3;BIOUZ^cglqw~ %-5=DJPUZ^chmsz (08?EKPUZ_diov~"*3:@FLQV[`els{~{yxwvuu  %-5<BHMRW]c}i{py yw usqpnmlll  (07>C}I{NyTwZv`tgrnpwnljhgedcc c  ""!#|+z3x9v?tErKpPnVm]kdilgueca`^]\[[["&))(&# {w t!'r!/p"6n"<l"Bj"Gh"Mf"Se"Zc#aa#i_#r]#}\#Z#X"W VUUTT!(,..-,|)x&t&p'm'$j(+h(2f(8d(>b(Da(J_)P])W\)_Z)gX)pV){U)S)R(P&O%O$N#N"N!&-0231|0v.r,m, j-f- d-(a-/_.5^.;\.AZ.GX.MW.UU.\T/eR/oP/zO.M.L-J,I*I)I(I'I&+14665x4r2l1h2 d2`2]2%[2,Y22W28U2>T2DR3KQ3RO3ZN3cL3mK4xI3H3F2E0D/D-D,D+D+/479:|9t7m6g6b6^7[7X7"U7)S7/Q75O7;N7BL7IK7PJ8XH8aG8kE8wD8C7A6@4?3?1?0?/@.38:<<x<p9i9c:];Y;U;R;P;&M;-K;3I;9H;@G;GF;=:<8;7;5;4;3;26;=??u?l=d=^>Y?T? P@M@J@$H@*F@1D@7C@>B@EA@L?AU>A^=Ah;@t:@9?8>7<6;69787776:=@A|BrBiA`AYCTCODKDGEEE!CE(AE/?E5>E<=ECADFGuHkHaHWJQKKMDN?O y4}+" '0:GVfxlulnldpYuOzD:0' &0<K\n}surlua{VKA7,# $0>Nav}yu|j_TI?4*!  "0@Rg}ȒƦŸsi^SH>4* /BWl'/8AIQX^chmqv{ "+4=EMSZ_dhmqv{  '08@HOUZ_dhlqv|#+3;CJPUZ_chlqw~ &/6>EKPUZ^cglrx!*19?FKPUY^chmt| $,4:@FKPUY^cipx~|{zzz '.5<AGLPUZ`fl}t{~ywusrqppo !)07=BH}L{RzWx\vctjsrq{omkihgfff  $~,{ 2y 8w >v Dt Ir Nq To Zm `k hi qg {e c b ` _ ^]]\  {xu's.q4o:m@kEjKhQfWd^bf`n^y][YXVVUUU!#$#~!yvspm#j*h0g6e<cBaG`M^T\[ZcYlWwUSRPONNNN"'()(x's%o"l i f!c!&a"-_"3]"9\"?Z"DX#JW#QU#XS#aQ$jP$uN$L#K#J!H HHHH!'+--z,s+n)i'f& b&_'\'#Z'*X'0W'6U(;S(AQ(HP(NN(VM)_K)hI)sH)F)E(D'C%B#B"B!B!%+.01v0o.i-d,`,\,Y,V, T,&R,-P,3N,9L,?K-EI-LH-TG.]E.fD.qB.~A-@,>+>)=(='>&>%).13{4r3k2e0_0[0W0 S0P1N1$L1*J10H16F1<E1CD1JB2RA2[@2e>2p=2}<2;1:/9.9,9+9*9),146x6o6h5a3[4V5Q5 N5K5H5!F5'D5-B53A5:@6A>6H=6P<6Y;7c97o86|76655342404/5.5-0478u9l9d8\7V8Q9L9H9E9C:A:%?:+=:1<:8;:?9:F8;N7;X6;b5;m3;z2:1907060402011137:};r;i<a<X;R<L=G=C> @>=>;?#:?)8?/7?65?=4?D3?L2?V1?`0?l.?y->,=+;+:+8+6,5,46:<z>o>f>^?T?M@GABB>C :C8D6D!4D'3D-1D40D;/DB.DJ-DT+D^*Dj)Cw(C'A&@&>&<&:'9'8:=?w@lAcAZBPCJDDE>G9H4I2J0J/J%-J+,J2+J8)J@(JH'JR&J\$Ih#Iu"H!F E C A!?!>"=>@BsChD_DWEMGGHAI;K4M.O ,P*P(P"'P)%P/$P6#P="PF POPZOfNsMLJHFDCBBD|FoFeG\HTHKKEK>M8P0R(V$W"W!WW%W,W3W:WCVLVWUcUqTRPNLJIHFHwIkJaJYKQLINBP;R4U,X$[^ ^^^"^(^/^7^?^I]T ]` \n [} Y WUS Q P OKLsMhM^NVONPFS?U8X0[(^ adff f f$ f+f2e;eDeOd[cibxa_][XWVO{PnQdQ[RTSLUCY;[4_,b$ehkn nnnn&n-n6m?mJlVkcjrigeca`_TvUjUaUYVRXH[?`7c/f'ilo ruuvww w(w0w9vCvPu]tms~qomkih~ZqZgZ_ZX[N_Dc;h3k+n"ruwz}~ ~")2<HVf~x|{xvutx_m_e___UcKg@l7q.u&x{~  "*5@N^ptdkded\gQlGr=w3|)   *5CTf{rjljdmYrNxC~9/% *8I[osplraxVK@6," *9Lawtyj_TI?4*  +<Pf{ߐݠ۬ #,4=EMSY_dhmqv|  (09AHOUZ_dhmrw}#,4<CJPUZ_dhmrw~ '/7>EKPUZ^chlry#+29@FKPUY^cgms{ &-4:AFKPTY^chnv!(/6;AFKOTY^djrz}{ywvutts #*17<AFK~P}U{Zz`xfvntwrpnmlkjji %~,|2z8y=wBvGtLsQqWo]nclkjthfecba```  ~{x u's.q4p9n>mCkHjNhTfZeacias_~][ZYXWWW{wv s p m "k )i /h 5f ;e@cEaK`Q^X\`ZhXrV~TSQP O O O O ztpmk hfc%a+_1^7\<[BYHWNVUT]RfPpN|MKIHGGGG!#}$u$o"j gda^\!Z(X.V4U9S?QEPKNRL[KdInGzFDCBAAAA"%'y(p(j&e%a#^![ X!U!S!%Q!+O!1N"6L"<J"BI"IG#PF#XD#bC$lA$y@#>#=!< ;<<< &)+u+m+f*a(\'X&U& Q&O&L&!J&(I&.G&3E'9D'?B'FA(N@(V>(`=(k;(w:(9'8&7%6#7!7 7 #),|.r.i.b.],X*S+O+L*I+F+D+%B++A+0?+6>+==,D<,L:-U9-^8-i6-v5,4,3*2)2'2&3%3$'+.y0o1f1_1Y/S.N/J/F/ C/A/?/"4;494 74&64,44235925@15H05Q/5[.5g-5s+5*4*2)1)/)-*,*+-13s5i6`6Y6R6J6D7@7<888694929$19*/90.97-:>,:F+:O*:Z):e'9r&9%8%6$5$3%1%0&/14}6p7f8]9V9N9E:@;;<7<3= 1>/>->",>(*>.)>5(?<'?D%?M$?X#>c">p!= <;975 4!347y9m:c;Z;R;K<C>>>9?3A.C +C)D'D&D&$D,#D3"D:!DB DKDVCaCnB}A@>;:987:v<j=_=W>O>H?@A;B6C/F)H$J"J JJ#J)J0J7J?JHJSI_IlH{GECA?=<;>r?f@\@TALAEC>D9F3H,J%MP QQQ Q&Q-Q4Q<PFPPP\ Oi Nx M K I G E C B?{AmBbCYCQDJEBF[5_-c%fil ortvw wxyz${,{5{AzNz]xnwutqonnWdW\WVWM[C_:d0i(l psvy{~ %.9FVg{||j\b\\\T_Id?i5o,s#w{~ %0=M^ribcb[dPiFo;u1{'  %1@Sg~jhcjXpMvC|8.$&5G[qkpavV}K@6+!  &7JaxҏѡϬ  (09AHOUZ_chmrw} $-5<DJPVZ_cgmrx (07?EKQUZ^bgmry $+3:@FKPUY]bgms{'.5;AFKPTX]bhnv ")06<AFKOSX]ciqz~}{zyyy $+17<AFJOSX~^|ezlxuvtsqponnm&,~2}7{<zAxFwJvOtTsZqaohmqk{jhfeddcc |zx!v(t.s3q8p=nAmFlKjQiWg^eecnay_^\[ZZZZ ~ y wt rpm#k)j/h4g9e>dCbHaM_T^[\cZlXwVUSRRQQQ ~wqnl khfc%b+`0^5]:\?ZEY KW QU YS aR kP vN L K JIIIH xpkgdca ^\ Z'X,W2U7T=RBQHOOMWK`IjHuFDCBA A A A }s kfa^\Y WUS#Q)O.N4L9K?IEGMFUD^BhAt?><;;;;; y#o#g#a#\!YVS PNL J&H+F1E6C<BC@J?R=\<f:r98665556 $v&k'c']&X$T"P!M!J G E C #A!(@!.>!4=!:<"@:"H9#P8#Z6#e5#q3#~2"1!0 0001$'r(h)`*Y)T(P%K%G%D% A%?%=% ;%%:%+8%17&76&>5'F3'N2(X1(c0(o.(}-',&,$+"+ ,-"&|)o+e,],V,P+K)F)B)?)<)9)7)5)#3)(2*/1*50+</+D.,M-,W,,b+,n),|(+(*'('&'$(#("%)y,l-b.Z.S.M.G-B->-:.7. 4.2.0.!/.'-/-,/3+/:*0B)0K(0U'0`&0l%0{$/#.","*"(#'$&',v.j/`0W1P0J0D0=1925222 /3-3+3*3%(4+'41&48%4@$4I#5S!4^ 4k4y320.,+**.s1g2]3T3M3G3@3955507-7)8'8&9$9"#9)"9/ 969>9G9Q9]9i8x76420/..~1o3d4Z5Q5J5D6=77839.:(<$= !> >> >&>->4><>E>O>Z=g=v<:975321z4l6`7W7N8G8A8::5;0<+>%@C DDDD$D*D1D9DBDLDX Ce Bs A @ > < : 8 75u7h9]:S:K:E;>;8=3>-@(B!EHK KKK! K' K. K6 J?JIJTIaHoGEDB@>=9q;d<Y=P=I=B>M^q~{zyw`UYUTTLWB\8a.f%kor vy|~  *6EVi_ZZZS\Ha>g4m*r w|!,;L`va`ZaPgEm:t0z&  .?SjbgXmMsB{8-#!2F]sɉɝǫ $-5<DKPV[_chlqx!)18?FLQVZ^cglry $,3:@GLQUY^bgls| (/5;AGKPTX]bgmv #*17<AFKOSX]bhpy%,27<AEJNSX]cj}t{~yxvutssr  '-27<}@|E{IyNxSwYu_sfqooynljihggg~ |zx"w(v.u3t7r<q@oEnJlOkTi[hbfkduba`^]]\\|yusqom#l)j.i3h8f<e@dFcKaQ`W^_\h[rY~WVUTSSS { t omk hgec%b*`/_4^8\=[BZGXMWTU\SeRpP|NMLKJJK ~tmhd ca `^\ Z&X+W0U5T:S?QDPKNRMZKdInG{FECCBBB xnga^[Z YVTR"Q (O -N 2L 7K <J BH IF QE YC cA n? {> = < ;;;;sib\XUSQPMKJ$H*F/E4D:B@AG?O=X<b:m8z76544 4 4 |oe^XSPMKH FDB!A&?,>1=7;=:D8L7V5`4l2y10/..//xl!b"Z"T"O KHEB @><:#9)7.645;3B2J1T/^.j-w,**))**u"i$_%W%Q$K#G"C @ = :864 3 &1 ,0 2/!9.!@-"H+"R*#])#i("v&"%!%$$%%!r$f&\'T'M'H&C%?$;$8$5$ 2$0$.$,$#+$)*%0)%6(&>'&F&'P%'[$'g"'u!&!% # ! ! }$o&c(Y)Q)K)E)@(;(6(3(0(-)+)))')!&)'%*.$*5#*<"+E!+N +Y+f*s*)'%#"!#z&l)`+V+N+H+B+=+7+1,.,+-(- %.$.".!.% .,/3/:/C/M/X/d/r.-+)'&%%w)i+]-T-L-E-?-:-4.//+0&1#2 3333#3*40484A4K4V3b3p21/-+*)(s,f.Z/Q/I0B0<07012-2(3$578999!9'9.969>9H9T 8` 8n 7} 6 4 2 0 . -,o/b0W1N2F2@2:253/4+5&7!9;> ??? ?% ?+ >3 >;>E>P=\=j @CE HK KKKK%K,K4K=JHJTIcHrGFCB@>p7b9V9M:E:?:::5;.>(@"CFILOP QRRS!S(S0R9RDRPQ^PnOMLIGFj;]<R=I=C===9=1@*D$GJMP RUW X XYZ[$[,[5[?ZKZYXiW{UTRPOe@Y@O@G@A@=@5C.G&K NQT WZ]__ `abcd&e/e9dFdTccav`^\[X_DTDLDFDAC:G1K)O"SVZ ]`beghi jklm!o)p4o?oNn^lpkigfeZIQIKHFH?J6O-T$Y\` cgiloqrst vwy{"}+~7}E|V{hy}wusrWNPMLLDO;T1Y(^cg knrtwy|} #/=M`uVSRRKTAZ7_,e#jpsw{~ &4DWlXXRYG_=e2l(rx}  *:MbzY_OdDk:r/z%,?Um!)18?FLQV[_chmsz %-4;AGLQVZ^chnt|!(/6<BGLPUY^bhnv $+17=BFJOTX]bipy&,28=AEINSX]cjs}~|zyyxx !'-27<@DI~M|SzXy^weunsxqonllkkk~|{"y(x.w3v7u<t@rDqHpMoSmZlajihsfdcaa``_}xu rpon$m)l.k3j7i;h?gDeIdOcUa]_e^o\|ZYWVVUUysoki gfec%b*b.`3_7^;]@\EZKYRWYVaTlRxPONMLLLzqjeca_]\[ Z%Y*W/V3U8T<RAQGONNVL^KiIuGFEDDCC t j c^ [ YX VUSR"P&O+M0L4K9J>HDGKESD\BgAs?>=<<<< znd]XTR P O NLJI#G(F,E1C6B<AB?I>R<[;f9r8665555 ui`YSOLJH G E C B @ %? )> /< 4; :: A8 H7 Q5[3g2s0/ . . ...qe\UOJFDBA?=;:!8'7,62483?1G0P.Z-e+r*)('' ( ( |nbYQKFB?=;9 7532$0)//.5-<+D*N)X'd&p%$#"""#yk_V N H C>;853 1/-,!*')-(3':&B$L#V"b!o~vh\!S"K"E"?!;!7 30.+ )'%$$# *" 1!!8 !A!J"U"a!n!} se"Z#P$H$B$=$8#4#/#,#)#&# ##"$ $$"$(%/%6%?&H&S&_%m%|$" o!b$W%M&F&?&:&5&1%,&''$'!(())) )&)-*4*=*F*Q*^*k)z(&% "! | l$_&T'K(C(=(7(3(.())%*!+,- ....$.+/2/;/D /O .[ .h -w ,+)'% $y#i&\)Q*H*@*:*5*0*,+&,#,.02 34 4 3" 3( 30383A3K3X3e2t1/.,*(t&e)X+N,E,>,8,3,.,*-%.!0246 9 9999&9-949=8H8T8b7p6531/.p*a-U.J.B/;/6/1/-/(0#2468 ;> >???#?*>1>:>E>Q=^ @C DDEE E&E.E7EADMDZCjB{@?<;:f1X3M4D4=47434/4(6"9<>A DGIJ KKLM#M*M3M=LHLVKeJwHFEBA`6T7I7A7;76626,9%<?BE HKMPQ RSTUV&V.V8UCTQTaRsQOMLJ[:O:F:?::969/<(?!CFJ MORUWXZ [\]^!`)`3_>_L^[]m[YWVUU>K>C>>=:<3?+C$GKO RUX[^`abd efhi$k-k8jEiUhgf|eca`QBHBBA?@8C/G'LQUY\_begiklno qsuw&y1x>wNv`utrpomNGHFDE=G4L+R!W\`dgjmpsuwxz|~(5EWk~MKIJCL9Q/W&]ch lotwy|  -<NczOPJQ@W5]+d!jp uy} $3EZpQVG\==<<vi ` Y U QONL KJIH"G&F+E/C4B9A>@E>M=V;`:l8y766555p d[TNK H GF DCBA?#>'=,<1;69<8B7K5T4^2j1w0//...y k`WOIEB@ ? > =<:9 7$6)5.443:1A0I/S- ^, j*w)((((( ug\SKEA=;98 7 5 4 2 1 "0 '/ ,- 2, 9+ @)I(T&_%k#z" " ! """ rdYOHB=964310.,+*$(*'0&7$?#H"R ]jx   naVLE?:620-+) (&$#""(!. 5=FP\iw|k^SIB<73/,)&$" %,3;DOZgvxh[PG?940,)%! # * 1 9!B!M!Y!f t      ueXM D!=!7!2!. * & " ""# #$$$!$(%/ %7 %@ %J %V %b$q$" qbV!K"B#:#5#0#+"'"$"#$%'( ) ) ) )%),)4)<)G)R)_)n(~'%#!n_"R#H%?%8%2%-%)$%$"%&'(* - ....#.).1.:.D.O.\-k,{+)'&$j"[$O&E'<'6'0'+''&$' ')+,/1 2333 3'3.373@3L3Y2h1y0/,*)e%W'K(A):)3).)*)&)#)+-/1 36 7 8999$9+949=9H8V8e7v5430/a)S*H+>,7,1+-+)+&+ -024 69;< =>?@!@(@0@:@E?R>a=s<:985\,O-D.;.5.0.,-)-#/257 9<?AB DEFGH$H,H6GAGNF]EnCA?>>V0J1@19131/0,/&2 58;=@CEHIK LMOP Q(Q2P<PIOXNiL~KIGFQ4F4=47423/2)5"8<?B EHKNPQST VWY[#[-[7ZDZSXdWxUSQOL8B8;86736-8&<@DG KNQTVYZ\]_ aceg'g1g>fLe^cra_]\G<@<:;7:1<)@!DIN RUX[^acdfhik mor!u+t7sFrXqkoljiE@??<>6@-E$JOT Y]`cfilnprtvxz |#/>Ocy}{yDEACCHMQUY^djs~ '-39>BGKOTY^dkv~| "(.49=AEJNSX^en{~|{yvsq#).38<@D~H|M{SyYx`vhtsrpomkjhg|y xwvu$u)u.t3s7r;q?oCnHmMkTj[hcgme{cba_^]\ysomkjih h%g)g.g2f6d:c>bCaH_O^V\^[gYuWVUSRRRvnhdb` ^^]] \%\)\-Z1Y5X:W?UDTJSQQZPcNpM~KJHHGGyme_[XVU TSRR Q%Q)P-O1N5M:K@JFIMGVF_DlCyA@?>>>pf]VRONL KJIIH!H%G)E-D2C6B<@B?J>R=\;h:v977666zj_WPKHFDC BA@??!>&=*<.;3:98?7G6O5Y3e2r10//..sfZ Q J E A ?=<; :9877"5'4+30261=0D/M-X,c+p*)((((n a VMF@<9 7 654 3210/$-(,.+3*:)B(K'V%b$o#~""!""{j ^RIB<8420 / . . ,+)(!'&&+%2$9#A! K U b o~w gZOF?941.+)( ( & % # " ! $ * 1 8ALWdq  t dWLC<61-*'%#"  #)07@JVbp  qaTI@93/*'$!  '.5>IT ` m }     m^RG>71,($!  $ + 3 ; EP]jzj[OD;4/*&"   "( 0 8 B M Z hwgXLA92,($  ! ####$&$-$5$?$J$W$e#u"!cUI? 6 0 * &" ! # %' (())#)*)3)<)G)T(c(s&%$! `RF!<"4"-"("$!!!  "#% ')+ ,-..!.(.0.9.D.Q-`-p+*('$[ N"B#9$1$+$&### ""$&' ),.0 12444%4-464A4N3]2m1/-,,W#J%?&6&/&)&%%"% $&(* ,/145 7 8:;;";*;3;>:J:Y9j8}6421R'E(;)3)-(((%'#&)+-0 257:;= >@BCC&C/B:BFAU@f?z=;:8L+A+8,0+++(*&) +.14 69;>ABDE GIKM"M+L5LAKPIaHuGDBAG.=/5//.+-),#.158 ;=@CFHJLNP RTVW&W1V=UKT[RpQNMKB29232/1,/'1 59= @CFILORTVWY[ ^`c!d+c7cEbU`i^\YX>6763503+5#9=B FJMQTWZ\^`bdfh knq%r1q?oOnblxjhf<:794809'=BH MRVY\`cfhjlnprux {)7G[}pzyu<>9<5=,B"HNTZ^cfiloruwy|~  .?Rg~>A;A1G'NU[agkpswz} $4G]sAF7L-T#[b iouy~+>Si %,39?DIMRV[`flt~!'.4:?DHLQUZ`fnw~ #)/49>BGKOTZ`hp{}xt$*/48=AEJOTZa}j|uzxvutqmj ~||{%{*{/{3{7y;x?wDuItNrTq[odmnlzjhgfeb`}wsponmm m%m)l.l2k6j:h>gCfIdOcVa^`h^t][ZYXVUxojfcb a``` `%`)`-_1^5\9[>ZCYJWQVYTcRoQ}ONMMKJwld^[XVV UUTT T$S(R-Q1P5O9N?LEKLJUH^GjFwDCBBA@|nd[UQNML JJIII I$H(G,F1E5D;BAAH@Q>Z=f<s::9877tg\SMIFDBA A@@@? ?$>(=-<1:79=8D7M6W5b4o210///naVMFA><;:9 88776!5%4)3.231:0A/J.T-_,l+}*)(((yi\QHA<854321 00/.-",&+++0*7)>(G'Q&\%k$z#"!""teW L C < 7 3 0 .,+* ) )('&&#%($-#4"<!E OZhwpaS H @93/, ) ' % $$ #"!  %+2:CMZgvl^ PE=60,(%"    #)09 B M Y gui [ MB:3-)%!       " ) 1:D N Z g v  f XK@70+&"    ' . 6?JVds  cUH=5.($    $+3<GTbq`RE;3,&"   !(1:EQ`o]OB80*$   &. 7 B O^mYK?6.'"   ! "#$$$$,$5$@$L$Z#k"}!VH<3+%  !# % ')))")))3)=)J)X(i'{%$"!QD90)# "$&(* ,.///'0/0:/F/U.e-y,*(&M@ 6!-!'!"  ! #%'),.0 2 4677#7,666C5Q5a3u20.-H"<#2$+$%#!"! !$& (+-02468 : <>? ?)>3>>=M<];q9864C%8&/&(&$%!$#$'* ,/2479;=?A CFII$H/H:GHFYDkB@>=>)4*-)'($'"&'*- 1469<?ACEGJL NQT S*R6QDPTOfM}KJG9-1-+,'+%) *.2 59<?BEHKMOQSVY \_a$`0_=^M\`ZuXVT61/0+/)-$.27 ;?BFJMPSUXZ\^acfimo*n7mGlYkmhfd44/3-1)2 7<AFKNRVY]`bdgiknqtw{#0@~R{fx~vt4826.6%;AGMSX\`cfimortvy|(7J^u7;4:*@!FM U[afimqtwz}.@Uk:?0E&LT[bintx| $6J`u  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./012456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~Q՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԜfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԜgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԜgԜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜e՜eԜfԜfԜfԜfӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜eԜeԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜eԜeԜeԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgQ՛d՜d՜dԜeԝeԝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՛d՜d՜dԝdԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՜c՜d՝dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՜c՝c՝cԝdӝeӝfӝfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛fԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛fԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMiY՛e՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMiZ՛e՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMjZ՛e՛e՛eԛfԛfԛfԛgԛgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMjZ՛e՛e՛eԛfԛfԛfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMkZ՛d՛e՛eԛfԛfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMkߜZ՛d՛e՛eԛfԛfԜfԜfԜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgLlޜ[՛d՛e՛eԛfԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgLnۛ]՛d՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgLo؛a՛d՛e՛eԜeԜeԝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgLr՛d՛d՛e՜eԜeԝeӝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgKu՛d՛d՜d՜dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgK}՛c՜d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgL՛c՜c՝cԝdӝeӝeӝfӜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgM՜c՝bԞcӝdӝeӝeҝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՚e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJQT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJQT՛e՛e՛eԛfԛfԛfԛfԛgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIQT՛e՛e՛eԛfԛfԛfԜfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIRT՛e՛e՛eԛfԛfԜfԜfԜfԜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIRT՛e՛e՛e՛fԛfԜfԜfԜfԜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgISU՛e՛e՛e՛eԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgITU՛d՛e՛e՜eԜeԜfԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgHVU՛d՛e՛eԜeԝeԝeӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgHWU՛d՛d՜dԝdԝeӝfӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgGZU՛d՜d՝dԝdӝeӝfӝfӜfӜfӜfӜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgI]V՛d՜cԝcӝdӝeӝfӝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgJfߞX՜cԞbӝdӝeӝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgKqP՞`ԞcӝdӝeҝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QjZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QjZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QkZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QlZ՚e՚fԛfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgHQr[՛e՛f՛fԛfԛfԜfԜfԜgԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG>Qs[՛e՛e՛fԛfԜfԜfԜfԜfӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF?Qtߛ\՛e՛e՛eԜfԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF?Qvܛ^՛e՛e՛eԜeԜeԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgF@Py؛b՛e՛e՜eԜeԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgEAP|՛d՛e՜d՜dԝdԝeӝfӜfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgDCP՛d՛d՜d՝dԝdӝeӝfӝfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgDDP՛d՜c՝cԝdӝeӝeӝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgEFP՜c՝bԞcӝdӝeҝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgGMMߥOԞbӝdӝeҝeҝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgHWH#6BʻLʷRʴWʲZʱ\ʰ^ʯ_ʯ`ʯ`ʮaʮaʮbʮbʮbʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OQW^՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OQWߙ_՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG+ORWޙ`՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG+OSWݙa՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OSWܙa՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OSWۙb՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWښb՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWٚc՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWؚd՚fԚfԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,NUW֚d՚f՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,NUW՚e՚f՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF-NUW՚e՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF-NVW՚e՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE-NVW՚e՚f՛fԛfԛfԛfԛfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE-NWW՚e՚f՛f՛fԛfԛfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE.NXW՚e՚e՛e՛fԛfԜfԜfԜfԜfӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE.NYW՚e՛e՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD.NZW՚e՛e՛e՜eԜeԜfԝfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD/M\W՚e՛e՛e՜eԜeԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC0M^W՛e՛d՜d՜dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgC1M`X՛d՜d՜dԝdԝeӝeӝfӜfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgB2LdX՛d՜c՝cԝdӝeӝeӝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg@3LhT՜c՝bԝcӝdӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgA4JiNۧKԞcӝdӝeҝeҝfҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgC6Jhߴ@+;DKǽQǻUǹXǸZǷ\Ƕ]Ƕ^ǵ^ǵ_Ƶ`Ƶ`ƴ`ƴaƴaŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbE==]o)w3}TeZۙcԚfԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM>TfZٙd՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM>TgZؙd՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM?ThZ֚e՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM?ThZ՚f՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM?TiZ՚f՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@TjZ՚f՚fԛfԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@TjZ՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@Tk[՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE LATl[՚f՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE LATl[՚f՚f՛fԛfԛfԛfԛfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgE LATm[՚f՛e՛f՛fԛfԜfԜfԜfԜgӜgӜgӛgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD LBTo[՚e՛e՛e՛eԛfԜfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD LCTp[՚e՛e՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD!LCTr[՚e՛e՛e՜eԜeԜfԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC!KETt[՛e՛e՜e՜eԝeԝeӝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC!KFTw[՛d՛d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgB"KHT{Z՛d՜d՝dԝdӝeӝeӝfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgA#JJSX՜c՝cԝcӝdӝeӝfӝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg@#ILO{S՜bԞbӝdӝeӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg?$HPLvLحBԢ\ӝdҝ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<%FFGp(0>FLQTVÿXÿZþ[¾\¾]¾]¾^^___```````````?#CF`#o.x6|>EJNRTVWXYYZ[[\]^^^^^^^^^^^?$ = K+S4X;^@dDiHmIpLsNuPwQxRzTzU{V|W}W}X~Y[[[[[[[[[[[;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_՚fԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SIXk\_ԚfԚgԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԛhԛhԛhԛhԛhԛhԛhԛhԛhԛhԛh<M,SJXl\`ԚfԚfԚgԚgԚgԚgԚgԚgԚgԛgԛhԛhԛhԛhԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛh=M,SKXn\aԚfԚfԚgԚgԚgԚgԚgԛgԛgԛgԛgԛhԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh=L-SLXo\aԚfԚfԚgԚgԚgԛgԛgԛgԛgԛgԛgԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh>L-SLXp\ޘbԚfԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh>L-SMXq\ۙc՚fԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SNXr\ٙd՚fԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SNXt\֚e՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SOXu\՚f՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh@L.ROXv\՚f՚fԚfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh@L/RPXv\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhAL/RPXw\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhAL/RQXx\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӜhӜhӜhӜhӜhӜhӜhӜhӜhAK/RRXz\՚e՚f՛fԛfԛfԛfԛfԛgԜgӛgӛgӛgӛgӛgӛgӛgӛgӜgӜhӜhӜhӜhӜhӜhӜhӜhӜhӜhBK0RRX{\՚e՛e՛e՛fԛfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgBK0RSX|\՚e՛e՛e՛eԜfԜfԜfԜfԜgӜgӜgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgCK1RTX~[՚e՛e՛e՜eԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgDK1RUW[՛e՛e՛e՜eԜeԜeԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgCJ2RWW[՛e՛d՜eԜeԝeԝeӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgCJ3RYVZ՛d՜d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgBJ4Q[TY՛d՜c՝cԝdӝeӝeӝfӜfӜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgBI5O[QV՜c՝cԝcӝdӝeӝfҝfҝfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgAH7KXL|P՝aԞbӝdӝeӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg?G9GNL{߭Gֶ<ҫOѦZѤ^ѤaУbФbФcϤcϤcϤcϥdΥdΥdΥdΦdΦeͦeͧeͧeͧeͧeͧeͧeͧeͧeͧeͧe>@/HNAr2>GMQTWYZ¿[¿\¿]^^__``aaaaaaaaaa;B*>Ja(n1w9|@GKORTUVWXXYZ[\\^^^^^^^^^^;;*>$L/T7Z=^BbFeGgHiIkKmMoOpPqQrSsTtUuVuWvYwZx[x[x[x[x[x[x[x[x[x9".*63;9@;D=I?MAQCTEVGXIZK[M\N]P^Q_S`TaUaWbYcZcZcZcZcZcZcZcZcZc. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cۗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. @P5WN[h]_c՚gԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. AQ6WP[j]_ߗdԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚi/ AR6WQ[l]_ۘeԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚi/ BR7WR[n]_יfԚfԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 BR7WSZp\_ԚfԚfԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 CR8WTZr\`ԚfԚfԚgԚgԚgԚgԚgԛgԛgԛgԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 D R9WUZt\`՚fԚfԚfԚgԚgԛgԛgԛgԛgԛgԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 D R9WVZv\ߘa՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 E Q:WVYw\ݙb՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 E Q:WWYy\ۙc՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;WXYz\ٙd՚f՚fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;VYY{[֚e՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;VZX}[՚e՚f՛fԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӜhӜhӜhӜhӜhӜhӜhӜhӜh3 G!QT]WZ՚e՛e՛e՜eԜeԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh4 J"Q?T]VZ՛e՛d՛e՜eԜeԝeԜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg5 J#Q@S^UY՛d՛d՜d՜dԝeԝeӝfӜfӜfӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg6 J#PAR^TW՛d՜d՜dԝdԝeӝeӝfӜfӜfӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg7I$OAP]QU՜c՜c՝cԝdӝeӝeӝfӜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg9I%L@L[MzQ՜b՞aԝcӝdӝeӝfҝfҝfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg;H&I=HSMzMڪHԞaӝdӝeҝeҝfҝfҝfҝfҜfҜfҜfҜgҜgҜgҜgҜgҜgҝgҝgҝgҝgҝgҝgҝgҝgҝg>G&C6IOIwܹ<5ϸEγOͰU̯Y̮[̭]˭^˭`˭`˭aʭbʭcʭcʭdɭdǭdƮeĮfĮfĮfĮfĮfĮfĮfĮfĮf?@ C+EP3n!1>FLPTWYZ\]^^_`abcddddddddd=;A.,J!^,k4t;zB~HMPSTVWXYZ[\]_`bbbbbbbbb3<+,>(K2S9Z?_DcFfHiIkKmMnOoPpRqSrTsVtWtYuZv\v^w_w_w_w_w_w_w_w_w8.#$.-65=:BWWZr\^ޘcԚfԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛiӛiӛi~%7G)U?WXYt[]ۙcԚfԚfԚgԚgԚgԚgԚgԛhԛhԛhԛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛiӛi%7G)U@WYYu[]ؙd՚fԚfԚgԚgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛi&7H)T@VZXv[]՚f՚fԚfԚfԛgԛgԛgԛgԛgӛhӛhӛhӛhӛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛi&8H*TAVZXwZ]՚f՚fԚfԛfԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhқiқiқiқiқiқiқiқi&8H*SAU[XxZ]՚e՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhқhқhқhқhқhқhқhқhқh&8I+SAU[WyZ\՚e՛e՛fԛfԛfԛgԛgӛgӛgӛgӛgӛhӛhӜhӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh&9I+RBT\WzY\՚e՛e՛eԛfԛfԛfԜgӛgӛgӛgӛgӜgӜhӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh'9J+RBT\VzY\՛e՛e՛e՛eԜfԜfԜfӜgӛgӛgӜgӜgӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh':K,QBS\UzX[՛d՛d՜eԜeԜeԜfӜfӜgӜgӜgӜgӜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh':L,PBR\TzWZ՛d՛d՜dԜeԝeԝfӜfӜgӜgӜgӜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh(;M,OBQ[SyUY՛d՜d՝dԝdԝeӝfӜfӜfӜgҜgҜgҜgҜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜh(<N,NAOZPvSW՜c՝cԝcԝdӝeӝfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜh)=L+L@LWMqPR՝bԞbԝdӝeӝeҝfҝfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg*>J*H=HQMnOߩLبKӞcӝdӝeҝeҝfҝfҜfҜfҜfҜgҜgҜgҜgѝgўgϠhΡhΡhΡhΡhΡhΡhΡhΡh+@F(D7IILoH0ҸAаNϬWϩ[Ϩ^Χ`ΧaΧbͧcͧdͧd̨ęf˩fʪgȫhūi¬j¬j¬j¬j¬j¬j¬j¬j-CA#C-ILDl0>GǿNǼSƻWƺZŹ\Ÿ^Ÿ_ķa·abcdfgikkkkkkkk/@;D-@Le'v0=.F%X/e7n=tByH}MQSUVXY[\^`bdgiiiiiiii47:+";,H4Q;X@]EbGeHhJjLlNnQoRpTqVrXsZt\u_vavdwfwfwfwfwfwfwfwfw07"'.067=;B=G?KANCPESFTIVKWMXOYQZS[U\X]~Z^|\^z__yb`yb`yb`yb`yb`yb`yb`yb`4 !*,%/*2.427598<:><@=~B?|D@zFAxHBwJBuLCtODrQEqSFoVGnXGl[Hl[Hl[Hl[Hl[Hl[Hl[Hl[H  "%)-"z0$w3%s5'q7(o9)m<*l>+j@,iB-hD.gG/fI0dL1cN1bQ2`T3`T3`T3`T3`T3`T3`T3`T3h#g+ m9qD$yM4UE[U`cdogyjlnoqqrsstuvwyyzzzzzzzzh#g+ m9rD%zM4UE[U`ddpgzjlnoqqrsstuvwyyzzzzzzzzi#h+ n9sD%}N5VG\X_gctf~ikmopqrrstuvwxyzzzzzzzzi#j+ p9tE&N7VI\Z^jbwehkmnpqqrstuvwxyzzzzzzzzj"k+ q9vE'O8WK\]^m`{dgjlnopqrrstuwxyyzzzzzzzk"l, s9xE(O:XM\_^p_cfikmnpqqrstuwwxyzzzzzzzl"n, t:|E)P;YO[b]s_behjlmnpqrstuvwxzzzzzzzzm"o, v:F*QXSZh\}]_begݗhڗiؘiטi֘j֘jטlؗnؗpؗrؗtؗvؗyؗ{ؗ{ؗ{ؗ{ؗ{ؗ{ؗ{o!s- z;H,U?WTYj[]^beܗfؘgԚgԚhԚhԚhԚhԚiԚiӚjԙmՙpՙsՙvՙxՙxՙxՙxՙxՙxՙxp!t- {;H,T@VUYk[\^aݘe֙fԚgԚgԚgԚhԚhԚiԚiӚiӚiӚiӚkӚoӚsӚuӚuӚuӚuӚuӚuӚuq!u- |;I,S@VUXlZ\^aٙeԚgԚgԚgԚgԚhԚhԚhӚiӚiӛiӛiӛiқlқpқrқrқrқrқrқrқrr!v- ~<J-S@UVWlY[]ߙa՚fԚfԚgԚgԚgԚhԚhӛhӛiӛiӛiӛiқiқiҜnќqќqќqќqќqќqќqr!w- <K-R@TVWmY[]ݙa՚fԚfԚfԚgԛgԛgӛhӛhӛhӛiӛiқiқiқiќmќoќoќoќoќoќoќos x. <L-Q@TVVmXZ\ܚa՚f՚fԛfԛgԛgӛgӛhӛhӛhӛhқiқiқiқiќmНoНoНoНoНoНoНos y. <L-Q@SVUmWY[ښa՛e՛fԛfԛfԛgӛgӛgӜhӜhҜhҜiҜiҜiҜiНmОoОoОoОoОoОoОot z.=N-P@RUTlVXZٛa՛e՛e՛eԜfԜfӛgӜgӜhҜhҜhҜhҜiҜiҜiОmϟoϟoϟoϟoϟoϟoϟou {.=N,O?QTSkUWYٜ`՛d՜dԜeԝeӜfӜgӜgҜgҜhҜhҜhҜhќiѝjϟnΠpΠpΠpΠpΠpΠpΠpu |.>M,N?OSQiSUWڝ\՜c՝cԝdӝeӜfҜgҜgҜgҜgҜhҜhҜhѝiϠl͢p̢q̢q̢q̢q̢q̢q̢qv ~/>L+L=MQOfP{RTܡV՝bԞcӝeӝeҜfҜgҜgҜgҜgҜgҜhѝhϠḳn˥rʦsʦsʦsʦsʦsʦsʦsw /?J*J;KNMaPwQQۧNա\ӝdӝeҝfҝfҜfҜgҜgҜgОgΠi̢jʥmȧpŪu«x«x«x«x«x«x«xy0AH)G8HINZOyNܰGմBҬQѧ[Ѥ`ѢcТdТeϢeϣfΤg˥hȦiƨlêo˿rɻwƹzĹzĹzĹzĹzĹzĹzz0BE&C3I@M]KyݸB5нBͷM̳T̰Y˯]˭`ʭbʬcɬeƭfĮhƿjźlķp´sy{{{{{{{|1DA!C+IAI^ݿA*2C#X,g4s:|CJOSWZ[]_bdgkotxzzzzzzz!46=0*?)O2[9d?kDpIuNxP{S~UWZ\_behlpvxxxxxxx /9/'%7.B6L<@=~C?{F@yHBwKCuNDsPEqSFoWGmZHk]IjaJheKggKggKggKggKggKggKggK  $(,"~0$y3&u6(r8*p;+n>,l@-jC.iF/gI0eK1dO2bR3`U4^Y5\]6\^6\^6\^6\^6\^6\^6\^6  { up l$i(f+c.a0_3^6\8[;Y>WAVDTG SK QN!OR"NT"NT"NT"NT"NT"NT"NT"]%W*T3 Y?eG"oN0vV=z\H|aR~fYj`md~ph}rk}tm|wn{yo{{pz}qzryrxrxqxpxoxnylylylylylylyl]%X*V3 Z?hF$sN1yU?}[JaTe]iclholqotqvs~xt~zu}|v|v|v{vzv{u{s|rzqzqzqzqzqzqzq^$Y*W3 ]>lF%vN3|T@[M`We`igllopqssvuwwyyz{z~{~{~{}z~y~w~v{v{v{v{v{v{v{v_$Z*Y3 a>oF&zN4TBZO`Zecijlpntqxszu|v}xz}}|{|{|{|{|{|{|{|{`$[)Z3 e=tF'~N6UDZQ`]dghnkunyp}rtuwy|~󁍁}}}}}}}a$\)\3i=xF(N7UF[T^`ckgsjzmoqstvxz}󉃉񆈈b#])^3m=}F)O9VH\W^daofxilnqrstvxz{}툈녎肕肕肕肕肕肕肕c#^(`3r<F*P:WJ[Y]g_sd}hknpqstvxy{|鎁苇戎䅗䅗䅗䅗䅗䅗䅗d#_(b3v<G+Q;XKZ[]i^vafjmoqrtvxy{}厄㋋ቓ߆߆߆߆߆߆߆d#`(f3z<G+RL*N9PIRZTkV{XY[\^۞cћjОmΟr͡vˡ{Ȣšßj!g&}1>K)L8NHPXRhTwUWYYުXԨ]Сf̢jʥqɥvŦ}¥k!g&1?J(K6LENTPcSpU|VUܲQӳRϬ]ͧeɦiŨnvʼƻk!i&1@H&H4IBLOQ\SkSRڼHҾJͶU˱]ʬcƫgʿlɺsƵ}òl!l%1AF$F1G=MHPXQnN>BMɻVǶ]Ƴbf»kqym q%1BC!B,I6MEN\Jp/:ENVü\¹aeinvo v$1 B?C%I1KHE^+p1=GPV\`cgms{p |#2 >=DG4AJ(^/n6{@HPV[_bfkqxŁƌǙƣr"29 >C >6$J,[4i:sA|IPVZ]adiov}͇ΑΝyϫyϫyϫyϫyϫyϫyϫt!28>;#7(H0V8a>jDqJwP|TWZ^bflrz؂׋y֕t֡t֡t֡t֡t֡t֡t֡|199##4,B4N;WA_FeKjMnQqTtXw[y_{c|h}n~u~~}}{|v~ppppppp27!(/0:8D>KCQEWG[J^MaQdTfXh\j`kdl{inxonuvns}nqmnmnmnmnmnmnmnm3 "+'4097;==B@GCJEMIPLRPTSU}WWz[Yw_Ztd[qi\no]ku]h{]f]f]f]f]f]f]f]   $)-#0)4.73:6=9@;}D=zG?wJAuNBrQDpUEmYFj]HhbIehJbmK_rK\zK\zK\zK\zK\zK\zK\zK  !&*/#{2%v6(r9*p<+m@-kC.iF/gJ1eM2bQ3`V4^[5[`6Ye7Vj8Rp9Rp9Rp9Rp9Rp9Rp9Rp9Կ  zto$k(h,d/b2_6^9\<Z@XC VG!TK"QP#OU$MZ$K_%Ge&Ge&Ge&Ge&Ge&Ge&Ge&}slg b^[ X U# S& P) O-M0K3J7H:F?DCBH@M>RmF%sM0vU;x[EyaMyfSxkXxo\ws_vwbu{ct~esfrfpfpfqfqercockchcgcgcgcgcgcgcV%Q+K1 Y6h>rF&yM2{S=}ZH~`P~eW}j]}na{rezvgxziw}kvlultmtlulujuipjljiihihihihihihiW%R+O0 _5n=xE'M4S?XJ_Td[ibmgqj~um}xp||qzrysxsysyrzpuqqqmpkpjojojojojojoX%S*S. d4s<~E(M5SAYM]Wc_hfllpptswv{x~y}z|z}y~wzxuxqxowlvkukukukukukuY$T*W, i3x<E(M5TBYN]Yabgjkqousyv|z~~zvs~p}o{nznznznznznzZ$U*Z+m2}<E(N6UCZO\[_edniun{ruy~􆆆逗zwttt€tttttt[$V)^*r2;F(O6VCYP[\^gapgxlqtx}򊁍팄膐‡{yyyyyyyyyy\$W)a(v1;F(Q5TBWPZ\\h_rd{kpsw{捇ڀ~~~~~~~]#X)e'y1<G'P4SAVOX\[h]s`}hpsy}䑂ފׄх̆ȅĄ„]#Z(h'}0<H&O3Q@TMWZYg\r^}eotz㐁܎Ӊ͊ȋŋŠ^#\'k&0<I%M1O>RKUXWdZp]{`lt~؍ΏȐĐ_#^&n%0<J$K/MDG'K1N9R@UFVUTcTr^el}a"h#{#0 >CG#K*N0P;PKFZFiOwYaitˆb"k!"0 ?BGK"L/K?9O>^DlLxV_fo~ǐãc!o "/> BGH!F2/C7R>`DlLwU]dkw̘ͅzȩe!t /> B DB$)50E7S>_EjLtU|\ahqӍwҠrͰw{~g!z0=A>!'*72E9R@]FfLnTuY{_elw܅wړm٦hԸmȹpsuuuuuum3<; #(,74D;OBXH`MgRlWq\vbyi|q~{|}x|ofੁ`ݾbf€hhhhhhu38 &(/57?=ICQHWK]ObTfYj_meo{lqwursrpphs`uYvYvZvZvZvZvZvZv~0& )%2099?ABHDMHRLVQYV\[_|aawgcsnenwfjefdae[gTiQiQiQiQiQiQi   #, 4)70:7=<@ADEHHMK|RNxVPu[RqaTmgUioWdxW`W\WYVTWQXQXQXQXQXQX ֿ  !'+ 0&4+80<3~?7zD9vHpQ@lVAi[CfaEbgF^oGYxHUHQHMHKGKGKGKGKGKGغ  "',{0"v5%q8(n=*kA,hE-fJ/cN0`S2]Y3Z_5Vf6Qn7Mw8I8E8C9C9C9C9C9C9ڴ} vq"l'h,d0a4^8\<Z@WD UI!RO"OU#L[%Hc&Dk'@s'<}(:(:(:(:(:(:(Ͻyojea] Y V$ S( P,N0L4J9H=FBCHAO>V:]6d3l1r1r1r1r1r1rznf_YT PLIFC@">&<):.83684>2D .K +R (Y '] '] '] '] '] '] G)B0<7>9A> KFROVW"W^(Xe-Xl1Wr4Vx6T~8R9Q:O;M;KP>M?K?K?L>L>M=M5B7H< RDXL\T%^\,_c1^j6]p9\vY?W@UASBQBNBOBOBPAQ@Q?Q>N>M?L?L?L?L?L?J(D/A4E5M: WB]J`S'bZ.cb4bh9an=`t@^zB]C[EYEWFTGSGSGTFTEUDVBRCQDPDPDPDPDPDPDK(E.D2I3 R8\@bH eQ)gX1g`7gf=fmAdsDbyFaH_J]K[KYLXLXLYKZJZHXHUITJQJPJPJPJPJPJL'F.H0M0 X6b>gF"kN+lV3m^:le@jkEiqIgwKe}MdObP`Q]Q]Q^Q^P_O^NZOYPUPSPSPSPSPSPSPM'G-K.R. ^5h=nE#qL-rT5r[=qbDpiInoMluPj|ShUfVdWcWcWcWdVdT_V]WYWXVWVWVWVWVWVWVN'H-P,W,d3n<uC$xK.xQ7xY@w`GugMsmRqtUozXlZk\h]i]h]i\i[e\b]^]]]\\[[[[[[[[[[[[O&J,T*\*j2t:{B$J.P8~VB}^J{ePykVvrZty^q`obmcmcmcnbkbgccdadacabbabababababaP&M*X(a(p1{:B$J.P9UC[KcSjY|p^xxbuerhqiqiqhpgjjfjejfighgggegegegegegeQ&P)\'e'u09A#I.P8UCZL`Uh\ob}wgykumtotoumnojpjqkplnlmlklilililililiR%T'_&j&z/8A"J,P7VBZL]Ue^nevk~oyrwtvsstnvowpvqtrrrpqnqlqlqlqlqlqlS%V&b$n%~.8A J+R6U@YK\Ua^kftm}s}wwywxr{t|u|vzwxwvwsvquouououououoS%Y%e#r$. 8BL)Q3U>XH[R_\ifro|v~|txz{|€}~|{|x{vzszqzqzqzqzqzqT%[$h"u#- 7DM&Q0T:WDZN^Xfcrnٍz̈́~zxu}r}r}r}r}r}rU$^#k!y", 8FL#P,T5W>ZG^Pd^եnoȚ|||yvssssssU$`"n |!, :HLP'S.V6Y=\J^]dzinu}}zwttttttV$b!q ,<HLO!S&U+W3OHY[dmo|~{xuuuuuuW$e t-> HKOQR!G0MDVX`jkzyt{yvvvvvvX#hw.A G KML<&F2MATT]fgvus͌gɫox~{yvvvvvv["k{/BGIF0:*B7JDRQ\`dpp}r܂eڠaϺkrx}~{xvvvvvv^!o0BEC $/!8.@:GGNSX_ajktwy|mb઀^elqv|yz{w~u~u~u~u~u~uct0@@% %/$80?xNBsTEn[HibKdkM^uOWOQOLNGPESFTGVGVGVGVGVGV ݳ #)/!4&9+y=/uC2pI5lO8hU;d\=_c?ZlASxBMCGCBB?AAD?F?F?F?F?F?FѼ !'z-t2 n7#j=&fB(cH*`N,\T.X[0Tc2Nm3Hy4B5<67545747474747474ӷ~x ql$g*b/_4[:X?UDRJ OQ!KX"Ga$Al%;y&6'1(-()()()()()()(ճɾulg b]Y U% R* O/L4J9G?DEAL>T9]4h/u*'""""""˻ujb[V QLHEA!?&=+;0866<3C /L *V &` "k w       wkaZTNJG C@=;9 6$4)1..4+:&A!JS[ffffff>,9267999=8C %<&:'8(6(4)1)/).)/(0(2'3&4%4%3%2&2&2&2&2&?+:2:4=6>9?? EIHRI[Ic Hk#Ft&C}(A)>*<+:+7,5,2,3,4,6+7*8):(8)5*3*3*3*3*3*@+;1=2A4B7D= JFMONXNa"Nj&Kr)I{+F-C.A/>/<0908090;/-;.8/8/8/8/8/8/A*<1A0D1F5J; PDSMTV T_%Tg)Rp-Ox/L1I2F3C4@5=5?5@4A4B3C2D2A3=4<4<5<5<5<5<5B*>/D.I/K1P8 VAYJ[S"[\(Ze-Xm1Uv3R6N7K8H9D:D:E:G9H9I7J7G9C:B:A;A:A:A:A:A:C)A-H,N,Q.X5]=`FaP$aY+`b0^j4[s8X}:TI?J?L?M?N>PI@GAGAFAG@G@G@G@G@D)D+M*S*W,_3e;gChL&gU-f_3dh8`q<]z?YAUCPDODPEQDRDTBRDNFMGLGMGNFOFOFOFOFOFE)H)Q(X(^)f1l9oAoH'nQ.l[5jd;fn?cwC`F\HXITJUJWJWHWISLRMSMTMULVKVKVKVKVKVKF(L(U&]&c'm/ s7w?xG'vN/tX6qa=njBjtGfJcM^NZOZO[N\NXQWSYSZS[R\Q\P\O\O\O\O\OG(O&Y$b$i%s- {6>F&M.|T7y^>ugEqqJm|NiQdS`T]T_R\U\X_Y`YaXbWbUbTbSbSbSbSbSH(R%]#f"n#z+ 6>F$M-S6Z>}dExnLszQnUiXeYbX`Yb]d^f_g^g\h[hYgWgVgVgVgVgVI'U#`!j s!+ 6?G!N*S4XהfL͌rXņah|myoxoynymyjxhwevbu`t^s]s]s]s]s]O$] iu+8 DOSU#W-֧V=˟bLmXzckqttrpm~j|g{dybx_w^w^w^w^w^Q#_lx+9G OQSغG+̲R;]KiXudmtxxurolhe}c|`{_{_{_{_{_S"bo|+:KM N ۽EB(½O9ZIeWpc~muy|zwtpmjfda~`~`~`~`~`V!dr+;IJߺE2?%K6VFaUlayltvzo{sxzu~qnjgebaaaaaX gv*<FA'4="H3SC]Qi^uiurkwcygwnttqxn|khecaaaaa[kz&:?(6?G.P>ZMfYwrdkǃmaÚrXtZscripomsjvgye{c|a|a|a|a|a_o 1) 5?H)P9XG|cSop]c݁eX٘kPӶmOlWm^mdkiimfpdrbtatatatatact ) 4=!F+M6V@{`JnkTb{\V`NbIcMfSgYg_ecdgbi`k_k_k_k_k_iz  պ*4<"B+I5Q=w[ElfLasRVVLWHVG[J^O`T`Y_\^_]a\a\a\a\a\o ֳ!+28!>)D1{M8rV>j_DbkIXzLNOFODNCSEVJXNXQXTXVWVWVWVWVWvڬϺ&-39&{@,tH1mP6gY;`c?XoBODFF?FAD?I@LDNGOIOKPKPKPKPKP Ҵ !(.z4 r;%lB)gK-bS1\\4Vf6Nr9F;=<7<:::=;@AF>N9X3d-t& бŻ|oe^WQ LHC?$<*:0774?0G +R %_ n        ǹrf\UOJF B>;85$2*/0+6'>!HTcr ui]SMHD@= :742/,#*)&/#6?IT _krrrrr6.0526382<0B+I&S&] %h#r!|  6.1545565:3@/H+Q +[ *f(p%{#  7.246384886>3E2O 2Y0c.n+x(%"  8-5291<2<5;;8B 9L 9V7`4k1v.+(%"!$'#"!9-80=.@/A2@8=? ?I@T?^/.?-=/<2<3?4@4B4B3B3B3B3B3=*F'N%T$X&Z)^1 a:aD`O_Y$]c)Zn,Vy/R1N3K4H4F4F3C2C3A7C9F:H:I:J9K8K8K8K8K8@)J%R#Y"^#b'g/ j8jAhJgU%e`+bj/^u3Z5V7S8P9O8L8K7G;J>M?O@Q?Q?R>R=R=R=R=R=C'M#V!^ d i%o- s7t?rGoQ%l\+ig1er5a9];Z|EyM$tX+pd2lo7g};c?`B]D[EZFYGZI\J]J^I_H_G^E^D^D^D^D^DH$S ^gov#}+4 <DK!T)z`1tl9ny?kEhIeLcMbNaNbOcPdOdMdKdJcHcFcFcFcFcFJ#Vakt|")3 ;CIQ%څ\1~g:xsCtIpNnRkTjUiTjUjTjRjPiNhLhJgHgHgHgHgHM"Ydnx!(2; BGؕK$ΏX0ʼnc;nD~zLzRwVtYrZqZqYpWpUoSnPmNlLjJjJjJjJjJO![gr| &09@ ڣ<ΞG"ĘT0_;jEuNTZ}]z_x_w]vZuXsUrRpPoNnLnLnLnLnLQ ^ju#.7ݩ:Ь7ƦD Q.\:fEqN~V\`bb~`|]zZxWvTtQrOqMqMqMqMqMS`my(.Ժ"ȵ3AM,X9cDmNyV]b{dudxb|^~[}XzUxRvPtNtNtNtNtNVcp}ؾ 0 >J*U7`BjMvU]wboejembr_v\yY{V}|S~zQxOxOxOxOxOXfsֳ, :F&R4\?gJ~rSu[l`ed_dbbh_m\qYtVvTwRy}Oy}Oy}Oy}Oy}O\jw֫θ'6C#N0Y;~dFtoOk}Wc][`UaV_^^c[hYlVnTpRrPrPrPrPrP_n| ٥бȾ'3?K*V6ua@lmIc{QZVRZM[LZSZYY_WcUfShQjOjOjOjOjOdr ҫʷ)6 >H$wS/n_9djA[yHRӋNKϢQFRCRITOUUTYS]Q_PbNbNbNbNbNix զͲþ(3<}FtQ'k\0ag8Xt>OCHFCG=G@KEMJNONSMVLXKXKXKXKXKoڠϭƸ%/8v@nK#fU*_a/Vm4M~8E;A;=:8@>A?C?C?C?C?C?֣̰º}u% m-f5`>ZGTQN["Fi%>y'6)/*,*,)/,1042649595959595۟Ϭŷw pjc& ]-W6R>MGGQA]9k2}* #! !& (!)$+&.(.(.(.(.(ѩǵuld \WQ$L, H4 D< ?E;O4[,j%~!"""""Ԧɲui`XR LGA ='9.561?,J%W g }         ˰xk_UNID ?;74"0),0(8#AN^ rö|nbWLGB>:6 30-)#&)"19DRdxrfZPGA=962/ ,*'$!#*1; GUcq-1*5-5-7+;'A!HR]iu.1,4/305.9*?%FP[ gs  /1/2213327.<*D"MXdp }    00205/606439/A)J!Ua m y          105-9,;-:0865=0F(Q'] %h #t    3.9+=)?*?->1;87B5M 4X 1d/o,{)'%#!  6,<(A'D'E)D-B4@> @H ?T=_:j7u420.,+**(%#')+,,,,9)@&F$J$L%K)K0J: JE JPH[EfBq?|<:766531,'!,#0$3$5$6$7$7$7$7$<'D$J"O!R"T&U-S5 S@ SKRWObLmHxF C!A!@!?!>!< 9!4%5'9)<*>*?)@)@)@)@)@)?%G"OUX\$^+]2]< \GZRX^UiQt!O#L$K%J%H%G$E$A)?,A.D/F/G/H.H-H-H-H-H-B$K SZ_d"g(g/g8 eBcM`Z]e Zq$W~&U(S*P,O-M-M-K0I3K4M4O4O3O2O1O1O1O1O1D"NW^ek n&p,q5 p>lHiUfb!bm'_y+]/[1Y3W5V6U6T7S9U9V9V8V7V6U4U4U4U4U4G!Q[bkqu$x*z1z: wDtPo]#lh*hs/f4c7b:`<^=]=\=[>\>\=\<\:[8[7Z6Z6Z6Z6JT^fov{!&-5 ڂ?~LyX$uc,qn2ny8lf=ei=i=i=i=S_iu  ՚Σæ 1 >J!U+`4j{l>{l>{l>Ual x ֗ϟƩ-;GR)]3g;qB{~HtMnQiSeRfPkMn|JqxGsuDtsBuq@vp?vp?vp?vp?Xdp} ړќɥ)8DO&Z0d9zn@rzGlLeP`R[R\ObMfJi~Gl{EnxBovApu@pu@pu@pu@[h tԘ̡ê%4 AL#W,ya5ql=jxCcI\MVORORNXL]JaGeEg~Ci{Aiz@iz@iz@iz@_l yڔϞǧ0 =HyS(q^0ii8bu>[DTHNJJJHJOITHYF\D_BaAb@b@b@b@cpԚʤ*8xDpP"i[*af1Zs7SF>J>M=O=Pg8x1.+)$(!+$.%0'1'1'1'1'ԝɩ{ne^WQ%L/G8CC >N 8Z1i+{%""%&&&&ڙ̧±}pd[T NHC$>-:56?0J*W$h |       ϤŰqeYOJD ?:6 2(.0*9#CQc z    ǮtgZNE@:61 -)& "(1; HZqxk_SH>940-)%"!*3?Oc~}ocWLC:40-)&# # ,6DUh{%4&4'4&5#:?G P\gs&3(2*2)4&7!=ENYeq~'2+0-0-1*5%:BK Vcp{*0/.1-1./2*7%>GS _kw..2+5*5+3.03+:#CNZfr ~  1+6(9':'9*6.15.?*J%V bmx          4)9%=#>#>%<);19;6F1Q-]+h )s '~ % $ # " ! !        7&=#A!D D!D%D.B7@A<:9!;!=!>!> > > > > @ HOTY^`$_+]3Y=WI UVSbQnOyNMLK J H!H!F#D%D&E&F&F%F$F#F#F#F#CLSY`dg!h'f.c7bD _Q]][hYsX}!V#U%T'R(Q(P(O*M+M+M*N)M(M'L&L&L&L&FOV]ejmo"o(n1l? jLgXecbn"`x&_)]+\-Z.Y/W/V/U0U/T.T-S+R*Q)Q)Q)Q)HRZa iosuww,v; sHpTm_ ki%is)g~-e0c2a4`5^5]4[4[3Z1Y/X-W,V+V+V+V+KT] e msx{~ˀ(7 |DyPv[!se&po+nz0l3j6h8f9d9b9a7`6_4^1\/[.Z-Z-Z-Z-MW_ i q x }Ղ͆É$4AM~X!{b'xk-uv2r6p9n;l=j=|h<{g:|e8|d6}b3}`1}_0}^.}^.}^.}^.OYblu |փΈō 0>JT _'h-|r3y}7w;~u>yr?up@sn?rmlp;nm9pk6qi4rg2se1se1se1se1T^ ht}Ն̎”*8 DOY%c,}l2ww7r_AZBWAW?\~=`y:bu8er5fp4gn2gn2gn2gn2Yeq}ֈ̑™ !1=IzS t]'ng-gr3a8\S5A6F5J4M3O2Q1Q1Q1Q1fs߃ґǛztn.h; bG\SV_Pj Kw%E(@+<,:,8-7/<0@0D0F/H/H/H/H/l|ٌ̘âshc%^4YA SNNZHgCu>φ:Κ!6˳"4!2$/'2)7*:+<+>+>+>+>+tѕǠ{la[U,P:LGGT Ba>o962/,((,"0#2$4$4$4$4$~א˝rdZ TO%I1E<@I;V7d 2t .+('""%(****ދϛŦvi\RLGB'>19<4G/U*d%w!    ӘȤyk_RID?:6%2..8(C"Qbw   ʣ{maTJ@;61-) %(!1<J \tìqcVJ@72-)$ ! ) 3AUmuh[OD:0)%   *8Kczm`TI?6.&" %1AUl 4"2!248>EOYeq|"2$0$0"26; BLWbo{$0'.'-&/"38?IT_lw(.++++*,&/ 4< DP\gs~++.)0'/(++&07@K Wbny/)2%4$3$1&,+(3%=GR^i t~2&6"8 8 6!3&3/08,C&N!Ydoy          5#9<=<<"<+:47>2I.T*`(k&u&&%%$#"      ! ! ! ! 8 =ABCFE'C/@9=D9P6[4g3q3{2210/.-- , *((*+,,,,;AEHKNN#L*I4F?CK@W?c>m >w > = = <;:997544555555>EILRVVT%Q-N8LEKRK] Jh IrI{HGGEDCB@?==>>====AHMR Y\][Y%W1W?WL VX UcSmRvQPONMKJIGEEEDDCCCDKQ W ^ aba_b,b;aH _T^^\h[qZ{XW V"T#S#Q#P#N#L"L!K JIIIIFNT\b f gghk(k7jD hOfZddbmaw _#^%]&[(Y(W(V(T'S%R$P"O!N NNNHP W`fjmopt$s3r@ pLmVl`jjhs#f}&d(b*a,_,],}[+{Z*zX(zW&zU$zT#zS!zR!zR!zR!KS Zdjotvx { {0y= wHuSs]pf np$lz(j+h-}g/zd0vc0ta.s_,s^*s\(tZ&tX$tW#tW"tW"tW"MU]gnuz}-: ~E|PyZwc!um%rw)}p,yn/um1qj2nh2lg1ke.lc,ma)n^'o\&o[$oZ$oZ$oZ$OXakszƀ)7CMW~a ~{j%zyt)uw-qu0ms2iq4eo4dm2ck0eh-ge+hc(ia'j_%j^%j^%j^%Q Zdnx̀†%4@ JT|^wg$rq)n|-i|0ez3`x4]v4[t3[r1]n.`k,bh)ce(dc&ec&ec&ec&T ]hs}ȅ !0= HzRu[pe#kn'fz,a/]2X4U}4S{3Sx1Vu.Yq,[m*]j(^h'_g&_g&_g&Wamy΃ċ,9 yDsOnYib dl%_w)Z-U0P2M2K1K0N{.Qv,Ts*Vp(Xn'Xm'Xm'Xm'[erʉ}'w5rA lLgVb`\j!Wu%R)M,I.E.D-C-E,I~+Ly)Ov(Qs'Qr&Qr&Qr&_jyІŐy t!o0j<dH _RZ]UgPs K#F&B(>(=';)<)@(D'F~&Iz&Iy%Iy%Iy%dq؁ˍpie)a7\CWN RYMdHpC~?; 8!7 4"3$7$;$=$@#@#@#@#izщƕ|k] YV.R<MHIT E` @m<{8521.,-146777rل˒ufVKH"E1B??M;Z8h4w 1Љ .Ϡ+̼* '$#'*,---~юƛ{l^QC?;%936A3O/],m)&$"  !"""׊ʙqdVJ>941'.3*?&M"]o    ΗâugZNC82-*&$"/:IZ o ơxj]PE;1*&" (4BUl|m_RF<3*"  +:NgreXK@5+" "1E_xj]QF<2*!  *<Tr20026<CLWbnz0..049@IT_kw!.",!+-0 5=FP\gr}$+&)%("),28BLXbmx((*&*$'%!',4=HS^is|,%.".!,!'" &09D NZdnw/#120,*#(,%5?IU_ i s { 2 565342'/0*:%E!P[eox59;:;<:"7+45/@,K*W)a)k)u)~))))(('&%$" ! ! " # # # 8<?? CDB>$;.795E5R6]7g7p7y77766432 1 / - , - - - - - ;@C EJ KID?%?2A@CLCXCbCkCt B} B A A @ > =<:97555555>CFKP Q N HGL,N;OGNSN] Mf Lo LxKJIHGEDB@>=<<;;;AF JQUVURSW'X6XCXNWY VbUkTtS}RQONLJIGEDCB~A~A~ACIMUZ\^]\`#a2a?`J _U ]^\g[pZzXWVTRP}O{MyKxJxHxGwFwFwFEKQY^cfee hi/h;gG fQd[cdam`v^][ |Z!yX!vV!tT sSrQrOrMrLrKrKrKG NU]dilmlop+o8nD lNkXiagjfs~d}{c!wa#t_$q]$n[$mZ"kX kVkTlRlPlOlOlOJ PXaiortsuv(v5tA sKqUo^~ng{lpwjz sh"pg$le&ic&fa&e_$d]"d[ eXfVgUgTgTgTLS\entxzz|}$|2{>yI wR|v[xtdtrmppw lo#hm&ek'ai(^g'^e%]c#^`!_]a[aYbXbXbXNU`jsy~!/;F z~Pu}Yq{bmykiwu eu#at&]r(Zo(Wm(Vk&Vh$Wf"Yc [`\]\\\\\\QXdox,~8xC sMoVk_fhbr^}~"Z{%Vy'Rv(Ot'Oq&On$Pk"Sg UdVbWaWaWaT\iu~|'v5q@mJ hSd]_f[pW| R#N%K~&H|&Gy%Gu#Hr"Km NjOgPfPfPfWbo{Äxs"o0j<fF aP]ZXdTnOzK G"C#A"@"?~!@z CuFqHnIlIlIl[hvʂ{ojf+b7^BYM UWQaLlHxD@<:987;~>y@uAsAsAs`o~ʼnzh_[#X1T=QHMS I^ EiAv=96331/2589|9|9|gxˆvdTOL(I5FBCM@Y<)977D5Q2_/m,~*'%$" !$%%%}ˍvgYK=0 ,*((6&D%T#d!uӊѣ    Љŗ|m_QD8,# !'4BSf{     ɕqcVI>3( $0 >Qf~ tfYLA6,# *9Ldxi[NC8.%  "2F`~oaTG;0&  *>Z}ugZNB8.% "7Su0.. 049@IT`lx.,,-16=FP]it}+))* -28BLXdox!(!&%&).4=GS_js{$%$""!!$ (09CNZdnv~("(&!#,5?IU_iqy+,+& (0 :DPZdmt|.0.+)(%# ,5?J U _ h q y       133 /21-(%"/9EP[dm u!}!!"!!47779 83-'&%2)?+K-V/`0i0q0y000//-,+*(&$#$$$7: :>@>8 //4,7::F;Q;[DFCA;=A'D5EBFMFWF`EiEqEz D D C A @ > = ; 9 7 5 4 ~4 ~4 ~4 = @BIKNMIHL"N1O>OIOSO\Ne Mm Mv L KJHGEC|Bz@y=x<w; v: v: v: ? BGNSVWTR UW-X:XEWOVY Ua Tj SrR|QP~O{MxKvItHrFqCpBp@p?p?p?AEKRY]_]Z]_*_6_B^L]U \^ [fZoYx|WyVvUsSpQnOlMkKjIjGjEjDjDjDCGOW_cedbde&f3e?dIcR b[~ad{`lx^vu]q\nZkXhVfTeRdPdNdLdJeIeHeHEJS]diljhjl#l0k<jFiP {hXxgatejqdsnc~jag`d^a\_Z^X^U]S^Q_O_M_M_MGKWbioqpop rr-r9}pCyoM unVqm^nkgjjpgh{dg`e]cZaX_X]WZWXXUYSZQZQZQJO\gntvuuw xx*{x6wwAsvJ otS ks\hredpn`oy]mYkViSgQdQbQ_Q]SZTWUUUUUULTaltz{{|}~~y&u3p~>l|Gh{Q ezYayb]wlZuwVtRrOpLmJkJhJeJcL_N\OZOZOZOYfqz~vr"n/j:fDbN ^W Z`WjS}tO{KyHwEuCrCoClCiEeGbI_I_I_R_mwwn if*b6^A[KWT S] OgLrHDA>~<{l@iBfBfBfVfs~sf`\$Y1V<SGOQL[ He DpA~=:7654}4y6t8p:m:m:m]n{paU QO*L6IAFLCW@b:;537":0<<=G>P>Y>b>j>r>z==<;97~6|4z2x/w-w,v,v,88<@FHGA> BD+F8GCGMGVG^FfFnEwED C }B z@ x> u< s: r8 p6p4o3o2o2:;@GNQPKHKM(O4O?OIORN[NcMkLt }K~ zJ wI tH rF oD mB k@ j> i< i9i8h8h8<=DNUXWTQSU$V1V<VFUOUX~T`{Sh xRq uQ{ rPpOmMjLgJfHdF cC cA b? b> c= c= >?IT[^]ZXZ[!\.]9\C}\Lz[UwZ] tYf qXn nWxkViTfScQ`O_M^K]I \F \D ]B ]B ]B @COY`cb`_` bc+~c6zbAwbJtaRq`[ n_c k^lh]ve[bZ_Y\VYTXRXPWMWK WH XG XF XF BGT^ehgfef g|h'xi4th>qgGnfPkfX hea ecjbbt^a[_X^U\SYRWQUQRQORM RK SJ SJ DKYcjlkkklzmvn$rn0on;kmDhlMelV bk^ ^jg [hqXg}UeRcOaL_K\KZKWKTLR MP MO MO FP^hppppqzrstot lu-ht8etBbsK^rS[q\ Xpe UnoQm{NkKjHgFeEbD`D]EZFW GU HT HT IWdnuutuwsyl{ h{d{)a{4^{>[zHXyQUxZ Qwc Nvm KtyGrDqAo?l>i>f>c>`?] AZ AY AY M]jt{zyz||ne_\$Y0V;TDQNMWJaG~k D|w @{=y:w8t8q7m7j7g8c :a ;_ ;_ Tdq{yj^VSP*M6K@HJESB^?hD!K Xgx{wj]O@3& %2?M ] n   ƇteVH;." "0>N`tyj\MA4),<Nbzԗи}n`RE9-"  '8LdqcUG;0&!4JexiZL>2'  /Gf~pbTG;/$)De +)**-2:DQ]hqy( &&'*.6@MYdlt{%#"$%)0;HT_gou}"  #,7CNYaipw}'2=IS[cjqw}#-8CMV^ekrx~  '1<FPX`fmsz#   +6@JS[biov~& $ #/:D M V ^ elt| ) '"$  (4>HQZaip x ,*)*,+' ""%/':)D*M+V,^,e-m-u-~-,+*('}%{#y!xwww/,/3884/*.1*364@5J6R7Z7b7j7r7{665|3z2w0t.r,q)p'o%o$o$1.4<BB?:68;&=2><?F?O?W?_?g?o}>x{>x=v<s;q9n7l5j2i0h.h,g+g+32:DJIGB@AC"E.F9GCGLGT}F\zFdxFluEusDpCnBkAi?f=e;c8b6a4a2a1a156AJPONKHIKL+M6~N@{NIxMQvMYsLaqLjnKslJ}iI fH dF aD _B ]@\>\;[9[7[6[67:FPUTSQOP R~S({T3xT=uTFrSOoSWmR_jRghQpeP{ bO `M ]L ZJ XG WE VCV@V>U<V:V:8>LVZYXWUW}XxY%uZ1rZ;oZDlYLjYTgX]dWebVn _Uy \T YS WQ TO RL QJ QG PEPBP@P?P?:CQ[^^]\[}]w^r_"o_.l`8i_Af_Jd^Ra^Z^]c\\l Y[w VY SX PV NT LQ KO KL KIKGKEKCKC<IV`bbaa~awcpdleie*fe5ce>`eG^dO[dXXcaVbj S`u P_ M] J\ GY FW ET EQ EN ELEJFHFH?O\effffxgqijj fkbk'`k2]k;ZkDXjMUjURi^OhhLfs Ie Fd Cb A_ ?] ?Z ?W ?T ?Q?O@M@MDUbkjjjjtmkocq^r[r#Xr.Vr8SqAQqJNpSKo\HnfFmqCl~ @j =h ;f 9d 9` 9] 9Z9W9U:S:SK\hponnoqrgu\xVySyPy)Ny4Ky=IxFGxPDwYAvc>uoL<V9a7~l4|z2{/y-v+t+p+l*h+e+c,`,`\kvzyxxxyl}^SF>;9(725<4F2Q0].i,w)'%#}#y#u"q#n"l$i$ies~}~thZNB5/-+*)5(?&J$V"d!r{xusso}}pdWJ>1$ +6AN\l~  ~~zyl`SF:.!  *6CRbtui]PC6*)6DUg}sgXJ=0$ '5DXmdžĥzk\NA5) "2DZto`QD8,"  -B\zteVH:/$(>]{m^QC7+$<[('&')08CP\dmt{ %$##%+3>KV_hov| "  %-9FQZbipv} )4@KT\djpw} $/:DNV^dkqw} )3>GPW_ekqw~  #-7AIRY`flsy   '1;DLT[bhnu}  +5>GOW^dkr{"  $ /9BKSZahpx}{y y x x $ $'&"*4 >"G#O#V$^$e%m%u%%$}#z"x usqppoo'!&031.*# &)%*0,:-C.K.S/Z/b/j~/r{/|y/v.t-q+o)m(j%i#h ggg)'09;:74002!4,566?7H~7P|8Xy8_w8gu8ps7zq7n6l5i3g1e/c-a*a(`&`$`$*+8ABA?<99;<)~=3{><y>Ev?Mt?Ur?]p?en>ml>wi=g<d;b:_7]5\3[0Z.Z,Z*Z*,1>GGGEB@A B{C%xD0uE9rEBpEJnERlEZiEbgDkeDubC`B]A[?X=W;V8U5T3T1T/T/.7DLLLKIFHyIuJ"qK-oK7lK@jLHhKPfKXcK`aJi^Js\IYHWFTDRBQ@P=O:O8N6N4N4/=JPPPPNLyNsOoPlQ*iQ4gQ=dQEbQM`QV]P^[PgYOqVN}SMQKNILGKDJBI?I<I:I8I82BOTTTTSzRsTmUiVfW'cW1aW:^WC\WKZVSXV\UUeSToPS{MRKPHOFLEIDGDDDAD?D=D<6HTXXXXXtXmZg[ c\`\$]].[]8Y]@V]IT\QR[ZO[cMZmJYyGXDVBT@Q?O?L?I?F?C?B?A=MY\\\\}\o^g`aa\bYb!Vc+Tc5Rc=PbFNbNKaWIaaF`kD_wA]>\)H(S&~_$}m"|} {xvrnjgdbbdrutsrvsku_yR}H<0& #"# -7AMZhx|wtpnlkn{{yx}xryf}ZNC8,  $.9 E Raq~zxwvy~{nbVJ>3($/;HWh{wk_RG;0$ $/<K]pth\OD8,!  !-<NczsfYJ=1%+;Pg҄Ϩ|l]NA4) );RnqbRD7+  %;Utyj[M@2&  9X|&###'-6BMW`hpv}#!"'0=HR[cjqw}!+7BLU]dkqw}&1<ENW^dkpv}  !+5?GPW^ejpv}  %/8AJQX_ekpw~  )2;DKSY_ekry #-6>FMT[agnu} &09AIPW]cjrz~|{{{    *4 < D L SZahpy|y w u srqqp "  %/8@HOV]e~m|vywtromkihhg g %*,+(% "+$4%<&D}&L{'Sy'Zw'bu'js'sp'~n'l&i%g#e!ca``__ .3431.*(*,'|-0z.9w/Au/Is0Pq0Xo0_m0hk0qi0|f/d.a-_+])['Z$Y"YYX )69:98531 }3x4#u5-r66p6>n7Fl7Mj7Uh7]f7ed7ob7z_6]5Z4X2V0T-S+S(R%R$R#!0<>??>;9{9v:r; o<*l=3j=;g=Ce>Kd>Sb>[_>c]=m[=xY<V;T9R7P5N3M0M-M+M)M(%6ACDDC@{>u?p@lAiB'fC0dC9aDA_DI^DP\DYZCaWCkUBvSAP@N?K<I:H8H5H2G0G.H-*;EGHHG~FvDoEjF fGcH$`I.^I6\I>ZIFXINVIVTI_QHiOHtMGJEHDEAD?C<C9B7B4B2B11AIKLLKzKpJjKdM `N]N"ZN+XO4VO<TODROLPOTNN]LNgIMrGLDKBI@G>D>A=>=;>9>7>66FMOOOOvOkOdQ^SZSWTTT(RT1PT9NTALTJJTRHT[FSeCRqAQ~>P`D<`M;`V9_a6^m4]z2\0Z.X-U-Q,N-K-H-F-EJXZ[[[u[k\__WaNdEg@g=g;g&9g/8g76g@4gI3fS1f^/ej-dx+c)a'_&\&X&U&Q&O&M'LR__`_|_q_ha\dSfJi@l7o 4o2o!0o*.o3-n<+nE)nO(mZ&mg$lu"j ifc`\XVTRZddddxdndeeYiOlFo;r0v)x'w%w$#w-"w6 w@vJvVuctrsqnkgda^\[djjihuhliakVoKrAv7y,} &09DP~^ }m |zwtp l i g e dmpon}mrmio]rRvFz<~2''2<IWfx~zwspnmxwutzspsewY{NB7-" (3@N^o|zy~|zzzm}aUI>3( )5BSf{vi]QF:/$ (5EXntg[OC8-!  %5H_yĘsfZK>1%"3Ie~n^O@4( 3LjvgXI;.! 4Pq"  #*4>IS\ckqx~#.9CLU]dkqw}(3=FNW^ekqw} #-6?HPX_ekpv} '09BJQX_djpv}  !+3<DKRY^djpw%.6>FMSY_ekqy  (19@GNTZ`fmu~~~ "+4;CIPV\biq{|ywvttss   &/7>ELRY`g}o{ yx vsqomkjiii   *2:A}H{OyVw]uesmqwnljgeca ` ``` $&%# %|.y6v>tErLp Sn Zl bj kh uf ca^\[YXXXX )+--*(%" {#w$!s%+q&3n';l(Bj(Ih(Pf)Xe)`b)i`)s^)\(Y'W%U"S!RQQQQ(/2331/|-x+s+o,l-'j.0g/8e/?c0Fa0M_0U^0]\0fY0qW0}U/R.P,N)M'L%K"K KK/47887}4w3q2m2i3f4$c5-a65_6<]6D[6KY6SW6[U6eS6oQ6{O5L4J2H/F-F*E(E%E#E!$59;<<;x9q7l8g9 c:`;"];*[<2Y<:Wl<f>a?]@Z@WA(UA0SA8QA?OBGMBOLAWJAaGAlE@xC?A>?<=9<7;4;1<.<,<+1=ACCDxCpBgBaC[EWETFQF%OG-MG5KG=IGDHGMFGUDG_BFj@Ew=D;C9A7>7;786673717/6BEFGGuGlGaG[IVJQK NLKL"IL+GL3EM:CLBBLJ@LS>L]R7=R?;RH9RQ8R[6Qf4Ps2O/N-L,I+F,B,?,<-:-9BJMNNxNnOdOZRSSKUDX?X=Y;Y$9Y,7Y46X<4XE2XN1XX/Wd-Vq+U)T'R%O%L%H&E&B&@'>IOQRRtRjSaTWVPXGZ?]7_ 4_2` 1_(/_0._9,_A*_K)^U'^a%]o#\~!ZXUROK H F DQTVV|VqVgW^XTZL]C_:b1f+g)g'g#&g,$g4"f=!fGfRe^dkc|a_\YUROMKYZ[[x[mZd[[\Q`Hb?e6h,k!o ooo&o/o8nBnMmZlhkx i g d a ] Z WUS_``_t_j_b_XbMfDh;k1o'rux y x x( x2w<wGvTubtrrpmifc_]\ffe}dqdhd_eThIl?p6s,v"z} !+5@M\~l}zwspljgfmlkyjoigi[mPqEu:y1|' ",8ETey{xtsqtrqwooocrWwL{@6,!  #.:J\p}{ywxvly_~SG<1'".=Od}vi\PD9.# !/@Umtg[NB8-" /C\y؜th\L>1%  -EdsdTE7).Hj '1:CLU]elrx~!)3=FOW_flrx~$-7@IQX_fkqw~  (1:CKRY_ejpw~ #,4=DLRX^djpw &/7?FLRX^dipx!)19@GMSX^djrz$,4;BHNSY_fmv}{yyxwv '/6=CIOU[b~i|rz}xvsqpnmlll !*28?~E|KzQxXv_tgrppzmkigecbbaa %|-y 4v ;t Bs Hq Oo Vm]kfiofzda _ ] [ZYXXX ~ zv s)p1n8l>jEhLfSd[bc`m]x[YVTRQQP P P "%''%}#x urnk%h-f 5d ;b!B`!I^"P\"XZ"aX"jV"vT!Q OMKJJIII#(+,,~+w)r'n%j$ g%d&"a'*_(2](9[(?Y)FW)NU)VS)_Q)hO)tM(J'H&F#D!DCCCC)-011y0r.m-h+d, `,]-[.'X./V/6T/=S/DQ/KO/TM/]K/gI/rF.D-B,@)>'>$>">>>$-145~5u5n3h1b1^2Z2W3T4%R4,P54N5;M5BK5II5RG5[E5eC4q@4>3<1:/9,9)9'9$9"9 +1589z9q8j8c5]7X8T8Q9O9"L:*J:1H:8G:?E:GC:PA:Y?:c=9o;9}987654414.4+4)4&5%059;<w<n<f<]:X<S=N> K>H?F?'D?/C?6A@=?@E=?Mn5>|3<1;08.6/3/0/-0+0)59=>?t@j?b@X@RAMBHCEDBD@E$>E,=E3;E;9EC8EK6EU4D`2Dl0Cz.A,@*=):)8*5*2+/+.9>@B|CpCgC_CTENFHHBI>JBDFxFmFdG[GQJKKDL=O7P 4Q2Q0Q&/Q.-Q5,Q=*QF(PP&P[%Oh#Nw!MKHEB?< 9 8CFIItJiJ`JXKNNHOAQ9S0W,X*X(X"&X*%X2#X:"WC WMVYVeUtSQOLHEB@>IKM~NqNfN]NUOLQES=V5Y,\#_ ___%_-_6_?^I^U]c\rZ X V S OLIGENQRyRmRcRZRRSIVAY9[0^'behhg g(g1 g: fE fPe^dmb`^[WTPNMUVWuWiV`VXVPXE\=_4b+e"hk oppp"o+o4o?nJmXlhkyifc`\YWU\\\q[g[^[V[K_Ac8f/i&mpsvx xyy$y.y8xDwRvbussqnjfca_bbzan`e`]`RcGg}3)  (5FZqw~uvtkv^{QF:/%(8Le}uh\OC8-"  );Sn̒ȿth[OB8-" *@[{wl`PA1$ )De%,4=GPX_fmsy%.8AJRY`flry   )2;DLSZ`ekrx $-5>FMSY_djqw '08?FMSX^cipx"*29@GMRX]cjqy %-4:AGMRX]dks~~|{z (/6<BHMSX_fn}x{ywusrqppo "*17=C}I{NyTx[vbtjqtomkihffeee ~%{,y3v9t?sEqKoQmXk_iggqe}ca_]\[ZZZ  ~{yu r(p/m5l;jAhHfNdUb]`f^p\}YWUTRRQQQyus q m j $h+f2d8b?`E^L\SZ\XeVpS|QNLJ I IIII  !!x rnki eb `(^/\5Z<XBVITQRYPcNmKzIGDCBBB B B !%&{'s&m$h"d a^[Y %V!,T!3S"9Q"@O"GM"NK#WI#aG"lD"yB!@ ><<<<<<!')+w+n+h)c'^&[%X%U&R'"P')N(0L(6J(=H)DG)LE)UC)_@(j>(w<':&8$6!66677 &+-~/s/j/d.^,Y+U+Q, N,L-J-&H.-F.4D.;B.BA.J?.S=.];.h9-u6,4+2)1&1$1!122%*/1{2o2g2`2Z1T0O1L1 H2F2D3$B3+@32>39=4@;4H94Q73[53g32t11/0-.++,),&-#-!.).24w5l5d6\5V5O5J6F7B7@8>8!<8):9099679>59F49O28Y08e.7s+6)5(3&0&-'*(((%)#-257t8i9`9Y9R9I:D;@<<= :=8>6>&4>-3>41></>D.>M,=X*=c(m?c?Z?R@JACC=D7F0H,J*J(J &J'%J.#J6"J? IHISH_GmF~DB?<9642;?AvBjB_BWCOCGEAF:H3J,M$P !Q QQ#P+P3P;PEOPO]NkM|K I F B?<:8@CErFfF\FTFLGEH>J7L/O(RVXXXX'X/X8 WA WL VYUgTwRPMIFC@?FH|InJbJYJQJJJBM:O3R+U#X[_ ```"_*_3_<^H]T\c[sZWUQNKHFLMwNjN_NVNONHO>R6U.Y&\_b eg hhh$g-g7gBfOe]dnb`]ZWSQORSrSfS\RURNRDV:Y1])`!cfiln oppq'q1q<pHoWnil|kge`]ZYY|YnXcX[WTVJZ?^5b,e$iloruwx yz{ |)}4|A|Pzbyvvtpmhfd_w_k^b][\P_Ec:h0l'psv y| !,9HZo~{xtpfseiccbXeLiAn6t+x!|  #/>Qg}mrkkialTqHv<|1& "1CZu|ttrkt^yQE9.# #4Kg|v}i]QD7,! $8Rrvk_TG;-"&>] (09BKS[agmsz !*3<EMU[aglry  %.7?GNU[`fkqx  )19@HNTZ_djpx#+3:AGMSX^djqz &-4;AGMRW]cjr~ (/5<AGLRW]dlw~{yxvvuts #*06<AGL}R{Xy_wguqr}pnlkjiihh~%|,z2x8v=tBsHqNoTm[kcimfxdba_^]]^^| xvt!q'o.n4l9j>hDfJdPcWa`_i]u[YWUTTTTT { v sp nki#g*d0b6a;_A^G\NZUX^VgTsQOMLKJJJJ {snjh gda_&],[ 2Y 8W >V ET LR TP ]N gK sI F D CBBABBumhc`_]ZX"U)S/R6P<NBLJJRH[FfCrA?<;: : :;; {!p!h!b ^ZXUSPN&L-J3H9G@EGCPAY?d<p:8643445 5 !$v%l&d%]%Y#U!RO L J G!#E!*D"0B"7@">?"E="M;"W9"b6"n4!}2 0...//0 %'s)h)`)Y)T'P%L%I%F&C&A'!?''>'.<(5:(;9(C7(K5(U3(`1'm.'|,%*$)!()**+$(}+o,e,],V,P+K*G*C+@+=,;,:-%8-,6-25-93-A1-J/-S--_+,k),{'*%(#&##$!%&&"(+y.l/b/Y/R/M/F/A/=0:1 715242#22)120/27-2?,2H*2R(2]&1j#0y!/ -+(% "! "&+/v1i2_2V2O2I2B3<4854617/7.7 ,7'*7.)75'7=&7E$7P"7[ 6h5x42/-*'$"*/2r4f5\5S5L5F6>7984:/;+< )='=%=$$=+"=2!=:=C4?.A'D GJ JJJ%I,I4I> IH HT GaFpEC@=:74 29<u=g>[?R?J?D?>?7A1D*F#ILP Q Q Q!P(P0P9ODOPN]MlLIGD@=;8>@pBcBXBOBHBBB;C3F-I&LOR UX XXX$X,W5W?VKVYUhS{ROLHEB@D|ElF_FUFMFFE@F8I0L(O!RVY\^ __``'`0`:_F_T^d\vZYUQNJIJuKgK[KRJKIFI^C\J[QYYWbUmSzQOMLKKKM w pkhe ca_]%[*Z0X5W:U@SGRNPVN_LjIwGEDCBBCC zphc_ ]\ ZXV!T'R-P2O8M=KDILHTE^CiAv?=<:::;; tjb]YVU T Q O M $K *I 0G 6F <DCBK@T>^<j9w7 5 4 33334 }oe]XSPNL JHF!D'B-@3?9=A;I9R7\5h2v0.,+ , ,-.xk a!Y S NKHFCA?=$<*:1877>5F3P1Z/g,u*(&%&'( ( u"h#^$V$O#J#F!C@= ; 9 7!"6!(4!.2"51"</"D-"N+"Y)!e'!s% #!  "#$#q%d&Z'R'L&G&B%>$;%8%5&3&1&0&&.',-'3+':)'B''L%'W#'d!&r%#!"}&n(a)W*O*I)C)>)9)5*2*/+-+,,*,#(,*',1%,8#,@",J ,U+b+p)(&#  %z)k+^,T,L,F,@,;,4.0/-/*0 '1%1$1!"1'!1.161>1H1T0`/o.-*'%"$)v,g.[/Q/I/C/=/8011-2)4$5 6677%7,746<6F6R5_5m 3~ 2 0- * '$"(,r/d1X2N2G2@2;253/4+5&7 :< <<<"<)<1<: 48536-7(9";>A C C C B&B-B6B?AKAX@f>w=;952/-2z5j6\8Q8H8A7;76819*;$>@CFI JII"I*I2H;HGGTFbEsDB?;8637u9e;X;N;F;?:::5;->'@ CFI LO PPQQ%Q.P7PBOON^MpKJFD@<;<o>`?U?K?C>>=9=1@)D#FJM PSUV WXY!Y)Y2Y=XJXZVlURQMJEB{BjC\DQCIBBA>@5C-G%KNQ UW[]^ `abc#d-c8cEbUaf_}]ZVSPMtHdHXHOGHFCE:H1K(P SWZ^`dfgi jkmn&o1o>nNmakwifd_\YmN`NUMNLIJ?L5Q,U"Z^aehjnqrtv wy{~)6~F|YzoxtqliehT]TUROPFR;W0\&afimqtwz}!-=Qgxte[\YWWNYA^6d+i ot w{ $3G^zda__W`Jf=l1s&x~ (;SphgagTmHs2& 1Nq  (09AIQX^djpv~  "+3<CJQW]ciov~ &.6=DJPU[agnv (07=DIOTY_fnw ")07=CHMRX^foy|zz $*17<AGLQW^gq}}zwtsponn%+17<}A{FzKxQvXt`rjpumkigedcbc{ xwu t&s,r1q7o;m@lFjLiRgZedcoa}_\[YXXXYxsomkih"g'f-e2c7b<`A^G]N[UY_WjUwSQONMMNO~tmiec a_^]#[)Z.X3W8U=TCRJPRO[MfKrIGEDCCDEvkd`]ZX WUS R%Q*O/N4L:K@IFGOFXDbBp@><;;;;<| o e ] X U SQ ONLJ"I'G,F1D7C=AD?L>V<`9m7|6433334 vi_XRNL J I HEDB$@*?/=5<;:C8K6U4`2m0|.-,+,,- qd[SMIFDBA ? = < !:'9-745:3B1K/U-a+n)~' & %%%&& }m`WOIDA>=; 9754%2+01/8-@+I)S'_%m"}   !yi]SLE@=:7531/.",(*/)6'>%G#Q!]k{  uf Z!P!H!B!=!9 5 2/- + ) ( &!&%!-#!4!!< !E!P!\ jzq c#W#M$E$?$:$6#2#-$*$(%%%#&"& &$&+&2&:&C&N&Z%h$y# !   n#`%T&J&C&<&7&3&/')(%)"*+ +++"+(+0+8+A+L+Y *f )v '&#   |#k&\(Q)G)@):)5)0),*&+#,.0 0111&1-15 0> 0I0U/c.r-+(%""x'g)Y+N+D,=+7+2+.,),%. /146 6 6 6#6*626;5E5R4`3p21.*'%"&s*c-U.J.B.;.5.0.,.'/"1368< <<< <'AK@Y?j>}<;751.{0i3Z4N5D4<47323.3'5!8;=@CFG HIJJ'J0J:IFIUHeFzDB>;86u5d7V8J8A8:76625+8#;>AD GJMN OQRS"S+S6SARPQaOvMJIDB>n;^<Q<G<?;::69.;'>BEI LORUWX Y[\^&^0]<]K\\ZpXVRPKIh@YANAE@>>;=3?*C"GKO RUX[^`ac dfh j*j6iEhWfkda^\VTbFUFKEDD@B8D.H%MQU Y]_cfiklnp rtw#y/x=wOuds~plig`\LRKKJFG>I3N)SY] aeiloruwy{~ &5G\v~yvpYRRPMNEP9U.[#`f joswz}+=SmYXUUMVA\4c)iou{~!2Hc]]V^Jc?j3p'w~ '=XyaeUkJq@x4),Hi  $-5=ELSY^djqy'/7?FLRX]bhox!)18?EKQV\bhoy #+28>DJOUZ`gpz~}| %+28>CHMSY`hrytqoo&,17<AFLRY}a{jyuvtqolhfed }|{ z&y,x1w7u<sAqFpLnSlZjdhnf~dba_\ZZZxtqomkj!j'i,i1g6e;d@bFaM_U]^[hYwWUTRQPPP|rlheb `_^^"](\-[1Y6W<VATHSOQYOcMqKJHFEEFFqhb^[XV UTSR#Q(P-N2M7K=JDHKGTE^ClA|?=<<;<>wi`ZURON LKJI H%G*E/D4B:A@?H>Q<[:h8w6543346oc Z S MJHFE CBA@">'=,<1:79=7E6N4Y2e0t.-,+,,.zj ^UMHD A ??=<:97$6)5.342;0C/L-W+c)r'&%%%%%u fZPIC>;98 8 6531!0'/ ,- 3, :* B( L& W$ c" r   qbVLE?:74321 /-,*%)+'2%9#B!LXet   m^SIA;730.,* )'&$##)!07@JVds {i[OF>840-*'%# !  '.5>IUbr       wfXLC<61-)&"      % , 4!< G R _ntcU I!@!9!3!.!* ' #!"#$%%%%"&) %1 %9%C%O$\$k"}!p_!R"F#=#6#1#,#(#%#!#%&(* * ** *&*.*6*@*L)Y)h(z&$!l!\$O%C&;&4&/%*%&%#%&()+ . 0000#0+03/=/H/V.e-x+)&$ z!h%X'K(@(8(2(-(('%'"'*+- 034556 6(505:5E4S4c2v1/-)&$u%c)T*G+=+6+0*+*')$)+.02 589 :;<<$<-<6? @BCE D)D2D>CKB\Ao?=:942i/Y1K2@28120./+.$0369 ;>ADFH IKMN$N.M9LGKWJkHFCA<:c4S5G6=56413.1(3 7:= @CFIMOPR TVXY)Y4XBWRVfT~QNKIC\:N:C:;96735,7#;?C FIMPSVXZ\^ `ce#f/e<dLba`x]ZVTQV?J?A>;<7:0<'?DI MQTX[^adfhjl oru't5sEqYoqmiea]REHDAB=?6A+F!KP UY^adgjnpruwz|  -=QjzvqlOJHHDF=G1L&RX^cgkoruy|~ $5Ia}OPKMDM8S,Z `g mrv{ *>WuSTMTAZ6a*gnu|3Lj‘W\LaAg6n+u|(A`ڻ  (08?GNU[`fls{ "+2:AHNSY^eks} $,3:@GLRW]ckt}| &-39?EJPU\ckv{urq  '-38>CHNT[cmy~{ytnigf !'-27<}A{FyMwTu\seqqomkhea^]\|ytsrqp!o'o,o1m6l;j@iFgMeUc_ai_w][YXURRR|snife cbba"a'a,_1]6\;Z@XGWOUXScRpPNLKIHHH|pga]ZXW VUTS"S'R,P1O6M<LBJIHSG^EjDzBA?>>>?rf]WSPNL JIIHH#G(F,D2C7A>@E>N=Y;e:t8764467zk_VOJGECA A@?? >$<);.:48:7A6J4U3a1o/.,,,-/sdYOHC?=;:9 8776!5&3+2017/>.G-Q+^)m(&%$%%'n`S J C = 9 6543 210/.#,(+.*4);'E&O$["j!{!|i [ OE>94 1 / . -, +*)'!&&%,$2":!CMZhzwe WKB:50-*)( ' & $# "  $ * 1 9 B N Z hys bTH?72-*'$#"  #*1:DO\ j z   o^QE<5/*'#!!(/8 A LXfw  k[MB92,($!  % , 4=HUdt |hXJ?60*%" " ) 1 : ERas wdUG<4-(#  !#$$$ $'$/$8$B$O#_#p!s`QD : 1 + & "! #%' ()**$*,*5*@)M)\(n&%"n\M!A"7#/#)"$" !  !#% '*, -/00!0)020=/J/Y-l,*'&!i X#I$=%4%,%'$#$ #"#%( *,/13 4677&7/696F5V4i31/,*&c%S'E(:(1(+'&'"% $&(+ -/2579 ;=??"?+?6>C=R@B DGII'H2H?GNE`CxB?<97W.H/=/4/-.),'*!,/2 58;>ADFIKM PRU"T-T9SIQ[OsMIFB@Q3D4:322-0+.$037 ;>ADHKNQSUXZ ]`b'a4`C^V\lYWSPJK8@88725/3)4 8<AEILPSWZ]_bdgjmq r-q<oOmeifb^XG>>=8;58.9$=CHMRUZ]adgjloqtx{&5G]|zxsohDC>A;>5>)DJPV[`dhkorux{~-?Vr{EHAECHNU]g}t{xusleb`_}{zzy"x'w,w2v7t<rApGoNmVk_ikfzedb_YVUTxqnkj hgff"f'f,e1d5b:a@_G]P[YYdXqUTRRMKKJ}qhc_]ZY XXWW"W'V,U0S5R;PAOIMSK]JjH|GEDBA@@qe]VSOMLK KKJJ"J'H,G1F6D<CCAL@X>d<u;:98778vg\SMGECA@ @@?>=#<(;,92887?6G5S4_3o10/...0n`TKD?<:876 55543$2)1.04/;-C,O+[*k)}(&&%'(yhYNE=8521/. . ---+ *%)+(1'8&@%K$W"g!y "tcTI?83/,*((' '&&%$"#(".!5 =HTcto_PD ; 4 / * ' $#"! !   %+3;ERask[L A 8 1 + & #    #)1:DP_ p  {gW I>5.(#          ! ( 0 9 D Q _ o wd TF;2+%!     '.7AN\m r ` PC8/(#   $+4?KZk o ]M@5-&!   ")2<IXj~ kYJ=3*$  '/:FUf}gUF:0("  ! #$$$$%-$7$D$S#e!{ bQB7-&  !#% (***"***4*A)P)b'x&#!]M?3 * # !$&)+- /111(111>1L0^/t,+'$#XH!;"0#(""!  "%'),/13 68::$:.::9H8[6p42/,)R#C%7&-&&%!$" !# &(+.1479<> ADE D*C6BDAW@l>;852L(>)3*+)%(!&#$' *-0369<?ADGJ MPP%P1O?MRKgIFC?;F-:.0-),%*#'(,/369=@CFILORUX\_ ^,]:[MYaW{SPKFA262.1*/',",159=ADHKORUX[^ae imp&n4lFj[gtb_[S<746/4-1'16;@EINRVY]`cehkorw {->S{lvrod:<5:27-7"<B HNTX\aeiloruy| %6Kdx;@8=4<(BIPX^dilquy}-B\|?D@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06<'D8KLSaYv]`aѻa̴bƭccѻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻd' * 06<&C7KLRaWv[]^Ǽ_`aıa̩cԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩc' * 06<&C7JKQaUwY\]^__`ǟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟb' * 06<%C6IKOaTvX\]]^_`—bȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗb& ) 06<$B5HJN`SuX[\]^_`bbbbbbbbbbbbbbbbb& ) 07<#B4GIL_SsWZ\]^_accccccccccccccccc&* 17EFTOaTlYt\z_~a{cwfrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrh$,550 71=ADONZTcYj\o_r{buwdxsfzpi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|%.4*. 5/;7G={OAvUErZGp\Im^JkaKicMheNheNheNheNheNheNheNheNheNheNheNheNheNheNheNheNheN# &-!4(;.xC3sK6oQ9lV:jYe_?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww~' ) .4:"C1KCTV\id{krvzܞ~ؙϑ~īwīwīwīwīwīwīwīwīwīwīwīwīwīwīw& ) .4:"B1JCSV[jb|hmqݨtڢw֝{˒}ɯ|yͧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}& ) .4:!B0ICRVYj`}ei޴kۭnاpԡr̛xήvФ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|& ( .4:!A0IBQVXk^beۺfشgԮjϪnɦsЮuҡz̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z& ( .4: A/HBPVVk[_aӽ`ͶcǰehʺlаtӠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠy&( .4: @/HAOVUlY\^Ⱦ__a³cɬfϤmҟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟx&( .4:@.GANVSkX\]^^^_Ǡb͙hЕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕr%( . 4:@-G@MURkW[\]]^_`ȏe̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l%( . 4:@,F?LTQjV}Z\]]^_aeŃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃj%' . 4:?+F=JTPiU{Y\\]^`be}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i$' . 5:?)C=HSOgUyX[]^_ac|fxixixixixixixixixixixixixixixi$'/ 5;>(@=GRNeTuX[]_`b}dwgsjsjsjsjsjsjsjsjsjsjsjsjsjsjsj#(/ 6<;(>=DQMbSpW|[^`b}dwfsiokokokokokokokokokokokokokokok#(07 96)==GFPNVT|[Xw_[tb^qe_ngalicikdgmegmegmegmegmegmegmegmegmegmegmegmegmegmegme"*%!(.#5-<5D=MCzTGuZJr]Mo`OlbPjdQhfSfiTekUekUekUekUekUekUekUekUekUekUekUekUekUekUekU!#%+2&9-~@3wJ8rQ;nW=lZ?j]Ah_BfaCecCceDbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfE  !'. 6%u<*nD-jL0gQ2dU3cX4bZ5a\5`^6_`7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7v' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrw& ( ,28@+J;TK^\gkpyy闉哐⎕ߋօzqpppppppppppppx& ( +28@+I:SL\]enm|u}朄▊ߒێ̃wsttttttttttttty&( +28?*H:QLZ^cojry~ܕؑ€twxxxxxxxxxxxxxz&' + 28?*H:PLX_`qgntyޞ}ژӒy{|||||||||||||{%' + 28?)G9OLW_^rekoߩrۣv՟}ϛèà|%' + 28>)F9NLV_]schjܰn֫sЧyʣ¸ĥŜ}%' + 28>(E9MLU`[s`dݾgֹkѳpʮué{÷ƢƘ~%' + 28>(E8LKT`Yt^aeϽhȸl³qwõ~ơǕ~%& + 28='E8LKR_Xt[_bľehlpéwƟ~Ȓ$& + 28=&D7KJQ_VtZ]_bdgkžqƘzǎŒ$&+ 28=%D6JIP^UsY\]^`cfkčsƊˆ$&, 28=$C4IHN^TrX[\\]^bfn{$%, 28="C2GHM]SpWZ\]^_aeyjutuyuyuyuyuyuyuyuyuyuyuyuyuy#%, 3 8= @2DGK[RmW}Z\^_aczftjoqntntntntntntntntntntntntnt#%,3 9<<2CFJYQiVwY\_aczetholjqisisisisisisisisisisisisis"%-4 :8;2@EHVPeVqY{]`bzeugpjkmgrfsfsfsfsfsfsfsfsfsfsfsfsfs!&.672 92?BGQO^UiZq]xa}zcvfqhmkindsctctctctctctctctctctctctct &/5.1!80=?EKNVU_Zf^l{bpvdsrgvoixklzho|dr~cscscscscscscscscscscscscs'0.'/ 6-<9CDLMTTZZ{^^vbaredohfljhiligokcrmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsm',&,3)93@;JCRHyXMt]Pq`RncTkeVihWgjYemZbp[bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\$ #)0$7,=2}G8wO&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysooooooooooooq&}( * 06>&H3SB]Ph^rj|t|􎏂쇝鄣恨yqmmmmmmmmmmmmr&~' * 06=%G3QB[Qe`omxy𒊊돒狙䇟~unqqqqqqqqqqqqs&' * /6<%F2OBYRcblqt}}옆甎䏔مzqrttttttttttttu%& ) /6<$E2NBWSadisqy鞁嘈܍͂wrvxxxxxxxxxxxxu%& ) /5<#D2MBVS^efunu|✂ޕؒȈ~wz||||||||||||v%& ) /5;#D1LBTT\fdwkrwߡ}؝љĐ|~w%& ) /5;"C1KAST[fbxhms٨zТʞx$&) /5;"C0JARTYg`yejܶpҮvʧ}ãy$%) /5;!B0IAQTXg^zbhֽn̴sĭyy$%) /5; B/I@PSVg[{aglƻpv|z$%) /5; A.H?OSUgY{_dhmrx{#%) / 5;A-G>NRSgXz]aehmrw}#$) 0 6;@+G=LQReWxZ^adglqx~~~~~~~~~~~~~#$)0 6;@)F;JPQdVvY\]`cfkq{zyyyyyyyyyyyyy"$)0 6;@'B;HOPbUsX[]^`b{fvkqsnpppppppppppp"#*1 7<<'@;FNO`ToX}[^`b{dugpkkqgyffffffffffff!#*18 :7(>:DLM\SjXv[^a|dvgpilmgqcxa~a~a~a~a~a~a~a~a~a~a~a~ #+28 46(=9BILWScXn\v_}~bwerhnkinds`x^}^}^}^}^}^}^}^}^}^}^}^}#,43 -5(;7AEJQR[Xd\k`pycusfxoi{kl}hods_w]{]{]{]{]{]{]{]{]{]{]{]{$,1& ,3'93??HIQRWY\_yactdfpgimjkjlmgoocrq`ws]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt$+'#*1$7/=8FAOGVMx\Qt`UpcWlfZji[gk]en^bq`_ua]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb"$!'- 4);1B7|L.rG2nO5jU7gY9e];d__f>]i?\l@ZoAZoAZoAZoAZoAZoAZoAZoAZoAZoAZoAZoA  &-y4!q:%jB(fH*cN,aS-_V.]Z/\\0\^0Z`1Yb2Xe2Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3  "y)q0j6d<aB!^F"\J#ZN$YP$XS%WU%VW&TY&S\'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'i't( ~* .5'F6MHU[[nbiѼpDzu|v#$&- 39>&E5LGSZYn`~gmrxw##&- 39>%E4KFRZWm^~ekpu|x"#'- 39>$D3JDPXVl\|bglrx~~~~~~~~~~~y"#'- 39="C0HCNWUjZ{^chlrxxwwwwwwwwwww{!"'.4 9>B/FCMVShXy[_cglq~xyurqqqqqqqqqqq}!"'.4 9==/DBKTReWuZ\_cgxksqnxk‚iÒkġkġkġkġkġkġkġkġkġkġkġ !'.5 :9cInTy]djos{vxyu{r}n~ih}iyiyiyiyiyiyiyiyiyiyh%t%~' + 28@&K2V?`KkWvaiqv{~{wrmjlm}m}m}m}m}m}m}m}m}m}i%u%' + 18?%J2T?^LiYsd}nv}쁥}yrlmoppppppppppk$w%& + 17>%H1R?\Nf[phzs|쌍臖䂟~{upqsttttttttttl$x$& + 17>$G1P?ZNd]mkvw叇ۈօςzuuwxxxxxxxxxxm$y$%+ 17=#F0O?XOb_jnr|zޕؒю̋ljzy{||||||||||n#{#%+ 17<"E0N?VO_`gpnޢw֝ϘɔÑ}o#|#%+ 16TO]adrlשtΣ}Ǟp#}#$+ 16SO[abr۸jЯrȨyq""$+ 16<B-J=QNYa`qhʶov~r""$+ 1 6;B+I;PMW`_qf~Ľls{s""$+1 6;A*H:NLU_]pd}jqw~u!!$+1 6;@'G7LJS^[na|hnt{{zzzzzzzzzzzv!!$+1 7;@%D6KIR\Ym_zekrxƀÉ}usssssssssssx  $+27<=#B5HHPZWk\xaflry}ɁwnjsǗn¡lllllllllll{%,28 :8$@5FGOXUgYu]bg~lwrqylʂhʍeʙeɩeeeeeeeeee~%,3848$?5DEMTTbYn\y`|ctgmmgsc{_΄]Ϗ\Р]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ%,33 .7$=3BBKOS[Yf]oavwe|pijmdr_x[׀W։T֖T٢T٢T٢T٢T٢T٢T٢T٢T٢T٢%,1% .5$;1A>IIRSX\^czbisfnmjrhnvcsy_x{[~}W~SPPPPPPPPPP$*&# ,3#9.?9GBPJXQ{]Wub\og`jkcfofbsh_xj[}lWnToQpQpQpQpQpQpQpQpQpQp"## *0 6*=2E:NAzVFt\JoaNkeQgiTdmVaqX^uZ[z[X]U^R_R_R_R_R_R_R_R_R_R_  &,3$:+~A1wK6qS:mY>i^@fbCcfEajF^nH\qIYuJWzLTMRNRNRNRNRNRNRNRNRNRN  "(/~6$t=(mE,iN/eT1cY3a]5_a7]d8[h9Yl:Wp;TtP~>P~>P~>P~>P~>P~>P~>P~>P~>  $}+t2l9 g@#cF%`L']Q([U)YY*W]+Ua,Td-Sg-Qk.Op/Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0ۼ   } t'l.f4a9]?ZDXHVLTP SS QV!PY"N\"M`#Kd#Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$} s k"e)_.[3W8U<S@QCPFNIMLLNKQITHWFZFZFZFZFZFZFZFZFZFZ[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T](g'o) v, z2}9B!O*}\2zi:uu@sEqIpMnOmQlSjTgUeVcWbX`Y^Y]Y]Y]Y]Y]Y]Y]Y]Y]Y_'i'r( y+ ~18@!M*Y4f<{rDx~JvOtSsVqXpZm\j^h_f`daba_b```````````````````&k&t' |* 07?!K+W5c>oG}{NzTxYw\u`sbpdmfkghiejcjcgcececececececececeb%m%v' * 07>!I+U6`@lJwRY|^zcxgujrlpnmpiqfreqflgigigigigigigigigid%o%y& ) 06= H+S6^BiLtV^d}jznwrturwnyj{gzhvipjmjmjmjmjmjmjmjmjme$p${%) /6< F+Q7\CfOqY|ckq}wy{urokj€lzmumqmqmqmqmqmqmqmqmqf$r#}%) /5<E*O7ZDdQn]xh튂q鄌y~{yxvpnpqyquququququququququh#t#$( /5;C)M7WEaSk`tl}wሆ܅ւр~|vstu}uyuyuyuyuyuyuyuyuyi#u"$( / 4:B)L6UE_ThcpqߖyzّҌ̉ȆÄ|wyy€y|y|y|y|y|y|y|y|y|j"w"#( . 4:A(J5SE]Ueenr؝w{Зɓď|}}~~~~~~~~~~~~~~~~~~l"x"#(. 4:@&I5QDZUceګkrФt{ɝ|™m"z!"(. 49?%G3ODXU޻aeӲiqʪq{£yn!{!"(. 49>$F2NBVT_d͹gqİn{v~o!| "(. 49>"E0L@TS]cepl{szp ~ "(. 4 9> D-J?RR[bcoizpw~~}}}}}}}}}r "(/4 9=C*H=PPYa`ngymt|{vvvvvvvvvvvt"(/4 9=>)G;ONW_^lewkqy~ysooooooooooov")/59 9=)E:MLU\\jbuh~ov{̉uʕpȡlŬgghhhhhhhhhx")/56 4<)C9KJSYYg_rezj~qwypՃkӎgҚcҧ`̱``````````|")/4, 3;)A8IGQTXa\l`u{f|sklrfza؄]؏ZלWةXջX̾X̾X̾X̾X̾X̾X̾X̾X̾").,)29(?6FBONWY]b}ajufpmjvgozav~[}V߆SޑPޝP஀Q~Q~Q~Q~Q~Q~Q~Q~Q~!&)(07'=2D=NGVP\Wwb]qgbklgeqj`vn[}pWrStPtMuKtKtKtKtKtKtKtKtKt"'.4$;.A7K?TFx[KqaPlfTgjXco[_u][{_WaTcQdMeKeKeKeKeKeKeKeKeKe$+1 8(>/|H6vQ;pY?l^CgcFdhI`mK]rMZwOV~PTRQSNTLULULULULULULULULU !'-4"{;(qC,lM0hU3e[6b_8_d:]hWr?Tx@R}BOCMDKDKDKDKDKDKDKDKDKD  "){0r7 j>#fF&bM(_S*\Y,Y^-Xb/Vf0Sk1Qp2Ou3Mz4J5I5I5I5I5I5I5I5I5I5   z%q,j2d9`?\EYK WO!UT"SX#Q\$Oa%Me&Ki&In'Gt(Ex(Ex(Ex(Ex(Ex(Ex(Ex(Ex(Ex(ջ y p i'c-]3Z8W=TBRFPJNMMQKUIXG\F`CeBhBhBhBhBhBhBhBhBhyph b" \' W,T1Q5O9M=K@JCHFGIFLDOCRAV?Y?Y?Y?Y?Y?Y?Y?Y?YU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAV(_(g) l, p1q9rBsO#p^*lj/iv4f8d;c=b?a@`A_B^C\DZDYEXEWEUFUFUFUFUFUFUFUFUFX'a'i( o+ t0v8w@xL$v[+rg2ns7k!H.R;\JfXodڑymҌs͇xȄ{Á~}}wv|vvwpvmvmvmvmvmvmvmvmg!s !&, 27= G-P;ZJcYڟmdјumʒ~tĎy}}{€{y{s{p{p{p{p{p{p{p{ph!u !&, 27=E+N:WJݬaXӥjdʞrnØ{u{|ussssssssj v &,1 7<C)L8UIִ_XͫhdĤpnxu{xuuuuuuuuk x&,1 6;B'J6SHк]WDzecmmuu}|zwwwwwwwwly&,1 6;A%H5QG[Vcckmruz||yyyyyyyyn{&,1 6;?!E3OEYUabhlouw|{zz}z{z{z{z{z{z{z{z{o}&,16 :>D1MDVS_`fkmtt{|}yssss|s|s|s|s|s|s|s|q&,16 9:C/LBTQ\^dijrqzyytplkkk}k}k}k}k}k}k}k}t&,1529B-J?ROZ\aghpowv}}wĉqlhdccd}d}d}d}d}d}d}d}v%+1//8@,H+E9NGUT\^cgzinrpslxxf|`~[ WੀU຀S~TyTwTwTwTwTwTwTwTw~#%"-5<*B6KBTL[Vza^rgeklkdro^zsXuTwPwNwMvMrMqMqMqMqMqMqMqMq# ,39'@1I;RD{ZKtaQmfWgl[br_]ycWfShOiLjIjHhHhHhHhHhHhHhHhHh ! )06#=,F4zP:sY@n_EidIdjM_pP[wRWUSWOXLYJZGZFZFZFZFZFZFZFZFZ &,3:&wA+pK1kU5g\8ca<`g>\mAXsCUzEQFNHKIIJFKEKEKEKEKEKEKEKEK ־ !(/x6n=#iF'dN*`U-]\/Za1Xg3Um4Rs6Oz7L8I9G:D;C;C;C;C;C;C;C;C; ٷ #w*o1g8b?^F [M"XS$UX%R^&Pd(Mi)Ko*Hv+F|+D,A-@-@-@-@-@-@-@-@-߱п  v n%g,`2\9X?UDRIPNNSLXI]GbEgBm @s!>{!=}!=}!=}!=}!=}!=}!=}!=}!Һ um f _& Z,V1R7P;M@KDIHHLFPDTBX?]=b;g:j:j:j:j:j:j:j:jul e^Y! T& P* M/ K3 I6 G:E=D@BD@G?K=N;R9V8X8X8X8X8X8X8X8XN)V)\*a- b2b:`C]R]`![l%Xx(V*T+S-R.Q.Q/P/O0O0M0J0J0I0I0H0H0H0H0H0H0H0H0N)V)\*a- b2b:`C]R]`![l%Xx(V*T+S-R.Q.Q/P/O0O0M0J0J0I0I0H0H0H0H0H0H0H0H0O)W(^*b- e2e9cBaP`_"^j&[w)Y,W.V/U0T1S2R2Q3Q3O3M3L4L4K4K3K3K3K3K3K3K3K3Q(Z'a(f+ h0i7h@gMe]#ch(`t,^/\1Z3Y4X5W6V7V8T8R9Q9P9P9O9O9O9O9O9O9O9O9O9S'\'c'i* l/ m6m?mJkZ$hf*eq.b~2`5^7]9\:[;ZU>T?T?S?R?S=S=S=S=S=S=S=S=U&^&f&l) p. r5r=sGqW%mc,jo1g{5d9c`?^A]B\CYDXEXEVFUFVDVAVAVAVAVAVAVAVAW&`%i%o( t- v4w<yEwS&ta-ol4lw9i=gAeDdFbHaI^K]L\M[MYNYLZIZFZFZFZFZFZFZFZFY%c$k$s' x, {3}:C}P'z]/vi7qt=nBlGiJgMePdRaS`U_V]W\U]R^N^K^K^K^K^K^K^K^K[$e#n#v%|+ 29AM(Z1}f9xqAt|HqMnRkViYf[d^b`aa``a[aWbTbPbPbPbPbPbPbPbP]#h"q"z%+ 18?K(W2b<mE{xMvTrZn_kciehfhfgfefebf]fYfTfTfTfTfTfTfTfT_"j!t!}$* 17>H(T3_>jHtR{}[watergpinkmkmkkkjgjbj^jYjXjXjXjXjXjXjXa"l v $* 0 6=F'Q3\?gKpW݃z^c{hykvmtosprpqpologobn\n\n\n\n\n\n\n\b!n y $*0 5;D&O2Y@cMۑmWӋw_͆eǂjm}pzrysxtwttqtksfr`r`r`r`r`r`r`r`d p{$*/ 5;B$M1W?ܞaMӘjW˒s`ō|fkoruv}w}wxuxoxiwcwcwcwcwcwcwcwce q}#)/ 4:A"J/߬T>ե_L̞hWĘp`ygmqtwyzz}y}r|lzezezezezezezezegs#)/49? H-ڳR=ϫ\KŤfWn`vg~mrvy{||{un~h~h~h~h~h~h~h~hhu#)/3 8>F,ӺP<ɱZKcVk`sh{nrwz|}~}wqjjjjjjjjjv#).3 7<C*N;÷XIaVi_qgxnsw{}y~s}l}l}l}l}l}l}l}lkx#).37 :A)L:VH_Tg_ngun~sx{~~z€w{wtvmvmvmvmvmvmvmvmmz#(.25 4?'J8TG\Sd]kfsm{sw{~~yur€o|ovooooooooooooooooo}"(-123>%H6RDZQb\idpkxqv|zv}qmjg|hvhphohohohohohohor"'+-'4<"F3OBXN_Ygbniuoz~tsxn{i}d~a~_{`v`o`o`o`o`o`o`o`ou!%''4=E/M>UK]Ud^lexskq|pk˅tfɑwaǞy\ĬzY½zWxWsXnXnXnXnXnXnXnXnx!( 2:B,K:SFZPbYwi`ppeiyjc߃n^ݏqY۝sUثtQսtOsPoQjQjQjQjQjQjQjQj} ' 08?*H5P@~XIv_RofXhm^bvb\fWhRjNkKkIjIgJdJdJdJdJdJdJdJd & .5<&D/N8wV?p^FieKdlP^sTX}XS[O]K^H_E_E]E[E[E[E[E[E[E[E[ؼ # +29"}@)uJ/oT5i\:db>`iB[pEVyHRJNLJNGOEPCPAOAOAOAOAOAOAOAO   '.~5t<"lE'gN+bW/_^2[e4Wl7St9O|;L=H>E?C@AA>A>A>A>A>A>A>A>Aһ  #~*u1l8f?aH"]O$YV&U](Rd*Ok+Lt-H|.E/B1@1=2;3;3;3;3;3;3;3;3Ե} t%l,e2_9Z@VGSMPSMYJ` Gg!Dn"Aw#>~$<%:%7&7&7&7&7&7&7&7&װ̽ |rj c% ],X2T8P>NCKHINFSDXA_>e;l9s6{33333333ι{q ib\ V% Q* N0 K5 I9F>DBBF@K>P;U9Z6`4e1m1m1m1m1m1m1m1mƾ|qha ZUPL#I(F, D0 B3 @7 >: <> ;B 9F 7J 4O 2S /Y /Y /Y /Y /Y /Y /Y /Y H*O*T+W. X3 V:TERRO_LlJxG F!D!C"B"B"A#@#@#@#>#<";";":":":":":":":":"I*P)U*Y- Z2 X9VDTQQ^OkLwJ!H"G#F#E$D$D$C$B$B$@$>$>$=$<$<$<$<$<$<$<$<$J)R(X)\, ]1 \8ZAXNU\SiQu!O#M%K&J&I'I'H(G(G(F(C(C(B(A(A(A(A(A(A(A(A(A(L(T'Z(^+ `/ `6^?[LY[Xg Ur#S&Q'P)N*N*M+L+K,K,H,G,G,F,E,E,F+F+F+F+F+F+F+N'V&]'b)d. e5c>`H^X]d"[p&X|)V+U,S.R/Q/P0P1N1L1K2K2J2J2J0K/K/K/K/K/K/K/P&Y%`&e(h, j4i<gEeUcb$`m(^y,[/Z1X2W4V5U6T7Q7P8P8O8N8O7O5P4P4P4P4P4P4P4S%\$c$i&m+ o2o:nClQ j_&gj+cv0a3_6]8\:ZU?T@S@SAT?TI'ޝT5ԗ^ȂhKŋqSyY^b~e|gziyjxjwiudt_sYrVrVrVrVrVrVrVcny!',1 6<G%إR4͝\AŗeKnSvZ_cfik~l}m}lzhxbw\vYvYvYvYvYvYvYdp| &,05;ݰD$ѪO3ǣZ@cKkSsZ|`dhkmnook}d{_z[z[z[z[z[z[z[fr~ &+04 9ظA"̰M2X?aJiSqZy`eilnpqqmga~]~]~]~]~]~]~]gt %*/2 5Ѿ?!ƶK0U>^IgRnZv`~eimpqrr|o{izcy_y_y_y_y_y_y_iv %*-0/=I/S<\HdQlYt`|ejmprzswstqtkses`s`s`s`s`s`s`kx$(++, ;G-Q;ZFbPiXq_yeim{pvsrtotlrlllflblblblblblblbm{"%%* 8D+O8WD_NgWn^vc~hylspnrjsgsdrdlefebebebebebebebp~ + 7B(L6UB]LeTl[}taw|fqjkmfpbq^q\p\k]f^b^b^b^b^b^b^bs - 6@$J2S>[HbP|jWuq]ozbiÃfcj^lZmVnTmTiUdVaVaVaVaVaVaVaw , 6> G.P9XC{`KsgRmoXgx\aԂ`\ҎdWϛfRͩgO˻hLgMdN`N]N]N]N]N]N]N]{ع * 3;D)M3zU7<7:797979797979797٫θ z$ q+i3b:]BYIUQRX N_"Jg#Gp%Cy&@'=(:)8*6*5*5*5*5*5*5*5*ܦѴǿyp h& a-[3W:SAOGLNITF[Bb?k;u8~530///////Ӱɻx ng_ Y% T+ O2 L7I=FBDHAN>T:[7c3k0t.}+)))))))˸vld ]WQM#I)F. C3 A7 ?< <@ :E 8K 4Q 1W .^+e)l'r'r'r'r'r'r'rýylc\U PKGD!A%?)=-;194785=2A0F-L *Q 'V &Z &Z &Z &Z &Z &Z &Z C+H*M+O.N3 M; JEGQD^@k=w;98765543330/..,,,,,,,D*J)O*Q-Q1 P9 MCKOH\DiAu?=<;:99887643311111111E)L(Q)T+U0 S7 QBONLZHgFsCA@?>==<<;987665555555G(N'T(W*X/ W5 U?SKPXMeJqH}FED C B!A!A!@!?!=!\AZCXDXDWEVEWCX?YeCcEbGaI_J^K]K]K\J^F^B^?_<_;_;_;_;_;_;X bks z&,2 9AM#}Z,xd5so=pyBmFjIhLgNeOdPcPbQbPcLcGdDc@c?c?c?c?c?c?[enw~%+1 7?J"V,݁a6|k>wuDt~IqMoOmRlSjTiUhUgUhQhLhHgDhChChChChChC]gqz%*0 5<G ݎS,ԉ^7̓h?~qFzzKwOuRsUrWpXoYnZmYmVmPlLlHkGkGkGkGkGkG^is}$).4 :EՖQ+͐\6Ŋe?nFvL~Q{TyWxYv[t\s]r]rZqTpPoKoJoJoJoJoJoJ`kv#(-2 8ڡBϜN*ƖY6c?kGsM{RVY}\{^z_y`x`v^uWtSrNrMrMrMrMrMrMbmx#(,05ԧ@ɡL)W5`?hGpMxRWZ]`a~b|b{ayZwUvPvOvOvOvOvOvOcoz"&*.۲0 έ>ĦJ(U4^>fFnMvS~W[^acddc~]~|W|zR|yQ|yQ|yQ|yQ|yQ|yQeq}!%()պ- ɳ;H'R3\=dFlMsS{X\_bdf|fyex_wYv~Tv~Sv~Sv~Sv~Sv~Sv~Sgs #$޺!* Ĺ9F%P2YI+R6Z?bGiNyqSsyXn]i`dc`d\eYdYaZ\[W[V[V[V[V[V[VqԶ /;F'O2X;`CxgJroPlwUfYa\\_XaTaQaQ^RZSVSUSUSUSUSUSUu خϻ "/ 9C#M-~U6w]>peEjmJduO_SYȊVUƗYPæ[M[J[IYJVKRLQLQLQLQLQLQz ҳ"- 7@~I'vR0o[7ic>cjC]sGX}KRۉNNٗQJ֦RFԷSDSCQDOELEKEKEKEKEKEK լ̹ * 3~;uE!nO(hW/b_5\g:Wo>RyAMDHFEGBH@H>G>E?D?C?C?C?C?C?C٧ϳſ' /u7l@fI!aS%\\)Wd-Sl0Nt3J6F8B9?:=;;::999999999999999ѮȺ# v+ n3f:`C[LWTS\"Ne$Jn&Gw(C*?+<-:-8-6-5-5-5-5-5-5-5-ԩ˶ vm& f- _4Z<UDQLNSJ[FcBl>v;7 5!3"1"0"/"/"/"/"/"/"إͲü~tld ^' W- S4 O;KBHHEOAV=^:g6q2|/,*(((((((ϯŹ~rj b[UP%K+H1 E7 B= ?B ,;0956:4@1F-M )T %\ "e l v y y y y y y vi^VOJ FB?<9"7&5*3.02.7+<(B$H!NT[]]]]]]>+C*F+G.G3D; AD >P:]6i2u0.,+*))((''%#"" @*E)H*J,I2G9 DC AN=[:g6t420/.--,,++(''%$$$$$$$A)G(K(L+L0J7 HA EMBY>e;q8~654322100/-,+*)))))))C(I'M'P)P.N5 L? JJGVCc@o={<:987766632100///////E&L%Q%T'U,T3 R< PHMTI`FlDxB@?>>=<<:987666666666H%O$U$X%Z)Z1 X9 VDSQP]MiKuIGFE D C!C!B!@!?!>!>!> >>>>>>>>K$R"X"]#`(a/ `7 \@YMVZTfRqP|!N#M$L%K&J'I'G(F(E(D(E'E&E$E#F"F"F"F"F"F"N"V \ a!f&g- g5 d=`H^V\cZn"Wx%U(T*R,Q-P.N/M0L1K1K0L.L,M*M(M'M'M'M'M'M'P!Y`fk%n,n3 l;iDgRd_!aj&^u*\.Z1X3V5U6T7S7R8Q8Q8R5S2S/T-T,T,T,T,T,T,S \djp$t*u1 t8rApNm[#if)fp/bz3`6_9]:\<[=Z>Y>X>W>X;Y8Z5[2Z0Z0Z0Z0Z0Z0U_gou#y){/ |6 {>yJuW$qb+ml2jv6h:e=d?cAaB`C_D^D]D]A_=`:_7_5_5_5_5_5_5Xajsz"~(.4 ;G~S$z^,uh3qr9nz=l@jCiEgFfHeIdIcIcGdBd>e;d8d8d8d8d8d8Zdmv~!',2 9ߋDՆP#́[-|e4xn:uv?rBpEoHmJlKjMiMhMhLiGiBh?hǓK"V,_4h;pAxE|IzLxOwQuRsSrTqSrNpIoEnAnAnAnAnAnA_ju"%(أ-˞<H!S+]4e;mAuF}JM~P|SzUxVwVvVvQtKsGrDrDrDrDrDrDalw !ߥ!Ѩ+ƣ:FQ*[3c;kArFzJNQTV}X|X}{X|zS{xNzwIyvFyvFyvFyvFyvFyvFcnyڮ̭(8DO)Y2a:iApFxKORUX|YxZvYuUt}Ps{KszGszGszGszGszGszGep|Ӵdz&5BM(V1_9f@nFuK~OS|VxXtZq[nZnWmQmMmImImImImImIgrլ̺ #3@J&T0]8d?lEsJ{OzSuVqYmZi[g[fXfRfNfJfJfJfJfJfJiu٥а0 =H$R.Z6b=iD}qIxyNsRnUiXeZb[_Z^X_S_N_K_K_K_K_K_Klx  өʵ- :E!O+X3`;{gAvnFpvKkOfSbV]XZYWYUWWRWNXJXJXJXJXJXJo} ףήĺ)7BL'U0z]7te=nlCitHd}L_OZRVTRUOUMTOOPLPIPIPIPIPIPIs  Ҩɴ$3>I"yR+sZ2mb8gj=brB\{FWJSLNNKOHOFNGKHHIFIFIFIFIFIFx֣ͮù$0 ;yEqO%kX+e`1`h6Zp;Uz?PЅBLΒDH̡FDʲGBGAFADABB@B@B@B@B@B@~۝ЩǴ"- x7qAjKdT$^\)Ye.Tm2Ow5J8F:BWGSPOXJaFjBt >!;#8$6$4$3$2#1#1#1#1#1#1#ݛѨdzy pia'[/ U7 Q?MFINEVA^=h:s620.,+++++++ԥʰxog`Y S'N.J5 G< CC @J *@+@.?3<:7D 3O .\ *h &t # !            ;*?)B*B,A1>9:B 7N 2Z .f +r '~ % # # " !               =(A(D(E+D0A7?@ AI >U 9a6m3y1//.-,,++)('%$## # # # # # A&G$K$M&M*K2J< HF DR@^=j:u8765443310/.-,,,,,,,,D$J#O"R$R'S/Q8 NC KOH[EgBr@}>><<;;:8765555555555G#N!S W!Y&Z-X5 U? RKOWLcIoHyFEDCBB@?>====>>>>>>>J!RW[_$a+`3 ]< YGVTS`QkPuNL K!J#I#H$G%F%E%D%E$E"F!FFFFFFFMU[`e#h*h1e9 aB_O\\ZgWq!U{$S&R(Q)P*O+N,M,L,L,L*M(M&M$N#N"N"N"N"N"PX_ek"n(o.m6 j>hKeXbc _m%]w([+Z-X/W0V1U2T2S3R3R1S.T+T)T'T'T'T'T'T'S[cjp t&u,u3 s;qGnTj_"gi'es+b|/a1_3^5]6\7[8Z8Y8X8Y4Z0Z.[+[+[+[+[+[+U^fnuy$|*}0|8 zDvPr[#oe)ln.iw1g4f7d9c:bh?fAeAdBcBd=d9e6d3d2d2d2d2d2Yclu| $(ۍ/ω=ƅIU#|^*yg0vo5tw8r

n@mBlDjEiEhEhAh=h9g6g5g5g5g5g5[enx "Ԕ,ɏ;GR#\*d0|l5yt:w|=u@tBrEpFoHmHlHlEl@l{AyDwFuHsJrKqKpHpB~p>}o:}n9}n9}n9}n9}n9_is}Ԟɞ&6 BM!W)`0g6o:v>B~E|HzJxL|wLyuMwtJxuEwt@wrpv=pv=pv=pv=pv=bm y ߖҟɧ !1 >IS'[/c5k:r?zC}FyIuLqNnOkOiNjHj}Cj{?j{>j{>j{>j{>j{>ep {  ֚͢¬/ <GQ&Y-a4h9p>{xBvFrInLjNfOdOaOcIcDcAc?c?c?c?c?gr  ەўȧ,9DN$W+_2~f8yn=tuAo~EkIgKcN_O\OZN[I\E\A\@\@\@\@\@j v ֙͢ë(6AK!T)}]/wd5rk:ms?h|CdF_I[LWMTMRLSHTDUAU@U@U@U@U@m zܔўȧ #2 >H|Q%vZ,pb2ki7fq;az?\CXFTHPIMJKIKFLBM?N>N>N>N>N>q֙ͣí.:{EtN oW'i_-dg2_o6Zx:U=Q@LBIDFDDCDAE>F;>:>8?6?6?6?6?6?6}̥֚¯z%r1k<eF_PZYUa"Qj&Lt*H-Dڍ/@؜1=խ2;29190808/8.8.8.8.8.ܕТƬ{s!k,c6 ^@XJTSO\KeGoCy"?$<%9&7&5%4%3%2%2%2%2%2%2%Ԟʩ{skd']0W9 SB NKJSF\Bf>p:}7420/.,,,,,,ٚͦırj c\ V)P1L9HA EI AQ =;D7L3T /^ +j &x "         ɭwj^VP KFA=$:*70461=-D)L$V bo~´zl_TLFA= 9520#-(*.'4#:BLVb nzqdWKC=951. +)&$ !%+17@ IR[dggggg6+9*:+:.733:-D'O![gs     7*;(<)<,:1681B,M'Y"eq|   9(='?'?*=/966@2K-W(c $n !y          <&?%A%B(@,=3<=9H4T /` ,k )v & $ $ # " " ! >%B#E#F%E)D1B:@E

KI GU D`Ak@v>=<<;;99776666666666G MRUY"Z)Y1U: RE OQL]JhHrG|FEDCBA@????????????JQV[` b'a.^6Z@ WLTYRdPnOxMLKKJ I!H!G!G!F!GGGGGGGGGMTZ`fh%h+f3c< `H^U[`YjWtV|!T"S$R%R&Q'P'O(N(M(N%N#N!NNNNNNPW^ekn"o(n/k7iD fPc\af_o"]w$\'[(Z*Y+X,V-U-T.T.T+T(U%U$U"U"U"U"U"RZaios u%u+t3q@ nLkXib fk$ds'c{*a,`._/^1]2[2Z3Y3Z0Z-Z*Z'Z&Z&Z&Z&Z&U]dmsx{!|%|.y< vIrTo^!mg%ko)iw,g/f1e3d4b5a6`7_7^5^1_-_+_)_)_)_)_)W_gpw|ރ҃*ǀ9 }FyQv[!sd&ql*os.m{1k3j5i7g9f:d:c:b9c4c1c.c,c,c,c,c,Yaj sz؉ˉ'7 CN|X!ya'vi+tp/rx2q5o7m9l;jmt9mt6mr3mr3mr3mr3mr3`ju  ӏʖ-:EOX%`*g/n3}v7y~;u>q@nBk}Dh{DezDfy?fy;gx7gw5gw5gw5gw5gw5b lxٌϓŚ*8 CMV$^)e.{l3wt7s|:o>k@gCdDaD^D^@_<`~8`}6`}6`}6`}6`}6e o{Ԑ˘'5 @JS"[(zc-uj1qr6lz9h=d@`B\CYDWCW@XY@UARBPBO?Q;Q8R6R6R6R6R6kx֐̚¡.:}DwNqV"l^'hf,cn0^v4Z7V:Q=N>K?H>H1<1;0;/;-;,;,;,;,;,|ތјȢxoj)e6_A ZKVTQ]MfIpE{"A·$>͖&;˦'8ɻ(7'6'6&5&5%5%5%5%5%ה̟©qic$]/W:SE OO KXGaCk?v<964210/.....ݏМƧwic\V)Q3M<IEEO AX =b:m6y31.-+*((((((ԙɥ|naZ UO!J*F2B;?C;L7U3_ /k +y ( & $ # " ! ̣íqdXRLGC ?(;/865>1F-O(Z$f uŬtgZOIC?;74#1)./+6&>!FQ^l} xi\PG?;62 /,)&!#' -4<G S`n~}oaTH>72-*&#! #* 1;EQ]gppppp2+4*4+3-/3):"CNZf r|3)6(6)5,21-8&A LXdo z 6(8&9'8)5.05,?'I!Ualw     8&;$<$<&9+523</G*R%^!it~  ;$>"@"?#='==<;::99988888888GMQUZ[$Z+V3R>OJ LV KaIkHuG}GFEEDCBBAAAAA@@@@@JPU[`b!a(^/Z8XE VR T]RgQpPxONNMLKJIHHHHHHHHHHMTY`egh$f*b3a@_M ]X[bYkXsW{VU T!S"R#Q#P$O$N#O OONNNNNOV\ dilml$k.i<gIeTc^ag_o^w ]~"\$Z%Z&X'W(V)U)T(T%T"T TTTTTRY` hmprqr*q8nElPiZgcfk ds#cz%a'`(_*^+],[-Z-Y-Y)Y&Y#Y!X!X!X!X!T[ c kqtv wy&x5uBrMpWm`kh!jo$hw'g)f+d-c.a/`0_1]0],])]&]$]$]$]$]$V^ f n t x {}#~3{? xJuTs]qe"ol%mt(l{*j-i/g1f2d3c3}b3|a0|a,{a){a&{a&{a&{a&{a&X` iq w|Ѐǃ 0= ~H{RxZvb"ti%rq(px+o.m0l2~j4{i5yg6vf6uf2uf.ue+te(te(te(te(te(Yblt{ԁ˅.; FO~X{`"yg&wn)uv,s~/~r2{q4wo6tm7rl7pk7nj4oj0oj-oi*oi)oi)oi)oi)[ dnw~ЅNJ+8 CMV^"~e&|l)~zt,{y|0xw2tv5qt7nr8kq9ip9ho6hn1in.im+im+im+im+im+] fqzւ͉Ž(6 AKT\!c%|j)yr-uz0q}3n{5kz7gx9dw:bu:at7bt3bs/br,br,br,br,br,` it~ӇɎ%3?IRZ {a$wh(sp,ox0k3h5d8a9^}:[{:Zz8[y3\x0\x-\x-\x-\x-\x-bmxڂϋŒ "0< F~OyWu_#qf'mn+iv.e2a5]7Z8W9T9S8T3U0U~.U~-U~-U~-U~-eq|Շː-9 ~CxMsUo]!jd%fl)bt,^}0Z3V5S7O7M7L6M2M0N-N-N-N-N-iu݂эǕ(}5w@qJmRhZdb"`j%[r)W|,S/O2K3H4F4E3E0F.G,G+G+G+G+m{؈͓Û{#u1p< jFfOaW]_Yg!Tp$Pz'L*H,E.B/?/>.?,?*?(?(?(?(?(sҏșxqm+g7cB ^KYTU]QeMnIx!E#B%>';(9'9'8&8%8$8$8$8$8$zڊ͖ğsfb!^0Y;UF QO MYIbFkBu?ł;Ð86433222222Ғȝ|l^WS&P3L>IIES B] >g;r85؎2֟0Գ..,,+++++؎̛¥seXRMI*E5B?>I;S8]4h1u / , * ) ' % $ # # # # # Иƣxj]QK FB!>+;38<4E0O-Z)g%t#!ɢ|naUJD?:7 4'1/.7)?%I!Taq     ªqdWLB;73 /,)!&(#/7@KY i|ugYMC:3/+'# !&- 6AO^n{l_RF;2+&"  #+6BP]jwyyyy.*/).*+-&2 9B MYeo{0)1(1(.+)0#7@J Wbmx2'3%3&1(--&4"=HT_ jt4%6#7#5%1),1*;$EP\gq {    7"9 : 9!6%4.27.B(M#Xcmw          : =>=<"<*:47>2I-T)_&i$s#|""!! =ACCDD'B0?:;E6P3[0f.o.x--,,+**)'''('''&&&&@EGHLL$J,F5C@?K>=<;;;::9 9 9 9 GLPUYZY#U+P4OAMNMY Lc KkJsJ{IIHGFEDCCCBBBBBBBIOS Z^`^[$X/X<WIVT U^TgSoRvQ~POONMKJIIIIHHHHHLR X_ cdc_a)a8`E ^P ]Z[cZkYrXyWVUTSR P O ONNNNNNNNU [c g h g fi%i5gA eLcVb_`g_n^v]}\[!Y"X#W$U$T$T"SSSSSSSQW_fjlmmp"o1m> kIiSh\fdekcrbz a"_#^%]&['Z'Y'~X%}X"}X|W|W|W|W|WS Zbinqss uu.s;qF oPmYkajhhogw!e#d%c'b(~`*{_*y]*w\(v\%v\"u\ u[u[u[u[U \elqvxy{{,y9vD tNrVp^nemlkt"j|$h'|g)zf*we,tc,rb,p`+p`'p`$o`"o_ o_ o_ o_ V ^gouz~)~6|A yKwTu\scqj pq"|ny%ym(vl*sk,pi-nh.lf.je-je)jd%jd#jc"jc"jc"jc"X`jry&4? I|RzZxa}wh yuo#vtw&sr(pq+mo-jn.gl/ek/cj/di*di'dh$dh#dh#dh#dh#[cmv~ƃ#1= GPW{~_w|f t{m#qyu&mx~)jv+gu-dt/ar0^q0]o0]n+^m(^m%^l$^l$^l$^l$]fpz͂È /: D~MzUv]rdnk#ks&g~|)d}+a{-]z/Zx0Xv0Vt0Ws,Wr(Xr&Xq%Xq%Xq%Xq%_itʇ,8~B yKtSp[lbii!eq%az(^*Z-W.T/Q}0O{/Py,Px(Qw&Qw%Qw%Qw%Qw%bnyЄƌ(}4x? sHnQjYf`bh_o#[x&W(S+P-M.J.H-I*I(J&J~$J~$J~$J~$fr̉‘|#v1q<lE hNdV`^\eXnTw"P%L'I)F*C*B*B(B&C$C#C#C#C#jxӅȏysn+i7eA aK \SY[UcQlMuI F#B$?%=%<%;#<"N^m|))))()$,18ALWcnx+(,'*'&* /6 >IU`kt~.&/$.%*'$+2< FR]hq{1#1"1".$('#/ 9CN Ydnw3!542-#+,)6#@JU`j s { 68865 4(12-<'F"Q\fow 9<=;<<%:.681B,M(X&b$l$t$|##""!!  =@ABDC!A)=39=5H2T0^0h/q/y/////..-,,+++*****@CEHKKH$D-?7== < < ; ; ; ; FJ NT WVSLN*O8PEOPNZ Nb Mj LqLyKJIIHGFEDCCBBBBBHMRY[ [ V TW%Y4XAWLVV U^ TfSmRtR|QPONMLJIIHHGGGGK PV]`_^\_!`0`=_H]R \[[cZjYqXxWVUTRQONNN~M}M}M}M}MM RZ`cffd fg-f:eE cO bWa__f^m]u\}[YXW~V{TySxSwRwRvQvQvQvQOU]chkljlm*l7jBiL gUf\ddcjbr`y_~^{] y\!vZ"tY"rW"qWqWpVpVpVpVpVQW`flprpqr'q4p?nI lRjZiaghfo}ewzdxc ua"r`#p_$n]$k\$k[ k[jZjZjZjZjZSZcjquwvww$v2u=sG qPoWm_}lezkmwjtth}rg!of#le$jc%gb&e`%e`"e_e^e^e^e^e^U]fnuy||||!|/z;xE vMtU{r\xqcupkrnrom{ll"ik$fj%ch&ag'_e&_d#_c _c_b_b_b_bW_iry~ -8}B ~{KyzSvxZrwbouiltpisy fq"cp$`o&]m'[k'Yj'Yh$Yh!YgYfYfYfYfYcmv~*6}@ xI tQq~Xm}`j{ggzncyw`w"]v$Zt&Ws'Tq'So'Rn%Sm!SlSkSkSkSk\fq{Ń&}3w=sF oOkVh^deam]uZ~!W}#S{%Py&Nw'Lv&Lt$Ls!MrMqMqMqMq_kv̀{"v/q:mD iL eTb\^c[kWtT~P!M#J$G%E}$E{#Ez FxFwFwFwFwcp|Ȇy so+k7f@bI _Q[YXaTiQrM|IF C!A"?!> ??????iw΃Črjg%c2_<[FWN TV Q_MgJpF{C?=:98888888o~ʊma ]Y+V7SAOJLS I\ Fd Bn?y<96432211111xІő{jYQN"K/I:FDCN@W=a;k 8v 5 20.,,+*****ׂʏteUF@>"3+ (% #* 4?LYiz  vh[NC8.&" %.9 ETfyzk^QF;2)  &1=M`upaTG=3+" (4DWlvhZM@5+#  *:L_s%($(!)+07@IV`kv''&%$&)- 4<GS]hr{*$)#'#"%*0:DOZenw,", * %"%-7 AKVajs{/0.*#!"*3=G R]fow~232.,+&'/!9CNX b k s z 676343"0++5%> IT^gow~9;: ;<:7&2/-9(D&O%Z%c&l&s'z''''''&%%$$##""""<> > B CA<7(22/>1J2U3_3g4o4v4}44332210/..--,,,?B CH I GA:8+;9=E>P>Z>b>j>q>x===<;; 9 8 8 7 655555B EHMNK D @D&G4HAHLHUG^GeFmFt E{ E D D C B A @ ? > = < < ; ; ; E HMRSQNJN!P0Q<PGPQOZNa Ni Mo Lw L~KJIHGFDDCBB A A A GJQVXZXT VX,X9XDWNVV U^ Te SlRsQzQPONL~K|IzIyHxHxGwGwGwGIMUZ^`_\]_)_6^A]J\S [[ Zb YiXpWwVU}T{SyQvPtNsNrMqLqLqLqLqLKPX^cffbce%e3d>bGaP `X __]f\m~[t{Z}yYvXtWrVoTmSlRkQkQkPkPkPkPMS[bhklhij"j0i;gEfM dU c\}bczajx`ru_zs^p]n\kZiYgWfVeVeUeTeTeTeTOV^flpqnn oo-n9lBkK ~iS zhZwgaufhreopdxmbjah`e_c]a\`[`Z_Y_Y_X_X_XQYbjqtvts tt+s6q@}oI ynQ umXrl_pjfmimjhvggefbe_d]b[`Z_Z^Z]Z]Z\Z\Z\S\fouy{zyyy(x4|v>wuF tsN prVmq]jpdhokentbl~_k\jYhWgUeTcTbTbUaU`U`U`V_jsz~~~${~1v|;r{DoyL kxT hw[evbbuj_sr\r|YqVoSnQlOjNiNgOfOfOeOeOeXcoxz!u.q9mBiJ fR c~Y`}`\{hYzpVyzSwPvMtKrHqHoHmHlHkIkIkIk\ht}y so*k5g?cG`O ]W Z^VfSoPxMI}G|DzBxAvAtBsBrBqBqBqanzÃrkg%d1`;]DYLVT S\ PdMmIwFC@><;;|;{;y;y;y;yguʀnb^[,X7U@RIOQLZ Ib FkBu?<:765544444n|ƈ}jZTQ$O0L;IDFMDVA_>h ;s 8 531//.-----w̅wfVI EC'A3?==G:Q8Z6e3p0}., * ( (' & & % % % ҁƎpaRC8 53'220=.H-S+^)k'y%#!ˋxi[M?2' $"#!/:FSaṕ˔ɪŕ~oaSF:/$*6C Q asޜܴseXK?4*! %0=M_rxi[NB8.%  )6FZp}m_QE:0'  .>SitfXJ>2(   %5I_t ''(*/5=GS^js|"%!$%' ,29EO[fpx%##""$(.6BLWblt|( &## +4>HS^hpw~+*' '1:DOYcksz..+%# #-5 ?JU_gou|11.++)$(1:E P Z c k r x  55 3 3 30+"%+4?KU^fmt{88 7:: 60)""-$9'E)P+Y,b,i,p-w-~--,,+*))(''&%%%; <=@@; 2*/'245@6K7U7]7e7l7r7y7766543210//...>?BFEA;7;!>0?<@G@P@Y@a@h@n@u?}?>>=<;99876555@BGJKLGB EG+I8ICILHUH]HdGjGqFxF E D C B A ? }? |> z= z< y< y< y< CDKOSTRLMO'P4P?PIOQOYN`MgMn Lu K} K J ~I{HyFwEuDtC sB rA rA rA rA DHOUZ[ZTUV$W1W<VFUNUVT]Sd Rj Qr }Qz zPxOvNtMqKoJnImHlGlF kF kF kF FKSZ_a`Z[\ ].\9\C[KZSYZ }Xa {Wh xVo vUwtUqToSmQkPiNgMfLfLeKeJeJeJINW_dffaa bb+b6a@`I}_Pz^W w]^ u\e r[lpZunY~kXiWgVdUbSaR`Q`P`O_O_O_OJR[chkkhf gg(f4e>{dFxcNubU ra\ o`c m_jk_rh^|f]c\a[^Y\W[V[U[TZSZSZSZSLU_gmppnlkl%~k1zj;viDshLpgS mfZ jea hdhecpcbz`a^`[_Y]W\UZUYUXUWUWUWUWNXckquvtqp~p"yp.uo9qnAnmIklQ hkX ej_ cig`io]hx[fXeUdSbQ`O_P]P\P[P[P[P[P\gpvy{zv}vxvsv+pu6lt?isGfrOcqV `p] ]oe[nmXmvUlRjOiMgKfJdJbJaJ`J`J`J`Talu{}w| q|n|(j{3g{=czE`yM]xT [w[ Xvc UtkRsuOrLqIoGmElDjDhDgDfDeDeDeYfqzqkg$d0`:]BZJWRU~Y R}a O|jL{sIy~FxCvAu?s=q=o>m>l>k>k>k_lw~nc_\+Y6V?SGQONWK_ Hh Eq B}?=:}8{7y7w7u7t7s7s7sfs~|j[VS%Q1N:LCILFTD]Af>p ;{ 9 64211 0~ 0} 0{ 0{ 0{ n{yfVKHF*D4B>@G>P;Y9c7m4y1/ - + * * ) ) ) ) ) vȃtcRC<: 8,665@3I2T0^-i+v)'%##"!!!!!΀Œ}m^N@2-+ )+'5&@$K#V!c pNJufWI;/#'2>JXgw  {l^PC7+! !-:HXh{ѐΦqcUH<1' '5DVh}ufYK?4*!  .>Rf|zk\NB7-#  &7LbyrcUG;/% 0DZp&%&)-2:EQ]hqy$## %*/7BNYdmu} !  !%*4>JU`iqx#  (1;FQ\eltz&$ %-6ALW`hou{)'" )2<GR[cjpv|-+& # "$-7BLV^elrx0. *+)%& 0 ; FPYahnu{3 2020* !(5@ K"T#\#c$j$q%w%~%%%$#""!! 65685-&!&#*0,;-F.O/X0_0f0m0s1z000/.-,+*)((((98<==;5/ 25+778B9K9T:[:b:i9o9w9~98875432}1|0|0{/{/;;ACGFB;<?'@3A>BGBPBWA^AeAl@s@{@?>~=|<z;x:v8u7t6s6s6s6=?EKOOLEEG#H/I:IDILHTH[GbGhFoFw|EzExD vC tB r@ p? n> m=m<l;l;l;@CIQUVTNLNO,O7OAOINQNX~M^|LeyLlwKtuK} sJ qI nH lG jE iD hC gB fA f@f@f@BGOW[][US TU)U4U>TF}SNzSUwR\uQbsQjqPq oOz lO jN hM fKdJbHaG `F `F `E `E `E CJT[`ba[YZZ&Z1~Z;zYDwXKtWRqWYoV`mUg kUo iTx gS dRbQ`P^O\M[L[K [J ZI ZI ZI EMX`egfb___#|_/x^8u^Aq]Io\Pl[Wj[^hZe fYm cYv aX ^W\VZTXSVQVPVO UN UM UM UM FQ\dikkhdc{d wd,sc6ob?lbFjaNg`Ue`\c_c `^k ^^t \]Y[WZTYRWQUPTPSPR PQ PQ PQ IVahmppni{huiqh)nh3jg<hgDefLbfS`eZ^da [ci Ybr Va}T`Q_O^M\KZKYKWKV KU KU KU MZemruutpvn pnln&hm1em:cmB`lJ]kQ[kXXj` Vih Shq Qg{NfKdIcGaE_E^E\E[EZ EZ EZ R_jqwz{zwptitft"bt-`s7]s?ZrGXrOUqVSp^Pof Mno Kmz HlEjCiAg@e?c?b?` @_ @_ @_ Weow|~~m|b{_{\{*Yz4Wz=TyERyLOxTMw\JvdGum Dtx Bs ?q=p;n:l9j9h 9g 9f 9e 9e ^ku}{j\ WT%R0O9MAJJHRFZCbA~l>|w ;{ 9z 7x 5v 3t 3r 3p 3n 3m 3l 3l eq{xgWNKH*F4D=BE@N>W<`9j7u420. -~-{,x,v ,u ,u ,u lyucSD @>#<-:78@7I5R3\1g/r,*('%%%$$$$uÁp_O@4 20%./-8+B*L(W&b%n#}!zjZK=/$ " $.8CNZhwÉrcTF8,   + 7 BO^mxi[M@3('3@O`qņÛ}n`RE9.# ".<M_s܊ڣսsdVH=1' (7I^twhZL@4)  !2D[q~oaRE7,! +?Ul%$$'*08DP\gow~"! !$&,5@LXckry "(1<HT^gnt{%.8DOYbiou{! "*4?JT\djpv|$   %/9DNW^ekqw}'$  )3>HQY`gmrx* '!" !,7BKT [ b i o u | .*))$  %1<FOW^dkqx0-//+(!!,$7%A&J'R(Y(`)g)m)t)|)))('&%$#"!~!~!3056861( *-'/20=1F2N2V3\3c3j3p3x32210}/{.y,w+v*v)u)u)55:@BB=657"9.:9:B:J;R;Y;_;f:m:t:}}9z9x8v7t6r4q3o2n1n0n0n07:@GKKG@=?@*A5A>BGBNAUA\}Ac{Ajx@qv@zt?r?p>n=l;k:i9h8g7g6f5f59>FMQROIE FG'H2H;HD|HKzGRwGYuG`sFgqFnoEwmEkDiCgBeAc?b>a=a<`;`:`:;ALSWXVPLLM$M/|N8yMAvMHsLOqLVoK]mKdkKliJtgJeIcHaG _E ]D \B[A[@Z?Z?Z?=FQX\]\VRRR!zR,vR6sR>pRFnQMkQTiPZgPbeOicOraN|_N ]M [K YJ WH VG VE UDUCUCUC?JU\aba]W~WyWtW)qW3nW<kVChVJfUQdUXbU``Tg^Tp\SzZR WQ UP SN RL QK PJ PH PHPGPGCOY`egfc]y\ s\o\&k\0i[9f[Ac[HaZO_ZV]Y^[YfYXnWWy TW RU PT NS LQ KO KN KM KL KKKKFS^eikkidtanaja#fa.ca7a`?^`F\`MZ_UX^\V^dT]mQ\w O[ LZ JY HW GV FT FR FQ FP FP FP JXbinpqo~joghfdf af+^f4\f<YfDWeKUeSSdZPcbNckLbuIa G` E^ C] A[ @Y @W @V @U @T @T P]gnsvvu|qmnal^l[l'Xl1Vl:TlBQkIOkQMjXKiaHijFhtCg Ae ?d =b ;a ;_ ;] ;[ ;Z ;Z ;Z Vclty|}{zyjv[t WsTs$Qs.Os6Ms?KrFIrNGqVDp_Bph@or=n;l9k 7i 5g 5e 5c5a5`5`5`\irzxh~W|N{L{I{)G{3Ez;DzCBzK@yT>x\;xf9wq7v}4t2s0q/o/m.j.i.g.g.gcoyudTF B@$>.<6;?9G7P6Z4d1o/|-}+|)z(x(u's'q'o'o'okwq`QA864'2009/B-K,U*`(k&y%#! |zxxxt}m\L>/)(&($1#;!D OZgu~wgWH:-(1;FS` n  o`QB5)%0;GUduufXJ=0%#.:GWh{{k]OB6*   *7FXlсϙ̱paSF:.$ #2CXnteWI=1& ,>Un|m^PB4) ':Pi#"#$(.7CO[elsz!  !$)3?KW`hou|$/;GR[cjpw|"+6BMV^ekqw| '1=GPX`flqw|  ",6AJSZaglrw}!  %0;DMT[bgmsy$ *4>GOV]ciou|'! " - 8AJQX_ekry*$'&'$ (3<E M T![!a!g"n"u"}""! ~|zyxxx,*,242-$#&#(.)8*A*H+P+W+],c,j,q,z,}+{+y*w)u's&q%p$p#o#o#./5<>=82-01*243=3E3L4S4Y~4`|4gz4nx4vv4t3r3p2n0m/k.i,i+h*h*h*/3=CFFB<6 79&:0:9:A};Iz;Px;Vv;]t;dr:kp:sn:}m9k9i8g7e5c4b3a1a0a0a019CJMMJD>>?"@-{@6xA>uAEsALq@So@Zm@ak@hj@qh?{f?d>b=`<^:]9\8[6[6Z5Z54>IOSSQKED}ExF*uF3rF;oFCmFJkEPiEWgE^eEfcEnaDx_D]C[BYAX?W>V<U;U:U9U97CMTXYWQL|JvKrK'oK0lK8iK@gJGeJNcJUaJ\_Jd^Il\IvZHXHVGTERCQBP@P?P>P=P=;HRY]^\XRwP qOmP$iP-fO6dO=aOD_OK^OR\OZZNbXNjVNtTMRLPKNJLHKFKEKCKBKAKA?MV]acb^XrUkTgU!dT+aT3_T;\TB[TIYTPWSXUS`SSiQRsOR~MQKOINGLFJFIFGFFFFFFDQ[bfggd}_mZfZbZ^Z(\Z1ZY9XY@VYGTYORYVPX^NXgLWqJV}GUETCSBQAOAMALAKAJAJIV_fjllj{elb`_\_Y_%V_.T_6R_>P_EO_MM^TK^]H]eF\oD\{B[@Y>XbzjY0 -+!**(2';&D$N"X!dq~{yvtrqqs}zjYJ;-! "+4=GS_m} ~ |{{|tdTE7*  ! + 5?KXfv|l]N?2&   *5@N]lsdUG9-!  (3@OasxiZL?2'%1?PcyŒî}m_PC7+   !.>Qf~rcTF:.# *<Qhyj[L>1&$8Oh!!!"%,5BOYbipw}  &1>JT]elrx~"-9EOX`gmsx~ )4?IRZagmsx~ $/:CLT\bhmrx~  )3=FNV\bhmsx#-7@HPW]chnsz '1:CJRX^diov} *4=E L S Y _ e l sz  } | |{!"#  $.8@GNU[ahow~|zxvtsrrq#")/0.(! *"3#<#C$J$Q$W%]~%d|%kz%sx%|v%t$r$p#n!m kjjii$(28:94.& (*%+/,8,?~,F{-My-Sw-Zu-as-hr-pp-yn-l-j,h+f)e(c'b&b%a$a$&0:@CA=8002!2+{34x4<u4Cs4Jq4Po4Wm4]l4ej4mh4vf4d3c3a2_0]/\-[,[+[*[*+7@FIIE@97|8w9(t91q:9o:@l:Fj:Mh:Tg:[e:bc:ja:t_:^9\8Z7X6W4V3U1U0U/U/.<FLOOLGAz= u>q>$m?.k?6h?=f?Dd?Jb?Q`?X_?`]?h[?rY?}X>V=T<R:Q9P7P6O5O4O44AKQTURMHuC oCkC!gD+eD3bD:`DA^DG\DN[DVYD^WDfVCpTC{RBPBN@L?K=K;J:J9J8J89FOVYZXS~NpIiHeHbI(_H0\H7ZH>XHEWHLUHTTH\RHdPHnNHyLGKFIEGCFAE@E>E=E<E<=JTZ^_]Y{TlOdM`M\M%YM.WM5UM<SMCRMJPMROMZMMcKMlILxGLEKCIBHAF@D@B@A@@@@BOX^bdc_yZjV^S ZSWS"TR+RR3PR:NRAMRHKRPIRXHRaFRkDQvBP@O>N=LVu^T<]^;]h9\s7[5Z3Y2W1U1S1Q1P1O1NS_gnrttrtoflUhGe CeAe"?e*=e21lF0lO.kY-kc+jo)i~'h&f$e#c$`$^$\$[$[altzo~_{Oy?v2u 0u.u!,u*+u2)t:(tB'tK%sU$sa"rm q{pnljhedcbis{}l[K<-%#"~$ ~,~4~=}F}Q|]|j{xywuspnlkkq{wgVG9*%-6@ K X et|ywutt{qaQB4' %.8CP^myiZK<0# $/:FUdvpaRD6*#.:IYkvfWI</#   +9J^r{k\M@4((7J_xדկpaRC7+   %6JbzvgXI:." #5Jc| #*4ALV_fmsy$0=GQZahotz +7BLT\ciotz  '2<FOW]dintz  !,6@IPW^dinty &0:BJRX^cintz  *4<DLSY^cinu|$.7?FMSY_djpw  '09AHNTZ`flt|~|zxwvuu   *3;BIOV\bi~p|yzwusqpnml l k &+,*% %.7>E~K|QyXw^vetmrvpnljhfedccc&/5750*"!# $*|%3y%:w&At&Gr&Np&To'[m'bk'ii'rg'}e'c&a%`$^"]!\ [[[ .7=?>94-){+w,&t,/q-7o-=l-Dj-Jh-Qg.We._c.ga.p`.{^.\-Z,Y+W)V(U'U%U$T$&4>CFEA<6y1 t1p2#m2+j33h3:e3Ac3Ga3M`4T^4\\4d[4mY4xW3V3T2R0Q/P-O,O+O*N)-:CIKKHC=s7m7i8f8(c80a87_9>]8D[8KY9RX9YV9bU9kS9vQ9P8N7L5K4J2J1I/I/I.2?HNPQNI}Do=g<c=`=%]=-[=4Y=;W=AU=HT=OR=WQ>`O>iM=tL=J<H;G:E8E7D5D4D3D27DMRUVTOzJkDbA^BZB#WB+UA2SA8QA?OAFNBMMBUKB^JBhHBsFBEAC@A>@<@;@9?8?7?6<HQWZ[YUwPiK]G XFUF RF(PF/MF6LF=JFDIGKHGSFG\EGfCGqAF~?E>DKpQG=QP;QY:Qc8Qn7P{5O3N2L1J1H1G1E1D1CKW_eijjgsde`U\FX CW@W >W(=W/;W6:W>8WE7WN5WW4Wa2Vl1Vz/U-T,R+P+N+L+J+I+HQ]ekoppnrkdhSdB`;^9^7^%6^,4^33^;1^C0^K/^U-]_+]k*\x(['Z%X$V$T%R%P%O%NXckquwwupraoPk@h3f 1f/f .f(,f0+e7)e?(eH'eR%e\#dh"cv ba_]ZXWUU_jrw{~~~|my]wMs=q.o'n&n$n##n+!n3 n;mDmNmYlfktjhgdb`^]\gqyziY~I|:z,yx www&w.w6w?vJvUub tp s qomj h f e dpyudSE6(  '0:DP]~k}|{yvtqonmy~n^N@2%  (2=HVev|zxxvgWH:-  )4?M]n}m^OA3' (4AQcwsdUF9,   '4CUjyiZK=1% #2EZq΋ͦ~n^OA4( 1D]xsdTE7+ 0E]x '3?IS[cjpv{".:DNV^ekqv{)4?HQY_ekpv{ $/9BKSY`ekpu{  )3<ELTZ`ejou{ #-6?FNTZ_diou|'09AHNTZ_djpw~ !*3;BIOTZ_ekrz~|{{z #,5<CIOUZ`fnv|zwutrqpoo &/7 > D J P~ V| \y cw ju ss}q o m k i h gfee #()&! !*2|9y@wFuLsRqXo_mgkoiygeca`^]]\\$-231-'|x%u.r5p<n Bl Hj Nh Uf!\d!cb!l`!v^!] [ YWVVUUU,5:;:60)y# t$p%!m%*j&1h'8f'>d'Db'K`'Q^(X\(`[(iY(tW(U'T'R%P$O"O!N NN%2;@BA=82s+l*i+e,&c,.`-5^-;\-AZ-GY-NW-VV.^T.gR.qP.~O-M-K+J)I(I'H%H$H$,8AFHGD?|9n3f0b1_2#\2+Z22X28V2>T2ER2KQ3SO3[N3eL3oJ3|I2G2F0D/C-C,C*C)C)1=EKMMKEy@k:`6 \6Y6 V7(S7/Q75O7;N7BL7IK7QI8YH8cF8nE8zC7B6@5?3>2>0>/>.>-6BJORRPKvFh@[< V;S;P;%M;,K;3I;9H;@G;GE<=;;9:8969493:2:1;FOTWWVQsLfGXBP@M@J@#H@*F@1D@7C@>B@E@AM?AV>A_5<5:58575655?KSX\\[WrSeNVIKEGEEE CE(AE.?E5>E<0=0;0:09EPX]aa`]qYdUUPFK AK?K=K%;K,:K38K:7KA6KI4KR3K\1Kg0Jt.J-I+G*E*C*A+@+>+>JU]bfgf~dp`c]TXCS;Q9Q7Q"5Q*4Q02Q71Q?0QG.QP-QZ+Pf*Ps(O'N%M$K$I$F%E%C%CP[bhkml}jogbdR`A[4X 1X0X.X&-X.+X5*X<)XD'WN&WX$Wd#Vq!V TSQNLJIHWainrss|qnn_kOg?d/`)_'_&_"$_*#_1"_9 _A_K^U^a]o\[YWUSQPO^houxzz{yku[rKo0$  #.;J\oqbRD6)".<NbzwgWH;."  .>Riǃß|l\M>2%-AXqqaQB5( +@[x%0;FOX`fmrx} +6@JSZagmrx} &1;DMT[bgmrw}  !+5>GNV\bglqw}&/8AHPV\afkqw~ !*2;BIPV[`ekpw$-5<CJPUZ`ekry '/7>DJPUZ`flt}~{ywvuuu  !)18?EJPU[a}h{pxyvtqonlkjii #+39~@|EzKwQuWs]qdolmvkigecb``__ %%#  { &w -u4r;pAnFlLkSiYgaeicsa_][YX W W V V "*/0-)#z uq!n)k0i7g=eBcHaO_V^]\fZpX|VTRQPOOON*27862-&slif%c ,a 3_!9]!?[!EY!KW"RV"ZT"cR"mP"yO"M!K JIHHHH$19=?>:5{/n(e$a%^&![&)Y&0W'6U'<T'BR'HP'OO(XM(aK(kJ(wH(F'E&C$B#B!B BB*6>CEDA<w6k0_+ Z+W+U+&R,,P,3O,9M,?K,EJ-MH-UG-^E-iD-uB-@,?+=)=(=&=%=$=#0;CHJJGBt=g7Z1T0Q0N0#L0*J00H16F1<E1CD1JB2SA2\@2g>2s<2;1:08.8,8+8)8(8'5@GLOOLGrBe=W8N5K5H5 F5'D5-B53A5:@6A>6H=6Q<6[:7e97r76654433313/3.3,3+:DLQTTR}MpHcDV>I: E:C:@:%?:+=:1<:8::?9;F8;O7;Y5;d4;p2;1:/9.7.5.3.2/0/0>IQVXYW|SoObKTEE@ @?=?;?"9?)8?/6?65?=4@E3@M1@W0@b.@o-?~+>*=);(9)8*6*5*4CNU[]^]{YnVaRSMDH:D7D5E 4E'2E-1E40E;.EC-EK,EU*Ea)Em'D|&C$B#@#>$<$:%9%8ISZ`cdc{`m\aYSUBO4K 1K/K.K$,K++K2)K9(K@'KI%KS$K_"Jl!JzIGECA?>=OY`ehjizglc`aP\@W1S*R(R&R!%R($R/"R6!Q> QGQQQ]PjPyOMKIGEDCU_flopoynlk]hMc=_.\"Y YYY$Y+Y3Y;YDXNXZWgWwVT R P MKJI]fmruwwxuiqYnJk:g,ecbaa a'a/a7 a@ `K `W_d^s][YWUSQPemty}~~u|dxTvEr6p(nl k kkj"j*j3j<iGiSh`gofdb_][YXmv|p_O}@z2y$wv uuuut%t-t7sAsNr\qko|nkifdbav~yiYI;-  '0;~G}V|ezwyvtromlrbRC5( (3@N_q~|{zyiYI;." )5CTg}o_PA4' )7H[qtdUF8+(8Kc}zjZJ</" );Qj߅ۤo_O@3& (>Wq"-8BKT[bintz (3=FNV]cinty  $.7@HPW^cinsy(2:BJQX]chmsy#,5=DKQW]bglry '/7>EKQW\afls{!*18?EKQV[afmt}~}{{z$,3:@FKPV[agox}zxusqpooo &-4:@FK~Q|Vy\wcujssp~nlihfeddc  '|/z5w;uAsFrLpQnXl_ifgoezca_]\[ZYY""  }xt"q)n0l6j <h Ag Ge Mc T` [^ c\ mZ xX V U S RQQPP (,-*& tmjg$d+b1`7^=]C[IYPWWU`SjQuONLJIIHH H (0453/*z#nea^ \'Z.X4V:T?RFQLOTM]KgJsHFDCBBBAA#/7:<:72v,j%_ ZW T $R *P!1N!6M!<K!CI"JH"QF"[D#eC#pA#~?">!=;;<<<)5<@BA=8s3g-Z'S%P%M%!K&'I&-G&3F&9D'@C'GA'O@(X>(c=(o;(}:'8&7%6#6!6 66/:AEGFC}>p:d4W.M* J*G*E+$C++A+1?+7>+==,D<,M:,V9-a7-m6-{4,3+2)1'1&1$2#2"4>EJLLI{Dn?b:U5H0 D/A/?/"=/(;/.:/480;70B61K51T31_21k01y/0./-.,,,*-(-'-&8BINPQNzJlEaAS;E6>4;49474&64,44235925@15I06R.6]-6j+5x*5)4'2'0'.(-(+)*=GNSUVTyPlK`GRBD=99 694929$19*/90.:7-:>,:G*:Q):\':h&:v%9#8"7!4"3#1#/$.BLSXZ[YxVkR_NRJCE4? 0>.?,?!+?(*?.(?5'?<&?E$?O#?Z"?g ?u>=;97543GQX]`a_w\jY_VRRAL2G)E(E&E%E%#E,"E3!E:ECEMEXDeDsCB@><:98MW^cegfwcj`_]OY?T0O#L LLL"L)K0K8K@KJKVKcJqIHF DB@>=T]dilmlvjjh\dL`<[-X USSSS&S-S5S= RG RS R`QnPOMKHFD C[dkpstsvrgnXkHg9c*`^\ \ \["[)[1[:[DZPZ]YkX|VTROMLKclrwz{zsxbuSrCn5k'ig feeee%d-d6d@cLbYah`x_\ZWVSRltz~m~]{Mx>v0t#rqpp ooo n(n1n;mGlTkcjthfdb^]\u}wgWG9~+}|{zzz zyy"y+y5xAwOv^uosrnljifo_O@2%  $.9GWi}~}ywutwgWG9, $/=Nau}m]M?1$ $1ATirbSC6( #3F\uxhXH:, #5JdҁѠο}m]M=0# %9Qk*5>GOW^djpu{ %09BJRY_ejou{  !*4<DLSY_djou{%.7?FMSY^cint{  )19@GMSX]bhnt}$,3:AGLRW\bgnv &.5;AGLQV\bhox}zxwvut!(/5;AFKQV\c|jzrw}trpnljiii #*06}<{AyFwKuQsWr^oemnkxhfdb`_^^^ ~y$v+s1q6o<mAlGjLhRfYdaaj_t][YWVUTTSw rnk%h,f2d7b=aB_H]N[UY]WfUqR~QOMLKKJJ&)*'#zogc ` ^ '\ -Z 3X 8V >TDRJQROZMdKoI|GED C B BBB&.120,'u!j_ ZWU#S)Q/O4M:L@JGHNFWEaClAz?><;;;;; "-48973~/r)f#ZROMK%I+G1F7D=BDAL?T>_<j:x97655556(3:=?>:{5o0c*W$M HF D "B (@ .?!4=!:BDC@y;m6a1T+H&B$@%=%;%%:%+8%17&86&?5'G3'P2'[1'f/'t.',&+%*#*!+++3<CGIIEwAk<_7R2E-<):)7)5)#3)(2*/1*50+=/+E.,N-,Y+,e*,s(+'*&)%'%%&$'"'!7AGLMNKvFjB^>Q9D48/ 4.2.0. /.&-/-,/3+/;*0C)0L'0W&0c$0q#0"/!- + *!("&"%<ELPRSPuLiH]DQ@C;55.3,3+3)4$(4+'41&49$5A#5J"5U 5b5o4320.,+*@JQUWXVtShO]KPGCB4=)9 '9%9$9""9)!9/ 97:?:H:S:`9n9~86420/.FOVZ]]\tYhV]SPOAI2D$@ ??? ?&?-?4?=?F?Q?^?l>}=; 9 7543LU\`ccbt`h]]ZNV>P0L"HFFFF#F*F2F:FD EO E\ EjDzCA?=; 9 8R[bfijisghdZaK\;X-TQN M M M M'M/M7MAMLLYLgKwIHECA?>ZbimpqpsnekVhFc8_)\YWVVVV$V,U4U>UITVSdRtQOMJHFEbjptwx~wqu`qQnBj3g%ec a` `__ _(_0^:^E]R\a[pZXUSPNMjrx||~l{[xKt=r/p!nlkjjjii#h+h5hAgNf\emcb^\ZXVs{ueTE|7z)ywvuut ttts&s/s;rHqWphn{lkgecb}~m]M>0#  (3A~P|b{uywuqonteTE7) +8GYm~}{j[K<."  ,;Nd|p`PA3& .@UmvfVF8*0F_zșŷ{k[K;.! 3Kg '1;CKSZ`flqw}  ",5>FNU[afkpv}'08@HOU[`ejpv}"*3;BIOUZ_djov~ &-5<CINTY^cipw (/6=CHMRX]cipy~|{ #*17=BGLRW]cjs}|zwusqpoo %,17=BG~L|QzWx]vetmqwoljhfedcb&|,y2w7u<sBqGoLnRlXj`gherc~`^\ZYXXX   }xs!p'm-k2i7g=fBdGbM`T^[[dYnWzUSQPONNN zr mie"b(`-^3\8Z=YCWIUPSXQaOkMwKIGFEEED$''$ uj b ]ZX#V)T.R4P9N?MEK LI TG ^E iC uA @ >==<<<%+//-)|$qf[S P N L$J*H/F5E;CABI@Q>[<f;s9765 5 5 5 5!+25640y,n&b WL HFD!B&@,>2=8<>:F9O7Y5d4q21/..///'17;<;7w2k-`(T"HA?=;#9)8/655<4C2L1V/b.o,+)(()**-6<@A@=u8j3].Q)E#< 864 3 &1 ,0 2/!9.!A-"J+"T*"`("m'"}%!$ ##$%%1:ADFEBs>h9\5P0D+8% 2$0$.$,$#+$)*%0)%7(&?'&H&'R$'^#'l!'| &$"   6?EIKJHrCg?[;O6C26,-)+)))')!&)'%*.$*5#*=!+F +Q+]+j+z*)'%#" ;CINPO~MrIfE[BO=B964(/ %.#.".!.% /,/3/;/D0O0[/i/x.-+)'&%?HNSUU}SqPfLZIODB@4:&64444#4*41494B5M4Y4g4w3 2 0 .,*)DMTXZZ}YqVeSZPOLAG2A$=: :::!:':/:7:@ :K :W :e9t87531/ .JSY]``|_q]eZ[WMS>M/I"EA @ @ @ @% @,@4@>@H@U@b?r><;8643QY`dfg|fqdfaY^IY:T,PMJH HHH"H*H2H;GFGRF`EoECA><:9X`fkmn|mqkdhUdE`6\(XUSR QQQP'P/P8OCOON]MlL~KHFCB?`hnruu|tor_nPj@g2d$a^ ]\ [ZZY#Y+Y4X?XLWZViT{SPNLIHipvz||z{jxYtJq;n-lihffe eddc&c0b;bGaV`f^x\[WUTRry~sc~R{Cx5v'tr qppoo onn!n*m5mBlPkaitgeb`^]{|k[K<.!}|{{{zzz zzz#z.y;xJw[vntqpljirbRC4'  %2ARg~}zwyhYH:,'6I]tn^N>1# ):OhtdTC5'  ,@XsyiYI9, .Gc  $.7?HOV\bgmrx )2:BJPW\bglrx#,5=DJQV\afkqx '/7>EJPUZ`ekqy#*18>DJOTY_dkr{ %,29>DINSX^dkt~}{yxvu '-39>CHMRX^~e{nywvtqomkjih "(.3}8{=zBxGvLtRrYp`nhkri~fdb`^]\\ }y#v)s.p3n8m=kBjGhMfSd[ac_m\xZXVTSRQQ  }wrnk#h)e.c3b8`=^B\HZOXVV_ThQtOMKJIHGG um hc`]$Z)X/V4U9S>QDOJMRK[IeGqECA@??>>!$$"{pf ] XURP%N*L/J4I:G@EGCNAX?b=n;|:877666#),,*&x!mbWN JHF D&B +@ 0? 6= << C: K8 U6 `4 l3 {1 0 ///// */331-u)j#_SHA?<;"9'8-62593@2I0S/^-k+z*('' ( ( )&/58984s/h*\%QE; 8542$1*/0.6->+F*P(\'i%x$"!!"## ,4:=>=}:q5f1Z,O&C!81/-,!*')-(4';&D$N#Z!g v09>BCB|?p;e6Y2N-B)7$, )'%$$# +" 1!!9 !B!L"X"e!t! 5=CFHG{EoAd<X9M4A/6+*& #$!$ $$"$)%/%7&@&J&V&d&s%$" 9AGKMLzJnFcBX?M;A662)-) ))) )'*-*5*>+H+U+b*q * ( ' % # !>FLPRQzPnMcIXFMBA>59'4/ ..//$/+/3/< 0F 0R 0`/o/-,)'&$CKRUXWyVnScPXMMIAE2?$:75 5 5 5" 5)515:5D5P5^4m4~21/,*)IQW[^]y\nZcWYUMP=K/F!B> < <<< <'FLRX]chms{  )19@FLRW\agmt| $,3:@FLQV[`fmt~ &.4:@FKPUZ`fmv~| "(/5:@EINTY_goy|ywtrqpo $*/4:?CH~M|SzYx`uisrp~nkigedcb%|*y/w4u9s>qCpHnMlTj[hcelcx`^\YXWVV |xsp%m*j/i4g9f>dCbH`O^V[^YgVsTRPNMLKK xr mie b%_*]/\4Z9X>VCTJRQPYNcKnI|GEDBBAA{phc^ZW T%R*Q/O4M9K?IEHMEUC_Ak?x=;:9988!!wlaY TPMJ!H&F+E0C5A;?A>I<R:\8h6u4321100!'*)'#si^S J FC@>"=';,91876>4F3O1Z/f-s,+*))))(-00.|*q&f![PE< 97 5 4 #2 (0 ./ 4- ;, C* M( X' d% s$ # " """"%-3664z1o-d(Y#NB81 .-+*%(*'1&8%@#J"V bq   *28;<:y7n3c.W)L$A 6, (&$#""(!. 6>HTao /7<?A?x=l8b4V0K+@'5"+" %,4<FR_n3;ADEDxBl>a9V6K2@-5)*$ # * 2!:!D!P!] !l !}    8?EHJIwGkD`@V=K8@450*,'$$$$!%(%0 &8 &B &N&[&j%{$#!<DJMOOwMkJ`FVCK?@;57'2-* * * * *&+.+7+@+L+Y+h*x)'%#! AIOSUTvSkPaMVJLGAC2=%84 1 0000%1,151>1J0W0f/v/-+(&%GOUY[[vYkWaTWRLN=H/C!?;8 8777"7*737<7H6U6d5t420.,)NV[_aav`l^b\WYHT9O+JFCA@ ??> >(>0>:=E=S`/]"YWTSR QPPO!O*N4N?MML\KmIHECA?fmquwwwvfrVnFj8g*db_^]\[ [ZYY%X0X;WIVYUjS~QOLJHouz}~~o{_xNu@q1o$mj iggffe edd c*c6bDaT`f^{\ZXTSx~xhW~G{8x*wusrqqqqpp ooo#o/n=mNlajvhfdb^o^N>0#}}||||||| |||'|5{FzYyowtrpoueTD6'  +<Pf|kZJ;, 1E\vq`O?1#"5MivfUD5' '=WtΕʽ'08@GNTZ_djov}"+3;BHNTY^ciov~ &.5<BHNSX]bhow!(06<BHMRW\bhpy #*16<AFKPU[ahq{~|zxw%+16;@EJOU[b~j|tyvsqnlkjj  &+0~6}:{?yDwIvNtUq\odmmjyheca_]]] }y!v's+q0o5m:k>jCiIgOdVb^`h]sZXUTRQPP|wrnj"g'e+c0a4`9^>\DZJXQUYSbQnO{LJHGFEE {sl hc`\"Z&W+V0T4R9P?NEMLJTH^FiDvA?>=<;;  vld^ YUQO"M&K+I0G5F:DABH@P>Z;e9r8654332}rh ]TP KHEC"A'?,=1;6:=8D6M4W2b0o/-,++++%''$z!oeZP FB><97#6(4-2319/A-I+T*`(m&}%$$###&+..+x(m$cWMB 9 530.-$+)*/(6'>%G#Q!^ k{$+1342w.k*a%U!K@6- ) ' & $ # &! , 3 ; DP\j {  )16897v4j0`,T'I"?5+" #)19BN[iz    .5:=><u:i6_1S.I)>%4 *  '.7@L Y g w 29?BCAt?h;^7S4I/>+4'*#  % , 5 >JWeu6>CFH~GtDhA^=S:I6?25.+*%    #!+!3"="H"U"c!s!;BHKM~LsJhG^CTAJ=?966(0,'%&&&"&)'1';'F'S'a&q%#"@HMPR}RsPhM^JTHJDAA3;%62 .- ,,, ,',0,9,D,Q,_+p*(&$" FMSVX}XsWiT_RUOLL=F/A!=964 3333%3-372B2O2^1n0/,*'&LTY]^}_s^i[`YVWGQ8L*GC@=< ;::9#9+959@8M8[7l6520.+T[`de}ftejcaaQ\BW4R&NK HFED CBA A(A2@=@J?Y>j=};9753\cgkm}mtlkj[fKb<^.Y VSQONM LKJJ%J/I:HGHVFgEzCB><:dkost}tuteoTlEh6d(a^\ZYXWV UUT S*S6RCQRPdNxLKIEDmsx{|~{nx^uMr>n0k"igeccbba` __^%^1]>\N[`YtWUSQNw|vf}U{Ew6u)sqonmmmllkkjjj*i8hHgZfoda_^[~m]L=.}!|{yyxxxxwwwwww"w0v@uSthromkjtcRB3%  &6J`y}{zziYH9*+?Uoo^M=/!1IctdSB3%"8QpÓ#,5<DJPV[`ekqx '07>DJPUZ_djqy"*18>DIOTY^djr{ %,28>CHMRW]cks~ &-38=BGLQV]dlv}zxvtrq "'-27<AEJP}Vz]xeuos{pnkhfedd#}(z,x1v6u;s@qEpJnPlWj_ghetb_]ZXWVW |wtp#m(k,i1g5f:e?cDaJ_Q\YZcWnT{RPNLKJK~wq lheb#_'],\0Z5X:V?TERLOTM^KiIvGDBA@??vmhc^ZWT#Q'O,N0L5K:I@GGEOBY@d>q<:86655 | qg_Y TPLJG"E'C,B1@6><<C:K8U6`4m2|0/.--- xnd YPK GC@=;#9(7-62483?1H/Q-]+j)y(&&%%%#$$!vkaVLC> :7420$.)-.+5)<(D&N$Z#g!v $)++)t%i!_TI? 62 .+)' &%$+#1!9 ALXet"*/11~/s+h(^#RH=4+ & # "(.6?J V ds'/467}5r1g.\)Q%G =3)      % , 4= H T b r    ,38;;|:q7f3\/Q+F'<#3)     " ) 2;FR`p   18<?@|?q<e8[5Q2G-<)3%)!    (09DP_n 5<ADE{DpBe>[;Q8G4=04-+)% &.7BO]m:AEIJzIpGfD[AQ>H;>754)/*%" """"$",#6#@#M#["k!} ?FKNOzOpMfJ\HREIB@?3:%50 ,) ((((#(+(4(>(K(Y'i&|%"!DLQTUzUpTfQ]OSMJJ=D/?!:631 0/..!.).2.=.I-X-h+z*(&$!KRW[\z\q[gY^WUTGO8J*EA=:87 6555&505:4G4U3f2x0/,*(RY^bczcqbh`__PZAU3P%LH EBA@ ?>==#<-<8@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./012456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~񪌫ۊa۶iUֆAaߖg\;~cibvBAj+0}" d[dgܿδӟr<@\12d&(WuD{ܳX7pѣxWH;_¸ܼаaDXhC9sB6 ix qjbT$WЧwF$Gۯ[?)7ܽkZS̾ҳǢhM3ڪ~V3c҆S%FB -bznTcYQ^G HÝdG3 AƲp[M;Aô˪x_GGϟuR3%j;|UbjI4c"8dy5qmUA1!n׼zk\PD3nȻë~eLqѢzY=# Xܓ]0 79/Ps`N(>R0{#O/  {ri_TE4Ӽy]絎oU=% a4uu+Vy: ! I|qnb Y;QpM JQHE?Ȩ|viYIݴz`I3ByI#%+_|kT@.En1`1|=#)wƼxT7!)w=Ia/TtDxoi\ Q0FZ=5.[*%rVh%;Oe~ܱ{tomlls~6Pj[R;&Ft6^KB p(Cb󒡶aF2# REypbUAJg@6.I%|,y M?8Z#7I\q˭uja[UPKJLQ`xW/8#?}'Pv%P}'a) x 0Ga}ŻuYC1"&/u2g_[QF6=]4+*"[ hG5PnFASdv鼟}qg^XRMIGDGRd3 ;n%Kp6aW-8T$5H]tǽy_L=0' &O>}s;gc]T$KIBq8%-V!%2Lv-C\wlhzƥ|tmhc^YVTV\l0@O{>c9c* &?k$=XwK9J[lŽxcUIB<72.*'%&+4Kpf4\ -wRmyb;-Iq /JjH+;MavԪ~|{}E6,$  BwP+{(Mq,R"Bc/LmS ,>Qhu}tmhda_^]^chv) %[J q*N7q@e8 <[h );Pgdx˽aZUQONMMORZez)JPjt*Qt6?gY5Sv(1EZsltPLIGHIJLSYh|<.\`Ak߂) 9VwK/CXp҄xUIJMRY^pV0Jhp>^y򣅦desc Little CMS Little CMSdesc2.x 2.xlcms2-2.19.1/testbed/test3.icc0000755000175000017500000006750415176573557015056 0ustar martimartioDlcmsspacRGB Lab  1 acspMSFT-lcmsdescA2B060B2A0760wtptncprtn,#dmndnPdmddntdesc,Test profile, not suitable for real use-Test profile, not suitable for real usemft1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ymb XPIC$<+6209+?%FLR z {~ ~sh^VN$G*@0963<-B'I!OUopt|yq!~g%^)U-M2E7>=7B1H*M$SY,i-j-m/q{1uq3zg6^:U>MBEF=K6O/T)Y"_=d>e>g?jAm{CrpEvgG{^JUNMQEU=Y6]/b(f!N`NaObPdQgRjzTnpVsgXx^[}U^MaEd=h5l.p'^[^\_]__`aadcgydkofpfht]kyUm~LpDs=w5z.nWnXnYoZo\p^qasexthovlfxq]zuU}zLD=5}S}S}T~U~WY\_bwfnien]rTvL{D=OOPQRTVY\_vcngek\oTsLwDKKLMNOQTVY~]v`mddh\lTpLG©GHIJKMOQTW}Zu]lade\iTCƷDķDEFGHJLOQT}Wt[l^cb[@@@ABCDFHJLOR|UsXk\c<<<=>?@ACEGJLO{RsVj8899:;<=?ACEGJMzPr{od ZRKD&>-731:+@%G MS ~ uj`W O%H+A1:74=.C'I"OUtvy~ }s#h&_*V/N4F9?>8C1I+N%TY.m.n/q0t|2xr5}h7_;V?MCFG>K7P0U)Z#_>g?h?j@lBp{DtqFxgH}^KUNMREV=Z6^/b(g"ObOcPdPfQiSlzTppVtgYy^[~U^MaEe=h6l/p(_]_^__``acbeciyempgqgiu^kzUn~MqEt=w6{.nYnYoZo[p]q`rbsfxuiovmfxr]{vU}{ME=5}T}U~U~VXZ]_cwfnjfn]sUwL{E=PPQRSUWZ]`wcngek]oTtLxDLLMNOPRTWZ]vamdeh\lTpLH©HIIJLMORTW~Zu^lade\iTDƷDŷEEFGIKMORU}Xt[l_db[@@AABCEFHJMOR|UsYk\c<===>?@BDFHJMP{SsVk999::;<>?ACEHJMzPr ~ r g]UM#F)?/963<-B'H!NTxmcZ#R(J.C4<95?/E)K"QV }!~"$u&j)a-X1P6H;@@9E2J,O&UZ0t0u1v3y~4|s7i9`=W@ODGH?M8Q1V*[$`@lAmAnBqCt|EwrG{hJ_MVPNSFW>[7_0c)h"PfPgQhRjSlTo{VsqXwhZ{_\V_NbFf>i6m/q(```a`bacbechdkzfophsgjw^l{VoMrEu>x6{/o[o\p\p^q_qbsethyukpwogys^{wU~|ME=6~V~W~WXZ\^adxholfp]tUxM}E=RRSTUWY[^awenhel]pUuMyENNNOPRTVX[^vbmeei]mTqLI©JJKLMOQSVX~\u_mbdf\jTEǷEŸFFGIJLNPSV}Yt\l`dc\AABBCDFGIKNPS|VtYk]c=>>>?@ACDFIKNP{SsWk:::;;<=>@BDFHKNzQrxlcZ#Q(J-B3<95?/E(K"PV}q!g$^(U-M2E7><7B1G*M$SX%&')x+n.d1[5R9J>BB;G4L-Q'W!\4|4}5~68u:k=b@YCPGHKAO9T2X+]%bCsCtDuEwFy~H|tJjLaOXROUGY?]8a1e*i#RlRlSmToUqVt|XwrY{i\~`^WaOdGg?k7n0r)aebebfchcjdlfo{grqivhkz_m~WpNsFv>y7|/p_q`q`qarcsethukzwnpxrgzv_}zV~NF>6ZZ[\]_adgxjongr^vVzM~F>UUVVXY[^`dwgojfn^rUvMzEPPQRSTVXZ]`wdngek]oUsMLêLLMNOQSUWZ~]v`mdeh]kTGǸGŸH¸HIJLNPRTW}Zu^lade\CCDDEFGIKMORT|Wt[l^d???@ABCDFHJLOR{UsXk;;;<==>@ACEGJLOzRr~ s"h&_*V.N3F8?=8C1H+N%SY"#$&w(l+b/Y3Q7IMBEF>K6P0T)Y"_99:;nAeD[GSJKNCR;V4[-_&d G{G|H}H~JKvMlOcRZUQXI\A_:c2g+k%UsUsVtVuWwYy~Z|t\k^aaYcPfHi@m9p1t*dkdkdlemfogqht|iwskzim~`oXrOuGx@{8~1rdresesfthujvlwo{xrqzuh|y`~}WOG?7^__`acehkynpqhu_yW|NF?YYYZ[]_adgxjomgq^uVxN|FSTTUVWY[]`cwfojfm^qUuMOëOOPQRTUXZ]`vcnfej]mUJǹJŹJ¹KLMNPRTWY~\u`mcef]EFFFGHJKMOQTV}Yt\l`dAABBCDEFHJLNQS|VtYk===>??@BCEGIKNQ{Ts''(*y,o/e2[6S:K>CCZ6^/c(g"KLLMNOyQoSeV\YT\K_CbXAOEGI@N8R1W+\$a56689w;m>cAZDQHILAP:T3Y,^%c<<=>@{ApDgF]IUMLPDT=X5].a(f!FFFGHJvLlNbQYTQWI[A^9b2f+k$QQRRSU|VrXhZ_]W`NcFf>j7n0q)]^^^_`bycoefh]jUmLpDs=v5z.jzkzkzk{l|m~npwqmsdu\wSzK}C;4xqxrxrysytzv{x|z~~|ulcZRJB:jjkkmnprt|wszj}bYQIAccdefghjmo{rruixa{XPH]]^^_`bdfhkymqpht`wWzOWĮW®XXYZ[]_adfxiolgo_sWRɼRǼRüSSTVWY[]`bwenhfl^LMMMNOPRSUWY\~_vbneeHHHHIJKLNOQTVY}[u^mCCCDDEFGIJLNPSU|Xt<<=>?{ApCgF]IULLPDT=X5\.a'f!??@AB}DrFhI_LVONRFV>Z7^/c)g"EEEFHIuKkNbPYSQVHZ@^9b2f+j$MMNNOQzSpUfW]ZU]L`Dc=g5k.o'WWXXYZ\v^l`cbZeQhIkAn:r2u+bcccdeg|hrjil`nWqOtGw?z7}0oooppqrtyupwgy^{U~ME=6{y|y|y|z}{~|~~wne\TLDxxyyz{|~wne]ULEppqqrsuvxz~|uld\SKiæijjklmoprt|wsyk|cZRbdzbijccdefgikmo{rrujwazY\\\]]^_abdfhkymqpis`VVVWWXYZ\^_bdfxiplgPPQQRRSTVWY[]`bweoKKKLLMNOPRSUWY\~^vPPPQRT|UrWhZ_\V_NbFe>i7m/q(RRSSTV}WsYj\a^XaOdGg?k8n0r)VVWWXZ[v]l_caZdQgIjAn9q2u+\]]^^`aycoefg]iTlLoDrw6{/eeeffgi~jtlknbpYsPuHx@{91lllmmnoqxrotfv]yT{L~D<5uuuuvwxy}zt|j~aYQHA9~~ypg^VNF>vmd\SKC|sjbYQI yqh`WOwƬwìwwxyz{}~wof^VoɸoǹpĹpqqrsuvxz~|umeĄ]hhhiijklmoqsu|wtyl|caabbccdeghjknp{rruj[[[\\]^_`acegikymqUUUVVWWXZ[\^`bdgxccddefg}itjjmaoXqPtHw@z8~1eeefghi~julknbpYsQuIxA|91hhhijklmvomqds[uRxJ{B~:3mmmnnopryspufw]zU|ME=5ssttuvwx}ys{j}aXPH@8{{||}}~wne]TLD<|sjbYQIAypg_VNFvmd\TLĤ¥|skbZR~ǰ~Ű~°~zqi`Xv˼vɼvżwwxyz{}~ÂwĄoņglj_ooooppqrtuwxz~|vmҁehhhhiijklnoqsu|wtylaaaabccdeghjlnp{rs[[[[\\]^_`bcegikylĹmijmīmġnėoōpŃqyspufw^yU|M~E=5n¹n³n¬o¢pØpÎrĄsztpvgx^{V}ME=6qqqrrstu{wryi{`}WOG?7uuuvwwxz~{t}kbZQIA9{{{||}~xne]TLD<|riaXPH@wne]TLD|sjbYQIĞypg_WOƩĩvme]TɴǴĴ|skcZ}Ϳ}}~~€‚ÃĄņƈzNJqɌiʎauuvvvwxyz{}~р҂xԄoՆgnnnooppqrtuwxz~|vnggghhiijkmnoqsu|wt`aaaabcdefgijlnp{vȼvȷvȰvȦwȜxɒyɈz|u}lcZRIA:wƽwƷwǰxǧxǝyǓzȉ{}v~lc[RJB:yĽzĸzızĨ{Ğ|Ŕ}Ŋ~Ɓwne\TKC<}~~~ƒypg^VME>|sjaYPH@wne\TLD‘{ri`XPHĚwne]ULƤä|skbZRɮƮ®yph_W˸ɹƹvm™eě]ÄÄĄĄąąņŇƈljȋɌʎ|ːt͑kΔc|||}}~~рҁӃԄՆֈz׊q،iuuuuvvwxyz{}~ကxpmnnnnoppqstuwyz~|vggggghiijkmnpqsu|̴̻̫͎͘͡΄zqh_WNF>˻˴ˬˢ̘̎̅{ri`WOG?ȼɵɭɣəʏʆ|sjaXPH@ŽŶŮťƛƑLj~ulcZRJB‹Šxnf]ULDÑ{ri`XPHĘvmd\TLƠàzqi`XPȩƩªvne]U˳ɳų|skbZͽ˽Ƚþ™ÚĜyŝpǟhȡ`ȋȋȋȋȌɌɍʎʏː̑͒Δ~ϕvїnҙeӃӃӃӄӄӄԅԆՇֈ։׊،َ|ۏtܑk{{|||}}~ဤၛ⃓ㄊ䆂zrttttuuvwxyz{}~xmmmmnnoppqstuwyz~ÈпиаѦѝѓ҉Ҁvmd\SKCÉϿϹϰϧНГЊрwne\TLDċ͹ͱͨΞΔ΋ρxof]UMEĎʺʲʩʠ˖ˍ̃zqh_WNFœżŴūƢƘǏDž|sjbYQIƘ؈vme\TLǟğzqh`XOɧƧ§~umd\T˯ɯİzqi`X͸˸ǹ¹vn­eĮ]ššššÛÛÜĜŝƞƟǠɢ|ʣs˥kͧc͓͓̒̒̒͒ΔΔϕϖЗљҚӛy՝p֟h׊׊׊׊׋؋،،ٍڎڏۑܒݔ~ߕvnㄽㅶ䆮䇦初払犍茄|t{{{{{||}~zsstttuuvwxyz{}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !!"#$%&'()*+,-../0123456789:;<<=>?@ABCDEFGHIIJKLMNOPQRSTUVVWXYZ[\]^_`abccdefghijklmnoppqrstuvwxyz{|}~~  !!"#$%&'()*+,-../0123456789:;<<=>?@ABCDEFGHIIJKLMNOPQRSTUVVWXYZ[\]^_`abccdefghijklmnoppqrstuvwxyz{|}~~kP7kP7kP7kP7kP7kP7kP7kP7kP 7 !!!!!!!!!k Q$7- 111111111k*Q68< ?????????-l>QF8K!MMMMMMMMM.ElPQW8Z"\\\\\\\\\-JYlbRg9j#kkkkkkkkk(NallsRw9y${ { { { { { { { { Qgu~mR:%|` F ,  |` F ,  |` F ,  |` F ,  |` F ,  |` F ,  |`F-|aF-|aF$-+--------}a/F8-=>>>>>>>>}8aDGJ.NOOOOOOOO?}NaWG\/^________DW}bbiHm/oppppppppG^l}ub{H~0Heu~bI1 j~~cI2/0011q2V2;2!22222222/0011q2V2;2!22222222/0011q2V2;2!22222222/0011q2V2;2!22222222./001q1V1;1!11111111*+,,-q-V-;-!--------%&'((q(V);)") ) ) ) ) ) ) ) !!q"V"<"""(")")")")")")")"r$V3<:#=>>>>>>>.r@VI';`tsX?(e|ˌsY@) ˢtZA+BCCDDDfDJE/EEEEEEEEBCCDDDfDJE/EEEEEEEEBCCDDDfDJE/EEEEEEEE@AABBBfCJC/CCCCCCCC=>>??@f@J@/@@@@@@@@9:;;<S SSSSSSSNOOPPPwPZP>Q!QQQQQQQJJKLLLwLZL>M!MMMMMMMDEEFFFwGZG?#G"*G,G,G,G,G,G,G<==>>?w2?[???F?#I?J?J?J?J?J?J?/122)3E3wR3[Z4@_4$a4b4b4b4b4b4b46Rb xk \q!@u!%v!w!w!w!w!w!w!?^o{x\A' Dg{y]B( Goҕy]C*uӬz^D,z_F. {`G0ijjjkkkjkLk.kkkkkkkghhiiiijjLj.jjjjjjjffgggghjhMh.hhhhhhhccddeeejeMe/eeeeeee_``aaaajbMb/bbbbbbbZ[\\\]]j]M]0] ]]]]]]TUUVVVVk%WN3W0:W =W=W=W=W=W=WKLMMN(NBNkNNNUN1YO[O[O[O[O[O[O?@AB=BUCcClkCOpC2sCtCtCtCtCtCtC-./L0e1s1}2l2P232222222WqƂ m P 5  _|ƜmQ6eƴnR8oS:!pU;$ qV=(}}}~~~~z~\~=~~{{{||||z}\}=}}}}}}}xyyyzzz{z\z=zzzzzzzuuvvvww{w]w>wwwwwwwqqrrrss{s]s>ssssssslllmmmm{n]n? nnnnnnneefffgg|5g^Cg@JgMgOgOgOgOgOg\\]]^;^R^|^^^f^@j^l^n^n^n^n^n^PPQ!RPRfRsS||S_SAS!SSSSSS??5@`AwABB}B`CBC#CCCCCC @!m#$ٕ%&'}'`'D(&((((((Xwٰ~aE(bF+ cH-dJ0fL3lL(lL(mM)mM*mN+}}~~~~n N&,046666vvvwww-wFxnSxOZx-^xaxaxaxaxaxmmmn nMnbnooowoP{o/~ooooooaaa>bcbwcccocQc1ccccccPQPQtRR̗SSSpSRT2TTTTTTW7^89::̳;;#vZ@'}\8}\9}]:}]:~^;~(^;p stttt~~~~<_s`?rrrVrvs߉ssttat@ttttttPbPbhbccߪddddbeBeeeeeeLLLMNNOOOcODOOOOOO""#%&(())d*F*#*****eH'gJ+hL/ jN3lImImJnKnL>oNMW"\^___)Shtp}N$SqфpO'>>>lѨqP*…ÅÅÅÅttttuuuvvrvRv-vvvvv___``aaabsbSb0bbbbb???@ABBCCuCUC3DDDDDvW6wY:y[=z]@"Ο}Z-˟~Z/Ơ~[0\2\3(15667R`]i5orsttDfy^7/h䖢â`9xxx亖Ė˖ЖaԖ<֖זؖؖؖχڇ⇤臃b>rrrrssttttdtAt tuuuWWWWXXYYYYeYCZZZZZ!"$$%&g&F&&'''iI$kL*mO/kA߱ߏkBڲڏlCղՐmDβΑm6FDLOQQNdzeǑsn|G[xՋoIeeee|մĴpɴK̴δϴддͨרިrMʘʘʘʘ՘sOtQ%lllllmmnnnvnTn*nnnnDDDDEEFGGGwGVH/HHHHyX4{[9}^=|S|T}U~W;PX\!cgij>>>>pƩѤс[)Ƥǂ\-Һ^1`5b9d=______``aaafaAabbb iD kHlJf1f3g5i7"2Ufjr:y}Vw؊푡k=xxxxxػm?ٶٓnBͷ͔pEqHsKuOwwwwwwwxxxxwyRyyyyMMMMMMNOOPPyPUP&PPPMMMMMMNOOPPyPUP&PPPMMMMMMNOOPPyPUP&PPPxHyIzK{M4BIMQk||OKKKKKKnǫ}Q~SV ߦXѧу[ ](`/a1a1a1a1\^_EaWahk?jفc ھe&g,i1k6m;׻ؖo?׻ؖo?׻ؖo?׻ؖo?׻ؖo?׻ؖo?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~XYZ MtextNot suitable for real usedesc Little CMS Little CMSdesc2.x 2.xlcms2-2.19.1/testbed/test4.icc0000755000175000017500000016713415176573557015057 0ustar martimarti\lcms spacRGB Lab %acspMSFT-lcms4V*Lm,W!֌] desclA2B0ttA2B1uB2A0w8t4B2A1lrig0h wtpttcprtPchad,dmnd2dmdd8$mluc enUSPTest profile, not suitable for real usemAB  PsparaparaparaparaparaparawyBRn aJe zT]oVvPO8RHBɢ=D: 6N#2&?.(*,P%/а xX0z|g~s#8jeWa*YLQJaD]"&>& :(B7P*A3-0N0z,@3|(S6F$o~rQ8uxAyoX[~Df(]. QT"Mi%F(ה@+<|.81-4441m7<-:*`<9&gui!k~ 5pt!tk"$fya'LY)P,GI.錶C1ʐ>4:-6B5:!2b=/@5+C`(q)_R*(`'\aV(e0{v(i4p+ng~.s^,0z-Uc3>MZ5̈́F7@Q9m;<7D@n4Ce0wFT-IH)6QVk51W3X1Z탑0^*x2rcm57hd8Gn[ :TtR)v~DsA? D:JGp46YI2PLu.O+AN.AO?O=rP9R`:Wv/<]j?-c4`Ai^WCoO$F6u_H2IzBK!=;Nd8P׈v4jS&0MU3,sMFLF]2LFȞIGMEGEK0DPNstFVgH]\KYdST MjLPKpES+v?V{;^Xrw6Z82\ׇ.V[>\??ǮY?TV>Re=vP?]NCB}O"HpPRQcS*XYU_JQ7XSeJKZl"C]r9>R`OwE9bd{5dOP0oi)9Rh9/g8̮He 7B(an5]568[t6Z$:|{ZBn\L~`^*SWKaZO`baHNegBJhsm YgEPʕKI',E|<,J,QT!+*)b(իk'&9:&Ϙ&.v'v*{-w/]o 6c>SXݝODhP$S)Ȼ*>)(?Zi' i%ϭ?$.#ѭ "]" "#bh%$4*>x0/OnQ+6b̥5={Wk1 {S wrɑRjIΔa Z?xRl)'KTE @P"1B/6>512G4੏.7˫ *:^'uYw xᅤ{6|  s_"SNj$`&KRX(Pf+0J."hC10>A4 :c6693Y;Ƥ/>H,AA)I%mo&p'r[(ux*-yjo,H~Tf .2\/ׇTr2]8M65;yG7h@:<8=38F?4B61E/-G *m/f:1g1tiވ2@l3sp uY4et k6xbr8X~XY:43Q2yD!:dFw6zHf2Kq/N'+<^` =_>t`Ӑ=Mb.SR^RqT̃AR2XwSH^lScbUPiYWsooQY(tJ[zC]U >6_! 9`5"b$0`FaGdaGawH`HJ_~KB_EO;]USt]GYoi^_^`dVajROcpRHehucAgIz@eM;nksFpp@qu:szV5z{ sB$}ErHos{OgcsUZ5tZR"va/Kx8fEyl^>{q8ۆ+9!¤v98ps8涾\8u F7ݪ7#[677r9,~=g{'}cC4mF}Jh`~zPW~VWO܀]"IÂxcCyh<6T7O6*p5޴5 4U3'3FA3z l5߅9x@jj҇G!^NVKOSNYH\_AR5Ū5l4ט4 3S3E2z1ez1 1,4W'a8pu_{>h瑢En]}LUE{QMWRF֠s3c3)3=13312ӳ2q=1tv16 0›01Oi4Bj8s>|g/D\JT@P L1Ǩ2)1L1rϨq0\F0o0/b6..2/013|7aq2$=eģxC[pDIRد/ȵ<0vj0e65/Ĺ˰.ֵ-ױ9-nX,dk#+_+ZQ+m,D/N12zc6o<dBZ5dw:e"w2n Uf$]mUN I!#BC %><(W:R+Ѯ6.C31̱/r4+X7G'-Ɍ?{?*rrC '$il!`#{X%/Pe)NI+ܣC.E>0Ƨ;3~C76\4,9S0<9W_65a'0X8TZV-U\.WmR\Xȗ\-Z9[]4[`ze[dp\MiOf]m^^s1U`nxN"b'}'Gxc܁@eh<gO7ch2dM0g[NJhP~iQGhRkgTBfVσMf8Zwfe_lfdpcgi/[fB>󼨋?bJ@e@Њ@2@kCA# PCE}=K!pQ[dV[҇*[TPbaMNftF‹k?E;S7<5<5B<>˔<6< ;Ρ_<&<2?(yBz;GnuMaPSyYʑGXRd]KcDtr9˜:69)9!B9ű#9U9J89ߙ9f:X V Q![IL7v77Ӥ77÷7&7Z7#JC6x67X=8H+;Q?;t衧DtiJ^O&VSO"56365͹P5y5 w4磌45H4}4֘]53 6ڇ9%~%=KsBhG]qLTƳ"3h+G4Ă4_=43&q3!2άȲ2[2X2fns2U3Y5O]7p{;q@fıAE\HDy%X{ߛ sQZja< wY"RZ$vL"'AF)5?,</$a8u2}45Z=183I-; a*jpI I"5S~#ٓvw%Zn& d(h\'+S-MlL/ĦxF21@x4㪾<7ìF9^:6=ʮ2@/pC,%ׅU(r9*у,bz-{q/!h1Ob_3.W5KOs8_H:rmB[<ɤ=?Y:sB^7D3G30aIK-.k~ 0~3Ј6q7cw8m:Jd<[=S?ZLhB#ED,?G<Ik8K5ND1Ph."8ur;Wv=wn?xA{}"B~ysCӂwjDE,Ta8FXH`PJfJ>L|SCNy>vPQ:S?6Uo3 W/lD)mJ;FmHnJpKr2LuiyMxpJN|gJP_^QeV?SNTH:VAXՔ=Z͗9\Ӛ[5^1OdRe=TfěUgVjWxlcXovXswmrYwdZ{\\mS]L_;Fnm19nI4h4T3kUZlVݧnoWnY}m[,m]mkavzqme3pkn0iXgoFm^_-p~rOWaqvOs{lItB_uɃQntVcu҂[8k_aلVd=Z-bhRΆmKrE7wo>0C{ҎD`E(EtF):F!GaH qJOd L~9Qs\\\U˙a5Nj)fFP[=]>U>z>nG>:>\>ɥIX>۟ ?PA?Џ1CnYG0ySKn7GPaUZZSѣ^K;Rɳ;%< {<}_<z<R< q<GF@DwYIl)NX`iSXݪX0P9<ʦj9Ė9S9غ9Q9o99{9ݮt:1:< =^B\uFjmOL_wPVQ6G7vH8'7J79h7xO7P7HI7>d7d07Ŗ 8E9v<}n?s=YDzhI]Ě?c9+E w"o#?f$e?^5&RcV(XN+H-/B04> 1wf:u4)68!3;0>߸,#r0[&(*I)Θ}{'+r,Oi-_/X 1f9O3I6PHC]9>< S;? r7A4D<~15F-+%<.0/,2~3&v51m^6d*8\>[a:WRåEA ?CM.3l6W9(;m郦=pz>GSqw?ސhmAl_CWDOmG;XHI9BK> N:PHC7R3T۪//<}S,Wu\LkX`_byd[5hTBlLrDDy˳7E FhFݜ}GGH{Id֜XJuߜHL[O3}Ss SXhОJ\_C`XdQj/HoAjBBݤCPbCDߤDWD EhF{zI(L?{0]OpUAf1Y]]V bM4}>~?}IJ?ؾg?\@,>S@d!@AޫA9B_C E?sIjx M>naRscV[\P10"S>iGB>h9?~H@:BFvߴJlwOaaTXb:#Ź/:2;;ýu;k;;»;ũ,m;䣗I< <<*<@p~ Cu`H=jMU_6" $&mۄ'|({at)\l*>c#+Z,Rs.rL0-$F*3@r4<9D8<)5r?2 BX_.*$',ܚE.E 0N1MwY2:,n3te4ڨ\6WgT?8IL:F-JȮG:MTx7iO4Qޱ08[Hi;n>@ֆBu~-D6uEmFטd HO[_JS L)L3NJFPf?RW IY/C][T>o\Y:^ۦ!7`3I}kM}HP}S~hyUXY;weZY nt[Ge\ߍ]`^-U`1N?aژ9Gc4AceFn:M?oǙ;Jq6`krdl6|gZlNim˜ko#^lpދmr݃5nuzQoxqap|hrVz`sjGXtQ#uJeww_Dx>Gz_8mbpcsOdΪuevg wh1xjVyfmzplw?zsno{wfC}z^@~e~@V́OpH܉B,a:<yKZi|:[ظ#]3^q{_$`ИRb~"eSg}Äk(tCnkr6cu\?yyT}RMOF1?RJTV2WBX^%Yv[ b\_Pbzefqqih䑩mjaq!Y”[tRr=yK<}CMē Na]OyLMqӡNN<硚OP:PLR7U~YOuy<]^kRa$cRre[ͧ"hT\mL EͨFŌ{GEHШHI2IȦ(GJozwKrLeNJQ|U%rYik ]`ƮqaXްf9PiC CDF[D寋DwTEjkEFrrG& HZI?豞K7}MzQ1pVgZ^>_JT@q @Z}AT|tAŽB BV&B%>C_CD'GDޓ[FC_)HEPKJxKNnz3SdXZ=X}>+>Đ_?\h?|[n?G?ǰ1%@h\@>o@AAECA%E6n-GwKlPa*ew,|-.t/^yg/ٰ=q'0h0dr_10W2+O4 KI7C8ɽ[>=(:@V]7PC3EǾ0R1.L3:$5j7"w8<,|:9t93k;:ӭa; Y<ƱPS>J9ADC4?FE;H8TK\~4M1U75΢:o=h ?߇@ ASvBznuCdD\$FESH!LjJ]F"Lv?NSYbl:[7K]Ͱ3AEfIHL/OEQَS~l, :m6qX?}\}P_}b}ϙey~{PaØ~bƁd*qe4^f'NDg!Xhk/mapwfsnڌpvfz _,:}WɁPLI,BYȻ[S\%0]˯w^ܧ_|ac ɓe~h0}/kwtInl,ordluZ\ܚ9xU||N#FS̑T~lUH:WX*Y>5ZpB[䕩]jk`?cJzɟpfqwj i~mMa䣬pZrDtUV"ZXu^^5lacҴ{e[鶏iSXG*GɃFH鲉I!߳{I sJNMJqKLM˶_M=NM*PJR|cVsZiɻ6^{`CbWDPDEZF@,FG2GHPTHI9d IhdK2M6ɿOzZ RpEWg\[]@YASBkƐ BC(zïCS6ZCCЬ/|DYŗD0E9m Q?܁@FBx@ϰpAQgA´^BZVCe NDE HGGAJ!=L!:kO*6Qq$3@>ѦcA8 D}F* G}ŃHt{dI(]sGIjsJڭaU0;WT8Y4cD}m9HgK-җN&YnO[P~JQvhz:j6S7ϲ WD3[e^gauᏃbӎdq~ e9ufRmgdhܚA\juCTl MmaGo7ZAp̦@='r.8t\ `dYݥgjAl0m͇nzp brtqIjrx|asYuR$vKx2Ez`šbc:4fih}ktnlTr eu6]ZexU|MsQ$TBEUV᧚XY#wZ%[Q{z\Ƭ5^o`ÃoczSgqjziCmbHNqZjtQN%;mO&OêoQůRK#%SznT{~Uy|dV$X Y1\/F"_twʷ)bnfdg?i_&OmVnwK6̲L)LňXMrkN'N޹jOv"PhݺQZ*nRSXUXB~[u_ lQbcg?ZGӺH_I'JsRKKKL4MMXNO1&QĻT|Ws..[i__nDtE 6FFwXFF`GPɌGH:ʫH͡(IˊJx K׌#zMԃPzT+pXfC;;=+=Z>">6v>A{J>5s)> j>b=FZ=dP?ýJAsDTD9$?=G#G;Ic8 Lc48ACdEKF4FG!}\GduVGmHdHz\+HSJSLLV FRNG@@QP|o}QEfQɵ^bRdVSNUyQHWBZY>[2Y:r]6IK ^NKQɡkTߓVg."WxXL*z~X評r~Y«iZa [X\RP^dJ`Da]?VcI;e+7QDU|YT\%S^C_M`}aVub{mcddا\f Tg^Mi nGjAlr=nL?8Y8 E]9`ѓZ3d%NghȔijykךqlם'i>mΟ9`&odXp¤jQr>tKs¨1ETuF?w:aĺe=timOdorȏMs/~tG[~uw^uvmwex™t][z4QU{Nm}EH~ˢC rC.{/}K}u9m+eiSc]ډnV1~PN۝Gҍ j2͒tjĤSkSl'lmuwno̓Tq*]s7vzWxre{jA~ob郎[VބŞ:OLa֛6b*bcdf _g ЦJht2iߐlnGq wso3vgy`PT}+XPm"Ynպ%['\']\]+^Z{_ۥaUbSdInfLi}yl/to.lyr^gJfk[ƼL5ֶLMMrN]ônNԽxOZŃO!fP8QhRvȖSa-TɤW BYi~v\u`Gl"ΕdbĔH׃IȇJ.ˇ'JoVJ=̴J߻͎KL]Kð(LlM&oN O>LYPōRӅҞU_|ӧXsEՀ\hC]ID۹ءEr:E֐ElNEE[wE6pD h*EƇ`^D^WDsO#DHH)CNJ>mMpDz:Odz6HBKL}MMOMѷrmN-NXyN`qNiOaOmYO6QQRiRj:Xɶ\:G_]bG(d衮fXYgFƁhyh0r iaMijCPaVk8+Yal QlmKinEpH[?r0;;` cӚ\g$jX;lњ9nڛOop}qur]ms?e"tF]#u|'UvNx+tHyC%{]r=HgkēM5o¬\rbu/wGy;z(J{'Dy{aq|Üi}f}`~ơYj+nR0cL6+F@)pgtދx$|z)ׁkČvj~vwn/Zf^&ڛMVϋ-OAIώ CRz{v~ǃ@ zuVԊU]݋>Ru6x{26rWj󒑐Kb[qiTDpMٛF{|9#|me{Ϻ{kR{ԩԔ|BO}&g~ ftxW2pDhs``Y QϢ3Js1zs[#sws|sʮcgts)uF8vxۢ1wʍyl{E}}u|:m^e^3$AVnNܛiԵjzk ä8kqel,lݪmnǚp άqɭEsĂٮBv1zoxr{j޲~bc1[l9SCa0؜bЫcgcԿ&daze}fgy7hgxjZ7lkF ne,`q?wsovh$y`Z}gWخ[pز,\І}]9]{Z^#^ֳ_iV`Mac{!xe] gR i}lu@Yomrdfvm[뷂VºsW"WXsELYY$ZN[/\ű]HcU^`gǒbsȝedzhvr?˺kip_1QŸQRƩSS\SɃT[ʑToˈU`V`6WX.mZN\Cϱ^S3aux idoCheSɡLMԶͯN$NDЬNOO4ӳP=9ԄQ?ReRyTRE UתW^Y:ٍ]]uuK`kLK߾2LѿMY˞lMzL?LRLƨ|LgtL;&mLL*qeKˀ^FK VlJeNJ,HYMy=BNQ>=SdO9PܸR{S1oTT,U-UQ0~U5vMU.znUkg-UH_UƞXDVDPWoJ|XƉDXZ!r>\<Ɲ:UNW㳺Yx[P\p:]]$]jx2]spC]ῠh^M4a{^Y_aQ`pKaEb@ d;ZKd]R_a[Mc2dְe ezf"Zrf`k8gOcg\h5bT%iMSj'Gk#Al<`p@$cfQQ*h)lkl֎emnmZ}nuonofCp^qGWr Os@Its~D v!>fס龯j.)m`pM7rEt?vw#LawUyxqxiyLaz@VZe{6R|w L}ڲ G _@m>ˆq3uřSxȘ6{}؞}c~ :v }a~9uLm.eQ1]섍=VхOŇI0CvƯz풑;~wqWz뚈˒7)=ၪ˗yŋcr$jaŽ2ZmTqSM?FMN뇺u8 ސOH+Œ%su0~= vUדnf^VWњPIRϘő=/9zصgCi-ќI)ṫ*r‰;{m֋swk*cG\@JUMF|K{v{w´{0F{&{़|}&~-SVtbGfxepxha+AYQrs7sZ̨sq{ssѭCtxzuQEvtx ny{Y}}u/möÃHUTlAV*]S_a$brcRc(dL|zd`W|Ld@:tdMmkdZfd_eX2e[Pf?rJg'DhQŕ>b +dó"f޳é^hٳj\٘8k֏l6\l~lCwlo}lwh]m2amZnR2nKoEpU?fjA}l+ogzq| sAǒVt5+tܱu yu6rmuku湷cvL\vTw)Nx;HDzZAmvÌp짷DtBƯv٦y1Z{O|Xx}YJ}꫰}S~u~"n~f_hX/PށﶒJabDst#xʼ{~ß8P׃ q1Ѣ0ŀydNqꇱj&bt魐[7ܮTHMqG6}Ḿ6Єʘ3,Q8덺ۚFU%(}-y un f'Ts^hWP͖J-ԓ_DŁ](_LѢfՑfҘד≴yry0jWb=p[BT]M-?%ҊL퉦ԉIΉH~󖟢Sk⍁o~9~sYSvpogd_`XuʜP=Z^ ž?CWnPi‚ݣӃjBPϋJ*qʼn2{sɍkdx;SXy>{e}n}u`mZMf]]{l.ျ]l]إlpy$laȀ;lLêllޱImnVǧo}=Rp̒trt:vz,y r͐{jPbaeMģe]4e[ҰefVʣene'f/#fή?gЦhɟsj4k4m\,o 0\qwtodxif˼^2w^z^^ԛѸ^5^<ԇ^s}_yc_+ab5z؏c{./dfڀhvj}qEmt>qFkEWQ WܻWXXʐYO!zZq[RK[|@WZZYEY}Yҍv;Y$nYhjY>ԱaXkZXԼT"XAMXZdGK[@`aÀbĮKb,)c'mcMȜcVZcI1 c̨wbp bNib\c3zƗ蝕Õ,jdc}UkvnΠt%fD_@XlP畇ܙǑX[$#`5UƧE%PCz&nSrƪ?k1cd[᭏RT@`գŊ:ɩp 3׮3Ka\ݰ^xNm5ۍeJ)~(3v.oa:g˶'`!WdBgb?ҵqUgEϸk֣WR3„R,߇n{)sQl/dg#\J}#||IIl{ʾ{+R~{" {({Ã|.}\5~2żՃ"x݅tqU9i@>`jttܻ?tvnŇt5;Ǒs)sݼRs4KtXiu̽u6w0#xL}yᅉ`{}}е}uOmӥe'MmCmކJm^l"!ltѹl̿ҚmTtmNCnL nհo!>q;rΊרtYvzzyar"|bieӒe߹՚eטee%eÖf#hf>܄gF *hFi?cdjkXߟm=To"SrYww[uRn]VG]R]Fm]}Խ]u0^oNjQ_4_ҹ`{abc{eDHfE1hBj}znt(bc_B/b} biVbj#@b7asaՅYazatּsa.\l`f_`P_uاY_R`)עLa`FDgHki)_j6ҭ|j:cjˣ*kɔlk jcjС{jѩtiҠn icӏgigahz[hBShMFiEG!lz3nI_pÃypo.qlrcrOrǗrUr^}orevQqmoEqiqAlcp\gpХUpaMqHqAs}̺ uRw55xiyDVzzFчrzo$;zLx?zWq?yjyydy7˩^y.AVy4Oy-IZvιy{丗X}¸N u 2D&zb 7sulÁ]fR`XQwňJD}"q‚ͷbΦ3$8Z#9ty}Unv?8o=hqݿaӊiZpShELj.[Cn$6Q,v9[А]}ۀcyCϴr:۶k=5d`]|4VZwOL&XAڥE"> Ǧ]L̩GW|SuhnKg(N`/@jYnnR$ci:Nr\ܟG?%k$y3 g'6ylWrTF j𥽪c\iɭUFr>ǣۗVK˪K>җɝ(cљt#&}h3v,P o:g^B_ZjX0z ё԰*AÞP5ȲF>)qcjXM͉zBҷzOHrktc%[e⊴?F@w V,7ۿ1[q5/(qh,~!wo)hg;`橽!LiªBPĻ]lxǧT9w%%^؛ɞ2ʋK{BtJj)ldb}iƏ}|gY|$Q{ǩ{Ud*{Gk{Jzѕ{㧮 |wb}ү~kD.[$xm~qˈ}h*uu?ttզtw t@00t8jtRٸtYulvP`wxPxܹyꅫ{}h~ u&mDkmmmܳm\ջfm3i߀mmG3mimnw:/o8p]@Nq s%tmwz2yrfce;eeH?eњf ʚfkÉQfμgF|ghԧQiƟ jXl3npo#~rw jskкk|vj Sj_jtl^jdi:imٓhQxh]qg]kBf&efF^eXUfۡQf9K)oUq#˾rL̘nrҩs(@yNYn󘏳mU}'*v?o]PhZb[),S_$n#8½H޺g-٩)?n󘡡яޯD 䲢y:rf#kdġܸ^Vٳ]ȥT%@mߩC=MǜQ̌*2:ͪ|umn\g`Yܠ`݂cӂiI°< vg(q v{ZqޠA=գ0ޥyϦr(kg"d`\yz& x=җ:.#+.ݽ9?׽,+#<}vio>&Wg_F.둝ܖ(˃ݐp01?=%ϐl-*ڡ_xƔƔJz@sSk5dHɊ劕7-˪LJA5+u(W{pojOϋ]Fōoߐwцp DhDhw}9ӛ8a t˃x!92n![݆)PP{@t-l=~&c}{}bߖz|\|Pܻ|Ƹ{޼{u{֯|djV|}ؘ'1~ ကF|x呆p۶vvKuuuZ u(Wt³t1uާonimncmD߇]lCWہXRt.Q}iŲ\v%\3/B w^)ז-f2Ӎ~}ԙxiՓq#~k~Re}`}^װYs|FR>sȶ.O$ŸIQ>|CYʀ_˹hۉfvys]"m(gB a^Zԅ/ӐS[nҋ'=$T0.šJ8%ː V4@Z?V|;u-̢nhЍcb\TϻU+뽒pνyD\˶~5c^i€3ä~,xSƥqikLdӖ!y^}=Wc&Ù`"u1!@nJ&q<!-W;;¿zC4s m%CfמĄ`PY֊ |-Ѳ( ĩ?\w;>>0G}ڬѡ%ۮc\谩ᲒyqslT·,ee^ĦߨS֯yƊץvrJuȦO󦧜ʺwl¨axڄ-U}:!vPomҰKhAa%{q۪zG ݞÖhGܞ̩[!̠%âZÈmXՁG2kz( s&EkҪ)dXĈNǘYzژ3ϨuGٿD՗߶DuEf ="ѕq׍gœ1̃~!TJvóh̟λu۵^ӖA!hh*Ֆ̑bR,}Q{:ߕ‚5p{ֈ4s=3l>/dFRwم@c:ݚQxtPݦގQ)参߻}wlnoEɅ3f)Ғl%h샱u噃ti؅N=ؓȆ͋fm{ s,M?~~qހ} ,}L}VZ}%i*}$}--W}|}!~h9}]pԃw^wuwN}wKlvdvvGvgv=¹vDwnvd&vȬwr!2x,{xiykz^!{|Q{זł|J}Z\}ٲ3}?w|sIU{޲hzy<-x(w{ wtzvL2n2uhdubtE\vs LyXҹ3JDqId,|+us‹neKâgNaҴO۵ {سֳؾi`ϴGɴ4Aܺ+zor~ݺ}w: qUjOоcgپcԭ°SÜÉL;Uǡf.l \.泘zasdm)fǒAޮʂTWTo̫}ȧ&̹/a& ˗ݕf͍Wʊ V~%ɡw#(Xp.Shiyѝ_YңA}}0ӳ;Ÿá]6nӠ٢!ԓQNwڂ18Vzs,l\ % %dG4lܮ!G4"dK݋`如5Z_MMGܖ~ܞ4w}ܾ pn`-YUJo䡒[c叓嶓Vԓ+݊D''ߘ{篚s=m]'ctg~i鉌_VꄌJPT f샌:MczF؏^mrZ-v{P2짇!ƆɆO$Ѯ)(+ƲT!nl{#JQz򞀭􎀽y'ݙR$3p$!~~}tgР7GcurvcurvcurvmAB  PHyS6{j,paraffc G 33paraffc G 33paraffc G 33mBA  Psparaparaparaparaparapara?ĪtZ k"z%e۔$8LN&&(sqtz(茪f(]d(by J! '! $"n"3 aʡFy Z!Q#k%$)Ɖ)du)r'ϋd6(ӊb(1\!e("&""L"߇# zų1쥻 ed!%#Nxt'LjEx )ck)c0)U^#}I #xf'#~$D$!}$d%!u8"ŵ`:aʔFL}#~uy'Y|m)+yrc )bs{Qo(vyM1%5m*f&t\&%w@"&A|' &o 3tN/[f:{88sud"sn 'ncx)KhR)%mN&f6%\f%'Nj"(rF!u(v0M){WɋE 8z] u|tMoEgq dc'aY~(^K(X8(NX((e] #'b)OhhErXNiA[}ˡU}¢ n"iv`z{Yj/T[3%QO(M>+I,*N',USa9ZbIgZY>r4d)|p,lV8jjd ]: W.Qyt?4H.` CS${@yDn)=,5,>+Q4HE3#T>MKXx VactnCqayH~ ][FΓYiM:H @os>9+]0Jl#.:(((7d51)B>#N*IIUXT(bs]nixzuS7+g0!3Ip>=udM60sA ,+^L('L1#%=8W$.qD,Y)Oj5$Z?6!ndK4-mVc+ycbfOr~!x+~0 +C/)5u'#%w.-#a6O\>4F?E1RQ&^([*%d4!o@$vJjWweזp`]+/+p/$<"04~LB rlLT5] RN!W<^E-eU#$o%!w/u1CHTKa+/+/' ƢBP؋[x 7{`[if"ZkhHn9s({ ~"! J*S?gDLRU*`+/+/MQ]Ʈ_uRnBRrgԆu qxy*g|4V^b>Fn7%ݑt "!ԡ"q@OJt,w.x,.iwTYgLqՙ pvcؕb|TeuDЛ5@%*z!8[$!÷'j#-6@ #0, oXykT[/J;-%м'!%"#%5$'*%._֟TͯZ鲯z#@PصM dS=S]+A/"Čh&/#&c%c&b&&SO ("A,>%F7$${&כ͋&(.YuO(ݍEg^(e (gb KA (!$7xWsŞ= Ҝ#Л!%tl$ۊ'-)0#sN'Ōed(ċFc&'[ G!%" "j"i#pߟT i U!×x$K.#y'x(o(ecl(_"vH"{'#~$@#? $dyJ%30+6`ʭ9@ۘîzh?%~xw'U}on)%{d)wV(wL$op-3&u'%z"$&f}H&~('?' y"+t_o'pUd|(lV)mN&g6z$g%v'l")s (y;)|X5= =_  lV|nyr΅UmkuS .gCgm&cZ'a:M(\6;'Y((5^"T(d92DlJGu5ZM:mϓ6 Φ w:xp eaQ]BnUeW^%TNP'uP@)L/B*yP-%2 UY?M^yKi[ u0gSso6nXLkѲ ^kWz=vJe!^GJPoT^7Lq?\|')#h#G$&%aƮ'%!@=!ӑ৥̪zzm}/+p@WTBS'6 '#'ǘ&' ''7䮝ܢm! %!Ɨ$ &&v!(Xw*g`(e"ύ/_#.c\U ("yN?JJYjc ڠ#䘴%Pm$'(t*(Jf(c'Zy 2F!I&0" " tx7k.١}gOӫQ !Y$ؖ'x'z(Nq((Ie (߉R`!H",~(#Rt$#`$f[%HnmgPb(i즖"#6u"G{'ls)~7g)zYg(*ymLq$/r-$u%%h} !f&&Ä'.r!cG3 ,}g]!wt' u i(q])nO&Xjk8%1i%(oV"{(s)b{n.-聚Z<PÐ M" levPpOzXjj&e] 'cbO'^=(0\*'_R,'f|a6oMz+]ˀn4 zѣ7 [mt{jmarIU[b%*XNS(%SD)P2<+O5W| AaM k^xSiiVyTisBs$5o] jeΛsM\ KT)ng&OPv_,MP2aJ A5H029oIiDStPV]]ij@uKdv+eի0eΗ`T8N0 $Im0Ey^7B N>??C;AO0"GCx RhN]YheDOuqr|?Ќv+0%aQ]`L#BA#A,2(>n7<:^3D8OK7@&Pn8i0T:"k^F&ghQs ]Ii3v]`~1.q+u0 @5P413ȂA2pL16aRY/SWV.bC8\R-2w`/#i9VsE~RzbKQm Nt+0%+/!%m"3<&De(P)x/YV(8g_-&X'c#Gg^!b5j C#sM){|5xES_, Vlu+/-+/'9)4|I`ZՑb ~ikml]-p?Lu-lpQc8BFS&)?FPV-S"`?`Mlmy${n1h yjcf@-]K!W./wSDwV9=Ng%A?K5X1GHHL\K19OPhM;*TQZQ_P\:lhxBt@M+0/%xW7RnNN.IKV=LG{wG>DsgZO BXTAIYqB"9]JD,"aIkTwa/oyPg+0++0.%?2*? >>1M<`y W,:j/\9o\a(7OLIe75;h8,l<.cu7HW'meYp3]7w\+02+02/N/Nɮ?:/rS 2.^2~d1oh/`l-OpQ+t>+sj*D-v,k~8:G.U+b:իoL+08,/ЖEzuوX"e' n)DMr'wv%\gy#4T{B}/ނ b#@&qK64HT2T>],/Ж,.ФlWsX? ! ЂL^o \Kύ<=JB,' ="#,0"MF6SI,/М{!:&*d?[iE|(6o~ni!XG6$4 a%_#Oz(r${Ɵ*%)#~;y"ו!ԣuϥų4 XޒfyB c/NQ#@-&g!q&\%&ǿ'&A)\&Д5$ٸ#z"QeϽČٵŤaP'q4^0N(2l["(%(gɗ*)?)(= ӧy}禚)!S;n$á`#΢qI&8&M(z)Xu*9jV$b@$w^s'W!Az #Ϩwe!S;u"f$o#ʞc&y+(N~w(oZ(od"\ +Dlu%1bQ u,PӦI&|h m$h_M$!b'ꂤ)]sl(g(-` 셬I 4)!ֈM#g# l R"Z%PHE蹮HyUՠ"˔# %it(كm#*`<'}ZN y8/#w|g%%xJp&U'ˇ<E<8Ҹ qyˆɋ!}ya&y}nA(vb}(psMRO%|p8=$nz*))Is -z 1TQ`~DOԔh؋m>⃋zԅ'Dvw,Fqj/m[/jJ/%g6(0g.";8lPFcu5Ú)k5Loam҈ 3t S [w\%=q-lt3qg^d7cvVF8`D;`w1?]a gHmgWt*dqm~ {|_%*ɺ s9#dl-if6a4r={]1bBvZiRG+YBKG[2 O.^"jVce7p`q|^}%Amۍps*os^iE*a'I8[kGBW pJTaTQRR-USBYV3^[&%a_omlG|myTGmH}qa[k],`+%Y9TGPveQ~Mq XKb^*KGRbKmC#fN4jIRO'@mXn z%d(O;r䓊|ky)+0(6*1 JT4K"lKH,aXF`DsyeSCYeiAkTn@@Dr%CT5uEF( xLZ:דfhgt#){+0<+0#I9R7L8#_;iR;m:wq8iNu6X y74F|345L6'u:H-+KJ[9 Xe*r+0rͫ,/#ЮSB%Zf)t0|y2|1+.?n̂+\)MJӇ&9.%'ˋ(?q;2MFvxU4c,/Т,/мvW"߁_$(A%^#w bUPd >z/M!ҫ&"6~tD ÏUj ,/ Щ0$Oݍ]#6i bŢ٤V%#=YmN[|Jj9㯖%,M "*'$ƻ)%WC!%-%0ڱ$O!B\ΟuLھ`'6_!kF<&X1CeZ)21#'0&'tȷ('d0-)%˞%/ر#zdu əɾ!I7$rf`"Pnɒ4M)$)P')f)'(t*H(sƪ 2_t Oīg!.ǨW$ #&ģAN&ԏ(0q)#},(o% cn$_!s#G & #q!%n,oӧ "n$)#Q&yK(z(ϕq$ey#Û^y0=ڒ$#ic ըg͸&yT 0$ $ 'SO)Wu(mi#^e 鈸J /B!: L!z$Ֆ"f`"a?&u'ͅx)m(*b'Y~P< }^:"V&u$Ӆ*B&ɇ3&` Fw|ձRҘPQgP%#+;v.~_i.{ Y-x>F*_v1,Zt"R2|~D~@V_k<#z`tӭ(mc ^#h,F~72yq5u+c]6*qR6'o>09*p,E@oh.JzBZsmڑuqHn7  3ڸ!:5,y{4t|9ko0l>;kj^@hM-Ch:%IXk$*uN4m[wgKwFLG{o ڣ D~ (%u砽4o=i{Eek'K c&[vPbK"TGd6;Xtgy,]jgqti@t0s䁾Q}%rEFvި xܢ!r#d4 jCBcL)_lzS]jZ+["[N^\Kb|_TkdgTB[kTKomW=fs>[/v>`@"t~?iNuC~+03B+62-V.-B^T0VQ"bOHjN }nLns>B 0E !ДR_ 2Xl_t|,/1Ч,/7c/9u3i8cQ:}:R-r8v5wdo3S\1CB1000138!.<>|zPxiY3fq,/#Юo(L~'&S+~-- ]+~~F*jE(X3!%5F=!3ȤtI O )-Z:L%VZ,/еM&߾&ڤ%ѯ+˭X.@kq¬$_kS^Mp~S:%`#$(%*&4,I"&ř9'`L&bلR#[՘ŽH#GК1Hmr!Z{G,u')((T*( 9+'ޝ<'1ݣ&%؜!VB Rʔ#*˵Qct&bʦ.R 6`X&*9(a)$))<*(R? Fk !u" ŧ#qC'ʔh'1a(x9')Ф~~)ht%d$p_w&,G$$$&)$$j^C|K P9 | !ʪvz$U#d•4&ᢆ'u%)vz(imr$x`z>]+!7"P%aQ6٫ ~5z#u<$o.$v")zV+n(` v6L=0R 씋#%'hO I6ިjg&!ݜ%O))Ґ4-Yw-hb,ևW&B#!1($/%4BgUmr=ض^Aאܠx\=)B H1ʆ6kly9:|j;yZ = wFAx&3Fy"Nc~{A^(o2fw۝PW$1{Ó%2NN9|@wuEt]f I^rULqaCRs3Wv$L^{9lzj{|]O';CY*v07~LM`̑_ 2+0=M.T6:@_O]@aZ);lXVtVW )xVYx;}[TfSUV?F.Y7z]h*d7p_y5O+0&u,.{W KgMӵvN2}O49NTWM*zJha8IIWwJGbL8 P+Uc?oEwO,.i_-0.tҊqc:=BM|DÏ&DȓYB~?Wl=[5<8J;:9=)iBSU^༚m5,/-кv,`꾈,ܟ0P4#f748 5sP3xqƦ1_/N*;pa'7'w--$7@2ŜR6ƶa`8)])C+K))o2$q&À&%TM$%z4[#fS@u>|(n&q&ȵ*S&J?{#ɾR"荈(Ez+((0'ۮ,!mЃʖ8rʞ4P=-pSX] ɈKt/6':*))++c(,S(e1(r(8'>ڸö#pH]!nѻ v w&! dk!JSΦZ8q̈'1+i")?*d*)˴+z)W۹& ,b!"HE"cK#,!';^'v(y)~)Gu-%.eEU (#\(2&ƿ'(&.' &- Ϭ:! "{+#%/#O'"K|ů(sb ߫Sp"fL##)фi-Uqv+\f–xO(6g,+"*w&h)ұf+?\R?w@.%J o(-v13~2pp1`@+rH %;-%׌'LQAΝw@bЪ2E | WQhi (ؤS.ߕ\3’7+$x8i7V6@9*<jJ5z]%];kS"ɣjhj-!8/r6<8@υIs}BbODRKNVHB:N^+>UUcpn4j|eŗt86W1+T8vB lHـ~N}nRB{U^GUzoKZb|v:_,fς<"o=B|ӗōin9`B' t=7ܶ^DOXz?Vw}\umat\fuLjj/x{jw0W~{{!L-S`#\ (&k*)kpcj3rt?ItxY!nej"oMhu]gz0z(fn4~+fp]ˁh?N3k?_)p 1t$ m}I? !+0GY3!ZdqGheq9]elc7vaR~`tr_A^*oO]d^^NbH?;f2tPk<%(t)}+00р-.ҒcbSuW"X&XX1X VHmTCqS`9SPjV@Z3w_f&4Cgԯrq|,.sj-J.Ң}@s"I [sLȽ,NHO# L%IXtXGcOFRFA~JY1^M""TKcÄp,/7~./ي4Oꃫ;r$>xBCO>K;yov8gix6Vx_3C1<.ܽ3G ǺW!cf7 :+爏+͡b,.t/>0?Υ_04J.,D,)6P)n.:&Zů EIZ0Z*(,('ʯE$oWK#Ē)ᝢA*í*ަ4*&I̩&Y!U~*ї!St#!az΂ :N;2(+CB+*,@)V˱- ()ދ)l)Bݚƨ&|ٶ#!։#^#tM!Siӹ"$#,yr#cf,#kUY, :Ͷ(P,@ *+ ̝+E*JS,)XK!OX!L"޳x"ڮ-#.'p'ڪW*TP*ѧ8)u&KCg驩G !ǁ+~$)u'C(;(v'j8",$c!3#"Fkj$:\'+1*@ *֨):r%ꦚdCû(?% &(tƮ&*3%ۜZؽaܯ!s#!%D)癰*+4(o Wd7*"V& g) Iw+]^=SK^Sv!{+ի -1F4u4Ay64^g07O)2x+9u-X:EަRf fT5Տƙ)֩ձ 4h8v͏;=~r?=p^<ҐGG?ΐ0DCё:N'e_p* ?ޅۑ&fĄ5J0VxMZg^*UcFCiD4QnnQ&CtYmv"Q #st&^1K٦@ȏTM؈߬lWԄ,f_*`e~wj~eo ~UseENvڄ6,{w'֋c$}Z (|.BŊلQ׃W^P}f+gz?oxň v~w~wyw4f}xUs{Fp86j)ŊOE )p-x.spZpa !+0Jц: `S$k2lm+wktkʼnjph摘gGyfggWWjwGѝm8ٟr,"y? Ɓ跚 +09ь-1.ҩnZbaʔGbo b4{`ǟ7]{r\h]JX_Hb88e+kGu? - .|w-c.Ҹ Jw'1R uWYE,8Ys8SVTS}wrQ\k˱PZôPIx,S77˸U_(Ĺ]-Xj` v0,/@ҁv5휙 6.pBu|J᮸LmȧpM`YHiEɽB5oV?^$‹-C.҆PŸ_(,,5fM[x} g4pqyIP/o8u^ O@C͋1M#GQl#! -DrN2tI}aI6FnFzO|"{,l3z@ yxoy^8{OZ>@у2ޟ=$# *"Y3 _CFg\owvX uދt;sק~s>WqRҟpLp⢭p_rOu@ݩIzP3(k&W%{ m,.|`-Wv`琉qk}l lGljSgf]r^XfgawhQjg@Ln2s$oz MÏm-.҃xJ]N-dZ oR/8zi5-0.tҋT6}?-ZK~TWZWySi]OhLx4IfL˾FR>ΌDX:/ 4B7fGӈGƳ9Cଐմ@ *-+,U,+X͏-D*O^F" ٶh#s$5'?d(R*j+,ω.4-iv(U\#6N,&4˱*(*K))(%WCwA ΂D[b5#s%5'R*nT +?}..u%+˹m &IwU$+'ʟ))_'+'7&u&c۹@=8 krҔ4"c{^'ʘ)u'a!M¹bm>&$(*}ȳ&w@m Md ߺlTWߚ\ܾ/p ַ&/(5FyF8o '8mx4Q](1bE:S2ܸHV4ōtvǚBd 'ca\.*i6Ƚ@|G>xL"M>pMcTVN:YT^'_zkֲc$ Rz#د c$%-.ᅭ@<7J)ݮR>Y^]f(~Q`cjMd!Ti*@3pw0va}k&W&眩(T*٨38zB{ֻO~7Z9rb{hm'z`qߘfuԙnTzݛbC64J$} ( K,'1%C.T'ӏ`1UGiqf xv}ґxl̒fDž?UɈqF;6EC 'Bq1^+00*@ rVʕGeҔpeQz ̋? @=x2'g<4VG8$j)C 9٪!0=t _8z#TǀiGx|Å+ޅA@K՘^oÜ ygg/cW{~HN\8Dz*L!'.a 6|cSSmSis{oع~F^}ҳ%}ɦ{*,zz!Jyhd{HX}HL؀84D)JǾk- .҇k^~Oe)q둢vLߝv+Avku.21ϼ.g,Ε.+G5X'-Zͳ. .A`ײ/S1\1~XU0&]ٱ.`-vZh,S~+j*Y(x@6+.Ͼ,,-c+,-+|O+5 #$ 'Ym(xq,ͅ.ˑU.G.˦vC* !]%.&͋+()*L(Sm˛ݩ I%?"AΓ'ݫ[,hλ.} .EX,m<)~Q&%,()*}9(4+˹'Fè1 9hHݏD"'Ua-Sіe.̶.QI+LJe'&`B[!H+'jB Ń!;v!i Bf&;ܛє3(8:<=Η>,;'a7$>::J!M!_T^x6" ey"_$$_^~(a.֭=F?Pbƣ@T VzSWP`Y̻Be]+hj{&?&|&۱(j<+55^8FL,5R2\|\XHcWg,(jҭtnS^sHy*5~N$#Ժ  f]a)qtY+X/Ī8FI\M?XcXøl orx]6|5p>^FKN9d9)F.띂+ߔP.ᙳ4kK^ShȮs ̸{ɞåA[Iڜ7pBZ^vrNDm=q|-ٙ {.e.3~eI~]oZyڈzꙒ/:;Ô'\g=p]_?>yOd?0 !yׯ0 2u%H~[ep䮂ߌ^T2t̍ۖY'ƒ@Cq ]`+,O֭ĒL?7f0"!CFAj)Z:r \pwr5Ø2[㵡vb騬!H7Մqq׷ a+WOڹt>ъ`/c㌋Y/-.ҒraZk찗tt:K֑+Cb+|[Tz\8QyTsPHyaCzO+|<}~+v<-1.қVᘗ_4BfiyNpģx߿ƤwdȪu3qםoR̯m`uQilra΢lMn9q&jy"̃ <^H?E-OMo[G`b5nm CiDeرbK؉_wS]}bEL]K܌]o6 b*Y m&v$2b56vM;z4JRSZWz[۷Y^ TbhQ.KψFGt4RA6[F:A4إA1O+Ѫ](ϸj& e0梧4V58eP7B{D6ܮ:ͰV6tw4Q2k0WRٓ/)@;r/10/-]ѰK*WbZ(x/X/6!2,v2Dׇ3و3أ2}Q1 L)/-.J-ls-Z;*B9_,/Т--ϊ.,d.z+#ҘTW $-GI #ŗ@+. -/˷.T.$ζC8ӣsۃd|cSjV(WbD څ1u̲ vV].b뵭=k鰼w=>(7VӬ}z^+xO~ vjgvpUՎw&@nyL,Л~%Ƈ=",Ddş JT&SaFh#֨pFrGpl]i*f}ڶdfޱ`BOKc9}i,Ѻr( |E%[4b9ҼE"N_oZ^׫]^ݺ[ޙVcKSRޤOwJ_jEhFp4H4+iY<-Fәc)om&2Q469+>~D;}HުJޢD!5t!!3!230%&ǚ,1:.~/1Lt.^+.9l.ϲR+KД/+?,K+)C,ν($!ȏ]#mG$a,!@" ^&*ߝD-Ol0u~0U.ŀ[.e.ӑBD.{/.I*N"Wy "#&!˻)Td' cu-c1b/;\MDE-JI܈FH}jESEK&{.Yi<#um"d}/ѿ&K&(,ŏ+8I3pY@p TMZܹZwdĹhڥkWΎnԴuJq9/ZhtA7y!%B>Z*Cy+յa-̼OZ2KU]ؠg?0o\y+v?˨{liˊ҃Sts膵[|LACˉ+Ȓ̾7-_k024ˮ Lw]Vn5wxōKžUʿь*r W]yI"4̟Â!6Lj/R3#{|E5[A.l~,s%y.bϝ8 "mqn}^Lĸ:)3G3JDߑ\VkP~{")q܄j뢋IHXH0ueөNq_EKOڰP>ݳ2-#~G6nnM5Z>o4Cp֛2v2h֋E.&[t+Ӏc)3⍴+4Ѫ6 ֹ6ݯ7!ۚ 9:گ56;4O3._2٤1'm0PZ/Eԩ/1If/Y./-vmX*"9~/H C$f&ݩ(Gڍ -X.u/lȓ4.`."t,^^+ Б0+;V.+i"++)# $ӻ 0!C $Iy'ߨj( g-pb/ i/cS .c.Zpl/67SS_ڮUrBSHӛ(41H^e{Ү:h$Uy”Br0aȓ9 S*Q^=s!b᤭{֊ѵ\յҴϢӴp,s{i4WVGM6S濁$7R_;Cq 1嫄vܗ1Y\pڮ %Ȟ`2,Yۏ7{Ři|PWl(EB3?S"U_%tqYzg‡c~ʖju'1k̶T0Γ>f|Ͼ^iW̡D/`uJi(qv꿥陸V' 3 dٓù#٥3ILo|QafuQTӵQ;Ɣ. R&;`}c\j(tJѴ3j׼ۑµ KiI"sԁ^֮HL4,&'LAYZKbVhvzriw>ضzصU{18wNtMۤro^ko+VSn?Yu01>|,rV( E9KP4w\a;d2i}Led0ޞ`!ޕ^L~[{yXe&XvP_Z9ڝc0Cn+`wm)U45*7H ALq٨Q%WH]8YFR~PKF75L6$ 7t؞:۷Gw!G\o۔6<5t44/iڟ2n1[ڔ0FN092"E0;/Ѯ0D-ԛ\%+6" v7q "X&߰(5I$)m^-ӷ.ΒR/’.c. q-Λ_,1,B.,dШ,,v*$_$Z"u8#?&Mܮ)N).co/tИ/O..͞lP0!St-12. ю.~.)F, L$b%&gC'j2&% T'\G*K.{ͽ0W1t/#w.~1Wef1B<0#1D+T}){$}%î(A˫)Z+}#,JD293إGevQ|W޹yW5U>ހp>S2NW2gw,Hܐ'Fl$(%v*iw,ə/Ϙ;ډOR\o3hЄr uQExux}|1b:F&=2Eځ%E#0-T/df1xRʺRXsd~u@iwŒ: nEۇqoY4Wz'f>'ڧ֊02SN"\~.dwVёו2~Ӡk)'aq[<[JDDZWձ/ >%4.@WkZk5f_DuR뾛ؗIĮĥLl7!\*NCrùZ^̒JQ8*&AZ bwªgi yѶ4\ Gtԙq Y`fscYR`IOǵ=?+ZDd눗iwt~D奚␪܏հUNĴ=Ƀ3öpT@zȶsft`QNRκ;*lxu}ʉ( 湘^Zt梺7Ȫ ۫Zס(֚Ȇ C*r.a]2HJ4GV+}'lu+ufzsuK馼3̛zџCڧԷ޵Rݟ٩bc~*'i'ԛSSӀ>Ӫ1Ph+zbjj#nD-z%l?ӏ؏$V́; inj^y.u{_J͆5Ӟ/;ݑ,+RȦtaOcjmNӀx^ݔ=J)8A5]ځY1'la-@n*&5{X :OSi84י;tHw ,K=Ko.B!6Lܪ5ہ3o^ڸ3b\.2UGm1b2#1 0;KOu.Ղ]-+$S!`"eMt%m'7$)so*d \.m/΢/( .ej.&q-t_K-с1j-I/h-5--R+%DS-&$W%2A(+,+߆/"Ͷ/٤T/>(.E;-͢k0+S.H1./>.Ѻ-Q$&˨'`(X())`(,+e/1R&2ӖR1s.~"1ibd2ՒA1&2}I(ل,WYڣ(;%'ō)f+o+Ps.4Sr=S;5N[@ӽ]>9&_x߂Zp r\WS[8 r?.iދ*s&*j^+qp-yˊ4uЮKݓX5[c oٲqwoy߁޹Ȃg!e&M8*ͣ"%.07-c3".Y\\ӄ+lTQszXۂ:CnngIϚݟ\orG۳Z@!Aũ/w%!1"V5SX^qY'k#ߴ}x xBKͶ3%DTԓ c}Ǵhbص'նJg50+3NW\km y]W;Ԍ&Ӯݹ_Φ4Tk\{`}?՜h$S@y?Ď/L={u]\k}`7}P1dT-Sػ˻Mɮɮ=lʜaˢPY}|δjWxX ϱ5EФz3[$j_.؜m;4%G.d^rի1 DׂB}6N h ԁS׿?j0mzuAs";椝浱1乼yndomvsDڵ赓.!݉etx_J߫6 ]0qYiw넘~LQ/m%ՠ6d9Ч 1@?QZkQ˚kPVZh]BWӑ3PZ/.ace{m?\q^5~˕Aߟׂ,ܰB;J\xG׉&buՌL>(8JG0ӷ-͞_*sc!0ejrgӮ{~y`҄A݊}zڣx`p*FxZ׾zGֱ}6480Ӟ,IfLM\BasMcjg߉mۮqc׽ܲpŶiWg!iVf2GڲfkiCcT6ݾgZ>|n3Xvw/ v+ʲ9KutPrUޓ]ݡ/^xٽar^W,0SPyJdTeIP5RJ7ܙ` 2bgQ.cr+6>XRr;I-ݣL.۷QZګVEߎJ<{D6M53oz4]5KZ2320[r.)a,dparaparaparamBA  @paraparaparas`para  {para*,{paraGI {fU"YNX|3-$ ˙oݦparaj !49gRȪ=parajuELV>8parajELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Kmlcms2-2.19.1/testbed/testcms2.h0000755000175000017500000000626115176573557015242 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2022 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #ifndef TESTCMS2_H #define TESTCMS2_H #include "lcms2_internal.h" // On Visual Studio, use debug CRT #ifdef _MSC_VER # include "crtdbg.h" #endif #ifdef CMS_IS_WINDOWS_ # include # include # define CHDIR(a) (void)_chdir(a) #else # include # define CHDIR(a) (void)chdir(a) #endif #define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) // Used to mark special pointers void DebugMemDontCheckThis(void *Ptr); cmsBool IsGoodVal(const char *title, cmsFloat64Number in, cmsFloat64Number out, cmsFloat64Number max); cmsBool IsGoodFixed15_16(const char *title, cmsFloat64Number in, cmsFloat64Number out); cmsBool IsGoodFixed8_8(const char *title, cmsFloat64Number in, cmsFloat64Number out); cmsBool IsGoodWord(const char *title, cmsUInt16Number in, cmsUInt16Number out); cmsBool IsGoodWordPrec(const char *title, cmsUInt16Number in, cmsUInt16Number out, cmsUInt16Number maxErr); void* PluginMemHandler(void); cmsContext WatchDogContext(void* usr); void ResetFatalError(void); void Die(const char* Reason, ...); void Dot(void); void Fail(const char* frm, ...); void SubTest(const char* frm, ...); void TestMemoryLeaks(cmsBool ok); void Say(const char* str); // Plug-in tests cmsInt32Number CheckSimpleContext(void); cmsInt32Number CheckAllocContext(void); cmsInt32Number CheckAlarmColorsContext(void); cmsInt32Number CheckAdaptationStateContext(void); cmsInt32Number CheckInterp1DPlugin(void); cmsInt32Number CheckInterp3DPlugin(void); cmsInt32Number CheckParametricCurvePlugin(void); cmsInt32Number CheckFormattersPlugin(void); cmsInt32Number CheckTagTypePlugin(void); cmsInt32Number CheckMPEPlugin(void); cmsInt32Number CheckOptimizationPlugin(void); cmsInt32Number CheckIntentPlugin(void); cmsInt32Number CheckTransformPlugin(void); cmsInt32Number CheckMutexPlugin(void); cmsInt32Number CheckMethodPackDoublesFromFloat(void); // Zoo void CheckProfileZOO(void); #endif lcms2-2.19.1/testbed/testthread.cpp0000644000175000017500000000466615176573557016204 0ustar martimarti #include #include "lcms2_plugin.h" static cmsContext ctx; static cmsHPROFILE prof_cmyk, prof_rgb; static volatile int rc = 0; static void* MyMtxCreate(cmsContext id) { return (void*) CreateMutex( NULL, FALSE, NULL); } static void MyMtxDestroy(cmsContext id, void* mtx) { CloseHandle((HANDLE) mtx); } static cmsBool MyMtxLock(cmsContext id, void* mtx) { WaitForSingleObject((HANDLE) mtx, INFINITE); return TRUE; } static void MyMtxUnlock(cmsContext id, void* mtx) { ReleaseMutex((HANDLE) mtx); } static cmsPluginMutex MutexPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginMutexSig, NULL}, MyMtxCreate, MyMtxDestroy, MyMtxLock, MyMtxUnlock }; static DWORD WINAPI one_thread(LPVOID lpParameter) { int i, j; cmsUInt8Number rgb[3*1000]; cmsUInt8Number cmyk[4*1000]; Sleep(rand() % 500 ); cmsHTRANSFORM xform = cmsCreateTransformTHR(ctx, prof_rgb, TYPE_RGB_8, prof_cmyk, TYPE_CMYK_8, 0, 0); for (i=0; i < 100000; i++) { for (j=0; j < 1000; j++) { rgb[j * 3 ] = 189; rgb[j * 3 + 1] = 100; rgb[j * 3 + 2] = 75; } cmsDoTransform(xform, rgb, cmyk, 1000); for (j=0; j < 1000; j++) { if (cmyk[j * 4 ] != 37 || cmyk[j * 4 + 1 ] != 188 || cmyk[j * 4 + 2 ] != 195 || cmyk[j * 4 + 3 ] != 7) { OutputDebugString(L"ERROR\n"); rc = 1; } } } cmsDeleteTransform(xform); return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { int i; cmsContext ctx; OutputDebugString(L"Test in progress...\n"); ctx = cmsCreateContext(NULL, 0); prof_cmyk = cmsOpenProfileFromFileTHR(ctx, "USWebCoatedSWOP.icc", "r"); prof_rgb = cmsOpenProfileFromFileTHR(ctx, "AdobeRGB1998.icc","r"); #define NWORKERS 10 HANDLE workers[NWORKERS]; for (int i=0; i=0.53.0 foreach icc : iccs # fs.copyfile(icc) # DOES NOT WORK ON FEDORA 40 configure_file(input : icc, output : icc, copy : true) endforeach testcms = executable( 'testcms', testcms_srcs, dependencies: [liblcms2_dep, m_dep], c_args: cargs, ) test( 'testcms', testcms, workdir: meson.current_build_dir(), timeout: 600, ) lcms2-2.19.1/testbed/testplugin.c0000755000175000017500000012655515176573557015700 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "testcms2.h" // -------------------------------------------------------------------------------------------------- // Auxiliary, duplicate a context and mark the block as non-debug because in this case the allocator // and deallocator have different context owners // -------------------------------------------------------------------------------------------------- static cmsContext DupContext(cmsContext src, void* Data) { cmsContext cpy = cmsDupContext(src, Data); DebugMemDontCheckThis(cpy); return cpy; } // -------------------------------------------------------------------------------------------------- // Simple context functions // -------------------------------------------------------------------------------------------------- // Allocation order cmsInt32Number CheckAllocContext(void) { cmsContext c1, c2, c3, c4; c1 = cmsCreateContext(NULL, NULL); // This creates a context by using the normal malloc DebugMemDontCheckThis(c1); cmsDeleteContext(c1); c2 = cmsCreateContext(PluginMemHandler(), NULL); // This creates a context by using the debug malloc DebugMemDontCheckThis(c2); cmsDeleteContext(c2); c1 = cmsCreateContext(NULL, NULL); DebugMemDontCheckThis(c1); c2 = cmsCreateContext(PluginMemHandler(), NULL); DebugMemDontCheckThis(c2); cmsPluginTHR(c1, PluginMemHandler()); // Now the context have custom allocators c3 = DupContext(c1, NULL); c4 = DupContext(c2, NULL); cmsDeleteContext(c1); // Should be deleted by using normal malloc cmsDeleteContext(c2); // Should be deleted by using debug malloc cmsDeleteContext(c3); // Should be deleted by using normal malloc cmsDeleteContext(c4); // Should be deleted by using debug malloc return 1; } // Test the very basic context capabilities cmsInt32Number CheckSimpleContext(void) { int a = 1; int b = 32; cmsInt32Number rc = 0; cmsContext c1, c2, c3; // This function creates a context with a special // memory manager that check allocation c1 = WatchDogContext(&a); cmsDeleteContext(c1); c1 = WatchDogContext(&a); // Let's check duplication c2 = DupContext(c1, NULL); c3 = DupContext(c2, NULL); // User data should have been propagated rc = (*(int*) cmsGetContextUserData(c3)) == 1 ; // Free resources cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); if (!rc) { Fail("Creation of user data failed"); return 0; } // Back to create 3 levels of inherance c1 = cmsCreateContext(NULL, &a); DebugMemDontCheckThis(c1); c2 = DupContext(c1, NULL); c3 = DupContext(c2, &b); rc = (*(int*) cmsGetContextUserData(c3)) == 32 ; cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); if (!rc) { Fail("Modification of user data failed"); return 0; } // All seems ok return rc; } // -------------------------------------------------------------------------------------------------- //Alarm color functions // -------------------------------------------------------------------------------------------------- // This function tests the alarm codes across contexts cmsInt32Number CheckAlarmColorsContext(void) { cmsInt32Number rc = 0; const cmsUInt16Number codes[] = {0x0000, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999, 0xaaaa, 0xbbbb, 0xcccc, 0xdddd, 0xeeee, 0xffff}; cmsUInt16Number out[16]; cmsContext c1, c2, c3; int i; c1 = WatchDogContext(NULL); cmsSetAlarmCodesTHR(c1, codes); c2 = DupContext(c1, NULL); c3 = DupContext(c2, NULL); cmsGetAlarmCodesTHR(c3, out); rc = 1; for (i=0; i < 16; i++) { if (out[i] != codes[i]) { Fail("Bad alarm code %x != %x", out[i], codes[i]); rc = 0; break; } } cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); return rc; } // -------------------------------------------------------------------------------------------------- //Adaptation state functions // -------------------------------------------------------------------------------------------------- // Similar to the previous, but for adaptation state cmsInt32Number CheckAdaptationStateContext(void) { cmsInt32Number rc = 0; cmsContext c1, c2, c3; cmsFloat64Number old1, old2; old1 = cmsSetAdaptationStateTHR(NULL, -1); c1 = WatchDogContext(NULL); cmsSetAdaptationStateTHR(c1, 0.7); c2 = DupContext(c1, NULL); c3 = DupContext(c2, NULL); rc = IsGoodVal("Adaptation state", cmsSetAdaptationStateTHR(c3, -1), 0.7, 0.001); cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); old2 = cmsSetAdaptationStateTHR(NULL, -1); if (old1 != old2) { Fail("Adaptation state has changed"); return 0; } return rc; } // -------------------------------------------------------------------------------------------------- // Interpolation plugin check: A fake 1D and 3D interpolation will be used to test the functionality. // -------------------------------------------------------------------------------------------------- // This fake interpolation takes always the closest lower node in the interpolation table for 1D static void Fake1Dfloat(const cmsFloat32Number Value[], cmsFloat32Number Output[], const cmsInterpParams* p) { cmsFloat32Number val2; int cell; const cmsFloat32Number* LutTable = (const cmsFloat32Number*) p ->Table; // Clip upper values if (Value[0] >= 1.0) { Output[0] = LutTable[p -> Domain[0]]; return; } val2 = p -> Domain[0] * Value[0]; cell = (int) floor(val2); Output[0] = LutTable[cell] ; } // This fake interpolation just uses scrambled negated indexes for output static void Fake3D16(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const struct _cms_interp_struc* p) { Output[0] = 0xFFFF - Input[2]; Output[1] = 0xFFFF - Input[1]; Output[2] = 0xFFFF - Input[0]; } // The factory chooses interpolation routines on depending on certain conditions. cmsInterpFunction my_Interpolators_Factory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags) { cmsInterpFunction Interpolation; cmsBool IsFloat = (dwFlags & CMS_LERP_FLAGS_FLOAT); // Initialize the return to zero as a non-supported mark memset(&Interpolation, 0, sizeof(Interpolation)); // For 1D to 1D and floating point if (nInputChannels == 1 && nOutputChannels == 1 && IsFloat) { Interpolation.LerpFloat = Fake1Dfloat; } else if (nInputChannels == 3 && nOutputChannels == 3 && !IsFloat) { // For 3D to 3D and 16 bits Interpolation.Lerp16 = Fake3D16; } // Here is the interpolation return Interpolation; } // Interpolation plug-in static cmsPluginInterpolation InterpPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginInterpolationSig, NULL }, my_Interpolators_Factory }; // This is the check code for 1D interpolation plug-in cmsInt32Number CheckInterp1DPlugin(void) { cmsToneCurve* Sampled1D = NULL; cmsContext ctx = NULL; cmsContext cpy = NULL; const cmsFloat32Number tab[] = { 0.0f, 0.10f, 0.20f, 0.30f, 0.40f, 0.50f, 0.60f, 0.70f, 0.80f, 0.90f, 1.00f }; // A straight line // 1st level context ctx = WatchDogContext(NULL); if (ctx == NULL) { Fail("Cannot create context"); goto Error; } cmsPluginTHR(ctx, &InterpPluginSample); cpy = DupContext(ctx, NULL); if (cpy == NULL) { Fail("Cannot create context (2)"); goto Error; } Sampled1D = cmsBuildTabulatedToneCurveFloat(cpy, 11, tab); if (Sampled1D == NULL) { Fail("Cannot create tone curve (1)"); goto Error; } // Do some interpolations with the plugin if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(Sampled1D, 0.10f), 0.10, 0.01)) goto Error; if (!IsGoodVal("0.13", cmsEvalToneCurveFloat(Sampled1D, 0.13f), 0.10, 0.01)) goto Error; if (!IsGoodVal("0.55", cmsEvalToneCurveFloat(Sampled1D, 0.55f), 0.50, 0.01)) goto Error; if (!IsGoodVal("0.9999", cmsEvalToneCurveFloat(Sampled1D, 0.9999f), 0.90, 0.01)) goto Error; cmsFreeToneCurve(Sampled1D); cmsDeleteContext(ctx); cmsDeleteContext(cpy); // Now in global context Sampled1D = cmsBuildTabulatedToneCurveFloat(NULL, 11, tab); if (Sampled1D == NULL) { Fail("Cannot create tone curve (2)"); goto Error; } // Now without the plug-in if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(Sampled1D, 0.10f), 0.10, 0.001)) goto Error; if (!IsGoodVal("0.13", cmsEvalToneCurveFloat(Sampled1D, 0.13f), 0.13, 0.001)) goto Error; if (!IsGoodVal("0.55", cmsEvalToneCurveFloat(Sampled1D, 0.55f), 0.55, 0.001)) goto Error; if (!IsGoodVal("0.9999", cmsEvalToneCurveFloat(Sampled1D, 0.9999f), 0.9999, 0.001)) goto Error; cmsFreeToneCurve(Sampled1D); return 1; Error: if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(ctx); if (Sampled1D != NULL) cmsFreeToneCurve(Sampled1D); return 0; } // Checks the 3D interpolation cmsInt32Number CheckInterp3DPlugin(void) { cmsPipeline* p; cmsStage* clut; cmsContext ctx; cmsUInt16Number In[3], Out[3]; cmsUInt16Number identity[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; ctx = WatchDogContext(NULL); if (ctx == NULL) { Fail("Cannot create context"); return 0; } cmsPluginTHR(ctx, &InterpPluginSample); p = cmsPipelineAlloc(ctx, 3, 3); clut = cmsStageAllocCLut16bit(ctx, 2, 3, 3, identity); cmsPipelineInsertStage(p, cmsAT_BEGIN, clut); // Do some interpolations with the plugin In[0] = 0; In[1] = 0; In[2] = 0; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", Out[0], 0xFFFF - 0)) goto Error; if (!IsGoodWord("1", Out[1], 0xFFFF - 0)) goto Error; if (!IsGoodWord("2", Out[2], 0xFFFF - 0)) goto Error; In[0] = 0x1234; In[1] = 0x5678; In[2] = 0x9ABC; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", 0xFFFF - 0x9ABC, Out[0])) goto Error; if (!IsGoodWord("1", 0xFFFF - 0x5678, Out[1])) goto Error; if (!IsGoodWord("2", 0xFFFF - 0x1234, Out[2])) goto Error; cmsPipelineFree(p); cmsDeleteContext(ctx); // Now without the plug-in p = cmsPipelineAlloc(NULL, 3, 3); clut = cmsStageAllocCLut16bit(NULL, 2, 3, 3, identity); cmsPipelineInsertStage(p, cmsAT_BEGIN, clut); In[0] = 0; In[1] = 0; In[2] = 0; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", 0, Out[0])) goto Error; if (!IsGoodWord("1", 0, Out[1])) goto Error; if (!IsGoodWord("2", 0, Out[2])) goto Error; In[0] = 0x1234; In[1] = 0x5678; In[2] = 0x9ABC; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", 0x1234, Out[0])) goto Error; if (!IsGoodWord("1", 0x5678, Out[1])) goto Error; if (!IsGoodWord("2", 0x9ABC, Out[2])) goto Error; cmsPipelineFree(p); return 1; Error: cmsPipelineFree(p); return 0; } // -------------------------------------------------------------------------------------------------- // Parametric curve plugin check: sin(x)/cos(x) function will be used to test the functionality. // -------------------------------------------------------------------------------------------------- #define TYPE_SIN 1000 #define TYPE_COS 1010 #define TYPE_TAN 1020 #define TYPE_709 709 static cmsFloat64Number my_fns(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R) { cmsFloat64Number Val; switch (Type) { case TYPE_SIN: Val = Params[0]* sin(R * M_PI); break; case -TYPE_SIN: Val = asin(R) / (M_PI * Params[0]); break; case TYPE_COS: Val = Params[0]* cos(R * M_PI); break; case -TYPE_COS: Val = acos(R) / (M_PI * Params[0]); break; default: return -1.0; } return Val; } static cmsFloat64Number my_fns2(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R) { cmsFloat64Number Val; switch (Type) { case TYPE_TAN: Val = Params[0]* tan(R * M_PI); break; case -TYPE_TAN: Val = atan(R) / (M_PI * Params[0]); break; default: return -1.0; } return Val; } static double Rec709Math(int Type, const double Params[], double R) { double Fun = 0; switch (Type) { case 709: if (R <= (Params[3]*Params[4])) Fun = R / Params[3]; else Fun = pow(((R - Params[2])/Params[1]), Params[0]); break; case -709: if (R <= Params[4]) Fun = R * Params[3]; else Fun = Params[1] * pow(R, (1/Params[0])) + Params[2]; break; } return Fun; } // Add nonstandard TRC curves -> Rec709 cmsPluginParametricCurves Rec709Plugin = { { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, 1, {TYPE_709}, {5}, Rec709Math }; static cmsPluginParametricCurves CurvePluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, 2, // nFunctions { TYPE_SIN, TYPE_COS }, // Function Types { 1, 1 }, // ParameterCount my_fns // Evaluator }; static cmsPluginParametricCurves CurvePluginSample2 = { { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, 1, // nFunctions { TYPE_TAN}, // Function Types { 1 }, // ParameterCount my_fns2 // Evaluator }; // -------------------------------------------------------------------------------------------------- // In this test, the DupContext function will be checked as well // -------------------------------------------------------------------------------------------------- cmsInt32Number CheckParametricCurvePlugin(void) { cmsContext ctx = NULL; cmsContext cpy = NULL; cmsContext cpy2 = NULL; cmsToneCurve* sinus; cmsToneCurve* cosinus; cmsToneCurve* tangent; cmsToneCurve* reverse_sinus; cmsToneCurve* reverse_cosinus; cmsFloat64Number scale = 1.0; ctx = WatchDogContext(NULL); cmsPluginTHR(ctx, &CurvePluginSample); cpy = DupContext(ctx, NULL); cmsPluginTHR(cpy, &CurvePluginSample2); cpy2 = DupContext(cpy, NULL); cmsPluginTHR(cpy2, &Rec709Plugin); sinus = cmsBuildParametricToneCurve(cpy, TYPE_SIN, &scale); cosinus = cmsBuildParametricToneCurve(cpy, TYPE_COS, &scale); tangent = cmsBuildParametricToneCurve(cpy, TYPE_TAN, &scale); reverse_sinus = cmsReverseToneCurve(sinus); reverse_cosinus = cmsReverseToneCurve(cosinus); if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(sinus, 0.10f), sin(0.10 * M_PI) , 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(sinus, 0.60f), sin(0.60* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(sinus, 0.90f), sin(0.90* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(cosinus, 0.10f), cos(0.10* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(cosinus, 0.60f), cos(0.60* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(cosinus, 0.90f), cos(0.90* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(tangent, 0.10f), tan(0.10* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(tangent, 0.60f), tan(0.60* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(tangent, 0.90f), tan(0.90* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(reverse_sinus, 0.10f), asin(0.10)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(reverse_sinus, 0.60f), asin(0.60)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(reverse_sinus, 0.90f), asin(0.90)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(reverse_cosinus, 0.10f), acos(0.10)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(reverse_cosinus, 0.60f), acos(0.60)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(reverse_cosinus, 0.90f), acos(0.90)/M_PI, 0.001)) goto Error; cmsFreeToneCurve(sinus); cmsFreeToneCurve(cosinus); cmsFreeToneCurve(tangent); cmsFreeToneCurve(reverse_sinus); cmsFreeToneCurve(reverse_cosinus); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); return 1; Error: cmsFreeToneCurve(sinus); cmsFreeToneCurve(reverse_sinus); cmsFreeToneCurve(cosinus); cmsFreeToneCurve(reverse_cosinus); if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(cpy); if (cpy2 != NULL) cmsDeleteContext(cpy2); return 0; } // -------------------------------------------------------------------------------------------------- // formatters plugin check: 5-6-5 RGB format // -------------------------------------------------------------------------------------------------- // We define this special type as 0 bytes not float, and set the upper bit #define TYPE_RGB_565 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0) | (1 << 23)) cmsUInt8Number* my_Unroll565(CMSREGISTER struct _cmstransform_struct* nfo, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { cmsUInt16Number pixel = *(cmsUInt16Number*) accum; // Take whole pixel double r = floor(((double) (pixel & 31) * 65535.0) / 31.0 + 0.5); double g = floor((((pixel >> 5) & 63) * 65535.0) / 63.0 + 0.5); double b = floor((((pixel >> 11) & 31) * 65535.0) / 31.0 + 0.5); wIn[2] = (cmsUInt16Number) r; wIn[1] = (cmsUInt16Number) g; wIn[0] = (cmsUInt16Number) b; return accum + 2; } cmsUInt8Number* my_Pack565(CMSREGISTER _cmsTRANSFORM* info, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { CMSREGISTER cmsUInt16Number pixel; int r, g, b; r = (int) floor(( wOut[2] * 31) / 65535.0 + 0.5); g = (int) floor(( wOut[1] * 63) / 65535.0 + 0.5); b = (int) floor(( wOut[0] * 31) / 65535.0 + 0.5); pixel = (r & 31) | (( g & 63) << 5) | ((b & 31) << 11); *(cmsUInt16Number*) output = pixel; return output + 2; } cmsFormatter my_FormatterFactory(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { cmsFormatter Result = { NULL }; if ((Type == TYPE_RGB_565) && !(dwFlags & CMS_PACK_FLAGS_FLOAT) && (Dir == cmsFormatterInput)) { Result.Fmt16 = my_Unroll565; } return Result; } cmsFormatter my_FormatterFactory2(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { cmsFormatter Result = { NULL }; if ((Type == TYPE_RGB_565) && !(dwFlags & CMS_PACK_FLAGS_FLOAT) && (Dir == cmsFormatterOutput)) { Result.Fmt16 = my_Pack565; } return Result; } static cmsPluginFormatters FormattersPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginFormattersSig, NULL}, my_FormatterFactory }; static cmsPluginFormatters FormattersPluginSample2 = { {cmsPluginMagicNumber, 2060, cmsPluginFormattersSig, NULL}, my_FormatterFactory2 }; cmsInt32Number CheckFormattersPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt16Number stream[]= { 0xffffU, 0x1234U, 0x0000U, 0x33ddU }; cmsUInt16Number result[4]; int i; cmsPluginTHR(ctx, &FormattersPluginSample); cpy = DupContext(ctx, NULL); cmsPluginTHR(cpy, &FormattersPluginSample2); cpy2 = DupContext(cpy, NULL); xform = cmsCreateTransformTHR(cpy2, NULL, TYPE_RGB_565, NULL, TYPE_RGB_565, INTENT_PERCEPTUAL, cmsFLAGS_NULLTRANSFORM); cmsDoTransform(xform, stream, result, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (stream[i] != result[i]) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // TagTypePlugin plugin check // -------------------------------------------------------------------------------------------------- #define SigIntType ((cmsTagTypeSignature) 0x74747448) // 'tttH' #define SigInt ((cmsTagSignature) 0x74747448) // 'tttH' #define SigInt32 ((cmsTagSignature) 0x74747449) // 'tttI' static void *Type_int_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number* Ptr = (cmsUInt32Number*) _cmsMalloc(self ->ContextID, sizeof(cmsUInt32Number)); if (Ptr == NULL) return NULL; if (!_cmsReadUInt32Number(io, Ptr)) return NULL; *nItems = 1; return Ptr; } static cmsBool Type_int_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { return _cmsWriteUInt32Number(io, *(cmsUInt32Number*) Ptr); } static void* Type_int_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsUInt32Number)); } void Type_int_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } static cmsPluginTag HiddenTagPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginTagSig, NULL}, SigInt, { 1, 1, { SigIntType }, NULL } }; static cmsPluginTag HiddenTagPluginSample2 = { { cmsPluginMagicNumber, 2060, cmsPluginTagSig, (cmsPluginBase*) &HiddenTagPluginSample}, SigInt32, { 1, 1, { cmsSigUInt32ArrayType }, NULL } }; static cmsPluginTagType TagTypePluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginTagTypeSig, (cmsPluginBase*) &HiddenTagPluginSample2}, { SigIntType, Type_int_Read, Type_int_Write, Type_int_Dup, Type_int_Free, NULL } }; cmsInt32Number CheckTagTypePlugin(void) { cmsContext ctx = NULL; cmsContext cpy = NULL; cmsContext cpy2 = NULL; cmsHPROFILE h = NULL; cmsUInt32Number myTag = 1234; cmsUInt32Number myTag32 = 5678; cmsUInt32Number rc = 0; char* data = NULL; cmsUInt32Number *ptr = NULL; cmsUInt32Number clen = 0; ctx = WatchDogContext(NULL); cmsPluginTHR(ctx, &TagTypePluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); cmsDeleteContext(ctx); cmsDeleteContext(cpy); h = cmsCreateProfilePlaceholder(cpy2); if (h == NULL) { Fail("Create placeholder failed"); goto Error; } if (!cmsWriteTag(h, SigInt, &myTag)) { Fail("Plug-in failed"); goto Error; } if (!cmsWriteTag(h, SigInt32, &myTag32)) { Fail("Plug-in failed"); goto Error; } rc = cmsSaveProfileToMem(h, NULL, &clen); if (!rc) { Fail("Fetch mem size failed"); goto Error; } data = (char*) malloc(clen); if (data == NULL) { Fail("malloc failed ?!?"); goto Error; } rc = cmsSaveProfileToMem(h, data, &clen); if (!rc) { Fail("Save to mem failed"); goto Error; } cmsCloseProfile(h); cmsSetLogErrorHandler(NULL); h = cmsOpenProfileFromMem(data, clen); if (h == NULL) { Fail("Open profile failed"); goto Error; } ptr = (cmsUInt32Number*) cmsReadTag(h, SigInt); if (ptr != NULL) { Fail("read tag/context switching failed"); goto Error; } ptr = (cmsUInt32Number*)cmsReadTag(h, SigInt32); if (ptr != NULL) { Fail("read tag/context switching failed"); goto Error; } cmsCloseProfile(h); ResetFatalError(); h = cmsOpenProfileFromMemTHR(cpy2, data, clen); if (h == NULL) { Fail("Open profile from mem failed"); goto Error; } // Get rid of data free(data); data = NULL; ptr = (cmsUInt32Number*) cmsReadTag(h, SigInt); if (ptr == NULL) { Fail("Read tag/context switching failed (2)"); return 0; } rc = (*ptr == 1234); ptr = (cmsUInt32Number*)cmsReadTag(h, SigInt32); if (ptr == NULL) { Fail("read tag/context switching failed (2)"); goto Error; } rc &= (*ptr == 5678); cmsCloseProfile(h); cmsDeleteContext(cpy2); return rc; Error: if (h != NULL) cmsCloseProfile(h); if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(cpy); if (cpy2 != NULL) cmsDeleteContext(cpy2); if (data) free(data); return 0; } // -------------------------------------------------------------------------------------------------- // MPE plugin check: // -------------------------------------------------------------------------------------------------- #define SigNegateType ((cmsStageSignature)0x6E202020) static void EvaluateNegate(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { Out[0] = 1.0f - In[0]; Out[1] = 1.0f - In[1]; Out[2] = 1.0f - In[2]; } static cmsStage* StageAllocNegate(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, SigNegateType, 3, 3, EvaluateNegate, NULL, NULL, NULL); } static void *Type_negate_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt16Number Chans; if (!_cmsReadUInt16Number(io, &Chans)) return NULL; if (Chans != 3) return NULL; *nItems = 1; return StageAllocNegate(self -> ContextID); } static cmsBool Type_negate_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { if (!_cmsWriteUInt16Number(io, 3)) return FALSE; return TRUE; } static cmsPluginMultiProcessElement MPEPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginMultiProcessElementSig, NULL}, { (cmsTagTypeSignature) SigNegateType, Type_negate_Read, Type_negate_Write, NULL, NULL, NULL } }; cmsInt32Number CheckMPEPlugin(void) { cmsContext ctx = NULL; cmsContext cpy = NULL; cmsContext cpy2 = NULL; cmsHPROFILE h = NULL; cmsUInt32Number rc = 0; char* data = NULL; cmsUInt32Number clen = 0; cmsFloat32Number In[3], Out[3]; cmsPipeline* pipe; ctx = WatchDogContext(NULL); cmsPluginTHR(ctx, &MPEPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); cmsDeleteContext(ctx); cmsDeleteContext(cpy); h = cmsCreateProfilePlaceholder(cpy2); if (h == NULL) { Fail("Create placeholder failed"); goto Error; } pipe = cmsPipelineAlloc(cpy2, 3, 3); cmsPipelineInsertStage(pipe, cmsAT_BEGIN, StageAllocNegate(cpy2)); In[0] = 0.3f; In[1] = 0.2f; In[2] = 0.9f; cmsPipelineEvalFloat(In, Out, pipe); rc = (IsGoodVal("0", Out[0], 1.0-In[0], 0.001) && IsGoodVal("1", Out[1], 1.0-In[1], 0.001) && IsGoodVal("2", Out[2], 1.0-In[2], 0.001)); if (!rc) { Fail("Pipeline failed"); goto Error; } if (!cmsWriteTag(h, cmsSigDToB3Tag, pipe)) { Fail("Plug-in failed"); goto Error; } // This cleans the stage as well cmsPipelineFree(pipe); rc = cmsSaveProfileToMem(h, NULL, &clen); if (!rc) { Fail("Fetch mem size failed"); goto Error; } data = (char*) malloc(clen); if (data == NULL) { Fail("malloc failed ?!?"); goto Error; } rc = cmsSaveProfileToMem(h, data, &clen); if (!rc) { Fail("Save to mem failed"); goto Error; } cmsCloseProfile(h); cmsSetLogErrorHandler(NULL); h = cmsOpenProfileFromMem(data, clen); if (h == NULL) { Fail("Open profile failed"); goto Error; } pipe = (cmsPipeline*) cmsReadTag(h, cmsSigDToB3Tag); if (pipe != NULL) { // Unsupported stage, should fail Fail("read tag/context switching failed"); goto Error; } cmsCloseProfile(h); ResetFatalError(); h = cmsOpenProfileFromMemTHR(cpy2, data, clen); if (h == NULL) { Fail("Open profile from mem failed"); goto Error; } // Get rid of data free(data); data = NULL; pipe = (cmsPipeline*) cmsReadTag(h, cmsSigDToB3Tag); if (pipe == NULL) { Fail("Read tag/context switching failed (2)"); return 0; } // Evaluate for negation In[0] = 0.3f; In[1] = 0.2f; In[2] = 0.9f; cmsPipelineEvalFloat(In, Out, pipe); rc = (IsGoodVal("0", Out[0], 1.0-In[0], 0.001) && IsGoodVal("1", Out[1], 1.0-In[1], 0.001) && IsGoodVal("2", Out[2], 1.0-In[2], 0.001)); cmsCloseProfile(h); cmsDeleteContext(cpy2); return rc; Error: if (h != NULL) cmsCloseProfile(h); if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(cpy); if (cpy2 != NULL) cmsDeleteContext(cpy2); if (data) free(data); return 0; } // -------------------------------------------------------------------------------------------------- // Optimization plugin check: // -------------------------------------------------------------------------------------------------- static void FastEvaluateCurves(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER const void* Data) { Out[0] = In[0]; } static cmsBool MyOptimize(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* mpe; _cmsStageToneCurvesData* Data; // Only curves in this LUT? All are identities? for (mpe = cmsPipelineGetPtrToFirstStage(*Lut); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; // Check for identity Data = (_cmsStageToneCurvesData*) cmsStageData(mpe); if (Data ->nCurves != 1) return FALSE; if (cmsEstimateGamma(Data->TheCurves[0], 0.1) > 1.0) return FALSE; } *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(*Lut, FastEvaluateCurves, NULL, NULL, NULL); return TRUE; } cmsPluginOptimization OptimizationPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginOptimizationSig, NULL}, MyOptimize }; cmsInt32Number CheckOptimizationPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; cmsToneCurve* Linear[1]; cmsHPROFILE h; int i; cmsPluginTHR(ctx, &OptimizationPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear[0] = cmsBuildGamma(cpy2, 1.0); h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, Linear); cmsFreeToneCurve(Linear[0]); xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(h); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (In[i] != Out[i]) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // Check the intent plug-in // -------------------------------------------------------------------------------------------------- /* This example creates a new rendering intent, at intent number 300, that is identical to perceptual intent for all color spaces but gray to gray transforms, in this case it bypasses the data. Note that it has to clear all occurrences of intent 300 in the intents array to avoid infinite recursion. */ #define INTENT_DECEPTIVE 300 static cmsPipeline* MyNewIntent(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsPipeline* Result; cmsUInt32Number ICCIntents[256]; cmsUInt32Number i; for (i=0; i < nProfiles; i++) ICCIntents[i] = (TheIntents[i] == INTENT_DECEPTIVE) ? INTENT_PERCEPTUAL : TheIntents[i]; if (cmsGetColorSpace(hProfiles[0]) != cmsSigGrayData || cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigGrayData) return _cmsDefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); Result = cmsPipelineAlloc(ContextID, 1, 1); if (Result == NULL) return NULL; cmsPipelineInsertStage(Result, cmsAT_BEGIN, cmsStageAllocIdentity(ContextID, 1)); return Result; } static cmsPluginRenderingIntent IntentPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginRenderingIntentSig, NULL}, INTENT_DECEPTIVE, MyNewIntent, "bypass gray to gray rendering intent" }; cmsInt32Number CheckIntentPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsHPROFILE h1, h2; cmsToneCurve* Linear1; cmsToneCurve* Linear2; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; int i; cmsPluginTHR(ctx, &IntentPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear1 = cmsBuildGamma(cpy2, 3.0); Linear2 = cmsBuildGamma(cpy2, 0.1); h1 = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear1); h2 = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear2); cmsFreeToneCurve(Linear1); cmsFreeToneCurve(Linear2); xform = cmsCreateTransformTHR(cpy2, h1, TYPE_GRAY_8, h2, TYPE_GRAY_8, INTENT_DECEPTIVE, 0); cmsCloseProfile(h1); cmsCloseProfile(h2); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (Out[i] != In[i]) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // Check the full transform plug-in // -------------------------------------------------------------------------------------------------- // This is a sample intent that only works for gray8 as output, and always returns '42' static void TrancendentalTransform(struct _cmstransform_struct * CMM, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt32Number i; for (i=0; i < Size; i++) { ((cmsUInt8Number*) OutputBuffer)[i] = 0x42; } } cmsBool TransformFactory(_cmsTransformFn* xformPtr, void** UserData, _cmsFreeUserDataFn* FreePrivateDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { if (*OutputFormat == TYPE_GRAY_8) { // *Lut holds the pipeline to be applied *xformPtr = TrancendentalTransform; return TRUE; } return FALSE; } // The Plug-in entry point static cmsPluginTransform FullTransformPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginTransformSig, NULL}, { TransformFactory } }; cmsInt32Number CheckTransformPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; cmsToneCurve* Linear; cmsHPROFILE h; int i; cmsPluginTHR(ctx, &FullTransformPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear = cmsBuildGamma(cpy2, 1.0); h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear); cmsFreeToneCurve(Linear); xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(h); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (Out[i] != 0x42) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // Check the mutex plug-in // -------------------------------------------------------------------------------------------------- typedef struct { int nlocks; } MyMtx; static void* MyMtxCreate(cmsContext id) { MyMtx* mtx = (MyMtx*) _cmsMalloc(id, sizeof(MyMtx)); mtx ->nlocks = 0; return mtx; } static void MyMtxDestroy(cmsContext id, void* mtx) { MyMtx* mtx_ = (MyMtx*) mtx; if (mtx_->nlocks != 0) Die("Locks != 0 when setting free a mutex"); _cmsFree(id, mtx); } static cmsBool MyMtxLock(cmsContext id, void* mtx) { MyMtx* mtx_ = (MyMtx*) mtx; mtx_->nlocks++; return TRUE; } static void MyMtxUnlock(cmsContext id, void* mtx) { MyMtx* mtx_ = (MyMtx*) mtx; mtx_->nlocks--; } static cmsPluginMutex MutexPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginMutexSig, NULL}, MyMtxCreate, MyMtxDestroy, MyMtxLock, MyMtxUnlock }; cmsInt32Number CheckMutexPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; cmsToneCurve* Linear; cmsHPROFILE h; int i; cmsPluginTHR(ctx, &MutexPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear = cmsBuildGamma(cpy2, 1.0); h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear); cmsFreeToneCurve(Linear); xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(h); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (Out[i] != In[i]) return 0; return 1; } cmsInt32Number CheckMethodPackDoublesFromFloat(void) { cmsContext ctx = WatchDogContext(NULL); cmsHTRANSFORM xform; cmsHTRANSFORM l_pFakeProfileLAB; cmsFloat64Number l_D_OutputColorArrayBlack[8]; cmsFloat64Number l_D_OutputColorArrayBlue[8]; cmsCIELab LabInBlack; cmsCIELab LabInBlue; cmsUInt16Number Lab_UI16_Black[3]; cmsUInt16Number Lab_UI16_Blue[3]; cmsHPROFILE OutputCMYKProfile; cmsUInt32Number l_UI32_OutputFormat; cmsPluginTHR(ctx, &FullTransformPluginSample); l_pFakeProfileLAB = cmsCreateLab2ProfileTHR(ctx, NULL); if (l_pFakeProfileLAB == NULL) return 0; OutputCMYKProfile = cmsOpenProfileFromFileTHR(ctx, "test2.icc", "r"); if (OutputCMYKProfile == NULL) return 0; l_UI32_OutputFormat = 0; l_UI32_OutputFormat |= COLORSPACE_SH(PT_CMYK); l_UI32_OutputFormat |= PLANAR_SH(1); l_UI32_OutputFormat |= CHANNELS_SH(4); l_UI32_OutputFormat |= BYTES_SH(0); l_UI32_OutputFormat |= FLOAT_SH(1); xform = cmsCreateTransformTHR(ctx, l_pFakeProfileLAB, TYPE_Lab_DBL, OutputCMYKProfile, l_UI32_OutputFormat, INTENT_PERCEPTUAL, 0); cmsCloseProfile(OutputCMYKProfile); cmsCloseProfile(l_pFakeProfileLAB); Lab_UI16_Black[0] = 0; Lab_UI16_Black[1] = 32768; Lab_UI16_Black[2] = 32768; Lab_UI16_Blue[0] = 0; Lab_UI16_Blue[1] = 8192; Lab_UI16_Blue[2] = 8192; cmsLabEncoded2Float(&LabInBlack, Lab_UI16_Black); cmsLabEncoded2Float(&LabInBlue, Lab_UI16_Blue); memset(l_D_OutputColorArrayBlack, 0, sizeof(l_D_OutputColorArrayBlack)); memset(l_D_OutputColorArrayBlue, 0, sizeof(l_D_OutputColorArrayBlue)); cmsDoTransform(xform, &LabInBlack, l_D_OutputColorArrayBlack, 1); cmsDoTransform(xform, &LabInBlue, l_D_OutputColorArrayBlue, 1); cmsDeleteTransform(xform); cmsDeleteContext(ctx); if (l_D_OutputColorArrayBlack[0] < 85 || l_D_OutputColorArrayBlue[0] < 90) Fail("Ink amount is not right"); return 1; } lcms2-2.19.1/testbed/zoo_icc.c0000755000175000017500000001665315176573557015124 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "testcms2.h" // ZOO checks ------------------------------------------------------------------------------------------------------------ #ifdef CMS_IS_WINDOWS_ static char ZOOfolder[cmsMAX_PATH] = "c:\\colormaps\\"; static char ZOOwrite[cmsMAX_PATH] = "c:\\colormaps\\write\\"; static char ZOORawWrite[cmsMAX_PATH] = "c:\\colormaps\\rawwrite\\"; // Read all tags on a profile given by its handle static void ReadAllTags(cmsHPROFILE h) { cmsInt32Number i, n; cmsTagSignature sig; n = cmsGetTagCount(h); for (i=0; i < n; i++) { sig = cmsGetTagSignature(h, i); if (cmsReadTag(h, sig) == NULL) return; } } // Read all tags on a profile given by its handle static void ReadAllRAWTags(cmsHPROFILE h) { cmsInt32Number i, n; cmsTagSignature sig; n = cmsGetTagCount(h); for (i=0; i < n; i++) { sig = cmsGetTagSignature(h, i); cmsReadRawTag(h, sig, NULL, 0); } } static void PrintInfo(cmsHPROFILE h, cmsInfoType Info) { wchar_t* text; cmsInt32Number len; cmsContext id = 0; len = cmsGetProfileInfo(h, Info, "en", "US", NULL, 0); if (len == 0) return; text = (wchar_t*) _cmsMalloc(id, len); cmsGetProfileInfo(h, Info, "en", "US", text, len); wprintf(L"%s\n", text); _cmsFree(id, text); } static void PrintAllInfos(cmsHPROFILE h) { PrintInfo(h, cmsInfoDescription); PrintInfo(h, cmsInfoManufacturer); PrintInfo(h, cmsInfoModel); PrintInfo(h, cmsInfoCopyright); printf("\n\n"); } static void ReadAllLUTS(cmsHPROFILE h) { cmsPipeline* a; cmsCIEXYZ Black; a = _cmsReadInputLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); cmsDetectDestinationBlackPoint(&Black, h, INTENT_PERCEPTUAL, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_RELATIVE_COLORIMETRIC, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_SATURATION, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_ABSOLUTE_COLORIMETRIC, 0); cmsDetectTAC(h); } // Check one specimen in the ZOO static cmsInt32Number CheckSingleSpecimen(const char* Profile) { char BuffSrc[256]; char BuffDst[256]; cmsHPROFILE h; sprintf(BuffSrc, "%s%s", ZOOfolder, Profile); sprintf(BuffDst, "%s%s", ZOOwrite, Profile); h = cmsOpenProfileFromFile(BuffSrc, "r"); if (h == NULL) return 0; printf("%s\n", Profile); PrintAllInfos(h); ReadAllTags(h); ReadAllLUTS(h); // ReadAllRAWTags(h); cmsSaveProfileToFile(h, BuffDst); cmsCloseProfile(h); h = cmsOpenProfileFromFile(BuffDst, "r"); if (h == NULL) return 0; ReadAllTags(h); cmsCloseProfile(h); return 1; } static cmsInt32Number CheckRAWSpecimen(const char* Profile) { char BuffSrc[256]; char BuffDst[256]; cmsHPROFILE h; sprintf(BuffSrc, "%s%s", ZOOfolder, Profile); sprintf(BuffDst, "%s%s", ZOORawWrite, Profile); h = cmsOpenProfileFromFile(BuffSrc, "r"); if (h == NULL) return 0; ReadAllTags(h); ReadAllRAWTags(h); cmsSaveProfileToFile(h, BuffDst); cmsCloseProfile(h); h = cmsOpenProfileFromFile(BuffDst, "r"); if (h == NULL) return 0; ReadAllTags(h); cmsCloseProfile(h); return 1; } static int input = 0, disp = 0, output = 0, link = 0, abst = 0, color = 0, named = 0; static int rgb = 0, cmyk = 0, gray = 0, other = 0; static int count_stats(const char* Profile) { char BuffSrc[256]; cmsHPROFILE h; cmsCIEXYZ Black; sprintf(BuffSrc, "%s%s", ZOOfolder, Profile); h = cmsOpenProfileFromFile(BuffSrc, "r"); if (h == NULL) return 0; switch (cmsGetDeviceClass(h)) { case cmsSigInputClass : input++; break; case cmsSigDisplayClass : disp++; break; case cmsSigOutputClass : output++; break; case cmsSigLinkClass : link++; break; case cmsSigAbstractClass : abst++; break; case cmsSigColorSpaceClass : color++; break; case cmsSigNamedColorClass : named ++; break; } switch (cmsGetColorSpace(h)) { case cmsSigRgbData: rgb++; break; case cmsSigCmykData: cmyk++; break; case cmsSigGrayData: gray++; break; default: other++; } cmsDetectDestinationBlackPoint(&Black, h, INTENT_PERCEPTUAL, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_RELATIVE_COLORIMETRIC, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_SATURATION, 0); cmsCloseProfile(h); return 1; } void CheckProfileZOO(void) { struct _finddata_t c_file; intptr_t hFile; cmsSetLogErrorHandler(NULL); if ( (hFile = _findfirst("c:\\colormaps\\*.*", &c_file)) == -1L ) printf("No files in current directory"); else { do { if (strcmp(c_file.name, ".") != 0 && strcmp(c_file.name, "..") != 0) { CheckSingleSpecimen( c_file.name); CheckRAWSpecimen( c_file.name); count_stats(c_file.name); TestMemoryLeaks(FALSE); } } while ( _findnext(hFile, &c_file) == 0 ); _findclose(hFile); } ResetFatalError(); } #endif lcms2-2.19.1/testbed/testcms2.c0000644000175000017500000101561015176573557015231 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "testcms2.h" // A single check. Returns 1 if success, 0 if failed typedef cmsInt32Number (*TestFn)(void); // A parametric Tone curve test function typedef cmsFloat32Number (* dblfnptr)(cmsFloat32Number x, const cmsFloat64Number Params[]); // Some globals to keep track of error #define TEXT_ERROR_BUFFER_SIZE 4096 static char ReasonToFailBuffer[TEXT_ERROR_BUFFER_SIZE]; static char SubTestBuffer[TEXT_ERROR_BUFFER_SIZE]; static cmsInt32Number TotalTests = 0, TotalFail = 0; static cmsBool TrappedError; static cmsInt32Number SimultaneousErrors; #define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) // Die, a fatal unexpected error is detected! void Die(const char* Reason, ...) { va_list args; va_start(args, Reason); vsprintf(ReasonToFailBuffer, Reason, args); va_end(args); printf("\n%s\n", ReasonToFailBuffer); fflush(stdout); exit(1); } static void* chknull(void* mem) { if (mem == NULL) Die("Memory may be corrupted"); return mem; } // Memory management replacement ----------------------------------------------------------------------------- // This is just a simple plug-in for malloc, free and realloc to keep track of memory allocated, // maximum requested as a single block and maximum allocated at a given time. Results are printed at the end static cmsUInt32Number SingleHit, MaxAllocated=0, TotalMemory=0; // I'm hiding the size before the block. This is a well-known technique and probably the blocks coming from // malloc are built in a way similar to that, but I do on my own to be portable. typedef struct { cmsUInt32Number KeepSize; cmsContext WhoAllocated; cmsUInt32Number DontCheck; union { cmsUInt64Number HiSparc; // '_cmsMemoryBlock' block is prepended by the // allocator for any requested size. Thus, union holds // "widest" type to guarantee proper '_cmsMemoryBlock' // alignment for any requested size. } alignment; } _cmsMemoryBlock; #define SIZE_OF_MEM_HEADER (sizeof(_cmsMemoryBlock)) // This is a fake thread descriptor used to check thread integrity. // Basically it returns a different threadID each time it is called. // Then the memory management replacement functions does check if each // free() is being called with same ContextID used on malloc() static cmsContext DbgThread(void) { static cmsUInt32Number n = 1; return (cmsContext) (void*) ((cmsUInt8Number*) NULL + (n++ % 0xff0)); } // The allocate routine static void* DebugMalloc(cmsContext ContextID, cmsUInt32Number size) { _cmsMemoryBlock* blk; if (size <= 0) { Die("malloc requested with zero bytes"); } TotalMemory += size; if (TotalMemory > MaxAllocated) MaxAllocated = TotalMemory; if (size > SingleHit) SingleHit = size; blk = (_cmsMemoryBlock*) chknull(malloc(size + SIZE_OF_MEM_HEADER)); if (blk == NULL) return NULL; blk ->KeepSize = size; blk ->WhoAllocated = ContextID; blk ->DontCheck = 0; return (void*) ((cmsUInt8Number*) blk + SIZE_OF_MEM_HEADER); } // The free routine static void DebugFree(cmsContext ContextID, void *Ptr) { _cmsMemoryBlock* blk; if (Ptr == NULL) { Die("NULL free (which is a no-op in C, but may be an clue of something going wrong)"); } blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); TotalMemory -= blk ->KeepSize; if (blk ->WhoAllocated != ContextID && !blk->DontCheck) { Die("Trying to free memory allocated by a different thread"); } free(blk); } // Reallocate, just a malloc, a copy and a free in this case. static void * DebugRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize) { _cmsMemoryBlock* blk; void* NewPtr; cmsUInt32Number max_sz; NewPtr = DebugMalloc(ContextID, NewSize); if (Ptr == NULL) return NewPtr; blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); max_sz = blk -> KeepSize > NewSize ? NewSize : blk ->KeepSize; memmove(NewPtr, Ptr, max_sz); DebugFree(ContextID, Ptr); return NewPtr; } // Let's know the totals static void DebugMemPrintTotals(void) { printf("[Memory statistics]\n"); printf("Allocated = %u MaxAlloc = %u Single block hit = %u\n", TotalMemory, MaxAllocated, SingleHit); } void DebugMemDontCheckThis(void *Ptr) { _cmsMemoryBlock* blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); blk ->DontCheck = 1; } // Memory string static const char* MemStr(cmsUInt32Number size) { static char Buffer[1024]; if (size > 1024*1024) { sprintf(Buffer, "%g Mb", (cmsFloat64Number) size / (1024.0*1024.0)); } else if (size > 1024) { sprintf(Buffer, "%g Kb", (cmsFloat64Number) size / 1024.0); } else sprintf(Buffer, "%g bytes", (cmsFloat64Number) size); return Buffer; } void TestMemoryLeaks(cmsBool ok) { if (TotalMemory > 0) printf("Ok, but %s are left!\n", MemStr(TotalMemory)); else { if (ok) printf("Ok.\n"); } } // Here we go with the plug-in declaration static cmsPluginMemHandler DebugMemHandler = {{ cmsPluginMagicNumber, 2060, cmsPluginMemHandlerSig, NULL }, DebugMalloc, DebugFree, DebugRealloc, NULL, NULL, NULL }; // Returns a pointer to the memhandler plugin void* PluginMemHandler(void) { return (void*) &DebugMemHandler; } cmsContext WatchDogContext(void* usr) { cmsContext ctx; ctx = cmsCreateContext(&DebugMemHandler, usr); if (ctx == NULL) Die("Unable to create memory managed context"); DebugMemDontCheckThis(ctx); return ctx; } static void FatalErrorQuit(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { Die(Text); cmsUNUSED_PARAMETER(ContextID); cmsUNUSED_PARAMETER(ErrorCode); } void ResetFatalError(void) { cmsSetLogErrorHandler(FatalErrorQuit); } // Print a dot for gauging void Dot(void) { fprintf(stdout, "."); fflush(stdout); } void Say(const char* str) { fprintf(stdout, "%s", str); fflush(stdout); } // Keep track of the reason to fail void Fail(const char* frm, ...) { va_list args; va_start(args, frm); vsprintf(ReasonToFailBuffer, frm, args); va_end(args); } // Keep track of subtest void SubTest(const char* frm, ...) { va_list args; Dot(); va_start(args, frm); vsprintf(SubTestBuffer, frm, args); va_end(args); } // The check framework static void Check(const char* Title, TestFn Fn) { printf("Checking %s ...", Title); fflush(stdout); ReasonToFailBuffer[0] = 0; SubTestBuffer[0] = 0; TrappedError = FALSE; SimultaneousErrors = 0; TotalTests++; if (Fn() && !TrappedError) { // It is a good place to check memory TestMemoryLeaks(TRUE); } else { printf("FAIL!\n"); if (SubTestBuffer[0]) printf("%s: [%s]\n\t%s\n", Title, SubTestBuffer, ReasonToFailBuffer); else printf("%s:\n\t%s\n", Title, ReasonToFailBuffer); if (SimultaneousErrors > 1) printf("\tMore than one (%d) errors were reported\n", SimultaneousErrors); TotalFail++; } fflush(stdout); } // Dump a tone curve, for easy diagnostic void DumpToneCurve(cmsToneCurve* gamma, const char* FileName) { cmsHANDLE hIT8; cmsUInt32Number i; hIT8 = cmsIT8Alloc(gamma ->InterpParams->ContextID); cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_FIELDS", 2); cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", gamma ->nEntries); cmsIT8SetDataFormat(hIT8, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8, 1, "VALUE"); for (i=0; i < gamma ->nEntries; i++) { char Val[30]; sprintf(Val, "%u", i); cmsIT8SetDataRowCol(hIT8, i, 0, Val); sprintf(Val, "0x%x", gamma ->Table16[i]); cmsIT8SetDataRowCol(hIT8, i, 1, Val); } cmsIT8SaveToFile(hIT8, FileName); cmsIT8Free(hIT8); } // ------------------------------------------------------------------------------------------------- // Used to perform several checks. // The space used is a clone of a well-known commercial // color space which I will name "Above RGB" static cmsHPROFILE Create_AboveRGB(void) { cmsToneCurve* Curve[3]; cmsHPROFILE hProfile; cmsCIExyY D65; cmsCIExyYTRIPLE Primaries = {{0.64, 0.33, 1 }, {0.21, 0.71, 1 }, {0.15, 0.06, 1 }}; Curve[0] = Curve[1] = Curve[2] = cmsBuildGamma(DbgThread(), 2.19921875); cmsWhitePointFromTemp(&D65, 6504); hProfile = cmsCreateRGBProfileTHR(DbgThread(), &D65, &Primaries, Curve); cmsFreeToneCurve(Curve[0]); return hProfile; } // A gamma-2.2 gray space static cmsHPROFILE Create_Gray22(void) { cmsHPROFILE hProfile; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 2.2); if (Curve == NULL) return NULL; hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } // A gamma-3.0 gray space static cmsHPROFILE Create_Gray30(void) { cmsHPROFILE hProfile; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 3.0); if (Curve == NULL) return NULL; hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } static cmsHPROFILE Create_GrayLab(void) { cmsHPROFILE hProfile; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 1.0); if (Curve == NULL) return NULL; hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); cmsSetPCS(hProfile, cmsSigLabData); return hProfile; } // A CMYK devicelink that adds gamma 3.0 to each channel static cmsHPROFILE Create_CMYK_DeviceLink(void) { cmsHPROFILE hProfile; cmsToneCurve* Tab[4]; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 3.0); if (Curve == NULL) return NULL; Tab[0] = Curve; Tab[1] = Curve; Tab[2] = Curve; Tab[3] = Curve; hProfile = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigCmykData, Tab); if (hProfile == NULL) return NULL; cmsFreeToneCurve(Curve); return hProfile; } // Create a fake CMYK profile, without any other requirement that being coarse CMYK. // DON'T USE THIS PROFILE FOR ANYTHING, IT IS USELESS BUT FOR TESTING PURPOSES. typedef struct { cmsHTRANSFORM hLab2sRGB; cmsHTRANSFORM sRGB2Lab; cmsHTRANSFORM hIlimit; } FakeCMYKParams; static cmsFloat64Number Clip(cmsFloat64Number v) { if (v < 0) return 0; if (v > 1) return 1; return v; } static cmsInt32Number ForwardSampler(CMSREGISTER const cmsUInt16Number In[], cmsUInt16Number Out[], void* Cargo) { FakeCMYKParams* p = (FakeCMYKParams*) Cargo; cmsFloat64Number rgb[3], cmyk[4]; cmsFloat64Number c, m, y, k; cmsDoTransform(p ->hLab2sRGB, In, rgb, 1); c = 1 - rgb[0]; m = 1 - rgb[1]; y = 1 - rgb[2]; k = (c < m ? cmsmin(c, y) : cmsmin(m, y)); // NONSENSE WARNING!: I'm doing this just because this is a test // profile that may have ink limit up to 400%. There is no UCR here // so the profile is basically useless for anything but testing. cmyk[0] = c; cmyk[1] = m; cmyk[2] = y; cmyk[3] = k; cmsDoTransform(p ->hIlimit, cmyk, Out, 1); return 1; } static cmsInt32Number ReverseSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) { FakeCMYKParams* p = (FakeCMYKParams*) Cargo; cmsFloat64Number c, m, y, k, rgb[3]; c = In[0] / 65535.0; m = In[1] / 65535.0; y = In[2] / 65535.0; k = In[3] / 65535.0; if (k == 0) { rgb[0] = Clip(1 - c); rgb[1] = Clip(1 - m); rgb[2] = Clip(1 - y); } else if (k == 1) { rgb[0] = rgb[1] = rgb[2] = 0; } else { rgb[0] = Clip((1 - c) * (1 - k)); rgb[1] = Clip((1 - m) * (1 - k)); rgb[2] = Clip((1 - y) * (1 - k)); } cmsDoTransform(p ->sRGB2Lab, rgb, Out, 1); return 1; } static cmsHPROFILE CreateFakeCMYK(cmsFloat64Number InkLimit, cmsBool lUseAboveRGB) { cmsHPROFILE hICC; cmsPipeline* AToB0, *BToA0; cmsStage* CLUT; cmsContext ContextID; FakeCMYKParams p; cmsHPROFILE hLab, hsRGB, hLimit; cmsUInt32Number cmykfrm; if (lUseAboveRGB) hsRGB = Create_AboveRGB(); else hsRGB = cmsCreate_sRGBProfile(); hLab = cmsCreateLab4Profile(NULL); hLimit = cmsCreateInkLimitingDeviceLink(cmsSigCmykData, InkLimit); cmykfrm = FLOAT_SH(1) | BYTES_SH(0)|CHANNELS_SH(4); p.hLab2sRGB = cmsCreateTransform(hLab, TYPE_Lab_16, hsRGB, TYPE_RGB_DBL, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); p.sRGB2Lab = cmsCreateTransform(hsRGB, TYPE_RGB_DBL, hLab, TYPE_Lab_16, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); p.hIlimit = cmsCreateTransform(hLimit, cmykfrm, NULL, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); cmsCloseProfile(hLab); cmsCloseProfile(hsRGB); cmsCloseProfile(hLimit); ContextID = DbgThread(); hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) return NULL; cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigOutputClass); cmsSetColorSpace(hICC, cmsSigCmykData); cmsSetPCS(hICC, cmsSigLabData); BToA0 = cmsPipelineAlloc(ContextID, 3, 4); if (BToA0 == NULL) return 0; CLUT = cmsStageAllocCLut16bit(ContextID, 17, 3, 4, NULL); if (CLUT == NULL) return 0; if (!cmsStageSampleCLut16bit(CLUT, ForwardSampler, &p, 0)) return 0; cmsPipelineInsertStage(BToA0, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)); cmsPipelineInsertStage(BToA0, cmsAT_END, CLUT); cmsPipelineInsertStage(BToA0, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, 4)); if (!cmsWriteTag(hICC, cmsSigBToA0Tag, (void*) BToA0)) return 0; cmsPipelineFree(BToA0); AToB0 = cmsPipelineAlloc(ContextID, 4, 3); if (AToB0 == NULL) return 0; CLUT = cmsStageAllocCLut16bit(ContextID, 17, 4, 3, NULL); if (CLUT == NULL) return 0; if (!cmsStageSampleCLut16bit(CLUT, ReverseSampler, &p, 0)) return 0; cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 4)); cmsPipelineInsertStage(AToB0, cmsAT_END, CLUT); cmsPipelineInsertStage(AToB0, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, 3)); if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) AToB0)) return 0; cmsPipelineFree(AToB0); cmsDeleteTransform(p.hLab2sRGB); cmsDeleteTransform(p.sRGB2Lab); cmsDeleteTransform(p.hIlimit); cmsLinkTag(hICC, cmsSigAToB1Tag, cmsSigAToB0Tag); cmsLinkTag(hICC, cmsSigAToB2Tag, cmsSigAToB0Tag); cmsLinkTag(hICC, cmsSigBToA1Tag, cmsSigBToA0Tag); cmsLinkTag(hICC, cmsSigBToA2Tag, cmsSigBToA0Tag); return hICC; } // Does create several profiles for latter use------------------------------------------------------------------------------------------------ static cmsInt32Number OneVirtual(cmsHPROFILE h, const char* SubTestTxt, const char* FileName) { SubTest(SubTestTxt); if (h == NULL) return 0; if (!cmsSaveProfileToFile(h, FileName)) return 0; cmsCloseProfile(h); h = cmsOpenProfileFromFile(FileName, "r"); if (h == NULL) return 0; cmsCloseProfile(h); return 1; } // This test checks the ability of lcms2 to save its built-ins as valid profiles. // It does not check the functionality of such profiles static cmsInt32Number CreateTestProfiles(void) { cmsHPROFILE h; h = cmsCreate_sRGBProfileTHR(DbgThread()); if (!OneVirtual(h, "sRGB profile", "sRGBlcms2.icc")) return 0; // ---- h = Create_AboveRGB(); if (!OneVirtual(h, "aRGB profile", "aRGBlcms2.icc")) return 0; // ---- h = Create_Gray22(); if (!OneVirtual(h, "Gray profile", "graylcms2.icc")) return 0; // ---- h = Create_Gray30(); if (!OneVirtual(h, "Gray 3.0 profile", "gray3lcms2.icc")) return 0; // ---- h = Create_GrayLab(); if (!OneVirtual(h, "Gray Lab profile", "glablcms2.icc")) return 0; // ---- h = Create_CMYK_DeviceLink(); if (!OneVirtual(h, "Linearization profile", "linlcms2.icc")) return 0; // ------- h = cmsCreateInkLimitingDeviceLinkTHR(DbgThread(), cmsSigCmykData, 150); if (h == NULL) return 0; if (!OneVirtual(h, "Ink-limiting profile", "limitlcms2.icc")) return 0; // ------ h = cmsCreateLab2ProfileTHR(DbgThread(), NULL); if (!OneVirtual(h, "Lab 2 identity profile", "labv2lcms2.icc")) return 0; // ---- h = cmsCreateLab4ProfileTHR(DbgThread(), NULL); if (!OneVirtual(h, "Lab 4 identity profile", "labv4lcms2.icc")) return 0; // ---- h = cmsCreateXYZProfileTHR(DbgThread()); if (!OneVirtual(h, "XYZ identity profile", "xyzlcms2.icc")) return 0; // ---- h = cmsCreateNULLProfileTHR(DbgThread()); if (!OneVirtual(h, "NULL profile", "nullcms2.icc")) return 0; // --- h = cmsCreateBCHSWabstractProfileTHR(DbgThread(), 17, 0, 0, 0, 0, 5000, 6000); if (!OneVirtual(h, "BCHS profile", "bchslcms2.icc")) return 0; // --- h = CreateFakeCMYK(300, FALSE); if (!OneVirtual(h, "Fake CMYK profile", "lcms2cmyk.icc")) return 0; // --- h = cmsCreateBCHSWabstractProfileTHR(DbgThread(), 17, 0, 1.2, 0, 3, 5000, 5000); if (!OneVirtual(h, "Brightness", "brightness.icc")) return 0; return 1; } static void RemoveTestProfiles(void) { remove("sRGBlcms2.icc"); remove("aRGBlcms2.icc"); remove("graylcms2.icc"); remove("gray3lcms2.icc"); remove("linlcms2.icc"); remove("limitlcms2.icc"); remove("labv2lcms2.icc"); remove("labv4lcms2.icc"); remove("xyzlcms2.icc"); remove("nullcms2.icc"); remove("bchslcms2.icc"); remove("lcms2cmyk.icc"); remove("glablcms2.icc"); remove("lcms2link.icc"); remove("lcms2link2.icc"); remove("brightness.icc"); } // ------------------------------------------------------------------------------------------------- // Check the size of basic types. If this test fails, nothing is going to work anyway static cmsInt32Number CheckBaseTypes(void) { // Ignore warnings about conditional expression #ifdef _MSC_VER #pragma warning(disable: 4127) #endif if (sizeof(cmsUInt8Number) != 1) return 0; if (sizeof(cmsInt8Number) != 1) return 0; if (sizeof(cmsUInt16Number) != 2) return 0; if (sizeof(cmsInt16Number) != 2) return 0; if (sizeof(cmsUInt32Number) != 4) return 0; if (sizeof(cmsInt32Number) != 4) return 0; if (sizeof(cmsUInt64Number) != 8) return 0; if (sizeof(cmsInt64Number) != 8) return 0; if (sizeof(cmsFloat32Number) != 4) return 0; if (sizeof(cmsFloat64Number) != 8) return 0; if (sizeof(cmsSignature) != 4) return 0; if (sizeof(cmsU8Fixed8Number) != 2) return 0; if (sizeof(cmsS15Fixed16Number) != 4) return 0; if (sizeof(cmsU16Fixed16Number) != 4) return 0; return 1; } // ------------------------------------------------------------------------------------------------- // Are we little or big endian? From Harbison&Steele. static cmsInt32Number CheckEndianness(void) { cmsInt32Number BigEndian, IsOk; union { long l; char c[sizeof (long)]; } u; u.l = 1; BigEndian = (u.c[sizeof (long) - 1] == 1); #ifdef CMS_USE_BIG_ENDIAN IsOk = BigEndian; #else IsOk = !BigEndian; #endif if (!IsOk) { Die("\nOOOPPSS! You have CMS_USE_BIG_ENDIAN toggle misconfigured!\n\n" "Please, edit lcms2.h and %s the CMS_USE_BIG_ENDIAN toggle.\n", BigEndian? "uncomment" : "comment"); return 0; } return 1; } // Check quick floor static cmsInt32Number CheckQuickFloor(void) { if ((_cmsQuickFloor(1.234) != 1) || (_cmsQuickFloor(32767.234) != 32767) || (_cmsQuickFloor(-1.234) != -2) || (_cmsQuickFloor(-32767.1) != -32768)) { Die("\nOOOPPSS! _cmsQuickFloor() does not work as expected in your machine!\n\n" "Please, edit lcms2.h and uncomment the CMS_DONT_USE_FAST_FLOOR toggle.\n"); return 0; } return 1; } // Quick floor restricted to word static cmsInt32Number CheckQuickFloorWord(void) { cmsUInt32Number i; for (i=0; i < 65535; i++) { if (_cmsQuickFloorWord((cmsFloat64Number) i + 0.1234) != i) { Die("\nOOOPPSS! _cmsQuickFloorWord() does not work as expected in your machine!\n\n" "Please, edit lcms2.h and uncomment the CMS_DONT_USE_FAST_FLOOR toggle.\n"); return 0; } } return 1; } // ------------------------------------------------------------------------------------------------- // Precision stuff. // On 15.16 fixed point, this is the maximum we can obtain. Remember ICC profiles have storage limits on this number #define FIXED_PRECISION_15_16 (1.0 / 65535.0) // On 8.8 fixed point, that is the max we can obtain. #define FIXED_PRECISION_8_8 (1.0 / 255.0) // On cmsFloat32Number type, this is the precision we expect #define FLOAT_PRECISSION (0.00001) static cmsFloat64Number MaxErr; cmsBool IsGoodVal(const char *title, cmsFloat64Number in, cmsFloat64Number out, cmsFloat64Number max) { cmsFloat64Number Err = fabs(in - out); if (Err > MaxErr) MaxErr = Err; if ((Err > max )) { Fail("(%s): Must be %f, But is %f ", title, in, out); return FALSE; } return TRUE; } cmsBool IsGoodFixed15_16(const char *title, cmsFloat64Number in, cmsFloat64Number out) { return IsGoodVal(title, in, out, FIXED_PRECISION_15_16); } cmsBool IsGoodFixed8_8(const char *title, cmsFloat64Number in, cmsFloat64Number out) { return IsGoodVal(title, in, out, FIXED_PRECISION_8_8); } cmsBool IsGoodWord(const char *title, cmsUInt16Number in, cmsUInt16Number out) { if ((abs(in - out) > 0 )) { Fail("(%s): Must be %x, But is %x ", title, in, out); return FALSE; } return TRUE; } cmsBool IsGoodWordPrec(const char *title, cmsUInt16Number in, cmsUInt16Number out, cmsUInt16Number maxErr) { if ((abs(in - out) > maxErr )) { Fail("(%s): Must be %x, But is %x ", title, in, out); return FALSE; } return TRUE; } // Fixed point ---------------------------------------------------------------------------------------------- static cmsInt32Number TestSingleFixed15_16(cmsFloat64Number d) { cmsS15Fixed16Number f = _cmsDoubleTo15Fixed16(d); cmsFloat64Number RoundTrip = _cms15Fixed16toDouble(f); cmsFloat64Number Error = fabs(d - RoundTrip); return ( Error <= FIXED_PRECISION_15_16); } static cmsInt32Number CheckFixedPoint15_16(void) { if (!TestSingleFixed15_16(1.0)) return 0; if (!TestSingleFixed15_16(2.0)) return 0; if (!TestSingleFixed15_16(1.23456)) return 0; if (!TestSingleFixed15_16(0.99999)) return 0; if (!TestSingleFixed15_16(0.1234567890123456789099999)) return 0; if (!TestSingleFixed15_16(-1.0)) return 0; if (!TestSingleFixed15_16(-2.0)) return 0; if (!TestSingleFixed15_16(-1.23456)) return 0; if (!TestSingleFixed15_16(-1.1234567890123456789099999)) return 0; if (!TestSingleFixed15_16(+32767.1234567890123456789099999)) return 0; if (!TestSingleFixed15_16(-32767.1234567890123456789099999)) return 0; return 1; } static cmsInt32Number TestSingleFixed8_8(cmsFloat64Number d) { cmsS15Fixed16Number f = _cmsDoubleTo8Fixed8(d); cmsFloat64Number RoundTrip = _cms8Fixed8toDouble((cmsUInt16Number) f); cmsFloat64Number Error = fabs(d - RoundTrip); return ( Error <= FIXED_PRECISION_8_8); } static cmsInt32Number CheckFixedPoint8_8(void) { if (!TestSingleFixed8_8(1.0)) return 0; if (!TestSingleFixed8_8(2.0)) return 0; if (!TestSingleFixed8_8(1.23456)) return 0; if (!TestSingleFixed8_8(0.99999)) return 0; if (!TestSingleFixed8_8(0.1234567890123456789099999)) return 0; if (!TestSingleFixed8_8(+255.1234567890123456789099999)) return 0; return 1; } // D50 constant -------------------------------------------------------------------------------------------- static cmsInt32Number CheckD50Roundtrip(void) { cmsFloat64Number cmsD50X_2 = 0.96420288; cmsFloat64Number cmsD50Y_2 = 1.0; cmsFloat64Number cmsD50Z_2 = 0.82490540; cmsS15Fixed16Number xe = _cmsDoubleTo15Fixed16(cmsD50X); cmsS15Fixed16Number ye = _cmsDoubleTo15Fixed16(cmsD50Y); cmsS15Fixed16Number ze = _cmsDoubleTo15Fixed16(cmsD50Z); cmsFloat64Number x = _cms15Fixed16toDouble(xe); cmsFloat64Number y = _cms15Fixed16toDouble(ye); cmsFloat64Number z = _cms15Fixed16toDouble(ze); double dx = fabs(cmsD50X - x); double dy = fabs(cmsD50Y - y); double dz = fabs(cmsD50Z - z); double euc = sqrt(dx*dx + dy*dy + dz* dz); if (euc > 1E-5) { Fail("D50 roundtrip |err| > (%f) ", euc); return 0; } xe = _cmsDoubleTo15Fixed16(cmsD50X_2); ye = _cmsDoubleTo15Fixed16(cmsD50Y_2); ze = _cmsDoubleTo15Fixed16(cmsD50Z_2); x = _cms15Fixed16toDouble(xe); y = _cms15Fixed16toDouble(ye); z = _cms15Fixed16toDouble(ze); dx = fabs(cmsD50X_2 - x); dy = fabs(cmsD50Y_2 - y); dz = fabs(cmsD50Z_2 - z); euc = sqrt(dx*dx + dy*dy + dz* dz); if (euc > 1E-5) { Fail("D50 roundtrip |err| > (%f) ", euc); return 0; } return 1; } // Linear interpolation ----------------------------------------------------------------------------------------------- // Since prime factors of 65535 (FFFF) are, // // 0xFFFF = 3 * 5 * 17 * 257 // // I test tables of 2, 4, 6, and 18 points, that will be exact. static void BuildTable(cmsInt32Number n, cmsUInt16Number Tab[], cmsBool Descending) { cmsInt32Number i; for (i=0; i < n; i++) { cmsFloat64Number v = (cmsFloat64Number) ((cmsFloat64Number) 65535.0 * i ) / (n-1); Tab[Descending ? (n - i - 1) : i ] = (cmsUInt16Number) floor(v + 0.5); } } // A single function that does check 1D interpolation // nNodesToCheck = number on nodes to check // Down = Create decreasing tables // Reverse = Check reverse interpolation // max_err = max allowed error static cmsInt32Number Check1D(cmsInt32Number nNodesToCheck, cmsBool Down, cmsInt32Number max_err) { cmsUInt32Number i; cmsUInt16Number in, out; cmsInterpParams* p; cmsUInt16Number* Tab; Tab = (cmsUInt16Number*) chknull(malloc(sizeof(cmsUInt16Number)* nNodesToCheck)); if (Tab == NULL) return 0; p = _cmsComputeInterpParams(DbgThread(), nNodesToCheck, 1, 1, Tab, CMS_LERP_FLAGS_16BITS); if (p == NULL) return 0; BuildTable(nNodesToCheck, Tab, Down); for (i=0; i <= 0xffff; i++) { in = (cmsUInt16Number) i; out = 0; p ->Interpolation.Lerp16(&in, &out, p); if (Down) out = 0xffff - out; if (abs(out - in) > max_err) { Fail("(%dp): Must be %x, But is %x : ", nNodesToCheck, in, out); _cmsFreeInterpParams(p); free(Tab); return 0; } } _cmsFreeInterpParams(p); free(Tab); return 1; } static cmsInt32Number Check1DLERP2(void) { return Check1D(2, FALSE, 0); } static cmsInt32Number Check1DLERP3(void) { return Check1D(3, FALSE, 1); } static cmsInt32Number Check1DLERP4(void) { return Check1D(4, FALSE, 0); } static cmsInt32Number Check1DLERP6(void) { return Check1D(6, FALSE, 0); } static cmsInt32Number Check1DLERP18(void) { return Check1D(18, FALSE, 0); } static cmsInt32Number Check1DLERP2Down(void) { return Check1D(2, TRUE, 0); } static cmsInt32Number Check1DLERP3Down(void) { return Check1D(3, TRUE, 1); } static cmsInt32Number Check1DLERP6Down(void) { return Check1D(6, TRUE, 0); } static cmsInt32Number Check1DLERP18Down(void) { return Check1D(18, TRUE, 0); } static cmsInt32Number ExhaustiveCheck1DLERP(void) { cmsUInt32Number j; printf("\n"); for (j=10; j <= 4096; j++) { if ((j % 10) == 0) printf("%u \r", j); if (!Check1D(j, FALSE, 1)) return 0; } printf("\rResult is "); return 1; } static cmsInt32Number ExhaustiveCheck1DLERPDown(void) { cmsUInt32Number j; printf("\n"); for (j=10; j <= 4096; j++) { if ((j % 10) == 0) printf("%u \r", j); if (!Check1D(j, TRUE, 1)) return 0; } printf("\rResult is "); return 1; } // 3D interpolation ------------------------------------------------------------------------------------------------- static cmsInt32Number Check3DinterpolationFloatTetrahedral(void) { cmsInterpParams* p; cmsInt32Number i; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsFloat32Number) ( (cmsFloat32Number) i / 65535.0F); p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number Check3DinterpolationFloatTrilinear(void) { cmsInterpParams* p; cmsInt32Number i; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT|CMS_LERP_FLAGS_TRILINEAR); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsFloat32Number) ( (cmsFloat32Number) i / 65535.0F); p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number Check3DinterpolationTetrahedral16(void) { cmsInterpParams* p; cmsInt32Number i; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_16BITS); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsUInt16Number) i; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number Check3DinterpolationTrilinear16(void) { cmsInterpParams* p; cmsInt32Number i; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_TRILINEAR); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsUInt16Number) i; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExaustiveCheck3DinterpolationFloatTetrahedral(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT); MaxErr = 0.0; for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsFloat32Number) r / 255.0F; In[1] = (cmsFloat32Number) g / 255.0F; In[2] = (cmsFloat32Number) b / 255.0F; p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExaustiveCheck3DinterpolationFloatTrilinear(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT|CMS_LERP_FLAGS_TRILINEAR); MaxErr = 0.0; for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsFloat32Number) r / 255.0F; In[1] = (cmsFloat32Number) g / 255.0F; In[2] = (cmsFloat32Number) b / 255.0F; p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExhaustiveCheck3DinterpolationTetrahedral16(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_16BITS); for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsUInt16Number) r ; In[1] = (cmsUInt16Number) g ; In[2] = (cmsUInt16Number) b ; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExhaustiveCheck3DinterpolationTrilinear16(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_TRILINEAR); for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsUInt16Number) r ; In[1] = (cmsUInt16Number)g ; In[2] = (cmsUInt16Number)b ; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } // Check reverse interpolation on LUTS. This is right now exclusively used by K preservation algorithm static cmsInt32Number CheckReverseInterpolation3x3(void) { cmsPipeline* Lut; cmsStage* clut; cmsFloat32Number Target[4], Result[4], Hint[4]; cmsFloat32Number err, max; cmsInt32Number i; cmsUInt16Number Table[] = { 0, 0, 0, // 0 0 0 0, 0, 0xffff, // 0 0 1 0, 0xffff, 0, // 0 1 0 0, 0xffff, 0xffff, // 0 1 1 0xffff, 0, 0, // 1 0 0 0xffff, 0, 0xffff, // 1 0 1 0xffff, 0xffff, 0, // 1 1 0 0xffff, 0xffff, 0xffff, // 1 1 1 }; Lut = cmsPipelineAlloc(DbgThread(), 3, 3); clut = cmsStageAllocCLut16bit(DbgThread(), 2, 3, 3, Table); cmsPipelineInsertStage(Lut, cmsAT_BEGIN, clut); Target[0] = 0; Target[1] = 0; Target[2] = 0; Hint[0] = 0; Hint[1] = 0; Hint[2] = 0; cmsPipelineEvalReverseFloat(Target, Result, NULL, Lut); if (Result[0] != 0 || Result[1] != 0 || Result[2] != 0){ Fail("Reverse interpolation didn't find zero"); goto Error; } // Transverse identity max = 0; for (i=0; i <= 100; i++) { cmsFloat32Number in = i / 100.0F; Target[0] = in; Target[1] = 0; Target[2] = 0; cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); err = fabsf(in - Result[0]); if (err > max) max = err; memcpy(Hint, Result, sizeof(Hint)); } cmsPipelineFree(Lut); return (max <= FLOAT_PRECISSION); Error: cmsPipelineFree(Lut); return 0; } static cmsInt32Number CheckReverseInterpolation4x3(void) { cmsPipeline* Lut; cmsStage* clut; cmsFloat32Number Target[4], Result[4], Hint[4]; cmsFloat32Number err, max; cmsInt32Number i; // 4 -> 3, output gets 3 first channels copied cmsUInt16Number Table[] = { 0, 0, 0, // 0 0 0 0 = ( 0, 0, 0) 0, 0, 0, // 0 0 0 1 = ( 0, 0, 0) 0, 0, 0xffff, // 0 0 1 0 = ( 0, 0, 1) 0, 0, 0xffff, // 0 0 1 1 = ( 0, 0, 1) 0, 0xffff, 0, // 0 1 0 0 = ( 0, 1, 0) 0, 0xffff, 0, // 0 1 0 1 = ( 0, 1, 0) 0, 0xffff, 0xffff, // 0 1 1 0 = ( 0, 1, 1) 0, 0xffff, 0xffff, // 0 1 1 1 = ( 0, 1, 1) 0xffff, 0, 0, // 1 0 0 0 = ( 1, 0, 0) 0xffff, 0, 0, // 1 0 0 1 = ( 1, 0, 0) 0xffff, 0, 0xffff, // 1 0 1 0 = ( 1, 0, 1) 0xffff, 0, 0xffff, // 1 0 1 1 = ( 1, 0, 1) 0xffff, 0xffff, 0, // 1 1 0 0 = ( 1, 1, 0) 0xffff, 0xffff, 0, // 1 1 0 1 = ( 1, 1, 0) 0xffff, 0xffff, 0xffff, // 1 1 1 0 = ( 1, 1, 1) 0xffff, 0xffff, 0xffff, // 1 1 1 1 = ( 1, 1, 1) }; Lut = cmsPipelineAlloc(DbgThread(), 4, 3); clut = cmsStageAllocCLut16bit(DbgThread(), 2, 4, 3, Table); cmsPipelineInsertStage(Lut, cmsAT_BEGIN, clut); // Check if the LUT is behaving as expected SubTest("4->3 feasibility"); for (i=0; i <= 100; i++) { Target[0] = i / 100.0F; Target[1] = Target[0]; Target[2] = 0; Target[3] = 12; cmsPipelineEvalFloat(Target, Result, Lut); if (!IsGoodFixed15_16("0", Target[0], Result[0])) goto Error; if (!IsGoodFixed15_16("1", Target[1], Result[1])) goto Error; if (!IsGoodFixed15_16("2", Target[2], Result[2])) goto Error; } SubTest("4->3 zero"); Target[0] = 0; Target[1] = 0; Target[2] = 0; // This one holds the fixed K Target[3] = 0; // This is our hint (which is a big lie in this case) Hint[0] = 0.1F; Hint[1] = 0.1F; Hint[2] = 0.1F; cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); if (Result[0] != 0 || Result[1] != 0 || Result[2] != 0 || Result[3] != 0){ Fail("Reverse interpolation didn't find zero"); goto Error; } SubTest("4->3 find CMY"); max = 0; for (i=0; i <= 100; i++) { cmsFloat32Number in = i / 100.0F; Target[0] = in; Target[1] = 0; Target[2] = 0; cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); err = fabsf(in - Result[0]); if (err > max) max = err; memcpy(Hint, Result, sizeof(Hint)); } cmsPipelineFree(Lut); return (max <= FLOAT_PRECISSION); Error: cmsPipelineFree(Lut); return 0; } // Check all interpolation. static cmsUInt16Number Fn8D1(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, cmsUInt32Number m) { return (cmsUInt16Number) ((a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8) / m); } static cmsUInt16Number Fn8D2(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, cmsUInt32Number m) { return (cmsUInt16Number) ((a1 + 3* a2 + 3* a3 + a4 + a5 + a6 + a7 + a8 ) / (m + 4)); } static cmsUInt16Number Fn8D3(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, cmsUInt32Number m) { return (cmsUInt16Number) ((3*a1 + 2*a2 + 3*a3 + a4 + a5 + a6 + a7 + a8) / (m + 5)); } static cmsInt32Number Sampler3D(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); Out[1] = Fn8D2(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); Out[2] = Fn8D3(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler4D(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler5D(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler6D(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler7D(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler8D(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsBool CheckOne3D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3) { cmsUInt16Number In[3], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler3D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne4D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4) { cmsUInt16Number In[4], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler4D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne5D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5) { cmsUInt16Number In[5], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler5D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne6D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6) { cmsUInt16Number In[6], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler6D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne7D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7) { cmsUInt16Number In[7], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; In[6] = a7; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler7D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne8D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8) { cmsUInt16Number In[8], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; In[6] = a7; In[7] = a8; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler8D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsInt32Number Check3Dinterp(void) { cmsPipeline* lut; cmsStage* mpe; lut = cmsPipelineAlloc(DbgThread(), 3, 3); mpe = cmsStageAllocCLut16bit(DbgThread(), 9, 3, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler3D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne3D(lut, 0, 0, 0)) return 0; if (!CheckOne3D(lut, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne3D(lut, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne3D(lut, 0x0000, 0xFE00, 0x80FF)) return 0; if (!CheckOne3D(lut, 0x1111, 0x2222, 0x3333)) return 0; if (!CheckOne3D(lut, 0x0000, 0x0012, 0x0013)) return 0; if (!CheckOne3D(lut, 0x3141, 0x1415, 0x1592)) return 0; if (!CheckOne3D(lut, 0xFF00, 0xFF01, 0xFF12)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check3DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 7, 8, 9 }; lut = cmsPipelineAlloc(DbgThread(), 3, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 3, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler3D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne3D(lut, 0, 0, 0)) return 0; if (!CheckOne3D(lut, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne3D(lut, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne3D(lut, 0x0000, 0xFE00, 0x80FF)) return 0; if (!CheckOne3D(lut, 0x1111, 0x2222, 0x3333)) return 0; if (!CheckOne3D(lut, 0x0000, 0x0012, 0x0013)) return 0; if (!CheckOne3D(lut, 0x3141, 0x1415, 0x1592)) return 0; if (!CheckOne3D(lut, 0xFF00, 0xFF01, 0xFF12)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check4Dinterp(void) { cmsPipeline* lut; cmsStage* mpe; lut = cmsPipelineAlloc(DbgThread(), 4, 3); mpe = cmsStageAllocCLut16bit(DbgThread(), 9, 4, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler4D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne4D(lut, 0, 0, 0, 0)) return 0; if (!CheckOne4D(lut, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne4D(lut, 0x8080, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne4D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888)) return 0; if (!CheckOne4D(lut, 0x1111, 0x2222, 0x3333, 0x4444)) return 0; if (!CheckOne4D(lut, 0x0000, 0x0012, 0x0013, 0x0014)) return 0; if (!CheckOne4D(lut, 0x3141, 0x1415, 0x1592, 0x9261)) return 0; if (!CheckOne4D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check4DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 9, 8, 7, 6 }; lut = cmsPipelineAlloc(DbgThread(), 4, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 4, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler4D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne4D(lut, 0, 0, 0, 0)) return 0; if (!CheckOne4D(lut, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne4D(lut, 0x8080, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne4D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888)) return 0; if (!CheckOne4D(lut, 0x1111, 0x2222, 0x3333, 0x4444)) return 0; if (!CheckOne4D(lut, 0x0000, 0x0012, 0x0013, 0x0014)) return 0; if (!CheckOne4D(lut, 0x3141, 0x1415, 0x1592, 0x9261)) return 0; if (!CheckOne4D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check5DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 3, 2, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 5, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 5, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler5D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne5D(lut, 0, 0, 0, 0, 0)) return 0; if (!CheckOne5D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne5D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234)) return 0; if (!CheckOne5D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078)) return 0; if (!CheckOne5D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455)) return 0; if (!CheckOne5D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333)) return 0; if (!CheckOne5D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567)) return 0; if (!CheckOne5D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check6DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 6, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 6, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler6D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne6D(lut, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOne6D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne6D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122)) return 0; if (!CheckOne6D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233)) return 0; if (!CheckOne6D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344)) return 0; if (!CheckOne6D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455)) return 0; if (!CheckOne6D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566)) return 0; if (!CheckOne6D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check7DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 7, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 7, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler7D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne7D(lut, 0, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOne7D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne7D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122, 0x0056)) return 0; if (!CheckOne7D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233, 0x0088)) return 0; if (!CheckOne7D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344, 0x1987)) return 0; if (!CheckOne7D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455, 0x9988)) return 0; if (!CheckOne7D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566, 0xfe56)) return 0; if (!CheckOne7D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677, 0xbabe)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check8DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 8, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 8, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler8D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne8D(lut, 0, 0, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOne8D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne8D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122, 0x0056, 0x0011)) return 0; if (!CheckOne8D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233, 0x0088, 0x2020)) return 0; if (!CheckOne8D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344, 0x1987, 0x4532)) return 0; if (!CheckOne8D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455, 0x9988, 0x1200)) return 0; if (!CheckOne8D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566, 0xfe56, 0x6666)) return 0; if (!CheckOne8D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677, 0xbabe, 0xface)) return 0; cmsPipelineFree(lut); return 1; } // Colorimetric conversions ------------------------------------------------------------------------------------------------- // Lab to LCh and back should be performed at 1E-12 accuracy at least static cmsInt32Number CheckLab2LCh(void) { cmsInt32Number l, a, b; cmsFloat64Number dist, Max = 0; cmsCIELab Lab, Lab2; cmsCIELCh LCh; for (l=0; l <= 100; l += 10) { for (a=-128; a <= +128; a += 8) { for (b=-128; b <= 128; b += 8) { Lab.L = l; Lab.a = a; Lab.b = b; cmsLab2LCh(&LCh, &Lab); cmsLCh2Lab(&Lab2, &LCh); dist = cmsDeltaE(&Lab, &Lab2); if (dist > Max) Max = dist; } } } return Max < 1E-12; } // Lab to LCh and back should be performed at 1E-12 accuracy at least static cmsInt32Number CheckLab2XYZ(void) { cmsInt32Number l, a, b; cmsFloat64Number dist, Max = 0; cmsCIELab Lab, Lab2; cmsCIEXYZ XYZ; for (l=0; l <= 100; l += 10) { for (a=-128; a <= +128; a += 8) { for (b=-128; b <= 128; b += 8) { Lab.L = l; Lab.a = a; Lab.b = b; cmsLab2XYZ(NULL, &XYZ, &Lab); cmsXYZ2Lab(NULL, &Lab2, &XYZ); dist = cmsDeltaE(&Lab, &Lab2); if (dist > Max) Max = dist; } } } return Max < 1E-12; } // Lab to xyY and back should be performed at 1E-12 accuracy at least static cmsInt32Number CheckLab2xyY(void) { cmsInt32Number l, a, b; cmsFloat64Number dist, Max = 0; cmsCIELab Lab, Lab2; cmsCIEXYZ XYZ; cmsCIExyY xyY; for (l=0; l <= 100; l += 10) { for (a=-128; a <= +128; a += 8) { for (b=-128; b <= 128; b += 8) { Lab.L = l; Lab.a = a; Lab.b = b; cmsLab2XYZ(NULL, &XYZ, &Lab); cmsXYZ2xyY(&xyY, &XYZ); cmsxyY2XYZ(&XYZ, &xyY); cmsXYZ2Lab(NULL, &Lab2, &XYZ); dist = cmsDeltaE(&Lab, &Lab2); if (dist > Max) Max = dist; } } } return Max < 1E-12; } static cmsInt32Number CheckLabV2encoding(void) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[3], aw[3]; cmsCIELab Lab; n2=0; for (j=0; j < 65535; j++) { Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; cmsLabEncoded2FloatV2(&Lab, Inw); cmsFloat2LabEncodedV2(aw, &Lab); for (i=0; i < 3; i++) { if (aw[i] != j) { n2++; } } } return (n2 == 0); } static cmsInt32Number CheckLabV4encoding(void) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[3], aw[3]; cmsCIELab Lab; n2=0; for (j=0; j < 65535; j++) { Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; cmsLabEncoded2Float(&Lab, Inw); cmsFloat2LabEncoded(aw, &Lab); for (i=0; i < 3; i++) { if (aw[i] != j) { n2++; } } } return (n2 == 0); } // BlackBody ----------------------------------------------------------------------------------------------------- static cmsInt32Number CheckTemp2CHRM(void) { cmsInt32Number j; cmsFloat64Number d, v, Max = 0; cmsCIExyY White; for (j=4000; j < 25000; j++) { cmsWhitePointFromTemp(&White, j); if (!cmsTempFromWhitePoint(&v, &White)) return 0; d = fabs(v - j); if (d > Max) Max = d; } // 100 degree is the actual resolution return (Max < 100); } // Tone curves ----------------------------------------------------------------------------------------------------- static cmsInt32Number CheckGammaEstimation(cmsToneCurve* c, cmsFloat64Number g) { cmsFloat64Number est = cmsEstimateGamma(c, 0.001); SubTest("Gamma estimation"); if (fabs(est - g) > 0.001) return 0; return 1; } static cmsInt32Number CheckGammaCreation16(void) { cmsToneCurve* LinGamma = cmsBuildGamma(DbgThread(), 1.0); cmsInt32Number i; cmsUInt16Number in, out; for (i=0; i < 0xffff; i++) { in = (cmsUInt16Number) i; out = cmsEvalToneCurve16(LinGamma, in); if (in != out) { Fail("(lin gamma): Must be %x, But is %x : ", in, out); cmsFreeToneCurve(LinGamma); return 0; } } if (!CheckGammaEstimation(LinGamma, 1.0)) return 0; cmsFreeToneCurve(LinGamma); return 1; } static cmsInt32Number CheckGammaCreationFlt(void) { cmsToneCurve* LinGamma = cmsBuildGamma(DbgThread(), 1.0); cmsInt32Number i; cmsFloat32Number in, out; for (i=0; i < 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(LinGamma, in); if (fabs(in - out) > (1/65535.0)) { Fail("(lin gamma): Must be %f, But is %f : ", in, out); cmsFreeToneCurve(LinGamma); return 0; } } if (!CheckGammaEstimation(LinGamma, 1.0)) return 0; cmsFreeToneCurve(LinGamma); return 1; } // Curve curves using a single power function // Error is given in 0..ffff counts static cmsInt32Number CheckGammaFloat(cmsFloat64Number g) { cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), g); cmsInt32Number i; cmsFloat32Number in, out; cmsFloat64Number val, Err; MaxErr = 0.0; for (i=0; i < 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(Curve, in); val = pow((cmsFloat64Number) in, g); Err = fabs( val - out); if (Err > MaxErr) MaxErr = Err; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); if (!CheckGammaEstimation(Curve, g)) return 0; cmsFreeToneCurve(Curve); return 1; } static cmsInt32Number CheckGamma18(void) { return CheckGammaFloat(1.8); } static cmsInt32Number CheckGamma22(void) { return CheckGammaFloat(2.2); } static cmsInt32Number CheckGamma30(void) { return CheckGammaFloat(3.0); } // Check table-based gamma functions static cmsInt32Number CheckGammaFloatTable(cmsFloat64Number g) { cmsFloat32Number Values[1025]; cmsToneCurve* Curve; cmsInt32Number i; cmsFloat32Number in, out; cmsFloat64Number val, Err; for (i=0; i <= 1024; i++) { in = (cmsFloat32Number) (i / 1024.0); Values[i] = powf(in, (float) g); } Curve = cmsBuildTabulatedToneCurveFloat(DbgThread(), 1025, Values); MaxErr = 0.0; for (i=0; i <= 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(Curve, in); val = pow(in, g); Err = fabs(val - out); if (Err > MaxErr) MaxErr = Err; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); if (!CheckGammaEstimation(Curve, g)) return 0; cmsFreeToneCurve(Curve); return 1; } static cmsInt32Number CheckGamma18Table(void) { return CheckGammaFloatTable(1.8); } static cmsInt32Number CheckGamma22Table(void) { return CheckGammaFloatTable(2.2); } static cmsInt32Number CheckGamma30Table(void) { return CheckGammaFloatTable(3.0); } // Create a curve from a table (which is a pure gamma function) and check it against the pow function. static cmsInt32Number CheckGammaWordTable(cmsFloat64Number g) { cmsUInt16Number Values[1025]; cmsToneCurve* Curve; cmsInt32Number i; cmsFloat32Number in, out; cmsFloat64Number val, Err; for (i=0; i <= 1024; i++) { in = (cmsFloat32Number) (i / 1024.0); Values[i] = (cmsUInt16Number) floor(pow(in, g) * 65535.0 + 0.5); } Curve = cmsBuildTabulatedToneCurve16(DbgThread(), 1025, Values); MaxErr = 0.0; for (i=0; i <= 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(Curve, in); val = pow(in, g); Err = fabs(val - out); if (Err > MaxErr) MaxErr = Err; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); if (!CheckGammaEstimation(Curve, g)) return 0; cmsFreeToneCurve(Curve); return 1; } static cmsInt32Number CheckGamma18TableWord(void) { return CheckGammaWordTable(1.8); } static cmsInt32Number CheckGamma22TableWord(void) { return CheckGammaWordTable(2.2); } static cmsInt32Number CheckGamma30TableWord(void) { return CheckGammaWordTable(3.0); } // Curve joining test. Joining two high-gamma of 3.0 curves should // give something like linear static cmsInt32Number CheckJointCurves(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsBool rc; Forward = cmsBuildGamma(DbgThread(), 3.0); Reverse = cmsBuildGamma(DbgThread(), 3.0); Result = cmsJoinToneCurve(DbgThread(), Forward, Reverse, 256); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); if (!rc) Fail("Joining same curve twice does not result in a linear ramp"); return rc; } #if 0 // Create a gamma curve by cheating the table static cmsToneCurve* GammaTableLinear(cmsInt32Number nEntries, cmsBool Dir) { cmsInt32Number i; cmsToneCurve* g = cmsBuildTabulatedToneCurve16(DbgThread(), nEntries, NULL); for (i=0; i < nEntries; i++) { cmsInt32Number v = _cmsQuantizeVal(i, nEntries); if (Dir) g->Table16[i] = (cmsUInt16Number) v; else g->Table16[i] = (cmsUInt16Number) (0xFFFF - v); } return g; } #endif static cmsInt32Number CheckJointCurvesDescending(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsInt32Number i, rc; Forward = cmsBuildGamma(DbgThread(), 2.2); // Fake the curve to be table-based for (i=0; i < 4096; i++) Forward ->Table16[i] = 0xffff - Forward->Table16[i]; Forward ->Segments[0].Type = 0; Reverse = cmsReverseToneCurve(Forward); Result = cmsJoinToneCurve(DbgThread(), Reverse, Reverse, 256); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } static cmsInt32Number CheckFToneCurvePoint(cmsToneCurve* c, cmsUInt16Number Point, cmsInt32Number Value) { cmsInt32Number Result; Result = cmsEvalToneCurve16(c, Point); return (abs(Value - Result) < 2); } static cmsInt32Number CheckReverseDegenerated(void) { cmsToneCurve* p, *g; cmsUInt16Number Tab[16]; Tab[0] = 0; Tab[1] = 0; Tab[2] = 0; Tab[3] = 0; Tab[4] = 0; Tab[5] = 0x5555; Tab[6] = 0x6666; Tab[7] = 0x7777; Tab[8] = 0x8888; Tab[9] = 0x9999; Tab[10]= 0xffff; Tab[11]= 0xffff; Tab[12]= 0xffff; Tab[13]= 0xffff; Tab[14]= 0xffff; Tab[15]= 0xffff; p = cmsBuildTabulatedToneCurve16(DbgThread(), 16, Tab); g = cmsReverseToneCurve(p); // Now let's check some points if (!CheckFToneCurvePoint(g, 0x5555, 0x5555)) return 0; if (!CheckFToneCurvePoint(g, 0x7777, 0x7777)) return 0; // First point for zero if (!CheckFToneCurvePoint(g, 0x0000, 0x4444)) return 0; // Last point if (!CheckFToneCurvePoint(g, 0xFFFF, 0xFFFF)) return 0; cmsFreeToneCurve(p); cmsFreeToneCurve(g); return 1; } // Build a parametric sRGB-like curve static cmsToneCurve* Build_sRGBGamma(void) { cmsFloat64Number Parameters[5]; Parameters[0] = 2.4; Parameters[1] = 1. / 1.055; Parameters[2] = 0.055 / 1.055; Parameters[3] = 1. / 12.92; Parameters[4] = 0.04045; // d return cmsBuildParametricToneCurve(DbgThread(), 4, Parameters); } // Join two gamma tables in floating point format. Result should be a straight line static cmsToneCurve* CombineGammaFloat(cmsToneCurve* g1, cmsToneCurve* g2) { cmsUInt16Number Tab[256]; cmsFloat32Number f; cmsInt32Number i; for (i=0; i < 256; i++) { f = (cmsFloat32Number) i / 255.0F; f = cmsEvalToneCurveFloat(g2, cmsEvalToneCurveFloat(g1, f)); Tab[i] = (cmsUInt16Number) floor(f * 65535.0 + 0.5); } return cmsBuildTabulatedToneCurve16(DbgThread(), 256, Tab); } // Same of anterior, but using quantized tables static cmsToneCurve* CombineGamma16(cmsToneCurve* g1, cmsToneCurve* g2) { cmsUInt16Number Tab[256]; cmsInt32Number i; for (i=0; i < 256; i++) { cmsUInt16Number wValIn; wValIn = _cmsQuantizeVal(i, 256); Tab[i] = cmsEvalToneCurve16(g2, cmsEvalToneCurve16(g1, wValIn)); } return cmsBuildTabulatedToneCurve16(DbgThread(), 256, Tab); } static cmsInt32Number CheckJointFloatCurves_sRGB(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsBool rc; Forward = Build_sRGBGamma(); Reverse = cmsReverseToneCurve(Forward); Result = CombineGammaFloat(Forward, Reverse); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } static cmsInt32Number CheckJoint16Curves_sRGB(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsBool rc; Forward = Build_sRGBGamma(); Reverse = cmsReverseToneCurve(Forward); Result = CombineGamma16(Forward, Reverse); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } // sigmoidal curve f(x) = (1-x^g) ^(1/g) static cmsInt32Number CheckJointCurvesSShaped(void) { cmsFloat64Number p = 3.2; cmsToneCurve *Forward, *Reverse, *Result; cmsInt32Number rc; Forward = cmsBuildParametricToneCurve(DbgThread(), 108, &p); Reverse = cmsReverseToneCurve(Forward); Result = cmsJoinToneCurve(DbgThread(), Forward, Forward, 4096); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } // -------------------------------------------------------------------------------------------------------- // Implementation of some tone curve functions static cmsFloat32Number Gamma(cmsFloat32Number x, const cmsFloat64Number Params[]) { return (cmsFloat32Number) pow(x, Params[0]); } static cmsFloat32Number CIE122(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; if (x >= -Params[2] / Params[1]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = 0; return (cmsFloat32Number) Val; } static cmsFloat32Number IEC61966_3(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; if (x >= -Params[2] / Params[1]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[3]; else Val = 0; } else Val = Params[3]; return (cmsFloat32Number) Val; } static cmsFloat32Number IEC61966_21(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; if (x >= Params[4]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = x * Params[3]; return (cmsFloat32Number) Val; } static cmsFloat32Number param_5(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; // Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | else if (x >= Params[4]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[5]; else Val = 0; } else Val = x*Params[3] + Params[6]; return (cmsFloat32Number) Val; } static cmsFloat32Number param_6(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[3]; else Val = 0; return (cmsFloat32Number) Val; } static cmsFloat32Number param_7(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number Val; Val = Params[1]*log10(Params[2] * pow(x, Params[0]) + Params[3]) + Params[4]; return (cmsFloat32Number) Val; } static cmsFloat32Number param_8(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number Val; Val = (Params[0] * pow(Params[1], Params[2] * x + Params[3]) + Params[4]); return (cmsFloat32Number) Val; } static cmsFloat32Number sigmoidal(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number Val; Val = pow(1.0 - pow(1 - x, 1/Params[0]), 1/Params[0]); return (cmsFloat32Number) Val; } static cmsBool CheckSingleParametric(const char* Name, dblfnptr fn, cmsInt32Number Type, const cmsFloat64Number Params[]) { cmsInt32Number i; cmsToneCurve* tc; cmsToneCurve* tc_1; char InverseText[256]; tc = cmsBuildParametricToneCurve(DbgThread(), Type, Params); tc_1 = cmsBuildParametricToneCurve(DbgThread(), -Type, Params); for (i=0; i <= 1000; i++) { cmsFloat32Number x = (cmsFloat32Number) i / 1000; cmsFloat32Number y_fn, y_param, x_param, y_param2; y_fn = fn(x, Params); y_param = cmsEvalToneCurveFloat(tc, x); x_param = cmsEvalToneCurveFloat(tc_1, y_param); y_param2 = fn(x_param, Params); if (!IsGoodVal(Name, y_fn, y_param, FIXED_PRECISION_15_16)) goto Error; sprintf(InverseText, "Inverse %s", Name); if (!IsGoodVal(InverseText, y_fn, y_param2, FIXED_PRECISION_15_16)) goto Error; } cmsFreeToneCurve(tc); cmsFreeToneCurve(tc_1); return TRUE; Error: cmsFreeToneCurve(tc); cmsFreeToneCurve(tc_1); return FALSE; } // Check against some known values static cmsInt32Number CheckParametricToneCurves(void) { cmsFloat64Number Params[10]; // 1) X = Y ^ Gamma Params[0] = 2.2; if (!CheckSingleParametric("Gamma", Gamma, 1, Params)) return 0; // 2) CIE 122-1966 // Y = (aX + b)^Gamma | X >= -b/a // Y = 0 | else Params[0] = 2.2; Params[1] = 1.5; Params[2] = -0.5; if (!CheckSingleParametric("CIE122-1966", CIE122, 2, Params)) return 0; // 3) IEC 61966-3 // Y = (aX + b)^Gamma | X <= -b/a // Y = c | else Params[0] = 2.2; Params[1] = 1.5; Params[2] = -0.5; Params[3] = 0.3; if (!CheckSingleParametric("IEC 61966-3", IEC61966_3, 3, Params)) return 0; // 4) IEC 61966-2.1 (sRGB) // Y = (aX + b)^Gamma | X >= d // Y = cX | X < d Params[0] = 2.4; Params[1] = 1. / 1.055; Params[2] = 0.055 / 1.055; Params[3] = 1. / 12.92; Params[4] = 0.04045; if (!CheckSingleParametric("IEC 61966-2.1", IEC61966_21, 4, Params)) return 0; // 5) Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | else Params[0] = 2.2; Params[1] = 0.7; Params[2] = 0.2; Params[3] = 0.3; Params[4] = 0.1; Params[5] = 0.5; Params[6] = 0.2; if (!CheckSingleParametric("param_5", param_5, 5, Params)) return 0; // 6) Y = (aX + b) ^ Gamma + c Params[0] = 2.2; Params[1] = 0.7; Params[2] = 0.2; Params[3] = 0.3; if (!CheckSingleParametric("param_6", param_6, 6, Params)) return 0; // 7) Y = a * log (b * X^Gamma + c) + d Params[0] = 2.2; Params[1] = 0.9; Params[2] = 0.9; Params[3] = 0.02; Params[4] = 0.1; if (!CheckSingleParametric("param_7", param_7, 7, Params)) return 0; // 8) Y = a * b ^ (c*X+d) + e Params[0] = 0.9; Params[1] = 0.9; Params[2] = 1.02; Params[3] = 0.1; Params[4] = 0.2; if (!CheckSingleParametric("param_8", param_8, 8, Params)) return 0; // 108: S-Shaped: (1 - (1-x)^1/g)^1/g Params[0] = 1.9; if (!CheckSingleParametric("sigmoidal", sigmoidal, 108, Params)) return 0; // All OK return 1; } // LUT checks ------------------------------------------------------------------------------ static cmsInt32Number CheckLUTcreation(void) { cmsPipeline* lut; cmsPipeline* lut2; cmsInt32Number n1, n2; lut = cmsPipelineAlloc(DbgThread(), 1, 1); n1 = cmsPipelineStageCount(lut); lut2 = cmsPipelineDup(lut); n2 = cmsPipelineStageCount(lut2); cmsPipelineFree(lut); cmsPipelineFree(lut2); return (n1 == 0) && (n2 == 0); } // Create a MPE for a identity matrix static void AddIdentityMatrix(cmsPipeline* lut) { const cmsFloat64Number Identity[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocMatrix(DbgThread(), 3, 3, Identity, NULL)); } // Create a MPE for identity cmsFloat32Number CLUT static void AddIdentityCLUTfloat(cmsPipeline* lut) { const cmsFloat32Number Table[] = { 0, 0, 0, 0, 0, 1.0, 0, 1.0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 1.0, 0, 1.0, 1.0, 1.0, 0, 1.0, 1.0, 1.0 }; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocCLutFloat(DbgThread(), 2, 3, 3, Table)); } // Create a MPE for identity cmsFloat32Number CLUT static void AddIdentityCLUT16(cmsPipeline* lut) { const cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocCLut16bit(DbgThread(), 2, 3, 3, Table)); } // Create a 3 fn identity curves static void Add3GammaCurves(cmsPipeline* lut, cmsFloat64Number Curve) { cmsToneCurve* id = cmsBuildGamma(DbgThread(), Curve); cmsToneCurve* id3[3]; id3[0] = id; id3[1] = id; id3[2] = id; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(DbgThread(), 3, id3)); cmsFreeToneCurve(id); } static cmsInt32Number CheckFloatLUT(cmsPipeline* lut) { cmsInt32Number n1, i, j; cmsFloat32Number Inf[3], Outf[3]; n1=0; for (j=0; j < 65535; j++) { cmsInt32Number af[3]; Inf[0] = Inf[1] = Inf[2] = (cmsFloat32Number) j / 65535.0F; cmsPipelineEvalFloat(Inf, Outf, lut); af[0] = (cmsInt32Number) floor(Outf[0]*65535.0 + 0.5); af[1] = (cmsInt32Number) floor(Outf[1]*65535.0 + 0.5); af[2] = (cmsInt32Number) floor(Outf[2]*65535.0 + 0.5); for (i=0; i < 3; i++) { if (af[i] != j) { n1++; } } } return (n1 == 0); } static cmsInt32Number Check16LUT(cmsPipeline* lut) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[3], Outw[3]; n2=0; for (j=0; j < 65535; j++) { cmsInt32Number aw[3]; Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; cmsPipelineEval16(Inw, Outw, lut); aw[0] = Outw[0]; aw[1] = Outw[1]; aw[2] = Outw[2]; for (i=0; i < 3; i++) { if (aw[i] != j) { n2++; } } } return (n2 == 0); } // Check any LUT that is linear static cmsInt32Number CheckStagesLUT(cmsPipeline* lut, cmsInt32Number ExpectedStages) { cmsInt32Number nInpChans, nOutpChans, nStages; nInpChans = cmsPipelineInputChannels(lut); nOutpChans = cmsPipelineOutputChannels(lut); nStages = cmsPipelineStageCount(lut); return (nInpChans == 3) && (nOutpChans == 3) && (nStages == ExpectedStages); } static cmsInt32Number CheckFullLUT(cmsPipeline* lut, cmsInt32Number ExpectedStages) { cmsInt32Number rc = CheckStagesLUT(lut, ExpectedStages) && Check16LUT(lut) && CheckFloatLUT(lut); cmsPipelineFree(lut); return rc; } static cmsInt32Number Check1StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); return CheckFullLUT(lut, 1); } static cmsInt32Number Check2StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); return CheckFullLUT(lut, 2); } static cmsInt32Number Check2Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); return CheckFullLUT(lut, 2); } static cmsInt32Number Check3StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 3); } static cmsInt32Number Check3Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 3); } static cmsInt32Number Check4StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); return CheckFullLUT(lut, 4); } static cmsInt32Number Check4Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); return CheckFullLUT(lut, 4); } static cmsInt32Number Check5StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 5); } static cmsInt32Number Check5Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 5); } static cmsInt32Number Check6StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 6); } static cmsInt32Number Check6Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 6); } static cmsInt32Number CheckLab2LabLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsInt32Number rc; cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 2); cmsPipelineFree(lut); return rc; } static cmsInt32Number CheckXYZ2XYZLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsInt32Number rc; cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 2); cmsPipelineFree(lut); return rc; } static cmsInt32Number CheckLab2LabMatLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsInt32Number rc; cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); AddIdentityMatrix(lut); cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 3); cmsPipelineFree(lut); return rc; } static cmsInt32Number CheckNamedColorLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsNAMEDCOLORLIST* nc; cmsInt32Number i,j, rc = 1, n2; cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char Name[255]; cmsUInt16Number Inw[3], Outw[3]; nc = cmsAllocNamedColorList(DbgThread(), 256, 3, "pre", "post"); if (nc == NULL) return 0; for (i=0; i < 256; i++) { PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) i; sprintf(Name, "#%d", i); if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { rc = 0; break; } } cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocNamedColor(nc, FALSE)); cmsFreeNamedColorList(nc); if (rc == 0) return 0; n2=0; for (j=0; j < 256; j++) { Inw[0] = (cmsUInt16Number) j; cmsPipelineEval16(Inw, Outw, lut); for (i=0; i < 3; i++) { if (Outw[i] != j) { n2++; } } } cmsPipelineFree(lut); return (n2 == 0); } // -------------------------------------------------------------------------------------------- // A lightweight test of multilocalized unicode structures. static cmsInt32Number CheckMLU(void) { cmsMLU* mlu, *mlu2, *mlu3; char Buffer[256], Buffer2[256]; cmsInt32Number rc = 1; cmsInt32Number i; cmsHPROFILE h= NULL; // Allocate a MLU structure, no preferred size mlu = cmsMLUalloc(DbgThread(), 0); // Add some localizations cmsMLUsetWide(mlu, "en", "US", L"Hello, world"); cmsMLUsetWide(mlu, "es", "ES", L"Hola, mundo"); cmsMLUsetWide(mlu, "fr", "FR", L"Bonjour, le monde"); cmsMLUsetWide(mlu, "ca", "CA", L"Hola, mon"); // Check the returned string for each language cmsMLUgetASCII(mlu, "en", "US", Buffer, 256); if (strcmp(Buffer, "Hello, world") != 0) rc = 0; cmsMLUgetASCII(mlu, "es", "ES", Buffer, 256); if (strcmp(Buffer, "Hola, mundo") != 0) rc = 0; cmsMLUgetASCII(mlu, "fr", "FR", Buffer, 256); if (strcmp(Buffer, "Bonjour, le monde") != 0) rc = 0; cmsMLUgetASCII(mlu, "ca", "CA", Buffer, 256); if (strcmp(Buffer, "Hola, mon") != 0) rc = 0; if (rc == 0) Fail("Unexpected string '%s'", Buffer); // So far, so good. cmsMLUfree(mlu); // Now for performance, allocate an empty struct mlu = cmsMLUalloc(DbgThread(), 0); // Fill it with several thousands of different languages for (i=0; i < 4096; i++) { char Lang[3]; Lang[0] = (char) (i % 255); Lang[1] = (char) (i / 255); Lang[2] = 0; sprintf(Buffer, "String #%i", i); cmsMLUsetASCII(mlu, Lang, Lang, Buffer); } // Duplicate it mlu2 = cmsMLUdup(mlu); // Get rid of original cmsMLUfree(mlu); // Check all is still in place for (i=0; i < 4096; i++) { char Lang[3]; Lang[0] = (char)(i % 255); Lang[1] = (char)(i / 255); Lang[2] = 0; cmsMLUgetASCII(mlu2, Lang, Lang, Buffer2, 256); sprintf(Buffer, "String #%i", i); if (strcmp(Buffer, Buffer2) != 0) { rc = 0; break; } } if (rc == 0) Fail("Unexpected string '%s'", Buffer2); // Check profile IO h = cmsOpenProfileFromFileTHR(DbgThread(), "mlucheck.icc", "w"); cmsSetProfileVersion(h, 4.3); cmsWriteTag(h, cmsSigProfileDescriptionTag, mlu2); cmsCloseProfile(h); cmsMLUfree(mlu2); h = cmsOpenProfileFromFileTHR(DbgThread(), "mlucheck.icc", "r"); mlu3 = (cmsMLU *) cmsReadTag(h, cmsSigProfileDescriptionTag); if (mlu3 == NULL) { Fail("Profile didn't get the MLU\n"); rc = 0; goto Error; } // Check all is still in place for (i=0; i < 4096; i++) { char Lang[3]; Lang[0] = (char) (i % 255); Lang[1] = (char) (i / 255); Lang[2] = 0; cmsMLUgetASCII(mlu3, Lang, Lang, Buffer2, 256); sprintf(Buffer, "String #%i", i); if (strcmp(Buffer, Buffer2) != 0) { rc = 0; break; } } if (rc == 0) Fail("Unexpected string '%s'", Buffer2); Error: if (h != NULL) cmsCloseProfile(h); remove("mlucheck.icc"); return rc; } // Check UTF8 encoding static cmsInt32Number CheckMLU_UTF8(void) { cmsMLU* mlu; char Buffer[256]; cmsInt32Number rc = 1; mlu = cmsMLUalloc(DbgThread(), 0); cmsMLUsetWide(mlu, "en", "US", L"\x3b2\x14b"); cmsMLUgetUTF8(mlu, "en", "US", Buffer, 256); if (strcmp(Buffer, "\xce\xb2\xc5\x8b") != 0) rc = 0; if (rc == 0) Fail("Unexpected string '%s'", Buffer); cmsMLUfree(mlu); return rc; } // A lightweight test of named color structures. static cmsInt32Number CheckNamedColorList(void) { cmsNAMEDCOLORLIST* nc = NULL, *nc2; cmsInt32Number i, j, rc=1; char Name[cmsMAX_PATH]; cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char CheckName[cmsMAX_PATH]; cmsUInt16Number CheckPCS[3]; cmsUInt16Number CheckColorant[cmsMAXCHANNELS]; cmsHPROFILE h; nc = cmsAllocNamedColorList(DbgThread(), 0, 4, "prefix", "suffix"); if (nc == NULL) return 0; for (i=0; i < 4096; i++) { PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) (4096 - i); sprintf(Name, "#%d", i); if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { rc = 0; break; } } for (i=0; i < 4096; i++) { CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (4096 - i); sprintf(CheckName, "#%d", i); if (!cmsNamedColorInfo(nc, i, Name, NULL, NULL, PCS, Colorant)) { rc = 0; goto Error; } for (j=0; j < 3; j++) { if (CheckPCS[j] != PCS[j]) { rc = 0; Fail("Invalid PCS"); goto Error; } } for (j=0; j < 4; j++) { if (CheckColorant[j] != Colorant[j]) { rc = 0; Fail("Invalid Colorant"); goto Error; }; } if (strcmp(Name, CheckName) != 0) {rc = 0; Fail("Invalid Name"); goto Error; }; } h = cmsOpenProfileFromFileTHR(DbgThread(), "namedcol.icc", "w"); if (h == NULL) return 0; if (!cmsWriteTag(h, cmsSigNamedColor2Tag, nc)) return 0; cmsCloseProfile(h); cmsFreeNamedColorList(nc); nc = NULL; h = cmsOpenProfileFromFileTHR(DbgThread(), "namedcol.icc", "r"); nc2 = (cmsNAMEDCOLORLIST *) cmsReadTag(h, cmsSigNamedColor2Tag); if (cmsNamedColorCount(nc2) != 4096) { rc = 0; Fail("Invalid count"); goto Error; } i = cmsNamedColorIndex(nc2, "#123"); if (i != 123) { rc = 0; Fail("Invalid index"); goto Error; } for (i=0; i < 4096; i++) { CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (4096 - i); sprintf(CheckName, "#%d", i); if (!cmsNamedColorInfo(nc2, i, Name, NULL, NULL, PCS, Colorant)) { rc = 0; goto Error; } for (j=0; j < 3; j++) { if (CheckPCS[j] != PCS[j]) { rc = 0; Fail("Invalid PCS"); goto Error; } } for (j=0; j < 4; j++) { if (CheckColorant[j] != Colorant[j]) { rc = 0; Fail("Invalid Colorant"); goto Error; }; } if (strcmp(Name, CheckName) != 0) {rc = 0; Fail("Invalid Name"); goto Error; }; } cmsCloseProfile(h); remove("namedcol.icc"); Error: if (nc != NULL) cmsFreeNamedColorList(nc); return rc; } // For educational purposes ONLY. No error checking is performed! static cmsInt32Number CreateNamedColorProfile(void) { // Color list database cmsNAMEDCOLORLIST* colors = cmsAllocNamedColorList(0, 10, 4, "PANTONE", "TCX"); // Containers for names cmsMLU* DescriptionMLU, *CopyrightMLU; // Create n empty profile cmsHPROFILE hProfile = cmsOpenProfileFromFile("named.icc", "w"); // Values cmsCIELab Lab; cmsUInt16Number PCS[3], Colorant[cmsMAXCHANNELS]; // Set profile class cmsSetProfileVersion(hProfile, 4.3); cmsSetDeviceClass(hProfile, cmsSigNamedColorClass); cmsSetColorSpace(hProfile, cmsSigCmykData); cmsSetPCS(hProfile, cmsSigLabData); cmsSetHeaderRenderingIntent(hProfile, INTENT_PERCEPTUAL); // Add description and copyright only in english/US DescriptionMLU = cmsMLUalloc(0, 1); CopyrightMLU = cmsMLUalloc(0, 1); cmsMLUsetWide(DescriptionMLU, "en", "US", L"Profile description"); cmsMLUsetWide(CopyrightMLU, "en", "US", L"Profile copyright"); cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU); cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU); // Set the media white point cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ()); // Populate one value, Colorant = CMYK values in 16 bits, PCS[] = Encoded Lab values (in V2 format!!) Lab.L = 50; Lab.a = 10; Lab.b = -10; cmsFloat2LabEncodedV2(PCS, &Lab); Colorant[0] = 10 * 257; Colorant[1] = 20 * 257; Colorant[2] = 30 * 257; Colorant[3] = 40 * 257; cmsAppendNamedColor(colors, "Hazelnut 14-1315", PCS, Colorant); // Another one. Consider to write a routine for that Lab.L = 40; Lab.a = -5; Lab.b = 8; cmsFloat2LabEncodedV2(PCS, &Lab); Colorant[0] = 10 * 257; Colorant[1] = 20 * 257; Colorant[2] = 30 * 257; Colorant[3] = 40 * 257; cmsAppendNamedColor(colors, "Kale 18-0107", PCS, Colorant); // Write the colors database cmsWriteTag(hProfile, cmsSigNamedColor2Tag, colors); // That will create the file cmsCloseProfile(hProfile); // Free resources cmsFreeNamedColorList(colors); cmsMLUfree(DescriptionMLU); cmsMLUfree(CopyrightMLU); remove("named.icc"); return 1; } // ---------------------------------------------------------------------------------------------------------- // Formatters static cmsBool FormatterFailed; static void CheckSingleFormatter16(cmsContext id, cmsUInt32Number Type, const char* Text) { cmsUInt16Number Values[cmsMAXCHANNELS]; cmsUInt8Number Buffer[1024]; cmsFormatter f, b; cmsInt32Number i, j, nChannels, bytes; _cmsTRANSFORM info; // Already failed? if (FormatterFailed) return; memset(&info, 0, sizeof(info)); info.OutputFormat = info.InputFormat = Type; // Go forth and back f = _cmsGetFormatter(id, Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); b = _cmsGetFormatter(id, Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); if (f.Fmt16 == NULL || b.Fmt16 == NULL) { Fail("no formatter for %s", Text); FormatterFailed = TRUE; // Useful for debug f = _cmsGetFormatter(id, Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); b = _cmsGetFormatter(id, Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); return; } nChannels = T_CHANNELS(Type); bytes = T_BYTES(Type); for (j=0; j < 5; j++) { for (i=0; i < nChannels; i++) { Values[i] = (cmsUInt16Number) (i+j); // For 8-bit if (bytes == 1) Values[i] <<= 8; } b.Fmt16(&info, Values, Buffer, 2); memset(Values, 0, sizeof(Values)); f.Fmt16(&info, Values, Buffer, 2); for (i=0; i < nChannels; i++) { if (bytes == 1) Values[i] >>= 8; if (Values[i] != i+j) { Fail("%s failed", Text); FormatterFailed = TRUE; // Useful for debug for (i=0; i < nChannels; i++) { Values[i] = (cmsUInt16Number) (i+j); // For 8-bit if (bytes == 1) Values[i] <<= 8; } b.Fmt16(&info, Values, Buffer, 1); f.Fmt16(&info, Values, Buffer, 1); return; } } } } #define C(a) CheckSingleFormatter16(0, a, #a) // Check all formatters static cmsInt32Number CheckFormatters16(void) { FormatterFailed = FALSE; C( TYPE_GRAY_8 ); C( TYPE_GRAY_8_REV ); C( TYPE_GRAY_16 ); C( TYPE_GRAY_16_REV ); C( TYPE_GRAY_16_SE ); C( TYPE_GRAYA_8 ); C( TYPE_GRAYA_16 ); C( TYPE_GRAYA_16_SE ); C( TYPE_GRAYA_8_PLANAR ); C( TYPE_GRAYA_16_PLANAR ); C( TYPE_RGB_8 ); C( TYPE_RGB_8_PLANAR ); C( TYPE_BGR_8 ); C( TYPE_BGR_8_PLANAR ); C( TYPE_RGB_16 ); C( TYPE_RGB_16_PLANAR ); C( TYPE_RGB_16_SE ); C( TYPE_BGR_16 ); C( TYPE_BGR_16_PLANAR ); C( TYPE_BGR_16_SE ); C( TYPE_RGBA_8 ); C( TYPE_RGBA_8_PLANAR ); C( TYPE_RGBA_16 ); C( TYPE_RGBA_16_PLANAR ); C( TYPE_RGBA_16_SE ); C( TYPE_ARGB_8 ); C( TYPE_ARGB_8_PLANAR ); C( TYPE_ARGB_16 ); C( TYPE_ABGR_8 ); C( TYPE_ABGR_8_PLANAR ); C( TYPE_ABGR_16 ); C( TYPE_ABGR_16_PLANAR ); C( TYPE_ABGR_16_SE ); C( TYPE_BGRA_8 ); C( TYPE_BGRA_8_PLANAR ); C( TYPE_BGRA_16 ); C( TYPE_BGRA_16_SE ); C( TYPE_CMY_8 ); C( TYPE_CMY_8_PLANAR ); C( TYPE_CMY_16 ); C( TYPE_CMY_16_PLANAR ); C( TYPE_CMY_16_SE ); C( TYPE_CMYK_8 ); C( TYPE_CMYKA_8 ); C( TYPE_CMYK_8_REV ); C( TYPE_YUVK_8 ); C( TYPE_CMYK_8_PLANAR ); C( TYPE_CMYK_16 ); C( TYPE_CMYK_16_REV ); C( TYPE_YUVK_16 ); C( TYPE_CMYK_16_PLANAR ); C( TYPE_CMYK_16_SE ); C( TYPE_KYMC_8 ); C( TYPE_KYMC_16 ); C( TYPE_KYMC_16_SE ); C( TYPE_KCMY_8 ); C( TYPE_KCMY_8_REV ); C( TYPE_KCMY_16 ); C( TYPE_KCMY_16_REV ); C( TYPE_KCMY_16_SE ); C( TYPE_CMYK5_8 ); C( TYPE_CMYK5_16 ); C( TYPE_CMYK5_16_SE ); C( TYPE_KYMC5_8 ); C( TYPE_KYMC5_16 ); C( TYPE_KYMC5_16_SE ); C( TYPE_CMYK6_8 ); C( TYPE_CMYK6_8_PLANAR ); C( TYPE_CMYK6_16 ); C( TYPE_CMYK6_16_PLANAR ); C( TYPE_CMYK6_16_SE ); C( TYPE_CMYK7_8 ); C( TYPE_CMYK7_16 ); C( TYPE_CMYK7_16_SE ); C( TYPE_KYMC7_8 ); C( TYPE_KYMC7_16 ); C( TYPE_KYMC7_16_SE ); C( TYPE_CMYK8_8 ); C( TYPE_CMYK8_16 ); C( TYPE_CMYK8_16_SE ); C( TYPE_KYMC8_8 ); C( TYPE_KYMC8_16 ); C( TYPE_KYMC8_16_SE ); C( TYPE_CMYK9_8 ); C( TYPE_CMYK9_16 ); C( TYPE_CMYK9_16_SE ); C( TYPE_KYMC9_8 ); C( TYPE_KYMC9_16 ); C( TYPE_KYMC9_16_SE ); C( TYPE_CMYK10_8 ); C( TYPE_CMYK10_16 ); C( TYPE_CMYK10_16_SE ); C( TYPE_KYMC10_8 ); C( TYPE_KYMC10_16 ); C( TYPE_KYMC10_16_SE ); C( TYPE_CMYK11_8 ); C( TYPE_CMYK11_16 ); C( TYPE_CMYK11_16_SE ); C( TYPE_KYMC11_8 ); C( TYPE_KYMC11_16 ); C( TYPE_KYMC11_16_SE ); C( TYPE_CMYK12_8 ); C( TYPE_CMYK12_16 ); C( TYPE_CMYK12_16_SE ); C( TYPE_KYMC12_8 ); C( TYPE_KYMC12_16 ); C( TYPE_KYMC12_16_SE ); C( TYPE_XYZ_16 ); C( TYPE_Lab_8 ); C( TYPE_ALab_8 ); C( TYPE_Lab_16 ); C( TYPE_Yxy_16 ); C( TYPE_YCbCr_8 ); C( TYPE_YCbCr_8_PLANAR ); C( TYPE_YCbCr_16 ); C( TYPE_YCbCr_16_PLANAR ); C( TYPE_YCbCr_16_SE ); C( TYPE_YUV_8 ); C( TYPE_YUV_8_PLANAR ); C( TYPE_YUV_16 ); C( TYPE_YUV_16_PLANAR ); C( TYPE_YUV_16_SE ); C( TYPE_HLS_8 ); C( TYPE_HLS_8_PLANAR ); C( TYPE_HLS_16 ); C( TYPE_HLS_16_PLANAR ); C( TYPE_HLS_16_SE ); C( TYPE_HSV_8 ); C( TYPE_HSV_8_PLANAR ); C( TYPE_HSV_16 ); C( TYPE_HSV_16_PLANAR ); C( TYPE_HSV_16_SE ); C( TYPE_XYZ_FLT ); C( TYPE_Lab_FLT ); C( TYPE_GRAY_FLT ); C( TYPE_RGB_FLT ); C( TYPE_BGR_FLT ); C( TYPE_CMYK_FLT ); C( TYPE_LabA_FLT ); C( TYPE_RGBA_FLT ); C( TYPE_ARGB_FLT ); C( TYPE_BGRA_FLT ); C( TYPE_ABGR_FLT ); C( TYPE_XYZ_DBL ); C( TYPE_Lab_DBL ); C( TYPE_GRAY_DBL ); C( TYPE_RGB_DBL ); C( TYPE_BGR_DBL ); C( TYPE_CMYK_DBL ); C( TYPE_LabV2_8 ); C( TYPE_ALabV2_8 ); C( TYPE_LabV2_16 ); #ifndef CMS_NO_HALF_SUPPORT C( TYPE_GRAY_HALF_FLT ); C( TYPE_RGB_HALF_FLT ); C( TYPE_CMYK_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_ARGB_HALF_FLT ); C( TYPE_BGR_HALF_FLT ); C( TYPE_BGRA_HALF_FLT ); C( TYPE_ABGR_HALF_FLT ); #endif return FormatterFailed == 0 ? 1 : 0; } #undef C static void CheckSingleFormatterFloat(cmsUInt32Number Type, const char* Text) { cmsFloat32Number Values[cmsMAXCHANNELS]; cmsUInt8Number Buffer[1024]; cmsFormatter f, b; cmsInt32Number i, j, nChannels; _cmsTRANSFORM info; // Already failed? if (FormatterFailed) return; memset(&info, 0, sizeof(info)); info.OutputFormat = info.InputFormat = Type; // Go forth and back f = _cmsGetFormatter(0, Type, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT); b = _cmsGetFormatter(0, Type, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT); if (f.FmtFloat == NULL || b.FmtFloat == NULL) { Fail("no formatter for %s", Text); FormatterFailed = TRUE; // Useful for debug f = _cmsGetFormatter(0, Type, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT); b = _cmsGetFormatter(0, Type, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT); return; } nChannels = T_CHANNELS(Type); for (j=0; j < 5; j++) { for (i=0; i < nChannels; i++) { Values[i] = (cmsFloat32Number) (i+j); } b.FmtFloat(&info, Values, Buffer, 1); memset(Values, 0, sizeof(Values)); f.FmtFloat(&info, Values, Buffer, 1); for (i=0; i < nChannels; i++) { cmsFloat64Number delta = fabs(Values[i] - ( i+j)); if (delta > 0.000000001) { Fail("%s failed", Text); FormatterFailed = TRUE; // Useful for debug for (i=0; i < nChannels; i++) { Values[i] = (cmsFloat32Number) (i+j); } b.FmtFloat(&info, Values, Buffer, 1); f.FmtFloat(&info, Values, Buffer, 1); return; } } } } #define C(a) CheckSingleFormatterFloat(a, #a) static cmsInt32Number CheckFormattersFloat(void) { FormatterFailed = FALSE; C( TYPE_XYZ_FLT ); C( TYPE_Lab_FLT ); C( TYPE_GRAY_FLT ); C( TYPE_RGB_FLT ); C( TYPE_BGR_FLT ); C( TYPE_CMYK_FLT ); C( TYPE_LabA_FLT ); C( TYPE_RGBA_FLT ); C( TYPE_ARGB_FLT ); C( TYPE_BGRA_FLT ); C( TYPE_ABGR_FLT ); C( TYPE_XYZ_DBL ); C( TYPE_Lab_DBL ); C( TYPE_GRAY_DBL ); C( TYPE_RGB_DBL ); C( TYPE_BGR_DBL ); C( TYPE_CMYK_DBL ); C( TYPE_XYZ_FLT ); #ifndef CMS_NO_HALF_SUPPORT C( TYPE_GRAY_HALF_FLT ); C( TYPE_RGB_HALF_FLT ); C( TYPE_CMYK_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_ARGB_HALF_FLT ); C( TYPE_BGR_HALF_FLT ); C( TYPE_BGRA_HALF_FLT ); C( TYPE_ABGR_HALF_FLT ); #endif return FormatterFailed == 0 ? 1 : 0; } #undef C #ifndef CMS_NO_HALF_SUPPORT // Check half float #define my_isfinite(x) ((x) != (x)) static cmsInt32Number CheckFormattersHalf(void) { int i, j; for (i=0; i < 0xffff; i++) { cmsFloat32Number f = _cmsHalf2Float((cmsUInt16Number) i); if (!my_isfinite(f)) { j = _cmsFloat2Half(f); if (i != j) { Fail("%d != %d in Half float support!\n", i, j); return 0; } } } return 1; } #endif static cmsInt32Number CheckOneRGB(cmsHTRANSFORM xform, cmsUInt16Number R, cmsUInt16Number G, cmsUInt16Number B, cmsUInt16Number Ro, cmsUInt16Number Go, cmsUInt16Number Bo) { cmsUInt16Number RGB[3]; cmsUInt16Number Out[3]; RGB[0] = R; RGB[1] = G; RGB[2] = B; cmsDoTransform(xform, RGB, Out, 1); return IsGoodWord("R", Ro , Out[0]) && IsGoodWord("G", Go , Out[1]) && IsGoodWord("B", Bo , Out[2]); } // Check known values going from sRGB to XYZ static cmsInt32Number CheckOneRGB_double(cmsHTRANSFORM xform, cmsFloat64Number R, cmsFloat64Number G, cmsFloat64Number B, cmsFloat64Number Ro, cmsFloat64Number Go, cmsFloat64Number Bo) { cmsFloat64Number RGB[3]; cmsFloat64Number Out[3]; RGB[0] = R; RGB[1] = G; RGB[2] = B; cmsDoTransform(xform, RGB, Out, 1); return IsGoodVal("R", Ro , Out[0], 0.01) && IsGoodVal("G", Go , Out[1], 0.01) && IsGoodVal("B", Bo , Out[2], 0.01); } static cmsInt32Number CheckChangeBufferFormat(void) { cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHTRANSFORM xform; xform = cmsCreateTransform(hsRGB, TYPE_RGB_16, hsRGB, TYPE_RGB_16, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hsRGB); if (xform == NULL) return 0; if (!CheckOneRGB(xform, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOneRGB(xform, 120, 0, 0, 120, 0, 0)) return 0; if (!CheckOneRGB(xform, 0, 222, 255, 0, 222, 255)) return 0; if (!cmsChangeBuffersFormat(xform, TYPE_BGR_16, TYPE_RGB_16)) return 0; if (!CheckOneRGB(xform, 0, 0, 123, 123, 0, 0)) return 0; if (!CheckOneRGB(xform, 154, 234, 0, 0, 234, 154)) return 0; if (!cmsChangeBuffersFormat(xform, TYPE_RGB_DBL, TYPE_RGB_DBL)) return 0; if (!CheckOneRGB_double(xform, 0.20, 0, 0, 0.20, 0, 0)) return 0; if (!CheckOneRGB_double(xform, 0, 0.9, 1, 0, 0.9, 1)) return 0; cmsDeleteTransform(xform); return 1; } // Write tag testbed ---------------------------------------------------------------------------------------- static cmsInt32Number CheckXYZ(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsCIEXYZ XYZ, *Pt; switch (Pass) { case 1: XYZ.X = 1.0; XYZ.Y = 1.1; XYZ.Z = 1.2; return cmsWriteTag(hProfile, tag, &XYZ); case 2: Pt = (cmsCIEXYZ *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return IsGoodFixed15_16("X", 1.0, Pt ->X) && IsGoodFixed15_16("Y", 1.1, Pt->Y) && IsGoodFixed15_16("Z", 1.2, Pt -> Z); default: return 0; } } static cmsInt32Number CheckGamma(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsToneCurve *g, *Pt; cmsInt32Number rc; switch (Pass) { case 1: g = cmsBuildGamma(DbgThread(), 1.0); rc = cmsWriteTag(hProfile, tag, g); cmsFreeToneCurve(g); return rc; case 2: Pt = (cmsToneCurve *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return cmsIsToneCurveLinear(Pt); default: return 0; } } static cmsInt32Number CheckTextSingle(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsMLU *m, *Pt; cmsInt32Number rc; char Buffer[256]; switch (Pass) { case 1: m = cmsMLUalloc(DbgThread(), 0); cmsMLUsetASCII(m, cmsNoLanguage, cmsNoCountry, "Test test"); rc = cmsWriteTag(hProfile, tag, m); cmsMLUfree(m); return rc; case 2: Pt = (cmsMLU *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; cmsMLUgetASCII(Pt, cmsNoLanguage, cmsNoCountry, Buffer, 256); if (strcmp(Buffer, "Test test") != 0) return FALSE; return TRUE; default: return 0; } } static cmsInt32Number CheckText(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsMLU *m, *Pt; cmsInt32Number rc; char Buffer[256]; switch (Pass) { case 1: m = cmsMLUalloc(DbgThread(), 0); cmsMLUsetASCII(m, cmsNoLanguage, cmsNoCountry, "Test test"); cmsMLUsetASCII(m, "en", "US", "1 1 1 1"); cmsMLUsetASCII(m, "es", "ES", "2 2 2 2"); cmsMLUsetASCII(m, "ct", "ES", "3 3 3 3"); cmsMLUsetASCII(m, "en", "GB", "444444444"); rc = cmsWriteTag(hProfile, tag, m); cmsMLUfree(m); return rc; case 2: Pt = (cmsMLU *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; cmsMLUgetASCII(Pt, cmsNoLanguage, cmsNoCountry, Buffer, 256); if (strcmp(Buffer, "Test test") != 0) return FALSE; cmsMLUgetASCII(Pt, "en", "US", Buffer, 256); if (strcmp(Buffer, "1 1 1 1") != 0) return FALSE; cmsMLUgetASCII(Pt, "es", "ES", Buffer, 256); if (strcmp(Buffer, "2 2 2 2") != 0) return FALSE; cmsMLUgetASCII(Pt, "ct", "ES", Buffer, 256); if (strcmp(Buffer, "3 3 3 3") != 0) return FALSE; cmsMLUgetASCII(Pt, "en", "GB", Buffer, 256); if (strcmp(Buffer, "444444444") != 0) return FALSE; return TRUE; default: return 0; } } static cmsInt32Number CheckData(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsICCData *Pt; cmsICCData d = { 1, 0, { '?' }}; cmsInt32Number rc; switch (Pass) { case 1: rc = cmsWriteTag(hProfile, tag, &d); return rc; case 2: Pt = (cmsICCData *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return (Pt ->data[0] == '?') && (Pt ->flag == 0) && (Pt ->len == 1); default: return 0; } } static cmsInt32Number CheckSignature(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsTagSignature *Pt, Holder; switch (Pass) { case 1: Holder = (cmsTagSignature) cmsSigPerceptualReferenceMediumGamut; return cmsWriteTag(hProfile, tag, &Holder); case 2: Pt = (cmsTagSignature *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return *Pt == cmsSigPerceptualReferenceMediumGamut; default: return 0; } } static cmsInt32Number CheckDateTime(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { struct tm *Pt, Holder; switch (Pass) { case 1: Holder.tm_hour = 1; Holder.tm_min = 2; Holder.tm_sec = 3; Holder.tm_mday = 4; Holder.tm_mon = 5; Holder.tm_year = 2009 - 1900; return cmsWriteTag(hProfile, tag, &Holder); case 2: Pt = (struct tm *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return (Pt ->tm_hour == 1 && Pt ->tm_min == 2 && Pt ->tm_sec == 3 && Pt ->tm_mday == 4 && Pt ->tm_mon == 5 && Pt ->tm_year == 2009 - 1900); default: return 0; } } static cmsInt32Number CheckNamedColor(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag, cmsInt32Number max_check, cmsBool colorant_check) { cmsNAMEDCOLORLIST* nc; cmsInt32Number i, j, rc; char Name[255]; cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char CheckName[255]; cmsUInt16Number CheckPCS[3]; cmsUInt16Number CheckColorant[cmsMAXCHANNELS]; switch (Pass) { case 1: nc = cmsAllocNamedColorList(DbgThread(), 0, 4, "prefix", "suffix"); if (nc == NULL) return 0; for (i=0; i < max_check; i++) { PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) (max_check - i); sprintf(Name, "#%d", i); if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { Fail("Couldn't append named color"); return 0; } } rc = cmsWriteTag(hProfile, tag, nc); cmsFreeNamedColorList(nc); return rc; case 2: nc = (cmsNAMEDCOLORLIST *) cmsReadTag(hProfile, tag); if (nc == NULL) return 0; for (i=0; i < max_check; i++) { CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (max_check - i); sprintf(CheckName, "#%d", i); if (!cmsNamedColorInfo(nc, i, Name, NULL, NULL, PCS, Colorant)) { Fail("Invalid string"); return 0; } for (j=0; j < 3; j++) { if (CheckPCS[j] != PCS[j]) { Fail("Invalid PCS"); return 0; } } // This is only used on named color list if (colorant_check) { for (j=0; j < 4; j++) { if (CheckColorant[j] != Colorant[j]) { Fail("Invalid Colorant"); return 0; }; } } if (strcmp(Name, CheckName) != 0) { Fail("Invalid Name"); return 0; }; } return 1; default: return 0; } } static cmsInt32Number CheckLUT(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsPipeline* Lut, *Pt; cmsInt32Number rc; switch (Pass) { case 1: Lut = cmsPipelineAlloc(DbgThread(), 3, 3); if (Lut == NULL) return 0; // Create an identity LUT cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(DbgThread(), 3)); cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocIdentityCLut(DbgThread(), 3)); cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocIdentityCurves(DbgThread(), 3)); rc = cmsWriteTag(hProfile, tag, Lut); cmsPipelineFree(Lut); return rc; case 2: Pt = (cmsPipeline *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; // Transform values, check for identity return Check16LUT(Pt); default: return 0; } } static cmsInt32Number CheckCHAD(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsFloat64Number *Pt; cmsFloat64Number CHAD[] = { 0, .1, .2, .3, .4, .5, .6, .7, .8 }; cmsInt32Number i; switch (Pass) { case 1: return cmsWriteTag(hProfile, tag, CHAD); case 2: Pt = (cmsFloat64Number *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; for (i=0; i < 9; i++) { if (!IsGoodFixed15_16("CHAD", Pt[i], CHAD[i])) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckChromaticity(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsCIExyYTRIPLE *Pt, c = { {0, .1, 1 }, { .3, .4, 1 }, { .6, .7, 1 }}; switch (Pass) { case 1: return cmsWriteTag(hProfile, tag, &c); case 2: Pt = (cmsCIExyYTRIPLE *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Red.x, c.Red.x)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Red.y, c.Red.y)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Green.x, c.Green.x)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Green.y, c.Green.y)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Blue.x, c.Blue.x)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Blue.y, c.Blue.y)) return 0; return 1; default: return 0; } } static cmsInt32Number CheckColorantOrder(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsUInt8Number *Pt, c[cmsMAXCHANNELS]; cmsInt32Number i; switch (Pass) { case 1: for (i=0; i < cmsMAXCHANNELS; i++) c[i] = (cmsUInt8Number) (cmsMAXCHANNELS - i - 1); return cmsWriteTag(hProfile, tag, c); case 2: Pt = (cmsUInt8Number *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; for (i=0; i < cmsMAXCHANNELS; i++) { if (Pt[i] != ( cmsMAXCHANNELS - i - 1 )) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckMeasurement(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsICCMeasurementConditions *Pt, m; switch (Pass) { case 1: m.Backing.X = 0.1; m.Backing.Y = 0.2; m.Backing.Z = 0.3; m.Flare = 1.0; m.Geometry = 1; m.IlluminantType = cmsILLUMINANT_TYPE_D50; m.Observer = 1; return cmsWriteTag(hProfile, tag, &m); case 2: Pt = (cmsICCMeasurementConditions *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; if (!IsGoodFixed15_16("Backing", Pt ->Backing.X, 0.1)) return 0; if (!IsGoodFixed15_16("Backing", Pt ->Backing.Y, 0.2)) return 0; if (!IsGoodFixed15_16("Backing", Pt ->Backing.Z, 0.3)) return 0; if (!IsGoodFixed15_16("Flare", Pt ->Flare, 1.0)) return 0; if (Pt ->Geometry != 1) return 0; if (Pt ->IlluminantType != cmsILLUMINANT_TYPE_D50) return 0; if (Pt ->Observer != 1) return 0; return 1; default: return 0; } } static cmsInt32Number CheckUcrBg(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsUcrBg *Pt, m; cmsInt32Number rc; char Buffer[256]; switch (Pass) { case 1: m.Ucr = cmsBuildGamma(DbgThread(), 2.4); m.Bg = cmsBuildGamma(DbgThread(), -2.2); m.Desc = cmsMLUalloc(DbgThread(), 1); cmsMLUsetASCII(m.Desc, cmsNoLanguage, cmsNoCountry, "test UCR/BG"); rc = cmsWriteTag(hProfile, tag, &m); cmsMLUfree(m.Desc); cmsFreeToneCurve(m.Bg); cmsFreeToneCurve(m.Ucr); return rc; case 2: Pt = (cmsUcrBg *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; cmsMLUgetASCII(Pt ->Desc, cmsNoLanguage, cmsNoCountry, Buffer, 256); if (strcmp(Buffer, "test UCR/BG") != 0) return 0; return 1; default: return 0; } } static cmsInt32Number CheckCRDinfo(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsMLU *mlu; char Buffer[256]; cmsInt32Number rc; switch (Pass) { case 1: mlu = cmsMLUalloc(DbgThread(), 5); cmsMLUsetWide(mlu, "PS", "nm", L"test postscript"); cmsMLUsetWide(mlu, "PS", "#0", L"perceptual"); cmsMLUsetWide(mlu, "PS", "#1", L"relative_colorimetric"); cmsMLUsetWide(mlu, "PS", "#2", L"saturation"); cmsMLUsetWide(mlu, "PS", "#3", L"absolute_colorimetric"); rc = cmsWriteTag(hProfile, tag, mlu); cmsMLUfree(mlu); return rc; case 2: mlu = (cmsMLU*) cmsReadTag(hProfile, tag); if (mlu == NULL) return 0; cmsMLUgetASCII(mlu, "PS", "nm", Buffer, 256); if (strcmp(Buffer, "test postscript") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#0", Buffer, 256); if (strcmp(Buffer, "perceptual") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#1", Buffer, 256); if (strcmp(Buffer, "relative_colorimetric") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#2", Buffer, 256); if (strcmp(Buffer, "saturation") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#3", Buffer, 256); if (strcmp(Buffer, "absolute_colorimetric") != 0) return 0; return 1; default: return 0; } } static cmsToneCurve *CreateSegmentedCurve(void) { cmsCurveSegment Seg[3]; cmsFloat32Number Sampled[2] = { 0, 1}; Seg[0].Type = 6; Seg[0].Params[0] = 1; Seg[0].Params[1] = 0; Seg[0].Params[2] = 0; Seg[0].Params[3] = 0; Seg[0].x0 = -1E22F; Seg[0].x1 = 0; Seg[1].Type = 0; Seg[1].nGridPoints = 2; Seg[1].SampledPoints = Sampled; Seg[1].x0 = 0; Seg[1].x1 = 1; Seg[2].Type = 6; Seg[2].Params[0] = 1; Seg[2].Params[1] = 0; Seg[2].Params[2] = 0; Seg[2].Params[3] = 0; Seg[2].x0 = 1; Seg[2].x1 = 1E22F; return cmsBuildSegmentedToneCurve(DbgThread(), 3, Seg); } static cmsInt32Number CheckMPE(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsPipeline* Lut, *Pt; cmsToneCurve* G[3]; cmsInt32Number rc; switch (Pass) { case 1: Lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4(DbgThread())); cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV4ToV2(DbgThread())); AddIdentityCLUTfloat(Lut); G[0] = G[1] = G[2] = CreateSegmentedCurve(); cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(DbgThread(), 3, G)); cmsFreeToneCurve(G[0]); rc = cmsWriteTag(hProfile, tag, Lut); cmsPipelineFree(Lut); return rc; case 2: Pt = (cmsPipeline *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return CheckFloatLUT(Pt); default: return 0; } } static cmsInt32Number CheckScreening(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsScreening *Pt, sc; cmsInt32Number rc; switch (Pass) { case 1: sc.Flag = 0; sc.nChannels = 1; sc.Channels[0].Frequency = 2.0; sc.Channels[0].ScreenAngle = 3.0; sc.Channels[0].SpotShape = cmsSPOT_ELLIPSE; rc = cmsWriteTag(hProfile, tag, &sc); return rc; case 2: Pt = (cmsScreening *) cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; if (Pt ->nChannels != 1) return 0; if (Pt ->Flag != 0) return 0; if (!IsGoodFixed15_16("Freq", Pt ->Channels[0].Frequency, 2.0)) return 0; if (!IsGoodFixed15_16("Angle", Pt ->Channels[0].ScreenAngle, 3.0)) return 0; if (Pt ->Channels[0].SpotShape != cmsSPOT_ELLIPSE) return 0; return 1; default: return 0; } } static cmsBool CheckOneStr(cmsMLU* mlu, cmsInt32Number n) { char Buffer[256], Buffer2[256]; cmsMLUgetASCII(mlu, "en", "US", Buffer, 255); sprintf(Buffer2, "Hello, world %d", n); if (strcmp(Buffer, Buffer2) != 0) return FALSE; cmsMLUgetASCII(mlu, "es", "ES", Buffer, 255); sprintf(Buffer2, "Hola, mundo %d", n); if (strcmp(Buffer, Buffer2) != 0) return FALSE; return TRUE; } static void SetOneStr(cmsMLU** mlu, const wchar_t* s1, const wchar_t* s2) { *mlu = cmsMLUalloc(DbgThread(), 0); cmsMLUsetWide(*mlu, "en", "US", s1); cmsMLUsetWide(*mlu, "es", "ES", s2); } static cmsInt32Number CheckProfileSequenceTag(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsSEQ* s; cmsInt32Number i; switch (Pass) { case 1: s = cmsAllocProfileSequenceDescription(DbgThread(), 3); if (s == NULL) return 0; SetOneStr(&s -> seq[0].Manufacturer, L"Hello, world 0", L"Hola, mundo 0"); SetOneStr(&s -> seq[0].Model, L"Hello, world 0", L"Hola, mundo 0"); SetOneStr(&s -> seq[1].Manufacturer, L"Hello, world 1", L"Hola, mundo 1"); SetOneStr(&s -> seq[1].Model, L"Hello, world 1", L"Hola, mundo 1"); SetOneStr(&s -> seq[2].Manufacturer, L"Hello, world 2", L"Hola, mundo 2"); SetOneStr(&s -> seq[2].Model, L"Hello, world 2", L"Hola, mundo 2"); #ifdef CMS_DONT_USE_INT64 s ->seq[0].attributes[0] = cmsTransparency|cmsMatte; s ->seq[0].attributes[1] = 0; #else s ->seq[0].attributes = cmsTransparency|cmsMatte; #endif #ifdef CMS_DONT_USE_INT64 s ->seq[1].attributes[0] = cmsReflective|cmsMatte; s ->seq[1].attributes[1] = 0; #else s ->seq[1].attributes = cmsReflective|cmsMatte; #endif #ifdef CMS_DONT_USE_INT64 s ->seq[2].attributes[0] = cmsTransparency|cmsGlossy; s ->seq[2].attributes[1] = 0; #else s ->seq[2].attributes = cmsTransparency|cmsGlossy; #endif if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, s)) return 0; cmsFreeProfileSequenceDescription(s); return 1; case 2: s = (cmsSEQ *) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag); if (s == NULL) return 0; if (s ->n != 3) return 0; #ifdef CMS_DONT_USE_INT64 if (s ->seq[0].attributes[0] != (cmsTransparency|cmsMatte)) return 0; if (s ->seq[0].attributes[1] != 0) return 0; #else if (s ->seq[0].attributes != (cmsTransparency|cmsMatte)) return 0; #endif #ifdef CMS_DONT_USE_INT64 if (s ->seq[1].attributes[0] != (cmsReflective|cmsMatte)) return 0; if (s ->seq[1].attributes[1] != 0) return 0; #else if (s ->seq[1].attributes != (cmsReflective|cmsMatte)) return 0; #endif #ifdef CMS_DONT_USE_INT64 if (s ->seq[2].attributes[0] != (cmsTransparency|cmsGlossy)) return 0; if (s ->seq[2].attributes[1] != 0) return 0; #else if (s ->seq[2].attributes != (cmsTransparency|cmsGlossy)) return 0; #endif // Check MLU for (i=0; i < 3; i++) { if (!CheckOneStr(s -> seq[i].Manufacturer, i)) return 0; if (!CheckOneStr(s -> seq[i].Model, i)) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckProfileSequenceIDTag(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsSEQ* s; cmsInt32Number i; switch (Pass) { case 1: s = cmsAllocProfileSequenceDescription(DbgThread(), 3); if (s == NULL) return 0; memcpy(s ->seq[0].ProfileID.ID8, "0123456789ABCDEF", 16); memcpy(s ->seq[1].ProfileID.ID8, "1111111111111111", 16); memcpy(s ->seq[2].ProfileID.ID8, "2222222222222222", 16); SetOneStr(&s -> seq[0].Description, L"Hello, world 0", L"Hola, mundo 0"); SetOneStr(&s -> seq[1].Description, L"Hello, world 1", L"Hola, mundo 1"); SetOneStr(&s -> seq[2].Description, L"Hello, world 2", L"Hola, mundo 2"); if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, s)) return 0; cmsFreeProfileSequenceDescription(s); return 1; case 2: s = (cmsSEQ *) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag); if (s == NULL) return 0; if (s ->n != 3) return 0; if (memcmp(s ->seq[0].ProfileID.ID8, "0123456789ABCDEF", 16) != 0) return 0; if (memcmp(s ->seq[1].ProfileID.ID8, "1111111111111111", 16) != 0) return 0; if (memcmp(s ->seq[2].ProfileID.ID8, "2222222222222222", 16) != 0) return 0; for (i=0; i < 3; i++) { if (!CheckOneStr(s -> seq[i].Description, i)) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckICCViewingConditions(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsICCViewingConditions* v; cmsICCViewingConditions s; switch (Pass) { case 1: s.IlluminantType = 1; s.IlluminantXYZ.X = 0.1; s.IlluminantXYZ.Y = 0.2; s.IlluminantXYZ.Z = 0.3; s.SurroundXYZ.X = 0.4; s.SurroundXYZ.Y = 0.5; s.SurroundXYZ.Z = 0.6; if (!cmsWriteTag(hProfile, cmsSigViewingConditionsTag, &s)) return 0; return 1; case 2: v = (cmsICCViewingConditions *) cmsReadTag(hProfile, cmsSigViewingConditionsTag); if (v == NULL) return 0; if (v ->IlluminantType != 1) return 0; if (!IsGoodVal("IlluminantXYZ.X", v ->IlluminantXYZ.X, 0.1, 0.001)) return 0; if (!IsGoodVal("IlluminantXYZ.Y", v ->IlluminantXYZ.Y, 0.2, 0.001)) return 0; if (!IsGoodVal("IlluminantXYZ.Z", v ->IlluminantXYZ.Z, 0.3, 0.001)) return 0; if (!IsGoodVal("SurroundXYZ.X", v ->SurroundXYZ.X, 0.4, 0.001)) return 0; if (!IsGoodVal("SurroundXYZ.Y", v ->SurroundXYZ.Y, 0.5, 0.001)) return 0; if (!IsGoodVal("SurroundXYZ.Z", v ->SurroundXYZ.Z, 0.6, 0.001)) return 0; return 1; default: return 0; } } static cmsInt32Number CheckVCGT(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsToneCurve* Curves[3]; cmsToneCurve** PtrCurve; switch (Pass) { case 1: Curves[0] = cmsBuildGamma(DbgThread(), 1.1); Curves[1] = cmsBuildGamma(DbgThread(), 2.2); Curves[2] = cmsBuildGamma(DbgThread(), 3.4); if (!cmsWriteTag(hProfile, cmsSigVcgtTag, Curves)) return 0; cmsFreeToneCurveTriple(Curves); return 1; case 2: PtrCurve = (cmsToneCurve **) cmsReadTag(hProfile, cmsSigVcgtTag); if (PtrCurve == NULL) return 0; if (!IsGoodVal("VCGT R", cmsEstimateGamma(PtrCurve[0], 0.01), 1.1, 0.001)) return 0; if (!IsGoodVal("VCGT G", cmsEstimateGamma(PtrCurve[1], 0.01), 2.2, 0.001)) return 0; if (!IsGoodVal("VCGT B", cmsEstimateGamma(PtrCurve[2], 0.01), 3.4, 0.001)) return 0; return 1; default:; } return 0; } // Only one of the two following may be used, as they share the same tag cmsInt32Number CheckDictionary16(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsHANDLE hDict; const cmsDICTentry* e; switch (Pass) { case 1: hDict = cmsDictAlloc(DbgThread()); cmsDictAddEntry(hDict, L"Name0", NULL, NULL, NULL); cmsDictAddEntry(hDict, L"Name1", L"", NULL, NULL); cmsDictAddEntry(hDict, L"Name", L"String", NULL, NULL); cmsDictAddEntry(hDict, L"Name2", L"12", NULL, NULL); if (!cmsWriteTag(hProfile, cmsSigMetaTag, hDict)) return 0; cmsDictFree(hDict); return 1; case 2: hDict = cmsReadTag(hProfile, cmsSigMetaTag); if (hDict == NULL) return 0; e = cmsDictGetEntryList(hDict); if (memcmp(e ->Name, L"Name2", sizeof(wchar_t) * 5) != 0) return 0; if (memcmp(e ->Value, L"12", sizeof(wchar_t) * 2) != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name", sizeof(wchar_t) * 4) != 0) return 0; if (memcmp(e ->Value, L"String", sizeof(wchar_t) * 6) != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name1", sizeof(wchar_t) *5) != 0) return 0; if (e ->Value == NULL) return 0; if (*e->Value != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name0", sizeof(wchar_t) * 5) != 0) return 0; if (e ->Value != NULL) return 0; return 1; default:; } return 0; } cmsInt32Number CheckDictionary24(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsHANDLE hDict; const cmsDICTentry* e; cmsMLU* DisplayName; char Buffer[256]; cmsInt32Number rc = 1; switch (Pass) { case 1: hDict = cmsDictAlloc(DbgThread()); DisplayName = cmsMLUalloc(DbgThread(), 0); cmsMLUsetWide(DisplayName, "en", "US", L"Hello, world"); cmsMLUsetWide(DisplayName, "es", "ES", L"Hola, mundo"); cmsMLUsetWide(DisplayName, "fr", "FR", L"Bonjour, le monde"); cmsMLUsetWide(DisplayName, "ca", "CA", L"Hola, mon"); cmsDictAddEntry(hDict, L"Name", L"String", DisplayName, NULL); cmsMLUfree(DisplayName); cmsDictAddEntry(hDict, L"Name2", L"12", NULL, NULL); if (!cmsWriteTag(hProfile, cmsSigMetaTag, hDict)) return 0; cmsDictFree(hDict); return 1; case 2: hDict = cmsReadTag(hProfile, cmsSigMetaTag); if (hDict == NULL) return 0; e = cmsDictGetEntryList(hDict); if (memcmp(e ->Name, L"Name2", sizeof(wchar_t) * 5) != 0) return 0; if (memcmp(e ->Value, L"12", sizeof(wchar_t) * 2) != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name", sizeof(wchar_t) * 4) != 0) return 0; if (memcmp(e ->Value, L"String", sizeof(wchar_t) * 6) != 0) return 0; cmsMLUgetASCII(e->DisplayName, "en", "US", Buffer, 256); if (strcmp(Buffer, "Hello, world") != 0) rc = 0; cmsMLUgetASCII(e->DisplayName, "es", "ES", Buffer, 256); if (strcmp(Buffer, "Hola, mundo") != 0) rc = 0; cmsMLUgetASCII(e->DisplayName, "fr", "FR", Buffer, 256); if (strcmp(Buffer, "Bonjour, le monde") != 0) rc = 0; cmsMLUgetASCII(e->DisplayName, "ca", "CA", Buffer, 256); if (strcmp(Buffer, "Hola, mon") != 0) rc = 0; if (rc == 0) Fail("Unexpected string '%s'", Buffer); return 1; default:; } return 0; } static cmsInt32Number CheckRAWtags(cmsInt32Number Pass, cmsHPROFILE hProfile) { char Buffer[7]; switch (Pass) { case 1: return cmsWriteRawTag(hProfile, (cmsTagSignature) 0x31323334, "data123", 7); case 2: if (!cmsReadRawTag(hProfile, (cmsTagSignature) 0x31323334, Buffer, 7)) return 0; if (memcmp(Buffer, "data123", 7) != 0) return 0; return 1; default: return 0; } } static cmsInt32Number Check_cicp(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsVideoSignalType* v; cmsVideoSignalType s; switch (Pass) { case 1: s.ColourPrimaries = 1; s.TransferCharacteristics = 13; s.MatrixCoefficients = 0; s.VideoFullRangeFlag = 1; if (!cmsWriteTag(hProfile, cmsSigcicpTag, &s)) return 0; return 1; case 2: v = (cmsVideoSignalType*)cmsReadTag(hProfile, cmsSigcicpTag); if (v == NULL) return 0; if (v->ColourPrimaries != 1) return 0; if (v->TransferCharacteristics != 13) return 0; if (v->MatrixCoefficients != 0) return 0; if (v->VideoFullRangeFlag != 1) return 0; return 1; default: return 0; } } static void SetMHC2Matrix(cmsFloat64Number XYZ2XYZmatrix[3][4]) { XYZ2XYZmatrix[0][0] = 0.5; XYZ2XYZmatrix[0][1] = 0.1; XYZ2XYZmatrix[0][2] = 0.1; XYZ2XYZmatrix[0][3] = 0.0; XYZ2XYZmatrix[1][0] = 0.0; XYZ2XYZmatrix[1][1] = 1.0; XYZ2XYZmatrix[1][2] = 0.0; XYZ2XYZmatrix[1][3] = 0.0; XYZ2XYZmatrix[2][0] = 0.3; XYZ2XYZmatrix[2][1] = 0.2; XYZ2XYZmatrix[2][2] = 0.4; XYZ2XYZmatrix[2][3] = 0.0; } static cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b) { return fabs(b - a) < (1.0 / 65535.0); } cmsBool IsOriginalMHC2Matrix(cmsFloat64Number XYZ2XYZmatrix[3][4]) { cmsFloat64Number m[3][4]; int i, j; SetMHC2Matrix(m); for (i = 0; i < 3; i++) for (j = 0; j < 4; j++) if (!CloseEnough(XYZ2XYZmatrix[i][j], m[i][j])) return FALSE; return TRUE; } static cmsInt32Number Check_MHC2(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsMHC2Type* v; cmsMHC2Type s; double curve[] = { 0, 0.5, 1.0 }; switch (Pass) { case 1: SetMHC2Matrix(s.XYZ2XYZmatrix); s.CurveEntries = 3; s.GreenCurve = curve; s.RedCurve = curve; s.BlueCurve = curve; s.MinLuminance = 0.1; s.PeakLuminance = 100.0; if (!cmsWriteTag(hProfile, cmsSigMHC2Tag, &s)) return 0; return 1; case 2: v = (cmsMHC2Type*)cmsReadTag(hProfile, cmsSigMHC2Tag); if (v == NULL) return 0; if (!IsOriginalMHC2Matrix(v->XYZ2XYZmatrix)) return 0; if (v->CurveEntries != 3) return 0; return 1; default: return 0; } } // This is a very big test that checks every single tag static cmsInt32Number CheckProfileCreation(void) { cmsHPROFILE h; cmsInt32Number Pass; h = cmsCreateProfilePlaceholder(DbgThread()); if (h == NULL) return 0; cmsSetProfileVersion(h, 4.3); if (cmsGetTagCount(h) != 0) { Fail("Empty profile with nonzero number of tags"); goto Error; } if (cmsIsTag(h, cmsSigAToB0Tag)) { Fail("Found a tag in an empty profile"); goto Error; } cmsSetColorSpace(h, cmsSigRgbData); if (cmsGetColorSpace(h) != cmsSigRgbData) { Fail("Unable to set colorspace"); goto Error; } cmsSetPCS(h, cmsSigLabData); if (cmsGetPCS(h) != cmsSigLabData) { Fail("Unable to set colorspace"); goto Error; } cmsSetDeviceClass(h, cmsSigDisplayClass); if (cmsGetDeviceClass(h) != cmsSigDisplayClass) { Fail("Unable to set deviceclass"); goto Error; } cmsSetHeaderRenderingIntent(h, INTENT_SATURATION); if (cmsGetHeaderRenderingIntent(h) != INTENT_SATURATION) { Fail("Unable to set rendering intent"); goto Error; } for (Pass = 1; Pass <= 2; Pass++) { SubTest("Tags holding XYZ"); if (!CheckXYZ(Pass, h, cmsSigBlueColorantTag)) goto Error; if (!CheckXYZ(Pass, h, cmsSigGreenColorantTag)) goto Error; if (!CheckXYZ(Pass, h, cmsSigRedColorantTag)) goto Error; if (!CheckXYZ(Pass, h, cmsSigMediaBlackPointTag)) goto Error; if (!CheckXYZ(Pass, h, cmsSigMediaWhitePointTag)) goto Error; if (!CheckXYZ(Pass, h, cmsSigLuminanceTag)) goto Error; SubTest("Tags holding curves"); if (!CheckGamma(Pass, h, cmsSigBlueTRCTag)) goto Error; if (!CheckGamma(Pass, h, cmsSigGrayTRCTag)) goto Error; if (!CheckGamma(Pass, h, cmsSigGreenTRCTag)) goto Error; if (!CheckGamma(Pass, h, cmsSigRedTRCTag)) goto Error; SubTest("Tags holding text"); if (!CheckTextSingle(Pass, h, cmsSigCharTargetTag)) goto Error; if (!CheckTextSingle(Pass, h, cmsSigScreeningDescTag)) goto Error; if (!CheckText(Pass, h, cmsSigCopyrightTag)) goto Error; if (!CheckText(Pass, h, cmsSigProfileDescriptionTag)) goto Error; if (!CheckText(Pass, h, cmsSigDeviceMfgDescTag)) goto Error; if (!CheckText(Pass, h, cmsSigDeviceModelDescTag)) goto Error; if (!CheckText(Pass, h, cmsSigViewingCondDescTag)) goto Error; SubTest("Tags holding cmsICCData"); if (!CheckData(Pass, h, cmsSigPs2CRD0Tag)) goto Error; if (!CheckData(Pass, h, cmsSigPs2CRD1Tag)) goto Error; if (!CheckData(Pass, h, cmsSigPs2CRD2Tag)) goto Error; if (!CheckData(Pass, h, cmsSigPs2CRD3Tag)) goto Error; if (!CheckData(Pass, h, cmsSigPs2CSATag)) goto Error; if (!CheckData(Pass, h, cmsSigPs2RenderingIntentTag)) goto Error; SubTest("Tags holding signatures"); if (!CheckSignature(Pass, h, cmsSigColorimetricIntentImageStateTag)) goto Error; if (!CheckSignature(Pass, h, cmsSigPerceptualRenderingIntentGamutTag)) goto Error; if (!CheckSignature(Pass, h, cmsSigSaturationRenderingIntentGamutTag)) goto Error; if (!CheckSignature(Pass, h, cmsSigTechnologyTag)) goto Error; SubTest("Tags holding date_time"); if (!CheckDateTime(Pass, h, cmsSigCalibrationDateTimeTag)) goto Error; if (!CheckDateTime(Pass, h, cmsSigDateTimeTag)) goto Error; SubTest("Tags holding named color lists"); if (!CheckNamedColor(Pass, h, cmsSigColorantTableTag, 15, FALSE)) goto Error; if (!CheckNamedColor(Pass, h, cmsSigColorantTableOutTag, 15, FALSE)) goto Error; if (!CheckNamedColor(Pass, h, cmsSigNamedColor2Tag, 4096, TRUE)) goto Error; SubTest("Tags holding LUTs"); if (!CheckLUT(Pass, h, cmsSigAToB0Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigAToB1Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigAToB2Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigBToA0Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigBToA1Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigBToA2Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigPreview0Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigPreview1Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigPreview2Tag)) goto Error; if (!CheckLUT(Pass, h, cmsSigGamutTag)) goto Error; SubTest("Tags holding CHAD"); if (!CheckCHAD(Pass, h, cmsSigChromaticAdaptationTag)) goto Error; SubTest("Tags holding Chromaticity"); if (!CheckChromaticity(Pass, h, cmsSigChromaticityTag)) goto Error; SubTest("Tags holding colorant order"); if (!CheckColorantOrder(Pass, h, cmsSigColorantOrderTag)) goto Error; SubTest("Tags holding measurement"); if (!CheckMeasurement(Pass, h, cmsSigMeasurementTag)) goto Error; SubTest("Tags holding CRD info"); if (!CheckCRDinfo(Pass, h, cmsSigCrdInfoTag)) goto Error; SubTest("Tags holding UCR/BG"); if (!CheckUcrBg(Pass, h, cmsSigUcrBgTag)) goto Error; SubTest("Tags holding MPE"); if (!CheckMPE(Pass, h, cmsSigDToB0Tag)) goto Error; if (!CheckMPE(Pass, h, cmsSigDToB1Tag)) goto Error; if (!CheckMPE(Pass, h, cmsSigDToB2Tag)) goto Error; if (!CheckMPE(Pass, h, cmsSigDToB3Tag)) goto Error; if (!CheckMPE(Pass, h, cmsSigBToD0Tag)) goto Error; if (!CheckMPE(Pass, h, cmsSigBToD1Tag)) goto Error; if (!CheckMPE(Pass, h, cmsSigBToD2Tag)) goto Error; if (!CheckMPE(Pass, h, cmsSigBToD3Tag)) goto Error; SubTest("Tags using screening"); if (!CheckScreening(Pass, h, cmsSigScreeningTag)) goto Error; SubTest("Tags holding profile sequence description"); if (!CheckProfileSequenceTag(Pass, h)) goto Error; if (!CheckProfileSequenceIDTag(Pass, h)) goto Error; SubTest("Tags holding ICC viewing conditions"); if (!CheckICCViewingConditions(Pass, h)) goto Error; SubTest("VCGT tags"); if (!CheckVCGT(Pass, h)) goto Error; SubTest("RAW tags"); if (!CheckRAWtags(Pass, h)) goto Error; SubTest("Dictionary meta tags"); // if (!CheckDictionary16(Pass, h)) goto Error; if (!CheckDictionary24(Pass, h)) goto Error; SubTest("cicp Video Signal Type"); if (!Check_cicp(Pass, h)) goto Error; SubTest("Microsoft MHC2 tag"); if (!Check_MHC2(Pass, h)) goto Error; if (Pass == 1) { cmsSaveProfileToFile(h, "alltags.icc"); cmsCloseProfile(h); h = cmsOpenProfileFromFileTHR(DbgThread(), "alltags.icc", "r"); } } /* Not implemented (by design): cmsSigDataTag = 0x64617461, // 'data' -- Unused cmsSigDeviceSettingsTag = 0x64657673, // 'devs' -- Unused cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' -- Don't use this one, deprecated by ICC cmsSigOutputResponseTag = 0x72657370, // 'resp' -- Possible patent on this */ cmsCloseProfile(h); remove("alltags.icc"); return 1; Error: cmsCloseProfile(h); remove("alltags.icc"); return 0; } // Thanks to Christopher James Halse Rogers for the bugfixing and providing this test static cmsInt32Number CheckVersionHeaderWriting(void) { cmsHPROFILE h; int index; float test_versions[] = { 2.3f, 4.08f, 4.09f, 4.3f }; for (index = 0; index < sizeof(test_versions)/sizeof(test_versions[0]); index++) { h = cmsCreateProfilePlaceholder(DbgThread()); if (h == NULL) return 0; cmsSetProfileVersion(h, test_versions[index]); cmsSaveProfileToFile(h, "versions.icc"); cmsCloseProfile(h); h = cmsOpenProfileFromFileTHR(DbgThread(), "versions.icc", "r"); // Only the first 3 digits are significant if (fabs(cmsGetProfileVersion(h) - test_versions[index]) > 0.005) { Fail("Version failed to round-trip: wrote %.2f, read %.2f", test_versions[index], cmsGetProfileVersion(h)); return 0; } cmsCloseProfile(h); remove("versions.icc"); } return 1; } // Test on Richard Hughes "crayons.icc" static cmsInt32Number CheckMultilocalizedProfile(void) { cmsHPROFILE hProfile; cmsMLU *Pt; char Buffer[256]; hProfile = cmsOpenProfileFromFile("crayons.icc", "r"); Pt = (cmsMLU *) cmsReadTag(hProfile, cmsSigProfileDescriptionTag); cmsMLUgetASCII(Pt, "en", "GB", Buffer, 256); if (strcmp(Buffer, "Crayon Colours") != 0) return FALSE; cmsMLUgetASCII(Pt, "en", "US", Buffer, 256); if (strcmp(Buffer, "Crayon Colors") != 0) return FALSE; cmsCloseProfile(hProfile); return TRUE; } // Error reporting ------------------------------------------------------------------------------------------------------- static void ErrorReportingFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { TrappedError = TRUE; SimultaneousErrors++; strncpy(ReasonToFailBuffer, Text, TEXT_ERROR_BUFFER_SIZE-1); cmsUNUSED_PARAMETER(ContextID); cmsUNUSED_PARAMETER(ErrorCode); } static cmsInt32Number CheckBadProfiles(void) { cmsHPROFILE h; h = cmsOpenProfileFromFileTHR(DbgThread(), "IDoNotExist.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "IAmIllFormed*.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } // No profile name given h = cmsOpenProfileFromFileTHR(DbgThread(), "", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "..", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "IHaveBadAccessMode.icc", "@"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "bad.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "toosmall.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromMemTHR(DbgThread(), NULL, 3); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromMemTHR(DbgThread(), "123", 3); if (h != NULL) { cmsCloseProfile(h); return 0; } if (SimultaneousErrors != 9) return 0; return 1; } static cmsInt32Number CheckErrReportingOnBadProfiles(void) { cmsInt32Number rc; cmsSetLogErrorHandler(ErrorReportingFunction); rc = CheckBadProfiles(); cmsSetLogErrorHandler(FatalErrorQuit); // Reset the error state TrappedError = FALSE; return rc; } static cmsInt32Number CheckBadTransforms(void) { cmsHPROFILE h1 = cmsCreate_sRGBProfile(); cmsHTRANSFORM x1; x1 = cmsCreateTransform(NULL, 0, NULL, 0, 0, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } x1 = cmsCreateTransform(h1, TYPE_RGB_8, h1, TYPE_RGB_8, 12345, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } x1 = cmsCreateTransform(h1, TYPE_CMYK_8, h1, TYPE_RGB_8, 0, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } x1 = cmsCreateTransform(h1, TYPE_RGB_8, h1, TYPE_CMYK_8, 1, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } // sRGB does its output as XYZ! x1 = cmsCreateTransform(h1, TYPE_RGB_8, NULL, TYPE_Lab_8, 1, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } cmsCloseProfile(h1); { cmsHPROFILE hp1 = cmsOpenProfileFromFile("test1.icc", "r"); cmsHPROFILE hp2 = cmsCreate_sRGBProfile(); x1 = cmsCreateTransform(hp1, TYPE_BGR_8, hp2, TYPE_BGR_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hp1); cmsCloseProfile(hp2); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } } return 1; } static cmsInt32Number CheckErrReportingOnBadTransforms(void) { cmsInt32Number rc; cmsSetLogErrorHandler(ErrorReportingFunction); rc = CheckBadTransforms(); cmsSetLogErrorHandler(FatalErrorQuit); // Reset the error state TrappedError = FALSE; return rc; } // --------------------------------------------------------------------------------------------------------- // Check a linear xform static cmsInt32Number Check8linearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt8Number Inw[cmsMAXCHANNELS], Outw[cmsMAXCHANNELS]; n2=0; for (j=0; j < 0xFF; j++) { memset(Inw, j, sizeof(Inw)); cmsDoTransform(xform, Inw, Outw, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw[i] - j); if (dif > n2) n2 = dif; } } // We allow 2 contone of difference on 8 bits if (n2 > 2) { Fail("Differences too big (%x)", n2); return 0; } return 1; } static cmsInt32Number Compare8bitXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt8Number Inw[cmsMAXCHANNELS], Outw1[cmsMAXCHANNELS], Outw2[cmsMAXCHANNELS];; n2=0; for (j=0; j < 0xFF; j++) { memset(Inw, j, sizeof(Inw)); cmsDoTransform(xform1, Inw, Outw1, 1); cmsDoTransform(xform2, Inw, Outw2, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw2[i] - Outw1[i]); if (dif > n2) n2 = dif; } } // We allow 2 contone of difference on 8 bits if (n2 > 2) { Fail("Differences too big (%x)", n2); return 0; } return 1; } // Check a linear xform static cmsInt32Number Check16linearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[cmsMAXCHANNELS], Outw[cmsMAXCHANNELS]; n2=0; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) Inw[i] = (cmsUInt16Number) j; cmsDoTransform(xform, Inw, Outw, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw[i] - j); if (dif > n2) n2 = dif; } // We allow 2 contone of difference on 16 bits if (n2 > 0x200) { Fail("Differences too big (%x)", n2); return 0; } } return 1; } static cmsInt32Number Compare16bitXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[cmsMAXCHANNELS], Outw1[cmsMAXCHANNELS], Outw2[cmsMAXCHANNELS];; n2=0; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) Inw[i] = (cmsUInt16Number) j; cmsDoTransform(xform1, Inw, Outw1, 1); cmsDoTransform(xform2, Inw, Outw2, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw2[i] - Outw1[i]); if (dif > n2) n2 = dif; } } // We allow 2 contone of difference on 16 bits if (n2 > 0x200) { Fail("Differences too big (%x)", n2); return 0; } return 1; } // Check a linear xform static cmsInt32Number CheckFloatlinearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) { cmsInt32Number i, j; cmsFloat32Number In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) In[i] = (cmsFloat32Number) (j / 65535.0);; cmsDoTransform(xform, In, Out, 1); for (i=0; i < nChan; i++) { // We allow no difference in floating point if (!IsGoodFixed15_16("linear xform cmsFloat32Number", Out[i], (cmsFloat32Number) (j / 65535.0))) return 0; } } return 1; } // Check a linear xform static cmsInt32Number CompareFloatXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) { cmsInt32Number i, j; cmsFloat32Number In[cmsMAXCHANNELS], Out1[cmsMAXCHANNELS], Out2[cmsMAXCHANNELS]; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) In[i] = (cmsFloat32Number) (j / 65535.0);; cmsDoTransform(xform1, In, Out1, 1); cmsDoTransform(xform2, In, Out2, 1); for (i=0; i < nChan; i++) { // We allow no difference in floating point if (!IsGoodFixed15_16("linear xform cmsFloat32Number", Out1[i], Out2[i])) return 0; } } return 1; } // Curves only transforms ---------------------------------------------------------------------------------------- static cmsInt32Number CheckCurvesOnlyTransforms(void) { cmsHTRANSFORM xform1, xform2; cmsHPROFILE h1, h2, h3; cmsToneCurve* c1, *c2, *c3; cmsInt32Number rc = 1; c1 = cmsBuildGamma(DbgThread(), 2.2); c2 = cmsBuildGamma(DbgThread(), 1/2.2); c3 = cmsBuildGamma(DbgThread(), 4.84); h1 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c1); h2 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c2); h3 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c3); SubTest("Gray float optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_FLT, h2, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); rc &= CheckFloatlinearXFORM(xform1, 1); cmsDeleteTransform(xform1); if (rc == 0) goto Error; SubTest("Gray 8 optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_8, h2, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); rc &= Check8linearXFORM(xform1, 1); cmsDeleteTransform(xform1); if (rc == 0) goto Error; SubTest("Gray 16 optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_16, h2, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); rc &= Check16linearXFORM(xform1, 1); cmsDeleteTransform(xform1); if (rc == 0) goto Error; SubTest("Gray float non-optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_FLT, h1, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); xform2 = cmsCreateTransform(h3, TYPE_GRAY_FLT, NULL, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); rc &= CompareFloatXFORM(xform1, xform2, 1); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); if (rc == 0) goto Error; SubTest("Gray 8 non-optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_8, h1, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); xform2 = cmsCreateTransform(h3, TYPE_GRAY_8, NULL, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); rc &= Compare8bitXFORM(xform1, xform2, 1); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); if (rc == 0) goto Error; SubTest("Gray 16 non-optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_16, h1, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); xform2 = cmsCreateTransform(h3, TYPE_GRAY_16, NULL, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); rc &= Compare16bitXFORM(xform1, xform2, 1); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); if (rc == 0) goto Error; Error: cmsCloseProfile(h1); cmsCloseProfile(h2); cmsCloseProfile(h3); cmsFreeToneCurve(c1); cmsFreeToneCurve(c2); cmsFreeToneCurve(c3); return rc; } // Lab to Lab trivial transforms ---------------------------------------------------------------------------------------- static cmsFloat64Number MaxDE; static cmsInt32Number CheckOneLab(cmsHTRANSFORM xform, cmsFloat64Number L, cmsFloat64Number a, cmsFloat64Number b) { cmsCIELab In, Out; cmsFloat64Number dE; In.L = L; In.a = a; In.b = b; cmsDoTransform(xform, &In, &Out, 1); dE = cmsDeltaE(&In, &Out); if (dE > MaxDE) MaxDE = dE; if (MaxDE > 0.003) { Fail("dE=%f Lab1=(%f, %f, %f)\n\tLab2=(%f %f %f)", MaxDE, In.L, In.a, In.b, Out.L, Out.a, Out.b); cmsDoTransform(xform, &In, &Out, 1); return 0; } return 1; } // Check several Lab, slicing at non-exact values. Precision should be 16 bits. 50x50x50 checks aprox. static cmsInt32Number CheckSeveralLab(cmsHTRANSFORM xform) { cmsInt32Number L, a, b; MaxDE = 0; for (L=0; L < 65536; L += 1311) { for (a = 0; a < 65536; a += 1232) { for (b = 0; b < 65536; b += 1111) { if (!CheckOneLab(xform, (L * 100.0) / 65535.0, (a / 257.0) - 128, (b / 257.0) - 128)) return 0; } } } return 1; } static cmsInt32Number OneTrivialLab(cmsHPROFILE hLab1, cmsHPROFILE hLab2, const char* txt) { cmsHTRANSFORM xform; cmsInt32Number rc; SubTest(txt); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); rc = CheckSeveralLab(xform); cmsDeleteTransform(xform); return rc; } static cmsInt32Number CheckFloatLabTransforms(void) { return OneTrivialLab(cmsCreateLab4ProfileTHR(DbgThread(), NULL), cmsCreateLab4ProfileTHR(DbgThread(), NULL), "Lab4/Lab4") && OneTrivialLab(cmsCreateLab2ProfileTHR(DbgThread(), NULL), cmsCreateLab2ProfileTHR(DbgThread(), NULL), "Lab2/Lab2") && OneTrivialLab(cmsCreateLab4ProfileTHR(DbgThread(), NULL), cmsCreateLab2ProfileTHR(DbgThread(), NULL), "Lab4/Lab2") && OneTrivialLab(cmsCreateLab2ProfileTHR(DbgThread(), NULL), cmsCreateLab4ProfileTHR(DbgThread(), NULL), "Lab2/Lab4"); } static cmsInt32Number CheckEncodedLabTransforms(void) { cmsHTRANSFORM xform; cmsUInt16Number In[3]; cmsUInt16Number wLab[3]; cmsCIELab Lab; cmsCIELab White = { 100, 0, 0 }; cmsCIELab Color = { 7.11070, -76, 26 }; cmsHPROFILE hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); cmsHPROFILE hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_16, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); In[0] = 0xFFFF; In[1] = 0x8080; In[2] = 0x8080; cmsDoTransform(xform, In, &Lab, 1); if (cmsDeltaE(&Lab, &White) > 0.0001) return 0; In[0] = 0x1234; In[1] = 0x3434; In[2] = 0x9A9A; cmsDoTransform(xform, In, &Lab, 1); cmsFloat2LabEncoded(wLab, &Lab); if (memcmp(In, wLab, sizeof(wLab)) != 0) return 0; if (cmsDeltaE(&Lab, &Color) > 0.0001) return 0; cmsDeleteTransform(xform); hLab1 = cmsCreateLab2ProfileTHR(DbgThread(), NULL); hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_LabV2_16, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); In[0] = 0xFF00; In[1] = 0x8000; In[2] = 0x8000; cmsDoTransform(xform, In, &Lab, 1); if (cmsDeltaE(&Lab, &White) > 0.0001) return 0; cmsDeleteTransform(xform); hLab2 = cmsCreateLab2ProfileTHR(DbgThread(), NULL); hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_LabV2_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); Lab.L = 100; Lab.a = 0; Lab.b = 0; cmsDoTransform(xform, &Lab, In, 1); if (In[0] != 0xFF00 || In[1] != 0x8000 || In[2] != 0x8000) return 0; cmsDeleteTransform(xform); hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); Lab.L = 100; Lab.a = 0; Lab.b = 0; cmsDoTransform(xform, &Lab, In, 1); if (In[0] != 0xFFFF || In[1] != 0x8080 || In[2] != 0x8080) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckStoredIdentities(void) { cmsHPROFILE hLab, hLink, h4, h2; cmsHTRANSFORM xform; cmsInt32Number rc = 1; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab, TYPE_Lab_8, hLab, TYPE_Lab_8, 0, 0); hLink = cmsTransform2DeviceLink(xform, 3.4, 0); cmsSaveProfileToFile(hLink, "abstractv2.icc"); cmsCloseProfile(hLink); hLink = cmsTransform2DeviceLink(xform, 4.3, 0); cmsSaveProfileToFile(hLink, "abstractv4.icc"); cmsCloseProfile(hLink); cmsDeleteTransform(xform); cmsCloseProfile(hLab); h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h4, TYPE_Lab_DBL, h4, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); SubTest("V4"); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h4); if (!rc) goto Error; SubTest("V2"); h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h2, TYPE_Lab_DBL, h2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h2); if (!rc) goto Error; SubTest("V2 -> V4"); h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h4, TYPE_Lab_DBL, h2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h2); cmsCloseProfile(h4); SubTest("V4 -> V2"); h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h2, TYPE_Lab_DBL, h4, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h2); cmsCloseProfile(h4); Error: remove("abstractv2.icc"); remove("abstractv4.icc"); return rc; } // Check a simple xform from a matrix profile to itself. Test floating point accuracy. static cmsInt32Number CheckMatrixShaperXFORMFloat(void) { cmsHPROFILE hAbove, hSRGB; cmsHTRANSFORM xform; cmsInt32Number rc1, rc2; hAbove = Create_AboveRGB(); xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hAbove); rc1 = CheckFloatlinearXFORM(xform, 3); cmsDeleteTransform(xform); hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_FLT, hSRGB, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hSRGB); rc2 = CheckFloatlinearXFORM(xform, 3); cmsDeleteTransform(xform); return rc1 && rc2; } // Check a simple xform from a matrix profile to itself. Test 16 bits accuracy. static cmsInt32Number CheckMatrixShaperXFORM16(void) { cmsHPROFILE hAbove, hSRGB; cmsHTRANSFORM xform; cmsInt32Number rc1, rc2; hAbove = Create_AboveRGB(); xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hAbove); rc1 = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_16, hSRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hSRGB); rc2 = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc1 && rc2; } // Check a simple xform from a matrix profile to itself. Test 8 bits accuracy. static cmsInt32Number CheckMatrixShaperXFORM8(void) { cmsHPROFILE hAbove, hSRGB; cmsHTRANSFORM xform; cmsInt32Number rc1, rc2; hAbove = Create_AboveRGB(); xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_8, hAbove, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hAbove); rc1 = Check8linearXFORM(xform, 3); cmsDeleteTransform(xform); hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_8, hSRGB, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hSRGB); rc2 = Check8linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc1 && rc2; } // TODO: Check LUT based to LUT based transforms for CMYK // ----------------------------------------------------------------------------------------------------------------- // Check known values going from sRGB to XYZ static cmsInt32Number CheckOneRGB_f(cmsHTRANSFORM xform, cmsInt32Number R, cmsInt32Number G, cmsInt32Number B, cmsFloat64Number X, cmsFloat64Number Y, cmsFloat64Number Z, cmsFloat64Number err) { cmsFloat32Number RGB[3]; cmsFloat64Number Out[3]; RGB[0] = (cmsFloat32Number) (R / 255.0); RGB[1] = (cmsFloat32Number) (G / 255.0); RGB[2] = (cmsFloat32Number) (B / 255.0); cmsDoTransform(xform, RGB, Out, 1); return IsGoodVal("X", X , Out[0], err) && IsGoodVal("Y", Y , Out[1], err) && IsGoodVal("Z", Z , Out[2], err); } static cmsInt32Number Chack_sRGB_Float(void) { cmsHPROFILE hsRGB, hXYZ, hLab; cmsHTRANSFORM xform1, xform2; cmsInt32Number rc; hsRGB = cmsCreate_sRGBProfileTHR(DbgThread()); hXYZ = cmsCreateXYZProfileTHR(DbgThread()); hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform1 = cmsCreateTransformTHR(DbgThread(), hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); xform2 = cmsCreateTransformTHR(DbgThread(), hsRGB, TYPE_RGB_FLT, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hsRGB); cmsCloseProfile(hXYZ); cmsCloseProfile(hLab); MaxErr = 0; // Xform 1 goes from 8 bits to XYZ, rc = CheckOneRGB_f(xform1, 1, 1, 1, 0.0002927, 0.0003035, 0.000250, 0.0001); rc &= CheckOneRGB_f(xform1, 127, 127, 127, 0.2046329, 0.212230, 0.175069, 0.0001); rc &= CheckOneRGB_f(xform1, 12, 13, 15, 0.0038364, 0.0039928, 0.003853, 0.0001); rc &= CheckOneRGB_f(xform1, 128, 0, 0, 0.0941240, 0.0480256, 0.003005, 0.0001); rc &= CheckOneRGB_f(xform1, 190, 25, 210, 0.3204592, 0.1605926, 0.468213, 0.0001); // Xform 2 goes from 8 bits to Lab, we allow 0.01 error max rc &= CheckOneRGB_f(xform2, 1, 1, 1, 0.2741748, 0, 0, 0.01); rc &= CheckOneRGB_f(xform2, 127, 127, 127, 53.192776, 0, 0, 0.01); rc &= CheckOneRGB_f(xform2, 190, 25, 210, 47.052136, 74.565610, -56.883274, 0.01); rc &= CheckOneRGB_f(xform2, 128, 0, 0, 26.164701, 48.478171, 39.4384713, 0.01); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); return rc; } // --------------------------------------------------- static cmsBool GetProfileRGBPrimaries(cmsHPROFILE hProfile, cmsCIEXYZTRIPLE *result, cmsUInt32Number intent) { cmsHPROFILE hXYZ; cmsHTRANSFORM hTransform; cmsFloat64Number rgb[3][3] = {{1., 0., 0.}, {0., 1., 0.}, {0., 0., 1.}}; hXYZ = cmsCreateXYZProfile(); if (hXYZ == NULL) return FALSE; hTransform = cmsCreateTransform(hProfile, TYPE_RGB_DBL, hXYZ, TYPE_XYZ_DBL, intent, cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE); cmsCloseProfile(hXYZ); if (hTransform == NULL) return FALSE; cmsDoTransform(hTransform, rgb, result, 3); cmsDeleteTransform(hTransform); return TRUE; } static int CheckRGBPrimaries(void) { cmsHPROFILE hsRGB; cmsCIEXYZTRIPLE tripXYZ; cmsCIExyYTRIPLE tripxyY; cmsBool result; cmsSetAdaptationState(0); hsRGB = cmsCreate_sRGBProfileTHR(DbgThread()); if (!hsRGB) return 0; result = GetProfileRGBPrimaries(hsRGB, &tripXYZ, INTENT_ABSOLUTE_COLORIMETRIC); cmsCloseProfile(hsRGB); if (!result) return 0; cmsXYZ2xyY(&tripxyY.Red, &tripXYZ.Red); cmsXYZ2xyY(&tripxyY.Green, &tripXYZ.Green); cmsXYZ2xyY(&tripxyY.Blue, &tripXYZ.Blue); /* values were taken from http://en.wikipedia.org/wiki/RGB_color_spaces#Specifications */ if (!IsGoodFixed15_16("xRed", tripxyY.Red.x, 0.64) || !IsGoodFixed15_16("yRed", tripxyY.Red.y, 0.33) || !IsGoodFixed15_16("xGreen", tripxyY.Green.x, 0.30) || !IsGoodFixed15_16("yGreen", tripxyY.Green.y, 0.60) || !IsGoodFixed15_16("xBlue", tripxyY.Blue.x, 0.15) || !IsGoodFixed15_16("yBlue", tripxyY.Blue.y, 0.06)) { Fail("One or more primaries are wrong."); return FALSE; } return TRUE; } // ----------------------------------------------------------------------------------------------------------------- // This function will check CMYK -> CMYK transforms. It uses FOGRA29 and SWOP ICC profiles static cmsInt32Number CheckCMYK(cmsInt32Number Intent, const char *Profile1, const char* Profile2) { cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), Profile1, "r"); cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), Profile2, "r"); cmsHTRANSFORM xform, swop_lab, fogra_lab; cmsFloat32Number CMYK1[4], CMYK2[4]; cmsCIELab Lab1, Lab2; cmsHPROFILE hLab; cmsFloat64Number DeltaL, Max; cmsInt32Number i; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, Intent, 0); swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, Intent, 0); fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, Intent, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 10; CMYK1[1] = 20; CMYK1[2] = 30; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsDeleteTransform(xform); xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, Intent, 0); for (i=0; i <= 100; i++) { CMYK1[0] = 10; CMYK1[1] = 20; CMYK1[2] = 30; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsCloseProfile(hSWOP); cmsCloseProfile(hFOGRA); cmsCloseProfile(hLab); cmsDeleteTransform(xform); cmsDeleteTransform(swop_lab); cmsDeleteTransform(fogra_lab); return Max < 3.0; } static cmsInt32Number CheckCMYKRoundtrip(void) { return CheckCMYK(INTENT_RELATIVE_COLORIMETRIC, "test1.icc", "test1.icc"); } static cmsInt32Number CheckCMYKPerceptual(void) { return CheckCMYK(INTENT_PERCEPTUAL, "test1.icc", "test2.icc"); } #if 0 static cmsInt32Number CheckCMYKRelCol(void) { return CheckCMYK(INTENT_RELATIVE_COLORIMETRIC, "test1.icc", "test2.icc"); } #endif static cmsInt32Number CheckKOnlyBlackPreserving(void) { cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); cmsHTRANSFORM xform, swop_lab, fogra_lab; cmsFloat32Number CMYK1[4], CMYK2[4]; cmsCIELab Lab1, Lab2; cmsHPROFILE hLab; cmsFloat64Number DeltaL, Max; cmsInt32Number i; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, INTENT_PRESERVE_K_ONLY_PERCEPTUAL, 0); swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 0; CMYK1[1] = 0; CMYK1[2] = 0; CMYK1[3] = (cmsFloat32Number) i; // SWOP CMYK to Lab1 cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); // SWOP To FOGRA using black preservation cmsDoTransform(xform, CMYK1, CMYK2, 1); // Obtained FOGRA CMYK to Lab2 cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); // We care only on L* DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsDeleteTransform(xform); // dL should be below 3.0 // Same, but FOGRA to SWOP xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, INTENT_PRESERVE_K_ONLY_PERCEPTUAL, 0); for (i=0; i <= 100; i++) { CMYK1[0] = 0; CMYK1[1] = 0; CMYK1[2] = 0; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsCloseProfile(hSWOP); cmsCloseProfile(hFOGRA); cmsCloseProfile(hLab); cmsDeleteTransform(xform); cmsDeleteTransform(swop_lab); cmsDeleteTransform(fogra_lab); return Max < 3.0; } static cmsInt32Number CheckKPlaneBlackPreserving(void) { cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); cmsHTRANSFORM xform, swop_lab, fogra_lab; cmsFloat32Number CMYK1[4], CMYK2[4]; cmsCIELab Lab1, Lab2; cmsHPROFILE hLab; cmsFloat64Number DeltaE, Max; cmsInt32Number i; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, INTENT_PERCEPTUAL, 0); swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 0; CMYK1[1] = 0; CMYK1[2] = 0; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); DeltaE = cmsDeltaE(&Lab1, &Lab2); if (DeltaE > Max) Max = DeltaE; } cmsDeleteTransform(xform); xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, INTENT_PRESERVE_K_PLANE_PERCEPTUAL, 0); for (i=0; i <= 100; i++) { CMYK1[0] = 30; CMYK1[1] = 20; CMYK1[2] = 10; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); DeltaE = cmsDeltaE(&Lab1, &Lab2); if (DeltaE > Max) Max = DeltaE; } cmsDeleteTransform(xform); cmsCloseProfile(hSWOP); cmsCloseProfile(hFOGRA); cmsCloseProfile(hLab); cmsDeleteTransform(swop_lab); cmsDeleteTransform(fogra_lab); return Max < 30.0; } // ------------------------------------------------------------------------------------------------------ static cmsInt32Number CheckProofingXFORMFloat(void) { cmsHPROFILE hAbove; cmsHTRANSFORM xform; cmsInt32Number rc; hAbove = Create_AboveRGB(); xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, hAbove, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_SOFTPROOFING); cmsCloseProfile(hAbove); rc = CheckFloatlinearXFORM(xform, 3); cmsDeleteTransform(xform); return rc; } static cmsInt32Number CheckProofingXFORM16(void) { cmsHPROFILE hAbove; cmsHTRANSFORM xform; cmsInt32Number rc; hAbove = Create_AboveRGB(); xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, hAbove, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_SOFTPROOFING|cmsFLAGS_NOCACHE); cmsCloseProfile(hAbove); rc = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc; } static cmsInt32Number CheckGamutCheck(void) { cmsHPROFILE hSRGB, hAbove; cmsHTRANSFORM xform; cmsInt32Number rc; cmsUInt16Number Alarm[16] = { 0xDEAD, 0xBABE, 0xFACE }; // Set alarm codes to fancy values so we could check the out of gamut condition cmsSetAlarmCodes(Alarm); // Create the profiles hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); hAbove = Create_AboveRGB(); if (hSRGB == NULL || hAbove == NULL) return 0; // Failed SubTest("Gamut check on floating point"); // Create a gamut checker in the same space. No value should be out of gamut xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, hAbove, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK); if (!CheckFloatlinearXFORM(xform, 3)) { cmsCloseProfile(hSRGB); cmsCloseProfile(hAbove); cmsDeleteTransform(xform); Fail("Gamut check on same profile failed"); return 0; } cmsDeleteTransform(xform); SubTest("Gamut check on 16 bits"); xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, hSRGB, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK); cmsCloseProfile(hSRGB); cmsCloseProfile(hAbove); rc = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc; } // ------------------------------------------------------------------------------------------------------------------- static cmsInt32Number CheckBlackPoint(void) { cmsHPROFILE hProfile; cmsCIEXYZ Black; cmsCIELab Lab; hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test5.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "lcms2cmyk.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_PERCEPTUAL, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); return 1; } static cmsInt32Number CheckOneTAC(cmsFloat64Number InkLimit) { cmsHPROFILE h; cmsFloat64Number d; h =CreateFakeCMYK(InkLimit, TRUE); cmsSaveProfileToFile(h, "lcmstac.icc"); cmsCloseProfile(h); h = cmsOpenProfileFromFile("lcmstac.icc", "r"); d = cmsDetectTAC(h); cmsCloseProfile(h); remove("lcmstac.icc"); if (fabs(d - InkLimit) > 5) return 0; return 1; } static cmsInt32Number CheckTAC(void) { if (!CheckOneTAC(180)) return 0; if (!CheckOneTAC(220)) return 0; if (!CheckOneTAC(286)) return 0; if (!CheckOneTAC(310)) return 0; if (!CheckOneTAC(330)) return 0; return 1; } // ------------------------------------------------------------------------------------------------------- #define NPOINTS_IT8 10 // (17*17*17*17) static cmsInt32Number CheckCGATS(void) { cmsHANDLE it8; cmsInt32Number i; SubTest("IT8 creation"); it8 = cmsIT8Alloc(DbgThread()); if (it8 == NULL) return 0; cmsIT8SetSheetType(it8, "LCMS/TESTING"); cmsIT8SetPropertyStr(it8, "ORIGINATOR", "1 2 3 4"); cmsIT8SetPropertyUncooked(it8, "DESCRIPTOR", "1234"); cmsIT8SetPropertyStr(it8, "MANUFACTURER", "3"); cmsIT8SetPropertyDbl(it8, "CREATED", 4); cmsIT8SetPropertyDbl(it8, "SERIAL", 5); cmsIT8SetPropertyHex(it8, "MATERIAL", 0x123); cmsIT8SetPropertyDbl(it8, "NUMBER_OF_SETS", NPOINTS_IT8); cmsIT8SetPropertyDbl(it8, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(it8, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(it8, 1, "RGB_R"); cmsIT8SetDataFormat(it8, 2, "RGB_G"); cmsIT8SetDataFormat(it8, 3, "RGB_B"); SubTest("Table creation"); for (i=0; i < NPOINTS_IT8; i++) { char Patch[20]; sprintf(Patch, "P%d", i); cmsIT8SetDataRowCol(it8, i, 0, Patch); cmsIT8SetDataRowColDbl(it8, i, 1, i); cmsIT8SetDataRowColDbl(it8, i, 2, i); cmsIT8SetDataRowColDbl(it8, i, 3, i); } SubTest("Save to file"); cmsIT8SaveToFile(it8, "TEST.IT8"); cmsIT8Free(it8); SubTest("Load from file"); it8 = cmsIT8LoadFromFile(DbgThread(), "TEST.IT8"); if (it8 == NULL) return 0; SubTest("Save again file"); cmsIT8SaveToFile(it8, "TEST.IT8"); cmsIT8Free(it8); SubTest("Load from file (II)"); it8 = cmsIT8LoadFromFile(DbgThread(), "TEST.IT8"); if (it8 == NULL) return 0; SubTest("Change prop value"); if (cmsIT8GetPropertyDbl(it8, "DESCRIPTOR") != 1234) { return 0; } cmsIT8SetPropertyDbl(it8, "DESCRIPTOR", 5678); if (cmsIT8GetPropertyDbl(it8, "DESCRIPTOR") != 5678) { return 0; } SubTest("Positive numbers"); if (cmsIT8GetDataDbl(it8, "P3", "RGB_G") != 3) { return 0; } SubTest("Positive exponent numbers"); cmsIT8SetPropertyDbl(it8, "DBL_PROP", 123E+12); if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP") - 123E+12) > 1 ) { return 0; } SubTest("Negative exponent numbers"); cmsIT8SetPropertyDbl(it8, "DBL_PROP_NEG", 123E-45); if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP_NEG") - 123E-45) > 1E-45 ) { return 0; } SubTest("Negative numbers"); cmsIT8SetPropertyDbl(it8, "DBL_NEG_VAL", -123); if ((cmsIT8GetPropertyDbl(it8, "DBL_NEG_VAL")) != -123 ) { return 0; } cmsIT8Free(it8); remove("TEST.IT8"); return 1; } static cmsInt32Number CheckCGATS2(void) { cmsHANDLE handle; const cmsUInt8Number junk[] = { 0x0, 0xd, 0xd, 0xa, 0x20, 0xd, 0x20, 0x20, 0x20, 0x3a, 0x31, 0x3d, 0x3d, 0x3d, 0x3d }; handle = cmsIT8LoadFromMem(0, (const void*)junk, sizeof(junk)); if (handle) cmsIT8Free(handle); return 1; } static cmsInt32Number CheckCGATS_Overflow(void) { cmsHANDLE handle; const cmsUInt8Number junk[] = { "@\nA 1.e2147483648\n" }; handle = cmsIT8LoadFromMem(0, (const void*)junk, sizeof(junk)); if (handle) cmsIT8Free(handle); return 1; } // Create CSA/CRD static void GenerateCSA(const char* cInProf, const char* FileName) { cmsHPROFILE hProfile; cmsUInt32Number n; char* Buffer; cmsContext BuffThread = DbgThread(); FILE* o; if (cInProf == NULL) hProfile = cmsCreateLab4Profile(NULL); else hProfile = cmsOpenProfileFromFile(cInProf, "r"); n = cmsGetPostScriptCSA(DbgThread(), hProfile, 0, 0, NULL, 0); if (n == 0) return; Buffer = (char*) _cmsMalloc(BuffThread, n + 1); cmsGetPostScriptCSA(DbgThread(), hProfile, 0, 0, Buffer, n); Buffer[n] = 0; if (FileName != NULL) { o = fopen(FileName, "wb"); fwrite(Buffer, n, 1, o); fclose(o); } _cmsFree(BuffThread, Buffer); cmsCloseProfile(hProfile); if (FileName != NULL) remove(FileName); } static void GenerateCRD(const char* cOutProf, const char* FileName) { cmsHPROFILE hProfile; cmsUInt32Number n; char* Buffer; cmsUInt32Number dwFlags = 0; cmsContext BuffThread = DbgThread(); if (cOutProf == NULL) hProfile = cmsCreateLab4Profile(NULL); else hProfile = cmsOpenProfileFromFile(cOutProf, "r"); n = cmsGetPostScriptCRD(DbgThread(), hProfile, 0, dwFlags, NULL, 0); if (n == 0) return; Buffer = (char*) _cmsMalloc(BuffThread, n + 1); cmsGetPostScriptCRD(DbgThread(), hProfile, 0, dwFlags, Buffer, n); Buffer[n] = 0; if (FileName != NULL) { FILE* o = fopen(FileName, "wb"); fwrite(Buffer, n, 1, o); fclose(o); } _cmsFree(BuffThread, Buffer); cmsCloseProfile(hProfile); if (FileName != NULL) remove(FileName); } static cmsInt32Number CheckPostScript(void) { GenerateCSA("test5.icc", "sRGB_CSA.ps"); GenerateCSA("aRGBlcms2.icc", "aRGB_CSA.ps"); GenerateCSA("test4.icc", "sRGBV4_CSA.ps"); GenerateCSA("test1.icc", "SWOP_CSA.ps"); GenerateCSA(NULL, "Lab_CSA.ps"); GenerateCSA("graylcms2.icc", "gray_CSA.ps"); GenerateCRD("test5.icc", "sRGB_CRD.ps"); GenerateCRD("aRGBlcms2.icc", "aRGB_CRD.ps"); GenerateCRD(NULL, "Lab_CRD.ps"); GenerateCRD("test1.icc", "SWOP_CRD.ps"); GenerateCRD("test4.icc", "sRGBV4_CRD.ps"); GenerateCRD("graylcms2.icc", "gray_CRD.ps"); return 1; } static cmsInt32Number CheckGray(cmsHTRANSFORM xform, cmsUInt8Number g, double L) { cmsCIELab Lab; cmsDoTransform(xform, &g, &Lab, 1); if (!IsGoodVal("a axis on gray", 0, Lab.a, 0.001)) return 0; if (!IsGoodVal("b axis on gray", 0, Lab.b, 0.001)) return 0; return IsGoodVal("Gray value", L, Lab.L, 0.01); } static cmsInt32Number CheckInputGray(void) { cmsHPROFILE hGray = Create_Gray22(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform(hGray, TYPE_GRAY_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckGray(xform, 0, 0)) return 0; if (!CheckGray(xform, 125, 52.768)) return 0; if (!CheckGray(xform, 200, 81.069)) return 0; if (!CheckGray(xform, 255, 100.0)) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckLabInputGray(void) { cmsHPROFILE hGray = Create_GrayLab(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform(hGray, TYPE_GRAY_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckGray(xform, 0, 0)) return 0; if (!CheckGray(xform, 125, 49.019)) return 0; if (!CheckGray(xform, 200, 78.431)) return 0; if (!CheckGray(xform, 255, 100.0)) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckOutGray(cmsHTRANSFORM xform, double L, cmsUInt8Number g) { cmsCIELab Lab; cmsUInt8Number g_out; Lab.L = L; Lab.a = 0; Lab.b = 0; cmsDoTransform(xform, &Lab, &g_out, 1); return IsGoodVal("Gray value", g, (double) g_out, 1); } static cmsInt32Number CheckOutputGray(void) { cmsHPROFILE hGray = Create_Gray22(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform( hLab, TYPE_Lab_DBL, hGray, TYPE_GRAY_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckOutGray(xform, 0, 0)) return 0; if (!CheckOutGray(xform, 100, 255)) return 0; if (!CheckOutGray(xform, 20, 52)) return 0; if (!CheckOutGray(xform, 50, 118)) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckLabOutputGray(void) { cmsHPROFILE hGray = Create_GrayLab(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; cmsInt32Number i; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform( hLab, TYPE_Lab_DBL, hGray, TYPE_GRAY_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckOutGray(xform, 0, 0)) return 0; if (!CheckOutGray(xform, 100, 255)) return 0; for (i=0; i < 100; i++) { cmsUInt8Number g; g = (cmsUInt8Number) floor(i * 255.0 / 100.0 + 0.5); if (!CheckOutGray(xform, i, g)) return 0; } cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckV4gamma(void) { cmsHPROFILE h; cmsUInt16Number Lin[] = {0, 0xffff}; cmsToneCurve*g = cmsBuildTabulatedToneCurve16(DbgThread(), 2, Lin); h = cmsOpenProfileFromFileTHR(DbgThread(), "v4gamma.icc", "w"); if (h == NULL) return 0; cmsSetProfileVersion(h, 4.3); if (!cmsWriteTag(h, cmsSigGrayTRCTag, g)) return 0; cmsCloseProfile(h); cmsFreeToneCurve(g); remove("v4gamma.icc"); return 1; } // cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname); // Gamut descriptor routines static cmsInt32Number CheckGBD(void) { cmsCIELab Lab; cmsHANDLE h; cmsInt32Number L, a, b; cmsUInt32Number r1, g1, b1; cmsHPROFILE hLab, hsRGB; cmsHTRANSFORM xform; h = cmsGBDAlloc(DbgThread()); if (h == NULL) return 0; // Fill all Lab gamut as valid SubTest("Filling RAW gamut"); for (L=0; L <= 100; L += 10) for (a = -128; a <= 128; a += 5) for (b = -128; b <= 128; b += 5) { Lab.L = L; Lab.a = a; Lab.b = b; if (!cmsGDBAddPoint(h, &Lab)) return 0; } // Complete boundaries SubTest("computing Lab gamut"); if (!cmsGDBCompute(h, 0)) return 0; // All points should be inside gamut SubTest("checking Lab gamut"); for (L=10; L <= 90; L += 25) for (a = -120; a <= 120; a += 25) for (b = -120; b <= 120; b += 25) { Lab.L = L; Lab.a = a; Lab.b = b; if (!cmsGDBCheckPoint(h, &Lab)) { return 0; } } cmsGBDFree(h); // Now for sRGB SubTest("checking sRGB gamut"); h = cmsGBDAlloc(DbgThread()); hsRGB = cmsCreate_sRGBProfile(); hLab = cmsCreateLab4Profile(NULL); xform = cmsCreateTransform(hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); for (r1=0; r1 < 256; r1 += 5) { for (g1=0; g1 < 256; g1 += 5) for (b1=0; b1 < 256; b1 += 5) { cmsUInt8Number rgb[3]; rgb[0] = (cmsUInt8Number) r1; rgb[1] = (cmsUInt8Number) g1; rgb[2] = (cmsUInt8Number) b1; cmsDoTransform(xform, rgb, &Lab, 1); // if (fabs(Lab.b) < 20 && Lab.a > 0) continue; if (!cmsGDBAddPoint(h, &Lab)) { cmsGBDFree(h); return 0; } } } if (!cmsGDBCompute(h, 0)) return 0; // cmsGBDdumpVRML(h, "c:\\colormaps\\lab.wrl"); for (r1=10; r1 < 200; r1 += 10) { for (g1=10; g1 < 200; g1 += 10) for (b1=10; b1 < 200; b1 += 10) { cmsUInt8Number rgb[3]; rgb[0] = (cmsUInt8Number) r1; rgb[1] = (cmsUInt8Number) g1; rgb[2] = (cmsUInt8Number) b1; cmsDoTransform(xform, rgb, &Lab, 1); if (!cmsGDBCheckPoint(h, &Lab)) { cmsDeleteTransform(xform); cmsGBDFree(h); return 0; } } } cmsDeleteTransform(xform); cmsGBDFree(h); SubTest("checking LCh chroma ring"); h = cmsGBDAlloc(DbgThread()); for (r1=0; r1 < 360; r1++) { cmsCIELCh LCh; LCh.L = 70; LCh.C = 60; LCh.h = r1; cmsLCh2Lab(&Lab, &LCh); if (!cmsGDBAddPoint(h, &Lab)) { cmsGBDFree(h); return 0; } } if (!cmsGDBCompute(h, 0)) return 0; cmsGBDFree(h); return 1; } static int CheckMD5(void) { cmsHPROFILE pProfile = cmsOpenProfileFromFile("sRGBlcms2.icc", "r"); cmsProfileID ProfileID1, ProfileID2, ProfileID3, ProfileID4; if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile, ProfileID1.ID8); if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile, ProfileID2.ID8); cmsCloseProfile(pProfile); pProfile = cmsOpenProfileFromFile("sRGBlcms2.icc", "r"); if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile,ProfileID3.ID8); if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile,ProfileID4.ID8); cmsCloseProfile(pProfile); return ((memcmp(ProfileID1.ID8, ProfileID3.ID8, sizeof(ProfileID1)) == 0) && (memcmp(ProfileID2.ID8, ProfileID4.ID8, sizeof(ProfileID2)) == 0)); } static int CheckLinking(void) { cmsHPROFILE h; cmsPipeline * pipeline; cmsStage *stageBegin, *stageEnd; // Create a CLUT based profile h = cmsCreateInkLimitingDeviceLinkTHR(DbgThread(), cmsSigCmykData, 150); // link a second tag cmsLinkTag(h, cmsSigAToB1Tag, cmsSigAToB0Tag); // Save the linked devicelink if (!cmsSaveProfileToFile(h, "lcms2link.icc")) return 0; cmsCloseProfile(h); // Now open the profile and read the pipeline h = cmsOpenProfileFromFile("lcms2link.icc", "r"); if (h == NULL) return 0; pipeline = (cmsPipeline*) cmsReadTag(h, cmsSigAToB1Tag); if (pipeline == NULL) { return 0; } pipeline = cmsPipelineDup(pipeline); // extract stage from pipe line cmsPipelineUnlinkStage(pipeline, cmsAT_BEGIN, &stageBegin); cmsPipelineUnlinkStage(pipeline, cmsAT_END, &stageEnd); cmsPipelineInsertStage(pipeline, cmsAT_END, stageEnd); cmsPipelineInsertStage(pipeline, cmsAT_BEGIN, stageBegin); if (cmsTagLinkedTo(h, cmsSigAToB1Tag) != cmsSigAToB0Tag) return 0; cmsWriteTag(h, cmsSigAToB0Tag, pipeline); cmsPipelineFree(pipeline); if (!cmsSaveProfileToFile(h, "lcms2link2.icc")) return 0; cmsCloseProfile(h); return 1; } // TestMPE // // Created by Paul Miller on 30/08/2016. // static cmsHPROFILE IdentityMatrixProfile( cmsColorSpaceSignature dataSpace) { cmsContext ctx = 0; cmsVEC3 zero = {{0,0,0}}; cmsMAT3 identity; cmsPipeline* forward; cmsPipeline* reverse; cmsHPROFILE identityProfile = cmsCreateProfilePlaceholder( ctx); cmsSetProfileVersion(identityProfile, 4.3); cmsSetDeviceClass( identityProfile, cmsSigColorSpaceClass); cmsSetColorSpace(identityProfile, dataSpace); cmsSetPCS(identityProfile, cmsSigXYZData); cmsSetHeaderRenderingIntent(identityProfile, INTENT_RELATIVE_COLORIMETRIC); cmsWriteTag(identityProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ()); _cmsMAT3identity( &identity); // build forward transform.... (RGB to PCS) forward = cmsPipelineAlloc( 0, 3, 3); cmsPipelineInsertStage( forward, cmsAT_END, cmsStageAllocMatrix( ctx, 3, 3, (cmsFloat64Number*)&identity, (cmsFloat64Number*)&zero)); cmsWriteTag( identityProfile, cmsSigDToB1Tag, forward); cmsPipelineFree( forward); reverse = cmsPipelineAlloc( 0, 3, 3); cmsPipelineInsertStage( reverse, cmsAT_END, cmsStageAllocMatrix( ctx, 3, 3, (cmsFloat64Number*)&identity, (cmsFloat64Number*)&zero)); cmsWriteTag( identityProfile, cmsSigBToD1Tag, reverse); cmsPipelineFree( reverse); return identityProfile; } static cmsInt32Number CheckFloatXYZ(void) { cmsHPROFILE input; cmsHPROFILE xyzProfile = cmsCreateXYZProfile(); cmsHTRANSFORM xform; cmsFloat32Number in[4]; cmsFloat32Number out[4]; in[0] = 1.0; in[1] = 1.0; in[2] = 1.0; in[3] = 0.5; // RGB to XYZ input = IdentityMatrixProfile( cmsSigRgbData); xform = cmsCreateTransform( input, TYPE_RGB_FLT, xyzProfile, TYPE_XYZ_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float RGB->XYZ", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->XYZ", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->XYZ", in[2], out[2], FLOAT_PRECISSION)) return 0; // XYZ to XYZ input = IdentityMatrixProfile( cmsSigXYZData); xform = cmsCreateTransform( input, TYPE_XYZ_FLT, xyzProfile, TYPE_XYZ_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float XYZ->XYZ", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->XYZ", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->XYZ", in[2], out[2], FLOAT_PRECISSION)) return 0; input = IdentityMatrixProfile( cmsSigXYZData); # define TYPE_XYZA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) xform = cmsCreateTransform( input, TYPE_XYZA_FLT, xyzProfile, TYPE_XYZA_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_COPY_ALPHA); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float XYZA->XYZA", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float XYZA->XYZA", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float XYZA->XYZA", in[2], out[2], FLOAT_PRECISSION) || !IsGoodVal("Float XYZA->XYZA", in[3], out[3], FLOAT_PRECISSION)) return 0; // XYZ to RGB input = IdentityMatrixProfile( cmsSigRgbData); xform = cmsCreateTransform( xyzProfile, TYPE_XYZ_FLT, input, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float XYZ->RGB", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->RGB", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->RGB", in[2], out[2], FLOAT_PRECISSION)) return 0; // Now the optimizer should remove a stage // XYZ to RGB input = IdentityMatrixProfile( cmsSigRgbData); xform = cmsCreateTransform( input, TYPE_RGB_FLT, input, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float RGB->RGB", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", in[2], out[2], FLOAT_PRECISSION)) return 0; cmsCloseProfile(xyzProfile); return 1; } /* Bug reported 1) sRGB built-in V4.3 -> Lab identity built-in V4.3 Flags: "cmsFLAGS_NOCACHE", "cmsFLAGS_NOOPTIMIZE" Input format: TYPE_RGBA_FLT Output format: TYPE_LabA_FLT 2) and back Lab identity built-in V4.3 -> sRGB built-in V4.3 Flags: "cmsFLAGS_NOCACHE", "cmsFLAGS_NOOPTIMIZE" Input format: TYPE_LabA_FLT Output format: TYPE_RGBA_FLT */ static cmsInt32Number ChecksRGB2LabFLT(void) { cmsHPROFILE hSRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform1 = cmsCreateTransform(hSRGB, TYPE_RGBA_FLT, hLab, TYPE_LabA_FLT, 0, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); cmsHTRANSFORM xform2 = cmsCreateTransform(hLab, TYPE_LabA_FLT, hSRGB, TYPE_RGBA_FLT, 0, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); cmsFloat32Number RGBA1[4], RGBA2[4], LabA[4]; int i; for (i = 0; i <= 100; i++) { RGBA1[0] = i / 100.0F; RGBA1[1] = i / 100.0F; RGBA1[2] = i / 100.0F; RGBA1[3] = 0; cmsDoTransform(xform1, RGBA1, LabA, 1); cmsDoTransform(xform2, LabA, RGBA2, 1); if (!IsGoodVal("Float RGB->RGB", RGBA1[0], RGBA2[0], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", RGBA1[1], RGBA2[1], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", RGBA1[2], RGBA2[2], FLOAT_PRECISSION)) return 0; } cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); cmsCloseProfile(hSRGB); cmsCloseProfile(hLab); return 1; } /* * parametric curve for Rec709 */ static double Rec709(double L) { if (L <0.018) return 4.5*L; else { double a = 1.099* pow(L, 0.45); a = a - 0.099; return a; } } static cmsInt32Number CheckParametricRec709(void) { cmsFloat64Number params[7]; cmsToneCurve* t; int i; params[0] = 0.45; /* y */ params[1] = pow(1.099, 1.0 / 0.45); /* a */ params[2] = 0.0; /* b */ params[3] = 4.5; /* c */ params[4] = 0.018; /* d */ params[5] = -0.099; /* e */ params[6] = 0.0; /* f */ t = cmsBuildParametricToneCurve (NULL, 5, params); for (i=0; i < 256; i++) { cmsFloat32Number n = (cmsFloat32Number) i / 255.0F; cmsUInt16Number f1 = (cmsUInt16Number) floor(255.0 * cmsEvalToneCurveFloat(t, n) + 0.5); cmsUInt16Number f2 = (cmsUInt16Number) floor(255.0*Rec709((double) i / 255.0) + 0.5); if (f1 != f2) { cmsFreeToneCurve(t); return 0; } } cmsFreeToneCurve(t); return 1; } #define kNumPoints 10 typedef cmsFloat32Number(*Function)(cmsFloat32Number x); static cmsFloat32Number StraightLine( cmsFloat32Number x) { return (cmsFloat32Number) (0.1 + 0.9 * x); } static cmsInt32Number TestCurve( const char* label, cmsToneCurve* curve, Function fn) { cmsInt32Number ok = 1; int i; for (i = 0; i < kNumPoints*3; i++) { cmsFloat32Number x = (cmsFloat32Number)i / (kNumPoints*3 - 1); cmsFloat32Number expectedY = fn(x); cmsFloat32Number out = cmsEvalToneCurveFloat( curve, x); if (!IsGoodVal(label, expectedY, out, FLOAT_PRECISSION)) { ok = 0; } } return ok; } static cmsInt32Number CheckFloatSamples(void) { cmsFloat32Number y[kNumPoints]; int i; cmsToneCurve *curve; cmsInt32Number ok; for (i = 0; i < kNumPoints; i++) { cmsFloat32Number x = (cmsFloat32Number)i / (kNumPoints-1); y[i] = StraightLine(x); } curve = cmsBuildTabulatedToneCurveFloat(NULL, kNumPoints, y); ok = TestCurve( "Float Samples", curve, StraightLine); cmsFreeToneCurve(curve); return ok; } static cmsInt32Number CheckFloatSegments(void) { cmsInt32Number ok = 1; int i; cmsToneCurve *curve; cmsFloat32Number y[ kNumPoints]; // build a segmented curve with a sampled section... cmsCurveSegment Seg[3]; // Initialize segmented curve part up to 0.1 Seg[0].x0 = -1e22f; // -infinity Seg[0].x1 = 0.1f; Seg[0].Type = 6; // Y = (a * X + b) ^ Gamma + c Seg[0].Params[0] = 1.0f; // gamma Seg[0].Params[1] = 0.9f; // a Seg[0].Params[2] = 0.0f; // b Seg[0].Params[3] = 0.1f; // c Seg[0].Params[4] = 0.0f; // From zero to 1 Seg[1].x0 = 0.1f; Seg[1].x1 = 0.9f; Seg[1].Type = 0; Seg[1].nGridPoints = kNumPoints; Seg[1].SampledPoints = y; for (i = 0; i < kNumPoints; i++) { cmsFloat32Number x = (cmsFloat32Number) (0.1 + ((cmsFloat32Number)i / (kNumPoints-1)) * (0.9 - 0.1)); y[i] = StraightLine(x); } // from 1 to +infinity Seg[2].x0 = 0.9f; Seg[2].x1 = 1e22f; // +infinity Seg[2].Type = 6; Seg[2].Params[0] = 1.0f; Seg[2].Params[1] = 0.9f; Seg[2].Params[2] = 0.0f; Seg[2].Params[3] = 0.1f; Seg[2].Params[4] = 0.0f; curve = cmsBuildSegmentedToneCurve(0, 3, Seg); ok = TestCurve( "Float Segmented Curve", curve, StraightLine); cmsFreeToneCurve( curve); return ok; } static cmsInt32Number CheckReadRAW(void) { cmsInt32Number tag_size, tag_size1; char buffer[37009]; cmsHPROFILE hProfile; SubTest("RAW read on on-disk"); hProfile = cmsOpenProfileFromFile("test1.icc", "r"); if (hProfile == NULL) return 0; tag_size1 = cmsReadRawTag(hProfile, cmsSigGamutTag, NULL, 0); tag_size = cmsReadRawTag(hProfile, cmsSigGamutTag, buffer, 37009); cmsCloseProfile(hProfile); if (tag_size != 37009) return 0; if (tag_size1 != 37009) return 0; SubTest("RAW read on in-memory created profiles"); hProfile = cmsCreate_sRGBProfile(); tag_size1 = cmsReadRawTag(hProfile, cmsSigGreenColorantTag, NULL, 0); tag_size = cmsReadRawTag(hProfile, cmsSigGreenColorantTag, buffer, 20); cmsCloseProfile(hProfile); if (tag_size != 20) return 0; if (tag_size1 != 20) return 0; return 1; } static cmsInt32Number CheckMeta(void) { char *data; cmsHANDLE dict; cmsHPROFILE p; cmsUInt32Number clen; FILE *fp; int rc; /* open file */ p = cmsOpenProfileFromFile("ibm-t61.icc", "r"); if (p == NULL) return 0; /* read dictionary, but don't do anything with the value */ //COMMENT OUT THE NEXT TWO LINES AND IT WORKS FINE!!! dict = cmsReadTag(p, cmsSigMetaTag); if (dict == NULL) return 0; /* serialize profile to memory */ rc = cmsSaveProfileToMem(p, NULL, &clen); if (!rc) return 0; data = (char*) chknull(malloc(clen)); rc = cmsSaveProfileToMem(p, data, &clen); if (!rc) return 0; /* write the memory blob to a file */ //NOTE: The crash does not happen if cmsSaveProfileToFile() is used */ fp = fopen("new.icc", "wb"); fwrite(data, 1, clen, fp); fclose(fp); free(data); cmsCloseProfile(p); /* open newly created file and read metadata */ p = cmsOpenProfileFromFile("new.icc", "r"); //ERROR: Bad dictionary Name/Value //ERROR: Corrupted tag 'meta' //test: test.c:59: main: Assertion `dict' failed. dict = cmsReadTag(p, cmsSigMetaTag); if (dict == NULL) return 0; cmsCloseProfile(p); return 1; } // Bug on applying null transforms on floating point buffers static cmsInt32Number CheckFloatNULLxform(void) { int i; cmsFloat32Number in[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; cmsFloat32Number out[10]; cmsHTRANSFORM xform = cmsCreateTransform(NULL, TYPE_GRAY_FLT, NULL, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, cmsFLAGS_NULLTRANSFORM); if (xform == NULL) { Fail("Unable to create float null transform"); return 0; } cmsDoTransform(xform, in, out, 10); cmsDeleteTransform(xform); for (i=0; i < 10; i++) { if (!IsGoodVal("float nullxform", in[i], out[i], 0.001)) { return 0; } } return 1; } static cmsInt32Number CheckRemoveTag(void) { cmsHPROFILE p; cmsMLU *mlu; int ret; p = cmsCreate_sRGBProfileTHR(NULL); /* set value */ mlu = cmsMLUalloc (NULL, 1); ret = cmsMLUsetASCII (mlu, "en", "US", "bar"); if (!ret) return 0; ret = cmsWriteTag (p, cmsSigDeviceMfgDescTag, mlu); if (!ret) return 0; cmsMLUfree (mlu); /* remove the tag */ ret = cmsWriteTag (p, cmsSigDeviceMfgDescTag, NULL); if (!ret) return 0; /* THIS EXPLODES */ cmsCloseProfile(p); return 1; } static cmsInt32Number CheckMatrixSimplify(void) { cmsHPROFILE pIn; cmsHPROFILE pOut; cmsHTRANSFORM t; unsigned char buf[3] = { 127, 32, 64 }; pIn = cmsCreate_sRGBProfile(); pOut = cmsOpenProfileFromFile("ibm-t61.icc", "r"); if (pIn == NULL || pOut == NULL) return 0; t = cmsCreateTransform(pIn, TYPE_RGB_8, pOut, TYPE_RGB_8, INTENT_PERCEPTUAL, 0); cmsDoTransformStride(t, buf, buf, 1, 1); cmsDeleteTransform(t); cmsCloseProfile(pIn); cmsCloseProfile(pOut); return buf[0] == 144 && buf[1] == 0 && buf[2] == 69; } static cmsInt32Number CheckTransformLineStride(void) { cmsHPROFILE pIn; cmsHPROFILE pOut; cmsHTRANSFORM t; // Our buffer is formed by 4 RGB8 lines, each line is 2 pixels wide plus a padding of one byte cmsUInt8Number buf1[]= { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, }; // Our buffer2 is formed by 4 RGBA lines, each line is 2 pixels wide plus a padding of one byte cmsUInt8Number buf2[] = { 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0, 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0, 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0, 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0}; // Our buffer3 is formed by 4 RGBA16 lines, each line is 2 pixels wide plus a padding of two bytes cmsUInt16Number buf3[] = { 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0, 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0, 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0, 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0 }; cmsUInt8Number out[1024]; memset(out, 0, sizeof(out)); pIn = cmsCreate_sRGBProfile(); pOut = cmsOpenProfileFromFile("ibm-t61.icc", "r"); if (pIn == NULL || pOut == NULL) return 0; t = cmsCreateTransform(pIn, TYPE_RGB_8, pOut, TYPE_RGB_8, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); cmsDoTransformLineStride(t, buf1, out, 2, 4, 7, 7, 0, 0); cmsDeleteTransform(t); if (memcmp(out, buf1, sizeof(buf1)) != 0) { Fail("Failed transform line stride on RGB8"); cmsCloseProfile(pIn); cmsCloseProfile(pOut); return 0; } memset(out, 0, sizeof(out)); t = cmsCreateTransform(pIn, TYPE_RGBA_8, pOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); cmsDoTransformLineStride(t, buf2, out, 2, 4, 9, 9, 0, 0); cmsDeleteTransform(t); if (memcmp(out, buf2, sizeof(buf2)) != 0) { cmsCloseProfile(pIn); cmsCloseProfile(pOut); Fail("Failed transform line stride on RGBA8"); return 0; } memset(out, 0, sizeof(out)); t = cmsCreateTransform(pIn, TYPE_RGBA_16, pOut, TYPE_RGBA_16, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); cmsDoTransformLineStride(t, buf3, out, 2, 4, 18, 18, 0, 0); cmsDeleteTransform(t); if (memcmp(out, buf3, sizeof(buf3)) != 0) { cmsCloseProfile(pIn); cmsCloseProfile(pOut); Fail("Failed transform line stride on RGBA16"); return 0; } memset(out, 0, sizeof(out)); // From 8 to 16 t = cmsCreateTransform(pIn, TYPE_RGBA_8, pOut, TYPE_RGBA_16, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); cmsDoTransformLineStride(t, buf2, out, 2, 4, 9, 18, 0, 0); cmsDeleteTransform(t); if (memcmp(out, buf3, sizeof(buf3)) != 0) { cmsCloseProfile(pIn); cmsCloseProfile(pOut); Fail("Failed transform line stride on RGBA16"); return 0; } cmsCloseProfile(pIn); cmsCloseProfile(pOut); return 1; } static int CheckPlanar8opt(void) { cmsHPROFILE aboveRGB = Create_AboveRGB(); cmsHPROFILE sRGB = cmsCreate_sRGBProfile(); cmsHTRANSFORM transform = cmsCreateTransform(sRGB, TYPE_RGB_8_PLANAR, aboveRGB, TYPE_RGB_8_PLANAR, INTENT_PERCEPTUAL, 0); cmsDeleteTransform(transform); cmsCloseProfile(aboveRGB); cmsCloseProfile(sRGB); return 1; } /** * Bug reported from float32 to uint16 planar */ #define TYPE_RGB_FLT_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)) static int CheckPlanarFloat2int(void) { cmsHPROFILE sRGB = cmsCreate_sRGBProfile(); cmsHTRANSFORM transform = cmsCreateTransform(sRGB, TYPE_RGB_FLT_PLANAR, sRGB, TYPE_RGB_16_PLANAR,INTENT_PERCEPTUAL, 0); const cmsFloat32Number input[] = { 0.0f, 0.4f, 0.8f, 0.1f, 0.5f, 0.9f, 0.2f, 0.6f, 1.0f, 0.3f, 0.7f, 1.0f }; cmsUInt16Number output[3*4] = { 0 }; cmsDoTransform(transform, input, output, 4); cmsDeleteTransform(transform); cmsCloseProfile(sRGB); return 1; } /** * Bug reported & fixed. Thanks to Kornel Lesinski for spotting this. */ static int CheckSE(void) { cmsHPROFILE input_profile = Create_AboveRGB(); cmsHPROFILE output_profile = cmsCreate_sRGBProfile(); cmsHTRANSFORM tr = cmsCreateTransform(input_profile, TYPE_RGBA_8, output_profile, TYPE_RGBA_16_SE, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_COPY_ALPHA); cmsUInt8Number rgba[4] = { 40, 41, 41, 0xfa }; cmsUInt16Number out[4]; cmsDoTransform(tr, rgba, out, 1); cmsCloseProfile(input_profile); cmsCloseProfile(output_profile); cmsDeleteTransform(tr); if (out[0] != 0xf622 || out[1] != 0x7f24 || out[2] != 0x7f24) return 0; return 1; } /** * Bug reported. */ static int CheckForgedMPE(void) { cmsUInt32Number i; cmsHPROFILE srcProfile; cmsHPROFILE dstProfile; cmsColorSpaceSignature srcCS; cmsUInt32Number nSrcComponents; cmsUInt32Number srcFormat; cmsUInt32Number intent = 0; cmsUInt32Number flags = 0; cmsHTRANSFORM hTransform; cmsUInt8Number output[4]; srcProfile = cmsOpenProfileFromFile("bad_mpe.icc", "r"); if (!srcProfile) return 0; dstProfile = cmsCreate_sRGBProfile(); if (!dstProfile) { cmsCloseProfile(srcProfile); return 0; } srcCS = cmsGetColorSpace(srcProfile); nSrcComponents = cmsChannelsOfColorSpace(srcCS); if (srcCS == cmsSigLabData) { srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); } else { srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1); } cmsSetLogErrorHandler(ErrorReportingFunction); hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_BGR_8, intent, flags); cmsCloseProfile(srcProfile); cmsCloseProfile(dstProfile); cmsSetLogErrorHandler(FatalErrorQuit); // Should report error if (!TrappedError) return 0; TrappedError = FALSE; // Transform should NOT be created if (!hTransform) return 1; // Never should reach here if (T_BYTES(srcFormat) == 0) { // 0 means double double input[128]; for (i = 0; i < nSrcComponents; i++) input[i] = 0.5f; cmsDoTransform(hTransform, input, output, 1); } else { cmsUInt8Number input[128]; for (i = 0; i < nSrcComponents; i++) input[i] = 128; cmsDoTransform(hTransform, input, output, 1); } cmsDeleteTransform(hTransform); return 0; } /** * What the self test is trying to do is creating a proofing transform * with gamut check, so we can getting the coverage of one profile of * another, i.e. to approximate the gamut intersection. e.g. * Thanks to Richard Hughes for providing the test */ static int CheckProofingIntersection(void) { cmsHPROFILE profile_null, hnd1, hnd2; cmsHTRANSFORM transform; hnd1 = cmsCreate_sRGBProfile(); hnd2 = Create_AboveRGB(); profile_null = cmsCreateNULLProfileTHR(DbgThread()); transform = cmsCreateProofingTransformTHR(DbgThread(), hnd1, TYPE_RGB_FLT, profile_null, TYPE_GRAY_FLT, hnd2, INTENT_ABSOLUTE_COLORIMETRIC, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK | cmsFLAGS_SOFTPROOFING); cmsCloseProfile(hnd1); cmsCloseProfile(hnd2); cmsCloseProfile(profile_null); // Failed? if (transform == NULL) return 0; cmsDeleteTransform(transform); return 1; } /** * In 2.11: When I create a RGB profile, set the copyright data with an empty string, * then call cmsMD5computeID on said profile, the program crashes. */ static int CheckEmptyMLUC(void) { cmsContext context = cmsCreateContext(NULL, NULL); cmsCIExyY white = { 0.31271, 0.32902, 1.0 }; cmsCIExyYTRIPLE primaries = { .Red = { 0.640, 0.330, 1.0 }, .Green = { 0.300, 0.600, 1.0 }, .Blue = { 0.150, 0.060, 1.0 } }; cmsFloat64Number parameters[10] = { 2.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; cmsToneCurve* toneCurve = cmsBuildParametricToneCurve(context, 1, parameters); cmsToneCurve* toneCurves[3] = { toneCurve, toneCurve, toneCurve }; cmsHPROFILE profile = cmsCreateRGBProfileTHR(context, &white, &primaries, toneCurves); cmsSetLogErrorHandlerTHR(context, FatalErrorQuit); cmsFreeToneCurve(toneCurve); // Set an empty copyright tag. This should log an error. cmsMLU* mlu = cmsMLUalloc(context, 1); cmsMLUsetASCII(mlu, "en", "AU", ""); cmsMLUsetWide(mlu, "en", "EN", L""); cmsWriteTag(profile, cmsSigCopyrightTag, mlu); cmsMLUfree(mlu); // This will cause a crash after setting an empty copyright tag. cmsMD5computeID(profile); // Cleanup cmsCloseProfile(profile); DebugMemDontCheckThis(context); cmsDeleteContext(context); return 1; } static double distance(const cmsUInt16Number* a, const cmsUInt16Number* b) { double d1 = a[0] - b[0]; double d2 = a[1] - b[1]; double d3 = a[2] - b[2]; return sqrt(d1 * d1 + d2 * d2 + d3 * d3); } /** * In 2.12, a report suggest that the built-in sRGB has roundtrip errors that makes color to move * when roundtripping again and again */ static int Check_sRGB_Rountrips(void) { cmsUInt16Number rgb[3], seed[3]; cmsCIELab Lab; int i, r, g, b; double err, maxErr; cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM hBack = cmsCreateTransform(hLab, TYPE_Lab_DBL, hsRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsHTRANSFORM hForth = cmsCreateTransform(hsRGB, TYPE_RGB_16, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab); cmsCloseProfile(hsRGB); maxErr = 0.0; for (r = 0; r <= 255; r += 16) for (g = 0; g <= 255; g += 16) for (b = 0; b <= 255; b += 16) { seed[0] = rgb[0] = (cmsUInt16Number) ((r << 8) | r); seed[1] = rgb[1] = (cmsUInt16Number) ((g << 8) | g); seed[2] = rgb[2] = (cmsUInt16Number) ((b << 8) | b); for (i = 0; i < 50; i++) { cmsDoTransform(hForth, rgb, &Lab, 1); cmsDoTransform(hBack, &Lab, rgb, 1); } err = distance(seed, rgb); if (err > maxErr) maxErr = err; } cmsDeleteTransform(hBack); cmsDeleteTransform(hForth); if (maxErr > 20.0) { printf("Maximum sRGB roundtrip error %f!\n", maxErr); return 0; } return 1; } static int CheckCenteringOfLab(void) { cmsHPROFILE hProPhoto = cmsOpenProfileFromFile("test4.icc", "r"); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform1 = cmsCreateTransform(hProPhoto, TYPE_BGR_16, hLab, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_HIGHRESPRECALC); cmsHTRANSFORM xform2 = cmsCreateTransform(hLab, TYPE_Lab_16, hProPhoto, TYPE_BGR_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_HIGHRESPRECALC); cmsUInt16Number bgr[3] = { 0xffff, 0xffff, 0xffff }; cmsUInt16Number bgr2[3]; cmsUInt16Number lab[3]; cmsDoTransform(xform1, bgr, lab, 1); cmsDoTransform(xform2, lab, bgr2, 1); if ((0xffff - bgr2[0]) > 5 || (0xffff - bgr2[1]) > 5 || (0xffff - bgr2[2]) > 5) { printf("Centering of Lab16 failed. Got %x %x %x\n", bgr2[0], bgr2[1], bgr2[2]); return 0; } cmsCloseProfile(hLab); cmsCloseProfile(hProPhoto); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); return 1; } /** * Check OKLab colorspace */ static int Check_OkLab(void) { cmsHPROFILE hOkLab = cmsCreate_OkLabProfile(NULL); cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsCIEXYZ xyz, xyz2; cmsCIELab okLab; #define TYPE_OKLAB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_MCH3)|CHANNELS_SH(3)|BYTES_SH(0)) cmsHTRANSFORM xform = cmsCreateTransform(hXYZ, TYPE_XYZ_DBL, hOkLab, TYPE_OKLAB_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsHTRANSFORM xform2 = cmsCreateTransform(hOkLab, TYPE_OKLAB_DBL, hXYZ, TYPE_XYZ_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); /** * D50 should be converted to white by PCS definition */ xyz.X = 0.9642; xyz.Y = 1.0000; xyz.Z = 0.8249; cmsDoTransform(xform, &xyz, &okLab, 1); cmsDoTransform(xform2, &okLab, &xyz2, 1); xyz.X = 1.0; xyz.Y = 0.0; xyz.Z = 0.0; cmsDoTransform(xform, &xyz, &okLab, 1); cmsDoTransform(xform2, &okLab, &xyz2, 1); xyz.X = 0.0; xyz.Y = 1.0; xyz.Z = 0.0; cmsDoTransform(xform, &xyz, &okLab, 1); cmsDoTransform(xform2, &okLab, &xyz2, 1); xyz.X = 0.0; xyz.Y = 0.0; xyz.Z = 1.0; cmsDoTransform(xform, &xyz, &okLab, 1); cmsDoTransform(xform2, &okLab, &xyz2, 1); xyz.X = 0.143046; xyz.Y = 0.060610; xyz.Z = 0.713913; cmsDoTransform(xform, &xyz, &okLab, 1); cmsDoTransform(xform2, &okLab, &xyz2, 1); cmsDeleteTransform(xform); cmsDeleteTransform(xform2); cmsCloseProfile(hOkLab); cmsCloseProfile(hXYZ); return 1; } static int Check_OkLab2(void) { #define TYPE_LABA_F32 (FLOAT_SH(1)|COLORSPACE_SH(PT_MCH3)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) cmsUInt16Number rgb[3]; cmsFloat32Number lab[4]; cmsHPROFILE labProfile = cmsCreate_OkLabProfile(NULL); cmsHPROFILE rgbProfile = cmsCreate_sRGBProfile(); cmsHTRANSFORM hBack = cmsCreateTransform(labProfile, TYPE_LABA_F32, rgbProfile, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsHTRANSFORM hForth = cmsCreateTransform(rgbProfile, TYPE_RGB_16, labProfile, TYPE_LABA_F32, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(labProfile); cmsCloseProfile(rgbProfile); rgb[0] = 0; rgb[1] = 0; rgb[2] = 65535; cmsDoTransform(hForth, rgb, &lab, 1); cmsDoTransform(hBack, lab, &rgb, 1); cmsDeleteTransform(hBack); cmsDeleteTransform(hForth); if (rgb[0] != 0 || rgb[1] != 0 || rgb[2] != 65535) return 0; return 1; } static cmsHPROFILE createRgbGamma(cmsFloat64Number g) { cmsCIExyY D65 = { 0.3127, 0.3290, 1.0 }; cmsCIExyYTRIPLE Rec709Primaries = { {0.6400, 0.3300, 1.0}, {0.3000, 0.6000, 1.0}, {0.1500, 0.0600, 1.0} }; cmsToneCurve* Gamma[3]; cmsHPROFILE hRGB; Gamma[0] = Gamma[1] = Gamma[2] = cmsBuildGamma(0, g); if (Gamma[0] == NULL) return NULL; hRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma); cmsFreeToneCurve(Gamma[0]); return hRGB; } static int CheckGammaSpaceDetection(void) { cmsFloat64Number i; for (i = 0.5; i < 3; i += 0.1) { cmsHPROFILE hProfile = createRgbGamma(i); cmsFloat64Number gamma = cmsDetectRGBProfileGamma(hProfile, 0.01); cmsCloseProfile(hProfile); if (fabs(gamma - i) > 0.1) { Fail("Failed profile gamma detection of %f (got %f)", i, gamma); return 0; } } return 1; } // Per issue #308. A built-in is corrupted by using write raw tag was causing a segfault static int CheckInducedCorruption(void) { cmsHTRANSFORM xform0; char garbage[] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b"; cmsHPROFILE hsrgb = cmsCreate_sRGBProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsSetLogErrorHandler(NULL); cmsWriteRawTag(hsrgb, cmsSigBlueColorantTag, &garbage, sizeof(garbage)); xform0 = cmsCreateTransform(hsrgb, TYPE_RGB_16, hLab, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, 0); if (xform0) cmsDeleteTransform(xform0); cmsCloseProfile(hsrgb); cmsCloseProfile(hLab); ResetFatalError(); return 1; } #if 0 // You need to download following profiles to execute this test: sRGB-elle-V4-srgbtrc.icc, sRGB-elle-V4-g10.icc // The include this line in the checks list: Check("KInear spaces detection", CheckLinearSpacesOptimization); static void uint16toFloat(cmsUInt16Number* src, cmsFloat32Number* dst) { for (int i = 0; i < 3; i++) { dst[i] = src[i] / 65535.f; } } static int CheckLinearSpacesOptimization(void) { cmsHPROFILE lcms_sRGB = cmsCreate_sRGBProfile(); cmsHPROFILE elle_sRGB = cmsOpenProfileFromFile("sRGB-elle-V4-srgbtrc.icc", "r"); cmsHPROFILE elle_linear = cmsOpenProfileFromFile("sRGB-elle-V4-g10.icc", "r"); cmsHTRANSFORM transform1 = cmsCreateTransform(elle_sRGB, TYPE_RGB_16, elle_linear, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsHTRANSFORM transform2 = cmsCreateTransform(elle_linear, TYPE_RGB_16, lcms_sRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsHTRANSFORM transform2a = cmsCreateTransform(elle_linear, TYPE_RGB_FLT, lcms_sRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsUInt16Number sourceCol[3] = { 43 * 257, 27 * 257, 6 * 257 }; cmsUInt16Number linearCol[3] = { 0 }; float linearColF[3] = { 0 }; cmsUInt16Number finalCol[3] = { 0 }; int difR, difG, difB; int difR2, difG2, difB2; cmsDoTransform(transform1, sourceCol, linearCol, 1); cmsDoTransform(transform2, linearCol, finalCol, 1); cmsCloseProfile(lcms_sRGB); cmsCloseProfile(elle_sRGB); cmsCloseProfile(elle_linear); difR = (int)sourceCol[0] - finalCol[0]; difG = (int)sourceCol[1] - finalCol[1]; difB = (int)sourceCol[2] - finalCol[2]; uint16toFloat(linearCol, linearColF); cmsDoTransform(transform2a, linearColF, finalCol, 1); difR2 = (int)sourceCol[0] - finalCol[0]; difG2 = (int)sourceCol[1] - finalCol[1]; difB2 = (int)sourceCol[2] - finalCol[2]; cmsDeleteTransform(transform1); cmsDeleteTransform(transform2); cmsDeleteTransform(transform2a); if (abs(difR2 - difR) > 5 || abs(difG2 - difG) > 5 || abs(difB2 - difB) > 5) { Fail("Linear detection failed"); return 0; } return 1; } #endif static int CheckBadCGATS(void) { const char* bad_it8 = " \"\"\n" "NUMBER_OF_FIELDS 4\n" "BEGIN_DATA_FORMAT\n" "I R G G\n" "END_DATA_FORMAT\n" "NUMBER_OF_FIELDS 9\n" "NUMBER_OF_SETS 2\n" "BEGIN_DATA\n" "d\n" "0 0Bd\n" "0Ba $ $ t ."; cmsHANDLE hIT8; cmsSetLogErrorHandler(NULL); hIT8 = cmsIT8LoadFromMem(0, bad_it8, (cmsUInt32Number) strlen(bad_it8)); ResetFatalError(); if (hIT8 != NULL) { Fail("Wrong IT8 accepted as ok"); cmsIT8Free(hIT8); } return 1; } static int CheckIntToFloatTransform(void) { cmsHPROFILE hAbove = Create_AboveRGB(); cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHTRANSFORM xform = cmsCreateTransform(hAbove, TYPE_RGB_8, hsRGB, TYPE_RGB_DBL, INTENT_PERCEPTUAL, 0); cmsUInt8Number rgb8[3] = { 12, 253, 21 }; cmsFloat64Number rgbDBL[3] = { 0 }; cmsCloseProfile(hAbove); cmsCloseProfile(hsRGB); cmsDoTransform(xform, rgb8, rgbDBL, 1); cmsDeleteTransform(xform); if (rgbDBL[0] < 0 && rgbDBL[2] < 0) return 1; Fail("Unbounded transforms with integer input failed"); return 0; } static int CheckSaveLinearizationDevicelink(void) { const cmsFloat32Number table[] = { 0, 0.5f, 1.0f }; cmsToneCurve* tone = cmsBuildTabulatedToneCurveFloat(NULL, 3, table); cmsToneCurve* rgb_curves[3] = { tone, tone, tone }; cmsHPROFILE hDeviceLink = cmsCreateLinearizationDeviceLink(cmsSigRgbData, rgb_curves); cmsBool result; cmsHTRANSFORM xform; int i; cmsFreeToneCurve(tone); result = cmsSaveProfileToFile(hDeviceLink, "lin_rgb.icc"); cmsCloseProfile(hDeviceLink); if (!result) { remove("lin_rgb.icc"); Fail("Couldn't save linearization devicelink"); } hDeviceLink = cmsOpenProfileFromFile("lin_rgb.icc", "r"); if (hDeviceLink == NULL) { remove("lin_rgb.icc"); Fail("Couldn't open devicelink"); } xform = cmsCreateTransform(hDeviceLink, TYPE_RGB_8, NULL, TYPE_RGB_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hDeviceLink); for (i = 0; i < 256; i++) { cmsUInt8Number rgb_in[3] = { i, i, i }; cmsUInt8Number rgb_out[3]; cmsDoTransform(xform, rgb_in, rgb_out, 1); if (rgb_in[0] != rgb_out[0] || rgb_in[1] != rgb_out[1] || rgb_in[2] != rgb_out[2]) { remove("lin_rgb.icc"); Fail("Saved devicelink was not working"); } } cmsDeleteTransform(xform); remove("lin_rgb.icc"); return 1; } static int CheckGamutCheckFloats(void) { cmsUInt16Number alarms[16] = { 0x0f0f,3,4,5,6,7,8,9,10 }; cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHPROFILE hNull = cmsCreateNULLProfile(); cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHTRANSFORM xfrm = cmsCreateProofingTransform(hLab, TYPE_Lab_DBL, hNull, TYPE_GRAY_8, hsRGB, INTENT_RELATIVE_COLORIMETRIC, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK); cmsCloseProfile(hLab); cmsCloseProfile(hNull); cmsCloseProfile(hsRGB); cmsCIELab Lab = { 50, -125, 125 }; cmsCIELab Lab2 = { 50, -10, 12 }; cmsUInt8Number gamut; cmsSetAlarmCodes(alarms); cmsDoTransform(xfrm, &Lab, &gamut, 1); // Gives the alarm != 0 if (gamut != 0x0f) Fail("Gamut check not good"); cmsDoTransform(xfrm, &Lab2, &gamut, 1); if (gamut != 0) Fail("Gamut check zero"); cmsDeleteTransform(xfrm); return 1; } static int CheckMixedRawAndCooked(void) { const cmsUInt32Number data = cmsSigFilmScanner; const cmsUInt32Number* pdata; cmsBool is_ok = FALSE; // This is the internal representation of cmsSigTechnologyTag tag type struct _cooked_st { _cmsTagBase base; cmsUInt32Number data; } buffer = { { (cmsTagTypeSignature) cmsSigTechnologyTag, {0} }, cmsSigFilmScanner }; cmsHPROFILE hProfile = cmsCreateProfilePlaceholder(0); cmsWriteRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer); cmsWriteTag(hProfile, cmsSigTechnologyTag, &data); cmsWriteRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer); cmsWriteRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer); cmsWriteTag(hProfile, cmsSigTechnologyTag, &data); cmsWriteTag(hProfile, cmsSigTechnologyTag, &data); memset(&buffer, 0, sizeof(buffer)); cmsReadRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer ); pdata = cmsReadTag(hProfile, cmsSigTechnologyTag); is_ok = (*pdata == cmsSigFilmScanner) && (_cmsAdjustEndianess32(buffer.data) == cmsSigFilmScanner); cmsCloseProfile(hProfile); return is_ok; } // -------------------------------------------------------------------------------------------------- // P E R F O R M A N C E C H E C K S // -------------------------------------------------------------------------------------------------- typedef struct {cmsUInt8Number r, g, b, a;} Scanline_rgba8; typedef struct {cmsUInt16Number r, g, b, a;} Scanline_rgba16; typedef struct {cmsFloat32Number r, g, b, a;} Scanline_rgba32; typedef struct {cmsUInt8Number r, g, b;} Scanline_rgb8; typedef struct {cmsUInt16Number r, g, b;} Scanline_rgb16; typedef struct {cmsFloat32Number r, g, b;} Scanline_rgb32; static void TitlePerformance(const char* Txt) { printf("%-45s: ", Txt); fflush(stdout); } static void PrintPerformance(cmsUInt32Number Bytes, cmsUInt32Number SizeOfPixel, cmsFloat64Number diff) { cmsFloat64Number seconds = (cmsFloat64Number) diff / CLOCKS_PER_SEC; cmsFloat64Number mpix_sec = Bytes / (1024.0*1024.0*seconds*SizeOfPixel); printf("%#4.3g MPixel/sec.\n", mpix_sec); fflush(stdout); } static void SpeedTest32bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgba32 *In; cmsUInt32Number Mb; cmsUInt32Number Interval = 4; // Power of 2 number to increment r,g,b values by in the loops to keep the test duration practically short cmsUInt32Number NumPixels; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGBA_FLT, hlcmsProfileOut, TYPE_RGBA_FLT, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); NumPixels = 256 / Interval * 256 / Interval * 256 / Interval; Mb = NumPixels * sizeof(Scanline_rgba32); In = (Scanline_rgba32 *) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r += Interval) for (g=0; g < 256; g += Interval) for (b=0; b < 256; b += Interval) { In[j].r = r / 256.0f; In[j].g = g / 256.0f; In[j].b = b / 256.0f; In[j].a = (In[j].r + In[j].g + In[j].b) / 3; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, NumPixels); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgba32), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest16bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb16 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256 * sizeof(Scanline_rgb16); In = (Scanline_rgb16*) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt16Number) ((r << 8) | r); In[j].g = (cmsUInt16Number) ((g << 8) | g); In[j].b = (cmsUInt16Number) ((b << 8) | b); j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgb16), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest32bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgba32 *In; cmsUInt32Number Mb; cmsUInt32Number Interval = 4; // Power of 2 number to increment r,g,b values by in the loops to keep the test duration practically short cmsUInt32Number NumPixels; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_FLT, hlcmsProfileOut, TYPE_CMYK_FLT, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); NumPixels = 256 / Interval * 256 / Interval * 256 / Interval; Mb = NumPixels * sizeof(Scanline_rgba32); In = (Scanline_rgba32 *) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r += Interval) for (g=0; g < 256; g += Interval) for (b=0; b < 256; b += Interval) { In[j].r = r / 256.0f; In[j].g = g / 256.0f; In[j].b = b / 256.0f; In[j].a = (In[j].r + In[j].g + In[j].b) / 3; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, NumPixels); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgba32), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest16bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgba16 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_16, hlcmsProfileOut, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256*sizeof(Scanline_rgba16); In = (Scanline_rgba16*) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt16Number) ((r << 8) | r); In[j].g = (cmsUInt16Number) ((g << 8) | g); In[j].b = (cmsUInt16Number) ((b << 8) | b); In[j].a = 0; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgba16), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest8bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb8 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256*sizeof(Scanline_rgb8); In = (Scanline_rgb8*) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt8Number) r; In[j].g = (cmsUInt8Number) g; In[j].b = (cmsUInt8Number) b; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgb8), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest8bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgba8 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_8, hlcmsProfileOut, TYPE_CMYK_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256*sizeof(Scanline_rgba8); In = (Scanline_rgba8*) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt8Number) r; In[j].g = (cmsUInt8Number) g; In[j].b = (cmsUInt8Number) b; In[j].a = (cmsUInt8Number) 0; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgba8), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest32bitsGray(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; cmsFloat32Number *In; cmsUInt32Number Mb; cmsUInt32Number Interval = 4; // Power of 2 number to increment r,g,b values by in the loops to keep the test duration practically short cmsUInt32Number NumPixels; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_GRAY_FLT, hlcmsProfileOut, TYPE_GRAY_FLT, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); NumPixels = 256 / Interval * 256 / Interval * 256 / Interval; Mb = NumPixels * sizeof(cmsFloat32Number); In = (cmsFloat32Number*) chknull(malloc(Mb)); j = 0; for (r = 0; r < 256; r += Interval) for (g = 0; g < 256; g += Interval) for (b = 0; b < 256; b += Interval) { In[j] = ((r + g + b) / 768.0f); j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, NumPixels); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(cmsFloat32Number), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest16bitsGray(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; cmsUInt16Number *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_GRAY_16, hlcmsProfileOut, TYPE_GRAY_16, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256 * sizeof(cmsUInt16Number); In = (cmsUInt16Number *) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j] = (cmsUInt16Number) ((r + g + b) / 3); j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(cmsUInt16Number), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest8bitsGray(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; cmsUInt8Number *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_GRAY_8, hlcmsProfileOut, TYPE_GRAY_8, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256; In = (cmsUInt8Number*) chknull(malloc(Mb)); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j] = (cmsUInt8Number) r; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(cmsUInt8Number), diff); cmsDeleteTransform(hlcmsxform); } static cmsHPROFILE CreateCurves(void) { cmsToneCurve* Gamma = cmsBuildGamma(DbgThread(), 1.1); cmsToneCurve* Transfer[3]; cmsHPROFILE h; Transfer[0] = Transfer[1] = Transfer[2] = Gamma; h = cmsCreateLinearizationDeviceLink(cmsSigRgbData, Transfer); cmsFreeToneCurve(Gamma); return h; } static void SpeedTest(void) { printf("\n\nP E R F O R M A N C E T E S T S\n"); printf( "=================================\n\n"); fflush(stdout); SpeedTest8bits("8 bits on CLUT profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("test3.icc", "r"), INTENT_PERCEPTUAL); SpeedTest16bits("16 bits on CLUT profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("test3.icc", "r"), INTENT_PERCEPTUAL); SpeedTest32bits("32 bits on CLUT profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("test3.icc", "r"), INTENT_PERCEPTUAL); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bits("8 bits on Matrix-Shaper profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest16bits("16 bits on Matrix-Shaper profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest32bits("32 bits on Matrix-Shaper profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bits("8 bits on SAME Matrix-Shaper profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("test5.icc", "r"), INTENT_PERCEPTUAL); SpeedTest16bits("16 bits on SAME Matrix-Shaper profiles", cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest32bits("32 bits on SAME Matrix-Shaper profiles", cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bits("8 bits on Matrix-Shaper profiles (AbsCol)", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_ABSOLUTE_COLORIMETRIC); SpeedTest16bits("16 bits on Matrix-Shaper profiles (AbsCol)", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_ABSOLUTE_COLORIMETRIC); SpeedTest32bits("32 bits on Matrix-Shaper profiles (AbsCol)", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_ABSOLUTE_COLORIMETRIC); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bits("8 bits on curves", CreateCurves(), CreateCurves(), INTENT_PERCEPTUAL); SpeedTest16bits("16 bits on curves", CreateCurves(), CreateCurves(), INTENT_PERCEPTUAL); SpeedTest32bits("32 bits on curves", CreateCurves(), CreateCurves(), INTENT_PERCEPTUAL); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bitsCMYK("8 bits on CMYK profiles", cmsOpenProfileFromFile("test1.icc", "r"), cmsOpenProfileFromFile("test2.icc", "r")); SpeedTest16bitsCMYK("16 bits on CMYK profiles", cmsOpenProfileFromFile("test1.icc", "r"), cmsOpenProfileFromFile("test2.icc", "r")); SpeedTest32bitsCMYK("32 bits on CMYK profiles", cmsOpenProfileFromFile("test1.icc", "r"), cmsOpenProfileFromFile("test2.icc", "r")); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bitsGray("8 bits on gray-to gray", cmsOpenProfileFromFile("gray3lcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); SpeedTest16bitsGray("16 bits on gray-to gray", cmsOpenProfileFromFile("gray3lcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); SpeedTest32bitsGray("32 bits on gray-to gray", cmsOpenProfileFromFile("gray3lcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bitsGray("8 bits on gray-to-lab gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("glablcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); SpeedTest16bitsGray("16 bits on gray-to-lab gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("glablcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); SpeedTest32bitsGray("32 bits on gray-to-lab gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("glablcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); printf("\n"); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SpeedTest8bitsGray("8 bits on SAME gray-to-gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest16bitsGray("16 bits on SAME gray-to-gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest32bitsGray("32 bits on SAME gray-to-gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_PERCEPTUAL); printf("\n"); } // ----------------------------------------------------------------------------------------------------- // Print the supported intents static void PrintSupportedIntents(void) { cmsUInt32Number n, i; cmsUInt32Number Codes[200]; char* Descriptions[200]; n = cmsGetSupportedIntents(200, Codes, Descriptions); printf("Supported intents:\n"); for (i=0; i < n; i++) { printf("\t%u - %s\n", Codes[i], Descriptions[i]); } printf("\n"); } // --------------------------------------------------------------------------------------- int main(int argc, char* argv[]) { cmsInt32Number Exhaustive = 0; cmsInt32Number DoSpeedTests = 1; cmsInt32Number DoCheckTests = 1; cmsInt32Number DoPluginTests = 1; #ifdef CMS_IS_WINDOWS_ cmsInt32Number DoZooTests = 0; #endif #ifdef _MSC_VER _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif // First of all, check for the right header if (cmsGetEncodedCMMversion() != LCMS_VERSION) { Die("Oops, you are mixing header and shared lib!\nHeader version reports to be '%d' and shared lib '%d'\n", LCMS_VERSION, cmsGetEncodedCMMversion()); } printf("LittleCMS %2.2f test bed %s %s\n\n", cmsGetEncodedCMMversion() / 1000.0, __DATE__, __TIME__); if ((argc == 2) && strcmp(argv[1], "--exhaustive") == 0) { Exhaustive = 1; printf("Running exhaustive tests (will take a while...)\n\n"); } else if ((argc == 3) && strcmp(argv[1], "--chdir") == 0) { CHDIR(argv[2]); } printf("Installing debug memory plug-in ... "); cmsPlugin(&DebugMemHandler); printf("done.\n"); printf("Installing error logger ... "); cmsSetLogErrorHandler(FatalErrorQuit); printf("done.\n"); PrintSupportedIntents(); Check("Base types", CheckBaseTypes); Check("endianness", CheckEndianness); Check("quick floor", CheckQuickFloor); Check("quick floor word", CheckQuickFloorWord); Check("Fixed point 15.16 representation", CheckFixedPoint15_16); Check("Fixed point 8.8 representation", CheckFixedPoint8_8); Check("D50 roundtrip", CheckD50Roundtrip); // Create utility profiles if (DoCheckTests || DoSpeedTests) Check("Creation of test profiles", CreateTestProfiles); if (DoCheckTests) { // Forward 1D interpolation Check("1D interpolation in 2pt tables", Check1DLERP2); Check("1D interpolation in 3pt tables", Check1DLERP3); Check("1D interpolation in 4pt tables", Check1DLERP4); Check("1D interpolation in 6pt tables", Check1DLERP6); Check("1D interpolation in 18pt tables", Check1DLERP18); Check("1D interpolation in descending 2pt tables", Check1DLERP2Down); Check("1D interpolation in descending 3pt tables", Check1DLERP3Down); Check("1D interpolation in descending 6pt tables", Check1DLERP6Down); Check("1D interpolation in descending 18pt tables", Check1DLERP18Down); if (Exhaustive) { Check("1D interpolation in n tables", ExhaustiveCheck1DLERP); Check("1D interpolation in descending tables", ExhaustiveCheck1DLERPDown); } // Forward 3D interpolation Check("3D interpolation Tetrahedral (float) ", Check3DinterpolationFloatTetrahedral); Check("3D interpolation Trilinear (float) ", Check3DinterpolationFloatTrilinear); Check("3D interpolation Tetrahedral (16) ", Check3DinterpolationTetrahedral16); Check("3D interpolation Trilinear (16) ", Check3DinterpolationTrilinear16); if (Exhaustive) { Check("Exhaustive 3D interpolation Tetrahedral (float) ", ExaustiveCheck3DinterpolationFloatTetrahedral); Check("Exhaustive 3D interpolation Trilinear (float) ", ExaustiveCheck3DinterpolationFloatTrilinear); Check("Exhaustive 3D interpolation Tetrahedral (16) ", ExhaustiveCheck3DinterpolationTetrahedral16); Check("Exhaustive 3D interpolation Trilinear (16) ", ExhaustiveCheck3DinterpolationTrilinear16); } Check("Reverse interpolation 3 -> 3", CheckReverseInterpolation3x3); Check("Reverse interpolation 4 -> 3", CheckReverseInterpolation4x3); // High dimensionality interpolation Check("3D interpolation", Check3Dinterp); Check("3D interpolation with granularity", Check3DinterpGranular); Check("4D interpolation", Check4Dinterp); Check("4D interpolation with granularity", Check4DinterpGranular); Check("5D interpolation with granularity", Check5DinterpGranular); Check("6D interpolation with granularity", Check6DinterpGranular); Check("7D interpolation with granularity", Check7DinterpGranular); Check("8D interpolation with granularity", Check8DinterpGranular); // Encoding of colorspaces Check("Lab to LCh and back (float only) ", CheckLab2LCh); Check("Lab to XYZ and back (float only) ", CheckLab2XYZ); Check("Lab to xyY and back (float only) ", CheckLab2xyY); Check("Lab V2 encoding", CheckLabV2encoding); Check("Lab V4 encoding", CheckLabV4encoding); // BlackBody Check("Blackbody radiator", CheckTemp2CHRM); // Tone curves Check("Linear gamma curves (16 bits)", CheckGammaCreation16); Check("Linear gamma curves (float)", CheckGammaCreationFlt); Check("Curve 1.8 (float)", CheckGamma18); Check("Curve 2.2 (float)", CheckGamma22); Check("Curve 3.0 (float)", CheckGamma30); Check("Curve 1.8 (table)", CheckGamma18Table); Check("Curve 2.2 (table)", CheckGamma22Table); Check("Curve 3.0 (table)", CheckGamma30Table); Check("Curve 1.8 (word table)", CheckGamma18TableWord); Check("Curve 2.2 (word table)", CheckGamma22TableWord); Check("Curve 3.0 (word table)", CheckGamma30TableWord); Check("Parametric curves", CheckParametricToneCurves); Check("Join curves", CheckJointCurves); Check("Join curves descending", CheckJointCurvesDescending); Check("Join curves degenerated", CheckReverseDegenerated); Check("Join curves sRGB (Float)", CheckJointFloatCurves_sRGB); Check("Join curves sRGB (16 bits)", CheckJoint16Curves_sRGB); Check("Join curves sigmoidal", CheckJointCurvesSShaped); // LUT basics Check("LUT creation & dup", CheckLUTcreation); Check("1 Stage LUT ", Check1StageLUT); Check("2 Stage LUT ", Check2StageLUT); Check("2 Stage LUT (16 bits)", Check2Stage16LUT); Check("3 Stage LUT ", Check3StageLUT); Check("3 Stage LUT (16 bits)", Check3Stage16LUT); Check("4 Stage LUT ", Check4StageLUT); Check("4 Stage LUT (16 bits)", Check4Stage16LUT); Check("5 Stage LUT ", Check5StageLUT); Check("5 Stage LUT (16 bits) ", Check5Stage16LUT); Check("6 Stage LUT ", Check6StageLUT); Check("6 Stage LUT (16 bits) ", Check6Stage16LUT); // LUT operation Check("Lab to Lab LUT (float only) ", CheckLab2LabLUT); Check("XYZ to XYZ LUT (float only) ", CheckXYZ2XYZLUT); Check("Lab to Lab MAT LUT (float only) ", CheckLab2LabMatLUT); Check("Named Color LUT", CheckNamedColorLUT); Check("Usual formatters", CheckFormatters16); Check("Floating point formatters", CheckFormattersFloat); #ifndef CMS_NO_HALF_SUPPORT Check("HALF formatters", CheckFormattersHalf); #endif // ChangeBuffersFormat Check("ChangeBuffersFormat", CheckChangeBufferFormat); // MLU Check("Multilocalized Unicode", CheckMLU); Check("Multilocalized Unicode (II)", CheckMLU_UTF8); // Named color Check("Named color lists", CheckNamedColorList); Check("Create named color profile", CreateNamedColorProfile); // Profile I/O (this one is huge!) Check("Profile creation", CheckProfileCreation); Check("Header version", CheckVersionHeaderWriting); Check("Multilocalized profile", CheckMultilocalizedProfile); // Error reporting Check("Error reporting on bad profiles", CheckErrReportingOnBadProfiles); Check("Error reporting on bad transforms", CheckErrReportingOnBadTransforms); // Transforms Check("Curves only transforms", CheckCurvesOnlyTransforms); Check("Float Lab->Lab transforms", CheckFloatLabTransforms); Check("Encoded Lab->Lab transforms", CheckEncodedLabTransforms); Check("Stored identities", CheckStoredIdentities); Check("Matrix-shaper transform (float)", CheckMatrixShaperXFORMFloat); Check("Matrix-shaper transform (16 bits)", CheckMatrixShaperXFORM16); Check("Matrix-shaper transform (8 bits)", CheckMatrixShaperXFORM8); Check("Primaries of sRGB", CheckRGBPrimaries); // Known values Check("Known values across matrix-shaper", Chack_sRGB_Float); Check("Gray input profile", CheckInputGray); Check("Gray Lab input profile", CheckLabInputGray); Check("Gray output profile", CheckOutputGray); Check("Gray Lab output profile", CheckLabOutputGray); Check("Matrix-shaper proofing transform (float)", CheckProofingXFORMFloat); Check("Matrix-shaper proofing transform (16 bits)", CheckProofingXFORM16); Check("Gamut check", CheckGamutCheck); Check("CMYK roundtrip on perceptual transform", CheckCMYKRoundtrip); Check("CMYK perceptual transform", CheckCMYKPerceptual); // Check("CMYK rel.col. transform", CheckCMYKRelCol); Check("Black ink only preservation", CheckKOnlyBlackPreserving); Check("Black plane preservation", CheckKPlaneBlackPreserving); Check("Deciding curve types", CheckV4gamma); Check("Black point detection", CheckBlackPoint); Check("TAC detection", CheckTAC); Check("CGATS parser", CheckCGATS); Check("CGATS parser on junk", CheckCGATS2); Check("CGATS parser on overflow", CheckCGATS_Overflow); Check("PostScript generator", CheckPostScript); Check("Segment maxima GBD", CheckGBD); Check("MD5 digest", CheckMD5); Check("Linking", CheckLinking); Check("floating point tags on XYZ", CheckFloatXYZ); Check("RGB->Lab->RGB with alpha on FLT", ChecksRGB2LabFLT); Check("Parametric curve on Rec709", CheckParametricRec709); Check("Floating Point sampled curve with non-zero start", CheckFloatSamples); Check("Floating Point segmented curve with short sampled segment", CheckFloatSegments); Check("Read RAW tags", CheckReadRAW); Check("Check MetaTag", CheckMeta); Check("Null transform on floats", CheckFloatNULLxform); Check("Set free a tag", CheckRemoveTag); Check("Matrix simplification", CheckMatrixSimplify); Check("Planar 8 optimization", CheckPlanar8opt); Check("Planar float to int16", CheckPlanarFloat2int); Check("Swap endian feature", CheckSE); Check("Transform line stride RGB", CheckTransformLineStride); Check("Forged MPE profile", CheckForgedMPE); Check("Proofing intersection", CheckProofingIntersection); Check("Empty MLUC", CheckEmptyMLUC); Check("sRGB round-trips", Check_sRGB_Rountrips); Check("OkLab color space", Check_OkLab); Check("OkLab color space (2)", Check_OkLab2); Check("centering of Lab16", CheckCenteringOfLab); Check("Gamma space detection", CheckGammaSpaceDetection); Check("Unbounded mode w/ integer output", CheckIntToFloatTransform); Check("Corrupted built-in by using cmsWriteRawTag", CheckInducedCorruption); Check("Bad CGATS file", CheckBadCGATS); Check("Saving linearization devicelink", CheckSaveLinearizationDevicelink); Check("Gamut check on floats", CheckGamutCheckFloats); Check("Mixing RAW and Cooked tags", CheckMixedRawAndCooked); } if (DoPluginTests) { Check("Context memory handling", CheckAllocContext); Check("Simple context functionality", CheckSimpleContext); Check("Alarm codes context", CheckAlarmColorsContext); Check("Adaptation state context", CheckAdaptationStateContext); Check("1D interpolation plugin", CheckInterp1DPlugin); Check("3D interpolation plugin", CheckInterp3DPlugin); Check("Parametric curve plugin", CheckParametricCurvePlugin); Check("Formatters plugin", CheckFormattersPlugin); Check("Tag type plugin", CheckTagTypePlugin); Check("MPE type plugin", CheckMPEPlugin); Check("Optimization plugin", CheckOptimizationPlugin); Check("Rendering intent plugin", CheckIntentPlugin); Check("Full transform plugin", CheckTransformPlugin); Check("Mutex plugin", CheckMutexPlugin); Check("Double from float", CheckMethodPackDoublesFromFloat); } if (DoSpeedTests) SpeedTest(); #ifdef CMS_IS_WINDOWS_ if (DoZooTests) CheckProfileZOO(); #endif DebugMemPrintTotals(); cmsUnregisterPlugins(); // Cleanup if (DoCheckTests || DoSpeedTests) RemoveTestProfiles(); return TotalFail; } lcms2-2.19.1/testbed/Makefile.am0000644000175000017500000000175515176573557015361 0ustar martimarti# # Makefile for building testcms # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/src check_PROGRAMS = testcms # CFLAGS = --pedantic -Wall -std=c99 -O2 # The testsuite binary is statically linked. This is necessary as it uses some # of the internal functions that are not necessarily exported by the shared # library. testcms_LDADD = $(top_builddir)/src/liblcms2.la testcms_LDFLAGS = -static @LDFLAGS@ testcms_SOURCES = testcms2.c testplugin.c zoo_icc.c testcms2.h EXTRA_DIST = test1.icc bad.icc toosmall.icc test2.icc \ test3.icc test4.icc \ test5.icc ibm-t61.icc crayons.icc bad_mpe.icc check: if [ $(top_srcdir) != $(top_builddir) ]; then \ cp $(top_srcdir)/testbed/*.ic? $(top_builddir)/testbed; \ fi LD_LIBRARY_PATH=$(top_builddir)/src/.libs ./testcms if [ $(top_srcdir) != $(top_builddir) ]; then \ rm -f $(top_builddir)/testbed/*.ic?; \ fi lcms2-2.19.1/testbed/.deps/0000755000175000017500000000000015176574562014323 5ustar martimartilcms2-2.19.1/testbed/Makefile.in0000644000175000017500000004766215176574547015401 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building testcms # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = testcms$(EXEEXT) subdir = testbed ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_testcms_OBJECTS = testcms2.$(OBJEXT) testplugin.$(OBJEXT) \ zoo_icc.$(OBJEXT) testcms_OBJECTS = $(am_testcms_OBJECTS) testcms_DEPENDENCIES = $(top_builddir)/src/liblcms2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = testcms_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(testcms_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/testcms2.Po \ ./$(DEPDIR)/testplugin.Po ./$(DEPDIR)/zoo_icc.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(testcms_SOURCES) DIST_SOURCES = $(testcms_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/src # CFLAGS = --pedantic -Wall -std=c99 -O2 # The testsuite binary is statically linked. This is necessary as it uses some # of the internal functions that are not necessarily exported by the shared # library. testcms_LDADD = $(top_builddir)/src/liblcms2.la testcms_LDFLAGS = -static @LDFLAGS@ testcms_SOURCES = testcms2.c testplugin.c zoo_icc.c testcms2.h EXTRA_DIST = test1.icc bad.icc toosmall.icc test2.icc \ test3.icc test4.icc \ test5.icc ibm-t61.icc crayons.icc bad_mpe.icc all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testbed/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign testbed/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) testcms$(EXEEXT): $(testcms_OBJECTS) $(testcms_DEPENDENCIES) $(EXTRA_testcms_DEPENDENCIES) @rm -f testcms$(EXEEXT) $(AM_V_CCLD)$(testcms_LINK) $(testcms_OBJECTS) $(testcms_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testcms2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testplugin.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoo_icc.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/testcms2.Po -rm -f ./$(DEPDIR)/testplugin.Po -rm -f ./$(DEPDIR)/zoo_icc.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/testcms2.Po -rm -f ./$(DEPDIR)/testplugin.Po -rm -f ./$(DEPDIR)/zoo_icc.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile check: if [ $(top_srcdir) != $(top_builddir) ]; then \ cp $(top_srcdir)/testbed/*.ic? $(top_builddir)/testbed; \ fi LD_LIBRARY_PATH=$(top_builddir)/src/.libs ./testcms if [ $(top_srcdir) != $(top_builddir) ]; then \ rm -f $(top_builddir)/testbed/*.ic?; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/utils/0000755000175000017500000000000015176573557013023 5ustar martimartilcms2-2.19.1/utils/common/0000755000175000017500000000000015176574562014310 5ustar martimartilcms2-2.19.1/utils/common/meson.build0000644000175000017500000000023715176573557016457 0ustar martimarticommon_srcs = files( 'vprf.c', 'xgetopt.c', ) common_dep = declare_dependency( sources: common_srcs, include_directories: include_directories('.'), ) lcms2-2.19.1/utils/common/utils.h0000644000175000017500000000642115176573557015627 0ustar martimarti //--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- #ifndef _lcms_utils_h // Deal with Microsoft's attempt at deprecating C standard runtime functions #ifdef _MSC_VER # if (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE # endif # ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS # endif # endif #endif #include "lcms2.h" #include #include #include #include #include #include #include #include // Avoid warnings #define UTILS_UNUSED_PARAMETER(x) ((void)x) // Init the utility functions void InitUtils(const char* PName); // Fatal Error (print the message and exit(1))--------------------------------------------- extern int Verbose; void FatalError(const char *frm, ...); // xgetopt() interface ------------------------------------------------------------- extern int xoptind; extern char *xoptarg; int xgetopt(int argc, char *argv[], char *optionS); // The stock profile utility ------------------------------------------------------- cmsHPROFILE OpenStockProfile(cmsContext ContextID, const char* File); // The print info utility ---------------------------------------------------------- void PrintProfileInformation(cmsHPROFILE h); // --------------------------------------------------------------------------------- void PrintRenderingIntents(void); void PrintBuiltins(void); // --------------------------------------------------------------------------------- cmsBool SaveMemoryBlock(const cmsUInt8Number* Buffer, cmsUInt32Number dwLen, const char* Filename); // --------------------------------------------------------------------------------- // Return a pixel type on depending on the number of channels int PixelTypeFromChanCount(int ColorChannels); // ------------------------------------------------------------------------------ // Return number of channels of pixel type int ChanCountFromPixelType(int ColorChannels); #define _lcms_utils_h #endif lcms2-2.19.1/utils/common/vprf.c0000644000175000017500000002244615176573557015444 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "utils.h" int Verbose = 0; static char ProgramName[256] = ""; void FatalError(const char *frm, ...) { va_list args; va_start(args, frm); fprintf(stderr, "[%s fatal error]: ", ProgramName); vfprintf(stderr, frm, args); fprintf(stderr, "\n"); va_end(args); exit(1); } // Show errors to the end user (unless quiet option) static void MyErrorLogHandler(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { if (Verbose >= 0) fprintf(stderr, "[%s]: %s\n", ProgramName, Text); UTILS_UNUSED_PARAMETER(ErrorCode); UTILS_UNUSED_PARAMETER(ContextID); } void InitUtils(const char* PName) { strncpy(ProgramName, PName, sizeof(ProgramName)); ProgramName[sizeof(ProgramName)-1] = 0; cmsSetLogErrorHandler(MyErrorLogHandler); } // Virtual profiles are handled here. cmsHPROFILE OpenStockProfile(cmsContext ContextID, const char* File) { if (!File) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lab2") == 0) return cmsCreateLab2ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab4") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*LabD65") == 0) { cmsCIExyY D65xyY; cmsWhitePointFromTemp( &D65xyY, 6504); return cmsCreateLab4ProfileTHR(ContextID, &D65xyY); } if (cmsstrcasecmp(File, "*XYZ") == 0) return cmsCreateXYZProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Gray22") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 2.2); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*Gray30") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 3.0); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*srgb") == 0) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*null") == 0) return cmsCreateNULLProfileTHR(ContextID); if (cmsstrcasecmp(File, "*oklab") == 0) return cmsCreate_OkLabProfile(ContextID); if (cmsstrcasecmp(File, "*Lin2222") == 0) { cmsToneCurve* Gamma = cmsBuildGamma(0, 2.2); cmsToneCurve* Gamma4[4]; cmsHPROFILE hProfile; Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; hProfile = cmsCreateLinearizationDeviceLink(cmsSigCmykData, Gamma4); cmsFreeToneCurve(Gamma); return hProfile; } return cmsOpenProfileFromFileTHR(ContextID, File, "r"); } // Help on available built-ins void PrintBuiltins(void) { fprintf(stderr, "\nBuilt-in profiles:\n\n"); fprintf(stderr, "\t*Lab2 -- D50-based v2 CIEL*a*b\n" "\t*Lab4 -- D50-based v4 CIEL*a*b\n" "\t*Lab -- D50-based v4 CIEL*a*b\n" "\t*XYZ -- CIE XYZ (PCS)\n" "\t*sRGB -- sRGB color space\n" "\t*Gray22 - Monochrome of Gamma 2.2\n" "\t*Gray30 - Monochrome of Gamma 3.0\n" "\t*null - Monochrome black for all input\n" "\t*Lin2222- CMYK linearization of gamma 2.2 on each channel\n\n"); } // Auxiliary for printing information on profile static void PrintInfo(cmsHPROFILE h, cmsInfoType Info) { char* text; int len; len = cmsGetProfileInfoASCII(h, Info, "en", "US", NULL, 0); if (len == 0) return; text = (char*) malloc(len * sizeof(char)); if (text == NULL) return; cmsGetProfileInfoASCII(h, Info, "en", "US", text, len); if (strlen(text) > 0) printf("%s\n", text); free(text); } // Displays the colorant table static void PrintColorantTable(cmsHPROFILE hInput, cmsTagSignature Sig, const char* Title) { cmsNAMEDCOLORLIST* list; int i, n; if (cmsIsTag(hInput, Sig)) { printf("%s:\n", Title); list = (cmsNAMEDCOLORLIST*) cmsReadTag(hInput, Sig); if (list == NULL) { printf("(Unavailable)\n"); return; } n = cmsNamedColorCount(list); for (i=0; i < n; i++) { char Name[cmsMAX_PATH]; cmsNamedColorInfo(list, i, Name, NULL, NULL, NULL, NULL); printf("\t%s\n", Name); } printf("\n"); } } void PrintProfileInformation(cmsHPROFILE hInput) { if (hInput == NULL) { fprintf(stderr, "*Wrong or corrupted profile*\n"); return; } PrintInfo(hInput, cmsInfoDescription); PrintInfo(hInput, cmsInfoManufacturer); PrintInfo(hInput, cmsInfoModel); PrintInfo(hInput, cmsInfoCopyright); if (Verbose > 2) { PrintColorantTable(hInput, cmsSigColorantTableTag, "Input colorant table"); PrintColorantTable(hInput, cmsSigColorantTableOutTag, "Input colorant out table"); } printf("\n"); } // ----------------------------------------------------------------------------- void PrintRenderingIntents(void) { cmsUInt32Number Codes[200]; char* Descriptions[200]; cmsUInt32Number n, i; fprintf(stderr, "-t rendering intent:\n\n"); n = cmsGetSupportedIntents(200, Codes, Descriptions); for (i=0; i < n; i++) { fprintf(stderr, "\t%u - %s\n", Codes[i], Descriptions[i]); } fprintf(stderr, "\n"); } // ------------------------------------------------------------------------------ cmsBool SaveMemoryBlock(const cmsUInt8Number* Buffer, cmsUInt32Number dwLen, const char* Filename) { FILE* out = fopen(Filename, "wb"); if (out == NULL) { FatalError("Cannot create '%s'", Filename); return FALSE; } if (fwrite(Buffer, 1, dwLen, out) != dwLen) { FatalError("Cannot write %ld bytes to %s", (long) dwLen, Filename); return FALSE; } if (fclose(out) != 0) { FatalError("Error flushing file '%s'", Filename); return FALSE; } return TRUE; } // ------------------------------------------------------------------------------ // Return a pixel type on depending on the number of channels int PixelTypeFromChanCount(int ColorChannels) { switch (ColorChannels) { case 1: return PT_GRAY; case 2: return PT_MCH2; case 3: return PT_MCH3; case 4: return PT_CMYK; case 5: return PT_MCH5; case 6: return PT_MCH6; case 7: return PT_MCH7; case 8: return PT_MCH8; case 9: return PT_MCH9; case 10: return PT_MCH10; case 11: return PT_MCH11; case 12: return PT_MCH12; case 13: return PT_MCH13; case 14: return PT_MCH14; case 15: return PT_MCH15; default: FatalError("What a weird separation of %d channels?!?!", ColorChannels); return -1; } } // ------------------------------------------------------------------------------ // Return number of channels of pixel type int ChanCountFromPixelType(int ColorChannels) { switch (ColorChannels) { case PT_GRAY: return 1; case PT_RGB: case PT_CMY: case PT_Lab: case PT_YUV: case PT_YCbCr: return 3; case PT_CMYK: return 4 ; case PT_MCH2: return 2 ; case PT_MCH3: return 3 ; case PT_MCH4: return 4 ; case PT_MCH5: return 5 ; case PT_MCH6: return 6 ; case PT_MCH7: return 7 ; case PT_MCH8: return 8 ; case PT_MCH9: return 9 ; case PT_MCH10: return 10; case PT_MCH11: return 11; case PT_MCH12: return 12; case PT_MCH13: return 12; case PT_MCH14: return 14; case PT_MCH15: return 15; default: FatalError("Unsupported color space of %d channels", ColorChannels); return -1; } } lcms2-2.19.1/utils/common/xgetopt.c0000644000175000017500000000515515176573557016157 0ustar martimarti //--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // // xgetopt.c -- loosely based on System V getopt() // // option ::= SW [optLetter]* [argLetter space* argument] // #include #include int xoptind = 1; char *xoptarg; static char *nextArg = NULL; #define SW '-' int xgetopt(int argc, char* argv[], char* optionS) { unsigned char ch; char* optP; if (argc > xoptind) { if (nextArg == NULL) { if ((nextArg = argv[xoptind]) == NULL || *(nextArg++) != SW) goto end_eof; } if ((ch = *(nextArg++)) == 0) { xoptind++; goto end_eof; } if (ch == ':' || (optP = strchr(optionS, ch)) == NULL) goto end_error; if (*(++optP) == ':') { xoptind++; if (*nextArg == 0) { if (argc <= xoptind) goto end_error; nextArg = argv[xoptind++]; } xoptarg = nextArg; nextArg = NULL; } else { if (*nextArg == 0) { xoptind++; nextArg = NULL; } xoptarg = NULL; } return ch; } end_eof: xoptarg = nextArg = NULL; return EOF; end_error: xoptarg = NULL; return '?'; } lcms2-2.19.1/utils/delphi/0000755000175000017500000000000015176573557014270 5ustar martimartilcms2-2.19.1/utils/delphi/delphidemo.dpr0000644000175000017500000000026115176573557017110 0ustar martimartiprogram delphidemo; uses Forms, demo1 in 'demo1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. lcms2-2.19.1/utils/delphi/delphidemo.dproj0000644000175000017500000001234715176573557017451 0ustar martimarti {E3F889E8-CB8A-49AE-8173-4DDA022466BE} delphidemo.dpr Debug DCC32 12.0 true true Base true true Base true vcl;rtl;vclx;vclimg;vclactnband;dbrtl;vcldb;vcldbx;bdertl;vcltouch;xmlrtl;dsnap;dsnapcon;TeeUI;TeeDB;Tee;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_100_140;Intraweb_100_140;VclSmp;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DbxClientDriver;DataSnapServer;DBXInterBaseDriver;DBXMySQLDriver;dbxcds;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;Rave77VCL 00400000 1 delphidemo.exe WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) x86 true false false false false false RELEASE;$(DCC_Define) 0 false DEBUG;$(DCC_Define) MainSource

Form1 Base Cfg_2 Base Cfg_1 Base Delphi.Personality.12 VCLApplication delphidemo.dpr False d:\lcms-1.13\delphi True False False False 1 0 0 0 False False False False False 3082 1252 1.0.0.0 1.0.0.0 Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components False 12 lcms2-2.19.1/utils/delphi/delphidemo.res0000755000175000017500000000155415176573557017125 0ustar martimarti   ( @wxx LLLx LLLLLLLx LLLLLLLLx LLLLLL@ LLw LLLLLLxwp LLLHLLxpx LLLLxwyHLćp LLLLGw{LćxxDDDDHw{ĄxDDDHxyĄDDDHHDDDDDDHHDDDDD@O?H?0MAINICON  lcms2-2.19.1/utils/delphi/demo1.dfm0000755000175000017500000001046015176573557015771 0ustar martimarti TFORM10 TPF0TForm1Form1LeftTopCaptionLittle cms 2 Delphi demo ClientHeight ClientWidthColor clBtnFaceConstraints.MinHeight Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Height Font.Name MS Sans Serif Font.Style OldCreateOrder PixelsPerInch` TextHeightTImageImage1LeftTopWidth\Height Margins.Left Margins.Top Margins.RightMargins.BottomAlignalLeftStretch ExplicitLeftTImageImage2LeftfTopWidthjHeight Margins.Left Margins.Top Margins.RightMargins.BottomAlignalClientStretch ExplicitLeftn ExplicitWidthExplicitHeightP TSplitter Splitter1Left\TopWidth Height Margins.Left Margins.Top Margins.RightMargins.BottomBeveled ExplicitLeft ExplicitTopExplicitHeightTPanelPanel1LeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAlignalBottomConstraints.MinWidthhCtl3D ParentCtl3DTabOrder ExplicitTop DesignSizeTLabelLabel1Left(TopWidthGHeight Margins.Left Margins.Top Margins.RightMargins.Bottom AlignmenttaRightJustifyAnchors akLeftakBottomCaptionInput profile: ExplicitTopSTLabelLabel2Left%TopWidthWHeight Margins.Left Margins.Top Margins.RightMargins.Bottom AlignmenttaRightJustifyAnchors akLeftakBottomCaptionMonitor profile: ExplicitToppTLabelLabel3Left(Top6WidthdHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomCaptionRendering intent:LayouttlCenterTLabelLabel4Left%Top`WidthHeightAnchors akLeftakBottomCaption Adaptation state (abs col. only)TButtonButton3LeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akRightakBottomCaption...TabOrder OnClick Button3Click TComboBox ComboBoxInputLeftTopWidth(Height Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomCtl3D ParentCtl3DTabOrderTButtonButton2Left Top6WidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakBottomCaption Load &pictureTabOrderOnClick Button2Click TComboBoxComboBoxOutputLeftTopWidth(Height Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomTabOrder TCheckBoxWBCompensationLeft'TopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakBottomCaptionBlack point compensationTabOrder TCheckBox NoTransformLeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akRightakBottomCaptionDon't transform at allTabOrder TRadioGroup RadioGroup1Left TophWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakBottomCaptionTroughput optimization ItemIndex Items.Strings &No optimize (top quality, slow)&More memory (quality)&Standard (Balanced)&Less memory (for previews)TabOrderTButtonButton1LeftTopWidthHeight) Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomCaptionApply profilesTabOrderOnClick Button1Click TProgressBar ProgressBar1Left TopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomTabOrder TComboBoxComboBoxIntentLeftTop6Width2Height Margins.Left Margins.Top Margins.RightMargins.BottomStylecsDropDownListAnchors akLeftakRightakBottomTabOrderOnChangeComboBoxIntentChange Items.Strings PerceptualRelative colorimetric SaturationAbsolute colorimetricTButtonButton4LeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akRightakBottomCaption...TabOrder OnClick Button4Click TScrollBar ScrollBar1LeftTop`WidthHeightAnchors akLeftakRightakBottomEnabledPageSizeTabOrder OnChangeScrollBar1ChangeTOpenPictureDialogOpenPictureDialog1FilterBMP files|*.bmpLeftTop TOpenDialog OpenDialog1 DefaultExticmFilter 0) AND (Signature = cmsSigDisplayClass)) then InSignatures := TRUE else if (((dwFlags AND IS_OUTPUT) <> 0) AND (Signature = cmsSigOutputClass)) then InSignatures := TRUE else if (((dwFlags AND IS_INPUT) <> 0) AND (Signature = cmsSigInputClass)) then InSignatures := TRUE else if (((dwFlags AND IS_COLORSPACE) <> 0) AND (Signature = cmsSigColorSpaceClass)) then InSignatures := TRUE else if (((dwFlags AND IS_ABSTRACT) <> 0) AND (Signature = cmsSigAbstractClass)) then InSignatures := TRUE else InSignatures := FALSE END; PROCEDURE FillCombo(var Combo: TComboBox; Signatures: DWORD); var Files, Descriptions: TStringList; Found: Integer; SearchRec: TSearchRec; Path, Profile: String; Dir: ARRAY [0 .. 1024] OF Char; hProfile: cmsHPROFILE; Descrip: array [0 .. 256] of Char; begin Files := TStringList.Create; Descriptions := TStringList.Create; GetSystemDirectory(Dir, 1023); Path := String(Dir) + '\SPOOL\DRIVERS\COLOR\'; Found := FindFirst(Path + '*.ic?', faAnyFile, SearchRec); while Found = 0 do begin Profile := Path + SearchRec.Name; hProfile := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Profile)), 'r'); if (hProfile <> NIL) THEN begin if ((cmsGetColorSpace(hProfile) = cmsSigRgbData) AND InSignatures (cmsGetDeviceClass(hProfile), Signatures)) then begin cmsGetProfileInfo(hProfile, cmsInfoDescription, 'EN', 'us', Descrip, 256); Descriptions.Add(Descrip); Files.Add(Profile); end; cmsCloseProfile(hProfile); end; Found := FindNext(SearchRec); end; FindClose(SearchRec); Combo.Items := Descriptions; Combo.Tag := Integer(Files); end; // A rather simple Logger... note the "cdecl" convention PROCEDURE ErrorLogger(ContextID: cmsContext; ErrorCode: cmsUInt32Number; Text: PAnsiChar); Cdecl; begin MessageBox(0, PWideChar(WideString(Text)), 'Something is going wrong...', MB_OK OR MB_ICONWARNING or MB_TASKMODAL); end; constructor TForm1.Create(Owner: TComponent); var IntentNames: array [0 .. 20] of PAnsiChar; i, n: Integer; begin inherited Create(Owner); // Set the logger cmsSetLogErrorHandler(ErrorLogger); ScrollBar1.Min := 0; ScrollBar1.Max := 100; FillCombo(ComboBoxInput, IS_INPUT OR IS_COLORSPACE OR IS_DISPLAY); FillCombo(ComboBoxOutput, $FFFF ); // Get the supported intents n := cmsGetSupportedIntents(20, @IntentCodes, @IntentNames); ComboBoxIntent.Items.BeginUpdate; ComboBoxIntent.Items.Clear; for i:= 0 TO n - 1 DO ComboBoxIntent.Items.Add(String(IntentNames[i])); ComboBoxIntent.ItemIndex := 0; ComboBoxIntent.Items.EndUpdate; end; procedure TForm1.ScrollBar1Change(Sender: TObject); var d: Integer; s: String; begin d := ScrollBar1.Position; Str(d, s); Label4.Caption := 'Adaptation state '+s + '% (Abs. col only)'; end; procedure TForm1.Button2Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); Image1.Picture.Bitmap.PixelFormat := pf24bit; Image2.Picture.LoadFromFile(OpenPictureDialog1.FileName); Image2.Picture.Bitmap.PixelFormat := pf24bit; end end; function SelectedFile(var Combo: TComboBox): string; var List: TStringList; n: Integer; begin List := TStringList(Combo.Tag); n := Combo.ItemIndex; if (n >= 0) then SelectedFile := List.Strings[n] else SelectedFile := Combo.Text; end; procedure TForm1.ComboBoxIntentChange(Sender: TObject); begin ScrollBar1.Enabled := (ComboBoxIntent.itemIndex = 3); end; function TForm1.ComputeFlags: DWORD; var dwFlags: DWORD; begin dwFlags := 0; if (WBCompensation.Checked) then begin dwFlags := dwFlags OR cmsFLAGS_BLACKPOINTCOMPENSATION end; if (NoTransform.Checked) then begin dwFlags := dwFlags OR cmsFLAGS_NULLTRANSFORM end; case RadioGroup1.ItemIndex of 0: dwFlags := dwFlags OR cmsFLAGS_NOOPTIMIZE; 1: dwFlags := dwFlags OR cmsFLAGS_HIGHRESPRECALC; 3: dwFlags := dwFlags OR cmsFLAGS_LOWRESPRECALC; end; ComputeFlags := dwFlags end; procedure TForm1.Button1Click(Sender: TObject); var Source, Dest: String; hSrc, hDest: cmsHPROFILE; xform: cmsHTRANSFORM; i, PicW, PicH: Integer; Intent: Integer; dwFlags: DWORD; begin Source := SelectedFile(ComboBoxInput); Dest := SelectedFile(ComboBoxOutput); dwFlags := ComputeFlags; Intent := IntentCodes[ComboBoxIntent.ItemIndex]; cmsSetAdaptationState( ScrollBar1.Position / 100.0 ); if (Source <> '') AND (Dest <> '') then begin hSrc := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Source)), 'r'); hDest := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Dest)), 'r'); if (hSrc <> Nil) and (hDest <> Nil) then begin xform := cmsCreateTransform(hSrc, TYPE_BGR_8, hDest, TYPE_BGR_8, Intent, dwFlags); end else begin xform := nil; end; if hSrc <> nil then begin cmsCloseProfile(hSrc); end; if hDest <> Nil then begin cmsCloseProfile(hDest); end; if (xform <> nil) then begin PicW := Image2.Picture.width; PicH := Image2.Picture.height; ProgressBar1.Min := 0; ProgressBar1.Max := PicH; ProgressBar1.Step := 1; for i := 0 TO (PicH - 1) do begin if ((i MOD 100) = 0) then ProgressBar1.Position := i; cmsDoTransform(xform, Image1.Picture.Bitmap.Scanline[i], Image2.Picture.Bitmap.Scanline[i], PicW); end; ProgressBar1.Position := PicH; cmsDeleteTransform(xform); end; Image2.Repaint; ProgressBar1.Position := 0; end end; procedure TForm1.Button3Click(Sender: TObject); begin if OpenDialog1.Execute then ComboBoxInput.Text := OpenDialog1.FileName; end; procedure TForm1.Button4Click(Sender: TObject); begin if OpenDialog1.Execute then ComboBoxOutput.Text := OpenDialog1.FileName; end; end. lcms2-2.19.1/utils/delphi/lcms2dll.pas0000644000175000017500000034307515176573557016525 0ustar martimarti// // Little cms DELPHI wrapper //--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2021 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // // Version 2.13 - unmantained // UNIT lcms2dll; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} INTERFACE {$IFNDEF MSWINDOWS} USES LCLType, types; Type PWChar = PWideChar; {$ELSE} USES Windows; {$ENDIF} CONST LCMS2_SO = {$IFDEF DARWIN} 'liblcms2.13.dylib'; {$ELSE} 'lcms2.dll'; {$ENDIF} TYPE Uint8 = Byte; Int8 = Shortint; UInt16 = Word; Int16 = Smallint; UInt32 = LongWord; Int32 = Longint; TYPE cmsUInt8Number = Uint8; cmsInt8Number = Int8; cmsUInt16Number = UInt16; cmsInt16Number = Int16; cmsUInt32Number = UInt32; cmsInt32Number = Int32; cmsInt64Number = Int64; cmsUInt64Number = UInt64; cmsFloat32Number = Single; cmsFloat64Number = Double; LPcmsUInt8Number = ^cmsUInt8Number; LPcmsInt8Number = ^cmsInt8Number; LPcmsUInt16Number = ^cmsUInt16Number; LPcmsInt16Number = ^cmsInt16Number; LPcmsUInt32Number = ^cmsUInt32Number; LPcmsInt32Number = ^cmsInt32Number; LPcmsInt64Number = ^cmsInt64Number; LPcmsUInt64Number = ^cmsUInt64Number; LPcmsFloat32Number = ^cmsFloat32Number; LPcmsFloat64Number = ^cmsFloat64Number; // Derivative types cmsSignature = cmsUInt32Number; cmsU8Fixed8Number = cmsUInt16Number; cmsS15Fixed16Number = cmsInt32Number; cmsU16Fixed16Number = cmsUInt32Number; // Boolean type, which will be using the native integer cmsBool = Boolean; CONST // Some common definitions cmsMAX_PATH = 256; // D50 XYZ normalized to Y=1.0 cmsD50X = 0.9642; cmsD50Y = 1.0; cmsD50Z = 0.8249; // V4 perceptual black cmsPERCEPTUAL_BLACK_X = 0.00336; cmsPERCEPTUAL_BLACK_Y = 0.0034731; cmsPERCEPTUAL_BLACK_Z = 0.00287; // Definitions in ICC spec cmsMagicNumber = $61637370; // 'acsp' lcmsSignature = $6c636d73; // 'lcms' TYPE // Base ICC type definitions cmsTagTypeSignature = ( cmsSigChromaticityType = $6368726D, // 'chrm' cmsSigColorantOrderType = $636C726F, // 'clro' cmsSigColorantTableType = $636C7274, // 'clrt' cmsSigCrdInfoType = $63726469, // 'crdi' cmsSigCurveType = $63757276, // 'curv' cmsSigDataType = $64617461, // 'data' cmsSigDictType = $64696374, // 'dict' cmsSigDateTimeType = $6474696D, // 'dtim' cmsSigDeviceSettingsType = $64657673, // 'devs' cmsSigLut16Type = $6d667432, // 'mft2' cmsSigLut8Type = $6d667431, // 'mft1' cmsSigLutAtoBType = $6d414220, // 'mAB ' cmsSigLutBtoAType = $6d424120, // 'mBA ' cmsSigMeasurementType = $6D656173, // 'meas' cmsSigMultiLocalizedUnicodeType = $6D6C7563, // 'mluc' cmsSigMultiProcessElementType = $6D706574, // 'mpet' cmsSigNamedColorType = $6E636f6C, // 'ncol' -- DEPRECATED! cmsSigNamedColor2Type = $6E636C32, // 'ncl2' cmsSigParametricCurveType = $70617261, // 'para' cmsSigProfileSequenceDescType = $70736571, // 'pseq' cmsSigProfileSequenceIdType = $70736964, // 'psid' cmsSigResponseCurveSet16Type = $72637332, // 'rcs2' cmsSigS15Fixed16ArrayType = $73663332, // 'sf32' cmsSigScreeningType = $7363726E, // 'scrn' cmsSigSignatureType = $73696720, // 'sig ' cmsSigTextType = $74657874, // 'text' cmsSigTextDescriptionType = $64657363, // 'desc' cmsSigU16Fixed16ArrayType = $75663332, // 'uf32' cmsSigUcrBgType = $62666420, // 'bfd ' cmsSigUInt16ArrayType = $75693136, // 'ui16' cmsSigUInt32ArrayType = $75693332, // 'ui32' cmsSigUInt64ArrayType = $75693634, // 'ui64' cmsSigUInt8ArrayType = $75693038, // 'ui08' cmsSigViewingConditionsType = $76696577, // 'view' cmsSigXYZType = $58595A20, // 'XYZ ' cmsSigVcgtType = $76636774 // 'vcgt' ); // Base ICC tag definitions cmsTagSignature = ( cmsSigAToB0Tag = $41324230, // 'A2B0' cmsSigAToB1Tag = $41324231, // 'A2B1' cmsSigAToB2Tag = $41324232, // 'A2B2' cmsSigBlueColorantTag = $6258595A, // 'bXYZ' cmsSigBlueMatrixColumnTag = $6258595A, // 'bXYZ' cmsSigBlueTRCTag = $62545243, // 'bTRC' cmsSigBToA0Tag = $42324130, // 'B2A0' cmsSigBToA1Tag = $42324131, // 'B2A1' cmsSigBToA2Tag = $42324132, // 'B2A2' cmsSigCalibrationDateTimeTag = $63616C74, // 'calt' cmsSigCharTargetTag = $74617267, // 'targ' cmsSigChromaticAdaptationTag = $63686164, // 'chad' cmsSigChromaticityTag = $6368726D, // 'chrm' cmsSigColorantOrderTag = $636C726F, // 'clro' cmsSigColorantTableTag = $636C7274, // 'clrt' cmsSigColorantTableOutTag = $636C6F74, // 'clot' cmsSigColorimetricIntentImageStateTag = $63696973, // 'ciis' cmsSigCopyrightTag = $63707274, // 'cprt' cmsSigCrdInfoTag = $63726469, // 'crdi' cmsSigDataTag = $64617461, // 'data' cmsSigDateTimeTag = $6474696D, // 'dtim' cmsSigDeviceMfgDescTag = $646D6E64, // 'dmnd' cmsSigDeviceModelDescTag = $646D6464, // 'dmdd' cmsSigDeviceSettingsTag = $64657673, // 'devs' cmsSigDToB0Tag = $44324230, // 'D2B0' cmsSigDToB1Tag = $44324231, // 'D2B1' cmsSigDToB2Tag = $44324232, // 'D2B2' cmsSigDToB3Tag = $44324233, // 'D2B3' cmsSigBToD0Tag = $42324430, // 'B2D0' cmsSigBToD1Tag = $42324431, // 'B2D1' cmsSigBToD2Tag = $42324432, // 'B2D2' cmsSigBToD3Tag = $42324433, // 'B2D3' cmsSigGamutTag = $67616D74, // 'gamt' cmsSigGrayTRCTag = $6b545243, // 'kTRC' cmsSigGreenColorantTag = $6758595A, // 'gXYZ' cmsSigGreenMatrixColumnTag = $6758595A, // 'gXYZ' cmsSigGreenTRCTag = $67545243, // 'gTRC' cmsSigLuminanceTag = $6C756d69, // 'lumi' cmsSigMeasurementTag = $6D656173, // 'meas' cmsSigMediaBlackPointTag = $626B7074, // 'bkpt' cmsSigMediaWhitePointTag = $77747074, // 'wtpt' cmsSigNamedColorTag = $6E636f6C, // 'ncol' // Deprecated by the ICC cmsSigNamedColor2Tag = $6E636C32, // 'ncl2' cmsSigOutputResponseTag = $72657370, // 'resp' cmsSigPerceptualRenderingIntentGamutTag = $72696730, // 'rig0' cmsSigPreview0Tag = $70726530, // 'pre0' cmsSigPreview1Tag = $70726531, // 'pre1' cmsSigPreview2Tag = $70726532, // 'pre2' cmsSigProfileDescriptionTag = $64657363, // 'desc' cmsSigProfileSequenceDescTag = $70736571, // 'pseq' cmsSigProfileSequenceIdTag = $70736964, // 'psid' cmsSigPs2CRD0Tag = $70736430, // 'psd0' cmsSigPs2CRD1Tag = $70736431, // 'psd1' cmsSigPs2CRD2Tag = $70736432, // 'psd2' cmsSigPs2CRD3Tag = $70736433, // 'psd3' cmsSigPs2CSATag = $70733273, // 'ps2s' cmsSigPs2RenderingIntentTag = $70733269, // 'ps2i' cmsSigRedColorantTag = $7258595A, // 'rXYZ' cmsSigRedMatrixColumnTag = $7258595A, // 'rXYZ' cmsSigRedTRCTag = $72545243, // 'rTRC' cmsSigSaturationRenderingIntentGamutTag = $72696732, // 'rig2' cmsSigScreeningDescTag = $73637264, // 'scrd' cmsSigScreeningTag = $7363726E, // 'scrn' cmsSigTechnologyTag = $74656368, // 'tech' cmsSigUcrBgTag = $62666420, // 'bfd ' cmsSigViewingCondDescTag = $76756564, // 'vued' cmsSigViewingConditionsTag = $76696577, // 'view' cmsSigVcgtTag = $76636774, // 'vcgt' cmsSigMetaTag = $6D657461 // 'meta' ); // ICC Technology tag cmsTechnologySignature = ( cmsSigDigitalCamera = $6463616D, // 'dcam' cmsSigFilmScanner = $6673636E, // 'fscn' cmsSigReflectiveScanner = $7273636E, // 'rscn' cmsSigInkJetPrinter = $696A6574, // 'ijet' cmsSigThermalWaxPrinter = $74776178, // 'twax' cmsSigElectrophotographicPrinter = $6570686F, // 'epho' cmsSigElectrostaticPrinter = $65737461, // 'esta' cmsSigDyeSublimationPrinter = $64737562, // 'dsub' cmsSigPhotographicPaperPrinter = $7270686F, // 'rpho' cmsSigFilmWriter = $6670726E, // 'fprn' cmsSigVideoMonitor = $7669646D, // 'vidm' cmsSigVideoCamera = $76696463, // 'vidc' cmsSigProjectionTelevision = $706A7476, // 'pjtv' cmsSigCRTDisplay = $43525420, // 'CRT ' cmsSigPMDisplay = $504D4420, // 'PMD ' cmsSigAMDisplay = $414D4420, // 'AMD ' cmsSigPhotoCD = $4B504344, // 'KPCD' cmsSigPhotoImageSetter = $696D6773, // 'imgs' cmsSigGravure = $67726176, // 'grav' cmsSigOffsetLithography = $6F666673, // 'offs' cmsSigSilkscreen = $73696C6B, // 'silk' cmsSigFlexography = $666C6578, // 'flex' cmsSigMotionPictureFilmScanner = $6D706673, // 'mpfs' cmsSigMotionPictureFilmRecorder = $6D706672, // 'mpfr' cmsSigDigitalMotionPictureCamera = $646D7063, // 'dmpc' cmsSigDigitalCinemaProjector = $64636A70 // 'dcpj' ); // ICC Color spaces cmsColorSpaceSignature = ( cmsSigXYZData = $58595A20, // 'XYZ ' cmsSigLabData = $4C616220, // 'Lab ' cmsSigLuvData = $4C757620, // 'Luv ' cmsSigYCbCrData = $59436272, // 'YCbr' cmsSigYxyData = $59787920, // 'Yxy ' cmsSigRgbData = $52474220, // 'RGB ' cmsSigGrayData = $47524159, // 'GRAY' cmsSigHsvData = $48535620, // 'HSV ' cmsSigHlsData = $484C5320, // 'HLS ' cmsSigCmykData = $434D594B, // 'CMYK' cmsSigCmyData = $434D5920, // 'CMY ' cmsSigMCH1Data = $4D434831, // 'MCH1' cmsSigMCH2Data = $4D434832, // 'MCH2' cmsSigMCH3Data = $4D434833, // 'MCH3' cmsSigMCH4Data = $4D434834, // 'MCH4' cmsSigMCH5Data = $4D434835, // 'MCH5' cmsSigMCH6Data = $4D434836, // 'MCH6' cmsSigMCH7Data = $4D434837, // 'MCH7' cmsSigMCH8Data = $4D434838, // 'MCH8' cmsSigMCH9Data = $4D434839, // 'MCH9' cmsSigMCHAData = $4D43483A, // 'MCHA' cmsSigMCHBData = $4D43483B, // 'MCHB' cmsSigMCHCData = $4D43483C, // 'MCHC' cmsSigMCHDData = $4D43483D, // 'MCHD' cmsSigMCHEData = $4D43483E, // 'MCHE' cmsSigMCHFData = $4D43483F, // 'MCHF' cmsSigNamedData = $6e6d636c, // 'nmcl' cmsSig1colorData = $31434C52, // '1CLR' cmsSig2colorData = $32434C52, // '2CLR' cmsSig3colorData = $33434C52, // '3CLR' cmsSig4colorData = $34434C52, // '4CLR' cmsSig5colorData = $35434C52, // '5CLR' cmsSig6colorData = $36434C52, // '6CLR' cmsSig7colorData = $37434C52, // '7CLR' cmsSig8colorData = $38434C52, // '8CLR' cmsSig9colorData = $39434C52, // '9CLR' cmsSig10colorData = $41434C52, // 'ACLR' cmsSig11colorData = $42434C52, // 'BCLR' cmsSig12colorData = $43434C52, // 'CCLR' cmsSig13colorData = $44434C52, // 'DCLR' cmsSig14colorData = $45434C52, // 'ECLR' cmsSig15colorData = $46434C52, // 'FCLR' cmsSigLuvKData = $4C75764B // 'LuvK' ); // ICC Profile Class cmsProfileClassSignature = ( cmsSigInputClass = $73636E72, // 'scnr' cmsSigDisplayClass = $6D6E7472, // 'mntr' cmsSigOutputClass = $70727472, // 'prtr' cmsSigLinkClass = $6C696E6B, // 'link' cmsSigAbstractClass = $61627374, // 'abst' cmsSigColorSpaceClass = $73706163, // 'spac' cmsSigNamedColorClass = $6e6d636c // 'nmcl' ); // ICC Platforms cmsPlatformSignature = ( cmsSigMacintosh = $4150504C, // 'APPL' cmsSigMicrosoft = $4D534654, // 'MSFT' cmsSigSolaris = $53554E57, // 'SUNW' cmsSigSGI = $53474920, // 'SGI ' cmsSigTaligent = $54474E54, // 'TGNT' cmsSigUnices = $2A6E6978 // '*nix' // From argyll -- Not official ); CONST // Reference gamut cmsSigPerceptualReferenceMediumGamut = $70726d67; //'prmg' // For cmsSigColorimetricIntentImageStateTag cmsSigSceneColorimetryEstimates = $73636F65; //'scoe' cmsSigSceneAppearanceEstimates = $73617065; //'sape' cmsSigFocalPlaneColorimetryEstimates = $66706365; //'fpce' cmsSigReflectionHardcopyOriginalColorimetry = $72686F63; //'rhoc' cmsSigReflectionPrintOutputColorimetry = $72706F63; //'rpoc' TYPE // Multi process elements types cmsStageSignature = ( cmsSigCurveSetElemType = $63767374, //'cvst' cmsSigMatrixElemType = $6D617466, //'matf' cmsSigCLutElemType = $636C7574, //'clut' cmsSigBAcsElemType = $62414353, // 'bACS' cmsSigEAcsElemType = $65414353, // 'eACS' // Custom from here, not in the ICC Spec cmsSigXYZ2LabElemType = $6C327820, // 'l2x ' cmsSigLab2XYZElemType = $78326C20, // 'x2l ' cmsSigNamedColorElemType = $6E636C20, // 'ncl ' cmsSigLabV2toV4 = $32203420, // '2 4 ' cmsSigLabV4toV2 = $34203220, // '4 2 ' // Identities cmsSigIdentityElemType = $69646E20 // 'idn ' ); // Types of CurveElements cmsCurveSegSignature = ( cmsSigFormulaCurveSeg = $70617266, // 'parf' cmsSigSampledCurveSeg = $73616D66, // 'samf' cmsSigSegmentedCurve = $63757266 // 'curf' ); CONST // Used in ResponseCurveType cmsSigStatusA = $53746141; //'StaA' cmsSigStatusE = $53746145; //'StaE' cmsSigStatusI = $53746149; //'StaI' cmsSigStatusT = $53746154; //'StaT' cmsSigStatusM = $5374614D; //'StaM' cmsSigDN = $444E2020; //'DN ' cmsSigDNP = $444E2050; //'DN P' cmsSigDNN = $444E4E20; //'DNN ' cmsSigDNNP = $444E4E50; //'DNNP' // Device attributes, currently defined values correspond to the low 4 bytes // of the 8 byte attribute quantity cmsReflective = 0; cmsTransparency = 1; cmsGlossy = 0; cmsMatte = 2; TYPE // Common structures in ICC tags cmsICCData = PACKED RECORD len : cmsUInt32Number; flag : cmsUInt32Number; data : Array [0..1] of cmsUInt8Number; END; // ICC date time cmsDateTimeNumber = PACKED RECORD year: cmsUInt16Number; month: cmsUInt16Number; day: cmsUInt16Number; hours: cmsUInt16Number; minutes: cmsUInt16Number; seconds: cmsUInt16Number; END; // ICC XYZ cmsEncodedXYZNumber = PACKED RECORD X: cmsS15Fixed16Number; Y: cmsS15Fixed16Number; Z: cmsS15Fixed16Number; END; // Profile ID as computed by MD5 algorithm cmsProfileID = PACKED RECORD CASE Integer OF 1: (ID8: Array[0..15] OF cmsUInt8Number); 2: (ID16: Array[0..7] OF cmsUInt16Number); 3: (ID32: Array[0..3] OF cmsUInt32Number); END; // ---------------------------------------------------------------------------------------------- // ICC profile internal base types. Strictly, shouldn't be declared in this unit, but maybe // somebody want to use this info for accessing profile header directly, so here it is. // Profile header -- it is 32-bit aligned, so no issues are expected on alignment cmsICCHeader = PACKED RECORD size: cmsUInt32Number; // Profile size in bytes cmmId: cmsSignature; // CMM for this profile version: cmsUInt32Number; // Format version number deviceClass: cmsProfileClassSignature; // Type of profile colorSpace: cmsColorSpaceSignature; // Color space of data pcs: cmsColorSpaceSignature; // PCS, XYZ or Lab only date: cmsDateTimeNumber; // Date profile was created magic: cmsSignature; // Magic Number to identify an ICC profile platform: cmsPlatformSignature; // Primary Platform flags: cmsUInt32Number; // Various bit settings manufacturer: cmsSignature; // Device manufacturer model: cmsUInt32Number; // Device model number attributes: cmsUInt64Number; // Device attributes renderingIntent:cmsUInt32Number; // Rendering intent illuminant: cmsEncodedXYZNumber; // Profile illuminant creator: cmsSignature; // Profile creator profileID: cmsProfileID; // Profile ID using MD5 reserved: array [0..27] of cmsInt8Number; // Reserved for future use END; // ICC base tag cmsTagBase = PACKED RECORD sig: cmsTagTypeSignature; reserved: array[0..3] of cmsInt8Number; END; // A tag entry in directory cmsTagEntry = PACKED RECORD sig: cmsTagSignature; // The tag signature offset: cmsUInt32Number; // Start of tag size: cmsUInt32Number; // Size in bytes END; cmsContext = Pointer; // Context identifier for multithreaded environments cmsHANDLE = Pointer; // Generic handle cmsHPROFILE = Pointer; // Opaque typedefs to hide internals cmsHTRANSFORM = Pointer; CONST cmsMAXCHANNELS = 16; // Maximum number of channels in ICC profiles // Format of pixel is defined by one cmsUInt32Number, using bit fields as follows // // A O TTTTT U Y F P X S EEE CCCC BBB // // A: Floating point -- With this flag we can differentiate 16 bits as float and as int // O: Optimized -- previous optimization already returns the final 8-bit value // T: Pixeltype // F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) // P: Planar? 0=Chunky, 1=Planar // X: swap 16 bps endianness? // S: Do swap? ie, BGR, KYMC // E: Extra samples // C: Channels (Samples per pixel) // B: bytes per sample // Y: Swap first - changes ABGR to BGRA and KCMY to CMYK FUNCTION FLOAT_SH(a: cmsUInt32Number): cmsUInt32Number; FUNCTION OPTIMIZED_SH(s: cmsUInt32Number): cmsUInt32Number; FUNCTION COLORSPACE_SH(s: cmsUInt32Number):cmsUInt32Number; FUNCTION SWAPFIRST_SH(s: cmsUInt32Number):cmsUInt32Number; FUNCTION FLAVOR_SH(s: cmsUInt32Number):cmsUInt32Number; FUNCTION PLANAR_SH(p: cmsUInt32Number):cmsUInt32Number; FUNCTION ENDIAN16_SH(e: cmsUInt32Number):cmsUInt32Number; FUNCTION DOSWAP_SH(e: cmsUInt32Number):cmsUInt32Number; FUNCTION EXTRA_SH(e: cmsUInt32Number):cmsUInt32Number; FUNCTION CHANNELS_SH(c: cmsUInt32Number):cmsUInt32Number; FUNCTION BYTES_SH(b: cmsUInt32Number):cmsUInt32Number; FUNCTION T_FLOAT(a: cmsUInt32Number): cmsUInt32Number; FUNCTION T_OPTIMIZED(o: cmsUInt32Number): cmsUInt32Number; FUNCTION T_COLORSPACE(s: cmsUInt32Number): cmsUInt32Number; FUNCTION T_SWAPFIRST(s: cmsUInt32Number): cmsUInt32Number; FUNCTION T_FLAVOR(s: cmsUInt32Number): cmsUInt32Number; FUNCTION T_PLANAR(p: cmsUInt32Number): cmsUInt32Number; FUNCTION T_ENDIAN16(e: cmsUInt32Number): cmsUInt32Number; FUNCTION T_DOSWAP(e: cmsUInt32Number): cmsUInt32Number; FUNCTION T_EXTRA(e: cmsUInt32Number): cmsUInt32Number; FUNCTION T_CHANNELS(c: cmsUInt32Number): cmsUInt32Number; FUNCTION T_BYTES(b: cmsUInt32Number): cmsUInt32Number; CONST // Pixel types PT_ANY = 0; // Don't check colorspace // 1 & 2 are reserved PT_GRAY = 3; PT_RGB = 4; PT_CMY = 5; PT_CMYK = 6; PT_YCbCr = 7; PT_YUV = 8; // Lu'v' PT_XYZ = 9; PT_Lab = 10; PT_YUVK = 11; // Lu'v'K PT_HSV = 12; PT_HLS = 13; PT_Yxy = 14; PT_MCH1 = 15; PT_MCH2 = 16; PT_MCH3 = 17; PT_MCH4 = 18; PT_MCH5 = 19; PT_MCH6 = 20; PT_MCH7 = 21; PT_MCH8 = 22; PT_MCH9 = 23; PT_MCH10 = 24; PT_MCH11 = 25; PT_MCH12 = 26; PT_MCH13 = 27; PT_MCH14 = 28; PT_MCH15 = 29; PT_LabV2 = 30; // Identical to PT_Lab, but using the V2 old encoding // Format descriptors TYPE_GRAY_8 = $030009; TYPE_GRAY_8_REV = $032009; TYPE_GRAY_16 = $03000a; TYPE_GRAY_16_REV = $03200a; TYPE_GRAY_16_SE = $03080a; TYPE_GRAYA_8 = $030089; TYPE_GRAYA_16 = $03008a; TYPE_GRAYA_16_SE = $03088a; TYPE_GRAYA_8_PLANAR = $031089; TYPE_GRAYA_16_PLANAR = $03108a; TYPE_RGB_8 = $040019; TYPE_RGB_8_PLANAR = $041019; TYPE_BGR_8 = $040419; TYPE_BGR_8_PLANAR = $041419; TYPE_RGB_16 = $04001a; TYPE_RGB_16_PLANAR = $04101a; TYPE_RGB_16_SE = $04081a; TYPE_BGR_16 = $04041a; TYPE_BGR_16_PLANAR = $04141a; TYPE_BGR_16_SE = $040c1a; TYPE_RGBA_8 = $040099; TYPE_RGBA_8_PLANAR = $041099; TYPE_ARGB_8_PLANAR = $045099; TYPE_ABGR_8_PLANAR = $041499; TYPE_BGRA_8_PLANAR = $045499; TYPE_RGBA_16 = $04009a; TYPE_RGBA_16_PLANAR = $04109a; TYPE_RGBA_16_SE = $04089a; TYPE_ARGB_8 = $044099; TYPE_ARGB_16 = $04409a; TYPE_ABGR_8 = $040499; TYPE_ABGR_16 = $04049a; TYPE_ABGR_16_PLANAR = $04149a; TYPE_ABGR_16_SE = $040c9a; TYPE_BGRA_8 = $044499; TYPE_BGRA_16 = $04449a; TYPE_BGRA_16_SE = $04489a; TYPE_CMY_8 = $050019; TYPE_CMY_8_PLANAR = $051019; TYPE_CMY_16 = $05001a; TYPE_CMY_16_PLANAR = $05101a; TYPE_CMY_16_SE = $05081a; TYPE_CMYK_8 = $060021; TYPE_CMYKA_8 = $0600a1; TYPE_CMYK_8_REV = $062021; TYPE_YUVK_8 = $062021; TYPE_CMYK_8_PLANAR = $061021; TYPE_CMYK_16 = $060022; TYPE_CMYK_16_REV = $062022; TYPE_YUVK_16 = $062022; TYPE_CMYK_16_PLANAR = $061022; TYPE_CMYK_16_SE = $060822; TYPE_KYMC_8 = $060421; TYPE_KYMC_16 = $060422; TYPE_KYMC_16_SE = $060c22; TYPE_KCMY_8 = $064021; TYPE_KCMY_8_REV = $066021; TYPE_KCMY_16 = $064022; TYPE_KCMY_16_REV = $066022; TYPE_KCMY_16_SE = $064822; TYPE_CMYK5_8 = $130029; TYPE_CMYK5_16 = $13002a; TYPE_CMYK5_16_SE = $13082a; TYPE_KYMC5_8 = $130429; TYPE_KYMC5_16 = $13042a; TYPE_KYMC5_16_SE = $130c2a; TYPE_CMYK6_8 = $140031; TYPE_CMYK6_8_PLANAR = $141031; TYPE_CMYK6_16 = $140032; TYPE_CMYK6_16_PLANAR = $141032; TYPE_CMYK6_16_SE = $140832; TYPE_CMYK7_8 = $150039; TYPE_CMYK7_16 = $15003a; TYPE_CMYK7_16_SE = $15083a; TYPE_KYMC7_8 = $150439; TYPE_KYMC7_16 = $15043a; TYPE_KYMC7_16_SE = $150c3a; TYPE_CMYK8_8 = $160041; TYPE_CMYK8_16 = $160042; TYPE_CMYK8_16_SE = $160842; TYPE_KYMC8_8 = $160441; TYPE_KYMC8_16 = $160442; TYPE_KYMC8_16_SE = $160c42; TYPE_CMYK9_8 = $170049; TYPE_CMYK9_16 = $17004a; TYPE_CMYK9_16_SE = $17084a; TYPE_KYMC9_8 = $170449; TYPE_KYMC9_16 = $17044a; TYPE_KYMC9_16_SE = $170c4a; TYPE_CMYK10_8 = $180051; TYPE_CMYK10_16 = $180052; TYPE_CMYK10_16_SE = $180852; TYPE_KYMC10_8 = $180451; TYPE_KYMC10_16 = $180452; TYPE_KYMC10_16_SE = $180c52; TYPE_CMYK11_8 = $190059; TYPE_CMYK11_16 = $19005a; TYPE_CMYK11_16_SE = $19085a; TYPE_KYMC11_8 = $190459; TYPE_KYMC11_16 = $19045a; TYPE_KYMC11_16_SE = $190c5a; TYPE_CMYK12_8 = $1a0061; TYPE_CMYK12_16 = $1a0062; TYPE_CMYK12_16_SE = $1a0862; TYPE_KYMC12_8 = $1a0461; TYPE_KYMC12_16 = $1a0462; TYPE_KYMC12_16_SE = $1a0c62; TYPE_XYZ_16 = $09001a; TYPE_Lab_8 = $0a0019; TYPE_ALab_8 = $0a0499; TYPE_Lab_16 = $0a001a; TYPE_Yxy_16 = $0e001a; TYPE_YCbCr_8 = $070019; TYPE_YCbCr_8_PLANAR = $071019; TYPE_YCbCr_16 = $07001a; TYPE_YCbCr_16_PLANAR = $07101a; TYPE_YCbCr_16_SE = $07081a; TYPE_YUV_8 = $080019; TYPE_YUV_8_PLANAR = $081019; TYPE_YUV_16 = $08001a; TYPE_YUV_16_PLANAR = $08101a; TYPE_YUV_16_SE = $08081a; TYPE_HLS_8 = $0d0019; TYPE_HLS_8_PLANAR = $0d1019; TYPE_HLS_16 = $0d001a; TYPE_HLS_16_PLANAR = $0d101a; TYPE_HLS_16_SE = $0d081a; TYPE_HSV_8 = $0c0019; TYPE_HSV_8_PLANAR = $0c1019; TYPE_HSV_16 = $0c001a; TYPE_HSV_16_PLANAR = $0c101a; TYPE_HSV_16_SE = $0c081a; TYPE_NAMED_COLOR_INDEX = $000A; TYPE_XYZ_FLT = $49001c; TYPE_Lab_FLT = $4a001c; TYPE_GRAY_FLT = $43000c; TYPE_RGB_FLT = $44001c; TYPE_CMYK_FLT = $460024; TYPE_XYZA_FLT = $49009c; TYPE_LabA_FLT = $4a009c; TYPE_RGBA_FLT = $44009c; TYPE_XYZ_DBL = $490018; TYPE_Lab_DBL = $4a0018; TYPE_GRAY_DBL = $430008; TYPE_RGB_DBL = $440018; TYPE_CMYK_DBL = $460020; TYPE_LabV2_8 = $1e0019; TYPE_ALabV2_8 = $1e0499; TYPE_LabV2_16 = $1e001a; TYPE_GRAY_HALF_FLT = $43000a; TYPE_RGB_HALF_FLT = $44001a; TYPE_RGBA_HALF_FLT = $44009a; TYPE_CMYK_HALF_FLT = $460022; TYPE_ARGB_HALF_FLT = $44409a; TYPE_BGR_HALF_FLT = $44041a; TYPE_BGRA_HALF_FLT = $44449a; TYPE_ABGR_HALF_FLT = $44041a; TYPE // Colorimetric spaces cmsCIEXYZ = PACKED RECORD X, Y, Z : cmsFloat64Number; END; LPcmsCIEXYZ = ^cmsCIEXYZ; cmsCIExyY = PACKED RECORD x, y, YY : cmsFloat64Number END; LPcmsCIExyY = ^cmsCIEXYY; cmsCIELab = PACKED RECORD L, a, b: cmsFloat64Number END; LPcmsCIELab = ^cmsCIELab; cmsCIELCh = PACKED RECORD L, C, h : cmsFloat64Number END; LPcmsCIELCh = ^cmsCIELCh; cmsJCh = PACKED RECORD J, C, h : cmsFloat64Number END; LPcmsJCh = ^cmsJCH; cmsCIEXYZTRIPLE = PACKED RECORD Red, Green, Blue : cmsCIEXYZ END; LPcmsCIEXYZTRIPLE = ^cmsCIEXYZTRIPLE; cmsCIExyYTRIPLE = PACKED RECORD Red, Green, Blue : cmsCIExyY END; LPcmsCIExyYTRIPLE = ^cmsCIExyYTRIPLE; CONST // Illuminant types for structs below cmsILLUMINANT_TYPE_UNKNOWN = $0000000; cmsILLUMINANT_TYPE_D50 = $0000001; cmsILLUMINANT_TYPE_D65 = $0000002; cmsILLUMINANT_TYPE_D93 = $0000003; cmsILLUMINANT_TYPE_F2 = $0000004; cmsILLUMINANT_TYPE_D55 = $0000005; cmsILLUMINANT_TYPE_A = $0000006; cmsILLUMINANT_TYPE_E = $0000007; cmsILLUMINANT_TYPE_F8 = $0000008; TYPE cmsICCMeasurementConditions = PACKED RECORD Observer: cmsUInt32Number; // 0 = unknown, 1=CIE 1931, 2=CIE 1964 Backing: cmsCIEXYZ; // Value of backing Geometry: cmsUInt32Number; // 0=unknown, 1=45/0, 0/45 2=0d, d/0 Flare: cmsFloat64Number; // 0..1.0 IlluminantType: cmsUInt32Number; END; cmsICCViewingConditions = PACKED RECORD IlluminantXYZ: cmsCIEXYZ; // Not the same struct as CAM02, SurroundXYZ: cmsCIEXYZ; // This is for storing the tag IlluminantType: cmsUInt32Number; // viewing condition END; // Context -------------------------------------------------------------------------------------------------------------- FUNCTION cmsCreateContext(Plugin : Pointer; UserData : Pointer) : cmsContext; StdCall; PROCEDURE cmsDeleteContext(ContextID: cmsContext); StdCall; FUNCTION cmsDupContext(ContextID: cmsContext; NewUserData: Pointer): cmsContext; StdCall; FUNCTION cmsGetContextUserData(ContextID: cmsContext): Pointer; StdCall; // Plug-In registering --------------------------------------------------------------------------------------------------- FUNCTION cmsPlugin(Plugin: Pointer): cmsBool; StdCall; PROCEDURE cmsUnregisterPlugins; StdCall; // Error logging ---------------------------------------------------------------------------------------------------------- // There is no error handling at all. When a function fails, it returns proper value. // For example, all create functions does return NULL on failure. Other may return FALSE. // It may be interesting, for the developer, to know why the function is failing. // for that reason, lcms2 does offer a logging function. This function will get // an ENGLISH string with some clues on what is going wrong. You can show this // info to the end user if you wish, or just create some sort of log on disk. // The logging function should NOT terminate the program, as this obviously can leave // unfreed resources. It is the programmer's responsibility to check each function // return code to make sure it didn't fail. CONST cmsERROR_UNDEFINED = 0; cmsERROR_FILE = 1; cmsERROR_RANGE = 2; cmsERROR_INTERNAL = 3; cmsERROR_NULL = 4; cmsERROR_READ = 5; cmsERROR_SEEK = 6; cmsERROR_WRITE = 7; cmsERROR_UNKNOWN_EXTENSION = 8; cmsERROR_COLORSPACE_CHECK = 9; cmsERROR_ALREADY_DEFINED = 10; cmsERROR_BAD_SIGNATURE = 11; cmsERROR_CORRUPTION_DETECTED = 12; cmsERROR_NOT_SUITABLE = 13; // Error logger is called with the ContextID when a message is raised. This gives the // chance to know which thread is responsible of the warning and any environment associated // with it. Non-multithreading applications may safely ignore this parameter. // Note that under certain special circumstances, ContextID may be NULL. TYPE cmsLogErrorHandlerFunction = PROCEDURE( ContextID: cmsContext; ErrorCode: cmsUInt32Number; Text: PAnsiChar); CDecl; // Allows user to set any specific logger PROCEDURE cmsSetLogErrorHandler(Fn: cmsLogErrorHandlerFunction); StdCall; // Conversions -------------------------------------------------------------------------------------------------------------- // Returns pointers to constant structs FUNCTION cmsD50_XYZ: LPcmsCIEXYZ; StdCall; FUNCTION cmsD50_xyY: LPcmsCIExyY; StdCall; // Colorimetric space conversions PROCEDURE cmsXYZ2xyY(Dest: LPcmsCIExyY; Source: LPcmsCIEXYZ); StdCall; PROCEDURE cmsxyY2XYZ(Dest: LPcmsCIEXYZ; Source: LPcmsCIExyY); StdCall; PROCEDURE cmsLab2XYZ(WhitePoint: LPcmsCIEXYZ; xyz: LPcmsCIEXYZ; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsXYZ2Lab(WhitePoint: LPcmsCIEXYZ; Lab: LPcmsCIELab; xyz: LPcmsCIEXYZ); StdCall; PROCEDURE cmsLab2LCh(LCh: LPcmsCIELCh; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsLCh2Lab(Lab: LPcmsCIELab; LCh: LPcmsCIELCh); StdCall; // Encoding /Decoding on PCS PROCEDURE cmsLabEncoded2Float(Lab: LPcmsCIELab; wLab: Pointer); StdCall; PROCEDURE cmsLabEncoded2FloatV2(Lab: LPcmsCIELab; wLab: Pointer); StdCall; PROCEDURE cmsFloat2LabEncoded(wLab: Pointer; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsFloat2LabEncodedV2(wLab: Pointer; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsXYZEncoded2Float(fxyz : LPcmsCIEXYZ; XYZ: Pointer); StdCall; PROCEDURE cmsFloat2XYZEncoded(XYZ: Pointer; fXYZ: LPcmsCIEXYZ); StdCall; // DeltaE metrics FUNCTION cmsDeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsCIE94DeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsBFDdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsCMCdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsCIE2000DeltaE(Lab1, Lab2: LPcmsCIELab; Kl, Kc, Kh: Double): Double; StdCall; // Temperature <-> Chromaticity (Black body) FUNCTION cmsWhitePointFromTemp(var WhitePoint: cmsCIExyY; TempK: cmsFloat64Number) : cmsBool; StdCall; FUNCTION cmsTempFromWhitePoint(var TeampK: cmsFloat64Number; var WhitePoint: cmsCIExyY) : cmsBool; StdCall; // Chromatic adaptation FUNCTION cmsAdaptToIlluminant(Result: LPcmsCIEXYZ; SourceWhitePt: LPcmsCIEXYZ; Illuminant: LPcmsCIEXYZ; Value: LPcmsCIEXYZ): cmsBool; StdCall; // CIECAM02 --------------------------------------------------------------------------------------------------- // Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing // conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag // cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions. CONST AVG_SURROUND = 1; DIM_SURROUND = 2; DARK_SURROUND = 3; CUTSHEET_SURROUND = 4; D_CALCULATE = -1; TYPE cmsViewingConditions = PACKED RECORD WhitePoint: cmsCIEXYZ; Yb : cmsFloat64Number; La : cmsFloat64Number; surround : Integer; D_value : cmsFloat64Number END; LPcmsViewingConditions = ^cmsViewingConditions; FUNCTION cmsCIECAM02Init(pVC : LPcmsViewingConditions ) : Pointer; StdCall; PROCEDURE cmsCIECAM02Done(hModel : Pointer); StdCall; PROCEDURE cmsCIECAM02Forward(hModel: Pointer; pIn: LPcmsCIEXYZ; pOut: LPcmsJCh ); StdCall; PROCEDURE cmsCIECAM02Reverse(hModel: Pointer; pIn: LPcmsJCh; pOut: LPcmsCIEXYZ ); StdCall; // Tone curves ----------------------------------------------------------------------------------------- // This describes a curve segment. For a table of supported types, see the manual. User can increase the number of // available types by using a proper plug-in. Parametric segments allow 10 parameters at most TYPE cmsCurveSegment = PACKED RECORD x0, x1: cmsFloat32Number; // Domain; for x0 < x <= x1 PType: cmsInt32Number; // Parametric type, Type == 0 means sampled segment. Negative values are reserved Params: array [0..9] of cmsFloat64Number; // Parameters if Type != 0 nGridPoints: cmsUInt32Number; // Number of grid points if Type == 0 SampledPoints: LPcmsFloat32Number; // Points to an array of floats if Type == 0 END; LPcmsToneCurve = Pointer; LPcmsCurveSegmentArray = ^cmsCurveSegmentArray; cmsCurveSegmentArray = array[0..0] of cmsCurveSegment; LPcmsFloat64NumberArray = ^cmsFloat64NumberArray; cmsFloat64NumberArray = array[0..0] of cmsFloat64Number; LPcmsUInt16NumberArray = ^cmsUInt16NumberArray; cmsUInt16NumberArray = array[0..0] of cmsUInt16Number; LPcmsFloat32NumberArray = ^cmsFloat32NumberArray; cmsFloat32NumberArray = array[0..0] of cmsFloat32Number; LPLPcmsToneCurveArray = ^LPcmsToneCurveArray; LPcmsToneCurveArray = array[0..0] of LPcmsToneCurve; LPcmsUInt32NumberArray = ^cmsUInt32NumberArray; cmsUInt32NumberArray = array[0..0] of cmsUInt32Number; FUNCTION cmsBuildSegmentedToneCurve(ContextID: cmsContext; nSegments: cmsInt32Number; Segments: LPcmsCurveSegmentArray): LPcmsToneCurve; StdCall; FUNCTION cmsBuildParametricToneCurve(ContextID: cmsContext; CType: cmsInt32Number; Params: LPcmsFloat64NumberArray): LPcmsToneCurve; StdCall; FUNCTION cmsBuildGamma(ContextID: cmsContext; Gamma: cmsFloat64Number): LPcmsToneCurve; StdCall; FUNCTION cmsBuildTabulatedToneCurve16(ContextID: cmsContext; nEntries: cmsInt32Number; values: LPcmsUInt16NumberArray): LPcmsToneCurve; StdCall; FUNCTION cmsBuildTabulatedToneCurveFloat(ContextID: cmsContext; nEntries: cmsUInt32Number; values: LPcmsFloat32NumberArray): LPcmsToneCurve; StdCall; PROCEDURE cmsFreeToneCurve(Curve: LPcmsToneCurve); StdCall; PROCEDURE cmsFreeToneCurveTriple(Curve: LPLPcmsToneCurveArray); StdCall; FUNCTION cmsDupToneCurve(Src: LPcmsToneCurve): LPcmsToneCurve; StdCall; FUNCTION cmsReverseToneCurve(InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; FUNCTION cmsReverseToneCurveEx(nResultSamples: cmsInt32Number; InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; FUNCTION cmsJoinToneCurve(ContextID: cmsContext; X, Y: LPcmsToneCurve; nPoints: cmsUInt32Number ): LPcmsToneCurve; StdCall; FUNCTION cmsSmoothToneCurve(Tab: LPcmsToneCurve; lambda: cmsFloat64Number): cmsBool; StdCall; FUNCTION cmsEvalToneCurveFloat(Curve: LPcmsToneCurve; v: cmsFloat32Number):cmsFloat32Number; StdCall; FUNCTION cmsEvalToneCurve16(Curve: LPcmsToneCurve; v:cmsUInt16Number):cmsUInt16Number; StdCall; FUNCTION cmsIsToneCurveMultisegment(InGamma: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsIsToneCurveLinear(Curve: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsIsToneCurveMonotonic(t: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsIsToneCurveDescending(t: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsGetToneCurveParametricType(t: LPcmsToneCurve):cmsInt32Number; StdCall; FUNCTION cmsEstimateGamma(t: LPcmsToneCurve; Precision:cmsFloat64Number):cmsFloat64Number; StdCall; FUNCTION cmsGetToneCurveEstimatedTableEntries(t: LPcmsToneCurve): cmsUInt32Number; StdCall; FUNCTION cmsGetToneCurveEstimatedTable(t: LPcmsToneCurve): LPcmsUInt16Number; StdCall; // Implements pipelines of multi-processing elements ------------------------------------------------------------- TYPE LPcmsPipeline = Pointer; LPcmsStage = Pointer; LPLPcmsStage = ^LPcmsStage; // Those are hi-level pipelines FUNCTION cmsPipelineAlloc(ContextID: cmsContext; InputChannels, OutputChannels: cmsUInt32Number): LPcmsPipeline; StdCall; PROCEDURE cmsPipelineFree(lut: LPcmsPipeline); StdCall; FUNCTION cmsPipelineDup(Orig: LPcmsPipeline): LPcmsPipeline; StdCall; FUNCTION cmsGetPipelineContextID(lut: LPcmsPipeline) : cmsContext; StdCall; FUNCTION cmsPipelineInputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; FUNCTION cmsPipelineOutputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; FUNCTION cmsPipelineStageCount(lut: LPcmsPipeline): cmsUInt32Number; StdCall; FUNCTION cmsPipelineGetPtrToFirstStage(lut: LPcmsPipeline): LPcmsStage; StdCall; FUNCTION cmsPipelineGetPtrToLastStage(lut: LPcmsPipeline): LPcmsStage; StdCall; PROCEDURE cmsPipelineEval16(Inv, Outv: LPcmsUInt16NumberArray; lut: LPcmsPipeline); StdCall; PROCEDURE cmsPipelineEvalFloat(Inv, Outv: LPcmsFloat32NumberArray; lut: LPcmsPipeline); StdCall; FUNCTION cmsPipelineEvalReverseFloat(Target, Result, Hint: LPcmsFloat32NumberArray; lut: LPcmsPipeline): cmsBool; StdCall; FUNCTION cmsPipelineCat(l1, l2: LPcmsPipeline): cmsBool; StdCall; FUNCTION cmsPipelineSetSaveAs8bitsFlag(lut: LPcmsPipeline; On: cmsBool): cmsBool; StdCall; // Where to place/locate the stages in the pipeline chain TYPE cmsStageLoc = (cmsAT_BEGIN = 0, cmsAT_END = 1 ); PROCEDURE cmsPipelineInsertStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPcmsStage); StdCall; PROCEDURE cmsPipelineUnlinkStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPLPcmsStage); StdCall; // This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements // that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and // then a list of expected types followed with a list of double pointers to Stage elements. If // the function founds a match with current pipeline, it fills the pointers and returns TRUE // if not, returns FALSE without touching anything. // FUNCTION cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, n: cmsUInt32Number, ...): cmsBool; StdCall; // Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode // matrices with far more precision that CLUTS FUNCTION cmsStageAllocIdentity(ContextID: cmsContext; nChannels: cmsUInt32Number): LPcmsStage; StdCall; FUNCTION cmsStageAllocToneCurves(ContextID: cmsContext; nChannels: cmsUInt32Number; Curves: LPLPcmsToneCurveArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocMatrix(ContextID: cmsContext; Rows, Cols: cmsUInt32Number; Matrix, Offset: LPcmsFloat64NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLut16bit(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLutFloat(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLut16bitGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLutFloatGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageDup(mpe: LPcmsStage): LPcmsStage; StdCall; PROCEDURE cmsStageFree(mpe: LPcmsStage); StdCall; FUNCTION cmsStageNext(mpe: LPcmsStage): LPcmsStage; StdCall; FUNCTION cmsStageInputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; FUNCTION cmsStageOutputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; FUNCTION cmsStageType(mpe: LPcmsStage): cmsStageSignature; StdCall; FUNCTION cmsStageData(mpe: LPcmsStage): Pointer; StdCall; // Sampling Type cmsSAMPLER16 = FUNCTION (Inp, Outp: LPcmsUInt16NumberArray; Cargo: Pointer): cmsInt32Number; CDecl; cmsSAMPLERFLOAT = FUNCTION (Inp, Outp: LPcmsFloat32NumberArray; Cargo: Pointer): cmsInt32Number; CDecl; // Use this flag to prevent changes being written to destination Const SAMPLER_INSPECT = $01000000; // For CLUT only FUNCTION cmsStageSampleCLut16bit(mpe: LPcmsStage; Sampler: cmsSAMPLER16; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsStageSampleCLutFloat(mpe: LPcmsStage; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; // Slicers FUNCTION cmsSliceSpace16(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLER16; Cargo: Pointer): cmsBool; StdCall; FUNCTION cmsSliceSpaceFloat(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer): cmsBool; StdCall; // Multilocalized Unicode management --------------------------------------------------------------------------------------- Type LPcmsMLU = Pointer; Const cmsNoLanguage = #0#0#0; cmsNoCountry = #0#0#0; FUNCTION cmsMLUalloc(ContextID: cmsContext; nItems: cmsUInt32Number): LPcmsMLU; StdCall; PROCEDURE cmsMLUfree(mlu: LPcmsMLU); StdCall; FUNCTION cmsMLUdup(mlu: LPcmsMLU): LPcmsMLU; StdCall; FUNCTION cmsMLUsetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode, ASCIIString: PAnsiChar): cmsBool; StdCall; FUNCTION cmsMLUsetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; WideString: PWChar): cmsBool; StdCall; FUNCTION cmsMLUgetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; FUNCTION cmsMLUgetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; FUNCTION cmsMLUgetTranslation(mlu: LPcmsMLU; LanguageCode, CountryCode, ObtainedLanguage, ObtainedCountry: PAnsiChar): cmsBool; StdCall; // Undercolorremoval & black generation ------------------------------------------------------------------------------------- Type cmsUcrBg = PACKED RECORD Ucr, Bg: LPcmsToneCurve; Desc: LPcmsMLU; END; // Screening ---------------------------------------------------------------------------------------------------------------- Const cmsPRINTER_DEFAULT_SCREENS = $0001; cmsFREQUENCE_UNITS_LINES_CM = $0000; cmsFREQUENCE_UNITS_LINES_INCH = $0002; cmsSPOT_UNKNOWN = 0; cmsSPOT_PRINTER_DEFAULT = 1; cmsSPOT_ROUND = 2; cmsSPOT_DIAMOND = 3; cmsSPOT_ELLIPSE = 4; cmsSPOT_LINE = 5; cmsSPOT_SQUARE = 6; cmsSPOT_CROSS = 7; Type cmsScreeningChannel = PACKED RECORD Frequency, ScreenAngle: cmsFloat64Number; SpotShape: cmsUInt32Number; END; cmsScreening = PACKED RECORD Flag, nChannels : cmsUInt32Number; Channels: Array [0..cmsMAXCHANNELS-1] OF cmsScreeningChannel; END; // Named color ----------------------------------------------------------------------------------------------------------------- LPcmsNAMEDCOLORLIST = Pointer; FUNCTION cmsAllocNamedColorList(ContextID: cmsContext; n, ColorantCount :cmsUInt32Number; Prefix, Suffix: PAnsiChar): LPcmsNAMEDCOLORLIST; StdCall; PROCEDURE cmsFreeNamedColorList(v: LPcmsNAMEDCOLORLIST); StdCall; FUNCTION cmsDupNamedColorList(v: LPcmsNAMEDCOLORLIST): LPcmsNAMEDCOLORLIST; StdCall; FUNCTION cmsAppendNamedColor(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; FUNCTION cmsNamedColorCount(v: LPcmsNAMEDCOLORLIST): cmsUInt32Number; StdCall; FUNCTION cmsNamedColorIndex(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar): cmsInt32Number; StdCall; FUNCTION cmsNamedColorInfo(v: LPcmsNAMEDCOLORLIST; nColor : cmsUInt32Number; Name,Prefix, Suffix : PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; // Retrieve named color list from transform FUNCTION cmsGetNamedColorList(xform: cmsHTRANSFORM ): LPcmsNAMEDCOLORLIST; StdCall; // Profile sequence ----------------------------------------------------------------------------------------------------- Type // Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others // come from Profile Sequence Identifier Tag cmsPSEQDESC = PACKED RECORD deviceMfg, deviceModel: cmsSignature; attributes: cmsUInt64Number; technology: cmsTechnologySignature; ProfileID: cmsProfileID; Manufacturer, Model, Description : LPcmsMLU; END; LPcmsSEQDESC = ^cmsPSEQDESC; cmsSEQ = PACKED RECORD n: cmsUInt32Number; ContextID: cmsContext; seq: LPcmsSEQDESC; END; LPcmsSEQ = ^cmsSEQ; FUNCTION cmsAllocProfileSequenceDescription(ContextID: cmsContext; n: cmsUInt32Number):LPcmsSEQ; StdCall; FUNCTION cmsDupProfileSequenceDescription(pseq: LPcmsSEQ):LPcmsSEQ; StdCall; PROCEDURE cmsFreeProfileSequenceDescription(pseq: LPcmsSEQ); StdCall; // Dictionaries -------------------------------------------------------------------------------------------------------- TYPE LPcmsDICTentry = ^cmsDICTentry; cmsDICTentry = PACKED RECORD Next: LPcmsDICTentry; DisplayName, DisplayValue: LPcmsMLU; Name, Value : PWChar; END; FUNCTION cmsDictAlloc(ContextID: cmsContext): cmsHANDLE; StdCall; PROCEDURE cmsDictFree(hDict: cmsHANDLE); StdCall; FUNCTION cmsDictDup(hDict: cmsHANDLE): cmsHANDLE; StdCall; FUNCTION cmsDictAddEntry(hDict: cmsHANDLE; Name, Value: PWChar; DisplayName, DisplayValue : LPcmsMLU): cmsBool; StdCall; FUNCTION cmsDictGetEntryList(hDict: cmsHANDLE): LPcmsDICTentry; StdCall; FUNCTION cmsDictNextEntry(e : LPcmsDICTentry): LPcmsDICTentry; StdCall; // Access to Profile data ---------------------------------------------------------------------------------------------- FUNCTION cmsCreateProfilePlaceholder(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsGetProfileContextID(hProfile: cmsHPROFILE):cmsContext; StdCall; FUNCTION cmsGetTagCount(hProfile: cmsHPROFILE): cmsInt32Number; StdCall; FUNCTION cmsGetTagSignature(hProfile: cmsHPROFILE; n: cmsUInt32Number): cmsTagSignature; StdCall; FUNCTION cmsIsTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): cmsBool; StdCall; // Read and write pre-formatted data FUNCTION cmsReadTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): Pointer; StdCall; FUNCTION cmsWriteTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer): cmsBool; StdCall; FUNCTION cmsLinkTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; dest: cmsTagSignature): cmsBool; StdCall; FUNCTION cmsTagLinkedTo(hProfile: cmsHPROFILE; sig: cmsTagSignature):cmsTagSignature; StdCall; // Read and write raw data FUNCTION cmsReadRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; Buffer: Pointer; BufferSize: cmsUInt32Number): cmsInt32Number; StdCall; FUNCTION cmsWriteRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer; Size: cmsUInt32Number): cmsBool; StdCall; // Access header data Const cmsEmbeddedProfileFalse = $00000000; cmsEmbeddedProfileTrue = $00000001; cmsUseAnywhere = $00000000; cmsUseWithEmbeddedDataOnly = $00000002; FUNCTION cmsGetHeaderFlags(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsGetHeaderAttributes(hProfile: cmsHPROFILE; Flags: LPcmsUInt64Number); StdCall; PROCEDURE cmsGetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; // TODO: // FUNCTION cmsGetHeaderCreationDateTime(hProfile: cmsHPROFILE; struct tm *Dest): cmsBool; StdCall; FUNCTION cmsGetHeaderRenderingIntent(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetHeaderFlags(hProfile: cmsHPROFILE; Flags: cmsUInt32Number); StdCall; FUNCTION cmsGetHeaderManufacturer(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetHeaderManufacturer(hProfile: cmsHPROFILE; manufacturer: cmsUInt32Number ); StdCall; FUNCTION cmsGetHeaderModel(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetHeaderModel(hProfile: cmsHPROFILE; model: cmsUInt32Number ); StdCall; PROCEDURE cmsSetHeaderAttributes(hProfile: cmsHPROFILE; Flags: cmsUInt64Number); StdCall; PROCEDURE cmsSetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; PROCEDURE cmsSetHeaderRenderingIntent(hProfile: cmsHPROFILE; RenderingIntent: cmsUInt32Number ); StdCall; FUNCTION cmsGetPCS(hProfile: cmsHPROFILE):cmsColorSpaceSignature; StdCall; PROCEDURE cmsSetPCS(hProfile: cmsHPROFILE; pcs: cmsColorSpaceSignature); StdCall; FUNCTION cmsGetColorSpace(hProfile: cmsHPROFILE): cmsColorSpaceSignature; StdCall; PROCEDURE cmsSetColorSpace(hProfile: cmsHPROFILE; sig: cmsColorSpaceSignature); StdCall; FUNCTION cmsGetDeviceClass(hProfile: cmsHPROFILE): cmsProfileClassSignature; StdCall; PROCEDURE cmsSetDeviceClass(hProfile: cmsHPROFILE; sig: cmsProfileClassSignature); StdCall; PROCEDURE cmsSetProfileVersion(hProfile: cmsHPROFILE; Version: cmsFloat64Number); StdCall; FUNCTION cmsGetProfileVersion(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; FUNCTION cmsGetEncodedICCversion(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetEncodedICCversion(hProfile: cmsHPROFILE; Version: cmsUInt32Number); StdCall; Const // How profiles may be used LCMS_USED_AS_INPUT = 0; LCMS_USED_AS_OUTPUT = 1; LCMS_USED_AS_PROOF = 2; FUNCTION cmsIsIntentSupported(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsIsMatrixShaper(hProfile: cmsHPROFILE): cmsBool; StdCall; FUNCTION cmsIsCLUT(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; // Translate form/to our notation to ICC FUNCTION _cmsICCcolorSpace(OurNotation: Integer): cmsColorSpaceSignature; StdCall; FUNCTION _cmsLCMScolorSpace(ProfileSpace: cmsColorSpaceSignature): Integer; StdCall; FUNCTION cmsChannelsOf( ColorSpace: cmsColorSpaceSignature): cmsUInt32Number; StdCall; // Build a suitable formatter for the colorspace of this profile FUNCTION cmsFormatterForColorspaceOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; FUNCTION cmsFormatterForPCSOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; Type // Localized info cmsInfoType = ( cmsInfoDescription = 0, cmsInfoManufacturer = 1, cmsInfoModel = 2, cmsInfoCopyright = 3 ); FUNCTION cmsGetProfileInfo(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; FUNCTION cmsGetProfileInfoASCII(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; // IO handlers ---------------------------------------------------------------------------------------------------------- Type LPcmsIOHANDLER = Pointer; FUNCTION cmsOpenIOhandlerFromFile(ContextID: cmsContext; FileName, AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; // FUNCTION cmsOpenIOhandlerFromStream(ContextID: cmsContext; FILE* Stream): LPcmsIOHANDLER; StdCall; FUNCTION cmsOpenIOhandlerFromMem(ContextID: cmsContext; Buffer: Pointer; size: cmsUInt32Number; AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; FUNCTION cmsOpenIOhandlerFromNULL(ContextID: cmsContext): LPcmsIOHANDLER; StdCall; FUNCTION cmsCloseIOhandler(io: LPcmsIOHANDLER): cmsBool; StdCall; // MD5 message digest -------------------------------------------------------------------------------------------------- FUNCTION cmsMD5computeID(hProfile: cmsHPROFILE): cmsBool; StdCall; // Profile high level functions ------------------------------------------------------------------------------------------ FUNCTION cmsOpenProfileFromFile(ICCProfile : PAnsiChar; sAccess: PAnsiChar): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromFileTHR(ContextID: cmsContext; ICCProfile, sAccess: PAnsiChar): cmsHPROFILE; StdCall; // FUNCTION CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; // FUNCTION CMSEXPORT cmsOpenProfileFromStreamTHR(ContextID: cmsContext; FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromMem(MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromMemTHR(ContextID: cmsContext; MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromIOhandlerTHR(ContextID: cmsContext; io: LPcmsIOHANDLER): cmsHPROFILE; StdCall; FUNCTION cmsCloseProfile(hProfile: cmsHPROFILE): cmsBool; StdCall; FUNCTION cmsSaveProfileToFile(hProfile: cmsHPROFILE; FileName: PAnsiChar): cmsBool; StdCall; // FUNCTION CMSEXPORT cmsSaveProfileToStream(hProfile: cmsHPROFILE, FILE* Stream): cmsBool; StdCall; FUNCTION cmsSaveProfileToMem(hProfile: cmsHPROFILE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; FUNCTION cmsSaveProfileToIOhandler(hProfile: cmsHPROFILE; io: LPcmsIOHANDLER):cmsUInt32Number; StdCall; // Predefined virtual profiles ------------------------------------------------------------------------------------------ FUNCTION cmsCreateRGBProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateRGBProfile(WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateGrayProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; FUNCTION cmsCreateGrayProfile(WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; FUNCTION cmsCreateLinearizationDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateLinearizationDeviceLink(ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateInkLimitingDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; FUNCTION cmsCreateInkLimitingDeviceLink(ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab2ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab2Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab4ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab4Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateXYZProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsCreateXYZProfile: cmsHPROFILE; StdCall; FUNCTION cmsCreate_sRGBProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsCreate_sRGBProfile: cmsHPROFILE; StdCall; FUNCTION cmsCreateBCHSWabstractProfileTHR(ContextID: cmsContext; nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; FUNCTION cmsCreateBCHSWabstractProfile( nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; FUNCTION cmsCreateNULLProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsCreateNULLProfile: cmsHPROFILE; StdCall; // Converts a transform to a devicelink profile FUNCTION cmsTransform2DeviceLink(hTransform: cmsHTRANSFORM; Version: cmsFloat64Number; dwFlags: cmsUInt32Number): cmsHPROFILE; StdCall; // Intents ---------------------------------------------------------------------------------------------- Const // ICC Intents INTENT_PERCEPTUAL = 0; INTENT_RELATIVE_COLORIMETRIC = 1; INTENT_SATURATION = 2; INTENT_ABSOLUTE_COLORIMETRIC = 3; // Non-ICC intents INTENT_PRESERVE_K_ONLY_PERCEPTUAL = 10; INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC = 11; INTENT_PRESERVE_K_ONLY_SATURATION = 12; INTENT_PRESERVE_K_PLANE_PERCEPTUAL = 13; INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC = 14; INTENT_PRESERVE_K_PLANE_SATURATION = 15; Type LPPAnsiChar = ^PAnsiChar; // Call with NULL as parameters to get the intent count FUNCTION cmsGetSupportedIntents(nMax: cmsUInt32Number; Codes: LPcmsUInt32Number; Descriptions: LPPAnsiChar): cmsUInt32Number; StdCall; Const // Flags cmsFLAGS_NOCACHE = $0040; // Inhibit 1-pixel cache cmsFLAGS_NOOPTIMIZE = $0100; // Inhibit optimizations cmsFLAGS_NULLTRANSFORM = $0200; // Don't transform anyway // Proofing flags cmsFLAGS_GAMUTCHECK = $1000; // Out of Gamut alarm cmsFLAGS_SOFTPROOFING = $4000; // Do softproofing // Misc cmsFLAGS_BLACKPOINTCOMPENSATION = $2000; cmsFLAGS_NOWHITEONWHITEFIXUP = $0004; // Don't fix scum dot cmsFLAGS_HIGHRESPRECALC = $0400; // Use more memory to give better accuracy cmsFLAGS_LOWRESPRECALC = $0800; // Use less memory to minimize resources // For devicelink creation cmsFLAGS_8BITS_DEVICELINK = $0008; // Create 8 bits devicelinks cmsFLAGS_GUESSDEVICECLASS = $0020; // Guess device class (for transform2devicelink) cmsFLAGS_KEEP_SEQUENCE = $0080; // Keep profile sequence for devicelink creation // Specific to a particular optimizations cmsFLAGS_FORCE_CLUT = $0002; // Force CLUT optimization cmsFLAGS_CLUT_POST_LINEARIZATION = $0001; // create postlinearization tables if possible cmsFLAGS_CLUT_PRE_LINEARIZATION = $0010; // create prelinearization tables if possible // CRD special cmsFLAGS_NODEFAULTRESOURCEDEF = $01000000; // Fine-tune control over number of gridpoints FUNCTION cmsFLAGS_GRIDPOINTS(n: Integer): Integer; // Transforms --------------------------------------------------------------------------------------------------- type LPcmsHPROFILEArray = ^cmsHPROFILEArray; cmsHPROFILEArray = array[0..0] of cmsHPROFILE; LPcmsBoolArray = ^cmsBoolArray; cmsBoolArray = array[0..0] of cmsBool; FUNCTION cmsCreateTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateProofingTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateProofingTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateMultiprofileTransformTHR(ContextID: cmsContext; hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateMultiprofileTransform( hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateExtendedTransform(ContextID: cmsContext; nProfiles: cmsUInt32Number; hProfiles: LPcmsHPROFILEArray; BPC: LPcmsBoolArray; Intents: LPcmsUInt32NumberArray; AdaptationStates: LPcmsFloat64NumberArray; hGamutProfile: cmsHPROFILE; nGamutPCSposition: cmsUInt32Number; InputFormat, OutputFormat: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; PROCEDURE cmsDeleteTransform(hTransform: cmsHTRANSFORM); StdCall; PROCEDURE cmsDoTransform(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number); StdCall; PROCEDURE cmsDoTransformStride(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number; stride: cmsUInt32Number); StdCall; PROCEDURE cmsSetAlarmCodes( NewAlarm: LPcmsUInt16NumberArray); StdCall; PROCEDURE cmsGetAlarmCodes(NewAlarm: LPcmsUInt16NumberArray); StdCall; // Adaptation state for absolute colorimetric intent FUNCTION cmsSetAdaptationState(d: cmsFloat64Number):cmsFloat64Number; StdCall; // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed FUNCTION cmsGetTransformContextID(hTransform: cmsHTRANSFORM):cmsContext; StdCall; // For backwards compatibility FUNCTION cmsChangeBuffersFormat(hTransform: cmsHTRANSFORM; InputFormat, OutputFormat: cmsUInt32Number): cmsBool; StdCall; // PostScript ColorRenderingDictionary and ColorSpaceArray ---------------------------------------------------- Type cmsPSResourceType = (cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD ) ; // lcms2 unified method to access postscript color resources FUNCTION cmsGetPostScriptColorResource(ContextID: cmsContext; RType: cmsPSResourceType; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; io: LPcmsIOHANDLER): cmsUInt32Number; StdCall; FUNCTION cmsGetPostScriptCSA(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number ): cmsUInt32Number; StdCall; FUNCTION cmsGetPostScriptCRD(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number): cmsUInt32Number; StdCall; // IT8.7 / CGATS.17-20$ handling ----------------------------------------------------------------------------- // CGATS.13 parser FUNCTION cmsIT8Alloc: cmsHANDLE; StdCall; PROCEDURE cmsIT8Free(hIT8: cmsHANDLE); StdCall; // Tables FUNCTION cmsIT8TableCount(hIT8: cmsHANDLE): Integer; StdCall; FUNCTION cmsIT8SetTable(hIT8: cmsHANDLE; nTable: Integer): Integer; StdCall; // Persistence FUNCTION cmsIT8LoadFromFile(cFileName: PAnsiChar): cmsHANDLE; StdCall; FUNCTION cmsIT8LoadFromMem(Ptr: Pointer; size :DWord): cmsHANDLE; StdCall; FUNCTION cmsIT8SaveToFile(hIT8: cmsHANDLE; cFileName: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SaveToMem(hIT8: cmsHANDLE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; // Properties FUNCTION cmsIT8GetSheetType(hIT8: cmsHANDLE): PAnsiChar; StdCall; FUNCTION cmsIT8SetSheetType(hIT8: cmsHANDLE; TheType: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetComment(hIT8: cmsHANDLE; cComment: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyStr(hIT8: cmsHANDLE; cProp, Str: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Double): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyHex(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Integer): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyUncooked(hIT8: cmsHANDLE; Key, Buffer: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8GetProperty(hIT8: cmsHANDLE; cProp: PAnsiChar): PAnsiChar; StdCall; FUNCTION cmsIT8GetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar): Double; StdCall; FUNCTION cmsIT8EnumProperties(hIT8: cmsHANDLE; var PropertyNames: LPPAnsiChar): Integer; StdCall; // Datasets FUNCTION cmsIT8GetDataRowCol(hIT8: cmsHANDLE; row, col: Integer): PAnsiChar; StdCall; FUNCTION cmsIT8GetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer): Double; StdCall; FUNCTION cmsIT8SetDataRowCol(hIT8: cmsHANDLE; row, col: Integer; Val: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer; Val: Double): cmsBool; StdCall; FUNCTION cmsIT8GetData(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar): PAnsiChar; StdCall; FUNCTION cmsIT8GetDataDbl(hIT8: cmsHANDLE;cPatch, cSample: PAnsiChar): Double; StdCall; FUNCTION cmsIT8SetData(hIT8: cmsHANDLE; cPatch, cSample, Val: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetDataDbl(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar; Val: Double): cmsBool; StdCall; FUNCTION cmsIT8SetDataFormat(hIT8: cmsHANDLE; n: Integer; Sample: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8EnumDataFormat(hIT8: cmsHANDLE; var SampleNames: LPPAnsiChar): Integer; StdCall; FUNCTION cmsIT8GetPatchName(hIT8: cmsHANDLE; nPatch: Integer; Buffer: PAnsiChar): PAnsiChar; StdCall; // The LABEL extension FUNCTION cmsIT8SetTableByLabel(hIT8: cmsHANDLE; cSet, cField, ExpectedType: PAnsiChar): Integer; StdCall; FUNCTION cmsIT8FindDataFormat(hIT8: cmsHANDLE; cSample: PAnsiChar): Integer; StdCall; // Formatter for double PROCEDURE cmsIT8DefineDblFormat(hIT8: cmsHANDLE; Formatter: PAnsiChar); StdCall; // Gamut boundary description routines ------------------------------------------------------------------------------ FUNCTION cmsGBDAlloc(ContextID: cmsContext):cmsHANDLE; StdCall; PROCEDURE cmsGBDFree(hGBD: cmsHANDLE); StdCall; FUNCTION cmsGDBAddPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; FUNCTION cmsGDBCompute(hGDB: cmsHANDLE; dwFlags: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsGDBCheckPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; // Feature detection ---------------------------------------------------------------------------------------------- // Estimate the black point FUNCTION cmsDetectBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsDetectDestinationBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; // Estimate total area coverage FUNCTION cmsDetectTAC(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; // Estimate profile gamma FUNCTION cmsDetectRGBProfileGamma(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; // Poor man's gamut mapping FUNCTION cmsDesaturateLab(Lab: LPcmsCIELab; amax, amin, bmax, bmin: cmsFloat64Number): cmsBool; StdCall; IMPLEMENTATION FUNCTION FLOAT_SH(a: cmsUInt32Number): cmsUInt32Number; begin FLOAT_SH := ((a) shl 22) end; FUNCTION OPTIMIZED_SH(s: cmsUInt32Number): cmsUInt32Number; begin OPTIMIZED_SH := ((s) shl 21) end; FUNCTION COLORSPACE_SH(s: cmsUInt32Number):cmsUInt32Number; begin COLORSPACE_SH := ((s) shl 16) end; FUNCTION SWAPFIRST_SH(s: cmsUInt32Number):cmsUInt32Number; begin SWAPFIRST_SH := ((s) shl 14) end; FUNCTION FLAVOR_SH(s: cmsUInt32Number):cmsUInt32Number; begin FLAVOR_SH := ((s) shl 13) end; FUNCTION PLANAR_SH(p: cmsUInt32Number):cmsUInt32Number; begin PLANAR_SH := ((p) shl 12) end; FUNCTION ENDIAN16_SH(e: cmsUInt32Number):cmsUInt32Number; begin ENDIAN16_SH := ((e) shl 11) end; FUNCTION DOSWAP_SH(e: cmsUInt32Number):cmsUInt32Number; begin DOSWAP_SH := ((e) shl 10) end; FUNCTION EXTRA_SH(e: cmsUInt32Number):cmsUInt32Number; begin EXTRA_SH := ((e) shl 7) end; FUNCTION CHANNELS_SH(c: cmsUInt32Number):cmsUInt32Number; begin CHANNELS_SH := ((c) shl 3) end; FUNCTION BYTES_SH(b: cmsUInt32Number):cmsUInt32Number; begin BYTES_SH := (b) end; FUNCTION T_FLOAT(a: cmsUInt32Number): cmsUInt32Number; begin T_FLOAT := (((a) shr 22) and 1) end; FUNCTION T_OPTIMIZED(o: cmsUInt32Number): cmsUInt32Number; begin T_OPTIMIZED := (((o) shr 21) and 1) end; FUNCTION T_COLORSPACE(s: cmsUInt32Number): cmsUInt32Number; begin T_COLORSPACE := (((s) shr 16) and 31) end; FUNCTION T_SWAPFIRST(s: cmsUInt32Number): cmsUInt32Number; begin T_SWAPFIRST := (((s) shr 14) and 1) end; FUNCTION T_FLAVOR(s: cmsUInt32Number): cmsUInt32Number; begin T_FLAVOR := (((s) shr 13) and 1) end; FUNCTION T_PLANAR(p: cmsUInt32Number): cmsUInt32Number; begin T_PLANAR := (((p) shr 12) and 1) end; FUNCTION T_ENDIAN16(e: cmsUInt32Number): cmsUInt32Number; begin T_ENDIAN16 := (((e) shr 11) and 1) end; FUNCTION T_DOSWAP(e: cmsUInt32Number): cmsUInt32Number; begin T_DOSWAP := (((e) shr 10) and 1) end; FUNCTION T_EXTRA(e: cmsUInt32Number): cmsUInt32Number; begin T_EXTRA := (((e) shr 7) and 7) end; FUNCTION T_CHANNELS(c: cmsUInt32Number): cmsUInt32Number; begin T_CHANNELS := (((c) shr 3) and 15) end; FUNCTION T_BYTES(b: cmsUInt32Number): cmsUInt32Number; begin T_BYTES := ((b) and 7) end; // FUNCTION cmsCreateContext(Plugin : Pointer; UserData : Pointer) : cmsContext; StdCall; external LCMS2_SO; PROCEDURE cmsDeleteContext(ContextID: cmsContext); StdCall; external LCMS2_SO; FUNCTION cmsDupContext(ContextID: cmsContext; NewUserData: Pointer): cmsContext; StdCall; external LCMS2_SO; FUNCTION cmsGetContextUserData(ContextID: cmsContext): Pointer; StdCall; external LCMS2_SO; FUNCTION cmsPlugin(Plugin: Pointer): cmsBool; StdCall; external LCMS2_SO; PROCEDURE cmsUnregisterPlugins; StdCall; external LCMS2_SO; PROCEDURE cmsSetLogErrorHandler(Fn: cmsLogErrorHandlerFunction); StdCall; external LCMS2_SO; FUNCTION cmsD50_XYZ: LPcmsCIEXYZ; StdCall; external LCMS2_SO; FUNCTION cmsD50_xyY: LPcmsCIExyY; StdCall; external LCMS2_SO; PROCEDURE cmsXYZ2xyY(Dest: LPcmsCIExyY; Source: LPcmsCIEXYZ); StdCall; external LCMS2_SO; PROCEDURE cmsxyY2XYZ(Dest: LPcmsCIEXYZ; Source: LPcmsCIExyY); StdCall; external LCMS2_SO; PROCEDURE cmsLab2XYZ(WhitePoint: LPcmsCIEXYZ; xyz: LPcmsCIEXYZ; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsXYZ2Lab(WhitePoint: LPcmsCIEXYZ; Lab: LPcmsCIELab; xyz: LPcmsCIEXYZ); StdCall; external LCMS2_SO; PROCEDURE cmsLab2LCh(LCh: LPcmsCIELCh; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsLCh2Lab(Lab: LPcmsCIELab; LCh: LPcmsCIELCh); StdCall; external LCMS2_SO; PROCEDURE cmsLabEncoded2Float(Lab: LPcmsCIELab; wLab: Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsLabEncoded2FloatV2(Lab: LPcmsCIELab; wLab: Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsFloat2LabEncoded(wLab: Pointer; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsFloat2LabEncodedV2(wLab: Pointer; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsXYZEncoded2Float(fxyz : LPcmsCIEXYZ; XYZ: Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsFloat2XYZEncoded(XYZ: Pointer; fXYZ: LPcmsCIEXYZ); StdCall; external LCMS2_SO; FUNCTION cmsDeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsCIE94DeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsBFDdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsCMCdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsCIE2000DeltaE(Lab1, Lab2: LPcmsCIELab; Kl, Kc, Kh: Double): Double; StdCall; external LCMS2_SO; FUNCTION cmsWhitePointFromTemp(var WhitePoint: cmsCIExyY; TempK: cmsFloat64Number) : cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsTempFromWhitePoint(var TeampK: cmsFloat64Number; var WhitePoint: cmsCIExyY) : cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsAdaptToIlluminant(Result: LPcmsCIEXYZ; SourceWhitePt: LPcmsCIEXYZ; Illuminant: LPcmsCIEXYZ; Value: LPcmsCIEXYZ): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsCIECAM02Init(pVC : LPcmsViewingConditions ) : Pointer; StdCall; external LCMS2_SO; PROCEDURE cmsCIECAM02Done(hModel : Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsCIECAM02Forward(hModel: Pointer; pIn: LPcmsCIEXYZ; pOut: LPcmsJCh ); StdCall; external LCMS2_SO; PROCEDURE cmsCIECAM02Reverse(hModel: Pointer; pIn: LPcmsJCh; pOut: LPcmsCIEXYZ ); StdCall; external LCMS2_SO; FUNCTION cmsBuildSegmentedToneCurve(ContextID: cmsContext; nSegments: cmsInt32Number; Segments: LPcmsCurveSegmentArray): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildParametricToneCurve(ContextID: cmsContext; CType: cmsInt32Number; Params: LPcmsFloat64NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildGamma(ContextID: cmsContext; Gamma: cmsFloat64Number): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildTabulatedToneCurve16(ContextID: cmsContext; nEntries: cmsInt32Number; values: LPcmsUInt16NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildTabulatedToneCurveFloat(ContextID: cmsContext; nEntries: cmsUInt32Number; values: LPcmsFloat32NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; PROCEDURE cmsFreeToneCurve(Curve: LPcmsToneCurve); StdCall; external LCMS2_SO; PROCEDURE cmsFreeToneCurveTriple(Curve: LPLPcmsToneCurveArray); StdCall; external LCMS2_SO; FUNCTION cmsDupToneCurve(Src: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsReverseToneCurve(InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsReverseToneCurveEx(nResultSamples: cmsInt32Number; InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsJoinToneCurve(ContextID: cmsContext; X, Y: LPcmsToneCurve; nPoints: cmsUInt32Number ): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsSmoothToneCurve(Tab: LPcmsToneCurve; lambda: cmsFloat64Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsEvalToneCurveFloat(Curve: LPcmsToneCurve; v: cmsFloat32Number):cmsFloat32Number; StdCall; external LCMS2_SO; FUNCTION cmsEvalToneCurve16(Curve: LPcmsToneCurve; v:cmsUInt16Number):cmsUInt16Number; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveMultisegment(InGamma: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveLinear(Curve: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveMonotonic(t: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveDescending(t: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGetToneCurveParametricType(t: LPcmsToneCurve):cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsEstimateGamma(t: LPcmsToneCurve; Precision:cmsFloat64Number):cmsFloat64Number; StdCall; external LCMS2_SO; FUNCTION cmsGetToneCurveEstimatedTableEntries(t: LPcmsToneCurve): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetToneCurveEstimatedTable(t: LPcmsToneCurve): LPcmsUInt16Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineAlloc(ContextID: cmsContext; InputChannels, OutputChannels: cmsUInt32Number): LPcmsPipeline; StdCall; external LCMS2_SO; PROCEDURE cmsPipelineFree(lut: LPcmsPipeline); StdCall; external LCMS2_SO; FUNCTION cmsPipelineDup(Orig: LPcmsPipeline): LPcmsPipeline; StdCall; external LCMS2_SO; FUNCTION cmsGetPipelineContextID(lut: LPcmsPipeline) : cmsContext; StdCall; external LCMS2_SO; FUNCTION cmsPipelineInputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineOutputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineStageCount(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineGetPtrToFirstStage(lut: LPcmsPipeline): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsPipelineGetPtrToLastStage(lut: LPcmsPipeline): LPcmsStage; StdCall; external LCMS2_SO; PROCEDURE cmsPipelineEval16(Inv, Outv: LPcmsUInt16NumberArray; lut: LPcmsPipeline); StdCall; external LCMS2_SO; PROCEDURE cmsPipelineEvalFloat(Inv, Outv: LPcmsFloat32NumberArray; lut: LPcmsPipeline); StdCall; external LCMS2_SO; FUNCTION cmsPipelineEvalReverseFloat(Target, Result, Hint: LPcmsFloat32NumberArray; lut: LPcmsPipeline): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsPipelineCat(l1, l2: LPcmsPipeline): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsPipelineSetSaveAs8bitsFlag(lut: LPcmsPipeline; On: cmsBool): cmsBool; StdCall; external LCMS2_SO; PROCEDURE cmsPipelineInsertStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPcmsStage); StdCall; external LCMS2_SO; PROCEDURE cmsPipelineUnlinkStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPLPcmsStage); StdCall; external LCMS2_SO; FUNCTION cmsStageAllocIdentity(ContextID: cmsContext; nChannels: cmsUInt32Number): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocToneCurves(ContextID: cmsContext; nChannels: cmsUInt32Number; Curves: LPLPcmsToneCurveArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocMatrix(ContextID: cmsContext; Rows, Cols: cmsUInt32Number; Matrix, Offset: LPcmsFloat64NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLut16bit(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLutFloat(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLut16bitGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLutFloatGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageDup(mpe: LPcmsStage): LPcmsStage; StdCall; external LCMS2_SO; PROCEDURE cmsStageFree(mpe: LPcmsStage); StdCall; external LCMS2_SO; FUNCTION cmsStageNext(mpe: LPcmsStage): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageInputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsStageOutputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsStageType(mpe: LPcmsStage): cmsStageSignature; StdCall; external LCMS2_SO; FUNCTION cmsStageData(mpe: LPcmsStage): Pointer; StdCall; external LCMS2_SO; FUNCTION cmsStageSampleCLut16bit(mpe: LPcmsStage; Sampler: cmsSAMPLER16; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsStageSampleCLutFloat(mpe: LPcmsStage; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSliceSpace16(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLER16; Cargo: Pointer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSliceSpaceFloat(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMLUalloc(ContextID: cmsContext; nItems: cmsUInt32Number): LPcmsMLU; StdCall; external LCMS2_SO; PROCEDURE cmsMLUfree(mlu: LPcmsMLU); StdCall; external LCMS2_SO; FUNCTION cmsMLUdup(mlu: LPcmsMLU): LPcmsMLU; StdCall; external LCMS2_SO; FUNCTION cmsMLUsetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode, ASCIIString: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMLUsetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; WideString: PWChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMLUgetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsMLUgetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsMLUgetTranslation(mlu: LPcmsMLU; LanguageCode, CountryCode, ObtainedLanguage, ObtainedCountry: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsAllocNamedColorList(ContextID: cmsContext; n, ColorantCount :cmsUInt32Number; Prefix, Suffix: PAnsiChar): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; PROCEDURE cmsFreeNamedColorList(v: LPcmsNAMEDCOLORLIST); StdCall; external LCMS2_SO; FUNCTION cmsDupNamedColorList(v: LPcmsNAMEDCOLORLIST): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; FUNCTION cmsAppendNamedColor(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsNamedColorCount(v: LPcmsNAMEDCOLORLIST): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsNamedColorIndex(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar): cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsNamedColorInfo(v: LPcmsNAMEDCOLORLIST; nColor : cmsUInt32Number; Name,Prefix, Suffix : PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGetNamedColorList(xform: cmsHTRANSFORM ): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; FUNCTION cmsAllocProfileSequenceDescription(ContextID: cmsContext; n: cmsUInt32Number):LPcmsSEQ; StdCall; external LCMS2_SO; FUNCTION cmsDupProfileSequenceDescription(pseq: LPcmsSEQ):LPcmsSEQ; StdCall; external LCMS2_SO; PROCEDURE cmsFreeProfileSequenceDescription(pseq: LPcmsSEQ); StdCall; external LCMS2_SO; FUNCTION cmsDictAlloc(ContextID: cmsContext): cmsHANDLE; StdCall; external LCMS2_SO; PROCEDURE cmsDictFree(hDict: cmsHANDLE); StdCall; external LCMS2_SO; FUNCTION cmsDictDup(hDict: cmsHANDLE): cmsHANDLE; StdCall; external LCMS2_SO; FUNCTION cmsDictAddEntry(hDict: cmsHANDLE; Name, Value: PWChar; DisplayName, DisplayValue : LPcmsMLU): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDictGetEntryList(hDict: cmsHANDLE): LPcmsDICTentry; StdCall; external LCMS2_SO; FUNCTION cmsDictNextEntry(e : LPcmsDICTentry): LPcmsDICTentry; StdCall; external LCMS2_SO; FUNCTION cmsCreateProfilePlaceholder(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsGetProfileContextID(hProfile: cmsHPROFILE):cmsContext; StdCall; external LCMS2_SO; FUNCTION cmsGetTagCount(hProfile: cmsHPROFILE): cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetTagSignature(hProfile: cmsHPROFILE; n: cmsUInt32Number): cmsTagSignature; StdCall; external LCMS2_SO; FUNCTION cmsIsTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsReadTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): Pointer; StdCall; external LCMS2_SO; FUNCTION cmsWriteTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsLinkTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; dest: cmsTagSignature): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsTagLinkedTo(hProfile: cmsHPROFILE; sig: cmsTagSignature):cmsTagSignature; StdCall; external LCMS2_SO; FUNCTION cmsReadRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; Buffer: Pointer; BufferSize: cmsUInt32Number): cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsWriteRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer; Size: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderFlags(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsGetHeaderAttributes(hProfile: cmsHPROFILE; Flags: LPcmsUInt64Number); StdCall; external LCMS2_SO; PROCEDURE cmsGetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderRenderingIntent(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderFlags(hProfile: cmsHPROFILE; Flags: cmsUInt32Number); StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderManufacturer(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderManufacturer(hProfile: cmsHPROFILE; manufacturer: cmsUInt32Number ); StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderModel(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderModel(hProfile: cmsHPROFILE; model: cmsUInt32Number ); StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderAttributes(hProfile: cmsHPROFILE; Flags: cmsUInt64Number); StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderRenderingIntent(hProfile: cmsHPROFILE; RenderingIntent: cmsUInt32Number ); StdCall; external LCMS2_SO; FUNCTION cmsGetPCS(hProfile: cmsHPROFILE):cmsColorSpaceSignature; StdCall; external LCMS2_SO; PROCEDURE cmsSetPCS(hProfile: cmsHPROFILE; pcs: cmsColorSpaceSignature); StdCall; external LCMS2_SO; FUNCTION cmsGetColorSpace(hProfile: cmsHPROFILE): cmsColorSpaceSignature; StdCall; external LCMS2_SO; PROCEDURE cmsSetColorSpace(hProfile: cmsHPROFILE; sig: cmsColorSpaceSignature); StdCall; external LCMS2_SO; FUNCTION cmsGetDeviceClass(hProfile: cmsHPROFILE): cmsProfileClassSignature; StdCall; external LCMS2_SO; PROCEDURE cmsSetDeviceClass(hProfile: cmsHPROFILE; sig: cmsProfileClassSignature); StdCall; external LCMS2_SO; PROCEDURE cmsSetProfileVersion(hProfile: cmsHPROFILE; Version: cmsFloat64Number); StdCall; external LCMS2_SO; FUNCTION cmsGetProfileVersion(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; external LCMS2_SO; FUNCTION cmsGetEncodedICCversion(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetEncodedICCversion(hProfile: cmsHPROFILE; Version: cmsUInt32Number); StdCall; external LCMS2_SO; FUNCTION cmsIsIntentSupported(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsMatrixShaper(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsCLUT(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION _cmsICCcolorSpace(OurNotation: Integer): cmsColorSpaceSignature; StdCall; external LCMS2_SO; FUNCTION _cmsLCMScolorSpace(ProfileSpace: cmsColorSpaceSignature): Integer; StdCall; external LCMS2_SO; FUNCTION cmsChannelsOf( ColorSpace: cmsColorSpaceSignature): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsFormatterForColorspaceOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsFormatterForPCSOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetProfileInfo(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetProfileInfoASCII(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsOpenIOhandlerFromFile(ContextID: cmsContext; FileName, AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; external LCMS2_SO; // FUNCTION cmsOpenIOhandlerFromStream(ContextID: cmsContext; FILE* Stream): LPcmsIOHANDLER; StdCall; external LCMS2_SO; FUNCTION cmsOpenIOhandlerFromMem(ContextID: cmsContext; Buffer: Pointer; size: cmsUInt32Number; AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; external LCMS2_SO; FUNCTION cmsOpenIOhandlerFromNULL(ContextID: cmsContext): LPcmsIOHANDLER; StdCall; external LCMS2_SO; FUNCTION cmsCloseIOhandler(io: LPcmsIOHANDLER): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMD5computeID(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromFile(ICCProfile : PAnsiChar; sAccess: PAnsiChar): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromFileTHR(ContextID: cmsContext; ICCProfile, sAccess: PAnsiChar): cmsHPROFILE; StdCall; external LCMS2_SO; // FUNCTION CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; external LCMS2_SO; // FUNCTION CMSEXPORT cmsOpenProfileFromStreamTHR(ContextID: cmsContext; FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromMem(MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromMemTHR(ContextID: cmsContext; MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromIOhandlerTHR(ContextID: cmsContext; io: LPcmsIOHANDLER): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCloseProfile(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSaveProfileToFile(hProfile: cmsHPROFILE; FileName: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; // FUNCTION CMSEXPORT cmsSaveProfileToStream(hProfile: cmsHPROFILE, FILE* Stream): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSaveProfileToMem(hProfile: cmsHPROFILE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSaveProfileToIOhandler(hProfile: cmsHPROFILE; io: LPcmsIOHANDLER):cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsCreateRGBProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateRGBProfile(WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateGrayProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateGrayProfile(WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLinearizationDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLinearizationDeviceLink(ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateInkLimitingDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateInkLimitingDeviceLink(ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab2ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab2Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab4ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab4Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateXYZProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateXYZProfile: cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreate_sRGBProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreate_sRGBProfile: cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateBCHSWabstractProfileTHR(ContextID: cmsContext; nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateBCHSWabstractProfile( nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateNULLProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateNULLProfile: cmsHPROFILE; StdCall; external LCMS2_SO; // Converts a transform to a devicelink profile FUNCTION cmsTransform2DeviceLink(hTransform: cmsHTRANSFORM; Version: cmsFloat64Number; dwFlags: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; // Call with NULL as parameters to get the intent count FUNCTION cmsGetSupportedIntents(nMax: cmsUInt32Number; Codes: LPcmsUInt32Number; Descriptions: LPPAnsiChar): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsFLAGS_GRIDPOINTS(n: Integer): Integer; begin cmsFLAGS_GRIDPOINTS := (((n) and $FF) shl 16) end; FUNCTION cmsCreateTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateProofingTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateProofingTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateMultiprofileTransformTHR(ContextID: cmsContext; hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateMultiprofileTransform( hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateExtendedTransform(ContextID: cmsContext; nProfiles: cmsUInt32Number; hProfiles: LPcmsHPROFILEArray; BPC: LPcmsBoolArray; Intents: LPcmsUInt32NumberArray; AdaptationStates: LPcmsFloat64NumberArray; hGamutProfile: cmsHPROFILE; nGamutPCSposition: cmsUInt32Number; InputFormat, OutputFormat: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; PROCEDURE cmsDeleteTransform(hTransform: cmsHTRANSFORM); StdCall; external LCMS2_SO; PROCEDURE cmsDoTransform(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number); StdCall; external LCMS2_SO; PROCEDURE cmsDoTransformStride(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number; stride: cmsUInt32Number); StdCall; external LCMS2_SO; PROCEDURE cmsSetAlarmCodes( NewAlarm: LPcmsUInt16NumberArray); StdCall; external LCMS2_SO; PROCEDURE cmsGetAlarmCodes(NewAlarm: LPcmsUInt16NumberArray); StdCall; external LCMS2_SO; // Adaptation state for absolute colorimetric intent FUNCTION cmsSetAdaptationState(d: cmsFloat64Number):cmsFloat64Number; StdCall; external LCMS2_SO; // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed FUNCTION cmsGetTransformContextID(hTransform: cmsHTRANSFORM):cmsContext; StdCall; external LCMS2_SO; // For backwards compatibility FUNCTION cmsChangeBuffersFormat(hTransform: cmsHTRANSFORM; InputFormat, OutputFormat: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; // lcms2 unified method to access postscript color resources FUNCTION cmsGetPostScriptColorResource(ContextID: cmsContext; RType: cmsPSResourceType; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; io: LPcmsIOHANDLER): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetPostScriptCSA(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number ): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetPostScriptCRD(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; // CGATS.13 parser FUNCTION cmsIT8Alloc: cmsHANDLE; StdCall; external LCMS2_SO; PROCEDURE cmsIT8Free(hIT8: cmsHANDLE); StdCall; external LCMS2_SO; // Tables FUNCTION cmsIT8TableCount(hIT8: cmsHANDLE): Integer; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetTable(hIT8: cmsHANDLE; nTable: Integer): Integer; StdCall; external LCMS2_SO; // Persistence FUNCTION cmsIT8LoadFromFile(cFileName: PAnsiChar): cmsHANDLE; StdCall; external LCMS2_SO; FUNCTION cmsIT8LoadFromMem(Ptr: Pointer; size :DWord): cmsHANDLE; StdCall; external LCMS2_SO; FUNCTION cmsIT8SaveToFile(hIT8: cmsHANDLE; cFileName: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SaveToMem(hIT8: cmsHANDLE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; // Properties FUNCTION cmsIT8GetSheetType(hIT8: cmsHANDLE): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetSheetType(hIT8: cmsHANDLE; TheType: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetComment(hIT8: cmsHANDLE; cComment: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyStr(hIT8: cmsHANDLE; cProp, Str: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Double): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyHex(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Integer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyUncooked(hIT8: cmsHANDLE; Key, Buffer: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetProperty(hIT8: cmsHANDLE; cProp: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar): Double; StdCall; external LCMS2_SO; FUNCTION cmsIT8EnumProperties(hIT8: cmsHANDLE; var PropertyNames: LPPAnsiChar): Integer; StdCall; external LCMS2_SO; // Datasets FUNCTION cmsIT8GetDataRowCol(hIT8: cmsHANDLE; row, col: Integer): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer): Double; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataRowCol(hIT8: cmsHANDLE; row, col: Integer; Val: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer; Val: Double): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetData(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetDataDbl(hIT8: cmsHANDLE;cPatch, cSample: PAnsiChar): Double; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetData(hIT8: cmsHANDLE; cPatch, cSample, Val: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataDbl(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar; Val: Double): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataFormat(hIT8: cmsHANDLE; n: Integer; Sample: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8EnumDataFormat(hIT8: cmsHANDLE; var SampleNames: LPPAnsiChar): Integer; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetPatchName(hIT8: cmsHANDLE; nPatch: Integer; Buffer: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; // The LABEL extension FUNCTION cmsIT8SetTableByLabel(hIT8: cmsHANDLE; cSet, cField, ExpectedType: PAnsiChar): Integer; StdCall; external LCMS2_SO; FUNCTION cmsIT8FindDataFormat(hIT8: cmsHANDLE; cSample: PAnsiChar): Integer; StdCall; external LCMS2_SO; // Formatter for double PROCEDURE cmsIT8DefineDblFormat(hIT8: cmsHANDLE; Formatter: PAnsiChar); StdCall; external LCMS2_SO; FUNCTION cmsGBDAlloc(ContextID: cmsContext):cmsHANDLE; StdCall; external LCMS2_SO; PROCEDURE cmsGBDFree(hGBD: cmsHANDLE); StdCall; external LCMS2_SO; FUNCTION cmsGDBAddPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGDBCompute(hGDB: cmsHANDLE; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGDBCheckPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDetectBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDetectDestinationBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDetectTAC(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; external LCMS2_SO; FUNCTION cmsDesaturateLab(Lab: LPcmsCIELab; amax, amin, bmax, bmin: cmsFloat64Number): cmsBool; StdCall; external LCMS2_SO; END. lcms2-2.19.1/utils/jpgicc/0000755000175000017500000000000015176574562014257 5ustar martimartilcms2-2.19.1/utils/jpgicc/LICENSE_iccjpeg0000755000175000017500000000624215176573557016762 0ustar martimarti THIS LICENSE APPLIES ONLY TO iccjpeg.c file ----- In plain English: 1. We don't promise that this software works. (But if you find any bugs, please let us know!) 2. You can use this software for whatever you want. You don't have to pay us. 3. You may not pretend that you wrote this software. If you use it in a program, you must acknowledge somewhere in your documentation that you've used the IJG code. In legalese: The authors make NO WARRANTY or representation, either express or implied, with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose. This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy. This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. All Rights Reserved except as specified below. Permission is hereby granted to use, copy, modify, and distribute this software (or portions thereof) for any purpose, without fee, subject to these conditions: (1) If any part of the source code for this software is distributed, then this README file must be included, with this copyright and no-warranty notice unaltered; and any additions, deletions, or changes to the original files must be clearly indicated in accompanying documentation. (2) If only executable code is distributed, then the accompanying documentation must state that "this software is based in part on the work of the Independent JPEG Group". (3) Permission for use of this software is granted only if the user accepts full responsibility for any undesirable consequences; the authors accept NO LIABILITY for damages of any kind. These conditions apply to any software derived from or based on the IJG code, not just to the unmodified library. If you use our work, you ought to acknowledge us. Permission is NOT granted for the use of any IJG author's name or company name in advertising or publicity relating to this software or products derived from it. This software may be referred to only as "the Independent JPEG Group's software". We specifically permit and encourage the use of this software as the basis of commercial products, provided that all warranty or liability claims are assumed by the product vendor. The Unix configuration script "configure" was produced with GNU Autoconf. It is copyright by the Free Software Foundation but is freely distributable. The same holds for its supporting scripts (config.guess, config.sub, ltmain.sh). Another support script, install-sh, is copyright by X Consortium but is also freely distributable. The IJG distribution formerly included code to read and write GIF files. To avoid entanglement with the Unisys LZW patent, GIF reading support has been removed altogether, and the GIF writer has been simplified to produce "uncompressed GIFs". This technique does not use the LZW algorithm; the resulting GIF files are larger than usual, but are readable by all standard GIF decoders. We are required to state that "The Graphics Interchange Format(c) is the Copyright property of CompuServe Incorporated. GIF(sm) is a Service Mark property of CompuServe Incorporated." lcms2-2.19.1/utils/jpgicc/iccjpeg.c0000644000175000017500000002063615176573557016041 0ustar martimarti/* * iccprofile.c * * This file provides code to read and write International Color Consortium * (ICC) device profiles embedded in JFIF JPEG image files. The ICC has * defined a standard format for including such data in JPEG "APP2" markers. * The code given here does not know anything about the internal structure * of the ICC profile data; it just knows how to put the profile data into * a JPEG file being written, or get it back out when reading. * * This code depends on new features added to the IJG JPEG library as of * IJG release 6b; it will not compile or work with older IJG versions. * * NOTE: this code would need surgery to work on 16-bit-int machines * with ICC profiles exceeding 64K bytes in size. If you need to do that, * change all the "unsigned int" variables to "INT32". You'll also need * to find a malloc() replacement that can allocate more than 64K. */ #include "iccjpeg.h" #include /* define malloc() */ /* * Since an ICC profile can be larger than the maximum size of a JPEG marker * (64K), we need provisions to split it into multiple markers. The format * defined by the ICC specifies one or more APP2 markers containing the * following data: * Identifying string ASCII "ICC_PROFILE\0" (12 bytes) * Marker sequence number 1 for first APP2, 2 for next, etc (1 byte) * Number of markers Total number of APP2's used (1 byte) * Profile data (remainder of APP2 data) * Decoders should use the marker sequence numbers to reassemble the profile, * rather than assuming that the APP2 markers appear in the correct sequence. */ #define ICC_MARKER (JPEG_APP0 + 2) /* JPEG marker code for ICC */ #define ICC_OVERHEAD_LEN 14 /* size of non-profile data in APP2 */ #define MAX_BYTES_IN_MARKER 65533 /* maximum data len of a JPEG marker */ #define MAX_DATA_BYTES_IN_MARKER (MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN) /* * This routine writes the given ICC profile data into a JPEG file. * It *must* be called AFTER calling jpeg_start_compress() and BEFORE * the first call to jpeg_write_scanlines(). * (This ordering ensures that the APP2 marker(s) will appear after the * SOI and JFIF or Adobe markers, but before all else.) */ void write_icc_profile (j_compress_ptr cinfo, const JOCTET *icc_data_ptr, unsigned int icc_data_len) { unsigned int num_markers; /* total number of markers we'll write */ int cur_marker = 1; /* per spec, counting starts at 1 */ unsigned int length; /* number of bytes to write in this marker */ /* Calculate the number of markers we'll need, rounding up of course */ num_markers = icc_data_len / MAX_DATA_BYTES_IN_MARKER; if (num_markers * MAX_DATA_BYTES_IN_MARKER != icc_data_len) num_markers++; while (icc_data_len > 0) { /* length of profile to put in this marker */ length = icc_data_len; if (length > MAX_DATA_BYTES_IN_MARKER) length = MAX_DATA_BYTES_IN_MARKER; icc_data_len -= length; /* Write the JPEG marker header (APP2 code and marker length) */ jpeg_write_m_header(cinfo, ICC_MARKER, (unsigned int) (length + ICC_OVERHEAD_LEN)); /* Write the marker identifying string "ICC_PROFILE" (null-terminated). * We code it in this less-than-transparent way so that the code works * even if the local character set is not ASCII. */ jpeg_write_m_byte(cinfo, 0x49); jpeg_write_m_byte(cinfo, 0x43); jpeg_write_m_byte(cinfo, 0x43); jpeg_write_m_byte(cinfo, 0x5F); jpeg_write_m_byte(cinfo, 0x50); jpeg_write_m_byte(cinfo, 0x52); jpeg_write_m_byte(cinfo, 0x4F); jpeg_write_m_byte(cinfo, 0x46); jpeg_write_m_byte(cinfo, 0x49); jpeg_write_m_byte(cinfo, 0x4C); jpeg_write_m_byte(cinfo, 0x45); jpeg_write_m_byte(cinfo, 0x0); /* Add the sequencing info */ jpeg_write_m_byte(cinfo, cur_marker); jpeg_write_m_byte(cinfo, (int) num_markers); /* Add the profile data */ while (length--) { jpeg_write_m_byte(cinfo, *icc_data_ptr); icc_data_ptr++; } cur_marker++; } } /* * Prepare for reading an ICC profile */ void setup_read_icc_profile (j_decompress_ptr cinfo) { /* Tell the library to keep any APP2 data it may find */ jpeg_save_markers(cinfo, ICC_MARKER, 0xFFFF); } /* * Handy subroutine to test whether a saved marker is an ICC profile marker. */ static boolean marker_is_icc (jpeg_saved_marker_ptr marker) { return marker->marker == ICC_MARKER && marker->data_length >= ICC_OVERHEAD_LEN && /* verify the identifying string */ GETJOCTET(marker->data[0]) == 0x49 && GETJOCTET(marker->data[1]) == 0x43 && GETJOCTET(marker->data[2]) == 0x43 && GETJOCTET(marker->data[3]) == 0x5F && GETJOCTET(marker->data[4]) == 0x50 && GETJOCTET(marker->data[5]) == 0x52 && GETJOCTET(marker->data[6]) == 0x4F && GETJOCTET(marker->data[7]) == 0x46 && GETJOCTET(marker->data[8]) == 0x49 && GETJOCTET(marker->data[9]) == 0x4C && GETJOCTET(marker->data[10]) == 0x45 && GETJOCTET(marker->data[11]) == 0x0; } /* * See if there was an ICC profile in the JPEG file being read; * if so, reassemble and return the profile data. * * TRUE is returned if an ICC profile was found, FALSE if not. * If TRUE is returned, *icc_data_ptr is set to point to the * returned data, and *icc_data_len is set to its length. * * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc() * and must be freed by the caller with free() when the caller no longer * needs it. (Alternatively, we could write this routine to use the * IJG library's memory allocator, so that the data would be freed implicitly * at jpeg_finish_decompress() time. But it seems likely that many apps * will prefer to have the data stick around after decompression finishes.) * * NOTE: if the file contains invalid ICC APP2 markers, we just silently * return FALSE. You might want to issue an error message instead. */ boolean read_icc_profile (j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned int *icc_data_len) { jpeg_saved_marker_ptr marker; int num_markers = 0; int seq_no; JOCTET *icc_data; unsigned int total_length; #define MAX_SEQ_NO 255 /* sufficient since marker numbers are bytes */ char marker_present[MAX_SEQ_NO+1]; /* 1 if marker found */ unsigned int data_length[MAX_SEQ_NO+1]; /* size of profile data in marker */ unsigned int data_offset[MAX_SEQ_NO+1]; /* offset for data in marker */ *icc_data_ptr = NULL; /* avoid confusion if FALSE return */ *icc_data_len = 0; /* This first pass over the saved markers discovers whether there are * any ICC markers and verifies the consistency of the marker numbering. */ for (seq_no = 1; seq_no <= MAX_SEQ_NO; seq_no++) marker_present[seq_no] = 0; for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { if (marker_is_icc(marker)) { if (num_markers == 0) num_markers = GETJOCTET(marker->data[13]); else if (num_markers != GETJOCTET(marker->data[13])) return FALSE; /* inconsistent num_markers fields */ seq_no = GETJOCTET(marker->data[12]); if (seq_no <= 0 || seq_no > num_markers) return FALSE; /* bogus sequence number */ if (marker_present[seq_no]) return FALSE; /* duplicate sequence numbers */ marker_present[seq_no] = 1; data_length[seq_no] = marker->data_length - ICC_OVERHEAD_LEN; } } if (num_markers == 0) return FALSE; /* Check for missing markers, count total space needed, * compute offset of each marker's part of the data. */ total_length = 0; for (seq_no = 1; seq_no <= num_markers; seq_no++) { if (marker_present[seq_no] == 0) return FALSE; /* missing sequence number */ data_offset[seq_no] = total_length; total_length += data_length[seq_no]; } if (total_length == 0) return FALSE; /* found only empty markers? */ /* Allocate space for assembled data */ icc_data = (JOCTET *) malloc(total_length * sizeof(JOCTET)); if (icc_data == NULL) return FALSE; /* oops, out of memory */ /* and fill it in */ for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { if (marker_is_icc(marker)) { JOCTET FAR *src_ptr; JOCTET *dst_ptr; unsigned int length; seq_no = GETJOCTET(marker->data[12]); dst_ptr = icc_data + data_offset[seq_no]; src_ptr = marker->data + ICC_OVERHEAD_LEN; length = data_length[seq_no]; while (length--) { *dst_ptr++ = *src_ptr++; } } } *icc_data_ptr = icc_data; *icc_data_len = total_length; return TRUE; } lcms2-2.19.1/utils/jpgicc/iccjpeg.h0000644000175000017500000000523715176573557016046 0ustar martimarti/* * iccprofile.h * * This file provides code to read and write International Color Consortium * (ICC) device profiles embedded in JFIF JPEG image files. The ICC has * defined a standard format for including such data in JPEG "APP2" markers. * The code given here does not know anything about the internal structure * of the ICC profile data; it just knows how to put the profile data into * a JPEG file being written, or get it back out when reading. * * This code depends on new features added to the IJG JPEG library as of * IJG release 6b; it will not compile or work with older IJG versions. * * NOTE: this code would need surgery to work on 16-bit-int machines * with ICC profiles exceeding 64K bytes in size. See iccprofile.c * for details. */ #include /* needed to define "FILE", "NULL" */ #include "jpeglib.h" /* * This routine writes the given ICC profile data into a JPEG file. * It *must* be called AFTER calling jpeg_start_compress() and BEFORE * the first call to jpeg_write_scanlines(). * (This ordering ensures that the APP2 marker(s) will appear after the * SOI and JFIF or Adobe markers, but before all else.) */ extern void write_icc_profile JPP((j_compress_ptr cinfo, const JOCTET *icc_data_ptr, unsigned int icc_data_len)); /* * Reading a JPEG file that may contain an ICC profile requires two steps: * * 1. After jpeg_create_decompress() but before jpeg_read_header(), * call setup_read_icc_profile(). This routine tells the IJG library * to save in memory any APP2 markers it may find in the file. * * 2. After jpeg_read_header(), call read_icc_profile() to find out * whether there was a profile and obtain it if so. */ /* * Prepare for reading an ICC profile */ extern void setup_read_icc_profile JPP((j_decompress_ptr cinfo)); /* * See if there was an ICC profile in the JPEG file being read; * if so, reassemble and return the profile data. * * TRUE is returned if an ICC profile was found, FALSE if not. * If TRUE is returned, *icc_data_ptr is set to point to the * returned data, and *icc_data_len is set to its length. * * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc() * and must be freed by the caller with free() when the caller no longer * needs it. (Alternatively, we could write this routine to use the * IJG library's memory allocator, so that the data would be freed implicitly * at jpeg_finish_decompress() time. But it seems likely that many apps * will prefer to have the data stick around after decompression finishes.) */ extern boolean read_icc_profile JPP((j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned int *icc_data_len)); lcms2-2.19.1/utils/jpgicc/jpgicc.10000644000175000017500000000555715176573557015617 0ustar martimarti.\"Shiju P. Nair September 30, 2004 .\"Thomas Weber April 23, 2014 .TH JPGICC 1 "September 30, 2004" .SH NAME jpgicc - little cms ICC profile applier for JPEG. .SH SYNOPSIS .B jpgicc .RI [ options ] " input.jpg output.jpg" .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B jpgicc is a little cms ICC profile applier for JPEG. .SH OPTIONS .TP .B \-b Black point compensation. .TP .BI \-c\ NUM Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]. .TP .BI \-d\ NUM Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 0.0]. .TP .B \-e Embed destination profile. .TP .B \-g Marks out-of-gamut colors on softproof. .TP .BI \-h\ NUM Show summary of options and examples (0=help, 1=Examples, 2=Built-in profiles, 3=Contact information) .TP .BI \-i\ profile Input profile (defaults to sRGB). .TP .BI \-l\ link TODO: explain this option. .TP .BI \-m\ NUM SoftProof intent (0,1,2,3) [defaults to 0]. .TP .B \-n Ignore embedded profile. .TP .BI \-o\ profile Output profile (defaults to sRGB). .TP .BI \-p\ profile Soft proof profile. .TP .BI \-q\ NUM Output JPEG quality, (0..100) [defaults to 75]. .TP .BI \-s\ newprofile Save embedded profile as \fInewprofile\fR. .TP .BI \-t\ NUM Rendering intent .nf .RS 0=Perceptual [default] 1=Relative colorimetric 2=Saturation 3=Absolute colorimetric 10=Perceptual preserving black ink 11=Relative colorimetric preserving black ink 12=Saturation preserving black ink 13=Perceptual preserving black plane 14=Relative colorimetric preserving black plane 15=Saturation preserving black plane .RE .fi .TP .B \-v Verbose. .TP .BI \-!\ NUM,NUM,NUM Out-of-gamut marker channel values (r,g,b) [defaults: 128,128,128]. .SH BUILT-IN PROFILES .nf *Lab2 -- D50-based v2 CIEL*a*b *Lab4 -- D50-based v4 CIEL*a*b *Lab -- D50-based v4 CIEL*a*b *XYZ -- CIE XYZ (PCS) *sRGB -- sRGB color space *Gray22 - Monochrome of Gamma 2.2 *Gray30 - Monochrome of Gamma 3.0 *null - Monochrome black for all input *Lin2222- CMYK linearization of gamma 2.2 on each channel .fi .SH EXAMPLES .nf To color correct from scanner to sRGB: jpgicc -iscanner.icm in.jpg out.jpg To convert from monitor1 to monitor2: jpgicc -imon1.icm -omon2.icm in.jpg out.jpg To make a CMYK separation: jpgicc -oprinter.icm inrgb.jpg outcmyk.jpg To recover sRGB from a CMYK separation: jpgicc -iprinter.icm incmyk.jpg outrgb.jpg To convert from CIELab ITU/Fax JPEG to sRGB jpgicc -iitufax.icm in.jpg out.jpg To convert from CIELab ITU/Fax JPEG to sRGB jpgicc in.jpg out.jpg .fi .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR linkicc (1), .BR psicc (1), .BR tificc (1), .BR transicc (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.19.1/utils/jpgicc/meson.build0000644000175000017500000000037515176573557016431 0ustar martimartijpgicc_sources = files( 'iccjpeg.c', 'jpgicc.c', ) jpgicc_exe = executable( 'jpgicc', jpgicc_sources, dependencies: [liblcms2_dep, jpeg_dep, common_dep, m_dep], install: true, ) jpgicc_man = files( 'jpgicc.1', ) install_man(jpgicc_man) lcms2-2.19.1/utils/jpgicc/jpgicc.c0000644000175000017500000010516015176573557015670 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // // This program does apply profiles to (some) JPEG files #include "utils.h" #include "jpeglib.h" #include "iccjpeg.h" // Flags static cmsBool BlackPointCompensation = FALSE; static cmsBool IgnoreEmbedded = FALSE; static cmsBool GamutCheck = FALSE; static cmsBool lIsITUFax = FALSE; static cmsBool lIsPhotoshopApp13 = FALSE; static cmsBool lIsEXIF; static cmsBool lIsDeviceLink = FALSE; static cmsBool EmbedProfile = FALSE; static const char* SaveEmbedded = NULL; static int Intent = INTENT_PERCEPTUAL; static int ProofingIntent = INTENT_PERCEPTUAL; static int PrecalcMode = 1; static int jpegQuality = 75; static cmsFloat64Number ObserverAdaptationState = 0; static char *cInpProf = NULL; static char *cOutProf = NULL; static char *cProofing = NULL; static FILE * InFile; static FILE * OutFile; static struct jpeg_decompress_struct Decompressor; static struct jpeg_compress_struct Compressor; static struct my_error_mgr { struct jpeg_error_mgr pub; // "public" fields void* Cargo; // "private" fields } ErrorHandler; cmsUInt16Number Alarm[cmsMAXCHANNELS] = {128,128,128,0}; static void my_error_exit (j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message) (cinfo, buffer); FatalError(buffer); } /* Definition of the APPn Markers Defined for continuous-tone G3FAX The application code APP1 initiates identification of the image as a G3FAX application and defines the spatial resolution and subsampling. This marker directly follows the SOI marker. The data format will be as follows: X'FFE1' (APP1), length, FAX identifier, version, spatial resolution. The above terms are defined as follows: Length: (Two octets) Total APP1 field octet count including the octet count itself, but excluding the APP1 marker. FAX identifier: (Six octets) X'47', X'33', X'46', X'41', X'58', X'00'. This X'00'-terminated string "G3FAX" uniquely identifies this APP1 marker. Version: (Two octets) X'07CA'. This string specifies the year of approval of the standard, for identification in the case of future revision (for example, 1994). Spatial Resolution: (Two octets) Lightness pixel density in pels/25.4 mm. The basic value is 200. Allowed values are 100, 200, 300, 400, 600 and 1200 pels/25.4 mm, with square (or equivalent) pels. NOTE - The functional equivalence of inch-based and mm-based resolutions is maintained. For example, the 200 x 200 */ static cmsBool IsITUFax(jpeg_saved_marker_ptr ptr) { while (ptr) { if (ptr -> marker == (JPEG_APP0 + 1) && ptr -> data_length > 5) { const char* data = (const char*) ptr -> data; if (strcmp(data, "G3FAX") == 0) return TRUE; } ptr = ptr -> next; } return FALSE; } // Save a ITU T.42/Fax marker with defaults on boundaries. This is the only mode we support right now. static void SetITUFax(j_compress_ptr cinfo) { unsigned char Marker[] = "G3FAX\x00\0x07\xCA\x00\xC8"; jpeg_write_marker(cinfo, (JPEG_APP0 + 1), Marker, 10); } // Build a profile for decoding ITU T.42/Fax JPEG streams. // The profile has an additional ability in the input direction of // gamut compress values between 85 < a < -85 and -75 < b < 125. This conforms // the default range for ITU/T.42 -- See RFC 2301, section 6.2.3 for details // L* = [0, 100] // a* = [-85, 85] // b* = [-75, 125] // These functions does convert the encoding of ITUFAX to floating point // and vice-versa. No gamut mapping is performed yet. static void ITU2Lab(const cmsUInt16Number In[3], cmsCIELab* Lab) { Lab -> L = (double) In[0] / 655.35; Lab -> a = (double) 170.* (In[1] - 32768.) / 65535.; Lab -> b = (double) 200.* (In[2] - 24576.) / 65535.; } static void Lab2ITU(const cmsCIELab* Lab, cmsUInt16Number Out[3]) { Out[0] = (cmsUInt16Number) floor((double) (Lab -> L / 100.)* 65535. ); Out[1] = (cmsUInt16Number) floor((double) (Lab -> a / 170.)* 65535. + 32768. ); Out[2] = (cmsUInt16Number) floor((double) (Lab -> b / 200.)* 65535. + 24576. ); } // These are the samplers-- They are passed as callbacks to cmsStageSampleCLut16bit() // then, cmsSample3DGrid() will sweel whole Lab gamut calling these functions // once for each node. In[] will contain the Lab PCS value to convert to ITUFAX // on PCS2ITU, or the ITUFAX value to convert to Lab in ITU2PCS // You can change the number of sample points if desired, the algorithm will // remain same. 33 points gives good accuracy, but you can reduce to 22 or less // is space is critical #define GRID_POINTS 33 static int PCS2ITU(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); cmsDesaturateLab(&Lab, 85, -85, 125, -75); // This function does the necessary gamut remapping Lab2ITU(&Lab, Out); return TRUE; UTILS_UNUSED_PARAMETER(Cargo); } static int ITU2PCS( register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsCIELab Lab; ITU2Lab(In, &Lab); cmsFloat2LabEncoded(Out, &Lab); return TRUE; UTILS_UNUSED_PARAMETER(Cargo); } // This function does create the virtual input profile, which decodes ITU to the profile connection space static cmsHPROFILE CreateITU2PCS_ICC(void) { cmsHPROFILE hProfile; cmsPipeline* AToB0; cmsStage* ColorMap; AToB0 = cmsPipelineAlloc(0, 3, 3); if (AToB0 == NULL) return NULL; ColorMap = cmsStageAllocCLut16bit(0, GRID_POINTS, 3, 3, NULL); if (ColorMap == NULL) return NULL; cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, ColorMap); cmsStageSampleCLut16bit(ColorMap, ITU2PCS, NULL, 0); hProfile = cmsCreateProfilePlaceholder(0); if (hProfile == NULL) { cmsPipelineFree(AToB0); return NULL; } cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB0); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); cmsPipelineFree(AToB0); return hProfile; } // This function does create the virtual output profile, with the necessary gamut mapping static cmsHPROFILE CreatePCS2ITU_ICC(void) { cmsHPROFILE hProfile; cmsPipeline* BToA0; cmsStage* ColorMap; BToA0 = cmsPipelineAlloc(0, 3, 3); if (BToA0 == NULL) return NULL; ColorMap = cmsStageAllocCLut16bit(0, GRID_POINTS, 3, 3, NULL); if (ColorMap == NULL) return NULL; cmsPipelineInsertStage(BToA0, cmsAT_BEGIN, ColorMap); cmsStageSampleCLut16bit(ColorMap, PCS2ITU, NULL, 0); hProfile = cmsCreateProfilePlaceholder(0); if (hProfile == NULL) { cmsPipelineFree(BToA0); return NULL; } cmsWriteTag(hProfile, cmsSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); cmsPipelineFree(BToA0); return hProfile; } #define PS_FIXED_TO_FLOAT(h, l) ((float) (h) + ((float) (l)/(1<<16))) static cmsBool ProcessPhotoshopAPP13(JOCTET *data, int datalen) { int i; for (i = 14; i < datalen; ) { long len; unsigned int type; if (!(GETJOCTET(data[i] ) == 0x38 && GETJOCTET(data[i+1]) == 0x42 && GETJOCTET(data[i+2]) == 0x49 && GETJOCTET(data[i+3]) == 0x4D)) break; // Not recognized i += 4; // identifying string type = (unsigned int) (GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1])); i += 2; // resource type i += GETJOCTET(data[i]) + ((GETJOCTET(data[i]) & 1) ? 1 : 2); // resource name len = ((((GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1]))<<8) + GETJOCTET(data[i+2]))<<8) + GETJOCTET(data[i+3]); if (len < 0) return FALSE; // Keep bug hunters away i += 4; // Size if (type == 0x03ED && len >= 16) { Decompressor.X_density = (UINT16) PS_FIXED_TO_FLOAT(GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1]), GETJOCTET(data[i+2]<<8) + GETJOCTET(data[i+3])); Decompressor.Y_density = (UINT16) PS_FIXED_TO_FLOAT(GETJOCTET(data[i+8]<<8) + GETJOCTET(data[i+9]), GETJOCTET(data[i+10]<<8) + GETJOCTET(data[i+11])); // Set the density unit to 1 since the // Vertical and Horizontal resolutions // are specified in Pixels per inch Decompressor.density_unit = 0x01; return TRUE; } i += len + ((len & 1) ? 1 : 0); // Alignment } return FALSE; } static cmsBool HandlePhotoshopAPP13(jpeg_saved_marker_ptr ptr) { while (ptr) { if (ptr -> marker == (JPEG_APP0 + 13) && ptr -> data_length > 9) { JOCTET* data = ptr -> data; if(GETJOCTET(data[0]) == 0x50 && GETJOCTET(data[1]) == 0x68 && GETJOCTET(data[2]) == 0x6F && GETJOCTET(data[3]) == 0x74 && GETJOCTET(data[4]) == 0x6F && GETJOCTET(data[5]) == 0x73 && GETJOCTET(data[6]) == 0x68 && GETJOCTET(data[7]) == 0x6F && GETJOCTET(data[8]) == 0x70) { ProcessPhotoshopAPP13(data, ptr -> data_length); return TRUE; } } ptr = ptr -> next; } return FALSE; } typedef unsigned short uint16_t; typedef unsigned char uint8_t; typedef unsigned int uint32_t; #define INTEL_BYTE_ORDER 0x4949 #define XRESOLUTION 0x011a #define YRESOLUTION 0x011b #define RESOLUTION_UNIT 0x128 // Abort if crafted file static void craftedFile(void) { FatalError("Corrupted EXIF data"); } // Read a 16-bit word static uint16_t read16(uint8_t* arr, size_t pos, int swapBytes, size_t max) { if (pos + 2 >= max) { craftedFile(); return 0; } else { uint8_t b1 = arr[pos]; uint8_t b2 = arr[pos + 1]; return (swapBytes) ? ((b2 << 8) | b1) : ((b1 << 8) | b2); } } // Read a 32-bit word static uint32_t read32(uint8_t* arr, size_t pos, int swapBytes, size_t max) { if (pos + 4 >= max) { craftedFile(); return 0; } else { if (!swapBytes) { return (arr[pos] << 24) | (arr[pos + 1] << 16) | (arr[pos + 2] << 8) | arr[pos + 3]; } return arr[pos] | (arr[pos + 1] << 8) | (arr[pos + 2] << 16) | (arr[pos + 3] << 24); } } static int read_tag(uint8_t* arr, int pos, int swapBytes, void* dest, size_t max) { // Format should be 5 over here (rational) uint32_t format = read16(arr, pos + 2, swapBytes, max); // Components should be 1 uint32_t components = read32(arr, pos + 4, swapBytes, max); // Points to the value uint32_t offset; // sanity if (components != 1) return 0; if (format == 3) offset = pos + 8; else offset = read32(arr, pos + 8, swapBytes, max); switch (format) { case 5: // Rational { double num = read32(arr, offset, swapBytes, max); double den = read32(arr, offset + 4, swapBytes, max); *(double *) dest = num / den; } break; case 3: // uint 16 *(int*) dest = read16(arr, offset, swapBytes, max); break; default: return 0; } return 1; } // Handler for EXIF data static cmsBool HandleEXIF(struct jpeg_decompress_struct* cinfo) { jpeg_saved_marker_ptr ptr; uint32_t ifd_ofs; int pos = 0, swapBytes = 0; uint32_t i, numEntries; double XRes = -1, YRes = -1; int Unit = 2; // Inches for (ptr = cinfo ->marker_list; ptr; ptr = ptr ->next) { if ((ptr ->marker == JPEG_APP0+1) && ptr ->data_length > 6) { JOCTET* data = ptr -> data; size_t max = ptr->data_length; if (memcmp(data, "Exif\0\0", 6) == 0) { data += 6; // Skip EXIF marker // 8 byte TIFF header // first two determine byte order pos = 0; if (read16(data, pos, 0, max) == INTEL_BYTE_ORDER) { swapBytes = 1; } pos += 2; // next two bytes are always 0x002A (TIFF version) pos += 2; // offset to Image File Directory (includes the previous 8 bytes) ifd_ofs = read32(data, pos, swapBytes, max); // Search the directory for resolution tags numEntries = read16(data, ifd_ofs, swapBytes, max); for (i=0; i < numEntries; i++) { uint32_t entryOffset = ifd_ofs + 2 + (12 * i); uint32_t tag = read16(data, entryOffset, swapBytes, max); switch (tag) { case RESOLUTION_UNIT: if (!read_tag(data, entryOffset, swapBytes, &Unit, max)) return FALSE; break; case XRESOLUTION: if (!read_tag(data, entryOffset, swapBytes, &XRes, max)) return FALSE; break; case YRESOLUTION: if (!read_tag(data, entryOffset, swapBytes, &YRes, max)) return FALSE; break; default:; } } // Proceed if all found if (XRes != -1 && YRes != -1) { // 1 = None // 2 = inches // 3 = cm switch (Unit) { case 2: cinfo ->X_density = (UINT16) floor(XRes + 0.5); cinfo ->Y_density = (UINT16) floor(YRes + 0.5); break; case 1: cinfo ->X_density = (UINT16) floor(XRes * 2.54 + 0.5); cinfo ->Y_density = (UINT16) floor(YRes * 2.54 + 0.5); break; default: return FALSE; } cinfo ->density_unit = 1; /* 1 for dots/inch, or 2 for dots/cm.*/ } } } } return FALSE; } static cmsBool OpenInput(const char* FileName) { int m; lIsITUFax = FALSE; InFile = fopen(FileName, "rb"); if (InFile == NULL) { FatalError("Cannot open '%s'", FileName); } // Now we can initialize the JPEG decompression object. Decompressor.err = jpeg_std_error(&ErrorHandler.pub); ErrorHandler.pub.error_exit = my_error_exit; ErrorHandler.pub.output_message = my_error_exit; jpeg_create_decompress(&Decompressor); jpeg_stdio_src(&Decompressor, InFile); for (m = 0; m < 16; m++) jpeg_save_markers(&Decompressor, JPEG_APP0 + m, 0xFFFF); // setup_read_icc_profile(&Decompressor); fseek(InFile, 0, SEEK_SET); jpeg_read_header(&Decompressor, TRUE); return TRUE; } static cmsBool OpenOutput(const char* FileName) { OutFile = fopen(FileName, "wb"); if (OutFile == NULL) { FatalError("Cannot create '%s'", FileName); } Compressor.err = jpeg_std_error(&ErrorHandler.pub); ErrorHandler.pub.error_exit = my_error_exit; ErrorHandler.pub.output_message = my_error_exit; Compressor.input_components = Compressor.num_components = 4; jpeg_create_compress(&Compressor); jpeg_stdio_dest(&Compressor, OutFile); return TRUE; } static cmsBool Done(void) { jpeg_destroy_decompress(&Decompressor); jpeg_destroy_compress(&Compressor); return fclose(InFile) + fclose(OutFile); } // Build up the pixeltype descriptor static cmsUInt32Number GetInputPixelType(void) { int space, bps, extra, ColorChannels, Flavor; lIsITUFax = IsITUFax(Decompressor.marker_list); lIsPhotoshopApp13 = HandlePhotoshopAPP13(Decompressor.marker_list); lIsEXIF = HandleEXIF(&Decompressor); ColorChannels = Decompressor.num_components; extra = 0; // Alpha = None bps = 1; // 8 bits Flavor = 0; // Vanilla if (lIsITUFax) { space = PT_Lab; Decompressor.out_color_space = JCS_YCbCr; // Fake to don't touch } else switch (Decompressor.jpeg_color_space) { case JCS_GRAYSCALE: // monochrome space = PT_GRAY; Decompressor.out_color_space = JCS_GRAYSCALE; break; case JCS_RGB: // red/green/blue space = PT_RGB; Decompressor.out_color_space = JCS_RGB; break; case JCS_YCbCr: // Y/Cb/Cr (also known as YUV) space = PT_RGB; // Let IJG code to do the conversion Decompressor.out_color_space = JCS_RGB; break; case JCS_CMYK: // C/M/Y/K space = PT_CMYK; Decompressor.out_color_space = JCS_CMYK; if (Decompressor.saw_Adobe_marker) // Adobe keeps CMYK inverted, so change flavor Flavor = 1; // from vanilla to chocolate break; case JCS_YCCK: // Y/Cb/Cr/K space = PT_CMYK; Decompressor.out_color_space = JCS_CMYK; if (Decompressor.saw_Adobe_marker) // ditto Flavor = 1; break; default: FatalError("Unsupported color space (0x%x)", Decompressor.jpeg_color_space); return 0; } return (EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|COLORSPACE_SH(space)|FLAVOR_SH(Flavor)); } // Rearrange pixel type to build output descriptor static cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutColorSpace) { int IsPlanar = T_PLANAR(dwInput); int Channels = 0; int Flavor = 0; switch (OutColorSpace) { case PT_GRAY: Channels = 1; break; case PT_RGB: case PT_CMY: case PT_Lab: case PT_YUV: case PT_YCbCr: Channels = 3; break; case PT_CMYK: if (Compressor.write_Adobe_marker) // Adobe keeps CMYK inverted, so change flavor to chocolate Flavor = 1; Channels = 4; break; default: FatalError("Unsupported output color space"); } return (COLORSPACE_SH(OutColorSpace)|PLANAR_SH(IsPlanar)|CHANNELS_SH(Channels)|BYTES_SH(1)|FLAVOR_SH(Flavor)); } // Equivalence between ICC color spaces and lcms color spaces static int GetProfileColorSpace(cmsHPROFILE hProfile) { cmsColorSpaceSignature ProfileSpace = cmsGetColorSpace(hProfile); return _cmsLCMScolorSpace(ProfileSpace); } static int GetDevicelinkColorSpace(cmsHPROFILE hProfile) { cmsColorSpaceSignature ProfileSpace = cmsGetPCS(hProfile); return _cmsLCMScolorSpace(ProfileSpace); } // From TRANSUPP static void jcopy_markers_execute(j_decompress_ptr srcinfo, j_compress_ptr dstinfo) { jpeg_saved_marker_ptr marker; /* In the current implementation, we don't actually need to examine the * option flag here; we just copy everything that got saved. * But to avoid confusion, we do not output JFIF and Adobe APP14 markers * if the encoder library already wrote one. */ for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { if (dstinfo->write_JFIF_header && marker->marker == JPEG_APP0 && marker->data_length >= 5 && GETJOCTET(marker->data[0]) == 0x4A && GETJOCTET(marker->data[1]) == 0x46 && GETJOCTET(marker->data[2]) == 0x49 && GETJOCTET(marker->data[3]) == 0x46 && GETJOCTET(marker->data[4]) == 0) continue; /* reject duplicate JFIF */ if (dstinfo->write_Adobe_marker && marker->marker == JPEG_APP0+14 && marker->data_length >= 5 && GETJOCTET(marker->data[0]) == 0x41 && GETJOCTET(marker->data[1]) == 0x64 && GETJOCTET(marker->data[2]) == 0x6F && GETJOCTET(marker->data[3]) == 0x62 && GETJOCTET(marker->data[4]) == 0x65) continue; /* reject duplicate Adobe */ jpeg_write_marker(dstinfo, marker->marker, marker->data, marker->data_length); } } static void WriteOutputFields(int OutputColorSpace) { J_COLOR_SPACE in_space, jpeg_space; int components; switch (OutputColorSpace) { case PT_GRAY: in_space = jpeg_space = JCS_GRAYSCALE; components = 1; break; case PT_RGB: in_space = JCS_RGB; jpeg_space = JCS_YCbCr; components = 3; break; // red/green/blue case PT_YCbCr: in_space = jpeg_space = JCS_YCbCr; components = 3; break; // Y/Cb/Cr (also known as YUV) case PT_CMYK: in_space = JCS_CMYK; jpeg_space = JCS_YCCK; components = 4; break; // C/M/Y/components case PT_Lab: in_space = jpeg_space = JCS_YCbCr; components = 3; break; // Fake to don't touch default: FatalError("Unsupported output color space"); return; } if (jpegQuality >= 100) { // avoid destructive conversion when asking for lossless compression jpeg_space = in_space; } Compressor.in_color_space = in_space; Compressor.jpeg_color_space = jpeg_space; Compressor.input_components = Compressor.num_components = components; jpeg_set_defaults(&Compressor); jpeg_set_colorspace(&Compressor, jpeg_space); // Make sure to pass resolution through if (OutputColorSpace == PT_CMYK) Compressor.write_JFIF_header = 1; // Avoid subsampling on high quality factor jpeg_set_quality(&Compressor, jpegQuality, 1); if (jpegQuality >= 70) { int i; for(i=0; i < Compressor.num_components; i++) { Compressor.comp_info[i].h_samp_factor = 1; Compressor.comp_info[i].v_samp_factor = 1; } } } static void DoEmbedProfile(const char* ProfileFile) { FILE* f; size_t size, EmbedLen; cmsUInt8Number* EmbedBuffer; f = fopen(ProfileFile, "rb"); if (f == NULL) return; size = cmsfilelength(f); EmbedBuffer = (cmsUInt8Number*) malloc(size + 1); EmbedLen = fread(EmbedBuffer, 1, size, f); fclose(f); EmbedBuffer[EmbedLen] = 0; write_icc_profile (&Compressor, EmbedBuffer, (unsigned int) EmbedLen); free(EmbedBuffer); } static int DoTransform(cmsHTRANSFORM hXForm, int OutputColorSpace) { JSAMPROW ScanLineIn; JSAMPROW ScanLineOut; //Preserve resolution values from the original // (Thanks to Robert Bergs for finding out this bug) Compressor.density_unit = Decompressor.density_unit; Compressor.X_density = Decompressor.X_density; Compressor.Y_density = Decompressor.Y_density; // Compressor.write_JFIF_header = 1; jpeg_start_decompress(&Decompressor); jpeg_start_compress(&Compressor, TRUE); if (OutputColorSpace == PT_Lab) SetITUFax(&Compressor); // Embed the profile if needed if (EmbedProfile && cOutProf) DoEmbedProfile(cOutProf); ScanLineIn = (JSAMPROW) malloc((size_t) Decompressor.output_width * Decompressor.num_components); ScanLineOut = (JSAMPROW) malloc((size_t) Compressor.image_width * Compressor.num_components); while (Decompressor.output_scanline < Decompressor.output_height) { jpeg_read_scanlines(&Decompressor, &ScanLineIn, 1); cmsDoTransform(hXForm, ScanLineIn, ScanLineOut, Decompressor.output_width); jpeg_write_scanlines(&Compressor, &ScanLineOut, 1); } free(ScanLineIn); free(ScanLineOut); jpeg_finish_decompress(&Decompressor); jpeg_finish_compress(&Compressor); return TRUE; } // Transform one image static int TransformImage(char *cDefInpProf, char *cOutputProf) { cmsHPROFILE hIn, hOut, hProof; cmsHTRANSFORM xform; cmsUInt32Number wInput, wOutput; int OutputColorSpace; cmsUInt32Number dwFlags = 0; cmsUInt32Number EmbedLen; cmsUInt8Number* EmbedBuffer; cmsSetAdaptationState(ObserverAdaptationState); if (BlackPointCompensation) { dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; default:; } if (GamutCheck) { dwFlags |= cmsFLAGS_GAMUTCHECK; cmsSetAlarmCodes(Alarm); } // Take input color space wInput = GetInputPixelType(); if (lIsDeviceLink) { hIn = cmsOpenProfileFromFile(cDefInpProf, "r"); hOut = NULL; hProof = NULL; } else { if (!IgnoreEmbedded && read_icc_profile(&Decompressor, &EmbedBuffer, &EmbedLen)) { hIn = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); if (Verbose) { fprintf(stdout, " (Embedded profile found)\n"); PrintProfileInformation(hIn); fflush(stdout); } if (hIn != NULL && SaveEmbedded != NULL) SaveMemoryBlock(EmbedBuffer, EmbedLen, SaveEmbedded); free(EmbedBuffer); } else { // Default for ITU/Fax if (cDefInpProf == NULL && T_COLORSPACE(wInput) == PT_Lab) cDefInpProf = "*Lab"; if (cDefInpProf != NULL && cmsstrcasecmp(cDefInpProf, "*lab") == 0) hIn = CreateITU2PCS_ICC(); else hIn = OpenStockProfile(0, cDefInpProf); } if (cOutputProf != NULL && cmsstrcasecmp(cOutputProf, "*lab") == 0) hOut = CreatePCS2ITU_ICC(); else hOut = OpenStockProfile(0, cOutputProf); hProof = NULL; if (cProofing != NULL) { hProof = OpenStockProfile(0, cProofing); if (hProof == NULL) { FatalError("Proofing profile couldn't be read."); } dwFlags |= cmsFLAGS_SOFTPROOFING; } } if (!hIn) FatalError("Input profile couldn't be read."); if (!lIsDeviceLink && !hOut) FatalError("Output profile couldn't be read."); // Assure both, input profile and input JPEG are on same colorspace if (cmsGetColorSpace(hIn) != _cmsICCcolorSpace(T_COLORSPACE(wInput))) FatalError("Input profile is not operating in proper color space"); // Output colorspace is given by output profile if (lIsDeviceLink) { OutputColorSpace = GetDevicelinkColorSpace(hIn); } else { OutputColorSpace = GetProfileColorSpace(hOut); } jpeg_copy_critical_parameters(&Decompressor, &Compressor); WriteOutputFields(OutputColorSpace); wOutput = ComputeOutputFormatDescriptor(wInput, OutputColorSpace); xform = cmsCreateProofingTransform(hIn, wInput, hOut, wOutput, hProof, Intent, ProofingIntent, dwFlags); if (xform == NULL) FatalError("Cannot transform by using the profiles"); DoTransform(xform, OutputColorSpace); jcopy_markers_execute(&Decompressor, &Compressor); cmsDeleteTransform(xform); cmsCloseProfile(hIn); cmsCloseProfile(hOut); if (hProof) cmsCloseProfile(hProof); return 1; } static void Help(int level) { UTILS_UNUSED_PARAMETER(level); fprintf(stderr, "Little CMS ICC profile applier for JPEG - v3.5 [LittleCMS %2.2f]\n\n", cmsGetEncodedCMMversion() / 1000.0); fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n"); fprintf(stderr, "usage: jpgicc [flags] input.jpg output.jpg\n"); fprintf(stderr, "\nflags:\n\n"); fprintf(stderr, "-v - Verbose\n"); fprintf(stderr, "-i - Input profile (defaults to sRGB)\n"); fprintf(stderr, "-o - Output profile (defaults to sRGB)\n"); PrintBuiltins(); PrintRenderingIntents(); fprintf(stderr, "-b - Black point compensation\n"); fprintf(stderr, "-d<0..1> - Observer adaptation state (abs.col. only)\n"); fprintf(stderr, "-n - Ignore embedded profile\n"); fprintf(stderr, "-e - Embed destination profile\n"); fprintf(stderr, "-s - Save embedded profile as \n"); fprintf(stderr, "\n"); fprintf(stderr, "-c<0,1,2,3> - Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]\n"); fprintf(stderr, "\n"); fprintf(stderr, "-p - Soft proof profile\n"); fprintf(stderr, "-m<0,1,2,3> - SoftProof intent\n"); fprintf(stderr, "-g - Marks out-of-gamut colors on softproof\n"); fprintf(stderr, "-!,, - Out-of-gamut marker channel values\n"); fprintf(stderr, "\n"); fprintf(stderr, "-q<0..100> - Output JPEG quality\n"); fprintf(stderr, "Examples:\n\n" "To color correct from scanner to sRGB:\n" "\tjpgicc -iscanner.icm in.jpg out.jpg\n" "To convert from monitor1 to monitor2:\n" "\tjpgicc -imon1.icm -omon2.icm in.jpg out.jpg\n" "To make a CMYK separation:\n" "\tjpgicc -oprinter.icm inrgb.jpg outcmyk.jpg\n" "To recover sRGB from a CMYK separation:\n" "\tjpgicc -iprinter.icm incmyk.jpg outrgb.jpg\n" "To convert from CIELab ITU/Fax JPEG to sRGB\n" "\tjpgicc in.jpg out.jpg\n\n"); fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" "color engine. Both lcms and this program are open source.\n" "You can obtain both in source code at https://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s=xgetopt(argc,argv,"bBnNvVGgh:H:i:I:o:O:P:p:t:T:c:C:Q:q:M:m:L:l:eEs:S:!:D:d:-:")) != EOF) { switch (s) { case '-': if (strcmp(xoptarg, "help") == 0) { Help(0); } else { FatalError("Unknown option - run without args to see valid ones.\n"); } break; case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'd': case 'D': ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) FatalError("Adaptation state should be 0..1"); break; case 'v': case 'V': Verbose = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("Device-link already specified"); cInpProf = xoptarg; break; case 'o': case 'O': if (lIsDeviceLink) FatalError("Device-link already specified"); cOutProf = xoptarg; break; case 'l': case 'L': if (cInpProf != NULL || cOutProf != NULL) FatalError("input/output profiles already specified"); cInpProf = xoptarg; lIsDeviceLink = TRUE; break; case 'p': case 'P': cProofing = xoptarg; break; case 't': case 'T': Intent = atoi(xoptarg); break; case 'N': case 'n': IgnoreEmbedded = TRUE; break; case 'e': case 'E': EmbedProfile = TRUE; break; case 'g': case 'G': GamutCheck = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 2) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'H': case 'h': { int a = atoi(xoptarg); Help(a); } break; case 'q': case 'Q': jpegQuality = atoi(xoptarg); if (jpegQuality > 100) jpegQuality = 100; if (jpegQuality < 0) jpegQuality = 0; break; case 'm': case 'M': ProofingIntent = atoi(xoptarg); break; case 's': case 'S': SaveEmbedded = xoptarg; break; case '!': if (sscanf(xoptarg, "%hu,%hu,%hu", &Alarm[0], &Alarm[1], &Alarm[2]) == 3) { int i; for (i=0; i < 3; i++) { Alarm[i] = (Alarm[i] << 8) | Alarm[i]; } } break; default: FatalError("Unknown option - run without args to see valid ones"); } } } int main(int argc, char* argv[]) { InitUtils("jpgicc"); HandleSwitches(argc, argv); if ((argc - xoptind) != 2) { Help(0); } OpenInput(argv[xoptind]); OpenOutput(argv[xoptind+1]); TransformImage(cInpProf, cOutProf); if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } Done(); return 0; } lcms2-2.19.1/utils/jpgicc/Makefile.am0000644000175000017500000000121715176573557016317 0ustar martimarti# # Makefile for building jpegicc # Written by Bob Friesenhahn, June 2003 # Bugs introduced by Marti Maria on October 2004 # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common if HasJPEG bin_PROGRAMS = jpgicc else bin_PROGRAMS = endif jpgicc_LDADD = $(top_builddir)/src/liblcms2.la @JPEGICC_DEPLIBS@ jpgicc_LDFLAGS = @LDFLAGS@ jpgicc_SOURCES = jpgicc.c iccjpeg.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = jpgicc.1 EXTRA_DIST = iccjpeg.h $(man_MANS) lcms2-2.19.1/utils/jpgicc/Makefile.in0000644000175000017500000005513415176574547016337 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building jpegicc # Written by Bob Friesenhahn, June 2003 # Bugs introduced by Marti Maria on October 2004 VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HasJPEG_TRUE@bin_PROGRAMS = jpgicc$(EXEEXT) subdir = utils/jpgicc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_jpgicc_OBJECTS = jpgicc.$(OBJEXT) iccjpeg.$(OBJEXT) \ ../common/xgetopt.$(OBJEXT) ../common/vprf.$(OBJEXT) jpgicc_OBJECTS = $(am_jpgicc_OBJECTS) jpgicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = jpgicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(jpgicc_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = am__maybe_remake_depfiles = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(jpgicc_SOURCES) DIST_SOURCES = $(jpgicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common jpgicc_LDADD = $(top_builddir)/src/liblcms2.la @JPEGICC_DEPLIBS@ jpgicc_LDFLAGS = @LDFLAGS@ jpgicc_SOURCES = jpgicc.c iccjpeg.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = jpgicc.1 EXTRA_DIST = iccjpeg.h $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/jpgicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/jpgicc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: $(am__rm_f) $(bin_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) ../common/$(am__dirstamp): @$(MKDIR_P) ../common @: >>../common/$(am__dirstamp) ../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) ../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) jpgicc$(EXEEXT): $(jpgicc_OBJECTS) $(jpgicc_DEPENDENCIES) $(EXTRA_jpgicc_DEPENDENCIES) @rm -f jpgicc$(EXEEXT) $(AM_V_CCLD)$(jpgicc_LINK) $(jpgicc_OBJECTS) $(jpgicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../common/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) -$(am__rm_f) ../common/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/utils/linkicc/0000755000175000017500000000000015176574562014434 5ustar martimartilcms2-2.19.1/utils/linkicc/linkicc.10000644000175000017500000000644515176573557016146 0ustar martimarti.\"Shiju P. Nair September 30, 2004 .\"Thomas Weber April 23, 2014 .TH LINKICC 1 "September 30, 2004" .SH NAME linkicc - little cms device link generator. .SH SYNOPSIS .B linkicc .RI [ options ] " profiles" .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B linkicc is a little cms device link generator. .P Links two or more profiles into a single devicelink profile. Colorspaces must be paired except Lab/XYZ, that can be interchanged. .SH OPTIONS .TP .BR \-a\ NUM Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 1.0]. .TP .B \-b Black point compensation. .TP .BI \-c\ precision Precision (0=LowRes, 1=Normal, 2=Hi-res) [defaults to 1]. .TP .BI \-d\ description Description text (quotes can be used). .TP .BI \-h\ NUM Show summary of options and examples (0=help, 1=Built-in profiles, 2=Examples, 3=Contact information) .TP .BI \-k\ inklimit Ink-limiting in % (CMYK only), (0..400.0, float value) [default 400.0]. .TP .B \-l Use linearization curves (may affect accuracy). .TP .BI \-n\ gridpoints Alternate way to set precision, number of CLUT points. .TP .BI \-o\ profile Output devicelink profile [defaults to 'devicelink.icm']. .TP .BI \-r\ profileversion Profile version. (CAUTION: may change the profile implementation), (2.0..4.3, float value) [defaults to 4.3]. .TP .BI \-t\ NUM Rendering intent .nf .RS 0=Perceptual [default] 1=Relative colorimetric 2=Saturation 3=Absolute colorimetric 10=Perceptual preserving black ink 11=Relative colorimetric preserving black ink 12=Saturation preserving black ink 13=Perceptual preserving black plane 14=Relative colorimetric preserving black plane 15=Saturation preserving black plane .RE .fi .TP .BI \-v\ verbosity Verbosity level, (0=None, 1=Normal, 2=High, 3=Very High) [defaults to 0]. .TP .B \-x Creatively, guess deviceclass of resulting profile. .TP .BI \-y\ copyright Copyright notice (quotes can be used) ["No copyright, use freely"]. .TP .B \-8 Creates 8-bit devicelink. .SH BUILT-IN PROFILES .nf *Lab2 -- D50-based v2 CIEL*a*b *Lab4 -- D50-based v4 CIEL*a*b *Lab -- D50-based v4 CIEL*a*b *XYZ -- CIE XYZ (PCS) *sRGB -- sRGB color space *Gray22 - Monochrome of Gamma 2.2 *Gray30 - Monochrome of Gamma 3.0 *null - Monochrome black for all input *Lin2222- CMYK linearization of gamma 2.2 on each channel .fi .SH EXAMPLES .nf To create 'devicelink.icm' from a.icc to b.icc: linkicc a.icc b.icc To create 'out.icc' from sRGB to cmyk.icc: linkicc -o out.icc *sRGB cmyk.icc To create a sRGB input profile working in Lab: linkicc -x -o sRGBLab.icc *sRGB *Lab To create a XYZ -> sRGB output profile: linkicc -x -o sRGBLab.icc *XYZ *sRGB To create a abstract profile doing softproof for cmyk.icc: linkicc -t1 -x -o softproof.icc *Lab cmyk.icc cmyk.icc *Lab To create a 'grayer' sRGB input profile: linkicc -x -o grayer.icc *sRGB gray.icc gray.icc *Lab To embed ink limiting into a cmyk output profile: linkicc -x -o cmyklimited.icc -k 250 cmyk.icc *Lab .fi .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpgicc (1), .BR psicc (1), .BR tificc (1), .BR transicc (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.19.1/utils/linkicc/meson.build0000644000175000017500000000034515176573557016603 0ustar martimartilinkicc_sources = files( 'linkicc.c', ) linkicc_exe = executable( 'linkicc', linkicc_sources, dependencies: [liblcms2_dep, common_dep], install: true, ) linkicc_man = files( 'linkicc.1', ) install_man(linkicc_man) lcms2-2.19.1/utils/linkicc/linkicc.c0000644000175000017500000002637715176573557016236 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- #include "utils.h" // --------------------------------------------------------------------------------- static char* Description = "Devicelink profile"; static char* Copyright = "No copyright, use freely"; static int Intent = INTENT_PERCEPTUAL; static char* cOutProf = "devicelink.icc"; static int PrecalcMode = 1; static int NumOfGridPoints = 0; static cmsFloat64Number ObserverAdaptationState = 1.0; // According ICC 4.2 this is the default static cmsBool BlackPointCompensation = FALSE; static cmsFloat64Number InkLimit = 400; static cmsBool lUse8bits = FALSE; static cmsBool TagResult = FALSE; static cmsBool KeepLinearization = FALSE; static cmsFloat64Number Version = 4.3; // The manual static int Help(int level) { UTILS_UNUSED_PARAMETER(level); fprintf(stderr, "Little CMS ICC device link generator - v3.3 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n\n"); fprintf(stderr, "\nlinkicc: Links profiles into a single devicelink.\n"); fprintf(stderr, "\n"); fprintf(stderr, "usage: linkicc [flags] \n\n"); fprintf(stderr, "flags:\n\n"); fprintf(stderr, "-o - Output devicelink profile. [defaults to 'devicelink.icc']\n"); PrintRenderingIntents(); fprintf(stderr, "-c<0,1,2> - Precision (0=LowRes, 1=Normal, 2=Hi-res) [defaults to 1]\n"); fprintf(stderr, "-n - Alternate way to set precision, number of CLUT points\n"); fprintf(stderr, "-d - description text (quotes can be used)\n"); fprintf(stderr, "-y - copyright notice (quotes can be used)\n"); fprintf(stderr, "\n-k<0..400> - Ink-limiting in %% (CMYK only)\n"); fprintf(stderr, "-8 - Creates 8-bit devicelink\n"); fprintf(stderr, "-x - Creatively, guess deviceclass of resulting profile.\n"); fprintf(stderr, "-b - Black point compensation\n"); fprintf(stderr, "-a<0..1> - Observer adaptation state (abs.col. only)\n\n"); fprintf(stderr, "-l - Use linearization curves (may affect accuracy)\n"); fprintf(stderr, "-r - Profile version. (CAUTION: may change the profile implementation)\n"); fprintf(stderr, "\n"); fprintf(stderr, "Colorspaces must be paired except Lab/XYZ, that can be interchanged.\n\n"); PrintBuiltins(); fprintf(stderr, "\nExamples:\n\n" "To create 'devicelink.icm' from a.icc to b.icc:\n" "\tlinkicc a.icc b.icc\n\n" "To create 'out.icc' from sRGB to cmyk.icc:\n" "\tlinkicc -o out.icc *sRGB cmyk.icc\n\n" "To create a sRGB input profile working in Lab:\n" "\tlinkicc -x -o sRGBLab.icc *sRGB *Lab\n\n" "To create a XYZ -> sRGB output profile:\n" "\tlinkicc -x -o sRGBLab.icc *XYZ *sRGB\n\n" "To create a abstract profile doing softproof for cmyk.icc:\n" "\tlinkicc -t1 -x -o softproof.icc *Lab cmyk.icc cmyk.icc *Lab\n\n" "To create a 'grayer' sRGB input profile:\n" "\tlinkicc -x -o grayer.icc *sRGB gray.icc gray.icc *Lab\n\n" "To embed ink limiting into a cmyk output profile:\n" "\tlinkicc -x -o cmyklimited.icc -k 250 cmyk.icc *Lab\n\n"); fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" "color engine. Both lcms and this program are open source.\n" "You can obtain both in source code at https://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s = xgetopt(argc,argv,"a:A:BbC:c:D:d:h:H:k:K:lLn:N:O:o:r:R:T:t:V:v:xX8y:Y:-:")) != EOF) { switch (s) { case '-': if (strcmp(xoptarg, "help") == 0) { Help(0); } else { FatalError("Unknown option - run without args to see valid ones.\n"); } break; case 'a': case 'A': ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) FatalError("Adaptation state should be 0..1"); break; case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 2) { FatalError("Unknown precalc mode '%d'", PrecalcMode); } break; case 'd': case 'D': // Doing that is correct and safe: Description points to memory allocated in the command line. // same for Copyright and output devicelink. Description = xoptarg; break; case 'h': case 'H': Help(atoi(xoptarg)); return; case 'k': case 'K': InkLimit = atof(xoptarg); if (InkLimit < 0.0 || InkLimit > 400.0) { FatalError("Ink limit must be 0%%..400%%"); } break; case 'l': case 'L': KeepLinearization = TRUE; break; case 'n': case 'N': if (PrecalcMode != 1) { FatalError("Precalc mode already specified"); } NumOfGridPoints = atoi(xoptarg); break; case 'o': case 'O': cOutProf = xoptarg; break; case 'r': case 'R': Version = atof(xoptarg); if (Version < 2.0 || Version > 4.3) { fprintf(stderr, "WARNING: lcms was not aware of this version, tag types may be wrong!\n"); } break; case 't': case 'T': Intent = atoi(xoptarg); // Will be validated latter on break; case 'V': case 'v': Verbose = atoi(xoptarg); if (Verbose < 0 || Verbose > 3) { FatalError("Unknown verbosity level '%d'", Verbose); } break; case '8': lUse8bits = TRUE; break; case 'y': case 'Y': Copyright = xoptarg; break; case 'x': case 'X': TagResult = TRUE; break; default: FatalError("Unknown option - run without args to see valid ones.\n"); } } } // Set the copyright and description static cmsBool SetTextTags(cmsHPROFILE hProfile) { cmsMLU *DescriptionMLU, *CopyrightMLU; cmsBool rc = FALSE; cmsContext ContextID = cmsGetProfileContextID(hProfile); DescriptionMLU = cmsMLUalloc(ContextID, 1); CopyrightMLU = cmsMLUalloc(ContextID, 1); if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; if (!cmsMLUsetASCII(DescriptionMLU, "en", "US", Description)) goto Error; if (!cmsMLUsetASCII(CopyrightMLU, "en", "US", Copyright)) goto Error; if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; rc = TRUE; Error: if (DescriptionMLU) cmsMLUfree(DescriptionMLU); if (CopyrightMLU) cmsMLUfree(CopyrightMLU); return rc; } int main(int argc, char *argv[]) { int i, nargs, rc; cmsHPROFILE Profiles[257]; cmsHPROFILE hProfile; cmsUInt32Number dwFlags; cmsHTRANSFORM hTransform = NULL; // Initialize InitUtils("linkicc"); rc = 0; // Get the options HandleSwitches(argc, argv); // How many profiles to link? nargs = (argc - xoptind); if (nargs < 1) return Help(0); if (nargs > 255) { FatalError("Holy profile! what are you trying to do with so many profiles!?"); goto Cleanup; } // Open all profiles memset(Profiles, 0, sizeof(Profiles)); for (i=0; i < nargs; i++) { Profiles[i] = OpenStockProfile(0, argv[i + xoptind]); if (Profiles[i] == NULL) goto Cleanup; if (Verbose >= 1) { PrintProfileInformation(Profiles[i]); } } // Ink limiting if (InkLimit != 400.0) { cmsColorSpaceSignature EndingColorSpace = cmsGetColorSpace(Profiles[nargs-1]); Profiles[nargs++] = cmsCreateInkLimitingDeviceLink(EndingColorSpace, InkLimit); } // Set the flags dwFlags = cmsFLAGS_KEEP_SEQUENCE; switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 1: if (NumOfGridPoints > 0) dwFlags |= cmsFLAGS_GRIDPOINTS(NumOfGridPoints); break; default: { FatalError("Unknown precalculation mode '%d'", PrecalcMode); goto Cleanup; } } if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; if (TagResult) dwFlags |= cmsFLAGS_GUESSDEVICECLASS; if (KeepLinearization) dwFlags |= cmsFLAGS_CLUT_PRE_LINEARIZATION|cmsFLAGS_CLUT_POST_LINEARIZATION; if (lUse8bits) dwFlags |= cmsFLAGS_8BITS_DEVICELINK; cmsSetAdaptationState(ObserverAdaptationState); // Create the color transform. Specify 0 for the format is safe as the transform // is intended to be used only for the devicelink. hTransform = cmsCreateMultiprofileTransform(Profiles, nargs, 0, 0, Intent, dwFlags|cmsFLAGS_NOOPTIMIZE); if (hTransform == NULL) { FatalError("Transform creation failed"); goto Cleanup; } hProfile = cmsTransform2DeviceLink(hTransform, Version, dwFlags); if (hProfile == NULL) { FatalError("Devicelink creation failed"); goto Cleanup; } SetTextTags(hProfile); cmsSetHeaderRenderingIntent(hProfile, Intent); if (cmsSaveProfileToFile(hProfile, cOutProf)) { if (Verbose > 0) fprintf(stderr, "Ok"); } else FatalError("Error saving file!"); cmsCloseProfile(hProfile); Cleanup: if (hTransform != NULL) cmsDeleteTransform(hTransform); for (i=0; i < nargs; i++) { if (Profiles[i] != NULL) cmsCloseProfile(Profiles[i]); } return rc; } lcms2-2.19.1/utils/linkicc/Makefile.am0000644000175000017500000000113115176573557016467 0ustar martimarti# # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = linkicc linkicc_LDADD = $(top_builddir)/src/liblcms2.la linkicc_LDFLAGS = @LDFLAGS@ linkicc_SOURCES = linkicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = linkicc.1 EXTRA_DIST = $(man_MANS) lcms2-2.19.1/utils/linkicc/Makefile.in0000644000175000017500000005507515176574547016520 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = linkicc$(EXEEXT) subdir = utils/linkicc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_linkicc_OBJECTS = linkicc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ ../common/vprf.$(OBJEXT) linkicc_OBJECTS = $(am_linkicc_OBJECTS) linkicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = linkicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(linkicc_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = am__maybe_remake_depfiles = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(linkicc_SOURCES) DIST_SOURCES = $(linkicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common linkicc_LDADD = $(top_builddir)/src/liblcms2.la linkicc_LDFLAGS = @LDFLAGS@ linkicc_SOURCES = linkicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = linkicc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/linkicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/linkicc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: $(am__rm_f) $(bin_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) ../common/$(am__dirstamp): @$(MKDIR_P) ../common @: >>../common/$(am__dirstamp) ../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) ../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) linkicc$(EXEEXT): $(linkicc_OBJECTS) $(linkicc_DEPENDENCIES) $(EXTRA_linkicc_DEPENDENCIES) @rm -f linkicc$(EXEEXT) $(AM_V_CCLD)$(linkicc_LINK) $(linkicc_OBJECTS) $(linkicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../common/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) -$(am__rm_f) ../common/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/utils/matlab/0000755000175000017500000000000015176573557014263 5ustar martimartilcms2-2.19.1/utils/matlab/howto.txt0000644000175000017500000000005315176573557016162 0ustar martimarti To compile for matlab use: mex @lcms_rsp lcms2-2.19.1/utils/matlab/icctrans.c0000644000175000017500000004016115176573557016237 0ustar martimarti// // Little cms // Copyright (C) 1998-2010 Marti Maria, Ignacio Ruiz de Conejo // // 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. #include "mex.h" #include "lcms2.h" #include "string.h" #include "stdarg.h" // xgetopt() interface ----------------------------------------------------- static int xoptind; static char *xoptarg; static int xopterr; static char *letP; static char SW = '-'; // ------------------------------------------------------------------------ static int Verbose ; // Print some statistics static char *cInProf; // Input profile static char *cOutProf; // Output profile static char *cProofing; // Softproofing profile static int Intent; // Rendering Intent static int ProofingIntent; // RI for proof static int PrecalcMode; // 0 = Not, 1=Normal, 2=Accurate, 3=Fast static cmsBool BlackPointCompensation; static cmsBool lIsDeviceLink; static cmsBool lMultiProfileChain; // Multiple profile chain static cmsHPROFILE hInput, hOutput, hProof; static cmsHTRANSFORM hColorTransform; static cmsHPROFILE hProfiles[255]; static int nProfiles; static cmsColorSpaceSignature InputColorSpace, OutputColorSpace; static int OutputChannels, InputChannels, nBytesDepth; // Error. Print error message and abort static cmsBool FatalError(const char *frm, ...) { va_list args; char Buffer[1024]; va_start(args, frm); vsprintf(Buffer, frm, args); mexErrMsgTxt(Buffer); va_end(args); return FALSE; } // This is the handler passed to lcms static void MatLabErrorHandler(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { mexErrMsgTxt(Text); } // // Parse the command line options, System V style. // static void xoptinit() { xoptind = 1; xopterr = 0; letP = NULL; } static int xgetopt(int argc, char *argv[], char *optionS) { unsigned char ch; char *optP; if (SW == 0) { SW = '/'; } if (argc > xoptind) { if (letP == NULL) { if ((letP = argv[xoptind]) == NULL || *(letP++) != SW) goto gopEOF; if (*letP == SW) { xoptind++; goto gopEOF; } } if (0 == (ch = *(letP++))) { xoptind++; goto gopEOF; } if (':' == ch || (optP = strchr(optionS, ch)) == NULL) goto gopError; if (':' == *(++optP)) { xoptind++; if (0 == *letP) { if (argc <= xoptind) goto gopError; letP = argv[xoptind++]; } xoptarg = letP; letP = NULL; } else { if (0 == *letP) { xoptind++; letP = NULL; } xoptarg = NULL; } return ch; } gopEOF: xoptarg = letP = NULL; return EOF; gopError: xoptarg = NULL; if (xopterr) FatalError ("get command line option"); return ('?'); } // Return Mathlab type by depth static size_t SizeOfArrayType(const mxArray *Array) { switch (mxGetClassID(Array)) { case mxINT8_CLASS: return 1; case mxUINT8_CLASS: return 1; case mxINT16_CLASS: return 2; case mxUINT16_CLASS: return 2; case mxSINGLE_CLASS: return 4; case mxDOUBLE_CLASS: return 0; // Special case -- lcms handles double as size=0 default: FatalError("Unsupported data type"); return 0; } } // Get number of pixels of input array. Supported arrays are // organized as NxMxD, being N and M the size of image and D the // number of components. static size_t GetNumberOfPixels(const mxArray* In) { int nDimensions = mxGetNumberOfDimensions(In); const int *Dimensions = mxGetDimensions(In); switch (nDimensions) { case 1: return 1; // It is just a spot color case 2: return Dimensions[0]; // A scanline case 3: return Dimensions[0]*Dimensions[1]; // A image default: FatalError("Unsupported array of %d dimensions", nDimensions); return 0; } } // Allocates the output array. Copies the input array modifying the pixel // definition to match "OutputChannels". static mxArray* AllocateOutputArray(const mxArray* In, int OutputChannels) { mxArray* Out = mxDuplicateArray(In); // Make a "deep copy" of Input array int nDimensions = mxGetNumberOfDimensions(In); const int* Dimensions = mxGetDimensions(In); int InputChannels = Dimensions[nDimensions-1]; // Modify pixel size only if needed if (InputChannels != OutputChannels) { int i, NewSize; int *ModifiedDimensions = (int*) mxMalloc(nDimensions * sizeof(int)); memmove(ModifiedDimensions, Dimensions, nDimensions * sizeof(int)); ModifiedDimensions[nDimensions - 1] = OutputChannels; switch (mxGetClassID(In)) { case mxINT8_CLASS: NewSize = sizeof(char); break; case mxUINT8_CLASS: NewSize = sizeof(unsigned char); break; case mxINT16_CLASS: NewSize = sizeof(short); break; case mxUINT16_CLASS: NewSize = sizeof(unsigned short); break; default: case mxDOUBLE_CLASS: NewSize = sizeof(double); break; } // NewSize = 1; for (i=0; i < nDimensions; i++) NewSize *= ModifiedDimensions[i]; mxSetDimensions(Out, ModifiedDimensions, nDimensions); mxFree(ModifiedDimensions); mxSetPr(Out, mxRealloc(mxGetPr(Out), NewSize)); } return Out; } // Does create a format descriptor. "Bytes" is the sizeof type in bytes // // Bytes Meaning // ------ -------- // 0 Floating point (double) // 1 8-bit samples // 2 16-bit samples static cmsUInt32Number MakeFormatDescriptor(cmsColorSpaceSignature ColorSpace, int Bytes) { int IsFloat = (Bytes == 0 || Bytes == 4) ? 1 : 0; int Channels = cmsChannelsOf(ColorSpace); return FLOAT_SH(IsFloat)|COLORSPACE_SH(_cmsLCMScolorSpace(ColorSpace))|BYTES_SH(Bytes)|CHANNELS_SH(Channels)|PLANAR_SH(1); } // Opens a profile or proper built-in static cmsHPROFILE OpenProfile(const char* File) { cmsContext ContextID = 0; if (!File) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lab2") == 0) return cmsCreateLab2ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab4") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*LabD65") == 0) { cmsCIExyY D65xyY; cmsWhitePointFromTemp( &D65xyY, 6504); return cmsCreateLab4ProfileTHR(ContextID, &D65xyY); } if (cmsstrcasecmp(File, "*XYZ") == 0) return cmsCreateXYZProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Gray22") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 2.2); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*Gray30") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 3.0); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*srgb") == 0) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*null") == 0) return cmsCreateNULLProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lin2222") == 0) { cmsToneCurve* Gamma = cmsBuildGamma(0, 2.2); cmsToneCurve* Gamma4[4]; cmsHPROFILE hProfile; Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; hProfile = cmsCreateLinearizationDeviceLink(cmsSigCmykData, Gamma4); cmsFreeToneCurve(Gamma); return hProfile; } return cmsOpenProfileFromFileTHR(ContextID, File, "r"); } static cmsUInt32Number GetFlags() { cmsUInt32Number dwFlags = 0; switch (PrecalcMode) { case 0: dwFlags = cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags = cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags = cmsFLAGS_LOWRESPRECALC; break; case 1: break; default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); } if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; return dwFlags; } // Create transforms static void OpenTransforms(int argc, char *argv[]) { cmsUInt32Number dwIn, dwOut, dwFlags; if (lMultiProfileChain) { int i; cmsHTRANSFORM hTmp; nProfiles = argc - xoptind; for (i=0; i < nProfiles; i++) { hProfiles[i] = OpenProfile(argv[i+xoptind]); } // Create a temporary devicelink hTmp = cmsCreateMultiprofileTransform(hProfiles, nProfiles, 0, 0, Intent, GetFlags()); hInput = cmsTransform2DeviceLink(hTmp, 4.2, 0); hOutput = NULL; cmsDeleteTransform(hTmp); InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetPCS(hInput); lIsDeviceLink = TRUE; } else if (lIsDeviceLink) { hInput = cmsOpenProfileFromFile(cInProf, "r"); hOutput = NULL; InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetPCS(hInput); } else { hInput = OpenProfile(cInProf); hOutput = OpenProfile(cOutProf); InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetColorSpace(hOutput); if (cmsGetDeviceClass(hInput) == cmsSigLinkClass || cmsGetDeviceClass(hOutput) == cmsSigLinkClass) FatalError("Use %cl flag for devicelink profiles!\n", SW); } /* if (Verbose) { mexPrintf("From: %s\n", cmsTakeProductName(hInput)); if (hOutput) mexPrintf("To : %s\n\n", cmsTakeProductName(hOutput)); } */ OutputChannels = cmsChannelsOf(OutputColorSpace); InputChannels = cmsChannelsOf(InputColorSpace); dwIn = MakeFormatDescriptor(InputColorSpace, nBytesDepth); dwOut = MakeFormatDescriptor(OutputColorSpace, nBytesDepth); dwFlags = GetFlags(); if (cProofing != NULL) { hProof = OpenProfile(cProofing); dwFlags |= cmsFLAGS_SOFTPROOFING; } hColorTransform = cmsCreateProofingTransform(hInput, dwIn, hOutput, dwOut, hProof, Intent, ProofingIntent, dwFlags); } static void ApplyTransforms(const mxArray *In, mxArray *Out) { double *Input = mxGetPr(In); double *Output = mxGetPr(Out); size_t nPixels = GetNumberOfPixels(In);; cmsDoTransform(hColorTransform, Input, Output, nPixels ); } static void CloseTransforms(void) { int i; if (hColorTransform) cmsDeleteTransform(hColorTransform); if (hInput) cmsCloseProfile(hInput); if (hOutput) cmsCloseProfile(hOutput); if (hProof) cmsCloseProfile(hProof); for (i=0; i < nProfiles; i++) cmsCloseProfile(hProfiles[i]); hColorTransform = NULL; hInput = NULL; hOutput = NULL; hProof = NULL; } static void HandleSwitches(int argc, char *argv[]) { int s; xoptinit(); while ((s = xgetopt(argc, argv,"C:c:VvbBI:i:O:o:T:t:L:l:r:r:P:p:Mm")) != EOF) { switch (s){ case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 3) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'v': case 'V': Verbose = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("Device-link already specified"); cInProf = xoptarg; break; case 'o': case 'O': if (lIsDeviceLink) FatalError("Device-link already specified"); cOutProf = xoptarg; break; case 't': case 'T': Intent = atoi(xoptarg); // if (Intent > 3) Intent = 3; if (Intent < 0) Intent = 0; break; case 'l': case 'L': cInProf = xoptarg; lIsDeviceLink = TRUE; break; case 'p': case 'P': cProofing = xoptarg; break; case 'r': case 'R': ProofingIntent = atoi(xoptarg); // if (ProofingIntent > 3) ProofingIntent = 3; if (ProofingIntent < 0) ProofingIntent = 0; break; case 'm': case 'M': lMultiProfileChain = TRUE; break; default: FatalError("Unknown option."); } } // For multiprofile, need to specify -m if (xoptind < argc) { if (!lMultiProfileChain) FatalError("Use %cm for multiprofile transforms", SW); } } // -------------------------------------------------- Print some fancy help static void PrintHelp(void) { mexPrintf("(MX) little cms ColorSpace conversion tool - v2.0\n\n"); mexPrintf("usage: icctrans (mVar, flags)\n\n"); mexPrintf("mVar : Matlab array.\n"); mexPrintf("flags: a string containing one or more of following options.\n\n"); mexPrintf("\t%cv - Verbose\n", SW); mexPrintf("\t%ci - Input profile (defaults to sRGB)\n", SW); mexPrintf("\t%co - Output profile (defaults to sRGB)\n", SW); mexPrintf("\t%cl - Transform by device-link profile\n", SW); mexPrintf("\t%cm - Apply multiprofile chain\n", SW); mexPrintf("\t%ct - Rendering intent\n", SW); mexPrintf("\t%cb - Black point compensation\n", SW); mexPrintf("\t%cc<0,1,2,3> - Optimize transform (0=Off, 1=Normal, 2=Hi-res, 3=Lo-Res) [defaults to 1]\n", SW); mexPrintf("\t%cp - Soft proof profile\n", SW); mexPrintf("\t%cr<0,1,2,3> - Soft proof intent\n", SW); mexPrintf("\nYou can use following built-ins as profiles:\n\n"); mexPrintf("\t*Lab2 -- D50-based v2 CIEL*a*b\n" "\t*Lab4 -- D50-based v4 CIEL*a*b\n" "\t*Lab -- D50-based v4 CIEL*a*b\n" "\t*XYZ -- CIE XYZ (PCS)\n" "\t*sRGB -- IEC6 1996-2.1 sRGB color space\n" "\t*Gray22 - Monochrome of Gamma 2.2\n" "\t*Gray30 - Monochrome of Gamma 3.0\n" "\t*null - Monochrome black for all input\n" "\t*Lin2222- CMYK linearization of gamma 2.2 on each channel\n\n"); mexPrintf("For suggestions, comments, bug reports etc. send mail to info@littlecms.com\n\n"); } // Main entry point void mexFunction( int nlhs, // Number of left hand side (output) arguments mxArray *plhs[], // Array of left hand side arguments int nrhs, // Number of right hand side (input) arguments const mxArray *prhs[] // Array of right hand side arguments ) { char CommandLine[4096+1]; char *pt, *argv[128]; int argc = 1; if (nrhs != 2) { PrintHelp(); return; } if(nlhs > 1) { FatalError("Too many output arguments."); } // Setup error handler cmsSetLogErrorHandler(MatLabErrorHandler); // Defaults Verbose = 0; cInProf = NULL; cOutProf = NULL; cProofing = NULL; lMultiProfileChain = FALSE; nProfiles = 0; Intent = INTENT_PERCEPTUAL; ProofingIntent = INTENT_ABSOLUTE_COLORIMETRIC; PrecalcMode = 1; BlackPointCompensation = FALSE; lIsDeviceLink = FALSE; // Check types. Fist parameter is array of values, second parameter is command line if (!mxIsNumeric(prhs[0])) FatalError("Type mismatch on argument 1 -- Must be numeric"); if (!mxIsChar(prhs[1])) FatalError("Type mismatch on argument 2 -- Must be string"); // Unpack string to command line buffer if (mxGetString(prhs[1], CommandLine, 4096)) FatalError("Cannot unpack command string"); // Separate to argv[] convention argv[0] = NULL; for (pt = strtok(CommandLine, " "); pt; pt = strtok(NULL, " ")) { argv[argc++] = pt; } // Parse arguments HandleSwitches(argc, argv); nBytesDepth = SizeOfArrayType(prhs[0]); OpenTransforms(argc, argv); plhs[0] = AllocateOutputArray(prhs[0], OutputChannels); ApplyTransforms(prhs[0], plhs[0]); CloseTransforms(); // Done! } lcms2-2.19.1/utils/matlab/lcms_rsp0000644000175000017500000000107715176573557016035 0ustar martimarti-v -compatibleArrayDims -O -I../../include icctrans.c ../../src/cmscam02.c ../../src/cmscgats.c ../../src/cmscnvrt.c ../../src/cmserr.c ../../src/cmsgamma.c ../../src/cmsgmt.c ../../src/cmsintrp.c ../../src/cmsio0.c ../../src/cmsio1.c ../../src/cmslut.c ../../src/cmsmd5.c ../../src/cmsmtrx.c ../../src/cmsnamed.c ../../src/cmsopt.c ../../src/cmspack.c ../../src/cmspcs.c ../../src/cmsplugin.c ../../src/cmsps2.c ../../src/cmssamp.c ../../src/cmssm.c ../../src/cmstypes.c ../../src/cmsvirt.c ../../src/cmswtpnt.c ../../src/cmsxform.c ../../src/cmshalf.c ../../src/cmsalpha.c lcms2-2.19.1/utils/meson.build0000644000175000017500000000024015176573557015161 0ustar martimartisubdir('common') if jpeg_dep.found() subdir('jpgicc') endif subdir('linkicc') subdir('psicc') if tiff_dep.found() subdir('tificc') endif subdir('transicc') lcms2-2.19.1/utils/psicc/0000755000175000017500000000000015176574562014121 5ustar martimartilcms2-2.19.1/utils/psicc/meson.build0000644000175000017500000000032515176573557016266 0ustar martimartipsicc_sources = files( 'psicc.c', ) psicc_exe = executable( 'psicc', psicc_sources, dependencies: [liblcms2_dep, common_dep], install: true, ) psicc_man = files( 'psicc.1', ) install_man(psicc_man) lcms2-2.19.1/utils/psicc/psicc.10000644000175000017500000000230115176573557015303 0ustar martimarti.\"Shiju P. Nair September 30, 2004 .\"Thomas Weber April 23, 2014 .TH PSICC 1 "September 30, 2004" .SH NAME psicc - little cms PostScript converter. .SH SYNOPSIS .B psicc .RI [ options ] .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B psicc is a little cms PostScript converter. .SH OPTIONS .TP .B \-b Black point compensation (CRD only). .TP .BI \-c\ precision Precision (0=LowRes, 1=Normal, 2=Hi-res) (CRD only) [defaults to 1]. .TP .BI \-i\ profile Input profile: Generates Color Space Array (CSA). .TP .BI \-n\ gridpoints Alternate way to set precision, number of CLUT points (CRD only). .TP .BI \-o\ profile Output profile: Generates Color Rendering Dictionary(CRD). .TP .BI \-t\ intent Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute) [defaults to 0]. .TP .B \-u Do NOT generate resource name on CRD. .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpgicc (1), .BR linkicc (1), .BR tificc (1), .BR transicc (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.19.1/utils/psicc/psicc.c0000644000175000017500000001511515176573557015374 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- #include "utils.h" // ------------------------------------------------------------------------ static char *cInProf = NULL; static char *cOutProf = NULL; static int Intent = INTENT_PERCEPTUAL; static FILE* OutFile; static int BlackPointCompensation = FALSE; static int Undecorated = FALSE; static int PrecalcMode = 1; static int NumOfGridPoints = 0; static void Help(void) { fprintf(stderr, "Little CMS ICC PostScript generator - v2.1 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n\n"); fprintf(stderr, "usage: psicc [flags] []\n\n"); fprintf(stderr, "flags:\n\n"); fprintf(stderr, "-i - Input profile: Generates Color Space Array (CSA)\n"); fprintf(stderr, "-o - Output profile: Generates Color Rendering Dictionary(CRD)\n"); fprintf(stderr, "-t<0,1,2,3> - Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute)\n"); fprintf(stderr, "-b - Black point compensation (CRD only)\n"); fprintf(stderr, "-u - Do NOT generate resource name on CRD\n"); fprintf(stderr, "-c<0,1,2> - Precision (0=LowRes, 1=Normal (default), 2=Hi-res) (CRD only)\n"); fprintf(stderr, "-n - Alternate way to set precision, number of CLUT points (CRD only)\n"); fprintf(stderr, "\n"); fprintf(stderr, "If no output file is specified, output goes to stdout.\n\n"); fprintf(stderr, "This program is intended to be a demo of the little cms\n" "engine. Both lcms and this program are freeware. You can\n" "obtain both in source code at https://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s = xgetopt(argc,argv,"uUbBI:i:O:o:T:t:c:C:n:N:-:")) != EOF) { switch (s) { case '-': if (strcmp(xoptarg, "help") == 0) { Help(); } else { FatalError("Unknown option - run without args to see valid ones.\n"); } break; case 'i': case 'I': cInProf = xoptarg; break; case 'o': case 'O': cOutProf = xoptarg; break; case 'b': case 'B': BlackPointCompensation =TRUE; break; case 't': case 'T': Intent = atoi(xoptarg); if (Intent > 3) Intent = 3; if (Intent < 0) Intent = 0; break; case 'U': case 'u': Undecorated = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 2) FatalError("ERROR: Unknown precalc mode '%d'", PrecalcMode); break; case 'n': case 'N': if (PrecalcMode != 1) FatalError("Precalc mode already specified"); NumOfGridPoints = atoi(xoptarg); break; default: FatalError("Unknown option - run without args to see valid ones.\n"); } } } static void GenerateCSA(void) { cmsHPROFILE hProfile = OpenStockProfile(0, cInProf); size_t n; char* Buffer; if (hProfile == NULL) return; n = cmsGetPostScriptCSA(0, hProfile, Intent, 0, NULL, 0); if (n == 0) return; Buffer = (char*) malloc(n + 1); if (Buffer != NULL) { cmsGetPostScriptCSA(0, hProfile, Intent, 0, Buffer, (cmsUInt32Number) n); Buffer[n] = 0; fprintf(OutFile, "%s", Buffer); free(Buffer); } cmsCloseProfile(hProfile); } static void GenerateCRD(void) { cmsHPROFILE hProfile = OpenStockProfile(0, cOutProf); size_t n; char* Buffer; cmsUInt32Number dwFlags = 0; if (hProfile == NULL) return; if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; if (Undecorated) dwFlags |= cmsFLAGS_NODEFAULTRESOURCEDEF; switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 1: if (NumOfGridPoints > 0) dwFlags |= cmsFLAGS_GRIDPOINTS(NumOfGridPoints); break; default: FatalError("ERROR: Unknown precalculation mode '%d'", PrecalcMode); } n = cmsGetPostScriptCRD(0, hProfile, Intent, dwFlags, NULL, 0); if (n == 0) return; Buffer = (char*) malloc(n + 1); if (Buffer == NULL) return; cmsGetPostScriptCRD(0, hProfile, Intent, dwFlags, Buffer, (cmsUInt32Number) n); Buffer[n] = 0; fprintf(OutFile, "%s", Buffer); free(Buffer); cmsCloseProfile(hProfile); } int main(int argc, char *argv[]) { int nargs; // Initialize InitUtils("psicc"); HandleSwitches(argc, argv); nargs = (argc - xoptind); if (nargs != 0 && nargs != 1) Help(); if (cInProf == NULL && cOutProf == NULL) Help(); if (nargs == 0) OutFile = stdout; else OutFile = fopen(argv[xoptind], "wt"); if (cInProf != NULL) GenerateCSA(); if (cOutProf != NULL) GenerateCRD(); if (nargs == 1) { fclose(OutFile); } return 0; } lcms2-2.19.1/utils/psicc/Makefile.am0000644000175000017500000000112115176573557016153 0ustar martimarti# # Makefile for building psicc # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = psicc psicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ psicc_LDFLAGS = @LDFLAGS@ psicc_SOURCES = psicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = psicc.1 EXTRA_DIST = $(man_MANS) lcms2-2.19.1/utils/psicc/Makefile.in0000644000175000017500000005501515176574547016177 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building psicc # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = psicc$(EXEEXT) subdir = utils/psicc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_psicc_OBJECTS = psicc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ ../common/vprf.$(OBJEXT) psicc_OBJECTS = $(am_psicc_OBJECTS) psicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = psicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(psicc_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = am__maybe_remake_depfiles = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(psicc_SOURCES) DIST_SOURCES = $(psicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common psicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ psicc_LDFLAGS = @LDFLAGS@ psicc_SOURCES = psicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = psicc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/psicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/psicc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: $(am__rm_f) $(bin_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) ../common/$(am__dirstamp): @$(MKDIR_P) ../common @: >>../common/$(am__dirstamp) ../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) ../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) psicc$(EXEEXT): $(psicc_OBJECTS) $(psicc_DEPENDENCIES) $(EXTRA_psicc_DEPENDENCIES) @rm -f psicc$(EXEEXT) $(AM_V_CCLD)$(psicc_LINK) $(psicc_OBJECTS) $(psicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../common/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) -$(am__rm_f) ../common/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/utils/samples/0000755000175000017500000000000015176573557014467 5ustar martimartilcms2-2.19.1/utils/samples/itufax.c0000644000175000017500000001060215176573557016132 0ustar martimarti// // Little cms // Copyright (C) 1998-2003 Marti Maria // // 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. #include "lcms.h" // This is a sample on how to build a profile for decoding ITU T.42/Fax JPEG // streams. The profile has an additional ability in the input direction of // gamut compress values between 85 < a < -85 and -75 < b < 125. This conforms // the default range for ITU/T.42 -- See RFC 2301, section 6.2.3 for details // L* = [0, 100] // a* = [-85, 85] // b* = [-75, 125] // These functions does convert the encoding of ITUFAX to floating point static void ITU2Lab(WORD In[3], LPcmsCIELab Lab) { Lab -> L = (double) In[0] / 655.35; Lab -> a = (double) 170.* (In[1] - 32768.) / 65535.; Lab -> b = (double) 200.* (In[2] - 24576.) / 65535.; } static void Lab2ITU(LPcmsCIELab Lab, WORD Out[3]) { Out[0] = (WORD) floor((double) (Lab -> L / 100.)* 65535. + 0.5); Out[1] = (WORD) floor((double) (Lab -> a / 170.)* 65535. + 32768. + 0.5); Out[2] = (WORD) floor((double) (Lab -> b / 200.)* 65535. + 24576. + 0.5); } // These are the samplers-- They are passed as callbacks to cmsSample3DGrid() // then, cmsSample3DGrid() will sweel whole Lab gamut calling these functions // once for each node. In[] will contain the Lab PCS value to convert to ITUFAX // on InputDirection, or the ITUFAX value to convert to Lab in OutputDirection // You can change the number of sample points if desired, the algorithm will // remain same. 33 points gives good accuracy, but you can reduce to 22 or less // is space is critical #define GRID_POINTS 33 static int InputDirection(register WORD In[], register WORD Out[], register LPVOID Cargo) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); cmsClampLab(&Lab, 85, -85, 125, -75); // This function does the necessary gamut remapping Lab2ITU(&Lab, Out); return TRUE; } static int OutputDirection(register WORD In[], register WORD Out[], register LPVOID Cargo) { cmsCIELab Lab; ITU2Lab(In, &Lab); cmsFloat2LabEncoded(Out, &Lab); return TRUE; } // The main entry point. Just create a profile an populate it with required tags. // note that cmsOpenProfileFromFile("itufax.icm", "w") will NOT delete the file // if already exists. This is for obvious safety reasons. int main(int argc, char *argv[]) { LPLUT AToB0, BToA0; cmsHPROFILE hProfile; fprintf(stderr, "Creating itufax.icm..."); unlink("itufax.icm"); hProfile = cmsOpenProfileFromFile("itufax.icm", "w"); AToB0 = cmsAllocLUT(); BToA0 = cmsAllocLUT(); cmsAlloc3DGrid(AToB0, GRID_POINTS, 3, 3); cmsAlloc3DGrid(BToA0, GRID_POINTS, 3, 3); cmsSample3DGrid(AToB0, InputDirection, NULL, 0); cmsSample3DGrid(BToA0, OutputDirection, NULL, 0); cmsAddTag(hProfile, icSigAToB0Tag, AToB0); cmsAddTag(hProfile, icSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, icSigLabData); cmsSetPCS(hProfile, icSigLabData); cmsSetDeviceClass(hProfile, icSigColorSpaceClass); cmsAddTag(hProfile, icSigProfileDescriptionTag, "ITU T.42/Fax JPEG CIEL*a*b*"); cmsAddTag(hProfile, icSigCopyrightTag, "No Copyright, use freely."); cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); cmsAddTag(hProfile, icSigDeviceModelDescTag, "ITU T.42/Fax JPEG CIEL*a*b*"); cmsCloseProfile(hProfile); cmsFreeLUT(AToB0); cmsFreeLUT(BToA0); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.19.1/utils/samples/mkcmy.c0000644000175000017500000000753115176573557015761 0ustar martimarti// // Little cms // Copyright (C) 1998-2003 Marti Maria // // 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. // // THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, // EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY // WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. // // IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL, // INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, // OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, // WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF // LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE // OF THIS SOFTWARE. // // Version 1.12 #include "lcms.h" typedef struct { cmsHPROFILE hLab; cmsHPROFILE hRGB; cmsHTRANSFORM Lab2RGB; cmsHTRANSFORM RGB2Lab; } CARGO, FAR* LPCARGO; // Our space will be CIE primaries plus a gamma of 4.5 static int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo) { LPCARGO C = (LPCARGO) Cargo; WORD RGB[3]; cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); printf("%g %g %g\n", Lab.L, Lab.a, Lab.b); cmsDoTransform(C ->Lab2RGB, In, &RGB, 1); Out[0] = 0xFFFF - RGB[0]; // Our CMY is negative of RGB Out[1] = 0xFFFF - RGB[1]; Out[2] = 0xFFFF - RGB[2]; return TRUE; } static int Reverse(register WORD In[], register WORD Out[], register LPVOID Cargo) { LPCARGO C = (LPCARGO) Cargo; WORD RGB[3]; RGB[0] = 0xFFFF - In[0]; RGB[1] = 0xFFFF - In[1]; RGB[2] = 0xFFFF - In[2]; cmsDoTransform(C ->RGB2Lab, &RGB, Out, 1); return TRUE; } static void InitCargo(LPCARGO Cargo) { Cargo -> hLab = cmsCreateLabProfile(NULL); Cargo -> hRGB = cmsCreate_sRGBProfile(); Cargo->Lab2RGB = cmsCreateTransform(Cargo->hLab, TYPE_Lab_16, Cargo ->hRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOTPRECALC); Cargo->RGB2Lab = cmsCreateTransform(Cargo ->hRGB, TYPE_RGB_16, Cargo ->hLab, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOTPRECALC); } static void FreeCargo(LPCARGO Cargo) { cmsDeleteTransform(Cargo ->Lab2RGB); cmsDeleteTransform(Cargo ->RGB2Lab); cmsCloseProfile(Cargo ->hLab); cmsCloseProfile(Cargo ->hRGB); } int main(void) { LPLUT AToB0, BToA0; CARGO Cargo; cmsHPROFILE hProfile; fprintf(stderr, "Creating lcmscmy.icm..."); InitCargo(&Cargo); hProfile = cmsCreateLabProfile(NULL); AToB0 = cmsAllocLUT(); BToA0 = cmsAllocLUT(); cmsAlloc3DGrid(AToB0, 25, 3, 3); cmsAlloc3DGrid(BToA0, 25, 3, 3); cmsSample3DGrid(AToB0, Reverse, &Cargo, 0); cmsSample3DGrid(BToA0, Forward, &Cargo, 0); cmsAddTag(hProfile, icSigAToB0Tag, AToB0); cmsAddTag(hProfile, icSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, icSigCmyData); cmsSetDeviceClass(hProfile, icSigOutputClass); cmsAddTag(hProfile, icSigProfileDescriptionTag, "CMY "); cmsAddTag(hProfile, icSigCopyrightTag, "Copyright (c) HP, 2007. All rights reserved."); cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); cmsAddTag(hProfile, icSigDeviceModelDescTag, "CMY space"); _cmsSaveProfile(hProfile, "lcmscmy.icm"); cmsFreeLUT(AToB0); cmsFreeLUT(BToA0); cmsCloseProfile(hProfile); FreeCargo(&Cargo); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.19.1/utils/samples/mkgrayer.c0000644000175000017500000000476515176573557016470 0ustar martimarti// // Little cms // Copyright (C) 1998-2003 Marti Maria // // 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. #include "lcms.h" static int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); if (fabs(Lab.a) < 3 && fabs(Lab.b) < 3) { double L_01 = Lab.L / 100.0; WORD K; if (L_01 > 1) L_01 = 1; K = (WORD) floor(L_01* 65535.0 + 0.5); Out[0] = Out[1] = Out[2] = K; } else { Out[0] = 0xFFFF; Out[1] = 0; Out[2] = 0; } return TRUE; } int main(int argc, char *argv[]) { LPLUT BToA0; cmsHPROFILE hProfile; fprintf(stderr, "Creating interpol2.icc..."); unlink("interpol2.icc"); hProfile = cmsOpenProfileFromFile("interpol2.icc", "w8"); BToA0 = cmsAllocLUT(); cmsAlloc3DGrid(BToA0, 17, 3, 3); cmsSample3DGrid(BToA0, Forward, NULL, 0); cmsAddTag(hProfile, icSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, icSigRgbData); cmsSetPCS(hProfile, icSigLabData); cmsSetDeviceClass(hProfile, icSigOutputClass); cmsAddTag(hProfile, icSigProfileDescriptionTag, "Interpolation test"); cmsAddTag(hProfile, icSigCopyrightTag, "Copyright (c) HP 2007. All rights reserved."); cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); cmsAddTag(hProfile, icSigDeviceModelDescTag, "Interpolation test profile"); cmsCloseProfile(hProfile); cmsFreeLUT(BToA0); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.19.1/utils/samples/mktiff8.c0000644000175000017500000000725315176573557016212 0ustar martimarti// // Little cms // Copyright (C) 1998-2010 Marti Maria // // 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. // Creates a devicelink that decodes TIFF8 Lab files #include "lcms2.h" #include #include static double DecodeAbTIFF(double ab) { if (ab <= 128.) ab += 127.; else ab -= 127.; return ab; } static cmsToneCurve* CreateStep(void) { cmsToneCurve* Gamma; cmsUInt16Number* Table; int i; double a; Table = calloc(4096, sizeof(cmsUInt16Number)); if (Table == NULL) return NULL; for (i=0; i < 4096; i++) { a = (double) i * 255. / 4095.; a = DecodeAbTIFF(a); Table[i] = (cmsUInt16Number) floor(a * 257. + 0.5); } Gamma = cmsBuildTabulatedToneCurve16(0, 4096, Table); free(Table); return Gamma; } static cmsToneCurve* CreateLinear(void) { cmsUInt16Number Linear[2] = { 0, 0xffff }; return cmsBuildTabulatedToneCurve16(0, 2, Linear); } // Set the copyright and description static cmsBool SetTextTags(cmsHPROFILE hProfile) { cmsMLU *DescriptionMLU, *CopyrightMLU; cmsBool rc = FALSE; DescriptionMLU = cmsMLUalloc(0, 1); CopyrightMLU = cmsMLUalloc(0, 1); if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; if (!cmsMLUsetASCII(DescriptionMLU, "en", "US", "Little cms Tiff8 CIELab")) goto Error; if (!cmsMLUsetASCII(CopyrightMLU, "en", "US", "Copyright (c) Marti Maria, 2010. All rights reserved.")) goto Error; if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; rc = TRUE; Error: if (DescriptionMLU) cmsMLUfree(DescriptionMLU); if (CopyrightMLU) cmsMLUfree(CopyrightMLU); return rc; } int main(int argc, char *argv[]) { cmsHPROFILE hProfile; cmsPipeline *AToB0; cmsToneCurve* PreLinear[3]; cmsToneCurve *Lin, *Step; fprintf(stderr, "Creating lcmstiff8.icm..."); remove("lcmstiff8.icm"); hProfile = cmsOpenProfileFromFile("lcmstiff8.icm", "w"); // Create linearization Lin = CreateLinear(); Step = CreateStep(); PreLinear[0] = Lin; PreLinear[1] = Step; PreLinear[2] = Step; AToB0 = cmsPipelineAlloc(0, 3, 3); cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, cmsStageAllocToneCurves(0, 3, PreLinear)); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); cmsSetDeviceClass(hProfile, cmsSigLinkClass); cmsSetProfileVersion(hProfile, 4.2); cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB0); SetTextTags(hProfile); cmsCloseProfile(hProfile); cmsFreeToneCurve(Lin); cmsFreeToneCurve(Step); cmsPipelineFree(AToB0); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.19.1/utils/samples/roundtrip.c0000644000175000017500000000541015176573557016661 0ustar martimarti// // Little cms // Copyright (C) 1998-2011 Marti Maria // // 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 #include "lcms2.h" #include static double VecDist(cmsUInt8Number bin[3], cmsUInt8Number bout[3]) { double rdist, gdist, bdist; rdist = fabs((double) bout[0] - bin[0]); gdist = fabs((double) bout[1] - bin[1]); bdist = fabs((double) bout[2] - bin[2]); return (sqrt((rdist*rdist + gdist*gdist + bdist*bdist))); } int main(int argc, char* argv[]) { int r, g, b; cmsUInt8Number RGB[3], RGB_OUT[3]; cmsHTRANSFORM xform; cmsHPROFILE hProfile; double err, SumX=0, SumX2=0, Peak = 0, n = 0; if (argc != 2) { printf("roundtrip \n"); return 1; } hProfile = cmsOpenProfileFromFile(argv[1], "r"); if (hProfile == NULL) { printf("invalid profile\n"); return 1; } xform = cmsCreateTransform(hProfile,TYPE_RGB_8, hProfile, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE); if (xform == NULL) { printf("Not a valid RGB profile\n"); return 1; } for (r=0; r< 256; r++) { printf("%d \r", r); for (g=0; g < 256; g++) { for (b=0; b < 256; b++) { RGB[0] = r; RGB[1] = g; RGB[2] = b; cmsDoTransform(xform, RGB, RGB_OUT, 1); err = VecDist(RGB, RGB_OUT); SumX += err; SumX2 += err * err; n += 1.0; if (err > Peak) Peak = err; } } } printf("Average %g\n", SumX / n); printf("Max %g\n", Peak); printf("Std %g\n", sqrt((n*SumX2 - SumX * SumX) / (n*(n-1)))); cmsCloseProfile(hProfile); cmsDeleteTransform(xform); return 0; }lcms2-2.19.1/utils/samples/vericc.c0000644000175000017500000000426115176573557016111 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "lcms2.h" #include #include static int PrintUsage(void) { fprintf(stderr, "Sets profile version\n\nUsage: vericc --r iccprofile.icc\n"); return 0; } int main(int argc, char *argv[]) { cmsHPROFILE hProfile; char* ptr; cmsFloat64Number Version; if (argc != 3) return PrintUsage(); ptr = argv[1]; if (strncmp(ptr, "--r", 3) != 0) return PrintUsage(); ptr += 3; if (!*ptr) { fprintf(stderr, "Wrong version number\n"); return 1; } Version = atof(ptr); hProfile = cmsOpenProfileFromFile(argv[2], "r"); if (hProfile == NULL) { fprintf(stderr, "'%s': cannot open\n", argv[2]); return 1; } cmsSetProfileVersion(hProfile, Version); cmsSaveProfileToFile(hProfile, "$$tmp.icc"); cmsCloseProfile(hProfile); remove(argv[2]); rename("$$tmp.icc", argv[2]); return 0; } lcms2-2.19.1/utils/samples/wtpt.10000644000175000017500000000147215176573557015553 0ustar martimarti.\"Shiju P. Nair September 30, 2004 .TH WTPT 1 "September 30, 2004" .SH NAME wtpt - Show media white of profiles, identifying black body locus. .SH SYNOPSIS .B wtpt .RI [ profile ] .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B wtpt shows media white of profiles, identifying black body locus. .P If no parameters are given, then this program will ask for XYZ value of media white. If parameter given, it must be the profile to inspect. .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com .SH SEE ALSO .BR jpegicc (1), .BR tifficc (1), .BR icc2ps (1), .BR icclink (1), .BR icctrans (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.19.1/utils/samples/wtpt.c0000644000175000017500000001031115176573557015625 0ustar martimarti// // Little cms // Copyright (C) 1998-2015 Marti Maria // //--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- #include "utils.h" // The toggles stuff static cmsBool lShowXYZ = TRUE; static cmsBool lShowLab = FALSE; static cmsBool lShowLCh = FALSE; #define SW '-' static void HandleSwitches(int argc, char *argv[]) { int s; while ((s = xgetopt(argc, argv, "lcx")) != EOF) { switch (s){ case 'l': lShowLab = TRUE; break; case 'c': lShowLCh = TRUE; break; case 'x': lShowXYZ = FALSE; break; default: FatalError("Unknown option - run without args to see valid ones.\n"); } } } static void Help(void) { fprintf(stderr, "little CMS ICC white point utility - v3 [LittleCMS %2.2f]\n", LCMS_VERSION / 1000.0); fprintf(stderr, "usage: wtpt [flags] []\n\n"); fprintf(stderr, "flags:\n\n"); fprintf(stderr, "%cl - CIE Lab\n", SW); fprintf(stderr, "%cc - CIE LCh\n", SW); fprintf(stderr, "%cx - Don't show XYZ\n", SW); fprintf(stderr, "\nIf no parameters are given, then this program will\n"); fprintf(stderr, "ask for XYZ value of media white. If parameter given, it must be\n"); fprintf(stderr, "the profile to inspect.\n\n"); fprintf(stderr, "This program is intended to be a demo of the little cms\n" "engine. Both lcms and this program are freeware. You can\n" "obtain both in source code at http://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); exit(0); } static void ShowWhitePoint(cmsCIEXYZ* WtPt) { cmsCIELab Lab; cmsCIELCh LCh; cmsCIExyY xyY; cmsXYZ2Lab(NULL, &Lab, WtPt); cmsLab2LCh(&LCh, &Lab); cmsXYZ2xyY(&xyY, WtPt); if (lShowXYZ) printf("XYZ=(%3.1f, %3.1f, %3.1f)\n", WtPt->X, WtPt->Y, WtPt->Z); if (lShowLab) printf("Lab=(%3.3f, %3.3f, %3.3f)\n", Lab.L, Lab.a, Lab.b); if (lShowLCh) printf("LCh=(%3.3f, %3.3f, %3.3f)\n", LCh.L, LCh.C, LCh.h); { double Ssens = (LCh.C * 100.0 )/ sqrt(LCh.C*LCh.C + LCh.L * LCh.L) ; printf("Sens = %f\n", Ssens); } } int main(int argc, char *argv[]) { int nargs; InitUtils("wtpt"); HandleSwitches(argc, argv); nargs = (argc - xoptind); if (nargs != 1) Help(); else { cmsCIEXYZ* WtPt; cmsHPROFILE hProfile = cmsOpenProfileFromFile(argv[xoptind], "r"); if (hProfile == NULL) return 1; WtPt = cmsReadTag(hProfile, cmsSigMediaWhitePointTag); ShowWhitePoint(WtPt); cmsCloseProfile(hProfile); } return 0; } lcms2-2.19.1/utils/samples/Makefile.am0000644000175000017500000000117215176573557016524 0ustar martimarti# # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = wtpt wtpt_LDADD = $(top_builddir)/src/liblcms2.la wtpt_LDFLAGS = @LDFLAGS@ wtpt_SOURCES = wtpt.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = wtpt.1 EXTRA_DIST = $(man_MANS) roundtrip.c mktiff8.c mkgrayer.c mkcmy.c itufax.c lcms2-2.19.1/utils/samples/Makefile.in0000644000175000017500000004613715176573557016547 0ustar martimarti# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria Oct 2004 VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = icctrans$(EXEEXT) wtpt$(EXEEXT) icc2ps$(EXEEXT) \ icclink$(EXEEXT) subdir = samples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_icc2ps_OBJECTS = icc2ps.$(OBJEXT) xgetopt.$(OBJEXT) icc2ps_OBJECTS = $(am_icc2ps_OBJECTS) icc2ps_DEPENDENCIES = $(top_builddir)/src/liblcms.la icc2ps_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icc2ps_LDFLAGS) \ $(LDFLAGS) -o $@ am_icclink_OBJECTS = icclink.$(OBJEXT) xgetopt.$(OBJEXT) \ vprf.$(OBJEXT) icclink_OBJECTS = $(am_icclink_OBJECTS) icclink_DEPENDENCIES = $(top_builddir)/src/liblcms.la icclink_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icclink_LDFLAGS) \ $(LDFLAGS) -o $@ am_icctrans_OBJECTS = icctrans.$(OBJEXT) xgetopt.$(OBJEXT) \ vprf.$(OBJEXT) icctrans_OBJECTS = $(am_icctrans_OBJECTS) icctrans_DEPENDENCIES = $(top_builddir)/src/liblcms.la icctrans_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icctrans_LDFLAGS) \ $(LDFLAGS) -o $@ am_wtpt_OBJECTS = wtpt.$(OBJEXT) xgetopt.$(OBJEXT) wtpt_OBJECTS = $(am_wtpt_OBJECTS) wtpt_DEPENDENCIES = $(top_builddir)/src/liblcms.la wtpt_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(wtpt_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(icc2ps_SOURCES) $(icclink_SOURCES) $(icctrans_SOURCES) \ $(wtpt_SOURCES) DIST_SOURCES = $(icc2ps_SOURCES) $(icclink_SOURCES) \ $(icctrans_SOURCES) $(wtpt_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INT16_T = @INT16_T@ INT32_T = @INT32_T@ INT64_T = @INT64_T@ INT8_T = @INT8_T@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LCMS_PYEXECDIR = @LCMS_PYEXECDIR@ LCMS_PYINCLUDE = @LCMS_PYINCLUDE@ LCMS_PYLIB = @LCMS_PYLIB@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ UINT16_T = @UINT16_T@ UINT32_T = @UINT32_T@ UINT64_T = @UINT64_T@ UINT8_T = @UINT8_T@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include icctrans_LDADD = $(top_builddir)/src/liblcms.la icctrans_LDFLAGS = @LDFLAGS@ icctrans_SOURCES = icctrans.c xgetopt.c vprf.c icctrans_MANS = icctrans.1 wtpt_LDADD = $(top_builddir)/src/liblcms.la wtpt_LDFLAGS = @LDFLAGS@ wtpt_SOURCES = wtpt.c xgetopt.c icc2ps_LDADD = $(top_builddir)/src/liblcms.la icc2ps_LDFLAGS = @LDFLAGS@ icc2ps_SOURCES = icc2ps.c xgetopt.c icclink_LDADD = $(top_builddir)/src/liblcms.la icclink_LDFLAGS = @LDFLAGS@ icclink_SOURCES = icclink.c xgetopt.c vprf.c man_MANS = wtpt.1 icc2ps.1 icclink.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign samples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done icc2ps$(EXEEXT): $(icc2ps_OBJECTS) $(icc2ps_DEPENDENCIES) @rm -f icc2ps$(EXEEXT) $(icc2ps_LINK) $(icc2ps_OBJECTS) $(icc2ps_LDADD) $(LIBS) icclink$(EXEEXT): $(icclink_OBJECTS) $(icclink_DEPENDENCIES) @rm -f icclink$(EXEEXT) $(icclink_LINK) $(icclink_OBJECTS) $(icclink_LDADD) $(LIBS) icctrans$(EXEEXT): $(icctrans_OBJECTS) $(icctrans_DEPENDENCIES) @rm -f icctrans$(EXEEXT) $(icctrans_LINK) $(icctrans_OBJECTS) $(icctrans_LDADD) $(LIBS) wtpt$(EXEEXT): $(wtpt_OBJECTS) $(wtpt_DEPENDENCIES) @rm -f wtpt$(EXEEXT) $(wtpt_LINK) $(wtpt_OBJECTS) $(wtpt_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icc2ps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icclink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icctrans.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wtpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.19.1/utils/tificc/0000755000175000017500000000000015176574562014261 5ustar martimartilcms2-2.19.1/utils/tificc/tificc.10000644000175000017500000000566715176573557015625 0ustar martimarti.\"Shiju P. Nair September 30, 2004 .\"Thomas Weber April 23, 2014 .TH TIFICC 1 "October 23, 2004" .SH NAME tificc - little cms ICC profile applier for TIFF. .SH SYNOPSIS .B tificc .RI [ options ] " input.tif output.tif" .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B tificc is a little cms ICC profile applier for TIFF. .SH OPTIONS .TP .B \-a Handle channels > 4 as alpha. .TP .B \-b Black point compensation. .TP .BI \-c\ NUM Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]. .TP .BI \-d\ NUM Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 0.0]. .TP .B \-e Embed destination profile. .TP .B \-g Marks out-of-gamut colors on softproof. .TP .BI \-h\ NUM Show summary of options and examples (0=help, 1=Examples, 2=Built-in profiles, 3=Contact information) .TP .BI \-i\ profile Input profile (defaults to sRGB). .TP .BI \-k\ inklimit Ink-limiting in % (CMYK only), (0..400.0, float value) [default 400.0]. .TP .BI \-l\ profile Transform by device-link profile. .TP .B \-m TODO: check if values outside 0..3 are possible SoftProof intent [defaults to 0]. .TP .B \-n Ignore embedded profile on input. .TP .BI \-o\ profile Output profile (defaults to sRGB). .TP .BI \-p\ profile Soft proof profile. .TP .BI \-s\ newprofile Save embedded profile as \fInewprofile\fR. .TP .BI \-t\ NUM Rendering intent .nf .RS 0=Perceptual [default] 1=Relative colorimetric 2=Saturation 3=Absolute colorimetric 10=Perceptual preserving black ink 11=Relative colorimetric preserving black ink 12=Saturation preserving black ink 13=Perceptual preserving black plane 14=Relative colorimetric preserving black plane 15=Saturation preserving black plane .RE .fi .TP .B \-v Verbose. .TP .BI \-w\ NUM Output depth (8, 16 or 32). Use 32 for floating-point. .SH BUILT-IN PROFILES .nf *Lab2 -- D50-based v2 CIEL*a*b *Lab4 -- D50-based v4 CIEL*a*b *Lab -- D50-based v4 CIEL*a*b *XYZ -- CIE XYZ (PCS) *sRGB -- sRGB color space *Gray22 - Monochrome of Gamma 2.2 *Gray30 - Monochrome of Gamma 3.0 *null - Monochrome black for all input *Lin2222- CMYK linearization of gamma 2.2 on each channel .fi .SH EXAMPLES .nf To color correct from scanner to sRGB: tificc -iscanner.icm in.tif out.tif To convert from monitor1 to monitor2: tificc -imon1.icm -omon2.icm in.tif out.tif To make a CMYK separation: tificc -oprinter.icm inrgb.tif outcmyk.tif To recover sRGB from a CMYK separation: tificc -iprinter.icm incmyk.tif outrgb.tif To convert from CIELab TIFF to sRGB tificc -i*Lab in.tif out.tif .fi .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpgicc (1), .BR linkicc (1), .BR psicc (1), .BR transicc (1) .SH AUTHOR This manual page was originally written by Shiju p. Nair , for the Debian project. Modified by Marti Maria to reflect further changes. lcms2-2.19.1/utils/tificc/tificc.c0000644000175000017500000011075715176573557015704 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // This program does apply profiles to (some) TIFF files #include "lcms2_plugin.h" #include "tiffio.h" #include "utils.h" // Fix broken libtiff 4.3.0, thanks to Bob Friesenhahn for uncovering this #if defined(HAVE_STDINT_H) && (TIFFLIB_VERSION >= 20201219) #include # undef cmsUInt16Number # define cmsUInt16Number uint16_t # undef cmsUInt32Number # define cmsUInt32Number uint32_t #endif /* TIFFLIB_VERSION */ // Flags static cmsBool BlackWhiteCompensation = FALSE; static cmsBool IgnoreEmbedded = FALSE; static cmsBool EmbedProfile = FALSE; static int PixelDepth = 8; static cmsBool GamutCheck = FALSE; static cmsBool lIsDeviceLink = FALSE; static cmsBool lIsCUBE = FALSE; static cmsBool StoreAsAlpha = FALSE; static int Intent = INTENT_PERCEPTUAL; static int ProofingIntent = INTENT_PERCEPTUAL; static int PrecalcMode = 1; static cmsFloat64Number InkLimit = 400; static cmsFloat64Number ObserverAdaptationState = 1.0; // According ICC 4.4 this is the default static const char *cInpProf = NULL; static const char *cOutProf = NULL; static const char *cProofing = NULL; static const char* SaveEmbedded = NULL; // Console error & warning static void ConsoleWarningHandler(const char* module, const char* fmt, va_list ap) { if (Verbose) { fprintf(stderr, "Warning: "); if (module != NULL) fprintf(stderr, "[%s] ", module); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); fflush(stderr); } } static void ConsoleErrorHandler(const char* module, const char* fmt, va_list ap) { if (Verbose) { fprintf(stderr, "Error: "); if (module != NULL) fprintf(stderr, "[%s] ", module); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); fflush(stderr); } } // Issue a warning static void Warning(const char *frm, ...) { va_list args; va_start(args, frm); ConsoleWarningHandler("tificc", frm, args); va_end(args); } // Out of memory is a fatal error static void OutOfMem(cmsUInt32Number size) { FatalError("Out of memory on allocating %d bytes.", size); } // ----------------------------------------------------------------------------------------------- // Lab plug-in // In TIFF, Lab is encoded in a different way, so let's use the plug-in // capabilities of lcms2 to change the meaning of TYPE_Lab_8. #define LABTIFF_SH(m) ((m) << 30) #define T_LABTIFF(m) (((m)>>30)&1) // * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 static int FromLabV2ToLabV4(int x) { int a; a = ((x << 8) | x) >> 8; // * 257 / 256 if ( a > 0xffff) return 0xffff; return a; } // * 0xf00 / 0xffff = * 256 / 257 static int FromLabV4ToLabV2(int x) { return ((x << 8) + 0x80) / 257; } // Formatter for 8bit Lab TIFF (photometric 8) static unsigned char* UnrollTIFFLab8(struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride) { wIn[0] = (cmsUInt16Number) FromLabV2ToLabV4((accum[0]) << 8); wIn[1] = (cmsUInt16Number) FromLabV2ToLabV4(((accum[1] > 127) ? (accum[1] - 128) : (accum[1] + 128)) << 8); wIn[2] = (cmsUInt16Number) FromLabV2ToLabV4(((accum[2] > 127) ? (accum[2] - 128) : (accum[2] + 128)) << 8); return accum + 3; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } // Formatter for 16bit Lab TIFF (photometric 8) static unsigned char* UnrollTIFFLab16(struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wIn[], CMSREGISTER cmsUInt8Number* accum, CMSREGISTER cmsUInt32Number Stride ) { cmsUInt16Number* accum16 = (cmsUInt16Number*) accum; wIn[0] = (cmsUInt16Number) FromLabV2ToLabV4(accum16[0]); wIn[1] = (cmsUInt16Number) FromLabV2ToLabV4(((accum16[1] > 0x7f00) ? (accum16[1] - 0x8000) : (accum16[1] + 0x8000)) ); wIn[2] = (cmsUInt16Number) FromLabV2ToLabV4(((accum16[2] > 0x7f00) ? (accum16[2] - 0x8000) : (accum16[2] + 0x8000)) ); return accum + 3 * sizeof(cmsUInt16Number); UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static unsigned char* PackTIFFLab8(struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { int a, b; *output++ = (cmsUInt8Number) (FromLabV4ToLabV2(wOut[0] + 0x0080) >> 8); a = (FromLabV4ToLabV2(wOut[1]) + 0x0080) >> 8; b = (FromLabV4ToLabV2(wOut[2]) + 0x0080) >> 8; *output++ = (cmsUInt8Number) ((a < 128) ? (a + 128) : (a - 128)); *output++ = (cmsUInt8Number) ((b < 128) ? (b + 128) : (b - 128)); return output; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static unsigned char* PackTIFFLabA8(struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { int a, b; *output++ = (cmsUInt8Number) (FromLabV4ToLabV2(wOut[0] + 0x0080) >> 8); a = (FromLabV4ToLabV2(wOut[1]) + 0x0080) >> 8; b = (FromLabV4ToLabV2(wOut[2]) + 0x0080) >> 8; *output++ = (cmsUInt8Number) ((a < 128) ? (a + 128) : (a - 128)); *output++ = (cmsUInt8Number) ((b < 128) ? (b + 128) : (b - 128)); output++; // Alpha return output; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static unsigned char* PackTIFFLab16(struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { int a, b; cmsUInt16Number* output16 = (cmsUInt16Number*) output; *output16++ = (cmsUInt16Number) FromLabV4ToLabV2(wOut[0]); a = FromLabV4ToLabV2(wOut[1]); b = FromLabV4ToLabV2(wOut[2]); *output16++ = (cmsUInt16Number) ((a < 0x7f00) ? (a + 0x8000) : (a - 0x8000)); *output16++ = (cmsUInt16Number) ((b < 0x7f00) ? (b + 0x8000) : (b - 0x8000)); return (cmsUInt8Number*) output16; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static unsigned char* PackTIFFLabA16(struct _cmstransform_struct* CMMcargo, CMSREGISTER cmsUInt16Number wOut[], CMSREGISTER cmsUInt8Number* output, CMSREGISTER cmsUInt32Number Stride) { int a, b; cmsUInt16Number* output16 = (cmsUInt16Number*) output; *output16++ = (cmsUInt16Number) FromLabV4ToLabV2(wOut[0]); a = FromLabV4ToLabV2(wOut[1]); b = FromLabV4ToLabV2(wOut[2]); *output16++ = (cmsUInt16Number) ((a < 0x7f00) ? (a + 0x8000) : (a - 0x8000)); *output16++ = (cmsUInt16Number) ((b < 0x7f00) ? (b + 0x8000) : (b - 0x8000)); output16++; // Alpha return (cmsUInt8Number*) output16; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static cmsFormatter TiffFormatterFactory(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { cmsFormatter Result = { NULL }; int bps = T_BYTES(Type); int IsTiffSpecial = T_LABTIFF(Type); if (IsTiffSpecial && !(dwFlags & CMS_PACK_FLAGS_FLOAT)) { if (Dir == cmsFormatterInput) { Result.Fmt16 = (bps == 1) ? UnrollTIFFLab8 : UnrollTIFFLab16; } else { if (T_EXTRA(Type) == 1) Result.Fmt16 = (bps == 1) ? PackTIFFLabA8 : PackTIFFLabA16; else if (T_EXTRA(Type) == 0) Result.Fmt16 = (bps == 1) ? PackTIFFLab8 : PackTIFFLab16; } } return Result; } static cmsPluginFormatters TiffLabPlugin = { {cmsPluginMagicNumber, 2000, cmsPluginFormattersSig, NULL}, TiffFormatterFactory }; // ----------------------------------------------------------------------------------------------- // Build up the pixeltype descriptor static cmsUInt32Number GetInputPixelType(TIFF *Bank) { cmsUInt16Number Photometric, bps, spp, extra, PlanarConfig, *info; cmsUInt16Number Compression; int ColorChannels; int IsPremul = FALSE, IsPlanar = FALSE, IsFlt = FALSE, IsReverse = FALSE; int labTiffSpecial = FALSE; int pt = PT_ANY; TIFFGetFieldDefaulted(Bank, TIFFTAG_BITSPERSAMPLE, &bps); if (bps == 1) FatalError("Sorry, bilevel TIFFs has nothing to do with ICC profiles"); if (bps != 8 && bps != 16 && bps != 32) FatalError("Sorry, 8, 16 or 32 bits per sample only"); TIFFGetFieldDefaulted(Bank, TIFFTAG_PLANARCONFIG, &PlanarConfig); switch (PlanarConfig) { case PLANARCONFIG_CONTIG: IsPlanar = 0; break; case PLANARCONFIG_SEPARATE: IsPlanar = 1; break; default: FatalError("Unsupported planar configuration (=%d) ", (int) PlanarConfig); } TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need not to be included. if (spp == 1) IsPlanar = 0; // Any alpha? TIFFGetFieldDefaulted(Bank, TIFFTAG_EXTRASAMPLES, &extra, &info); // Read alpha channels as colorant? if (StoreAsAlpha) { ColorChannels = spp; extra = 0; } else ColorChannels = spp - extra; // Is alpha premultiplied ? IsPremul = ((extra == 1) && (info[0] == EXTRASAMPLE_ASSOCALPHA)); // Get photometric interpretation and proceed accordly TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); switch (Photometric) { case PHOTOMETRIC_MINISWHITE: IsReverse = 1; // ... fall through ... case PHOTOMETRIC_MINISBLACK: pt = PT_GRAY; break; case PHOTOMETRIC_RGB: pt = PT_RGB; if (ColorChannels < 3) FatalError("Sorry, RGB needs at least 3 samples per pixel"); break; case PHOTOMETRIC_PALETTE: FatalError("Sorry, palette images not supported"); break; case PHOTOMETRIC_SEPARATED: pt = PixelTypeFromChanCount(ColorChannels); break; case PHOTOMETRIC_YCBCR: TIFFGetField(Bank, TIFFTAG_COMPRESSION, &Compression); { cmsUInt16Number subx, suby; pt = PT_YCbCr; TIFFGetFieldDefaulted(Bank, TIFFTAG_YCBCRSUBSAMPLING, &subx, &suby); if (subx != 1 || suby != 1) FatalError("Sorry, subsampled images are not supported"); } break; // Two Lab flavours case PHOTOMETRIC_ITULAB: case PHOTOMETRIC_ICCLAB: pt = PT_Lab; break; case PHOTOMETRIC_CIELAB: pt = PT_Lab; labTiffSpecial = TRUE; break; // CIE Log2(L) (u',v') case PHOTOMETRIC_LOGLUV: TIFFSetField(Bank, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT); pt = PT_YUV; // *ICCSpace = icSigLuvData; bps = 16; // 16 bits forced by LibTiff break; default: FatalError("Unsupported TIFF color space (Photometric %d)", Photometric); } // Convert bits per sample to bytes per sample bps >>= 3; IsFlt = (bps == 0) || (bps == 4); return (FLOAT_SH(IsFlt) | COLORSPACE_SH(pt) | PLANAR_SH(IsPlanar) | EXTRA_SH(extra) | PREMUL_SH(IsPremul) | CHANNELS_SH(ColorChannels) | BYTES_SH(bps) | FLAVOR_SH(IsReverse) | LABTIFF_SH(labTiffSpecial)); } // Rearrange pixel type to build output descriptor static cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutColorSpace, int bps) { int IsPlanar = T_PLANAR(dwInput); int Channels = ChanCountFromPixelType(OutColorSpace); int IsFlt = (bps == 0) || (bps == 4); int labTiffSpecial = FALSE; int Extra = T_EXTRA(dwInput); int IsPremul = T_PREMUL(dwInput); if (OutColorSpace == PT_Lab) labTiffSpecial = TRUE; return (FLOAT_SH(IsFlt) | COLORSPACE_SH(OutColorSpace) | PLANAR_SH(IsPlanar) | CHANNELS_SH(Channels) | BYTES_SH(bps) | EXTRA_SH(Extra) | PREMUL_SH(IsPremul) | LABTIFF_SH(labTiffSpecial)); } // Tile based transforms static int TileBasedXform(cmsHTRANSFORM hXForm, TIFF* in, TIFF* out, int nPlanes) { tsize_t BufSizeIn = TIFFTileSize(in); tsize_t BufSizeOut = TIFFTileSize(out); unsigned char *BufferIn, *BufferOut; ttile_t i, TileCount = TIFFNumberOfTiles(in) / nPlanes; cmsUInt32Number tw, tl; int PixelCount, j; // Check for bad tiffs if (BufSizeIn > INT_MAX || BufSizeOut > INT_MAX) FatalError("Probably corrupted TIFF, tile too big."); TIFFGetFieldDefaulted(in, TIFFTAG_TILEWIDTH, &tw); TIFFGetFieldDefaulted(in, TIFFTAG_TILELENGTH, &tl); PixelCount = (int) tw * tl; BufferIn = (unsigned char *) _TIFFmalloc(BufSizeIn * nPlanes); if (!BufferIn) OutOfMem((cmsUInt32Number) BufSizeIn * nPlanes); BufferOut = (unsigned char *) _TIFFmalloc(BufSizeOut * nPlanes); if (!BufferOut) OutOfMem((cmsUInt32Number) BufSizeOut * nPlanes); for (i = 0; i < TileCount; i++) { for (j=0; j < nPlanes; j++) { if (TIFFReadEncodedTile(in, i + (j* TileCount), BufferIn + (j*BufSizeIn), BufSizeIn) < 0) goto cleanup; } if (PixelCount < 0) FatalError("TIFF is corrupted"); cmsDoTransform(hXForm, BufferIn, BufferOut, PixelCount); for (j=0; j < nPlanes; j++) { if (TIFFWriteEncodedTile(out, i + (j*TileCount), BufferOut + (j*BufSizeOut), BufSizeOut) < 0) goto cleanup; } } _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 1; cleanup: _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 0; } // Strip based transforms static int StripBasedXform(cmsHTRANSFORM hXForm, TIFF* in, TIFF* out, int nPlanes) { tsize_t BufSizeIn = TIFFStripSize(in); tsize_t BufSizeOut = TIFFStripSize(out); unsigned char *BufferIn, *BufferOut; ttile_t i, StripCount = TIFFNumberOfStrips(in) / nPlanes; cmsUInt32Number sw; cmsUInt32Number sl; cmsUInt32Number iml; int j; int PixelCount; // Check for bad tiffs if (BufSizeIn > INT_MAX || BufSizeOut > INT_MAX) FatalError("Probably corrupted TIFF, strip too big."); TIFFGetFieldDefaulted(in, TIFFTAG_IMAGEWIDTH, &sw); TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &sl); TIFFGetFieldDefaulted(in, TIFFTAG_IMAGELENGTH, &iml); // It is possible to get infinite rows per strip if (sl == 0 || sl > iml) sl = iml; // One strip for whole image BufferIn = (unsigned char *) _TIFFmalloc(BufSizeIn * nPlanes); if (!BufferIn) OutOfMem((cmsUInt32Number) BufSizeIn * nPlanes); BufferOut = (unsigned char *) _TIFFmalloc(BufSizeOut * nPlanes); if (!BufferOut) OutOfMem((cmsUInt32Number) BufSizeOut * nPlanes); for (i = 0; i < StripCount; i++) { for (j=0; j < nPlanes; j++) { if (TIFFReadEncodedStrip(in, i + (j * StripCount), BufferIn + (j * BufSizeIn), BufSizeIn) < 0) goto cleanup; } PixelCount = (int) sw * (iml < sl ? iml : sl); iml -= sl; if (PixelCount < 0) FatalError("TIFF is corrupted"); cmsDoTransform(hXForm, BufferIn, BufferOut, PixelCount); for (j=0; j < nPlanes; j++) { if (TIFFWriteEncodedStrip(out, i + (j * StripCount), BufferOut + j * BufSizeOut, BufSizeOut) < 0) goto cleanup; } } _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 1; cleanup: _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 0; } // Fill the array with a short value static void fillArray(cmsInt16Number array[], cmsInt16Number val, cmsUInt32Number size) { cmsUInt32Number i; size /= sizeof(cmsInt16Number); for (i = 0; i < size; i++) array[i] = val; } // Creates minimum required tags static void WriteOutputTags(TIFF* out, int Colorspace, int BytesPerSample, int AlphaChannels, int IsPremul) { int BitsPerSample = (8 * BytesPerSample); int nChannels = ChanCountFromPixelType(Colorspace); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nChannels + AlphaChannels); if (AlphaChannels > 0) { cmsInt16Number Extra[20]; if (IsPremul) fillArray(Extra, EXTRASAMPLE_ASSOCALPHA, sizeof(Extra)); else fillArray(Extra, EXTRASAMPLE_UNASSALPHA, sizeof(Extra)); TIFFSetField(out, TIFFTAG_EXTRASAMPLES, AlphaChannels, Extra); } switch (Colorspace) { case PT_GRAY: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); break; case PT_RGB: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); break; case PT_CMY: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); TIFFSetField(out, TIFFTAG_INKSET, INKSET_MULTIINK); break; case PT_CMYK: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); TIFFSetField(out, TIFFTAG_INKSET, INKSET_CMYK); break; case PT_Lab: if (BitsPerSample == 16) TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CIELAB); else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CIELAB); break; // Multi-ink separations case PT_MCH2: case PT_MCH3: case PT_MCH4: case PT_MCH5: case PT_MCH6: case PT_MCH7: case PT_MCH8: case PT_MCH9: case PT_MCH10: case PT_MCH11: case PT_MCH12: case PT_MCH13: case PT_MCH14: case PT_MCH15: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); if (StoreAsAlpha && nChannels >= 4) { cmsInt16Number Extra[20]; fillArray(Extra, EXTRASAMPLE_UNASSALPHA, sizeof(Extra)); // CMYK plus extra alpha TIFFSetField(out, TIFFTAG_EXTRASAMPLES, nChannels - 4, Extra); TIFFSetField(out, TIFFTAG_INKSET, INKSET_CMYK); TIFFSetField(out, TIFFTAG_NUMBEROFINKS, 4); } else { TIFFSetField(out, TIFFTAG_INKSET, INKSET_MULTIINK); TIFFSetField(out, TIFFTAG_NUMBEROFINKS, nChannels); } break; default: FatalError("Unsupported output colorspace"); } if (PixelDepth == 32) TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP, SAMPLEFORMAT_IEEEFP, SAMPLEFORMAT_IEEEFP, SAMPLEFORMAT_IEEEFP); } // Copies a bunch of tags static void CopyOtherTags(TIFF* in, TIFF* out) { #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) short shortv; unsigned short compression; cmsUInt32Number ow, ol; cmsFloat32Number floatv; char *stringv; cmsUInt32Number longv; CopyField(TIFFTAG_SUBFILETYPE, longv); TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &ow); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &ol); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, ow); TIFFSetField(out, TIFFTAG_IMAGELENGTH, ol); CopyField(TIFFTAG_PLANARCONFIG, shortv); CopyField(TIFFTAG_COMPRESSION, compression); // This is tricky, libtiff would access predictor in a wrong way // if the codec is none of those if (compression == COMPRESSION_LZW || compression == 34925 /*COMPRESSION_LZMA*/ || compression == COMPRESSION_PIXARLOG || compression == COMPRESSION_DEFLATE || compression == COMPRESSION_ADOBE_DEFLATE || compression == 50000 /*COMPRESSION_ZSTD*/) { if (PixelDepth != 32) CopyField(TIFFTAG_PREDICTOR, shortv); } CopyField(TIFFTAG_THRESHHOLDING, shortv); CopyField(TIFFTAG_FILLORDER, shortv); CopyField(TIFFTAG_ORIENTATION, shortv); CopyField(TIFFTAG_MINSAMPLEVALUE, shortv); CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv); CopyField(TIFFTAG_XRESOLUTION, floatv); CopyField(TIFFTAG_YRESOLUTION, floatv); CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); CopyField(TIFFTAG_ROWSPERSTRIP, longv); CopyField(TIFFTAG_XPOSITION, floatv); CopyField(TIFFTAG_YPOSITION, floatv); CopyField(TIFFTAG_IMAGEDEPTH, longv); CopyField(TIFFTAG_TILEDEPTH, longv); CopyField(TIFFTAG_TILEWIDTH, longv); CopyField(TIFFTAG_TILELENGTH, longv); CopyField(TIFFTAG_ARTIST, stringv); CopyField(TIFFTAG_IMAGEDESCRIPTION, stringv); CopyField(TIFFTAG_MAKE, stringv); CopyField(TIFFTAG_MODEL, stringv); CopyField(TIFFTAG_DATETIME, stringv); CopyField(TIFFTAG_HOSTCOMPUTER, stringv); CopyField(TIFFTAG_PAGENAME, stringv); CopyField(TIFFTAG_DOCUMENTNAME, stringv); } static void DoEmbedProfile(TIFF* Out, const char* ProfileFile) { FILE* f; cmsInt32Number size; cmsUInt32Number EmbedLen; cmsUInt8Number* EmbedBuffer; f = fopen(ProfileFile, "rb"); if (f == NULL) return; size = cmsfilelength(f); if (size < 0) return; EmbedBuffer = (cmsUInt8Number*) malloc((size_t) size + 1); if (EmbedBuffer == NULL) { OutOfMem(size+1); return; } EmbedLen = (cmsUInt32Number) fread(EmbedBuffer, 1, (size_t) size, f); if (EmbedLen != (cmsUInt32Number) size) FatalError("Cannot read %ld bytes to %s", (long) size, ProfileFile); fclose(f); EmbedBuffer[EmbedLen] = 0; TIFFSetField(Out, TIFFTAG_ICCPROFILE, EmbedLen, EmbedBuffer); free(EmbedBuffer); } // Read or create a ICC profile from the TIFF data static cmsHPROFILE GetTIFFProfile(TIFF* in) { cmsCIExyYTRIPLE Primaries; cmsFloat32Number* chr; cmsCIExyY WhitePoint; cmsFloat32Number* wp; int i; cmsToneCurve* Curve[3]; cmsUInt16Number *gmr, *gmg, *gmb; cmsHPROFILE hProfile; cmsUInt32Number EmbedLen; cmsUInt8Number* EmbedBuffer; if (IgnoreEmbedded) return NULL; if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &EmbedLen, &EmbedBuffer)) { hProfile = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); // Print description found in the profile if (Verbose && (hProfile != NULL)) { fprintf(stdout, "\n[Embedded profile]\n"); PrintProfileInformation(hProfile); fflush(stdout); } if (hProfile != NULL && SaveEmbedded != NULL) SaveMemoryBlock(EmbedBuffer, EmbedLen, SaveEmbedded); if (hProfile) return hProfile; } // Try to see if "colorimetric" tiff if (TIFFGetField(in, TIFFTAG_PRIMARYCHROMATICITIES, &chr)) { Primaries.Red.x = chr[0]; Primaries.Red.y = chr[1]; Primaries.Green.x = chr[2]; Primaries.Green.y = chr[3]; Primaries.Blue.x = chr[4]; Primaries.Blue.y = chr[5]; Primaries.Red.Y = Primaries.Green.Y = Primaries.Blue.Y = 1.0; if (TIFFGetField(in, TIFFTAG_WHITEPOINT, &wp)) { WhitePoint.x = wp[0]; WhitePoint.y = wp[1]; WhitePoint.Y = 1.0; // Transfer function is a bit harder.... TIFFGetFieldDefaulted(in, TIFFTAG_TRANSFERFUNCTION, &gmr, &gmg, &gmb); Curve[0] = cmsBuildTabulatedToneCurve16(NULL, 256, gmr); Curve[1] = cmsBuildTabulatedToneCurve16(NULL, 256, gmg); Curve[2] = cmsBuildTabulatedToneCurve16(NULL, 256, gmb); hProfile = cmsCreateRGBProfileTHR(NULL, &WhitePoint, &Primaries, Curve); for (i=0; i < 3; i++) cmsFreeToneCurve(Curve[i]); if (Verbose) { fprintf(stdout, "\n[Colorimetric TIFF]\n"); } return hProfile; } } return NULL; } // Transform one image static int TransformImage(TIFF* in, TIFF* out, const char *cDefInpProf) { cmsHPROFILE hIn, hOut, hProof, hInkLimit = NULL; cmsHTRANSFORM xform; cmsUInt32Number wInput, wOutput; int OutputColorSpace; int BytesPerSample = PixelDepth / 8; cmsUInt32Number dwFlags; int nPlanes; // Default options dwFlags = cmsFLAGS_COPY_ALPHA; // Observer adaptation state (only meaningful on absolute colorimetric intent) cmsSetAdaptationState(ObserverAdaptationState); if (EmbedProfile && cOutProf) DoEmbedProfile(out, cOutProf); if (BlackWhiteCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 1: break; default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); } if (GamutCheck) dwFlags |= cmsFLAGS_GAMUTCHECK; hProof = NULL; hOut = NULL; if (lIsDeviceLink) { if (lIsCUBE) hIn = cmsCreateDeviceLinkFromCubeFile(cDefInpProf); else hIn = cmsOpenProfileFromFile(cDefInpProf, "r"); } else { hIn = GetTIFFProfile(in); if (hIn == NULL) hIn = OpenStockProfile(NULL, cDefInpProf); hOut = OpenStockProfile(NULL, cOutProf); if (cProofing != NULL) { hProof = OpenStockProfile(NULL, cProofing); dwFlags |= cmsFLAGS_SOFTPROOFING; } } if (hIn == NULL) FatalError("No input profile found"); // Take input color space wInput = GetInputPixelType(in); // Assure both, input profile and input TIFF are on same colorspace if (_cmsLCMScolorSpace(cmsGetColorSpace(hIn)) != (int) T_COLORSPACE(wInput)) FatalError("Input profile is not operating in proper color space (%d)", T_COLORSPACE(wInput)); if (!lIsDeviceLink) OutputColorSpace = _cmsLCMScolorSpace(cmsGetColorSpace(hOut)); else OutputColorSpace = _cmsLCMScolorSpace(cmsGetPCS(hIn)); wOutput = ComputeOutputFormatDescriptor(wInput, OutputColorSpace, BytesPerSample); WriteOutputTags(out, OutputColorSpace, BytesPerSample, T_EXTRA(wOutput), T_PREMUL(wOutput)); CopyOtherTags(in, out); // Ink limit if (InkLimit != 400.0 && (OutputColorSpace == PT_CMYK || OutputColorSpace == PT_CMY)) { cmsHPROFILE hProfiles[10]; int nProfiles = 0; hInkLimit = cmsCreateInkLimitingDeviceLink(cmsSigCmykData, InkLimit); hProfiles[nProfiles++] = hIn; if (hProof != NULL) { hProfiles[nProfiles++] = hProof; hProfiles[nProfiles++] = hProof; } if (hOut != NULL) { hProfiles[nProfiles++] = hOut; } hProfiles[nProfiles++] = hInkLimit; xform = cmsCreateMultiprofileTransform(hProfiles, nProfiles, wInput, wOutput, Intent, dwFlags); } else { xform = cmsCreateProofingTransform(hIn, wInput, hOut, wOutput, hProof, Intent, ProofingIntent, dwFlags); } cmsCloseProfile(hIn); cmsCloseProfile(hOut); if (hInkLimit) cmsCloseProfile(hInkLimit); if (hProof) cmsCloseProfile(hProof); if (xform == NULL) return 0; // Planar stuff if (T_PLANAR(wInput)) nPlanes = T_CHANNELS(wInput) + T_EXTRA(wInput); else nPlanes = 1; // Handle tile by tile or strip by strip if (TIFFIsTiled(in)) { TileBasedXform(xform, in, out, nPlanes); } else { StripBasedXform(xform, in, out, nPlanes); } cmsDeleteTransform(xform); TIFFWriteDirectory(out); return 1; } // Print help static void Help(int level) { UTILS_UNUSED_PARAMETER(level); fprintf(stderr, "Little CMS ICC profile applier for TIFF - v8.1 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n"); fflush(stderr); fprintf(stderr, "usage: tificc [flags] input.tif output.tif\n"); fprintf(stderr, "\nflags:\n\n"); fprintf(stderr, "-v - Verbose\n"); fprintf(stderr, "-i - Input profile (defaults to sRGB)\n"); fprintf(stderr, "-o - Output profile (defaults to sRGB)\n"); fprintf(stderr, "-l - Transform by device-link profile\n"); fprintf(stderr, "-u - Transform by CUBE colormap\n"); PrintBuiltins(); PrintRenderingIntents(); fprintf(stderr, "-b - Black point compensation\n"); fprintf(stderr, "-d<0..1> - Observer adaptation state (abs.col. only)\n"); fprintf(stderr, "-c<0,1,2,3> - Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes)\n"); fprintf(stderr, "\n"); fprintf(stderr, "-w<8,16,32> - Output depth. Use 32 for floating-point\n\n"); fprintf(stderr, "-a - Handle channels > 4 as alpha\n"); fprintf(stderr, "-n - Ignore embedded profile on input\n"); fprintf(stderr, "-e - Embed destination profile\n"); fprintf(stderr, "-s - Save embedded profile as \n"); fprintf(stderr, "\n"); fprintf(stderr, "-p - Soft proof profile\n"); fprintf(stderr, "-m - Soft proof intent\n"); fprintf(stderr, "\tThat is the intent used to translate the simulation to the output device.\n\tNote that the simulated intent is set by using -t not by -m\n"); fprintf(stderr, "-g - Marks out-of-gamut colors on softproof\n"); fprintf(stderr, "\n"); fprintf(stderr, "-k<0..400> - Ink-limiting in %% (CMYK only)\n"); fprintf(stderr, "\n"); fprintf(stderr, "Examples:\n\n" "To color correct from scanner to sRGB:\n" "\ttificc -iscanner.icm in.tif out.tif\n" "To convert from monitor1 to monitor2:\n" "\ttificc -imon1.icm -omon2.icm in.tif out.tif\n" "To make a CMYK separation:\n" "\ttificc -oprinter.icm inrgb.tif outcmyk.tif\n" "To recover sRGB from a CMYK separation:\n" "\ttificc -iprinter.icm incmyk.tif outrgb.tif\n" "To soft-proof how behaves Probev1_ICCv4.icc on perceptual:\n" "\ttifficc -t0 -p Probev1_ICCv4.icc -m1 infile.tif out.tif\n" "To convert from CIELab TIFF to sRGB\n" "\ttificc -i*Lab in.tif out.tif\n\n"); fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" "color engine. Both lcms and this program are open source.\n" "You can obtain both in source code at https://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s=xgetopt(argc,argv,"aAeEbBw:W:nNvVGgh:H:i:I:o:O:P:p:t:T:c:C:l:L:u:U:M:m:K:k:S:s:D:d:-:")) != EOF) { switch (s) { case '-': if (strcmp(xoptarg, "help") == 0) { Help(0); } else { FatalError("Unknown option - run without args to see valid ones.\n"); } break; case 'a': case 'A': StoreAsAlpha = TRUE; break; case 'b': case 'B': BlackWhiteCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 3) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'd': case 'D': ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) Warning("Adaptation state should be 0..1"); break; case 'e': case 'E': EmbedProfile = TRUE; break; case 'g': case 'G': GamutCheck = TRUE; break; case 'v': case 'V': Verbose = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("Device-link already specified"); cInpProf = xoptarg; break; case 'o': case 'O': if (lIsDeviceLink) FatalError("Device-link already specified"); cOutProf = xoptarg; break; case 'l': case 'L': if (cInpProf != NULL || cOutProf != NULL) FatalError("input/output profiles already specified"); cInpProf = xoptarg; lIsDeviceLink = TRUE; lIsCUBE = FALSE; break; case 'u': case 'U': if (cInpProf != NULL || cOutProf != NULL) FatalError("input/output profiles already specified"); cInpProf = xoptarg; lIsDeviceLink = TRUE; lIsCUBE = TRUE; break; case 'p': case 'P': cProofing = xoptarg; break; case 't': case 'T': Intent = atoi(xoptarg); break; case 'm': case 'M': ProofingIntent = atoi(xoptarg); break; case 'N': case 'n': IgnoreEmbedded = TRUE; break; case 'W': case 'w': PixelDepth = atoi(xoptarg); if (PixelDepth != 8 && PixelDepth != 16 && PixelDepth != 32) FatalError("Only 8, 16 and 32 bps are supported"); break; case 'k': case 'K': InkLimit = atof(xoptarg); if (InkLimit < 0.0 || InkLimit > 400.0) FatalError("Ink limit must be 0%%..400%%"); break; case 's': case 'S': SaveEmbedded = xoptarg; break; case 'H': case 'h': { int a = atoi(xoptarg); Help(a); } break; default: FatalError("Unknown option - run without args to see valid ones"); } } } // The main sink int main(int argc, char* argv[]) { TIFF *in, *out; cmsPlugin(&TiffLabPlugin); InitUtils("tificc"); HandleSwitches(argc, argv); if ((argc - xoptind) != 2) { Help(0); } TIFFSetErrorHandler(ConsoleErrorHandler); TIFFSetWarningHandler(ConsoleWarningHandler); in = TIFFOpen(argv[xoptind], "r"); if (in == NULL) FatalError("Unable to open '%s'", argv[xoptind]); out = TIFFOpen(argv[xoptind+1], "w"); if (out == NULL) { TIFFClose(in); FatalError("Unable to write '%s'", argv[xoptind+1]); } do { TransformImage(in, out, cInpProf); } while (TIFFReadDirectory(in)); if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } TIFFClose(in); TIFFClose(out); return 0; } lcms2-2.19.1/utils/tificc/tifdiff.c0000644000175000017500000004652315176573557016055 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "utils.h" #include "tiffio.h" // ------------------------------------------------------------------------ static TIFF *Tiff1, *Tiff2, *TiffDiff; static const char* TiffDiffFilename; static const char* CGATSout; typedef struct { double n, x, x2; double Min, Peak; } STAT, *LPSTAT; static STAT ColorantStat[4]; static STAT EuclideanStat; static STAT ColorimetricStat; static uint16_t Channels; static cmsHPROFILE hLab; static void ConsoleWarningHandler(const char* module, const char* fmt, va_list ap) { char e[512] = { '\0' }; if (module != NULL) strcat(strcpy(e, module), ": "); vsprintf(e+strlen(e), fmt, ap); strcat(e, "."); if (Verbose) { fprintf(stderr, "\nWarning"); fprintf(stderr, " %s\n", e); fflush(stderr); } } static void ConsoleErrorHandler(const char* module, const char* fmt, va_list ap) { char e[512] = { '\0' }; if (module != NULL) strcat(strcpy(e, module), ": "); vsprintf(e+strlen(e), fmt, ap); strcat(e, "."); fprintf(stderr, "\nError"); fprintf(stderr, " %s\n", e); fflush(stderr); } static void Help() { fprintf(stderr, "Little CMS TIFF compare utility. v1.1\n\n"); fprintf(stderr, "usage: tiffdiff [flags] input.tif output.tif\n"); fprintf(stderr, "\nflags:\n\n"); fprintf(stderr, "-o - Output TIFF file\n"); fprintf(stderr, "-g - Output results in CGATS file\n"); fprintf(stderr, "\n"); fprintf(stderr, "-v - Verbose (show warnings)\n"); fprintf(stderr, "-h - This help\n"); fflush(stderr); exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s=xgetopt(argc,argv,"o:O:hHvVg:G:")) != EOF) { switch (s) { case 'v': case 'V': Verbose = TRUE; break; case 'o': case 'O': TiffDiffFilename = xoptarg; break; case 'H': case 'h': Help(); break; case 'g': case 'G': CGATSout = xoptarg; break; default: FatalError("Unknown option - run without args to see valid ones"); } } } static void ClearStatistics(LPSTAT st) { st ->n = st ->x = st->x2 = st->Peak = 0; st ->Min = 1E10; } static void AddOnePixel(LPSTAT st, double dE) { st-> x += dE; st ->x2 += (dE * dE); st->n += 1.0; if (dE > st ->Peak) st ->Peak = dE; if (dE < st ->Min) st ->Min= dE; } static double Std(LPSTAT st) { return sqrt((st->n * st->x2 - st->x * st->x) / (st->n*(st->n-1))); } static double Mean(LPSTAT st) { return st ->x/st ->n; } // Build up the pixeltype descriptor static cmsUInt32Number GetInputPixelType(TIFF *Bank) { uint16_t Photometric, bps, spp, extra, PlanarConfig, *info; uint16_t Compression, reverse = 0; int ColorChannels, IsPlanar = 0, pt = 0; TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); TIFFGetFieldDefaulted(Bank, TIFFTAG_BITSPERSAMPLE, &bps); if (bps == 1) FatalError("Sorry, bilevel TIFFs has nothig to do with ICC profiles"); if (bps != 8 && bps != 16) FatalError("Sorry, 8 or 16 bits per sample only"); TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); TIFFGetFieldDefaulted(Bank, TIFFTAG_PLANARCONFIG, &PlanarConfig); switch (PlanarConfig) { case PLANARCONFIG_CONTIG: IsPlanar = 0; break; case PLANARCONFIG_SEPARATE: FatalError("Planar TIFF are not supported"); default: FatalError("Unsupported planar configuration (=%d) ", (int) PlanarConfig); } // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need // not to be included. if (spp == 1) IsPlanar = 0; // Any alpha? TIFFGetFieldDefaulted(Bank, TIFFTAG_EXTRASAMPLES, &extra, &info); ColorChannels = spp - extra; switch (Photometric) { case PHOTOMETRIC_MINISWHITE: reverse = 1; case PHOTOMETRIC_MINISBLACK: pt = PT_GRAY; break; case PHOTOMETRIC_RGB: pt = PT_RGB; break; case PHOTOMETRIC_PALETTE: FatalError("Sorry, palette images not supported (at least on this version)"); case PHOTOMETRIC_SEPARATED: pt = PixelTypeFromChanCount(ColorChannels); break; case PHOTOMETRIC_YCBCR: TIFFGetField(Bank, TIFFTAG_COMPRESSION, &Compression); { uint16_t subx, suby; pt = PT_YCbCr; TIFFGetFieldDefaulted(Bank, TIFFTAG_YCBCRSUBSAMPLING, &subx, &suby); if (subx != 1 || suby != 1) FatalError("Sorry, subsampled images not supported"); } break; case 9: case PHOTOMETRIC_CIELAB: pt = PT_Lab; break; case PHOTOMETRIC_LOGLUV: /* CIE Log2(L) (u',v') */ TIFFSetField(Bank, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT); pt = PT_YUV; // *ICCSpace = icSigLuvData; bps = 16; // 16 bits forced by LibTiff break; default: FatalError("Unsupported TIFF color space (Photometric %d)", Photometric); } // Convert bits per sample to bytes per sample bps >>= 3; return (COLORSPACE_SH(pt)|PLANAR_SH(IsPlanar)|EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|FLAVOR_SH(reverse)); } static cmsUInt32Number OpenEmbedded(TIFF* tiff, cmsHPROFILE* PtrProfile, cmsHTRANSFORM* PtrXform) { cmsUInt32Number EmbedLen, dwFormat = 0; cmsUInt8Number* EmbedBuffer; *PtrProfile = NULL; *PtrXform = NULL; if (TIFFGetField(tiff, TIFFTAG_ICCPROFILE, &EmbedLen, &EmbedBuffer)) { *PtrProfile = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); if (Verbose) { fprintf(stdout, "Embedded profile found:\n"); PrintProfileInformation(*PtrProfile); } dwFormat = GetInputPixelType(tiff); *PtrXform = cmsCreateTransform(*PtrProfile, dwFormat, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); } return dwFormat; } static size_t PixelSize(cmsUInt32Number dwFormat) { return T_BYTES(dwFormat) * (T_CHANNELS(dwFormat) + T_EXTRA(dwFormat)); } static int CmpImages(TIFF* tiff1, TIFF* tiff2, TIFF* diff) { cmsUInt8Number* buf1, *buf2, *buf3=NULL; int row, cols, imagewidth = 0, imagelength = 0; uint16_t Photometric; double dE = 0; double dR, dG, dB, dC, dM, dY, dK; int rc = 0; cmsHPROFILE hProfile1 = 0, hProfile2 = 0; cmsHTRANSFORM xform1 = 0, xform2 = 0; cmsUInt32Number dwFormat1, dwFormat2; TIFFGetField(tiff1, TIFFTAG_PHOTOMETRIC, &Photometric); TIFFGetField(tiff1, TIFFTAG_IMAGEWIDTH, &imagewidth); TIFFGetField(tiff1, TIFFTAG_IMAGELENGTH, &imagelength); TIFFGetField(tiff1, TIFFTAG_SAMPLESPERPIXEL, &Channels); dwFormat1 = OpenEmbedded(tiff1, &hProfile1, &xform1); dwFormat2 = OpenEmbedded(tiff2, &hProfile2, &xform2); buf1 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(tiff1)); buf2 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(tiff2)); if (diff) { TIFFSetField(diff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); TIFFSetField(diff, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField(diff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(diff, TIFFTAG_IMAGEWIDTH, imagewidth); TIFFSetField(diff, TIFFTAG_IMAGELENGTH, imagelength); TIFFSetField(diff, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(diff, TIFFTAG_BITSPERSAMPLE, 8); buf3 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(diff)); } for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(tiff1, buf1, row, 0) < 0) goto Error; if (TIFFReadScanline(tiff2, buf2, row, 0) < 0) goto Error; for (cols = 0; cols < imagewidth; cols++) { switch (Photometric) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: dE = fabs(buf2[cols] - buf1[cols]); AddOnePixel(&ColorantStat[0], dE); AddOnePixel(&EuclideanStat, dE); break; case PHOTOMETRIC_RGB: { int index = 3 * cols; dR = fabs(buf2[index+0] - buf1[index+0]); dG = fabs(buf2[index+1] - buf1[index+1]); dB = fabs(buf2[index+2] - buf1[index+2]); dE = sqrt(dR * dR + dG * dG + dB * dB) / sqrt(3.); } AddOnePixel(&ColorantStat[0], dR); AddOnePixel(&ColorantStat[1], dG); AddOnePixel(&ColorantStat[2], dB); AddOnePixel(&EuclideanStat, dE); break; case PHOTOMETRIC_SEPARATED: { int index = 4 * cols; dC = fabs(buf2[index+0] - buf1[index+0]); dM = fabs(buf2[index+1] - buf1[index+1]); dY = fabs(buf2[index+2] - buf1[index+2]); dK = fabs(buf2[index+3] - buf1[index+3]); dE = sqrt(dC * dC + dM * dM + dY * dY + dK * dK) / 2.; } AddOnePixel(&ColorantStat[0], dC); AddOnePixel(&ColorantStat[1], dM); AddOnePixel(&ColorantStat[2], dY); AddOnePixel(&ColorantStat[3], dK); AddOnePixel(&EuclideanStat, dE); break; default: FatalError("Unsupported channels: %d", Channels); } if (xform1 && xform2) { cmsCIELab Lab1, Lab2; size_t index1 = cols * PixelSize(dwFormat1); size_t index2 = cols * PixelSize(dwFormat2); cmsDoTransform(xform1, &buf1[index1], &Lab1, 1); cmsDoTransform(xform2, &buf2[index2], &Lab2, 1); dE = cmsDeltaE(&Lab1, &Lab2); AddOnePixel(&ColorimetricStat, dE); } if (diff) { buf3[cols] = (cmsUInt8Number) floor(dE + 0.5); } } if (diff) { if (TIFFWriteScanline(diff, buf3, row, 0) < 0) goto Error; } } rc = 1; Error: if (hProfile1) cmsCloseProfile(hProfile1); if (hProfile2) cmsCloseProfile(hProfile2); if (xform1) cmsDeleteTransform(xform1); if (xform2) cmsDeleteTransform(xform2); _TIFFfree(buf1); _TIFFfree(buf2); if (diff) { TIFFWriteDirectory(diff); if (buf3 != NULL) _TIFFfree(buf3); } return rc; } static void AssureShortTagIs(TIFF* tif1, TIFF* tiff2, int tag, int Val, const char* Error) { uint16_t v1; if (!TIFFGetField(tif1, tag, &v1)) goto Err; if (v1 != Val) goto Err; if (!TIFFGetField(tiff2, tag, &v1)) goto Err; if (v1 != Val) goto Err; return; Err: FatalError("%s is not proper", Error); } static int CmpShortTag(TIFF* tif1, TIFF* tif2, int tag) { uint16_t v1, v2; if (!TIFFGetField(tif1, tag, &v1)) return 0; if (!TIFFGetField(tif2, tag, &v2)) return 0; return v1 == v2; } static int CmpLongTag(TIFF* tif1, TIFF* tif2, int tag) { uint32_t v1, v2; if (!TIFFGetField(tif1, tag, &v1)) return 0; if (!TIFFGetField(tif2, tag, &v2)) return 0; return v1 == v2; } static void EqualShortTag(TIFF* tif1, TIFF* tif2, int tag, const char* Error) { if (!CmpShortTag(tif1, tif2, tag)) FatalError("%s is different", Error); } static void EqualLongTag(TIFF* tif1, TIFF* tif2, int tag, const char* Error) { if (!CmpLongTag(tif1, tif2, tag)) FatalError("%s is different", Error); } static void AddOneCGATSRow(cmsHANDLE hIT8, char *Name, LPSTAT st) { double Per100 = 100.0 * ((255.0 - Mean(st)) / 255.0); cmsIT8SetData(hIT8, Name, "SAMPLE_ID", Name); cmsIT8SetDataDbl(hIT8, Name, "PER100_EQUAL", Per100); cmsIT8SetDataDbl(hIT8, Name, "MEAN_DE", Mean(st)); cmsIT8SetDataDbl(hIT8, Name, "STDEV_DE", Std(st)); cmsIT8SetDataDbl(hIT8, Name, "MIN_DE", st ->Min); cmsIT8SetDataDbl(hIT8, Name, "MAX_DE", st ->Peak); } static void CreateCGATS(const char* TiffName1, const char* TiffName2) { cmsHANDLE hIT8 = cmsIT8Alloc(0); time_t ltime; char Buffer[256]; cmsIT8SetSheetType(hIT8, "TIFFDIFF"); sprintf(Buffer, "Differences between %s and %s", TiffName1, TiffName2); cmsIT8SetComment(hIT8, Buffer); cmsIT8SetPropertyStr(hIT8, "ORIGINATOR", "TIFFDIFF"); time( <ime ); strcpy(Buffer, ctime(<ime)); Buffer[strlen(Buffer)-1] = 0; // Remove the nasty "\n" cmsIT8SetPropertyStr(hIT8, "CREATED", Buffer); cmsIT8SetComment(hIT8, " "); cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_FIELDS", 6); cmsIT8SetDataFormat(hIT8, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8, 1, "PER100_EQUAL"); cmsIT8SetDataFormat(hIT8, 2, "MEAN_DE"); cmsIT8SetDataFormat(hIT8, 3, "STDEV_DE"); cmsIT8SetDataFormat(hIT8, 4, "MIN_DE"); cmsIT8SetDataFormat(hIT8, 5, "MAX_DE"); switch (Channels) { case 1: cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 3); AddOneCGATSRow(hIT8, "GRAY_PLANE", &ColorantStat[0]); break; case 3: cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 5); AddOneCGATSRow(hIT8, "R_PLANE", &ColorantStat[0]); AddOneCGATSRow(hIT8, "G_PLANE", &ColorantStat[1]); AddOneCGATSRow(hIT8, "B_PLANE", &ColorantStat[2]); break; case 4: cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 6); AddOneCGATSRow(hIT8, "C_PLANE", &ColorantStat[0]); AddOneCGATSRow(hIT8, "M_PLANE", &ColorantStat[1]); AddOneCGATSRow(hIT8, "Y_PLANE", &ColorantStat[2]); AddOneCGATSRow(hIT8, "K_PLANE", &ColorantStat[3]); break; default: FatalError("Internal error: Bad ColorSpace"); } AddOneCGATSRow(hIT8, "EUCLIDEAN", &EuclideanStat); AddOneCGATSRow(hIT8, "COLORIMETRIC", &ColorimetricStat); cmsIT8SaveToFile(hIT8, CGATSout); cmsIT8Free(hIT8); } int main(int argc, char* argv[]) { int i; Tiff1 = Tiff2 = TiffDiff = NULL; InitUtils("tiffdiff"); HandleSwitches(argc, argv); if ((argc - xoptind) != 2) { Help(); } TIFFSetErrorHandler(ConsoleErrorHandler); TIFFSetWarningHandler(ConsoleWarningHandler); Tiff1 = TIFFOpen(argv[xoptind], "r"); if (Tiff1 == NULL) FatalError("Unable to open '%s'", argv[xoptind]); Tiff2 = TIFFOpen(argv[xoptind+1], "r"); if (Tiff2 == NULL) FatalError("Unable to open '%s'", argv[xoptind+1]); if (TiffDiffFilename) { TiffDiff = TIFFOpen(TiffDiffFilename, "w"); if (TiffDiff == NULL) FatalError("Unable to create '%s'", TiffDiffFilename); } AssureShortTagIs(Tiff1, Tiff2, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG, "Planar Config"); AssureShortTagIs(Tiff1, Tiff2, TIFFTAG_BITSPERSAMPLE, 8, "8 bit per sample"); EqualLongTag(Tiff1, Tiff2, TIFFTAG_IMAGEWIDTH, "Image width"); EqualLongTag(Tiff1, Tiff2, TIFFTAG_IMAGELENGTH, "Image length"); EqualShortTag(Tiff1, Tiff2, TIFFTAG_SAMPLESPERPIXEL, "Samples per pixel"); hLab = cmsCreateLab4Profile(NULL); ClearStatistics(&EuclideanStat); for (i=0; i < 4; i++) ClearStatistics(&ColorantStat[i]); if (!CmpImages(Tiff1, Tiff2, TiffDiff)) FatalError("Error comparing images"); if (CGATSout) { CreateCGATS(argv[xoptind], argv[xoptind+1]); } else { double Per100 = 100.0 * ((255.0 - Mean(&EuclideanStat)) / 255.0); printf("Digital counts %g%% equal. mean %g, min %g, max %g, Std %g\n", Per100, Mean(&EuclideanStat), EuclideanStat.Min, EuclideanStat.Peak, Std(&EuclideanStat)); if (ColorimetricStat.n > 0) { Per100 = 100.0 * ((255.0 - Mean(&ColorimetricStat)) / 255.0); printf("dE Colorimetric %g%% equal. mean %g, min %g, max %g, Std %g\n", Per100, Mean(&ColorimetricStat), ColorimetricStat.Min, ColorimetricStat.Peak, Std(&ColorimetricStat)); } } if (hLab) cmsCloseProfile(hLab); if (Tiff1) TIFFClose(Tiff1); if (Tiff2) TIFFClose(Tiff2); if (TiffDiff) TIFFClose(TiffDiff); return 0; } lcms2-2.19.1/utils/tificc/meson.build0000644000175000017500000000062615176573557016432 0ustar martimartitificc_sources = files( 'tificc.c', ) tificc_exe = executable( 'tificc', tificc_sources, dependencies: [liblcms2_dep, common_dep, tiff_dep], install: true, ) tificc_man = files( 'tificc.1', ) install_man(tificc_man) tifdiff_sources = files( 'tifdiff.c', ) tifdiff_exe = executable( 'tifdiff', tifdiff_sources, dependencies: [liblcms2_dep, common_dep, tiff_dep], install: true, ) lcms2-2.19.1/utils/tificc/Makefile.am0000644000175000017500000000121015176573557016312 0ustar martimarti# # Makefile for building tificc # Originally written by Bob Friesenhahn, June 2003 # bugs introduced by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common if HasTIFF bin_PROGRAMS = tificc else bin_PROGRAMS = endif tificc_LDADD = $(top_builddir)/src/liblcms2.la @TIFFICC_DEPLIBS@ tificc_LDFLAGS = @LDFLAGS@ tificc_SOURCES = tificc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = tificc.1 EXTRA_DIST = $(man_MANS) lcms2-2.19.1/utils/tificc/Makefile.in0000644000175000017500000005506115176574547016340 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building tificc # Originally written by Bob Friesenhahn, June 2003 # bugs introduced by Marti Maria VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HasTIFF_TRUE@bin_PROGRAMS = tificc$(EXEEXT) subdir = utils/tificc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_tificc_OBJECTS = tificc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ ../common/vprf.$(OBJEXT) tificc_OBJECTS = $(am_tificc_OBJECTS) tificc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = tificc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(tificc_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = am__maybe_remake_depfiles = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(tificc_SOURCES) DIST_SOURCES = $(tificc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common tificc_LDADD = $(top_builddir)/src/liblcms2.la @TIFFICC_DEPLIBS@ tificc_LDFLAGS = @LDFLAGS@ tificc_SOURCES = tificc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = tificc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/tificc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/tificc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: $(am__rm_f) $(bin_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) ../common/$(am__dirstamp): @$(MKDIR_P) ../common @: >>../common/$(am__dirstamp) ../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) ../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) tificc$(EXEEXT): $(tificc_OBJECTS) $(tificc_DEPENDENCIES) $(EXTRA_tificc_DEPENDENCIES) @rm -f tificc$(EXEEXT) $(AM_V_CCLD)$(tificc_LINK) $(tificc_OBJECTS) $(tificc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../common/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) -$(am__rm_f) ../common/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/utils/transicc/0000755000175000017500000000000015176574562014626 5ustar martimartilcms2-2.19.1/utils/transicc/meson.build0000644000175000017500000000036415176573557016776 0ustar martimartitransicc_sources = files( 'transicc.c', ) transicc_exe = executable( 'transicc', transicc_sources, dependencies: [liblcms2_dep, common_dep, m_dep], install: true, ) transicc_man = files( 'transicc.1', ) install_man(transicc_man) lcms2-2.19.1/utils/transicc/transicc.10000644000175000017500000000400015176573557016513 0ustar martimarti.\"Shiju P. Nair September 30, 2004 .\"Thomas Weber April 23, 2014 .TH TRANSICC 1 "MAY 30, 2011" .SH NAME transicc - little cms ColorSpace conversion calculator. .SH SYNOPSIS .B transicc .RI [ options ]\ [ CGATSINPUT ]\ [ CGATSOUTPUT ] .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B transicc is a lcms ColorSpace conversion calculator. .SH OPTIONS .TP .B \-b Black point compensation. .TP .BI \-c\ NUM Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]. .TP .BI \-d\ NUM Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 0.0]. .TP .B \-e Encoded representation of numbers is not float (Option \fB\-w\fR=use 16 bits, Option \fB\-x\fR=hexadecimal). .TP .B \-g Marks out-of-gamut colors on softproof. .TP .BI \-i\ profile Input profile (defaults to sRGB). .TP .B \-l Transform by device-link profile. .TP .BI \-m\ NUM SoftProof intent (0,1,2,3) [defaults to 0]. .TP .B \-n Terse output, intended for pipe usage. .TP .BI \-o\ profile Output profile (defaults to sRGB). .TP .B \-q Quantize CGATS to 8 bits. .TP .BI \-s Bounded mode. .TP .BI \-t\ NUM Rendering intent .nf .RS 0=Perceptual [default] 1=Relative colorimetric 2=Saturation 3=Absolute colorimetric 10=Perceptual preserving black ink 11=Relative colorimetric preserving black ink 12=Saturation preserving black ink 13=Perceptual preserving black plane 14=Relative colorimetric preserving black plane 15=Saturation preserving black plane .RE .fi .TP .BI \-v\ verbosity Verbosity level, (0=None, 1=Normal, 2=High, 3=Very High) [defaults to 1]. .TP .B \-w Use 16 bits. .TP .B \-x Hexadecimal. .TP You can use '*Lab' and '*xyz' as built-in profiles. .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpgicc (1), .BR linkicc (1), .BR psicc (1), .BR tificc (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.19.1/utils/transicc/transicc.c0000644000175000017500000010557415176573557016617 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include "utils.h" #ifndef _MSC_VER # include #endif #ifdef CMS_IS_WINDOWS_ # include #endif #define MAX_INPUT_BUFFER 4096 // Global options static cmsBool InHexa = FALSE; static cmsBool GamutCheck = FALSE; static cmsBool Width16 = FALSE; static cmsBool BlackPointCompensation = FALSE; static cmsBool lIsDeviceLink = FALSE; static cmsBool lQuantize = FALSE; static cmsBool lUnbounded = TRUE; static cmsBool lIsFloat = TRUE; static cmsUInt32Number Intent = INTENT_PERCEPTUAL; static cmsUInt32Number ProofingIntent = INTENT_PERCEPTUAL; static int PrecalcMode = 0; // -------------------------------------------------------------- static char *cInProf = NULL; static char *cOutProf = NULL; static char *cProofing = NULL; static char *IncludePart = NULL; static cmsHANDLE hIT8in = NULL; // CGATS input static cmsHANDLE hIT8out = NULL; // CGATS output static char CGATSPatch[1024]; // Actual Patch Name static char CGATSoutFilename[cmsMAX_PATH]; static int nMaxPatches; static cmsHTRANSFORM hTrans, hTransXYZ, hTransLab; static cmsBool InputNamedColor = FALSE; static cmsColorSpaceSignature InputColorSpace, OutputColorSpace; static cmsNAMEDCOLORLIST* InputColorant = NULL; static cmsNAMEDCOLORLIST* OutputColorant = NULL; static cmsFloat64Number InputRange, OutputRange; // isatty replacement #ifdef _MSC_VER #define xisatty(x) _isatty( _fileno( (x) ) ) #else #define xisatty(x) isatty( fileno( (x) ) ) #endif //--------------------------------------------------------------------------------------------------- // Print usage to stderr static void Help(void) { fprintf(stderr, "usage: transicc [flags] [CGATS input] [CGATS output]\n\n"); fprintf(stderr, "flags:\n\n"); fprintf(stderr, "-v<0..3> - Verbosity level\n"); fprintf(stderr, "-e[op] - Encoded representation of numbers\n"); fprintf(stderr, "\t-w - use 16 bits\n"); fprintf(stderr, "\t-x - Hexadecimal\n\n"); fprintf(stderr, "-s - bounded mode (clip negatives and highlights)\n"); fprintf(stderr, "-q - Quantize (round decimals)\n\n"); fprintf(stderr, "-i - Input profile (defaults to sRGB)\n"); fprintf(stderr, "-o - Output profile (defaults to sRGB)\n"); fprintf(stderr, "-l - Transform by device-link profile\n"); PrintBuiltins(); PrintRenderingIntents(); fprintf(stderr, "\n"); fprintf(stderr, "-d<0..1> - Observer adaptation state (abs.col. only)\n\n"); fprintf(stderr, "-b - Black point compensation\n"); fprintf(stderr, "-c<0,1,2,3> Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes)\n\n"); fprintf(stderr, "-n - Terse output, intended for pipe usage\n"); fprintf(stderr, "-p - Soft proof profile\n"); fprintf(stderr, "-m<0,1,2,3> - Soft proof intent\n"); fprintf(stderr, "-g - Marks out-of-gamut colors on softproof\n\n"); fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" "color engine. Both lcms and this program are open source.\n" "You can obtain both in source code at https://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s = xgetopt(argc, argv, "bBC:c:d:D:eEgGI:i:L:l:m:M:nNO:o:p:P:QqSsT:t:V:v:WwxX!:-:")) != EOF) { switch (s){ case '-': if (strcmp(xoptarg, "help") == 0) { Help(); exit(0); } else { FatalError("Unknown option - run without args to see valid ones.\n"); } break; case '!': IncludePart = xoptarg; break; case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 3) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'd': case 'D': { cmsFloat64Number ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) FatalError("Adaptation states should be between 0 and 1"); cmsSetAdaptationState(ObserverAdaptationState); } break; case 'e': case 'E': lIsFloat = FALSE; break; case 'g': case 'G': GamutCheck = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("icctrans: Device-link already specified"); cInProf = xoptarg; break; case 'l': case 'L': cInProf = xoptarg; lIsDeviceLink = TRUE; break; // No extra intents for proofing case 'm': case 'M': ProofingIntent = atoi(xoptarg); if (ProofingIntent > 3) FatalError("Unknown Proofing Intent '%d'", ProofingIntent); break; // For compatibility case 'n': case 'N': Verbose = 0; break; // Output profile case 'o': case 'O': if (lIsDeviceLink) FatalError("icctrans: Device-link already specified"); cOutProf = xoptarg; break; // Proofing profile case 'p': case 'P': cProofing = xoptarg; break; // Quantize (get rid of decimals) case 'q': case 'Q': lQuantize = TRUE; break; // Inhibit unbounded mode case 's': case 'S': lUnbounded = FALSE; break; // The intent case 't': case 'T': Intent = atoi(xoptarg); break; // Verbosity level case 'V': case 'v': Verbose = atoi(xoptarg); if (Verbose < 0 || Verbose > 3) { FatalError("Unknown verbosity level '%d'", Verbose); } break; // Wide (16 bits) case 'W': case 'w': Width16 = TRUE; break; // Hexadecimal case 'x': case 'X': InHexa = TRUE; break; default: FatalError("Unknown option - run without args to see valid ones.\n"); } } // If output CGATS involved, switch to float if ((argc - xoptind) > 2) { lIsFloat = TRUE; } } static void SetRange(cmsFloat64Number range, cmsBool IsInput) { if (IsInput) InputRange = range; else OutputRange = range; } // Populate a named color list with usual component names. // I am using the first Colorant channel to store the range, but it works since // this space is not used anyway. static cmsNAMEDCOLORLIST* ComponentNames(cmsColorSpaceSignature space, cmsBool IsInput) { cmsNAMEDCOLORLIST* out; int i, n; char Buffer[cmsMAX_PATH]; out = cmsAllocNamedColorList(0, 12, cmsMAXCHANNELS, "", ""); if (out == NULL) return NULL; switch (space) { case cmsSigXYZData: SetRange(100, IsInput); cmsAppendNamedColor(out, "X", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "Z", NULL, NULL); break; case cmsSigLabData: SetRange(1, IsInput); cmsAppendNamedColor(out, "L*", NULL, NULL); cmsAppendNamedColor(out, "a*", NULL, NULL); cmsAppendNamedColor(out, "b*", NULL, NULL); break; case cmsSigLuvData: SetRange(1, IsInput); cmsAppendNamedColor(out, "L", NULL, NULL); cmsAppendNamedColor(out, "u", NULL, NULL); cmsAppendNamedColor(out, "v", NULL, NULL); break; case cmsSigYCbCrData: SetRange(255, IsInput); cmsAppendNamedColor(out, "Y", NULL, NULL ); cmsAppendNamedColor(out, "Cb", NULL, NULL); cmsAppendNamedColor(out, "Cr", NULL, NULL); break; case cmsSigYxyData: SetRange(1, IsInput); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "x", NULL, NULL); cmsAppendNamedColor(out, "y", NULL, NULL); break; case cmsSigRgbData: SetRange(255, IsInput); cmsAppendNamedColor(out, "R", NULL, NULL); cmsAppendNamedColor(out, "G", NULL, NULL); cmsAppendNamedColor(out, "B", NULL, NULL); break; case cmsSigGrayData: SetRange(255, IsInput); cmsAppendNamedColor(out, "G", NULL, NULL); break; case cmsSigHsvData: SetRange(255, IsInput); cmsAppendNamedColor(out, "H", NULL, NULL); cmsAppendNamedColor(out, "s", NULL, NULL); cmsAppendNamedColor(out, "v", NULL, NULL); break; case cmsSigHlsData: SetRange(255, IsInput); cmsAppendNamedColor(out, "H", NULL, NULL); cmsAppendNamedColor(out, "l", NULL, NULL); cmsAppendNamedColor(out, "s", NULL, NULL); break; case cmsSigCmykData: SetRange(1, IsInput); cmsAppendNamedColor(out, "C", NULL, NULL); cmsAppendNamedColor(out, "M", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "K", NULL, NULL); break; case cmsSigCmyData: SetRange(1, IsInput); cmsAppendNamedColor(out, "C", NULL, NULL); cmsAppendNamedColor(out, "M", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); break; default: SetRange(1, IsInput); n = cmsChannelsOfColorSpace(space); for (i=0; i < n; i++) { sprintf(Buffer, "Channel #%d", i + 1); cmsAppendNamedColor(out, Buffer, NULL, NULL); } } return out; } // Creates all needed color transforms static cmsBool OpenTransforms(void) { cmsHPROFILE hInput, hOutput, hProof; cmsUInt32Number dwIn, dwOut, dwFlags; cmsNAMEDCOLORLIST* List; int i; // We don't need cache dwFlags = cmsFLAGS_NOCACHE; if (lIsDeviceLink) { hInput = OpenStockProfile(0, cInProf); if (hInput == NULL) return FALSE; hOutput = NULL; hProof = NULL; if (cmsGetDeviceClass(hInput) == cmsSigNamedColorClass) { OutputColorSpace = cmsGetColorSpace(hInput); InputColorSpace = cmsGetPCS(hInput); } else { InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetPCS(hInput); } // Read colorant tables if present if (cmsIsTag(hInput, cmsSigColorantTableTag)) { List = cmsReadTag(hInput, cmsSigColorantTableTag); InputColorant = cmsDupNamedColorList(List); InputRange = 1; } else InputColorant = ComponentNames(InputColorSpace, TRUE); if (cmsIsTag(hInput, cmsSigColorantTableOutTag)){ List = cmsReadTag(hInput, cmsSigColorantTableOutTag); OutputColorant = cmsDupNamedColorList(List); OutputRange = 1; } else OutputColorant = ComponentNames(OutputColorSpace, FALSE); } else { hInput = OpenStockProfile(0, cInProf); if (hInput == NULL) return FALSE; hOutput = OpenStockProfile(0, cOutProf); if (hOutput == NULL) return FALSE; hProof = NULL; if (cmsGetDeviceClass(hInput) == cmsSigLinkClass || cmsGetDeviceClass(hOutput) == cmsSigLinkClass) FatalError("Use -l flag for devicelink profiles!\n"); InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetColorSpace(hOutput); // Read colorant tables if present if (cmsIsTag(hInput, cmsSigColorantTableTag)) { List = cmsReadTag(hInput, cmsSigColorantTableTag); InputColorant = cmsDupNamedColorList(List); if (cmsNamedColorCount(InputColorant) <= 3) SetRange(255, TRUE); else SetRange(1, TRUE); // Inks are already divided by 100 in the formatter } else InputColorant = ComponentNames(InputColorSpace, TRUE); if (cmsIsTag(hOutput, cmsSigColorantTableTag)){ List = cmsReadTag(hOutput, cmsSigColorantTableTag); OutputColorant = cmsDupNamedColorList(List); if (cmsNamedColorCount(OutputColorant) <= 3) SetRange(255, FALSE); else SetRange(1, FALSE); // Inks are already divided by 100 in the formatter } else OutputColorant = ComponentNames(OutputColorSpace, FALSE); if (cProofing != NULL) { hProof = OpenStockProfile(0, cProofing); if (hProof == NULL) return FALSE; dwFlags |= cmsFLAGS_SOFTPROOFING; } } // Print information on profiles if (Verbose > 2) { printf("Profile:\n"); PrintProfileInformation(hInput); if (hOutput) { printf("Output profile:\n"); PrintProfileInformation(hOutput); } if (hProof != NULL) { printf("Proofing profile:\n"); PrintProfileInformation(hProof); } } // Input is always in floating point dwIn = cmsFormatterForColorspaceOfProfile(hInput, 0, TRUE); if (lIsDeviceLink) { dwOut = cmsFormatterForPCSOfProfile(hInput, lIsFloat ? 0 : 2, lIsFloat); } else { // 16 bits or floating point (only on output) dwOut = cmsFormatterForColorspaceOfProfile(hOutput, lIsFloat ? 0 : 2, lIsFloat); } // For named color, there is a specialized formatter if (cmsGetDeviceClass(hInput) == cmsSigNamedColorClass) { dwIn = TYPE_NAMED_COLOR_INDEX; InputNamedColor = TRUE; } // Precision mode switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 1: break; default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); } if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; if (GamutCheck) { cmsUInt16Number Alarm[cmsMAXCHANNELS]; if (hProof == NULL) FatalError("I need proofing profile -p for gamut checking!"); for (i=0; i < cmsMAXCHANNELS; i++) Alarm[i] = 0xFFFF; cmsSetAlarmCodes(Alarm); dwFlags |= cmsFLAGS_GAMUTCHECK; } // The main transform hTrans = cmsCreateProofingTransform(hInput, dwIn, hOutput, dwOut, hProof, Intent, ProofingIntent, dwFlags); if (hProof) cmsCloseProfile(hProof); if (hTrans == NULL) return FALSE; // PCS Dump if requested hTransXYZ = NULL; hTransLab = NULL; if (hOutput && Verbose > 1) { cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); hTransXYZ = cmsCreateTransform(hInput, dwIn, hXYZ, lIsFloat ? TYPE_XYZ_DBL : TYPE_XYZ_16, Intent, cmsFLAGS_NOCACHE); if (hTransXYZ == NULL) return FALSE; hTransLab = cmsCreateTransform(hInput, dwIn, hLab, lIsFloat? TYPE_Lab_DBL : TYPE_Lab_16, Intent, cmsFLAGS_NOCACHE); if (hTransLab == NULL) return FALSE; cmsCloseProfile(hXYZ); cmsCloseProfile(hLab); } if (hInput) cmsCloseProfile(hInput); if (hOutput) cmsCloseProfile(hOutput); return TRUE; } // Free open resources static void CloseTransforms(void) { if (InputColorant) cmsFreeNamedColorList(InputColorant); if (OutputColorant) cmsFreeNamedColorList(OutputColorant); if (hTrans) cmsDeleteTransform(hTrans); if (hTransLab) cmsDeleteTransform(hTransLab); if (hTransXYZ) cmsDeleteTransform(hTransXYZ); } // --------------------------------------------------------------------------------------------------- // Get input from user static void GetLine(char* Buffer, const char* frm, ...) { int res; va_list args; va_start(args, frm); do { if (xisatty(stdin)) vfprintf(stderr, frm, args); res = scanf("%4095s", Buffer); // Reported codeQL bug: 'The result of scanf is only checked against 0, but it can also return EOF.' // It is not obviously "only checked against 0", but it happens that C99 requires EOF to be negative if (res < 0 || toupper(Buffer[0]) == 'Q') { // Quit? CloseTransforms(); if (xisatty(stdin)) fprintf(stderr, "Done.\n"); exit(0); } } while (res == 0); va_end(args); } // Print a value which is given in double floating point static void PrintFloatResults(cmsFloat64Number Value[]) { cmsUInt32Number i, n; char ChannelName[cmsMAX_PATH]; cmsFloat64Number v; n = cmsChannelsOfColorSpace(OutputColorSpace); for (i=0; i < n; i++) { if (OutputColorant != NULL) { cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, NULL); } else { OutputRange = 1; sprintf(ChannelName, "Channel #%u", i + 1); } v = (cmsFloat64Number) Value[i]* OutputRange; if (lQuantize) v = floor(v + 0.5); if (!lUnbounded) { if (v < 0) v = 0; if (v > OutputRange) v = OutputRange; } if (Verbose <= 0) printf("%.4f ", v); else printf("%s=%.4f ", ChannelName, v); } printf("\n"); } // Get a named-color index static cmsUInt16Number GetIndex(void) { char Buffer[4096], Name[cmsMAX_PATH], Prefix[40], Suffix[40]; int index, max; const cmsNAMEDCOLORLIST* NamedColorList; NamedColorList = cmsGetNamedColorList(hTrans); if (NamedColorList == NULL) return 0; max = cmsNamedColorCount(NamedColorList)-1; GetLine(Buffer, "Color index (0..%d)? ", max); index = atoi(Buffer); if (index > max) FatalError("Named color %d out of range!", index); cmsNamedColorInfo(NamedColorList, index, Name, Prefix, Suffix, NULL, NULL); printf("\n%s %s %s\n", Prefix, Name, Suffix); return (cmsUInt16Number) index; } // Read values from a text file or terminal static void TakeFloatValues(cmsFloat64Number Float[]) { cmsUInt32Number i, n; char ChannelName[cmsMAX_PATH]; char Buffer[4096]; if (xisatty(stdin)) fprintf(stderr, "\nEnter values, 'q' to quit\n"); if (InputNamedColor) { // This is named color index, which is always cmsUInt16Number cmsUInt16Number index = GetIndex(); memcpy(Float, &index, sizeof(cmsUInt16Number)); return; } n = cmsChannelsOfColorSpace(InputColorSpace); for (i=0; i < n; i++) { if (InputColorant) { cmsNamedColorInfo(InputColorant, i, ChannelName, NULL, NULL, NULL, NULL); } else { InputRange = 1; sprintf(ChannelName, "Channel #%u", i+1); } GetLine(Buffer, "%s? ", ChannelName); Float[i] = (cmsFloat64Number) atof(Buffer) / InputRange; } if (xisatty(stdin)) fprintf(stderr, "\n"); } static void PrintPCSFloat(cmsFloat64Number Input[]) { if (Verbose > 1 && hTransXYZ && hTransLab) { cmsCIEXYZ XYZ = { 0, 0, 0 }; cmsCIELab Lab = { 0, 0, 0 }; if (hTransXYZ) cmsDoTransform(hTransXYZ, Input, &XYZ, 1); if (hTransLab) cmsDoTransform(hTransLab, Input, &Lab, 1); printf("[PCS] Lab=(%.4f,%.4f,%.4f) XYZ=(%.4f,%.4f,%.4f)\n", Lab.L, Lab.a, Lab.b, XYZ.X * 100.0, XYZ.Y * 100.0, XYZ.Z * 100.0); } } // ----------------------------------------------------------------------------------------------- static void PrintEncodedResults(cmsUInt16Number Encoded[]) { cmsUInt32Number i, n; char ChannelName[cmsMAX_PATH]; cmsUInt32Number v; n = cmsChannelsOfColorSpace(OutputColorSpace); for (i=0; i < n; i++) { if (OutputColorant != NULL) { cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, NULL); } else { sprintf(ChannelName, "Channel #%u", i + 1); } if (Verbose > 0) printf("%s=", ChannelName); v = Encoded[i]; if (InHexa) { if (Width16) printf("0x%04X ", (int) floor(v + .5)); else printf("0x%02X ", (int) floor(v / 257. + .5)); } else { if (Width16) printf("%d ", (int) floor(v + .5)); else printf("%d ", (int) floor(v / 257. + .5)); } } printf("\n"); } // Print XYZ/Lab values on verbose mode static void PrintPCSEncoded(cmsFloat64Number Input[]) { if (Verbose > 1 && hTransXYZ && hTransLab) { cmsUInt16Number XYZ[3], Lab[3]; if (hTransXYZ) cmsDoTransform(hTransXYZ, Input, XYZ, 1); if (hTransLab) cmsDoTransform(hTransLab, Input, Lab, 1); printf("[PCS] Lab=(0x%04X,0x%04X,0x%04X) XYZ=(0x%04X,0x%04X,0x%04X)\n", Lab[0], Lab[1], Lab[2], XYZ[0], XYZ[1], XYZ[2]); } } // -------------------------------------------------------------------------------------- // Take a value from IT8 and scale it accordly to fill a cmsUInt16Number (0..FFFF) static cmsFloat64Number GetIT8Val(const char* Name, cmsFloat64Number Max) { const char* Val = cmsIT8GetData(hIT8in, CGATSPatch, Name); if (Val == NULL) FatalError("Field '%s' not found", Name); return atof(Val) / Max; } // Read input values from CGATS file. static void TakeCGATSValues(int nPatch, cmsFloat64Number Float[]) { // At first take the name if SAMPLE_ID is present if (cmsIT8GetPatchName(hIT8in, nPatch, CGATSPatch) == NULL) { FatalError("Sorry, I need 'SAMPLE_ID' on input CGATS to operate."); } // Special handling for named color profiles. // Lookup the name in the names database (the transform) if (InputNamedColor) { const cmsNAMEDCOLORLIST* NamedColorList; int index; NamedColorList = cmsGetNamedColorList(hTrans); if (NamedColorList == NULL) FatalError("Malformed named color profile"); index = cmsNamedColorIndex(NamedColorList, CGATSPatch); if (index < 0) FatalError("Named color '%s' not found in the profile", CGATSPatch); Float[0] = index; return; } // Color is not a spot color, proceed. switch (InputColorSpace) { // Encoding should follow CGATS specification. case cmsSigXYZData: Float[0] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_X") / 100.0; Float[1] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_Y") / 100.0; Float[2] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_Z") / 100.0; break; case cmsSigLabData: Float[0] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_L"); Float[1] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_A"); Float[2] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_B"); break; case cmsSigRgbData: Float[0] = GetIT8Val("RGB_R", 255.0); Float[1] = GetIT8Val("RGB_G", 255.0); Float[2] = GetIT8Val("RGB_B", 255.0); break; case cmsSigGrayData: Float[0] = GetIT8Val("GRAY", 255.0); break; case cmsSigCmykData: Float[0] = GetIT8Val("CMYK_C", 1.0); Float[1] = GetIT8Val("CMYK_M", 1.0); Float[2] = GetIT8Val("CMYK_Y", 1.0); Float[3] = GetIT8Val("CMYK_K", 1.0); break; case cmsSigCmyData: Float[0] = GetIT8Val("CMY_C", 1.0); Float[1] = GetIT8Val("CMY_M", 1.0); Float[2] = GetIT8Val("CMY_Y", 1.0); break; case cmsSig1colorData: case cmsSig2colorData: case cmsSig3colorData: case cmsSig4colorData: case cmsSig5colorData: case cmsSig6colorData: case cmsSig7colorData: case cmsSig8colorData: case cmsSig9colorData: case cmsSig10colorData: case cmsSig11colorData: case cmsSig12colorData: case cmsSig13colorData: case cmsSig14colorData: case cmsSig15colorData: { cmsUInt32Number i, n; n = cmsChannelsOfColorSpace(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "%uCLR_%u", n, i+1); Float[i] = GetIT8Val(Buffer, 100.0); } } break; default: { cmsUInt32Number i, n; n = cmsChannelsOfColorSpace(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "CHAN_%u", i+1); Float[i] = GetIT8Val(Buffer, 1.0); } } } } static void SetCGATSfld(const char* Col, cmsFloat64Number Val) { if (lQuantize) Val = floor(Val + 0.5); if (!cmsIT8SetDataDbl(hIT8out, CGATSPatch, Col, Val)) { FatalError("couldn't set '%s' on output cgats '%s'", Col, CGATSoutFilename); } } static void PutCGATSValues(cmsFloat64Number Float[]) { cmsIT8SetData(hIT8out, CGATSPatch, "SAMPLE_ID", CGATSPatch); switch (OutputColorSpace) { // Encoding should follow CGATS specification. case cmsSigXYZData: SetCGATSfld("XYZ_X", Float[0] * 100.0); SetCGATSfld("XYZ_Y", Float[1] * 100.0); SetCGATSfld("XYZ_Z", Float[2] * 100.0); break; case cmsSigLabData: SetCGATSfld("LAB_L", Float[0]); SetCGATSfld("LAB_A", Float[1]); SetCGATSfld("LAB_B", Float[2]); break; case cmsSigRgbData: SetCGATSfld("RGB_R", Float[0] * 255.0); SetCGATSfld("RGB_G", Float[1] * 255.0); SetCGATSfld("RGB_B", Float[2] * 255.0); break; case cmsSigGrayData: SetCGATSfld("GRAY", Float[0] * 255.0); break; case cmsSigCmykData: SetCGATSfld("CMYK_C", Float[0]); SetCGATSfld("CMYK_M", Float[1]); SetCGATSfld("CMYK_Y", Float[2]); SetCGATSfld("CMYK_K", Float[3]); break; case cmsSigCmyData: SetCGATSfld("CMY_C", Float[0]); SetCGATSfld("CMY_M", Float[1]); SetCGATSfld("CMY_Y", Float[2]); break; case cmsSig1colorData: case cmsSig2colorData: case cmsSig3colorData: case cmsSig4colorData: case cmsSig5colorData: case cmsSig6colorData: case cmsSig7colorData: case cmsSig8colorData: case cmsSig9colorData: case cmsSig10colorData: case cmsSig11colorData: case cmsSig12colorData: case cmsSig13colorData: case cmsSig14colorData: case cmsSig15colorData: { cmsInt32Number i, n; n = cmsChannelsOfColorSpace(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "%uCLR_%u", n, i+1); SetCGATSfld(Buffer, Float[i] * 100.0); } } break; default: { cmsInt32Number i, n; n = cmsChannelsOfColorSpace(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "CHAN_%u", i+1); SetCGATSfld(Buffer, Float[i]); } } } } // Create data format static void SetOutputDataFormat(void) { cmsIT8DefineDblFormat(hIT8out, "%.4g"); cmsIT8SetPropertyStr(hIT8out, "ORIGINATOR", "icctrans"); if (IncludePart != NULL) cmsIT8SetPropertyStr(hIT8out, ".INCLUDE", IncludePart); cmsIT8SetComment(hIT8out, "Data follows"); cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_SETS", nMaxPatches); switch (OutputColorSpace) { // Encoding should follow CGATS specification. case cmsSigXYZData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "XYZ_X"); cmsIT8SetDataFormat(hIT8out, 2, "XYZ_Y"); cmsIT8SetDataFormat(hIT8out, 3, "XYZ_Z"); break; case cmsSigLabData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "LAB_L"); cmsIT8SetDataFormat(hIT8out, 2, "LAB_A"); cmsIT8SetDataFormat(hIT8out, 3, "LAB_B"); break; case cmsSigRgbData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "RGB_R"); cmsIT8SetDataFormat(hIT8out, 2, "RGB_G"); cmsIT8SetDataFormat(hIT8out, 3, "RGB_B"); break; case cmsSigGrayData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 2); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "GRAY"); break; case cmsSigCmykData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 5); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "CMYK_C"); cmsIT8SetDataFormat(hIT8out, 2, "CMYK_M"); cmsIT8SetDataFormat(hIT8out, 3, "CMYK_Y"); cmsIT8SetDataFormat(hIT8out, 4, "CMYK_K"); break; case cmsSigCmyData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "CMY_C"); cmsIT8SetDataFormat(hIT8out, 2, "CMY_M"); cmsIT8SetDataFormat(hIT8out, 3, "CMY_Y"); break; case cmsSig1colorData: case cmsSig2colorData: case cmsSig3colorData: case cmsSig4colorData: case cmsSig5colorData: case cmsSig6colorData: case cmsSig7colorData: case cmsSig8colorData: case cmsSig9colorData: case cmsSig10colorData: case cmsSig11colorData: case cmsSig12colorData: case cmsSig13colorData: case cmsSig14colorData: case cmsSig15colorData: { int i, n; char Buffer[255]; n = cmsChannelsOfColorSpace(OutputColorSpace); cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", n+1); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); for (i=1; i <= n; i++) { sprintf(Buffer, "%dCLR_%d", n, i); cmsIT8SetDataFormat(hIT8out, i, Buffer); } } break; default: { int i, n; char Buffer[255]; n = cmsChannelsOfColorSpace(OutputColorSpace); cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", n+1); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); for (i=1; i <= n; i++) { sprintf(Buffer, "CHAN_%d", i); cmsIT8SetDataFormat(hIT8out, i, Buffer); } } } } // Open CGATS if specified static void OpenCGATSFiles(int argc, char *argv[]) { int nParams = argc - xoptind; if (nParams >= 1) { hIT8in = cmsIT8LoadFromFile(0, argv[xoptind]); if (hIT8in == NULL) FatalError("'%s' is not recognized as a CGATS file", argv[xoptind]); nMaxPatches = (int) cmsIT8GetPropertyDbl(hIT8in, "NUMBER_OF_SETS"); } if (nParams == 2) { hIT8out = cmsIT8Alloc(NULL); SetOutputDataFormat(); strncpy(CGATSoutFilename, argv[xoptind+1], cmsMAX_PATH-1); } if (nParams > 2) FatalError("Too many CGATS files"); } // The main sink int main(int argc, char *argv[]) { cmsUInt16Number Output[cmsMAXCHANNELS]; cmsFloat64Number OutputFloat[cmsMAXCHANNELS]; cmsFloat64Number InputFloat[cmsMAXCHANNELS]; int nPatch = 0; fprintf(stderr, "LittleCMS ColorSpace conversion calculator - 5.1 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n"); fflush(stderr); InitUtils("transicc"); Verbose = 1; if (argc == 1) { Help(); return 0; } HandleSwitches(argc, argv); // Open profiles, create transforms if (!OpenTransforms()) return 1; // Open CGATS input if specified OpenCGATSFiles(argc, argv); // Main loop: read all values and convert them for(;;) { if (hIT8in != NULL) { if (nPatch >= nMaxPatches) break; TakeCGATSValues(nPatch++, InputFloat); } else { if (feof(stdin)) break; TakeFloatValues(InputFloat); } if (lIsFloat) cmsDoTransform(hTrans, InputFloat, OutputFloat, 1); else cmsDoTransform(hTrans, InputFloat, Output, 1); if (hIT8out != NULL) { PutCGATSValues(OutputFloat); } else { if (lIsFloat) { PrintFloatResults(OutputFloat); PrintPCSFloat(InputFloat); } else { PrintEncodedResults(Output); PrintPCSEncoded(InputFloat); } } } // Cleanup CloseTransforms(); if (hIT8in) cmsIT8Free(hIT8in); if (hIT8out) { cmsIT8SaveToFile(hIT8out, CGATSoutFilename); cmsIT8Free(hIT8out); } // All is ok return 0; } lcms2-2.19.1/utils/transicc/Makefile.am0000644000175000017500000000116315176573557016666 0ustar martimarti# # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = transicc transicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ transicc_LDFLAGS = @LDFLAGS@ transicc_SOURCES = transicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = transicc.1 EXTRA_DIST = $(man_MANS) lcms2-2.19.1/utils/transicc/Makefile.in0000644000175000017500000005515315176574547016707 0ustar martimarti# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = transicc$(EXEEXT) subdir = utils/transicc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_transicc_OBJECTS = transicc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ ../common/vprf.$(OBJEXT) transicc_OBJECTS = $(am_transicc_OBJECTS) transicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = transicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(transicc_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = am__maybe_remake_depfiles = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(transicc_SOURCES) DIST_SOURCES = $(transicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_PLUGINS = @LIB_PLUGINS@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common transicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ transicc_LDFLAGS = @LDFLAGS@ transicc_SOURCES = transicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = transicc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/transicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/transicc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: $(am__rm_f) $(bin_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) ../common/$(am__dirstamp): @$(MKDIR_P) ../common @: >>../common/$(am__dirstamp) ../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) ../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) transicc$(EXEEXT): $(transicc_OBJECTS) $(transicc_DEPENDENCIES) $(EXTRA_transicc_DEPENDENCIES) @rm -f transicc$(EXEEXT) $(AM_V_CCLD)$(transicc_LINK) $(transicc_OBJECTS) $(transicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../common/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) -$(am__rm_f) ../common/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% lcms2-2.19.1/fuzzers/0000755000175000017500000000000015176573557013373 5ustar martimartilcms2-2.19.1/fuzzers/corpus/0000755000175000017500000000000015176573557014706 5ustar martimartilcms2-2.19.1/fuzzers/corpus/alltags.icc0000644000175000017500000065236015176573557017031 0ustar martimartiTlcms0mntrRGB Lab %#acspMSFT-lcmsAbXYZgXYZrXYZbkptwtptlumibTRCkTRCgTRC(rTRC8targHscrd\xcprtdescpdmnd dmddvuedDpsd0 psd1 psd2 psd3 ps2s ps2i0 ciis@ rig0L rig2X techd caltpdtimclrtFclot Fncl2 (TA2B0|A2B1@A2B2B2A0B2A1B2A2Ppre0pre1pre2gamt`chad$,chrmP$clrotmeas$crdinbfd $@D2B06@\D2B18\D2B2:\D2B3=T\B2D0?\B2D1B \B2D2Dh\B2D3F\scrnI pseqI<|psidKnviewM($vcgtML1234S`metaShcicpTdMHC2Tt|XYZ 33XYZ 33XYZ 33XYZ 33XYZ 33XYZ 33paraparaparaparatextTest testdesc Test test Test testmluc LenUS^esESlctESzenGBTest test1 1 1 12 2 2 23 3 3 3444444444mluc LenUS^esESlctESzenGBTest test1 1 1 12 2 2 23 3 3 3444444444mluc LenUS^esESlctESzenGBTest test1 1 1 12 2 2 23 3 3 3444444444mluc LenUS^esESlctESzenGBTest test1 1 1 12 2 2 23 3 3 3444444444mluc LenUS^esESlctESzenGBTest test1 1 1 12 2 2 23 3 3 3444444444data?data?data?data?data?data?sig prmgsig prmgsig prmgsig prmgdtimdtimclrt#0#1#2#3#4#5#6#7#8#9 #10 #11 #12 #13 #14clrt#0#1#2#3#4#5#6#7#8#9 #10 #11 #12 #13 #14ncl2prefixsuffix#0#1#2#3#4#5#6#7#8#9 #10 #11 #12 #13 #14#15#16#17#18#19#20#21#22#23#24#25#26#27#28#29#30#31#32 #33!!!#34"""#35####36$$$#37%%%#38&&&#39'''#40(((#41)))#42***#43+++#44,,,#45---#46...#47///#48000#49111#50222#51333#52444#53555#54666#55777#56888#57999#58:::#59;;;#60<<<#61===#62>>>#63???#64@@@#65AAA#66BBB#67CCC#68DDD#69EEE#70FFF#71GGG#72HHH#73III#74JJJ#75KKK#76LLL#77MMM#78NNN#79OOO#80PPP#81QQQ#82RRR#83SSS#84TTT#85UUU#86VVV#87WWW#88XXX#89YYY#90ZZZ#91[[[#92\\\#93]]]#94^^^#95___#96```#97aaa#98bbb#99ccc#100ddd#101eee#102fff#103ggg#104hhh#105iii#106jjj#107kkk#108lll#109mmm#110nnn#111ooo#112ppp#113qqq#114rrr#115sss#116ttt#117uuu#118vvv#119www#120xxx#121yyy#122zzz#123{{{#124|||#125}}}#126~~~#127#128#129#130~~~~#131}}}}#132||||#133{{{{#134zzzz#135yyyy#136xxxx#137wwww#138vvvv#139uuuu#140tttt#141ssss#142rrrr#143qqqq#144pppp#145oooo#146nnnn#147mmmm#148llll#149kkkk#150jjjj#151iiii#152hhhh#153gggg#154ffff#155eeee#156dddd#157cccc#158bbbb#159aaaa#160````#161____#162^^^^#163]]]]#164\\\\#165[[[[#166ZZZZ#167YYYY#168XXXX#169WWWW#170VVVV#171UUUU#172TTTT#173SSSS#174RRRR#175QQQQ#176PPPP#177OOOO#178NNNN#179MMMM#180LLLL#181KKKK#182JJJJ#183IIII#184HHHH#185GGGG#186FFFF#187EEEE#188DDDD#189CCCC#190BBBB#191AAAA#192@@@@#193????#194>>>>#195====#196<<<<#197;;;;#198::::#1999999#2008888#2017777#2026666#2035555#2044444#2053333#2062222#2071111#2080000#209////#210....#211----#212,,,,#213++++#214****#215))))#216((((#217''''#218&&&Û%%%%#220$$$$#221#####222""""#223!!!!#224    #225#226#227#228#229#230#231#232#233#234#235#236#237#238#239#240#241#242#243    #244    #245    #246    #247    #248#249#250#251#252#253#254#255#256#257#258#259#260#261#262#263#264#265   #266   #267   #268   #269   #270#271#272#273#274#275#276#277#278#279#280#281#282#283#284#285#286#287#288   #289!!!#290"""#291####292$$$#293%%%#294&&&#295'''#296(((#297)))#298***#299+++#300,,,#301---#302...#303///#304000#305111#306222#307333#308444#309555#310666#311777#312888#313999#314:::#315;;;#316<<<#317===#318>>>#319???#320@@@#321AAA#322BBB#323CCC#324DDD#325EEE#326FFF#327GGG#328HHH#329III#330JJJ#331KKK#332LLL#333MMM#334NNN#335OOO#336PPP#337QQQ#338RRR#339SSS#340TTT#341UUU#342VVV#343WWW#344XXX#345YYY#346ZZZ#347[[[#348\\\#349]]]#350^^^#351___#352```#353aaa#354bbb#355ccc#356ddd#357eee#358fff#359ggg#360hhh#361iii#362jjj#363kkk#364lll#365mmm#366nnn#367ooo#368ppp#369qqq#370rrr#371sss#372ttt#373uuu#374vvv#375www#376xxx#377yyy#378zzz#379{{{#380|||#381}}}#382~~~#383#384#385#386~~~~#387}}}}#388||||#389{{{{#390zzzz#391yyyy#392xxxx#393wwww#394vvvv#395uuuu#396tttt#397ssss#398rrrr#399qqqq#400pppp#401oooo#402nnnn#403mmmm#404llll#405kkkk#406jjjj#407iiii#408hhhh#409gggg#410ffff#411eeee#412dddd#413cccc#414bbbb#415aaaa#416````#417____#418^^^^#419]]]]#420\\\\#421[[[[#422ZZZZ#423YYYY#424XXXX#425WWWW#426VVVV#427UUUU#428TTTT#429SSSS#430RRRR#431QQQQ#432PPPP#433OOOO#434NNNN#435MMMM#436LLLL#437KKKK#438JJJJ#439IIII#440HHHH#441GGGG#442FFFF#443EEEE#444DDDD#445CCCC#446BBBB#447AAAA#448@@@@#449????#450>>>>#451====#452<<<<#453;;;;#454::::#4559999#4568888#4577777#4586666#4595555#4604444#4613333#4622222#4631111#4640000#465////#466....#467----#468,,,,#469++++#470****#471))))#472((((#473''''#474&&&Ǜ%%%%#476$$$$#477#####478""""#479!!!!#480    #481#482#483#484#485#486#487#488#489#490#491#492#493#494#495#496#497#498#499    #500    #501    #502    #503    #504#505#506#507#508#509#510#511#512#513 #514 #515 #516 #517 #518 #519 #520 #521   #522   #523   #524   #525   #526 #527 #528 #529 #530 #531 #532 #533 #534 #535 #536 #537 #538 #539 #540 #541 #542 #543 #544   #545!!! #546""" #547### #548$$$ #549%%% #550&&& #551''' #552((( #553))) #554*** #555+++ #556,,, #557--- #558... #559/// #560000 #561111 #562222 #563333 #564444 #565555 #566666 #567777 #568888 #569999 #570::: #571;;; #572<<< #573=== #574>>> #575??? #576@@@ #577AAA #578BBB #579CCC #580DDD #581EEE #582FFF #583GGG #584HHH #585III #586JJJ #587KKK #588LLL #589MMM #590NNN #591OOO #592PPP #593QQQ #594RRR #595SSS #596TTT #597UUU #598VVV #599WWW #600XXX #601YYY #602ZZZ #603[[[ #604\\\ #605]]] #606^^^ #607___ #608``` #609aaa #610bbb #611ccc #612ddd #613eee #614fff #615ggg #616hhh #617iii #618jjj #619kkk #620lll #621mmm #622nnn #623ooo #624ppp #625qqq #626rrr #627sss #628ttt #629uuu #630vvv #631www #632xxx #633yyy #634zzz #635{{{ #636||| #637}}} #638~~~ #639 #640 #641    #642 ~ ~ ~ ~#643 } } } }#644 | | | |#645 { { { {#646 z z z z#647 y y y y#648 x x x x#649 w w w w#650 v v v v#651 u u u u#652 t t t t#653 s s s s#654 r r r r#655 q q q q#656 p p p p#657 o o o o#658 n n n n#659 m m m m#660 l l l l#661 k k k k#662 j j j j#663 i i i i#664 h h h h#665 g g g g#666 f f f f#667 e e e e#668 d d d d#669 c c c c#670 b b b b#671 a a a a#672 ` ` ` `#673 _ _ _ _#674 ^ ^ ^ ^#675 ] ] ] ]#676 \ \ \ \#677 [ [ [ [#678 Z Z Z Z#679 Y Y Y Y#680 X X X X#681 W W W W#682 V V V V#683 U U U U#684 T T T T#685 S S S S#686 R R R R#687 Q Q Q Q#688 P P P P#689 O O O O#690 N N N N#691 M M M M#692 L L L L#693 K K K K#694 J J J J#695 I I I I#696 H H H H#697 G G G G#698 F F F F#699 E E E E#700 D D D D#701 C C C C#702 B B B B#703 A A A A#704 @ @ @ @#705 ? ? ? ?#706 > > > >#707 = = = =#708 < < < <#709 ; ; ; ;#710 : : : :#711 9 9 9 9#712 8 8 8 8#713 7 7 7 7#714 6 6 6 6#715 5 5 5 5#716 4 4 4 4#717 3 3 3 3#718 2 2 2 2#719 1 1 1 1#720 0 0 0 0#721 / / / /#722 . . . .#723 - - - -#724 , , , ,#725 + + + +#726 * * * *#727 ) ) ) )#728 ( ( ( (#729 ' ' ' '#730 & & & ˛ % % % %#732 $ $ $ $#733 # # # ##734 " " " "#735 ! ! ! !#736 #737    #738    #739    #740    #741    #742    #743    #744    #745    #746    #747    #748    #749    #750    #751    #752    #753    #754    #755 #756 #757 #758 #759 #760    #761    #762    #763    #764    #765    #766    #767    #768 #769 #770 #771 #772 #773 #774 #775 #776 #777   #778   #779   #780   #781   #782 #783 #784 #785 #786 #787 #788 #789 #790 #791 #792 #793 #794 #795 #796 #797 #798 #799 #800   #801!!! #802""" #803### #804$$$ #805%%% #806&&& #807''' #808((( #809))) #810*** #811+++ #812,,, #813--- #814... #815/// #816000 #817111 #818222 #819333 #820444 #821555 #822666 #823777 #824888 #825999 #826::: #827;;; #828<<< #829=== #830>>> #831??? #832@@@ #833AAA #834BBB #835CCC #836DDD #837EEE #838FFF #839GGG #840HHH #841III #842JJJ #843KKK #844LLL #845MMM #846NNN #847OOO #848PPP #849QQQ #850RRR #851SSS #852TTT #853UUU #854VVV #855WWW #856XXX #857YYY #858ZZZ #859[[[ #860\\\ #861]]] #862^^^ #863___ #864``` #865aaa #866bbb #867ccc #868ddd #869eee #870fff #871ggg #872hhh #873iii #874jjj #875kkk #876lll #877mmm #878nnn #879ooo #880ppp #881qqq #882rrr #883sss #884ttt #885uuu #886vvv #887www #888xxx #889yyy #890zzz #891{{{ #892||| #893}}} #894~~~ #895 #896 #897    #898 ~ ~ ~ ~#899 } } } }#900 | | | |#901 { { { {#902 z z z z#903 y y y y#904 x x x x#905 w w w w#906 v v v v#907 u u u u#908 t t t t#909 s s s s#910 r r r r#911 q q q q#912 p p p p#913 o o o o#914 n n n n#915 m m m m#916 l l l l#917 k k k k#918 j j j j#919 i i i i#920 h h h h#921 g g g g#922 f f f f#923 e e e e#924 d d d d#925 c c c c#926 b b b b#927 a a a a#928 ` ` ` `#929 _ _ _ _#930 ^ ^ ^ ^#931 ] ] ] ]#932 \ \ \ \#933 [ [ [ [#934 Z Z Z Z#935 Y Y Y Y#936 X X X X#937 W W W W#938 V V V V#939 U U U U#940 T T T T#941 S S S S#942 R R R R#943 Q Q Q Q#944 P P P P#945 O O O O#946 N N N N#947 M M M M#948 L L L L#949 K K K K#950 J J J J#951 I I I I#952 H H H H#953 G G G G#954 F F F F#955 E E E E#956 D D D D#957 C C C C#958 B B B B#959 A A A A#960 @ @ @ @#961 ? ? ? ?#962 > > > >#963 = = = =#964 < < < <#965 ; ; ; ;#966 : : : :#967 9 9 9 9#968 8 8 8 8#969 7 7 7 7#970 6 6 6 6#971 5 5 5 5#972 4 4 4 4#973 3 3 3 3#974 2 2 2 2#975 1 1 1 1#976 0 0 0 0#977 / / / /#978 . . . .#979 - - - -#980 , , , ,#981 + + + +#982 * * * *#983 ) ) ) )#984 ( ( ( (#985 ' ' ' '#986 & & & ϛ % % % %#988 $ $ $ $#989 # # # ##990 " " " "#991 ! ! ! !#992 #993    #994    #995    #996    #997    #998    #999    #1000    #1001    #1002    #1003    #1004    #1005    #1006    #1007    #1008    #1009    #1010    #1011 #1012 #1013 #1014 #1015 #1016    #1017    #1018    #1019    #1020    #1021    #1022    #1023    #1024 #1025 #1026 #1027 #1028 #1029 #1030 #1031 #1032 #1033   #1034   #1035   #1036   #1037   #1038 #1039 #1040 #1041 #1042 #1043 #1044 #1045 #1046 #1047 #1048 #1049 #1050 #1051 #1052 #1053 #1054 #1055 #1056   #1057!!! #1058""" #1059### #1060$$$ #1061%%% #1062&&& #1063''' #1064((( #1065))) #1066*** #1067+++ #1068,,, #1069--- #1070... #1071/// #1072000 #1073111 #1074222 #1075333 #1076444 #1077555 #1078666 #1079777 #1080888 #1081999 #1082::: #1083;;; #1084<<< #1085=== #1086>>> #1087??? #1088@@@ #1089AAA #1090BBB #1091CCC #1092DDD #1093EEE #1094FFF #1095GGG #1096HHH #1097III #1098JJJ #1099KKK #1100LLL #1101MMM #1102NNN #1103OOO #1104PPP #1105QQQ #1106RRR #1107SSS #1108TTT #1109UUU #1110VVV #1111WWW #1112XXX #1113YYY #1114ZZZ #1115[[[ #1116\\\ #1117]]] #1118^^^ #1119___ #1120``` #1121aaa #1122bbb #1123ccc #1124ddd #1125eee #1126fff #1127ggg #1128hhh #1129iii #1130jjj #1131kkk #1132lll #1133mmm #1134nnn #1135ooo #1136ppp #1137qqq #1138rrr #1139sss #1140ttt #1141uuu #1142vvv #1143www #1144xxx #1145yyy #1146zzz #1147{{{ #1148||| #1149}}} #1150~~~ #1151 #1152 #1153    #1154 ~ ~ ~ ~#1155 } } } }#1156 | | | |#1157 { { { {#1158 z z z z#1159 y y y y#1160 x x x x#1161 w w w w#1162 v v v v#1163 u u u u#1164 t t t t#1165 s s s s#1166 r r r r#1167 q q q q#1168 p p p p#1169 o o o o#1170 n n n n#1171 m m m m#1172 l l l l#1173 k k k k#1174 j j j j#1175 i i i i#1176 h h h h#1177 g g g g#1178 f f f f#1179 e e e e#1180 d d d d#1181 c c c c#1182 b b b b#1183 a a a a#1184 ` ` ` `#1185 _ _ _ _#1186 ^ ^ ^ ^#1187 ] ] ] ]#1188 \ \ \ \#1189 [ [ [ [#1190 Z Z Z Z#1191 Y Y Y Y#1192 X X X X#1193 W W W W#1194 V V V V#1195 U U U U#1196 T T T T#1197 S S S S#1198 R R R R#1199 Q Q Q Q#1200 P P P P#1201 O O O O#1202 N N N N#1203 M M M M#1204 L L L L#1205 K K K K#1206 J J J J#1207 I I I I#1208 H H H H#1209 G G G G#1210 F F F F#1211 E E E E#1212 D D D D#1213 C C C C#1214 B B B B#1215 A A A A#1216 @ @ @ @#1217 ? ? ? ?#1218 > > > >#1219 = = = =#1220 < < < <#1221 ; ; ; ;#1222 : : : :#1223 9 9 9 9#1224 8 8 8 8#1225 7 7 7 7#1226 6 6 6 6#1227 5 5 5 5#1228 4 4 4 4#1229 3 3 3 3#1230 2 2 2 2#1231 1 1 1 1#1232 0 0 0 0#1233 / / / /#1234 . . . .#1235 - - - -#1236 , , , ,#1237 + + + +#1238 * * * *#1239 ) ) ) )#1240 ( ( ( (#1241 ' ' ' '#1242 & & & ӛ % % % %#1244 $ $ $ $#1245 # # # ##1246 " " " "#1247 ! ! ! !#1248 #1249    #1250    #1251    #1252    #1253    #1254    #1255    #1256    #1257    #1258    #1259    #1260    #1261    #1262    #1263    #1264    #1265    #1266    #1267 #1268 #1269 #1270 #1271 #1272    #1273    #1274    #1275    #1276    #1277    #1278    #1279    #1280 #1281 #1282 #1283 #1284 #1285 #1286 #1287 #1288 #1289   #1290   #1291   #1292   #1293   #1294 #1295 #1296 #1297 #1298 #1299 #1300 #1301 #1302 #1303 #1304 #1305 #1306 #1307 #1308 #1309 #1310 #1311 #1312   #1313!!! #1314""" #1315### #1316$$$ #1317%%% #1318&&& #1319''' #1320((( #1321))) #1322*** #1323+++ #1324,,, #1325--- #1326... #1327/// #1328000 #1329111 #1330222 #1331333 #1332444 #1333555 #1334666 #1335777 #1336888 #1337999 #1338::: #1339;;; #1340<<< #1341=== #1342>>> #1343??? #1344@@@ #1345AAA #1346BBB #1347CCC #1348DDD #1349EEE #1350FFF #1351GGG #1352HHH #1353III #1354JJJ #1355KKK #1356LLL #1357MMM #1358NNN #1359OOO #1360PPP #1361QQQ #1362RRR #1363SSS #1364TTT #1365UUU #1366VVV #1367WWW #1368XXX #1369YYY #1370ZZZ #1371[[[ #1372\\\ #1373]]] #1374^^^ #1375___ #1376``` #1377aaa #1378bbb #1379ccc #1380ddd #1381eee #1382fff #1383ggg #1384hhh #1385iii #1386jjj #1387kkk #1388lll #1389mmm #1390nnn #1391ooo #1392ppp #1393qqq #1394rrr #1395sss #1396ttt #1397uuu #1398vvv #1399www #1400xxx #1401yyy #1402zzz #1403{{{ #1404||| #1405}}} #1406~~~ #1407 #1408 #1409    #1410 ~ ~ ~ ~#1411 } } } }#1412 | | | |#1413 { { { {#1414 z z z z#1415 y y y y#1416 x x x x#1417 w w w w#1418 v v v v#1419 u u u u#1420 t t t t#1421 s s s s#1422 r r r r#1423 q q q q#1424 p p p p#1425 o o o o#1426 n n n n#1427 m m m m#1428 l l l l#1429 k k k k#1430 j j j j#1431 i i i i#1432 h h h h#1433 g g g g#1434 f f f f#1435 e e e e#1436 d d d d#1437 c c c c#1438 b b b b#1439 a a a a#1440 ` ` ` `#1441 _ _ _ _#1442 ^ ^ ^ ^#1443 ] ] ] ]#1444 \ \ \ \#1445 [ [ [ [#1446 Z Z Z Z#1447 Y Y Y Y#1448 X X X X#1449 W W W W#1450 V V V V#1451 U U U U#1452 T T T T#1453 S S S S#1454 R R R R#1455 Q Q Q Q#1456 P P P P#1457 O O O O#1458 N N N N#1459 M M M M#1460 L L L L#1461 K K K K#1462 J J J J#1463 I I I I#1464 H H H H#1465 G G G G#1466 F F F F#1467 E E E E#1468 D D D D#1469 C C C C#1470 B B B B#1471 A A A A#1472 @ @ @ @#1473 ? ? ? ?#1474 > > > >#1475 = = = =#1476 < < < <#1477 ; ; ; ;#1478 : : : :#1479 9 9 9 9#1480 8 8 8 8#1481 7 7 7 7#1482 6 6 6 6#1483 5 5 5 5#1484 4 4 4 4#1485 3 3 3 3#1486 2 2 2 2#1487 1 1 1 1#1488 0 0 0 0#1489 / / / /#1490 . . . .#1491 - - - -#1492 , , , ,#1493 + + + +#1494 * * * *#1495 ) ) ) )#1496 ( ( ( (#1497 ' ' ' '#1498 & & & כ % % % %#1500 $ $ $ $#1501 # # # ##1502 " " " "#1503 ! ! ! !#1504 #1505    #1506    #1507    #1508    #1509    #1510    #1511    #1512    #1513    #1514    #1515    #1516    #1517    #1518    #1519    #1520    #1521    #1522    #1523 #1524 #1525 #1526 #1527 #1528    #1529    #1530    #1531    #1532    #1533    #1534    #1535    #1536 #1537 #1538 #1539 #1540 #1541 #1542 #1543 #1544 #1545   #1546   #1547   #1548   #1549   #1550 #1551 #1552 #1553 #1554 #1555 #1556 #1557 #1558 #1559 #1560 #1561 #1562 #1563 #1564 #1565 #1566 #1567 #1568   #1569!!! #1570""" #1571### #1572$$$ #1573%%% #1574&&& #1575''' #1576((( #1577))) #1578*** #1579+++ #1580,,, #1581--- #1582... #1583/// #1584000 #1585111 #1586222 #1587333 #1588444 #1589555 #1590666 #1591777 #1592888 #1593999 #1594::: #1595;;; #1596<<< #1597=== #1598>>> #1599??? #1600@@@ #1601AAA #1602BBB #1603CCC #1604DDD #1605EEE #1606FFF #1607GGG #1608HHH #1609III #1610JJJ #1611KKK #1612LLL #1613MMM #1614NNN #1615OOO #1616PPP #1617QQQ #1618RRR #1619SSS #1620TTT #1621UUU #1622VVV #1623WWW #1624XXX #1625YYY #1626ZZZ #1627[[[ #1628\\\ #1629]]] #1630^^^ #1631___ #1632``` #1633aaa #1634bbb #1635ccc #1636ddd #1637eee #1638fff #1639ggg #1640hhh #1641iii #1642jjj #1643kkk #1644lll #1645mmm #1646nnn #1647ooo #1648ppp #1649qqq #1650rrr #1651sss #1652ttt #1653uuu #1654vvv #1655www #1656xxx #1657yyy #1658zzz #1659{{{ #1660||| #1661}}} #1662~~~ #1663 #1664 #1665    #1666 ~ ~ ~ ~#1667 } } } }#1668 | | | |#1669 { { { {#1670 z z z z#1671 y y y y#1672 x x x x#1673 w w w w#1674 v v v v#1675 u u u u#1676 t t t t#1677 s s s s#1678 r r r r#1679 q q q q#1680 p p p p#1681 o o o o#1682 n n n n#1683 m m m m#1684 l l l l#1685 k k k k#1686 j j j j#1687 i i i i#1688 h h h h#1689 g g g g#1690 f f f f#1691 e e e e#1692 d d d d#1693 c c c c#1694 b b b b#1695 a a a a#1696 ` ` ` `#1697 _ _ _ _#1698 ^ ^ ^ ^#1699 ] ] ] ]#1700 \ \ \ \#1701 [ [ [ [#1702 Z Z Z Z#1703 Y Y Y Y#1704 X X X X#1705 W W W W#1706 V V V V#1707 U U U U#1708 T T T T#1709 S S S S#1710 R R R R#1711 Q Q Q Q#1712 P P P P#1713 O O O O#1714 N N N N#1715 M M M M#1716 L L L L#1717 K K K K#1718 J J J J#1719 I I I I#1720 H H H H#1721 G G G G#1722 F F F F#1723 E E E E#1724 D D D D#1725 C C C C#1726 B B B B#1727 A A A A#1728 @ @ @ @#1729 ? ? ? ?#1730 > > > >#1731 = = = =#1732 < < < <#1733 ; ; ; ;#1734 : : : :#1735 9 9 9 9#1736 8 8 8 8#1737 7 7 7 7#1738 6 6 6 6#1739 5 5 5 5#1740 4 4 4 4#1741 3 3 3 3#1742 2 2 2 2#1743 1 1 1 1#1744 0 0 0 0#1745 / / / /#1746 . . . .#1747 - - - -#1748 , , , ,#1749 + + + +#1750 * * * *#1751 ) ) ) )#1752 ( ( ( (#1753 ' ' ' '#1754 & & & ۛ % % % %#1756 $ $ $ $#1757 # # # ##1758 " " " "#1759 ! ! ! !#1760 #1761    #1762    #1763    #1764    #1765    #1766    #1767    #1768    #1769    #1770    #1771    #1772    #1773    #1774    #1775    #1776    #1777    #1778    #1779 #1780 #1781 #1782 #1783 #1784    #1785    #1786    #1787    #1788    #1789    #1790    #1791    #1792 #1793#1794#1795#1796#1797#1798#1799#1800#1801   #1802   #1803   #1804   #1805   #1806#1807#1808#1809#1810#1811#1812#1813#1814#1815#1816#1817#1818#1819#1820#1821#1822#1823#1824   #1825!!!#1826"""#1827####1828$$$#1829%%%#1830&&&#1831'''#1832(((#1833)))#1834***#1835+++#1836,,,#1837---#1838...#1839///#1840000#1841111#1842222#1843333#1844444#1845555#1846666#1847777#1848888#1849999#1850:::#1851;;;#1852<<<#1853===#1854>>>#1855???#1856@@@#1857AAA#1858BBB#1859CCC#1860DDD#1861EEE#1862FFF#1863GGG#1864HHH#1865III#1866JJJ#1867KKK#1868LLL#1869MMM#1870NNN#1871OOO#1872PPP#1873QQQ#1874RRR#1875SSS#1876TTT#1877UUU#1878VVV#1879WWW#1880XXX#1881YYY#1882ZZZ#1883[[[#1884\\\#1885]]]#1886^^^#1887___#1888```#1889aaa#1890bbb#1891ccc#1892ddd#1893eee#1894fff#1895ggg#1896hhh#1897iii#1898jjj#1899kkk#1900lll#1901mmm#1902nnn#1903ooo#1904ppp#1905qqq#1906rrr#1907sss#1908ttt#1909uuu#1910vvv#1911www#1912xxx#1913yyy#1914zzz#1915{{{#1916|||#1917}}}#1918~~~#1919#1920#1921#1922~~~~#1923}}}}#1924||||#1925{{{{#1926zzzz#1927yyyy#1928xxxx#1929wwww#1930vvvv#1931uuuu#1932tttt#1933ssss#1934rrrr#1935qqqq#1936pppp#1937oooo#1938nnnn#1939mmmm#1940llll#1941kkkk#1942jjjj#1943iiii#1944hhhh#1945gggg#1946ffff#1947eeee#1948dddd#1949cccc#1950bbbb#1951aaaa#1952````#1953____#1954^^^^#1955]]]]#1956\\\\#1957[[[[#1958ZZZZ#1959YYYY#1960XXXX#1961WWWW#1962VVVV#1963UUUU#1964TTTT#1965SSSS#1966RRRR#1967QQQQ#1968PPPP#1969OOOO#1970NNNN#1971MMMM#1972LLLL#1973KKKK#1974JJJJ#1975IIII#1976HHHH#1977GGGG#1978FFFF#1979EEEE#1980DDDD#1981CCCC#1982BBBB#1983AAAA#1984@@@@#1985????#1986>>>>#1987====#1988<<<<#1989;;;;#1990::::#19919999#19928888#19937777#19946666#19955555#19964444#19973333#19982222#19991111#20000000#2001////#2002....#2003----#2004,,,,#2005++++#2006****#2007))))#2008((((#2009''''#2010&&&ߛ%%%%#2012$$$$#2013#####2014""""#2015!!!!#2016    #2017#2018#2019#2020#2021#2022#2023#2024#2025#2026#2027#2028#2029#2030#2031#2032#2033#2034#2035    #2036    #2037    #2038    #2039    #2040#2041#2042#2043#2044#2045#2046#2047#2048#2049#2050#2051#2052#2053#2054#2055#2056#2057   #2058   #2059   #2060   #2061   #2062#2063#2064#2065#2066#2067#2068#2069#2070#2071#2072#2073#2074#2075#2076#2077#2078#2079#2080   #2081!!!#2082"""#2083####2084$$$#2085%%%#2086&&&#2087'''#2088(((#2089)))#2090***#2091+++#2092,,,#2093---#2094...#2095///#2096000#2097111#2098222#2099333#2100444#2101555#2102666#2103777#2104888#2105999#2106:::#2107;;;#2108<<<#2109===#2110>>>#2111???#2112@@@#2113AAA#2114BBB#2115CCC#2116DDD#2117EEE#2118FFF#2119GGG#2120HHH#2121III#2122JJJ#2123KKK#2124LLL#2125MMM#2126NNN#2127OOO#2128PPP#2129QQQ#2130RRR#2131SSS#2132TTT#2133UUU#2134VVV#2135WWW#2136XXX#2137YYY#2138ZZZ#2139[[[#2140\\\#2141]]]#2142^^^#2143___#2144```#2145aaa#2146bbb#2147ccc#2148ddd#2149eee#2150fff#2151ggg#2152hhh#2153iii#2154jjj#2155kkk#2156lll#2157mmm#2158nnn#2159ooo#2160ppp#2161qqq#2162rrr#2163sss#2164ttt#2165uuu#2166vvv#2167www#2168xxx#2169yyy#2170zzz#2171{{{#2172|||#2173}}}#2174~~~#2175#2176#2177#2178~~~~#2179}}}}#2180||||#2181{{{{#2182zzzz#2183yyyy#2184xxxx#2185wwww#2186vvvv#2187uuuu#2188tttt#2189ssss#2190rrrr#2191qqqq#2192pppp#2193oooo#2194nnnn#2195mmmm#2196llll#2197kkkk#2198jjjj#2199iiii#2200hhhh#2201gggg#2202ffff#2203eeee#2204dddd#2205cccc#2206bbbb#2207aaaa#2208````#2209____#2210^^^^#2211]]]]#2212\\\\#2213[[[[#2214ZZZZ#2215YYYY#2216XXXX#2217WWWW#2218VVVV#2219UUUU#2220TTTT#2221SSSS#2222RRRR#2223QQQQ#2224PPPP#2225OOOO#2226NNNN#2227MMMM#2228LLLL#2229KKKK#2230JJJJ#2231IIII#2232HHHH#2233GGGG#2234FFFF#2235EEEE#2236DDDD#2237CCCC#2238BBBB#2239AAAA#2240@@@@#2241????#2242>>>>#2243====#2244<<<<#2245;;;;#2246::::#22479999#22488888#22497777#22506666#22515555#22524444#22533333#22542222#22551111#22560000#2257////#2258....#2259----#2260,,,,#2261++++#2262****#2263))))#2264((((#2265''''#2266&&&ࣛ%%%%#2268$$$$#2269#####2270""""#2271!!!!#2272    #2273#2274#2275#2276#2277#2278#2279#2280#2281#2282#2283#2284#2285#2286#2287#2288#2289#2290#2291    #2292    #2293    #2294    #2295    #2296#2297#2298#2299#2300#2301#2302#2303#2304 #2305   #2306   #2307   #2308   #2309   #2310   #2311   #2312   #2313 #2314 #2315 #2316 #2317 #2318   #2319   #2320   #2321   #2322   #2323   #2324   #2325   #2326   #2327   #2328   #2329   #2330   #2331   #2332   #2333   #2334   #2335   #2336 #2337 ! ! !#2338 " " "#2339 # # ##2340 $ $ $#2341 % % %#2342 & & &#2343 ' ' '#2344 ( ( (#2345 ) ) )#2346 * * *#2347 + + +#2348 , , ,#2349 - - -#2350 . . .#2351 / / /#2352 0 0 0#2353 1 1 1#2354 2 2 2#2355 3 3 3#2356 4 4 4#2357 5 5 5#2358 6 6 6#2359 7 7 7#2360 8 8 8#2361 9 9 9#2362 : : :#2363 ; ; ;#2364 < < <#2365 = = =#2366 > > >#2367 ? ? ?#2368 @ @ @#2369 A A A#2370 B B B#2371 C C C#2372 D D D#2373 E E E#2374 F F F#2375 G G G#2376 H H H#2377 I I I#2378 J J J#2379 K K K#2380 L L L#2381 M M M#2382 N N N#2383 O O O#2384 P P P#2385 Q Q Q#2386 R R R#2387 S S S#2388 T T T#2389 U U U#2390 V V V#2391 W W W#2392 X X X#2393 Y Y Y#2394 Z Z Z#2395 [ [ [#2396 \ \ \#2397 ] ] ]#2398 ^ ^ ^#2399 _ _ _#2400 ` ` `#2401 a a a#2402 b b b#2403 c c c#2404 d d d#2405 e e e#2406 f f f#2407 g g g#2408 h h h#2409 i i i#2410 j j j#2411 k k k#2412 l l l#2413 m m m#2414 n n n#2415 o o o#2416 p p p#2417 q q q#2418 r r r#2419 s s s#2420 t t t#2421 u u u#2422 v v v#2423 w w w#2424 x x x#2425 y y y#2426 z z z#2427 { { {#2428 | | |#2429 } } }#2430 ~ ~ ~#2431   #2432 #2433 #2434 ~~~~#2435 }}}}#2436 ||||#2437 {{{{#2438 zzzz#2439 yyyy#2440 xxxx#2441 wwww#2442 vvvv#2443 uuuu#2444 tttt#2445 ssss#2446 rrrr#2447 qqqq#2448 pppp#2449 oooo#2450 nnnn#2451 mmmm#2452 llll#2453 kkkk#2454 jjjj#2455 iiii#2456 hhhh#2457 gggg#2458 ffff#2459 eeee#2460 dddd#2461 cccc#2462 bbbb#2463 aaaa#2464 ````#2465 ____#2466 ^^^^#2467 ]]]]#2468 \\\\#2469 [[[[#2470 ZZZZ#2471 YYYY#2472 XXXX#2473 WWWW#2474 VVVV#2475 UUUU#2476 TTTT#2477 SSSS#2478 RRRR#2479 QQQQ#2480 PPPP#2481 OOOO#2482 NNNN#2483 MMMM#2484 LLLL#2485 KKKK#2486 JJJJ#2487 IIII#2488 HHHH#2489 GGGG#2490 FFFF#2491 EEEE#2492 DDDD#2493 CCCC#2494 BBBB#2495 AAAA#2496 @@@@#2497 ????#2498 >>>>#2499 ====#2500 <<<<#2501 ;;;;#2502 ::::#2503 9999#2504 8888#2505 7777#2506 6666#2507 5555#2508 4444#2509 3333#2510 2222#2511 1111#2512 0000#2513 ////#2514 ....#2515 ----#2516 ,,,,#2517 ++++#2518 ****#2519 ))))#2520 ((((#2521 ''''#2522 &&&৛ %%%%#2524 $$$$#2525 #####2526 """"#2527 !!!!#2528     #2529 #2530 #2531 #2532 #2533 #2534 #2535 #2536 #2537 #2538 #2539 #2540 #2541 #2542 #2543 #2544 #2545 #2546 #2547     #2548     #2549     #2550     #2551     #2552 #2553 #2554 #2555 #2556 #2557 #2558 #2559 #2560 #2561   #2562   #2563   #2564   #2565   #2566   #2567   #2568   #2569 #2570 #2571 #2572 #2573 #2574   #2575   #2576   #2577   #2578   #2579   #2580   #2581   #2582   #2583   #2584   #2585   #2586   #2587   #2588   #2589   #2590   #2591   #2592 #2593 ! ! !#2594 " " "#2595 # # ##2596 $ $ $#2597 % % %#2598 & & &#2599 ' ' '#2600 ( ( (#2601 ) ) )#2602 * * *#2603 + + +#2604 , , ,#2605 - - -#2606 . . .#2607 / / /#2608 0 0 0#2609 1 1 1#2610 2 2 2#2611 3 3 3#2612 4 4 4#2613 5 5 5#2614 6 6 6#2615 7 7 7#2616 8 8 8#2617 9 9 9#2618 : : :#2619 ; ; ;#2620 < < <#2621 = = =#2622 > > >#2623 ? ? ?#2624 @ @ @#2625 A A A#2626 B B B#2627 C C C#2628 D D D#2629 E E E#2630 F F F#2631 G G G#2632 H H H#2633 I I I#2634 J J J#2635 K K K#2636 L L L#2637 M M M#2638 N N N#2639 O O O#2640 P P P#2641 Q Q Q#2642 R R R#2643 S S S#2644 T T T#2645 U U U#2646 V V V#2647 W W W#2648 X X X#2649 Y Y Y#2650 Z Z Z#2651 [ [ [#2652 \ \ \#2653 ] ] ]#2654 ^ ^ ^#2655 _ _ _#2656 ` ` `#2657 a a a#2658 b b b#2659 c c c#2660 d d d#2661 e e e#2662 f f f#2663 g g g#2664 h h h#2665 i i i#2666 j j j#2667 k k k#2668 l l l#2669 m m m#2670 n n n#2671 o o o#2672 p p p#2673 q q q#2674 r r r#2675 s s s#2676 t t t#2677 u u u#2678 v v v#2679 w w w#2680 x x x#2681 y y y#2682 z z z#2683 { { {#2684 | | |#2685 } } }#2686 ~ ~ ~#2687   #2688 #2689 #2690 ~~~~#2691 }}}}#2692 ||||#2693 {{{{#2694 zzzz#2695 yyyy#2696 xxxx#2697 wwww#2698 vvvv#2699 uuuu#2700 tttt#2701 ssss#2702 rrrr#2703 qqqq#2704 pppp#2705 oooo#2706 nnnn#2707 mmmm#2708 llll#2709 kkkk#2710 jjjj#2711 iiii#2712 hhhh#2713 gggg#2714 ffff#2715 eeee#2716 dddd#2717 cccc#2718 bbbb#2719 aaaa#2720 ````#2721 ____#2722 ^^^^#2723 ]]]]#2724 \\\\#2725 [[[[#2726 ZZZZ#2727 YYYY#2728 XXXX#2729 WWWW#2730 VVVV#2731 UUUU#2732 TTTT#2733 SSSS#2734 RRRR#2735 QQQQ#2736 PPPP#2737 OOOO#2738 NNNN#2739 MMMM#2740 LLLL#2741 KKKK#2742 JJJJ#2743 IIII#2744 HHHH#2745 GGGG#2746 FFFF#2747 EEEE#2748 DDDD#2749 CCCC#2750 BBBB#2751 AAAA#2752 @@@@#2753 ????#2754 >>>>#2755 ====#2756 <<<<#2757 ;;;;#2758 ::::#2759 9999#2760 8888#2761 7777#2762 6666#2763 5555#2764 4444#2765 3333#2766 2222#2767 1111#2768 0000#2769 ////#2770 ....#2771 ----#2772 ,,,,#2773 ++++#2774 ****#2775 ))))#2776 ((((#2777 ''''#2778 &&&૛ %%%%#2780 $$$$#2781 #####2782 """"#2783 !!!!#2784     #2785 #2786 #2787 #2788 #2789 #2790 #2791 #2792 #2793 #2794 #2795 #2796 #2797 #2798 #2799 #2800 #2801 #2802 #2803     #2804     #2805     #2806     #2807     #2808 #2809 #2810 #2811 #2812 #2813 #2814 #2815 #2816 #2817   #2818   #2819   #2820   #2821   #2822   #2823   #2824   #2825 #2826 #2827 #2828 #2829 #2830   #2831   #2832   #2833   #2834   #2835   #2836   #2837   #2838   #2839   #2840   #2841   #2842   #2843   #2844   #2845   #2846   #2847   #2848 #2849 ! ! !#2850 " " "#2851 # # ##2852 $ $ $#2853 % % %#2854 & & &#2855 ' ' '#2856 ( ( (#2857 ) ) )#2858 * * *#2859 + + +#2860 , , ,#2861 - - -#2862 . . .#2863 / / /#2864 0 0 0#2865 1 1 1#2866 2 2 2#2867 3 3 3#2868 4 4 4#2869 5 5 5#2870 6 6 6#2871 7 7 7#2872 8 8 8#2873 9 9 9#2874 : : :#2875 ; ; ;#2876 < < <#2877 = = =#2878 > > >#2879 ? ? ?#2880 @ @ @#2881 A A A#2882 B B B#2883 C C C#2884 D D D#2885 E E E#2886 F F F#2887 G G G#2888 H H H#2889 I I I#2890 J J J#2891 K K K#2892 L L L#2893 M M M#2894 N N N#2895 O O O#2896 P P P#2897 Q Q Q#2898 R R R#2899 S S S#2900 T T T#2901 U U U#2902 V V V#2903 W W W#2904 X X X#2905 Y Y Y#2906 Z Z Z#2907 [ [ [#2908 \ \ \#2909 ] ] ]#2910 ^ ^ ^#2911 _ _ _#2912 ` ` `#2913 a a a#2914 b b b#2915 c c c#2916 d d d#2917 e e e#2918 f f f#2919 g g g#2920 h h h#2921 i i i#2922 j j j#2923 k k k#2924 l l l#2925 m m m#2926 n n n#2927 o o o#2928 p p p#2929 q q q#2930 r r r#2931 s s s#2932 t t t#2933 u u u#2934 v v v#2935 w w w#2936 x x x#2937 y y y#2938 z z z#2939 { { {#2940 | | |#2941 } } }#2942 ~ ~ ~#2943   #2944 #2945 #2946 ~~~~#2947 }}}}#2948 ||||#2949 {{{{#2950 zzzz#2951 yyyy#2952 xxxx#2953 wwww#2954 vvvv#2955 uuuu#2956 tttt#2957 ssss#2958 rrrr#2959 qqqq#2960 pppp#2961 oooo#2962 nnnn#2963 mmmm#2964 llll#2965 kkkk#2966 jjjj#2967 iiii#2968 hhhh#2969 gggg#2970 ffff#2971 eeee#2972 dddd#2973 cccc#2974 bbbb#2975 aaaa#2976 ````#2977 ____#2978 ^^^^#2979 ]]]]#2980 \\\\#2981 [[[[#2982 ZZZZ#2983 YYYY#2984 XXXX#2985 WWWW#2986 VVVV#2987 UUUU#2988 TTTT#2989 SSSS#2990 RRRR#2991 QQQQ#2992 PPPP#2993 OOOO#2994 NNNN#2995 MMMM#2996 LLLL#2997 KKKK#2998 JJJJ#2999 IIII#3000 HHHH#3001 GGGG#3002 FFFF#3003 EEEE#3004 DDDD#3005 CCCC#3006 BBBB#3007 AAAA#3008 @@@@#3009 ????#3010 >>>>#3011 ====#3012 <<<<#3013 ;;;;#3014 ::::#3015 9999#3016 8888#3017 7777#3018 6666#3019 5555#3020 4444#3021 3333#3022 2222#3023 1111#3024 0000#3025 ////#3026 ....#3027 ----#3028 ,,,,#3029 ++++#3030 ****#3031 ))))#3032 ((((#3033 ''''#3034 &&&௛ %%%%#3036 $$$$#3037 #####3038 """"#3039 !!!!#3040     #3041 #3042 #3043 #3044 #3045 #3046 #3047 #3048 #3049 #3050 #3051 #3052 #3053 #3054 #3055 #3056 #3057 #3058 #3059     #3060     #3061     #3062     #3063     #3064 #3065 #3066 #3067 #3068 #3069 #3070 #3071 #3072 #3073   #3074   #3075   #3076   #3077   #3078   #3079   #3080   #3081 #3082 #3083 #3084 #3085 #3086   #3087   #3088   #3089   #3090   #3091   #3092   #3093   #3094   #3095   #3096   #3097   #3098   #3099   #3100   #3101   #3102   #3103   #3104 #3105 ! ! !#3106 " " "#3107 # # ##3108 $ $ $#3109 % % %#3110 & & &#3111 ' ' '#3112 ( ( (#3113 ) ) )#3114 * * *#3115 + + +#3116 , , ,#3117 - - -#3118 . . .#3119 / / /#3120 0 0 0#3121 1 1 1#3122 2 2 2#3123 3 3 3#3124 4 4 4#3125 5 5 5#3126 6 6 6#3127 7 7 7#3128 8 8 8#3129 9 9 9#3130 : : :#3131 ; ; ;#3132 < < <#3133 = = =#3134 > > >#3135 ? ? ?#3136 @ @ @#3137 A A A#3138 B B B#3139 C C C#3140 D D D#3141 E E E#3142 F F F#3143 G G G#3144 H H H#3145 I I I#3146 J J J#3147 K K K#3148 L L L#3149 M M M#3150 N N N#3151 O O O#3152 P P P#3153 Q Q Q#3154 R R R#3155 S S S#3156 T T T#3157 U U U#3158 V V V#3159 W W W#3160 X X X#3161 Y Y Y#3162 Z Z Z#3163 [ [ [#3164 \ \ \#3165 ] ] ]#3166 ^ ^ ^#3167 _ _ _#3168 ` ` `#3169 a a a#3170 b b b#3171 c c c#3172 d d d#3173 e e e#3174 f f f#3175 g g g#3176 h h h#3177 i i i#3178 j j j#3179 k k k#3180 l l l#3181 m m m#3182 n n n#3183 o o o#3184 p p p#3185 q q q#3186 r r r#3187 s s s#3188 t t t#3189 u u u#3190 v v v#3191 w w w#3192 x x x#3193 y y y#3194 z z z#3195 { { {#3196 | | |#3197 } } }#3198 ~ ~ ~#3199   #3200 #3201 #3202 ~~~~#3203 }}}}#3204 ||||#3205 {{{{#3206 zzzz#3207 yyyy#3208 xxxx#3209 wwww#3210 vvvv#3211 uuuu#3212 tttt#3213 ssss#3214 rrrr#3215 qqqq#3216 pppp#3217 oooo#3218 nnnn#3219 mmmm#3220 llll#3221 kkkk#3222 jjjj#3223 iiii#3224 hhhh#3225 gggg#3226 ffff#3227 eeee#3228 dddd#3229 cccc#3230 bbbb#3231 aaaa#3232 ````#3233 ____#3234 ^^^^#3235 ]]]]#3236 \\\\#3237 [[[[#3238 ZZZZ#3239 YYYY#3240 XXXX#3241 WWWW#3242 VVVV#3243 UUUU#3244 TTTT#3245 SSSS#3246 RRRR#3247 QQQQ#3248 PPPP#3249 OOOO#3250 NNNN#3251 MMMM#3252 LLLL#3253 KKKK#3254 JJJJ#3255 IIII#3256 HHHH#3257 GGGG#3258 FFFF#3259 EEEE#3260 DDDD#3261 CCCC#3262 BBBB#3263 AAAA#3264 @@@@#3265 ????#3266 >>>>#3267 ====#3268 <<<<#3269 ;;;;#3270 ::::#3271 9999#3272 8888#3273 7777#3274 6666#3275 5555#3276 4444#3277 3333#3278 2222#3279 1111#3280 0000#3281 ////#3282 ....#3283 ----#3284 ,,,,#3285 ++++#3286 ****#3287 ))))#3288 ((((#3289 ''''#3290 &&&೛ %%%%#3292 $$$$#3293 #####3294 """"#3295 !!!!#3296     #3297 #3298 #3299 #3300 #3301 #3302 #3303 #3304 #3305 #3306 #3307 #3308 #3309 #3310 #3311 #3312 #3313 #3314 #3315     #3316     #3317     #3318     #3319     #3320 #3321 #3322 #3323 #3324 #3325 #3326 #3327 #3328 #3329   #3330   #3331   #3332   #3333   #3334   #3335   #3336   #3337 #3338 #3339 #3340 #3341 #3342   #3343   #3344   #3345   #3346   #3347   #3348   #3349   #3350   #3351   #3352   #3353   #3354   #3355   #3356   #3357   #3358   #3359   #3360 #3361 ! ! !#3362 " " "#3363 # # ##3364 $ $ $#3365 % % %#3366 & & &#3367 ' ' '#3368 ( ( (#3369 ) ) )#3370 * * *#3371 + + +#3372 , , ,#3373 - - -#3374 . . .#3375 / / /#3376 0 0 0#3377 1 1 1#3378 2 2 2#3379 3 3 3#3380 4 4 4#3381 5 5 5#3382 6 6 6#3383 7 7 7#3384 8 8 8#3385 9 9 9#3386 : : :#3387 ; ; ;#3388 < < <#3389 = = =#3390 > > >#3391 ? ? ?#3392 @ @ @#3393 A A A#3394 B B B#3395 C C C#3396 D D D#3397 E E E#3398 F F F#3399 G G G#3400 H H H#3401 I I I#3402 J J J#3403 K K K#3404 L L L#3405 M M M#3406 N N N#3407 O O O#3408 P P P#3409 Q Q Q#3410 R R R#3411 S S S#3412 T T T#3413 U U U#3414 V V V#3415 W W W#3416 X X X#3417 Y Y Y#3418 Z Z Z#3419 [ [ [#3420 \ \ \#3421 ] ] ]#3422 ^ ^ ^#3423 _ _ _#3424 ` ` `#3425 a a a#3426 b b b#3427 c c c#3428 d d d#3429 e e e#3430 f f f#3431 g g g#3432 h h h#3433 i i i#3434 j j j#3435 k k k#3436 l l l#3437 m m m#3438 n n n#3439 o o o#3440 p p p#3441 q q q#3442 r r r#3443 s s s#3444 t t t#3445 u u u#3446 v v v#3447 w w w#3448 x x x#3449 y y y#3450 z z z#3451 { { {#3452 | | |#3453 } } }#3454 ~ ~ ~#3455   #3456 #3457 #3458 ~~~~#3459 }}}}#3460 ||||#3461 {{{{#3462 zzzz#3463 yyyy#3464 xxxx#3465 wwww#3466 vvvv#3467 uuuu#3468 tttt#3469 ssss#3470 rrrr#3471 qqqq#3472 pppp#3473 oooo#3474 nnnn#3475 mmmm#3476 llll#3477 kkkk#3478 jjjj#3479 iiii#3480 hhhh#3481 gggg#3482 ffff#3483 eeee#3484 dddd#3485 cccc#3486 bbbb#3487 aaaa#3488 ````#3489 ____#3490 ^^^^#3491 ]]]]#3492 \\\\#3493 [[[[#3494 ZZZZ#3495 YYYY#3496 XXXX#3497 WWWW#3498 VVVV#3499 UUUU#3500 TTTT#3501 SSSS#3502 RRRR#3503 QQQQ#3504 PPPP#3505 OOOO#3506 NNNN#3507 MMMM#3508 LLLL#3509 KKKK#3510 JJJJ#3511 IIII#3512 HHHH#3513 GGGG#3514 FFFF#3515 EEEE#3516 DDDD#3517 CCCC#3518 BBBB#3519 AAAA#3520 @@@@#3521 ????#3522 >>>>#3523 ====#3524 <<<<#3525 ;;;;#3526 ::::#3527 9999#3528 8888#3529 7777#3530 6666#3531 5555#3532 4444#3533 3333#3534 2222#3535 1111#3536 0000#3537 ////#3538 ....#3539 ----#3540 ,,,,#3541 ++++#3542 ****#3543 ))))#3544 ((((#3545 ''''#3546 &&&ෛ %%%%#3548 $$$$#3549 #####3550 """"#3551 !!!!#3552     #3553 #3554 #3555 #3556 #3557 #3558 #3559 #3560 #3561 #3562 #3563 #3564 #3565 #3566 #3567 #3568 #3569 #3570 #3571     #3572     #3573     #3574     #3575     #3576 #3577 #3578 #3579 #3580 #3581 #3582 #3583 #3584#3585#3586#3587#3588#3589#3590#3591#3592#3593   #3594   #3595   #3596   #3597   #3598#3599#3600#3601#3602#3603#3604#3605#3606#3607#3608#3609#3610#3611#3612#3613#3614#3615#3616   #3617!!!#3618"""#3619####3620$$$#3621%%%#3622&&&#3623'''#3624(((#3625)))#3626***#3627+++#3628,,,#3629---#3630...#3631///#3632000#3633111#3634222#3635333#3636444#3637555#3638666#3639777#3640888#3641999#3642:::#3643;;;#3644<<<#3645===#3646>>>#3647???#3648@@@#3649AAA#3650BBB#3651CCC#3652DDD#3653EEE#3654FFF#3655GGG#3656HHH#3657III#3658JJJ#3659KKK#3660LLL#3661MMM#3662NNN#3663OOO#3664PPP#3665QQQ#3666RRR#3667SSS#3668TTT#3669UUU#3670VVV#3671WWW#3672XXX#3673YYY#3674ZZZ#3675[[[#3676\\\#3677]]]#3678^^^#3679___#3680```#3681aaa#3682bbb#3683ccc#3684ddd#3685eee#3686fff#3687ggg#3688hhh#3689iii#3690jjj#3691kkk#3692lll#3693mmm#3694nnn#3695ooo#3696ppp#3697qqq#3698rrr#3699sss#3700ttt#3701uuu#3702vvv#3703www#3704xxx#3705yyy#3706zzz#3707{{{#3708|||#3709}}}#3710~~~#3711#3712#3713#3714~~~~#3715}}}}#3716||||#3717{{{{#3718zzzz#3719yyyy#3720xxxx#3721wwww#3722vvvv#3723uuuu#3724tttt#3725ssss#3726rrrr#3727qqqq#3728pppp#3729oooo#3730nnnn#3731mmmm#3732llll#3733kkkk#3734jjjj#3735iiii#3736hhhh#3737gggg#3738ffff#3739eeee#3740dddd#3741cccc#3742bbbb#3743aaaa#3744````#3745____#3746^^^^#3747]]]]#3748\\\\#3749[[[[#3750ZZZZ#3751YYYY#3752XXXX#3753WWWW#3754VVVV#3755UUUU#3756TTTT#3757SSSS#3758RRRR#3759QQQQ#3760PPPP#3761OOOO#3762NNNN#3763MMMM#3764LLLL#3765KKKK#3766JJJJ#3767IIII#3768HHHH#3769GGGG#3770FFFF#3771EEEE#3772DDDD#3773CCCC#3774BBBB#3775AAAA#3776@@@@#3777????#3778>>>>#3779====#3780<<<<#3781;;;;#3782::::#37839999#37848888#37857777#37866666#37875555#37884444#37893333#37902222#37911111#37920000#3793////#3794....#3795----#3796,,,,#3797++++#3798****#3799))))#3800((((#3801''''#3802&&&໛%%%%#3804$$$$#3805#####3806""""#3807!!!!#3808    #3809#3810#3811#3812#3813#3814#3815#3816#3817#3818#3819#3820#3821#3822#3823#3824#3825#3826#3827    #3828    #3829    #3830    #3831    #3832#3833#3834#3835#3836#3837#3838#3839#3840#3841#3842#3843#3844#3845#3846#3847#3848#3849   #3850   #3851   #3852   #3853   #3854#3855#3856#3857#3858#3859#3860#3861#3862#3863#3864#3865#3866#3867#3868#3869#3870#3871#3872   #3873!!!#3874"""#3875####3876$$$#3877%%%#3878&&&#3879'''#3880(((#3881)))#3882***#3883+++#3884,,,#3885---#3886...#3887///#3888000#3889111#3890222#3891333#3892444#3893555#3894666#3895777#3896888#3897999#3898:::#3899;;;#3900<<<#3901===#3902>>>#3903???#3904@@@#3905AAA#3906BBB#3907CCC#3908DDD#3909EEE#3910FFF#3911GGG#3912HHH#3913III#3914JJJ#3915KKK#3916LLL#3917MMM#3918NNN#3919OOO#3920PPP#3921QQQ#3922RRR#3923SSS#3924TTT#3925UUU#3926VVV#3927WWW#3928XXX#3929YYY#3930ZZZ#3931[[[#3932\\\#3933]]]#3934^^^#3935___#3936```#3937aaa#3938bbb#3939ccc#3940ddd#3941eee#3942fff#3943ggg#3944hhh#3945iii#3946jjj#3947kkk#3948lll#3949mmm#3950nnn#3951ooo#3952ppp#3953qqq#3954rrr#3955sss#3956ttt#3957uuu#3958vvv#3959www#3960xxx#3961yyy#3962zzz#3963{{{#3964|||#3965}}}#3966~~~#3967#3968#3969#3970~~~~#3971}}}}#3972||||#3973{{{{#3974zzzz#3975yyyy#3976xxxx#3977wwww#3978vvvv#3979uuuu#3980tttt#3981ssss#3982rrrr#3983qqqq#3984pppp#3985oooo#3986nnnn#3987mmmm#3988llll#3989kkkk#3990jjjj#3991iiii#3992hhhh#3993gggg#3994ffff#3995eeee#3996dddd#3997cccc#3998bbbb#3999aaaa#4000````#4001____#4002^^^^#4003]]]]#4004\\\\#4005[[[[#4006ZZZZ#4007YYYY#4008XXXX#4009WWWW#4010VVVV#4011UUUU#4012TTTT#4013SSSS#4014RRRR#4015QQQQ#4016PPPP#4017OOOO#4018NNNN#4019MMMM#4020LLLL#4021KKKK#4022JJJJ#4023IIII#4024HHHH#4025GGGG#4026FFFF#4027EEEE#4028DDDD#4029CCCC#4030BBBB#4031AAAA#4032@@@@#4033????#4034>>>>#4035====#4036<<<<#4037;;;;#4038::::#40399999#40408888#40417777#40426666#40435555#40444444#40453333#40462222#40471111#40480000#4049////#4050....#4051----#4052,,,,#4053++++#4054****#4055))))#4056((((#4057''''#4058&&&࿛%%%%#4060$$$$#4061#####4062""""#4063!!!!#4064 #4065#4066#4067#4068#4069#4070#4071#4072#4073#4074#4075#4076#4077#4078#4079#4080#4081#4082#4083 #4084 #4085 #4086 #4087 #4088#4089#4090#4091#4092#4093#4094#4095mAB P paraparaparaparaparaparamAB P paraparaparaparaparaparamAB P paraparaparaparaparaparamBA P paraparaparaparaparaparamBA P paraparaparaparaparaparamBA P paraparaparaparaparaparamBA P paraparaparaparaparaparamBA P paraparaparaparaparaparamBA P paraparaparaparaparaparamBA P paraparaparaparaparaparasf3233Lff3chrmLff3clro meas33Lcrditest postscript perceptualrelative_colorimetric saturationabsolute_colorimetricbfd   !!!""##$$%%&&''(())**++,--..//00122334556678899:;;<==>??@AABCCDEFFGHHIJKKLMNNOPQQRSTTUVWXYYZ[\]]^_`abccdefghijkklmnopqrstuvwxyz{|}~     "$%')*,./134689;=?@BDEGIKLNPRTUWY[]^`bdfgikmoqsuvxz|~   "$')+.0357:<?ACFHKMPRUWZ\_adfiknpsuxz}  #%(+.147:=@CFILORUY\_behknqtw{~ #&*-147;?BFIMPTW[^bfimptx{ !%)-159=AEIMQUY]aeimquy} "&+/38<AEJNRW[`dimrv{ !&+/49>CGLQV[`dinsx} "'-27<AFLQV[`fkpu{      ! ' , 2 7 = B H N S Y ^ d i o u z     & , 2 8 > C I O U [ a g m s y      " ) / 5 ; A H N T Z ` g m s y     & , 3 9 @ F M S Z a g n t {     " ) 0 7 = D K R Y ` g m t { #*18?GNU\cjry  (/6>EMT[cjry  '/7>FNU]emt| !)19AIQYaiqy #+3<DLT]emu~ %.6?GPXairz '08AJS[dmv '09BKT]fox &/8BKT]gpy"+5>HQ[dnw$.8AKU_hr|#-7AKU_is} (2<GQ[eoz )3=HR]gr|$/:DOYdoy%0;FQ[fq|  +6AMXcny  ,7BMYdo{    % 1 < H S _ j v !! !!#!/!;!F!R!^!i!u!!!!!!!!!!!""""&"2">"J"V"a"m"y"""""""""""# ##!#-#9#E#Q#^#j#v###########$$$ $-$9$E$R$^$j$v$$$$$$$$$$$% %%$%0%=%I%V%b%o%{%%%%%%%%%%&&&&,&8&E&R&^&k&x&&&&&&&&&&''''+'7'D'Q'^'k'x''''''''''((( (-(;(H(U(b(o(|(((((((((() ))')4)A)O)\)i)w))))))))))* **$*1*?*L*Z*g*u**********+ ++%+2+@+M+[+i+v++++++++++, ,,),6,D,R,`,n,{,,,,,,,,,---"-0->-L-Z-h-v---------....-.;.I.X.f.t.........////-/>!>2>B>S>d>u>>>>>>>>? ??/?@?Q?b?s????????@ @@/@@@Q@b@t@@@@@@@@AA A1ACATAeAvAAAAAAABBB$B6BGBYBjB|BBBBBBBCCC+C=CNC`CrCCCCCCCCDD#D4DFDXDjD{DDDDDDDE EE.E@EREdEvEEEEEEEFFF*FZRZgZ|ZZZZZZ[[$[9[N[c[x[[[[[[\ \!\6\L\a\v\\\\\\] ] ]5]K]`]u]]]]]]^ ^ ^6^K^a^v^^^^^^_ _"_8_M_c_y______``&`;`Q`g`}``````aa+aAaWalaaaaaabbb2bHb^btbbbbbbcc$c:cPcfc|cccccddd.dDdZdpdddddde e#e9ePefe|eeeeefff0fFf]fsffffffgg(g>gUglggggggh h!h8hOheh|hhhhhiii3iIi`iwiiiiijjj/jFj]jtjjjjjjkk,kCk[krkkkkkkll+lBlZlqllllllmm,mCmZmrmmmmmmnn-nEn\ntnnnnnooo0oHo`owoooooppp5pLpdp|pppppq q#q;qRqjqqqqqqrr*rBrZrrrrrrrsss2sJsbs{ssssst t$t?@ABCDEFGHI~JzKwLtMrNoOmPlQjRiShThUhVgWhXhYiZj[k\m]o^q_s`vayb|cdefghijklmnopqrstuvwxz{ |}~$-7@JT^hs~ŽΏڐ '4BO]kzâӣ!1BRctʳ۴$6I[n 3G\p˅ͯ̚0F\s؉ٟڶ)@Xo1Ib{-Ga{  *5AO^o+Jj%O{ >sY]3lk  { :  h ;  n^VV_p?nD-~*: !_""#$Y%%&'v(C))*+,f-A../0123{4h5W6H7<829+:%;"<"=$>(?.@7ABBOC_DqEFGHIKL3MXNOPRS5TiUVXYOZ[]^\_`b?cdf8ghjGkmnloq C [ " ] ;$.LvK<It4 !T"%"#$%&q'X(C)2*$+,-./0'162I3`4{5679:E;{<=?7@ACDrEG-HIKiLNTOQTRThUWY.Z\v^#_acIe fhjulOn.pqsuwy{}*KsՍP:`ϢEEЬa@^!ľǗx`PGFM[qT<data123dict@H T NameString enUS@esESXfrFR"ncaCAHello, worldHola, mundoBonjour, le mondeHola, monName212cicp MHC2d(XdpL33fflcms2-2.19.1/fuzzers/fuzzers.exp0000644000175000017500000001202415176573557015620 0ustar martimartida @.edata{d<@@.debug$S)8@B fuzzers.exeLLVMFuzzerMutateLLVMFuzzerRunDriver__sanitizer_cov_8bit_counters_init__sanitizer_cov_pcs_init__sanitizer_cov_trace_cmp1__sanitizer_cov_trace_cmp2__sanitizer_cov_trace_cmp4__sanitizer_cov_trace_cmp8__sanitizer_cov_trace_const_cmp1__sanitizer_cov_trace_const_cmp2__sanitizer_cov_trace_const_cmp4__sanitizer_cov_trace_const_cmp8__sanitizer_cov_trace_div4__sanitizer_cov_trace_div8__sanitizer_cov_trace_gep__sanitizer_cov_trace_pc__sanitizer_cov_trace_pc_guard__sanitizer_cov_trace_pc_guard_init__sanitizer_cov_trace_pc_indir__sanitizer_cov_trace_switch__sanitizer_weak_hook_memcmp__sanitizer_weak_hook_memmem__sanitizer_weak_hook_strcasecmp__sanitizer_weak_hook_strcasestr__sanitizer_weak_hook_strcmp__sanitizer_weak_hook_strncasecmp__sanitizer_weak_hook_strncmp__sanitizer_weak_hook_strstr  $($,% 0& 4' 8( <) @*D+H,L-P.T/X0\1`2d3h4l5p6t7x8|9:;< =!>"?##..\..\..\fuzzers\fuzzers.exp+<*Microsoft (R) LINK=cwdC:\Users\marti\Documents\GitHub\Little-CMS\Projects\VC2022\fuzzersexeC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\bin\HostX64\x64\link.exe8LLVMFuzzerMutate8LLVMFuzzerRunDriver)8__sanitizer_cov_8bit_counters_init8__sanitizer_cov_pcs_init!8__sanitizer_cov_trace_cmp1!8__sanitizer_cov_trace_cmp2!8__sanitizer_cov_trace_cmp4!8__sanitizer_cov_trace_cmp8'8 __sanitizer_cov_trace_const_cmp1'8 __sanitizer_cov_trace_const_cmp2'8 __sanitizer_cov_trace_const_cmp4'8 __sanitizer_cov_trace_const_cmp8!8 __sanitizer_cov_trace_div4!8__sanitizer_cov_trace_div8 8__sanitizer_cov_trace_gep8__sanitizer_cov_trace_pc%8__sanitizer_cov_trace_pc_guard*8__sanitizer_cov_trace_pc_guard_init%8__sanitizer_cov_trace_pc_indir#8__sanitizer_cov_trace_switch#8__sanitizer_weak_hook_memcmp#8__sanitizer_weak_hook_memmem'8__sanitizer_weak_hook_strcasecmp'8__sanitizer_weak_hook_strcasestr#8__sanitizer_weak_hook_strcmp(8__sanitizer_weak_hook_strncasecmp$8__sanitizer_weak_hook_strncmp#8__sanitizer_weak_hook_strstr@comp.id@feat.00.edata.debug$SszName@rgpv(rgszNamergwOrd$N00001L$N00002]$N00003q$N00004$N00005$N00006$N00007$N00008$N00009$N00010:$N00011[$N00012|$N00013$N00014$N00015$N00016$N00017$N00018%$N00019I$N00020h$N00021$N00022$N00023$N00024$N00025$N00026$N00027@$N00028^)Le4Up =Zw3LLVMFuzzerMutateLLVMFuzzerRunDriver__sanitizer_cov_8bit_counters_init__sanitizer_cov_pcs_init__sanitizer_cov_trace_cmp1__sanitizer_cov_trace_cmp2__sanitizer_cov_trace_cmp4__sanitizer_cov_trace_cmp8__sanitizer_cov_trace_const_cmp1__sanitizer_cov_trace_const_cmp2__sanitizer_cov_trace_const_cmp4__sanitizer_cov_trace_const_cmp8__sanitizer_cov_trace_div4__sanitizer_cov_trace_div8__sanitizer_cov_trace_gep__sanitizer_cov_trace_pc__sanitizer_cov_trace_pc_guard__sanitizer_cov_trace_pc_guard_init__sanitizer_cov_trace_pc_indir__sanitizer_cov_trace_switch__sanitizer_weak_hook_memcmp__sanitizer_weak_hook_memmem__sanitizer_weak_hook_strcasecmp__sanitizer_weak_hook_strcasestr__sanitizer_weak_hook_strcmp__sanitizer_weak_hook_strncasecmp__sanitizer_weak_hook_strncmp__sanitizer_weak_hook_strstrlcms2-2.19.1/fuzzers/fuzzers.c0000644000175000017500000001255115176573557015253 0ustar martimarti//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2026 Marti Maria Saguer // // 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. // //--------------------------------------------------------------------------------- // #include #include "lcms2_plugin.h" CMSAPI cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); CMSAPI cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); CMSAPI cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); // Read and decode all tags on a profile static void ReadAllTags(cmsHPROFILE h) { cmsInt32Number i, n; cmsTagSignature sig; n = cmsGetTagCount(h); for (i = 0; i < n; i++) { sig = cmsGetTagSignature(h, i); if (cmsReadTag(h, sig) == NULL) return; } } // Read all raw tags on a profile static void ReadAllRAWTags(cmsHPROFILE h) { cmsInt32Number i, n; cmsTagSignature sig; cmsInt32Number len; n = cmsGetTagCount(h); for (i = 0; i < n; i++) { sig = cmsGetTagSignature(h, i); len = cmsReadRawTag(h, sig, NULL, 0); } } // Read and decode information static void FetchInfo(cmsHPROFILE h, cmsInfoType Info) { wchar_t* text; cmsInt32Number len; cmsContext id = 0; len = cmsGetProfileInfo(h, Info, "en", "US", NULL, 0); if (len == 0) return; text = (wchar_t*)_cmsMalloc(id, len); if (text != NULL) { cmsGetProfileInfo(h, Info, "en", "US", text, len); _cmsFree(id, text); } } // Get all information static void FetchAllInfos(cmsHPROFILE h) { FetchInfo(h, cmsInfoDescription); FetchInfo(h, cmsInfoManufacturer); FetchInfo(h, cmsInfoModel); FetchInfo(h, cmsInfoCopyright); } // Read all LUTs, which some may be missing static void ReadAllLUTS(cmsHPROFILE h) { cmsPipeline* a; cmsCIEXYZ Black; a = _cmsReadInputLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); cmsDetectDestinationBlackPoint(&Black, h, INTENT_PERCEPTUAL, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_RELATIVE_COLORIMETRIC, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_SATURATION, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_ABSOLUTE_COLORIMETRIC, 0); cmsDetectTAC(h); } // Create PostScript resources static void GenerateCSA(cmsHPROFILE hProfile) { cmsUInt32Number n; char* Buffer; n = cmsGetPostScriptCSA(0, hProfile, 0, 0, NULL, 0); if (n == 0) return; Buffer = (char*)_cmsMalloc(0, n); cmsGetPostScriptCSA(0, hProfile, 0, 0, Buffer, n); _cmsFree(0, Buffer); } static void GenerateCRD(cmsHPROFILE hProfile) { cmsUInt32Number n; char* Buffer; cmsUInt32Number dwFlags = 0; n = cmsGetPostScriptCRD(0, hProfile, 0, dwFlags, NULL, 0); if (n == 0) return; Buffer = (char*)_cmsMalloc(0, n); cmsGetPostScriptCRD(0, hProfile, 0, dwFlags, Buffer, n); _cmsFree(0, Buffer); } // The fuzzer entry int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t size) { cmsHPROFILE hProfile = cmsOpenProfileFromMem(Data, (cmsUInt32Number)size); if (hProfile == NULL) return 0; ReadAllTags(hProfile); ReadAllRAWTags(hProfile); FetchAllInfos(hProfile); ReadAllLUTS(hProfile); GenerateCSA(hProfile); GenerateCRD(hProfile); cmsCloseProfile(hProfile); return 0; } lcms2-2.19.1/meson_options.txt0000644000175000017500000000140415176573557015317 0ustar martimartioption('tests', type: 'feature', value: 'enabled', yield: true, description: 'Enable or disable tests') option('jpeg', type: 'feature', value: 'auto', description: 'Use JPEG') option('tiff', type: 'feature', value: 'auto', description: 'Use LibTiff') option('utils', type: 'boolean', value: false, description: 'Build the utils') option('fastfloat', type: 'boolean', value: false, description: 'Build and install the fast float plugin, use only if GPL 3.0 is acceptable') option('threaded', type: 'boolean', value: false, description: 'Build and install the multi threaded plugin, use only if GPL 3.0 is acceptable') option('versionedlibs', type: 'boolean', value: true, description: 'Enable building of .so.version libraries, disable when crosscompiling for Android') lcms2-2.19.1/AUTHORS0000644000175000017500000000176215176573557012741 0ustar martimarti Main Author ------------ Marti Maria Contributors ------------ Bob Friesenhahn Kai-Uwe Behrmann Stuart Nixon Jordi Vilar Richard Hughes Auke Nauta Chris Evans (Google) Lorenzo Ridolfi Robin Watts (Artifex) Shawn Pedersen Andrew Brygin Samuli Suominen Florian Hch Aurelien Jarno Claudiu Cebuc Michael Vhrel (Artifex) Michal Cihar Daniel Kaneider Mateusz Jurczyk (Google) Paul Miller Sbastien Lon Christian Schmitz XhmikosR Stanislav Brabec (SuSe) Leonhard Gruenschloss (Google) Patrick Noffke Christopher James Halse Rogers John Hein Thomas Weber (Debian) Mark Allen Noel Carboni Sergei Trofimovic Philipp Knechtges Amyspark Lovell Fuller Eli Schwartz Diogo Teles Sant'Anna Vlad Erium Special Thanks -------------- Artifex software AlienSkin software libVIPS Jan Morovic Jos Vernon (WebSupergoo) Harald Schneider (Maxon) Christian Albrecht Dimitrios Anastassakis Lemke Software Tim Zaman Amir Montazery and Open Source Technology Improvement Fund (ostif.org), Google, for fuzzer fundings. lcms2-2.19.1/cmake/0000755000175000017500000000000015176573557012743 5ustar martimartilcms2-2.19.1/cmake/Lcms2Features.cmake0000644000175000017500000000406415176573557016430 0ustar martimartiinclude(CheckCCompilerFlag) include(CheckCSourceCompiles) include(CheckFunctionExists) include(TestBigEndian) function(lcms2_detect_features) # Endianness test_big_endian(LCMS2_WORDS_BIGENDIAN) if(LCMS2_WORDS_BIGENDIAN) set(LCMS2_DEFINE_WORDS_BIGENDIAN 1 PARENT_SCOPE) else() set(LCMS2_DEFINE_WORDS_BIGENDIAN 0 PARENT_SCOPE) endif() # gmtime_r / gmtime_s set(CMAKE_REQUIRED_DEFINITIONS "") set(CMAKE_REQUIRED_LIBRARIES "") check_function_exists(gmtime_r LCMS2_HAVE_GMTIME_R) set(_gmtime_s_src " #include int main(void) { time_t t = (time_t)0; struct tm m; (void)gmtime_s(&m, &t); return 0; } ") check_c_source_compiles("${_gmtime_s_src}" LCMS2_HAVE_GMTIME_S) set(LCMS2_DEFINE_HAVE_GMTIME_R ${LCMS2_HAVE_GMTIME_R} PARENT_SCOPE) set(LCMS2_DEFINE_HAVE_GMTIME_S ${LCMS2_HAVE_GMTIME_S} PARENT_SCOPE) # Visibility attribute support (GCC/Clang). set(_vis_src " __attribute__((visibility(\"default\"))) int foo(void) { return 0; } int main(void) { return foo(); } ") check_c_source_compiles("${_vis_src}" LCMS2_HAVE_FUNC_ATTRIBUTE_VISIBILITY) set(LCMS2_DEFINE_HAVE_FUNC_ATTRIBUTE_VISIBILITY ${LCMS2_HAVE_FUNC_ATTRIBUTE_VISIBILITY} PARENT_SCOPE) # -fvisibility=hidden support (non-Windows, GCC/Clang). check_c_compiler_flag("-fvisibility=hidden" LCMS2_HAVE_FLAG_FVISIBILITY_HIDDEN) set(LCMS2_USE_FLAG_FVISIBILITY_HIDDEN ${LCMS2_HAVE_FLAG_FVISIBILITY_HIDDEN} PARENT_SCOPE) # SSE2 intrinsics set(_sse2_src " #include int main(void) { __m128i n = _mm_set1_epi8(42); (void)n; return 0; } ") check_c_source_compiles("${_sse2_src}" LCMS2_COMPILER_SUPPORTS_SSE2) if(LCMS2_COMPILER_SUPPORTS_SSE2) set(LCMS2_DEFINE_CMS_DONT_USE_SSE2 0 PARENT_SCOPE) else() set(LCMS2_DEFINE_CMS_DONT_USE_SSE2 1 PARENT_SCOPE) endif() # libm detection (for Linux and similar platforms). find_library(LCMS2_MATH_LIB m) if(LCMS2_MATH_LIB) set(LCMS2_LINK_LIBM 1 PARENT_SCOPE) else() set(LCMS2_LINK_LIBM 0 PARENT_SCOPE) endif() endfunction() lcms2-2.19.1/cmake/Lcms2Packaging.cmake0000644000175000017500000000734715176573557016545 0ustar martimartifunction(lcms2_setup_packaging) include(GNUInstallDirs) include(CMakePackageConfigHelpers) # Headers install( FILES "${PROJECT_SOURCE_DIR}/include/lcms2.h" "${PROJECT_SOURCE_DIR}/include/lcms2_plugin.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) # Collect installable targets. set(_install_targets "") foreach(_t IN ITEMS lcms2 lcms2_static) if(TARGET ${_t}) list(APPEND _install_targets ${_t}) endif() endforeach() if(DEFINED LCMS2_TOOL_TARGETS) foreach(_t IN LISTS LCMS2_TOOL_TARGETS) if(TARGET ${_t}) list(APPEND _install_targets ${_t}) endif() endforeach() endif() if(DEFINED LCMS2_PLUGIN_TARGETS) foreach(_t IN LISTS LCMS2_PLUGIN_TARGETS) if(TARGET ${_t}) list(APPEND _install_targets ${_t}) endif() endforeach() endif() if(_install_targets) install( TARGETS ${_install_targets} EXPORT lcms2-targets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) endif() # Manpages (installed regardless of whether the corresponding tool is built). if(DEFINED LCMS2_TOOL_MANPAGES) install( FILES ${LCMS2_TOOL_MANPAGES} DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" ) endif() # CMake package config. set(_lcms2_cmake_config_dir "${CMAKE_INSTALL_LIBDIR}/cmake/lcms2") install( EXPORT lcms2-targets NAMESPACE lcms2:: DESTINATION "${_lcms2_cmake_config_dir}" ) configure_package_config_file( "${PROJECT_SOURCE_DIR}/cmake/lcms2-config.cmake.in" "${PROJECT_BINARY_DIR}/lcms2-config.cmake" INSTALL_DESTINATION "${_lcms2_cmake_config_dir}" ) write_basic_package_version_file( "${PROJECT_BINARY_DIR}/lcms2-config-version.cmake" VERSION "${PROJECT_VERSION}" COMPATIBILITY SameMajorVersion ) install( FILES "${PROJECT_BINARY_DIR}/lcms2-config.cmake" "${PROJECT_BINARY_DIR}/lcms2-config-version.cmake" DESTINATION "${_lcms2_cmake_config_dir}" ) # Build-tree export for local consumption. export( EXPORT lcms2-targets NAMESPACE lcms2:: FILE "${PROJECT_BINARY_DIR}/lcms2-targets.cmake" ) # pkg-config generation (mirrors lcms2.pc.in semantics). set(LIB_PLUGINS "") if(DEFINED LCMS2_PLUGIN_TARGETS) foreach(_t IN LISTS LCMS2_PLUGIN_TARGETS) if(TARGET ${_t}) get_target_property(_out_name ${_t} OUTPUT_NAME) if(NOT _out_name) set(_out_name "${_t}") endif() set(LIB_PLUGINS "${LIB_PLUGINS} -l${_out_name}") endif() endforeach() string(STRIP "${LIB_PLUGINS}" LIB_PLUGINS) endif() set(LIB_MATH "") set(LIB_THREAD "") if(NOT WIN32) find_library(_lcms2_math_lib m) if(_lcms2_math_lib) set(LIB_MATH "-lm") endif() if(LCMS2_WITH_THREADS) find_package(Threads) if(CMAKE_THREAD_LIBS_INIT) set(LIB_THREAD "${CMAKE_THREAD_LIBS_INIT}") endif() endif() endif() set(prefix "${CMAKE_INSTALL_PREFIX}") set(exec_prefix "\${prefix}") if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") set(libdir "${CMAKE_INSTALL_LIBDIR}") else() set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") endif() if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") set(includedir "${CMAKE_INSTALL_INCLUDEDIR}") else() set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") endif() set(PACKAGE "${PROJECT_NAME}") set(VERSION "${PROJECT_VERSION}") configure_file( "${PROJECT_SOURCE_DIR}/lcms2.pc.in" "${PROJECT_BINARY_DIR}/lcms2.pc" @ONLY ) install( FILES "${PROJECT_BINARY_DIR}/lcms2.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" ) endfunction() lcms2-2.19.1/cmake/Lcms2Tests.cmake0000644000175000017500000000557515176573557015764 0ustar martimartifunction(lcms2_add_tests) if(NOT LCMS2_BUILD_TESTS) return() endif() set(_testbed_bin_dir "${PROJECT_BINARY_DIR}/testbed") if(DEFINED LCMS2_STATIC_LIBRARY_TARGET) set(_lcms2_test_lib "${LCMS2_STATIC_LIBRARY_TARGET}") else() # Ensure tests can link statically even if the user disabled the installed static target. if(COMMAND _lcms2_collect_sources) _lcms2_collect_sources(_lcms2_sources_for_tests) add_library(lcms2_test_static STATIC ${_lcms2_sources_for_tests}) if(COMMAND _lcms2_apply_common_settings) _lcms2_apply_common_settings(lcms2_test_static) endif() if(COMMAND _lcms2_apply_thread_settings) _lcms2_apply_thread_settings(lcms2_test_static) endif() set(_lcms2_test_lib lcms2_test_static) else() set(_lcms2_test_lib "${LCMS2_LIBRARY_TARGET}") endif() endif() add_executable(testcms "${PROJECT_SOURCE_DIR}/testbed/testcms2.c" "${PROJECT_SOURCE_DIR}/testbed/testplugin.c" "${PROJECT_SOURCE_DIR}/testbed/zoo_icc.c" "${PROJECT_SOURCE_DIR}/testbed/testcms2.h" ) target_include_directories(testcms PRIVATE "${PROJECT_SOURCE_DIR}/include" "${PROJECT_SOURCE_DIR}/src" "${PROJECT_SOURCE_DIR}/testbed" ) if(_lcms2_test_lib) target_link_libraries(testcms PRIVATE "${_lcms2_test_lib}") endif() set_target_properties(testcms PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${_testbed_bin_dir}" ) # Per-target debug postfix for MSVC builds (avoids modifying CMAKE_DEBUG_POSTFIX globally). if(MSVC) set_target_properties(testcms PROPERTIES DEBUG_POSTFIX "d") endif() # Copy ICC fixtures into the build testbed dir (mirrors autotools make check behavior). set(_icc_files "${PROJECT_SOURCE_DIR}/testbed/test1.icc" "${PROJECT_SOURCE_DIR}/testbed/test2.icc" "${PROJECT_SOURCE_DIR}/testbed/test3.icc" "${PROJECT_SOURCE_DIR}/testbed/test4.icc" "${PROJECT_SOURCE_DIR}/testbed/test5.icc" "${PROJECT_SOURCE_DIR}/testbed/ibm-t61.icc" "${PROJECT_SOURCE_DIR}/testbed/crayons.icc" "${PROJECT_SOURCE_DIR}/testbed/bad.icc" "${PROJECT_SOURCE_DIR}/testbed/bad_mpe.icc" "${PROJECT_SOURCE_DIR}/testbed/toosmall.icc" ) set(_icc_outputs "") foreach(_f IN LISTS _icc_files) get_filename_component(_name "${_f}" NAME) set(_out "${_testbed_bin_dir}/${_name}") list(APPEND _icc_outputs "${_out}") add_custom_command( OUTPUT "${_out}" COMMAND "${CMAKE_COMMAND}" -E make_directory "${_testbed_bin_dir}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${_f}" "${_out}" DEPENDS "${_f}" VERBATIM ) endforeach() add_custom_target(lcms2_test_fixtures ALL DEPENDS ${_icc_outputs}) add_dependencies(testcms lcms2_test_fixtures) add_test(NAME lcms2.testcms COMMAND "${_testbed_bin_dir}/testcms") set_tests_properties(lcms2.testcms PROPERTIES WORKING_DIRECTORY "${_testbed_bin_dir}") endfunction() lcms2-2.19.1/cmake/lcms2-config.cmake.in0000644000175000017500000000011115176573557016626 0ustar martimarti@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/lcms2-targets.cmake") lcms2-2.19.1/cmake/Lcms2Plugins.cmake0000644000175000017500000000664715176573557016304 0ustar martimartiinclude(GNUInstallDirs) function(_lcms2_add_plugin lib_name) set(options) set(oneValueArgs) set(multiValueArgs SOURCES INCLUDE_DIRS) cmake_parse_arguments(PLUG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(LCMS2_BUILD_SHARED) add_library(${lib_name} SHARED ${PLUG_SOURCES}) else() add_library(${lib_name} STATIC ${PLUG_SOURCES}) endif() target_include_directories(${lib_name} PRIVATE "${PROJECT_SOURCE_DIR}/include" ${PLUG_INCLUDE_DIRS} ) if(DEFINED LCMS2_LIBRARY_TARGET) target_link_libraries(${lib_name} PRIVATE "${LCMS2_LIBRARY_TARGET}") endif() if(WIN32) # Ensure plugin entrypoints using CMSEXPORT are exported from the DLL. target_compile_definitions(${lib_name} PRIVATE CMS_DLL_BUILD) endif() set_target_properties(${lib_name} PROPERTIES VERSION "${PROJECT_VERSION}.0" SOVERSION "2" ) set(_lcms2_plugin_targets "${LCMS2_PLUGIN_TARGETS}") list(APPEND _lcms2_plugin_targets "${lib_name}") set(LCMS2_PLUGIN_TARGETS "${_lcms2_plugin_targets}" PARENT_SCOPE) endfunction() function(lcms2_add_plugins) include(CMakeParseArguments) # Populated by _lcms2_add_plugin() via PARENT_SCOPE into this function scope. set(LCMS2_PLUGIN_TARGETS "") if(LCMS2_WITH_FASTFLOAT) _lcms2_add_plugin(lcms2_fast_float SOURCES "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_curves.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_matsh_sse.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_matsh.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_tethra.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_16_tethra.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_15bits.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_15mats.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_cmyk.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_curves.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_matsh.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_separate.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_sup.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_tethra.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_lab.c" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_internal.h" INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/plugins/fast_float/include" "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/../include" ) if(LCMS2_DEFINE_CMS_DONT_USE_SSE2) target_compile_definitions(lcms2_fast_float PRIVATE CMS_DONT_USE_SSE2=1) endif() endif() if(LCMS2_WITH_THREADED_PLUGIN) _lcms2_add_plugin(lcms2_threaded SOURCES "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_split.c" "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_core.c" "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_main.c" "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_scheduler.c" "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_internal.h" INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/plugins/threaded/include" "${PROJECT_SOURCE_DIR}/plugins/threaded/src/../include" ) endif() # Propagate plugin target list to the root scope so packaging (install + pc) can see it. set(LCMS2_PLUGIN_TARGETS "${LCMS2_PLUGIN_TARGETS}" PARENT_SCOPE) endfunction() lcms2-2.19.1/cmake/Lcms2Library.cmake0000644000175000017500000001241215176573557016252 0ustar martimartiinclude(GNUInstallDirs) function(_lcms2_collect_sources out_var) set(_src "${PROJECT_SOURCE_DIR}/src/cmsalpha.c" "${PROJECT_SOURCE_DIR}/src/cmscam02.c" "${PROJECT_SOURCE_DIR}/src/cmscgats.c" "${PROJECT_SOURCE_DIR}/src/cmscnvrt.c" "${PROJECT_SOURCE_DIR}/src/cmserr.c" "${PROJECT_SOURCE_DIR}/src/cmsgamma.c" "${PROJECT_SOURCE_DIR}/src/cmsgmt.c" "${PROJECT_SOURCE_DIR}/src/cmsintrp.c" "${PROJECT_SOURCE_DIR}/src/cmsio0.c" "${PROJECT_SOURCE_DIR}/src/cmsio1.c" "${PROJECT_SOURCE_DIR}/src/cmslut.c" "${PROJECT_SOURCE_DIR}/src/cmsplugin.c" "${PROJECT_SOURCE_DIR}/src/cmssm.c" "${PROJECT_SOURCE_DIR}/src/cmsmd5.c" "${PROJECT_SOURCE_DIR}/src/cmsmtrx.c" "${PROJECT_SOURCE_DIR}/src/cmspack.c" "${PROJECT_SOURCE_DIR}/src/cmspcs.c" "${PROJECT_SOURCE_DIR}/src/cmswtpnt.c" "${PROJECT_SOURCE_DIR}/src/cmsxform.c" "${PROJECT_SOURCE_DIR}/src/cmssamp.c" "${PROJECT_SOURCE_DIR}/src/cmsnamed.c" "${PROJECT_SOURCE_DIR}/src/cmsvirt.c" "${PROJECT_SOURCE_DIR}/src/cmstypes.c" "${PROJECT_SOURCE_DIR}/src/cmsps2.c" "${PROJECT_SOURCE_DIR}/src/cmsopt.c" "${PROJECT_SOURCE_DIR}/src/cmshalf.c" "${PROJECT_SOURCE_DIR}/src/lcms2_internal.h" ) set(${out_var} "${_src}" PARENT_SCOPE) endfunction() function(_lcms2_apply_common_settings tgt) target_include_directories(${tgt} PUBLIC $ $ ) # Feature defines derived from configure.ac parity. if(LCMS2_DEFINE_HAVE_GMTIME_R) target_compile_definitions(${tgt} PRIVATE HAVE_GMTIME_R=1) endif() if(LCMS2_DEFINE_HAVE_GMTIME_S) target_compile_definitions(${tgt} PRIVATE HAVE_GMTIME_S=1) endif() if(LCMS2_DEFINE_WORDS_BIGENDIAN) target_compile_definitions(${tgt} PRIVATE WORDS_BIGENDIAN=1) endif() if(LCMS2_DEFINE_CMS_DONT_USE_SSE2) target_compile_definitions(${tgt} PRIVATE CMS_DONT_USE_SSE2=1) endif() if(LCMS2_DEFINE_HAVE_FUNC_ATTRIBUTE_VISIBILITY) target_compile_definitions(${tgt} PRIVATE HAVE_FUNC_ATTRIBUTE_VISIBILITY=1) endif() if(LCMS2_USE_FLAG_FVISIBILITY_HIDDEN AND NOT WIN32) target_compile_options(${tgt} PRIVATE "-fvisibility=hidden") endif() # Per-target debug postfix for MSVC builds (avoids modifying CMAKE_DEBUG_POSTFIX globally). if(MSVC) set_target_properties(${tgt} PROPERTIES DEBUG_POSTFIX "d") endif() # libm (primarily needed on Linux). Make it PUBLIC so dependents (tools) # also link it, matching autotools *_DEPLIBS behavior. # Reuse the library path already detected by lcms2_detect_features(). if(LCMS2_MATH_LIB) target_link_libraries(${tgt} PUBLIC "${LCMS2_MATH_LIB}") endif() endfunction() function(_lcms2_apply_thread_settings tgt) # Autotools defines HasTHREADS (0/1) on non-Windows only. On Windows, upstream # VC projects do not define HasTHREADS, leaving Win32 critical-section path. if(WIN32) return() endif() if(NOT LCMS2_WITH_THREADS) target_compile_definitions(${tgt} PRIVATE HasTHREADS=0) return() endif() find_package(Threads) if(Threads_FOUND) target_compile_definitions(${tgt} PRIVATE HasTHREADS=1) if(TARGET Threads::Threads) # PUBLIC so dependents also pick up pthread flags/libs when needed. target_link_libraries(${tgt} PUBLIC Threads::Threads) elseif(CMAKE_THREAD_LIBS_INIT) target_link_libraries(${tgt} PUBLIC "${CMAKE_THREAD_LIBS_INIT}") endif() else() target_compile_definitions(${tgt} PRIVATE HasTHREADS=0) endif() endfunction() function(lcms2_add_library) _lcms2_collect_sources(_lcms2_sources) set(_lcms2_shared_target "") set(_lcms2_static_target "") if(LCMS2_BUILD_SHARED) add_library(lcms2 SHARED ${_lcms2_sources}) set(_lcms2_shared_target lcms2) if(WIN32) target_compile_definitions(lcms2 PRIVATE CMS_DLL_BUILD) target_compile_definitions(lcms2 INTERFACE CMS_DLL) endif() set_target_properties(lcms2 PROPERTIES VERSION "${PROJECT_VERSION}.0" SOVERSION "2" ) _lcms2_apply_common_settings(lcms2) _lcms2_apply_thread_settings(lcms2) endif() if(LCMS2_BUILD_STATIC) if(LCMS2_BUILD_SHARED AND WIN32) add_library(lcms2_static STATIC ${_lcms2_sources}) set(_lcms2_static_target lcms2_static) set_target_properties(lcms2_static PROPERTIES OUTPUT_NAME "lcms2_static") else() if(LCMS2_BUILD_SHARED) add_library(lcms2_static STATIC ${_lcms2_sources}) set(_lcms2_static_target lcms2_static) set_target_properties(lcms2_static PROPERTIES OUTPUT_NAME "lcms2") else() add_library(lcms2 STATIC ${_lcms2_sources}) set(_lcms2_static_target lcms2) endif() endif() set(_static_tgt "${_lcms2_static_target}") set_target_properties(${_static_tgt} PROPERTIES VERSION "${PROJECT_VERSION}.0" SOVERSION "2" ) _lcms2_apply_common_settings(${_static_tgt}) _lcms2_apply_thread_settings(${_static_tgt}) endif() # Expose target names for other modules. if(_lcms2_shared_target) set(LCMS2_LIBRARY_TARGET "${_lcms2_shared_target}" PARENT_SCOPE) else() set(LCMS2_LIBRARY_TARGET "${_lcms2_static_target}" PARENT_SCOPE) endif() if(_lcms2_static_target) set(LCMS2_STATIC_LIBRARY_TARGET "${_lcms2_static_target}" PARENT_SCOPE) endif() endfunction() lcms2-2.19.1/cmake/Lcms2Options.cmake0000644000175000017500000000267515176573557016313 0ustar martimartifunction(lcms2_setup_options) # Core build toggles (explicitly support building both shared and static). option(LCMS2_BUILD_SHARED "Build shared library" ON) option(LCMS2_BUILD_STATIC "Build static library" ON) option(LCMS2_BUILD_TOOLS "Build command-line tools" ON) option(LCMS2_BUILD_TESTS "Build tests (testbed)" ON) # Tool-specific toggles (only meaningful when LCMS2_BUILD_TOOLS=ON). option(LCMS2_BUILD_JPGICC "Build jpgicc tool (requires JPEG)" ON) option(LCMS2_BUILD_TIFICC "Build tificc tool (requires TIFF, optionally ZLIB)" ON) option(LCMS2_BUILD_TIFDIFF "Build tifdiff tool (requires TIFF)" ON) # Dependency toggles (only consulted when the dependent tool is enabled). option(LCMS2_WITH_JPEG "Enable JPEG support for tools (find_package only when needed)" ON) option(LCMS2_WITH_TIFF "Enable TIFF support for tools (find_package only when needed)" ON) option(LCMS2_WITH_ZLIB "Enable ZLIB support for tools (find_package only when needed)" ON) # Threads (POSIX pthreads on non-Windows). option(LCMS2_WITH_THREADS "Enable thread support where applicable" ON) # Plugins (GPL). option(LCMS2_WITH_FASTFLOAT "Build and install fast_float plugin (GPL-3.0)" OFF) option(LCMS2_WITH_THREADED_PLUGIN "Build and install threaded plugin (GPL-3.0)" OFF) if(NOT LCMS2_BUILD_SHARED AND NOT LCMS2_BUILD_STATIC) message(FATAL_ERROR "At least one of LCMS2_BUILD_SHARED or LCMS2_BUILD_STATIC must be ON") endif() endfunction() lcms2-2.19.1/cmake/Lcms2Tools.cmake0000644000175000017500000001266715176573557015762 0ustar martimartiinclude(GNUInstallDirs) include(CMakeParseArguments) function(_lcms2_add_tool exe_name) set(options) set(oneValueArgs) set(multiValueArgs SOURCES) cmake_parse_arguments(TOOL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) add_executable(${exe_name} ${TOOL_SOURCES}) target_include_directories(${exe_name} PRIVATE "${PROJECT_SOURCE_DIR}/include" "${PROJECT_SOURCE_DIR}/utils/common" ) if(DEFINED LCMS2_LIBRARY_TARGET) target_link_libraries(${exe_name} PRIVATE "${LCMS2_LIBRARY_TARGET}") endif() # Per-target debug postfix for MSVC builds (avoids modifying CMAKE_DEBUG_POSTFIX globally). if(MSVC) set_target_properties(${exe_name} PROPERTIES DEBUG_POSTFIX "d") endif() set(_lcms2_tool_targets "${LCMS2_TOOL_TARGETS}") list(APPEND _lcms2_tool_targets "${exe_name}") set(LCMS2_TOOL_TARGETS "${_lcms2_tool_targets}" PARENT_SCOPE) endfunction() function(lcms2_add_tools) if(NOT LCMS2_BUILD_TOOLS) return() endif() # Populated by _lcms2_add_tool() via PARENT_SCOPE into this function scope. set(LCMS2_TOOL_TARGETS "") set(_common_sources "${PROJECT_SOURCE_DIR}/utils/common/xgetopt.c" "${PROJECT_SOURCE_DIR}/utils/common/vprf.c" "${PROJECT_SOURCE_DIR}/utils/common/utils.h" ) # Always-built tools (per autotools). _lcms2_add_tool(transicc SOURCES "${PROJECT_SOURCE_DIR}/utils/transicc/transicc.c" ${_common_sources} ) set_property(TARGET transicc PROPERTY OUTPUT_NAME "transicc") _lcms2_add_tool(linkicc SOURCES "${PROJECT_SOURCE_DIR}/utils/linkicc/linkicc.c" ${_common_sources} ) set_property(TARGET linkicc PROPERTY OUTPUT_NAME "linkicc") _lcms2_add_tool(psicc SOURCES "${PROJECT_SOURCE_DIR}/utils/psicc/psicc.c" ${_common_sources} ) set_property(TARGET psicc PROPERTY OUTPUT_NAME "psicc") # Optional jpgicc (requires JPEG). if(LCMS2_BUILD_JPGICC) if(LCMS2_WITH_JPEG) find_package(JPEG) endif() if(JPEG_FOUND) _lcms2_add_tool(jpgicc SOURCES "${PROJECT_SOURCE_DIR}/utils/jpgicc/jpgicc.c" "${PROJECT_SOURCE_DIR}/utils/jpgicc/iccjpeg.c" ${_common_sources} ) if(TARGET JPEG::JPEG) target_link_libraries(jpgicc PRIVATE JPEG::JPEG) else() # Do not quote list variables: they may contain debug/optimized keywords # on multi-config generators (e.g. Ninja Multi-Config). target_include_directories(jpgicc PRIVATE ${JPEG_INCLUDE_DIRS}) target_link_libraries(jpgicc PRIVATE ${JPEG_LIBRARIES}) endif() else() message(STATUS "JPEG not found or disabled; skipping jpgicc") endif() endif() # Optional tificc (requires TIFF; may also use ZLIB/JPEG if present). if(LCMS2_BUILD_TIFICC) if(LCMS2_WITH_TIFF) find_package(TIFF) endif() if(TIFF_FOUND) _lcms2_add_tool(tificc SOURCES "${PROJECT_SOURCE_DIR}/utils/tificc/tificc.c" ${_common_sources} ) if(TARGET TIFF::TIFF) target_link_libraries(tificc PRIVATE TIFF::TIFF) else() # Do not quote list variables: they may contain debug/optimized keywords. target_include_directories(tificc PRIVATE ${TIFF_INCLUDE_DIR}) target_link_libraries(tificc PRIVATE ${TIFF_LIBRARIES}) endif() if(LCMS2_WITH_ZLIB) find_package(ZLIB) if(ZLIB_FOUND) if(TARGET ZLIB::ZLIB) target_link_libraries(tificc PRIVATE ZLIB::ZLIB) else() target_include_directories(tificc PRIVATE ${ZLIB_INCLUDE_DIRS}) target_link_libraries(tificc PRIVATE ${ZLIB_LIBRARIES}) endif() else() message(STATUS "ZLIB not found or disabled; building tificc without ZLIB") endif() endif() if(LCMS2_WITH_JPEG) find_package(JPEG) if(JPEG_FOUND) if(TARGET JPEG::JPEG) target_link_libraries(tificc PRIVATE JPEG::JPEG) else() target_include_directories(tificc PRIVATE ${JPEG_INCLUDE_DIRS}) target_link_libraries(tificc PRIVATE ${JPEG_LIBRARIES}) endif() endif() endif() else() message(STATUS "TIFF not found or disabled; skipping tificc") endif() endif() # Optional tifdiff (requires TIFF). if(LCMS2_BUILD_TIFDIFF) if(LCMS2_WITH_TIFF) find_package(TIFF) endif() if(TIFF_FOUND) _lcms2_add_tool(tifdiff SOURCES "${PROJECT_SOURCE_DIR}/utils/tificc/tifdiff.c" ${_common_sources} ) if(TARGET TIFF::TIFF) target_link_libraries(tifdiff PRIVATE TIFF::TIFF) else() # Do not quote list variables: they may contain debug/optimized keywords. target_include_directories(tifdiff PRIVATE ${TIFF_INCLUDE_DIR}) target_link_libraries(tifdiff PRIVATE ${TIFF_LIBRARIES}) endif() else() message(STATUS "TIFF not found or disabled; skipping tifdiff") endif() endif() # Manpages (install handled by packaging module). set(_manpages "${PROJECT_SOURCE_DIR}/utils/jpgicc/jpgicc.1" "${PROJECT_SOURCE_DIR}/utils/linkicc/linkicc.1" "${PROJECT_SOURCE_DIR}/utils/psicc/psicc.1" "${PROJECT_SOURCE_DIR}/utils/tificc/tificc.1" "${PROJECT_SOURCE_DIR}/utils/transicc/transicc.1" ) set(LCMS2_TOOL_MANPAGES "${_manpages}" PARENT_SCOPE) # Propagate tool target list to the root scope so packaging can install them. set(LCMS2_TOOL_TARGETS "${LCMS2_TOOL_TARGETS}" PARENT_SCOPE) endfunction() lcms2-2.19.1/meson.build0000644000175000017500000000517115176573557014031 0ustar martimartiproject( 'Little-CMS', 'c', version: '2.19', meson_version: '>=0.52.0', # default_options: ['c_std=c99'] ) version_components = meson.project_version().split('.') library_version = '@0@.0.@1@'.format( version_components.get(0, 0), version_components.get(1, 0), ) version_cfg = configuration_data() version_cfg.set('LCMS2_VERSION_MAJOR', version_components.get(0, 0)) version_cfg.set('LCMS2_VERSION_MINOR', version_components.get(1, 0)) version_cfg.set('LCMS2_VERSION_MICRO', version_components.get(2, 0)) version_cfg.set_quoted('LCMS2_VERSION', meson.project_version()) cc = meson.get_compiler('c') is_visual_studio = cc.get_argument_syntax() == 'msvc' cargs = [] if not is_visual_studio and cc.has_function_attribute('visibility:hidden') cargs += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY=1' endif if host_machine.endian() == 'big' cargs += '-DWORDS_BIGENDIAN=1' endif # Check for threadsafe variants of gmtime # MinGW needs _POSIX_C_SOURCE or _POSIX_THREAD_SAFE_FUNCTIONS defined # to make gmtime_r and pthread_time.h available if host_machine.system() == 'windows' and not is_visual_studio cargs += ['-D_POSIX_C_SOURCE=199503L'] endif if cc.has_header_symbol( 'time.h', 'gmtime_r', args: cargs, ) cargs += '-DHAVE_GMTIME_R=1' elif cc.has_header_symbol('time.h', 'gmtime_s') if cc.links( ''' #include int main() { time_t t; struct tm m; gmtime_s(&m, &t); return 0; } ''', name: 'gmtime_s can be used', ) cargs += '-DHAVE_GMTIME_S=1' endif endif jpeg_dep = dependency('libjpeg', required: get_option('jpeg')) tiff_dep = dependency('libtiff-4', required: get_option('tiff')) if ( not cc.compiles( ''' #include int main() { __m128i n = _mm_set1_epi8(42); } ''', name: 'supports SSE2 intrinsics', ) ) cargs += '-DCMS_DONT_USE_SSE2=1' endif if is_visual_studio m_dep = [] threads_dep = [] deps = [] else m_dep = cc.find_library('m', required: false) threads_dep = dependency('threads') if cc.has_function('pthread_mutex_lock', dependencies: threads_dep) cargs += '-DHasTHREADS=1' else cargs += '-DHasTHREADS=0' endif deps = [m_dep, threads_dep] endif if cc.has_header_symbol('time.h', 'timespec_get') cargs += '-DHAVE_TIMESPEC_GET=1' endif win = import('windows') subdir('include') subdir('src') if get_option('tests').enabled() subdir('testbed') endif if get_option('utils') subdir('utils') endif extra_libraries = [] subdir('plugins') pkg = import('pkgconfig') pkg.generate(liblcms2_lib, description: 'LCMS Color Management Library', libraries: extra_libraries ) lcms2-2.19.1/CMakeLists.txt0000644000175000017500000000110215176573557014415 0ustar martimarticmake_minimum_required(VERSION 3.16...3.29) project(lcms2 VERSION 2.19 LANGUAGES C ) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include(Lcms2Options) include(Lcms2Features) include(Lcms2Library) include(Lcms2Tools) include(Lcms2Plugins) include(Lcms2Tests) include(Lcms2Packaging) lcms2_setup_options() lcms2_detect_features() if(LCMS2_BUILD_TESTS) enable_testing() endif() lcms2_add_library() if(LCMS2_BUILD_TOOLS) lcms2_add_tools() endif() lcms2_add_plugins() if(LCMS2_BUILD_TESTS) lcms2_add_tests() endif() lcms2_setup_packaging() lcms2-2.19.1/SECURITY.md0000644000175000017500000000351315176573557013456 0ustar martimarti# Security Policy ## Supported Versions Security updates are applied only to the latest release. ## Reporting a Vulnerability LittleCMS is located deep in the Linux dependency tree. So, security issues are real and should be addressed. The proposed process is quite simple, if you detect a potential security issue and you are able to create a patch, please send us the patch to analyse. We have an extensive test bed of apps and utilities using lcms, so we can check if all those goes fine. If you don’t want to create a patch and only want to report the vulnerability, that's ok too. And we will be very grateful. Just contact us. **Please avoid public advisories if possible, as doing that, hints how to use the flaw for malicious use**. Please don’t make noise to gain popularity, this can result in bad karma to you. Any CVE without reliable proof will be promptly disputed. Please don’t use untrusted patches from 3rd parties. We had an incident years ago with so called “security experts” trying to add a back door by using a crafted patch. Credits to vulnerability busters will be given on each release After the patch proves to be harmless, I will send to the mailing list a signed mail with the patch attached. That is, you got a patch from upstream that upstream claims to be reasonably tested. I will apply the same checks that I do before a normal release. Please understand that this is a lot of work, and obviously it can fail as well, so the “no guarantee” clause of MIT license applies. If you choose to redistribute such patches, please make sure to include the mail, or at least the MIT license. By including the MIT license you prevent to get in legal trouble. ## Using GitHub security advisory Please contact me instead. Security advisories are immediatly deleted without checking due to high level of SPAM received. lcms2-2.19.1/.gitignore0000644000175000017500000000120415176573557013650 0ustar martimarti.autotools .cproject .project .settings *.o *.Plo *.a *.so.* *.la *.lai *.lo *.Po *.pc *.so *.lib Thumbs.db *.obj *.pdb *.user *.aps *.pch *.vspscc *_i.c *_p.c *.ncb *.suo *.tlb *.tlh *.bak *.cache *.ilk *.log *.exe [Bb]in [Dd]ebug*/ *.sbr obj/ [Rr]elease*/ _ReSharper*/ [Tt]est[Rr]esult* .vs/ #Nuget packages folder packages/ /config.status /utils/common/.dirstamp /testbed/.libs/lt-testcms /testbed/.libs/testcms /testbed/testcms #Xcode libtool Build DerivedData .libs /utils/transicc/transicc /utils/tificc/tificc /utils/psicc/psicc /utils/linkicc/linkicc /utils/jpgicc/jpgicc *.tlog *.ipdb *.iobj *.recipe *.idb *.lastcodeanalysissucceeded lcms2-2.19.1/BUILDING.md0000644000175000017500000000747215176573557013414 0ustar martimarti# Little CMS - Build Instructions This document describes the supported build systems for Little CMS (lcms2), their status, and general guidance for building and installing the library. --- ## Build Systems Overview Little CMS supports three build systems: | Build System | Status | |---|---| | Autotools (autoconf/automake/libtool) | **Fully Supported** | | CMake | **Supported, in active development** | | Meson | **Supported, in testing** | Autotools remains the traditional and well-tested build system for Unix-like platforms. CMake has been added to support native Windows toolchains and environments where Autotools is unavailable or impractical. Meson support is being evaluated. > The addition of CMake does **not** signal an intent to remove Autotools. > Both are supported in parallel. Users are encouraged to report issues with > any of the build systems. --- ## Requirements for All Build Systems A supported build system must satisfy the following requirements: - Build the library and all utilities correctly. - Support installation to alternate prefixes (`--prefix` or equivalent). - Support cross-compilation. - Provide a `make test` equivalent that uses the **just-built** library, not the installed one (RPATH or equivalent care required). - Run correctly on GNU/Linux, macOS, *BSD, and Cygwin/MSYS2 - Install CMake package config files (for use by downstream CMake projects), regardless of which build system was used to build lcms2. - Support creation of distribution tarballs that match the canonical release content (not necessarily identical to the raw GitHub archive). --- ## Building with Autotools **Prerequisites:** `autoconf`, `automake`, `libtool` ./autogen.sh # if building from a git checkout ./configure make make check make install To install to a custom prefix: ./configure --prefix=/your/prefix **Notes:** - Autotools builds are the reference for test coverage and correctness. - Autotools does **not** support native Windows builds in environments without a POSIX shell (e.g. MSVC-only environments). Use CMake in that case. --- ## Building with CMake **Prerequisites:** CMake 3.x or later cmake -S . -B build cmake --build build ctest --test-dir build cmake --install build To install to a custom prefix: cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/your/prefix **Notes:** - CMake is the recommended build system for native Windows (MSVC) builds. - CMake package config files (`lcms2Config.cmake`, etc.) are installed and allow other CMake-based projects to find and link against lcms2. These config files should be available regardless of how lcms2 was built. - Cross-compilation is supported via standard CMake toolchain files. --- ## Building with Meson **Prerequisites:** `meson`, `ninja` meson setup build ninja -C build meson test -C build meson install -C build To install to a custom prefix: meson setup build --prefix=/your/prefix **Notes:** - Meson support is currently in testing. Please report any issues. --- ## Distribution Tarballs > Always prefer the official release tarballs published on the Little CMS > website or SourceForge over raw GitHub archives when packaging for > distributions. --- ## Reporting Build Issues Please report build system issues to the lcms-user mailing list: - **Mailing list:** lcms-user@lists.sourceforge.net - **GitHub Issues:** https://github.com/mm2/Little-CMS/issues When reporting, please include: - The build system used (Autotools / CMake / Meson) and its version. - The operating system and architecture. - Whether you are cross-compiling and, if so, the host/target tuple. - The full error output. --- ## Further Information | | | |---|---| | Website | https://www.littlecms.com | | Repository | https://github.com/mm2/Little-CMS | | Mailing list | lcms-user@lists.sourceforge.net |lcms2-2.19.1/ChangeLog0000644000175000017500000003640615176573557013446 0ustar martimarti----------------------- 2.20 Ongoing ----------------------- ----------------------- 2.19.1 hot fix ----------------------- Fixed sonames generation when using autotools Recovered an undocumented memory write feature lost because a "security" report. Fixed documentation pointers on visual studio project. ----------------------- 2.19 Featured release ----------------------- CMake build system. Thanks to Vlad Erium for the initial implementation and kmilos for improvements. Large files support to use profiles up to 4Gb Black point compensation works on multi-channel profiles Added more test platforms/architectures in GitHub tests, Cygwin and MSYS are now fully checked. jpgicc banner is not shown on normal operation, only when help is requested. Added a way to access internal transform pipelines. For read only. Add a way to retrieve the CMM signature Added extra checks on postscript undocumented functions Added guard on integer overflow when reading .cube files Added unneeded checks as a try to get rid of spam reports about "vulnerabilities" that are not real. Utility program names generated by Visual Studio 2026 are now same as all other platforms. Creating an output profile by cmsTransform2DeviceLink does not propagate correctly the colorant table. Fixed. Added some profile class definitions from iccMAX Deprecated uint16 and uint32 types removed from tifdiff ----------------------- 2.18 Maintenance release ----------------------- Add an extra check for completeness only. Fix a signed integer overflow which could trigger a FPE_INTOVF Fix Microsoft'2 MHC2 private tag Added projects for XCode 26 & Visual Studio 2026 Added documentation for PCS illuminants and chromatic adaptation Check for a possible out-of-bounds in softproofing transforms when using cmsCreateExtendedTransform Fix for a out-of-bound read, issue #522 Add an extra check for out-of-bounds read when misusing a support function avoid divide by zero, special case from spec. notes on CAM02 Fix CGATS parser bug when number has a "+" sign Fix a typo when handling a special case for BPC Fixed a loss of precision when Lab16 is used as input color space on integer transforms Fixes hypotetical corrupted pointer in non-happy path. Cannot happen in real world Fix a theoretical memory leak. Add support of localized descriptions in v2 profiles for MacOS Mark some tables as const Make the param of cmsCreateLab4Profile() to refer to the media white instead of the illuminant fix a warning in unit tests Remove redundant check. Fixes #497 Update autotools fix plugins soname + add oklab to transicc (experimental) meson: ability to disable .so.version libraries Fix black point detection when using darker colorant. testcms2.c: Fix incorrect string comparisons Fix CICp tag size. Fix broken linkicc meson: Bump minimum Meson version to 0.52 for visibility:hidden meson: Disable unused fs import Add a guard against a wrong use of flags Fix for #469 heap buffer overflow on convert_utf16_to_utf32() ----------------------- 2.17 Maintenance release ----------------------- Add fuzzers foundation. Many thanks to Amir Montazery and Open Source Technology Improvement Fund (ostif.org), Google, for funding that. Add ability to disable building tests in meson Fixed gamut warning not working on certain conditions Mac sequoia added to test beds Add the possibility of duplicating a NULL context for cloning defaults. Small cleanup of CGATS parser Change computation of profile ID to follow actual ICC spec (yes, they changed the spec!) Allow to apply color management on memory blocks > 4Gb Get rid of samples on meson compilation Increase coverage of premultiplied alpha. Bug fixing and cosmetical work on sources. ----------------------- 2.16 Featured release ----------------------- New import .CUBE files as RGB devicelinks New Read/Write MHC2 tags for Windows GPU access New Support for UTF8 on multilocalized unicode functions New Support for OkLab color space, built-in and formatter. Improved floating point transforms float -> integer are now honored as float Improved MSYS2, mingw is now supported Improved proferred CMM, platform and creator now survives profile edition. Fixed tificc now can deal with Lab TIFF Fixed code can now be compiled by a C++17 compiler, "register" keyword use detected at compile time. Fixed Reverted postcript creation that corrupted some interpreters. ----------------------- 2.15 Maintenance release ----------------------- New MESON build system, many thanks to amispark and Lovell Fuller for bringing this. Fixed a bug that caused memory corruption on colord cmsReadRawTag can read portions of tags again. Removing this caused colord to segfault when dumping profiles Added more checks based of fuzzer discoveries. MSYS2 can now compile lcms2 Checked on Apple Silicon M1 and M2 Fixed a bug of fastfloat plug-in that affected Krita CMYK color selector ----------------------- 2.14 Featured release ----------------------- lcms2 now implements ICC specification 4.4 New multi-threaded plug-in several fixes to keep fuzzers happy Remove check on DLL when CMS_NO_REGISTER_KEYWORD is used Added more validation against broken profiles Add more help to several tools ----------------------- 2.13.1 Hot fix ----------------------- Fix for pure white going gray in grayscale transforms. ----------------------- 2.13 Featured release ----------------------- Added support for premultiplied alpha tifficc can now handle alpha channels, both unassociated and premultiplied Better documentation CGATS parser can now deal with very long strings Added Projects for Visual Studio 2020 Travis CI discontinued, GitHub actions used instead Added a very preliminar meson build script (thanks to xclaesse) Added ARM64 target to visual studio 2019 (thanks to gaborkertesz-linaro) Added thread safe code to get time Added automatic linear space detection Added cmsGetStageContextID function Added cmsDetectRGBProfileGamma function configure now accepts --without-fastfloat to turn plugin off autogen.sh has now a --distclean toggle to get rid of all autotools generated files Checked to work on STM32 Cortex-A, Cortex-M families Bug & typos fixing (thanks to many reporters and contributors) ----------------------- 2.12 Maintenance release ----------------------- Added new built-in sigmoidal tone curve Added XCode 12 project Added support for multichannel input up to 15 channels Fix LUT8 write matrix Fix version mess on 10/11 Fix tools & samples xgetopt Fix warnings on different function pointers Fix matlab MEX compilation plugin: cleanup and better SSE detection plugin: add lab to any on float plugin: it can now be compiled as C++ recover PDF documentation, but try to keep it under a reasonable size. Prevent a rare but possible out-of-bounds read in postscript generator Remove unused variables ----------------------- 2.11 Maintenance release ----------------------- Fixed __cpuid() on fast float plugin to allow gnu gcc Fixed copy alpha bounds check Fixed data race condition on contexts pool Fixed LUT16 write matrix on multichannel V2 profiles ----------------------- 2.10 Featured release ----------------------- Added a compilation toggle to remove "register" keyword in API. Previously commercial, fast_float plug-in is now released as open source under GPL3 license. MD5 functions are now accessible through plug-in API. Added support for Visual Studio 2019 Bug fixing. ----------------------- 2.9 Maintenance release ----------------------- Several fixes related with security, and therefore not detailed here. C++ compiles now without warnings Added OSX and clang in travis Added a travis-ci test matrix for many compilers and OS. Thanks to Thomas Weber (debian) for this great improvement. testbed can now work with dynamic versions of library Fixed wrong planar formatters regarding linestride interpretation ----------------------- 2.8 Featured release ----------------------- Changed ChangeLog direction Fixed many typos in comments, thanks to Stefan Weil for doing that. Fixed localization bug, added a new test case crayons.icc thanks to Richard Hughes for providing the profile. Fixed a bug in optimizer that made some formats (i.e, bits planar) unavailable Fixed misalignment problems on Alpha. The compiler does not align strings, and accessing begin of string as a uint16 makes code to fail. Added some extra checks to the tools and examples. Fixed a bug that prevented to read luminance tag BIG amount of functionality contributed/Sponsored by Alien Skin Software: TransformStride, copyAlpha, performance plug-ins. Fixes some warnings as well. Added an extra _ to _stdcall to make it more portable Fixed a bug in transicc for named color profiles Fixed several compiler warnings Added support for Visual Studio 2015 Fixed for XCODE project ----------------------- 2.7 Maintenance release ----------------------- Added a version retrieval function Added an option in transicc for working in bounded mode Fixed wrong handling of extra channels in some formatters. Added a project for VS2013 Added license for iccjpeg.c New project for mac Added a global optimization that merges consecutive matrices in pipelines. Fixes loss of precision in some transforms Added a flag to clip negative values in unbounded transforms (only gray, rgb, cmyk) Move unused var suppresor before the `return` statements. Remove dead code. Add missing comma in CGATS parser utils/jpgicc/iccjpeg.c: Fix check if unsigned variable 'total_length'… … Some maintenance fixes Remove unused vcproj files Added a function to retrieve the iohandler of a given profile object Added a safety check on named color lists Fixed a macro clash on SNONE. Fixed a possible segmentation fault in a non-happy path ----------------------- 2.6 Featured release ----------------------- Added pthread dependency. From now lcms supports multithreading Fix for delete tag memory corruption Added directories for tiff, jpeg in configure script New locking plug-in, from Artifex Big revamp on Contexts, from Artifex Fixed memory leaks on error handling Changed endianness detection for PowerPC Added a way to retrieve matrix shaper always, no matter LUT is present Fixed a bug in PCS/Colorspace order when reading V2 Lab devicelinks Fixed some indexing out of bounds in floating point interpolation Fixed a double free in recovering from a previous error in default intent handler. ----------------------- 2.5 Maintenance release ----------------------- Added some checks for non-happy path, mostly failing mallocs Transform2Devicelink now keeps white point when guessing deviceclass is enabled Rendering intent used when creating the transform is now propagated to profile header in cmsTransform2Devicelink. This is because 7.2.15 in spec 4.3 Added a simple project for cppcheck Added support for VS2012 Remove spurious tabs added by git merge of pull request Fixed a bug in parametric curves Added some fixes from XhmikosR Added TIFF Lab16 handling on tifficc More changes from Artifex Added identity curves support for write V2 LUT Added a way to read the profile creator from header Added a reference for Mac MLU tag Fixed devicelink generation for 8 bits Several minor issues found by cppcheck Several improvements in cgats parser. Fixed some bugs on floating point curves. Fixed a bug on big endian platforms not supporting uint64 or long long. Added error descriptions on cmsSmoothToneCurve Added new cmsPlugInTHR() and fixed some race conditions (thanks to Artifex) update black point detection algorithm to reflect ICC changes Fixed some 64 bit warnings on size_t to uint32 conversions Fixed a multithead bug on optimization (StageDEF) RGB profiles using same tone curves for several channels are storing now only one copy of the curve (saves space) User defined parametric curves can now be saved in ICC profiles. -------------------- 2.4 Featured release -------------------- Added a check for maximum input channels Fixed an uninitialized read on PatchLUT Fixed a bug in XYZ floating point PCS added half float variants (ABGR and so) Added formatter resolution after xform optimization plugin Fixed a bug in transicc when clot tables are present Added a conditional compilatio flag for "half" support Fixed a bug on named color profiles. Fixed a typo on tificc and jpgicc names, thanks to Elle Stone for reporting. Added half float support Increased security checks, thanks to Mateusz Jurczyk, from Google. Fixed a bug on IT8 reading of negative numbers. Fixed a bug on ending zero when saving a IT8 to memory Internal stage structs are now accessible through plug-in API Added a new plug-in type Added getPipelineContextID Fixed a bug in pipeline duplication gamma 1.0 can now operate in unbounded mode Exposed internal overview table for tone curves Added a new plug in entry for full transform Added support for transforms on planar data with different stride Added black point detection algorithm from Adobe paper Fixed a bug in black preservation checking Added performance improvements from several contributors, mostly Artifex Fixed uint64 to work in systems without long long native type Fixed a bug in the named color devicelink generation ----------------------- 2.3 Maintenance release ----------------------- Added compatibility with Argyll's CGATS parser Updated to ICC spec 4.3 Adding a memory alignment macro for CGATS parser Fixed a bug on the range of data in transicc, when colorant tag is specified Fixed Absolute colorimetric intent issues Fixed encoding for floating point tags in Lab/XYZ Fixed a 0 byte allocation issue in _cmsCreateSubAllocChunk ----------------------- 2.2 Maintenance release ----------------------- Pascal unit now is supported by Free Pascal Compiler Fixed a bug on ReadRAWtag Added dictionary metatag support Fixed a bug in black preservation and slightly non-monotonic curves Added named color functionality Fixed a bug that made crash black preservation on CMYK2CMYK devicelinks Added functions to retrieve formatters from transforms Profiles with weird curves are not prone to p`relinearization optimization. changed memmove to memcpy in cache for xput improvement Fixed GBD bug (out of bounds memory overwrite) Fixed some potential issues as NULL dereferencing Updated linkicc to 2.1, cleanup Removed pthreads need Fixed severa bugs in absolute colorimetric intent ----------------------- 2.1 Maintenance release ----------------------- Added bound check in floating point interpolation Fixed a bug on curve reversing when source curves have few points Added Duotone support (Bilinear interpolation) Fixed delphi interface linkicc now stores the rendering intent in the profile header Fixed several integer overflow and other integrity checks, thanks to Chris Evans Fixed an issue on curve inversion Fixed memory leaks on when recovering from errors Fixed a bug in psid and profile sequence tags Fixed a bug in device link creation on v4 profiles Fixed a bug in tificc in floating point formats Peliminary Delphi wrapper Fixed some typos in error messages Added cmsTagLinkedTo Fixed VC2010, VC2008 projects Added a check on jpgicc for NULL transforms Added UTILS_UNUSED_PARAMETER for samples Added cmsChangeBufferFormat for backwards compatibility Fixed a bug on Lab + Alpha float formatters, added such predefined formatters as well Fixed a bug on transicc that made profiles with output colorants info to malfunction Fixed a bug that prevented linkicc to work Fixed a bug on V2 CHAD construction, affects absolute colorimetric intent ----------------------- 2.0 Major version bump ----------------------- lcms2-2.19.1/Makefile.am0000644000175000017500000000230515176573557013717 0ustar martimarti# # Top-Level Makefile for building LittleCMS 2 # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7.2 dist-zip foreign ACLOCAL_AMFLAGS = -I m4 PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ USER_PLUGINS = if COND_FASTFLOAT USER_PLUGINS += plugins/fast_float endif if COND_THREADED USER_PLUGINS += plugins/threaded endif # Directories containing Makefiles to 'make' SUBDIRS = src include utils/tificc utils/transicc utils/linkicc utils/jpgicc utils/psicc testbed $(USER_PLUGINS) # Additional files to distribute EXTRA_DIST = AUTHORS COPYING ChangeLog doc Projects include bin Lib INSTALL README.md autogen.sh lcms2.pc.in plugins pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = lcms2.pc # Make sure get rid of VC stuff... clean-local: rm -rf autom4te.cache find Projects -name "*.user" | xargs rm -rf find Projects -name "Release" | xargs rm -rf find Projects -name "Debug" | xargs rm -rf find Projects -name "*.aps" | xargs rm -rf find Projects -name "*.suo" | xargs rm -rf find Projects -name "*.log" | xargs rm -rf find Projects -name "*.sdf" | xargs rm -rf find Projects -name "*.opensdf" | xargs rm -rf find Projects -name "ipch" | xargs rm -rf lcms2-2.19.1/config.guess0000755000175000017500000012637315176573557014217 0ustar martimarti#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-24' # This file 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 . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$set_cc_for_build" SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "$sc_kernel_bits" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "$HP_ARCH" = "" ]; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ "$HP_ARCH" = hppa2.0w ] then eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) if objdump -f /bin/sh | grep -q elf32-x86-64; then echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 else echo "$UNAME_MACHINE"-pc-linux-"$LIBC" fi exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: # eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: lcms2-2.19.1/config.sub0000755000175000017500000010775615176573557013666 0ustar martimarti#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2024-01-01' # This file 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 . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x"$basic_os" != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. obj= case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 fi ;; *) echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 exit 1 ;; esac case $obj in aout* | coff* | elf* | pe*) ;; '') # empty is fine ;; *) echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 exit 1 ;; esac # Here we handle the constraint that a (synthetic) cpu and os are # valid only in combination with each other and nowhere else. case $cpu-$os in # The "javascript-unknown-ghcjs" triple is used by GHC; we # accept it here in order to tolerate that, but reject any # variations. javascript-ghcjs) ;; javascript-* | *-ghcjs) echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os-$obj in linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ | linux-mlibc*- | linux-musl*- | linux-newlib*- \ | linux-relibc*- | linux-uclibc*- ) ;; uclinux-uclibc*- ) ;; managarm-mlibc*- | managarm-kernel*- ) ;; windows*-msvc*-) ;; -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; -kernel*- ) echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 exit 1 ;; *-kernel*- ) echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 exit 1 ;; *-msvc*- ) echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 exit 1 ;; kfreebsd*-gnu*- | kopensolaris*-gnu*-) ;; vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; nto-qnx*-) ;; os2-emx-) ;; *-eabi*- | *-gnueabi*-) ;; none--*) # None (no kernel, i.e. freestanding / bare metal), # can be paired with an machine code file format ;; -*-) # Blank kernel with real OS is always fine. ;; --*) # Blank kernel and OS with real machine code file format is always fine. ;; *-*-*) echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: lcms2-2.19.1/configure.ac0000644000175000017500000003021615176573557014153 0ustar martimarti# # LittleCMS 2 configure script # AC_PREREQ(2.60) # # Set the package name and version # AC_INIT(lcms2,2.19) # Specify directory where m4 macros may be found. AC_CONFIG_MACRO_DIR([m4]) # # Libtool library revision control info # LIBRARY_CURRENT=2 LIBRARY_REVISION=19 LIBRARY_AGE=0 AC_SUBST(LIBRARY_CURRENT)dnl AC_SUBST(LIBRARY_REVISION)dnl AC_SUBST(LIBRARY_AGE)dnl # Obtain system type by running config.guess AC_CANONICAL_HOST AM_INIT_AUTOMAKE([foreign 1.9 tar-ustar no-define dist-zip subdir-objects]) # Check for programs AC_PROG_CC AC_PROG_CPP AC_PROG_CXX LT_INIT #AM_PROG_LD #AC_SUBST(LD) #AC_PROG_INSTALL #AC_PROG_MAKE_SET #AC_PROG_LN_S # # Tests for Windows # AC_EXEEXT AC_OBJEXT # Configure libtool AC_ENABLE_SHARED AC_ENABLE_STATIC AC_LIBTOOL_WIN32_DLL AC_LIBTOOL_SETUP AC_PROG_LIBTOOL AC_SUBST(LIBTOOL_DEPS) LIB_PLUGINS='' # Add configure option --enable-maintainer-mode which enables dependency # checking and generation useful to package maintainers. This is made an # option to avoid confusing end users. AM_MAINTAINER_MODE # If the C compiler supports the keyword inline, do nothing. Otherwise # define inline to __inline__ or __inline if it accepts one of those, # otherwise define inline to be empty. AC_C_INLINE AC_SUBST(inline) # Check if the C compiler supports the "visibility" function attribute # If supported, defines HAVE_FUNC_ATTRIBUTE_VISIBILITY AX_GCC_FUNC_ATTRIBUTE(visibility) # Check if the compiler supports "-fvisibility=hidden" and if yes, add it to CFLAGS # This means that symbols that are not marked explicitly for export (CMSAPI) # will not be reachable in the shared library. AX_APPEND_COMPILE_FLAGS(["-fvisibility=hidden"]) # If words are stored with the most significant byte first (like # Motorola and SPARC CPUs), define `WORDS_BIGENDIAN'. AC_C_BIGENDIAN # Check for threadsafe variants of gmtime # Note: check for gmtime_s is a bit more complex as it is implemented as a macro AC_CHECK_FUNCS(gmtime_r, [], [ AC_MSG_CHECKING([for gmtime_s]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include ]], [[ time_t t; struct tm m; gmtime_s(&m, &t); return 0; ]])], [AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_GMTIME_S], [1], [gmtime_s can be used])], [AC_MSG_RESULT([no])] )]) # Point to JPEG installed in DIR or disable JPEG with --without-jpeg. AC_ARG_WITH(jpeg, AS_HELP_STRING([--with-jpeg=DIR],[use jpeg installed in DIR]), [ if [ test "x$withval" = "xno" ]; then [with_jpeg='no'] else if [ test "x$withval" != "xyes" ]; then with_jpeg=$withval JPEG_DIR=$withval CPPFLAGS="$CPPFLAGS -I$JPEG_DIR/include" LDFLAGS="$LDFLAGS -L$JPEG_DIR/lib" fi [with_jpeg='yes'] fi ], [with_jpeg='yes']) # Point to TIFF installed in DIR or disable TIFF with --without-tiff. AC_ARG_WITH(tiff, AS_HELP_STRING([--with-tiff=DIR], [use tiff installed in DIR]), [ if [ test "x$withval" = "xno" ]; then [with_tiff='no'] else if [ test "x$withval" != "xyes" ]; then with_tiff=$withval TIFF_DIR=$withval CPPFLAGS="$CPPFLAGS -I$TIFF_DIR/include" LDFLAGS="$LDFLAGS -L$TIFF_DIR/lib" fi [with_tiff='yes'] fi ], [with_tiff='yes']) # Disable ZLIB AC_ARG_WITH(zlib, [ --without-zlib disable ZLIB support], [with_zlib=$withval], [with_zlib='yes']) #fast_float plugin: AC_ARG_WITH(fastfloat, AS_HELP_STRING([--with-fastfloat], [build and install fast_float plugin, use only if GPL 3.0 is acceptable]), [ with_fastfloat=$withval ], [ with_fastfloat='no' ]) if test "x$with_fastfloat" = "xyes" then LIB_PLUGINS="$LIB_PLUGINS -llcms2_fast_float" fi #multi threaded plugin: AC_ARG_WITH(threaded, AS_HELP_STRING([--with-threaded], [build and install multi threaded plugin, use only if GPL 3.0 is acceptable]), [ with_threaded=$withval ], [ with_threaded='no' ]) if test "x$with_threaded" = "xyes" then LIB_PLUGINS="$LIB_PLUGINS -llcms2_threaded" fi # # Determine POSIX threads settings # # Enable support for POSIX thread APIs AC_ARG_WITH(threads, AS_HELP_STRING([--without-pthreads], [disable POSIX pthreads API support]), [with_threads=$withval], [with_threads='yes']) have_threads=no if test "$with_threads" != 'no' then AX_PTHREAD() if test "$ax_pthread_ok" = yes then have_threads=yes DEF_THREAD="$PTHREAD_CFLAGS" CFLAGS="$CFLAGS $DEF_THREAD" CXXFLAGS="$CXXFLAGS $DEF_THREAD" if test "$CC" != "$PTHREAD_CC" then AC_MSG_WARN([Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads.]) CC="$PTHREAD_CC" fi if test "$CXX" != "$PTHREAD_CXX" then AC_MSG_WARN([Replacing compiler $CXX with compiler $PTHREAD_CXX to support pthreads.]) CXX="$PTHREAD_CXX" fi fi fi # check if compiler supports SSE2 intrinsics AC_LANG_PUSH([C]) AC_MSG_CHECKING([whether compiler supports SSE2]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include int main() { __m128i n = _mm_set1_epi8(42); }]])], [ac_compiler_supports_sse2=yes], [ac_compiler_supports_sse2=no]) AC_MSG_RESULT([$ac_compiler_supports_sse2]) AS_IF([test "x$ac_compiler_supports_sse2" != "xyes"], [AC_DEFINE([CMS_DONT_USE_SSE2], [1], [Define if compiler does not support SSE2 intrinsics])]) AC_LANG_POP([C]) # # Find math library # LIB_MATH='' AC_CHECK_LIB(m,sqrt,LIB_MATH="-lm",,) LIBS="$LIB_MATH $LIBS" AC_SUBST(LIB_MATH) # # Find Posix threads library # LIB_THREAD='' if test "$with_threads" != 'no' && test "$have_threads" = 'yes' then for lib in pthread pthreads do if test "x$PTHREAD_LIBS" = "x" ; then AC_CHECK_LIB([$lib],pthread_mutex_lock,[PTHREAD_LIBS=-l$lib],,) fi done LIB_THREAD="$PTHREAD_LIBS" LIBS="$LIBS $LIB_THREAD" AC_DEFINE(HasTHREADS,1,[Define if you have pthreads library]) else AC_DEFINE(HasTHREADS,0,[Define if you don't have pthreads library]) fi AC_SUBST(LIB_THREAD) # # Check for JPEG # have_jpeg='no' LIB_JPEG='' if test ! "$with_jpeg" = 'no' then AC_MSG_CHECKING([for JPEG support]) AC_MSG_RESULT() failed=0; passed=0; AC_CHECK_HEADER(jconfig.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(jerror.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(jmorecfg.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`,[#include ]) AC_CHECK_HEADER(jpeglib.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_LIB(jpeg,jpeg_read_header,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) # Test for compatible JPEG library if test ! "$ac_cv_jpeg_version_ok" = 'yes' ; then AC_CACHE_CHECK(for JPEG library is version 6b or later, ac_cv_jpeg_version_ok, [AC_TRY_COMPILE( #include #include #include , changequote(<<, >>)dnl << #if JPEG_LIB_VERSION < 62 #error IJG JPEG library must be version 6b or newer! #endif return 0; >>, changequote([, ])dnl ac_cv_jpeg_version_ok='yes', ac_cv_jpeg_version_ok='no')]) if test "$ac_cv_jpeg_version_ok" = 'yes' ; then AC_MSG_RESULT(yes) passed=`expr $passed + 1` else AC_MSG_RESULT(no) failed=`expr $failed + 1` fi fi AC_MSG_CHECKING(if JPEG package is complete) if test $passed -gt 0 then if test $failed -gt 0 then AC_MSG_RESULT(no -- some components failed test) have_jpeg='no (failed tests)' else LIB_JPEG='-ljpeg' LIBS="$LIB_JPEG $LIBS" AC_DEFINE(HasJPEG,1,Define if you have JPEG library) AC_MSG_RESULT(yes) have_jpeg='yes' fi else AC_MSG_RESULT(no) fi fi AM_CONDITIONAL(HasJPEG, test "$have_jpeg" = 'yes') AC_SUBST(LIB_JPEG) # # Check for ZLIB # have_zlib='no' dnl TIFF may require zlib so enable zlib check if TIFF is requested if test ! "$with_zlib" = 'no' || test ! "$with_tiff" = 'no' then LIB_ZLIB='' AC_MSG_CHECKING(for ZLIB support ) AC_MSG_RESULT() failed=0; passed=0; AC_CHECK_HEADER(zconf.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(zlib.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_LIB(z,compress,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,uncompress,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,deflate,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,inflate,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,gzseek,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,gztell,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_MSG_CHECKING(if ZLIB package is complete) if test $passed -gt 0 then if test $failed -gt 0 then AC_MSG_RESULT(no -- some components failed test) have_zlib='no (failed tests)' else LIB_ZLIB='-lz' LIBS="$LIB_ZLIB $LIBS" AC_DEFINE(HasZLIB,1,Define if you have zlib compression library) AC_MSG_RESULT(yes) have_zlib='yes' fi else AC_MSG_RESULT(no) fi fi AM_CONDITIONAL(HasZLIB, test "$have_zlib" = 'yes') AC_SUBST(LIB_ZLIB) # # Check for TIFF # have_tiff='no' LIB_TIFF='' if test ! "$with_tiff" = 'no' then AC_MSG_CHECKING([for TIFF support]) AC_MSG_RESULT() failed=0; passed=0; AC_CHECK_HEADER(tiff.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(tiffio.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_LIB(tiff,TIFFOpen,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(tiff,TIFFClientOpen,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(tiff,TIFFIsByteSwapped,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_MSG_CHECKING(if TIFF package is complete) if test $passed -gt 0 then if test $failed -gt 0 then AC_MSG_RESULT(no -- some components failed test) have_tiff='no (failed tests)' else LIB_TIFF='-ltiff' LIBS="$LIB_TIFF $LIBS" AC_DEFINE(HasTIFF,1,Define if you have TIFF library) AC_MSG_RESULT(yes) have_tiff='yes' AC_CHECK_HEADERS(tiffconf.h) fi else AC_MSG_RESULT(no) fi fi AM_CONDITIONAL(HasTIFF, test "$have_tiff" = 'yes') AC_SUBST(LIB_TIFF) # Libraries that the LCMS library depends on LCMS_LIB_DEPLIBS="$LIB_MATH $LIB_THREAD" LCMS_LIB_DEPLIBS=`echo $LCMS_LIB_DEPLIBS | sed -e 's/ */ /g'` AC_SUBST(LCMS_LIB_DEPLIBS) AC_SUBST(LIB_PLUGINS) # Libraries that the jpegicc program depends on JPEGICC_DEPLIBS="$LIB_JPEG $LIB_MATH $LIB_THREAD" JPEGICC_DEPLIBS=`echo $JPEGICC_DEPLIBS | sed -e 's/ */ /g'` AC_SUBST(JPEGICC_DEPLIBS) # Libraries that the tifficc program depends on TIFFICC_DEPLIBS="$LIB_TIFF $LIB_JPEG $LIB_ZLIB $LIB_MATH $LIB_THREAD" TIFFICC_DEPLIBS=`echo $TIFFICC_DEPLIBS | sed -e 's/ */ /g'` AC_SUBST(TIFFICC_DEPLIBS) LIBS='' # # Perform substitutions # AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([lcms2.pc]) AC_CONFIG_FILES([include/Makefile]) AC_CONFIG_FILES([src/Makefile]) AC_CONFIG_FILES([utils/tificc/Makefile]) AC_CONFIG_FILES([utils/transicc/Makefile]) AC_CONFIG_FILES([utils/linkicc/Makefile]) AC_CONFIG_FILES([utils/jpgicc/Makefile]) AC_CONFIG_FILES([utils/psicc/Makefile]) AC_CONFIG_FILES([testbed/Makefile]) AM_CONDITIONAL([COND_FASTFLOAT], [test "x$with_fastfloat" = "xyes" ]) AM_CONDITIONAL([COND_THREADED], [test "x$with_threaded" = "xyes" ]) AC_CONFIG_FILES([plugins/Makefile]) AC_CONFIG_FILES([plugins/fast_float/Makefile]) AC_CONFIG_FILES([plugins/fast_float/src/Makefile]) AC_CONFIG_FILES([plugins/fast_float/include/Makefile]) AC_CONFIG_FILES([plugins/fast_float/testbed/Makefile]) AC_CONFIG_FILES([plugins/threaded/Makefile]) AC_CONFIG_FILES([plugins/threaded/src/Makefile]) AC_CONFIG_FILES([plugins/threaded/include/Makefile]) AC_CONFIG_FILES([plugins/threaded/testbed/Makefile]) AC_OUTPUT lcms2-2.19.1/install-sh0000755000175000017500000003601015176573557013667 0ustar martimarti#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: lcms2-2.19.1/ltmain.sh0000644000175000017500000122264715176574546013520 0ustar martimarti#! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2019-02-19.15 # libtool (GNU libtool) 2.5.4 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 . PROGRAM=libtool PACKAGE=libtool VERSION=2.5.4 package_revision=2.5.4 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # These NLS vars are set unconditionally (bootstrap issue #24). Unset those # in case the environment reset is needed later and the $save_* variant is not # defined (see the code above). LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # func_unset VAR # -------------- # Portably unset VAR. # In some shells, an 'unset VAR' statement leaves a non-zero return # status if VAR is already unset, which might be problematic if the # statement is used at the end of a function (thus poisoning its return # value) or when 'set -e' is active (causing even a spurious abort of # the script in this case). func_unset () { { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } } # Make sure CDPATH doesn't cause `cd` commands to output the target dir. func_unset CDPATH # Make sure ${,E,F}GREP behave sanely. func_unset GREP_OPTIONS ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" # require_check_ifs_backslash # --------------------------- # Check if we can use backslash as IFS='\' separator, and set # $check_ifs_backshlash_broken to ':' or 'false'. require_check_ifs_backslash=func_require_check_ifs_backslash func_require_check_ifs_backslash () { _G_save_IFS=$IFS IFS='\' _G_check_ifs_backshlash='a\\b' for _G_i in $_G_check_ifs_backshlash do case $_G_i in a) check_ifs_backshlash_broken=false ;; '') break ;; *) check_ifs_backshlash_broken=: break ;; esac done IFS=$_G_save_IFS require_check_ifs_backslash=: } ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # usable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1=\$$1\\ \$func_quote_arg_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value returned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list in case some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_portable EVAL ARG # ---------------------------- # Internal function to portably implement func_quote_arg. Note that we still # keep attention to performance here so we as much as possible try to avoid # calling sed binary (so far O(N) complexity as long as func_append is O(1)). func_quote_portable () { $debug_cmd $require_check_ifs_backslash func_quote_portable_result=$2 # one-time-loop (easy break) while true do if $1; then func_quote_portable_result=`$ECHO "$2" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` break fi # Quote for eval. case $func_quote_portable_result in *[\\\`\"\$]*) # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string # contains the shell wildcard characters. case $check_ifs_backshlash_broken$func_quote_portable_result in :*|*[\[\*\?]*) func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ | $SED "$sed_quote_subst"` break ;; esac func_quote_portable_old_IFS=$IFS for _G_char in '\' '`' '"' '$' do # STATE($1) PREV($2) SEPARATOR($3) set start "" "" func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy IFS=$_G_char for _G_part in $func_quote_portable_result do case $1 in quote) func_append func_quote_portable_result "$3$2" set quote "$_G_part" "\\$_G_char" ;; start) set first "" "" func_quote_portable_result= ;; first) set quote "$_G_part" "" ;; esac done done IFS=$func_quote_portable_old_IFS ;; *) ;; esac break done func_quote_portable_unquoted_result=$func_quote_portable_result case $func_quote_portable_result in # double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # many bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_portable_result=\"$func_quote_portable_result\" ;; esac } # func_quotefast_eval ARG # ----------------------- # Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', # but optimized for speed. Result is stored in $func_quotefast_eval. if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then printf -v _GL_test_printf_tilde %q '~' if test '\~' = "$_GL_test_printf_tilde"; then func_quotefast_eval () { printf -v func_quotefast_eval_result %q "$1" } else # Broken older Bash implementations. Make those faster too if possible. func_quotefast_eval () { case $1 in '~'*) func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result ;; *) printf -v func_quotefast_eval_result %q "$1" ;; esac } fi else func_quotefast_eval () { func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result } fi # func_quote_arg MODEs ARG # ------------------------ # Quote one ARG to be evaled later. MODEs argument may contain zero or more # specifiers listed below separated by ',' character. This function returns two # values: # i) func_quote_arg_result # double-quoted (when needed), suitable for a subsequent eval # ii) func_quote_arg_unquoted_result # has all characters that are still active within double # quotes backslashified. Available only if 'unquoted' is specified. # # Available modes: # ---------------- # 'eval' (default) # - escape shell special characters # 'expand' # - the same as 'eval'; but do not quote variable references # 'pretty' # - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might # be used later in func_quote to get output like: 'echo "a b"' instead # of 'echo a\ b'. This is slower than default on some shells. # 'unquoted' # - produce also $func_quote_arg_unquoted_result which does not contain # wrapping double-quotes. # # Examples for 'func_quote_arg pretty,unquoted string': # # string | *_result | *_unquoted_result # ------------+-----------------------+------------------- # " | \" | \" # a b | "a b" | a b # "a b" | "\"a b\"" | \"a b\" # * | "*" | * # z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" # # Examples for 'func_quote_arg pretty,unquoted,expand string': # # string | *_result | *_unquoted_result # --------------+---------------------+-------------------- # z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" func_quote_arg () { _G_quote_expand=false case ,$1, in *,expand,*) _G_quote_expand=: ;; esac case ,$1, in *,pretty,*|*,expand,*|*,unquoted,*) func_quote_portable $_G_quote_expand "$2" func_quote_arg_result=$func_quote_portable_result func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result ;; *) # Faster quote-for-eval for some shells. func_quotefast_eval "$2" func_quote_arg_result=$func_quotefast_eval_result ;; esac } # func_quote MODEs ARGs... # ------------------------ # Quote all ARGs to be evaled later and join them into single command. See # func_quote_arg's description for more info. func_quote () { $debug_cmd _G_func_quote_mode=$1 ; shift func_quote_result= while test 0 -lt $#; do func_quote_arg "$_G_func_quote_mode" "$1" if test -n "$func_quote_result"; then func_append func_quote_result " $func_quote_arg_result" else func_append func_quote_result "$func_quote_arg_result" fi shift done } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_arg pretty,expand "$_G_cmd" eval "func_notquiet $func_quote_arg_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_arg expand,pretty "$_G_cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # # Set a version string for this script. scriptversion=2019-02-19.15; # UTC ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # in the main code. A hook is just a list of function names that can be # run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of hook functions to be called by # FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_propagate_result FUNC_NAME_A FUNC_NAME_B # --------------------------------------------- # If the *_result variable of FUNC_NAME_A _is set_, assign its value to # *_result variable of FUNC_NAME_B. func_propagate_result () { $debug_cmd func_propagate_result_result=: if eval "test \"\${${1}_result+set}\" = set" then eval "${2}_result=\$${1}_result" else func_propagate_result_result=false fi } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do func_unset "${_G_hook}_result" eval $_G_hook '${1+"$@"}' func_propagate_result $_G_hook func_run_hooks if $func_propagate_result_result; then eval set dummy "$func_run_hooks_result"; shift fi done } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list from your hook function. You may remove # or edit any options that you action, and then pass back the remaining # unprocessed options in '_result', escaped # suitably for 'eval'. # # The '_result' variable is automatically unset # before your hook gets called; for best performance, only set the # *_result variable when necessary (i.e. don't call the 'func_quote' # function unnecessarily because it can be an expensive operation on some # machines). # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). Leave # # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@" in case we need it later, # # if $args_changed was set to 'true'. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # # Only call 'func_quote' here if we processed at least one argument. # if $args_changed; then # func_quote eval ${1+"$@"} # my_silent_option_result=$func_quote_result # fi # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd func_run_hooks func_options ${1+"$@"} func_propagate_result func_run_hooks func_options_finish } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_options_quoted=false for my_func in options_prep parse_options validate_options options_finish do func_unset func_${my_func}_result func_unset func_run_hooks_result eval func_$my_func '${1+"$@"}' func_propagate_result func_$my_func func_options if $func_propagate_result_result; then eval set dummy "$func_options_result"; shift _G_options_quoted=: fi done $_G_options_quoted || { # As we (func_options) are top-level options-parser function and # nobody quoted "$@" for us yet, we need to do it explicitly for # caller. func_quote eval ${1+"$@"} func_options_result=$func_quote_result } } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} func_propagate_result func_run_hooks func_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} func_propagate_result func_run_hooks func_parse_options if $func_propagate_result_result; then eval set dummy "$func_parse_options_result"; shift # Even though we may have changed "$@", we passed the "$@" array # down into the hook and it quoted it for us (because we are in # this if-branch). No need to quote it again. _G_parse_options_requote=false fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break # We expect that one of the options parsed in this function matches # and thus we remove _G_opt from "$@" and need to re-quote. _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" >&2 $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_parse_options_requote=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac if $_G_match_parse_options; then _G_parse_options_requote=: fi done if $_G_parse_options_requote; then # save modified positional parameters for caller func_quote eval ${1+"$@"} func_parse_options_result=$func_quote_result fi } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables # after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} if test "x$func_split_equals_lhs" = "x$1"; then func_split_equals_rhs= fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs=" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. # The version message is extracted from the calling file's header # comments, with leading '# ' stripped: # 1. First display the progname and version # 2. Followed by the header comment line matching /^# Written by / # 3. Then a blank line followed by the first following line matching # /^# Copyright / # 4. Immediately followed by any lines between the previous matches, # except lines preceding the intervening completely blank line. # For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /^# Written by /!b s|^# ||; p; n :fwd2blnk /./ { n b fwd2blnk } p; n :holdwrnt s|^# || s|^# *$|| /^Copyright /!{ /./H n b holdwrnt } s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| G s|\(\n\)\n*|\1|g p; q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.5.4' # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd year=`date +%Y` cat < This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Originally written by Gordon Matzigkeit, 1996 (See AUTHORS for complete contributor listing) EOF exit $? } # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information --finish use operation '--mode=finish' --mode=MODE use operation mode MODE --no-finish don't update shared library cache --no-quiet, --no-silent print default informational messages --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --reorder-cache=DIRS reorder shared library cache for preferred DIRS --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname $scriptversion automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_reorder_cache=false opt_preserve_dup_deps=false opt_quiet=false opt_finishing=true opt_warning= nonopt= preserve_args= _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote eval ${1+"$@"} libtool_options_prep_result=$func_quote_result fi } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument '$1' for $_G_opt" exit_cmd=exit ;; esac shift ;; --no-finish) opt_finishing=false func_append preserve_args " $_G_opt" ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --reorder-cache) opt_reorder_cache=true shared_lib_dirs=$1 if test -n "$shared_lib_dirs"; then case $1 in # Must begin with /: /*) ;; # Catch anything else as an error (relative paths) *) func_error "invalid argument '$1' for $_G_opt" func_error "absolute paths are required for $_G_opt" exit_cmd=exit ;; esac fi shift ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote eval ${1+"$@"} libtool_parse_options_result=$func_quote_result fi } func_add_hook func_parse_options libtool_parse_options # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { if $opt_warning; then $debug_cmd $warning_func ${1+"$@"} fi } # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" # Keeping compiler generated duplicates in $postdeps and $predeps is not # harmful, and is necessary in a majority of systems that use it to satisfy # symbol dependencies. opt_duplicate_compiler_generated_deps=: $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote eval ${1+"$@"} libtool_validate_options_result=$func_quote_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, windows, cygwin, or some other w32 environment. Relies on a # correctly configured wine environment available, with the winepath program # in $build's $PATH. Assumes ARG has no leading or trailing path separator # characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep # func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER # Replaces a delimiter for a given path. func_convert_delimited_path () { converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"` } # end func_convert_delimited_path ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_reorder_shared_lib_cache DIRS # Reorder the shared library cache by unconfiguring previous shared library cache # and configuring preferred search directories before previous search directories. # Previous shared library cache: /usr/lib /usr/local/lib # Preferred search directories: /tmp/testing # Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib func_reorder_shared_lib_cache () { $debug_cmd case $host_os in openbsd*) get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` func_convert_delimited_path "$get_search_directories" ':' '\ ' save_search_directories=$converted_path func_convert_delimited_path "$1" ':' '\ ' # Ensure directories exist for dir in $converted_path; do # Ensure each directory is an absolute path case $dir in /*) ;; *) func_error "Directory '$dir' is not an absolute path" exit $EXIT_FAILURE ;; esac # Ensure no trailing slashes func_stripname '' '/' "$dir" dir=$func_stripname_result if test -d "$dir"; then if test -n "$preferred_search_directories"; then preferred_search_directories="$preferred_search_directories $dir" else preferred_search_directories=$dir fi else func_error "Directory '$dir' does not exist" exit $EXIT_FAILURE fi done PATH="$PATH:/sbin" ldconfig -U $save_search_directories PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` func_convert_delimited_path "$get_search_directories" ':' '\ ' reordered_search_directories=$converted_path $ECHO "Original: $save_search_directories" $ECHO "Reordered: $reordered_search_directories" exit $EXIT_SUCCESS ;; *) func_error "--reorder-cache is not supported for host_os=$host_os." exit $EXIT_FAILURE ;; esac } # end func_reorder_shared_lib_cache # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_arg pretty "$libobj" test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_arg pretty "$srcfile" qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG -Xcompiler FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wa,FLAG -Xassembler FLAG pass linker-specific FLAG directly to the assembler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # If option '--reorder-cache', reorder the shared library cache and exit. if $opt_reorder_cache; then func_reorder_shared_lib_cache $shared_lib_dirs fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done if test "false" = "$opt_finishing"; then echo echo "NOTE: finish_cmds were not executed during testing, so you must" echo "manually run ldconfig to add a given test directory, LIBDIR, to" echo "the search path for generated executables." fi echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_arg pretty "$nonopt" install_prog="$func_quote_arg_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_arg pretty "$arg" func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_arg pretty "$arg" func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then func_quote_arg pretty "$arg2" fi func_append install_shared_prog " $func_quote_arg_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_arg pretty "$install_override_mode" func_append install_shared_prog " -m $func_quote_arg_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Strip any trailing slash from the destination. func_stripname '' '/' "$libdir" destlibdir=$func_stripname_result func_stripname '' '/' "$destdir" s_destdir=$func_stripname_result # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw* | *windows*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_arg expand,pretty "$relink_command" eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 case $host in i[3456]86-*-mingw32*) eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" ;; *) eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'" ;; esac } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw/windows # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw/windows-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" func_quote_arg pretty "$ECHO" qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=$qECHO fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw/windows when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #if defined _WIN32 && !defined __GNUC__ # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ _CRTIMP int __cdecl _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw* | windows*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= compile_rpath_tail= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= temp_rpath_tail= thread_safe=no vinfo= vinfo_number=no weak_libs= rpath_arg= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_arg pretty,unquoted "$arg" qarg=$func_quote_arg_unquoted_result func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "argument to -rpath is not absolute: $arg" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xassembler) func_append compiler_flags " -Xassembler $qarg" prev= func_append compile_command " -Xassembler $qarg" func_append finalize_command " -Xassembler $qarg" continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. # -q