fabio-0.1.3/0000755000175000017500000000000012233272207013357 5ustar jeromejerome00000000000000fabio-0.1.3/fabio.egg-info/0000755000175000017500000000000012233272207016131 5ustar jeromejerome00000000000000fabio-0.1.3/fabio.egg-info/SOURCES.txt0000644000175000017500000002654112233272206020024 0ustar jeromejerome00000000000000MANIFEST.in README.txt setup.py stdeb.cfg doc/Makefile doc/make.bat doc/html/.buildinfo doc/html/Changelog.html doc/html/INSTALL.html doc/html/genindex.html doc/html/getting_started.html doc/html/index.html doc/html/objects.inv doc/html/py-modindex.html doc/html/search.html doc/html/searchindex.js doc/html/_modules/index.html doc/html/_modules/fabio/GEimage.html doc/html/_modules/fabio/HiPiCimage.html doc/html/_modules/fabio/OXDimage.html doc/html/_modules/fabio/TiffIO.html doc/html/_modules/fabio/adscimage.html doc/html/_modules/fabio/binaryimage.html doc/html/_modules/fabio/bruker100image.html doc/html/_modules/fabio/brukerimage.html doc/html/_modules/fabio/cbfimage.html doc/html/_modules/fabio/compression.html doc/html/_modules/fabio/converters.html doc/html/_modules/fabio/datIO.html doc/html/_modules/fabio/dm3image.html doc/html/_modules/fabio/edfimage.html doc/html/_modules/fabio/fabioimage.html doc/html/_modules/fabio/fabioutils.html doc/html/_modules/fabio/file_series.html doc/html/_modules/fabio/fit2dmaskimage.html doc/html/_modules/fabio/fit2dspreadsheetimage.html doc/html/_modules/fabio/kcdimage.html doc/html/_modules/fabio/mar345image.html doc/html/_modules/fabio/marccdimage.html doc/html/_modules/fabio/openimage.html doc/html/_modules/fabio/pilatusimage.html doc/html/_modules/fabio/pnmimage.html doc/html/_modules/fabio/readbytestream.html doc/html/_modules/fabio/tifimage.html doc/html/_modules/fabio/xsdimage.html doc/html/_sources/Changelog.txt doc/html/_sources/INSTALL.txt doc/html/_sources/getting_started.txt doc/html/_sources/index.txt doc/html/_sources/api/fabio.txt doc/html/_sources/api/modules.txt doc/html/_static/ajax-loader.gif doc/html/_static/basic.css doc/html/_static/comment-bright.png doc/html/_static/comment-close.png doc/html/_static/comment.png doc/html/_static/default.css doc/html/_static/doctools.js doc/html/_static/down-pressed.png doc/html/_static/down.png doc/html/_static/file.png doc/html/_static/jquery.js doc/html/_static/minus.png doc/html/_static/placeholder doc/html/_static/plus.png doc/html/_static/pygments.css doc/html/_static/searchtools.js doc/html/_static/sidebar.js doc/html/_static/underscore.js doc/html/_static/up-pressed.png doc/html/_static/up.png doc/html/_static/websupport.js doc/html/api/fabio.html doc/html/api/modules.html doc/pdf/FabIO.pdf doc/source/Changelog.rst doc/source/INSTALL.rst doc/source/conf.py doc/source/getting_started.rst doc/source/index.rst doc/source/_static/placeholder doc/source/api/modules.rst epydoc/api-objects.txt epydoc/class-tree.html epydoc/crarr.png epydoc/epydoc.css epydoc/epydoc.js epydoc/fabio-module.html epydoc/fabio-pysrc.html epydoc/fabio.GEimage-module.html epydoc/fabio.GEimage-pysrc.html epydoc/fabio.GEimage.GEimage-class.html epydoc/fabio.GEimage_old-module.html epydoc/fabio.GEimage_old-pysrc.html epydoc/fabio.GEimage_old.GEimage-class.html epydoc/fabio.HiPiCimage-module.html epydoc/fabio.HiPiCimage-pysrc.html epydoc/fabio.HiPiCimage.HiPiCimage-class.html epydoc/fabio.OXDimage-module.html epydoc/fabio.OXDimage-pysrc.html epydoc/fabio.OXDimage.OXDimage-class.html epydoc/fabio.OXDimage.Section-class.html epydoc/fabio.TiffIO-module.html epydoc/fabio.TiffIO-pysrc.html epydoc/fabio.TiffIO.TiffIO-class.html epydoc/fabio.adscimage-module.html epydoc/fabio.adscimage-pysrc.html epydoc/fabio.adscimage.adscimage-class.html epydoc/fabio.binaryimage-module.html epydoc/fabio.binaryimage-pysrc.html epydoc/fabio.binaryimage.binaryimage-class.html epydoc/fabio.bruker100image-module.html epydoc/fabio.bruker100image-pysrc.html epydoc/fabio.bruker100image.bruker100image-class.html epydoc/fabio.brukerimage-module.html epydoc/fabio.brukerimage-pysrc.html epydoc/fabio.brukerimage.brukerimage-class.html epydoc/fabio.byte_offset-module.html epydoc/fabio.cbfimage-module.html epydoc/fabio.cbfimage-pysrc.html epydoc/fabio.cbfimage.CIF-class.html epydoc/fabio.cbfimage.cbfimage-class.html epydoc/fabio.cf_io-module.html epydoc/fabio.compression-module.html epydoc/fabio.compression-pysrc.html epydoc/fabio.converters-module.html epydoc/fabio.converters-pysrc.html epydoc/fabio.datIO-module.html epydoc/fabio.datIO-pysrc.html epydoc/fabio.datIO.columnfile-class.html epydoc/fabio.datIO.fabiodata-class.html epydoc/fabio.dm3image-module.html epydoc/fabio.dm3image-pysrc.html epydoc/fabio.dm3image.dm3image-class.html epydoc/fabio.edfimage-module.html epydoc/fabio.edfimage-pysrc.html epydoc/fabio.edfimage.Frame-class.html epydoc/fabio.edfimage.edfimage-class.html epydoc/fabio.fabioimage-module.html epydoc/fabio.fabioimage-pysrc.html epydoc/fabio.fabioimage.fabioimage-class.html epydoc/fabio.fabioutils-module.html epydoc/fabio.fabioutils-pysrc.html epydoc/fabio.fabioutils.BZ2File-class.html epydoc/fabio.fabioutils.File-class.html epydoc/fabio.fabioutils.FilenameObject-class.html epydoc/fabio.fabioutils.GzipFile-class.html epydoc/fabio.fabioutils.StringIO-class.html epydoc/fabio.fabioutils.UnknownCompressedFile-class.html epydoc/fabio.fabioutils.filename_object-class.html epydoc/fabio.file_series-module.html epydoc/fabio.file_series-pysrc.html epydoc/fabio.file_series.file_series-class.html epydoc/fabio.file_series.filename_series-class.html epydoc/fabio.file_series.numbered_file_series-class.html epydoc/fabio.fit2dmaskimage-module.html epydoc/fabio.fit2dmaskimage-pysrc.html epydoc/fabio.fit2dmaskimage.fit2dmaskimage-class.html epydoc/fabio.fit2dspreadsheetimage-module.html epydoc/fabio.fit2dspreadsheetimage-pysrc.html epydoc/fabio.fit2dspreadsheetimage.fit2dspreadsheetimage-class.html epydoc/fabio.kcdimage-module.html epydoc/fabio.kcdimage-pysrc.html epydoc/fabio.kcdimage.kcdimage-class.html epydoc/fabio.mar345_IO-module.html epydoc/fabio.mar345image-module.html epydoc/fabio.mar345image-pysrc.html epydoc/fabio.mar345image.mar345image-class.html epydoc/fabio.marccdimage-module.html epydoc/fabio.marccdimage-pysrc.html epydoc/fabio.marccdimage.marccdimage-class.html epydoc/fabio.mytest-module.html epydoc/fabio.mytest-pysrc.html epydoc/fabio.openimage-module.html epydoc/fabio.openimage-pysrc.html epydoc/fabio.pdf epydoc/fabio.pilatusimage-module.html epydoc/fabio.pilatusimage-pysrc.html epydoc/fabio.pilatusimage.pilatusimage-class.html epydoc/fabio.pnmimage-module.html epydoc/fabio.pnmimage-pysrc.html epydoc/fabio.pnmimage.pnmimage-class.html epydoc/fabio.readbytestream-module.html epydoc/fabio.readbytestream-pysrc.html epydoc/fabio.tifimage-module.html epydoc/fabio.tifimage-pysrc.html epydoc/fabio.tifimage.Image_File_Directory-class.html epydoc/fabio.tifimage.Image_File_Directory_entry-class.html epydoc/fabio.tifimage.Tiff_header-class.html epydoc/fabio.tifimage.tifimage-class.html epydoc/fabio.xsdimage-module.html epydoc/fabio.xsdimage-pysrc.html epydoc/fabio.xsdimage.xsdimage-class.html epydoc/frames.html epydoc/help.html epydoc/identifier-index.html epydoc/index.html epydoc/module-tree.html epydoc/redirect.html epydoc/str-class.html epydoc/toc-everything.html epydoc/toc-fabio-module.html epydoc/toc-fabio.GEimage-module.html epydoc/toc-fabio.GEimage_old-module.html epydoc/toc-fabio.HiPiCimage-module.html epydoc/toc-fabio.OXDimage-module.html epydoc/toc-fabio.TiffIO-module.html epydoc/toc-fabio.adscimage-module.html epydoc/toc-fabio.binaryimage-module.html epydoc/toc-fabio.bruker100image-module.html epydoc/toc-fabio.brukerimage-module.html epydoc/toc-fabio.byte_offset-module.html epydoc/toc-fabio.cbfimage-module.html epydoc/toc-fabio.cf_io-module.html epydoc/toc-fabio.compression-module.html epydoc/toc-fabio.converters-module.html epydoc/toc-fabio.datIO-module.html epydoc/toc-fabio.dm3image-module.html epydoc/toc-fabio.edfimage-module.html epydoc/toc-fabio.fabioimage-module.html epydoc/toc-fabio.fabioutils-module.html epydoc/toc-fabio.file_series-module.html epydoc/toc-fabio.fit2dmaskimage-module.html epydoc/toc-fabio.fit2dspreadsheetimage-module.html epydoc/toc-fabio.kcdimage-module.html epydoc/toc-fabio.mar345_IO-module.html epydoc/toc-fabio.mar345image-module.html epydoc/toc-fabio.marccdimage-module.html epydoc/toc-fabio.mytest-module.html epydoc/toc-fabio.openimage-module.html epydoc/toc-fabio.pilatusimage-module.html epydoc/toc-fabio.pnmimage-module.html epydoc/toc-fabio.readbytestream-module.html epydoc/toc-fabio.tifimage-module.html epydoc/toc-fabio.xsdimage-module.html epydoc/toc.html fabio-src/GEimage.py fabio-src/GEimage_old.py fabio-src/HiPiCimage.py fabio-src/OXDimage.py fabio-src/TiffIO.py fabio-src/__init__.py fabio-src/adscimage.py fabio-src/binaryimage.py fabio-src/bruker100image.py fabio-src/brukerimage.py fabio-src/cbfimage.py fabio-src/compression.py fabio-src/converters.py fabio-src/datIO.py fabio-src/dm3image.py fabio-src/edfimage.py fabio-src/fabioimage.py fabio-src/fabioutils.py fabio-src/file_series.py fabio-src/fit2dmaskimage.py fabio-src/fit2dspreadsheetimage.py fabio-src/kcdimage.py fabio-src/mar345image.py fabio-src/marccdimage.py fabio-src/openimage.py fabio-src/pilatusimage.py fabio-src/pnmimage.py fabio-src/readbytestream.py fabio-src/templateimage.py fabio-src/tifimage.py fabio-src/xsdimage.py pylint/.pylintrc pylint/GEimage.py.lint pylint/GEimage_old.py.lint pylint/HiPiCimage.py.lint pylint/OXDimage.py.lint pylint/TiffIO.py.lint pylint/__init__.py.lint pylint/adscimage.py.lint pylint/benchheader.py.lint pylint/binaryimage.py.lint pylint/bruker100image.py.lint pylint/brukerimage.py.lint pylint/cbfimage.py.lint pylint/compression.py.lint pylint/converters.py.lint pylint/datIO.py.lint pylint/dm3image.py.lint pylint/edfimage.py.lint pylint/fabian_mar_header.py.lint pylint/fabioimage.py.lint pylint/fabioutils.py.lint pylint/file_series.py.lint pylint/fit2dmaskimage.py.lint pylint/fit2dspreadsheetimage.py.lint pylint/kcdimage.py.lint pylint/lintem.py pylint/mar345image.py.lint pylint/marccdimage.py.lint pylint/oldtifimage.py.lint pylint/openimage.py.lint pylint/pilatusimage.py.lint pylint/pnmimage.py.lint pylint/profile_compressed.py.lint pylint/readbytestream.py.lint pylint/templateimage.py.lint pylint/testGEimage.py.lint pylint/testOXDimage.py.lint pylint/testXSDimage.py.lint pylint/test_all.py.lint pylint/test_all_images.py.lint pylint/test_file_series.py.lint pylint/test_filename_steps.py.lint pylint/test_flat_binary.py.lint pylint/testadscimage.py.lint pylint/testbrukerimage.py.lint pylint/testcbfimage.py.lint pylint/testcompression.py.lint pylint/testedfimage.py.lint pylint/testfabioimage.py.lint pylint/testfilenames.py.lint pylint/testfit2dmaskimage.py.lint pylint/testheadernotsingleton.py.lint pylint/testkcdimage.py.lint pylint/testmar345image.py.lint pylint/testmccdimage.py.lint pylint/testopenheader.py.lint pylint/testopenimage.py.lint pylint/testtifgz.py.lint pylint/testtifimage.py.lint pylint/tifimage.py.lint pylint/utilstest.py.lint pylint/xsdimage.py.lint src/byte_offset.c src/byte_offset.pyx src/ccp4_pack.c src/ccp4_pack.h src/cf_io.pyx src/cf_iomodule.c src/columnfile.c src/columnfile.h src/mar345_IO.c src/mar345_IO.pyx src/stdint.h test/__init__.py test/benchheader.py test/profile_compressed.py test/testGEimage.py test/testOXDimage.py test/testXSDimage.py test/test_all.py test/test_all_images.py test/test_file_series.py test/test_filename_steps.py test/test_flat_binary.py test/testadscimage.py test/testbrukerimage.py test/testcbfimage.py test/testcompression.py test/testedfimage.py test/testfabioimage.py test/testfilenames.py test/testfit2dmaskimage.py test/testheadernotsingleton.py test/testkcdimage.py test/testmar345image.py test/testmccdimage.py test/testopenheader.py test/testopenimage.py test/testtifgz.py test/testtifimage.py test/utilstest.py test/profile/benchheader.py test/profile/profile_compressed.pyfabio-0.1.3/setup.cfg0000644000175000017500000000007312233272207015200 0ustar jeromejerome00000000000000[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 fabio-0.1.3/README.txt0000644000175000017500000001032012126623347015057 0ustar jeromejerome00000000000000FabIO ===== FabIO is an I/O library for images produced by 2D X-ray detectors and written in python. FabIO support images detectors from a dozen of companies (including Mar, Dectris, ADSC, Hamamatsu, Oxford, ...), for a total of 20 different file formats (like CBF, EDF, TIFF, ...) and offers an unified interface to their headers (as a python dictionary) and datasets (as a numpy ndarray of integers or floats) Citation: --------- The general philosophy of the library is described in: FabIO: easy access to two-dimensional X-ray detector images in Python E. B. Knudsen, H. O. Sørensen, J. P. Wright, G. Goret and J. Kieffer Journal of Applied Crystallography, Volume 46, Part 2, pages 537-539. http://dx.doi.org/10.1107/S0021889813000150 Transparent handling of compressed files ---------------------------------------- Fabio is expected to handle gzip and bzip2 compressed files transparently. Following a query about the performance of reading compressed data, some benchmarking details have been collected at fabio_compressed_speed. This means that when your python was configured and built you needed the bzip and gzip modules to be present (eg libbz2-dev package for ubuntu) Using fabio in your own python programs Example: >>> import fabio >>> obj = fabio.edfimage("mydata0000.edf") >>> obj.data.shape (2048, 2048) >>> obj.header["Omega"] 23.5 Design Specifications --------------------- Name: Fabio = Fable Input/Output Idea: ..... Have a base class for all our 2D diffraction greyscale images. This consists of a 2D array (numpy ndarray) and a python dictionary of header information in (string key, string value) pairs. Class fabioimage ................ Needs a name which will not to be confused with an RGB color image. Class attributes: * data -> 2D array * header -> dictionary * rows, columns, dim1, dim2 -> data.shape * header_keys -> header.keys() used to retain the order of the header when writing an image to disk * bytecode -> data.typecode() * m, minval, maxval, stddev -> image statistics, could add others, eg roi[slice] Class methods (functions): .......................... integrate_area() -> return sum(self.data) within slice rebin(fact) -> rebins data, adjusts dims toPIL16() -> returns a PILimage getheader() -> returns self.header resetvals() -> resets the statistics getmean() -> (computes) returns self.m getmin() -> (computes) returns self.minval getmax() -> (computes) returns self.maxval getstddev() -> (computes) returns self.stddev read() -> read image from file [or stream, or shared memory] write() -> write image to file [or stream, or shared memory] readheader() -> read only the header [much faster for scanning files] Each individual file format would then inherit all the functionality of this class and just make new read and write methods. There are also fileseries related methods (next(), previous(), ...) which return a fabioimage instance of the next/previous frame in a fileserie Other feature: * possibility for using on-the-fly external compression - i.e. if files are stored as something as .gz, .bz2 etc could decompress them, using an external compression mechanism (if available). This is present in fabian but requires that images are edfs. Known file formats ------------------ * Bruker o brukerimage o bruker100image o kcdimage: Nonius KappaCCD diffractometer * Mar Research o marccd (fileformat derived from Tiff) o mar345 imaging plate with PCK compression * Dectris o cbfimage (implements a fast byte offset decompression scheme in python/cython) o pilatusimage (fileformat derived from Tiff) * ESRF o edfimage: The ESRF data Format o xsdimage: XML serialized image from EDNA o fit2dmaskimage: Fit2d Mask format o fit2dspreadsheetimage: Fit2d ascii tables (spread-sheet) * ADSC o adscimage * GE detector at APS o GEimage * PNM o pnmimage * Tiff o tifimage * D3M o d3mimage * Hamamatsu o HiPiCimage * Oxford Diffraction Sapphire 3 o OXDimage * Nonius o KappaCCD * Raw Binary without compression Installation ------------ Please see doc/source/INSTALL.rst Changelog --------- Please see doc/source/Changelog.rst fabio-0.1.3/pylint/0000755000175000017500000000000012233272207014676 5ustar jeromejerome00000000000000fabio-0.1.3/pylint/test_all.py.lint0000644000175000017500000001143512233243326020030 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.test_all C: 13,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 14,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 28,0: No exception type(s) specified W: 31,0: Relative import 'utilstest', should be 'test.utilstest' W: 37,0: Relative import 'testfabioimage', should be 'test.testfabioimage' W: 38,0: Relative import 'testedfimage', should be 'test.testedfimage' W: 39,0: Relative import 'testcbfimage', should be 'test.testcbfimage' W: 40,0: Relative import 'testfilenames', should be 'test.testfilenames' W: 41,0: Relative import 'test_file_series', should be 'test.test_file_series' W: 42,0: Relative import 'test_filename_steps', should be 'test.test_filename_steps' W: 44,0: Relative import 'testadscimage', should be 'test.testadscimage' W: 45,0: Relative import 'testfit2dmaskimage', should be 'test.testfit2dmaskimage' W: 46,0: Relative import 'testGEimage', should be 'test.testGEimage' W: 47,0: Relative import 'testheadernotsingleton', should be 'test.testheadernotsingleton' W: 48,0: Relative import 'testmar345image', should be 'test.testmar345image' W: 49,0: Relative import 'testbrukerimage', should be 'test.testbrukerimage' W: 50,0: Relative import 'testmccdimage', should be 'test.testmccdimage' W: 51,0: Relative import 'testopenheader', should be 'test.testopenheader' W: 52,0: Relative import 'testopenimage', should be 'test.testopenimage' W: 53,0: Relative import 'testOXDimage', should be 'test.testOXDimage' W: 54,0: Relative import 'testkcdimage', should be 'test.testkcdimage' W: 55,0: Relative import 'testtifimage', should be 'test.testtifimage' W: 56,0: Relative import 'testXSDimage', should be 'test.testXSDimage' C: 58,0:test_suite_all: Missing docstring C: 59,4:test_suite_all: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 84,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 85,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 34,4: Unused import fabio Report ====== 70 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |6 |NC |NC | +-----------+-------+---------+-----------+ |refactor |0 |NC |NC | +-----------+-------+---------+-----------+ |warning |22 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |W0403 |20 | +-----------+------------+ |C0103 |5 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.00/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |70 |86.42 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |3 |3.70 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |2.47 |NC |NC | +----------+-------+------+---------+-----------+ |empty |6 |7.41 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testOXDimage.py.lint0000644000175000017500000001233612233243321020552 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testOXDimage C: 77,0: Line too long (86/80) C: 81,0: Line too long (81/80) C: 82,0: Line too long (107/80) C: 1,0: Invalid name "testOXDimage" (should match (([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$) C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 26,0: No exception type(s) specified W: 29,0: Relative import 'utilstest', should be 'test.utilstest' C: 41,0:testOXD: Invalid name "testOXD" (should match [A-Z_][a-zA-Z0-9]+$) C: 43,8:testOXD.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 41,0:testOXD: Missing docstring C: 42,4:testOXD.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 49,4:testOXD.tearDown: Invalid name "tearDown" (should match [a-z_][a-z0-9_]{2,30}$) R: 41,0:testOXD: Too many public methods (47/20) C: 84,0:testOXD_same: Invalid name "testOXD_same" (should match [A-Z_][a-zA-Z0-9]+$) C: 86,8:testOXD_same.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 84,0:testOXD_same: Missing docstring C: 85,4:testOXD_same.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 93,8:testOXD_same.test_same: Invalid name "o1" (should match [a-z_][a-z0-9_]{2,30}$) C: 94,8:testOXD_same.test_same: Invalid name "o2" (should match [a-z_][a-z0-9_]{2,30}$) C: 96,12:testOXD_same.test_same: Invalid name "a1" (should match [a-z_][a-z0-9_]{2,30}$) C: 97,12:testOXD_same.test_same: Invalid name "a2" (should match [a-z_][a-z0-9_]{2,30}$) R: 84,0:testOXD_same: Too many public methods (46/20) C:100,0:testOXD_big: Invalid name "testOXD_big" (should match [A-Z_][a-zA-Z0-9]+$) C:103,8:testOXD_big.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C:102,4:testOXD_big.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C:108,4:testOXD_big.test_same: Missing docstring C:110,8:testOXD_big.test_same: Invalid name "df" (should match [a-z_][a-z0-9_]{2,30}$) R:100,0:testOXD_big: Too many public methods (46/20) C:113,0:test_suite_all_OXD: Invalid name "test_suite_all_OXD" (should match [a-z_][a-z0-9_]{2,30}$) C:113,0:test_suite_all_OXD: Missing docstring C:114,4:test_suite_all_OXD: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:122,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:123,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 98 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |29 |NC |NC | +-----------+-------+---------+-----------+ |refactor |3 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |22 | +-----------+------------+ |C0111 |4 | +-----------+------------+ |R0904 |3 | +-----------+------------+ |C0301 |3 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.53/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |99 |83.19 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |9 |7.56 |NC |NC | +----------+-------+------+---------+-----------+ |comment |3 |2.52 |NC |NC | +----------+-------+------+---------+-----------+ |empty |8 |6.72 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |class |3 |NC |NC |33.33 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |8 |NC |NC |87.50 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testfilenames.py.lint0000644000175000017500000000644412126623347021076 0ustar jeromejerome00000000000000************* Module testfilenames W: 28,0: No exception type(s) specified F: 31,0: Unable to import 'utilstest' C: 83,0:testfilenames: Invalid name "testfilenames" (should match [A-Z_][a-zA-Z0-9]+$) E: 89,18:testfilenames.test_many_cases: Module 'fabio' has no 'FilenameObject' member C: 96,4:testfilenames.test_more_cases: Missing docstring C:101,4:testfilenames.test_more_cases_jump: Missing docstring C:107,0:test_suite_all_filenames: Missing docstring Report ====== 49 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |4 |4 |= | +-----------+-------+---------+-----------+ |refactor |0 |0 |= | +-----------+-------+---------+-----------+ |warning |1 |1 |= | +-----------+-------+---------+-----------+ |error |1 |0 |+1.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0111 |3 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |F0401 |1 | +-----------+------------+ |E1101 |1 | +-----------+------------+ |C0103 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.96/10 (previous run: 8.98/10) If you commit now, people should not be making nasty comments about you on c.l.py Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |89 |81.65 |89 |= | +----------+-------+------+---------+-----------+ |docstring |9 |8.26 |9 |= | +----------+-------+------+---------+-----------+ |comment |3 |2.75 |3 |= | +----------+-------+------+---------+-----------+ |empty |8 |7.34 |8 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |3 |= |33.33 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ fabio-0.1.3/pylint/mar345image.py.lint0000644000175000017500000001471612233243316020243 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module mar345image C: 41,0: Line too long (81/80) C: 45,0: Line too long (106/80) C: 98,0: Line too long (85/80) C:149,0: Line too long (86/80) C:169,0: Line too long (90/80) C:182,0: Line too long (83/80) C:196,0: Line too long (128/80) C:197,0: Line too long (104/80) C:200,0: Line too long (82/80) C:203,0: Line too long (134/80) C:206,0: Line too long (82/80) C:210,0: Line too long (130/80) C:214,0: Line too long (127/80) C:217,0: Line too long (82/80) C:220,0: Line too long (82/80) C:223,0: Line too long (82/80) C:226,0: Line too long (82/80) C:229,0: Line too long (82/80) C:233,0: Line too long (85/80) C:234,0: Line too long (151/80) C:238,0: Line too long (85/80) C:239,0: Line too long (153/80) C:242,0: Line too long (82/80) C:245,0: Line too long (82/80) C:249,0: Line too long (121/80) C:252,0: Line too long (82/80) C:255,0: Line too long (82/80) C:260,0: Line too long (156/80) C:264,0: Line too long (125/80) C:268,0: Line too long (125/80) C:273,0: Line too long (103/80) C:274,0: Line too long (182/80) C:279,0: Line too long (157/80) C:282,0: Line too long (82/80) C:285,0: Line too long (82/80) C:289,0: Line too long (134/80) C:292,0: Line too long (82/80) W:120,0: TODO: validate these values against the binaries already read W: 4,0: Redefining built-in '__doc__' C: 1,0: Missing docstring C: 24,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 28,0:mar345image: Too many instance attributes (8/7) C: 28,0:mar345image: Invalid name "mar345image" (should match [A-Z_][a-zA-Z0-9]+$) C: 28,0:mar345image: Missing docstring C: 38,8:mar345image.read: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) W: 44,19:mar345image.read: Catching too general exception Exception C: 66,8:mar345image._readheader: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) C: 67,8:mar345image._readheader: Invalid name "h" (should match [a-z_][a-z0-9_]{2,30}$) C: 70,8:mar345image._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C: 78,12:mar345image._readheader: Invalid name "fs" (should match [a-z_][a-z0-9_]{2,30}$) C: 80,12:mar345image._readheader: Invalid name "fs" (should match [a-z_][a-z0-9_]{2,30}$) C:121,8:mar345image._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C:129,8:mar345image._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C:130,12:mar345image._readheader: Invalid name "m" (should match [a-z_][a-z0-9_]{2,30}$) C:133,12:mar345image._readheader: Invalid name "n" (should match [a-z_][a-z0-9_]{2,30}$) C:148,16:mar345image._readheader: Invalid name "n" (should match [a-z_][a-z0-9_]{2,30}$) R: 61,4:mar345image._readheader: Too many branches (13/12) R: 61,4:mar345image._readheader: Too many statements (57/50) W:166,15:mar345image.write: Catching too general exception Exception R:169,4:mar345image._writeheader: Too many branches (28/12) R:169,4:mar345image._writeheader: Too many statements (123/50) C:300,4:mar345image._high_intensity_pixel_records: Missing docstring C:312,4:mar345image.nb_overflow_pixels: Missing docstring C:316,4:mar345image.checkData: Invalid name "checkData" (should match [a-z_][a-z0-9_]{2,30}$) C:324,12:mar345image.checkData: Invalid name "z" (should match [a-z_][a-z0-9_]{2,30}$) R: 28,0:mar345image: Too many public methods (26/20) W: 22,0: Unused import traceback Report ====== 246 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |56 |18 |+38.00 | +-----------+-------+---------+-----------+ |refactor |6 |3 |+3.00 | +-----------+-------+---------+-----------+ |warning |5 |10 |-5.00 | +-----------+-------+---------+-----------+ |error |0 |4 |-4.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |37 | +-----------+------------+ |C0103 |15 | +-----------+------------+ |C0111 |4 | +-----------+------------+ |W0703 |2 | +-----------+------------+ |R0915 |2 | +-----------+------------+ |R0912 |2 | +-----------+------------+ |W0622 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0511 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.28/10 (previous run: 4.07/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |265 |83.60 |86 |+179.00 | +----------+-------+------+---------+-----------+ |docstring |16 |5.05 |20 |-4.00 | +----------+-------+------+---------+-----------+ |comment |13 |4.10 |12 |+1.00 | +----------+-------+------+---------+-----------+ |empty |23 |7.26 |20 |+3.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (mar345image) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |8 |4 |+4.00 |75.00 |12.50 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/brukerimage.py.lint0000644000175000017500000001476012233243277020527 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module brukerimage C: 21,0: Line too long (86/80) C: 53,0: Line too long (94/80) C: 54,0: Line too long (84/80) C: 55,0: Line too long (123/80) C: 56,0: Line too long (155/80) C: 62,0: Line too long (102/80) C: 70,0: Line too long (87/80) C: 81,0: Line too long (110/80) C: 83,0: Line too long (91/80) C: 84,0: Line too long (88/80) C: 86,0: Line too long (93/80) C: 87,0: Line too long (89/80) C: 90,0: Line too long (100/80) C: 93,0: Line too long (155/80) C: 99,0: Line too long (90/80) C:100,0: Line too long (145/80) C:101,0: Line too long (131/80) C:103,0: Line too long (146/80) C:104,0: Line too long (97/80) C:105,0: Line too long (138/80) C:106,0: Line too long (122/80) C:107,0: Line too long (84/80) C:108,0: Line too long (207/80) C:110,0: Line too long (89/80) C:111,0: Line too long (119/80) C:112,0: Line too long (92/80) C:113,0: Line too long (91/80) C:116,0: Line too long (84/80) C:117,0: Line too long (98/80) C:118,0: Line too long (99/80) C:119,0: Line too long (145/80) C:121,0: Line too long (158/80) C:122,0: Line too long (118/80) C:123,0: Line too long (93/80) C:124,0: Line too long (91/80) C:126,0: Line too long (81/80) C:128,0: Line too long (88/80) C:129,0: Line too long (90/80) C:131,0: Line too long (201/80) C:132,0: Line too long (87/80) C:133,0: Line too long (84/80) C:134,0: Line too long (88/80) C:135,0: Line too long (90/80) C:136,0: Line too long (93/80) C:137,0: Line too long (139/80) C:139,0: Line too long (108/80) C:178,0: Line too long (99/80) C:216,0: Line too long (101/80) C:239,0: Line too long (117/80) C:246,0: Line too long (137/80) C:269,0: Line too long (121/80) C:280,0: Line too long (87/80) C:339,0: Line too long (86/80) C:355,0: Line too long (103/80) C:356,0: Line too long (92/80) C:367,0: Line too long (102/80) W: 41,0: TODO: int32 -> float32 conversion according to the "linear" keyword. W:245,0: TODO: check that the formula is OK, not reverted. W: 35,4: Redefining built-in 'bytes' W: 6,0: Redefining built-in '__doc__' C: 1,0: Missing docstring C: 30,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 35,4: Invalid name "bytes" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 37,0:brukerimage: Too many instance attributes (8/7) C: 37,0:brukerimage: Invalid name "brukerimage" (should match [A-Z_][a-zA-Z0-9]+$) R:193,4:brukerimage.read: Too many local variables (17/15) E:238,19:brukerimage.read: Undefined variable 'Except' W:226,16:brukerimage.read: Unused variable 'i' E:268,23:brukerimage.write: Undefined variable 'Except' W:341,44:brukerimage.gen_header: Using possibly undefined loop variable 'i' C:343,20:brukerimage.gen_header: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) E:343,24:brukerimage.gen_header: Too many arguments for format string R:318,4:brukerimage.gen_header: Too many branches (13/12) R: 37,0:brukerimage: Too many public methods (29/20) W:402,4:test: Redefining name 'sys' from outer scope (line 27) W:402,4:test: Redefining name 'time' from outer scope (line 29) W:402,4:test: Reimport 'sys' (imported line 27) W:402,4:test: Reimport 'time' (imported line 29) W:407,8:test: Unused variable 'res' Report ====== 215 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |61 |2 |+59.00 | +-----------+-------+---------+-----------+ |refactor |4 |0 |+4.00 | +-----------+-------+---------+-----------+ |warning |11 |10 |+1.00 | +-----------+-------+---------+-----------+ |error |3 |16 |-13.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |56 | +-----------+------------+ |C0103 |4 | +-----------+------------+ |W0622 |2 | +-----------+------------+ |W0621 |2 | +-----------+------------+ |W0612 |2 | +-----------+------------+ |W0511 |2 | +-----------+------------+ |W0404 |2 | +-----------+------------+ |E0602 |2 | +-----------+------------+ |W0631 |1 | +-----------+------------+ |R0914 |1 | +-----------+------------+ |R0912 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |E1305 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.77/10 (previous run: 1.15/10) Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |244 |59.95 |113 |+131.00 | +----------+-------+------+---------+-----------+ |docstring |124 |30.47 |37 |+87.00 | +----------+-------+------+---------+-----------+ |comment |6 |1.47 |6 |= | +----------+-------+------+---------+-----------+ |empty |33 |8.11 |33 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (brukerimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |8 |4 |+4.00 |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testcbfimage.py.lint0000644000175000017500000001222612233243332020652 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testcbfimage C: 44,0: Line too long (91/80) C: 69,0: Line too long (122/80) C: 79,0: Line too long (82/80) C: 84,0: Line too long (103/80) C: 91,0: Line too long (98/80) C:102,0: Line too long (87/80) C:109,0: Line too long (90/80) C:116,0: Line too long (89/80) C:127,0: Line too long (82/80) C:132,0: Line too long (149/80) C:143,0: Line too long (82/80) C:148,0: Line too long (149/80) C:158,0: Line too long (82/80) C:163,0: Line too long (149/80) C: 12,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 13,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 27,0: No exception type(s) specified W: 30,0: Relative import 'utilstest', should be 'test.utilstest' C: 38,0:test_cbfimage_reader: Invalid name "test_cbfimage_reader" (should match [A-Z_][a-zA-Z0-9]+$) C: 41,4:test_cbfimage_reader.__init__: Invalid name "methodName" (should match [a-z_][a-z0-9_]{2,30}$) C: 41,23:test_cbfimage_reader.__init__: Invalid name "methodName" (should match [a-z_][a-z0-9_]{2,30}$) C: 49,4:test_cbfimage_reader.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 55,4:test_cbfimage_reader.tearDown: Invalid name "tearDown" (should match [a-z_][a-z0-9_]{2,30}$) C: 90,8:test_cbfimage_reader.test_byte_offset: Invalid name "startPos" (should match [a-z_][a-z0-9_]{2,30}$) C: 92,8:test_cbfimage_reader.test_byte_offset: Invalid name "startTime" (should match [a-z_][a-z0-9_]{2,30}$) C: 93,8:test_cbfimage_reader.test_byte_offset: Invalid name "numpyRes" (should match [a-z_][a-z0-9_]{2,30}$) C: 94,8:test_cbfimage_reader.test_byte_offset: Invalid name "tNumpy" (should match [a-z_][a-z0-9_]{2,30}$) C:111,8:test_cbfimage_reader.test_byte_offset: Invalid name "startTime" (should match [a-z_][a-z0-9_]{2,30}$) C:112,8:test_cbfimage_reader.test_byte_offset: Invalid name "cythonRes" (should match [a-z_][a-z0-9_]{2,30}$) C:113,8:test_cbfimage_reader.test_byte_offset: Invalid name "tCython" (should match [a-z_][a-z0-9_]{2,30}$) R: 38,0:test_cbfimage_reader: Too many public methods (51/20) C:166,0:test_suite_all_cbf: Missing docstring C:167,4:test_suite_all_cbf: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:179,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:180,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 122 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |32 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |17 | +-----------+------------+ |C0301 |14 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.13/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |122 |72.62 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |22 |13.10 |NC |NC | +----------+-------+------+---------+-----------+ |comment |15 |8.93 |NC |NC | +----------+-------+------+---------+-----------+ |empty |9 |5.36 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |9 |NC |NC |100.00 |22.22 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/datIO.py.lint0000644000175000017500000000675512120434325017226 0ustar jeromejerome00000000000000************* Module datIO C: 1,0: Invalid name "datIO" (should match (([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$) C: 14,0:fabiodata: Invalid name "fabiodata" (should match [A-Z_][a-zA-Z0-9]+$) W: 36,31:fabiodata.read: Unused argument 'frame' W: 36,19:fabiodata.read: Unused argument 'fname' R: 36,4:fabiodata.read: Method could be a function R: 14,0:fabiodata: Too few public methods (1/2) C: 45,0:columnfile: Invalid name "columnfile" (should match [A-Z_][a-zA-Z0-9]+$) W: 47,4:columnfile.read: Signature differs from overridden method F: 48,8:columnfile.read: Unable to import 'cf_io' R: 45,0:columnfile: Too few public methods (1/2) Report ====== 27 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |3 |3 |= | +-----------+-------+---------+-----------+ |refactor |3 |3 |= | +-----------+-------+---------+-----------+ |warning |3 |3 |= | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |3 | +-----------+------------+ |W0613 |2 | +-----------+------------+ |R0903 |2 | +-----------+------------+ |W0222 |1 | +-----------+------------+ |R0201 |1 | +-----------+------------+ |F0401 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.67/10 (previous run: 6.67/10) This is okay-ish, but I'm sure you can do better. Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |27 |43.55 |27 |= | +----------+-------+------+---------+-----------+ |docstring |23 |37.10 |23 |= | +----------+-------+------+---------+-----------+ |comment |3 |4.84 |3 |= | +----------+-------+------+---------+-----------+ |empty |9 |14.52 |9 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |2 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |3 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ fabio-0.1.3/pylint/tifimage.py.lint0000644000175000017500000001376512233243274020020 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module tifimage C: 5,0: Line too long (84/80) C: 48,0: Line too long (167/80) C:108,0: Line too long (112/80) C:131,0: Line too long (98/80) C:139,0: Line too long (120/80) C:155,0: Line too long (112/80) C:156,0: Line too long (101/80) C:157,0: Line too long (106/80) C:160,0: Line too long (100/80) C:176,0: Line too long (100/80) C:216,0: Line too long (85/80) C:226,0: Line too long (89/80) C:248,0: Line too long (94/80) C:273,0: Line too long (88/80) C:276,0: Line too long (84/80) C:281,0: Line too long (84/80) C:287,0: Line too long (84/80) C:289,0: Line too long (170/80) C: 28,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 33,4: Invalid name "Image" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 52,0: Invalid name "baseline_tiff_tags" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 80,0:tifimage: Too many instance attributes (9/7) C: 80,0:tifimage: Invalid name "tifimage" (should match [A-Z_][a-zA-Z0-9]+$) W:130,15:tifimage.read: Catching too general exception Exception C:125,12:tifimage.read: Invalid name "tiffIO" (should match [a-z_][a-z0-9_]{2,30}$) W:147,23:tifimage.read: Catching too general exception Exception R:116,4:tifimage.read: Too many branches (13/12) W:136,38:tifimage.read: Unused variable 'ncol' C:175,8:tifimage.write: Invalid name "tiffIO" (should match [a-z_][a-z0-9_]{2,30}$) R: 80,0:tifimage: Too many public methods (25/20) C:181,0:Tiff_header: Invalid name "Tiff_header" (should match [A-Z_][a-zA-Z0-9]+$) C:181,0:Tiff_header: Missing docstring R:181,0:Tiff_header: Too few public methods (0/2) C:205,0:Image_File_Directory: Invalid name "Image_File_Directory" (should match [A-Z_][a-zA-Z0-9]+$) C:205,0:Image_File_Directory: Missing docstring W:206,23:Image_File_Directory.__init__: Unused argument 'instring' C:211,4:Image_File_Directory.unpack: Missing docstring C:212,27:Image_File_Directory.unpack: More than one statement on a single line C:214,8:Image_File_Directory.unpack: Invalid name "strInput" (should match [a-z_][a-z0-9_]{2,30}$) C:218,12:Image_File_Directory.unpack: Invalid name "e" (should match [a-z_][a-z0-9_]{2,30}$) C:222,16:Image_File_Directory.unpack: Invalid name "e" (should match [a-z_][a-z0-9_]{2,30}$) R:205,0:Image_File_Directory: Too few public methods (1/2) C:229,0:Image_File_Directory_entry: Invalid name "Image_File_Directory_entry" (should match [A-Z_][a-zA-Z0-9]+$) C:229,0:Image_File_Directory_entry: Missing docstring C:237,4:Image_File_Directory_entry.unpack: Invalid name "strInput" (should match [a-z_][a-z0-9_]{2,30}$) C:237,4:Image_File_Directory_entry.unpack: Missing docstring C:237,21:Image_File_Directory_entry.unpack: Invalid name "strInput" (should match [a-z_][a-z0-9_]{2,30}$) C:258,4:Image_File_Directory_entry.extract_data: Missing docstring R:258,4:Image_File_Directory_entry.extract_data: Too many branches (15/12) Report ====== 168 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |39 |35 |+4.00 | +-----------+-------+---------+-----------+ |refactor |6 |4 |+2.00 | +-----------+-------+---------+-----------+ |warning |4 |3 |+1.00 | +-----------+-------+---------+-----------+ |error |0 |10 |-10.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |18 | +-----------+------------+ |C0103 |14 | +-----------+------------+ |C0111 |6 | +-----------+------------+ |W0703 |2 | +-----------+------------+ |R0912 |2 | +-----------+------------+ |R0903 |2 | +-----------+------------+ |W0613 |1 | +-----------+------------+ |W0612 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |C0321 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.08/10 (previous run: 3.99/10) Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |199 |72.36 |183 |+16.00 | +----------+-------+------+---------+-----------+ |docstring |38 |13.82 |33 |+5.00 | +----------+-------+------+---------+-----------+ |comment |18 |6.55 |18 |= | +----------+-------+------+---------+-----------+ |empty |20 |7.27 |18 |+2.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (tifimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |4 |4 |= |25.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |10 |10 |= |70.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/OXDimage.py.lint0000644000175000017500000001722712233243302017655 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module OXDimage C: 30,0: Line too long (90/80) C: 80,0: Line too long (88/80) C: 81,0: Line too long (94/80) C: 82,0: Line too long (95/80) C: 83,0: Line too long (90/80) C: 84,0: Line too long (91/80) C: 85,0: Line too long (89/80) C: 89,0: Line too long (83/80) C: 90,0: Line too long (83/80) C: 91,0: Line too long (88/80) C: 92,0: Line too long (88/80) C: 93,0: Line too long (84/80) C: 94,0: Line too long (84/80) C: 95,0: Line too long (85/80) C:100,0: Line too long (88/80) C:101,0: Line too long (103/80) C:102,0: Line too long (92/80) C:103,0: Line too long (94/80) C:104,0: Line too long (94/80) C:105,0: Line too long (103/80) C:106,0: Line too long (103/80) C:107,0: Line too long (112/80) C:108,0: Line too long (112/80) C:109,0: Line too long (83/80) C:110,0: Line too long (103/80) C:111,0: Line too long (96/80) C:112,0: Line too long (96/80) C:120,0: Line too long (82/80) C:142,0: Line too long (81/80) C:149,0: Line too long (94/80) C:150,0: Line too long (94/80) C:152,0: Line too long (91/80) C:153,0: Line too long (91/80) C:154,0: Line too long (90/80) C:155,0: Line too long (89/80) C:158,0: Line too long (97/80) C:159,0: Line too long (97/80) C:160,0: Line too long (97/80) C:164,0: Line too long (87/80) C:165,0: Line too long (87/80) C:167,0: Line too long (92/80) C:169,0: Line too long (91/80) C:172,0: Line too long (88/80) C:177,0: Line too long (86/80) C:178,0: Line too long (97/80) C:179,0: Line too long (87/80) W:248,0: Found indentation with tabs instead of spaces W:249,0: Found indentation with tabs instead of spaces C:251,0: Line too long (107/80) C:252,0: Line too long (133/80) C:253,0: Line too long (111/80) C:254,0: Line too long (125/80) C:255,0: Line too long (125/80) C:256,0: Line too long (121/80) C:257,0: Line too long (122/80) C:258,0: Line too long (121/80) C:305,0: Line too long (91/80) C:307,0: Line too long (120/80) C:309,0: Line too long (118/80) C:311,0: Line too long (125/80) C:314,0: Line too long (95/80) C:316,0: Line too long (124/80) C:318,0: Line too long (122/80) C:320,0: Line too long (129/80) C:323,0: Line too long (96/80) C:325,0: Line too long (124/80) C:327,0: Line too long (122/80) C:329,0: Line too long (129/80) C:332,0: Line too long (94/80) C:334,0: Line too long (121/80) C:336,0: Line too long (119/80) C:338,0: Line too long (126/80) C:371,0: Line too long (82/80) C:397,0: Line too long (110/80) W: 5,0: Redefining built-in '__doc__' C: 1,0: Missing docstring C: 23,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 31,4: Invalid name "rad2deg" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 32,4: Invalid name "deg2rad" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 52,0:OXDimage: Too many instance attributes (10/7) R: 56,4:OXDimage._readheader: Too many statements (95/50) C:225,12:OXDimage.read: Invalid name "ReadBytes" (should match [a-z_][a-z0-9_]{2,30}$) C:269,8:OXDimage._writeheader: Invalid name "NG" (should match [a-z_][a-z0-9_]{2,30}$) C:279,8:OXDimage._writeheader: Invalid name "NS" (should match [a-z_][a-z0-9_]{2,30}$) C:299,8:OXDimage._writeheader: Invalid name "KM" (should match [a-z_][a-z0-9_]{2,30}$) C:366,8:OXDimage._writeheader: Invalid name "SS" (should match [a-z_][a-z0-9_]{2,30}$) C:375,8:OXDimage._writeheader: Invalid name "HS" (should match [a-z_][a-z0-9_]{2,30}$) R:237,4:OXDimage._writeheader: Too many branches (25/12) R:237,4:OXDimage._writeheader: Too many statements (102/50) C:395,4:OXDimage.getCompressionRatio: Invalid name "getCompressionRatio" (should match [a-z_][a-z0-9_]{2,30}$) C:400,4:OXDimage.checkData: Invalid name "checkData" (should match [a-z_][a-z0-9_]{2,30}$) R: 52,0:OXDimage: Too many public methods (26/20) W:216,12:OXDimage.read: Attribute 'raw16' defined outside __init__ W:215,12:OXDimage.read: Attribute 'raw8' defined outside __init__ W:217,12:OXDimage.read: Attribute 'raw32' defined outside __init__ C:418,8:Section.__init__: Invalid name "_dictSize" (should match [a-z_][a-z0-9_]{2,30}$) C:417,8:Section.__init__: Invalid name "lstChr" (should match [a-z_][a-z0-9_]{2,30}$) C:410,4:Section.__init__: Invalid name "dictHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:410,29:Section.__init__: Invalid name "dictHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:422,4:Section.getSize: Invalid name "getSize" (should match [a-z_][a-z0-9_]{2,30}$) C:422,4:Section.getSize: Missing docstring C:427,4:Section.setData: Invalid name "setData" (should match [a-z_][a-z0-9_]{2,30}$) W: 22,0: Unused import struct Report ====== 288 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |91 |56 |+35.00 | +-----------+-------+---------+-----------+ |refactor |5 |3 |+2.00 | +-----------+-------+---------+-----------+ |warning |7 |8 |-1.00 | +-----------+-------+---------+-----------+ |error |0 |86 |-86.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |72 | +-----------+------------+ |C0103 |17 | +-----------+------------+ |W0201 |3 | +-----------+------------+ |W0312 |2 | +-----------+------------+ |R0915 |2 | +-----------+------------+ |C0111 |2 | +-----------+------------+ |W0622 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |R0912 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.42/10 (previous run: -22.48/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |322 |78.35 |158 |+164.00 | +----------+-------+------+---------+-----------+ |docstring |42 |10.22 |18 |+24.00 | +----------+-------+------+---------+-----------+ |comment |17 |4.14 |14 |+3.00 | +----------+-------+------+---------+-----------+ |empty |30 |7.30 |25 |+5.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (OXDimage) \-deg2rad (OXDimage) \-rad2deg (OXDimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |1 |+1.00 |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |10 |2 |+8.00 |90.00 |40.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/pilatusimage.py.lint0000644000175000017500000000566312126623347020721 0ustar jeromejerome00000000000000************* Module pilatusimage C: 26,0:pilatusimage: Invalid name "pilatusimage" (should match [A-Z_][a-zA-Z0-9]+$) W: 53,19:pilatusimage._readheader: Catching too general exception Exception R: 26,0:pilatusimage: Too many public methods (25/20) Report ====== 34 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |1 |1 |= | +-----------+-------+---------+-----------+ |refactor |1 |1 |= | +-----------+-------+---------+-----------+ |warning |1 |1 |= | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |W0703 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |C0103 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 9.12/10 (previous run: 9.12/10) So close to being perfect... Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |34 |42.50 |34 |= | +----------+-------+------+---------+-----------+ |docstring |26 |32.50 |26 |= | +----------+-------+------+---------+-----------+ |comment |6 |7.50 |6 |= | +----------+-------+------+---------+-----------+ |empty |14 |17.50 |14 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ fabio-0.1.3/pylint/dm3image.py.lint0000644000175000017500000001155412233243311017703 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module dm3image C: 67,0: Line too long (81/80) C: 70,0: Line too long (85/80) C:131,0: Line too long (97/80) C:148,0: Line too long (112/80) C:150,0: Line too long (101/80) C:166,0: Line too long (95/80) C:177,0: Line too long (88/80) C:182,0: Line too long (101/80) C:186,0: Line too long (109/80) C:193,0: Line too long (86/80) C:202,0: Line too long (97/80) C:206,0: Line too long (105/80) C:211,0: Line too long (98/80) C:212,0: Line too long (95/80) C:213,0: Line too long (94/80) C:214,0: Line too long (83/80) C:218,0: Line too long (94/80) C: 14,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 46,0:dm3image: Too many instance attributes (19/7) C: 46,0:dm3image: Invalid name "dm3image" (should match [A-Z_][a-zA-Z0-9]+$) W: 62,4:dm3image._readheader: Arguments number differs from overridden method C: 89,56:dm3image.read: More than one statement on a single line W:106,39:dm3image.readbytes: Redefining built-in 'format' C:106,4:dm3image.readbytes: Missing docstring C:118,4:dm3image.read_tag_group: Missing docstring C:127,4:dm3image.read_tag_entry: Missing docstring W:168,12:dm3image.read_tag_type: Redefining built-in 'format' C:144,4:dm3image.read_tag_type: Missing docstring W:180,16:dm3image.read_tag_type: Unused variable 'struct_name_length' W:162,16:dm3image.read_tag_type: Unused variable 'dump' C:217,4:dm3image.read_data: Missing docstring R: 46,0:dm3image: Too many public methods (30/20) W: 67,8:dm3image._readheader: Attribute 'byte_order' defined outside __init__ W:158,12:dm3image.read_tag_type: Attribute 'data_type' defined outside __init__ W: 82,8:dm3image.read: Attribute 'infile' defined outside __init__ W: 75,12:dm3image._readheader: Attribute 'swap' defined outside __init__ Report ====== 135 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |25 |24 |+1.00 | +-----------+-------+---------+-----------+ |refactor |2 |1 |+1.00 | +-----------+-------+---------+-----------+ |warning |9 |24 |-15.00 | +-----------+-------+---------+-----------+ |error |0 |33 |-33.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |17 | +-----------+------------+ |C0111 |5 | +-----------+------------+ |W0201 |4 | +-----------+------------+ |W0622 |2 | +-----------+------------+ |W0612 |2 | +-----------+------------+ |C0103 |2 | +-----------+------------+ |W0221 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |C0321 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.33/10 (previous run: -10.00/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |162 |80.60 |134 |+28.00 | +----------+-------+------+---------+-----------+ |docstring |14 |6.97 |14 |= | +----------+-------+------+---------+-----------+ |comment |5 |2.49 |10 |-5.00 | +----------+-------+------+---------+-----------+ |empty |20 |9.95 |32 |-12.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (dm3image) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |8 |7 |+1.00 |37.50 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/converters.py.lint0000644000175000017500000000521312120434325020404 0ustar jeromejerome00000000000000************* Module converters W: 14,0: Unused import types Report ====== 17 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |0 |0 |= | +-----------+-------+---------+-----------+ |refactor |0 |0 |= | +-----------+-------+---------+-----------+ |warning |1 |1 |= | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |W0611 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 9.41/10 (previous run: 9.41/10) So close to being perfect... Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |27 |50.00 |27 |= | +----------+-------+------+---------+-----------+ |docstring |19 |35.19 |19 |= | +----------+-------+------+---------+-----------+ |comment |2 |3.70 |2 |= | +----------+-------+------+---------+-----------+ |empty |6 |11.11 |6 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |3 |3 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ fabio-0.1.3/pylint/test_filename_steps.py.lint0000644000175000017500000001022212233243324022245 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.test_filename_steps C: 1,0: Missing docstring C: 5,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 6,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 20,0: No exception type(s) specified W: 23,0: Relative import 'utilstest', should be 'test.utilstest' C: 28,0:test_next: Invalid name "test_next" (should match [A-Z_][a-zA-Z0-9]+$) C: 28,0:test_next: Missing docstring W: 30,18:test_next.test_next1: Redefining built-in 'next' C: 29,4:test_next.test_next1: Missing docstring R: 28,0:test_next: Too many public methods (46/20) C: 37,0:test_prev: Invalid name "test_prev" (should match [A-Z_][a-zA-Z0-9]+$) C: 37,0:test_prev: Missing docstring C: 38,4:test_prev.test_prev1: Missing docstring R: 37,0:test_prev: Too many public methods (46/20) C: 46,0:test_jump: Invalid name "test_jump" (should match [A-Z_][a-zA-Z0-9]+$) C: 46,0:test_jump: Missing docstring C: 47,4:test_jump.test_jump1: Missing docstring R: 46,0:test_jump: Too many public methods (46/20) C: 56,0:test_suite_all_steps: Missing docstring C: 57,4:test_suite_all_steps: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 65,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 66,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 44 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |16 |NC |NC | +-----------+-------+---------+-----------+ |refactor |3 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0111 |8 | +-----------+------------+ |C0103 |8 | +-----------+------------+ |R0904 |3 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0622 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.00/10 Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |55 |91.67 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |0 |0.00 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |3.33 |NC |NC | +----------+-------+------+---------+-----------+ |empty |3 |5.00 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |3 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/test_all_images.py.lint0000644000175000017500000000555512233243336021364 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.test_all_images W: 10,0: No exception type(s) specified C: 13,0: Invalid name "times" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 14,0: Invalid name "images" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 72 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |2 |NC |NC | +-----------+-------+---------+-----------+ |refactor |0 |NC |NC | +-----------+-------+---------+-----------+ |warning |1 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 9.58/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |65 |69.89 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |12 |12.90 |NC |NC | +----------+-------+------+---------+-----------+ |comment |1 |1.08 |NC |NC | +----------+-------+------+---------+-----------+ |empty |15 |16.13 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/pnmimage.py.lint0000644000175000017500000001522012233243303020005 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module pnmimage C: 39,0: Line too long (88/80) C: 56,0: Line too long (83/80) C: 77,0: Line too long (91/80) C: 98,0: Line too long (84/80) C:110,0: Line too long (96/80) C:127,0: Line too long (96/80) C:134,0: Line too long (98/80) C:136,0: Line too long (92/80) C: 15,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 23,0:pnmimage: Too many instance attributes (10/7) C: 23,0:pnmimage: Invalid name "pnmimage" (should match [A-Z_][a-zA-Z0-9]+$) C: 31,8:pnmimage.__init__: Invalid name "m" (should match [a-z_][a-z0-9_]{2,30}$) C: 23,0:pnmimage: Missing docstring C: 35,4:pnmimage._readheader: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) C: 35,26:pnmimage._readheader: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) C: 42,8:pnmimage._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C: 52,16:pnmimage._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C: 53,36:pnmimage._readheader: More than one statement on a single line C: 53,36:pnmimage._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C: 54,16:pnmimage._readheader: Invalid name "s" (should match [a-z_][a-z0-9_]{2,30}$) C: 61,16:pnmimage._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C: 62,36:pnmimage._readheader: More than one statement on a single line C: 62,36:pnmimage._readheader: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C: 70,8:pnmimage._readheader: Invalid name "m" (should match [a-z_][a-z0-9_]{2,30}$) R: 35,4:pnmimage._readheader: Too many branches (13/12) C:103,4:pnmimage.P1dec: Invalid name "P1dec" (should match [a-z_][a-z0-9_]{2,30}$) C:103,4:pnmimage.P1dec: Missing docstring E:104,28:pnmimage.P1dec: Undefined variable 'self' E:104,39:pnmimage.P1dec: Undefined variable 'self' C:106,12:pnmimage.P1dec: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C:114,4:pnmimage.P4dec: Invalid name "P4dec" (should match [a-z_][a-z0-9_]{2,30}$) C:114,4:pnmimage.P4dec: Missing docstring W:114,14:pnmimage.P4dec: Unused argument 'buf' W:114,19:pnmimage.P4dec: Unused argument 'bytecode' C:120,4:pnmimage.P2dec: Invalid name "P2dec" (should match [a-z_][a-z0-9_]{2,30}$) C:120,4:pnmimage.P2dec: Missing docstring E:121,28:pnmimage.P2dec: Undefined variable 'self' E:121,39:pnmimage.P2dec: Undefined variable 'self' C:123,12:pnmimage.P2dec: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) C:131,4:pnmimage.P5dec: Invalid name "P5dec" (should match [a-z_][a-z0-9_]{2,30}$) C:131,4:pnmimage.P5dec: Missing docstring C:132,8:pnmimage.P5dec: Invalid name "l" (should match [a-z_][a-z0-9_]{2,30}$) E:134,65:pnmimage.P5dec: Undefined variable 'self' E:134,76:pnmimage.P5dec: Undefined variable 'self' C:140,4:pnmimage.P3dec: Invalid name "P3dec" (should match [a-z_][a-z0-9_]{2,30}$) C:140,4:pnmimage.P3dec: Missing docstring W:140,14:pnmimage.P3dec: Unused argument 'buf' W:140,19:pnmimage.P3dec: Unused argument 'bytecode' C:146,4:pnmimage.P6dec: Invalid name "P6dec" (should match [a-z_][a-z0-9_]{2,30}$) C:146,4:pnmimage.P6dec: Missing docstring W:146,14:pnmimage.P6dec: Unused argument 'buf' W:146,19:pnmimage.P6dec: Unused argument 'bytecode' C:152,4:pnmimage.P7dec: Invalid name "P7dec" (should match [a-z_][a-z0-9_]{2,30}$) C:152,4:pnmimage.P7dec: Missing docstring W:152,14:pnmimage.P7dec: Unused argument 'buf' W:152,19:pnmimage.P7dec: Unused argument 'bytecode' C:161,4:pnmimage.checkData: Invalid name "checkData" (should match [a-z_][a-z0-9_]{2,30}$) R: 23,0:pnmimage: Too many public methods (32/20) R: 23,0:pnmimage: Abstract class not referenced Report ====== 110 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |41 |43 |-2.00 | +-----------+-------+---------+-----------+ |refactor |4 |4 |= | +-----------+-------+---------+-----------+ |warning |8 |4 |+4.00 | +-----------+-------+---------+-----------+ |error |6 |12 |-6.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |23 | +-----------+------------+ |W0613 |8 | +-----------+------------+ |C0301 |8 | +-----------+------------+ |C0111 |8 | +-----------+------------+ |E0602 |6 | +-----------+------------+ |C0321 |2 | +-----------+------------+ |R0921 |1 | +-----------+------------+ |R0912 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 2.45/10 (previous run: -1.44/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |121 |80.67 |98 |+23.00 | +----------+-------+------+---------+-----------+ |docstring |15 |10.00 |10 |+5.00 | +----------+-------+------+---------+-----------+ |comment |8 |5.33 |8 |= | +----------+-------+------+---------+-----------+ |empty |6 |4.00 |10 |-4.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (pnmimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |12 |11 |+1.00 |41.67 |66.67 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testcompression.py.lint0000644000175000017500000001135612233243325021463 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testcompression C: 42,0: Line too long (217/80) C: 43,0: Line too long (390/80) C: 55,0: Line too long (84/80) C: 56,0: Line too long (92/80) C: 59,0: Line too long (86/80) C: 61,0: Line too long (89/80) C: 63,0: Line too long (90/80) C: 65,0: Line too long (105/80) C: 67,0: Line too long (103/80) C: 11,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 12,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 26,0: No exception type(s) specified W: 29,0: Relative import 'utilstest', should be 'test.utilstest' C: 37,0:testbyteoffset: Invalid name "testbyteoffset" (should match [A-Z_][a-zA-Z0-9]+$) C: 42,8:testbyteoffset.setUp: Invalid name "ds" (should match [a-z_][a-z0-9_]{2,30}$) C: 41,4:testbyteoffset.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 44,4:testbyteoffset.testComp: Invalid name "testComp" (should match [a-z_][a-z0-9_]{2,30}$) C: 44,4:testbyteoffset.testComp: Empty docstring C: 47,8:testbyteoffset.testComp: Invalid name "ds" (should match [a-z_][a-z0-9_]{2,30}$) C: 50,8:testbyteoffset.testComp: Invalid name "ds" (should match [a-z_][a-z0-9_]{2,30}$) C: 53,8:testbyteoffset.testComp: Invalid name "ds" (should match [a-z_][a-z0-9_]{2,30}$) C: 58,4:testbyteoffset.testSC: Invalid name "testSC" (should match [a-z_][a-z0-9_]{2,30}$) R: 37,0:testbyteoffset: Too many public methods (47/20) C: 74,0:test_suite_all_compression: Missing docstring C: 75,4:test_suite_all_compression: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 81,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 82,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 32,0: Unused import fabio Report ====== 57 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |24 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |13 | +-----------+------------+ |C0301 |9 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |C0112 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.09/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |57 |69.51 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |11 |13.41 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |2.44 |NC |NC | +----------+-------+------+---------+-----------+ |empty |12 |14.63 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (test.testcompression) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |NC |NC |66.67 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/lintem.py0000744000175000017500000000352012126623347016547 0ustar jeromejerome00000000000000#!/usr/bin/python # coding: utf8 from __future__ import with_statement __author__ = "Jerome Kieffer" __email__ = "jerome.kieffer@esrf.fr" __doc__ = "This runs pylint on all modules from fabio package" __date__ = "20120416" __status__ = "production" __licence__ = "GPL" import os, subprocess, sys, distutils.util import numpy import Image from os.path import dirname arch = "lib.%s-%i.%i" % (distutils.util.get_platform(), sys.version_info[0], sys.version_info[1]) pylint_dir = os.path.dirname(os.path.abspath(__file__)) fabio_root = os.path.dirname(pylint_dir) installDir = os.path.abspath(os.path.join(fabio_root, "build", arch, "fabio")) testDir = os.path.abspath(os.path.join(fabio_root, "test")) sys.path.append(testDir) import utilstest #env = {"PYTHONPATH":":".join([installDir, testDir, dirname(dirname(numpy.__file__)), dirname(Image.__file__)])} env = {"PYTHONPATH":installDir} print env def lintit(infile, outfile): print ("Updating %s" % outfile) process = subprocess.Popen(["pylint", infile], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) result, error = process.communicate() if len(result) > 0: with open(outfile, "wb") as lintfile: if len(error) > 0: lintfile.write(error + os.linesep) lintfile.write(result) else: print ("Error in running pylint on %s:%s%s" % (infile, os.linesep, error)) files = [ os.path.join(installDir, i) for i in os.listdir(installDir) if i.endswith(".py") ] + \ [ os.path.join(testDir, i) for i in os.listdir(testDir) if i.endswith(".py") ] for f in files: outf = os.path.join(pylint_dir, os.path.basename(f) + ".lint") if not os.path.exists(outf) : lintit(f, outf) elif os.stat(f).st_mtime > os.stat(outf).st_mtime: lintit(f, outf) else: print ("Not updating %s" % outf) # lintit(f, outf) fabio-0.1.3/pylint/GEimage.py.lint0000644000175000017500000000746312233243303017520 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module GEimage C: 1,0: Missing docstring C: 17,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R:181,0:GEimage: Too many instance attributes (9/7) C:181,0:GEimage: Missing docstring W:191,26:GEimage._readheader: Redefining built-in 'format' W:253,4:GEimage.write: Arguments number differs from overridden method W:253,27:GEimage.write: Unused argument 'force_type' W:270,17:GEimage.getframe: Access to a protected member _open of a client class W:271,8:GEimage.getframe: Access to a protected member _readframe of a client class R:181,0:GEimage: Too many public methods (25/20) W:269,8:GEimage.getframe: Attribute 'sequencefilename' defined outside __init__ C:300,0:demo: Missing docstring Report ====== 94 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |4 |4 |= | +-----------+-------+---------+-----------+ |refactor |2 |1 |+1.00 | +-----------+-------+---------+-----------+ |warning |6 |8 |-2.00 | +-----------+-------+---------+-----------+ |error |0 |3 |-3.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0111 |3 | +-----------+------------+ |W0212 |2 | +-----------+------------+ |W0622 |1 | +-----------+------------+ |W0613 |1 | +-----------+------------+ |W0221 |1 | +-----------+------------+ |W0201 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |C0103 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.72/10 (previous run: 6.99/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |262 |82.39 |260 |+2.00 | +----------+-------+------+---------+-----------+ |docstring |24 |7.55 |24 |= | +----------+-------+------+---------+-----------+ |comment |13 |4.09 |13 |= | +----------+-------+------+---------+-----------+ |empty |19 |5.97 |21 |-2.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (GEimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |8 |8 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/GEimage_old.py.lint0000644000175000017500000001223612233243313020351 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module GEimage_old C: 40,0: Line too long (88/80) C: 41,0: Line too long (97/80) C: 42,0: Line too long (92/80) C: 43,0: Line too long (101/80) C: 45,0: Line too long (89/80) C: 46,0: Line too long (94/80) C: 47,0: Line too long (94/80) C: 48,0: Line too long (87/80) C: 65,0: Line too long (86/80) C: 68,0: Line too long (92/80) C: 71,0: Line too long (112/80) C: 74,0: Line too long (112/80) C: 89,0: Line too long (82/80) C:104,0: Line too long (82/80) C:107,0: Line too long (82/80) C:113,0: Line too long (88/80) C:116,0: Line too long (98/80) C:119,0: Line too long (102/80) C:122,0: Line too long (82/80) C:129,0: Line too long (96/80) C:132,0: Line too long (100/80) C:135,0: Line too long (96/80) C:156,0: Line too long (88/80) C:159,0: Line too long (102/80) C:168,0: Line too long (94/80) C:219,0: Line too long (88/80) C:222,0: Line too long (84/80) C:225,0: Line too long (90/80) C:228,0: Line too long (90/80) C:231,0: Line too long (86/80) C:237,0: Line too long (106/80) C:240,0: Line too long (102/80) C:246,0: Line too long (98/80) C:252,0: Line too long (92/80) C:272,0: Line too long (86/80) C:293,0: Line too long (84/80) C:299,0: Line too long (82/80) C:302,0: Line too long (82/80) C:305,0: Line too long (82/80) C:308,0: Line too long (82/80) C:311,0: Line too long (102/80) C:314,0: Line too long (98/80) C:320,0: Line too long (84/80) C:352,0: Line too long (92/80) C:355,0: Line too long (88/80) C:358,0: Line too long (84/80) C:361,0: Line too long (90/80) C:381,0: Line too long (100/80) C:384,0: Line too long (96/80) C:449,0: Line too long (82/80) C:484,0: Line too long (92/80) C: 1,0: Invalid name "GEimage_old" (should match (([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$) R: 26,0:GEimage: Too many instance attributes (9/7) C: 34,8:GEimage._readheader: Invalid name "ImageFormat" (should match [a-z_][a-z0-9_]{2,30}$) C: 53,8:GEimage._readheader: Invalid name "DUTID" (should match [a-z_][a-z0-9_]{2,30}$) C: 26,0:GEimage: Missing docstring C:486,8:GEimage.read: Invalid name "ReadBytes" (should match [a-z_][a-z0-9_]{2,30}$) R: 26,0:GEimage: Too many public methods (25/20) W: 34,8:GEimage._readheader: Attribute 'ImageFormat' defined outside __init__ W: 53,8:GEimage._readheader: Attribute 'DUTID' defined outside __init__ Report ====== 50 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |56 |57 |-1.00 | +-----------+-------+---------+-----------+ |refactor |2 |2 |= | +-----------+-------+---------+-----------+ |warning |2 |10 |-8.00 | +-----------+-------+---------+-----------+ |error |0 |21 |-21.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |51 | +-----------+------------+ |C0103 |4 | +-----------+------------+ |W0201 |2 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at -2.00/10 (previous run: -24.80/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |50 |10.25 |50 |= | +----------+-------+------+---------+-----------+ |docstring |24 |4.92 |24 |= | +----------+-------+------+---------+-----------+ |comment |267 |54.71 |267 |= | +----------+-------+------+---------+-----------+ |empty |147 |30.12 |147 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (GEimage_old) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testGEimage.py.lint0000644000175000017500000001014012233243331020403 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testGEimage C: 34,0: Line too long (86/80) C: 36,0: Line too long (89/80) C: 1,0: Invalid name "testGEimage" (should match (([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$) C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 25,0: No exception type(s) specified W: 28,0: Relative import 'utilstest', should be 'test.utilstest' C: 39,0:testGE: Invalid name "testGE" (should match [A-Z_][a-zA-Z0-9]+$) C: 45,8:testGE.setUp: Invalid name "GE" (should match [a-z_][a-z0-9_]{2,30}$) C: 39,0:testGE: Missing docstring C: 41,4:testGE.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 48,4:testGE.test_read: Missing docstring R: 39,0:testGE: Too many public methods (46/20) C: 65,0:test_suite_all_GE: Invalid name "test_suite_all_GE" (should match [a-z_][a-z0-9_]{2,30}$) C: 65,0:test_suite_all_GE: Missing docstring C: 66,4:test_suite_all_GE: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 71,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 72,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 31,0: Unused import fabio Report ====== 49 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |15 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |10 | +-----------+------------+ |C0111 |3 | +-----------+------------+ |C0301 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.12/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |50 |71.43 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |8 |11.43 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |2.86 |NC |NC | +----------+-------+------+---------+-----------+ |empty |10 |14.29 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |NC |NC |50.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testedfimage.py.lint0000644000175000017500000002355612233243340020665 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testedfimage C: 72,0: Line too long (86/80) C: 73,0: Line too long (86/80) C: 75,0: Line too long (106/80) C: 76,0: Line too long (105/80) C: 96,0: Line too long (101/80) W: 96,0: Bad indentation. Found 20 spaces, expected 12 C:105,0: Line too long (98/80) W:105,0: Bad indentation. Found 20 spaces, expected 12 C:124,0: Line too long (85/80) C:140,0: Line too long (89/80) C:141,0: Line too long (87/80) C:143,0: Line too long (89/80) C:144,0: Line too long (87/80) C:145,0: Line too long (95/80) C:154,0: Line too long (123/80) C:179,0: Line too long (83/80) C:183,0: Line too long (86/80) C:187,0: Line too long (92/80) C:188,0: Line too long (93/80) C:189,0: Line too long (104/80) C:199,0: Line too long (82/80) C:200,0: Line too long (82/80) C:207,0: Line too long (105/80) C:211,0: Line too long (89/80) C:215,0: Line too long (89/80) C:219,0: Line too long (110/80) C:221,0: Line too long (100/80) C:222,0: Line too long (110/80) C:226,0: Line too long (109/80) C:228,0: Line too long (108/80) C:232,0: Line too long (106/80) C:234,0: Line too long (102/80) C:238,0: Line too long (105/80) C:240,0: Line too long (101/80) C:245,0: Line too long (104/80) C:247,0: Line too long (104/80) C:252,0: Line too long (103/80) C:254,0: Line too long (105/80) C:257,0: Line too long (84/80) C:258,0: Line too long (145/80) C:259,0: Line too long (147/80) C:260,0: Line too long (147/80) C:274,0: Line too long (83/80) C:292,0: Line too long (94/80) C:300,0: Line too long (94/80) C:308,0: Line too long (94/80) C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 25,0: No exception type(s) specified W: 28,0: Relative import 'utilstest', should be 'test.utilstest' C: 38,0:testflatedfs: Invalid name "testflatedfs" (should match [A-Z_][a-zA-Z0-9]+$) C: 58,4:testflatedfs.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 38,0:testflatedfs: Too many public methods (47/20) C: 90,0:testbzipedf: Invalid name "testbzipedf" (should match [A-Z_][a-zA-Z0-9]+$) C: 92,4:testbzipedf.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 90,0:testbzipedf: Too many public methods (47/20) C: 99,0:testgzipedf: Invalid name "testgzipedf" (should match [A-Z_][a-zA-Z0-9]+$) C:101,4:testgzipedf.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 99,0:testgzipedf: Too many public methods (47/20) C:119,0:testedfs: Invalid name "testedfs" (should match [A-Z_][a-zA-Z0-9]+$) C:123,4:testedfs.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C:151,8:testedfs.test_rebin: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) R:119,0:testedfs: Too many public methods (47/20) C:158,0:testedfcompresseddata: Invalid name "testedfcompresseddata" (should match [A-Z_][a-zA-Z0-9]+$) C:163,4:testedfcompresseddata.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C:173,8:testedfcompresseddata.test_read: Invalid name "refFile" (should match [a-z_][a-z0-9_]{2,30}$) C:174,8:testedfcompresseddata.test_read: Invalid name "gzippedFile" (should match [a-z_][a-z0-9_]{2,30}$) C:175,8:testedfcompresseddata.test_read: Invalid name "compressedFile" (should match [a-z_][a-z0-9_]{2,30}$) R:158,0:testedfcompresseddata: Too many public methods (46/20) C:192,0:testedfmultiframe: Invalid name "testedfmultiframe" (should match [A-Z_][a-zA-Z0-9]+$) C:200,8:testedfmultiframe.setUp: Invalid name "Frame1Filename" (should match [a-z_][a-z0-9_]{2,30}$) C:198,8:testedfmultiframe.setUp: Invalid name "multiFrameFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:199,8:testedfmultiframe.setUp: Invalid name "Frame0Filename" (should match [a-z_][a-z0-9_]{2,30}$) C:197,4:testedfmultiframe.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) E:211,73:testedfmultiframe.setUp: Instance of 'testedfmultiframe' has no 'Frame0File' member E:215,73:testedfmultiframe.setUp: Instance of 'testedfmultiframe' has no 'Frame1File' member C:217,4:testedfmultiframe.test_getFrame_multi: Invalid name "test_getFrame_multi" (should match [a-z_][a-z0-9_]{2,30}$) C:224,4:testedfmultiframe.test_getFrame_mono: Invalid name "test_getFrame_mono" (should match [a-z_][a-z0-9_]{2,30}$) W:233,8:testedfmultiframe.test_next_multi: Redefining built-in 'next' W:239,8:testedfmultiframe.text_next_mono: Redefining built-in 'next' C:244,8:testedfmultiframe.test_previous_multi: Invalid name "f1" (should match [a-z_][a-z0-9_]{2,30}$) C:246,8:testedfmultiframe.test_previous_multi: Invalid name "f0" (should match [a-z_][a-z0-9_]{2,30}$) C:251,8:testedfmultiframe.test_previous_mono: Invalid name "f1" (should match [a-z_][a-z0-9_]{2,30}$) R:192,0:testedfmultiframe: Too many public methods (52/20) C:262,0:testedffastread: Invalid name "testedffastread" (should match [A-Z_][a-zA-Z0-9]+$) C:268,8:testedffastread.setUp: Invalid name "refFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:269,8:testedffastread.setUp: Invalid name "fastFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:267,4:testedffastread.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C:270,4:testedffastread.test_fastread: Missing docstring R:262,0:testedffastread: Too many public methods (46/20) C:276,0:testedfwrite: Invalid name "testedfwrite" (should match [A-Z_][a-zA-Z0-9]+$) C:281,4:testedfwrite.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C:285,4:testedfwrite.testFlat: Invalid name "testFlat" (should match [a-z_][a-z0-9_]{2,30}$) C:285,4:testedfwrite.testFlat: Missing docstring C:287,8:testedfwrite.testFlat: Invalid name "e" (should match [a-z_][a-z0-9_]{2,30}$) C:289,8:testedfwrite.testFlat: Invalid name "r" (should match [a-z_][a-z0-9_]{2,30}$) C:293,4:testedfwrite.testGzip: Invalid name "testGzip" (should match [a-z_][a-z0-9_]{2,30}$) C:293,4:testedfwrite.testGzip: Missing docstring C:295,8:testedfwrite.testGzip: Invalid name "e" (should match [a-z_][a-z0-9_]{2,30}$) C:297,8:testedfwrite.testGzip: Invalid name "r" (should match [a-z_][a-z0-9_]{2,30}$) C:301,4:testedfwrite.testBzip2: Invalid name "testBzip2" (should match [a-z_][a-z0-9_]{2,30}$) C:301,4:testedfwrite.testBzip2: Missing docstring C:303,8:testedfwrite.testBzip2: Invalid name "e" (should match [a-z_][a-z0-9_]{2,30}$) C:305,8:testedfwrite.testBzip2: Invalid name "r" (should match [a-z_][a-z0-9_]{2,30}$) C:309,4:testedfwrite.tearDown: Invalid name "tearDown" (should match [a-z_][a-z0-9_]{2,30}$) R:276,0:testedfwrite: Too many public methods (48/20) W:302,8:testedfwrite.testBzip2: Attribute 'filename' defined outside __init__ C:313,0:test_suite_all_edf: Missing docstring C:314,4:test_suite_all_edf: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:338,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:339,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 239 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |94 |NC |NC | +-----------+-------+---------+-----------+ |refactor |8 |NC |NC | +-----------+-------+---------+-----------+ |warning |7 |NC |NC | +-----------+-------+---------+-----------+ |error |2 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |45 | +-----------+------------+ |C0301 |44 | +-----------+------------+ |R0904 |8 | +-----------+------------+ |C0111 |5 | +-----------+------------+ |W0622 |2 | +-----------+------------+ |W0311 |2 | +-----------+------------+ |E1101 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |W0201 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.02/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |242 |75.39 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |51 |15.89 |NC |NC | +----------+-------+------+---------+-----------+ |comment |4 |1.25 |NC |NC | +----------+-------+------+---------+-----------+ |empty |24 |7.48 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (test.testedfimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |8 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |25 |NC |NC |84.00 |56.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/.pylintrc0000644000175000017500000002127012120434325016541 0ustar jeromejerome00000000000000# lint Python modules using external checkers. # # This is the main checker controling the other ones and the reports # generation. It is itself both a raw checker and an astng checker in order # to: # * handle message activation / deactivation at the module level # * handle some basic but necessary stats'data (number of classes, methods...) # [MASTER] # Specify a configuration file. #rcfile= # Profiled execution. profile=no # Add to the black list. It should be a base name, not a # path. You may set this option multiple times. ignore=CVS # Pickle collected data for later comparisons. persistent=yes # Set the cache size for astng objects. cache-size=500 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= [COMMANDS] # Display a help message for the given message id and exit. The value may be a # comma separated list of message ids. #help-msg= [MESSAGES CONTROL] # Enable only checker(s) with the given id(s). This option conflict with the # disable-checker option #enable-checker= # Enable all checker(s) except those with the given id(s). This option conflict # with the disable-checker option #disable-checker= # Enable all messages in the listed categories. #enable-msg-cat= # Disable all messages in the listed categories. #disable-msg-cat= # Enable the message(s) with the given id(s). #enable-msg= # Disable the message(s) with the given id(s). #disable-msg= [REPORTS] # set the output format. Available formats are text, parseable, colorized and # html output-format=text # Include message's id in output include-ids=yes # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". files-output=no # Tells wether to display a full report or only the messages reports=yes # Python expression which should return a note less than 10 (10 is the highest # note).You have access to the variables errors warning, statement which # respectivly contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (R0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Add a comment according to your evaluation note. This is used by the global # evaluation report (R0004). comment=no # Enable the report(s) with the given id(s). #enable-report= # Disable the report(s) with the given id(s). #disable-report= # checks for # * unused variables / imports # * undefined variables # * redefinition of variable from builtins or from an outer scope # * use of variable before assigment # [VARIABLES] # Tells wether we should check for unused import in __init__ files. init-import=no # A regular expression matching names used for dummy variables (i.e. not used). dummy-variables-rgx=_|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # try to find bugs in the code using type inference # [TYPECHECK] # Tells wether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # When zope mode is activated, consider the acquired-members option to ignore # access to some undefined attributes. zope=no # List of members which are usually get through zope's acquisition mecanism and # so shouldn't trigger E0201 when accessed (need zope=yes to be considered). acquired-members=REQUEST,acl_users,aq_parent # checks for : # * doc strings # * modules / classes / functions / methods / arguments / variables name # * number of arguments, local variables, branchs, returns and statements in # functions, methods # * required module attributes # * dangerous default values as arguments # * redefinition of function / method / class # * uses of the global statement # [BASIC] # Required attributes for module, separated by a comma required-attributes= # Regular expression which should only match functions or classes name which do # not require a docstring no-docstring-rgx=__.*__ # Regular expression which should only match correct module names module-rgx=(([a-z_][a-z0-9_]*)|([a-z][a-zA-Z0-9]+))$ # Regular expression which should only match correct module level names const-rgx=(([A-Z_]*)|(__.*__))$ # Regular expression which should only match correct class names class-rgx=[a-z_][a-zA-Z0-9]+$ # Regular expression which should only match correct function names function-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct method names method-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct instance attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct variable names variable-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct list comprehension / # generator expression variable names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,x,y,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # List of builtins function names that should not be used, separated by a comma bad-functions=map,filter,apply,input # checks for sign of poor/misdesign: # * number of methods, attributes, local variables... # * size, complexity of functions, methods # [DESIGN] # Maximum number of arguments for function / method max-args=5 # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branchs=12 # Maximum number of statements in function / method body max-statements=50 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # checks for : # * methods without self as first argument # * overridden methods signature # * access only to existant members via self # * attributes not defined in the __init__ method # * supported interfaces implementation # * unreachable code # [CLASSES] # List of interface methods to ignore, separated by a comma. This is used for # instance to not check methods defines in Zope's Interface base class. ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # checks for # * external modules dependencies # * relative / wildcard imports # * cyclic imports # * uses of deprecated modules # [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,string,TERMIOS,Bastion,rexec # Create a graph of every (i.e. internal and external) dependencies in the # given file (report R0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report R0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report R0402 must # not be disabled) int-import-graph= # checks for : # * unauthorized constructions # * strict indentation # * line length # * use of <> instead of != # [FORMAT] # Maximum number of characters on a single line. max-line-length=80 # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # checks for similarities and duplicated code. This computation may be # memory / CPU intensive, so you should disable it if you experiments some # problems. # [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # checks for: # * warning notes in the code like FIXME, XXX # * PEP 263: source code with non ascii character but no encoding declaration # [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO fabio-0.1.3/pylint/fit2dspreadsheetimage.py.lint0000644000175000017500000000664212233243315022466 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module fit2dspreadsheetimage W: 23,0: TODO : test for minimal attributes? C: 15,0:fit2dspreadsheetimage: Invalid name "fit2dspreadsheetimage" (should match [A-Z_][a-zA-Z0-9]+$) W: 62,16:fit2dspreadsheetimage.read: No exception type(s) specified R: 15,0:fit2dspreadsheetimage: Too many public methods (25/20) C: 78,4: Invalid name "start" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 79,4: Invalid name "img" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 51 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |3 |3 |= | +-----------+-------+---------+-----------+ |refactor |1 |1 |= | +-----------+-------+---------+-----------+ |warning |2 |9 |-7.00 | +-----------+-------+---------+-----------+ |error |0 |6 |-6.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |3 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0511 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.82/10 (previous run: 1.57/10) Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |50 |60.98 |50 |= | +----------+-------+------+---------+-----------+ |docstring |16 |19.51 |16 |= | +----------+-------+------+---------+-----------+ |comment |1 |1.22 |1 |= | +----------+-------+------+---------+-----------+ |empty |15 |18.29 |15 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: matplotlib \-pylab \-imshow (fit2dspreadsheetimage) \-show (fit2dspreadsheetimage) numpy (fit2dspreadsheetimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/file_series.py.lint0000644000175000017500000001054112233243304020503 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module file_series C:116,0: Line too long (93/80) C: 18,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 32,4:new_file_series0: Invalid name "im" (should match [a-z_][a-z0-9_]{2,30}$) W: 47,15:new_file_series0: Catching too general exception Exception C: 46,12:new_file_series0: Invalid name "im" (should match [a-z_][a-z0-9_]{2,30}$) W: 54,19:new_file_series0: Catching too general exception Exception C: 95,4:new_file_series: Invalid name "im" (should match [a-z_][a-z0-9_]{2,30}$) W:106,15:new_file_series: Catching too general exception Exception C:104,12:new_file_series: Invalid name "im" (should match [a-z_][a-z0-9_]{2,30}$) C:105,12:new_file_series: Invalid name "retVal" (should match [a-z_][a-z0-9_]{2,30}$) C:107,12:new_file_series: Invalid name "retVal" (should match [a-z_][a-z0-9_]{2,30}$) W:115,19:new_file_series: Catching too general exception Exception C:120,12:new_file_series: Invalid name "retVal" (should match [a-z_][a-z0-9_]{2,30}$) C:121,22:new_file_series: More than one statement on a single line C:126,0:file_series: Invalid name "file_series" (should match [A-Z_][a-zA-Z0-9]+$) R:126,0:file_series: Too many public methods (28/20) C:322,0:numbered_file_series: Invalid name "numbered_file_series" (should match [A-Z_][a-zA-Z0-9]+$) R:328,4:numbered_file_series.__init__: Too many arguments (8/5) R:322,0:numbered_file_series: Too many public methods (28/20) C:349,0:filename_series: Invalid name "filename_series" (should match [A-Z_][a-zA-Z0-9]+$) Report ====== 141 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |13 |11 |+2.00 | +-----------+-------+---------+-----------+ |refactor |3 |3 |= | +-----------+-------+---------+-----------+ |warning |4 |5 |-1.00 | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |11 | +-----------+------------+ |W0703 |4 | +-----------+------------+ |R0904 |2 | +-----------+------------+ |R0913 |1 | +-----------+------------+ |C0321 |1 | +-----------+------------+ |C0301 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.58/10 (previous run: 8.64/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |146 |36.68 |145 |+1.00 | +----------+-------+------+---------+-----------+ |docstring |194 |48.74 |101 |+93.00 | +----------+-------+------+---------+-----------+ |comment |7 |1.76 |7 |= | +----------+-------+------+---------+-----------+ |empty |51 |12.81 |33 |+18.00 | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |3 |3 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |34 |34 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testopenheader.py.lint0000644000175000017500000000736512233243321021235 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testopenheader C: 36,0: Line too long (83/80) C: 8,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 9,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 23,0: No exception type(s) specified W: 26,0: Relative import 'utilstest', should be 'test.utilstest' C: 33,0:test1: Invalid name "test1" (should match [A-Z_][a-zA-Z0-9]+$) C: 35,4:test1.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 33,0:test1: Too many public methods (46/20) C: 50,0:test_suite_all_openheader: Missing docstring C: 51,4:test_suite_all_openheader: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 56,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 57,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 29,0: Unused import fabio Report ====== 40 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |9 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |7 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |C0301 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.75/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |40 |72.73 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |7 |12.73 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |3.64 |NC |NC | +----------+-------+------+---------+-----------+ |empty |6 |10.91 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |NC |NC |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/benchheader.py.lint0000644000175000017500000000566012233243334020453 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.benchheader C: 11,0: Line too long (94/80) C: 1,0: Missing docstring C: 6,0: Invalid name "junk" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "images" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 10 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |4 |NC |NC | +-----------+-------+---------+-----------+ |refactor |0 |NC |NC | +-----------+-------+---------+-----------+ |warning |0 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |2 | +-----------+------------+ |C0301 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.00/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |10 |52.63 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |1 |5.26 |NC |NC | +----------+-------+------+---------+-----------+ |comment |3 |15.79 |NC |NC | +----------+-------+------+---------+-----------+ |empty |5 |26.32 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/HiPiCimage.py.lint0000644000175000017500000001026112233243304020150 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module HiPiCimage C: 93,0: Line too long (81/80) C: 17,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 24,4:HiPiCimage._readheader: Too many local variables (17/15) C: 29,8:HiPiCimage._readheader: Invalid name "Image_tag" (should match [a-z_][a-z0-9_]{2,30}$) C: 31,8:HiPiCimage._readheader: Invalid name "Comment_len" (should match [a-z_][a-z0-9_]{2,30}$) C: 32,8:HiPiCimage._readheader: Invalid name "Dim_1" (should match [a-z_][a-z0-9_]{2,30}$) C: 33,8:HiPiCimage._readheader: Invalid name "Dim_2" (should match [a-z_][a-z0-9_]{2,30}$) C: 34,8:HiPiCimage._readheader: Invalid name "Dim_1_offset" (should match [a-z_][a-z0-9_]{2,30}$) C: 35,8:HiPiCimage._readheader: Invalid name "Dim_2_offset" (should match [a-z_][a-z0-9_]{2,30}$) C: 36,8:HiPiCimage._readheader: Invalid name "HeaderType" (should match [a-z_][a-z0-9_]{2,30}$) C: 37,8:HiPiCimage._readheader: Invalid name "Dump" (should match [a-z_][a-z0-9_]{2,30}$) C: 38,8:HiPiCimage._readheader: Invalid name "Comment" (should match [a-z_][a-z0-9_]{2,30}$) C: 49,8:HiPiCimage._readheader: Invalid name "Comment_split" (should match [a-z_][a-z0-9_]{2,30}$) W: 36,8:HiPiCimage._readheader: Unused variable 'HeaderType' W: 37,8:HiPiCimage._readheader: Unused variable 'Dump' R: 20,0:HiPiCimage: Too many public methods (25/20) Report ====== 58 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |12 |12 |= | +-----------+-------+---------+-----------+ |refactor |2 |2 |= | +-----------+-------+---------+-----------+ |warning |2 |10 |-8.00 | +-----------+-------+---------+-----------+ |error |0 |19 |-19.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |11 | +-----------+------------+ |W0612 |2 | +-----------+------------+ |R0914 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |C0301 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.24/10 (previous run: -10.52/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |61 |59.80 |61 |= | +----------+-------+------+---------+-----------+ |docstring |23 |22.55 |23 |= | +----------+-------+------+---------+-----------+ |comment |8 |7.84 |8 |= | +----------+-------+------+---------+-----------+ |empty |10 |9.80 |10 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (HiPiCimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testheadernotsingleton.py.lint0000644000175000017500000000740012233243330023005 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testheadernotsingleton C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 25,0: No exception type(s) specified W: 28,0: Relative import 'utilstest', should be 'test.utilstest' C: 34,0:testheadernotsingleton: Invalid name "testheadernotsingleton" (should match [A-Z_][a-zA-Z0-9]+$) C: 34,0:testheadernotsingleton: Missing docstring C: 36,4:testheadernotsingleton.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 43,4:testheadernotsingleton.testheader: Missing docstring R: 34,0:testheadernotsingleton: Too many public methods (46/20) C: 55,0:test_suite_all_header: Missing docstring C: 56,4:test_suite_all_header: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 61,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 62,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 44 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |10 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |7 | +-----------+------------+ |C0111 |3 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.05/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |44 |74.58 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |8 |13.56 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |3.39 |NC |NC | +----------+-------+------+---------+-----------+ |empty |5 |8.47 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |NC |NC |50.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testmar345image.py.lint0000644000175000017500000001022412233243332021127 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testmar345image C: 61,0: Line too long (98/80) C: 62,0: Line too long (98/80) C: 63,0: Line too long (101/80) C: 64,0: Line too long (111/80) C: 78,0: Line too long (86/80) C: 82,0: Line too long (81/80) C: 83,0: Line too long (154/80) C: 9,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 10,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 24,0: No exception type(s) specified W: 27,0: Relative import 'utilstest', should be 'test.utilstest' C: 39,0:testMAR345: Invalid name "testMAR345" (should match [A-Z_][a-zA-Z0-9]+$) C: 39,0:testMAR345: Missing docstring C: 40,4:testMAR345.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 46,4:testMAR345.tearDown: Invalid name "tearDown" (should match [a-z_][a-z0-9_]{2,30}$) W: 56,18:testMAR345.test_read: Unused variable 'dim2' W: 91,16:testMAR345.test_memoryleak: Unused variable 'img' R: 39,0:testMAR345: Too many public methods (48/20) C: 96,0:test_suite_all_mar345: Missing docstring C: 97,4:test_suite_all_mar345: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:105,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:106,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 76 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |17 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |4 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |8 | +-----------+------------+ |C0301 |7 | +-----------+------------+ |W0612 |2 | +-----------+------------+ |C0111 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.11/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |77 |73.33 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |15 |14.29 |NC |NC | +----------+-------+------+---------+-----------+ |comment |3 |2.86 |NC |NC | +----------+-------+------+---------+-----------+ |empty |10 |9.52 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |5 |NC |NC |100.00 |40.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testadscimage.py.lint0000644000175000017500000001021712233243323021030 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testadscimage C: 63,0: Line too long (115/80) C: 64,0: Line too long (115/80) C: 65,0: Line too long (91/80) C: 13,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 14,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 28,0: No exception type(s) specified W: 31,0: Relative import 'utilstest', should be 'test.utilstest' C: 47,0:testmatch: Invalid name "testmatch" (should match [A-Z_][a-zA-Z0-9]+$) C: 51,4:testmatch.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 47,0:testmatch: Too many public methods (46/20) C: 69,0:testflatmccdsadsc: Invalid name "testflatmccdsadsc" (should match [A-Z_][a-zA-Z0-9]+$) C: 69,0:testflatmccdsadsc: Empty docstring C: 72,4:testflatmccdsadsc.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 69,0:testflatmccdsadsc: Too many public methods (46/20) C: 97,0:test_suite_all_adsc: Missing docstring C: 98,4:test_suite_all_adsc: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:104,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:105,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 34,0: Unused import fabio Report ====== 65 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |14 |NC |NC | +-----------+-------+---------+-----------+ |refactor |2 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |9 | +-----------+------------+ |C0301 |3 | +-----------+------------+ |R0904 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |C0112 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.08/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |67 |63.81 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |16 |15.24 |NC |NC | +----------+-------+------+---------+-----------+ |comment |4 |3.81 |NC |NC | +----------+-------+------+---------+-----------+ |empty |18 |17.14 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |NC |NC |50.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |NC |NC |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testkcdimage.py.lint0000644000175000017500000000770612233243337020675 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testkcdimage C: 42,0: Line too long (88/80) C: 69,0: Line too long (81/80) C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 25,0: No exception type(s) specified W: 28,0: Relative import 'utilstest', should be 'test.utilstest' C: 38,0:testkcd: Invalid name "testkcd" (should match [A-Z_][a-zA-Z0-9]+$) C: 47,8:testkcd.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 45,4:testkcd.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) W: 56,8:testkcd.test_read: Unused variable 'name' R: 38,0:testkcd: Too many public methods (47/20) C: 77,0:test_suite_all_kcd: Missing docstring C: 78,4:test_suite_all_kcd: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 84,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 85,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 33,0: Unused import edfimage Report ====== 62 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |11 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |4 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |8 | +-----------+------------+ |C0301 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0612 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.42/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |61 |76.25 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |9 |11.25 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |2.50 |NC |NC | +----------+-------+------+---------+-----------+ |empty |8 |10.00 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |NC |NC |100.00 |33.33 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/test_file_series.py.lint0000644000175000017500000000766412233243340021556 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.test_file_series C: 12,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 13,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 27,0: No exception type(s) specified W: 30,0: Relative import 'utilstest', should be 'test.utilstest' C: 37,0:testrandomseries: Invalid name "testrandomseries" (should match [A-Z_][a-zA-Z0-9]+$) C: 39,4:testrandomseries.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 37,0:testrandomseries: Too many public methods (48/20) C: 55,0:testedfnumbered: Invalid name "testedfnumbered" (should match [A-Z_][a-zA-Z0-9]+$) C: 59,4:testedfnumbered.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 55,0:testedfnumbered: Too many public methods (52/20) C:106,0:test_suite_all_series: Missing docstring C:107,4:test_suite_all_series: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:125,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:126,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 33,4: Unused import fabio Report ====== 82 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |10 |NC |NC | +-----------+-------+---------+-----------+ |refactor |2 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |9 | +-----------+------------+ |R0904 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.17/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |81 |72.32 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |20 |17.86 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |1.79 |NC |NC | +----------+-------+------+---------+-----------+ |empty |9 |8.04 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |12 |NC |NC |100.00 |16.67 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/binaryimage.py.lint0000644000175000017500000000766312233243275020523 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module binaryimage C: 46,0: Line too long (98/80) C: 48,0: Line too long (98/80) C: 79,0: Line too long (113/80) C: 84,0: Line too long (86/80) C: 98,0: Line too long (81/80) W: 6,0: Redefining built-in '__doc__' C: 1,0: Missing docstring C: 25,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 27,0:binaryimage: Invalid name "binaryimage" (should match [A-Z_][a-zA-Z0-9]+$) R: 51,4:binaryimage.read: Too many arguments (7/5) W: 51,4:binaryimage.read: Arguments number differs from overridden method C: 68,8:binaryimage.read: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) C: 82,8:binaryimage.read: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C: 92,34:binaryimage.estimate_offset_value: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) R: 90,4:binaryimage.estimate_offset_value: Method could be a function R: 27,0:binaryimage: Too many public methods (27/20) Report ====== 53 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |11 |NC |NC | +-----------+-------+---------+-----------+ |refactor |3 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |5 | +-----------+------------+ |C0103 |5 | +-----------+------------+ |W0622 |1 | +-----------+------------+ |W0221 |1 | +-----------+------------+ |R0913 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0201 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.98/10 Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |65 |64.36 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |25 |24.75 |NC |NC | +----------+-------+------+---------+-----------+ |comment |3 |2.97 |NC |NC | +----------+-------+------+---------+-----------+ |empty |8 |7.92 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (binaryimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |5 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testmccdimage.py.lint0000644000175000017500000001044412233243326021031 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testmccdimage C: 50,0: Line too long (89/80) C: 63,0: Line too long (81/80) C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 25,0: No exception type(s) specified W: 28,0: Relative import 'utilstest', should be 'test.utilstest' C: 45,0:testnormaltifok: Invalid name "testnormaltifok" (should match [A-Z_][a-zA-Z0-9]+$) C: 51,4:testnormaltifok.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 60,4:testnormaltifok.test_read_openimage: Missing docstring R: 45,0:testnormaltifok: Too many public methods (46/20) C: 73,0:testflatmccds: Invalid name "testflatmccds" (should match [A-Z_][a-zA-Z0-9]+$) C: 75,8:testflatmccds.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 73,0:testflatmccds: Missing docstring C: 74,4:testflatmccds.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 73,0:testflatmccds: Too many public methods (46/20) C:103,0:test_suite_all_mccd: Missing docstring C:104,4:test_suite_all_mccd: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:110,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:111,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 31,0: Unused import fabio Report ====== 74 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |15 |NC |NC | +-----------+-------+---------+-----------+ |refactor |2 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |10 | +-----------+------------+ |C0111 |3 | +-----------+------------+ |R0904 |2 | +-----------+------------+ |C0301 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.30/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |80 |72.73 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |12 |10.91 |NC |NC | +----------+-------+------+---------+-----------+ |comment |4 |3.64 |NC |NC | +----------+-------+------+---------+-----------+ |empty |14 |12.73 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (test.testmccdimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |NC |NC |50.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |NC |NC |75.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testXSDimage.py.lint0000644000175000017500000001045012233243322020552 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testXSDimage C: 39,0: Line too long (82/80) C: 70,0: Line too long (91/80) C: 77,0: Line too long (102/80) C: 84,0: Line too long (103/80) C: 1,0: Invalid name "testXSDimage" (should match (([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$) C: 13,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 14,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 28,0: No exception type(s) specified W: 31,0: Relative import 'utilstest', should be 'test.utilstest' C: 42,0:testXSD: Invalid name "testXSD" (should match [A-Z_][a-zA-Z0-9]+$) C: 44,8:testXSD.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 42,0:testXSD: Missing docstring C: 43,4:testXSD.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 74,8:testXSD.test_invert: Invalid name "m1" (should match [a-z_][a-z0-9_]{2,30}$) C: 75,8:testXSD.test_invert: Invalid name "m2" (should match [a-z_][a-z0-9_]{2,30}$) R: 42,0:testXSD: Too many public methods (48/20) C: 81,0:test_suite_all_XSD: Invalid name "test_suite_all_XSD" (should match [a-z_][a-z0-9_]{2,30}$) C: 81,0:test_suite_all_XSD: Missing docstring C: 82,4:test_suite_all_XSD: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 93,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 94,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 68 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |18 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |12 | +-----------+------------+ |C0301 |4 | +-----------+------------+ |C0111 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.91/10 Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |72 |80.00 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |8 |8.89 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |2.22 |NC |NC | +----------+-------+------+---------+-----------+ |empty |8 |8.89 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (test.testXSDimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |NC |NC |100.00 |25.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testtifgz.py.lint0000644000175000017500000001045712233243332020244 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testtifgz C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 25,0: No exception type(s) specified W: 28,0: Relative import 'utilstest', should be 'test.utilstest' C: 34,0:testgziptif: Invalid name "testgziptif" (should match [A-Z_][a-zA-Z0-9]+$) C: 34,0:testgziptif: Missing docstring C: 35,4:testgziptif.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 41,4:testgziptif.test1: Missing docstring C: 42,8:testgziptif.test1: Invalid name "o1" (should match [a-z_][a-z0-9_]{2,30}$) C: 43,8:testgziptif.test1: Invalid name "o2" (should match [a-z_][a-z0-9_]{2,30}$) R: 34,0:testgziptif: Too many public methods (46/20) C: 48,0:testtif_rect: Invalid name "testtif_rect" (should match [A-Z_][a-zA-Z0-9]+$) C: 50,8:testtif_rect.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 48,0:testtif_rect: Missing docstring C: 49,4:testtif_rect.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 52,4:testtif_rect.test1: Missing docstring C: 54,12:testtif_rect.test1: Invalid name "o1" (should match [a-z_][a-z0-9_]{2,30}$) R: 48,0:testtif_rect: Too many public methods (46/20) C: 58,0:test_suite_all_tiff: Missing docstring C: 59,4:test_suite_all_tiff: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C: 65,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 66,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 49 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |18 |NC |NC | +-----------+-------+---------+-----------+ |refactor |2 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |13 | +-----------+------------+ |C0111 |5 | +-----------+------------+ |R0904 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.51/10 Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |48 |78.69 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |5 |8.20 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |3.28 |NC |NC | +----------+-------+------+---------+-----------+ |empty |6 |9.84 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |NC |NC |50.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/compression.py.lint0000644000175000017500000001433512233243273020565 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module compression C: 69,0: Line too long (101/80) C: 73,0: Line too long (127/80) C: 75,0: Line too long (120/80) C: 77,0: Line too long (97/80) C: 87,0: Line too long (105/80) C:162,0: Line too long (98/80) C:211,0: Line too long (110/80) C:273,0: Line too long (96/80) C:313,0: Line too long (89/80) C:319,0: Line too long (89/80) C:399,0: Line too long (83/80) C:420,0: Line too long (84/80) W: 17,4: Redefining built-in 'str' C: 17,4: Invalid name "str" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 18,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 25,4: Invalid name "gzip" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 31,4: Invalid name "bz2" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 37,4: Invalid name "zlib" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) E: 43,28:md5sum: Module 'hashlib' has no 'md5' member C: 56,0:decGzip: Invalid name "decGzip" (should match [a-z_][a-z0-9_]{2,30}$) C: 67,8:decGzip: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) W: 76,15:decGzip: Catching too general exception Exception C: 74,12:decGzip: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C: 81,20:decGzip: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C: 91,0:decBzip2: Invalid name "decBzip2" (should match [a-z_][a-z0-9_]{2,30}$) C:102,0:decZlib: Invalid name "decZlib" (should match [a-z_][a-z0-9_]{2,30}$) C:113,0:decByteOffet_python: Invalid name "decByteOffet_python" (should match [a-z_][a-z0-9_]{2,30}$) C:123,4:decByteOffet_python: Invalid name "dataOut" (should match [a-z_][a-z0-9_]{2,30}$) C:148,0:decByteOffet_weave: Invalid name "decByteOffet_weave" (should match [a-z_][a-z0-9_]{2,30}$) C:164,4:decByteOffet_weave: Invalid name "dataIn" (should match [a-z_][a-z0-9_]{2,30}$) C:165,4:decByteOffet_weave: Invalid name "n" (should match [a-z_][a-z0-9_]{2,30}$) C:166,4:decByteOffet_weave: Invalid name "dataOut" (should match [a-z_][a-z0-9_]{2,30}$) C:167,4:decByteOffet_weave: Invalid name "codeC" (should match [a-z_][a-z0-9_]{2,30}$) C:211,4:decByteOffet_weave: Invalid name "rc" (should match [a-z_][a-z0-9_]{2,30}$) W:165,4:decByteOffet_weave: Unused variable 'n' C:218,0:decByteOffet_numpy: Invalid name "decByteOffet_numpy" (should match [a-z_][a-z0-9_]{2,30}$) W:218,31:decByteOffet_numpy: Unused argument 'size' C:259,0:decByteOffet_cython: Invalid name "decByteOffet_cython" (should match [a-z_][a-z0-9_]{2,30}$) W:272,24:decByteOffet_cython: Unused variable 'error' C:278,0:compByteOffet_numpy: Invalid name "compByteOffet_numpy" (should match [a-z_][a-z0-9_]{2,30}$) R:278,0:compByteOffet_numpy: Too many branches (14/12) C:328,0:decTY1: Invalid name "decTY1" (should match [a-z_][a-z0-9_]{2,30}$) C:360,0: Invalid name "decKM4CCD" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:362,0:compTY1: Invalid name "compTY1" (should match [a-z_][a-z0-9_]{2,30}$) C:387,0:decPCK: Invalid name "decPCK" (should match [a-z_][a-z0-9_]{2,30}$) C:387,0:decPCK: Invalid name "overflowPix" (should match [a-z_][a-z0-9_]{2,30}$) C:387,41:decPCK: Invalid name "overflowPix" (should match [a-z_][a-z0-9_]{2,30}$) W:398,24:decPCK: Unused variable 'error' C:409,0:compPCK: Invalid name "compPCK" (should match [a-z_][a-z0-9_]{2,30}$) W:419,24:compPCK: Unused variable 'error' Report ====== 223 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |41 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |7 |NC |NC | +-----------+-------+---------+-----------+ |error |1 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |29 | +-----------+------------+ |C0301 |12 | +-----------+------------+ |W0612 |4 | +-----------+------------+ |W0703 |1 | +-----------+------------+ |W0622 |1 | +-----------+------------+ |W0613 |1 | +-----------+------------+ |R0912 |1 | +-----------+------------+ |E1101 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.58/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |284 |67.78 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |100 |23.87 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |0.48 |NC |NC | +----------+-------+------+---------+-----------+ |empty |33 |7.88 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (compression) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |14 |NC |NC |100.00 |85.71 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/fabioimage.py.lint0000644000175000017500000001437212233243300020277 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module fabioimage C: 92,0: Line too long (106/80) C:277,0: Line too long (83/80) C:291,0: Line too long (83/80) C:295,0: Line too long (85/80) C:319,0: Line too long (86/80) C:363,0: Line too long (94/80) C:414,0: Line too long (81/80) C:476,0: Line too long (95/80) C:477,0: Line too long (99/80) W:121,0: FIXME - this should be handled by the libraries now W:372,0: FIXME - what about seek ? W:397,0: FIXME - should we fix that or complain about the daft naming? C: 17,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 23,4: Invalid name "Image" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 27,0:fabioimage: Too many instance attributes (22/7) C: 27,0:fabioimage: Invalid name "fabioimage" (should match [A-Z_][a-zA-Z0-9]+$) C: 70,4:fabioimage.checkHeader: Invalid name "checkHeader" (should match [a-z_][a-z0-9_]{2,30}$) C: 80,4:fabioimage.checkData: Invalid name "checkData" (should match [a-z_][a-z0-9_]{2,30}$) C:117,4:fabioimage.toPIL16: Invalid name "toPIL16" (should match [a-z_][a-z0-9_]{2,30}$) C:261,4:fabioimage.rebin: Invalid name "keep_I" (should match [a-z_][a-z0-9_]{2,30}$) C:261,48:fabioimage.rebin: Invalid name "keep_I" (should match [a-z_][a-z0-9_]{2,30}$) C:280,12:fabioimage.rebin: Invalid name "dataIn" (should match [a-z_][a-z0-9_]{2,30}$) C:281,12:fabioimage.rebin: Invalid name "shapeIn" (should match [a-z_][a-z0-9_]{2,30}$) C:282,12:fabioimage.rebin: Invalid name "shapeOut" (should match [a-z_][a-z0-9_]{2,30}$) W:305,20:fabioimage.write: Unused argument 'fname' R:305,4:fabioimage.write: Method could be a function W:327,26:fabioimage._readheader: Unused argument 'fik_obj' R:327,4:fabioimage._readheader: Method could be a function W:340,29:fabioimage.read: Unused argument 'frame' W:340,19:fabioimage.read: Unused argument 'filename' R:340,4:fabioimage.read: Method could be a function C:351,4:fabioimage.readROI: Invalid name "readROI" (should match [a-z_][a-z0-9_]{2,30}$) C:374,8:fabioimage._open: Invalid name "fileObject" (should match [a-z_][a-z0-9_]{2,30}$) C:384,16:fabioimage._open: Invalid name "fileObject" (should match [a-z_][a-z0-9_]{2,30}$) C:389,16:fabioimage._open: Invalid name "fileObject" (should match [a-z_][a-z0-9_]{2,30}$) C:399,16:fabioimage._open: Invalid name "fileObject" (should match [a-z_][a-z0-9_]{2,30}$) C:418,12:fabioimage._compressed_stream: Invalid name "fo" (should match [a-z_][a-z0-9_]{2,30}$) C:428,12:fabioimage._compressed_stream: Invalid name "fo" (should match [a-z_][a-z0-9_]{2,30}$) W:407,27:fabioimage._compressed_stream: Unused argument 'system_uncompress' W:454,24:fabioimage.convert: No exception type(s) specified R:434,4:fabioimage.convert: Too many branches (15/12) R: 27,0:fabioimage: Too many public methods (25/20) R:480,0:test: Too many local variables (17/15) W:526,12:test.clean: No exception type(s) specified W:533,11:test: Access to a protected member _open of a client class W:539,11:test: Access to a protected member _open of a client class W:545,20:test: Access to a protected member _open of a client class W:547,11:test: Access to a protected member _open of a client class Report ====== 309 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |27 |19 |+8.00 | +-----------+-------+---------+-----------+ |refactor |7 |4 |+3.00 | +-----------+-------+---------+-----------+ |warning |14 |13 |+1.00 | +-----------+-------+---------+-----------+ |error |0 |15 |-15.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |18 | +-----------+------------+ |C0301 |9 | +-----------+------------+ |W0613 |5 | +-----------+------------+ |W0212 |4 | +-----------+------------+ |W0511 |3 | +-----------+------------+ |R0201 |3 | +-----------+------------+ |W0702 |2 | +-----------+------------+ |R0914 |1 | +-----------+------------+ |R0912 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.45/10 (previous run: 5.32/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |350 |66.16 |271 |+79.00 | +----------+-------+------+---------+-----------+ |docstring |119 |22.50 |104 |+15.00 | +----------+-------+------+---------+-----------+ |comment |15 |2.84 |14 |+1.00 | +----------+-------+------+---------+-----------+ |empty |45 |8.51 |41 |+4.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (fabioimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |2 |-1.00 |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |29 |23 |+6.00 |100.00 |13.79 | +---------+-------+-----------+-----------+------------+---------+ |function |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/adscimage.py.lint0000644000175000017500000000612212233243312020126 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module adscimage W: 91,0: FIXME ??? - made padding match header bytes keyword C: 18,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 20,0:adscimage: Invalid name "adscimage" (should match [A-Z_][a-zA-Z0-9]+$) R: 20,0:adscimage: Too many public methods (25/20) Report ====== 80 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |2 |2 |= | +-----------+-------+---------+-----------+ |refactor |1 |0 |+1.00 | +-----------+-------+---------+-----------+ |warning |1 |6 |-5.00 | +-----------+-------+---------+-----------+ |error |0 |31 |-31.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |2 | +-----------+------------+ |W0511 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 9.50/10 (previous run: -10.90/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |86 |64.66 |84 |+2.00 | +----------+-------+------+---------+-----------+ |docstring |24 |18.05 |24 |= | +----------+-------+------+---------+-----------+ |comment |9 |6.77 |9 |= | +----------+-------+------+---------+-----------+ |empty |14 |10.53 |16 |-2.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (adscimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |3 |+1.00 |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/cbfimage.py.lint0000644000175000017500000003741712233243307017765 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module cbfimage C: 7,0: Line too long (81/80) C: 88,0: Line too long (128/80) C:131,0: Line too long (91/80) C:140,0: Line too long (131/80) C:142,0: Line too long (115/80) C:166,0: Line too long (93/80) C:204,0: Line too long (84/80) C:217,0: Line too long (128/80) C:237,0: Line too long (102/80) C:296,0: Line too long (90/80) C:301,0: Line too long (102/80) C:339,0: Line too long (98/80) C:350,0: Line too long (107/80) C:354,0: Line too long (106/80) C:546,0: Line too long (93/80) C:547,0: Line too long (93/80) C:548,0: Line too long (93/80) C:550,0: Line too long (81/80) C:606,0: Line too long (92/80) C:634,0: Line too long (83/80) C:638,0: Line too long (87/80) C:703,0: Line too long (84/80) C:739,0: Line too long (99/80) C:741,0: Line too long (91/80) C: 23,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 46,0:cbfimage: Too many instance attributes (9/7) C: 46,0:cbfimage: Invalid name "cbfimage" (should match [A-Z_][a-zA-Z0-9]+$) C: 63,4:cbfimage.checkData: Invalid name "checkData" (should match [a-z_][a-z0-9_]{2,30}$) C: 72,4:cbfimage._readheader: Invalid name "inStream" (should match [a-z_][a-z0-9_]{2,30}$) C: 72,26:cbfimage._readheader: Invalid name "inStream" (should match [a-z_][a-z0-9_]{2,30}$) E: 88,117:cbfimage._readheader: Instance of 'cbfimage' has no 'fname' member C: 90,8:cbfimage._readheader: Invalid name "inStream2" (should match [a-z_][a-z0-9_]{2,30}$) C: 92,8:cbfimage._readheader: Invalid name "iSepPos" (should match [a-z_][a-z0-9_]{2,30}$) C: 97,12:cbfimage._readheader: Invalid name "oneLine" (should match [a-z_][a-z0-9_]{2,30}$) C:152,4:cbfimage._readbinary_byte_offset: Invalid name "inStream" (should match [a-z_][a-z0-9_]{2,30}$) C:152,38:cbfimage._readbinary_byte_offset: Invalid name "inStream" (should match [a-z_][a-z0-9_]{2,30}$) C:161,8:cbfimage._readbinary_byte_offset: Invalid name "startPos" (should match [a-z_][a-z0-9_]{2,30}$) C:167,12:cbfimage._readbinary_byte_offset: Invalid name "myData" (should match [a-z_][a-z0-9_]{2,30}$) C:169,12:cbfimage._readbinary_byte_offset: Invalid name "myData" (should match [a-z_][a-z0-9_]{2,30}$) C:215,12:cbfimage.write: Invalid name "nonCifHeaders" (should match [a-z_][a-z0-9_]{2,30}$) C:217,12:cbfimage.write: Invalid name "nonCifHeaders" (should match [a-z_][a-z0-9_]{2,30}$) R:175,4:cbfimage.write: Too many branches (17/12) R: 46,0:cbfimage: Too many public methods (25/20) C:255,4:CIF.__init__: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:255,23:CIF.__init__: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:283,4:CIF.loadCIF: Invalid name "loadCIF" (should match [a-z_][a-z0-9_]{2,30}$) C:283,4:CIF.loadCIF: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:283,4:CIF.loadCIF: Invalid name "_bKeepComment" (should match [a-z_][a-z0-9_]{2,30}$) C:283,22:CIF.loadCIF: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:283,36:CIF.loadCIF: Invalid name "_bKeepComment" (should match [a-z_][a-z0-9_]{2,30}$) C:309,4:CIF.isAscii: Invalid name "isAscii" (should match [a-z_][a-z0-9_]{2,30}$) C:309,4:CIF.isAscii: Invalid name "_strIn" (should match [a-z_][a-z0-9_]{2,30}$) C:309,16:CIF.isAscii: Invalid name "_strIn" (should match [a-z_][a-z0-9_]{2,30}$) C:318,8:CIF.isAscii: Invalid name "bIsAcii" (should match [a-z_][a-z0-9_]{2,30}$) C:321,16:CIF.isAscii: Invalid name "bIsAcii" (should match [a-z_][a-z0-9_]{2,30}$) C:327,4:CIF._readCIF: Invalid name "_readCIF" (should match [a-z_][a-z0-9_]{2,30}$) C:341,8:CIF._readCIF: Invalid name "lLinesRead" (should match [a-z_][a-z0-9_]{2,30}$) C:342,8:CIF._readCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:343,12:CIF._readCIF: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:344,12:CIF._readCIF: Invalid name "iPos" (should match [a-z_][a-z0-9_]{2,30}$) C:347,20:CIF._readCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:352,16:CIF._readCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:358,4:CIF._parseCIF: Invalid name "_parseCIF" (should match [a-z_][a-z0-9_]{2,30}$) C:358,4:CIF._parseCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:358,24:CIF._parseCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:374,8:CIF._parseCIF: Invalid name "lFields" (should match [a-z_][a-z0-9_]{2,30}$) C:387,16:CIF._parseCIF: Invalid name "f1" (should match [a-z_][a-z0-9_]{2,30}$) C:388,16:CIF._parseCIF: Invalid name "lFields" (should match [a-z_][a-z0-9_]{2,30}$) C:394,42:CIF._parseCIF: More than one statement on a single line C:399,4:CIF._splitCIF: Invalid name "_splitCIF" (should match [a-z_][a-z0-9_]{2,30}$) C:399,4:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:399,18:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:408,8:CIF._splitCIF: Invalid name "lFields" (should match [a-z_][a-z0-9_]{2,30}$) C:414,16:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:421,24:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:422,24:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:427,24:CIF._splitCIF: Invalid name "sText1" (should match [a-z_][a-z0-9_]{2,30}$) C:428,24:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:429,24:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:433,16:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:441,24:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:442,24:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:448,24:CIF._splitCIF: Invalid name "sText1" (should match [a-z_][a-z0-9_]{2,30}$) C:449,24:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:450,24:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:460,16:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:465,24:CIF._splitCIF: Invalid name "sText1" (should match [a-z_][a-z0-9_]{2,30}$) C:466,24:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) C:467,24:CIF._splitCIF: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:469,16:CIF._splitCIF: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) C:472,16:CIF._splitCIF: Invalid name "sText1" (should match [a-z_][a-z0-9_]{2,30}$) C:473,16:CIF._splitCIF: Invalid name "sText" (should match [a-z_][a-z0-9_]{2,30}$) R:399,4:CIF._splitCIF: Too many branches (18/12) R:399,4:CIF._splitCIF: Too many statements (53/50) C:478,4:CIF._analyseOneLoop: Invalid name "_analyseOneLoop" (should match [a-z_][a-z0-9_]{2,30}$) C:478,4:CIF._analyseOneLoop: Invalid name "lFields" (should match [a-z_][a-z0-9_]{2,30}$) C:478,4:CIF._analyseOneLoop: Invalid name "iStart" (should match [a-z_][a-z0-9_]{2,30}$) C:478,24:CIF._analyseOneLoop: Invalid name "lFields" (should match [a-z_][a-z0-9_]{2,30}$) C:478,33:CIF._analyseOneLoop: Invalid name "iStart" (should match [a-z_][a-z0-9_]{2,30}$) C:494,8:CIF._analyseOneLoop: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) C:500,16:CIF._analyseOneLoop: Invalid name "bFinished" (should match [a-z_][a-z0-9_]{2,30}$) R:478,4:CIF._analyseOneLoop: Too many branches (16/12) C:550,4:CIF.saveCIF: Invalid name "saveCIF" (should match [a-z_][a-z0-9_]{2,30}$) C:550,4:CIF.saveCIF: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:550,22:CIF.saveCIF: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:562,12:CIF.saveCIF: Invalid name "fFile" (should match [a-z_][a-z0-9_]{2,30}$) R:575,4:CIF.tostring: Too many local variables (16/15) C:575,4:CIF.tostring: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:575,23:CIF.tostring: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:585,8:CIF.tostring: Invalid name "lstStrCif" (should match [a-z_][a-z0-9_]{2,30}$) C:587,12:CIF.tostring: Invalid name "t" (should match [a-z_][a-z0-9_]{2,30}$) C:589,12:CIF.tostring: Invalid name "t" (should match [a-z_][a-z0-9_]{2,30}$) C:591,12:CIF.tostring: Invalid name "t" (should match [a-z_][a-z0-9_]{2,30}$) C:594,8:CIF.tostring: Invalid name "lKeys" (should match [a-z_][a-z0-9_]{2,30}$) C:601,12:CIF.tostring: Invalid name "sKey" (should match [a-z_][a-z0-9_]{2,30}$) C:608,12:CIF.tostring: Invalid name "sValue" (should match [a-z_][a-z0-9_]{2,30}$) C:610,16:CIF.tostring: Invalid name "lLine" (should match [a-z_][a-z0-9_]{2,30}$) C:612,16:CIF.tostring: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:614,20:CIF.tostring: Invalid name "lLine" (should match [a-z_][a-z0-9_]{2,30}$) C:616,20:CIF.tostring: Invalid name "lLine" (should match [a-z_][a-z0-9_]{2,30}$) C:618,16:CIF.tostring: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:620,20:CIF.tostring: Invalid name "lLine" (should match [a-z_][a-z0-9_]{2,30}$) C:622,20:CIF.tostring: Invalid name "lLine" (should match [a-z_][a-z0-9_]{2,30}$) C:623,12:CIF.tostring: Invalid name "lstStrCif" (should match [a-z_][a-z0-9_]{2,30}$) C:627,16:CIF.tostring: Invalid name "lKeys" (should match [a-z_][a-z0-9_]{2,30}$) C:628,16:CIF.tostring: Invalid name "llData" (should match [a-z_][a-z0-9_]{2,30}$) C:629,16:CIF.tostring: Invalid name "lstStrCif" (should match [a-z_][a-z0-9_]{2,30}$) C:630,20:CIF.tostring: Invalid name "lData" (should match [a-z_][a-z0-9_]{2,30}$) C:631,20:CIF.tostring: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:633,24:CIF.tostring: Invalid name "sRawValue" (should match [a-z_][a-z0-9_]{2,30}$) C:635,28:CIF.tostring: Invalid name "lstStrCif" (should match [a-z_][a-z0-9_]{2,30}$) C:636,28:CIF.tostring: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:643,32:CIF.tostring: Invalid name "lstStrCif" (should match [a-z_][a-z0-9_]{2,30}$) C:644,32:CIF.tostring: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:646,32:CIF.tostring: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) R:575,4:CIF.tostring: Too many branches (25/12) R:575,4:CIF.tostring: Too many statements (58/50) C:652,4:CIF.exists: Invalid name "sKey" (should match [a-z_][a-z0-9_]{2,30}$) C:652,21:CIF.exists: Invalid name "sKey" (should match [a-z_][a-z0-9_]{2,30}$) C:661,8:CIF.exists: Invalid name "bExists" (should match [a-z_][a-z0-9_]{2,30}$) C:665,20:CIF.exists: Invalid name "bExists" (should match [a-z_][a-z0-9_]{2,30}$) C:669,4:CIF.existsInLoop: Invalid name "existsInLoop" (should match [a-z_][a-z0-9_]{2,30}$) C:669,4:CIF.existsInLoop: Invalid name "sKey" (should match [a-z_][a-z0-9_]{2,30}$) C:669,27:CIF.existsInLoop: Invalid name "sKey" (should match [a-z_][a-z0-9_]{2,30}$) C:680,8:CIF.existsInLoop: Invalid name "bExists" (should match [a-z_][a-z0-9_]{2,30}$) C:685,24:CIF.existsInLoop: Invalid name "bExists" (should match [a-z_][a-z0-9_]{2,30}$) C:689,4:CIF.loadCHIPLOT: Invalid name "loadCHIPLOT" (should match [a-z_][a-z0-9_]{2,30}$) C:689,4:CIF.loadCHIPLOT: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:689,26:CIF.loadCHIPLOT: Invalid name "_strFilename" (should match [a-z_][a-z0-9_]{2,30}$) C:702,8:CIF.loadCHIPLOT: Invalid name "lInFile" (should match [a-z_][a-z0-9_]{2,30}$) C:707,12:CIF.loadCHIPLOT: Invalid name "iLenData" (should match [a-z_][a-z0-9_]{2,30}$) C:709,12:CIF.loadCHIPLOT: Invalid name "iLenData" (should match [a-z_][a-z0-9_]{2,30}$) C:710,8:CIF.loadCHIPLOT: Invalid name "lOneLoop" (should match [a-z_][a-z0-9_]{2,30}$) C:712,12:CIF.loadCHIPLOT: Invalid name "f2ThetaMin" (should match [a-z_][a-z0-9_]{2,30}$) C:714,16:CIF.loadCHIPLOT: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:717,12:CIF.loadCHIPLOT: Invalid name "f2ThetaMax" (should match [a-z_][a-z0-9_]{2,30}$) C:718,12:CIF.loadCHIPLOT: Invalid name "limitsOK" (should match [a-z_][a-z0-9_]{2,30}$) C:721,12:CIF.loadCHIPLOT: Invalid name "limitsOK" (should match [a-z_][a-z0-9_]{2,30}$) C:722,12:CIF.loadCHIPLOT: Invalid name "f2ThetaMin" (should match [a-z_][a-z0-9_]{2,30}$) C:723,12:CIF.loadCHIPLOT: Invalid name "f2ThetaMax" (should match [a-z_][a-z0-9_]{2,30}$) C:725,12:CIF.loadCHIPLOT: Invalid name "sLine" (should match [a-z_][a-z0-9_]{2,30}$) C:726,12:CIF.loadCHIPLOT: Invalid name "sCleaned" (should match [a-z_][a-z0-9_]{2,30}$) C:730,20:CIF.loadCHIPLOT: Invalid name "f2Theta" (should match [a-z_][a-z0-9_]{2,30}$) C:732,24:CIF.loadCHIPLOT: Invalid name "f2ThetaMin" (should match [a-z_][a-z0-9_]{2,30}$) C:734,24:CIF.loadCHIPLOT: Invalid name "f2ThetaMax" (should match [a-z_][a-z0-9_]{2,30}$) C:737,12:CIF.loadCHIPLOT: Invalid name "iLenData" (should match [a-z_][a-z0-9_]{2,30}$) C:743,12:CIF.loadCHIPLOT: Invalid name "f2ThetaMax" (should match [a-z_][a-z0-9_]{2,30}$) C:744,12:CIF.loadCHIPLOT: Invalid name "f2ThetaMin" (should match [a-z_][a-z0-9_]{2,30}$) C:752,4:CIF.LoopHasKey: Invalid name "LoopHasKey" (should match [a-z_][a-z0-9_]{2,30}$) R:245,0:CIF: Too many public methods (25/20) Report ====== 442 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |159 |168 |-9.00 | +-----------+-------+---------+-----------+ |refactor |10 |6 |+4.00 | +-----------+-------+---------+-----------+ |warning |0 |11 |-11.00 | +-----------+-------+---------+-----------+ |error |1 |22 |-21.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |134 | +-----------+------------+ |C0301 |24 | +-----------+------------+ |R0912 |4 | +-----------+------------+ |R0915 |2 | +-----------+------------+ |R0904 |2 | +-----------+------------+ |R0914 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |E1101 |1 | +-----------+------------+ |C0321 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.06/10 (previous run: 3.20/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |471 |64.08 |514 |-43.00 | +----------+-------+------+---------+-----------+ |docstring |172 |23.40 |173 |-1.00 | +----------+-------+------+---------+-----------+ |comment |17 |2.31 |15 |+2.00 | +----------+-------+------+---------+-----------+ |empty |75 |10.20 |92 |-17.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (cbfimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |2 |= |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |method |22 |21 |+1.00 |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/templateimage.py.lint0000644000175000017500000000771212233243301021033 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module templateimage C: 5,0: Line too long (117/80) C: 6,0: Line too long (91/80) C: 13,0: Line too long (94/80) C: 14,0: Line too long (91/80) C: 16,0: Line too long (99/80) C: 23,0: Line too long (83/80) C: 26,0: Line too long (81/80) C: 27,0: Line too long (81/80) C: 28,0: Line too long (84/80) C: 31,0: Line too long (99/80) C: 33,0: Line too long (102/80) W: 7,0: XXXimage where XXX means something (eg tifimage). W: 58,0: XXX detector W: 38,0: Redefining built-in '__doc__' C: 1,0: Missing docstring C: 53,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 56,0:templateimage: Too many instance attributes (10/7) C: 56,0:templateimage: Invalid name "templateimage" (should match [A-Z_][a-zA-Z0-9]+$) C: 68,8:templateimage.__init__: Invalid name "m" (should match [a-z_][a-z0-9_]{2,30}$) W: 72,26:templateimage._readheader: Unused argument 'infile' R: 56,0:templateimage: Too many public methods (25/20) Report ====== 29 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |15 |NC |NC | +-----------+-------+---------+-----------+ |refactor |2 |NC |NC | +-----------+-------+---------+-----------+ |warning |4 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0301 |11 | +-----------+------------+ |C0103 |3 | +-----------+------------+ |W0511 |2 | +-----------+------------+ |W0622 |1 | +-----------+------------+ |W0613 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 2.76/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |35 |36.08 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |16 |16.49 |NC |NC | +----------+-------+------+---------+-----------+ |comment |36 |37.11 |NC |NC | +----------+-------+------+---------+-----------+ |empty |10 |10.31 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (templateimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/fabioutils.py.lint0000644000175000017500000001531412233243314020357 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module fabioutils C: 82,0: Line too long (123/80) C: 95,0: Line too long (106/80) C:234,0: Line too long (81/80) C:444,0: Line too long (101/80) C:454,0: Line too long (84/80) C:493,0: Line too long (85/80) W:569,0: Bad indentation. Found 16 spaces, expected 12 W:572,0: Bad indentation. Found 16 spaces, expected 12 C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 51,0: Invalid name "dictAscii" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 61,7: Catching too general exception Exception C: 55,4: Invalid name "lines" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 71,7: Catching too general exception Exception C: 65,4: Invalid name "lines" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W:103,4:getnum: Unused variable 'stem' W:103,16:getnum: Unused variable 'post_num' R:109,0:FilenameObject: Too many instance attributes (8/7) R:113,4:FilenameObject.__init__: Too many arguments (9/5) W:116,12:FilenameObject.__init__: Redefining built-in 'format' W:207,19:FilenameObject.deconstruct_filename: Catching too general exception Exception W:228,23:FilenameObject.deconstruct_filename: Catching too general exception Exception R:182,4:FilenameObject.deconstruct_filename: Too many statements (60/50) C:313,0:isAscii: Invalid name "isAscii" (should match [a-z_][a-z0-9_]{2,30}$) C:313,0:isAscii: Invalid name "listExcluded" (should match [a-z_][a-z0-9_]{2,30}$) C:313,18:isAscii: Invalid name "listExcluded" (should match [a-z_][a-z0-9_]{2,30}$) W:339,12:toAscii: Redefining name 'i' from outer scope (line 51) C:331,0:toAscii: Invalid name "toAscii" (should match [a-z_][a-z0-9_]{2,30}$) E:343,29:toAscii: Unsupported format character 'n' (0x6e) at index 11 C:350,0:nice_int: Invalid name "s" (should match [a-z_][a-z0-9_]{2,30}$) C:350,13:nice_int: Invalid name "s" (should match [a-z_][a-z0-9_]{2,30}$) C:379,4:StringIO.getSize: Invalid name "getSize" (should match [a-z_][a-z0-9_]{2,30}$) C:379,4:StringIO.getSize: Missing docstring C:388,4:StringIO.setSize: Invalid name "setSize" (should match [a-z_][a-z0-9_]{2,30}$) C:388,4:StringIO.setSize: Missing docstring W:390,11:StringIO: Use of "property" on an old style class C:418,4:File.getSize: Invalid name "getSize" (should match [a-z_][a-z0-9_]{2,30}$) C:418,4:File.getSize: Missing docstring C:427,4:File.setSize: Invalid name "setSize" (should match [a-z_][a-z0-9_]{2,30}$) C:427,4:File.setSize: Missing docstring C:448,4: Invalid name "GzipFile" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:488,12:GzipFile.getSize: Invalid name "getSize" (should match [a-z_][a-z0-9_]{2,30}$) C:488,12:GzipFile.getSize: Missing docstring C:491,54:GzipFile.getSize: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) E:493,38:GzipFile.getSize: Undefined variable 'numpy' E:493,72:GzipFile.getSize: Undefined variable 'numpy' C:495,12:GzipFile.setSize: Invalid name "setSize" (should match [a-z_][a-z0-9_]{2,30}$) C:495,12:GzipFile.setSize: Missing docstring R:450,4:GzipFile: Too many public methods (24/20) C:532,4: Invalid name "BZ2File" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W:561,20:BZ2File.getSize: Redefining built-in 'all' C:556,8:BZ2File.getSize: Invalid name "getSize" (should match [a-z_][a-z0-9_]{2,30}$) C:556,8:BZ2File.getSize: Missing docstring W:561,20:BZ2File.getSize: Unused variable 'all' C:565,8:BZ2File.setSize: Invalid name "setSize" (should match [a-z_][a-z0-9_]{2,30}$) C:565,8:BZ2File.setSize: Missing docstring Report ====== 297 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |35 |30 |+5.00 | +-----------+-------+---------+-----------+ |refactor |4 |3 |+1.00 | +-----------+-------+---------+-----------+ |warning |13 |19 |-6.00 | +-----------+-------+---------+-----------+ |error |3 |13 |-10.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |21 | +-----------+------------+ |C0111 |8 | +-----------+------------+ |C0301 |6 | +-----------+------------+ |W0703 |4 | +-----------+------------+ |W0612 |3 | +-----------+------------+ |W0622 |2 | +-----------+------------+ |W0311 |2 | +-----------+------------+ |E0602 |2 | +-----------+------------+ |W1001 |1 | +-----------+------------+ |W0621 |1 | +-----------+------------+ |R0915 |1 | +-----------+------------+ |R0913 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |E1300 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.74/10 (previous run: 5.36/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |324 |56.94 |283 |+41.00 | +----------+-------+------+---------+-----------+ |docstring |187 |32.86 |149 |+38.00 | +----------+-------+------+---------+-----------+ |comment |8 |1.41 |33 |-25.00 | +----------+-------+------+---------+-----------+ |empty |50 |8.79 |40 |+10.00 | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |6 |6 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |25 |15 |+10.00 |68.00 |32.00 | +---------+-------+-----------+-----------+------------+---------+ |function |14 |11 |+3.00 |100.00 |14.29 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testopenimage.py.lint0000644000175000017500000001527412233243334021071 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testopenimage C: 54,0: Line too long (84/80) C: 81,0: Line too long (84/80) C:112,0: Line too long (84/80) C:113,0: Line too long (84/80) C:140,0: Line too long (84/80) C:166,0: Line too long (84/80) C:193,0: Line too long (84/80) C: 9,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 10,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 24,0: No exception type(s) specified W: 27,0: Relative import 'utilstest', should be 'test.utilstest' W: 32,0: Relative import 'utilstest', should be 'test.utilstest' W: 32,0: Reimport 'UtilsTest' (imported line 27) C: 41,0:testopenedf: Invalid name "testopenedf" (should match [A-Z_][a-zA-Z0-9]+$) C: 44,4:testopenedf.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 41,0:testopenedf: Too many public methods (46/20) C: 58,0:testedfgz: Invalid name "testedfgz" (should match [A-Z_][a-zA-Z0-9]+$) R: 58,0:testedfgz: Too many public methods (46/20) C: 63,0:testedfbz2: Invalid name "testedfbz2" (should match [A-Z_][a-zA-Z0-9]+$) R: 63,0:testedfbz2: Too many public methods (46/20) C: 69,0:testopenmccd: Invalid name "testopenmccd" (should match [A-Z_][a-zA-Z0-9]+$) C: 72,4:testopenmccd.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 69,0:testopenmccd: Too many public methods (46/20) C: 85,0:testmccdgz: Invalid name "testmccdgz" (should match [A-Z_][a-zA-Z0-9]+$) R: 85,0:testmccdgz: Too many public methods (46/20) C: 90,0:testmccdbz2: Invalid name "testmccdbz2" (should match [A-Z_][a-zA-Z0-9]+$) R: 90,0:testmccdbz2: Too many public methods (46/20) C: 98,0:testmask: Invalid name "testmask" (should match [A-Z_][a-zA-Z0-9]+$) C:101,4:testmask.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 98,0:testmask: Too many public methods (46/20) C:116,0:testmaskgz: Invalid name "testmaskgz" (should match [A-Z_][a-zA-Z0-9]+$) R:116,0:testmaskgz: Too many public methods (46/20) C:120,0:testmaskbz2: Invalid name "testmaskbz2" (should match [A-Z_][a-zA-Z0-9]+$) R:120,0:testmaskbz2: Too many public methods (46/20) C:128,0:testbruker: Invalid name "testbruker" (should match [A-Z_][a-zA-Z0-9]+$) C:131,4:testbruker.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R:128,0:testbruker: Too many public methods (46/20) C:143,0:testbrukergz: Invalid name "testbrukergz" (should match [A-Z_][a-zA-Z0-9]+$) R:143,0:testbrukergz: Too many public methods (46/20) C:147,0:testbrukerbz2: Invalid name "testbrukerbz2" (should match [A-Z_][a-zA-Z0-9]+$) R:147,0:testbrukerbz2: Too many public methods (46/20) C:154,0:testadsc: Invalid name "testadsc" (should match [A-Z_][a-zA-Z0-9]+$) C:157,4:testadsc.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R:154,0:testadsc: Too many public methods (46/20) C:169,0:testadscgz: Invalid name "testadscgz" (should match [A-Z_][a-zA-Z0-9]+$) R:169,0:testadscgz: Too many public methods (46/20) C:173,0:testadscbz2: Invalid name "testadscbz2" (should match [A-Z_][a-zA-Z0-9]+$) R:173,0:testadscbz2: Too many public methods (46/20) C:181,0:testOXD: Invalid name "testOXD" (should match [A-Z_][a-zA-Z0-9]+$) C:184,4:testOXD.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R:181,0:testOXD: Too many public methods (46/20) C:197,0:testOXDUNC: Invalid name "testOXDUNC" (should match [A-Z_][a-zA-Z0-9]+$) C:200,4:testOXDUNC.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R:197,0:testOXDUNC: Too many public methods (46/20) C:204,0:test_suite_all_openimage: Missing docstring C:205,4:test_suite_all_openimage: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:232,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:233,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 30,0: Unused import fabio Report ====== 145 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |37 |NC |NC | +-----------+-------+---------+-----------+ |refactor |17 |NC |NC | +-----------+-------+---------+-----------+ |warning |5 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |29 | +-----------+------------+ |R0904 |17 | +-----------+------------+ |C0301 |7 | +-----------+------------+ |W0403 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0404 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.93/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |144 |68.57 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |29 |13.81 |NC |NC | +----------+-------+------+---------+-----------+ |comment |4 |1.90 |NC |NC | +----------+-------+------+---------+-----------+ |empty |33 |15.71 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |17 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |13 |NC |NC |100.00 |53.85 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testbrukerimage.py.lint0000644000175000017500000001170512233243320021410 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testbrukerimage C: 98,0: Line too long (93/80) C:107,0: Line too long (90/80) C:125,0: Line too long (88/80) C:143,0: Line too long (82/80) C:175,0: Line too long (86/80) C:180,0: Line too long (102/80) C:182,0: Line too long (164/80) C: 10,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 11,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 25,0: No exception type(s) specified W: 28,0: Relative import 'utilstest', should be 'test.utilstest' W: 35,0: Reimport 'tempfile' (imported line 9) C: 60,0:testbruker: Invalid name "testbruker" (should match [A-Z_][a-zA-Z0-9]+$) C: 64,4:testbruker.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 60,0:testbruker: Too many public methods (46/20) C: 92,0:testbzipbruker: Invalid name "testbzipbruker" (should match [A-Z_][a-zA-Z0-9]+$) C: 94,4:testbzipbruker.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 92,0:testbzipbruker: Too many public methods (46/20) C:101,0:testgzipbruker: Invalid name "testgzipbruker" (should match [A-Z_][a-zA-Z0-9]+$) C:103,4:testgzipbruker.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R:101,0:testgzipbruker: Too many public methods (46/20) C:112,0:testbrukerLinear: Invalid name "testbrukerLinear" (should match [A-Z_][a-zA-Z0-9]+$) R:112,0:testbrukerLinear: Too many public methods (46/20) C:136,0:test_real_im: Invalid name "test_real_im" (should match [A-Z_][a-zA-Z0-9]+$) C:138,4:test_real_im.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R:136,0:test_real_im: Too many public methods (47/20) C:184,0:test_suite_all_bruker: Missing docstring C:185,4:test_suite_all_bruker: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:195,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:196,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 31,0: Unused import fabio Report ====== 131 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |22 |NC |NC | +-----------+-------+---------+-----------+ |refactor |5 |NC |NC | +-----------+-------+---------+-----------+ |warning |4 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |14 | +-----------+------------+ |C0301 |7 | +-----------+------------+ |R0904 |5 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0404 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.63/10 Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |138 |75.00 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |27 |14.67 |NC |NC | +----------+-------+------+---------+-----------+ |comment |6 |3.26 |NC |NC | +----------+-------+------+---------+-----------+ |empty |13 |7.07 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (test.testbrukerimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |5 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |8 |NC |NC |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testfabioimage.py.lint0000644000175000017500000001262212233243335021203 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testfabioimage C:100,0: Line too long (90/80) C:198,0: Line too long (81/80) C: 9,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 10,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 24,0: No exception type(s) specified W: 27,0: Relative import 'utilstest', should be 'test.utilstest' C: 35,0:test50000: Invalid name "test50000" (should match [A-Z_][a-zA-Z0-9]+$) C: 37,4:test50000.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 35,0:test50000: Too many public methods (49/20) C: 61,0:testslices: Invalid name "testslices" (should match [A-Z_][a-zA-Z0-9]+$) C: 63,4:testslices.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 94,4:testslices.testRebin: Invalid name "testRebin" (should match [a-z_][a-z0-9_]{2,30}$) R: 61,0:testslices: Too many public methods (49/20) C:103,0:testopen: Invalid name "testopen" (should match [A-Z_][a-zA-Z0-9]+$) C:106,4:testopen.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C:116,4:testopen.testFlat: Invalid name "testFlat" (should match [a-z_][a-z0-9_]{2,30}$) W:118,14:testopen.testFlat: Access to a protected member _open of a client class W:123,14:testopen.testgz: Access to a protected member _open of a client class W:128,14:testopen.testbz2: Access to a protected member _open of a client class R:103,0:testopen: Too many public methods (48/20) C:142,0:testPILimage: Invalid name "testPILimage" (should match [A-Z_][a-zA-Z0-9]+$) C:144,4:testPILimage.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R:155,4:testPILimage.mkdata: Method could be a function C:160,4:testPILimage.testpil: Missing docstring R:142,0:testPILimage: Too many public methods (47/20) C:188,0:testPILimage2: Invalid name "testPILimage2" (should match [A-Z_][a-zA-Z0-9]+$) R:188,0:testPILimage2: Too many public methods (47/20) C:194,0:testPILimage3: Invalid name "testPILimage3" (should match [A-Z_][a-zA-Z0-9]+$) R:194,0:testPILimage3: Too many public methods (47/20) C:200,0:test_suite_all_fabio: Missing docstring C:201,4:test_suite_all_fabio: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:225,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:226,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 30,0: Unused import fabio Report ====== 136 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |21 |NC |NC | +-----------+-------+---------+-----------+ |refactor |7 |NC |NC | +-----------+-------+---------+-----------+ |warning |6 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |17 | +-----------+------------+ |R0904 |6 | +-----------+------------+ |W0212 |3 | +-----------+------------+ |C0301 |2 | +-----------+------------+ |C0111 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0611 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0201 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.50/10 Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |154 |78.97 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |29 |14.87 |NC |NC | +----------+-------+------+---------+-----------+ |comment |3 |1.54 |NC |NC | +----------+-------+------+---------+-----------+ |empty |9 |4.62 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (test.testfabioimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |6 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |19 |NC |NC |94.74 |31.58 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/profile_compressed.py.lint0000644000175000017500000001105212233243327022101 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.profile_compressed W: 10,0: No exception type(s) specified C: 18,0: Invalid name "npts" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 19,0: Invalid name "data" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 20,0: Invalid name "sdata" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 20,8: Used * or ** magic C: 33,4:tst: Invalid name "fo" (should match [a-z_][a-z0-9_]{2,30}$) C: 40,0: Invalid name "start" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 42,0: Invalid name "p" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 49,0: Invalid name "p" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 55,4:tstsys: Invalid name "fo" (should match [a-z_][a-z0-9_]{2,30}$) C: 61,0: Invalid name "p" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 67,0: Invalid name "p" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 74,0: Invalid name "cl" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 97,4: Invalid name "start" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 98,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:101,4: Invalid name "start" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:102,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:105,4: Invalid name "start" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:106,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:109,4: Invalid name "start" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:110,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:116,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:120,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:124,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:128,4: Invalid name "s" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 6,0: Unused import bz2 W: 6,0: Unused import gzip Report ====== 93 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |23 |NC |NC | +-----------+-------+---------+-----------+ |refactor |0 |NC |NC | +-----------+-------+---------+-----------+ |warning |4 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |23 | +-----------+------------+ |W0611 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0142 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.10/10 Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |88 |72.73 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |17 |14.05 |NC |NC | +----------+-------+------+---------+-----------+ |comment |1 |0.83 |NC |NC | +----------+-------+------+---------+-----------+ |empty |15 |12.40 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |2 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/openimage.py.lint0000644000175000017500000000737012233243310020161 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module openimage C: 77,0: Line too long (92/80) C: 96,0: Line too long (84/80) C: 14,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 90,15:openimage: Catching too general exception Exception W:120,15:_openimage: Access to a protected member _open of a client class W: 22,0: Unused import fit2dmaskimage W: 32,0: Unused import kcdimage W: 24,0: Unused import bruker100image W: 35,0: Unused import binaryimage W: 30,0: Unused import pilatusimage W: 29,0: Unused import HiPiCimage W: 18,0: Unused import adscimage W: 21,0: Unused import mar345image W: 31,0: Unused import fit2dspreadsheetimage W: 25,0: Unused import pnmimage W: 28,0: Unused import dm3image W: 34,0: Unused import xsdimage W: 20,0: Unused import marccdimage W: 26,0: Unused import GEimage W: 33,0: Unused import cbfimage W: 17,0: Unused import edfimage W: 27,0: Unused import OXDimage W: 19,0: Unused import tifimage W: 23,0: Unused import brukerimage Report ====== 89 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |3 |2 |+1.00 | +-----------+-------+---------+-----------+ |refactor |0 |0 |= | +-----------+-------+---------+-----------+ |warning |21 |22 |-1.00 | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |W0611 |19 | +-----------+------------+ |C0301 |2 | +-----------+------------+ |W0703 |1 | +-----------+------------+ |W0212 |1 | +-----------+------------+ |C0103 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.30/10 (previous run: 6.96/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |116 |72.96 |102 |+14.00 | +----------+-------+------+---------+-----------+ |docstring |19 |11.95 |19 |= | +----------+-------+------+---------+-----------+ |comment |10 |6.29 |11 |-1.00 | +----------+-------+------+---------+-----------+ |empty |14 |8.81 |15 |-1.00 | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |4 |4 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/readbytestream.py.lint0000644000175000017500000000535412120434325021233 0ustar jeromejerome00000000000000************* Module readbytestream W: 49,0: TODO : Read in regions of interest Report ====== 27 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |0 |0 |= | +-----------+-------+---------+-----------+ |refactor |0 |0 |= | +-----------+-------+---------+-----------+ |warning |1 |1 |= | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |W0511 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 9.63/10 (previous run: 9.63/10) So close to being perfect... Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |46 |56.79 |46 |= | +----------+-------+------+---------+-----------+ |docstring |25 |30.86 |25 |= | +----------+-------+------+---------+-----------+ |comment |4 |4.94 |4 |= | +----------+-------+------+---------+-----------+ |empty |6 |7.41 |6 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (readbytestream) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/marccdimage.py.lint0000644000175000017500000000576612233243272020467 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module marccdimage C: 28,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W:234,4:make_format: Unused variable 'expected' C:291,0:marccdimage: Invalid name "marccdimage" (should match [A-Z_][a-zA-Z0-9]+$) R:291,0:marccdimage: Too many public methods (25/20) Report ====== 63 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |2 |2 |= | +-----------+-------+---------+-----------+ |refactor |1 |1 |= | +-----------+-------+---------+-----------+ |warning |1 |3 |-2.00 | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |2 | +-----------+------------+ |W0612 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 9.37/10 (previous run: 9.05/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |236 |75.88 |236 |= | +----------+-------+------+---------+-----------+ |docstring |45 |14.47 |41 |+4.00 | +----------+-------+------+---------+-----------+ |comment |9 |2.89 |9 |= | +----------+-------+------+---------+-----------+ |empty |21 |6.75 |21 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |2 |2 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/TiffIO.py.lint0000644000175000017500000002434612120434325017342 0ustar jeromejerome00000000000000************* Module TiffIO C: 1,0: Too many lines in module (1197) C: 1,0: Missing docstring C:122,12:TiffIO._initInternalVariables: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C: 94,0:TiffIO: Missing docstring W: 95,23:TiffIO.__init__: Redefining name 'filename' from outer scope (line 1170) C:107,12:TiffIO.__init__: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:111,12:TiffIO.__init__: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:118,4:TiffIO._initInternalVariables: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:118,4:TiffIO._initInternalVariables: Missing docstring C:118,37:TiffIO._initInternalVariables: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:120,12:TiffIO._initInternalVariables: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:137,12:TiffIO._initInternalVariables: Invalid name "a" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:162,4:TiffIO.__makeSureFileIsOpen: Missing docstring C:176,4:TiffIO.__makeSureFileIsClosed: Missing docstring C:186,4:TiffIO.getNumberOfImages: Missing docstring C:191,4:TiffIO._updateIFD: Missing docstring C:196,4:TiffIO.getImageFileDirectories: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:196,4:TiffIO.getImageFileDirectories: Missing docstring C:196,38:TiffIO.getImageFileDirectories: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:198,12:TiffIO.getImageFileDirectories: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:201,8:TiffIO.getImageFileDirectories: Invalid name "st" (should match [a-z_][a-zA-Z0-9_]{2,30}$) W:247,12:TiffIO._parseImageFileDirectory: Redefining name 'i' from outer scope (line 1186) C:232,4:TiffIO._parseImageFileDirectory: Missing docstring C:234,8:TiffIO._parseImageFileDirectory: Invalid name "st" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:235,8:TiffIO._parseImageFileDirectory: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) W:247,12:TiffIO._parseImageFileDirectory: Unused variable 'i' C:280,4:TiffIO._readIFDEntry: Missing docstring C:281,8:TiffIO._readIFDEntry: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:282,8:TiffIO._readIFDEntry: Invalid name "st" (should match [a-z_][a-zA-Z0-9_]{2,30}$) W:286,8:TiffIO._readIFDEntry: Unused variable 'ftype' W:294,12:TiffIO._readIFDEntry: Unused variable 'offset' C:298,4:TiffIO.getData: Missing docstring C:304,4:TiffIO.getImage: Missing docstring C:307,4:TiffIO.getInfo: Missing docstring W:311,8:TiffIO.getInfo: Unused variable 'current' W:307,0:TiffIO.getInfo: Unused argument 'kw' R:314,4:TiffIO._readInfo: Too many local variables (37/25) W:490,16:TiffIO._readInfo: Redefining name 'key' from outer scope (line 1188) W:460,8:TiffIO._readInfo: Redefining name 'info' from outer scope (line 1187) W:489,16:TiffIO._readInfo: Redefining name 'i' from outer scope (line 1186) C:314,4:TiffIO._readInfo: Missing docstring E:347,36:TiffIO._readInfo: Instance of 'list' has no 'shape' member (but some types could not be inferred) E:347,63:TiffIO._readInfo: Instance of 'list' has no 'dtype' member (but some types could not be inferred) E:348,29:TiffIO._readInfo: Instance of 'list' has no 'T' member (but some types could not be inferred) W:411,12:TiffIO._readInfo: No exception type(s) specified E:404,23:TiffIO._readInfo: Instance of 'list' has no 'upper' member (but some types could not be inferred) E:405,35:TiffIO._readInfo: Instance of 'list' has no 'split' member (but some types could not be inferred) E:407,32:TiffIO._readInfo: Instance of 'list' has no 'decode' member (but some types could not be inferred) C:438,20:TiffIO._readInfo: Invalid name "n" (should match [a-z_][a-zA-Z0-9_]{2,30}$) E:485,40:TiffIO._readInfo: Instance of 'list' has no 'decode' member (but some types could not be inferred) R:314,4:TiffIO._readInfo: Too many branches (51/15) R:314,4:TiffIO._readInfo: Too many statements (143/50) R:504,4:TiffIO._readImage: Too many local variables (35/25) W:583,16:TiffIO._readImage: Redefining name 'dtype' from outer scope (line 1171) W:525,12:TiffIO._readImage: Redefining name 'info' from outer scope (line 1187) W:643,16:TiffIO._readImage: Redefining name 'i' from outer scope (line 1186) C:504,4:TiffIO._readImage: Missing docstring E:573,12:TiffIO._readImage: NotImplemented raised - should raise NotImplementedError C:620,8:TiffIO._readImage: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:621,8:TiffIO._readImage: Invalid name "st" (should match [a-z_][a-zA-Z0-9_]{2,30}$) W:659,20:TiffIO._readImage: No exception type(s) specified C:667,24:TiffIO._readImage: Invalid name "n" (should match [a-z_][a-zA-Z0-9_]{2,30}$) R:504,4:TiffIO._readImage: Too many branches (77/15) R:504,4:TiffIO._readImage: Too many statements (190/50) W:742,33:TiffIO.writeImage: Redefining name 'info' from outer scope (line 1187) W:816,16:TiffIO.writeImage: Redefining name 'key' from outer scope (line 1188) C:742,4:TiffIO.writeImage: Missing docstring C:749,8:TiffIO.writeImage: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:768,12:TiffIO.writeImage: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:771,12:TiffIO.writeImage: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:777,8:TiffIO.writeImage: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:787,8:TiffIO.writeImage: Invalid name "st" (should match [a-z_][a-zA-Z0-9_]{2,30}$) R:742,4:TiffIO.writeImage: Too many branches (16/15) R:742,4:TiffIO.writeImage: Too many statements (67/50) C:837,4:TiffIO._initEmptyFile: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:837,4:TiffIO._initEmptyFile: Missing docstring C:837,29:TiffIO._initEmptyFile: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:839,12:TiffIO._initEmptyFile: Invalid name "fd" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C:850,8:TiffIO._initEmptyFile: Invalid name "st" (should match [a-z_][a-zA-Z0-9_]{2,30}$) R:866,4:TiffIO._getOutputIFD: Too many local variables (34/25) W:930,8:TiffIO._getOutputIFD: Redefining name 'dtype' from outer scope (line 1171) W:1023,8:TiffIO._getOutputIFD: Redefining name 'info' from outer scope (line 1187) W:999,16:TiffIO._getOutputIFD: Redefining name 'i' from outer scope (line 1186) C:866,4:TiffIO._getOutputIFD: Missing docstring C:989,8:TiffIO._getOutputIFD: Invalid name "st" (should match [a-z_][a-zA-Z0-9_]{2,30}$) R:866,4:TiffIO._getOutputIFD: Too many branches (54/15) R:866,4:TiffIO._getOutputIFD: Too many statements (177/50) W:501,16:TiffIO._readInfo: Attribute '_imageInfoCache' defined outside __init__ W:849,12:TiffIO._initEmptyFile: Attribute '_structChar' defined outside __init__ W:203,8:TiffIO.getImageFileDirectories: Attribute '_IFD' defined outside __init__ W:738,16:TiffIO._readImage: Attribute '_imageDataCache' defined outside __init__ W:737,16:TiffIO._readImage: Attribute '_imageDataCacheIndex' defined outside __init__ W:834,8:TiffIO.writeImage: Attribute 'fd' defined outside __init__ W:854,12:TiffIO._initEmptyFile: Attribute '_swap' defined outside __init__ W:500,16:TiffIO._readInfo: Attribute '_imageInfoCacheIndex' defined outside __init__ Report ====== 797 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |48 |48 |= | +-----------+-------+---------+-----------+ |refactor |11 |11 |= | +-----------+-------+---------+-----------+ |warning |28 |28 |= | +-----------+-------+---------+-----------+ |error |8 |8 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |29 | +-----------+------------+ |C0111 |18 | +-----------+------------+ |W0621 |13 | +-----------+------------+ |W0201 |8 | +-----------+------------+ |E1103 |7 | +-----------+------------+ |W0612 |4 | +-----------+------------+ |R0915 |4 | +-----------+------------+ |R0912 |4 | +-----------+------------+ |R0914 |3 | +-----------+------------+ |W0702 |2 | +-----------+------------+ |W0613 |1 | +-----------+------------+ |E0711 |1 | +-----------+------------+ |C0302 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.41/10 (previous run: 8.41/10) That's pretty good. Good work mate. Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |959 |87.82 |959 |= | +----------+-------+------+---------+-----------+ |docstring |11 |1.01 |11 |= | +----------+-------+------+---------+-----------+ |comment |62 |5.68 |62 |= | +----------+-------+------+---------+-----------+ |empty |60 |5.49 |60 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |17 |17 |= |5.88 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ External dependencies --------------------- :: numpy (TiffIO) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ fabio-0.1.3/pylint/bruker100image.py.lint0000644000175000017500000000767112233243316020745 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module bruker100image C: 58,0: Line too long (81/80) C: 66,0: Line too long (89/80) C: 1,0: Missing docstring C: 4,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 9,4: Invalid name "Image" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 14,0:bruker100image: Invalid name "bruker100image" (should match [A-Z_][a-zA-Z0-9]+$) C: 14,0:bruker100image: Missing docstring C: 17,4:bruker100image.toPIL16: Invalid name "toPIL16" (should match [a-z_][a-z0-9_]{2,30}$) C: 23,8:bruker100image.toPIL16: Invalid name "PILimage" (should match [a-z_][a-z0-9_]{2,30}$) C: 31,8:bruker100image.read: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) C: 58,12:bruker100image.read: Invalid name "ar" (should match [a-z_][a-z0-9_]{2,30}$) C: 66,12:bruker100image.read: Invalid name "M" (should match [a-z_][a-z0-9_]{2,30}$) R: 14,0:bruker100image: Too many public methods (29/20) C: 85,4: Invalid name "b" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 88,8: Invalid name "r" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 95,4: Invalid name "e" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 61 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |15 |16 |-1.00 | +-----------+-------+---------+-----------+ |refactor |1 |0 |+1.00 | +-----------+-------+---------+-----------+ |warning |0 |6 |-6.00 | +-----------+-------+---------+-----------+ |error |0 |22 |-22.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |11 | +-----------+------------+ |C0301 |2 | +-----------+------------+ |C0111 |2 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.38/10 (previous run: -14.00/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |66 |76.74 |63 |+3.00 | +----------+-------+------+---------+-----------+ |docstring |5 |5.81 |7 |-2.00 | +----------+-------+------+---------+-----------+ |comment |7 |8.14 |7 |= | +----------+-------+------+---------+-----------+ |empty |8 |9.30 |10 |-2.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (bruker100image) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |2 |2 |= |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/fit2dmaskimage.py.lint0000644000175000017500000000600012233243305021075 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module fit2dmaskimage C: 15,0:fit2dmaskimage: Invalid name "fit2dmaskimage" (should match [A-Z_][a-zA-Z0-9]+$) C: 90,4:fit2dmaskimage.checkData: Invalid name "checkData" (should match [a-z_][a-z0-9_]{2,30}$) R: 15,0:fit2dmaskimage: Too many public methods (25/20) Report ====== 43 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |2 |1 |+1.00 | +-----------+-------+---------+-----------+ |refactor |1 |1 |= | +-----------+-------+---------+-----------+ |warning |0 |8 |-8.00 | +-----------+-------+---------+-----------+ |error |0 |18 |-18.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |2 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 9.30/10 (previous run: -16.32/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |50 |56.18 |43 |+7.00 | +----------+-------+------+---------+-----------+ |docstring |18 |20.22 |18 |= | +----------+-------+------+---------+-----------+ |comment |7 |7.87 |7 |= | +----------+-------+------+---------+-----------+ |empty |14 |15.73 |14 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (fit2dmaskimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |3 |+1.00 |100.00 |25.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/fabian_mar_header.py.lint0000644000175000017500000006346712120434325021620 0ustar jeromejerome00000000000000************* Module fabian_mar_header C: 11:obselete: Invalid name "obselete" (should match [A-Z_][a-zA-Z0-9]+$) C: 11:obselete: Missing docstring W: 11:obselete: Class has no __init__ method C: 18:obselete._readheader_fabian: Invalid name "l" (should match [a-z_][a-zA-Z0-9_]{2,30}$) C: 19:obselete._readheader_fabian: Invalid name "l" (should match [a-z_][a-zA-Z0-9_]{2,30}$) E: 24:obselete._readheader_fabian: Undefined variable 'N' E: 24:obselete._readheader_fabian: Undefined variable 'N' C: 27:obselete._readheader_fabian: Comma not followed by a space self.header['header_major_version'] = N.fromstring(l[20:24],N.uint32)[0] # UINT32 ; /* header_major_version (n.) */ ^^ E: 27:obselete._readheader_fabian: Undefined variable 'N' E: 27:obselete._readheader_fabian: Undefined variable 'N' C: 28:obselete._readheader_fabian: Comma not followed by a space self.header['header_minor_version'] = N.fromstring(l[24:28],N.uint32)[0] # UINT32 ; /* header_minor_version (.n) */ ^^ E: 28:obselete._readheader_fabian: Undefined variable 'N' E: 28:obselete._readheader_fabian: Undefined variable 'N' C: 29:obselete._readheader_fabian: Comma not followed by a space self.header['header_byte_orde'] = N.fromstring(l[28:32],N.uint32)[0] # UINT32 r;/* BIG_ENDIAN (Motorola,MIPS); LITTLE_ENDIAN (DEC, Intel) */ ^^ E: 29:obselete._readheader_fabian: Undefined variable 'N' E: 29:obselete._readheader_fabian: Undefined variable 'N' C: 30:obselete._readheader_fabian: Comma not followed by a space self.header['data_byte_order'] = N.fromstring(l[32:36],N.uint32)[0] # UINT32 ; /* BIG_ENDIAN (Motorola,MIPS); LITTLE_ENDIAN (DEC, Intel) */ ^^ E: 30:obselete._readheader_fabian: Undefined variable 'N' E: 30:obselete._readheader_fabian: Undefined variable 'N' C: 31:obselete._readheader_fabian: Comma not followed by a space self.header['header_size'] = N.fromstring(l[36:40],N.uint32)[0] # UINT32 ; /* in bytes */ ^^ E: 31:obselete._readheader_fabian: Undefined variable 'N' E: 31:obselete._readheader_fabian: Undefined variable 'N' C: 32:obselete._readheader_fabian: Comma not followed by a space self.header['frame_type'] = N.fromstring(l[40:44],N.uint32)[0] # UINT32 ; /* flag for frame type */ ^^ E: 32:obselete._readheader_fabian: Undefined variable 'N' E: 32:obselete._readheader_fabian: Undefined variable 'N' C: 42:obselete._readheader_fabian: Comma not followed by a space self.header['nfast'] = N.fromstring(l[80:84],N.uint32)[0] # UINT32 ; /* number of pixels in one line */ ^^ E: 42:obselete._readheader_fabian: Undefined variable 'N' E: 42:obselete._readheader_fabian: Undefined variable 'N' C: 43:obselete._readheader_fabian: Comma not followed by a space self.header['nslow'] = N.fromstring(l[84:88],N.uint32)[0] # UINT32 ; /* number of lines in image */ ^^ E: 43:obselete._readheader_fabian: Undefined variable 'N' E: 43:obselete._readheader_fabian: Undefined variable 'N' C: 44:obselete._readheader_fabian: Comma not followed by a space self.header['depth'] = N.fromstring(l[88:92],N.uint32)[0] # UINT32 ; /* number of bytes per pixel */ ^^ E: 44:obselete._readheader_fabian: Undefined variable 'N' E: 44:obselete._readheader_fabian: Undefined variable 'N' C: 46:obselete._readheader_fabian: Comma not followed by a space self.header['signif_bits'] = N.fromstring(l[96:100],N.uint32)[0] # UINT32 ; /* true depth of data, in bits */ ^^ E: 46:obselete._readheader_fabian: Undefined variable 'N' E: 46:obselete._readheader_fabian: Undefined variable 'N' C: 49:obselete._readheader_fabian: Comma not followed by a space self.header['sequence'] = N.fromstring(l[108:112],N.uint32)[0] # UINT32 ; /* TRUE or FALSE */ ^^ E: 49:obselete._readheader_fabian: Undefined variable 'N' E: 49:obselete._readheader_fabian: Undefined variable 'N' C: 50:obselete._readheader_fabian: Comma not followed by a space self.header['nimages'] = N.fromstring(l[112:116],N.uint32)[0] # UINT32 ; /* total number of images - size of each is nfast*(nslow/nimages) */ ^^ E: 50:obselete._readheader_fabian: Undefined variable 'N' E: 50:obselete._readheader_fabian: Undefined variable 'N' C: 51:obselete._readheader_fabian: Comma not followed by a space self.header['origin'] = N.fromstring(l[116:120],N.uint32)[0] # UINT32 ; /* corner of origin */ ^^ E: 51:obselete._readheader_fabian: Undefined variable 'N' E: 51:obselete._readheader_fabian: Undefined variable 'N' C: 52:obselete._readheader_fabian: Comma not followed by a space self.header['orientation'] = N.fromstring(l[120:124],N.uint32)[0] # UINT32 ; /* direction of fast axis */ ^^ E: 52:obselete._readheader_fabian: Undefined variable 'N' E: 52:obselete._readheader_fabian: Undefined variable 'N' C: 53:obselete._readheader_fabian: Comma not followed by a space self.header['view_direction'] = N.fromstring(l[124:128],N.uint32)[0] # UINT32 ; /* direction to view frame */ ^^ E: 53:obselete._readheader_fabian: Undefined variable 'N' E: 53:obselete._readheader_fabian: Undefined variable 'N' C: 54:obselete._readheader_fabian: Comma not followed by a space self.header['overflow_locatio'] = N.fromstring(l[128:132],N.uint32)[0] # UINT32 n;/* FOLLOWING_HEADER, FOLLOWING_DATA */ ^^ E: 54:obselete._readheader_fabian: Undefined variable 'N' E: 54:obselete._readheader_fabian: Undefined variable 'N' C: 55:obselete._readheader_fabian: Comma not followed by a space self.header['over_8_bits'] = N.fromstring(l[132:136],N.uint32)[0] # UINT32 ; /* # of pixels with counts > 255 */ ^^ E: 55:obselete._readheader_fabian: Undefined variable 'N' E: 55:obselete._readheader_fabian: Undefined variable 'N' C: 56:obselete._readheader_fabian: Comma not followed by a space self.header['over_16_bits'] = N.fromstring(l[136:140],N.uint32)[0] # UINT32 ; /* # of pixels with count > 65535 */ ^^ E: 56:obselete._readheader_fabian: Undefined variable 'N' E: 56:obselete._readheader_fabian: Undefined variable 'N' C: 57:obselete._readheader_fabian: Comma not followed by a space self.header['multiplexed'] = N.fromstring(l[140:144],N.uint32)[0] # UINT32 ; /* multiplex flag */ ^^ E: 57:obselete._readheader_fabian: Undefined variable 'N' E: 57:obselete._readheader_fabian: Undefined variable 'N' C: 58:obselete._readheader_fabian: Comma not followed by a space self.header['nfastimages'] = N.fromstring(l[144:148],N.uint32)[0] # UINT32 ; /* # of images in fast direction */ ^^ E: 58:obselete._readheader_fabian: Undefined variable 'N' E: 58:obselete._readheader_fabian: Undefined variable 'N' C: 59:obselete._readheader_fabian: Comma not followed by a space self.header['nslowimages'] = N.fromstring(l[148:152],N.uint32)[0] # UINT32 ; /* # of images in slow direction */ ^^ E: 59:obselete._readheader_fabian: Undefined variable 'N' E: 59:obselete._readheader_fabian: Undefined variable 'N' C: 60:obselete._readheader_fabian: Comma not followed by a space self.header['background_applied'] = N.fromstring(l[152:156],N.uint32)[0] # UINT32 ; /* flags correction has been applied hold magic number ? */ ^^ E: 60:obselete._readheader_fabian: Undefined variable 'N' E: 60:obselete._readheader_fabian: Undefined variable 'N' C: 61:obselete._readheader_fabian: Comma not followed by a space self.header['bias_applied'] = N.fromstring(l[156:160],N.uint32)[0] # UINT32 ; /* flags correction has been applied - hold magic number ? */ ^^ E: 61:obselete._readheader_fabian: Undefined variable 'N' E: 61:obselete._readheader_fabian: Undefined variable 'N' C: 62:obselete._readheader_fabian: Comma not followed by a space self.header['flatfield_applied'] = N.fromstring(l[160:164],N.uint32)[0] # UINT32 ; /* flags correction has been applied hold magic number ? */ ^^ E: 62:obselete._readheader_fabian: Undefined variable 'N' E: 62:obselete._readheader_fabian: Undefined variable 'N' C: 63:obselete._readheader_fabian: Comma not followed by a space self.header['distortion_applied'] = N.fromstring(l[164:168],N.uint32)[0] # UINT32 ; /* flags correction has been applied hold magic number ? */ ^^ E: 63:obselete._readheader_fabian: Undefined variable 'N' E: 63:obselete._readheader_fabian: Undefined variable 'N' C: 67:obselete._readheader_fabian: Comma not followed by a space self.header['xtal_to_detector'] = N.fromstring(l[640:644],N.int32)[0]*1000 #INT32 ; /* 1000*distance in millimeters */ ^^ E: 67:obselete._readheader_fabian: Undefined variable 'N' E: 67:obselete._readheader_fabian: Undefined variable 'N' C: 68:obselete._readheader_fabian: Comma not followed by a space self.header['beam_x'] = N.fromstring(l[644:648],N.int32)[0]*1000 #INT32 ; /* 1000*x beam position (pixels) */ ^^ E: 68:obselete._readheader_fabian: Undefined variable 'N' E: 68:obselete._readheader_fabian: Undefined variable 'N' C: 69:obselete._readheader_fabian: Comma not followed by a space self.header['beam_y'] = N.fromstring(l[648:652],N.int32)[0]*1000 #INT32 ; /* 1000*y beam position (pixels) */ ^^ E: 69:obselete._readheader_fabian: Undefined variable 'N' E: 69:obselete._readheader_fabian: Undefined variable 'N' C: 70:obselete._readheader_fabian: Comma not followed by a space self.header['integration_time'] = N.fromstring(l[652:656],N.int32)[0] #INT32 ; /* integration time in milliseconds */ ^^ E: 70:obselete._readheader_fabian: Undefined variable 'N' E: 70:obselete._readheader_fabian: Undefined variable 'N' C: 71:obselete._readheader_fabian: Comma not followed by a space self.header['exposure_time'] = N.fromstring(l[656:660],N.int32)[0] #INT32 ; /* exposure time in milliseconds */ ^^ E: 71:obselete._readheader_fabian: Undefined variable 'N' E: 71:obselete._readheader_fabian: Undefined variable 'N' C: 72:obselete._readheader_fabian: Comma not followed by a space self.header['readout_time'] = N.fromstring(l[660:664],N.int32)[0] #INT32 ; /* readout time in milliseconds */ ^^ E: 72:obselete._readheader_fabian: Undefined variable 'N' E: 72:obselete._readheader_fabian: Undefined variable 'N' C: 73:obselete._readheader_fabian: Comma not followed by a space self.header['nreads'] = N.fromstring(l[664:668],N.int32)[0] #INT32 ; /* number of readouts to get this image */ ^^ E: 73:obselete._readheader_fabian: Undefined variable 'N' E: 73:obselete._readheader_fabian: Undefined variable 'N' C: 74:obselete._readheader_fabian: Comma not followed by a space self.header['start_twotheta'] = N.fromstring(l[668:672],N.int32)[0]*1000 #INT32 ; /* 1000*two_theta angle */ ^^ E: 74:obselete._readheader_fabian: Undefined variable 'N' E: 74:obselete._readheader_fabian: Undefined variable 'N' C: 75:obselete._readheader_fabian: Comma not followed by a space self.header['start_omega'] = N.fromstring(l[676:680],N.int32)[0]*1000 #INT32 ; /* 1000*omega angle */ ^^ E: 75:obselete._readheader_fabian: Undefined variable 'N' E: 75:obselete._readheader_fabian: Undefined variable 'N' C: 76:obselete._readheader_fabian: Comma not followed by a space self.header['start_chi'] = N.fromstring(l[680:684],N.int32)[0]*1000 #INT32 ; /* 1000*chi angle */ ^^ E: 76:obselete._readheader_fabian: Undefined variable 'N' E: 76:obselete._readheader_fabian: Undefined variable 'N' C: 77:obselete._readheader_fabian: Comma not followed by a space self.header['start_kappa'] = N.fromstring(l[684:688],N.int32)[0]*1000 #INT32 ; /* 1000*kappa angle */ ^^ E: 77:obselete._readheader_fabian: Undefined variable 'N' E: 77:obselete._readheader_fabian: Undefined variable 'N' C: 78:obselete._readheader_fabian: Comma not followed by a space self.header['start_phi'] = N.fromstring(l[688:692],N.int32)[0]*1000 #INT32 ; /* 1000*phi angle */ ^^ E: 78:obselete._readheader_fabian: Undefined variable 'N' E: 78:obselete._readheader_fabian: Undefined variable 'N' C: 79:obselete._readheader_fabian: Comma not followed by a space self.header['start_delta'] = N.fromstring(l[692:696],N.int32)[0]*1000 #INT32 ; /* 1000*delta angle */ ^^ E: 79:obselete._readheader_fabian: Undefined variable 'N' E: 79:obselete._readheader_fabian: Undefined variable 'N' C: 80:obselete._readheader_fabian: Comma not followed by a space self.header['start_gamma'] = N.fromstring(l[696:700],N.int32)[0]*1000 #INT32 ; /* 1000*gamma angle */ ^^ E: 80:obselete._readheader_fabian: Undefined variable 'N' E: 80:obselete._readheader_fabian: Undefined variable 'N' C: 81:obselete._readheader_fabian: Comma not followed by a space self.header['start_xtal_to_detector'] = N.fromstring(l[700:704],N.int32)[0]*1000 #INT32 ; /* 1000*distance in mm (dist in um)*/ ^^ E: 81:obselete._readheader_fabian: Undefined variable 'N' E: 81:obselete._readheader_fabian: Undefined variable 'N' C: 82:obselete._readheader_fabian: Comma not followed by a space self.header['end_twotheta'] = N.fromstring(l[704:708],N.int32)[0]*1000 #INT32 ; /* 1000*two_theta angle */ ^^ E: 82:obselete._readheader_fabian: Undefined variable 'N' E: 82:obselete._readheader_fabian: Undefined variable 'N' C: 83:obselete._readheader_fabian: Comma not followed by a space self.header['end_omega'] = N.fromstring(l[708:712],N.int32)[0]*1000 #INT32 ; /* 1000*omega angle */ ^^ E: 83:obselete._readheader_fabian: Undefined variable 'N' E: 83:obselete._readheader_fabian: Undefined variable 'N' C: 84:obselete._readheader_fabian: Comma not followed by a space self.header['end_chi'] = N.fromstring(l[712:716],N.int32)[0]*1000 #INT32 ; /* 1000*chi angle */ ^^ E: 84:obselete._readheader_fabian: Undefined variable 'N' E: 84:obselete._readheader_fabian: Undefined variable 'N' C: 85:obselete._readheader_fabian: Comma not followed by a space self.header['end_kappa'] = N.fromstring(l[716:720],N.int32)[0]*1000 #INT32 ; /* 1000*kappa angle */ ^^ E: 85:obselete._readheader_fabian: Undefined variable 'N' E: 85:obselete._readheader_fabian: Undefined variable 'N' C: 86:obselete._readheader_fabian: Comma not followed by a space self.header['end_phi'] = N.fromstring(l[720:724],N.int32)[0]*1000 #INT32 ; /* 1000*phi angle */ ^^ E: 86:obselete._readheader_fabian: Undefined variable 'N' E: 86:obselete._readheader_fabian: Undefined variable 'N' C: 87:obselete._readheader_fabian: Comma not followed by a space self.header['end_delta'] = N.fromstring(l[724:728],N.int32)[0]*1000 #INT32 ; /* 1000*delta angle */ ^^ E: 87:obselete._readheader_fabian: Undefined variable 'N' E: 87:obselete._readheader_fabian: Undefined variable 'N' C: 88:obselete._readheader_fabian: Comma not followed by a space self.header['end_gamma'] = N.fromstring(l[728:732],N.int32)[0]*1000 #INT32 ; /* 1000*gamma angle */ ^^ E: 88:obselete._readheader_fabian: Undefined variable 'N' E: 88:obselete._readheader_fabian: Undefined variable 'N' C: 89:obselete._readheader_fabian: Comma not followed by a space self.header['end_xtal_to_detector'] = N.fromstring(l[732:736],N.int32)[0]*1000 #INT32 ; /* 1000*distance in mm (dist in um)*/ ^^ E: 89:obselete._readheader_fabian: Undefined variable 'N' E: 89:obselete._readheader_fabian: Undefined variable 'N' C: 90:obselete._readheader_fabian: Comma not followed by a space self.header['rotation_axis'] = N.fromstring(l[736:740],N.int32)[0] #INT32 ; /* active rotation axis */ ^^ E: 90:obselete._readheader_fabian: Undefined variable 'N' E: 90:obselete._readheader_fabian: Undefined variable 'N' C: 91:obselete._readheader_fabian: Comma not followed by a space self.header['rotation_range'] = N.fromstring(l[740:744],N.int32)[0]*1000 #INT32 ; /* 1000*rotation angle */ ^^ E: 91:obselete._readheader_fabian: Undefined variable 'N' E: 91:obselete._readheader_fabian: Undefined variable 'N' C: 92:obselete._readheader_fabian: Comma not followed by a space self.header['detector_rotx'] = N.fromstring(l[744:748],N.int32)[0]*1000 #INT32 ; /* 1000*rotation of detector around X */ ^^ E: 92:obselete._readheader_fabian: Undefined variable 'N' E: 92:obselete._readheader_fabian: Undefined variable 'N' C: 93:obselete._readheader_fabian: Comma not followed by a space self.header['detector_roty'] = N.fromstring(l[748:752],N.int32)[0]*1000 #INT32 ; /* 1000*rotation of detector around Y */ ^^ E: 93:obselete._readheader_fabian: Undefined variable 'N' E: 93:obselete._readheader_fabian: Undefined variable 'N' C: 94:obselete._readheader_fabian: Comma not followed by a space self.header['detector_rotz'] = N.fromstring(l[752:756],N.int32)[0]*1000 #INT32 ; /* 1000*rotation of detector around Z */ ^^ E: 94:obselete._readheader_fabian: Undefined variable 'N' E: 94:obselete._readheader_fabian: Undefined variable 'N' C: 96:obselete._readheader_fabian: Comma not followed by a space self.header['detector_type'] = N.fromstring(l[768:772],N.int32)[0] #INT32 ; /* detector type */ ^^ E: 96:obselete._readheader_fabian: Undefined variable 'N' E: 96:obselete._readheader_fabian: Undefined variable 'N' C: 97:obselete._readheader_fabian: Comma not followed by a space self.header['pixelsize_x'] = N.fromstring(l[772:776],N.int32)[0] #INT32 ; /* pixel size (nanometers) */ ^^ E: 97:obselete._readheader_fabian: Undefined variable 'N' E: 97:obselete._readheader_fabian: Undefined variable 'N' C: 98:obselete._readheader_fabian: Comma not followed by a space self.header['pixelsize_y'] = N.fromstring(l[776:780],N.int32)[0] #INT32 ; /* pixel size (nanometers) */ ^^ E: 98:obselete._readheader_fabian: Undefined variable 'N' E: 98:obselete._readheader_fabian: Undefined variable 'N' C: 99:obselete._readheader_fabian: Comma not followed by a space self.header['mean_bias'] = N.fromstring(l[780:784],N.int32)[0]*1000 #INT32 ; /* 1000*mean bias value */ ^^ E: 99:obselete._readheader_fabian: Undefined variable 'N' E: 99:obselete._readheader_fabian: Undefined variable 'N' C:100:obselete._readheader_fabian: Comma not followed by a space self.header['photons_per_100adu'] = N.fromstring(l[784:788],N.int32)[0] #INT32 ; /* photons / 100 ADUs */ ^^ E:100:obselete._readheader_fabian: Undefined variable 'N' E:100:obselete._readheader_fabian: Undefined variable 'N' C:101:obselete._readheader_fabian: Comma not followed by a space self.header['measured_bias'] = N.fromstring(l[788:792],N.int32)[0]*1000 #INT32 [MAXIMAGES]; /* 1000*mean bias value for each image*/ ^^ E:101:obselete._readheader_fabian: Undefined variable 'N' E:101:obselete._readheader_fabian: Undefined variable 'N' C:102:obselete._readheader_fabian: Comma not followed by a space self.header['measured_temperature'] = N.fromstring(l[792:796],N.int32)[0] #INT32 [MAXIMAGES]; /* Temperature of each detector in milliKelvins */ ^^ E:102:obselete._readheader_fabian: Undefined variable 'N' E:102:obselete._readheader_fabian: Undefined variable 'N' C:103:obselete._readheader_fabian: Comma not followed by a space self.header['measured_pressure'] = N.fromstring(l[796:800],N.int32)[0] #INT32 [MAXIMAGES] ; /* Pressure of each chamber in microTorr */ ^^ E:103:obselete._readheader_fabian: Undefined variable 'N' E:103:obselete._readheader_fabian: Undefined variable 'N' C:108:obselete._readheader_fabian: Comma not followed by a space self.header['source_wavelength'] = N.fromstring(l[908:912],N.int32)[0] #INT32 ; /* wavelength (femtoMeters) */ ^^ E:108:obselete._readheader_fabian: Undefined variable 'N' E:108:obselete._readheader_fabian: Undefined variable 'N' R: 12:obselete._readheader_fabian: Too many statements (74/50) W: 16:obselete._readheader_fabian: Attribute 'header' defined outside __init__ R: 11:obselete: Too few public methods (0/2) Report ====== 75 statements analysed. Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |77 |55.80 |77 |= | +----------+-------+------+---------+-----------+ |docstring |10 |7.25 |10 |= | +----------+-------+------+---------+-----------+ |comment |35 |25.36 |35 |= | +----------+-------+------+---------+-----------+ |empty |16 |11.59 |16 |= | +----------+-------+------+---------+-----------+ Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |66 |66 |= | +-----------+-------+---------+-----------+ |refactor |2 |2 |= | +-----------+-------+---------+-----------+ |warning |2 |2 |= | +-----------+-------+---------+-----------+ |error |126 |126 |= | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |E0602 |126 | +-----------+------------+ |C0324 |62 | +-----------+------------+ |C0103 |3 | +-----------+------------+ |W0232 |1 | +-----------+------------+ |W0201 |1 | +-----------+------------+ |R0915 |1 | +-----------+------------+ |R0903 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at -83.33/10 (previous run: -83.33/10) You have to do something quick ! fabio-0.1.3/pylint/__init__.py.lint0000644000175000017500000000560012233243277017762 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module __init__ W: 26,0: Redefining built-in 'open' C: 14,0: Invalid name "version" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 24,0: Invalid name "filename_object" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 16 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |2 |73 |-71.00 | +-----------+-------+---------+-----------+ |refactor |0 |0 |= | +-----------+-------+---------+-----------+ |warning |1 |23 |-22.00 | +-----------+-------+---------+-----------+ |error |0 |3 |-3.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |2 | +-----------+------------+ |W0622 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.12/10 (previous run: 3.76/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |17 |68.00 |183 |-166.00 | +----------+-------+------+---------+-----------+ |docstring |4 |16.00 |52 |-48.00 | +----------+-------+------+---------+-----------+ |comment |3 |12.00 |48 |-45.00 | +----------+-------+------+---------+-----------+ |empty |1 |4.00 |27 |-26.00 | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |13 |-13.00 |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/edfimage.py.lint0000644000175000017500000004025012233243313017753 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module edfimage C: 89,0: Line too long (91/80) C:109,0: Line too long (113/80) C:162,0: Line too long (137/80) C:167,0: Line too long (141/80) C:177,0: Line too long (141/80) C:192,0: Line too long (108/80) C:207,0: Line too long (85/80) C:216,0: Line too long (125/80) C:217,0: Line too long (118/80) C:230,0: Line too long (93/80) C:231,0: Line too long (93/80) C:233,0: Line too long (94/80) C:234,0: Line too long (92/80) C:255,0: Line too long (89/80) C:262,0: Line too long (115/80) C:269,0: Line too long (81/80) C:277,0: Line too long (105/80) C:279,0: Line too long (92/80) C:294,0: Line too long (81/80) C:303,0: Line too long (104/80) C:306,0: Line too long (113/80) C:309,0: Line too long (96/80) C:311,0: Line too long (85/80) C:318,0: Line too long (104/80) C:359,0: Line too long (110/80) C:367,0: Line too long (85/80) C:402,0: Line too long (82/80) C:418,0: Line too long (117/80) C:424,0: Line too long (90/80) C:425,0: Line too long (89/80) C:446,0: Line too long (92/80) C:493,0: Line too long (95/80) C:497,0: Line too long (87/80) C:508,0: Line too long (89/80) C:513,0: Line too long (112/80) C:556,0: Line too long (126/80) C:560,0: Line too long (113/80) C:570,0: Line too long (118/80) C:589,0: Line too long (127/80) C:599,0: Line too long (93/80) C:600,0: Line too long (93/80) C:602,0: Line too long (94/80) C:603,0: Line too long (92/80) C:622,0: Line too long (90/80) C:625,0: Line too long (107/80) C:672,0: Line too long (92/80) C:708,0: Line too long (119/80) C:718,0: Line too long (82/80) C:730,0: Line too long (119/80) C:740,0: Line too long (94/80) C:756,0: Line too long (82/80) C:774,0: Line too long (90/80) C:798,0: Line too long (86/80) C:823,0: Line too long (108/80) C:880,0: Line too long (150/80) C: 23,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 93,0:Frame: Too many instance attributes (13/7) C:128,12:Frame.__init__: Invalid name "iFrame" (should match [a-z_][a-z0-9_]{2,30}$) C:112,8:Frame.__init__: Invalid name "capsHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:183,8:Frame.parseheader: Invalid name "iDim" (should match [a-z_][a-z0-9_]{2,30}$) C:186,12:Frame.parseheader: Invalid name "strDim" (should match [a-z_][a-z0-9_]{2,30}$) C:194,20:Frame.parseheader: Invalid name "iDim" (should match [a-z_][a-z0-9_]{2,30}$) C:200,20:Frame.parseheader: Invalid name "iDim" (should match [a-z_][a-z0-9_]{2,30}$) C:204,16:Frame.parseheader: Invalid name "iDim" (should match [a-z_][a-z0-9_]{2,30}$) C:220,15:Frame.parseheader: Invalid name "n" (should match [a-z_][a-z0-9_]{2,30}$) R:132,4:Frame.parseheader: Too many branches (25/12) R:132,4:Frame.parseheader: Too many statements (70/50) C:241,4:Frame.getData: Invalid name "getData" (should match [a-z_][a-z0-9_]{2,30}$) C:266,20:Frame.getData: Invalid name "fileData" (should match [a-z_][a-z0-9_]{2,30}$) C:279,24:Frame.getData: Invalid name "myData" (should match [a-z_][a-z0-9_]{2,30}$) C:280,24:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:283,20:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:285,20:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:288,20:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:291,20:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:295,20:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:298,16:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:304,16:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C:307,16:Frame.getData: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) R:241,4:Frame.getData: Too many branches (23/12) R:241,4:Frame.getData: Too many statements (63/50) C:315,4:Frame.setData: Invalid name "setData" (should match [a-z_][a-z0-9_]{2,30}$) C:319,4:Frame.getByteCode: Invalid name "getByteCode" (should match [a-z_][a-z0-9_]{2,30}$) C:319,4:Frame.getByteCode: Missing docstring C:324,4:Frame.setByteCode: Invalid name "setByteCode" (should match [a-z_][a-z0-9_]{2,30}$) C:324,4:Frame.setByteCode: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:324,4:Frame.setByteCode: Missing docstring C:324,26:Frame.setByteCode: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) R:328,4:Frame.getEdfBlock: Too many local variables (22/15) C:328,4:Frame.getEdfBlock: Invalid name "getEdfBlock" (should match [a-z_][a-z0-9_]{2,30}$) C:328,4:Frame.getEdfBlock: Invalid name "fit2dMode" (should match [a-z_][a-z0-9_]{2,30}$) C:328,43:Frame.getEdfBlock: Invalid name "fit2dMode" (should match [a-z_][a-z0-9_]{2,30}$) C:341,8:Frame.getEdfBlock: Invalid name "fit2dMode" (should match [a-z_][a-z0-9_]{2,30}$) C:343,12:Frame.getEdfBlock: Invalid name "KEY" (should match [a-z_][a-z0-9_]{2,30}$) C:351,8:Frame.getEdfBlock: Invalid name "capsHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:353,8:Frame.getEdfBlock: Invalid name "listHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:359,12:Frame.getEdfBlock: Invalid name "KEY" (should match [a-z_][a-z0-9_]{2,30}$) C:392,8:Frame.getEdfBlock: Invalid name "approxHeaderSize" (should match [a-z_][a-z0-9_]{2,30}$) C:394,12:Frame.getEdfBlock: Invalid name "approxHeaderSize" (should match [a-z_][a-z0-9_]{2,30}$) C:395,8:Frame.getEdfBlock: Invalid name "approxHeaderSize" (should match [a-z_][a-z0-9_]{2,30}$) C:403,8:Frame.getEdfBlock: Invalid name "preciseSize" (should match [a-z_][a-z0-9_]{2,30}$) C:406,12:Frame.getEdfBlock: Invalid name "strKey" (should match [a-z_][a-z0-9_]{2,30}$) C:410,12:Frame.getEdfBlock: Invalid name "strValue" (should match [a-z_][a-z0-9_]{2,30}$) C:415,12:Frame.getEdfBlock: Invalid name "preciseSize" (should match [a-z_][a-z0-9_]{2,30}$) C:421,20:Frame.getEdfBlock: Invalid name "headerSize" (should match [a-z_][a-z0-9_]{2,30}$) C:425,24:Frame.getEdfBlock: Invalid name "headerSize" (should match [a-z_][a-z0-9_]{2,30}$) C:427,20:Frame.getEdfBlock: Invalid name "preciseSize" (should match [a-z_][a-z0-9_]{2,30}$) C:431,12:Frame.getEdfBlock: Invalid name "headerSize" (should match [a-z_][a-z0-9_]{2,30}$) R:328,4:Frame.getEdfBlock: Too many branches (24/12) R:328,4:Frame.getEdfBlock: Too many statements (82/50) C:437,0:edfimage: Invalid name "edfimage" (should match [A-Z_][a-zA-Z0-9]+$) W:445,15:edfimage.__init__: Catching too general exception Exception C:471,4:edfimage.checkHeader: Invalid name "checkHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:483,4:edfimage._readHeaderBlock: Invalid name "_readHeaderBlock" (should match [a-z_][a-z0-9_]{2,30}$) C:490,8:edfimage._readHeaderBlock: Invalid name "MAX_HEADER_SIZE" (should match [a-z_][a-z0-9_]{2,30}$) W:504,19:edfimage._readHeaderBlock: Catching too general exception Exception C:509,20:edfimage._readHeaderBlock: Invalid name "MAX_HEADER_SIZE" (should match [a-z_][a-z0-9_]{2,30}$) C:538,8:edfimage._readheader: Invalid name "bContinue" (should match [a-z_][a-z0-9_]{2,30}$) C:542,16:edfimage._readheader: Invalid name "bContinue" (should match [a-z_][a-z0-9_]{2,30}$) C:561,16:edfimage._readheader: Invalid name "bContinue" (should match [a-z_][a-z0-9_]{2,30}$) C:620,8:edfimage.getframe: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:623,12:edfimage.getframe: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:626,12:edfimage.getframe: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:638,8:edfimage.previous: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:640,12:edfimage.previous: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:642,12:edfimage.previous: Invalid name "newFrameId" (should match [a-z_][a-z0-9_]{2,30}$) C:643,12:edfimage.previous: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:649,8:edfimage.next: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:651,12:edfimage.next: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) C:653,12:edfimage.next: Invalid name "newFrameId" (should match [a-z_][a-z0-9_]{2,30}$) C:654,12:edfimage.next: Invalid name "newImage" (should match [a-z_][a-z0-9_]{2,30}$) W:658,4:edfimage.write: Arguments number differs from overridden method C:658,4:edfimage.write: Invalid name "fit2dMode" (should match [a-z_][a-z0-9_]{2,30}$) C:658,44:edfimage.write: Invalid name "fit2dMode" (should match [a-z_][a-z0-9_]{2,30}$) C:675,4:edfimage.appendFrame: Invalid name "appendFrame" (should match [a-z_][a-z0-9_]{2,30}$) C:688,4:edfimage.deleteFrame: Invalid name "deleteFrame" (should match [a-z_][a-z0-9_]{2,30}$) C:688,4:edfimage.deleteFrame: Invalid name "frameNb" (should match [a-z_][a-z0-9_]{2,30}$) C:688,26:edfimage.deleteFrame: Invalid name "frameNb" (should match [a-z_][a-z0-9_]{2,30}$) C:700,4:edfimage.fastReadData: Invalid name "fastReadData" (should match [a-z_][a-z0-9_]{2,30}$) C:711,36:edfimage.fastReadData: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) W:717,15:edfimage.fastReadData: Catching too general exception Exception C:721,4:edfimage.fastReadROI: Invalid name "fastReadROI" (should match [a-z_][a-z0-9_]{2,30}$) C:742,8:edfimage.fastReadROI: Invalid name "d1" (should match [a-z_][a-z0-9_]{2,30}$) C:749,36:edfimage.fastReadROI: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) W:755,15:edfimage.fastReadROI: Catching too general exception Exception C:763,4:edfimage.getNbFrames: Invalid name "getNbFrames" (should match [a-z_][a-z0-9_]{2,30}$) C:768,4:edfimage.setNbFrames: Invalid name "setNbFrames" (should match [a-z_][a-z0-9_]{2,30}$) C:777,4:edfimage.getHeader: Invalid name "getHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:782,4:edfimage.setHeader: Invalid name "setHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:782,4:edfimage.setHeader: Invalid name "_dictHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:782,24:edfimage.setHeader: Invalid name "_dictHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:793,4:edfimage.delHeader: Invalid name "delHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:800,4:edfimage.getHeaderKeys: Invalid name "getHeaderKeys" (should match [a-z_][a-z0-9_]{2,30}$) C:805,4:edfimage.setHeaderKeys: Invalid name "setHeaderKeys" (should match [a-z_][a-z0-9_]{2,30}$) C:805,4:edfimage.setHeaderKeys: Invalid name "_listtHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:805,28:edfimage.setHeaderKeys: Invalid name "_listtHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:818,4:edfimage.delHeaderKeys: Invalid name "delHeaderKeys" (should match [a-z_][a-z0-9_]{2,30}$) C:825,4:edfimage.getData: Invalid name "getData" (should match [a-z_][a-z0-9_]{2,30}$) C:831,8:edfimage.getData: Invalid name "npaData" (should match [a-z_][a-z0-9_]{2,30}$) C:833,12:edfimage.getData: Invalid name "npaData" (should match [a-z_][a-z0-9_]{2,30}$) C:836,12:edfimage.getData: Invalid name "npaData" (should match [a-z_][a-z0-9_]{2,30}$) C:840,16:edfimage.getData: Invalid name "npaData" (should match [a-z_][a-z0-9_]{2,30}$) C:843,4:edfimage.setData: Invalid name "setData" (should match [a-z_][a-z0-9_]{2,30}$) C:855,4:edfimage.delData: Invalid name "delData" (should match [a-z_][a-z0-9_]{2,30}$) C:862,4:edfimage.getCapsHeader: Invalid name "getCapsHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:869,4:edfimage.setCapsHeader: Invalid name "setCapsHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:875,4:edfimage.delCapsHeader: Invalid name "delCapsHeader" (should match [a-z_][a-z0-9_]{2,30}$) C:882,4:edfimage.getDim1: Invalid name "getDim1" (should match [a-z_][a-z0-9_]{2,30}$) C:882,4:edfimage.getDim1: Missing docstring C:884,4:edfimage.setDim1: Invalid name "setDim1" (should match [a-z_][a-z0-9_]{2,30}$) C:884,4:edfimage.setDim1: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:884,4:edfimage.setDim1: Missing docstring C:884,22:edfimage.setDim1: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:894,4:edfimage.getDim2: Invalid name "getDim2" (should match [a-z_][a-z0-9_]{2,30}$) C:894,4:edfimage.getDim2: Missing docstring C:896,4:edfimage.setDim2: Invalid name "setDim2" (should match [a-z_][a-z0-9_]{2,30}$) C:896,4:edfimage.setDim2: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:896,4:edfimage.setDim2: Missing docstring C:896,22:edfimage.setDim2: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:907,4:edfimage.getDims: Invalid name "getDims" (should match [a-z_][a-z0-9_]{2,30}$) C:907,4:edfimage.getDims: Missing docstring C:910,4:edfimage.getByteCode: Invalid name "getByteCode" (should match [a-z_][a-z0-9_]{2,30}$) C:910,4:edfimage.getByteCode: Missing docstring C:912,4:edfimage.setByteCode: Invalid name "setByteCode" (should match [a-z_][a-z0-9_]{2,30}$) C:912,4:edfimage.setByteCode: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:912,4:edfimage.setByteCode: Missing docstring C:912,26:edfimage.setByteCode: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:922,4:edfimage.getBpp: Invalid name "getBpp" (should match [a-z_][a-z0-9_]{2,30}$) C:922,4:edfimage.getBpp: Missing docstring C:924,4:edfimage.setBpp: Invalid name "setBpp" (should match [a-z_][a-z0-9_]{2,30}$) C:924,4:edfimage.setBpp: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) C:924,4:edfimage.setBpp: Missing docstring C:924,21:edfimage.setBpp: Invalid name "_iVal" (should match [a-z_][a-z0-9_]{2,30}$) R:437,0:edfimage: Too many public methods (54/20) Report ====== 597 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |180 |180 |= | +-----------+-------+---------+-----------+ |refactor |9 |9 |= | +-----------+-------+---------+-----------+ |warning |5 |15 |-10.00 | +-----------+-------+---------+-----------+ |error |0 |5 |-5.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |114 | +-----------+------------+ |C0301 |55 | +-----------+------------+ |C0111 |11 | +-----------+------------+ |W0703 |4 | +-----------+------------+ |R0915 |3 | +-----------+------------+ |R0912 |3 | +-----------+------------+ |W0221 |1 | +-----------+------------+ |R0914 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 6.75/10 (previous run: 6.12/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |631 |69.26 |623 |+8.00 | +----------+-------+------+---------+-----------+ |docstring |202 |22.17 |205 |-3.00 | +----------+-------+------+---------+-----------+ |comment |11 |1.21 |11 |= | +----------+-------+------+---------+-----------+ |empty |67 |7.35 |70 |-3.00 | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (edfimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |2 |= |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |method |46 |47 |-1.00 |76.09 |73.91 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testfit2dmaskimage.py.lint0000644000175000017500000000765012233243330022007 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testfit2dmaskimage C: 14,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 15,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 29,0: No exception type(s) specified W: 32,0: Relative import 'utilstest', should be 'test.utilstest' C: 39,0:testfacemask: Invalid name "testfacemask" (should match [A-Z_][a-zA-Z0-9]+$) C: 42,4:testfacemask.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 39,0:testfacemask: Too many public methods (46/20) C: 63,0:testclickedmask: Invalid name "testclickedmask" (should match [A-Z_][a-zA-Z0-9]+$) C: 66,4:testclickedmask.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) R: 63,0:testclickedmask: Too many public methods (47/20) C: 99,0:test_suite_all_fit2d: Missing docstring C:100,4:test_suite_all_fit2d: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:107,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:108,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 70 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |10 |NC |NC | +-----------+-------+---------+-----------+ |refactor |2 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |9 | +-----------+------------+ |R0904 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.00/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |70 |67.31 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |15 |14.42 |NC |NC | +----------+-------+------+---------+-----------+ |comment |4 |3.85 |NC |NC | +----------+-------+------+---------+-----------+ |empty |15 |14.42 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (test.testfit2dmaskimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |2 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |5 |NC |NC |100.00 |40.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/utilstest.py.lint0000644000175000017500000000765712233243324020272 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.utilstest C: 62,0: Line too long (86/80) C: 71,0: Line too long (95/80) C: 84,0: Line too long (99/80) C: 1,0: Missing docstring C: 42,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 71,12:UtilsTest: Used * or ** magic W: 73,4:UtilsTest: Specify string format arguments as logging function parameters C: 76,4:UtilsTest.forceBuild: Invalid name "forceBuild" (should match [a-z_][a-z0-9_]{2,30}$) C: 81,8:UtilsTest.forceBuild: Invalid name "p" (should match [a-z_][a-z0-9_]{2,30}$) C: 91,4:UtilsTest.timeoutDuringDownload: Invalid name "timeoutDuringDownload" (should match [a-z_][a-z0-9_]{2,30}$) C:114,16:UtilsTest.getimage: Invalid name "dictProxies" (should match [a-z_][a-z0-9_]{2,30}$) R:103,4:UtilsTest.getimage: Too many branches (16/12) R:103,4:UtilsTest.getimage: Too many statements (52/50) C:180,4:UtilsTest.recursive_delete: Invalid name "strDirname" (should match [a-z_][a-z0-9_]{2,30}$) C:180,25:UtilsTest.recursive_delete: Invalid name "strDirname" (should match [a-z_][a-z0-9_]{2,30}$) Report ====== 104 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |11 |NC |NC | +-----------+-------+---------+-----------+ |refactor |2 |NC |NC | +-----------+-------+---------+-----------+ |warning |2 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |7 | +-----------+------------+ |C0301 |3 | +-----------+------------+ |W1201 |1 | +-----------+------------+ |W0142 |1 | +-----------+------------+ |R0915 |1 | +-----------+------------+ |R0912 |1 | +-----------+------------+ |C0111 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 8.56/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |133 |69.27 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |24 |12.50 |NC |NC | +----------+-------+------+---------+-----------+ |comment |26 |13.54 |NC |NC | +----------+-------+------+---------+-----------+ |empty |9 |4.69 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |NC |NC |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/test_flat_binary.py.lint0000644000175000017500000001030212233243327021543 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.test_flat_binary C: 58,0: Line too long (91/80) C: 1,0: Missing docstring C: 3,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 4,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 18,0: No exception type(s) specified W: 21,0: Relative import 'utilstest', should be 'test.utilstest' C: 27,0:test_flat_binary: Invalid name "test_flat_binary" (should match [A-Z_][a-zA-Z0-9]+$) C: 27,0:test_flat_binary: Missing docstring C: 35,4:test_flat_binary.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 37,12:test_flat_binary.setUp: Invalid name "f" (should match [a-z_][a-z0-9_]{2,30}$) C: 42,4:test_flat_binary.NOtest_openimage: Invalid name "NOtest_openimage" (should match [a-z_][a-z0-9_]{2,30}$) W: 55,12:test_flat_binary.NOtest_openimage: No exception type(s) specified C: 50,16:test_flat_binary.NOtest_openimage: Invalid name "im" (should match [a-z_][a-z0-9_]{2,30}$) C: 60,4:test_flat_binary.tearDown: Invalid name "tearDown" (should match [a-z_][a-z0-9_]{2,30}$) R: 27,0:test_flat_binary: Too many public methods (46/20) C: 71,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) E: 71,14: Undefined variable 'test_suite_all_flat' C: 72,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 48 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |13 |NC |NC | +-----------+-------+---------+-----------+ |refactor |1 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |1 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |10 | +-----------+------------+ |W0702 |2 | +-----------+------------+ |C0111 |2 | +-----------+------------+ |W0403 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |E0602 |1 | +-----------+------------+ |C0301 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.42/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |48 |71.64 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |8 |11.94 |NC |NC | +----------+-------+------+---------+-----------+ |comment |5 |7.46 |NC |NC | +----------+-------+------+---------+-----------+ |empty |6 |8.96 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |0.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |NC |NC |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |NC |NC |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/kcdimage.py.lint0000644000175000017500000001074712233243306017770 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module kcdimage C: 6,0: Line too long (97/80) C: 49,0: Line too long (92/80) C:113,0: Line too long (104/80) W: 11,0: Uses of a deprecated module 'string' C: 13,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 29,0:kcdimage: Invalid name "kcdimage" (should match [A-Z_][a-zA-Z0-9]+$) C: 39,8:kcdimage._readheader: Invalid name "oneLine" (should match [a-z_][a-z0-9_]{2,30}$) C: 41,8:kcdimage._readheader: Invalid name "asciiHeader" (should match [a-z_][a-z0-9_]{2,30}$) C: 42,12:kcdimage._readheader: Invalid name "oneChar" (should match [a-z_][a-z0-9_]{2,30}$) C: 44,16:kcdimage._readheader: Invalid name "asciiHeader" (should match [a-z_][a-z0-9_]{2,30}$) C: 50,8:kcdimage._readheader: Invalid name "endOfHeaders" (should match [a-z_][a-z0-9_]{2,30}$) C: 52,12:kcdimage._readheader: Invalid name "oneLine" (should match [a-z_][a-z0-9_]{2,30}$) C: 54,16:kcdimage._readheader: Invalid name "endOfHeaders" (should match [a-z_][a-z0-9_]{2,30}$) C: 57,16:kcdimage._readheader: Invalid name "oneLine" (should match [a-z_][a-z0-9_]{2,30}$) W: 60,12:kcdimage._readheader: No exception type(s) specified C: 61,16:kcdimage._readheader: Invalid name "endOfHeaders" (should match [a-z_][a-z0-9_]{2,30}$) C: 97,12:kcdimage.read: Invalid name "nbReadOut" (should match [a-z_][a-z0-9_]{2,30}$) C:100,12:kcdimage.read: Invalid name "nbReadOut" (should match [a-z_][a-z0-9_]{2,30}$) C:101,8:kcdimage.read: Invalid name "fileSize" (should match [a-z_][a-z0-9_]{2,30}$) C:127,4:kcdimage.checkData: Invalid name "checkData" (should match [a-z_][a-z0-9_]{2,30}$) R: 29,0:kcdimage: Too many public methods (25/20) Report ====== 83 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |18 |17 |+1.00 | +-----------+-------+---------+-----------+ |refactor |1 |1 |= | +-----------+-------+---------+-----------+ |warning |2 |10 |-8.00 | +-----------+-------+---------+-----------+ |error |0 |11 |-11.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |15 | +-----------+------------+ |C0301 |3 | +-----------+------------+ |W0702 |1 | +-----------+------------+ |W0402 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.47/10 (previous run: -0.51/10) Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |85 |66.41 |79 |+6.00 | +----------+-------+------+---------+-----------+ |docstring |23 |17.97 |23 |= | +----------+-------+------+---------+-----------+ |comment |2 |1.56 |2 |= | +----------+-------+------+---------+-----------+ |empty |18 |14.06 |18 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (kcdimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |2 |+1.00 |100.00 |33.33 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/oldtifimage.py.lint0000644000175000017500000001021712120434325020476 0ustar jeromejerome00000000000000************* Module oldtifimage C0301: 80: Line too long (84/80) W0704: 40:tifimage._readheader: Except doesn't do anything W0702: 41:tifimage._readheader: No exception's type specified C0111: 43:tifimage._readheader: Missing docstring E0102: 43:tifimage._readheader: method already defined line 34 C0324: 43:tifimage._readheader: Comma not followed by a space def _readheader(self,infile): ^^ C0324: 45:tifimage._readheader: Comma not followed by a space header = N.fromstring(infile.read(64),N.uint16) ^^ W0107: 50:tifimage._readheader: Unnecessary pass statement E1103: 60:tifimage.read: Instance of 'str' has no 'seek' member (but some types could not be inferred) W0702: 64:tifimage.read: No exception's type specified E1103: 64:tifimage.read: Instance of 'str' has no 'seek' member (but some types could not be inferred) E1103: 65:tifimage.read: Instance of 'str' has no 'read' member (but some types could not be inferred) W0201: 48:tifimage._readheader: Attribute 'nbits' defined outside __init__ Report ====== 52 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |72 |61.54 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |30 |25.64 |NC |NC | +----------+-------+------+---------+-----------+ |comment |4 |3.42 |NC |NC | +----------+-------+------+---------+-----------+ |empty |11 |9.40 |NC |NC | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (oldtifimage) fabio \-fabioimage (oldtifimage) PIL \-Image (oldtifimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |4 |NC |NC |75.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |4 |NC |NC | +-----------+-------+---------+-----------+ |refactor |0 |NC |NC | +-----------+-------+---------+-----------+ |warning |5 |NC |NC | +-----------+-------+---------+-----------+ |error |4 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+-----------+ |message id |occurences | +===========+===========+ |E1103 |3 | +-----------+-----------+ |W0702 |2 | +-----------+-----------+ |C0324 |2 | +-----------+-----------+ |W0704 |1 | +-----------+-----------+ |W0201 |1 | +-----------+-----------+ |W0107 |1 | +-----------+-----------+ |E0102 |1 | +-----------+-----------+ |C0301 |1 | +-----------+-----------+ |C0111 |1 | +-----------+-----------+ Global evaluation ----------------- Your code has been rated at 4.42/10 fabio-0.1.3/pylint/xsdimage.py.lint0000644000175000017500000001023112233243317020013 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module xsdimage C: 21,0: Line too long (110/80) C: 80,0: Line too long (158/80) C: 86,0: Line too long (92/80) C:106,0: Line too long (102/80) C:111,0: Line too long (101/80) C: 15,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 22,4: Invalid name "etree" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) R: 24,0:xsdimage: Too many instance attributes (14/7) C: 24,0:xsdimage: Invalid name "xsdimage" (should match [A-Z_][a-zA-Z0-9]+$) C: 40,8:xsdimage.__init__: Invalid name "rawData" (should match [a-z_][a-z0-9_]{2,30}$) C: 72,8:xsdimage.read: Invalid name "decData" (should match [a-z_][a-z0-9_]{2,30}$) C: 74,12:xsdimage.read: Invalid name "decData" (should match [a-z_][a-z0-9_]{2,30}$) C: 76,12:xsdimage.read: Invalid name "decData" (should match [a-z_][a-z0-9_]{2,30}$) C: 78,12:xsdimage.read: Invalid name "decData" (should match [a-z_][a-z0-9_]{2,30}$) C: 81,12:xsdimage.read: Invalid name "decData" (should match [a-z_][a-z0-9_]{2,30}$) E: 83,20:xsdimage.read: Module 'hashlib' has no 'md5' member W:110,19:xsdimage._readheader: Catching too general exception Exception R: 24,0:xsdimage: Too many public methods (25/20) C:130,4: Invalid name "xsdimage" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 95 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |15 |16 |-1.00 | +-----------+-------+---------+-----------+ |refactor |2 |2 |= | +-----------+-------+---------+-----------+ |warning |1 |8 |-7.00 | +-----------+-------+---------+-----------+ |error |1 |9 |-8.00 | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |10 | +-----------+------------+ |C0301 |5 | +-----------+------------+ |W0703 |1 | +-----------+------------+ |R0904 |1 | +-----------+------------+ |R0902 |1 | +-----------+------------+ |E1101 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 7.58/10 (previous run: 2.53/10) Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |96 |73.85 |96 |= | +----------+-------+------+---------+-----------+ |docstring |22 |16.92 |22 |= | +----------+-------+------+---------+-----------+ |comment |2 |1.54 |2 |= | +----------+-------+------+---------+-----------+ |empty |10 |7.69 |10 |= | +----------+-------+------+---------+-----------+ External dependencies --------------------- :: numpy (xsdimage) Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |1 |1 |= |100.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |3 |3 |= |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0 |0 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/pylint/testtifimage.py.lint0000644000175000017500000001322612233243336020707 0ustar jeromejerome00000000000000No config file found, using default configuration ************* Module test.testtifimage C: 13,0: Invalid name "logger" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 14,0: Invalid name "force_build" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) W: 28,0: No exception type(s) specified W: 31,0: Relative import 'utilstest', should be 'test.utilstest' W: 35,0: Relative import 'testtifgz', should be 'test.testtifgz' C: 37,0:testtifimage_pilatus: Invalid name "testtifimage_pilatus" (should match [A-Z_][a-zA-Z0-9]+$) C: 39,8:testtifimage_pilatus.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 37,0:testtifimage_pilatus: Missing docstring C: 38,4:testtifimage_pilatus.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 50,8:testtifimage_pilatus.test1: Invalid name "o1" (should match [a-z_][a-z0-9_]{2,30}$) C: 51,8:testtifimage_pilatus.test1: Invalid name "o2" (should match [a-z_][a-z0-9_]{2,30}$) R: 37,0:testtifimage_pilatus: Too many public methods (46/20) C: 54,0:testtifimage_packbits: Invalid name "testtifimage_packbits" (should match [A-Z_][a-zA-Z0-9]+$) C: 56,8:testtifimage_packbits.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 54,0:testtifimage_packbits: Missing docstring C: 55,4:testtifimage_packbits.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 66,8:testtifimage_packbits.test1: Invalid name "o1" (should match [a-z_][a-z0-9_]{2,30}$) C: 67,8:testtifimage_packbits.test1: Invalid name "o2" (should match [a-z_][a-z0-9_]{2,30}$) R: 54,0:testtifimage_packbits: Too many public methods (46/20) C: 70,0:testtifimage_fit2d: Invalid name "testtifimage_fit2d" (should match [A-Z_][a-zA-Z0-9]+$) C: 72,8:testtifimage_fit2d.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 70,0:testtifimage_fit2d: Missing docstring C: 71,4:testtifimage_fit2d.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C: 82,8:testtifimage_fit2d.test1: Invalid name "o1" (should match [a-z_][a-z0-9_]{2,30}$) C: 83,8:testtifimage_fit2d.test1: Invalid name "o2" (should match [a-z_][a-z0-9_]{2,30}$) R: 70,0:testtifimage_fit2d: Too many public methods (46/20) C: 86,0:testtifimage_a0009: Invalid name "testtifimage_a0009" (should match [A-Z_][a-zA-Z0-9]+$) C: 95,8:testtifimage_a0009.setUp: Invalid name "fn" (should match [a-z_][a-z0-9_]{2,30}$) C: 94,4:testtifimage_a0009.setUp: Invalid name "setUp" (should match [a-z_][a-z0-9_]{2,30}$) C:105,8:testtifimage_a0009.test1: Invalid name "o1" (should match [a-z_][a-z0-9_]{2,30}$) C:106,8:testtifimage_a0009.test1: Invalid name "o2" (should match [a-z_][a-z0-9_]{2,30}$) R: 86,0:testtifimage_a0009: Too many public methods (46/20) C:110,0:test_suite_all_tiffimage: Missing docstring C:111,4:test_suite_all_tiffimage: Invalid name "testSuite" (should match [a-z_][a-z0-9_]{2,30}$) C:121,4: Invalid name "mysuite" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C:122,4: Invalid name "runner" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) Report ====== 83 statements analysed. Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |29 |NC |NC | +-----------+-------+---------+-----------+ |refactor |4 |NC |NC | +-----------+-------+---------+-----------+ |warning |3 |NC |NC | +-----------+-------+---------+-----------+ |error |0 |NC |NC | +-----------+-------+---------+-----------+ Messages -------- +-----------+------------+ |message id |occurrences | +===========+============+ |C0103 |25 | +-----------+------------+ |R0904 |4 | +-----------+------------+ |C0111 |4 | +-----------+------------+ |W0403 |2 | +-----------+------------+ |W0702 |1 | +-----------+------------+ Global evaluation ----------------- Your code has been rated at 5.66/10 Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |NC |NC | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |NC |NC | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |82 |69.49 |NC |NC | +----------+-------+------+---------+-----------+ |docstring |24 |20.34 |NC |NC | +----------+-------+------+---------+-----------+ |comment |2 |1.69 |NC |NC | +----------+-------+------+---------+-----------+ |empty |10 |8.47 |NC |NC | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |NC |NC |100.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |4 |NC |NC |25.00 |100.00 | +---------+-------+-----------+-----------+------------+---------+ |method |8 |NC |NC |100.00 |50.00 | +---------+-------+-----------+-----------+------------+---------+ |function |1 |NC |NC |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ fabio-0.1.3/test/0000755000175000017500000000000012233272207014336 5ustar jeromejerome00000000000000fabio-0.1.3/test/testbrukerimage.py0000644000175000017500000001557512233175220020117 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ #bruker Unit tests #built on testedfimage """ import unittest, sys, os, logging, tempfile logger = logging.getLogger("testbrukerimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.brukerimage import brukerimage import numpy import bz2, gzip import tempfile #this is actually a violation of the bruker format since the order of # the header items is specified #in the standard, whereas the order of a python dictionary is not MYHEADER = {"FORMAT":'86', 'NPIXELB':'2', 'VERSION':'9', 'HDRBLKS':'5', 'NOVERFL':'4', 'NCOLS':'256', 'NROWS':'256', 'WORDORD':'0'} MYIMAGE = numpy.ones((256, 256), numpy.uint16) * 16 MYIMAGE[0, 0] = 0 MYIMAGE[1, 1] = 32 MYIMAGE[127:129, 127:129] = 65535 OVERFLOWS = [ ["%09d" % 4194304, ("%07d" % (127 * 256 + 127))], ["%09d" % 4194304, ("%07d" % (127 * 256 + 128))], ["%09d" % 4194304, ("%07d" % (128 * 256 + 127))], ["%09d" % 4194304, ("%07d" % (128 * 256 + 128))] ] class testbruker(unittest.TestCase): """basic test""" filename = os.path.join(UtilsTest.test_home, "testimages", "image.0000") def setUp(self): """ Generate a test bruker image """ if not os.path.isfile(self.filename): fout = open(self.filename, 'wb') wrb = 0 for key, val in MYHEADER.iteritems(): fout.write(("%-7s" % key) + ':' + ("%-72s" % val)) wrb = wrb + 80 hdrblks = int(MYHEADER['HDRBLKS']) while (wrb < hdrblks * 512): fout.write("\x1a\x04") fout.write('.' * 78) wrb = wrb + 80 fout.write(MYIMAGE.tostring()) noverfl = int(MYHEADER['NOVERFL']) for ovf in OVERFLOWS: fout.write(ovf[0] + ovf[1]) fout.write('.' * (512 - (16 * noverfl) % 512)) def test_read(self): """ see if we can read the test image """ obj = brukerimage() obj.read(self.filename) self.assertAlmostEqual(obj.getmean() , 272.0, 2) self.assertEqual(obj.getmin() , 0) self.assertEqual(obj.getmax() , 4194304) class testbzipbruker(testbruker): """ test for a bzipped image """ def setUp(self): """ create the image """ testbruker.setUp(self) if not os.path.isfile(self.filename + ".bz2"): bz2.BZ2File(self.filename + ".bz2", "wb").write(open(self.filename, "rb").read()) self.filename += ".bz2" class testgzipbruker(testbruker): """ test for a gzipped image """ def setUp(self): """ Create the image """ testbruker.setUp(self) if not os.path.isfile(self.filename + ".gz"): gzip.open(self.filename + ".gz", "wb").write(open(self.filename, "rb").read()) # os.system("gzip %s" % (self.filename)) self.filename += ".gz" class testbrukerLinear(unittest.TestCase): """basic test, test a random array of float32""" fd, filename = tempfile.mkstemp('0000', "bruker") os.close(fd) data = numpy.random.random((500, 550)).astype("float32") def test_linear(self): """ test for self consitency of random data read/write """ obj = brukerimage(data=self.data) obj.write(self.filename) new = brukerimage() new.read(self.filename) error = abs(new.data - self.data).max() self.assert_(error < numpy.finfo(numpy.float32).eps, "Error is %s>1e-7" % error) # statistics come from fit2d I think # filename dim1 dim2 min max mean stddev TESTIMAGES = """Cr8F8140k103.0026 512 512 0 145942 289.37 432.17 Cr8F8140k103.0026.gz 512 512 0 145942 289.37 432.17 Cr8F8140k103.0026.bz2 512 512 0 145942 289.37 432.17 """ class test_real_im(unittest.TestCase): """ check some read data from bruker detector""" def setUp(self): """ download images """ self.im_dir = os.path.dirname(UtilsTest.getimage("Cr8F8140k103.0026.bz2")) self.tempdir = tempfile.mkdtemp() def test_read(self): """ check we can read bruker images""" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = brukerimage() obj.read(os.path.join(self.im_dir, name)) self.assertAlmostEqual(mini, obj.getmin(), 2, "getmin") self.assertAlmostEqual(maxi, obj.getmax(), 2, "getmax") self.assertAlmostEqual(mean, obj.getmean(), 2, "getmean") self.assertAlmostEqual(stddev, obj.getstddev(), 2, "getstddev") self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(dim2, obj.dim2, "dim2") def test_write(self): "Test writing with self consistency at the fabio level" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] obj = brukerimage() ref = brukerimage() fname = os.path.join(self.im_dir, name) obj.read(fname) obj.write(os.path.join(self.tempdir, name)) other = brukerimage() other.read(os.path.join(self.tempdir, name)) ref.read(fname) self.assertEqual(abs(obj.data - other.data).max(), 0, "data are the same") for key in ref.header: if key in ("filename",): continue if key not in other.header: logger.warning("Key %s is missing in new header, was %s" % (key, ref.header[key])) else: self.assertEqual(ref.header[key], other.header[key], "value are the same for key %s: was %s now %s" % (key, ref.header[key], other.header[key])) def test_suite_all_bruker(): testSuite = unittest.TestSuite() testSuite.addTest(testbruker("test_read")) testSuite.addTest(testbzipbruker("test_read")) testSuite.addTest(testgzipbruker("test_read")) testSuite.addTest(test_real_im("test_read")) testSuite.addTest(test_real_im("test_write")) testSuite.addTest(testbrukerLinear("test_linear")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_bruker() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testopenheader.py0000644000175000017500000000313112120434325017714 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests """ import unittest, sys, os, logging logger = logging.getLogger("testopenheader") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.openimage import openheader class test1(unittest.TestCase): """openheader opening edf""" def setUp(self): self.name = UtilsTest.getimage("F2K_Seb_Lyso0675_header_only.edf.bz2")[:-4] def testcase(self): """ check openheader can read edf headers""" for ext in ["", ".bz2", ".gz"]: name = self.name + ext obj = openheader(name) logger.debug(" %s obj = %s" % (name, obj.header)) self.assertEqual(obj.header["title"], "ESPIA FRELON Image", "Error on file %s" % name) def test_suite_all_openheader(): testSuite = unittest.TestSuite() testSuite.addTest(test1("testcase")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_openheader() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testOXDimage.py0000644000175000017500000001102112120434325017234 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest, sys, os, logging, tempfile logger = logging.getLogger("testOXDimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.OXDimage import OXDimage # filename dim1 dim2 min max mean stddev values are from OD Sapphire 3.0 TESTIMAGES = """b191_1_9_1_uncompressed.img 512 512 -500 11975 25.70 90.2526 b191_1_9_1_uncompressed.img 512 512 -500 11975 25.70 90.2526""" class testOXD(unittest.TestCase): def setUp(self): self.fn = {} for i in ["b191_1_9_1.img", "b191_1_9_1_uncompressed.img"]: self.fn[i] = UtilsTest.getimage(i + ".bz2")[:-4] for i in self.fn: assert os.path.exists(self.fn[i]) self.tempdir = tempfile.mkdtemp() def tearDown(self): UtilsTest.recursive_delete(self.tempdir) def test_read(self): "Test reading of compressed OXD images" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = OXDimage() obj.read(self.fn[name]) self.assertAlmostEqual(mini, obj.getmin(), 2, "getmin") self.assertAlmostEqual(maxi, obj.getmax(), 2, "getmax") self.assertAlmostEqual(mean, obj.getmean(), 2, "getmean") self.assertAlmostEqual(stddev, obj.getstddev(), 2, "getstddev") self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(dim2, obj.dim2, "dim2") def test_write(self): "Test writing with self consistency at the fabio level" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] obj = OXDimage() obj.read(self.fn[name]) obj.write(os.path.join(self.tempdir, name)) other = OXDimage() other.read(os.path.join(self.tempdir, name)) self.assertEqual(abs(obj.data - other.data).max(), 0, "data are the same") for key in obj.header: if key == "filename": continue self.assertTrue(key in other.header, "Key %s is in header" % key) self.assertEqual(obj.header[key], other.header[key], "value are the same for key %s" % key) class testOXD_same(unittest.TestCase): def setUp(self): self.fn = {} for i in ["b191_1_9_1.img", "b191_1_9_1_uncompressed.img"]: self.fn[i] = UtilsTest.getimage(i + ".bz2")[:-4] for i in self.fn: assert os.path.exists(self.fn[i]) def test_same(self): """test if images are actually the same""" o1 = fabio.open(self.fn["b191_1_9_1.img"]) o2 = fabio.open(self.fn["b191_1_9_1_uncompressed.img"]) for attr in ["getmin", "getmax", "getmean", "getstddev"]: a1 = getattr(o1, attr)() a2 = getattr(o2, attr)() self.assertEqual(a1, a2, "testing %s: %s | %s" % (attr, a1, a2)) class testOXD_big(unittest.TestCase): """class to test bugs if OI is large (lot of exceptions 16 bits)""" def setUp(self): self.fn = {} for i in ["d80_60s.img", "d80_60s.edf"]: self.fn[i] = UtilsTest.getimage(i + ".bz2")[:-4] for i in self.fn: self.assertTrue(os.path.exists(self.fn[i]), self.fn[i]) def test_same(self): # print self.fn df = [fabio.open(i).data for i in self.fn.values()] self.assertEqual(abs(df[0] - df[1]).max(), 0, "Data are the same") def test_suite_all_OXD(): testSuite = unittest.TestSuite() testSuite.addTest(testOXD("test_read")) testSuite.addTest(testOXD("test_write")) testSuite.addTest(testOXD_same("test_same")) testSuite.addTest(testOXD_big("test_same")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_OXD() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testXSDimage.py0000755000175000017500000000630312120434325017252 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest import os import logging import sys logger = logging.getLogger("testXSDimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.xsdimage import xsdimage import numpy # filename dim1 dim2 min max mean stddev values are from OD Sapphire 3.0 TESTIMAGES = """XSDataImage.xml 512 512 86 61204 511.63 667.15 XSDataImageInv.xml 512 512 -0.2814 0.22705039 2.81e-08 0.010""" class testXSD(unittest.TestCase): def setUp(self): self.fn = {} for i in ["XSDataImage.edf", "XSDataImage.xml", "XSDataImageInv.xml"]: self.fn[i] = UtilsTest.getimage(i) def test_read(self): "Test reading of XSD images" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = xsdimage() obj.read(self.fn[name]) self.assertAlmostEqual(mini, obj.getmin(), 2, "getmin") self.assertAlmostEqual(maxi, obj.getmax(), 2, "getmax") self.assertAlmostEqual(mean, obj.getmean(), 2, "getmean") logger.info("%s %s %s" % (name, stddev, obj.getstddev())) self.assertAlmostEqual(stddev, obj.getstddev(), 2, "getstddev") self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(dim2, obj.dim2, "dim2") def test_same(self): """ test if an image is the same as the EDF equivalent""" xsd = fabio.open(self.fn["XSDataImage.xml"]) edf = fabio.open(self.fn["XSDataImage.edf"]) self.assertAlmostEqual(0, abs(xsd.data - edf.data).max(), 1, "images are the same") def test_invert(self): """ Tests that 2 matrixes are invert """ m1 = fabio.open(self.fn["XSDataImage.xml"]) m2 = fabio.open(self.fn["XSDataImageInv.xml"]) self.assertAlmostEqual( abs((numpy.matrix(m1.data) * numpy.matrix(m2.data)) - numpy.identity(m1.data.shape[0])).max(), 0, 3, "matrices are invert of each other") def test_suite_all_XSD(): testSuite = unittest.TestSuite() if xsdimage is None: logging.warning("xsdimage is None ... probably an import error related to lxml. Skipping test") else: testSuite.addTest(testXSD("test_read")) testSuite.addTest(testXSD("test_same")) testSuite.addTest(testXSD("test_invert")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_XSD() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testadscimage.py0000644000175000017500000000662312120434325017530 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch Updated by Jerome Kieffer (jerome.kieffer@esrf.eu), 2011 """ import unittest, sys, os, logging logger = logging.getLogger("testadscimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.adscimage import adscimage from fabio.edfimage import edfimage # statistics come from fit2d I think # filename dim1 dim2 min max mean stddev TESTIMAGES = """mb_LP_1_001.img 3072 3072 0.0000 65535. 120.33 147.38 mb_LP_1_001.img.gz 3072 3072 0.0000 65535. 120.33 147.38 mb_LP_1_001.img.bz2 3072 3072 0.0000 65535. 120.33 147.38 """ class testmatch(unittest.TestCase): """ check the ??fit2d?? conversion to edf gives same numbers """ def setUp(self): """ Download images """ self.fn_adsc = UtilsTest.getimage("mb_LP_1_001.img.bz2")[:-4] self.fn_edf = UtilsTest.getimage("mb_LP_1_001.edf.bz2")[:-4] def testsame(self): """test ADSC image match to EDF""" im1 = edfimage() im1.read(self.fn_edf) im2 = adscimage() im2.read(self.fn_adsc) diff = (im1.data.astype("float32") - im2.data.astype("float32")) logger.debug("type: %s %s shape %s %s " % (im1.data.dtype, im2.data.dtype, im1.data.shape, im2.data.shape)) logger.debug("im1 min %s %s max %s %s " % (im1.data.min(), im2.data.min(), im1.data.max(), im2.data.max())) logger.debug("delta min %s max %s mean %s" % (diff.min(), diff.max(), diff.mean())) self.assertEqual(abs(diff).max(), 0.0, "asdc data == edf data") class testflatmccdsadsc(unittest.TestCase): """ """ def setUp(self): """ Download images """ self.im_dir = os.path.dirname(UtilsTest.getimage("mb_LP_1_001.img.bz2")) def test_read(self): """ check we can read flat ADSC images""" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = adscimage() obj.read(os.path.join(self.im_dir, name)) self.assertAlmostEqual(mini, obj.getmin(), 2, "getmin") self.assertAlmostEqual(maxi, obj.getmax(), 2, "getmax") self.assertAlmostEqual(mean, obj.getmean(), 2, "getmean") self.assertAlmostEqual(stddev, obj.getstddev(), 2, "getstddev") self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(dim2, obj.dim2, "dim2") def test_suite_all_adsc(): testSuite = unittest.TestSuite() testSuite.addTest(testmatch("testsame")) testSuite.addTest(testflatmccdsadsc("test_read")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_adsc() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/utilstest.py0000644000175000017500000001720412120434325016750 0ustar jeromejerome00000000000000# coding: utf8 # # Project: Fabio tests class utilities # http://www.edna-site.org # # File: "$Id:$" # # Copyright (C) 2010 European Synchrotron Radiation Facility # Grenoble, France # # Principal authors: Jérôme KIEFFER (jerome.kieffer@esrf.fr) # # This program is free software: you can redistribute it and/or modify # it under the terms of the Lesser 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 . # __authors__ = ["Jérôme Kieffer"] __contact__ = "jerome.kieffer@esrf.eu" __license__ = "LGPLv3+" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" import os, imp, sys, subprocess, threading import distutils.util import logging import bz2 import gzip if sys.version_info >= (3, 0): import urllib as urllib2 else: import urllib2 logger = logging.getLogger("utilstest") class UtilsTest(object): """ Static class providing useful stuff for preparing tests. """ timeout = 60 #timeout in seconds for downloading images url_base = "http://downloads.sourceforge.net/fable" test_home = os.path.dirname(os.path.abspath(__file__)) name = "fabio" image_home = os.path.join(test_home, "testimages") if not os.path.isdir(image_home): os.makedirs(image_home) platform = distutils.util.get_platform() architecture = "lib.%s-%i.%i" % (platform, sys.version_info[0], sys.version_info[1]) fabio_home = os.path.dirname(test_home) fabio_build_home = os.path.join(fabio_home, "build", architecture) logger.info("Fabio Home is: " + fabio_build_home) if "fabio" in sys.modules: logger.info("Fabio module was already loaded from %s" % sys.modules["fabio"]) fabio = None sys.modules.pop("fabio") if not os.path.isdir(fabio_build_home): logger.warning("Building Fabio to %s" % fabio_build_home) p = subprocess.Popen([sys.executable, "setup.py", "build"], shell=False, cwd=os.path.dirname(test_home)) logger.info("subprocess ended with rc= %s" % p.wait()) fabio = imp.load_module(*((name,) + imp.find_module(name, [fabio_build_home, fabio_home]))) sys.modules[name] = fabio logging.info("pyFAI loaded from %s" % fabio.__file__) @classmethod def forceBuild(cls): """ force the recompilation of Fabio """ logger.info("Building Fabio to %s" % cls.fabio_build_home) p = subprocess.Popen([sys.executable, "setup.py", "build"], shell=False, cwd=os.path.dirname(cls.test_home)) logger.info("subprocess ended with rc= %s" % p.wait()) fabio = imp.load_module(*((cls.name,) + imp.find_module(cls.name, [cls.fabio_build_home]))) sys.modules[cls.name] = fabio logger.info("fabio loaded from %s" % fabio.__file__) @classmethod def timeoutDuringDownload(cls): """ Function called after a timeout in the download part ... just raise an Exception. """ raise RuntimeError("""Could not automatically download test images! If you are behind a firewall, please set the environment variable http_proxy. Otherwise please try to download the images manually from """ + cls.url_base) @classmethod def getimage(cls, imagename): """ Downloads the requested image @return: path of the image, locally """ logger.info("UtilsTest.getimage('%s')" % imagename) fullimagename = os.path.join(cls.image_home, imagename) if not os.path.isfile(fullimagename): logger.info("Trying to download image %s, timeout set to %ss" % (imagename, cls.timeout)) if "http_proxy" in os.environ: dictProxies = {'http': os.environ["http_proxy"]} proxy_handler = urllib2.ProxyHandler(dictProxies) opener = urllib2.build_opener(proxy_handler).open else: opener = urllib2.urlopen # Nota: since python2.6 there is a timeout in the urllib2 timer = threading.Timer(cls.timeout + 1, cls.timeoutDuringDownload) timer.start() logger.info("wget %s/%s" % (cls.url_base, imagename)) if sys.version > (2, 6): data = opener("%s/%s" % (cls.url_base, imagename), data=None, timeout=cls.timeout).read() else: data = opener("%s/%s" % (cls.url_base, imagename), data=None).read() timer.cancel() logger.info("Image %s successfully downloaded." % imagename) try: open(fullimagename, "wb").write(data) except IOError: raise IOError("unable to write downloaded \ data to disk at %s" % cls.image_home) if not os.path.isfile(fullimagename): raise RuntimeError("Could not automatically \ download test images %s!\n \ If you are behind a firewall, \ please set the environment variable http_proxy.\n \ Otherwise please try to download the images manually from \n \ %s" % (cls.url_base, imagename)) if imagename.endswith(".bz2"): decompressed = bz2.decompress(data) basename = fullimagename[:-4] elif imagename.endswith(".gz"): decompressed = gzip.open(fullimagename).read() basename = fullimagename[:-3] else: decompressed = data basename = fullimagename gzipname = basename + ".gz" bzip2name = basename + ".bz2" if basename != fullimagename: try: open(basename, "wb").write(decompressed) except IOError: raise IOError("unable to write decompressed \ data to disk at %s" % cls.image_home) if gzipname != fullimagename: try: gzip.open(gzipname, "wb").write(decompressed) except IOError: raise IOError("unable to write gzipped \ data to disk at %s" % cls.image_home) if bzip2name != fullimagename: try: bz2.BZ2File(bzip2name, "wb").write(decompressed) except IOError: raise IOError("unable to write bzipped2 \ data to disk at %s" % cls.image_home) return fullimagename @staticmethod def recursive_delete(strDirname): """ Delete everything reachable from the directory named in "top", assuming there are no symbolic links. CAUTION: This is dangerous! For example, if top == '/', it could delete all your disk files. @param strDirname: top directory to delete @type strDirname: string """ for root, dirs, files in os.walk(strDirname, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) os.rmdir(strDirname) fabio-0.1.3/test/test_filename_steps.py0000644000175000017500000000425112120434325020743 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- import unittest, sys, os, logging logger = logging.getLogger("test_filename_steps") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio class test_next(unittest.TestCase): def test_next1(self): for name, next in [ [ "data0001.edf", "data0002.edf" ], [ "bob1.edf", "bob2.edf" ], [ "1.edf", "2.edf" ], [ "1.mar2300", "2.mar2300" ], ]: self.assertEqual(next, fabio.next_filename(name)) class test_prev(unittest.TestCase): def test_prev1(self): for name, prev in [ [ "data0001.edf", "data0000.edf" ], [ "bob1.edf", "bob0.edf" ], [ "1.edf", "0.edf" ], [ "1.mar2300", "0.mar2300" ], ]: self.assertEqual(prev, fabio.previous_filename(name)) class test_jump(unittest.TestCase): def test_jump1(self): for name, res, num in [ [ "data0001.edf", "data99993.edf" , 99993 ], [ "bob1.edf", "bob0.edf", 0 ], [ "1.edf", "123456.edf" , 123456], [ "mydata001.mar2300.gz", "mydata003.mar2300.gz", 3 ], ]: self.assertEqual(res, fabio.jump_filename(name, num)) def test_suite_all_steps(): testSuite = unittest.TestSuite() testSuite.addTest(test_next("test_next1")) testSuite.addTest(test_prev("test_prev1")) testSuite.addTest(test_jump("test_jump1")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_steps() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testfilenames.py0000644000175000017500000000770612126623347017573 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ Test cases for filename deconstruction testsuite by Jerome Kieffer (Jerome.Kieffer@esrf.eu) """ import unittest, sys, os, logging logger = logging.getLogger("testfilenames") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio CASES = [ (1, 'edf', "data0001.edf"), (10001, 'edf', "data10001.edf"), (10001, 'edf', "data10001.edf.gz"), (10001, 'edf', "data10001.edf.bz2"), (2, 'marccd', "data0002.mccd"), (12345, 'marccd', "data12345.mccd"), (10001, 'marccd', "data10001.mccd.gz"), (10001, 'marccd', "data10001.mccd.bz2"), (123, 'marccd', "data123.mccd.gz"), (3, 'tif', "data0003.tif"), (4, 'tif', "data0004.tiff"), (12, 'bruker', "sucrose101.012.gz"), (99, 'bruker', "sucrose101.099"), (99, 'bruker', "sucrose101.0099"), (99, 'bruker', "sucrose101.0099.bz2"), (99, 'bruker', "sucrose101.0099.gz"), (2, 'fit2dmask', "fit2d.msk"), (None, 'fit2dmask', "mymask.msk"), (670005, 'edf' , 'S82P670005.edf'), (670005, 'edf' , 'S82P670005.edf.gz'), # based on only the name it can be either img or oxd (1 , 'adsc_or_OXD_or_HiPiC' , 'mb_LP_1_001.img'), (2 , 'adsc_or_OXD_or_HiPiC' , 'mb_LP_1_002.img.gz'), (3 , 'adsc_or_OXD_or_HiPiC' , 'mb_LP_1_003.img.bz2'), (3 , 'adsc_or_OXD_or_HiPiC' , os.path.join("data", 'mb_LP_1_003.img.bz2')), ] MORE_CASES = [ ("data0010.edf", "data0012.edf", 10), ("data1000.pnm", "data999.pnm", 1000), ("data0999.pnm", "data1000.pnm", 999), ("data123457.edf", "data123456.edf", 123457), ("d0ata000100.mccd", "d0ata000012.mccd", 100), (os.path.join("images/sampledir", "P33S670003.edf"), os.path.join("images/sampledir", "P33S670002.edf"), 670003), (os.path.join("images/P33S67", "P33S670003.edf"), os.path.join("images/P33S67", "P33S670002.edf"), 670003), ("image2301.mar2300", "image2300.mar2300", 2301), ("image2300.mar2300", "image2301.mar2300", 2300), ("image.0123", "image.1234", 123), ("mymask.msk", "mymask.msk", None), ("data_123.mccd.bz2", "data_001.mccd.bz2", 123) ] class testfilenames(unittest.TestCase): """ check the name -> number, type conversions """ def test_many_cases(self): """ loop over CASES """ for num, typ, name in CASES: obj = fabio.FilenameObject(filename=name) self.assertEqual(num, obj.num , name + " num=" + str(num) + \ " != obj.num=" + str(obj.num)) self.assertEqual(typ, "_or_".join(obj.format), name + " " + "_or_".join(obj.format)) self.assertEqual(name, obj.tostring() , name + " " + obj.tostring()) def test_more_cases(self): for nname, oname, num in MORE_CASES: name = fabio.construct_filename(oname, num) self.assertEqual(name, nname) def test_more_cases_jump(self): for nname, oname, num in MORE_CASES: name = fabio.jump_filename(oname, num) self.assertEqual(name, nname) def test_suite_all_filenames(): testSuite = unittest.TestSuite() testSuite.addTest(testfilenames("test_many_cases")) testSuite.addTest(testfilenames("test_more_cases")) testSuite.addTest(testfilenames("test_more_cases_jump")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_filenames() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testcompression.py0000755000175000017500000000636512120434325020162 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests Updated by Jerome Kieffer (jerome.kieffer@esrf.eu), 2011 """ import unittest, sys, os, logging logger = logging.getLogger("testcompression") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio import fabio.compression as compression import numpy class testbyteoffset(unittest.TestCase): """ test the byte offset compression and decompression """ def setUp(self): self.ds = numpy.array([0, 1, 2, 127, 0, 1, 2, 128, 0, 1, 2, 32767, 0, 1, 2, 32768, 0, 1, 2, 2147483647, 0, 1, 2, 2147483648, 0, 1, 2, 128, 129, 130, 32767, 32768, 128, 129, 130, 32768, 2147483647, 2147483648]) self.ref = '\x00\x01\x01}\x81\x01\x01~\x80\x80\xff\x01\x01\x80\xfd\x7f\x80\x01\x80\x01\x01\x80\xfe\x7f\x80\x00\x80\x00\x80\xff\xff\x01\x01\x80\x00\x80\xfd\xff\xff\x7f\x80\x00\x80\x01\x00\x00\x80\x01\x01\x80\x00\x80\xfe\xff\xff\x7f\x80\x00\x80\x00\x00\x00\x80\x00\x00\x00\x80\xff\xff\xff\xff\x01\x01~\x01\x01\x80}\x7f\x01\x80\x80\x80\x01\x01\x80~\x7f\x80\x00\x80\xff\x7f\xff\x7f\x01' def testComp(self): """ """ ds = numpy.array([0, 128]) ref = "\x00\x80\x80\00" self.assertEqual(ref, compression.compByteOffet_numpy(ds) , "test +128") ds = numpy.array([0, -128]) ref = '\x00\x80\x80\xff' self.assertEqual(ref, compression.compByteOffet_numpy(ds) , "test -128") ds = numpy.array([10, -128]) ref = '\n\x80v\xff' self.assertEqual(ref, compression.compByteOffet_numpy(ds) , "test +10 -128") self.assertEqual(self.ref, compression.compByteOffet_numpy(self.ds) , "test larger") def testSC(self): """test that datasets are unchanged after various comression/decompressions""" obt_np = compression.decByteOffet_numpy(compression.compByteOffet_numpy(self.ds)) self.assertEqual(abs(self.ds - obt_np).max(), 0.0, "numpy algo") obt_cy = compression.decByteOffet_cython(compression.compByteOffet_numpy(self.ds)) self.assertEqual(abs(self.ds - obt_cy).max(), 0.0, "cython algo") obt_cy2 = compression.decByteOffet_cython(compression.compByteOffet_numpy(self.ds), self.ds.size) self.assertEqual(abs(self.ds - obt_cy2).max(), 0.0, "cython algo_orig") obt_we = compression.decByteOffet_weave(compression.compByteOffet_numpy(self.ds), self.ds.size) self.assertEqual(abs(self.ds - obt_we).max(), 0.0, "weave algo") def test_suite_all_compression(): testSuite = unittest.TestSuite() testSuite.addTest(testbyteoffset("testSC")) testSuite.addTest(testbyteoffset("testSC")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_compression() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/__init__.py0000644000175000017500000000000112120434325016432 0ustar jeromejerome00000000000000 fabio-0.1.3/test/testmccdimage.py0000644000175000017500000000745412120434325017527 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest, sys, os, logging logger = logging.getLogger("testmccdimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.marccdimage import marccdimage from fabio.tifimage import tifimage import numpy # statistics come from fit2d I think # filename dim1 dim2 min max mean stddev TESTIMAGES = """corkcont2_H_0089.mccd 2048 2048 0 354 7.2611 14.639 corkcont2_H_0089.mccd.bz2 2048 2048 0 354 7.2611 14.639 corkcont2_H_0089.mccd.gz 2048 2048 0 354 7.2611 14.639 somedata_0001.mccd 1024 1024 0 20721 128.37 136.23 somedata_0001.mccd.bz2 1024 1024 0 20721 128.37 136.23 somedata_0001.mccd.gz 1024 1024 0 20721 128.37 136.23""" class testnormaltifok(unittest.TestCase): """ check we can read normal tifs as well as mccd """ imdata = None image = os.path.join(UtilsTest.test_home, "testimages", "tifimagewrite_test0000.tif") def setUp(self): """ create an image """ self.imdata = numpy.zeros((24, 24), numpy.uint16) self.imdata[ 12:14, 15:17 ] = 42 obj = tifimage(self.imdata, { }) obj.write(self.image) def test_read_openimage(self): from fabio.openimage import openimage obj = openimage(self.image) if obj.data.astype(int).tostring() != self.imdata.astype(int).tostring(): logger.info("%s %s" % (type(self.imdata), self.imdata.dtype)) logger.info("%s %s" % (type(obj.data), obj.data.dtype)) logger.info("%s %s" % (obj.data - self.imdata)) self.assertEqual(obj.data.astype(int).tostring(), self.imdata.astype(int).tostring()) class testflatmccds(unittest.TestCase): def setUp(self): self.fn = {} for i in ["corkcont2_H_0089.mccd", "somedata_0001.mccd"]: self.fn[i] = UtilsTest.getimage(i + ".bz2")[:-4] self.fn[i + ".bz2"] = self.fn[i] + ".bz2" self.fn[i + ".gz"] = self.fn[i] + ".gz" for i in self.fn: assert os.path.exists(self.fn[i]) def test_read(self): """ check we can read MarCCD images""" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = marccdimage() obj.read(self.fn[name]) self.assertAlmostEqual(mini, obj.getmin(), 2, "getmin") self.assertAlmostEqual(maxi, obj.getmax(), 2, "getmax") self.assertAlmostEqual(mean, obj.getmean(), 2, "getmean") self.assertAlmostEqual(stddev, obj.getstddev(), 2, "getstddev") self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(dim2, obj.dim2, "dim2") def test_suite_all_mccd(): testSuite = unittest.TestSuite() testSuite.addTest(testnormaltifok("test_read_openimage")) testSuite.addTest(testflatmccds("test_read")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_mccd() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/test_all.py0000755000175000017500000000574112120434325016525 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ Test suite for all fabio modules. """ import unittest import os import logging import sys logger = logging.getLogger("test_all_fabio") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from testfabioimage import test_suite_all_fabio from testedfimage import test_suite_all_edf from testcbfimage import test_suite_all_cbf from testfilenames import test_suite_all_filenames from test_file_series import test_suite_all_series from test_filename_steps import test_suite_all_steps #from test_flat_binary import test_suite_all_flat from testadscimage import test_suite_all_adsc from testfit2dmaskimage import test_suite_all_fit2d from testGEimage import test_suite_all_GE from testheadernotsingleton import test_suite_all_header from testmar345image import test_suite_all_mar345 from testbrukerimage import test_suite_all_bruker from testmccdimage import test_suite_all_mccd from testopenheader import test_suite_all_openheader from testopenimage import test_suite_all_openimage from testOXDimage import test_suite_all_OXD from testkcdimage import test_suite_all_kcd from testtifimage import test_suite_all_tiffimage from testXSDimage import test_suite_all_XSD def test_suite_all(): testSuite = unittest.TestSuite() testSuite.addTest(test_suite_all_fabio()) testSuite.addTest(test_suite_all_filenames()) testSuite.addTest(test_suite_all_series()) testSuite.addTest(test_suite_all_steps()) # testSuite.addTest(test_suite_all_flat()) testSuite.addTest(test_suite_all_adsc()) testSuite.addTest(test_suite_all_edf()) testSuite.addTest(test_suite_all_cbf()) testSuite.addTest(test_suite_all_fit2d()) testSuite.addTest(test_suite_all_GE()) testSuite.addTest(test_suite_all_header()) testSuite.addTest(test_suite_all_mar345()) testSuite.addTest(test_suite_all_bruker()) testSuite.addTest(test_suite_all_mccd()) testSuite.addTest(test_suite_all_openheader()) testSuite.addTest(test_suite_all_openimage()) testSuite.addTest(test_suite_all_OXD()) testSuite.addTest(test_suite_all_kcd()) testSuite.addTest(test_suite_all_tiffimage()) testSuite.addTest(test_suite_all_XSD()) return testSuite if __name__ == '__main__': mysuite = test_suite_all() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/profile_compressed.py0000644000175000017500000000715112120434325020574 0ustar jeromejerome00000000000000 """ Benchmark the bz2 and gzip modules compared to their system counterparts """ import cProfile, os, time, random, gzip, bz2, struct, sys try: import pstats except: print "Your package manager is probably teasing you" print "try sudo apt-get install python-profiler" sys.exit() print "Setting up" npts = int(1e6) data = [ random.random() for i in range(npts) ] sdata = struct.pack( "d"*npts, *tuple(data) ) open("prof.dat","wb").write(sdata) open("prof2.dat","wb").write(" "*npts*8) os.system("gzip -c prof.dat > prof.dat.gz") os.system("bzip2 -c prof.dat > prof.dat.bz2") os.system("gzip -c prof2.dat > prof2.dat.gz") os.system("bzip2 -c prof2.dat > prof2.dat.bz2") print "Done setup" sys.stdout.flush() def tst(fobj, fname): """test""" fo = fobj(fname, "rb") fo.read() return print "Python gzip module" start = time.time() cProfile.run( "tst(gzip.GzipFile, 'prof.dat.gz')", "gzstats") p = pstats.Stats("gzstats") p.strip_dirs().sort_stats(-1).print_stats() del p print "Python bz2 module" cProfile.run( "tst(bz2.BZ2File, 'prof.dat.bz2')", "bz2stats") p = pstats.Stats("bz2stats") p.strip_dirs().sort_stats(-1).print_stats() del p def tstsys(cmd): """ test system""" fo = os.popen(cmd,"rb") fo.read() return print "System gzip" cProfile.run( "tstsys('gzip -cd prof.dat.gz')", "gzosstats") p = pstats.Stats("gzosstats") p.strip_dirs().sort_stats(-1).print_stats() del p print "System bz2" cProfile.run( "tstsys('bzip2 -cd prof.dat.bz2')", "bz2osstats") p = pstats.Stats("bz2osstats") p.strip_dirs().sort_stats(-1).print_stats() del p import timeit cl = ["ret = gzip.GzipFile( 'prof.dat.gz' ,'rb').read()", "ret = os.popen( 'gzip -dc prof.dat.gz' ,'rb').read()", "ret = bz2.BZ2File( 'prof.dat.bz2','rb').read()", "ret = os.popen( 'bzip2 -dc prof.dat.bz2','rb').read()", "ret = gzip.GzipFile( 'prof2.dat.gz' ,'rb').read()", "ret = os.popen( 'gzip -dc prof2.dat.gz' ,'rb').read()", "ret = bz2.BZ2File( 'prof2.dat.bz2','rb').read()", "ret = os.popen('bzip2 -dc prof2.dat.bz2','rb').read()", ] if sys.platform != "win32": cl.append("ret = os.popen( 'gzip -dc prof.dat.gz' ,'rb',2**20).read()") cl.append("ret = os.popen( 'bzip2 -dc prof.dat.bz2','rb',2**20).read()") cl.append("ret = os.popen( 'gzip -dc prof2.dat.gz' ,'rb',2**20).read()") cl.append("ret = os.popen(' bzip2 -dc prof2.dat.bz2','rb',2**20).read()") for s in cl: t = timeit.Timer(s, setup="import os, gzip, bz2") print s, ":", t.timeit(5)/5 # Finally - shell version if sys.platform == 'win32': start = time.time() s = "gzip -cd prof.dat.gz > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" start = time.time() s = "bzip2 -cd prof.dat.bz2 > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" start = time.time() s = "gzip -cd prof2.dat.gz > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" start = time.time() s = "bzip2 -cd prof2.dat.bz2 > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" os.remove("junk") else: sys.stdout.flush() s = "time gzip -cd prof.dat.gz > /dev/null" print "Time shell gzip:", s os.system(s) sys.stdout.flush() s = "time bzip2 -cd prof.dat.bz2 > /dev/null" print "Time shell bzip2:", s os.system(s) sys.stdout.flush() s = "time gzip -cd prof2.dat.gz > /dev/null" print "Time shell gzip:", s os.system(s) sys.stdout.flush() s = "time bzip2 -cd prof2.dat.bz2 > /dev/null" print "Time shell bzip2:", s os.system(s) fabio-0.1.3/test/profile/0000755000175000017500000000000012233272207015776 5ustar jeromejerome00000000000000fabio-0.1.3/test/profile/profile_compressed.py0000644000175000017500000000715112120434325022234 0ustar jeromejerome00000000000000 """ Benchmark the bz2 and gzip modules compared to their system counterparts """ import cProfile, os, time, random, gzip, bz2, struct, sys try: import pstats except: print "Your package manager is probably teasing you" print "try sudo apt-get install python-profiler" sys.exit() print "Setting up" npts = int(1e6) data = [ random.random() for i in range(npts) ] sdata = struct.pack( "d"*npts, *tuple(data) ) open("prof.dat","wb").write(sdata) open("prof2.dat","wb").write(" "*npts*8) os.system("gzip -c prof.dat > prof.dat.gz") os.system("bzip2 -c prof.dat > prof.dat.bz2") os.system("gzip -c prof2.dat > prof2.dat.gz") os.system("bzip2 -c prof2.dat > prof2.dat.bz2") print "Done setup" sys.stdout.flush() def tst(fobj, fname): """test""" fo = fobj(fname, "rb") fo.read() return print "Python gzip module" start = time.time() cProfile.run( "tst(gzip.GzipFile, 'prof.dat.gz')", "gzstats") p = pstats.Stats("gzstats") p.strip_dirs().sort_stats(-1).print_stats() del p print "Python bz2 module" cProfile.run( "tst(bz2.BZ2File, 'prof.dat.bz2')", "bz2stats") p = pstats.Stats("bz2stats") p.strip_dirs().sort_stats(-1).print_stats() del p def tstsys(cmd): """ test system""" fo = os.popen(cmd,"rb") fo.read() return print "System gzip" cProfile.run( "tstsys('gzip -cd prof.dat.gz')", "gzosstats") p = pstats.Stats("gzosstats") p.strip_dirs().sort_stats(-1).print_stats() del p print "System bz2" cProfile.run( "tstsys('bzip2 -cd prof.dat.bz2')", "bz2osstats") p = pstats.Stats("bz2osstats") p.strip_dirs().sort_stats(-1).print_stats() del p import timeit cl = ["ret = gzip.GzipFile( 'prof.dat.gz' ,'rb').read()", "ret = os.popen( 'gzip -dc prof.dat.gz' ,'rb').read()", "ret = bz2.BZ2File( 'prof.dat.bz2','rb').read()", "ret = os.popen( 'bzip2 -dc prof.dat.bz2','rb').read()", "ret = gzip.GzipFile( 'prof2.dat.gz' ,'rb').read()", "ret = os.popen( 'gzip -dc prof2.dat.gz' ,'rb').read()", "ret = bz2.BZ2File( 'prof2.dat.bz2','rb').read()", "ret = os.popen('bzip2 -dc prof2.dat.bz2','rb').read()", ] if sys.platform != "win32": cl.append("ret = os.popen( 'gzip -dc prof.dat.gz' ,'rb',2**20).read()") cl.append("ret = os.popen( 'bzip2 -dc prof.dat.bz2','rb',2**20).read()") cl.append("ret = os.popen( 'gzip -dc prof2.dat.gz' ,'rb',2**20).read()") cl.append("ret = os.popen(' bzip2 -dc prof2.dat.bz2','rb',2**20).read()") for s in cl: t = timeit.Timer(s, setup="import os, gzip, bz2") print s, ":", t.timeit(5)/5 # Finally - shell version if sys.platform == 'win32': start = time.time() s = "gzip -cd prof.dat.gz > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" start = time.time() s = "bzip2 -cd prof.dat.bz2 > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" start = time.time() s = "gzip -cd prof2.dat.gz > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" start = time.time() s = "bzip2 -cd prof2.dat.bz2 > junk" os.system(s) print s, ":", time.time()-start, "seconds via shell" os.remove("junk") else: sys.stdout.flush() s = "time gzip -cd prof.dat.gz > /dev/null" print "Time shell gzip:", s os.system(s) sys.stdout.flush() s = "time bzip2 -cd prof.dat.bz2 > /dev/null" print "Time shell bzip2:", s os.system(s) sys.stdout.flush() s = "time gzip -cd prof2.dat.gz > /dev/null" print "Time shell gzip:", s os.system(s) sys.stdout.flush() s = "time bzip2 -cd prof2.dat.bz2 > /dev/null" print "Time shell bzip2:", s os.system(s) fabio-0.1.3/test/profile/benchheader.py0000644000175000017500000000105512120434325020575 0ustar jeromejerome00000000000000 import timeit, os, sys sys.path.insert(0, os.path.abspath("../build/lib.linux-x86_64-2.6")) junk = [".svn", "testfile", "testfile.bz2", "testfile.gz"] #for fname in : # if fname.find("") == -1: # images.append(fname) images = [os.path.join("testimages", i) for i in os.listdir("testimages") if (i not in junk) ] images.sort() for im in images: s = "ret = fabio.openimage.openheader(r\"%s\")" % (im) t = timeit.Timer(s, setup="import fabio.openimage") print "%10.6f" % (t.timeit(10) / 10.0), im fabio-0.1.3/test/test_flat_binary.py0000644000175000017500000000404212120434325020235 0ustar jeromejerome00000000000000 import unittest, sys, os, logging logger = logging.getLogger("test_flat_binary") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio class test_flat_binary(unittest.TestCase): filenames = [ "not.a.file", "bad_news_1234", "empty_files_suck_1234.edf", "notRUBY_1234.dat"] def setUp(self): for filename in self.filenames: f = open(filename, "wb") # A 2048 by 2048 blank image f.write("\0x0" * 2048 * 2048 * 2) f.close() def NOtest_openimage(self): """ test the opening of "junk" empty images ... JK: I wonder if this test makes sense ! """ nfail = 0 for filename in self.filenames: try: im = fabio.open(filename) if im.data.tostring() != "\0x0" * 2048 * 2048 * 2: nfail += 1 else: logger.info("**** Passed: %s" % filename) except: logger.warning("failed for: %s" % filename) nfail += 1 self.assertEqual(nfail, 0, " %s failures out of %s" % (nfail, len(self.filenames))) def tearDown(self): for filename in self.filenames: os.remove(filename) #def test_suite_all_flat(): # testSuite = unittest.TestSuite() # # testSuite.addTest(test_flat_binary("test_openimage")) # return testSuite if __name__ == '__main__': mysuite = test_suite_all_flat() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testfit2dmaskimage.py0000644000175000017500000000615212120434325020477 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- ## Automatically adapted for numpy.oldnumeric Oct 05, 2007 by alter_code1.py # Unit tests """ Test the fit2d mask reader Updated by Jerome Kieffer (jerome.kieffer@esrf.eu), 2011 """ import unittest, sys, os, logging logger = logging.getLogger("testfit2dmaskdfimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.fit2dmaskimage import fit2dmaskimage import numpy class testfacemask(unittest.TestCase): """ test the picture of a face """ def setUp(self): """ download images """ self.filename = UtilsTest.getimage("face.msk.bz2")[:-4] self.edffilename = UtilsTest.getimage("face.edf.bz2") [:-4] def test_getmatch(self): """ test edf and msk are the same """ i = fit2dmaskimage() i.read(self.filename) j = fabio.open(self.edffilename) # print "edf: dim1",oe.dim1,"dim2",oe.dim2 self.assertEqual(i.dim1, j.dim1) self.assertEqual(i.dim2, j.dim2) self.assertEqual(i.data.shape, j.data.shape) diff = j.data - i.data sumd = abs(diff).sum(dtype=float) self.assertEqual(sumd , 0.0) class testclickedmask(unittest.TestCase): """ A few random clicks to make a test mask """ def setUp(self): """ download images """ self.filename = UtilsTest.getimage("fit2d_click.msk.bz2")[:-4] self.edffilename = UtilsTest.getimage("fit2d_click.edf.bz2")[:-4] def test_read(self): """ Check it reads a mask OK """ i = fit2dmaskimage() i.read(self.filename) self.assertEqual(i.dim1 , 1024) self.assertEqual(i.dim2 , 1024) self.assertEqual(i.bpp , 1) self.assertEqual(i.bytecode, numpy.uint8) self.assertEqual(i.data.shape, (1024, 1024)) def test_getmatch(self): """ test edf and msk are the same """ i = fit2dmaskimage() j = fabio.open(self.edffilename) i.read(self.filename) self.assertEqual(i.data.shape, j.data.shape) diff = j.data - i.data self.assertEqual(i.getmax(), 1) self.assertEqual(i.getmin(), 0) sumd = abs(diff).sum(dtype=float) self.assertEqual(sumd , 0) def test_suite_all_fit2d(): testSuite = unittest.TestSuite() testSuite.addTest(testfacemask("test_getmatch")) testSuite.addTest(testclickedmask("test_read")) testSuite.addTest(testclickedmask("test_getmatch")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_fit2d() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testheadernotsingleton.py0000644000175000017500000000343312120434325021503 0ustar jeromejerome00000000000000#!/usr/bin/python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest, sys, os, logging logger = logging.getLogger("testheadernotsingleton") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio import shutil class testheadernotsingleton(unittest.TestCase): def setUp(self): """ download images """ self.file1 = UtilsTest.getimage("mb_LP_1_001.img.bz2")[:-4] def testheader(self): file2 = self.file1.replace("mb_LP_1_001.img", "mb_LP_1_002.img") self.assertTrue(os.path.exists(self.file1)) if not os.path.exists(file2): shutil.copy(self.file1, file2) image1 = fabio.open(self.file1) image2 = fabio.open(file2) self.assertEqual(image1.header['filename'] , self.file1) self.assertEqual(image2.header['filename'] , file2) self.assertNotEqual(image1.header['filename'] , image2.header['filename']) def test_suite_all_header(): testSuite = unittest.TestSuite() testSuite.addTest(testheadernotsingleton("testheader")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_header() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testGEimage.py0000644000175000017500000000437312120434325017111 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest, sys, os, logging logger = logging.getLogger("testfit2dmaskdfimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.GEimage import GEimage # filename dim1 dim2 min max mean stddev TESTIMAGES = """GE_aSI_detector_image_1529 2048 2048 1515 16353 1833.0311 56.9124 GE_aSI_detector_image_1529.gz 2048 2048 1515 16353 1833.0311 56.9124 GE_aSI_detector_image_1529.bz2 2048 2048 1515 16353 1833.0311 56.9124""" class testGE(unittest.TestCase): def setUp(self): """ download images """ self.GE = UtilsTest.getimage("GE_aSI_detector_image_1529.bz2") def test_read(self): for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = GEimage() obj.read(os.path.join(os.path.dirname(self.GE), name)) self.assertAlmostEqual(mini, obj.getmin(), 4, "getmin") self.assertAlmostEqual(maxi, obj.getmax(), 4, "getmax") self.assertAlmostEqual(mean, obj.getmean(), 4, "getmean") self.assertAlmostEqual(stddev, obj.getstddev(), 4, "getstddev") self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(dim2, obj.dim2, "dim2") def test_suite_all_GE(): testSuite = unittest.TestSuite() testSuite.addTest(testGE("test_read")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_GE() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testcbfimage.py0000755000175000017500000001644412233175156017366 0ustar jeromejerome00000000000000#!/usr/bin/env python # coding: utf8 """ 2011: Jerome Kieffer for ESRF. Unit tests for CBF images based on references images taken from: http://pilatus.web.psi.ch/DATA/DATASETS/insulin_0.2/ """ import unittest, sys, os, logging, tempfile logger = logging.getLogger("testcbfimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.cbfimage import cbfimage from fabio.compression import decByteOffet_numpy, decByteOffet_cython import time class test_cbfimage_reader(unittest.TestCase): """ test cbf image reader """ def __init__(self, methodName): "Constructor of the class" unittest.TestCase.__init__(self, methodName) testimgdir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "testimages") self.edf_filename = os.path.join(testimgdir, "run2_1_00148.edf") self.cbf_filename = os.path.join(testimgdir, "run2_1_00148.cbf") def setUp(self): """Download images""" UtilsTest.getimage(os.path.basename(self.edf_filename + ".bz2")) UtilsTest.getimage(os.path.basename(self.cbf_filename)) self.tempdir = tempfile.mkdtemp() def tearDown(self): UtilsTest.recursive_delete(self.tempdir) def test_read(self): """ check whole reader""" times = [] times.append(time.time()) cbf = fabio.open(self.cbf_filename) times.append(time.time()) edf = fabio.open(self.edf_filename) times.append(time.time()) self.assertAlmostEqual(0, abs(cbf.data - edf.data).max()) logger.info("Reading CBF took %.3fs whereas the same EDF took %.3fs" % (times[1] - times[0], times[2] - times[1])) def test_write(self): "Rest writing with self consistency at the fabio level" name = os.path.basename(self.cbf_filename) obj = cbfimage() obj.read(self.cbf_filename) obj.write(os.path.join(self.tempdir, name)) other = cbfimage() other.read(os.path.join(self.tempdir, name)) self.assertEqual(abs(obj.data - other.data).max(), 0, "data are the same") for key in obj.header: if key in[ "filename", "X-Binary-Size-Padding"]: continue self.assertTrue(key in other.header, "Key %s is in header" % key) self.assertEqual(obj.header[key], other.header[key], "value are the same for key %s" % key) def test_byte_offset(self): """ check byte offset algorythm""" cbf = fabio.open(self.cbf_filename) starter = "\x0c\x1a\x04\xd5" startPos = cbf.cif["_array_data.data"].find(starter) + 4 data = cbf.cif["_array_data.data"][ startPos: startPos + int(cbf.header["X-Binary-Size"])] startTime = time.time() numpyRes = decByteOffet_numpy(data, size=cbf.dim1 * cbf.dim2) tNumpy = time.time() - startTime logger.info("Timing for Numpy method : %.3fs" % tNumpy) # startTime = time.time() # weaveRes = cbfimage.analyseWeave(data, size=cbf.dim1 * cbf.dim2) # tWeave = time.time() - startTime # delta = abs(numpyRes - weaveRes).max() # self.assertAlmostEqual(0, delta) # logger.info("Timing for Weave method : %.3fs, max delta=%s" % (tWeave, delta)) # # startTime = time.time() # pythonRes = decByteOffet_numpy(data, size=cbf.dim1 * cbf.dim2) # tPython = time.time() - startTime # delta = abs(numpyRes - pythonRes).max() # self.assertAlmostEqual(0, delta) # logger.info("Timing for Python method : %.3fs, max delta= %s" % (tPython, delta)) startTime = time.time() cythonRes = decByteOffet_cython(stream=data, size=cbf.dim1 * cbf.dim2) tCython = time.time() - startTime delta = abs(numpyRes - cythonRes).max() self.assertAlmostEqual(0, delta) logger.info("Timing for Cython method : %.3fs, max delta= %s" % (tCython, delta)) def test_consitency_manual(self): """ Test if an image can be read and saved and the results are "similar" """ name = os.path.basename(self.cbf_filename) obj = fabio.open(self.cbf_filename) new = fabio.cbfimage.cbfimage(data=obj.data, header=obj.header) new.write(os.path.join(self.tempdir, name)) other = fabio.open(os.path.join(self.tempdir, name)) self.assertEqual(abs(obj.data - other.data).max(), 0, "data are the same") for key in obj.header: if key in[ "filename", "X-Binary-Size-Padding"]: continue self.assertTrue(key in other.header, "Key %s is in header" % key) self.assertEqual(obj.header[key], other.header[key], "value are the same for key %s [%s|%s]" % (key, obj.header[key], other.header[key])) def test_consitency_convert(self): """ Test if an image can be read and saved and the results are "similar" """ name = os.path.basename(self.cbf_filename) obj = fabio.open(self.cbf_filename) new = obj.convert("cbf") new.write(os.path.join(self.tempdir, name)) other = fabio.open(os.path.join(self.tempdir, name)) self.assertEqual(abs(obj.data - other.data).max(), 0, "data are the same") for key in obj.header: if key in[ "filename", "X-Binary-Size-Padding"]: continue self.assertTrue(key in other.header, "Key %s is in header" % key) self.assertEqual(obj.header[key], other.header[key], "value are the same for key %s [%s|%s]" % (key, obj.header[key], other.header[key])) def test_unicode(self): """ Test if an image can be read and saved to an unicode named """ name = unicode(os.path.basename(self.cbf_filename)) obj = fabio.open(self.cbf_filename) obj.write(os.path.join(self.tempdir, name)) other = fabio.open(os.path.join(self.tempdir, name)) self.assertEqual(abs(obj.data - other.data).max(), 0, "data are the same") for key in obj.header: if key in[ "filename", "X-Binary-Size-Padding"]: continue self.assertTrue(key in other.header, "Key %s is in header" % key) self.assertEqual(obj.header[key], other.header[key], "value are the same for key %s [%s|%s]" % (key, obj.header[key], other.header[key])) def test_suite_all_cbf(): testSuite = unittest.TestSuite() testSuite.addTest(test_cbfimage_reader("test_read")) testSuite.addTest(test_cbfimage_reader("test_write")) testSuite.addTest(test_cbfimage_reader("test_byte_offset")) testSuite.addTest(test_cbfimage_reader("test_consitency_manual")) testSuite.addTest(test_cbfimage_reader("test_consitency_convert")) testSuite.addTest(test_cbfimage_reader("test_unicode")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_cbf() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testmar345image.py0000644000175000017500000000756112233175156017644 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest, sys, os, logging, tempfile logger = logging.getLogger("testmar345image") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.mar345image import mar345image # filename dim1 dim2 min max mean stddev TESTIMAGES = """example.mar2300 2300 2300 0 999999 180.15 4122.67 example.mar2300.bz2 2300 2300 0 999999 180.15 4122.67 example.mar2300.gz 2300 2300 0 999999 180.15 4122.67""" class testMAR345(unittest.TestCase): def setUp(self): """ download images """ self.mar = UtilsTest.getimage("example.mar2300.bz2")[:-4] self.tempdir = tempfile.mkdtemp() def tearDown(self): UtilsTest.recursive_delete(self.tempdir) def test_read(self): """ Test the reading of Mar345 images """ for line in TESTIMAGES.split('\n'): vals = line.strip().split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = mar345image() obj.read(os.path.join(os.path.dirname(self.mar), name)) self.assertAlmostEqual(mini, obj.getmin(), 2, "getmin [%s,%s]" % (mini, obj.getmin())) self.assertAlmostEqual(maxi, obj.getmax(), 2, "getmax [%s,%s]" % (maxi, obj.getmax())) self.assertAlmostEqual(mean, obj.getmean(), 2, "getmean [%s,%s]" % (mean, obj.getmean())) self.assertAlmostEqual(stddev, obj.getstddev(), 2, "getstddev [%s,%s]" % (stddev, obj.getstddev())) self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(obj.dim1, obj.dim2, "dim2!=dim1") def test_write(self): "Test writing with self consistency at the fabio level" for line in TESTIMAGES.split("\n"): logger.debug("Processing file: %s" % line) vals = line.split() name = vals[0] obj = mar345image() obj.read(os.path.join(os.path.dirname(self.mar), name)) obj.write(os.path.join(self.tempdir, name)) other = mar345image() other.read(os.path.join(self.tempdir, name)) self.assertEqual(abs(obj.data - other.data).max(), 0, "data are the same") for key in obj.header: if key == "filename": continue self.assertTrue(key in other.header, "Key %s is in header" % key) self.assertEqual(obj.header[key], other.header[key], "value are the same for key %s: [%s|%s]" % (key, obj.header[key], other.header[key])) def test_memoryleak(self): """ This test takes a lot of time, so only in debug mode. """ if logger.getEffectiveLevel() <= logging.INFO: logger.debug("Testing for memory leak") for i in range(1000): img = fabio.open(self.mar) print i def test_suite_all_mar345(): testSuite = unittest.TestSuite() testSuite.addTest(testMAR345("test_read")) testSuite.addTest(testMAR345("test_write")) testSuite.addTest(testMAR345("test_memoryleak")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_mar345() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testtifgz.py0000644000175000017500000000343012120434325016727 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ #gipped Tiff Unit tests #built on testedfimage """ import unittest, sys, os, logging logger = logging.getLogger("testtifgz") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio class testgziptif(unittest.TestCase): def setUp(self): self.unzipped = UtilsTest.getimage("oPPA_5grains_0001.tif.bz2")[:-4] self.zipped = self.unzipped + ".gz" assert os.path.exists(self.zipped) assert os.path.exists(self.unzipped) def test1(self): o1 = fabio.open(self.zipped) o2 = fabio.open(self.unzipped) self.assertEqual(o1.data[0, 0], 10) self.assertEqual(o2.data[0, 0], 10) class testtif_rect(unittest.TestCase): def setUp(self): self.fn = UtilsTest.getimage("testmap1_0002.tif.bz2")[:-4] def test1(self): for ext in ["", ".gz", ".bz2"]: o1 = fabio.open(self.fn + ext) self.assertEqual(o1.data.shape, (100, 120)) def test_suite_all_tiff(): testSuite = unittest.TestSuite() testSuite.addTest(testgziptif("test1")) testSuite.addTest(testtif_rect("test1")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_tiff() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testopenimage.py0000644000175000017500000001543312120434325017556 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest, sys, os, logging logger = logging.getLogger("testopenimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from utilstest import UtilsTest from fabio.openimage import openimage from fabio.edfimage import edfimage from fabio.marccdimage import marccdimage from fabio.fit2dmaskimage import fit2dmaskimage from fabio.OXDimage import OXDimage from fabio.brukerimage import brukerimage from fabio.adscimage import adscimage class testopenedf(unittest.TestCase): """openimage opening edf""" fname = "F2K_Seb_Lyso0675.edf.bz2" def setUp(self): self.fname = UtilsTest.getimage(self.__class__.fname) def testcase(self): """ check we can read EDF image with openimage""" obj = openimage(self.fname) obj2 = edfimage() obj2.read(self.fname) self.assertEqual(obj.data[10, 10], obj2.data[10, 10]) self.assertEqual(type(obj), type(obj2)) self.assertEqual(abs(obj.data.astype(int) - obj2.data.astype(int)).sum(), 0) # etc class testedfgz(testopenedf): """openimage opening edf gzip""" fname = "F2K_Seb_Lyso0675.edf.gz" class testedfbz2(testopenedf): """openimage opening edf bzip""" fname = "F2K_Seb_Lyso0675.edf.bz2" class testopenmccd(unittest.TestCase): """openimage opening mccd""" fname = "somedata_0001.mccd" def setUp(self): self.fname = UtilsTest.getimage(self.__class__.fname) def testcase(self): """ check we can read it""" obj = openimage(self.fname) obj2 = marccdimage() obj2.read(self.fname) self.assertEqual(obj.data[10, 10], obj2.data[10, 10]) self.assertEqual(type(obj), type(obj2)) self.assertEqual(abs(obj.data.astype(int) - obj2.data.astype(int)).sum(), 0) # etc class testmccdgz(testopenmccd): """openimage opening mccd gzip""" fname = "somedata_0001.mccd.gz" class testmccdbz2(testopenmccd): """openimage opening mccd bzip""" fname = "somedata_0001.mccd.bz2" class testmask(unittest.TestCase): """openimage opening mccd""" fname = "face.msk" def setUp(self): """ check file exists """ self.fname = UtilsTest.getimage(self.__class__.fname) def testcase(self): """ check we can read Fit2D mask with openimage""" obj = openimage(self.fname) obj2 = fit2dmaskimage() obj2.read(self.fname) self.assertEqual(obj.data[10, 10], obj2.data[10, 10]) self.assertEqual(type(obj), type(obj2)) self.assertEqual(abs(obj.data.astype(int) - obj2.data.astype(int)).sum(), 0) self.assertEqual(abs(obj.data.astype(int) - obj2.data.astype(int)).sum(), 0) # etc class testmaskgz(testmask): """openimage opening mccd gzip""" fname = "face.msk.gz" class testmaskbz2(testmask): """openimage opening mccd bzip""" fname = "face.msk.bz2" class testbruker(unittest.TestCase): """openimage opening bruker""" fname = "Cr8F8140k103.0026" def setUp(self): self.fname = UtilsTest.getimage(self.__class__.fname) def testcase(self): """ check we can read it""" obj = openimage(self.fname) obj2 = brukerimage() obj2.read(self.fname) self.assertEqual(obj.data[10, 10], obj2.data[10, 10]) self.assertEqual(type(obj), type(obj2)) self.assertEqual(abs(obj.data.astype(int) - obj2.data.astype(int)).sum(), 0) # etc class testbrukergz(testbruker): """openimage opening bruker gzip""" fname = "Cr8F8140k103.0026.gz" class testbrukerbz2(testbruker): """openimage opening bruker bzip""" fname = "Cr8F8140k103.0026.bz2" class testadsc(unittest.TestCase): """openimage opening adsc""" fname = os.path.join("testimages", "mb_LP_1_001.img") def setUp(self): self.fname = UtilsTest.getimage("mb_LP_1_001.img.bz2") def testcase(self): """ check we can read it""" obj = openimage(self.fname) obj2 = adscimage() obj2.read(self.fname) self.assertEqual(obj.data[10, 10], obj2.data[10, 10]) self.assertEqual(type(obj), type(obj2)) self.assertEqual(abs(obj.data.astype(int) - obj2.data.astype(int)).sum(), 0) # etc class testadscgz(testadsc): """openimage opening adsc gzip""" fname = os.path.join("testimages", "mb_LP_1_001.img.gz") class testadscbz2(testadsc): """openimage opening adsc bzip""" fname = os.path.join("testimages", "mb_LP_1_001.img.bz2") class testOXD(unittest.TestCase): """openimage opening adsc""" fname = "b191_1_9_1.img.bz2" def setUp(self): self.fname = UtilsTest.getimage(self.__class__.fname)[:-4] def testcase(self): """ check we can read OXD images with openimage""" obj = openimage(self.fname) obj2 = OXDimage() obj2.read(self.fname) self.assertEqual(obj.data[10, 10], obj2.data[10, 10]) self.assertEqual(type(obj), type(obj2)) self.assertEqual(abs(obj.data.astype(int) - obj2.data.astype(int)).sum(), 0) # etc class testOXDUNC(testOXD): """openimage opening oxd""" fname = "b191_1_9_1_uncompressed.img.bz2" def setUp(self): self.fname = UtilsTest.getimage(self.__class__.fname)[:-4] def test_suite_all_openimage(): testSuite = unittest.TestSuite() testSuite.addTest(testedfbz2("testcase")) testSuite.addTest(testopenedf("testcase")) testSuite.addTest(testedfgz("testcase")) testSuite.addTest(testmccdbz2("testcase")) testSuite.addTest(testopenmccd("testcase")) testSuite.addTest(testmccdgz("testcase")) testSuite.addTest(testmaskbz2("testcase")) testSuite.addTest(testmask("testcase")) testSuite.addTest(testmaskgz("testcase")) testSuite.addTest(testbrukerbz2("testcase")) testSuite.addTest(testbruker("testcase")) testSuite.addTest(testbrukergz("testcase")) testSuite.addTest(testadscbz2("testcase")) testSuite.addTest(testadsc("testcase")) testSuite.addTest(testadscgz("testcase")) testSuite.addTest(testOXD("testcase")) testSuite.addTest(testOXDUNC("testcase")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_openimage() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/benchheader.py0000644000175000017500000000105512120434325017135 0ustar jeromejerome00000000000000 import timeit, os, sys sys.path.insert(0, os.path.abspath("../build/lib.linux-x86_64-2.6")) junk = [".svn", "testfile", "testfile.bz2", "testfile.gz"] #for fname in : # if fname.find("") == -1: # images.append(fname) images = [os.path.join("testimages", i) for i in os.listdir("testimages") if (i not in junk) ] images.sort() for im in images: s = "ret = fabio.openimage.openheader(r\"%s\")" % (im) t = timeit.Timer(s, setup="import fabio.openimage") print "%10.6f" % (t.timeit(10) / 10.0), im fabio-0.1.3/test/testfabioimage.py0000644000175000017500000001652412233175156017710 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ Test cases for the fabioimage class testsuite by Jerome Kieffer (Jerome.Kieffer@esrf.eu) """ import unittest, sys, os, logging logger = logging.getLogger("testfabioimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.fabioimage import fabioimage import numpy import gzip, bz2 class test50000(unittest.TestCase): """ test with 50000 everywhere""" def setUp(self): """make the image""" dat = numpy.ones((1024, 1024), numpy.uint16) dat = (dat * 50000).astype(numpy.uint16) assert dat.dtype.char == numpy.ones((1), numpy.uint16).dtype.char hed = {"Title":"50000 everywhere"} self.obj = fabioimage(dat, hed) def testgetmax(self): """check max""" self.assertEqual(self.obj.getmax(), 50000) def testgetmin(self): """check min""" self.assertEqual(self.obj.getmin(), 50000) def testgetmean(self): """check mean""" self.assertEqual(self.obj.getmean(), 50000) def getstddev(self): """check stddev""" self.assertEqual(self.obj.getstddev(), 0) class testslices(unittest.TestCase): """check slicing""" def setUp(self): """make test data""" dat2 = numpy.zeros((1024, 1024), numpy.uint16) hed = {"Title":"zeros and 100"} self.cord = [ 256, 256, 790, 768 ] self.obj = fabioimage(dat2, hed) self.slic = slic = self.obj.make_slice(self.cord) # Note - d2 is modified *after* fabioimage is made dat2[slic] = dat2[slic] + 100 assert self.obj.maxval is None assert self.obj.minval is None self.npix = (slic[0].stop - slic[0].start) * \ (slic[1].stop - slic[1].start) def testgetmax(self): """check max""" self.assertEqual(self.obj.getmax(), 100) def testgetmin(self): """check min""" self.assertEqual(self.obj.getmin(), 0) def testintegratearea(self): """ check integrations""" self.obj.resetvals() area1 = self.obj.integrate_area(self.cord) self.obj.resetvals() area2 = self.obj.integrate_area(self.slic) self.assertEqual(area1, area2) self.assertEqual(area1, self.npix * 100) def testRebin(self): """Test the rebin method""" big = numpy.arange(64).reshape((8, 8)) res = numpy.array([[13, 17], [45, 49]]) fabimg = fabioimage(data=big, header={}) fabimg.rebin(4, 4) self.assertEqual(abs(res - fabimg.data).max(), 0, "data are the same after rebin") class testopen(unittest.TestCase): """check opening compressed files""" testfile = os.path.join(UtilsTest.test_home, "testimages", "testfile") def setUp(self): """ create test files""" if not os.path.isfile(self.testfile): open(self.testfile, "wb").write("{ hello }") if not os.path.isfile(self.testfile + ".gz"): gzip.open(self.testfile + ".gz", "wb").write("{ hello }") if not os.path.isfile(self.testfile + ".bz2"): bz2.BZ2File(self.testfile + ".bz2", "wb").write("{ hello }") self.obj = fabioimage() def testFlat(self): """ no compression""" res = self.obj._open(self.testfile).read() self.assertEqual(res , "{ hello }") def testgz(self): """ gzipped """ res = self.obj._open(self.testfile + ".gz").read() self.assertEqual(res , "{ hello }") def testbz2(self): """ bzipped""" res = self.obj._open(self.testfile + ".bz2").read() self.assertEqual(res , "{ hello }") NAMES = { numpy.uint8 : "numpy.uint8", numpy.int8 : "numpy.int8" , numpy.uint16: "numpy.uint16", numpy.int16 : "numpy.int16" , numpy.uint32: "numpy.uint32" , numpy.int32 : "numpy.int32" , numpy.float32: "numpy.float32" , numpy.float64: "numpy.float64"} class testPILimage(unittest.TestCase): """ check PIL creation""" def setUp(self): """ list of working numeric types""" self.okformats = [numpy.uint8, numpy.int8, numpy.uint16, numpy.int16, numpy.uint32, numpy.int32, numpy.float32] def mkdata(self, shape, typ): """ generate [01] testdata """ return (numpy.random.random(shape)).astype(typ) def testpil(self): for typ in self.okformats: name = NAMES[typ] for shape in [(10, 20), (431, 1325)]: testdata = self.mkdata(shape, typ) img = fabioimage(testdata, {"title":"Random data"}) pim = img.toPIL16() for i in [ 0, 5, 6, shape[1] - 1 ]: for j in [0, 5, 7, shape[0] - 1 ]: errstr = name + " %d %d %f %f t=%s" % ( i, j, testdata[j, i], pim.getpixel((i, j)), typ) er1 = img.data[j, i] - pim.getpixel((i, j)) er2 = img.data[j, i] + pim.getpixel((i, j)) # difference as % error in case of rounding if er2 != 0.: err = er1 / er2 else: err = er1 self.assertAlmostEquals(err, 0, 6, errstr) class testPILimage2(testPILimage): """ check with different numbers""" def mkdata(self, shape, typ): """ positive and big""" return (numpy.random.random(shape) * sys.maxint / 10).astype(typ) class testPILimage3(testPILimage): """ check with different numbers""" def mkdata(self, shape, typ): """ positive, negative and big""" return ((numpy.random.random(shape) - 0.5) * sys.maxint / 10).astype(typ) def test_suite_all_fabio(): testSuite = unittest.TestSuite() testSuite.addTest(test50000("testgetmax")) testSuite.addTest(test50000("testgetmin")) testSuite.addTest(test50000("testgetmean")) testSuite.addTest(test50000("getstddev")) testSuite.addTest(testslices("testgetmax")) testSuite.addTest(testslices("testgetmin")) testSuite.addTest(testslices("testintegratearea")) testSuite.addTest(testslices("testRebin")) testSuite.addTest(testopen("testFlat")) testSuite.addTest(testopen("testgz")) testSuite.addTest(testopen("testbz2")) testSuite.addTest(testPILimage("testpil")) testSuite.addTest(testPILimage2("testpil")) testSuite.addTest(testPILimage3("testpil")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_fabio() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/test_all_images.py0000644000175000017500000000524212120434325020043 0ustar jeromejerome00000000000000 """ Check we can read all the test images """ import glob, os, time, fabio.openimage, gzip, bz2, pstats, sys try: import cProfile except: import profile as cProfile times = {} images = [] for fname in glob.glob(os.path.join("testimages","*")): if fname.find("header_only")==-1: images.append(fname) images.sort() def shellbench(cmd, imname): """ The shell appears to be lying about it's performance. It claims zero time to gunzip a file when it actually takes 200 ms. This is cheating via a cache I suspect. We shall try to avoid this problem """ if sys.platform != "win32": os.system("touch "+imname) astart = time.time() dummy_file = os.popen(cmd + " " + imname, "rb").read() return time.time() - astart print "I/O 1 : Time to read the image" print "I/O 2 : Time to read the image (repeat" print "Fabio : Time for fabio to read the image" print "Shell : Time for shell to do decompression" print "Python : Time for python to do decompression\n" print "I/O 1 I/O 2 Fabio Shell Python Size/MB" for im in images: # Network/disk io time first start = time.clock() the_file = open(im,"rb").read() times[im] = [ time.clock()-start ] start = time.clock() # Network/disk should be cached the_file = open(im,"rb").read() times[im].append( time.clock() - start ) start = time.clock() try: fim = fabio.openimage.openimage(im) except KeyboardInterrupt: raise except: print "Problem with", im continue # raise times[im].append( time.clock() - start ) nt = 3 ns = 2 # Now check for a fabio slowdown effect if im[-3:] == '.gz': times[im].append(shellbench("gzip -cd ", im)) nt += 1 ns -= 1 start = time.clock() the_file = gzip.GzipFile(im,"rb").read() times[im].append( time.clock()-start ) nt += 1 ns -= 1 if im[-4:] == '.bz2': times[im].append(shellbench("bzip2 -cd ", im)) nt += 1 ns -= 1 start = time.clock() the_file = bz2.BZ2File(im,"rb").read() times[im].append( time.clock()-start ) nt += 1 ns -= 1 # Speed ratings in megabytes per second (for fabio) MB = len(the_file) / 1024.0 / 1024.0 try: print ("%.4f "*nt + " "*7*ns)% tuple(times[im]), "%8.3f"%(MB), im except: print times[im], MB, im raise cProfile.run("fabio.openimage.openimage(im)","stats") p = pstats.Stats("stats") # Hack around python2.4 s = sys.stdout sys.stdout = open("profile.txt","a") p.strip_dirs().sort_stats(-1).print_stats() sys.stdout = s fabio-0.1.3/test/testtifimage.py0000755000175000017500000000743512120434325017405 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Tiff Unit tests #built on testedfimage """ import unittest import os import logging import sys logger = logging.getLogger("testTiff") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from testtifgz import testtif_rect, testgziptif class testtifimage_pilatus(unittest.TestCase): def setUp(self): self.fn = {} for i in ["pilatus2M.tif", "pilatus2M.edf"]: self.fn[i] = UtilsTest.getimage(i + ".bz2") for i in self.fn: assert os.path.exists(self.fn[i]) def test1(self): """ Testing pilatus tif bug """ o1 = fabio.open(self.fn["pilatus2M.tif"]).data o2 = fabio.open(self.fn["pilatus2M.edf"]).data self.assertEqual(abs(o1 - o2).max(), 0.0) class testtifimage_packbits(unittest.TestCase): def setUp(self): self.fn = {} for i in ["oPPA_5grains_0001.tif", "oPPA_5grains_0001.edf"]: self.fn[i] = UtilsTest.getimage(i + ".bz2") for i in self.fn: assert os.path.exists(self.fn[i]) def test1(self): """ Testing packbit comressed data tif bug """ o1 = fabio.open(self.fn["oPPA_5grains_0001.tif"]).data o2 = fabio.open(self.fn["oPPA_5grains_0001.edf"]).data self.assertEqual(abs(o1 - o2).max(), 0.0) class testtifimage_fit2d(unittest.TestCase): def setUp(self): self.fn = {} for i in ["fit2d.tif", "fit2d.edf"]: self.fn[i] = UtilsTest.getimage(i + ".bz2") for i in self.fn: assert os.path.exists(self.fn[i]) def test1(self): """ Testing packbit comressed data tif bug """ o1 = fabio.open(self.fn["fit2d.tif"]).data o2 = fabio.open(self.fn["fit2d.edf"]).data self.assertEqual(abs(o1 - o2).max(), 0.0) class testtifimage_a0009(unittest.TestCase): """ test image from ??? with this error a0009.tif TIFF 1024x1024 1024x1024+0+0 16-bit Grayscale DirectClass 2MiB 0.000u 0:00.010 identify: a0009.tif: invalid TIFF directory; tags are not sorted in ascending order. `TIFFReadDirectory' @ tiff.c/TIFFWarnings/703. identify: a0009.tif: TIFF directory is missing required "StripByteCounts" field, calculating from imagelength. `TIFFReadDirectory' @ tiff.c/TIFFWarnings/703. """ def setUp(self): self.fn = {} for i in ["a0009.tif", "a0009.edf"]: self.fn[i] = UtilsTest.getimage(i + ".bz2")[:-4] for i in self.fn: assert os.path.exists(self.fn[i]) def test1(self): """ Testing packbit comressed data tif bug """ o1 = fabio.open(self.fn["a0009.tif"]).data o2 = fabio.open(self.fn["a0009.edf"]).data self.assertEqual(abs(o1 - o2).max(), 0.0) def test_suite_all_tiffimage(): testSuite = unittest.TestSuite() testSuite.addTest(testtifimage_packbits("test1")) testSuite.addTest(testtifimage_pilatus("test1")) testSuite.addTest(testtifimage_fit2d("test1")) testSuite.addTest(testgziptif("test1")) testSuite.addTest(testtif_rect("test1")) testSuite.addTest(testtifimage_a0009("test1")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_tiffimage() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testkcdimage.py0000755000175000017500000000515512120434325017361 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ Test for Nonius Kappa CCD cameras. """ import unittest, sys, os, logging logger = logging.getLogger("testkcdimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.kcdimage import kcdimage from fabio.edfimage import edfimage from fabio.openimage import openimage class testkcd(unittest.TestCase): """basic test""" kcdfilename = 'i01f0001.kcd' edffilename = 'i01f0001.edf' results = """i01f0001.kcd 625 576 96 66814.0 195.3862972 243.58150990245315""" def setUp(self): """Download files""" self.fn = {} for i in ["i01f0001.kcd", "i01f0001.edf"]: self.fn[i] = UtilsTest.getimage(i + ".bz2")[:-4] for i in self.fn: assert os.path.exists(self.fn[i]) def test_read(self): """ check we can read kcd images""" vals = self.results.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = openimage(self.fn[self.kcdfilename]) self.assertAlmostEqual(mini, obj.getmin(), 4, "getmin") self.assertAlmostEqual(maxi, obj.getmax(), 4, "getmax") self.assertAlmostEqual(mean, obj.getmean(), 4, "getmean") self.assertAlmostEqual(stddev, obj.getstddev(), 4, "getstddev") self.assertEqual(dim1, obj.dim1, "dim1") self.assertEqual(dim2, obj.dim2, "dim2") def test_same(self): """ see if we can read kcd images and if they are the same as the EDF """ kcd = kcdimage() kcd.read(self.fn[self.kcdfilename]) edf = fabio.open(self.fn[self.edffilename]) diff = (kcd.data.astype("int32") - edf.data.astype("int32")) self.assertAlmostEqual(abs(diff).sum(dtype=int), 0, 4) def test_suite_all_kcd(): testSuite = unittest.TestSuite() testSuite.addTest(testkcd("test_read")) testSuite.addTest(testkcd("test_same")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_kcd() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/testedfimage.py0000755000175000017500000003400412233175220017352 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ # Unit tests # builds on stuff from ImageD11.test.testpeaksearch """ import unittest, sys, os, logging, tempfile logger = logging.getLogger("testedfimage") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.edfimage import edfimage import numpy import gzip, bz2 class testflatedfs(unittest.TestCase): """ test some flat images """ filename = os.path.join(UtilsTest.test_home, "testimages", "im0000.edf") MYHEADER = "{\n%-1020s}\n" % ( """Omega = 0.0 ; Dim_1 = 256 ; Dim_2 = 256 ; DataType = FloatValue ; ByteOrder = LowByteFirst ; Image = 1; History-1 = something=something else; \n\n""") MYIMAGE = numpy.ones((256, 256), numpy.float32) * 10 MYIMAGE[0, 0] = 0 MYIMAGE[1, 1] = 20 assert len(MYIMAGE[0:1, 0:1].tostring()) == 4, \ len(MYIMAGE[0:1, 0:1].tostring()) def setUp(self): """ initialize""" if not os.path.isfile(self.filename): outf = open(self.filename, "wb") assert len(self.MYHEADER) % 1024 == 0 outf.write(self.MYHEADER) outf.write(self.MYIMAGE.tostring()) outf.close() def test_read(self): """ check readable""" obj = edfimage() obj.read(self.filename) self.assertEqual(obj.dim1 , 256, msg="dim1!=256 for file: %s" % self.filename) self.assertEqual(obj.dim2 , 256, msg="dim2!=256 for file: %s" % self.filename) self.assertEqual(obj.bpp , 4, msg="bpp!=4 for file: %s" % self.filename) self.assertEqual(obj.bytecode, numpy.float32, msg="bytecode!=flot32 for file: %s" % self.filename) self.assertEqual(obj.data.shape, (256, 256), msg="shape!=(256,256) for file: %s" % self.filename) self.assertEqual(obj.header['History-1'], "something=something else") def test_getstats(self): """ test statistics""" obj = edfimage() obj.read(self.filename) self.assertEqual(obj.getmean() , 10) self.assertEqual(obj.getmin() , 0) self.assertEqual(obj.getmax() , 20) class testbzipedf(testflatedfs): """ same for bzipped versions """ def setUp(self): """set it up""" testflatedfs.setUp(self) if not os.path.isfile(self.filename + ".bz2"): bz2.BZ2File(self.filename + ".bz2", "wb").write(open(self.filename, "rb").read()) self.filename += ".bz2" class testgzipedf(testflatedfs): """ same for gzipped versions """ def setUp(self): """ set it up """ testflatedfs.setUp(self) if not os.path.isfile(self.filename + ".gz"): gzip.open(self.filename + ".gz", "wb").write(open(self.filename, "rb").read()) self.filename += ".gz" # statistics come from fit2d I think # filename dim1 dim2 min max mean stddev TESTIMAGES = """F2K_Seb_Lyso0675.edf 2048 2048 982 17467 1504.29 217.61 F2K_Seb_Lyso0675.edf.bz2 2048 2048 982 17467 1504.29 217.61 F2K_Seb_Lyso0675.edf.gz 2048 2048 982 17467 1504.29 217.61 id13_badPadding.edf 512 512 85 61947 275.62 583.44 """ class testedfs(unittest.TestCase): """ Read some test images """ def setUp(self): self.im_dir = os.path.dirname(UtilsTest.getimage("F2K_Seb_Lyso0675.edf.bz2")) UtilsTest.getimage("id13_badPadding.edf.bz2") def test_read(self): """ check we can read these images""" for line in TESTIMAGES.split("\n"): vals = line.split() name = vals[0] dim1, dim2 = [int(x) for x in vals[1:3]] mini, maxi, mean, stddev = [float(x) for x in vals[3:]] obj = edfimage() try: obj.read(os.path.join(self.im_dir, name)) except: print "Cannot read image", name raise self.assertAlmostEqual(mini, obj.getmin(), 2, "testedfs: %s getmin()" % name) self.assertAlmostEqual(maxi, obj.getmax(), 2, "testedfs: %s getmax" % name) logger.info("%s Mean: exp=%s, obt=%s" % (name, mean, obj.getmean())) self.assertAlmostEqual(mean, obj.getmean(), 2, "testedfs: %s getmean" % name) logger.info("%s StdDev: exp=%s, obt=%s" % (name, stddev, obj.getstddev())) self.assertAlmostEqual(stddev, obj.getstddev(), 2, "testedfs: %s getstddev" % name) self.assertEqual(dim1, obj.dim1, "testedfs: %s dim1" % name) self.assertEqual(dim2, obj.dim2, "testedfs: %s dim2" % name) def test_rebin(self): """test the rebin of edfdata""" f = edfimage() f.read(os.path.join(self.im_dir, "F2K_Seb_Lyso0675.edf")) f.rebin(1024, 1024) self.assertEqual(abs(numpy.array([[1547, 1439], [1536, 1494]]) - f.data).max(), 0, "data are the same after rebin") class testedfcompresseddata(unittest.TestCase): """ Read some test images with their data-block compressed. Z-Compression and Gzip compression are implemented Bzip2 and byte offet are experimental """ def setUp(self): self.im_dir = os.path.dirname(UtilsTest.getimage("edfGzip_U16.edf.bz2")) UtilsTest.getimage("edfCompressed_U16.edf.bz2") UtilsTest.getimage("edfUncompressed_U16.edf.bz2") def test_read(self): """ check we can read these images""" ref = edfimage() gzipped = edfimage() compressed = edfimage() refFile = "edfUncompressed_U16.edf" gzippedFile = "edfGzip_U16.edf" compressedFile = "edfCompressed_U16.edf" try: ref.read(os.path.join(self.im_dir, refFile)) except: raise RuntimeError("Cannot read image Uncompressed image %s" % refFile) try: gzipped.read(os.path.join(self.im_dir, gzippedFile)) except: raise RuntimeError("Cannot read image gzippedFile image %s" % gzippedFile) try: compressed.read(os.path.join(self.im_dir, compressedFile)) except: raise RuntimeError("Cannot read image compressedFile image %s" % compressedFile) self.assertEqual((ref.data - gzipped.data).max(), 0, "Gzipped data block is correct") self.assertEqual((ref.data - compressed.data).max(), 0, "Zlib compressed data block is correct") class testedfmultiframe(unittest.TestCase): """ Read some test images with their data-block compressed. Z-Compression and Gzip compression are implemented Bzip2 and byte offet are experimental """ def setUp(self): self.multiFrameFilename = UtilsTest.getimage("MultiFrame.edf.bz2")[:-4] self.Frame0Filename = UtilsTest.getimage("MultiFrame-Frame0.edf.bz2")[:-4] self.Frame1Filename = UtilsTest.getimage("MultiFrame-Frame1.edf.bz2")[:-4] self.ref = edfimage() self.frame0 = edfimage() self.frame1 = edfimage() try: self.ref.read(self.multiFrameFilename) except: raise RuntimeError("Cannot read image multiFrameFilename image %s" % self.multiFrameFilename) try: self.frame0.read(self.Frame0Filename) except: raise RuntimeError("Cannot read image Frame0File image %s" % self.Frame0File) try: self.frame1.read(self.Frame1Filename) except: raise RuntimeError("Cannot read image Frame1File image %s" % self.Frame1File) def test_getFrame_multi(self): """testedfmultiframe.test_getFrame_multi""" self.assertEqual((self.ref.data - self.frame0.data).max(), 0, "getFrame_multi: Same data for frame 0") f1_multi = self.ref.getframe(1) # logger.warning("f1_multi.header=%s\nf1_multi.data= %s" % (f1_multi.header, f1_multi.data)) self.assertEqual((f1_multi.data - self.frame1.data).max(), 0, "getFrame_multi: Same data for frame 1") def test_getFrame_mono(self): "testedfmultiframe.test_getFrame_mono" self.assertEqual((self.ref.data - self.frame0.data).max(), 0, "getFrame_mono: Same data for frame 0") f1_mono = self.frame0.getframe(1) self.assertEqual((f1_mono.data - self.frame1.data).max(), 0, "getFrame_mono: Same data for frame 1") def test_next_multi(self): """testedfmultiframe.test_getFrame_mono""" self.assertEqual((self.ref.data - self.frame0.data).max(), 0, "next_multi: Same data for frame 0") next = self.ref.next() self.assertEqual((next.data - self.frame1.data).max(), 0, "next_multi: Same data for frame 1") def text_next_mono(self): "testedfmultiframe.text_next_mono" self.assertEqual((self.ref.data - self.frame0.data).max(), 0, "next_mono: Same data for frame 0") next = self.frame0.next() self.assertEqual((next.data - self.frame1.data).max(), 0, "next_mono: Same data for frame 1") def test_previous_multi(self): """testedfmultiframe.test_previous_multi""" f1 = self.ref.getframe(1) self.assertEqual((f1.data - self.frame1.data).max(), 0, "previous_multi: Same data for frame 1") f0 = f1.previous() self.assertEqual((f0.data - self.frame1.data).max(), 0, "previous_multi: Same data for frame 0") def test_previous_mono(self): "testedfmultiframe.test_previous_mono" f1 = self.ref.getframe(1) self.assertEqual((f1.data - self.frame1.data).max(), 0, "previous_mono: Same data for frame 1") prev = self.frame1.previous() self.assertEqual((prev.data - self.frame0.data).max(), 0, "previous_mono: Same data for frame 0") def test_openimage_multiframes(self): "test if openimage can directly read first or second frame of a multi-frame" self.assertEqual((fabio.open(self.multiFrameFilename).data - self.frame0.data).max(), 0, "openimage_multiframes: Same data for default ") self.assertEqual((fabio.open(self.multiFrameFilename, 0).data - self.frame0.data).max(), 0, "openimage_multiframes: Same data for frame 0") self.assertEqual((fabio.open(self.multiFrameFilename, 1).data - self.frame1.data).max(), 0, "openimage_multiframes: Same data for frame 1") class testedffastread(unittest.TestCase): """ Read some test images with their data-block compressed. Z-Compression and Gzip compression are implemented Bzip2 and byte offet are experimental """ def setUp(self): self.refFilename = UtilsTest.getimage("MultiFrame-Frame0.edf.bz2") self.fastFilename = self.refFilename[:-4] def test_fastread(self): ref = fabio.open(self.refFilename) refdata = ref.data obt = ref.fastReadData(self.fastFilename) self.assertEqual(abs(obt - refdata).max(), 0, "testedffastread: Same data") class testedfwrite(unittest.TestCase): """ Write dummy edf files with various compression schemes """ def setUp(self): self.data = numpy.arange(100).reshape((10, 10)) self.header = {"toto": "tutu"} self.tmpdir = tempfile.mkdtemp(prefix="testedfwrite") def testFlat(self): self.filename = os.path.join(self.tmpdir, "merged.azim") e = edfimage(data=self.data, header=self.header) e.write(self.filename) r = fabio.open(self.filename) self.assert_(r.header["toto"] == self.header["toto"], "header are OK") self.assert_(abs(r.data - self.data).max() == 0, "data are OK") self.assertEqual(int(r.header["EDF_HeaderSize"]), 512, "header size is one 512 block") def testGzip(self): self.filename = os.path.join(self.tmpdir, "merged.azim.gz") e = edfimage(data=self.data, header=self.header) e.write(self.filename) r = fabio.open(self.filename) self.assert_(r.header["toto"] == self.header["toto"], "header are OK") self.assert_(abs(r.data - self.data).max() == 0, "data are OK") self.assertEqual(int(r.header["EDF_HeaderSize"]), 512, "header size is one 512 block") def testBzip2(self): self.filename = os.path.join(self.tmpdir, "merged.azim.gz") e = edfimage(data=self.data, header=self.header) e.write(self.filename) r = fabio.open(self.filename) self.assert_(r.header["toto"] == self.header["toto"], "header are OK") self.assert_(abs(r.data - self.data).max() == 0, "data are OK") self.assertEqual(int(r.header["EDF_HeaderSize"]), 512, "header size is one 512 block") def tearDown(self): os.unlink(self.filename) os.rmdir(self.tmpdir) def test_suite_all_edf(): testSuite = unittest.TestSuite() testSuite.addTest(testflatedfs("test_read")) testSuite.addTest(testflatedfs("test_getstats")) testSuite.addTest(testbzipedf("test_read")) testSuite.addTest(testbzipedf("test_getstats")) testSuite.addTest(testgzipedf("test_read")) testSuite.addTest(testgzipedf("test_getstats")) testSuite.addTest(testedfs("test_read")) testSuite.addTest(testedfs("test_rebin")) testSuite.addTest(testedfcompresseddata("test_read")) testSuite.addTest(testedfmultiframe("test_getFrame_multi")) testSuite.addTest(testedfmultiframe("test_getFrame_mono")) testSuite.addTest(testedfmultiframe("test_next_multi")) testSuite.addTest(testedfmultiframe("text_next_mono")) testSuite.addTest(testedfmultiframe("test_previous_multi")) testSuite.addTest(testedfmultiframe("test_openimage_multiframes")) testSuite.addTest(testedffastread("test_fastread")) testSuite.addTest(testedfwrite("testFlat")) testSuite.addTest(testedfwrite("testGzip")) testSuite.addTest(testedfwrite("testBzip2")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_edf() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/test/test_file_series.py0000644000175000017500000000702012120434325020233 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ test cases for fileseries """ import unittest import os import logging import sys logger = logging.getLogger("test_file_series") force_build = False for opts in sys.argv[:]: if opts in ["-d", "--debug"]: logging.basicConfig(level=logging.DEBUG) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-i", "--info"]: logging.basicConfig(level=logging.INFO) sys.argv.pop(sys.argv.index(opts)) elif opts in ["-f", "--force"]: force_build = True sys.argv.pop(sys.argv.index(opts)) try: logger.debug("Tests loaded from file: %s" % __file__) except: __file__ = os.getcwd() from utilstest import UtilsTest if force_build: UtilsTest.forceBuild() import fabio from fabio.file_series import numbered_file_series , file_series class testrandomseries(unittest.TestCase): """arbitrary series""" def setUp(self): """sets up""" self.fso = file_series(["first", "second", "last" ]) def testfirst(self): """check first""" self.assertEqual("first", self.fso.first()) def testlast(self): """check first""" self.assertEqual("last" , self.fso.last()) def testjump(self): """check jump""" self.assertEqual("second", self.fso.jump(1)) class testedfnumbered(unittest.TestCase): """ Typical sequence of edf files """ def setUp(self): """ note extension has the . in it""" self.fso = numbered_file_series("mydata", 0, 10005, ".edf") def testfirst(self): """ first in series""" self.assertEqual(self.fso.first(), "mydata0000.edf") def testlast(self): """ last in series""" self.assertEqual(self.fso.last(), "mydata10005.edf") def testnext(self): """ check all in order """ mylist = [ "mydata%04d.edf" % (i) for i in range(0, 10005) ] i = 1 while i < len(mylist): self.assertEqual(mylist[i], self.fso.next()) i += 1 def testprevious(self): """ check all in order """ mylist = [ "mydata%04d.edf" % (i) for i in range(0, 10005) ] i = 10003 self.fso.jump(10004) while i > 0 : self.assertEqual(mylist[i], self.fso.previous()) i -= 1 def testprevjump(self): """check current""" self.fso.jump(9999) self.assertEqual("mydata9999.edf", self.fso.current()) self.assertEqual("mydata9998.edf", self.fso.previous()) def testnextjump(self): """check current""" self.fso.jump(9999) self.assertEqual("mydata9999.edf", self.fso.current()) self.assertEqual("mydata10000.edf", self.fso.next()) def testlen(self): """check len""" self.assertEqual(self.fso.len() , 10006)# +1 for 0000 def test_suite_all_series(): testSuite = unittest.TestSuite() testSuite.addTest(testrandomseries("testfirst")) testSuite.addTest(testrandomseries("testlast")) testSuite.addTest(testrandomseries("testjump")) testSuite.addTest(testedfnumbered("testfirst")) testSuite.addTest(testedfnumbered("testprevious")) testSuite.addTest(testedfnumbered("testlast")) testSuite.addTest(testedfnumbered("testnext")) testSuite.addTest(testedfnumbered("testprevjump")) testSuite.addTest(testedfnumbered("testnextjump")) testSuite.addTest(testedfnumbered("testlen")) return testSuite if __name__ == '__main__': mysuite = test_suite_all_series() runner = unittest.TextTestRunner() runner.run(mysuite) fabio-0.1.3/setup.py0000644000175000017500000001013012233175156015071 0ustar jeromejerome00000000000000#!/usr/bin/env python # coding: utf8 """ Setup script for python distutils package and fabio """ import os, sys import os.path as op try: from setuptools import setup except ImportError: from distutils.core import setup from distutils.core import Extension, Command from numpy.distutils.misc_util import get_numpy_include_dirs cf_backend = Extension('cf_io', include_dirs=get_numpy_include_dirs(), sources=['src/cf_iomodule.c', 'src/columnfile.c']) byteOffset_backend = Extension("byte_offset", include_dirs=get_numpy_include_dirs(), sources=['src/byte_offset.c']) mar345_backend = Extension('mar345_IO', include_dirs=get_numpy_include_dirs(), sources=['src/mar345_IO.c', 'src/ccp4_pack.c', ]) version = [eval(l.split("=")[1]) for l in open(op.join(op.dirname(op.abspath(__file__)), "fabio-src", "__init__.py")) if l.strip().startswith("version")][0] ####################### # build_doc commandes # ####################### cmdclass = {} try: import sphinx import sphinx.util.console sphinx.util.console.color_terminal = lambda: False from sphinx.setup_command import BuildDoc except ImportError: sphinx = None if sphinx: class build_doc(BuildDoc): def run(self): # make sure the python path is pointing to the newly built # code so that the documentation is built on this and not a # previously installed version build = self.get_finalized_command('build') print(os.path.abspath(build.build_lib)) sys.path.insert(0, os.path.abspath(build.build_lib)) # we need to reload PyMca from the build directory and not # the one from the source directory which does not contain # the extensions BuildDoc.run(self) sys.path.pop(0) cmdclass['build_doc'] = build_doc class PyTest(Command): user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): import subprocess os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), "test")) errno = subprocess.call([sys.executable, 'test_all.py']) if errno != 0: raise SystemExit(errno) else: os.chdir("..") cmdclass['test'] = PyTest # See the distutils docs... setup(name='fabio', version=version, author="Henning Sorensen, Erik Knudsen, Jon Wright, Regis Perdreau, Jérôme Kieffer and Gael Goret", author_email="fable-talk@lists.sourceforge.net", description='Image IO for fable', url="http://fable.wiki.sourceforge.net/fabio", download_url="http://sourceforge.net/projects/fable/files/fabio/0.1.2", ext_package="fabio", ext_modules=[mar345_backend, cf_backend, byteOffset_backend], packages=["fabio"], package_dir={"fabio": "fabio-src" }, test_suite="test", cmdclass=cmdclass, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Intended Audience :: End Users/Desktop', 'Intended Audience :: Developers', 'Intended Audience :: Science/Research', "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", 'Operating System :: MacOS :: MacOS X', 'Operating System :: Microsoft :: Windows', 'Operating System :: POSIX', 'Programming Language :: Python', 'Programming Language :: Cython', 'Programming Language :: C', 'Topic :: Scientific/Engineering :: Chemistry', 'Topic :: Scientific/Engineering :: Bio-Informatics', 'Topic :: Scientific/Engineering :: Physics', 'Topic :: Scientific/Engineering :: Visualization', 'Topic :: Software Development :: Libraries :: Python Modules', ],) fabio-0.1.3/stdeb.cfg0000644000175000017500000000033112120434325015132 0ustar jeromejerome00000000000000[DEFAULT] Package: python-fabio Depends: python-numpy XS-Python-Version: >= 2.5 Maintainer: Jerome Kieffer Build-Depends: python-dev Recommends: python-imaging, python-numpy-ext, python-lxml fabio-0.1.3/PKG-INFO0000644000175000017500000000242112233272207014453 0ustar jeromejerome00000000000000Metadata-Version: 1.1 Name: fabio Version: 0.1.3 Summary: Image IO for fable Home-page: http://fable.wiki.sourceforge.net/fabio Author: Henning Sorensen, Erik Knudsen, Jon Wright, Regis Perdreau, Jérôme Kieffer and Gael Goret Author-email: fable-talk@lists.sourceforge.net License: UNKNOWN Download-URL: http://sourceforge.net/projects/fable/files/fabio/0.1.2 Description: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Intended Audience :: End Users/Desktop Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: POSIX Classifier: Programming Language :: Python Classifier: Programming Language :: Cython Classifier: Programming Language :: C Classifier: Topic :: Scientific/Engineering :: Chemistry Classifier: Topic :: Scientific/Engineering :: Bio-Informatics Classifier: Topic :: Scientific/Engineering :: Physics Classifier: Topic :: Scientific/Engineering :: Visualization Classifier: Topic :: Software Development :: Libraries :: Python Modules fabio-0.1.3/doc/0000755000175000017500000000000012233272206014123 5ustar jeromejerome00000000000000fabio-0.1.3/doc/Makefile0000644000175000017500000001076112121354612015566 0ustar jeromejerome00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/FabIO.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/FabIO.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/FabIO" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/FabIO" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." fabio-0.1.3/doc/make.bat0000644000175000017500000001064112121354612015530 0ustar jeromejerome00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\FabIO.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\FabIO.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end fabio-0.1.3/doc/pdf/0000755000175000017500000000000012233272207014675 5ustar jeromejerome00000000000000fabio-0.1.3/doc/pdf/FabIO.pdf0000644000175000017500000067766412233250060016333 0ustar jeromejerome00000000000000%PDF-1.5 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 804 /Length 1027 /Filter /FlateDecode >> stream xÚVMoÛ8½ûW̱=lB¿Ä¢è%Ùf{X´@³Àö"KL"Ä– I6ÿ~ß81`6Ž–@h3$ß›y3O5)rdy²EªiEÑ‘6¤9¶ø‹¤1«4þ"±&f½b&¶Ø,z∕H`4&`ñX±d*Œ@V{LÉZ‹)ÙàW–ÉÆHÖ‘3Xñäd/’ –’«°bÈ#´³ä1u|…ÓFÞš‚ã•g 6U:’÷TÉiè<@Rº 6VÀB‘>@’rÃwåV“ÖJo¤¼– @¶–DˆU (õ1‘" ÄÁÇøˆà3R8phãâ Q0z„A-¡_+ k% H-òBDÒN) ‰‰‘p^&àrEŠï¡CËðή4ꬽ@ tвæ`œ¤‚‰—\@¢¤æJ¢ºr2‘¦Vr#ò!;L\µÒhŠŽR´…ÕÁh¯²êàè—4&"EåC”œµ“¸BK¥Ð$8+^,ãÔ 0A €Ø(Ù³‘œÑ.6’3†Ò²HÃâÀl>³•A6øüÁ–ì êŒUv^VÀì`)Þ±¸xÖ;Q f³j´ƒ•`R(áàƒè?ÑM\qX}þL—?éòf¸èòš>4õnNã…þH_¾¬>ܤyîú{ú9×ãœÚoÎO©™»¡¿ÐGÄ·~‡vX]:Î/Ç¿ÖëoßéÇóü0ô´p“–Pæõ×Tß/ž³¯ìûy?&ªû–viœv²ÿ”¦%¤{A^ }³ÙOgEkÄGÅÓ\o6õ²b>è:íRߦ¾é–ásìt7[š†ýØ,cÍ1ÔSÚ »mêgz‚~l.Â^«v›¦™¦}7§÷µ¿F¸z¨û{ĸŸÖ…•äýþM‰hNþ5Ÿ–(ø,…Î)x‘œ¥P9…^¤°g(ÔE•S¨E w–"œR€q‘Ÿ¥ð9EX¤g)lNá?½ß~›=½uó¸ø<Ú£îêu7”œç“ó‡Ïn ýù?¿öØæä~î6SÒfÈn“þÁ[dJ#žÓ´;ExÄKö§ÀºšR`8®»¾ŸK¡U÷iÔJ•¢ã[t)T«Sl³¾+ž:è¢Ýšb`f¥Ô–GÌÔÍÜnëé±nßÀ§Ý˜Ðà‡”æb–ÌV7¿ã2WýÑý變¡™¯›¶˜¹j[ƺblüÛ”ÇåÌSßÿ¾.fžÚuxÉâ_ Î|µë·ÅÀÌWsWlHÎõïT^ ÌDͰ…'¹ ”`}ŽíqÀ  ä‘3#µõŒWE*sÑmwwWË $ÏÙúyÆ=³í»ðãÛ̯Zm‡‹Õáº8×ëܱþØrÈ endstream endobj 214 0 obj << /Length 317 /Filter /FlateDecode >> stream xÚ½QMoÂ0 ½÷WøØJÄsÒ|õ: Øà€•v@ Z­íï/¥Ñ@pŸ”ÆŽí÷ò^J°‚qD!r¿p0Â/‚Í1¢PùŠ}¾f·Çù•áÿ§¾ÿT° ¥–î加ô•‰Ï2 ?—™#Hm}<À"z¿Þsçžyû,øΣ§QªAH4ÖpÈ· ¬@Ϩµ@Á ä%,ãQ"(.Öo³„ cã—zs>ºª-Ú}]%«|â9 pãJv\Z´™?í£îIæîàŠ“ë)9¦ªo¡,U)Z£q¥P«~Å·¨W\5èÃPžV §ø\^;“Nrè~4ûÝgãP{¦¶O‹ª|M÷n»íX]tfÀ9fJ‰Ngj,j›v rj¶iëµ0¡(f⯿d˜G¿Bu’À endstream endobj 223 0 obj << /Length 19 /Filter /FlateDecode >> stream xÚ3PHW0Ppç2ÀAc(á endstream endobj 264 0 obj << /Length 1138 /Filter /FlateDecode >> stream xÚíÛMsâ6à;¿BG8 êûcM“4;ÓÝlCO™;Ä0Ô6íì¿ï ¶I°Á˜Ô’èޱe%^é•D!‚.;$ÿuÐùå‚+ÄÖFS4¸G‚p¬4CŠÌá£n»g_¿ ο nzߟ;3b|ª¼ £P ¥UNþy e …,¶Š©EÑ}Îé²ì>%p@mV8íÁÏ„t/ƒ4 £Q¯Ï$éÞ¤^œ~öÀ¼¶H(Ž ÜF²ùÞÕáöyu„0˜h Õ¡ØJ™×/êá WQOýù0 §Ñz=nûVª.îõ%Tû¼ kTtéÏJ5ÓkÑTóÂå%I–K^ô¨ìzwW_³¶uý3}Òåñ„ÇA¹Z+Gøºv<·û+ñFAè ¿Ó MÙ¯(BsžÎã ‹E/ò³ƒY'³:Þ“ÝÁ$•X0Gy\äŸ*c§®ƒxÖ€Úšgó§5’-P´Š9¨£AñP¤Š:¨CC©JÔBlê ˆƒ:ZDÉPz;(:¨P¢5(µJÕAiu4(½JÔA)u ¨&Ó‘O.ýg{e=JºÞð±² SžGÈCÌ#¤ŸP,Ôß<»–Il /ž|ïÝ…Ó쪵9ƒšâªëeSÛð{Üö çnÂÛ^#}ñ6CZ3´ÜX³€—¯á$.5k0嬸᛾‚Û°qDOÊt² Ê÷§á8y ¯ãºT·ª PÑ4?’ Î7qJ¢”@oOëE¥± ›Sš—SrH¹he¸• )§³ ÚÚ×2L¥¨‡dƺUâm¬Œ¾œ•BV&u™U5dõüdèXß «nÈzF^üs¬ëx÷§dmw¼¦)e< b˜©mÕd ÁÞNœœz# 9 Ð0{®dµv/@‹'A¹‹«|6Ûžm`9¼»ßi¦Z×CóÑç'b¥ÐšÊJRÃ¥$ìO¸S=”ªl[µéòPà»X};ª×ˆÂ”ù/y|7éЫ|!‰Ù¶Ó!*öLfqsχ H·B*Ž‘'’½c±6¦’â4]è¹<ßÚkL­­÷ÐÜ­—ÀÈEX%öš.÷ü^‡gïeËätVØyéëùûù ówg1·#ˆ"͘)†“Îíw‚|8ýyAl úwyÑ µØ¿£›Î·Õ¿ê>I®1ãH0HmY¦®=øªºÝº endstream endobj 285 0 obj << /Length 617 /Filter /FlateDecode >> stream xÚíÙÍoÚ0ð{þŠw„C\ÆöuÚZµÒÔ}äP õHè¢è’tkÿû9 \J .$r¬øÉ¿<çá`x WžÅ 0b’›_®> stream xÚMOÂ@†ïû+Þc›è8ûÑýð¨‚DÙáP¡ÚÆPãßgÛJ‚xá4Ù™÷y2Œ0žÅCwSm(Xeß¡­§ÂpÆ“ q‡u6ÍgåÛl™ß*ç³§vû]WMWvŸms3ö^«}UªñÁ$Iç›8“(¾„L,†„S)Öc‡m-ÖÆ.õç`ÒÁãgøUÃXŸê+ñ"øg8óì³$k7*>¶M—”÷ö´w‰/ ){5ýÿuR„Q$¥ú….q²ˆ«ž™6ÛÆ™¼9Õ’SŒ endstream endobj 293 0 obj << /Length 197 /Filter /FlateDecode >> stream xÚ±nÂ@DûûŠ)m‰,{{ÇÝ0 VÂuˆÂ€A‘0a”ßÏÅŽ‹H©F;ÚÇ8±PÓ Æ…qÈ)wâŽðo3²¹A8`“©pRíÞÊôE|–Ì®ûGS_Úªý¼^F½÷QŸëê^÷“&“nÃR̓º)ß0tkɳǾQ›-ãý%˜Lžá«Ûj`]õŒµzWü[qÐ?YKâþõ”Ò i-=¤ü†Õ†„]<ëÌ×ræ«°î`†ê0EEê endstream endobj 297 0 obj << /Length 2516 /Filter /FlateDecode >> stream xڵ˒Ü6î>_ÑGu•GõÖæ4ÎŒ½“Ú²½NRåäÀ–ØÓŒõè’'í¯@€êÇ(µëÚì¥I‚ €xª£ÕÓ*Z½½‰xüýFÀ­ÄªˆW…ˆÂ,ÉWuwóé×hÕüÇUVU¾zvXÝ*ÍKÛÕO7ÿ¾y½¹ùî  Wa•Çùj³[¥•ËL¬ò*E”­6ÍêSðÃ?ï>l>®ÝüèÐE&i#¾(Â(«Û8 +!ýý»D½yØ\2—gEX$é·2§aQoK¢2ÌEºÊ#¦)s÷öa³y|÷v}eðÓf]EÁÝÇu›‡{f¹:“XÍ‘[d§L‰È›µÈ¹}|d²(ЖFIÇã¸zšwC3µŠæ»ÁÐÄ(Ùèþ‰õ Mö0kgp#G&·3CG³ñy-¢`¸mt§z«‡^¶´ñó­‘G>§FUƒ±!Jê¹¥WIü’ñ(!Æ£Ô1Ë™qÍŒüÙèqT¼ARTI{¤‰{£‘½=H£ú‘vN’Âî°c D.žùÈ¢L€Å €+¿¬c`ßèa²´å‡½FÝ΋°Êr’xÖÆ-˜C°Ù£Hiv/Mƒƒ¡/ºQ– ’vS_Úi$õ‚ø$¢öxöH ÝÉ'¾€t0£ÆÉôŒŸi †RË­æ# ŸíoÀ,¡=ïu½'p=ô£Ô½¥í0î/äd»îÔ(YeIüeÑØT†Öºî;‰ÂÀ– ±“Ñi&§—IÈÚ’à®m ö‚m€Ílã|‡/´ó×ʦѣSX“û¡±|ë@£Â;ÿÓñDΘ]’Tn‡id‡Ø³kyvÎýÉчq8(vFP2—nrvܾp7OÝÊN]{¥UF+r²9¸F¡€¨…qžÀo‘ÎÀÆ àÇ·7×DLʰb/¡¸¤ûÍôWŸn³( ûÑ`lc¯½:gjW‘Xˆ…‡åÞ‰\ÀóÚQÖÃJ°KRfá‚G«"°ÃŽ|ŸIû<‡l–^}uÛ¨†–^éeÀûꊋ‡+9ò|[é\“!{æÿdÓž…(¡{²ÆØûBŒQáÉÈî®ò F·öxºUµœ¬º:ç0jÙ{D-ðí$†¹æ½î@ð°öD!@ä –÷3Ÿ$ †þêr£™ºù0°×„KN´Y— ^D*Š~ø£L=8SOPN¹°šØ¶ª#ð³"`£jˆ— ãˆÜ©v8PΓꕡ@PrøEݦÑERDŒ]oÖEܽnù²ÇïÞcØzuy›K˜ŒqŠÉIá[9Ûè‚0÷-npøËªŠ²Âê²ÌVZ^’Å[Zèî’΢q¹=âX@È3kQOŽ9Ü€ô8òÏÃ0šøðІãhº°†*ÕnxV†¨: ã1î…Xñ äç[«¤ÁL’”³I[Z ˜ì%C¶ gW©Óê¾V4£¨`:|£™“«d³LÊ„­m”íæhÇ f˜ð¤G&ìÒ,ñ‡‘Cۙ悈ÉýÏï±–ƒ‚E×f°5XèÝ©Hæçï'Cö¨àí.éÀýãZ”á >ÐLÒåŒK+/@ÒÖ¼KÿEqM;'­âªÕŸ‘>…ä÷{wC~)5‰œ#»[#ÍqgzW^¤?böñ{ºãÜCá3œ<­¬{ŬØ3«1þÚ’P)ëï¦f 9ZsÕ «njG}»3˜pžû,ÍŸÂbF>ˆã³jÛ+È)KEç±6‹èEÏÓ<¾i{Iþÿ•ßã¿'¿¿ÁäÎïíÌ\¿>Â~CŸ'ÜÐ$ÔÐÀ`k£¬FX¶àÓ\þg§â 8Òê0¦Vú‚°<v$;Ú«jÔ—¾kíàgíà" cóK#Hx5Z—‡C n…&nËG_’ék_÷ùrqëK½ëø¿Ù‚ã`¶…$,ÅÃßUî}Øëv°ÃafqüOoÖ™ûjÀjè0Fôp¹U{í²Ì©ÀÙ•f¨ÚÀS>Œ¨Ä±‡‡ì<ò ’om8÷½˜#A?S¦–ïW½Üz,j=q6ç}\¸¼c|ÏŒþUµçÊ}ˆw‰ðÝeE§V§:WÏØœ˜Ð%ê÷ _±¤3l Sà>Åa~ÅbH!ÒSšGøF„ñÎ.¢þ6Y¦Ô+ÕX¦Oɤz‰1ŸÀÖRÝ㺡$Êè|vvž›Vœè‘FÔ‚é Â[Z³ —§H¦0¶n×ÚãÑF?Óõ‰³ Õ\ *$i ~ÏîΰFC勇äè|Ý ÎgTÐùZNÏ%r6u[ÐYæ”ø>ÇóÍe[„-šÁ˜`yGNèVãƒ-ïáO)ÙÜuG¿©-[HiË]ÿHíáR ô¢Àò•QùŠŠÊLsYfù/ ð–vÀ@Í5Öaß…°ÝÛåÉäåÉJ*:ûâˆ@%䨷ƒÁÂÉZaptН„ã– ®êVZ«,öL6]¦©]áŽ3†l=v垦¹b†ó‚ð€Ñ‚zL†ÿ€ç®b² ¨‚¯¦¾”†4D½‚FIõ±_4Bw:Ñ)_ó‹SùîFuüÑéë,"3&D~Ëódƒ=#|î©Ä‚`óÄ9é‚ÊÅÜøt׶ϲ.âçÒß'íÊ3\¹dCÜW#v:ζªWè@#té<öI&gÍ væIÜÙ+”åÚ@Ä ´õCϨ¸)Æ™û")›£ Æ ãG ­þê塚çøýb©‰†à$¶ÇÏ ”á Б|,"îÇ…ðý8ÌdCqSpµ!0l6“kÆaNâ‹9æ8 SŸ@Ÿ¤®Ò(“¦ïx8ëéËážš5w«a²óõÂÅ/7¶ÍEyý÷M–B‰Z\ÿ{“Tåù×R–¤a Õm Õ±à¾)¹¾ñOÔ·%" endstream endobj 303 0 obj << /Length 3671 /Filter /FlateDecode >> stream xÚµÙrÜ6ò]_1T•ÅðäÉëkrlo¬ÔnU’ ‰Ñ0á1áaYùúí ¼D¥’ÔîÓ€Ðè»ãîÞáÍÕ?n¯¾zƇÌÍâ >ÜžIpH¢Ô²ðp[~t^_ž£o?\ßIê¼ló±6Í ‡²mž1ì{SÝþð\ß ¯¾ýöêÕíÕoW>ã|Þ6r/9äõÕ?{‡àß<7ÌÒÃ=aÕ‡(Ná·:|ºúו·"1Ûè{®&Lâ¥k•©ûë›0ÝNg.ºìLá^ßÄQêÜž #ôíi¸¿ö½³”¥Ÿ¯}å˜î¡u[Œ•îdצ`¨®ªö:Pν¬i }ñG^é¾7=c-rŠ. S0èÔʶgØ·*›;Æh‡³‘‰B¹,¸ñ}7SŠï +k=À A–:Àõ²z¸Ž•wŒT‚ ˆ°`žˆÆAÉ+¸ûØåæ&o #( N1°QæŸñ^º¬4ð–ã…èXœ±¼jÙ mnà&t"ÞVenšÞ¼rl ¼¢ gÁóþ˜ÆtºÚ»íÇñ¡bùÎ;Þ?{zJȳ!Ãò”÷æã»Ï! |`J˜D+¦$,l\¡«¾eÈÞu¡åÉâ º¶fø¥½°^ ø]ÙŒ_,~?tå7Ñ:zƨÊ_QÙdÓ—æXêFÎñì\úÞ¢F—ìÈXè¿çqˆfû‡&¿Ã&Í[h0p@ºi,&í»¬·þËG~¼Qžç¼­/`yÖ¬öÜ-ÐD°Z.yËj9µ.Uº¹õ¨Ç(Ê“9v~°KŠ…Ví<1ÂÊ 2–8ü~|Îmó hE–ÇV¼ÔåëÈsH}}°“Z+뉤…íeÖp2'oëKgú‰Ü'¤Ú™ßÆ’×ÄÓV_èê®íÊá\÷üMÑùÂb{Ž{À¨"Wö>îßg#öc~Þß:oÇJ¶iÚG¡«´â4‚aNÈŸŸ5ÿÌkí Ѽâ¥ÒÓÑŒrHLÁß»N_ÎeÎr ‘k"ßœQw¢t-7Bà.¶_:sÚ)Hù¬ >GK¤h 0iÄbÁá v}ŽÉ?âtgnV®'‰r˜›ìÄåïç<ÍÕ•fx`8'œ€«Æ%q<ÜRÂØq¸’´(o7iQ¢dÊ* ú¼¼ ÷8Ml ÏÔBÇp;ҦŰîWHoßhIÜ, JEþ‚ æ48`ÃØ§–Y-`¯&lCDY y"´¦do{,vcœˆq6rd;pQ ;Àlv¼.U;TñöMa¼á[ëèØŸÁò Mœ{P¾³P¸ËyÌSÈóyžØ4ŽX×½GqŠéò|Îã Cƒ“zèÉÆðkŠÊèn€¾ï­‡ÁUL= M?HE vöðI 剨q`U®åÛ·¯_ó†Sê‚àÍÅzŽš=ȾÝ*Ñ-:¬’c eUj ­j ¦ ƒéw/žï+ n‰Em ƒ)î˜ÄT`ýW¯U²È3åI›r¤eËX«3]/‹,Ö¤ÞXËýÀ££@ÀžÛŽóøº×:¡°åßÙåSùgW±õàP@\áà´¹b?^–gp´à±•r ¤ºaâ¯õrCŽÿ)áÕk"¸tÚKZœ©âå9Û":$ÑË2d¾JˆªFŸÀòlùŽèvW qâª4Z ħÚìœe:Kå46ùÀy/ЗÃyEP•0“X6˜Ëårwb+üŠ2ƳæÀ*¸wÈó3ß|EÈáWc»tÆ ®GH6Q¬\åe›"\²G i8h4 IÄô&!ñ‡¥N9j&Ù bÙ;R:›Ñòbïiìzif‰*ë»ÂÁÎâ8¶8“ ¥œÁíû¡í8·^lu9‘nƒÐµGE–¼"Üœk[j7™¸¨û3‚—|ÊT `»¦ÓÒ †›\`úšáà>(ñÔZW:“Ÿ., ÆPpÕ=ÕmgѶV=ÚHËèv©åMPøizð½F6"©.¿”_ØÙ÷Ï8 3îºr/y|”>¶ãÀC);çãv<ñ$˜Tš) °à1‡êĶR ”©¥†ï‹î@ŸÊþiŰY€µ X[—{͇ëòMdwúRrζÏûk«6¶”`Ù>B¡õ°¢zïŠÍæØI„ ­gð¼ ¾ŠÚZ!”"ÿd€Üub.ÏgïöqÒ}•ß·Õi9zÇ9€¨Z§ŽÜ~®!1ÝÉÈ ±&ét6–DiÁQý†sØÝNob‰S—MYµ¼úÖú ~m^ŸkC&ØË„“¬©-„¸“fÉq·~ŸNì£Ü†¯•ak¥¸z[Næj€àÛ‹·=Kõ×h†m€GŸèõ/T\ö…”  n±VD745,qÂÒ‡ìøieW*°o:P¦BÐÜ ]vçÔ2#P6ÂÊþö©ì3”üß@Í%æÞ¿°.ì§²hYÃôæ·Ñ°}$Ù\•ÐLñ ò2ØÔ")bvj,?t“¹h²5þcƒlmÐú²­C ð³U+f³·rÃðÑΗî:L8>Æ.蜠7ñÃeû+U¶êzT*ºQú¨ûÁ8œ:Ê{j,F¼æ‰ÃâÈõ¦æ¥Ô´ü¬>Iì€âNšN^èÆ‰zœ´à¿äe7 Qw¬ÂùÉAþyÀtò(pW@¸hÛ²©æ×‹·GDÀ;$Ȥ8K¼ùïËÿ7€è.ŒòaOjaÀXýÀ.çìÖJLñ<1f[ Ü,‹7Q‘,(ô¦¸òþ6’ó; ü{@œ‰¡´«¡´÷GÀ”r…Þæþyóê©»#yqø÷î{j}w<˺>O×\ßÉÒd””[ì~º–­E¹‚,ŽÓµÎ¢Ñò¿Q6¹ãÈúëhª9cÁÅ‚çj_¯^¾Æ÷3Æž44Úš!³^÷üAZÙ‡ ù0RõM¾ŸÈ~rë‘H;)cÇe¢\0Ÿ¶EõMJ=?<–t¢\Ä=¹Š½šÊ×$˜d¬‡ùŸD†kÛeλýgŠ {þÓ¬ÛýϤ/¾/}Ÿˆø‚΂Ԓôâ¬/ƒmÂñ¿ç¤zà§þ\ážß’ÜÿuÆÙa endstream endobj 310 0 obj << /Length 2765 /Filter /FlateDecode >> stream xÚ½koܸñ»…€~°\ÄŒ(ê™â>ô’øâàš\bz@.8hµÜ]!Zi+iíl‹þ÷Îp†ZIë8~]aÀ;’Ãá¼IÊs–ŽçütôãåÑó39©H#?r.ŽŠF¡‰Rå\ÎOîÙ‰ï¹ÙìüýÉ©'î«:ß®uÕe]QWÏ÷Q—:k55ñC÷šg8Œm)g¼øŒ)j P£:vz.po¸ ‹Tù´‰÷]Õ’FÛÙÅ:[êFÒÁ? °‘ƒDR9È%•Ñ­†ƒ­ÇaoÌ#‰ô0ŠEÜê žÆBÆLáµCÌ`•TxRWA|+‘Æ Óm´³¸‘ðyõfæp"´-E66ÂXߟKÀŽ¢€]/’¡ˆCÖA±ÞÔM7¶cᨌðDÌÆ;ÂåF`¹‹lVÔ³ ’Ár¨q<(µ«IÏ£ñ"0¼ò?³È³_ä‡Ñ‡+߉’+&Tܬïw/´ìø¡]ÄÂaˆÈñDPwšôa›5Ý¿ÿð`ë¢+!q¦º d"¼DÝ.léû"Jäcê«Á:ÃúÊR¾w…eô4r}Ô“ò…ôÕÓò„y_•[Yk*¢MDñöùù[:à ý:x¤—¸qÜÿ×½ÊØ¬¡ÌzNìÜ”ˆÓäp…ë¦èLà?®@(zþÇÙ=ÀÂIç¿$ ž,jª4ÝŸeÎ!66ƒ1 ½W…6çÖ>œ^ÝŠ uÖÁ)µ+‹Ù}¢¢JAGЉ*Œ Œ$· S…dýÇ„ÄÁ2ÃÈ„ÿgN•øB)În‹¦^?ôĹ××½Ï%}yupâDyéƒw³\¹lv¸âCË PDª’IôsqúÆ~¦%§L•ˆâ`’1†Œ=¬V,Öíª¾æ€öèÓÕ£Ž6¼Ã± ^í¦Ìv¹[ÁïZ©ÿYb³B{ú _e‚~úõœ[s@>IÝ{ÿ°sûÂP$AúþT—Ç ²Hhke)‚§¹†=ÛvÛ†ïÍM‘€À$HÚ ^¯^}ÿŽô ñÊ0viªî vß–šüDºt¤[g%õ½Â’À@æ:+™Û'°¦¥K]Þ랟…ñ`qˆ’þ¸µš/B5bË`p«"‰¶¹EâÌËœ¹ŠÜEÏQì^¯Š|Ehóª¼ÑžSÊõlêͶÌê†Ù„m»º1·Jˆ5·É€üí´Év„By›ÂFB¢ðÒsñN|VzÛ5(%•áMœœiê^ž$ž[ºÊð&¡Œ~šïªM¼(‹®ÀKmÄ™Sí®ÊWM½_⢆¢½djh Jûá#nÚzÛä–âùÅùÅ3&ñîb40çï>0ª™Íw}•ˆ;ecÞÒÃMê¾yuF]Æ›Cß¾¬1Âëì€íírE#é”À;ýÛ¶%ÔâRid-Œz*¾ÊBŽ’RQQá#5ìª5Ïд“ þÌ:‹d#AoixeT³í6‡OÃV1bf´mVð Ÿ)¶ÆÌP¾ö‘!ðݹîÀóꦥ>Z €f»É›µ eŽÁ0ØÆ=^sVe“jpõ¶ÛÐZ>1 8wˆRò’ѳŒ¸.Ê’—$±#…ŠúÞ„¿ì¬ƒpï~¯b3|À•ÝÆMBXÖ5¿Ê 7ü–±¿¯ZÉ›øe×­è½/¤¬8|@±ÓT&Æf®á@:×UŽ==ÃÛûb“ÍJ=îÁ]Xò ˜#¿móÕ”ãß=Ï/u;~ðQûW+åKv%*‘Bò|;Ð6IÍxÀv³làè5§©È«‡>^7_ì,,ñ"i)j`ôÌìâ6@ôodm±ƒÔ~6FÊ¿"ŒØž±+_eÕR‡éÜ c¶&&°ÀÕ`ÜØöíKôà*¯¥Ž¡=â> stream xÚ­œ[sÛ6Çßý)ô´CÏÔ0.¼æÍñ­ij7Ý6;Mg‡– ‹kŠTI*Ž÷Óïq1`K4UáE$AÿƒË€HðàÉýO.Þß_°x’¡,¦ñäv>Iè$ Sflr;›ü\Räw~9<¢IœÕÓõ’W]Þuõƒ ûÌKž·\^`D;üëö§ƒóÛƒ¿Èà ‘Ù†(ÁÉdº<øó/<™AøOŒX–NûXËI§p,'7¿`e¢9"bDc&RÅdÒÀWŸŸ EÊ¢ˆêRŒ0Kd©Šé­üç2“?"Œƒ“©¨¡‡ª.ùìþðˆà€‹ jÜÁžÌªd<9¢!äIkþ8L!Ô_–ù²:¤Qð(òë“च=ÉÛ—_Ywÿ“Áy5“¡E^U¼[È;çßDH^µòþ¼nä ?$Qð½ãU[ˆßÄ¥ÒèxÛÕ½Œ÷¸à• .ªi¹ž™ÝBE¿IU¿€ð†ç3®D •TÅMuÜ’‹:…—-# _,sQLFYð­à}ÉEFâú+ް)0£aÀ;y#/ô=’€bœ@4‚tÊÛm-t‹¼z¿šH^œ4K¨¼Z^ÜÔåWyÑW•Hš·mÑvy5U™>¢rÅÙ¢håÉí!‹‚b.lž‹Šaº"ú,DûˆÀÓ¼i¡Ò7ÿr]ÍÊ|Ú·Ñ E‚_•õ!t¦'Ñ™dX=—G§êI«ÛªºIpÇóeYT¼•—EBˆŠ)û ¥„ˆ Ä$¸:ù"Ã>È úáEÔUS ¹o…î¿èðkuÑðUÝt-ÔkȘՓ ´¦U^–ON±cYì×Ý<Ê‚zÝÈ“i]Âr¿î‹c莵¼±È…¶é¶"õùL^)ÓT2Y‘Œ—+¥SYK]4¤0U‹d¤‹¢‚P䥼l×+¡&/Eóä­¼¸oòJZ¹Ü=mjiÙ>ΓǸ§N.š|){¾È²ndðõùÍíñÉÙaˆƒßϯoû|.ÃÁîÿòi'/nE×]^ž6O­ Ü|ª×eÛC \Ý܈3à&î¹qÁуßËÊÊJcú<¾R?ãëi!'›1ã©ê\«õ Ê®ŠzŽäñ½.ûÍW–àÆ@åGå妸_têâ'u÷Ó!!$ÐQ.ë†ë—*Æ¿äácÁå 4Þ‹lDëPL˜¬þ#Fžo¬V¥ ê›S‡±Ê"bÉQÄ2ÕhˆQi!TTZšÊš|(jRôÄeLÍé‹®[½;>ž}G³º@0ä4¸?†ù‘œß·$M³”0Œ1‰ðží8¢«0?]åç¢'V!ýP G1•je2cC ×ʘTô‹œi^É1˜Ë39”ÀÉcSt|‡¾ø¡S ¨å! ¦‹üŽwÅTŒ'"°nÄ\EbZŠàúvÁåJÂûÉ«2TbˆèïYsx]µ2NÞ¨›ÝÓJgUÌ|¹*yÛ+P{î1º¦à­JYË Ÿ­§:7iä?íÖÚèy_‡›F¸yS/eG5ci8/º–—s5É¡¤*ŸäÙºí‡û¿*aŸ@åaÞ¾ey‰Ê}®¥óÎŽS”­;ÈMH£§ÐN1‚)PÚÞ£ý¥OKy'ốc>WöÎU²s|¹Ò £–šlp¥+hK3³ÚµÓ#’e“0ŒPš¤Cy`E•Ê¢_ö†öZ>Å€YYe(ÔkÍOOÝ¢VÓÂU=[ËE™[E(‚,|Ø@âʺFœñ&°~­f«YP ™¦o¹Ñ„AjæÅ"šB 3× sÝÛ^K3FAÒ‹2,X á®ôg1ƼV…nÑýȦaœ¹²Wë²+Žäâû•zRDC?0Œ0ÊHìªÿaFQW,ÍÒ¢ëòÉã$Û?˜£"íZtg*HRÄ(9K`fUãÌÉÙÍéqTILà6Û ÛcöëVªëåcl I†âÐ5Ëûíxye°2Âaâªþ&˜QÚÄ|HCSG$u¥¯ë²<ˆ†â9 Ç–×Àµ³´ $g º\æ×„x [I”Ê¿oÖbÒ‡EÕvÄ_H¬f€›=—m‡Ë‡-.ËÄgó­lùÐ4lY¢o£åEY£5JYóåCÙð5NYA¶»²™HNãh?ÈÒÖ¹>ci‚â,Ñ]‹÷8'G_®~ mq ›£þ[«Ÿ,Ý©ç`ÚžÚö·EÁ昂¾/Ëí´í¯©asDGÐæAYÁæ(Íc45fokjÂvÕtKʆ“¿ X4н–DÐxê}Ãéû¡ĩ¨!ËQý ¦±»¢Ê›'ûyôÀŸ2æh¸lkÐôn`*ó jè²UGÐåCZãeKâåAÔð5®¼†²¥]Ì y%ûae°°e^0‹i_ª¾ðÓÙfD f¶êu]kõræc¾Zå§§gxy0Cãe[¦›J¯ùò jø²eGðåCZóåÖû_D _oŠj²vuÉ‚ä‡û‘&ÐF™²"Œb¦^âŠY££j¶ÌÛ‡Î<˜`8³mx½P¼(::„šK4j¶!h¹©üš4¢†4[ui>¤5i¶ô iD iãÊkxÛYÚåM¼ßó aiëåc)¢)Ý€[»»0ÚçÝu,1ÔÙ¦ìNK4u¶!êa;uD u¶êê|HkêléAê<ˆêÆ•×P·³´K$³ýÞž1*ªžzÁŽF(£ê…Æåù`4 `Ž(¯x£ŸãŸ—|Ú5Åt/vh¼l36õ6 —I—­9.Ò®qÒ1Ò±·jÚÀµ³¨ $'á~û®ûÓÔ \„¡(QOX,>?|ȾÝ|™‹×ÐkIØðŸ3Fh¸lPW <ûð jð²UGàåCZãeKÎ]D XoŠj°vuÁ‚äIºß†*š%°ºõòŠŒa‚(U^–y3zðáC×e _å Ðt GÛ¡ò¡¯¡²åÑr艇UC•-û6U^¤5U¶ôU>D UãÊ«ÙÚ]ÚaK$Ù~ÄhÁÖË«1š¦ý¦aÍ £¶<èj¶á+),7vËÄú/_Ê|Ó¶QƒšsjŽ5HÖÞN›aM›£<‚6ÒŠ6Gz6¢š¶‘å5´í,íÒÉqºßž* ÇŒzÙSE“j^íqùE|,ôål7Â7Gùû¼nfzc•üv©É§ÝÆ ñ†6ÖhÚlc÷ û5¤Ùª#Hó!­I³¥Ió jHW^CÚÎÒ.i<¡ûm«¢1†õ­—7eT|‡¢ž­® ˜GÖíht h–ðYÿxC½,û¤¬PŸq>J<€œ»4r–YƒÿÏ|hâ,ÑÀùPÖÀYʃ¼yÐ4¼*­Ámge7HÎ’ý^ŸQ0œzy®H#‚R¬Êþéújµý5 iŽhÝtÏŸóå×êéýU¾Àk[4]¶)hUmߎïAÓÐe‹ŽÀ˃²¦ËVÄkMC×›š¬]5]® 5¦ûí«¢,‚%®—}UÚ:ŒÔn—Û«|¨´ÙþSÙû{ýfìÃó´‹B×hüÆ®ajàl‡ç3¢†8[uq>¤5r¶ô rD sãÊkÈÛYÚE’ÇñN{­|9 ¢8D‰v$<„žœÍÄbÊ•J’Uÿ©ûã°³‚MÊ/>²}åP(VRp°¨Wæû{y|,Jõ¾íNÝé=@pX޼oýWlú³|ž·êLzNôg üŠ?¾þÊn>ãnÝdóü®P§EõÂMÀ|Ý­¥ÊåÅ­¾s—·ÅT¥šqõ9‚^B?§ïEKé2çª÷Ý–ZsY‚*KT]†Ò4Õí: íVT Þôõ—EÚÍA+P,ýŒ îZ>ešÆx͉´{ž(XònQÏZ™ÃÄæ†…ô$]…0k¿p_ùálWâßxïN§¿îýP¯;a\÷¾!Dè“t¡ +åPF¸iÒµŽ¯†¥üö¿¯½/_¾XÙ¡¨Ï7Ôž'žkG m- ‹¥¼™ôX]w…è "·×îeÀm‰å„n¬q«^ŽS]¬lå…è?☋žúGý&_,¼ôi(eÂoÃwâGzÅ*×}ˆŒ³Ê‹æE®ÂKRÚÊ7GDÄ+3¯¸<‘^*Vð—N¥ï=h0åøh¦,¬D¬'Ya[Ûb=]¼£áhÐÉDÂ3Ú›ÚFGo0C¢v>Ľu,Äý›Z¬¶P/òU×Ï C’pVS\ò®3ØM—‹Û`1Ÿ½4÷ÿR6z endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 876 /Length 2176 /Filter /FlateDecode >> stream xÚ½ZQo¹ ~ß_¡Ç¤‰)ª0ÈÝ!m€pHr@Û i¼¸ ¼³rÿ¾Ǻlìu,Ç‘û`kvF¢>‘?R3”(¤@I3šDåÌÐäÐ …L -žPA‹{ê-NKØòÆŸ•Šg”ƒ¬}8HñçûX 9)Q…Àäw,d.-äu,§çk± 1f7ó;Ž/ûÜâwV~#‹CãHÿwµyÌg˜ISÜÁ|œZÝ`D`Ÿ‡ Âê2J`ñ% ¬>O^jõ;5psÌÅBI޹´Prõ S( eäPŠc¸"†áÂP a¸@7&êèBi ?dU+à )$‹¹¾üQƒÖ¤ Z!ÅRÛÁè éÒ|qšƒæµe˜ ë €[Åй¢O…™¨RPƒxª´¹q1²fæ U ÕGÌP °¶*Ð U U͵PÍM‹µaqd9X²ê:æž@ÆÁK!ÜRÚµ`ýQƒ[ÉÚYƒ)a8aÚ€¹•`· ?`m¿@3dÁ@qh sW4ê¾™\­…–Ù/àf d¨°¹¹98œ„“{`õ Œ.Ù/0¼ˆ_`¸ÀxuvÎT çd¡¹Kq†´æŽ19%؆Ñ9'wL†Õqå“b?äù›““°< ËßvÏwaù9<ø°}½»;ûKö‡á‡6~ýcÿfw~Ù~|· OÎN·ŸÞ4L/†]ßñ…ïÜž†åñÛýKïxr²Yžÿñ~–__ý¾Ý,?íÎöÛ³ýì§â=7ËÓí‡ÝÇó×Ûëö^oý²=}ûêÇݧð"á†oÎÚèå"Î1;0­ýºø/§ýç¿þ ç‚Õs‡³ïÞ½üj?ˆ…¤K}^ðE=ö m_,Æ79â@ÿá©­?0jùõ|÷úÙv^`‰??Ëóí§}ø,ðúµ­&»ãÚék¿rOM£ôMð–Ggg;ˆz±Æb‡ç±ø¢­½µÞ^¨ÒãðE›{K½åÞ–ÞvyÜåq—Ç]wy¥Ë+]^éòJ—Wº¼Òå•.¯ty¥Ë+]žtyÒåI—']žtyÒåI—']žtyÒåé…¼+¦Xõ¶Yž}üÏ~ýý·gÿÝ,?îÎO·ç«ÊÓËåïË“å§yýáFz »Ö‚DDÙ¥Äg@œ‰R Ý…«›úõ›Wï÷Ûó˜×=…IlЛd »eå˜L…J”Ì×¢è¡%æûÀ‘rTØ…E·Ø/ŠØMÇQ¬]X…-‚ýÀ÷QÓH<F­˜ÞÕaѳ¢bµÔŽ2‡"Ba»eiÑ·9Ò0¨‡8d޾YJžä !æÇ6-Ø4fåÆÍrÎÁ96§sm±‚J¡h¹Ý¨ º‡ÍR(GkžƒS„op‹”Š{Іû¦'½Ø²ê>š 6icþ^áf1{*&!HÔJÒØd¤2ÝG¹–H ÌLÈ€—‹Þè¢÷  ¯M$EÐW„uË7ê‚ïÁCYàqµ}†¡à ÒŒù.Ê%E¦ƒ6J‹¹Ž´qF!‹¬mp¨Q0æsÎK>h ÈÐ&2E*±x ØQdh<”¡Óa ºŒ’ø3 ä󜡎*mãR@õCMå;Ô:¡©ÔâÉš|ש­Éѱ¨ñ]Eµ#j?Ô~,Xû1cíÏk?f¬ý˜±öcÆÚk?f¬ý˜±vyµË³.Ϻ<£™ÇŽÚ¬)þ§…šÁ¢ã09Ÿ¾´)þ¢®ÓFMÚàùü¥àMiõ3mŒ05ÔÈ|S§úËÃnµ âi„æ3˜‚9Õß· x ¹jC€i„æ3˜‚:+¡1´ÃŠ`>…)¨³V=)“Œ¸”æS˜œ“¾Ð{3ÔÈ|C!òÐî!{ 52ŸÄ¤îoÊ;‰i™¶¡Bæ—V÷÷É”×#· ÍàC…̬Z÷ïP¥%ÿjÀ4’ÊšWE‘æù×=퓊"™Féµé‡,âõ; Ç @ÌÀ:QòÍoÚæ¿Âì/ 2P |D¾#œâÊ8¼ùŸú&¥FÒ€ZšE‚ V£ŽKÛå‹„î+iÛÕìî÷Ý9¡³ã„NïúÞêí>A¸Ôï>Aøþ¯ÚñWíÎ_´[|upíR£—[¡÷OÆ®¢×ÛëR¿kŒuMŸR)*ÀŽú1eÔçmØÏ9ˆQùÿœ„Ó‘“ø—KwS3§Û}–s¹!5Ý‚õFýP~¡ÖµoUÍòXü›*ý.=åt¬'»³žÚ-õÔ†îxµ6B6_†ý¸äX¨ûeØFËt¾~«Æ×…u-xR&šæ(¬sÖo2Í¡N÷í¾^/_G)€Žx5†øWdÐ^E5&(~JñnrWÆ]œ¬,V’\ž-¿=}âÞì÷ïÿº,§ŸâéîmÜÿ¾xJšS]ž¥DÙ¬Yú”%=¼t’Âùv¼t¹ßW|ëJEƒ¼C¿ÿn°é endstream endobj 330 0 obj << /Length 1231 /Filter /FlateDecode >> stream xÚVKsã6 ¾ûWèVy&f©·µ·n›´»Ó™¶÷ÐIv<´DÛšH¤*J›x}‚tl¯wš‹‚¯À€<Ø<øuö~5ûñ.Ƀ’•yœ«mäK–åYP¤K––I°ªƒ‡ðnóPl>ü1_ÄÅ2üEWS'Õ(ÆF«Ò}’­FÒ€³ˆ%óÏ«³ÛÕìßYwñ ŠŽMYÁ‹ êfŸyPƒþcÀYR.ƒg»ª Ò| ÿ6¸Ÿý5ã'?Ã[žàxÎ’ÎŽ8ãIAxf/÷»‚‡EÆy8HQÏI‡œÇmkp„"¥‘í–Õb4|nÆ=-p 5uý<âáÁi‡Ahf¯ÛºQ;Œ{éÎíÄN²ù"Šð^w’¦YOªjô—oµ»oßT{Ek´»¤ï¥ ZD1K³$XD+³Œ z<÷à›.¢¡Põ¹>~&)¡Ã ‹ŽD˜–Ê@( Æ2ÏhÓ¦ïÝJCÿãÖÍa”V—„½H×7/ó( e{í~ÜPéZ~{ÚÅÏMzu3 aõxè%ÃlÊx¨·ô'0 `À.¢½8zª`eâ(œ^¥ÄÊ·u²ÛX[x~™Çx¶›ÖÚ Óqœ¬•”õZ¬”OëQ¯‘N OiY|±–´kK6éVÂñ³ÈÚàEä þ«yR¡ôDÂ^`þ}±v[=ºïò‚È{æ¨qÊôp9R{€ÜZÚž:vó5& a÷•þd‡y‹³³«Îþ$Ñ‚]cFëéSpt¶SƒýÈ3n÷¼ŒDPR+Ñl˜ŒhÜ8ýi#6žÆ¦5ŒXôîîÃï·«þ¼½?‡Äâ˜çWÿT;@(d%‘Ï4èt=yØÂx¿9T]¯‡Ñ#õF¦{©( ¯ârž,®âºkZL´e‚­$+A€#› Å%¦Ú~«œ-¤ê„Ûoˆº+iÁ–%V‚âIiï º¿# £vDSíÅ *8D`•6؃¿KÞí©‹}±9‰ók,þŸ“Ë«žü»o5v…8áXçã,‘ÕÙ Z¹Ø;89áj‚-Åw=XaÀìÎe³”Ô€Q¾^¿I5#^òz]EgÀœë8þ7þ4RA2¤á‹è Jô‚MÜÄQô{.=²6fDa¿Á†…•V650˜¦-}‹@ÝÙ:ˆå$Úö@ꔊ$×[q—Ó˜©ª¤1ÛÉ­^¾¦³»¨ÚËꉦÜÔa¡n¨UuâÅal×:űBIã*­(Øü¡Òà +4GЮö¢wtÒCãß0ŽWZ¿‘Kåõú6¹ƒ¨ò@muéï/x­"®ž–Ypßî9…Å×Õ t¾°¸S§ž¡ÏxøÛy{Ȉh'›…Û~t €f¾nQ>Ÿ9ÏW­ñ²Ö§¬\F简g×5_¼æ 9›RÖù(@ñl+ÌÐÑh׫Œ,™±ûö=„­ñÁÁ]ä ¼¥´5NŠDA–52 —€³›;1½x`…›©µúaŽ„£íاÝ2Mȇyê½9ŒGìK®‚¥IzÎCz3ž×y¡4¶wWô©Îžºéò]œ¥,Îßü,þöÙG¤1‹"×Î"–áË3ŽÃŸµªíd(Úæ@é/§s ì?Ň%Ø endstream endobj 342 0 obj << /Length 217 /Filter /FlateDecode >> stream xÚËN1 E÷ù /35ŽòØòhE7š]ÕEÚ ¥RgÊ#ˆßgfBH,XY¾¶¯ï!ØÁB\Gq9×Ëâ38g<š !¶°–ó†I¦íýC3cçåíi÷Ù徤r8õU{ÊÇœ>rmêf—â.Š7¡†7ªÚtä`׉õ† ô%êàákÚêÀX?Ô#¬Ä£ ŸˆçúËëÊ Û[ýIi•â éÇÀ  aàñlo^ÒkÉïKa3³Ìr‘K9ôû*®JÇ$Kn'äsÖýŽQP‘ endstream endobj 348 0 obj << /Length 1737 /Filter /FlateDecode >> stream xÚµX_s›8ϧ`æ^ðL-Käžz—¶—NÚôß´3m°‘z|€ã¤Ÿþvµâ´M“Lf"i‘vWûç·+sgépçÕ·ãGFî'”N(8 <åÌWGŸ¾p'úk‡³8VÎÖìZ9¾Š`Ì‹£¿þ˜M^Âö˜ÅJ*gºpüX°(ŽŠ%l!Y@Sja„Rªí‹Jϱ@óصÅñ扝V½ÑvRé$½1ŧ'ý²ØûrÅfE2‰Ù˜ö0)ÐR>Ü,°B8 ’ùðØeÓ¬'“ív;RËvLqÕv=éãÖ‚FIo¯?k-³Ø JÒ¬˜c1Nò¬±zšztm@VÒ’² ”yN¹FIpÛµfÔmElÊ; æq_áCúÞéñÓ³»]š­’e§TžÍ*.Û;<šv2·¦m¨4ƒ†ç``wòƒ;å׫|w)«wkìjŠÝÕ>^œàUu}+6=û»¨A q òq@à”\Ÿ4£a-=¤iëa… .®çŒ`ïÃÂÞ£ÃSuhžŠMÀ!a¿&`Pâ7zJàWцd Ý´y7 ¥_LpóÚô’øÍ”> ߬ÐX”Rî;(2ºhò›žœöq™—©¥^â ‰´†Êyï{s›[‰Í¶„ª"Xº¶7à»ÞÕî‚@]ƒnu— I5¯`õ œô+(|×ènŠè>ÓMÂlæ5ì½/ôß Ãî!ͯ„§«€×ì7¿{b£ù5]œõ[ÉØw´E›.¸(°&ð¢üªçM=Y`+4Yd·ÓÛNî°ûO6µ÷7ãmor6ÖÔŠH²È³¤Ùò>‘%À?*ôYBa OY{bž,²„‚»-!Ûéit}õmA3Acnæ1øÌ–ßM÷7Ým yM¾dP%ÉÖ÷ˆ%â0 K"fAì?y,íÄ<],áϓʶ2öÝ2Œ!$>,€îm¯Ûn^<^BÊöÞIÞuj\v-/½ív%Ši[b³¢6ÐiV”—]‹×þúdmHÅx:Š æöúæŽMÝ2êÿ°1ü™8ðAïð»vøîÏØ‡UZ8@BX ‰‡ÿJ€x¸ endstream endobj 353 0 obj << /Length 1861 /Filter /FlateDecode >> stream xÚåYYoÛF~ׯà£X«½xù-ib×AᢶҠH‚€”VaŠT¹¤õ×wö’IIv¤Hj?h/ÎÌÎ|s‘Ø›{Ø»î½÷FW,ðb4ðÆ3/¤^È#Äcæ§ÞçþÕ€â~’Þü>Ò0ê¿+'ÍRuRgeqaÖîD.)Ì#‚ØàëøCïý¸÷wìC–£‡ÞdÙûü{SXÿàaÄâÈ{Ò§–"øÍ½ûÞ=lE$žú¯æžÜ]·¨ óB⣈¯Ryèo¨whD¤Ã …Á«4à4A‘o)ìÊõª¤1„´¹¨u2‡‘¥[ o¶—°SÅö¯¶¼¬pg= (æÆz“é``ÜŸ%iVŸmsˆðûùœ!EÇ«i×X@ÁÂcŒÕ¹/‹»h "qæ›û&\˜ú¸Ÿ²NòÜLf¢0œ•fú”Õ‹´Ð¹³8Dãø$t>E˜Ç¯«r„}r ¼ZlÚð²„σ¯  C£ïÕº^”…Á˜u³B«µ™¥M–O•–Ò`û±yD6ÓÒyùag½“ z¼ÎwMï’y|>¬2ðbu·,em™g ¡"_›ùºlR„ !,²k‹âùÀï'Ya&UYZZ«*P¿ÿ˜åb@üþ\H³þûX_ÏŒŒ£X©ÊÂ’(g–ÓB˜Á¤\.Á³€éÊÐñ²ÍñT¥ 0¿“(™<$s´57C´‚ ˜Rh í¹»¶Õù‰pÄx@•N œÊå'j#Ú†fà}ú€¹wZ_"/W*Á™lö(*µ*!ÙÉ›-Û‚P¼L¬…;UBãI8KOõüQÑl1‚ ³T)FV牤–T™Ö`n‡‚ÔBe²“‡¬˜[{8 6õƪË-ëÈ&ÕÝf¨rÿçí³‘+±*eV—Õúòˆhéû@ü´\ìC¼ð!î¼ê¹ÜíǧDË›v´´„Ï-}¢Ðecùh£¶š6’š-êz%/G#ØF²lª‰˜•8L!jµ¦|{ <#ÆGuÕ­¼¾/Êvç@ôßÜÇÛ†@‚1ró˜"ê"÷•ò²2nòÑ„»¢nFïDš9·m$8×Å«ñü²Q<@ÊC3ݾPêwO™`µRùBa˜-“¹ SøgÉ ë‡ý”èÁ”Šfif§Šä‚åáÁ‡Cå ¥à)±CEðƒª0„czJìi±é4†ðybÇqm;o²ª‡sQwýµåÖDíYSðh/+[¯Osöã¾cv‡( Îæë,ŒQèôöiAeæj«R§Îlj’\ÚJ(qù]E€¡-yºåÐT؈‘B³lÓ¸K¾²†'I³,„ 9 ê›0á?(Tû'¥Ù›NSbŸêPÊ¡ <éZíûRé,!(Erq"ÀVó®µ9ôôÄ?¡X "‰ŸÙd±U¹ÕjÞîoµÛ²[†ºÞÂ’‘@ònKCñþWÚ‚væòj E3“úễ¿’îý€ËA"b+L‚µêY€•zõ—ôFº…¢•*cC•qcŠxýi·SÂæþI¹0Ç endstream endobj 357 0 obj << /Length 518 /Filter /FlateDecode >> stream xÚTËnÛ0¼ë+öV ˆY¾×¢MÐEPW·$Ú¢’èJ2‚þ}IQ6ì¸0ÒÂ×äìpgW¶€á.ûTfo™ƒŒ¤Ê 0©‘׈eùmAqnW_ŠU:ÿì×ûÖu£kßݤØÒ5Î.m0"ˆÏå}ö¥Ì~e$äÂ@@Ñ@ˑ ÖmöøŒ¡ ñ{Àˆ ¯Ó©¸Ôamàgö#óNñ×o!åÝ k, EÒD^eV!¹Gö3M(HC‘¾®gÌLq)ìªTƒ0!§ibœ+†ŒÒâÞÁæ¯ÌøÔ4®AÓ$¦ÅÂb‰´áɯ¥íŠ…Ä8'˜%0ºa¬çÿ(AÒÈ!Úh##Lºÿðm2ï=;3Xp†ˆÖÿQÇ ;#…Äú_ì<«3'Mê#Ãa®dzß÷P"òß¡[ =Ô&BÛ»9öâŽÐ§µr¶Ièµ_jm³ñ}몴}˜6nˆ#¦ò݇‚è|œoç¾ïç¬õæ˜)]ï·½mg%kßÚ]Swó6šv$±}WwÛƒä•ßÏž(e+{®%ÄøÍÑc<©u¼$B; i j]B¾KënßïüàÐÔ ‡â¾hÁ•ïžçËïM à‘0|“*Š8 íIi^çÁ™ôEöõè¦gp!‘¡4PNy+ïþyå endstream endobj 361 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ;O1„{ÿŠ)ï$²¬×Ž}×òJ¸‹R8‰yHw ‡øû˜3)(¨F;Úñƺê|aZj8„Gx· ÙÖ ì±®µp·ËÛz&¾©®»> c_ÃYñîS—â1•I“©7a¥®ƒzS:¿aèkɳǮWë cŸý˜LÛàsÚêa]“µÃƒºSüSñ¤¿²æ–Äý;êOJ+¤µH-ßagðy¾›ÜËçø:¦÷Â%TÏœHµŽc캉Â<õ˸_ÙN endstream endobj 365 0 obj << /Length 1056 /Filter /FlateDecode >> stream xÚµW[sÚ8~çWèiÇÌÔZ]|Ý·¦…4dÉ&½¿ŸŽ†ß¦ŸëåÔÁÜñ˜ZoìøÈf‡”êÕÓO£‘Z;M»Ùy®}î¼6;æ`?ð© Çý‹ÚžÚIÜÜ’›,:ì*‹t²åYçþê'Sìñëúg¼V½>Zã¤~J@O_‘¥ˆBêN*2¡ëƒjUä›åÊ,Ñž¡´FLÍU‡6wx‹ÑÇêñÔ„PÕè0 l?vkÄëQ}¥C é•'ÿ»Fv¼¡8t=xñ¥5‡"I.”Tvв/y!)7¢¬z uB÷%Œ¶å™)0À:\î•JºI1Œ‘•锢Å™¬¶Rfí·Lù®¿hÿòy:ĚܔoªBÎ[«ÁÁs*D.®BÛ—ÇZŸ|¬ŸT XšHu×ö× Å¢­|N¡ÿ%ê:P¿ÿ!ÊÃà…ŸÉ®Â”1äÀW25ÐRÞù”"¸Ò endstream endobj 369 0 obj << /Length 837 /Filter /FlateDecode >> stream xÚ½VKSÛ0¾çWèÔ±g¡‡17^a€B)d:J¬¶äÚrÓüûJ–’’)=YZY»ßî~»Z§½ÃQooH#À$"MAL@ `P0JÁ7ô òØøì«ß'ñÀ;–“¦àB1•IñÙÊnxÎYÍíA ©ÿ0:ïŒz?{X›A[µŒQ &EïîTËÏ‚4€yûW‚h ¿9¸í}ë!­AMV 4L:1FÑØÂ½'$l­w×À]?DÈ;:j|!òæU¦xe×YQæÜxÃÓõ;ôq JÞPªýý¦´ÚäÔ~ÕŒÛÅD¦nõÉ~Æ&–Í£ÝÜ#D~û8ôx½Ý8}Ýø¥4—µœaé“ЛûX'¬Jk+,Ív¡fRÐÝ̰'£Á™¸>ûâœ- Xnw)/¹H¹˜4 £F+Ú쬹v@lôB!•],¸[(^›”¬ÄÌÔ²p@ƹœÕtÚöçq&¡ÔMó…È:,t(ôw´dj½M2‹å«7\×Ùzù¼Úbâ#<ƒƒ×ý'/'ŠŽ¯=ë:Ë™jêîT|¢dõ/Y}qtü*€+)²Îþ+Kæpw×l1쨢6Êvž©Ù²¥f£Ðs¢)„Õç8eÊAQ‹rùæ†(úÕgéz{nôÃŽ#×]0-ßu yÁæÍ¡3 4»þzæÜ:bìèƒv¸ÑT…!6fZéÑŒ•v¨Ôl¤ÐïG„¡yèÌì”ËÇMr ¸Š endstream endobj 373 0 obj << /Length 1557 /Filter /FlateDecode >> stream xÚÕXKsÛ6¾ëWðÔR3!Š ’žéLÛJb7Úîôd¦ IŒùPI*iþ}Ò¤Ì8RÚz@`±X|ßîb!ì¬ì<›aÛþ5#Ðb‡8!uB‚QÀ¸“³·ï±“Âø¥ƒQsç“–*ŸGÐæÎÍì·ÙÓÛÙO QÌ)wnWŽÄá1EÎmê¼uÏžŸ¾¹½¸ž¿¿½ÔâÄGÌçTɇ(À¡ãQ†bBŒôâõïZtvq;6Ž! ™¬qÔGaµc ƒÀᘠ߷Ö-ævOŸ¾x=÷h¹oæÃ÷ÜÇîÙÕé<Àî³ mNFΊå ~'N ¯ŸÍöëQÎõþg(äö¼>"cýß°èìCCDˆJ´þ•XfÕö~ˆ0 ;±7s†]‘Ì)vï`à®çüÊ‘m "°í…`¼Oà`Š!‹' \±ÔxzE•îrù!ˆ(Œi‡ýþÈ!ý›b-§@„ã£ÐnÉˉÓöØùÃHñP}ÆGÖ´ÃíÚMU7'sÏeYfåÚ€ù™ö¦ªç$reÙÈÒŒü`š‹:»3½«r—ªÙGè£8†0èm?“e+kØGŮLE3"7ײ‘¢N6`žO¹ûRڙؽië]ÒîjÙɬ´*”CT;«ð<ó”Mpþȇ\Á@ŠŒ°S“UecÎp5•4ÝW¢…qµ•úúU,«Z´UýÙ|/j™J8z³4À¬?ª=å3ËâØtί<cl•WÍ]–§V¿,D–Ÿ(èÎ ÷K­vGé6<„(fÌØ)ÊÔ¬»¬,ÔÙzÓ>±£²® «ù*“«9 Ü•¬-¥7׋=^Æ®)+Viq¸c’‹¦1èGC)ò ÿ’Ë"³|õ~ìÇIï7~2¡ õ¹‘X(›Ê(˜FMU4Ä{ÙØÝžŠFB M £^uµü “vâ8ž–±tj8Oª¢èÃ.×}Vª£ñ¶^žYÁ•ʺb™[¿9« è².„iÊ]±UbÖïE] ÛUÜ ¾FÂÌvNšfÕÊfe[;'ºžÖ`0Ÿ@säB]4ØD,ÒtC+q„ïTíÐQ~8Ó ÑžhnyIÓ³‰þx¡½^w=Ó|ÒÔ*ãÚPN«Ž'XiÙͳ­éµ•i 7í2kò»´ ¥Ò0¼ËÛÇ£ì&áᦅü—L3 ¹Ðd#“»sÅèD¼@ÍGÿ"”GÚÆ¡üUNŽ ÒÛ#墨¶ Ll`¨Ž ‚.#é±¥*Jv­ù(æÄvÕÒ l«í.­Lí°ÖL7¦¯Ó§l©ªªi¶2ÉDž?ؾª awI"·­¹{•¶²“ÎàžT÷ËZiÿžL>×Á8>t.;‚Ër)=œM†‘*û†©´#s˜å©¢¡'S¥¡.{-íìÉAèôLêèÓL>–ž ðÑÄZB-óhIÔ-œìZ¶u&Õnª k˜dó‚è®ú.»öSæÒÖÝ“ZBmTÚàðÅG³*?ʺ Yxšù‡8Mÿ&He3¥ˆpDéá±ïÃSíy \nê…e­•7p¢ï8N‡^£b]; ÷÷(×XÙ5}>¯´ËÈh™:ó§¬Ý˜¯mÕ4™¹nam2²H¡ö&Ñ“­¨Eaú Å"cªëõÕáàt4t¹j ý¼µŒ¾£”]œ/ ñŸÜÈôÆTY¬&¬3Ô_ö¤¬md¾:Ú1Ö²…À©!¼cذœÂ_'6Faÿç`LVõ4ð:ŽŽ*^ 4›.‚Hpxíbx`Ž 5Xì©|¦+a륬»¤ù'|þ8.-ûU ¼p:Nĸ´Ü žo€ró¥ëêaéñU $«èT û 5µOØÉñà(; C±Ž ]d]á­¶Ñ*"D¾“c^ô)T™eÓA"’MÿØ_=H«z^ìÙÿ“,ð¡T÷ÿ#c€þaàê¯(TÒ&¶d!Áþ–ÿ2cøº endstream endobj 390 0 obj << /Length 1719 /Filter /FlateDecode >> stream xÚÅYmoÛ6þî_¡r³’¨×Ù€uÍ¢oK l@[´DÛjdÉ“¨$þ÷;¾HU¥–Ò û`ˆ¢ÈãÝñ¹»‡´el ËøcöÛröòûF„"ßñåÚ#pCäFØX&ÆgórîX&Y]}˜/œ 4/âzGsFXZäg²ïšf”TT¾XÈFxþuùföz9ûgfÃ2–aK±. ¬Àˆw³Ï_-#þ7†…p÷bÔÎpýž™ñiöçÌR*Z]U}§£jä£ä¶…,Hu7”í(ɹ//ݰ3ÚµQèb%Æ}±< ~¶Ð´Y\uf,lhCsaÛ(ò<9±¤¬.s°Õ³L¶¥²Ñ,Ù‘¤iºp@‚€¤EUM‡4Å }oš¦E CÓô2Í¥^ª¾›;žI²Z©ÝtW4[£„0r&ßcoÓ|#_ÖEÙ³v]ƒ èSì­X’л“=Œ‚(œd2†ý í›S1’'¤T¾H(÷Á]*<ÞG.æŒnJÂè ))0$ÄÈý®!rt­EQ4câŒ3©Ä9> ºHø±K"â¶Á«/'}ªwX9f½—OÂ|5·=sý º‹µ|rKZ1õ¦z3šsc¸²I%ÝR˜+_¿Èg B]7X–¬éäse›r^•¥1èaVòuÔjŽétWÃf-r·L¸\£B¬QÉÝÿbY¸h-æÃó×9€É‡ì ®°ÔZÁ…¨‰u«$zØt"9œÐä˜È ’ m;„³=Dmļ C9NC… ɼ…ÐÙ€ E¡Ó zq{¯ÉÒ3“‹Æ£Ñ -¬ïÅ_%ÙïiÙË,JÉd×íÈ-½‘øÈ' ´À9éÁ“aèF£-,ä…žnù«ïB"”¡âî®B:|¨¨!¢2ì ‡-:óÛpqŽóY½Ï¨Í¿ìIZ?62¥ód×ê™’/qÍåÆÄfñ¥JÕ™îv5#«ŒòbÙ¢öñb1ym€”EÚT;+z,5túæçô‰›Ó…E*"U/Æs‘.X›GœŒ>’*Z¦MÂiòQŸÛœM¥Eº#›é%t_Ò»´¨‡ êèÅ£LwâsØvXVM¾ôÿi“(~6]Jõs²£ ñð©ŒÙ®·.90@ÔÅû"ÌEÏñÉ# ç¹ú¶,ç¡ezätjUY¦À«Ô6,:;” ð¼-ø°ÉÀ¤aˆ-œÌˆø–\¸E¸OQ¡gØçGÛ¢ÉÓ·åä6ëãû ÅÑ_íäXgkï(Ûɱ*¶,üºËÖøî¯åóJ±5$9Ìr›ª€KwPÚ“šêë6+SņRÀ2uøVW*×%E«…ˆ?9qY쟅Ãç¨Ý}ÜèœEÃÍéÚ áFú®¼"M$µž»é˜ s@„žàŽÕàAЉàˆN‰ ‡R.ïfMb6€{š‘3÷‡ç’ظå5€ÒýÍÕÅrîyfYF“\ןMÂnï8x-üºÀâ4¼!’œh ‹F"Á.>§ü¸Ä[ç{R’lƒ[¥DùŠÙù|áy¾ù ¿ÂÁ€àÅU.†3 ãô–wu%†%tI].¥0ØLBvµB#«ãÑsù±Ú Äò¦4Ué&'ª3ÍãR^Ùð78ÿØ1ÏÙa¯ÆÙ+¦1µx3Ô4èû¡äPSZ¶¢Èžré²;’UÿݽÂ5•„¼!¬Z¥ÛìÐäÙxKòM›4§•UeTEîès0õ#YÑq!\ÂÑá…„íHwÊýàYî¾LœYññê­í?3‹x¬Rû6TêñŒ, k;½’ðÝqŽWEÑ> Š+,\Ñm¡ð6]•¤<È0Wâ>UÓ7òJæP¢nÝÐd=‡]^ýýîµCÖ–þj[ÔY¢³E@d’5«C¯šeB¯–´çg÷“A[ï~5öhe‡ÚXá¤{·÷Ã'r^ƒñ¤ÚF¾×»É•Úö<Ñ-é@žŽ>i|–P™éêLíÚžT•N³ÕY'Ic¦“5™òÄÏ}Ï<ë]ÊVÓïÚh;垟Kãc‡È‰‚i§në_¤aúÞ¨C§¾¼¦ìÂõáìê>Zóó&Z·§N$­Ôœk[»5“ñûÏg¹^°,ä;Žî( ñ­ Õb§Œ[‘*ɽ$YÊÚ’ý¿Yàâø£ÿeüÈum«D#“²¡iô«-ÙË«¡ 4]8|€‘ý¿Š>α`BÐyK¸Iþ{Úÿ c…U endstream endobj 412 0 obj << /Length 1516 /Filter /FlateDecode >> stream xÚíYmoÛ6þî_¡o±šå;Åù’m)Z  Öxذ¶Ø™vÕÚ’§—¦é¯ßI¢_¨H²œfE7ìCbÊ&Ç»{ž»£°·ô°÷lt1=½dÒÓHK*½ÙÂcÒGB OqqͼÙÜ{=¾œP<nž_M¦Tùã’°X›8ò(‰ŸÔß½2+d¦~Àˆ 6y;{1úq6úkD`/ìOQË‘ÂÊ ×£×o±7‡ï_x1í{·Õ¬µÇ¥Ÿ+ïzôó[=wŸˆ€šQÉÊU’x)üpïËWû“Ž—´Œ§ÔGŽT­{fb“+°¾ÀãM‘n’ÊðPîå‘ÉêÇE‡¥×¶IjRz8J{óÃØÀ°»BšÙMÃUÙCqÿ`¥ˆÙeT¯€ãïWL$z»äâwzÕfhˆkùœmç½Áד„:˜$À.j;'ÖVcFJP» Ÿ´HáHû;¿¬“¹9?›P1NÏZ¤±3G¤‘í„›N˜Ü/LÅËsÜ"”+äËÁ2Ãd½I'LM–éˆ4«sÝbC©P9ÚÛôÆc JÁõi!¬‡êÙwm¾×hÌÏ9®tWS뀲4ókl6ÆFäm”¿«G«$üÐPщìJYšü:ú<,zî¾c‹©]êl”°Ñ±0ý¬Š6InœVWj TíÂ5³º¶,vP>¥X@ÑÎYÿ1¬w2¤Éú‚sÒ‚ó›6 s†—ƒi£èn´ý(©Jþ<.ñöˆ»ñ†Röcº20âm(…þךµ ‚”®9?§©Ê—ÿ œ–»ºyo¼eŸ!é„ñqSæf}þS·%—Õ4µ/µâ¢[X‰Á’æQEÃdb8ÇBAW–ûS¨ë Å §ØäÇHvöΖè®MužÕÉ¢þ ,ëV¯Ò[õŒ:cç&„b?O‹0ÿca!ÜF_D#!NJ¸zÝ—ÞU‚ ¶7“ÝËi© >Ø&fÓk’<©?!¡Ôƒh,·¿Ýmì(ˆçõü’[!ÀÀ~#‹äi›åê}©ªùP!4°üÊäE;g„ÝÊlZS³IM¶m¸OVVI¼ßǯ(ÎMZßé…‚uŸJwI²4Én!`!¿k%òCE›µÇE±¼Œ>5¢üe^]ÿf÷¢xu÷MuŒôÑ:FHÇȾ¬cdßrÇøKü!NnãïË”éÆÌ;,’BPýÿeO[ ƒÏº¨d„Å~ù>BÙ!’«WÍ/«WÝ÷BMßnÕÍp'Ü•†ß9JºñJ‰ÃZ ¬Ðê” Œf Ôlp•8!¥%;÷´°ñè’F¾rë§Ù„A¬7ˆ|gœFNh6Y;§Zæ_F%rêšßfEjM±ÓªùúOpDåà·÷ßN‚©Ðݼ6÷uù^Ãíh¸Ž4^ÂM&ZމjžèoÕ> endstream endobj 327 0 obj << /Type /ObjStm /N 100 /First 858 /Length 1402 /Filter /FlateDecode >> stream xÚ½XKo7 ¾ï¯Ð1éA#Q$EF'Û-Ø)ÐÖðÁu‰Ñd×°×pòïûqò¨w׆ƛ ‡…8;ŸHŠOq QH¡P ì óEBÎ «†,X3ÖæÏ-¿/9”*X)pö»%ÏJáÀÍßKâ«Qì+5hòÕ‚²¯-¨9? < çP[ÅZ‚5šB+4+\C3ÿŸ¡OC†b¤N´jQÅ* ±úV¤8 W½ú²*&U¡%¶ZʲArì5s©¾Ç%`®dR®‚Q-x[” B„Ú¬@±Â5¤À—Òœ‰T¬Ø¡0+ ¤nÖ‘p»*äU…˜ 1 ©%šU°hn°h®¢ƒ¹ù¡frVÆáa@ØÓýWÜo鳃R n@·x©êžh³Rݤî_?»&¾™]÷®ÀMe´‡¿7Ò섟Uœ€Du£$Ôâ8×ZÁ9ûN<¹f î/ †N/p'ß`!x{ô8! š˜Fp1‚ ~Êî´BœYöì.drœYð0LN€³°à, œ•œgU'ð« nóו͕ lp;‹Wpv'bt“ ·rfVƨò¤Áa…Üé¹zÌ;a ¸ÌööfÃóp\ð"…Ã0üù×߈ö ,QpÐÅõ»w'³'OîÃqmQ¼=QŽRº°¬¹öÙ墑a¨5ÜÁr± {{a8€KéËŽ!Œ>= áàØ5¼¼\žÍWá8 /Ÿ„áÕüÃ*|eøêãÅ/NßÌgÃ30Ÿ/VW­¾}6ί–×—gó«±BŒý>}~útù!;F3!ÞébN/±7xœ;îÖ¹¨Ý:—gPžY[ç_Ã-¥.F­DDh&“õE*LŽxê²E·}‡xþ_Çð´iG†@,ˆ]ƒ€i+8í(Ý ¸ó(;koÛÚë4íåó)÷‹%XmÏuñ®çë†è7ž./_Ï/Gžédøux1<ÃZÚ‰kqõsÉ±ÚØcö‚QP0¼—HLÄ€]ÿ³Ëá·óÅ¿ÃþÞÞ(`Ø?[/ÃÑðÇá ÿ=z»Z]ü< 777qqýþâc\^¾y •vÓŠ(Å$cóŠäk‘Xe¼d l'µ.>®Þ.70h<[¾¿¥Û uZAàÚ/&‰ &íáÐÛ#ºöË«ºøK¥ÅmA¿-L‘Λa*ùAazëBÓ »†óz¦QjíâÐþ£0M2Ú-Ó|—b$uÛN²³tÇbôýÏ¥yû\m×siúÁEVeK{-;kÏÓ¢w wOYØÀˆæH¸-÷p¸ÊF³¾LÌ^1·>.£³ ×Õ±µm»£îì›è[/&¸gîÂMƧÙ3î<íGY°n—ã:±[Ý´`XŽ+õzso@oâˆ"÷aÜJÔTú¸dÑGø•(KWRlb}ò2Õ. ƒjÌÖ·0q‰Þf{¸ÜZä)8ÈàØ\ZÔÚ· frX¯ï5Ì¥Ö¦¥†KÉ¥3-nt7ÿì’¾mŽlÛs¤Ù®édçHÛ˜ÖZÍJ§S©}\Á59õqÒpÅTî㔣ê∣–þ9¸QT³>N)N@ŽMûÚq*>Ãtq¥bôÉ}¯•Ü¢¥ìáÈ|‘1À¥Œñè5 EÿŒœ©¢‘¹&û£éŽÂðËòÕ2Àè®æã$úÒíqX5ýK┚±Ž»»ob´"¿ïÈÛ-Yäf}B¯Ô¾n⽺•>ú©ÜªSÿK©¡Þ endstream endobj 436 0 obj << /Length 1764 /Filter /FlateDecode >> stream xÚÍYmoÛ6þî_!`Àj5˽°®i¶µëË’ýÐ--1¶½x¢Ô´ûõ;Фm©ŠcÇiÐ/–LQÇãswÏÝQØ™;ØùcôûùèÑ óE>õó ' Nà†È˜sž8ïÆ'ŠÇ|ö×ëÉ”áø¸Œ›\5¯Ó²x¨ÇNE&¸úF±É‡óç£gç£G–ÁÑb]àÀ‰óÑ»ØI`ü¹ƒ‹B窕;®Â5sÎFÿŒ°Qoªê†=U F˜ZÕ >KKÔþ6ušI¤ÔxtâÓw&È'Hl_ID\²®š¸þx‘f¢à¹ÐouV"$BžGí[ﱇõ,/ؘå¡(Ös0½Vc(ð؆8Ò"f· &‰6fO)Ñ‘ëL A‘çÃ4E¬Œ°{x|QVúfÆãË« ›U‰‰Ë| 暥YZ›øÞM¦ &‹e%b^‹¤·xGÕ)uQV›’EŒ€ôæj½E¼¿¼°û!CˆxþÎÀXا¤ l#…A®.õu¥»þË äÆrQ/Êä±FuY¥E-;³²Ö7å…¾ûi1×¹’Ï…ì.+ °jl­æ&/“ô¢°a~+y5+.qf_ëŠÛàiò™¨†¬‚äE»Ø7´s® JD»Ø5ô½®}Å„xc­¶ÆJ‡ª¾_ïa7äè­‘›‹"¯ÕùÞÁ".p7³,ãë·~1~U}ëú¦ÂlÞT5ØtÇãmï´yþ®oSó¢¬yµ ›ºçÌŠÓîÃ$©|"ã4€Ò?rÙílÒA¹k“‡R`+!±²TÖϾÆY“ˆäèUY ™9&×Zùº+ñ;b‘ÐïÂMT°•ZTrPn Lu¥¼§Ôë›osm¨6üqóPÀÖ Ô·~S­XÔúf¼=q¦ÌE“ôÚ´Ä€~ž‡p8 Ÿz­KÑñ‚›h°){sšœô2h›rÓ£–Ù6\þTÔM¥r[¤³‘µ3ŸO˜7®ÑÕòD‰á™4ÃW Èq6Š[éè5»\1o¨³½Òß¶à !nüÃ3Ñç&_n«á LíScÜM¯H¾#¤[¨Ü(dÉ“|äè|âic ÔPøƒ»{jô}¸Q75* »±´o>¼½ý (%~Fûýè¡ò íBŸq%Tgu︧±ø5ëPÖ PHÉ>Ë¡z…Á%905kóÐ8o'¡â“K^•Ma‹ó…­@y¥Û'‚ðƒV~;ZñTÚŠšv˶rÞ–&{l >‘pçäè¼›z[4:ô1rCº["›­Šùbââñ¥½¨ê~{ûo76¿ÁaTÎîÂcš\Ö"¿ã2é°ÒŠ—~DÅÜ“ÈE9¡´_ÝîÎ\¯Rhãl! ù fÄåÊ2ÚJÆ«^ò:^è[ÒMyyióa’ÎS[×ÎË•œÍ.Ý<½¨Ê¼W÷ ëëßµwÆ[î€þ†û숱}˜!ÿ:±1…¦#؃kˆ¶âèÆáÓ€DÅ®ŒÞ$q5A¦ÿ‰£ÁÈî´ŽCÛk6߈ šø\öìg’Êvëv¼tõ°Jç ë× úÚw¯Ÿg@»w©Ä˜-·ž¦u_¹¿nj×T¾ÇÉœ"öˆ'¥òÛ÷¯uù³õ¯Bßпún݃X)&‰î¤ PëØÀÒô×7¯êà‡FßëV7ËLܶ{µ'A.ìù§j†Í1©¢)˜kN•¸M—ySóY&”lï~ùÑíïŠþW|¹îj×dʳÌö°¦‚ü¢Êž¥IˆøR­­K†î‘º‚*`D}¦>xøÄ©àÁwƒ§è1*`â|³9f[Ì6]äÈ«€ôUÀç Yù¦!àïRT©°UlG1â´5ó¼,“&«¥Öh‰Tož@Ï炳ƒÇ´¤b·È+™úüÉ„áqU_ë5òñ.ü@|P)j)›ùÞ5qhäÿ) sÆïã×H]ÃñÔ†……ýU_žUé¥~ü¢h’ÕÓ§DÚS¸×_x`Æ ´@¼M/> stream xÚÝXÛnÛ8}÷WðÑj.ï—>v{Aƒ^ÐÖ/‹¶›NTX’+Jm÷ï—)G’%ÇJ±-Ò—PbFÙ3çc"p x1{²šýõœ  ¡D€ÕP¡ H¦ Ó¬6àãüù‚ ytõòíbI¤š?ÍÖebÒ"*â,}äçÞ›‰¬ñ/bHŸW³g«Ù×vk!€$Î-ƒI°Nf?#°qóAªø^[%€ 寸0{7C!NÔŽ—µã­|b•>Ôõ.²¶ZÚÙ©–!aáœÔVÛè*Îà6Þ™KkòØXè?¤õ Fr}ûÍ­õ€Á¡ä¬±ý„8òF\¶Œ8ÔR66»Ø—ÙöÒyœ^ùä"Â[>qi†«œnY/ ¥P –C͹ÿê‰+Š}<ˆ†¸Š7éy¬l–XBMÞ›}n¬«½u•æŽ~°ÔÏÙÖŸ"»f²Èü& ã_n¢ÆKþ»1Q×Ix]—yîõ/ûÌÆóºž7aLÍóù¢ñ¼ åfAøü[Á—PÈ•ø\ÿY`ŒçY<ílXáÚçÛ|Õ~†ä÷IŤÃûKe1:'-ÕîM™\¹Ÿºƒ—SÅ’šÿ›¢ßtn Ωlÿ6‹3HÄÙ—YÇ—mÎ#ã@ÙÐ=!®§c£WWáâ¦C1Ä ½ýÝð:Û”»ŠÀšk1ǺŸÓvìÏ endstream endobj 473 0 obj << /Length 1159 /Filter /FlateDecode >> stream xÚÕXKoÛ8¾ûWèh1Ë—Hñþ²hE»]ßÚ"eÚVkI®m÷ßïP”mQ•c)©³è!0©óøf¾!‡ØÛxØûsòëbò⎠O!%¨ðkOROòqżÅÊ{7½›Q< —/_ÏæTÓß³¨JtZ†eœ¥7öÛ[½Óa¡í#‚ØìÃâÕäÅäó„€ì+–#‰¥%“w°·‚ï¯<Œ˜ ¼¯õªÄã"€ß÷Ïäï nLÄmSm™ªR OŒ0“ÖÜT+ïã$ÜhcË;´6ø I郴zé{ìcø#µ±-€†jí˜3‰?ðæ„ åûvã[]Vy îúxZnµ¤zFüé·ÒÎŽ|çÆIoÃN$=)ÆZzŒÔ´xÈF¦áôàÕzFL¼âì{:ðÍ¥BB5*i ¾lùQGe~ÂGÒg£ðã _?ñLøÑ'à÷cºÓ- Á×DlŸë/qV=ØqH$: :êCz37õÞäzFýé—¥ÄÐþús¥Óèá SFd¿Ùg‰0$1ÊzA¬á¹Dœ}ãRÛÏIž.Œg À&1Ž@B"ÉÅO†ãC$r4Î æÈWÒ%n´ ‹>QŠ89¦áÚ ­cPTè<Ö²[œ8,Aþi¬NÃä°ã\ˆx;Dv‘/Û RRºÎ©=⃒Ùwó àpƒýWmm7ŠN؇¬6:…¥%é!Ï—¤SÚøØ Ú9GÑ]CÒ×—Ïà>—?Vɾ¯x0X:€×Çx§UÒ#4ßNh‘nZ×Z 2—‘{Ŧ¨¹UÉRç`Äø 8ˆÁ8Œ”¢Cr¦E…Æÿ+Т†hÄ=÷YrE@?3ŒW]*õWå”é †pêr™‡4èÜiãΩäX&™ôÏÑøõ£¯s¹BÊ^·5áásÕqsþ"zºJ× *½vÃØôÚ+ý$rÑçêlİxZ›“ƒŽs.pî:þ˜#Õ_ï[;žÒcí#7Nn p5ïkìXŽozdr¤N9•BÊ‘›º©(nñ‘„^yÔY”zKzäPˆõé¶pQNYwœa¤—adšO·w3 vE_-€DÂ<|Ì2¸Öû´sùż^ªéF§:Ë,·™ë*ÌC§ýg¹ K;²Ua…ö›MI;6‘Ÿ‘©]Ó2ÌKÛkÁ¬iÄN;›·” Ùœ)1}Y{ªÊmžU›m³m·³ƒz}³"N™QGݼµ˜f².^[º$Y~l*æß"Ç›#Ó³HëUá^_<(\‚®48”Äé¡+]þÛeìAÆý‰ãȉg÷]Ù爊ÁÏʽ/Þœ"BÊÓšƒoìt¢þ¶ ÷¥nÒ‚Cp¥Ý·ñ73S›° ³æu¿Þ±þ?_ÀÂÛ endstream endobj 497 0 obj << /Length 2424 /Filter /FlateDecode >> stream xÚåkÛ¸ñûþ ³$Eê`ö¹^®¹\“E‹b,d‹»Ö­,íIr“í¯ï ‡’%YëØAî¾ ¬¨!9Î{FæÞǽï/¾¾ºøÓË ô–„2ô®n½ Œ™µ©˜©$ð®2ïÚ¹ÜOW?¼Y,eûßVëÝÖ”mÚæUùœ`oMaÒÆÐ g‚‹÷W¯.¾»ºøõBÀYÜ^$­b¼õöâú=÷2€¿ò8 ’Øû`Wm=Æð,¼w¿àŽÎ§ž–~5¤_ˆ˜ÅRy‘àŒÑÿóBýuº5­©Kذ! ‘ãIâ-EÄ’@–K©G{'GÃ,é´˜sY7íMµúŬ[Ü69Asýj)C`æ~»14hÚ´nóòŽÞní Vy•oÓ;óœ€6ùzã†yQÐhe&ˆ%ôR•ú˜›"3½äåôpóëΔk3º®·Ô p%v\ >ƒ+¥%¿™aG(y8æGÀ5‘„ƒmú1ßî¶ôRî¶+SÓ¸ºÅ§òjÚUÑs]•Mžu+›Ö<¼X,•ävè€ù‘Ÿˆh¹3! ã#Ðî-¹K!X¢5–ÈÎ$öÍBjÿ? ¡}S?Ï{¶€3ZXµ4·+Û¼ aÇZÒ°6ézc2”ëÈÐܰ;û¦Æ.i½¶×éîˆKš—ôætFîš8´æ ìݨGnÕHsîOº§ ˜èÉûóU¤­ÓµY¥ëû%QšEñÄh‚D*iÿjh¿Þ‚®Ó]cfò–`V1àý¡ÎKJ ²?—P–¼qØB¥Nóƒ[kpöãÚ< _¤)äÚ6o4d«8î ‡lv,5íš!WÉð œ_È›©Q¯Ó¢èC]íÀSô3Θ7 Åtß„D¥NÀ¹sëMU5¦ùÂbµª6gøàiÕL…rŒ_Í-ÇŽVXYí·(p_un`¡æÂÿ¡¤UýìT’4W»Y´:|¦nÛˆchY± çÜ¥úí„Ý…FnFˆì±ë›¼¼EM¡[Õ4pô…j ¼cN3{£ø6¢^[¥Fœ»‡Â ËSÒªâÌW‹¢ÁƒõÁàºË9‡€þ±Bøi±ëUvŒM°7%ç9„‹buµ=]i¹Ž))Þ°Þ¦{@¯æ]¼«Vm F<²RÐ(5VØw»;pgmõv hÐ «ÁÂÿúΣÁÛïlj äD¡< f© 8–¼DßDºO`F8b!=•(Æ!ðÁÁ= ^DÃ!i‡Á)¡…ž‚p,‰b‡·6Þí,â'³-Æ S þ`ËòÖeb¡£OÂP¡a'!„ÈÈÓJ2 ~ÀJ•}â1âÁ)˜Iç u¢Å'?9{ŒüÑCEÈ„êóáæ6/Ì ¹k3Dƒ²'º–†hð®—!ç>ç—'mü›Üñhm/>—oKÌú潌>qì»÷i´Ž–²jÏÞ:‘$Z¡ÞK²AO˜d¦×ֻ€Kƒo1Bœ!¸VŠ1_Ít$¸ ¦q¿ ãBÒQCéÈÅÉD: Ä™I }È1ÇÄ‘©ë Ê;.ò{GB—ŽØÊð×Jt®8€Œ3KW…Û€öÐ-ôd"ÑOß‘CŠm{Ä.'»FyágËÃæ}7¦ .Nk®NÐ@Gy çB8ùç{Ç›s‰/…H êóòS¢Ç(Ôi0ÇçÇ©ƒh©’€Å Ê3¢å|y²Å"h)tW“[ûbÍ(ů6è ðˆé$zÂÇsÚ1:&Ñ,Tb_Ëk·HGà bj4ª÷¶êzºæÇæPî¶<ŸÁ©X‹œ—?aå>ƒ¤¥ã“1éTPNV——b†wÿF:ðNL¬|tê2%â*qyfH»¾Ôçiû¬14C\nèJéi¯ƒêqà­¨,ìŠ#j&4ÇJ™¥T6™õƒÖ€·™c€„Ú3à í÷E&ªéÌAB$LïEvŠš‚Ô¶3²1ähGeY’ fs™|:2+, \Ex2ƒ-Ê­),fûKJ&'£Ëò»¼m.Õ&pk:8†i)b ÎSŽk§‡4Ë î^>û׳¹v d¬:úý­ØœH(ìA“œZBõßç(fi›rÎ3™íû ln˜YIÐ4ŒM}E\?صŠhíï—÷Øå™ØåY؃!öa‘ö=ÑY裾¢îÏggX ÃN3 Â.…˜­ü‚Кœµ:¼2áR0ÅôlïüœcýàÐV±/¾HSªSö‰÷”.Ö'x¿ãu•í óDCìÁE´ˆØj>ýe}€viò j¸ýÕ”eßX{ÃèùÊVûà\Œë:ü‘ßÕ¹krüXî2œ=¢Ï’'PèôŽñS¶Ø™A¢© dG/we–Ú¯+……(ÿ­iLZ¯7@¡Äôðµéæ´ÿ®­wkjÕ€×zÒ±ÙÕØMêò'ð_b{¥ÚÕý6ß’ÓlhömÞT†¦~²ý< 'þ–®ª:m+liãìKP`Ã÷ÍŠ¸sG-µ_hu$ÿKjëWÍ}^df®·d¶i^¼ØÿYSÕ–Ý®‘–Ý»æÚ0»¶Î¶Ê\ Órq&CX=ÒóÕÏÿ<¬8öâc¼uœ‹Ûã<1«n`a¾žqË*b±<%¡ìs¹Õc;óC›-êß…‚b!žD"êÑ9ž´]…ÚøP›vÒŒ:ºOãOR£L].Õ5“]¦FìdYÇØ?›d-\ºú•Κ¡¨7ÂsÄ@—+Á"gÐ3Štpº0"pAJŒ½=p|W—Ý×¹âqÂÜýU~{¶ ¼î˜kpÍ$9·rmš@EÇ(Luz?y[£_TƒÂeLgñ&!%gÀâ5\€Åá>ÀâÛ0ÀâûÓgm€ÅA`-ò.ÀÒ‡R»'æÂéäó^ò‰Ï{ÞõRcÿð³ÃíôÇ Zêžü[Ãߪ`3H‚vË>=ósPŽÇŸÎ1~Ê÷ ˜¨?H9JB_Šé…þœ‹/ endstream endobj 513 0 obj << /Length 1836 /Filter /FlateDecode >> stream xÚÕYÝoÛ6÷_¡·ÊEÌòK54]›&)Úa[—ØC[²EÇZdÉ•äzÙ_¿£HÉ¢¬&vS`Ù‹EÉãñ>~wGaçÚÁΛÑÉÕèÙ9ó…>õ«¹P'àñ9W±óÁ=SìFÓ·¿'4îi>[/eVEU’gGšv!S•R¿`Dºz7:»}Ø;D³å(À3[Ž>|ÂN ôwF,Φžµt¸/à™:—£?F؈ˆ»¢ò¾¨#Ì-ê,ÊRm óDg¥ˆ˜Ô³æÑ4ÉQ—³d]K¤ø´³ ôÏI³ :ÀÚc(E3ó#ö°žäÝI( Ú9O£bÌ÷ÚÊB[PF[AXqŠV°§Oo667K6& üŽl¤6K£ÏÞÞJòqèLA¡çéU'`×ò'½Q,”½¿\øNŒvˆг­þ[ùõ¯Öþvx·pŠÇ„(dÆ//dƒÇyàœ™~j.zhH¯N/_ëѦž;—Řc×Ì8»¼8‹öõ¼ˆ²™Yp¶Œ’t‹À*¡Ò„ƒFàä|¨å¹È]+i^ʲ˜#@…î! 9Œ·ì¯úTèf{ Á úO§qˆn œIâÉlTÞ×¶Þè·ç êNã—eÍnP–öOþB¶.Ú…¡“Ú{`__$+õK2&®ò)óR ‰¬R3Îo'³|¹*dYJu?pé©aÐYg©Ù#–j—LOîôV/4M MR.Æ}7ŽªhRÝ®d]{Q7N +¡+ az[1ò"–µ1êDÕ‰ñ(3ú͵éJYµÓ:V¹Z$e›!õá`œ&ÓB«^‘™1•ÒpŲĆ”%«u %cvm²«2ìßy•Ìž­³›,Wbl²nâ(» Šú¨êdavxØÁˆ!Ü%8@^Ø®ÙA‹¿ï¡Àã‡$¨Ç[ rŠ<ò¿©™Ÿör %Ý5>é np¤s˜0€#Øàî¬&-Ž`G°Á²Å\ã#6Žø¬‡#@¨qd<4ª˜Â{/Iæ0‹‰î,xÜÚj@7¡koø#Ò¯Y­ý:‡U‰ZúU½KýçWEˆÒu-?oêN&Ú. ³©Ra´.µiY°]xaöW:Ñ£©jz×Fάÿo]ëvYh³IÊ›dµ2ÛÕœ€Ð·úe‚€ò<ÏE÷ô¦Ü­õª’Ÿó¹RÞç¯êØQN¨‡<þ­8àB`H½û¸ÐúÝ\ZY”ßÎòX?I²ŠÑ'CP¢-ÃûÑÐ jþVœ›”½®§Lþ‘mLè 9¬º§¼ËÐþ!\~€¡AÁDÔprŒ¸1=ÿ@·±8Zns/C™ÅP{?y>ä<€lÉHÈ>tjÌî½; &·5‰¦½ ¹«ïUQêò‡Ù¾Õ·JLà8•,ÊAf} ¨À{Ùù#¥Þ]å,ñïwÓŽîqx ][\•U¡0x€+Úª×J©o…j=näÙ¶ Ÿ#,ÂòA¡ˆƒ-z·ât®µ¶Iz{‘u^÷HeÕ\ÃĺfÙñ)hÁ¡ªãÁç?NðËT—S N¿Cp8‡D‡¢²]Ñ¡c,¶Uà*/uÝm{‹ùu)5Msè1õ5À[3ãÌQg£æf²å èúZàˆ„ ®â†À2„ÊØz !vgª-Wƒ©ÔOø‹@ xò£qP8ˆß§0Ú§øÜ¢¬wø¬w­w9­wYAIJ<êO4T3¡¾B¹Êë d ñCê$ˆnëš­[E˼ñ©r‘ÆèMû‘¶Æm¨(­?W§°(ò }ÒbI= øy逸ú†3h{!(HÐ&ºr­>gRÆ2þ!]oWivM£.ñÄÞ9‘`Šöí²ìTÎ’¦­KLn(—2¶ïøU@”›:Ë­ö¯ÌØ#¹¨nžýÏlGÔßû+Ûà@èÿ 1@KkÈwÐØ6o¾^D«ªîárÀ=ŸÒþ§Â÷c¯3E¼‰Æõu$X͵ó)Hÿ/Üò] endstream endobj 433 0 obj << /Type /ObjStm /N 100 /First 872 /Length 1495 /Filter /FlateDecode >> stream xÚµ˜Mo7 †ïó+tLzЈ¢¨Ââ$p ÛÚ>lœ±áÆÙ-Ö ý÷})Ä;Þ­Æ›ô°Îì#Š¢H5Šq&xüôB&ëÅÒ'ž E½ã^ÅøŠEã+— W.Ž® ¾@ î?å˜LP޽åÈ‘Œ{11é5™”×l2鵘J›séB STgð¦D½ÂçT*)2T…hˆ¼ BT!ë"T(pWÀúœ» Î++AY†¾àž`ñ*ŽðC(ŽQ(N+ ( 8eðeO]ˆP˜£>‹Â ‹ÂS” ÉΫ/º 'ã©ÂB… …“3Þ«fñt/V§&lJHbôç…T€B PŠ PY(Œ c¤O C»O"]ÈP˜ÎŒ]U8Cs®04— CsQÍšK…±å®Â‚ÂÅ&… APÍÅC¨fà‰glp‰†YT`úÜPjèè(è‰ØNAaOÄ胄Èx†STú²ãNFç *ÀnqÁpñªX ÀûBØ2§“— Œ'.jÄeu£UaVWë𢫖N(¨IdÔŸ¢»$u¤ ?ØBN… O²þT(ˆo…äâÖv*`bÔííuýsˆn‡¦ÿý?MÒ´ˆ6cs柯®N»/¶r®Øǵ8øÜ:DF“KbҮɹ`ò¡Åq 6s{‚-H»&G°/¶×‹ ¶>LàY ÕG9X„a›‹Ñj6¹Pl íyKA¬S‹ùÊìí™þ€‘}ˆ¾ÊDußÞ°Ö‰r{ƒèQSno4óïÆ t±»ùÊûwËÅÙѰ2'¦÷æÀôÇו¹Ÿ÷øŸ¿ü1»ºþ5læ«k$NÞõ‡Ãõâóòl¸®E³>úuøp9{µøbND$^*þÓÌ–‹­f<\<êÆ×Å“I’lƺ9iƒZ¤W‹‰ElñÒæ°ŽS›ãl½›À¹hý„5 žX)¹É¡äÚDmLòæú1æP?œkëãT,·9ĵŸàföd¹´9·$×v¥dcl»Ý?)¡Ö2e-»¤ÍöTÛ5¡$> stream xÚÍksÚ:ö{~Ÿn`¦¨’üîl;—‚IhÀ°†lÓ×ä0‰oÀfmsÓÌÎþ÷=²d[vHÝngg2±t,·Î9:7n¸qvò~vòº¯è Y:Õ³UCÑM¤éZÃPM¤ZJc¶l|iö[7½ù`ÜjSÃlö¢Ån㇩—QøŠÃ\í{‰Ï'¤´¾Í>œØ³“ž …¤aP@«"ÅæäË7ÜXüC#Å2÷ÙªMCÕMx®Ó“¿Ÿ`ÁgñDØÄˆê Û¥“F /ÝR2¢"EÕ)‘ÇRUƒK¥"3ãñlj¼îf‰5!* Éð¯¼y¡y¼»óc‚q°ñn|F°Î1tDTšoEËÝÚßËÙë¾*ÛªM±‚¨¦ÃÀBØ$|ÿbí% §£šÒjJ‘Jôç˜C|pUî"TCµòmû¤©P1¤›•¯XÃ|‘fH‹4df¾fé¥Þ[' sÝXÒBUCª^µ•Š,“ä n}oéDz k £TbT”\#ÝVœCm´ A–¦ñ]ïÁÇ“7|¢Ød¾k0RAèÌMêÀÌMª†°Ùgniü„TìÓ൉,EœÖ´°Ïþ ²È1†Y…ÞfŸQ(s]ó`£¬âÑš€êI»`dªÖ“vyJpB0º^•=&ƒ!Ñ÷PQ PQß(×`ºöÃg8× ÒðËœPª¡¡MQ€µY4[Ö/‹[O-°šB¬ZÄ€ öª­NKÃÍ]zÅpºàèáæ¹†Ax ÞŒN#p&³é‡‰rÈoüaÇÁ]„»%{ûÌѦ؂,PD‚.¤2?ªØl®"1èïÂ¥—%¹5¸~â{ñâØS©ÞùâÕœ¦ñn‘îb?á+ƒP `~íÂ^Ðf<ü¦Š4E«Æ ”@2M¸ nD>:Y’e¤ØlèÍ£ØK£øÏû±/¸Kæ\171šþŸü­bY|лh«cÆÁÍm*$²§n¿eâ\À³Ø£ùÚ•[Ð >G¾O§€*Í¥/è|U4Utu#ä¾üU‹jÍ,U R‡R~ÊȸÊÊñ…ÅÓUÔaš¥W«Š§J ]C†¦¹ÿû’‚þOJ jR¨~­_QRdÿ¹þËáóÌ=*$\VHd¾â…bà3/ãA&LwÞz-\’ዃìädþZðlÎLç³½"ª'/Nu ãLqüD363'+¼Od½ ãÞâ ¨Ž~ªP>l¿cOÂòµyx§Îg6fѕýÅ"Š—<µÀ4ønCð•Re„ìa¤rƒaz¸gC@IÅZsv$‚#ñ\2Wá”2­Á@ì¹K8©9»NíRñN,}Yp”Ë/¹ÉâÖ_ˆw¤·"Þ×B¹Û8º‰½M½T¬Vñâ|°Ý®ƒ"±‘3‹X"ÈFñf·öj–£´¾Å_@u‘''Õ<¬rèkáäÜîôlwz}ašŠ£% Ÿ2L¿å$¾œöÇî¨Ó²@ñ§"ŽýñÀ2;Åü¼ç¾^L‹ùìÓÄ.&ÓÁ¬œŒÆ={Ø‚B²Y€.§¶[.îŒ&Ci¯=s˜é:£æ¶ܼt*[œËQI|0“08Ýñ¥3+YsƬîú56Fg0’ÐŒ:W•¹3vf‰ gÈ•RBúƒ¡-¸-`]×Ëz%ìrt9¬iÔv&Óž[›· ê4C-¹O»ƒá° s¦3{RJèvœ³’©iNg- ˜½Y@ù»ìÉ"]ŽÞK¶pú.è}*¡,ÎÙÐÞ£M]-a“Á•=|_Î3ƒe ?Ne» ËÙG†{ìöீ ÇΙ<RœÙ¥Ö¦ãK·k_Ôæ#Ù"¬Ð™IBuíaÝðÜîàJ"q;³G“’¼<9T¦ŸÇcÉä¶#ì „þn‰Ë퀯HLGWRëpàØòõä¼Ô¬ëH”»c×µ»3Y‘ÌÝ ½"¦xÓ"ªO•=ýêSÕÊWƒ’Ûé œ³R{6aî'ñ7¼œÉâN†ƒ‘Äofý3W:Â! UpÍÔÎÑûÁlÔ™–Vw«s{Ú{lE`«uûJÒR·'xITJ»ç’ÓŒÆîä\Ú:Ž%KMŸmù õœéHòH~dÝ‹ª:™7]òtêJªül—šèô>ð+ð§äîübøÛ#ÙSZ³Ýãö%lhO8’Ô}÷ôÛA‘*Éd:étÿÇiîÍŠ¦×ÒÈ_á^ýxÙ«§‘˜*dç^,®S¨¤“µ—îí‡YHו£Û.Oœ¬\p²îIj%Ñ‹|qJ¢ü‘ " ‰h Ù? òË »Uò>/‰ õŠ£XÇj¢Ð’{’óµÿ\¡Ð¦À-1kªÞn¯Óè:Üm¶‡– ÿ"âú·ôa+¸úƒc0pí ˆ4Oß ¤/®%z±X}q±BOßýûxÕ.U‹ky_#Ë@&ýµ Ö‚ÜÆû~ …üðVÅÖ¾.›n‚åÈáþ©DU*üSý}—§ª?~çyµ›;åü!_¶- áà{Vò‹ª4zã§yE›÷ R¸mäµ+Û"® Ù=‚Ýsîüío¹í¿8éJÕ ®Ÿî²Fh˜<Ûœ€KXÙ¥|VºçQǪ…È?¼½”=qÅB†QiÛ¿Ü?ÔÌjh9óC?.,W  gyq)#\øòÈSÜ5nv~—âòZøfëwv=ÉcÍ"7æ\`3uaO¡.‚ñÑ‘†)*úËWëè~ª ‚ …¥*ÕB&QžSUá”/ùáÑÒü|  ?ëk@]µ¦ ¦ÖQ)ûyƒ°ð¬]¸õòktXŠ3%¹j.Ö»e‘¾~¾]xÇdaÀWLó˜n—d™*&f™Ã5 õ µôª&?–moOg__©ÂE[Õ!_iUáhb¦~’âÈ/'¬£šœB8FbÁ¾bWbý½Éº•7ÿä¯7І°Ukÿ-æ«§?Ý[jÙ|=æÓ ¤ Í4²^¡šëîñ§›ýýéU¥ÏŸõ¦Ÿ±Lh(ZÎ$ÿLñ§CÞ@we·ûw?‰WhWPÕt A¥ü›ƒÇ¿‰*Ôݤ0¡¹Ï])… ØÇùó:EJY· [´©aXz“*u±þ‘™(ã endstream endobj 545 0 obj << /Length 2058 /Filter /FlateDecode >> stream xÚíZßs£6~Ï_Á[ðL¬"¥“‡ÄÛôrÉÕç>tr7)ÆrBÏ ¸×ü÷]ý#Œ¯øzíCÛ‡ °Z­V«ïÛ•ä8Ö“åXßž\ÍO¾šºÔbˆQB­ùÊ ˆx!ò˜kÍ—Öƒ=ÇŽ7÷£1 Bû›,ÞnxZEU’¥gJ6ãk•\}8#wô~þýÉõüä× Ã8Vf=8oNÞ;Öäß[rYh}”ZË£!<×ÖÛ“NÃEÖq;Èqåâ$YÆ®Ãì«$Šõ>MÖ¼„WìØÉ&z’ï Ž ®^È7êÙ4‚âÇ"©*žª†…6T=ëo’uTmµê’W<®²B[M—ê%í¢D£±†özbßÖv¶¥¶) ›l™¼sÂu×wŽï”É&_k)|cGÂcÄ|_ÍvñRñq¶ß^•¼‚¨û°@ë§ œÞ ¦K€˜«×pr3…1\ßN„÷.•.Àç:Y*` [ÉÉ€t¥I¾…¹&é“’LŠ—²ŠÖë쩈òç$V’ºl$”šð[>TH@­*’ZVeJg²«)TqA™óXÆ nÙÎV;­ž Üü8™IÐÕ¨ùjêµQÝ H¼ŽÊRèƒZØR#y˜‚¶ÔZE‹$Cñb%1‚”>%-ý!JÝZ_„yߦWëˆUVJ~ÐRò ÂZ籬ŠéȃåZó4Úð‹»,å=–CyÀeÜ Áš1fùÄŒÛð¶<ï‹C¸¶¼LâJ©˜¥ŽŠ+Qšóg0˜]?媊‰Añ"c&8€í¤R²‚ç/!­ì%|0Z¿†®ÄSø-‘î|{©ž~ÌþõÛÚÓ(›Ô#¯ŠlÓñ¡ž~ƒ9ª‰(2ã6Yk &©zÊù¡ÎJ¨qÌ ]ÝÜ]Î~z|}9{u=ÓKAÍeƌՋq¡Fùù!¢3†ÞÂËÙXòÓˆ{<½Ÿ½¾1ßžËϷדùÍýèð³áÖ÷Æz@ƒ1W·—w¯zœs rwÈÕÎ=œj'Ïjg±ëU§í¯ÂøJͶ}Qªú¼ä¿öÉðÿúþ¶Ç{ "îž÷_ÚA ŠÈp©E4îÉ*ÄG8ðk¯n³,ÿ.*_ñ—šú \š4±s=dÇìÕJg=V<ÄÂ&%|ôâ#8Ö—ò ¡HNLއ|ðÐÈL3^m‹´T!ž p[®™¶ROÅPxÑÞ¨Z+²–BáIŸäàR&ÛOÊ]#QQDº{ µN”eñ^Çë Ú8;h{;¿œÍ'÷¯__ß͇Rúê‰?+xuÅç@Ô¬Õ©…‹ùö:×G!õ)Jå+±‡—<ü°ÁKzž¹â“g€©S¦V˜†zq@`®0šÕ,•¦\NÊv=Tå€U(¨.I H3­Ë7yõ2¢¾ û5—Rû<Šh£Ú`ºÄ×#žC³Ô÷œ íóê%çû) ªæöq²:ï«+j€Q³àû¼œ8WûÇc9aD¬ÇU]tWAaSFP;'‚ }[d Òá¼1ðz“Þ6IÊY€Qàâc²ÝÔÏS¤)ÜY+…YyÊX©=ÚÇâÎ ¸Ø\¹ûI•¼é¡öéÐÒZOá;B³3ÏÅuçžq5<…á½~NOÑÜB³±Ü³çþ·ÁÓÈнi}`ÅNÊË2N’¼y…ÞÑg›´oƒî¢ðä†rGÔ“n[«eOÀgÀA\ÁQÖ\ŒH=šŒ&Ëf]?ÅœÏzKÕû¨k&€7ƒ\Þ6f=Œ}Ç1bL2$ˆ¨/¶.rq¶¼>즴oÖ‡½ ÅF¤ëêLëàäÛªkå ®0”¾€u€%7;‚iù©utáÀµƒÏëÓ Ùá£ú9»ÀIíŒ"Ÿæ¨ë,ZN¾»ys{?ïA3õQàÿ¥Crßæ³ …Ó?óM–Ü‚ÛD”g"‡~\ò¢ÎGê2F0&©ñ¤¦:òD"Ô[Rq9ÒÉXE{“»`ùx0Ùí¥Ålñ WçÓÏ¡{ í¦F¨Íã± °oWš121°°Ç¸fòÒ†niÇ[\1I¥œ§BN†œ¹ä/s¿lé…Rù5+ ^æYºlòhíã`˜ý³´oáð³˜ß{5öyåpŸõÝ„MwÕC'Ù&-<.Ô‘ç“l#n¶/¦£À‡RXö¥˜ŸqåÀ‡ïö¦”új™8¡‰¼Ö¨uêƒ óL^ÇŠ[T!×½ê#HŒ$!î´S‰¦ö úœÖ!äm^Ãlg_³K\k¯:Ck?{v…rd¦¹o¸91§;š ­Í^šÇúUõ\C{Iǘ³kj(ô;®8;WpÇ~ÏDÚ›sk[_Çu%÷žh__äæåàEAHöN*¾ù"´à4>Úiê Ê:Nüÿ\ó®ù¯çš2úÿ],¸84€T(çFFìÓf0³|¼NR^òüâ4í³å‰MÅpc ù+ð'©å{“áÔ"„!ßé\P« Ž(-ÅO™‚.ÑÐôeŒ4\Ô}5«Hœi©øñ™«×¤é aÕ6ü”ˆMàobWwl`ï ª¼‡jß­Í…åïm#0h;Ýßñ!x„þ¿÷? <‚àÄ âH<ÉdînÛ?yŽòJn}ƒÐöÐhL éþ/ÂÄ(‘¨0SYg:Þÿ×å/¨ endstream endobj 566 0 obj << /Length 1788 /Filter /FlateDecode >> stream xÚÝYÛrÛ6}×Wð©‘ÒÆ•{2ÓØŽÒÜSÛ3}H2Ф$Ö©’Tÿ}‰EÉrÜv¦}±@p± ì장±3u°óªwzÕ;1× PàR×¹š8Ìõ‘p…ãqñ€9W±ó¹?PÜǯ?†Ôóûçy´Z$YViž=ÓsÉ< ËD?`D|½zÓ{yÕû³GÀvˆãQPË‘‡='Zô>ÅN óoŒXà;·Jjápׇ߹sÙû­‡­}}â#ŸrÇ#aæé}Ž¥}û·EZUI<è/Ã"\èó4KÊdy<2¢Ÿ´ Ì<Ž–[•I¬G_°ÀU®¥&y Q¾X‚ü8§Õ1šV3-w›fq> ¢[­²ô;è Z¦¹—qš…ÅݱtœqH „Ð縜…ó¹ÑÚ8’V33ˆÃ*Ô£°lê¬w~5`¢_¬Œ|žÍÍ;8‰¤‹pšœ½ŽÛ¬î–fÚ°ñWYi6Uq]æhäÒFT†NA<8‡fÐSåõ£÷ò܃ ‚"%'7¬e„×(ðüµÌ5¨ ¸è§ó$ Éó9ÄP-²àácÄfÕ³µµiƒ‹çO²']»tÕ•¨·IZ>°L‰ËòVHÏZ÷¿ ˆè'EeâeÂ¥Ñ4’ ¬ƒ¨ W Gê©(Ê‹xó¸–Ü ¢jÝÁUýnm¹ý n&¸[.#v?  I•¥¥Íù<ëØ˜¸t„„Šü€Üm†ÙD»‰Keˆ jEdHÀ<¥.ŒüÀ¸¦ÔnÔ(Ÿ´^}Á˜ší깞›÷ár™d±Êð6Íôìfù, ã¤Ð/A·¼ÇCB)´ûíhË-Y!ï]ª]$ÕªÊÊ}d"|ã tj¨ÌÂjÆŠ")—y—;PådR#žOvalØ<Ú0Ì‘Z9"š‡eÙqõÀœ¸ë£LÂqš£h"ý{ ñûIV&&”?韗Ez£Go³U,ßî'–v4nâý è…º[7} F«,U)û Áu-“°ˆfrÏÂï¿OÌÞ¿¬ŠU¼()õ³‚žT!sH¾*ôúó´•À­ÔEZæ‰~PßZÝ»pœC+˜CíèèÌFE‰ ½)ÇÚ?SMèÿÐaA ço‡c¬.òò&ǽÉ"LçÇRºÑü¥{AñMª‡Ð€C+lù ø­è¢ÞoÖëïE:UÏL¨./F{©àœ‰Ç|[Ãö~&fü‘LìiX ˜×Ÿ–]•†"F݃+ÍÓ§7·¶6koÒAž{p¦¤ØE®àÿ=úT×´vãÙùÝaÁbSðÿšqì$[òó”ënŸý:>”"lË,µn³2U…ÓkH¥:£µìù ¹¾ûCöÌÒí£I{Ó"_-ÿE{ê‹Õ¶9ÏCþ1wš¥[æÆwURþ-ä^iº®òk•€6Ân]„½Ã;Ëú¶ïƒ‹„w°šò6\>¿ýñ°»õðî¿  b¹ç±6£ÿ<KâÉ#¸ØÖÇÀ ƒsx†ƒ½K#I¬ ÿzõéÝ7úó£8¬*7Ô¤Y&??²Úeè±Á1$ãÅ€æ(s庤í'|ÄEœÁ%’éØûILÍC±á¡XñÐ5ÅŠƒ’ XsP¼á Çò+œ¨©$^â†M%a¢A%©Ï7TRkRIlº©¢¦’ðTSÉE}Õ†ÛÍ¥a—Pìžjvyb>MÜG(Oö0Ê“‡QÊö?c‡8ü¿˜íÿ è"V©‹ RÉ2Ù= O£Bd„ÛºbC†}Žû-àÀþêêE endstream endobj 584 0 obj << /Length 1815 /Filter /FlateDecode >> stream xÚíYMsÛ6½ëWðÔ‘f"„Ht'‡:±Ò¦“Öµög< Yl$’%©zÔ_ßÅ%‚"%9éô”‹Ò‹Åb÷íîè:Žë¼]Þ^Î(s"1œ»…'ðBäEÔ¹KœãÙ„¸c>ÿé×É”áøMoÖ"«yæÙ ýîF¬¯„~pFtòéîÝèênô×Ã2®ƒµZnàÄëÑÇO®“ÀûwŽ‹h:OJjíx,„ß•s;úmä]ËÔ¨ejfÒÐ °‹\hsï ñÕêÍ4çãÔwÝñ»<û|wüG™>.k=þNÿ¼»§>.ï)óÖB¿ù9‹ ñÇ Q^L¦»ã«M™‚%·Û,^–y]6Zox’*—èÇÙûc§«´Þ~¯_½-E–ÏWf{×wg%Ïb#lüræµã1ÅLírŠQ¢w¯xUÉY ¶„ Af FI-ø<Í‘Héš? ¤åi{0BŒÑF ôhP†”4] ùAKÈGQ°“IxÍ_ý’gF›5ÏG‹É=ª<…¸X žˆrH™Ê9¥ŒØÊ>O ¢bBÝñ¶Òûg[™mÖsËJË~ˆp„[ìFÜZyJìAÈ1Š|¦g]B†UýÑÙ©ÎçЏîÙÍTIYúA#QCI KQ”¢‚äN³Gý†ëŸ ^4È](¨ajÐÞdÅÕ›Yƒn—¬Dgð\c‹)2óm-â<±§ì2¸#,Áu̼†ã=_Ïù<þlmjžf¼Üšñ*Ÿ›Æq^&;Ô¹ù]š=W…ˆS¹¿¸•î©,ˤ™í›ÝD ½Þ d>£ØÞû¨7¥\'«Ž¹€B´=ÒÎÆJ˜šÇM°±…Lƒí„ùc”%¼,ùöXȦ‹È6çQÔ—º×&td2>m×è­e¦Z€…ÅÞ˜Ðwò0 ½ã uóÆß@ò¿€ä*Y\®rðí9 9Õ\y9¡Á8õ¶Cõ›EÐ6Ïo32Z5IÞ’_Í&tïUÕ‹éù˜–ò3£þñÆÌvÔµt5—õµe5'Ö&±d@º~À€:kö÷¥Ä$ø‡?û:v€hp*DQ¼S[Õ¥Ê Ì ´«_‰¥íÄ%ëŸÃÝ&ÕLØÓ#5Qk]˜7Kõïñ«Þæúwn¤E ‰E¢ŸV©!v ѧ9¯™ÞÎl°\KCÆ­f,çlÒ¬ÆLM°øæT;øËcÒ‚b0ˆOžŒyž¯$s=ÔE r£¨ãpßk#ã8ýçë Ú\ÑZýê)­—f޶Z?ðÌ ªš—uÕLßµX?ê'͘ô‚©| £‘íjÅ]M9â¦<'Ì„¡0Šì<§$îΫ8M­ÂÜô]É-0jв©ù&†Lñrñ.6º ×˦™4 &Ç:V‰ó ZÈZíG&Œ%3°;:K°Ý÷ô‚Ý "†|Ø^(xY‰}—ûê^ ­Ô¾Î<Ð÷¢³YwçÖ]žû»Š  ¬DŸ¶šx•7¼xǃ!wÖ fe¾¶é2_• Æ8—Ù y>‡œÝJÌx¾ïÇö¹{ìŒòtj=¬÷Â8b™oVDóæÔ°Y­Ú°;\»±N-RîPµ¨‹ùãJolN§*¡ZìPú5Õ¢Jÿ©vÀ"O2¨£«žÉ³O¥ÍCúûc ìËWÝþœ¢8éNô»Ϧì§lr>t¾ö oDçg:p8æv2ýVÔuƒI0;Õ®Ir‘,ÚÇàcqTÇаã'^Û‚Øþ2jä"â†ò7•ȃÞQ‚žƒ—7 PC÷V!ê¯ÆÈ~xÔ¶Ö­ÖŽfñ¤KdšÒÛ@þ©LënG¿º½™uR|Ÿý¦ŸqŸe/ 'C÷©_päm‚:ˆ>ÊéùPþú¬ ƒYacÍÊŠ“X#23ûð^$ÁxS 3â‰0uSÏͽ$ Uœ¥H¦%4ƒ†Z©ñE!éQk°Wϟ£LŽÌÚ„Æ 4dõú°*Åöú#è$p&Êbå,›VZ5Äa¶¿c½(%ÉÌWˆÆËÏj:ó¢8~¯J¾à6æEõãámUßUl§vòCJYoÍ–ZŠ,òÔ¹L6Ü2EÐ?Ô¼]æš ù±­øW]ÿp}}ucNKP͵î§+(™„ýåª÷£pŒ§ÑÊèSxG÷…àõ’šƒá؃m2BºŸß®e«àúÈÃåÆýªíw¬ÿhNÒz endstream endobj 604 0 obj << /Length 1404 /Filter /FlateDecode >> stream xÚÕXKoÛ8¾ûWèh1KŠ¢öÒ:馋&X¯om±%:j=V”[øßw(’²¤ØŽœM²Ø‹E“3Ãy|3[¶>ŽÞ/Gïn¨k(pm×Z®-êúˆ¹Ìò9µ–±õe|3±ñ8\ÝÞO¦¶ççy´KyV…U’gWjnÁ·<\ýÁˆ :ù¶ü4º^ŽþØ [Äòlë {V”޾|ÃV óŸ,Œhà[?kªÔr\¾[ë¯ÑŸ#¬õÄm}¶¾‹çŒ0õ”ºBjÉýßݸv‹Øfˆx $ÕdцGßçaÌKEëø-Z—!QCû3¬ˆ˜×"b(ð|C³©Eýv—güˆ<ÆcÛ-y¤v± ´¨§„b䂯×uZT{p1Ããu^êÁ„ÈØ$y’†\Í­d¼v•ú“†še¥W‹¼ØmÊÇzZ/çÕ†—B£m(= ;¾œÚ ñ@AT%«ðœY O˨¢Ì ^VûÙdJÁ”Z„Rh­¾×ó5øŠ±½å—+Å·ÂBœŒ´ç$ýv¤ŸŒÓ zÁmxÅË^xx¬­ˆ:* 3Àn$ϵc{ª;ù½Huc*ÕÝAªÏGuÒ'=Î(¸ï2S°Ô']µççÕÞ<ÛÛJñ?ø^¼\)ÿ÷w™Ý|BØx/ž|Øâ¦ Sþ"n]JE@ÚÝêT•smä*ìÓ`$6²ý ë™Ï¼Úä²89Îx'¸U¹ú–<Í¥?äWs¡ú¬kKõ0OõZ¦¾ªŠÀ ®“Š öU탹˜«2ºÛÊ¢é°1ÔBµ…°R#i° Žik‘³"5Z Ý­fÒ`¼FYˆu¶KW µ™ðí ¿ê–ꮺ’k£EIu‘*¤³j_èÙFz!ɪQfÏYÉ«]™éeÙË’&I»‘6ßÚì6&“ÔJ(®ÁädˉéäQ2æÞF3¸ì$Ê b8¸å¢]Œ/7 E®FSvÇ¢àQnÕŸ´ÉBjlþL¶z½³Õ(Ìbµ¨BiX¸è3–M^HŽúÀWôÉZÒH^ö0I·ÑÎk¨Xi˜E\Hh:^ÍÕF¹¶³Ó‰äÙVXìŠ"/+Ýmì²(O‹’ az¥@Gpps§$>ri é õLœ  9œ¢‡D; FgÚ¥ºH²ÓV‰D6Ä¢ÏíʺeSà%{ݪË1/@nÐM1ƒóÅýí‹TóÌe×%´-îêˆ,~“VQõƱ8Ùþ:2 E˜ÑnÉ4ÅA ýÚõòÏBÕ3p¾*a²s”ó·PéV•úgf›`JRL¹° kÖ´™úB† 5§Dó‰ ÙšlÃUÍWTµÜZþ9ÒÉñU:É•\€ŒD§Ÿ\0¥R’àÿc:-&ßßNÿ£´êØ4Õªuòê`•>Kå±yÆ<æ"ÜÜãàè.äQ¬aÇaYÂ}ë\jÕ¹½NíWï‹âHÚP†|—m6Oí£Yí³¯ø‡<ÖÞL³ö7{‹{lód­ÁÓé¦UÒé C‘zÆxÔµlvé@°ÕÐÍJ "×DÕÅýõºW¾ó^›7¶¾Œiâ²1ÊdÉ)§è>ór§œÚH³ö‘;×}ê[l$Þd£W»ë<üx QÍÅDç¡>Çv¢ÿúÔšç ÎŽ«‹¯¿Í¯{‘ÿ8 þü»{<r·ª¯ñâyU»o4W>u˜Ñ¾™šç¸u£H#¿ÿÊ Íží~ä}ü "¢óÞAÄFÇžs}D–¯å#(Ç'¦ èIõ]ä@ùÓäŸóx§?Ðe{}ƒ~ø›±– endstream endobj 523 0 obj << /Type /ObjStm /N 100 /First 881 /Length 1369 /Filter /FlateDecode >> stream xÚ͘[k\7Çß÷Sè±íƒŽæ¢‘& i -„&mÒd)¡Á[lÒoßÿÈ õ®½Ì±I ÉŽÎùÑh4É•(•TÙ1~©$VÁX“tÞñ¬&UkÅx¤: KI&þKÉá}MhS…S«þ\R›œ¦>¹šzó_KÃuIKcr=ÉDÅA-œT×ê*•]½†ÿÃ+†A…á•bT­%®þµžØÄ…¡AhPØÈ(lÕ|ÞFß`݉»ÃÍ… kâ1aÌ5&l\skIÊ„;„ $˜¯Èaì²4W¬DØaØ-2_QÅ<µ×$V°õp–˜º€Ï­»ÍÍ£iXJÅC§Ï8‘®Ð<B÷'Ð<˜kL¸&-6êBƒ0áž”&< ¶R’­‚kî ¶\¬Z\€ÂZ8ùN«ÇŽá©:høŽw {eˆvmÅ(lê¶N#(ììO„¡yLšÇ„¡yt`eAúB´„ƒ]ç’ ˆNR°å©ÍÉÉfy¾;¿J''iyŽ|`¨)é ÀŒàû4ð¨øüñ"°èzP}W?cHƬ>xôh³¼¸Ø½y¹½J§iyñìyZ^m?^¥³ ^ù¼¯þù{‹¯ÿÜn–§°a{~u‰tš³l–_¶—»o¶—3Ãæ£Ÿ·oß½~²û˜NK*Ó;mð¦y}o±ÖOÜãóóTÎâ¶xñ߃©'·Y^~øãjŽzwþ×fy²»x»½˜S”³å‡åÇåé)Íõ«!®¹`“Ì${Ä•’Ik ÃiÐãéΗiù~÷j—–gé›K|ønwþ]&ÒoÝ7_Ô„ ,@ö,¨C Ù3ãY:õò47ñ×ß~GõDál¹c§Ï?¼v”à ¸"Æg”¢˜3Íõ"äÔ²"æCŽ$#'B®b=ë"N™ó@r‡\©Øˆ˜CÊE'ä°„Br2²w ˆC…†}±ŸÙ(×ûE²¡¼‡\¡Ü$Ž)j”½Í…\ãêH9Û+ZÇkÛ—.gZo•3•{•³ËW]—¢{œ§UÏå®0;ä êCwÍ$s(K}¾Ê¨£-æ~~®9¤_±Ø>ôßÜcŠK5Ö&Ò2?ä¸J®]CŽÆÈ­ÇóR§<šÄŠkY1-•LÌ«rêF~<ä¼ðМºže/§LzD€qóˆ`ò5Ž8š"xþkÍ8Pæaí­ùËØ!蘆Ýÿl‡TŒÉîyD°º®þìqÞþk\cŽzöàŠ8¯+w¶¯CÎ35æX³‰„œ¶–ýFq¸yÀ/±}âíKc¿àŽ”Yb?ó -æÄ2­PwäúpÈÕÖ³ Åœßòïhg·¸‚ö­rŠBˆ«PÌáxÑ$^¯úµ¥ÄÛ!¸m‹ý‚8Ì/—‡á4 17K‰ÝÌŠSM‰£©•ÛŠíåRr½Yãþ÷i_4 endstream endobj 632 0 obj << /Length 1517 /Filter /FlateDecode >> stream xÚÕYK“›F¾ëWp‹Teç ®òÅ^¯§â8ö&ÛµA0’ÈJ@y³ùõéy€¡]´V’ÊE†¦çëw7`gå`çõäÅÕäé%óœõœ«¥ãSÇçñ€9W±óiz9£x.¾ÿi6§¾˜^dÑn+Ó*¬’,}bö>È Ki.0"ˆÍ¾\½¼ºšü1!p vˆaË‘}'ÚN>}ÁN ûoŒX œ[Mµu¸'àã|œü<Á"nCõh jà¡øù#Ì|w%«en¥Bðô’‹9÷‘ ÀJÓ}Æ.64®ß¢qQà‹š&ÝmØ×kñ!ZÚ&¨3hQÏy ÁÍ A뚇 Y튴…¹xZ­¥Y|ƘnìŽ^ÈBÆæê7¸üÎ,“´÷T)‹DZVaýoþ–3¢L—dÉ6\ÉÊŽ&çÐ…ÒG³–_Ë0–Å}Â5OµdË‹,—Eu÷l6gp¼e¢ñdKóÿêâ²#ñã€]ßÈ»ò,è®o”¢äŒ¸Ó»òLP©u!ùg5àC”iÛt#à idñîó¢T˧øÔ¿á:µØ:Ç[ÇJôZVUí,ˬh‡B×,ƒì†•òk’íÊ1ÉáA‹PȘ l8vFÝ©9ú?1 «á…ño|(1.Ó&ÃvmÊã Õ“6¢9jY(WVÏßeéPÆv1<j…@È;ù Dî蹑’´Êj¥o–¨}+Lãž]â° Ó7NµE)«y> 4s‘ðÜSÌqü:#„LÃÍq±®åÇtx ²Gƒ¾àò]%_fñ±<ù.;/nz2î€"JÙî—a^¾iêYï(߇¾Dœ„¼6y4E^àŽwXŽ¸Ç»û*…Ì™øµó ]¸ÂÕ ÂE5^fÏdÃÑ‘rY‡ÒŸn’²ê2±)U¯Ÿå!\™µU•Kê©Tœ+ÞwæVX¡]’\ }a’®”È nGªÇ†ÈŰž9Ä0Æ×ü3[ :cúÕ£ëdý¾Åöõk §Ô¥¹U›è êéõÞDxo"‚»&Â{ᮉö‡?Æ(É–œÇ(ÿDâˆÖ­û3ý`ÞëùhÂròqšû'Ñ=üÔEǧ-è•‚óÅ@»êŽ‚Gø­‘ÿ;6|{PØîW*'£• >… 5:¦UîZÀâ@«°§µÓ&®Š"ëQZ·˜4‰ÖM¢á¼#±Ê7X <ÜðU:ÌŠX±µôý²p8xtÃmïxVÝåv»ø˜¼W­kGÓÐá&ï—‹}sóu0OŠˆà£}ÃSÓ_¯ê|º3Eï›#Ï¢46ÝÑ}öh»pn‹¤šh€„ðÏ6FãÇhˆ~æO#y­Òck–î0õÄÙx¦Ê1*ÿ³ÞóË™µfSN}Ð6¾Ê QÒ+sW3æN•3lý4¬šõVhvê—&j+ZKj©ãnGaj7Ì“jï¯$ÏUtk.›23«m²M¢ÒPTë°2»õ»ÅFÐ×åž§%u±ƒùŸx5(ßZPe¶•Ub+G¿Ôvéþ½˪<Ú"Ž÷š±JòPºâ|š»Z2ˆip"j'ð‚1™½ý)õ T­WZäP5ÊP%Çf…2Ùæ›€³ÒÂ’÷¼£#ܼÆðíá_ACÝÿárD½Ñß"?“p(âÄNTh›3Øcûzõræ¦HûbÊ¡°z”ö?¨¼Ÿ1•«ÕæM¨Ô N¦›¢ú¿­»N• endstream endobj 657 0 obj << /Length 1356 /Filter /FlateDecode >> stream xÚåY[oÛ6~÷¯Ð[m fx•ÈbТI·ë°ÔÀ’bSl:ÖjIž$7õ~ýEÉe9‘³uI±›¦ÈÃsùÎweìÝzØ{7x3œž3ßSHùÔ÷&sù _x—ˆ+æMfÞÕð|Dñ0¼ùñçјrø6®ca¥É‰»ÔKæÚþÀˆ 6ú8¹œMœ…=âÄràÀ›Æƒ«Ø›Áü…‡SÒ»+WÅ÷%|/½ƒ_¸Òsû¨‰õ™Ùå/ƒ{“—;ËGŒûÔ˜fŽÇâ<°VqD¬’?åôD7Ž`a2Jùóð&JÑ<*è,óOQÞjs^[/øˆpVoû)­—ÚQ v¨FŒÆ”DƒD Ì*÷½^‹4{93‚‡¯“Ùb!ðð‡0Žu–ƒD"†›‘/†'öÁÙ‡Ës;šŒ˜fa’/ˈÚÉ()R;Z@à„'§s34fUÇ\Ô«Í¢ÛEÑ”ìêÏ›ÃÞ˜H±Jñé2Ìsë.Ë(Eœø÷yÙ]àÆÝ.Bt„÷;§H†|¹=å l‰ ±H€›e½fá«÷iR³.÷·‡ŸtˆâHIR/Xèp¦³†0G5Â(m¨FîE#ºç¤„°»Þ@Ræ/í>D±4Ø…5q0º„u{²„µ…H+ æÓ†`7¼²F† {E*—`»ÅK˜Tƒ"«@[Cï.‹ m‡‡ýb$Ä0·OLœíhžfqXôa¥MnØlÚ'€ Dmþt¡§ŸÞºÂÅP ä?@’#ÍEÒ^ðwV9ÚŽ ƒ(R×¶Ìxº#¿RäuçIwž.“½A?ÏLà@ÔAÜc$¹ê{)>• û¸¢Š¡lªµ¹-×Ë9j>ÚaqQÏ©sÛ¬‚ÁÁXPPˆn,,¢;‚¡”}ÀtDÕd¢Ñß{L"ª×{¶ @º1\å¢Ru.š©ÐÎ\cL—ÕT™vx§íãi˜TUÃÜ_Ñj¥g•”ežÚQÅÑ4·+Šäm9[#¦T üïdFÉ­ý±†È¿VJà»J©±ùÏ£*Ó㪲<®*ËgP•ûÄâ«\š÷£Ñ¿†oÄ‚áTÿVlVúÕwæÓù;pájcÞI!{+}ñ}5BõGD‹H¨1T¸Ôñ>­òg£·d±Zjóf^ÏÚ—éP­_IkÜ‘…}¦ãôPzÜOŠõwû¯Á¡9êýÏÀþ? ‚SDÈî¦ÍºÌ æ‚Çz½£oÞº(b”´Z-¸SއT9ö]¥ µ endstream endobj 677 0 obj << /Length 1764 /Filter /FlateDecode >> stream xÚåYYoÛ8~÷¯ÐÓ®]Ô,/] h›4i“Ù$À>4EAË´­Z–²”Ülö×ïP¤lQ±S'En‹E‘ÃÎ7§±7õ°wÔ{qÑ{rÈ/Fq@ïbâ…Ô y„x̼‹±÷¡8 ¸/F¯ß†4ŒúE²\ȼUZäÍܙ̤(¥yÁˆ 6øxqÜ{yÑû»GàìC–£‡^²è}øˆ½1Ì{±8ò®ëU <3ï¼÷g[WOD€CŒhÀô®€x >Üš<[ E8b< T8Dœ‡F*ŽHP3ùðSžéÖÌG85ý‰¥z•ž¦ûéBL¥>«Ëá…„6[Þãe&72õä·U4$a€"L½!ŽˆÙÿ|àãþ²šª|:2‚û¯dž§ùô_Þ#óE~67ÂâØ N†cl^ΊržfciÞäB¤ÙSMÍÍ>Sš4ž;7é ÁºçÎ]]R껫> }ŒûÇ…UÒ_*ΪÇVUçg‡µC!æ.­×9Üö¢–Ý,Á—•V3Ëí%Æ4³c³ÜŽU±0£·¢sQý»´ 0¸õ‘¸å,5Siiž3`-»±g]])™¤¢’cGž„±e™–“L”¥±µ–QŠ8 ¶2;ÀšÖ;&( Q³¥ku?Fa¸¢~‰}lùa{ŠÃ¹±¨Ä±gÇ|PëÊ<Þ@Š£8"Í‚™¸1—5 Fi‹5Ò¹MçhÀ7F¡Ï,¤³ëødpõ>Dq¤]WÈá?ãÕº“µWs#â^ýß\ÿzx7sš†£î3ÝÀEë'±hÒ„,¢$š"ãÃ’"Ëd¢ÑT¸N«™š% ðW•¥ûûf€“Q¢Ã—ƒìZÒOÆÛ£8(–ÇáC¢8ø? ¿Åë@T¥ba¯û$•“ ÌÅ´ß Û “hͦ VŸ%x{‰æ@m@ý>P|&K5A¾:º4›CËÆpË`ã¸/”4“ôÀL4õܵJ«JgúetcÔÐÑEfé@ìÆ€áû85<)‘TÀdIÔûu>ºL³Ê,Óäô4XIº´çÕhnAâÿ>ðý¾åV{F{haÙÒk7¤r¬eíí®  宄*! ˆv‰rìþQ®Ü¦Å(Ð^éc[€ã! ù)œ¶}Î\åü€Žu=ëÊC6ÕãÚ„\·is°ÝÁTê,Ù€êƒOô™’™LæÖ wuÀPGßl`6 ÐÀk\ÜÝ8 g‘ö”@Ì¿»ª\7°m àº1Ð4pÝ€¨Ù4ðª)I üum±­íaàÖö0ѪíiÄWµ½>¬]Û7![“X×öð¶®í÷êàÕÆÍam¹¯=ìºÜ‡·u¹¿g&¾ZáïÝQâï=¤Æ¿¥Æ?¾d>Q—,àí¤Ï¦iNãæHÀRfÅ>-V6s|¹TÅ•–úùMžÌTQ©æ¸31N[]‚úêE’fiÕ\Ù ¢e«–•ȹÁÃuR[ Ƈf?-ß\ä‡ÈW{ny‡~àCiÌw«äø‘Pö§å¦ÐAÁ»;‡ŽGæ×.5‡7ݾq:_Ë‚(òIücdAÛt;ú)S+[>úT|‘j’ן®Òd¶Iͼjöw?Ôîýe¤[Í ›Ü«oõŽîjö )"JV×¥›¸GQtѺG—’¾ÇÝåw@ër»%÷…î»*[w6éœáüÖ5˜¦®íœ]Ìšþló,«4ËÜ$s$›\ÑDC¥£­%ðÚ¶„—eÓ–Ûß?åëXðæèôM-R=sºbG"›Ýfòñ©îUäsH†vþyhã/Wà ±6Âj­y æ <6:ØŸ‰+û«D9Û`PÚýëT§_"Ñ“s¡«~È”à¿ìrÿéô¨° endstream endobj 694 0 obj << /Length 1822 /Filter /FlateDecode >> stream xÚíY[oÛ6~ϯÐSa5+’¢.)†mMšvéÚnv†h‹€–èX,y’Ü,ûõ;© e9±¬Ø€½X"Ežûùm[W–m½ŒÎÆÄñùOïÆâù£Ó,ܬDZò2ÎÒ'jn*Á ¡6ˆŽ?]œ½¸8úãÃY¶…-Yy¶g…«£Ÿl+‚ùsËF4ð­›jÕÊr\ž‰5;úõÈÖ|6O„M—Ê].¶rø°59m%âŽK¤hòxÛCŽã)©„ƒŠÉ¯?åéîA² QÑ_ðyœ¡ÏÃ0ŠWüJÈÃúLaÄH½åMmñ`¦äŒUGL°Ïƒ­ …9¿•ád}˜0Ûý8¦öhS.³|ŒÙ¨8¤ L7Ã.r¨oMhÂuO aÆ^Mÿ•HÓ8½ׂÁ;¤ž³,i!R5z4žà ½Èãk5ñ:ÝDðõF>€³Š\}Ydúål“F¼rãDMLE!ÀXËj“3z#š/³2ß„å&…ÇúØ3)p¶ÑOc V@HϤ€ö+K(§q‘Éaöèm=Õ 0ú™Ï³œ—Y~ûLMœå" N1—jõGW_äYâ³úJƒ@¯;}=qlÛVƒiV\ÇI$ô7±âqr,© k¥rÉŠ®M=OjV=Pz·5γTQŸÇWË”E±=z±É³µàúÓì6 —yVæõÚ)âJ^-œ”…‡q—µ¼/ÁœÙ<ÑÊùh3û,çi(à­rS`N»LÅ$QLvƒ«ÚÖ,ä‚Gêí ÏONNÕ;OÛÉ7YÁãP + …~OÃd)‡ƒáU¾S}Zd¨âÆ6•uþË{µâX=~+4?\=Ö­Á"¶/qŠ’"Çw„éON·b øÀ¦îËx¡_¿Ü͘ÜoØyÚÔ¡Ú##^rs,¦5ŒºÞøDûnRdwT­'{•-”ˆ%[¸Úø2õQ@j,IìG¿ûýt7ˆ®œ6Á  è¾¡0 óArxx+˼ûL q/d†_ä)ÉÔÿÝÛ,¥Ôa•E÷-¥*¿wˆ¬1 FÀ\Ž‹|‡~‹zZý*Ý·¯ÖÔ%ç¦;ùÓ›<.kgoÜg—Óõ­B^…þ=öXŽ—"¼>•%ÀJyÿ2ÝÑp -›·RÜN0ã³­¾åI¶‚ƤÉq*ƒxà@Œ)bž%ïõ´#—¹¦£…< 7 /E’‡- IävδɲyÉãThOøRÛ–ËDsÓ[&C¦øÁ½LRÝ $ K±ÖB¶C¨Y"ïP_TUHíŒv¢7Ø;Ú}aÇßn°LPÚëSë¦G$ ÔýÔ4VÙºøÖØöU¶¨BtŸŽáÞ>¦c “’´ÆþÚàK‚ž¿¯˜ÜŽÑPnRiHWÐr×·NEÝUƉ.µsQ+òxÍs¾ÒA ÅÐÛ³M¹Þ”uõ´I"jwVN™é û•s&”Ô™ WÕæ€H*⿆ Z€Àqö¤(ËW»n¸ }Úlo/ì Wż£ fóÏ ˜a ÝlÅkgXŠdm–ªºQT/2Nšæo§<¿íÆqqWàõ*dÿY£ï¯3\tQy» : ¥ãðb倴Y¬ Q‡³«î†dwt;|éè{û_:f Ù,€¿¡€Q{Ÿz¿ç¶jìSé¨ñ~2bÁ7Iyj¤ä^£ôÿÓcКº{ÿ¥·ý—#p˜tþšÂU>¢íÅäî?׺cÚÛ"¡¯ ÎlP¡)õ7ì91; endstream endobj 714 0 obj << /Length 1784 /Filter /FlateDecode >> stream xÚíYYsÛ6~÷¯`^:TÆBqòp¦3Íå4·k{Ú‡80 Y¬(Ò%©xÜ_ßÅA‰¤)G®“Lfš Çb±»ØýXbïÂÃÞ‹½'§{?²À‹QÐÀ;y!õB!3ï4õ>ø‡Š}yþòýdJÃÈV&«¥*Ùde±oÇŽU®d­l#‚Øäã髽ç§{ïØ{IJå(Ä¡—,÷>|Ä^ ã¯<ŒXyW†jéñ ‚ÿÜ;Ùû};·ýÑyWtÂBÄ…ðB‚f¡•ÿhB@þJ.U£ªÚ6䈻l@{æMIˆbF-“3JEoé`gXÄ0aˆËÙ¬V&0¦…”µdÀ3“ ìgE³o[u#«&+.lﲬ3mæ–Êþ7såˆUbf»rySƉ©ŸýñÚ`êzD~`ɘ¸)Ƶ­r6q®dª*Û¶Œ'Dø×™Á0æ÷9m®/Õ˜ÅDcrSbC>.q*é†ÊÖðµªÛ>çê cZ¨zxÙ?꾓!²`D¦= ^7_Ø@$1P-ü”€'\À™F(vžÈ%£N|—}€g&^[r&ϳ]f¹lVu¶”­Y{¢¡% ÛEoËt•«{‹¥÷ (©s„IêÃ`´QÝ×Þ‡©ÀØYì„ `C ¶‚-žêøÿ¦ŠÂÆ2tÞ#ûRV ü©°½Ÿ& eì?¯²…x]¬R˜=€^$ü§´&z`fVºÆáªH¥àÜ«ZÉ*™›EÜ«Ö3'MµJšUe\;Ñ,´ÂåÊ1|–·¤~¤Õp‘5µGaU<ÎêÒyù;ƒüf轑çe%›²º~d+Ÿ-êsmÖÈ¿ø¤÷RÙYÇŽîÙë)ÇÛÎqY/²†¼ØOëGö€l‚})ÛKÌk—‰.»4fÛz¿å’ä«t}sè¦Ý¬˜•_*#ìÅ8&$ú R±ÜžŒ@*ï’ŒnÄ ˆ‘Ó„#b×?ž—j È…ro-˜ æúϹXƒùm®AqŒ8_GB ø„ÅÂ"¾iõ Fxó@7ú†Ú þÔ@ù”D ¸³õBÂe„˜Yï‹éd=ºÉvÖÁ¿žÚÀ¿žØÀ¿ÝŽþšÐßñoÁß0wàoÆNR—Zm&˜[û£ÚåÎñl0<ÜÖW»ÉáNë\n \£Áú&ßwÎc¢ˆî‚«ÑWÇîßîÄPµÑ=É „Y(vÇVLQFýãù:Øj~­é7Í⹃³îÀkýPMFNžd£þIU²-EwI‹çú¹¼š…Hd;ßùu£’2s*ÀGŽ·§Å­h7èôÑ®¢? t»ØÝn ~OE;ˆ~7º#‰ÿîèAÁÝn ðè³D¾O%s•,žéßMqCa|'#éJá/ïÊbôÞ'ºåÉ[”ëI ÷w¸& à£ÒOÅ‘C3Üéb93eڑǺ~IE;»üÌTË€Õ6ÕFw¾XF"|Pnjô{‚†Äo&Ä/m³²/fh½{«í Ø\ê¿7šê·› mm(L¥7lëµ0 «¸¦pƒ›å4ì,/KP) ¥Âÿ¤dÑXÒ¹ªÔ  iG*'¼‘àíxe>?\×c¯›5måÈlš,Õw KIÔwŽ«*kÔ¹vXkl|¤«‚ÖïQYˆá dƒÊû•…-¥œí¥…à–ÒÂÐ7%P$¤í742öZÀÜ+Ô4mU7à~ªdnk 0z•5sÛ:}yxh[ÖÙ‘vKì¿,Ürã]Iã¸]UòÒ5O'LøÙL{ë¬ÝwV•KÛúcBhì#»õãj)‹´´3'e~Žo;Úo¤NÖë³\ÚJ§ÇIptý6‘Æ! /«N+Xž÷ýÞ…÷¹LýO,G/ßô¬:üt(À‚¿Ž~Ôäâ΃™Š•Ç`Œ‰u2{:——¶ÜFà|“i@éðóç‘þf =¸ZG81óUk ý¿P Þ endstream endobj 629 0 obj << /Type /ObjStm /N 100 /First 874 /Length 1443 /Filter /FlateDecode >> stream xÚÅYËn[7Ý߯à²í‚—3œáp#@p[ ‚$‹¶Fi"A©° ýûž¹±X–AɉÓçR‡ä<j\SI%UG£É¢i‰(ZK¤h 'òžZ¥T)Úš„*ZI¢Ñj¯S«-ioKjŒXŠs(ZÁJ-%«Ñr²ÀIM=p"©/8MÝyjÒ’cÍ&–Ü¢í‰ …à‚AåÀVôP€Fðò´Æ´P•TûÔT5ô`Â#0’ºA=˜K^Zj ½.!P'.á˜Ë¥EOML X ˆLK™:fnÀ0|Û€cn!XâZBè$€k‡bX˜ ¡7K U1\Kô`xcø~b gí5Ĭ bÍ:ÂjbÒÊ&#ˆ•…Ö CáÂZ)zê!0·©uŒ’¡ÆObñfÖ¬àÈû«z˜'âÜ: íT©F ` °cÂnmjŽÕÝ¡*€„Á„ŽLa[â¤FaR©ƒv!ÓD8‡'EŠOV ñÉ`¤hNpXÈÉð¨$¥-`,a–°Œ%:wX¢#‘âè6¨ÛdT’ÒÊg GCФ‘2ÀBÖª–è*ñS=zzÒ¨&Cýhä…1&„RÓÑÑ4?I'­DÁ=Kóo¿ÿ‘vœ‘#ë÷ïÞ½œ<¸Ö$êqˆ«’ jkˆ+’ u6ÂYË•ä:ìx³>OGGi>F"0|° 8–HÕvñ$Žð^ü‚Œo—0ä^-—°¥^|ùÀäóÓÓÍëç«ót’æ§OŽÓübõá<]­ûâßVøáÕ_«i~ Vëó3<Çði~¶:Û¼?}½:[8`éúuõæí«G›é$:‚ŠÌù%–yuŠ±à·¾à>³<ðÉz°”Zîm‡7¯á8ò:;ë×¢cc\m™ö˜®´Ì{¨§Ö3ªmŒ“–Qcõ5‰{ë'²"†8)Ùeì>)žKÛ[2Èj³š¬4ÄIÍ,{à e)c÷±Á-46—…rpàG^s/}¯b>¼~¯À]‹YíF1#Ï)æùáz½ÁT'ËÆºÄ¾ÿ±•¥ÝRaÁOóó÷ž/ß¿¼]ÿ=Í6§oV§ËRååüÓüóüø„–Pî5¬"Öüñ0‚š†ÞØ+rS’â»9p¿>Oó››„ˆ|w†‘o7ë²|.úªzà‘ã¤u©‡T|+}s=ØeáÌK=*všnr€‘ºÚö#âk8^vÛ¦-{šq ÖÜUöÛ8ŠòkCœb§·ªcckÞc]QÎc+¤X¦][ή6ya\3õ±Œ±ëØnš«ŒÕãªYÆ>æ¢Ymœ'd–MhŒÍæípʼo'Ó»R¦Ý¤L»3eÚeÚeÚ½P¦ö‚ —+ŠP/7ªoO™ ¦¸Õ\Q&InåÛS7î Ø˜éJe£¦C)Óö¤LÛƒ2m›âJmC®>¹í¢¸m9ÊjŒÃÍp7‹lápoÌeùª!ñÚ8Žƒµ qÜ-3aÈ«ÒêG—<›‹ëfާ„!N<ÃF8ÏÇûÃáÃωí:å}e–s¹ÁrÎwe9/ÙÍé>ØMP½„³&·)°[Áw°·rG1”RùŠW÷±Zû¼âu?^ñ:æ•- bâ—!NAä4ÆiÝ]Û8œbd×{ '­díc\EÈm×+Î6¼§Ý†¸¸ùí3+øÑÇú1ìuÏGÞ@ãùâ5ŠÆf€{r¼ípÞqýÿâCÖ­—Ô/¿—Ý £»ÒO<1†.ñÂx/ôÓóòØ|E?ø6ÿè§jÏå—7ÁÖãùæ0ú1Ú~®ã–?r±:Æ® qŠÛ ïxdÙÆI<ñùGrãÔ³ïx»»Âmõ³Òý°çÛ endstream endobj 734 0 obj << /Length 1849 /Filter /FlateDecode >> stream xÚåY[oÛ6~ϯÐÓ w5Ë‹¨K‹b½¤îÒûœ+Ðcщ[ò()mþýEÊ’l9U².°—D¢Ïå;7;gv^<;9x0a¾¡È§¾s²p˜"îs'ðBäEÌ9‰OîdD±+NÞÆ4ÝÃl^®dZˆ"ÉÒûfm*—RäÒ¼`D}9yuðâäà¯ga‡8¶ pàÌWŸ¾`'†õWF, oÕÊñüþ/ãƒ?°•só#ê3½Ë'Ž‚;‹ÓF3BPÄ9Õªéã F˜F+Q†H%æíÏq>9ÆîÓÃnYœgjD¸›?ìå E-Sy,tÆÔfÜÈô™RÞÙkùÿ.Ó4IÏÀ¼ðò™ÿÇ™’i.SóöËhL¢È}¡’ ³ð:-cøúÞBî>‡Ie¾,2û0)ÓXT®\š…©Ì¥Póój“羕›/Ç…*çE©dnÞ{ìD+œ•–áaÜr€EþH«áˆüÈ/§Ižiœp쾫TooÄi¦D‘©«Gfa¢d,AüT›5tÏ.õYò«ùÊ¢ÈÒ¾{có2Íò‹dKûM®D²|¨¹  c'J €â‹®Çµ¨Š»Þ¯>3NÔgæ{+«ÉëD.F”» ©ÀtŒ`÷E©²µ©ù~|•ÎÏUV¨Ì.LEœTÚ[Uµfbž,“¢Öþ%87;]Ú>cŽ'J¤s OhAT  ¶Èo’¹Æ„âå‡7—ì׎ &^;Þ±ÝNÍöùR书²°EF)ò€ßP-Äi’¡"Y$+q&‘¡÷i‹>Œ¯ÃÄÐi²Ù$YÊÙa¢ä\û¸çB"¤cÕîÒ**´¨8Š‚°¦IÒ¼Pße©4Äã! xTSßïaç¡($5A¶Ð8[ä²x<&=2mqÖlÙ¶s8¸€¢0àÿ¾Ùõ Ò¤IÛ6ŽP#ÈéW0ÓóŽ…ÇyÇyeºó‹>±9 !ÃÜ®=&eaÌîʤ{`;& Ô÷ƒ.øï½3È™ýæÎ Ø:¨i 1‚P={Œ{Œ­kŽ_ËjV\­e/?Nn¤û!¿yV¦E/#ÆPèÝ ¸Pˆý0® Û£ž;uå_ˆ+ +ù½Pb^ÌböÝå0r/ÊårÖ°? N½Ñ•[gO © #úOL ïQº.‹>fÚ7á*nx|’,³s) ™èáís(ÞMÜ·×sÐOR>¼<"ÂŒ»Öå¤éà.ª{MÙå…”Üe÷„±À=Ëû’!EŒúƒsν{ßâ¼ß’aw•øþ¾*ÃÅ¡ž@@Ú7ÃÂöâ´òÑ>£WÙ›Çk…Ûíªr•›®1±íåÉÑÄ<@ç¿…yþS‰µ¥;1î&¦ƒ…)ïšôˆ»« ªú!º‘Û)Œ!{êŸ÷ÃzµiÕø¬Zý`G0Ž¡lEƒ]‚ç½­ùE›m]MR¼ž¤v,ˆ®¯0¤*ÂC~SI!‡`õÇÅ¥1e—“6åpÕYˆh´•›Þ›L©$6ãnq^ (¾»ÐG_£OE²’0džJ¤±Y\«Lóºl8 C‘'«õÒîØNÌ“ „Š â¬F°c0ä÷áZ(±2t•òzø¡Ä­ìPmîCL¸«]ÏV˜ÖsV‘™ÿ¹ÐwF_û¥&ßÈÒP?)„iº,*j)À$¶XTë5XÊ4™gqk²3ü¦‚P<ï"Ì}‡ö²OM›äCöå•+#º¹óðþáG…æÖ1ÐIàh+}ÏãVIèŠEˆ^´Ião³¸\Êa=?‡ù0 ª¤çÕ^|:âöæ%·ïŸÎa2EÔ½oV^O'×ÁŸxѦ֘[„¯Re+‰.šYÿ‰ÌÕ-”Çí¦N`<>LV5^„²ß¾icϦáy–"I7xIËÕZ‡ÕU½[‰«|È4‹vªvÙÞz¿i‘ºÎÝ­÷7Éûº¥Þ7»Ã¬¢od†–{Óàí½f”/$éuEÚ6ì Ϥª!öµyÿµþaªKz7ã†ÁOGMÞÛÀWOÅæ©ŽÚ=Æÿ¶‰ø ™›0<¿•ºù¤îy¶Z+™ë;ÜÞì Ê3Ý&{‡úfäN’7‹`å7LÞvS™æZÖüð/“S%ÔU²nΤëÔÆQ,w¿-Ï2ècÎW[m䥖M¨$+wò|¸ÿÖvÇs}Iœàñ(h®vVëgW…|Æ-fºÒô_É2ăMÇ{nI@Þ€ Oš”DU²ì ]Ï­†Ö†MâÉeQ š ÛÄUÐá´ý þÔü Ûî/€ÀúBZcœhˆXs×±§íkµ>DývÓ¥1ô°ËضB«€y endstream endobj 751 0 obj << /Length 1255 /Filter /FlateDecode >> stream xÚí™]o›H†ïý+Ø;Ìd¾˜J½h“íª]µÉf}³J¢ŠØcÅpSç×ïa0Ûù²¢¨òÃ0s8sÎ{ÀÖÄÂÖ_½ƒÞÑ'&¬‚ k0¶$µ$÷˜5Yö'‡b;¼þ|ê¸TúöI2\ÎUœ‡y”Ä}Ýw®f*Ì”>Áˆ æ\ ¾ôþô~ôÜ[D›åHbi 罋+l ÿ‹… |ë¶5·¸ðá8³þíýÓÕ‹¸é*oºJˆ|Ê-I0ÂLjÏU¾LâÙqVza¦Ã2ƒÆ\ Â\)'eyÅ“£ëU®2X†‡íÛ(ŸêÖ0™/R•ej¤ÏGa–-W„…å‰Fµ!˜Ÿ;. °ý^âå|ál¯áÙ(LÓpu‰=|û¤Oû„ʾiùU‹Q)d£mú)á&¸ìvø „}ÂpeEÏïöûM[k+WàéÄŒû˜¹”£¨W\éc^G 2AQ ÂÄÑ'A›™Ây4á.FŸÿ­¶nÁ ò×i)"¥y²1ÈC¬m™tt ‹’ð†!²K .ÉS’K ¯®k{ÕJ¡»Š´ëÕƒôÍy*hL¢B?‹A*®‹îÔ«ÔßH ?‚–OÇc•®ò)ˆpC †<é=¥!´“vÅ‘Nj¨@’fhƒ-xú´¶Ñxÿ-‰Õ&LP$‚`kuoÓ<Ÿ‘¤Àq8[Ý×,tˆ_®ÃÔ»®ói˜vÅÆU=ÌT<1f‚ú5T‹¢Èßí-eqLÌzh_OæÕÑPÅ_c(3õ¶.«§ Ã… â>ðŽ2€ÈƒìØæ·DÒÐ ' ÃÛUܰý-7¢µ^ª8ß× #H0rIº~u;U…ìaÏ\÷Ô,Ú¶·\Ñåø¥þWÛñ¼°·òÚóÚ·r^K(õ¥d™× ílÌØYO>Çyö G=(`´ŸÏâ(9q úçRTdO|*ž@«Mxjï{wàÉß#žÈ#ñ$Ÿ' PãílàDtjèá·¥{e:í N‹7¼yÚä j}ØýVDá­( ^õV$v"é‘8*r» IÅuƒ¥µ¶hÿi¸Ù Ýý¼J¶Cà<8MU½˜8·*ü©Þævhpø€C!T~û3ÌovÎáýkïÀyá÷¡»hA7½ÚHäSòʴ̵)óðgZÁe²Í‡eV×BÄpºŒoÚI^“\f÷{].Y›˜M’ Rfœ&Uë¬ÞïÕ>vÅyQñè?q ©ôÂxùCŒAójAOÃE^~[”¾Í‘ã J»¿Ï§Ã¢ó&,Ø &ñ:Þÿ„' endstream endobj 763 0 obj << /Length 1672 /Filter /FlateDecode >> stream xÚíY[“Ó6~ϯðc2C„éC»[˜ÂP¶Û¼´À0NâìºÄvð…%üúY²c{MÂ¥3ûdG>::—ï}R°wåaïÙè—ÙèñS&=´¤Ò›­<&}$¤ð÷×Ì›-½×ã§ŠÇÁü·W“)Uþø<]”q˜A¥É#;v®Ã íŒb“·³ç£_g£#kaxŠ‚ZŽVÞ"½~‹½%Œ?÷0bÚ÷n*©ØãÒ‡çÚûsôÇ;;qÛ^î·ì5: F˜)kê*˜G)Z¤ñ& óìCÆŽÇO%mM"X!¡¨¬æ,ÃųÏÑÆ v´s‚|Îj¹7X`+$TKH ­]y‘M˜‡A< ŽJ¤¸n©#Ujï º%=%B!*4¼¤…°³ÎÃÚ9ˆµ€´ØÇâºLÞÛ×teŸË pË‚RHú m)ìúÛQx]T3·ê¢ëeºŒÞ`LÃ¥Mæ|[„ ª ã«<,ºÖÐ(ózVä@óêÓ*ÍÜØyddÁ´ 'W€Ÿ¶™ý'8ÙîOŒ%=à\L3 â°9¬­ŸL…°ÖN u£Tô1Û^ú¡lДíC‰†49•Ò: mJÐUÊ"…Þ%MMfÉíM¿jo &ëxB@ä*t¡ö]v¢¢ë®7ePDwãs²gD¸Æ8tYúÍ]#r¯oœ"qOÏýï<ƒµ‡=ë=•Z\/‡—aQV- Éïªj¦ÙmXIoLml'RŒQ² ²,ØÞÙ—}è‡Ru ã ûòÅÙ‹&Åò¥8¢)ûûvÔn½uvÔƒMtÅd_?æ Éä1ªèýT5ˆKMŽ>†4^–Þ\DŸöéUQ®Ž6TÍ&e{÷ äÑ{ð4äcz÷žqvvÁX¼?~³xùó%ãâ;í Þë©ÀU…Oˆ¿[P À‚÷µ….-2þߦ<²WZFÝ·ªjg†Àù‡2Èܦ]}ÈêE:“­¢ŸýEö½<¥èïÏÄÈÿˆ‰A]k˜Ø{`bLì«3±¿×Ñü¿Ü_÷rã³ñø¨Ë£/)î‘‚0YFA’¯ö ”êâáƒòãRt÷‹ –I/Ý‹;Ö²¦ÑfR¾Í‹0þ.×7ñRäeüUŽ óu:r°Pv<*!´z@'´YÚ¼&g{'†A}[6ÿ'\¡îˆ,ƒ•ÌÜyJâeðáÖàå3{)K8b¢×8ó‘vHä0ex¿>aPßZ¢Ž› ®ó™À1¢ÞÍûvè!Š4 8Ky‹÷¬¤=APðD9WΠ9v(5‹A9Ç•:4™2ìg×Qn‡ë窢;œº”T̵´ ãM±µÃ>›tS®ƒ¢âEð5MÖî£Û&`,XÇ2Ns§`än¡â:KË«Z*cÁÎmœ–µ!eR1©¼‚W%577æeaBaè )ˆâJ©Û†Âúætgcg‹ÓšÐç©á„y-vrE$9ÌK3§·»^Iàậó<\¶IÒ@à ¿«šðíšS FN)Þ(Ù °BAÏñ¼<-‹A-pð0¾Ç§ûÛ§{Z4fõþ…© füK+PÃ<+pƒœq¯,ì @? ;n²=¥Z˜k„ºÓg~Ó<Š7ëÈ€ÅJšŸaóÇM£©·NSD0ètóñ“aõv’õÈódÝð±,7¶š-·¶Þ×Ñ{˜߱ÅÜÚ>à—»6hsû¼A£L&ðO !V#†cL¬wâÍÁ¨__U¡s Æ_º»}a•¼3ÔðÏd ™ÓâAvFù ÕUÞ:ù롱O¶ê¶)õw åu,ƒè3$}ùCµ~´–½^ÁáØ×âø„ÂñI*=D^&SNh½Põ>Ðv8!U‚Í窺ÌK]Êæ½.e#X©ßu„©d¼×Œðn"mõók¨˜q§~ ÃX'LŠ—Ñ¢¨Â`+hÚ@MÎìÄü´ÞÐÿ[Úuôÿ×·ÿ_@1 i‘¸!ü;b‚¤b» Ø„ôˆ´n 9f¢ïÒ¿ óú¡ endstream endobj 777 0 obj << /Length 2343 /Filter /FlateDecode >> stream xÚåÛvÛ6òÝ_¡§Ô!¸ñ–SïY'¶ÛÜìÖVvšž†’ ‹µD¨$µŽþ~P"ȦºÍÙ‡}A`03˜;†¢½»íýpòjtòâR„½„$!{£Y/â½HÆD&¢7šö~é_8í§ã7׃!âþ¹ž¬—*¯Ò*Óùsœ»Q •– _(aD ~½=¹üq€ í1D+ID£Þdyò˯´7…ù·=JD÷,Ô²'Þ‹ÞíÉÏ'Ô±¸}RÂCav…¬WÀÂW“7»C1I„ y}*)#<•$<²Lþy*/.uƒ„M‡Å?KÇ™&Ó´¹™}v’˜„‘¨?èéz¡¼ì¼¸”Må ™$.†#’çJi>Å}oµSÀ¿Šìn^=wj¸½¹Ü“|[ù\’ü§…s²HËMLÆM5q"Yè1G‚À`‡ Ÿg$¬žèÅz™Ï24É=¼AB¢(¨A?Ñ€"P5HÅ5 PMO¯tî°µŒID†[§yîAGŽ·Æ‡«Ey[`è>‰m{ÎâIlRðÎØf9X|W[jœ0*Rc¹ØP1I8k[ù+±àßvá46‘(œDÆ!©ýI¤ÚV‘æ³ ;6Šz”-»»e}¯u>)TåÜa6`&U8Lvjkž ¤-ÓÛs‘B¥SŸ5 ’°cŒÎjãTnbpÜ]©… )–’X&{8ŒHxvþÍ\¹¥×}Ö!“$q¡F]=9ê,׎ÿ¥~Ì:ǘ¿Ö9I¤<äÇ8§ÿ®&•ç4'<ƒ)„íåÒä!k·³Ó˜”a`´gª8³n³¬YD…Ho_Á«4ËKJq’Oñ™¯—+¾q«E‘nöHÜ›u¥V¶ô¨iBv¡Àäg檥Ë"++Ǩ±@g8avÔY´!?§n+|Œ1Èõ¶Þ©qØdXC “ÔÜì6zÀƒþƒ›†"dRÏÌÖ‹Íÿ*v´æ–~ó¶o}Œ«tÏ¢GƒØ*ÔÈpìr6tQˆE‘M§uÉ9Þl³L+©gŸ(å÷¾[VíÌqLiÞ.·‡2$1‡ªQ˜¼º½Äßþ0Êf3ÿ€Áu„ïuÌ@rHò¬}8&y SÞìÁ mkˆMæ[Há q“:Œvê@R6wš »M/õô {È„tÏCéĘè\ýÌÝUóSN=HÄ„AÜ9ƒ@Ö¿éuµZW§—ƒÜoQú\/¦$L¢îÉ$„DÐõÂ?•LE²fVqþq§ªsá „ qŒöó7ËÔý;›|eHøˆÊý»ïî|gf„ Ö¡kŸQA¶—TáøÀôOo2";ew è¾ãï+«qüÎŒÇj®ÈÏ÷%\ßγô®‹Lù"ÜäQ™iz(@Dhx¼è#Èaüõò™þ¿³¼ã]­—cU\Ϭ&½º£Œ„¬i1ô¢¸·%ó‡"«Ô!ƒ·wþ£Â}Ö”:õ‹=]”o2°‡ƒ!_t¿-”zV=¤Å@DýƒY$dÍ4ø$J¨rÖW ÙÓ–ñ_Ô6<– O¶_Ü$ߢ¸Ùk˜Šw¼©TYÁhé­r¢°]·ÐSå|u¿ôÆ…épÂq"wž T×îuÙ${¨V¢m×úºQúÖ¶[Ý8ËjHÉÎUlׯsãrï¬qKrˆ·å×>=ù ?Æ!€óm@ñ)¶]»ÆÑÑ Ç× â  1áÛ$¥gFþ³Rù®Æ„egL_|‘„H.º"Ø@ »"È­€W+_A •‹º"2—ìj³R§Ï²¼zæ»3Æ„%OJf!³»\MOŸå>\ÏD𨆜öÛWÄò!]Àa+æ²sumN Åõé÷f€þñÙ´&6ƒ è“5ˆ€…ÏþîË™&ç$G4oBH,qØBö‹ãvâø¡Â"Þ·ý³^³·0¾ìðë•Í6wîø)çz½h7\ÜÃp%(ëâ\cø•FvØ”§ä:¥…ËJœ¯ænãJ—™‰g8mˆáW†RÛaz˜«Âíq›y•}ÁV ÎckÙ,”UZ8Š[W² §nÒQ[wô^\cmÜÚ—¯í4±•!*IF ‘ '¬Èá :­ê—€JtDÍìjåÚVÛmQª×¶WzWÔÚ…Îù?‹å¦‰²XlšK)vàaöóæÙsLJù’»vü}_´ƒJãjUlš¡©Cݾtr’¨K›‚ÕB/qÔ™ãh×Ì™7§CO ‡bÖ!iÝ0ªjHËkî62ÂF$$r‡_ç…óÔåÚGøSE6AX£ê’Ô`ÿx¥íS¦+#½$iÊ:N@iøÌu…ƒ±qæ ~'mX%à rûjän³ÓµÀð†/Y=i$mÉíz°5p/¶¼,chÜãÎsî¥.\\Íf_÷ò¬‘7›¦z2Y…r Õ/{ V×íKk”x4¼Î¼N³íG\χӑÉú×ç×ûÒ•K¦ÝŠ|æuÿÖ ¼Û} Ö³ ‚ÀRV>Ü?½¿8»½p…ÖÅÙ€‰ ÿO÷>úÑ nG7gW?¸—7W£ ¨Ù" õ$èûµ›>{}å†C8rÏ[|~¼½¸üøÞ}|¾¾Ù£ñêÆ`ûøîâf ñØ;µòÔþß*(öÃÎÿªðþáCr˜«‘Eh¥$L“q—è_ÏÓ•ýÎoþâ!¡9ßÿkÈO¯3yï®ÃúÖÝäþ?–ÊtB endstream endobj 793 0 obj << /Length 306 /Filter /FlateDecode >> stream xÚRËNA¼ÏWôqæ°ítÏûÈcQˆ!*/ÈÁ°ˆ&‚Qúùβ˜ÀŒpêÉtUWõCÃ4\ ½ï‚rÔ@itÆÃr#æ uþŸ€Æ”<|íP°>æø 3q+ú•¸exÂäÙCõ6FGà#iU s9¸êÝTåZT“œ,ë¹Á“Gv 6˜ˆZøh|_6XQVÇî¼ Œ=Õ[ 1P#ÇÁ¡¼&´voo<ŽåL¢ìM‡í£RIË^ÿ:'/¿ãÊÓA¿EÞBÑX‹¶-øÀì:$H­O9±¯i¹Ú¾lë•b-¿ÿTk™L†ÏÛ¼Õ§ ™3„>WʹTääó­»Ug‘}è.Õ¤øÏ“s11ƒÍGû¡˜Ð•üWW¤- endstream endobj 797 0 obj << /Length 217 /Filter /FlateDecode >> stream xÚ?O1 Å÷| ‰ÄÇIóg…¶¨]­êÞ¨tw¥í!¾>ЉÉö³õü~/€pÇn"»^j AKâ38g¼4ACì`ׂ§Ýê^4ä<ŸÚ÷!Sšö‡ñªj¹Ïéœë€RI-¶qÍ‘™*oTµ5Ò¡ƒv`›-BWô5 ÔÁÃÇ÷ÕÆúR{xb "^ê/¯™‘dÿmõ'¥!©UHíE£• Äo_ÓÛ”O•e&Ec‰øjìöm>W1]m¦´ y__¸—œûR@O‰ endstream endobj 830 0 obj << /Length 667 /Filter /FlateDecode >> stream xÚ͘]o›0†ïù¾L¥Åõ±±o·|´ÕÖt“:UUDtVB’Y×?'°®ih$–r9ø}r|>lz@ òêþÞwÎL êbéI@~Œ(SfL‘àáÈÑ]çæ»1º>ëRéu>zß>ö‹ñåu¯{vï_=Ïx>‹™+èfº.¹¯«æ‚óÅ›wή‡V‚Š%1¶C•ÁD/ñx¬: s¦^˜{ O˜·¶æï L‰‡fÒ5W×üœª7¿ t×¥œt€¿‚ß!ê–]¬8 „ÙT'ÁCTE¦°îdšÉ ²‰^éSÀÔ¡p´î¯H]ºžE)R  sNdÍ€¥H- e÷±¶î›NâÚ¨;F>ì!Ûɱ¶LVi”ez¹°æ6ÖÞmËů(Í£4«€S ek.$¥FZä—£ *Á±äìP*ÑHUjTQ%Ìnœµ­»QŸ&ØöZ‡v”ƒÿ1ñmë¹µèÙ2úc=Æ™©·Qf­l€×¶lÄ:§ad3ËÍJµmV[ÀÌ^³ùEy-§Ì·ÌYŠTpûudÒl‰² VjTdÆ…¾Ñ¬&-#-3c6 ­º=`õ…. Rær»¤=p )kè¦õž;´¥[®¢ÅižF·=»á-7–+=òuV¿¢s%¥Ûwž)D*ü¶Z$výF[¦é¦'Lžò(ËÍ(±Ö»öì0z—¯ã¸rç+Kv¹J ¬\ǧ¹ ¿3Ë a÷tUwïûÎOg³:’qS!Ñ4qîî Íã«€òÐãÖ(A®0’h޾:ŸŸ¿7ýcçÔÊRäR @‹Àvû¹‘üÚï<· endstream endobj 729 0 obj << /Type /ObjStm /N 100 /First 879 /Length 1690 /Filter /FlateDecode >> stream xÚµYMo7 ½ï¯Ð±íA+~H¤€ @>à¶@ MmÒdQ ¼…ãé¿ïãx²ñÚN41Ƈ…¸;OEROä¬1¥’Œ9i ’¬cÐDcMTcl‰zŒ–XbôÄÀ‘Q’À'©}c"Ic¾”Ô c$|ŸšÜcKb´Ôk™žõ#tL2Ø@ÅB X@ecÊ[€!‡r•DÌ!ÀJnaÌ”¿„ !À`ñx„N`ƒÐÂ(¬Å7¥Ô°«øeÚy…fk!@³— Ð5(tzúv¸'.n‚lŽ_67NŒgB¯*<(!4|ªœªXÙ°%ÖŽà*a‹@0ÝÎ-ü"®Ô¼ÆnëŽq­çÈÍ!®Rvœ!N$;‚1ÄQË>áÈ4—2¶”2!ƒp'û³‹ôàAÚž€v˜fœ€‡ïò ˆ‡A`—_ˆòIñ‰â4¶Os™R.ç@ùöÙùþõóÝE:MÛgOOÒöÅîãE:¬ûâ¿wxðêïÝfû6ìÎ.Þ§8™˜¾Ùþ¶{¿ÿpþz÷~b¢é§_woÞ¾z¼ÿ˜NKŠ,›ÆK,óêsA]~‰{tv¶‡ªÓ‰_Öàׯ-=á6Ûçþº˜¾ÿòöìŸÍöñþüÍî|Z¢¼Üþ´ýyû䔦/aÔk솸æ‚ôÖF¹Ó¸g‰SgøîܣɟÏÓöÇý‹}B$¾{™o÷g?dý>\³ª\[&âƒ[&Öo°#RE®¦ ç œ)%Ç)e\†˜&–ãöâJËq p œÜ»ŒqÕs+ ôiÉd ô1gÖ!L;gÇ8Ä©f¥±[”4×ë BÖŒ†8ö–eÁvY<׺²] GÞXB>G|sÄDG|sÄD+O¥ä£ý›ÈçÊökYv Žp8ÞsWãX3uââ¨Ò§ˆ¶{âPÈf”9C‚™ÆúwÜØ:¤,_?*ß|qÝkî4¹‘;îš;—åÎ9Ñkî\‡¸jÁ:ÆQÉ –•N¹´>Ƶ[ÊÛpB™oã÷k¸‰Èúx»Ì"ó!]Rv¬´gg[–KrîË„w×l4»‘è&îXF™ÞGùÔ@û®œÑh€ÐZ.Æ_/[б]/\¬-;+G¸/.×0M‘`Lc\)·'Ø5\uœ'·1ŽKަo„S«è#tŒ nïcûÐ@æ:6OºdÜæcÌã2ÞF.|\ÇI\=mŒCVú8lQ0£ˆã©uáy?nŽ–]E+Ü>ýæíÓï|ûô…·O篟¨%ÅÝ{¿Éu½Þyï ØäÖ}ÝÑz¿ìQ¯Zï심w‘ëLÝ/Ýïw.GšGžG™GÇ:mm}g}4ë£YÍúæL7:—ã¬f}³oœf}sØg}<ëãYÏúxÖdz>žõ±­zÕ>5LU£3±xO‹r§¡dFÃU¼¬ØÈ·š Ü‚9X \¼~SÜŒê_³#kn+òiaÜ?‚z‘ZÃ0Üo]†ØŠ† ­b©ϸÐb¢VèQ¢£—‘G|}hoYqš) 7ùÈ#}ECæ\UW´sí«Úáx¶!TîÁ%ƈÉg—¨s¶¯×o°„ëš–Ì>h%Þö’KŽWêj%ƒyF†¬yn”rüI£ŠôŒYªäø³AÑ{ãöYb÷&Ò&×\¤ñ&y˜&t–0(ê3·ªàXÔ‘Kˆï!Kˆ§îî&¨{o£à܃!è¼^1UwQ"ëŸ`qŸþ†øt‚¥÷\|ä]ŸæÅ“#=¹¨dj‡.9ëÿ`Fl| endstream endobj 837 0 obj << /Length 212 /Filter /FlateDecode >> stream xÚKOÃ0„ïþsL$XÖØñAQ+!^¾U=„Æ-Hy‘ ø÷˜¸= qà4ÚÑîì|Œ=7â2ˆ‹…¶ðä­²;8gj2^#´X‹RqÑgÌS¿„û ßlM— endstream endobj 901 0 obj << /Length 1292 /Filter /FlateDecode >> stream xÚÕšÝs£6ÀßýWèÑž©9}‰óÑ\zI›úáîÒ’£1ØÜ›ô¯¯„lÀŠ 8Æ ÷ 4ZôÛÕJ»’ Á#€à²µçé¸÷á‚p€©aZ&ã@950À3lpb±îûW7gçŸ߯sÉ&ˆ„r,ņį™Üв %w"eD6•sÙ‚¡3mÕÂñ¼¿ ƒâ †˜Á¾|{ Øw¦ÁÜÈKAè<úÚ«ýôû\~ý¢ - bRñŸZÄùEåÝeÜg@lC³ 6ckÂÄ-u'ùÜ™“$ê5ˆÔ³@ÎÛ€„Q5ÒbáGÞEì„~•ñ|aˆ3ÃÅ–Œ†y¥;`L BL|ZëS' ÜI;Q2sÒ’Z„"¢é5—OòÅ•Whï²/@lÃbhÓl‡+M6‡e¸Ñ _ézu3 ¬r7à¬ÿeòéäîúünÛð¸Ó|xFWª…“¦q0`Ø_¦9­t i9ñó>^]’8 WbþvrsÝ5S-{έÖÀxØ$O¢e¸TÏ18ÜsªH$ˆ‡;'MKº4™9‚p/ç|!Ø"ªnvÝ‚{ï9õݹçwÔg›Ñe‘íMÁN¿â‹`Öt4óÒ2 fÉ!©‡Ù Šb›*ÈQmu™; CUVP»$´“T»©ë,’_}Çóãn:jpºD!pTu&ê~÷ݧ3'uª†·*u%’ÔI·­ÞÁÊw³Bnî™ÞCn­©–Ôééÿp[/ÛÔ¡”kêHs§Ø äI)¤WìԢݡ±_§³˜¦Ð“ë)EÖÙˆæ´RàÚmX6H¶°#Ètç ˜P¦øKå¬íñݪZ‘݃€lKw«Û…ýÏgJ“òKÖÚ<¾*èuªŽ5MQ¨´XT£µ?ÉrÛþ„›ú“ G=… ñí\)Ô²z¤Úm}]ÄÄò¹×‚›I¼ñ‚«?²m@-f˜«ó§|Ó÷Fq¸zK˜DyŠº÷‰U[9 ª ÁóÙ2Œ¤9'¶ž“^ݲRÔdUópq*¶·Ìú~Zì^KqÕDhFgŠaî-3D}iœÅ§b?I‚yÔÞZAšÌ4Ññï£ë—)ØÚš9ï¦_È»²/­µïø ê([”¤ñÒM'Ê#£­‡—Õ ÇÚw½œ9‘Œ²ÿÛ¢´ãÔíÄÛºC¨soøñ!Ö%ûóN‚(õeÅc9€uŸý»r;H¼Œc?ªôa5!'‰~²ùÖ–ÛÕóíuŒr i—Ã&¶œ¬Ïð:hÑjRBl¼§aw™Òhƒ´Òc>ýÛwÓŸÂä:j6çDZù–K\Õ)F†e­îîÎjOåþ^Çxfå˜4 {û³fÏw7“`WÆg1´Qé,Æ, ãvHdý‘²à•“éyÜÖyùB‡-‰<£v¡B)Êú#'ò¯RAñkÃð“éðÃw¤ÿªÌ¢´\bR¤%¢œ§%¢Üê>[;÷¼@þ/XàNnRÜ¥€ë*Ûõ':½«£«Üà™„îÚ9e›9C^¿I‘Û,|ñôÉl6¯:µ]µê¦ÔûHÔºÅûHÔ¢}ÓŽ²ÍFù é»ýÄˬc¬»‹|Cºõó|Üû§‡DQ$¶ÀÄ€Qs¸aïþž¨þ(?h[àGÖ(”‹.À üÙû#ÿ=d‘é2l6Æ€b!¬4§›÷!¢ËÿÙ $n endstream endobj 999 0 obj << /Length 1474 /Filter /FlateDecode >> stream xÚÕ›[s›8€ßý+x´gZ ××\œºÛÙtS?ìlÚa0ȉ6¼Hn“ýõ+6 êCl`PÎw$‹ŽdEzéfr±œ|˜CC²eÛ†´\K&LÍ’5JK_ºŸÎg@™º«Åíì=0­éUäíR—â(|—>»Cä”Þ(²*ÃÙ÷å§ÉõròÏDebIMÿ­&›Š)yÁäþ»"ùìù'I‘¡mI?“·I3,ö½‘¾Nþ˜(%D»‚¨*²ÍÑgò)šÇn€¾)ºÂþTÆ¢+S~·ž©œG2ò¿) ÜT¸L_ }Œ|Þð]‚®È@±8›©±OÍ2¤˜Á=¼»™H÷É?fÚ.cfïUU¶uý@ø¹>ŠEçûmô)š©úô…ËDÇh8̤Gþn“‘ä¸7טö² ¶1ò\Ê;£ÚájGñ†ô T­zB##ÄAבt)ñŠÛÿŽ¢3(€°dDP²â\(§ó6.É`÷.Þ¿ÞH? 9LöºNÿh‹ÂÞhj íÃÜdG“¡f.)€2„VJzÍ_®D® N–¾RÔÆþÍôQÃ8ÙÃ(ô±†ˆ®}ìEóN„°ˆÝê'ýËõíç:SñVS¹\̶ít‡ÊfEN´æQmMu~ð+w³+$ &¨2¯pèÆ/ɬ,^sa´eKWË‚úG»u|—º9ŸjWù(>ð-ø§3Çä\aÝi¿8,õ_Î7 l=R}8í…»`U—\Ž“zÔ9`À|­¶_Q4:àœÑqpˆ©ãä:¥ºô¡=íÈrÙ®O¼J”í-¼«ª¦T넆ÚŠwOüŪ¢ N;SŒ†;¬Q¤ç¡{@ñ¶´‰Õ”éîpPLQL†¤Ð[vóÙIùa0ÁF[ÁGYvÿ‘o«t]úvÒWCë¯v&H‚ÓfËÉŸ†V‡0烰Zv À\ò4ø4´»1æ…X8|DˆŽ†’qÆýÁ—CK‡Jˉøäùo%ûHóÀ¡¦)Þ;ƒöm“°CubŒ ð–‡Þ?¯FS~‹7.Ý‘Á僖Ó~o%ûHwîíV/Ê®‚1rå êSœV.ÆÉ~ò¥ð#ðL†7û–Y7¯´-¬òÔt¸Á¨~KZ²m©’MÙ4a´K ¸ÜèÜ¡wÌ‚®JÅ¡v‘Š˜wÜÑÞ.%娮cÜ» s:G~%3>ÉVjs¾ì9«‡¹ÁHx@iLw»úyT”a-ô]Lè);(uSÝ ©·5¨vFgïÅÄ'’¡µ`Ïõ ÍF›)6;ßJìÕU¨®Ùz4¹g¤¯è¶êP[»ON©Œ¸«X¿9jÙæèMsmþh~R‡³Ÿ¼x@¡óX9[£[ º¥W.$–y“fVê̪@›½ŽñòjVce##žôÿÌÕ¶ÚUŸómU¶SŠ^l·‚æSŽ­ì.#_¸ÓbÆÿ%,x•þpFS÷]º["ôq6Ƙ8¥°t"Ð4õ byMtTô6Mc0Ÿ‘UO¯™Ïe¾ïsÇZ¶¬ÙR°¢F±PT®oŸZ=¥G>^v£{[ k+‡jkEý‡¸™ªÀƒ‹ 47ü\ûë‹Mä= ikz·Ákˆ:Ã,øôÞ˜Yæ^ÞvëßMÙ<=³xläs€J?þú뢩š#FÀK0y o0­îW@íF­eèü²ªÃkùå"\G¢öw>…÷Y|G 7ü(ñøöõû*É$vTá.î>…þKŽß®?EÄ·ï¯øßv™RÒuòÅ_ ß ë?»#ÞùØößÕ_Têš ŒÖ?¨¬ý­§dU©ÊZ²7/iü0Y»äé"ôÓç%$†òNb  endstream endobj 834 0 obj << /Type /ObjStm /N 100 /First 915 /Length 2993 /Filter /FlateDecode >> stream xÚ½[ÁŽ·½ÏWð˜\8¬*ɶ%@°uH"èàØ‹Àˆ±kH2àü}Þë©•äÄšµÞlpvÔýººX¬zE¾Y²J+K¢ˆ­²´£”.‚Q‹w~oe¬±çÿ^b(ÆQDtQ[§e¤9ж^¤ ïYøàø`¸ØãI2ºãƒãà dvþS5X³ð‡vÇ#ºõå§Õ¶ÉÄ7Vt§÷¢± ¼˜ðY}ÓÎÛg1[¼}sÁ³ð­ ¾ î´¹ðr.ÅBúiá1½áŽå†×^@ö^º ÝKï@]xîÈ>KŸd_¥óÉË£ô˜@­8ÜR\»|äôÆVðê¸}ô⯲†Ÿ£x4àŒYF3˜1V2xq”a ÏVF‡·Ö”2|ŒÓšZÆ\395Ækz1x—ÙöàÁÞćY¦Á„+g؃7™Cq;ÞvNN%<2WÀÏôZä-zVð*kqÆ-ús¾ î¼æoç ‹µðmpº£a^·¿¤„ªž® ƒG°¢óŽèŒ#á%&¼¾`\lðˆj óp€4ÁÔi[ü´Ýˆ€m +#øµ<>! ð]3|²†ç2 ¥ž‹ø`°1hGÏe›¡øÄL’h£a˜IݸKÑ=Ú)0ñ‚¢CtÀ!|šðF ÎD·÷E0Â% žaâDÁ3 ÿŒO\n‹+°à.UÊ…3Ö:=yr:¿ø÷÷7åüéííÝÛÓùËþñvûûÏßÞþëtþìîõ77¯_6¬ÛöêüÇóŸÎŸ¿”íÓù‹›¯ß–—2gxs“YÂBVTΖé¬x®û´9á¿-i^…o}o‰xíÙ;Ú1¼dDqEê)ïí²ÚûCñ ñ¨‹X—Ô-œ§T‘†ÔØ¡mGC–UÇR×U‘÷$¼"U!Åb†ì¡¹Qy—ø¬¸dÌŠŒû%º£%÷>è^U¦ML |äˆ}Ð'{ÆkŸu"‡¨!>1Kï|Ô­"í?dÉz„ÙQ(ÊÌ»Ù1…úÄÁ’µ£¢½³D¢"û>dIÿÐ’§å%*à¿(ç¿þíï°áÇz}ûÃwß½úèu¨çS+ËÃO®{vwûv{ø3£AórdzIF£ù ظÿò¹âüüõÝ×_Þà%ËùùÓgåüâæÇ·åÕOýöü«ޜΟãI7·oßxâwÞÜýðúë›7ŸÚ¾úËÍ7ß~õÙÝeóç@Ñš¡pÐó¯^ã^\gÛu¼$Ì~Ð?û’¿Ñúhò?ÖGü*ë/ôO%k¤-$—QrÔ-Çž£ç8rœ9®ÏÏÏÏÏÏÏÏÏÏo$ÞH¼‘x#ñFâĉ—aCbxo&ÞL¼™x3ñfâÍÄ›‰7o&ÞL¼•x+ñVâ­Ä[‰·o%ÞJ¼•x+ñ"ñ"ñ"ñ"ñ"ñ"ñ"ñâ‚÷jŸÄòV µÖ{¯s²äyÕ#­Ïñ³‰ã{„k• ¿* üî¦uaí€NVA$;2úTù¸{–Z©½IÛV·®U'ذ3—+ŽÐ±gi‹Ú°@ÑDÁÁ £ÕÀÄw0"42WŒØ±–èR„8_• ­B³ÑÁ†¦®+Fô044}T.iuxÀ:ûLwͺ§ 悞Öze'£X$ʆhÉaž°H²h‰0ÆFÀئ¡qƒgì¨À„q-À/”œkTve|#\ ÌÙjG°…Ö-¸Ñ¡µƒ(XL¬’y½yÃ]›¶¸‚ ŒXºGyÂ1ÈÖ6в¡éàtLÕk[ó˜˜ ßæ‚air·«¹ …gô #éšoÎ|Ê¢X%1o,)Wê×Ü3cbIr{­!m/vÒH8Òá£Ò6*wg_hZ‘)m|Ç´Xk Ô£¦Ã¶½ >Ý2¦Ã·]VS¹ZÀö¤xVÁÆeLûæÆ–^¯0ß¿”k€1÷¥œùÂdC¬ý˜“ÌZ¶…«W'ÁÒU{»–'öì×¹DÑ pap$¯7Ák¿–µ­í?‚ÒЉÜφ,dó56œÿ¿7Åô*×6y„ÙPdoî:æt c_繦`WfûÀˆÊù‘MØG#Û¨™›Ó9X"Ñý˜õÙÑ\°ùò¨Û±*j3ž}40m?†_º Kϲ¸­†G‘ºBtPžê —Æ^ z‘äÄ<ü@òÿ‘}´KLî†pàV 8”ƒQ $îàa•’æ\1bÇ"Þ·Ò…7ßJÖý#°`â#{à#úžF€M¢ë¡-<¾[à–~£c‚£¯pPýŽ’í\!*(\0†ÔßâZçmnL =p“½ë þí™ÙuipXQÊc]"‚¹‚Ôÿ™±à¦È6h~Ý87j¶éõ—kÝøžF0 ò2˜ Ø{NFƒðÊ:ʰj¬ u2ir¿‹ƒIóZ3¾çã°õÅsydè¹mQ54b™¼]ã·mÏ€‚Í7špã†rAi@38\ñ„qq(û`ä&Ñm{"&û`LËÕfü1<ªåh=ï=a¡r­O(Dï=Já×Êøžžè R`ÓèÑV ‰£zYC+Y[wÌÚLŒ. -'êxß’uŸ¶íbFïÇPË{.¡Ü Y﹄N¬T;¨†¾3ñ¨ó#@ôÀþ6BÈðÆ{#Ð~¨d„kö⨆•é={qôüë(VÕ«¢á\kl = £ëÀ:µv:Òâ<H#0ÜÍ«²>¢v²m¦ XuN.¶íð ª…SÆïÓ¥0ü}áš¾ô ~)¨Z|s][8ºÁ…g@hÐ…]1bí|s0š1Ö%&¨eP*LšŽ>A醠ÿ£AïÑê L ŒãQF ·h³€ÐL¿´?½I£¬DŽ"ÚŠ49Ëju5ê#‘5)…žET?IèÐå€Rñìß¹M×{a˜¸üRž–—Ô­þ ÉO¯»hHÂæ¯×üÿ²‘¸WY¼^DÌß*¼ˆË?——±çè9ŽgŽ÷×_ÞËË(9jމ'‰'‰'‰—Þ I¼ô å”—1ñ4ñ4ñ4ñ4ñ4ñ4ñ4ñRó–x–x9a‰g‰g‰—2š°Ä³ÄKJ¤@%R )P‰¨D T"*‘•HJ¤@%R )P‰¨D T"*‘•HJ¤@%R )P‰¨D T"*‘•HJ¤@%R )P‰¨D T"*‘•HJ¤@%R )P‰¨D T"*‘•HJ¤@%R )P‰¨D T"*‘•HJ¤@%R )P‰¨D T"*‘•HÊ^‚”I½E”Éžañäˆä™u®uLD+_^ƒ=ƒò4Ë·-âÙdÖ²"T¬±tÛæ`S…к4òHçw°oá±™ M…»ÖAìy|¤6+sÛpøA: Jý(ÛXǰ$ÊQè|¶Nmmj”Ž<4œ[RzÐd¤ æ›6è }p¿ú(о`U´ot:*£QŽ9Ê”‹‚ö纔‹Á#äI®µ1»2s+%ÌÑ9ð¸„纂Ô8¤aÔƒ4kyÜîèªùk”ûãöM‡;:Gc •rX˜ rÃä©ü•Ï€'ZCœyÂmÎÍ·‰i†#ØV …ÐèÇœ¤Ý(²£[‡{Ùfp¥Äº¤YÓ¾m³Í6”z.Ž ꢈÓ8H³FU)%„ )Ë.B ê9¹ÿbÏFÇÃ)ª}§¥äæÇÕí¯]E9,V<½±JÂËŸ¶ðg€> stream xÚÕ›Ûw¢8Àßý+xÔsF&„ûãl[[ÛîÔ­>ìžîBÚÉT. 8·¿~‚U¹ZãCh¿|ùnù‚@x€p9øc1ø8‘5ÁM jÂâQ5CT5UÐCTLYX¸ÂÃp2‚`h/§w£1Ôáyà¬=ä'v‚ÿ»vVÈŽ;¢$Ê£/‹ëÁÅbðß@"Ï‚$èÜVu  Ž7xø—\¿€(›†ð#må Šfï•0ü59Ns‡“ÞK"u†ø„’9þþ* áPÁž=Ž$ÊŽñåhàU,ΓûOé˜HS%_—vý‚ƒ’é ùT MˆÊÞÅûËðÞ@ÒY¿Œ˜|Œ%I4Uµ1ßÝHÿϱg?!qŽ*Ýžàd©.N\ :üÞH„ 2Ú— µJÖËß8œàÚâ9+;ŽÙ)ÎvhÒû›ß¨´"ÊŠ©>J(‹òF¯hã‚ÊÒí7Y‹¯ÈvQT&dD¤`*àí!kh'Di—Ô× ê0hTʘ±YÏ $uø+æ TËÄ|ñéüâ~nÝ\ü35 „ËhÍ1…-œÓ.2aÓ‡²)ª”—DO£ó£—=ê ÏðÙŽ!Õªö¶CÏÚ¨õ´V­§”Ç¢jãˆ8± úÕp< ÞèP—ñÈ•š]†g‘PÆ$ö“Ôêž";A–!{ë“5Ioç“i‡>9§©™Õ=t©:ÓADa„‹y“ý°²®¸ë?ß˳#Çq;«wuàÃñ§ØÁ¸*ä9Ë'w6°1M}œžâT^‡X-¾þâžQë ñ £½®ußÖ^X%o*mb1qÑ(Οõ•`˜•  o{=CBP imŸÍ‹v”bnl˜ï)ßÃ4aë‰7åÞ\mFVTƒq™?Nñƒå7Îøó'r.z¹±CÒG2XŸ›Z_÷œ°†¹Åsñ®U:w[;‚Ë·NQÀð0)æ ˜(±4¾ùÛåµ@¡mÏ®¦³Û´ž³h›[¾u>™âM'¼aÝAxeÇ7´ÅJ<%å5~ôÏZ?êÙ¬î`=‘g'\.†^ãvçe@"YQÛD×ýØ¢ñïLTs¬w˜ZW×^[­s,àã~45‡Vü.š” Ñ4$A¦õL¬Ÿk Ì_Zußé­69 ¾ä‡âŸéµt“_Õ‹IçŽvì, v/ɃE±1ä"mÛi,v~£%i)+8¬TKtâge2VQÞî_ŒÎx¤:M0ž2¾òÝk:M@//Ølgß}5“à œ^P9^jՍЦ·ÕNÚå] OEió°²mh]{¬§$ïLj`pºë“Eƒ…ý„[×°ö–(B®U¢|µYú{¥%k/NÇóf,B3Ûì¹;œ•YZ„ÈÝþíÙuUtHÚÚî@œ8›º‘íöe †:ºÛ¥¿¥dMécV»2›I.rªBCè{,©Ù¼A=G†•ÒžÁ`”O€Qá˜1³ú™zrÔN€QçŸ1,Û-à# í(F‡Bci^7¡É__Éruu5Ä+;YÇm¢Ïn—·3Þ¼*ÕCeÍßP·­‚„K“È#cEìýâ½õ®¢–¬¿FÒ°z Fzã]‹Í(ˆˆ9-6Eä`§)êÑ«]@ß½Øö(ÅÄ]8ž Š%ö^ô\š©´ÑSÚüU£ÜŠÕ/îÆ°ù.þrHUD¨5þáÐþ›È-(JÌ^÷]VLwøUMI÷ôŸJþýl‚ò?–> endstream endobj 1001 0 obj << /Type /ObjStm /N 100 /First 937 /Length 2870 /Filter /FlateDecode >> stream xÚ½[K‹e·Þ÷¯Ð2Ù語’`0øÁ$ŒíE’aŽÝ3mÆcpþ}¾O=“E® 9š¾:ÝGuê”êñÕãNÕÒÊT+büô¢iøŒb3ð™%´ã³—Œ‰ÏQúT|ÎuÏÄi1°"2ÛÃ4%›’‰…‰Á{¢HWÁ"‹Œp,z‘9@ßFQQ0`³¨¶{+jÛ]Š†Ì‡é Þw+Úžîàv (;ØmÊžÅd€²÷b&¼gs\MŸÅ¢c­XoØ… 6\&ˆÚìØ…»4Þãż̈âÖñP¼‰Gã=½xïÅ{όϞ³•hx¹™RB<§–°†íj80ÓKDb{F‰Þ°=!ãaÜÞKðjæ(Ù&8ÌYR!ډǤaëìRÒg˜à)“GÖ­dç™árðÐz”ÞpR³gé’ÜÞK×Éí8?çöYz€ß9Zé9±}HéCãaÅóà†•Ñ„åÁAèÃxp8˜á<ÞHxô ÁYÆÀÖ9qÑ7OìÏKsðÀÉç¹ð §7É7^ÚÔSxüì|2ÿ´¶ëÉ«ŽWÃmÊàå°„¦5Ð|Àº&ÍÄ¿°Z÷b›Ø\÷Bã$¨î * ’±–Ë>H]Y&—Ø -ø Á/…Îr‰ 8“§áåDÝ×½ø¶îí²îÅÓ‚â¿”BÆL¸¹Aåa-PO,ñ/³AƒRÚPðAmfz<¼xñpûêß?<–ÛÇoÞ<½{¸}ùÓ?Þ­ë?÷æ_·OžÞ~ûøöUƒ5·×·?Þþtûô•¬‹‡Ûß¼+¯dôšIÖ æ¬ÐNoZGsÜôqyñ¢Ü¾,·?<}õTnŸ•ßýðõ?«êïËG=àçÿç@›Õû±>+mV%*åi³Õáóv2F¥ð-{ð6­Õ;³>ê˜~ˆ‡îÕ MYÝâÈjd)+<à99(Ô Þ±Â(˜Xò ³ûß<Ø¥r€Ða|fZ¤v¸9s(ŠŽ;LÄ…Ld«Áx¡ü4ƨp/ˆµu»ÃD^) ˜¢¯5œ ]ŒtÀI›LhëIh\¯–:tçµl½JÚ!¤€·Yî|z ¢‚UÛAÈ¥‚ˆê ÀªÐéá:a«`Êð²w$!ýZãþÒ¤Môep˜àIªÎ~‡‡q¥Ç–Ê@¤>ª/fÕO Ð ½£óB&naC-«YÖ‰ˆŒ¸ uíg˜X*¡ }$J8Љþn‡$Á‡[+×ðcoðãXôŽ«jWJ"kœ1bú1P’ tEõSkâá £ÍkB"‘yŠ ¼13H¤7JÇ@I¤%r‡ ¹R'À·¤×N°: L1ŒE͸# ½” « `椳 ø|¦A2Ç$1j'ÂvÂI] Ú™k†Ôî÷tB¯äÀýuŒþ!#ÿ€dä’`ê ”pZS%Ú+¸Cg¯ \ ºK•± ŒS¨ éÖ$œ„b[xgbf8£8¥ÀøÈa¦-ŸÓT&aýʆODú_rÂ;ùòÓÉL‰Ò`DÏYzK¾ÇÃ=¼té0ÙC¨.˜n²JHÉ VÀš’)h¤Ý÷ýJ&¨‹ZºÈ’MO°>“ÐÑÑÇ&Xj›QXÒ¦gˆKèèÔCðÖ!GëŠP½8xaÝ'¡¦3Ç|ëxc¤| $éÀQŽC`”#•{ ®]É€=Ò¬’V mdÀ\=Y-9tƒè¡³Ü4AIÒc§y•vG2¯´ –"À<”âXBé:Á„B"ÞÏ2ðš:Æ/L †ub~’ g0ñ˜ €J¦Ú¡”Ç=ÛÄÃÈ. I@",hbÂ7MKÄ9Єa²ê©Õú<¥W†¯ÀÖó–â™ ÙŒeŠŸ„9ü%Ð,’P¸‰^,…€² ˜íPáÒˆ^¨ H³X¹+z9Aδ3L8+!ƒª`ËqFS¸ 2_eã\§³†zj'–ˆÊ†ÕÉÐ!ðâžÐG0H®Ë‚A¤÷ʧWÚR~@E<PÎ’0zœ í‡$±Ãw†äãðfRÏàËmFÃÏ÷Æa ìê™$˜èÁÇêuÖ ó†ïÀx?„/ « š6žaUÏÕUü6z);»fHwž£—¶Õ ®1òPÞe@ù¦ÐGEÄhˆãúÜðH“C§±™hÈí>0¡¬ ä)&þ³r<{BItø¨ç†GW9å0Ü˜ÈøØ›êµÕðè÷ª†z±N¬òuzhÏ:1à@Ùñ"ç C𓜃`øÒÌÕðgü¥Ã? 'Nà¼ÙÚaÃm®ŽÇ<ªVe©Ðàº]V5Ö¶}°C}ê,²¦B+™i NÜ x([ýŽ9ÕFÅ8Uˆ¡dEqdäÆa‡úè«ß¨8A¸pv¨g¬¦S;T1Ü@B³9Æ´ò*9ÏU˨‚<gáýÙ>¤wö†Ïð°ü3ÛL}"`À`›!Ø>U±“šÈuÄa¦+ÝJNâ÷Û½ŒçRåªßÄ9å\År6€¿ù½2U^[¹äX›ÈXàŽ•K1Öóüç!Œí ñsb¯ÅÁL½C2“ýÎÞð™‚uÀ:ÇÇÖ©à$`¦cõ|šÕ _â e2ë¨àð ûn÷’®KËu·ˆøH¹m9¹:¿¹|ûYy5Áv+_”Û_ÿö÷oß‘4½ùéûï_ïû^>½y·è½4Ƈþ¼ã%g2d¾¿è­ Óu]·Ïß>}óå#ø,·Ï?{Yn_=þü®¼þïWÿ=Ü>ñÇ7ï~ä0_ñ ¾áO?½ýæ‘ëóùoyüö»¯?yú¹,¡Ð ôUŠûüë·Ø]8>¹î[òüÏ¥¿$7kPðýÂöÂ÷"öâÃÍ}/Æ^Ì÷ i{!{±)˦,›²lʲ)˦,›²lʺ)리›²nʺ)리›²nʺ)ë¦l›²mʶ)Û¦l›²mʶ)Û¦l›²mʾ)û¦ì›²oʾ)û¦ì›²oʾ)û¦›rlʱ)Ǧ›rlʱ)Ǧ›rlʹ)禜›rnʹ)禜›rnʹ)ç¦Ü7å¾)÷M¹oÊ}Sî›rß”û3å×Ë„&ä‡^›Âo ûW{m:(lvüÐkCr8ðë­¶+K! 8 8½;m ·=$~½Óve俤ŽÃ³±ÓF‹çø[žmµ©#R³¹cÈµ!aÛËn諒WŽ’%Ç„ EvÇH„ì÷™Ô{ó¦Wò mä¼ýdŽD~Ÿ›€º§j×L4‘({Ñüj¤W3 ¤qfn‰Y?k1á¿DÑmÃÿ=L{åT‚Ž\³•Ì4ù¥ ¢Ó7²çÊzˆ-G%ˆ½æÝ9KNnIrÔwÀ];¯KÈDû½Š­_9ç©«T½‹ÁÑJco!95ñ ƒd#Ü ."¸ a£g ‰°3í_–ጽ>…$Úó0´²Á Ø{¥+ç™æ8;]þÂ9Ãã aw‡ ¯<N)±×ÇAäÉï{éêÆ»¬o œ9Ží%ø½•κÌ{/Á†OÜ@n×KÂ2*¿µ%aðizXN ¿H"Ö ü!I°Å4€Ia‰r®üÛ$±üP’ñ“ß èˆãx8‹ø½sìó·œÆÇñò endstream endobj 1172 0 obj << /Length 1440 /Filter /FlateDecode >> stream xÚÝ›Ýs£6ÀßýWðˆg.œ$¾'ÎùÚ;§¶oÚiîÆƒ’ИNÎýë+!l v6`«}H4Èü´H»«Õ„G·«Içc_ÖS25¤ “AG‚®’bÊÂÄîÅ~Ñš †Ý ¤âµ?_ºØ‹­Øñ½¬m„ØŠ0« Jr÷ÇäsçfÒù»Éc€ÙÏ*’taîvîÁ&íŸ ɦ!¼&w¹‚¢äºÆß: ‡h!€¬3Ä Ä]¤Š/Ž¿Œ¦þì/<¿?H˜  Š´úÐ…t Ž/}-ð4¡ƒ£´æY ²)*. ”LUeÏqqüäÛôg?$®ÿŠ¡ !AÞiÝv„û ¤Ö/ÙǾND£H²¢!:®‹õC’ÖâÑ…ñ‚EDi²;BlÙ[Ã%ÉÖ²£¹ãZ8+±Ûê冓pm‰« læxV¸bh[å–á´}p*ÒŠpáò™VpHwšXǨûf’óàûn*•통ÈÞ¨ŒåZ`>£k/áËŠM¡©µÐl+ ¥¹¿XºS qÉZ\›:©Z-ƒiÁ\™Í´u÷ˆíÍËŠM¡µÐ6%&·|µ!DxÈlÓ ¸ÇPÆÈv­è™AX§¦ y°„&ØôÆè ã87‚bû®Íך²ùfêüö†Ñ§×¦&°YkrîœãÊŠMi#P íyn3°u,× eEed[å–á*jðaWâ׌n»Ò¬%»ÀsÚºÐV='6v6&+6…VϽú¥‹`]8Ö”:&œº ÓØzœ’l¸Êu`–’=gc¦.]“EÜ7CýúË`kÓ¢Wªª7oŸ‚ŽWæt&ÌV1Žxf‹IÉÝt¼”÷—ëI½Ó»ÅAoЯ¸Á#w6%<¥TxOä‡ÿç{DÍìpÀ=éÌñ¸gŒpüBÀÖ"⌵ç#èH–49E¿â3Ò_dÑ(ìKª"æõEh»¨ª‡1žÓÈu†3_XQĪk½ºß'nÏõ%3÷*8 cP8bMz¾ÿ7„ýÐrƒÓÊàzV}*µHç ¶a¼.ñ×Ïûz ;í«-Ëí©sª§íí4…s\Èñ;u\Ä ]ñ* ÙL ¹nN 3Ÿ«X-ðýB½ L ð*â—õë,YªŽª9[ËØYDÒÕŸ¨ï4vNõ2•} Þ ØŽÝ8ï1I18;ô}Z1AœQÏvã³£ñÊ•'bßuM$^RKÛ»}Þí[gâéÂOº¦,^Žº'ÓÞðË—›¯“ª›£Æßß#Eqx b¡Ù3Ã$ñæ4K8?ÑJ·qyâ—Ékò `êalã­à¼©›U“_è­M¯š·˜‡„Þ‹àj%ƒáËNEÙâ.a° †;)Mç¢ÛCC¾›Ä®ö’¹ŽÁ*èÙöŽËÇÆÚ LNº²*:Ô'˜²ÀtE­•'¶wX·MWYæ;µ— U> stream xÚ½[ËŽ\·ÝÏWp™lØd½H‚? $@–I-{1f Yœ¿Ï9ìæŒ½ðuW짇}ªn±ž¬ºµˆ¥’jOU•‹HÁEK:=¹ #E`_Ñ’Úh\Ô4”_Ÿþ H~‡•Ræ6|ÉœX d•+ü¡8V=Õîs¶ŒA<+Iª«IĹÏ$‰vî3MâR@à ÜúÜçIZ'ã†'•Ô Pœ\YO "\¤Xbå%©9yÁõNج­’@µ;i€¸ŽNîÉj% db¤ÆMûDé pe$ ã¾(ÉZ㾨ÉF­W19ÇJ“×Ö@# 2.sŸ'7›âŒäÞæ¾–¼r8‹®sßH>÷µ’4¹ª)„â,øCàA¸Ò €Š ØKó­QÎ-RŒÂgk-µyP¥Kj5HŒ7!rT“)ÝÖS¯A °®…@°Ý”gŽ-݃4pP=yéøFWòÒGê#H ‡<Ê ”aˆpß(SpßÐ4lÌ}–FÈÜçi4 ¯>µdê`™j2)U'ÿ7¥ÅøãÔ›Âå<"*C<µ¡ÎGï˜ZmrUKbýYjz”ážÉÄ“$ªe‡x’„ ¨›˜˜Š kðR²ûM1•¦ŠÜßÛ&‰«#€bé@qnÈ6{¡©Ž †6YGi6™ÄKå±DÔÖ©±+|!pw0‰ÌK–SÕ¦¨°u$¬ó8 ~æ1 ùGVa IÅŽS%1mHÖÔ™hCâTÔ}ÇÁ{ƒUÄÐy¼µ²ªdfO–ë áÌ,ƒ~"x}‰r|$…NØò xp÷(ÉàL73a%#É|fÂQÿÄf¤£þ… %YÙ-¸(ÞÐ=10»y€ÛœQkñ€ÐÃö2Z¡ÔŸ™@)Òtìa¬çŠ8.H4;|C ¢òÖlÔãðT—ôiý¼%A ,çÝ´´ñ;`œ›i÷ÁÔÈôÔ<ãj;®ÿN= 8¤ÚFóký'YÕæ­îaýw* f¼BVeˆú3k·y©‹CÙsYf ‚àM²ÔÌnƒ:[ ¢ô0ˆÛù)nE"'þœì ÂãÚëÔ»8€èH¬JYV„Gµ—œZ{Uœ=$c¹Ö^Ðv:P×^qþ MÅ1¨Œ§šÊ‚P7U./ã€n(ˆ³ëìdÁon+gJËN¦¶kÙØâ…/?.O¾™:¤´×ëv[L²¶8ú'0QèF<[h­ò;õß'¨„¬Ú¨Ë®_1ðUzSK'¯Óåïÿøgb×xBÒÃÇ~x»6¾||ø0_2d×výÆKø©ãöK+©«Ì_ð­Ë«÷ß¾¾Ÿéòê«—éòÍýÏÒÛ_?ú+°twùà÷~bçt~ŸOøÓãÇ÷ßÞÏÏÊõ³¿Ý÷ý»/NS(QON{õî=¾ ÚzÝ7åùèÎF5Ù™}êÛÂ×"Ö¢­ÅÓæq[Œ²u-d-t-òXÈc!…<ò¸!³)}[ÔµµÐµ°µðµˆµhkÑ×b!×…\r]Èu!×…\r]Èu!×…\²,dYȲe!ËB–…, Y²,dYȺu!ëBÖ…¬ Y².d]Ⱥu!ÛB¶…l Ù²-d[ȶm!ÛB¶…ì Ù²/d_Ⱦ}!ûBö…ì Ùr,äXȱc!ÇBŽ… 9r\‘ßžãmx8ˆÈ ”#<ªÞŠÃ mº•ç­4›%ì,Ãù 뮳ƒƒS?`BÎl¨â~ óÙº’Úp+làÔCß"0s„ã¨OžS$¹ClÈÑå†è™b@†Q{™ð,š87ÄÞ‰ ÙÄ/§ ²qÌÁk¸¶NTágò€$•y!/á X°t&«È”µBÏln ”å«í³ÏΉIlâÖÉv ;ëѦu6¶k([«»NãªlöWyÒ‡»ò{Ê–9…Ã1=åÍR»Ná°™†<ÂÙS¶,Ár%ú³“`%^÷$ë+j°aºí4Ø79ìmsÇz¿µGz½Î;°9€T¹ußÄDxf^ÀÅàðIc3ÀÊ8Ý5{b™y«Í©¸:/œØ]µ@iÙ|ýdIÆ©8Îcá˜]™K> §ò€ì!Ø.šCq°N¸ *„•ãIƒS‡pn¾Ò8ÇI ›¯4Á”M7n3r!i¶9w \ìõ׆ŠúHzîØäœ37(†Ï±ÉTÚ oÞÆ&&¡8¦®l"¥CÔd?QomOàZþZ9=É÷›¿V¨§&ØŸ‚ ¶ø[<3dWe2Ç>’‚6|SÒ-…f¨*Ò•¾‰‡VçU—B ÎJ£ë¼êR©Ùê.A ´ -È@Þ06ðP…/4ŒlÞ7eu¤…]öÈ>úu–^s´ã)ƒSgX;¨¬1ØÖFžgá·Ao·]cÍp]üVtöé%8jÝØÕ–M¹òm-d’ޮŠ"ÔŽ,ãÌ~2}¥°I#•ïÕWÊ|od—]’pŽðe¤ÈÔ H‚ï÷qd°íÒ T~:_h„£žwì"ò](Tćw§:*G¨ÈïçU@ÌÌÙ8:º 8×>y9Ô' p(ÓWš$ŽZ”ÿëJä…`> endstream endobj 1180 0 obj << /Length 379 /Filter /FlateDecode >> stream xÚ­“KoÂ0 €ïù>¶çÙö:m rAc=LmY%ÚnÐ ~þ’f/mãÀ¡qìÚÎçÄFXˆÜ%d0"i®!)@è*­ !•‘€$ƒ™7ô9zéK<ñû<½ûfùQåu›¶eS÷œmš¯ót›;)£Â_$còwÂÌY nÒJ`ËŠÌ™±©ˆBØu^H¹†'òHð„3:â´¹RCÜmÊ6Ÿ£Bó1C¡Ð³Zá3K^6ô­®Ê*]å?çTåík“Ù ^Œ”ch‰iVjØ„ ãtD`Ö%ÜÅ}‘š¥Ï”º’«-爼#;loÅ&þg‹íy&¾P^Yø\yE<9SoªO@ÃÀô‹¤BjnÛpsAÅ÷[?[ç³~°¥™ÖŠœÇ~›½±­g¹N·[§–µ“‡¿ÝowÕ¿ÉóyP’r}õ8\Ž«I!9eŒ»ºã:Ë}¦¼½…©487áÝO©N Ê'pðR endstream endobj 1193 0 obj << /Length1 1606 /Length2 15653 /Length3 0 /Length 16485 /Filter /FlateDecode >> stream xÚ­¶eTÝ_“%Œ»»sqw‚[pîNp.rqwIpwwwww îîîöæÿ<ÓݳúO3ýá®õ;Uuvíª]uÖ¥"SReújjgl&irfbcfå(m]œäí@rL¢v6¦€¿Æ/TTbŽfFÎ@;¸‘³@ÓÌ nf`g°ñòò"PÄìì=–ÎZuM:Æÿ²ü0öøÏß›N@ €ú™½­Èù/ÄÿõEU33€³¥ÀhcSTÒ–QÐJ)¨¤Ì@fŽF6%c  @hbr2£˜Û9lþ}˜ØLÿ”æÄüë«Ààdofü{ÍÌÝÄÌþ#ÀÞÌÑèäô÷tX8œÿöÀٙظ˜þCà¯ÝÜî_„ìíþFØþõýS²srv2qÚ;þfU—ü7OgK#çr;ÿºvæ#MíL\þ)é_¾¿0½ÎF@ÀÙÌÝùŸ\ÆfS “½‘ÇßÜÁìÿ¢áâYüF€£™…‘£©™“Ó_˜¿Øÿtç¿êüoÕÙÛÛxüë¶Ý¿¢þ“ÐÙÉÌÆœýoN翹-€ –Edn`cý·ÝÔÅþ?|®fŽÿjí?3C÷—„‘©ÈÆ`jfŽÀ¢`çü7%€öÿNeæÿ9‘ÿ$þøDÞÿ7qÿ»FÿÛÿ¿îó‡–t±±Q0²ý;ÿ~`_;€àŸ7æÿkd ´ñø?Dÿ÷@M³3ü?È8ýmÃWÅ_)X™Yÿm:IÝÍL•€Î&–s#›¿=ú—]djæh™ýÕò_m0±±²þ7Ÿš%ÐÄôOÓ¿üÛe2ýïÌÿÊó/Þ,âÊj²Ú ÿý5ýW”Ò_ÕÕ<ìÿû_uÈÛ™þçá QQ;w€'€‰›ÀÅÃàáfóù?dû ÛåœîÝ¿%³²ý«ðÿõû¯“þƒ‘™Ø™þ3%ªÎF Ó¿ƒõŸ†Ü&.ŽŽõü×®ÿ-ø?Îÿq33w3„å?v&üÁV©iÎÕ¸9ƒã⺽Ýlƒ?ìKêÔ óý+íºüRC·x«úÁ\?É÷Ñâ±pbÿ¾'K¿?ÜcCÓ•lv‘GäCAד¾NÝÆÍ°ÈbP‚œvªéu9/· ¥ÃŪ±¿=®¬bPüC<ÙÆáwùHçOášïEù`âk’RƒÝŽV†Q]prJpôø@Ó?248Ðu ݳGÈOÅo„ë›tB–èìñÝñ®ÎäúÅ•Ûe—¾3ÔÎÓryÒ&Iùí¸Ù^ÀÔ*þ;¦‘YZ§,ÜÅo’gùXó21ï#¹¼6HÁ:ØÄ9®HÅ<¹ñ±*pÆ*ECÙDVp£ž.hYUä5Í+ö³ÏÐ â±§+¬|!*}Ãýè· ÊÀ!côÊ6µåä7°‰z®k2˜€«máñßpø œÇ²#|úw;#½¹”\sÙøâ#k«äo{c¬&±ÔCŠøëª‡~"õs¸O¬Ýœô9,gžP{ý`Ù }Wk)Ã<„C–Œ¶ÂþË|ÀI}ç¶ºÊ pëQ›+qh›ðZ´Çëß´ƒõýšÓx¢îID ‹b_ŸG†_^sÐWÜz'sQÌZù‚§¤>ŸhÌż: ÜýˆUã”Rló¾«çÇçSõý€µ¡.¥"–˜¶»w)j)œ™_¾½X”n…å•„7qó| ‹Z”²µÏ/õޱ¡®A+=uƒj5 ‰ÉGÓ‡á‘uHK5ˆVAMöL -œ1ì ñÏà°0 ÎÜPÆë û64_>Rj@·ÅŒ“@©eïU —É _Ø3:æyYÆÇ¢Ê­P"v ãÜ\|YúÔ >¿ÿ„£i‧íÙÿ¨\bR¶X,êW|¯Ž#_ô3.ñu(åÖ¶@;]R×`ë-œ]Þ<™•Ùò >" ê¶‚/yÒ]‡*x»F.pcî}!RóGóp%•øHñô!Wvã‡%£–Ìs‡te’„Öñœ¨ÒÃ×f5*g?‹¯Ó¹1™ùi ²"µùæ—0l¯åsËOs„TRV碎Øvt ’fé£ðÈ×éÑ —Òů;$ ˆáꈢ¦¯§XŸ.VIâf"–Aß¹úOÚY>ßMTŒáQ£ÌC8Mµº´rë±MØ.Ê'ÁŒl¸÷a¦m¬èÒú¶Âª½äãáÜ åc G–ðƒßôØÎeš ¨Jtc›X=v¬ „ç¼ÿ _ªzÄ3”–ûZmiôö.ÀG:•÷gær^@âs5•%W•×8A.ÿ—“ÊA¶˜½8“Í/[8!¼å§È'©®d}Ö™T›1MÒ¸eÐðf(¥ÄýµµCÌjÉz•G §*<‡zŸ+5 nïUx…ò Ý·=R8öleË@ÄžîŒ_íp}bgRpâi(ÜÚ^¬‚=rGÕ-]Ù3B÷þ›Û_ꌺ_vâç{Pû$Á¨·¾µLnê¼§0àXâ=ìYe –MQT AŠ uãÔÂ`ÀJa¬ÿÜ4Eù˜8p¯§‡7bQ+SëÜë—N.G=ûY=ÖÐW—Ë^¾Ù®Àw9R'î–iŒæv=„áÝì{°|rf™¸ôðFjMH8ô¤¶=Ú5)wì3þ3å4›°{7£î»hñ·PNNÑL­@¢uFÃ!l(¬P~ð'Cß ‹V•N”gÓ 9¹§QIð‹1ò¹=ûýKUZ’¾9Ωfi¦ÒÌõÇùº1W8ŠÅÏ6—õýs¨nˆLŒ.)ô˜R \–ýÄ=CáÊ@!ŠÃ¸Ø©$éaŒ2o#¸1#Ò"'­ aÕëÉܹV~*£Âi´‚¤¼®¡|QAü[¦R¦MI W~ ×ðꬩóÇßo‚Iˇ§´ÉÅM qkÍQ™Pœ¿ù2úLãï\0‡&‘çlÍfûû,¦ÃZ“[ü6±G¡¬¤?fÙ E4üŽMOe.Ÿ öI­¿×¡ƒ&:3\SÐï\q LÒø¶\Ç!EÁ«´+]õû4¡QW}/04ù%djàVÍí¼=— 9³û5ºÐT³›"Oßõ3-ø†tHN±ÁÁË{Rä¡9KËFbtÖëk€óc‹!ýPÙ´vsÊÓE.æÆý¤ª&޺тcâZž¿~3ç¼ôª#ú0ú”qÄå@«hèêŒâAè”[ÏyGöT©›Ð´fR+}rŒÏ@Oæ±Ð +<Âø†Òñ‚|ßûn­TмF–+ ¬RL"Ï0u¤¡É_•ÌMúuj×IwÊV`ϘÑ]°EÐY"Z²j…újþY„±èÝl]|ª^*ÿì„ÿÕ«7ßÝòê:ùù(Å©1ŠÁþa×¥”2.¦¾{Å‚#°¥j¹~5¢;TDÞÄ5¼´ ~ptj`ó3÷|¬hÿ}ñ¢“æH!~= ]¾õ‹Ð×ñš)AŇ€¢ÛUû s¥A”óÆ$©^ãŠRáˆ/ž`!ÉãÆ4óJ~d®È«]¡ u±¸3¿êJÝŠüÆ‚ægöÜÏ•ìC0¢`¦-‚z”¡´wòÆyÃÉÆ»WLY2Uic~äL{hŒè ;"K©`§Æ—£—õ¨ºþ­¦š3¤ M¥I´+MÿúƒàºÆ>çj£[?T$ˆ¸¶U$îßàZ0â'…çn`ÐlT¼ò4êFC‹§SM‡6†°V7ÜMŽï¼¯ýl`&Ÿ¢ésŽ:CÃÔNÄ|‹HÞ¨*S ßµ8s~ž6ø¸”ç•j§Á‡D8Ü[aáPyè U¡pÇ1 -—ÏÐ~8D»¤ìÛtùò ¾ÔÛ9÷+]}‡p×\ÑžUX¤ñ{a\ÏPà1Q¨§<›ù´GD{µX{ aÔþ Ž«¾”Ëúí¾¯èèxäWŽ”T>Ô?ÄÈH•üñ ¡ˆ´ZÉ#$|>Ž&WmÝE:âÏ<Áùéí°ÑXìû9?’ø[º F¨Ô(q²59M]j!é· Ê×&”¶rÕæÓ¥´É@^rЖñz‡]È0—!„‰œ—“q÷ÅC‹ èì……uåi!0;­@ÒÛMØ÷ùƒ9³ár,c¹˜ÎU%x þþ!šº¸ ¡ÒXl*‹²®í3Z„GRËœDvwEª®VÆ(ím[•˜‰A00ù‡Uõžx—Ì<*Wßí‚q5)YÂñzJfØOö­fO<ΣɈE&—÷IÅtJ#Û5üÌGC³PùN¢æ•R7 ‚•¤:•sb§`×iÒÛ·ÈEÕ¯ÙV„ tÍö^Ý~%üÑ™R.ÙŒôÒ¯Óžµð8˜1µìgÐæcqK¨u¬ðg!3<]x£üÛ«@`z™I4wâ—÷Š ¿eNc°ð‰ñ=ØpþnÅ(M©Õt•¢ð²VÕáBq¦ã£[ݘû\'5Áó“/Œ°€GjHj¢ÒÌ.A&9ø„bPԌյÆyzÄÒçSù¥ím´wŽ1¸\‡â BíÒØ¸, 5Þ“†újÌÙ²J”(éÈØø§K1̉p*ÂЙKÞNôÈÖU›e{WŽ-¢ùK¸.©c·–ßLÜÄ|@me*n6N q`ˆîžšLs¸wÅ×í–6o¾’àF•9D·{\ ÿè÷ê“Fáòêø\+T¿õûH”µMâ~Çru†‡¿Œ‰É„ìõåö^kªÜzH…¤¼O1^ ÒwfÊKÒœÓß±´uà^­¼SqƒQ˜)ƒC¸X ¿»Â;[>¦.?+:\—£þ¾ U(A P„R¼uzK)-…”böùÁò‘vGèÄØ‘5Dì †a¿¬“™‡ =6ßn²°€O¡M`Ä )Ð걩›[{`A1!;Æé:è¾êmAùË -À¬M§ía¯BT†ŠX»XR ¯ã5ïQØwk7„+Êôüá‘¥¢{Bt"6XWÍ‚ÜÆ6èŽg‘*–hÿû‹…0•eÏë· (o‚×â72(K‡ª¡‰ØEi¢lÝèÜÚ2KúdPÓ·øôkxt%­Mý©Mî‚Nžk{K ̱ÑHí /|éü§ý`÷>cQ+RV-<ôŽÔÕJjW.¾}Ø\‹ßUœâÅ<¥6oãž=¥¸Ï&UÞ¨îX’|ÝmTIhÏ ðp“vÃnkR{³§‹&Àq…®þGxP¨=äKÜÇ0oÛ¯ÄÆ(TØÝå3µä³Ë!¾´Ê,Ú܇xìwè]Ñk-Äó^Vá}…kú²^e½—¨¯uxµ-Ë—Fs¦™ú/„‘=ë^¶mƒZM=šúïn²«`×áTÀ¯§È3Òr¬¨…Ï‚Ãd‘Ý6Sê%§Ç©X;,0Á—A¿äÃÕ@gy)Çâ×K+Æ]’Ë| £ Nç½®ç*Em¹î ÷Ø1̪âQŠ"žjpÂ|ÛJ‘žwGZÈï‡G›ØÓçŠÍó†(šGñŽç> ÄÏuGkð85fžábÙ$¥ üö×/ò.Á5Õ>qW<ð«?­‘^o¿µh`Q¨Ì²Þ´á_Ãì¶#ƒ xÖáUCÓˆ)ÅÍW5Y!Ž®R–”/2ý­’s– äÃ<¼XÙ«ÕâÖÜÂ, «ß†¸±ø~GOå1«Ý~iØZÇô<:ä,ÆgD ¶>Åéû*'ROþ#7~Pt±&$ˆl.ª™ü(T—š±Ëí½¢Ñ㌇zféY^|•W”;cõèͰ´´ô ánÏfk½™¹‹ª:}žäÊzR1h/¢U䪦ApÁ©¯ù¥õ­D2êcü¾“#Í—ãªÊÂÊ™FXj|®þÂå’Bðv—º•‡çgõö”¹o\­ŠÖ{•ùœˆ,SýL¡$šjPD”¾ÂÛÂÆsŠñµuO¥FÇ=ïE'ÕUž³iŠˆaœPä*Ú•?˜…IÀ4FfœÇ>:vQŠ}ä·.PŽžô¥`o¯o5Q6_é&‘‚`iß*5Íå#’×;söOƒŸ@ú’¼îÁèÛÐBØñh*‰Š±¿@BoÜZg§jyXOÍmÔŇ5ìÈËJ?IpäPSƒy‡ Ý÷›¹ÎQëõ½Âbä@^¸Ld¹žêÚ+žÕØ{šûÛ»`ÝçòÚXI{¨ø»ñ­Xjt*L=®Þ= “އá€ß3º×/+¸ètæ=dùÒì Bû™Û|w©™ZÂ.éís ~°¢ðÂ(Ñ_¦$ 'QÔü?Äß¾ªXñ„‰Õ¯7FdäÙ¤Oæu ’£\r:‚g0:{½¯ð Øôrö?X?mîš—UáTPhUâ­3?ºú*õ‹©ä$ÞvëÓ¯*5Ùë—@ y+dçj ×Ä›3Íf?íþ<Ƭ]ΖËètª ~‘7b’‡ìÕZïŸóÇYwR IˆÀ.­_þ•³-ëL³+ný.d÷“ý‚BUa´†*3Ä`ÉZ&4_Ñøªñ=ÌËÆK½áŠýI÷ö§öêâc;GÝ·ÛSÓ¥z“ü蔨֋ṞЫ˜›2"Ÿdˆ€ÔÍE騴Ü|c®/bWòûè*È…@»6§Û!~èŽoÉdÅyû>o‡›'çï©Ð>Ó6@pxDšŸûÁQ>‘Sòõ›ÖÛ3biròKëõÁT ¾´"úà q þõi(Bç›_7ÚkÞbùi`OŠ9|±‡$fé•OоðÀi~ ñïUüý /ãÐ3˜Û¿T¨úé1uHÄq¥M0z×¾Ñ?2¶½¨£Ö%u7™B±Î =•ƒ¶9!N#ç’X[:ÆÎu}EÍJ*3ÊF\¶>³¥ûE÷¶ôASoç[GšV‘÷ 3ʯ+®ÛC>ðKº‘`§ƒã“6°à¯2QøiòŠ©\AßÒ®i< ~ßËÚÇ0"¬x”ô[¸èÇKñ”{½Ÿ™¨¬² f©‰ÆeYcŸvM˜xÇ=ý,—úÕS`ë݇—F Ñ íUÎQ#¤AEÍÁîò ¡,ܨ懶ߓ-“ Y{z“¦Ë©¸ÉQÏm†±dhVÁºÇºöKËWâʃÁ‰ÂE2jbÕemAÃ.Ýë<"Óðr> çJ÷ꋴļƒù1×ìeøš'é˜ÞdrÌoѦτCÙ™’¢å`«Çø¯?ןˆôžæ}˜•$;AíE©6‰Š'hçYM ÊÃæƒQ2Ì×`PCÀ‹lßõ^•·h†ÄŒ¯¨Jv;ýðµÙ6›ZÅÖÏî’nHÚ¬ØÈõ– ƪ¢˜S h§Ax\#ÃÚh óJù'ŽîVWè ýU„ü¸ŸíÝî#ÝcŽAM )Búëþ5ϲuQa9hmbW¢é)¶?aVµ$’´¯½Ø#)¬¢´º ˜ýCÙXÐñkÁÌ!þ˜=+Ñ«¼Ú©R4w–‡º3Õ ÕI”z)B»·ÅèÀ×)Mÿé6]þùÆ[þ¨~B ¾îxéUЀ(c”­¥vÅBÿñ’¾C Ç‹Kœ<•?BÌÓzÐS¥wz™b7*PŸy˜×µ÷¾ Ü5ìS;¿ úê?7mš™›šüJh•Øj}«yEÕUˆ_Ü\Àü“"è#>‰!Gñjj/„í‰ÓŠ·ÉáVªS³qÅC¹* Ì®$5¼71èWPA3@†ôªqþe¦ÇKÿ:B_ã©HAS‰ñ·Yû4p~hd´åÀl¸`@ï2Êie2ªŸ¿Ã¡Ÿ†³SwJ;ü§ps]k, IîMÄ,ONDµŽ¬Î¸ÜÁ8ÜÿÍiè7oÀGÇû§ÿ´©¡ìÁÒüKºåX‚À%·w÷ è …FœKº>âÎý‘BñÞoØ/Rå5™ÔëÒW뱚jŒD•ÂX `ÛK`ò¸Ü]¸s12ù3fègÓsÉýi3•zø]x]ÌÊ‚€ßGs¥M%+1–þ¼ø­ŒíPÀpݼœñ™‰>Pð#;ù›3Û}4·ÿ°œ°šÃ‡n*ð…¬§¬0ª 7þãy?M‚¬QGõwýŸ¤´?ÝÙ’n*/ˆ7sÛ‹WùE~nÇ£È"õOºh9½íŒ¹€PN¶8š’î »C…Ü^§c¦¸)|(›l¦'¸(²¤‹Ådß×Ö÷î”ÕxÂ~ÚSä¿'†t·ck×7Ëp­ˆN_@K6н5CMÃ8y¸À;'…ºô¸!úÜ.Ï›e+6peK)@ŠÙ ²ï[ôEªXŒud™ !cz6™ínüäãü­!TøKÙc®v pÁô‘ÃzÄz:1¯ IIe_9ûFí—¢Ùöd±D>ï5“|“>·¾èI $¬{¡1²_•&‡±‹à¡ýybh:¿  Q;0.Û¶ET÷¤ùÄ’ä QVˆ#·|S¾Í9Næ5ó‰úÕ®|Uœr캸¸ÇWJs‚ÐMP$€í‡U&¾ê¾MÏ’ó…@éÒ0~ëñ „*ÍÆ03ÙFZ•×?0‡±lõ-éÿ~\ÃŒ‚$yY‚8e„°eËÜV¯˜û}x`\8´¹:¨z&k+f©¯±lFáE‰]-s&=¬JmòùzžzLiIl$ßÀê°vu·í¢úvX*¹ŽX”lód°¸'%hh옧_gY¿—å:³ðªQ[¶OõDÒÓ5¸f¦Y`ý캻6&Wξq^»Ù½Qcl%>ˆàJáÚªÅPËK”T}‹ŸŽ>çoTÎìU¹Q.ÛDxÑ‹+|6xØ\7»Šè¼E·Ôi|Ä(Ô}ñäp쯶ëî­éEÓb|ÁN@ØMps¸_¯ñu&?”?Œ hŠãAd!Š>ù^txÊÞÙíUƆ¬6Œ« ap y\¼¡ö¥_SK’Îõ«…F,ËXVÓáK„¿q± :›fº|›y¬jç¦B§¡– P“kˆØv‹×*P‰X-Ú'ÀÆ¡@:—FúÓjâkɽ{ Ëë*ÿüƉú}æ¡ÒW9á”™)ª?¦T_ßI‹’£×˜®C_P‰åyºÞzFî¾ñP—¯!‘‚{ÄÿÍ4OÉœö³^ üU1¶çê…ß;¬Ä‹¬°¡Ùà6Q§§ÓËFH,Q* ›½BE9vÔrÁ)ój¥Œ †Ø 6‚%“âdùû ‚² 2®¯ã½Ø-¨m@¼i`kíÏŸÙþÝ)³°ã¹VÒ¨Ô }%¸3ˆ$ä>ô- âµ÷’#=¦ÝJSDûãˆãWö§Äþ)lÑ‹îãâqÔÛ~]}Ré°½¼nÞ?Sùé¯íÔVUfg©~ý†,w‹²0*KêR%20¢ ›”øK؈Z£¼Ç¢6¿©"Ø0_S ‰‘äT!oW;ÀÕkeŒ‹A—°$µÐ†éà-£z°×½£b 7òÚ¡ŸyOdb åÑ€L}³×‚¥ò¹#™eF+VÆ¿­ß:–õÙ‚Ý›¤u‡­HÊÇÆ6éYoð´µëS„rjÖÊ ÖÊm‹E|¨élEðUsÚ–ô¶:Ž‘“úI ‹ª<ÁmÜ„  1Ê D6h”óíJÔEÜH±\Zð»·åQèäOªÉÚv–å!<yð-ÁÄ*ÆWÙ¹*<ÔJò—âO¤°cS³„VÑUg ô¬"EúcR zØuy†*}´t÷KÑôØLë)~%¬iåË›Ý,êŒUZâÿJE …qV @†mM7·‚Âs»üÒõ•cç;;R]6>¾}÷ÕqçÝYÆ«Ñ=~ †ö‘Ú/A;ˆF´ýFCBg7K‰¸×e¸áb4íZn‡iyl¸"'z¯›jlT”/wÓ`k¦Ð{ƒ-ˆŒ!Åé&ù)jYàãO¥ŒÓJòÞ×1€ãglsš‹»ú+ïÏD>û2'æ?äk° g“VìÍUzÖ:ƒÂɪÐ<âá#*“4¹zÛê)‚ #‹L¦ÃSRKýu<²ça³À\RE2ú¾x¾“´¡ŸT3ŒrâF¡å)½¾p©XøZh<¯1a¼+å²ÌýqDï-²gð’»zô¢ ìGß•øtú}HÁ¹1Ö d|:˜`ùDP¼s›í/@]¹öÞ'Qâud¬Î£ ø…v^Ä¿|¢|9`θe‡·ò¤ÄC÷¸¸ö¹wýÞ]G*ìt‡¸˜ zÙÜK $Ñ·+‡z‹­ùGöÒe2Õ± j SPŒ…¥$¶~_D$¶EÞRúýY,H3­ïÑøµPÊÑþ©B2^‰çÄÖ‡—VÚ肞R\¹¯ú=ÙU*X9mû˜-âµµ¿F2Ÿò®ÌfTGƒd]‰ÐE¬Žž¦#4”½Q.2l¼Eù¥Y«ÈÆXÚ85€“eýÀA+Èß.ÊŠÍ*³ ´I³´`5ŽÐ7Æ$ð ê¨E›’+#”ôÖ^-¨á–n\iƒNÊ~Ææ¬¬ŸØ›tP¹jDÞ‘['sÏÔš“œƒ+ý¤õžÁv¾Üw¤ÒW–”ŸpIõç†U­Ž^>à“P8óÌYÅá5]]Ìoñ¦£fž5ïƒÐ/Žñ¬Ù¡x-Ágâ ÇF0âþg!¯” _¢ém-é`"žÆ7lOx55«í6A&Š’9…»!žøèdÀjuÌÕ–/¹¯\ ”‘”( ¢aJr-Š´¾:Î65‰ñÓV-G~:Í,æ hSÏ£Í5‚ÅÍûÜú(Ë Awv bêTír»ÕÃ’T/ù/è‹xÅÍ)ÃB <€išj`} R ! ÇG`”¸±ºªâ‚* Â}J}v×Y«DØä,¾cÖÁÛ«zÀ‰ß51 ¼‘Ì[€†Ôº·oRÛky‰FGÐú¦ð Úu¶8 :º£#8ç3œf°(‘;•å³É‹–—ñ®.."ç³ãçj¡Eœw®Ñ5|ðY°á¢Ü~³ôFDÞÔy§ôÓ®(rh¹—ß}IïÆWnÅÂ8D˜qsv§ÓèT|¹G 7_ G“`)²ÝjÖÝT… 9(÷…ONÄD¤$„>&ÇYÿÝý´±Í[:Ñ@Öv—„:ÁèZ²6tM3ÕáÝÁm”^e¶ìEàÑžöFsðï s–¤¡øÕÃÖõ¢€cN– Oçùl§ç—1V¸xe‘—3žƽãjµPÓîŽù¶Pø­ËZd¿ûÔÖ=K„´+ô‹q‹[µ§Áív· s{ïûû”ZWàÑù½êð½@¨h¤Wšp‰¡èR›® v:¢9²Ið;þóÌ×ËoŸÚ–•ÞĦŒ¢Þ–WjŸÆÉÂÜN%2°ˆ° o Jé€Q5Ìí>{Ü7?bxðøü>­_Ôèµ{|ê]ŸEV9e²ìt¨µOL+)?IÔ¡të +!ë1•Ædµä_Ð_§¬Þ/Èj~(‰e¯1~ÃñäÖ#C»*“VdÔŽ=<‡âIÂ(¸$Ûb.WâõÝ\³ «Dõ~¢Kc‘ l Ä~Ž}!V£o×ñš:Ÿþî¥Æä‚¿Ý ÕX[%gs9Î/'¹K[®N»cìL³Ú»µn2øÏ¿ES’@ÎÂÕX­UqsµËKë@Ó’¨ŒÂ©7jZózJ—Gª€Ýe]dq ÓÇ)¬;œ”y®h·æ=t*­/‹e€­ÖÝŽH©,ÈQX:ð©GQö/’17¾ ]ÆÛÃó :ÓBü~¾An>ßobï¼\2/Ⱦ:Ž,óžNûMS°Y7O¿ àÈf¿l܃ãš-$ æ{!ñÄTO>çlšœ¶m!<àf¾o.ñ5àî×2¾Þ-ø¥ aÝûÎÖà{øzktpñÀ|YÙ»6_?%ÓÚÈg¹­«3žœò 8 _íÊÞM®ß~óV—µˆjM„Ðö¦Ÿ»O|%áš ,â†<€$àtäæ‹žô^.×«ÎØZ$í~cí¦1w®i©1!*éPzÞKêYï²äm)F¨ˆ°…íç¹;<«J3®`(L" 'Ò&O  ¤õ…2!{[Ö3‚8b˜ï"—›•™ÍšÕ›´€,çÖª½yèDqg£Fžä¡Ü#ûk–îàN²ÞDw­„~»Õ#Z¼¸ìØ0QW©Ó­¦æpŒi]hšÝžÈ‰–zó•ÑÓ‡)±')‚%m Jâëè¾üHc¬’޹¼v÷]'*³2­’Ã)» W]ßO6Ù¤Ñc'åã´açåjerÊiwŸMcôNÅ×L5Íéßšv’ }÷³Y2ymÁᯠšžñü…Ÿ½d!Z+– Ý–a¡5”šs /D¨e †×¢g—bû~¦ÿ¬bò„sg’ã³9ƨ7ñ®çŒƒ¡ÂÌlûÄHM›SºsÑË}Ù¾IgƒÞYÿÞ­Ž¿í`ÝÓ=0-ÄßÉœœ¾ŒXZ9óÖ0:×r1qY‰& \™ÔšŒBÕù†Y•­úa¿ÚnNZÒDþ+Ëj¤²†z ô•/ü‹ßqqõÖo„ê0þÜy§EE'›þ0™Îˆ¬A¤q9¢£Z!nÓeÒÓ'Æúû7+Žï.¤ž°«õ.#-ÃŒŽÒÁ±#½ËáÛa jøÕ0RN÷ØÿÚý±UùÁf· ÀBÇvJ:û’›ÝÀ)ú˃\3À)]µ‡»JÎc< %š=##÷WÁ!Šã>´IïʈSÙa+Ñè2‚&ұ܄¼¶ lžðª$…`—3 ô¸—ÎÒ`ž¿ÄSÄI¢âðHåX'S…ŠÍU_šL4ë'MVÀNC’¶sÙqÐ×S¾ðçä\³w ëËÓEë©ùv¨Æw$s“gîX<¾åPÚ¼UF^æ2k—${_íþŸÃšLDà7ÐsK'_”, "óÁûg°¡^³-ã¢NëÆx|©•cxHN²±RçÀË¥8ñ-‹Qrü»y&2:&Ï‚\Oc¬_F"kµsð‘Ò½]g/”ƒ [Vll7|å·œn7PD½úì?ôšîSúUÎSQ5ÄúÃTA]lÆÅCg"wZŠ>ß¼\ð'ë§$ó©%GŸÛ6®’¬÷ã#© ‡XV/P¨ÃÆýtßI1¼1ýŽH\ Bc}¢­·œ#”š. }ÐÜ`‘ÛÍχgÌ.Ú%¦ñ²±?¢lûØ3+Í[ǹY_•©d™ÖžÓðq1ÙçKƒ£j¹ݿRhæÁçM…B"·Œ‚!d1„Îæ•+• ²}÷H%Îàseû¸¹<—¡ñ ÏŽ+T6ï¿8®ô2®VyŽðÿPviIˆHíû”´F¹ÃèÆN§µ¿E™–T‚-)u!w¾su¦ÛR¬*g%ê[±ÎœÿPnr‡$¼±®-'Å`‚í â?9CJ²iéazñcq´'[Éf%ÈŒ‰ÇfÛÔëBì0ÝÝÎı&#;7ç}Þg¤°™Ôü‘]xØæS´Ñd7ìÿùõz-âqQ Ã4X‘9Ïaj„Ù?5Cº>™¿rG@M+Ùµ‹×þäJâó{nþØ=bh½¢ýƒòÓŒöó›ÙÛš Eô_óꔣ¾â)K}ÿ0…ï2ÈTŽFÇÜöù±~ùñªÄWIö™lÊL4“0ëŽPæ¦ûO¤xb$«¬3Ñ#j‚™£ÇÊìKÔ Šùäƒ6ÅŽzÁc«|$rü°°}Õ ¿¡ÌCioÑ%Àl‘ÉjóØÜšÛ¯_(f õ?NÕ´ü²ôê1n¾"AD@Me|I\í ±èNa ISÃ0NÜ•»Í0Æ‚¯‚sŽ£h¬™/µK ëwcÊ(Ò]æ\IÊËéÉ}~†Š[Õ† °­¦Åèî#_1; •x…#ò>‹Ì(ß– e(÷}»<6s×S¨Ý  — CTƒ!ç×Êóñ†Ã-†Ó"W5 {úœAp’‡ì/—G•5 ýZ ÁAÊDåûuÈè囂” åùQqÆÎç ®Ã¶ ÅìsC0u÷õìfdõlŸå¼Öz¬'Z;+ýJdÎTª;9o,ÿ¯‘ê¡h¸ê\þ­Zk¹Þ‘rÉY;¬Žg±Soª¥ Ø t*7(4jªc†)ž^=%o™$BÅb2\óÛ’[²±Ž–S(Ÿ8qÂy`¢•‹yÏQ¸Múô›C%SäRݹ‘aM.ùK×®© .¸˜¬‡ã••ò…Μ&WçYn¥„POX·ßc7š9W‹+Û%_‰Õ9–2×Ô`­‚5Q¸ µâ ئ –F8ªF4äâ´Á×ß¾š¯—ÜPV¢å`ZØH ®sëŒ#fq¥3Ph§#©µÍØ!§Ò0<¶^ð¤þÏDȤ;òQèâç`<1œPÆ,²ë=åâL–Ô“høP„sSÞ^Ùœ©=ªì¾K%D¡A0(ý„…E§ ^§ˆ0jÌäš½ n†ž)ýsX=¬”‚§I¨±ö†Â” ‘ðîPCîg¡fŒ9,ÞpË¢~ö–‘T¿å×}°Çtäf™É›>kˆÜÓÉ!QŒp®·q2dëaŒdÍŠöBª‰,]ŸðO@3Ò4áʉºú'àT)"ný›BýËד®¿´]¼[žˆzé@BËͨ•¢—äjô}…ÏÍÒê’êп‚8¶7²’7!X YwØ5ã7%Ÿ©Ë^oÑS×4fûª¥DœÐÙdñ=¼ ŽSãmÑV·lQ¼â5w6p¿TÉÈ2Èn—9Eãë±µ\g”'éð]°Hüñ>Fßüp ^‘ÚG¦¸™,x„!A.U½4Q‘&)+áƒOiY`>¿Åt^ɼûŽÔ;ø•Œ1éŸ5è$.sj¡ËVÉÊ»EÀ)Affˆ/e3Ph69¼° 6Ò˜Žõ´['ãÙ“N¶q$>«íÌNÚ`áÕ-ˆ1WïºIð[8ë$F «íÂîñËH²,tõ-ïK[vcBiþFÇGhñ•–‡hÊ0éw²‹BM»Qù*$ûŸ¡òòâ¹ñ#LLƱèC÷Ât=ÜÚŒ¤oüZH3-C¶q½d-.v˜IùWø{Ü…y½ â³P÷T›8ÖŠ·˜áB%xZ8~ä[¼ïÕ•#¿\Õd3Á?˜"C²4„pÜS­§¬¨ü($ZB۴ɲ¯o~èa镉[hÕg~s9¶¿åÌ †hÈïúöGä5ÉŒ °L•gav H©¬dQæ‡F&k¤}6ª"f2ßð–«üu­Çx%:‚ÔŠ õg§­bƨQÉCõþFm9ÅF¹ÙÜ­ÕÙ oRvÃý÷¿ÜrT‡SIKAüN0¼ÒçJÆIÑ kÿ''û$ò^Mra¦šïÙ„¤Ë$ZìññÎÆv\Ñ[ñY"UŸJϵˆçèEK”^zI÷É/¾í‡oõ¹`‚Ä~€OáwÓöÖλR­ƒQ{tÇíÃt–É´*½5ù&}Œ#VlþÉ#_á<Þ(†— ‡Ø6´‰B®õq»–«£0MÎc_C¸¯ßдŸU e‚/¥¤´r†“T§“dØœhu Å®µ‡Gäœiá"¥I›)uG™nøÛŠnÙ Ál«ìYÁ}V ÚŒO;﹦šsÆù»è‰ÃqÃÖk| –®  AþÁ5©õQ\€à°6[ŒÛ 1,E2B‰w³ì60ù¥fìÙ¬ºÝ"Uõ\~˜3Þm“m€Bõ/<(†­n 8FâRŒ‹¾à¾ oÊ0¼<ǧS£GÓ1tV±UŽÁœá ³q‚}|T;`>K¬öBÃAlÝÎ7ÚÅ^áÞZôþ›˜@X¤ÁÁQo˜Tk{Ö¨Hn àšøÓ+òwª·›|:7ÐлÚϳŸrO´ò´d6Ö-}.4 kƒrÌ?§ñœõÉb<òJø’’ mœ6Ô.T°Óà`ÑYv$[ °:eËž7¤½DÓ0mkÌ2WY2¨#‡û3Œ?Ã{“6¿5¸/¶wyàE*¢áFùÄ@Ër굋N÷7)—& ÅP¿ØÛMÍ»‹ÅŒ]²béÌîØQ+nÏØDÑà°ø+ˆ$/üd¬Ò˜>1‹íú¬ˆv°9w]2"õ¹öÂú»ò‘_ͨ®p týBøÕGâóQE9ñðѺÄ1±3ÀÁ`µ8ºQ^‡{§5R.IN]i3}k°ÄÉvDa ˆWØÕ•ýDö`dD¾hèèhýüì+´s1½þ.ßÎÀ®˜[ ZvÚÝî&_¹#Ø›ý@«46žtÛiÑX³ ó×Ùm¹ú»«j_oO´Ýã.¿úÀø2ul8Ãaávç“«¥ôì,Ðe‘Ãÿz´…¤ë~üÚsyä‘}lÇD'3¼„)˵XˆYËC‚jë‡ç=I¿¡ÇÑ[fŠZ0”Û„jwApA2!B%uf%‹iª5õ‚]V lÅ;¥I!k·«òÞZ¶´k¬_‘Œ}}Å–óR*oÛ"R»¾97´ÞßYŠ >eº¨s‰¼kB‚zÙ7: Q³4ž|†ý)Ïýº] æWIòÖB‰0·@JgpEŸ;ÍÏÒ2½HŽˆŠz¦[웣¦4Á”_Ëæ)oîg×kjÊ }Ϋ‰A¿÷õ®IeÖõ¸K«ï·ÓüÖFNöå È©ý¼e jMvncåf_¾T¨¬ÔCõû° j€Ž°sð³Wc †^S¼62Ö%4•¹GÆR¹ ù7|Œ-| …k)Ðiú³7ÓN’’‹q)ŸîáN R8çÛ˜~h+¶•Fátªœ)áU ¾ú¬”ïkÈd³M=Ûu{_÷ãþǾÄ'ÊA9T {,åÍçëN•CÁ#bñ°jà3®¤Y° ÷w¿ó‹.!‘ŸõÉŠýq¥Ž¶¹{T,[j=WWÅÈ%BAhŸºˆÙ-|O1~4ˆÜÔZ v§W³.Ÿ›\{ƒwœøÌD*¨aBhŒpÿ™—Œ endstream endobj 1195 0 obj << /Length1 1612 /Length2 16806 /Length3 0 /Length 17648 /Filter /FlateDecode >> stream xÚ¬ºct¥]·&«bUœÛÛ¶ÍÛN*¶+¶mÛ¶]±S±Õõ¼oŸ>=Î×ߟîócq¯9çºæ5ç5׺Ç=Æ&#RP¦4±3ŠÙÙ:Ó1Ñ3rä,lŒ\œdíle蔀f.€¿FV822aG ¡³…­ˆ¡3  4ˆÌÌ&NNN82€°½‡£…™¹3€RUIІ†ö?-ÿ„Œ<þÃów§“…™-€üïƒ+ÐÚÎÞhëüâÿz£2p6L-¬ayMI9q¥¸œ*@h t4´(¸Y[d,Œ¶N@*€©#Àúß €±­‰Å?¥9ÑÿÅtœìÆ·Ýöÿ¸hö@G '§¿Ï '€™£¡­óß8Û,l­]Lþ!ð×nj÷/BöŽv#lþúþ‚)Ø99;;ZØ;þfUû7OgsCçr;YüuìLÿFšØ»üSÒ¿|aþz -lÎ@wçr&NöÖ†sÿ³w´ø ' [³ÿd@ pš:šXœþÂüÅþ§;ÿY'à«ÞÐÞÞÚã_»íþõ¿8X8;­Méᘘÿæ4vþ›ÛÌÂŽáŸA‘´5µ01þÛnâbÿ>W ã¿DùÏÌPý%ahbgkí0šÂ1ÈÙ9ÿM  ü¿S™þ¿Oäÿ‰ÿ[þo‘÷ÿMÜÿªÑÿvˆÿ_Ïó…s±¶–3´ù;ÿ¾`o;€ àŸ;ÆÚÐñÿnhcaíñØð_Õÿ&ùÿƒ#élø·‚¶fa¤gü·ÑÂIÌÂh¢`áll05´þÛ©ÙUmM€ŽÖ¶À¿Šþ«™:&FÆÿâS1·0¶²ý§õ¬ÿvmMþ+ù¿"ý‹:ƒ¨„”š˜4ͽSÿ¥ðW{gû¿Äþg)²v&ÿkñ†;À‹îï ¤cfa°ýMÈÁÄäóÈö/¦ÿ\Ë:;Z¸´ÿ–ÌÈô¯Âÿçï?WºÿFÔÖØÎäŸYQv6´5ù;^ÿËðÛØÅÑñ¯ªÿ:ñ þõ¿tí-ÛsY¦f¤9×~ÏžÑîïe¶/iP)Ì÷¯¶ëñK Ûá¬0x¯ ¦oœæúlóX:³ÿ8¢>íÅ´¦èIþÉÃó!¡êËGÙ"ï`§9 `Ð+AH;WòºZ”ù ¡Åƨv¸;©¨¤Wü…?ÝÁâsõDåOâšïNúhèkœR‹Ñ‰Ü‚Z[pvNžxòôH1862<ÔsÙw€K“ KÆmøÝ÷×Q’³‡ã}ƒñ'ä«+»Û.·b r%8ýyRk”Ϩ3á•æ`“„àpX{~³%YÚœ¢_ö s™r&óXQž?á²XÕt#ãÍ@ÿê¶–Œ•j§¥Á]÷·$m&L‹/Ûæa Ÿ{é{ä}Û&áÞå¶½@’AÛvb c® —öhël¿ÞuÐ7#±tØÂ»2fÁÛ;Ç ÃcÐ^ G1Ócé¤x]Óoïžì8ªE†*é¸g¼M™ZØy ·7«ƒ?»Î7ãÀqx‡V| dvK8-õ—UjòWgG‹__³™>P`º4›ï<éY¶¾â߬9,!šõHËß{ßsIÝŽ©ü˯$´ á‡Tª0ÎÖ2®¿å¯Gêý:ó’†Ì~Aô¾×À›ð$i‘_ŠOs\. öüIÜ4Â[»:š`^ʼnÁß;×ë/U=IaºäÍ8ïäy*÷>ÅžDžÙn V49žÅ›ãúæXRÀ(šü@èKåwi­8Öï¥g€×fÚy)M†@^š4ó-ñù†KiŽÓtÔP‰ÂI ɯ)—î'_8è»c¬8!Žsß—lYŧ(¨kè[»*‹~E^yO‘Æ?ƒZ9¸UäœÂµ_µ+àP|I{Â9„Y^NÖÑô‘–©×˜~¬Òã~-ñ1Çà#8:©°¯¡£®mB^Ê€ŒDIút/-­²ìrëf(’0#èEªqƒ_¾’ŽÒjèšêÉ©òÖÎñûƒxÔÁï”·zèTÁ¤^sØ·#æ?L% 93©êº Šð ÒCr”±+ë*<úÅ)áDÒ¹X4µ‘õu¿›´å³, ²“|£¤ñ{æ eÑ€Fmzœí5UFÊM8·Oèï`A[)„ñ‡=”+DH›.Æ&õŽbbóvÕÕ>â0]OѼÀ-ýs `Kêò†çað°oN^W÷&%§Ó›T a¶Požº—¤½PØå+ürõpё颃|ɳ'Ïð zÊ•²ºaˆˆ¬œÅ§8ùi/ñ}b€ÏáÁÍð@aXm:ZœUé}]Bì™j‡d0}‹»M×ø‘äÁ@x›Æ&D?Ľ³79§†‚Ætº^+.-©UÐ[wÓ™0¿<ë€Æ|®·;¼sµF¯ÞŸõ|<ÜÕÿmTy_}ÙÙÁ·UûëÇQ-•Qb÷¬äýà¤:>XÅ.ï}ã)‹­[Ðaù€LÙ“?nY[’+^ ±èögö¤$ûR’¢ÓR¤‰§šy VP­Äœñ µäÆô×h¸œã转àéy´PZbâ_…Þ´Ÿ…ùR_p‹¾™Ø¤DÇé:Hûvh¤sಎï^1Åå#ˆmâÇùͱ¼I\ˆ¤u¾Êû¿hX/G‹Ï5Ž*%bÒJ‘jîês‡‘•†ÐÞ ýJ0\Õ Ä%tÑÚNEà ð³ör¼HÑþíÐ>£µQÉf /.Y(¿„8åkr†üT€ä‡wIë)¤Qä˜×fûÖ:4H…”rHvy I³ I]'ö_Éö" b÷4ˈêæ¤£Xà‡vn9ÝcŽ?Á¦d{pÚÆjêÑ«ÏãÞ·=Ó™¼<{zuîSb F$?ø±úõ¼7qk¾)yà-ðwŒ]zçã<·„!ÅÚÞkp•—/!:çuŸfǺ—Þ·çëÌ!p³cÛÀ¶kƒ<«yï⨠âú»Nºûg<ã×{³^ó"ÒÔ1ü¦ùè©3XIæß¸®Ì6‰z…ŸzÍë˜û]ï'$²€èxû@Ü™æP2µ…ˆEÈ'õ´Êd¾Üžx/Û05o¸Ù!/°e0yÄñTJÓs)hj”Ì/N'õ$@™mú*#ß¡TœÜ>Tù¢‡,@Ï,&HóDòýåöÃKì˜ÇR~.Œ1Ï˪âþØ ]X—\lu^½•#%ýH›ÿZŒk´öÀ@Y¬¦–dr]º}Â"K€ç§Yº++*h‹V;AÓèöÝ.PpþÃPè;ñµ-aé(¤Ó¢7².9¥Ç$&}r¶~€ì îˆ[xhÜºÓ §þB±¾` »îôÉ IJk=Ͷ?èÉZÂw¾2›˜ÉO÷ƒþmM‘,òu óT'^¸&á ÝBäü"—+oÈøU¨ÐŠß{B~/€¦¹U>(…L0$ ÁRÛ«Wx¹º Ã9ÖÔXX9¬w)eÁ¯çïŠ ü6b.Ÿ7 »>_W}f|œ %1ˆG°;8iíÍÉY=¬Ö(mò; ) ){P§]!¾5YQ‹¡×€£ ùZ«½7·¹_„@DÍc¥òPÞ½R¢¬`mG`K^+Õ•’ ×¥Ó€Â-‹Õ'~'B¿K¦,Õo.//F^%^ˆ3ûŒ&f[ŒÜÔø º!šÂÂŽ½³“\ž~ò[9?×ý°ÐDKæÑîT=0« &Ç€aND+¢ÚüÆ`¥gdÌP"áZ½m 2bóèaå¿ècX.æÁn6}ÈsMÝj‚Žó6þ§÷ŸÛ¹UhŒ§½j÷(Õ!¾ãÁµ¨-¦<;É.)stâMÌ 4´[Ì4Uî+·ØÄÕî™ÊÂ^‚lã)™`ÚÛp™ˆìÖ…ÅX€r²3F”›Š‚ ó9Xòë@… )‰n]ª“È;~½_Êíc©¡à6ÓÆnÕ0„ØÞ$àÓ`û‘ß’×[P®ŠÍ+zñm‚‘jÂ9Úw›ü]íþL3ó~°žˆ,oƒ-Å:fnšÄ˜¿=~ÑÏJ[8Æü„ zÀ.ÁÈœx†'‰ï»ÑKëEñÿY2¾5|¦Ë,Ÿð•ѧ­z܃¤ˆÜ`Ñ-œàÐ=›FiF¿v,ëÜíR§çG P.g [,a(bV±¢aƹ¸NfÕÀFh²ãUÏΗð°ÓâÓ (×7¿y·^îBX¾Ã6ýÚèêhÉ2X«ÈÝ¡‰bÝÞ–Ùg©´Øúšs•=8ó½??¾´A¶ÏF˜j„s\¬¹[¸´/xhÚô λŸ† ’G%Ž=ùYÕV)ªüŸçüõxå”Íñ­ß?Sï Þ݇¾¿?tðdRQ­˜oáišª!«<Í4åŒymן h4‘‰Wx° §ù¢ñŽ¥ê[ŽAÞÀJ½±ÖEš”¥<¾Óª¿£ UÊ“J:Xîñ=ÂGz/O^yø‚w¥þIy%¡¡„9O<¨¥Š•œSo–ê‚ì Ó³›*a>"öpwNC£i ö} s”ÍŸ¥$víX¬þá[¸2ч޳4æ-‰™)ÿQe:Cõ$¥/÷Ì[?´t®gY1rw~¦¹Ñ¢IÝèÍ)÷3”‹AdWruÛ¶×uÒ’øyU²¢DûOÙ#ö²#Û×ÍO¿ËLsöªÆø+ x&¶’N¤2M|¹_‚Ù×Éîñ†·™öƒ }P®¼eÕ¼PHÌ«1ñpÏâ’³rH(På' e¯—_}n–vÆnˆØS&ï",€Z· 7í7×áoaÐ,Û“höTŠº ê6𧞊\ñŸŠAu%¯×b ì¿ð³8R„¬å\Äa|ƒŠ£‡,‚Øò¥]OúMÝû¢‹aiB&t_¨Ž•!ÃIÒÔJmoÓËÎè,E"ÜÖ½¶9B‡)@½)‡F ÌßZà?0¹˜_8%L¾ï‰û8[Ñ_¨HøÂXª_„Ò Ðm’´ÐƒU¢b]OÕ#;+…í x ¯äÞÍI};M—uß–é¹7:zÜÈlÑnkÛe‘öM™¥[TÇÃÖý@b!6e|Á8.Âba]”áî+BÍB–·{Ûà'Üïj3UпÕQ‰áIä+œ–\”N´jª´ºü£‹ý aâê‚Nhȃ=é~´5‡A¹, ¤$Ú·K’ÁÞelØ‚½­ôÞQ”NŸ‚~t Ó²ú®Óp"~bú˜Ž´·RÅ´—¥£ïýÓ´‡€- ”ÄàBÿîW”Ù,»Z¢è£ëÅszÖ'ªE<)”n×jÊbzG>ˆ) &ý˜7ÿü¡}ü%† ‘ÖÆ¿XVù7¾j6Íî%9ÈÌxå¤Ó€ºvŸv¸eºù[˜ tãFÏà¾ëÉÀ÷ç€k˜nQæÒÔX<ë¡>˜VG3uœÇÛï‘×,Š%Åý|þ”„hˆä` ÃÖ^ ‘k£ÈÎëí",m´uý#4Í“Ø×Ü›šŸmÌÖ¿ÇŽ:Y¯ZW,Nâ‚?wÐ"ؼ˜õ<ãƒâo º}jO‘Iµ9QÒd¶Vpü}ƒ?¦Pp¸Z–ÕoÄ„›É!‚¦_—; fþN¸–ùhhws뺋òñku·Ä1réâïÖó§]o¿ûzë\Ûz |Ùômö¤VÊo_•@85· ôyç#³¾~÷f7b Æm%& êàó‘Êfq …a\d‘ºd‡û[°oÎÞÍl~5fæc‰N!{™‚=§…B\šóƒå[ Û*\¦8à $¿eeÄ{Z]˜Kƒx{ÑøTŒðYïsµض±HÊE‰R3\«*„Ãø-bíD^’|sCtov¢ÊsÉ…›¦­å»+UZ+”¹î+Ûl]Vá xz5­løp„…Iò¡UâŠå}s5‚¬m4ívÝù'ÐÖ\¯rGü ¾Ú¦œšþ‚ôö<3P Q¼†e¢¤KÇ̱¤¡Õ·ø9R8Óa¸[±lL6óù:ʶ&Mí¦óçExìR9dB’-y9yÜö”³æËƒÀèÃv^ä„u¸£¬þ¬†Þy”ºÔižÄ]ªsÞ¨a×Y¿#h§œ)¨‡‡ÚÆ‚ÙðŸpÛÑàFnqEùý_6ÍüÊ/æÒ‰¶7¯ C#?ÔíïókDC'¶Ò¦×D åÔ8Õ:2WS9 erÍp¹ëÞ,¯ZòÕ$M¯Ó«4>XyiŸé ³Š¸ÇüŸ´uÏžËi@NAo–¿­´þ4!JzTPÝ&´ßÜnu#Vëy¾oºTòsË¢rKoµ&Z;¡Õ}Cj|šö+ ÏòK7x0ó÷Ô«+ÐÊO¹‡8ò§¯Ëe-×—ÐÐÁÑêãì*riPµ9iJX†\‘QyQqöókL=ù©Ž\U;"ù¤]†j•xæiuÊÚˆÄÿ‡ªøKRßMfªG.ÓøŽhÏ;Þç˜ñyïýÐ{ å'Ó.WÈ(š'Âá9Vruf¸È¾Ú"Ó¹b×ßë‘èð´ž4s‘L¹zc*gÓï¬)¢¡á¸–—]ƒš´*$6`öðf¬4‹ó pŸ¢‹’KjPIRËJ|6@k!·>«ˆö/Ì¥Š¾í³éU¨bcפ¢7­ÿÒn53^W’ y5Iðä«Çès±¡I ÝðGK;\›7÷”?ú¸:ìaF›ÏL«b#sJÖ–¼~\êÀú6GÔã£TpZµC4Ò’Ô!2–¨%霊i: ×Å·.\ºP™¿TOhÔ‚k5~ãb&l™ÇZæcG‘&Q×-+?vû(ˆ‚ßÿÃDÜDá&國¢Y¤dŠÐ1‰«9=ËóõÈo7+„¾âN‰ §V9RòæÒdãø^‰“HM_ûõËï4y¥$Ø -l­D¼þ±ÅŒžš½Ö €Sªõ¡1vÅå '„x\eÝ~ár¼9Õ–a=ôìI¦QøNú<útlÞã‹Wˆsö„ }%âk»íŠ<î›eŒ–åMQÿè¯[K£/*J–3È4žïü2º †[ÞÝ~ùPx \,ГíIµi.5ÕÒ]8È”/iÍÏÇò 'Ës¯rh–eÔnýå52·­—|Ç}*-+#¨a´é¼g|5iaŠÀ€"±MìªçW‰—†R¾Å?EÕ]–$‡pšl7†f_ä!Aœ2üPy,,áC®# B§DôŽôåDŸûqHHä^@öõ ë”U:(»òññ¥dŠY&ÍwŸOa£p·äJô‰œˆò…õ£_^}Çþ\•3ýtZ¿KWÄÛººÌŒ’r¯{§k–>ëk)úò{¨f¦M>:òwŽ£¥âê•oøÕÞÚaA¨~o!·ÍßôY(6´ä_©ù¥¼ÇZ<è’Ž PÈp©Vê®Dåpu<ÝEGß?ÂÝ+„àg¢)E·ÈLä’iÌ£ä ´·y$œ2»×BÆêøÇÒ€ñÝ@D £EÿîV[ãíÙÔ\ʺõ{Q$u£ÖÊûº•ŽjdÔ:LŸï0ñéÚU*žrï0ZW§Ýl…NÖrü%†XI¨ñŽÔ›ÝÓ›»œ9/ð8%6Ipd¡ü\yåi=šðA,2ã:¢šŒSzò|ÈúM9¦ä=ÒÚß|‘¾ÂN±õùï²îÅPóŠH©¡8|i˜@ˆ`“]wô`Úå¸@3&ŒTdý¶ùJ*øºúÇGiÄcœæÙ—²;nlm-™#Ã! Ä Ý]‰Û.ð¨k’ ä†L¾ýð˜ªU2 ?Ìâê B þmrv.hè”w ëÅø76Y yzÚ’›UìúR{Àd’ŒNÀžÃçã­hzÏŇ}b!¢gk„“JFµðάc]AŸKñ]—d]×{ wbʉ÷è诡 Š5|ÝóÆ1æ/שjËãAÓCÊɶCY"…F-.V çÕÜ ðïêÛ²Ñ-*©èTDLhÓV` úh,ÚBŒ‹í4ÁÔÜëØ8¹TËN`@e+Ã7ä9G²×„}¼–ÞÑöT§9½>ÝíÙŸÔ©–}Ø¢Šêæ|eªºßñ_Ì~í1™ÿJZ~< ¦JÒQ'?ÏrÌa{V4óÙ~€ei ÔF hl~Pø½÷íM$Ð;¦JVîåéÄ…˜rœ{;­²9Håô—¯I ¯Éhþé±Óóæ3—ÇÇa…ÐÝìo®ä M‹æ× >tðSó“d~ÙE}¹Ìô<>{ß°‰¡zîd5¯e_ùùýÀ¦*šã8;Öo»2(+¿" R7RA¼$Uã‰ÀòÌü/á¥økÚúèÖ°ã>“rŒ"¡LvRÓéZeS*¾…`Ð&]sí:Íí½ØŸUR°ãâì°Gڎ۠̃Ê8Ìèîø" ž=¢Ä_c'¢WÎrZ^?¬¥P œ¶ˆ{Yûö`çè Ô–H_aŠÏà æòB÷è„%ª÷°¼Íïºðàj¥]:¼Ý[ç ùZ¿w2qË8ªšWº ˜Ò&‡³ r~[^[ìÚEKþÒ\Ì]åyïkX¿õOt{‡k– ‘ˆ¶÷\¨éä¾£ïí²*n «HP^oKôÕ¯`Œ _‘¢Y7QÞõivo —.§åÚ?2Çèex¬òšù$üBXÒŠQvî׬§²â ¡(b5±ïºÌȺÕ%„᪈WQhWùD‡²žÓ_ôWô0è4”oÒj¼PgwF)ëÑ þØ?¿Ê¼o$£¤˜F‹JõA^Ñže˜ã˜ëû2î4Ã'î§kˆ4ò,ýM{(™ˆ^Ò‡L¢ô,­;Ï(TŠ×4âì{dj¿äè¤7 ¿«‚\g<]ýcKJ[·+*Câ%hˉæ8/~мã¬êH?7y9Ë‚Bª‹2a ­.÷ÏévŒWo©KØÎ¹oêAÎÜÌ–Ž&ïE-B"cÿ<ݽácyFä²þ•/ëåKÓ:Ùòoâx INM³TaTÀzn5ú„ç—ºò®æÙ‹Õï}YÂ!ÞÉÔÀ‹k'JOÌEóØ]  ãÂ}ØøœP¦ãžE~+´ôˆ®`˜9ï•>Äkw£×}œò;pûbºÌ1\F8¼`ÐA55šF‰XP¾ë»Ù'²I }TÔs6U9ßS°$áðâ–”vavÊ1mî¨LË)Í¥"¨Η¨Sy‡€¶‰c`x!´­}úâÒsqœ fÆ êfÑ¢úe¡æN¦bOGp°eOÛ2v] îðÎ?7糞“Ûp.þ5’W!‚NPíKJñIL¯Õéå3û­¿‹è¹yÏ1ã@|~¤û¨o;  N:»5/ý ʃXƒª…÷"§¾öTð.ó>¥ç­6M3½ûA38zέJ†Öc ËÊRÖH7Žê9h3FÒj4òe;‹9Ÿ ‚ÅöklµäsmýÒ°˜þô,+³Î"ÆfŸ7©hµxï½­BýÊ=±’ÆqJ­®}VÞÔµ„Iwÿ®(¶ä鬆oŠZ ÓC¢¸{ˆT$³Ž77¾Þ«÷ÍMêì‘oØÕù\ZÈê Êr/…aÃÀÊ,ŠÔÂyÉŽ-]¬×û²‚l_ƒÆ´á«´)‡§Fi¬GÆz±gNöì­þñwƒ[ø¸kÓN¢¹aYäÓh8–,á†q31yùÖ’:ÚTlò’Ë¡#XÐóÏ8ò^¿Ùã)nÏ$+^“‰NUœ¼–SÖÒöbDVêí$¥¹pñ¥³íä|[´Õwjæ:-–5‚˜êd/3×dÂÔ{ö°î„«Pnöï*öAüÁµV–„Û»ï AÍRdý%&…tlÝ +óSô¹U£ÆAìàE.Ó ²*kÏ’TïYy¨lbù*%É5Œôª  ÎÆ’ï38ôw7ª“Þ‰{YBßó^Uc¯®%tjâŒ|ÆX°ß$vLTðIQð’o‹ 6~º¾ô&&›½5‘qÀF.|㦱LSq7êl&±ùs=u5r‡ÌÔ‡°ßÞ¨M8ËöËn £ªÛ/—a„¥ï)ì?×Ö#_7­\q}¡ë«: YׇÃYôhC‚ëal_l_nà@G¯{íÖ'¢‰´vr®HòC%§¹ðRÈ™û JB.’søÔleÞ”ËèGºmú<Îê:g¯æD{X3玚<ÊNÄqïêßX14BÊhG±÷û¹T²æ…¨0ø+]Û‘¦täÝÊçª-*íàÉ|qNÄ Û>ö¾>Hɯù„Õv±Úv³(5>èz²J ØN¯>PJ;}c™ðæË­†‘¤áô®¶Mò>#¯ü|ðœ$å‘Ñ­t%3­LSîÿ¹}Î-=7PùJ3¢×&Žøâ~r–•döCzÓžIÇRÉõÑå1k [B<3ß®‚B+¦eée‡¥Ÿ-ã 'lÑ¿TŒ5Z+é?4§+Á¬Õ2C­üØ¿UªÊ·˜½eÏO8B€^YoØ¿2zzÚw‡¿&‹H¸gY-8žª•©/ê›Úkðö—WP÷²AƒÙÊ”ÑX÷,›1áµ_—:*9ð´ýø½°¶’»ìAsOA‰Ð6”9ð-?`~-ˆE?û—"R–q{|ÃR€zƒ:¥Í*FVÖf§¤¦Óã3[Ýa‹­/J9z¦4ʉõø¥­#FZU=ÃVÿº VÚÝ© ,Pj1$é•áo à%ëèáô ìC6ÀнòøwøøÂæÑ~ŒïS1Î ÈÝî¸,bзKdvˆT½¹hlýbÒ_Ä{üül¯a­znÒÅd”ÞU%Påuv}˜Z¼ÐÆfqNõÏœ©óõ ⊿p|°û1„MýøV‹vRa3U뜹ªi,†ÕÑtJ](ïÚ3©øûâ÷“½â6&ìõ7!ˆ¢1ˆN/$>ݘZ'§Àòïâ…jhãè샺É3‘gc»ùÆëè}ºV‡lgÖ4òZs¦u}µE¡Õ8’ÔiÐgw†+J…µÏŠîK74æ´,t(óˆ7œ^ந~a·oH…ÄØÛ µ–TU»&Õ uj+}’U6h í5s‡JÆ+Ï 9—Ó¿ ±îøv³CóÕ]O¯ô<䇭o{Øm;$/Y®öã—-ù³°oÆðÚÿ‰ôºc‡‹aüÁýFPa޼­˜fŽq(Ï”ŽCŽÈ¤"ûìµiÚ:äLæÐ4¬Ò§µÅŸA]©ÓKj*ò¹´À³UÂ5j˺É훈£XƨØÑ@*fÎé÷y‘vìe,‰ÜJ-Mç®CîÚ…ÂiòBÎGGt ¶‹í/Z¹®CØÛ'$Þ-ȳ_èôîÅ¢9wåÛ¶hˆr×ÄÓýpEuuŸíJåµ];Ê™°›J{ ë3Ò·:ÎóÔ†íÁ~þ­á¿ï,™+0Zîœç5G‰ n€s¸ú¬'üÔ„è è Ú§âPÌ «?iê=ØkÖL°ÝœZEkflñ¹õÖ¢lÀ~Lðù§Š7¢ïÝûH´Ê£RyÞΛQ¤‹{@ÅcßáÔ¥sºŸx79³®áuÞ%NH>š#}œÆè³rA7¥CCÔX¢**k[Ž&Ä–7w“c €¶ø{1Ð1ujMÞ`¿Šch‰‹sýË :Ë–‚ñî|‘"Ò¸}G<³-޹Iƒƒì èö×'•Aç³+å;7â«óï-™Ññyé´0‰K¾¬@+]ÿ|ØURjÀŽ,†K]þ ;êœ \œbú›ÝïÕ‰ˆ §bWPÀǺøÈÉbœBÐ(y©†BÔ¼:+ Îöu†ÏÞß!µŽ§ëlØ6ZIÊÇ{„²ÝA ýOƒ¸]æ$ˆ°?¥VW? ÿœ]ÿi¾í(o,YÔaÔ•ÓíДÝ…K¯ð¸…/c*­žTÎ#mPû;†G…ÿü¬j¢ €ÝÛÇDµbçñ3=¥üTì%²È+?÷­â¶Ãüö¶NÒ?Ÿh:D1!ùæ²P´sL”¡^=ÓIo‚’\ˆ$Î}Ó²(t'//þÚ$(ÃÇðss2ªx]ΘàM]ÂÎÎé"‰MÌÿsžÍYËAa³Å@Á–‡“ÜR_ Ú’H>ÿÄYe,“Dv®‹S:rM(õÓqb`Ñ„8sž¬ÇäÕe Ь :Öóû"[OF¨p쎔s§ mH{€Y6VKhÊe‹^—·ÂýOd¿k$~´6³úm"m i04ÖþìP®a‚k±î_l³ß¬x­hj¹Ç—¥6› D¥EuOÚL³|ÉÈ1éz*¹×È$N#H2îyWJy†Þ/ ~D>ò"´ý}GÛ•À.uüž)§÷µ´mhÃÞ÷ZU_iÉ—R°@k¦0]åv7iÞø]‘ÈïÕÚzä ½CWY_n£eìI™‡®öª¶"~˜Ä{©‡QÍSìLXÂéØYQ…á–'›míÊñvÄ=Òë°aŸ øl¦r6—¤œ]ØE×§ •dnU°:'÷*ñŸ¦Wîæœ¦A°}ﺺے7·ÜÁoVAŠÁï”UÐVô桢드‰óLŸ_]¦€í2 ¯ÖÕ ®þø¬WuuºHàæ·ì‹ª¯èÎæbªã¼¥V¨Yy³Vµ€î– ¯|ê¼ØÄÅ)uë=„hh‚ìq4¹ˆº0¡ÐðjùI¥JÈîÃ(!Àypm}]áä÷Ôê~åhq:½ú{+¡óKÝmèåý&ÅÀf_P&=²g]m=¾<ÛS6š&Ñêûr[‹* +f›It/¼ßòdgºº7ÍðÃôDà„Uij¢dz_»o%)¦×o+©¾»Â$<[_e®˜ N>ųâ–&tÁM†ÇßU”¸¥óŠv`Œt݉1³!x¾Â¯#®Ä¦hõ7aÀµÃq!ä{¦ÆÞ÷Fƒ´[Vi}v“ý˜/´ÛÑßù^r]Mø‹ß2Môõ¨ØÇ´fý·ÁÃêEuŽFÖUs)ª‘7îÅ„ÖêˆJqå®Ôñy(Á@@f¯$ÅæŒ|Mÿaîøã`¸Åækó3³ŸE¢7h:ñ R¬eIåg"d¦õ»žnÿr†H²Ä6™8Êwʤ ~Ïð¢­ÍûèÚé~s9ÙR F)e23ñ`°qzÛ¼Ã0´HýªÈ:e0‰"üµ%¬S ^»rxâÞœ>Ó”,‡_þ\;t8–rEKlNSC”,й|‹Ë%ÄäÌ¡ —cËQg¾I¦þR¸ éãÕÔf(øºöÃF¦M‘i´jHû"ßY#tš öÊK‘Y¿õŒ ?­î3²ÂH SPÙ{.P÷õ„7ßmŠd‡»Ú×PÅjnÏŸ£¨]a>ôѯM Ñkò\(˜¼6—x“‘V’£ìZHhhú 4§p¼^ÍUxÜã?ËC¹cŒ`o†cÍjö±Ü@T›N‹8„KW…à?¤hŒ‚Wëš×ÙgŒy"â+èZl4=TÝ!y(uY™æ (ˆœ¬Þ¸eœ?g|ûÐ0!‹‚©m µäÍ}Í`Aü¶cX?*¦¢öJ`¹û­›‡BÇ86áâ#+ ÕÈÎd:ê•ëÑvY"e­Œ»™Š”bé°^¦¿¾}4OÝ[}@¹aÞÅ~÷»Jú¤¥ŠEYÅz0uÔ¸ÿ$Šþê(ü$ÅLèžBâ±+äÍöõdalEØ2ÉD è@mÎyt§þj¿5áŒlB{‘`°Ñšã¿§7ðñªï8p¶¨œ ß>µ‡Vcd/Õ==4÷åqÖÌ_×Û ð QÍ‹.Ä7=óõGŒ$y7Ï@±äD¬ú®f·Î< ÓÌ”'›.þ‘Òþ£)LÞå#×[ð2ir¬2¤—{ñ!kôÚ‚ŒNôâ òÛï‚êN¥ÛÛ‘âIdÎ0EAP¶«%—º×Ò >‰ìÀ'XtæÊìâÈGv²Œ2]²Ð*,ãúTgïÐÛïZT › Í"ªâýº”‰ûziŒý¾¬Là—§Ù{ÂL€Á5&äŸ,)FÂcma^zÌ®B‚ȦHš· ‡ÓÁlˆ9o,÷\M–‰™g0ni¤4Îë˜ÕFØïhè7Ò@Þº¼³EÂr]l*©•uÔ}>1i³I̪=Ávb®”xÉãÓ§mÚÑÜ–»Õy¡²™?Sj‹õ#7•õÏRó­ì k”AbîæOëô2ª9ù­8o¦Ÿ¹T‚Ú‡pìÛæÏbÂ5 ?âÄcE¢!CQŒ7Zel :…Ñhòø‡,âMü©hú¬îk:¡)å\ÙŒ%¼Úœ„+Õñ–[¢§óÙ’íušê^ÊðÌêY"2ÒC”ÙQZê ¾X¡áì€áF–i¯oâQ’oÈѬÏã|t¢jÝ5[5@(F^'Yímo“NËWjFÑé¤\û–<ô¨¢™rRóŸäA‰—Šm*ŒÅX%Q«R¼']òïí(Êjˆ®¢„TÚ9àÕoLÏ=•†2^Òp3,U;"Uþ*‚zãf ”ÙäN¦mÉLpçS|Õó—D±NÛÆt µN©”».c±n&ñ>¶ªüOXÓ×{gbÇ=ÑX-6¥×©b;Bg$+ÙôwK”zLB¹TmCÞài û Ä–'€¢%›xËFA ¦xôÙ’ÐG«R½ªô ©$¢%‚FÌHÞ¶Ÿ!Þg”¦.Œáõ@”œHäC±¨¯Ïwˆà]SšÓ£ìöèšÙ3ùð;(ë]ÞÀËpÚ7BÜ2«:… †_ß{ܱÖ84]Mî”xy•õ³ÝÜo³s×€y÷~Aråcés~<[ñCU’L˜aJ›/ Ь•º®Êñ~D;yß(F´9 ˜Y"Õ…ÒÙÞÀ^$g—ü®‘- ÄÊÀ]!λ ¼±ðËKE˃Ä.k"}³cU´,ûv}G¢@@I–Æ0פ¯0G­ˆ&ÒfÜO¨ıÊz®O>þαFR€&†:÷vxÐ:CôîÞŒßQ„!èk;Œà`R͸öM/Ù}ÇdPn$äÄÑùÄ_ŽÒhDmÓ‹3v‰ªZÙÊŠÜp‘Ô×iû5á§K§zïg‘lT—e9N$Âñ[óæ\e¯ÑÄCÆÛEÙhóhl7Haìs¿Y±m ÁÒ²A^Ñ:p¬(¨˜ã:ƒÝÙR»Ggµ-”Ęà!d#g F¥}âV§ûÃÁÙ„±)έx$£§:e“++‡þƒQñ}Ç{¹!P"Ú´È_G""gÈè•Õ˜µ4pÓxw ®gÍŸm¯]åÉ.YàPàP{Qƒ;)ºß1jè#.wá@‰çlq‡ªY‡ Ì™•ÞIB–Àg¦8½£7¢Ž&Sš¤ù]õ¨ÑÜkœÄOT(ôƒ®&\ëÆ£…±Ó¿w¨”à gdbƒŸgw~àU`‹ëu£æCèIe:˜[¦î¦2B·*G‹Ô¯ˆˆ¹KGÊqa_ËæÚÓméTæõ§ŠoœVâC]g`ÄÊ1|Ñ'cÁÉÌkÔ$¤÷º ÷Ì '•ÝÀ û éc|¾5½=©TCc”òø$bžŠˆêÊM¸Õþ+CáçoY.u¶tõkѯ_8˜êÚ‚SŽ|ý#ˆïáNEØ ôÓ•9´vñ ¯Ÿ«š­Ó ¢ëxb(•ö /Þ¹eD3Jœ›¦ê<ÚZ¢u'¶“Ç1ȇ-Çz'Üøùr.Bžê®#ÅÌÆj«þ/å—0"{fX±&ÒáštÓ¯›‹(`¾!²`Ò‘_Å5I \d"è-UÙ&F¶ÅÆõÜÍFôöé+V»bwÈØYÚˆóSÚZ—hÑ»°Õ–j{UÙ@ÅàoŸ›a ßÏy;¬c„¨êǘÊTÄÐq»¹)î9ÆÓD˜´¸¿ÜÔmW'Ô¡¦B:^¥î¬ùª4ž0œB‹¯<6BEâ;ÖÅéæq¡²?Òe­¹À"e«Øœ ŠltKánÁtÍ r*ÎrQvð’oxc T 8‘²Êéé^é]…cíQ$šÙ5þL? kZÃÖˆô°FO,‘ûù;wû¼Áý ü¢h+$?-¬Ð ¦Â*HÅ.šè y+"UÑš©<»‚œ¬ÕÆÞzû'+äž;‡Ø™]g ]|<]Gc»gÁ™õ‚¢R´‡¡¡ž•1ñÕyè™kÖ½bG„bEl^à½â&#?2«$Ç;§ŠoTb´†Òûj-·z-‡Nô¯pÓhõž‘÷Ân?+ž÷pfW $míh»B%/rû§b±½ ð©xŒzÐza~¿B&¸~#˜Ø-ÙdK,¢¥PPqÚù>Æp2 øÃÚMÍf/ îÊ Dã4ô±ÏN9tŠZñEøåó6æoG~cÎÃ×=-\!Û€8fnLªçÒÕ'„öLéƒl„¯á̳+^Q¸xï"BZ¡9ÐÜ ¶dÎaa=ÈF”:´gÞhý&ðëa!’ÿ H÷¦¸\DB¿°–Ž¿e4 lŒX»ö[Iºèxò¶fn½Sî0h¿7}¯DŠ¡:×ÙÔjU]=(I®nøÐ×Ð@Ѐíå[7°ÚÉuMRÒPT×Ó‰<ãÐ(½Tª ?C˜Ãã÷.Âo27·ŽW`\¢:…E|6ô¶ˆ‰¼X š‰&7»Sš ¸_æ÷©MÕ‡ã¡ç—ÁÊíN¡P×OÀPEú…(ǯ^IìÝÀ?K\ËSZ5‹Y™¹pª_†ŒÂ+Àl¨¯ê+Ú„°£¼Í°òóÚ’Ôï+ÊæOñôa–T&6ó EðT‰ ¥d¤š8Z'•‹æ:Ôåå:?µ¦¹Æ4?¥Õ‚Ã<ÇÙÉÓmlÕpfAœ‚•Ú-E&w§Í€äbxkw‡Ü‰0²ëuâÃY‘‚öfû&Ïí´{&X è<$N¿8ߌ>9ïÐúçÞ¼AÇÚ£„îxÄP–Ô)Û4Ow!ä(¨R:Œ0¥´jr’Aä>=f_¼$¹E ë#Ç8‰Sá[…ðзŠÍDÓk_¤Åœ´ /²Š¦#C]G…ÂàåíÃ_ky0æÊñèηf¾j–æc ?g.B¨!îƒ}´ˆ#히 ±í4$›¸4ÛK‡˜Ž9w‡CÉ»·«¶åÒŠ­QaeÖýVÝžÕ¿cÕúßôn÷zÀü+@j¿^ŠÕa¹gñ§ý+½¤æI^ë¾ÑìÜý)jÅ|ÈÍð•Ÿ^]{>Ü»Î,qr¨ƒ_Ýe˜X‚ȼK ü>•QCAÁ"¶„]H°öw/Ø©$i"¶ä9²}¦B²ØÚŠÝé2ý°ÎÞW6 ·á´OÀ}m&‹hñÞÕgèQÎ3uÌ‚y¶ÊZ€d”ØAÎo¯L*üPÍËòR‡7#¦@œoxeõÃ¨Š½+êPŒ PIEXdX®_»½lU1¹ÛNz7K1o¨v ºœxç“x?ËR¶ï÷à7%·V»” xº¯¼…çq†]¢ñØ»&™ZùLû…œxàãó¤÷ÉœªˆÄ1¤˜‘îL³šó¹žíì¦Âi¿gŠcº“K+°·¢¥oç-/xÂDé·¶"¼·m—똯×)¥uf£3Nmá`?¤ÆR¶´çV ‚7·YÞÁ.ù•‚•ýhäæÃDþÏ]ϨkGÜðÑð4Õòi ‡Ýíó0uw˜F$ÂçØ”uÝ»uU.ꦉ`xãåĺ¶!c?zhoœ x¤wa”0U±§×ø\™Øz`Jƒ°“›µòžœ€o³)"‚®‹n¨Ô1+A¥-U&*üV*ŒðÔrM-péÙÜìLC!t¬Ñѹ“ü œÓ©™Å`‡Kïf=Û¯ƒz$‚ºZý~C÷YÓš3(o<ãx™4fGÈñ“ÃÕ:;„L?'ÄÃxfÎCûyÆ2ëÕÕ À [ïÆŸ ÊuÌ#2ÄCÔ CgéPƒôBø9·NGýõ!#nœ›Uô&l×D ?Óïêô…ó[µ ,••%äî­Ö*ÑÞˆBîk¦†Ör‡Âóý1亷³ÈQ¼‡âšwú!Ò·*‰J¦.'sÂé™i1ر2 ¢ÖLÍEE×JŒÉ?£Ò¸úÓè©ãÿŽ~È´@×9íÂ–Šø®7'ž3húTL"•e}=o:™Ó#ñˆt'3ï õ½¢Þ“ ¶ÚÄíb‘IËÁM·Ô¹‡Ï:'á>²‰òîvÈ»‰M«òæÏ ëK}¤QÉ]ú¦·L@F[ ´¨pâ(Ýu3%í r2æ6Ú¾;þè€G®C ô§—¼,SŠô±';“>nqöÑy–±7z·ÅKdÉQ,‡ËÕL»óP wj{ fRY{â² '!à…A5)©Ë ¸ãÁKk‹æÆ„1௵öJ0§¯byDìâÏZÙx®2{-ÁFmN„ cQ½¡àN"€†Û`¥ƶNªDí†ñØ® TµbH§òîIêžM'œ»Ÿ9ëc0¢Ùe;´t=^ްiÁxP‹ƒ·ƒ¨“[è_°%ëLFòb „F Ÿ…Ñ( Œ³FýcCÇ–Z}…;MËÏÿã‰Ë+Êͨ¹¦»æ?ÛG°¾w©Å7-yqÄke]2‘Þˆf@Ey‡Jìqåà#˜Ž.¶' °ü¸sÖÆpïÜ&;Œ24¬±€x9–ÕâÁdø->bâû·K)ò~Ï“¤B«âä_“ÖôYË¡‹ò–6j\d|ùl$33ñl-G÷;½!"|HÜŽá þ4ï¯g?ÈÊS$1¤lbŒF¯ŸiaëPh|¶sÀ4¡ò†ªv ÙÈÙÇæ\¢žr~öA©Ïe]æ ʶdC)ÀªS$¢Ñ+®—£(+hD7Ï~Ä|âÑ¡òÜéô¶§å"¸;ñYÓÑ{Aág¿¨Ãi­Àƒ!ü}¶õ6Îkô‡iº£áu]êOäγ´h{Gz<$ãº=þïl LJs+醺ð \ož\˜ÔžñV›K¯|L~Ä pEÀÆÙ E‚¼Øû¼rAbѱ€4–·=H´‹¾-¯û»?•(ßàn^ÓªÞÄSL³nÃͶµ<0>è·+ðIÙ\ÖîHÇ=šSêÓ34²B®Ùñw ðò÷1{vâ!kÔ<çž8–‚–õÊ¥ëN‘ܲûJ)ÊâaÜñNø”õï¢ÊÊM;Åߓͫ_²D\»¯Ð'Ñ»»‚ö&CXmy¡"*MAþçüèÃÍ|‹–½mXq5<ð`Y®0(:dÑGó<ö7Óš ¢¶0ßFá2,tÏ[’>ÏܵyÄ!–LcQˆCMUòòggÛSg介à‡ÅTdÉဠËÚ¡M–B!GÕà¬%>ij²Ç@¿Mø0<°Ys?y9‘&ôŠ\;T\l{iþˆ]ÉöH2)ª’ú— ÷·{˹Áú|ôL{˱„TÆÇ +ÈÙÍbHNÎNÖNÎÜ ·ùìÚOþÃ3¼ýZ ;G·Û‰}ðGU€I÷õœðô–åâlÈ;ìkFT{0Ù#é'VÒ÷ÖnT…½{{5óõ¬°¬BÒüògêÚ)WÝøPuºüfOÜË´Fn•6kÅ™ ~=µ°nN9Çã 9öz1W õ¹¢Ì…CƒÁèj Ò×4ŸôȲžfbà0ì;m¼,Ð&½%Ê5Œ{J5:–Úl"åfó™×U 3×Kç'w”áH¾ñkø<°mûã7¿ÅŠ3¢&Ä&£¨Qݪ’–¿ÞHY•^ºóƒGvÍœ¥)0\QÑáÕ [ºŸÊ"óLKTÈ)UgÙÈþÛùAF„âw°/è9zœß‚ʭΙw´›>õ¸ey, Ð@Á¾.Ÿ+$]‡;º:&·¦²äòì×üÑ0ð%·pB åyÜ,é9T’Ûj´Ç†Ø"Cq×­ Î à È·ÏK‹ªNû ©¤ÑÉgWMm.ƒl”€öÆz0Þ<Ý[Œxù½[±E b$Ë]âñ|„Ñvûwþggd²ï|¦ÞC´™ :9~ñˆ¶µ}]> stream xÚ­veXœë’-î‚oÜÝÝ!¸;mww·àîÜàî„à ¸Cà²÷™3gî¹ókîüè~¾·VÕ*Yõ½Ý”¤ÊjŒ¢f  ÈÞ™‘•‰… hegâ⤲—gTZ¸(™ØZÞN$JJq0ÐØÙ d/aì ähÍ@S€•——‰ rð[YX:h4TµhééþeùË`âñOä=ÒÉÊÂ@õþà ´9Øíß)þÇj@ ÀÙ0·²Ä•”ud¥4ÒŠi =ll PvyoÅ oe ´wÒÌA`€í?S½™Õ_­91½s‰:ŒN@S«÷0 »)Ðá/ˆàÛY99½?¬œ`c{ç÷8ƒVö¦¶.fðn7ý]ôîa÷޽“)ƒœœLÁV΀÷¬ÊRÿ¨ÓÙÒØù¯ÜNVï0dþîi2uù«¥¿±wšwÔÙØÊÞ à twþ+— `fåä`kìñžûÌlõw.NVöÿª€ZƒÍlNNï4ïÜMç_}þK÷ƶGƒþöúϬœ€¶æLH¬lï9Mßs[XÙ#1ÿµ,2öæ +Ë?ìf.ÿÄ\à¿Dó×Îоal²·õ˜Í‘˜AÎï)4ÿ3•™þ÷Dþ_øEàÿyÿÿÄýwþËKüÿû>ÿ;µ”‹­­¢±Ýûüã’¼ß2 €<à¯{ÆÖ øë®qtþ?aÆvV¶ÿMà¿;jÿQìðý;,ãlü>Q{‹waYÙ˜Xþa¶r’²rš)[9›ZÌmßgö·]ÃÞ ¶µ²¾kû÷X߃XXþ S·´2µ±ÿKÎ@@{³/ÿ]®¿‹gV””ÓÐ’¥ÿïnØ¿=•ß7ÁYÝÃø4Z ³ÿ<üÅ#&rx1r±ÙعÜÜVVŸÿ&ãß4¬ÿ:+;ƒ­Üz,L,,¬€÷ï~þu2ø7I{SÙ_›£ælloö¾lÿiø 6uƒß5þûýoúŸç¿×tš"­.Lùƒ­Ó2Ó¿áæMHèõ÷²B…8”6¨ø×€züÒ·x+^jC˜§ø^Û<þìÉÒíôâØR÷|žåúÓö|X§êà¦ßdþRŠš~¢íu¾ ¿ £ËÅ¢¹¿=¡¢ú¥äŽhªƒŒp~OëOîZàEqç€ækšZ‡Ý‰Ñù­ðø„*éèþŽzptxè{Ï%lß}N"%¿1®oÊ1i²³‡ø¦ÁôöÉ•Ûm›_%£ šé$¹5ÚgÄ™ä\ç»h“ŒèPx wA³õ'ÊôY¿œAçrµ\¶Ñâ|’%©&Ú©þF–ËI²þ‹n’ êâ Ç$œØ²)9§™Uˆ)ä.hŠpÑé8ÒÎóq-êýª¼W‚!b¥÷°é%ºpšªÓ×a#®Ü‡³×¸™>þ—zÕ~®mÄ«€Fâ&økxݜƎëé3”ÂV+«¥@3#0z àI»ÿS牖+W_=Ó&–(xhMÄBFn-_·bgª~L`î⎠ úi»w`è`b¹idNB‰ÇfŽp¡Íï>Pwƒø ¦¥7^¸j½ŒïÎz¾>¥.ŠD=†¦GWªÉÑ(9 ³ÝÙG­ƒGBE#¬ÞœJö¢ÚKhì|ÐäJlQvJ ùäTR‰ óÉh˜f¡IÂ)„eö!ë2W]¬åKçÒéæOYeÏ¿söR~4zÐtcÈÍ»+h2¥Ì‰:Åt.ÁXüUåÞ£…ÝV~€„Ýà—G2J]`$0ò«gÞ%–&U?êi,µ£ªêua¸—Ñ®RnŠ$Õ$—Þ÷Ú©ß¿ÓEд2©õHj ¥’òСóE/¨¤ÖxxC“‡¬V8>mðl1×üúp9‡T®ò3©«æA,)%ýÞ#~;I[LÓ3w" C†¨Ô&0Êf#“¦ÞÙ2<>™›ûÕVŠ“§iÔ¯V â1£<4¶¼–[6ÀUÞ#±¾¹,ÞÚL /&t›xZ @ ì­Œ1wÔTò°G¢ç—–=|à¢ÙK˜€~à*í©??Kó^ ³4âÅ)MS^˜èÈ0_÷š+9íÈOÕQs|á‰áY Ò>;fe Ùüó¥ûÖÖC’#K"Ãh852ëE”8É/С#Ýç^¯6ŸaŽsG½mÕå»Êà©ÛcüùÉYRÕ¹Ž$Yðíêâß“(}^¹è;Bv›Í9-rôÕ®_)õ9±¥8V>}“`Ô“k¯ Çõ=¥ÒM ëOµ8ÿÞ(¢~~ÙT‚8_TYg³×~¥ŒA£Š{û±ÍËz¾Øÿ™‘*÷‹/"=»¥¸om×^(šgCM$sjì‹®¿ê©ÁJ<ø®ÄáHʮۮU´ 1¡ÛkyQèmivõ1iùb$T«—ÖÂf“ÜF³‚dK‡†Ä+ŠÐtåb«èãÏù Ìö…NwâiÊ£‘Z–çÈÒéò#9°DÐym›ÈOl\›Y5x|#ÔêúPRÍÃ Ž©˜É·æÏÒ• ³ý.m—U¬šË¬x1UÛ¾`R\ Jœï¢kpÑäí¢zÝ8°ªpÃמ±ïuñ÷Ñ ì`)ÖÉkâB|x%õ•]ûŽêBÕL(C[[–Ä8a}'ÁˆÃ΋C†ï|bÝ¤z}hÏ´«£ò/EUlAWyȨKÕû¶rº¨PêÒ8õ7»»—k “w 6ETìF”}^µÌ,EUДGév°ÅÙ5bXÜ(øûÏ)ž…¢IU~÷„kGp—óö˜‘|c¦z•´(÷[NÞ Ê9B«1OøþÚò.°_Àl­¥šÜühø\Ý袣]﹂£iÄwÚ;$Íåzõù½±!Ñf8®v¾£Ï >2JºÃÃDï²éð§E»Õ”eÏVö¬Í„½#ƒ>À³·w䊺qʸ\OH£gÑ”¾ÐP¦î#™“«!æä  ïàÜê§*'¯C)ÂÍ0ÑÃãb Cþ³\ˆj‡N‘ˆÐÚ,¦rÆ wBþCõ¡pÒ4þÊ‘{ b´õ‚)ìRÿ⢡wÎ'Ü<ƒ¿(y+› Ý%¹‹AË(#¥p¬{;¾~KNß ¡±ðCü‘—ÞPÖ`\=ƒœ½¤#1Ó‡:b$ìJÉ|@ÚχéÀ±ÂC ZÐí,z„ÛëŽþ´ø–¬ÓgŠ˜+ìf²)ì!Y T; Æ£a.÷â€8…ô»¤Ï¹,‹ÍÅxú•$Ê2`Èí*–X›7o±@¶«ÃpOæË}m 5 FT{AÜʃõ7‰`Ã5êVö×ÀÓDWãWH¥UÏÅnÛý‰ßýKC?DÒÓ>È=2e(„}}Îî(›¼Ìåtî´"h±¤å6Lç¼eqÚš'ÍT@]{1›GÚ1¢üB¤¯ø$kHÐF÷Q3Ü%¸MâGçipqxT9|‡Qyüþ ú<ÇõcâÑ’/RÉˬ ä5Vyfëuü–ó¾ÝŸ’3?ÝR9]RS^,8"€;éí^Õ ;Xa¾ýéŽ\·Nåˆä^Ëß~Mà2Ë^UÚú!vŠ0µ°N9¶«˜%ö & õf9a7g?È^&o©„`\Ew3’ ‰qÁ¿³±+EYkgTnå®Î¦ö²^‡‰d."ãæLõÜ›D)Ö-ðÚ¢¬í¦3¡|³W@X4àvD{bxÝ÷;Ðbˆ³>6Ž:йðzúRM(ps\ÊOC¶zÚÃQb"€¢Œ,Ùæáƒ|³Ûe…éKôUyõ¡JŠõO&“0šËÊRshj®˜Õbªrkò›Õøð$å z5±C³íâ"ñFVá3·u4Ô‰Ê/î¬ÖëZ5¨Ù%…¥H=8™ àSë#xé}š“ï¿ ÇA+àÅrØLê•àš-þŸ°û@äì7ö†Æ¼œMÐbḮ{TËÖ›ôÓétC ÷Ôý$WÓeõ 8Wiùx H²7‰œ©HŠ;]šœ])]B«“ªK§`¡ÔZŸÓ)0…k·…F9±Ž§Õ/Òä4.n×ô gÝ6Ìáìf ÃC·Þ‹2Œ/ÍÇœnÀÑÞ¬µüIyx?´êźw›Âå<¡ÔaT;.›S·×;ŸY²iãXM¶ÇÀû~ï"™JDeÁÌ®`E´ ¯£Ü£ž6NZ’á¥[7”ߢ—K\ÍÄ=D<¸K¡¢ƒ:ÅcÓBÜ`»-¤ƒÏóL=¨ ¶ì ï™ÉéjK-duµ¼·ãÒ!§Pí—¨u@£ìüQšë§ÿ¹F‘.‘»“~ÜåÁ‡~Ô3¾‘yù|ƒî1ÀÀ—¶áÙº›Œ[‘÷ XŸ7ûFcB˶Œ~¨! 3Òé¼.È8‡#Á¥O¼Ùö*¼‰1¶ skãxÖnvûfs¦Âª’†9ÄêtfmE{| D¬k¦7nßKí9OBäG†’Îo­SüåÐõâßðE;›//ÊPŒ` -“•èMó„îíØ²«¸êH-/áÊì:{L¤~øÅëóXœB}¤P[füö´`˪¦!ÔÙC³v_8[dî=š?ǵ08òeJoX fÇ”â#À\=7eÜ­ÑZÉ49àôëÍ$BnŽÜp&ó÷ãC>ÙqÜß ŒÂ% ω|å=Êö¬ìŸÌ:Þ1rÈ¿»F‚'Œq5ÓüSÿ¤tošOe±1q•¹D‘©îlch~HØ÷P©ãH`ø4JfJæ¾CH¤|Ñ·¢wª,óÏ FÙ&ÊTÜ–ˆ*ÿ ôİu äg{pÔ Ä*ŸTæoA”È[ûɾJƇ§ÓîÄîH'7–29•Ãg2ðÚt¿\ÉìK/òàæ!Âê_\ÆfÃ>ðUlâÐC±«Âe:U­)|f‡îs1j$c®ý˜?僘 ^L+”î¤4Â ÈØûµª­Ö._ëPnæÿÞÛtÿ@T´Ûy<*æjϬ Ä…ØDwGtò‘Ö›œÈƒ˜@,~‹dð@\î…ÄLFP8ÕL¸·;öÖ’µöp³>øÌ—´mAuS7ú˜fH3—*cÔm6«t®µ 1üXc7KM0L‡$/‡¾¥ÞÀãX늿p&2MòÐ÷ó‚F²K+°GCkÖZ2’õÝ¥IVhÃG’ß zkZy…÷X_tö`Íè³×Ž^ªÒÏäü;³ü¯äW‚6o¥ÔÓEí„ñ¬±Œ–b¯¦/ôàŒ£ëIšP”…TXÒ,‹(Θ0˜ÓN˜jb÷„cà}8Pç Ñ|h‡²%¡¥1È¿Ý{ÀaCìñù7l²¾P}SQ©FLÝE3úÖIÀÊðRCI¹e&E¹ Ÿ{"9=Æž‘;ˆÏ ÐO½1ùêôuKûO]”Cm‡‹ 'Æ÷GxÕ?1 Òº¹ Ïp0ëOèBi·á‘•u*÷Åì†gUZIõ"ƬÔÉï77‘îºPÙøÌx FaIÆ£„“¿òñXÐY§Ÿ6–òJâC}QNܶ3DoºÕ³êÀ†hf=C~ZŸ:‘”Ú!íYb€ :†‰?_i2õ-eYŠ/^­êБìÄùBf!íØA¯žT­?ºn­ ‹~¡$óõV€SžƒF¿óQuÿP²Œƒ)Bg÷³µÖä‡}Ëê½æB³uÜ+7…P"ÑiàiK&$!çeÂ(NC;?C(§E\Å߯ËâzXjó`§3ðÀÄÑ„2_¬‚ÈšDY•DtBÅ•}yƼÁ}´Ð°›Ý:=5ü‰³œ¶i?`©ºØB<½Aë`d<}Mž\­Ð朿¿4a©¢öœ œõ©q`½-0>Q^äK§|‘>ê²n©ª¢~vxˆy tv8ž ùBåÔƒŠkð—vŸN#bÚú(iŒ¸/dO2Á_ÈN†Ž%½cÚÞ’£ñ¬üTªDŒ}@«ýíŸÓç30!¥­n‚#¼Ì>`ù±C  «N:K‡èÀ`{fÁÀE4FºxD1=*LPóú²ë ïà…©Ð‡ÏäÜ^`¿©ˆdùÌÈõg«2¿©8ºUÅ»¿¦¨% ­DUDë #åô ünqP¨” ‰`uÒ­ÊiÌÑ€Ô· @¨6Â%Ü7xšé¬ß5.ž—GÊG‹³éÖ„G‰—“=gÔêf¦Þ †tÿµ¦»R®¶òûóÏAt¡2{A±~R^>µ†AÄ„Òe© ÄöÞJLt’rz,Tj“8”‚ºX…y÷†'ŸjÄy™Å·r²Ø_%gPæó¿|-Ù¢ã¿ùÍæÎÙ/b#‚¸íßw×gŠ®ÉJá]XÐm®OGû6ù~+jN„Nõ|e”€„ÂiâKjx¨’xRÓòónùÜ·9¶÷Õ:¢@ÄiïõVQ@ø°Ëc磪'kqX¬bÕ0Ö·ö赤†W3¢Æ µ¤Uo¸Q©ÒXXrnn‹pFº·¾R²z×+!…Sm/>Š‹wœ—KAGg,¡Ÿ=x…å%·Ÿ6D{çðÜâAï|kpÜk¾¢yezJ_¤í"]QÁD>8üœa„³=òç…³–É¢wÓ-Æ&ŸkFšQÅ`jUÿ76÷V‹ÆÊg–ýÙâ&wv¯“‘&q=‰ÐBë0mª><Ñ]Ýš‚_° `1›ºFñÍ-aÖu3ïLC×!Ãùôêå•l.czK …j¿ñ]h'Äg^,Rƒ»Eÿ¬bXf©?Mlæ=8ijk¡YMÒ¦WÜðÓ«gc³Ø" Ṫ¶6éƒÂ„:£ÉkƒÉBH éµ@VÍ\ùlR–’« A†~œ‰ãëN:Ã<é!ãJºlÐM‹ [9b©nNìäeåWŸÜl$œ¾Y¡g“p¡‡ö@Ç]>ƕӡo­êÒ$Kkqzà —Èxô '}þa—¦ìÙ¡;4B §ðgû#k‘žæ‚l“ÀªÓºý(¨6ÿØÙdùƒÍÖÏݱ3´ôÕ´xÆÆRÂ3ý¸EL°BC{TVÆÕ^Kbÿ Ý€OYÂák f£zëc¯/Ü¢L¡‚ÞÏ‘CˆŒÊB–d×ô ¯<¹ðˆ¯äýÞÐ<—/(ãˆ3®M¢¼@¼ëGž¾Pç>AÀñ„ª2¥Œn›ú±]OK\_?YmdJ{ü^\jA¦ÙÏ0ã…7•9m‚9GÝfƒ½ZP×rp¥QU²F°*,“yЧ3<Øü›àÂÕ†éºt¿ÿ÷Å‹…¡®U›zàð÷ÞN J>÷Fe·Ñ w«éP¢‡õm0éŸâ ®A|Ó÷€*a½˜=ÿ}¡¬a˜0M²?<.ßVްÝ¿J‰ö4c-ËÆ•›§|$¬NO÷ÑϞݿ/-=n†›Ò@Mïéà³àcµÁí¸ô“Ø42èö±”m§ÄìaÓýbBÇl˜±AqCº+Õwëêõšr÷Ì`vV]ž ]O’óôÿó³UCè‰*„{B‘}U"k°$¦i—m,²òø«¦ëáüî'œŸF¡­¹{ÁÏ¿RnÅËC üæ7?ò±Ø_#·Þ‡Œ£ÿ ÛÍØí‹–røŠ£È®¹:QÞ: -¤t’\°vp¬ôœ/ƒÂó»š ±Rî‘êÐÇ'‘% W Ó’%°ÒoáèyC è­T€ ôë:(tãƒá±çð"`ŸÿÃÏÂ_ªŸcóÕ9QZÇcã]8%àÔ“>£ÿ T{Y°h@Ðt=^‹¹{jl!QQHïMÉ¿8Xô N'§q óÃG@lȾWÊß=-Âz dH±Åº¹KË,z¬AÛç0_&b޵{ דÈÑ®+G…ÐiâÔyšFwÑœ¡ÿ’­¶:JÀ"09ÝÀTXdžŸOEغ³ ü鳩àèDQYdF£››à8»,Æ!Ïéh9„ÑUòq3]⻋†PpDضD£ÍEðÇè]á’²VóÐҰЊX_Ò×hÑÆëׂ€ý€F^"ô1Ñ è“Ïq¸K½%óæ|oŒ»Öd2=s›RÆóÇúxB$›'EœGôe!áFœë ôë†Æ'êÎ%ê7à#¹7&>V£t~ù†¢ QK)Q9 O*hõéT¡¸6$º·²múû†íÚNÌ[òwØÌ*£GêEÔªåH6¹Ùã,DÉ×*Z,æ»`4‹VFá;B/œý44}ýÅ`ý¼MHq mâ?™ß–G×]AK|YÔ}ÑDû¥ø¸Q<‰‘B÷z€u÷ ¼7ò‡ •È_Ø^b(C•|Lb|3$Ø-S¼oœNÚ<3¢Ce”}x™ÉÆnV²’Q(juŸtð2¿á• =ï+È]ø¸JÂï CN©)ÅÖš6©v¢ŒlCoðþ`0?¬£x]© gÑ蕈hcR@Š|HD[Ö\´â¹þsM¿÷P,Ï"¥Mñ*WŒ‹™¤RŠ!r¤£™èM½ýá¥]‘¨Ì Š4n~•Ön/JE·Euʳ͇üFdÀ.Óü`970:…xÅÓû"Žýr9ñˆ@1kñ £mï¯õò¹YÑhñlñÆ}‹‡¿‚ØëTUm"¤ôü©ÇdCô¶‡—°Æp2ïH¶†–®B¿Yå/LmïåÅ¿2ÛÍ<‡ö2¥_ÉgmÉ|kcö›‰—dÒ¢Ë.LEG7%æãÖb‡Þg½Ú_Õ…âJ=W<óG¶@’ MÙ.º!0*ã@\9Þ#ú±B<5Áá·Œ“bŠl_»ÙÎÍ.>ç}Ôå‡ù)ÄÑÖ«êuðú3Éè¡FPÄŒÔÿ²g\éð¼%r-vwKØ?\±?È1l’Q¶§*¤\Ÿˆ½ÌpˆvÀ¤œ¤ê»±+©³([Mªícb;B,yýÖÇ£ŸÌ$òuPŒåJmè²Bÿ“²”X+‚…~õׇX~ÙùoúVÂmM®ÑŒöù¼£3ZÑ”S*—Û~`šR_íexÆÌ¬æì/¡Nâ¸ÅâŒØ~c­!Y*ÃÉ¿A $Üî:wijàpƒ‰/Ûøâ§uDð áþ€Ï áRجÊÉagK*…»¬b¨GÒ•¿u,ËX7Tá©øP"œ6û´°QŽ“¤³Âzb±<ªåmÔÄSB.7¡ \"•/<ùú“zwÈ€—!¨ ÏkgÏÛ~q£œ¸î¢–\?Ì (õÕ˜ž?¾ƒ† ðy¸Œ°Ú‰‡úôF›¦•Ê–Úõlû³ä„ñ„c¶#DJ kŠ|¼ñ”Ê•u?Khãy8|]ë,Ä̼¾z6iSêÆ ñ6TÙ$žbÜàðò×6B²¤5—Yo¦)­`¤¸¹õ8àR|Aœ•O/ÉP•޳˜É†/!égDàŒÁˆgçÙMë¸}(ŠÌJkPBJ žªy\^¶k1¤abå2‡Ÿý5¨}»Ó¯ŸÓdÒEÝŸtoÇœ'MZv5Ž"r„j¬Þ—Ök„\7§j°+Q‰JÛh,ëfª:!TøéZ”&šp !"lÞˆ%/Á&¥¯…¹Å8Ç´ÒqûÜÃEñp ÛøÃ“u&]=…;-c©Þ‚¶£oQXzîuF\„Ôº1J3|D.¶F© ðÉúÍff뵚Qá7ym{:¸n¸ÂF2&6ÑŽìó3~oÛdT/–$?Q. W•Š >‹69Чz£ eNË£„Ù§â–[[SÓÔ^ÿ:|3k³ZZ•ÇâÔYU!ðÔÓ}1as³œ¢©M•d?¯õ8B¶P¬‘ÚL7ÕîÈ I>^Ñä&¿aÏ݇j"Jm1œùü™Ÿì>“t4Â6Ø;ÄL1réÅ$ééÜ™8ã„7œ &¯©…täÐB3öá´ŽIçxË×kAÙà†`;…kÛ.ê· ë¬UÔ"¡©´¶uãâæEˆÔ–¬‚sb€n.+/D5Û½áßýë·…;‘UÆæ%éüö‹© iºm»aô4,F8SÅ)Èâ+¹;sK¦B`]¿†s™¾eOë†7 ruGžg"&9…4ÍÍÙÿ†òß-&Ùév7ß6QHˆê‘ã$ód ôaeÎYŒ!ŒÙiÄ\¼e¸XŸ¢=†‚fÓXIÇ€ dÿ9ËWú_Å6¯ƒªúxZ<öËœùtõ±ú ×*ìmU„0’Ê{k¶£©{ÙÞ—i™¤¾™÷ÞnWþ'xp²?°ýûýü›ÔY.D¡Œ™HlòÀjß°ÔŽZL8®¾íÂwAgÖÒù Í4ËŸ²;å°eE¬¾µÛJš9‰åY¡òŽ«Ÿ@‹Ô=Œ ?øtTg0Œã¤AWueàÑ_ÿãœòÔõÀìõzØ7vïÜBù.t愘O,æå穜VÅÀݶ2Õð1Y•¸¯º„IuããoQóàb7Æž ´;Ÿã&Â8`ؽæ¨ã È”tÓ@TتÈÀÝ¼Š¦­½›uÓ¬!_Rƒ¼ ( «™j b©RÓ]|}¨µ’ž(ßÒ† bøž$õ¦ÙìSë­kß_§!ƒ6¯³f·Êù´-Sí{¸«ùa½uš )v'‹‡«\v%—P>U§ù­a4¶¿ÜÕ{1P«àÜÍb·ê$DEC wS@ÊI|„•µ¹rFŠ€lzɰúª’æÎ´¼WŒËS¡áWȪè¼Gm+umª‚Pu4&°HÝ8™©¿ƒ4Y6ð¹¤1Š2z„ínUáŠÏ‡á&Åüp:«QÀ26gŠñDxŸ"…‚ôaͶV['œÚ+îµú’ÑÄ@”׎þ¶r'½#lqιÇG†…®O)ŽZÇ–„}+—_Jh›HNdÆìb£Œ(OòPJŸ-ÓìéÌ…©,ÁI÷†0›—iÏu™6#Ã×4BA ‹?&¥£!‰n.²F_$ +YžçØ»o’‰£ßO‚Ö«¹õó4x¡âÍns´ö<ÙSº°Yô{›Þ– îuÃ]š5 l‡q‡ÓÇþÀõk”ª<ömMC?QùN¦|øÌ ÛJ-ò ,êFkHŒ"ázàëo4³>hÎ$v•X뮨n¼¬Eiªýìfg—Zü>'å—vî:ƒ s®j²£ģ³×¿ ¬o³Žïé ÔÚåòupäÇ:Tœ Œ]•Äl-Ž1AÎû¬d>_–ŸÎõ{0aѦþBëXƈÃ_ê5Û¹¢áÄ3DBE£m¹ÝÌÝsnRƒ¨Ä´n/EèO‚KYZëªÏŠœQ—®EòìA]÷DKGEª"¢… ÊàÍí”þþ•‹/rö(Iùd®v IÜ”ÊP>­‘õNùîo'Är ·ò?æÄÏ0W½'žS_R-,xÉ™ðãÁúD>%1ê‘ßýäÛ™²Žz0•JÇeliD¸ +l‘lw«ùÛÖy~Uúäæß TÍÊ_·{ 9±^ª"7¿rOû3|šÃœ>]Ó©’—rÒ0qâê²Ç/ IÍñ4RßrðÒ6·ßî1ÕÖJÕØú¬êU¾Sb~G ÓW½.îA¥Ax¿ˆx> •†«¯2ͤŒ55½Í,àuÚZ÷ dÂ×0ÆÙ¬^¾£*5߯³ïxn~Æ…êy¨ÔÓÍTüܹH¾™ðgiû#>Gßò vK–çÒj(%+yi…{¯‘Dˆåé\­e1‡UjìÊÖö³n'Ó¼ñÀ­ Eç )CVÙ4zÔ Ÿ3”[‡ÞQ%1~-ý )×Ýòq¤¤i+Ê-:ìYZ„_Í5|QÞóC%Ѓ…CÙþót'Òæ©<¶§Eú´"¾],ß?ôÄßqf톔¶fD£ˆêÐ;,gº×’ø0¨K¾Ô5ÞñöS·¢4:æoêbE€oáv½ùûc™¼.ùÆR©ø‡Dº¯Fà¶þ‰µÐ²éûþÓŠFµÚVè-US‘¯¿ã"9¶[^ò“rfõîÀz­"†i¿Ë¸a|º bµÐC(*W‰ßþf0Œ6ž(øÏÇ1¹|€…CwõÑ,æߦ‰ãà&] ‰}Ð#†ÂxÞè`v+r¶“Hf.Owâ—õ‚½&bù3éQ)ŸN¬[­¨…® Y§†¼24o¨\¨údTÆ/žE$é¤"c†uµåõFþ‘±È”ˆ[`™ e)~¸Å –ÒUîÿݤåÚlÄ+RÃKœ¸òÍÝ “Þ[éKˆ2'I{ËÄʾòKÁ€•Ec!v&že{…) :÷CÌÖ\”ˆõE,ÏjMþ$¾êtÂÓq8Û3É^L¶O•öGÕ±vùùš)*ÆàO|ntj ' S©¤Z¬ÈjT5¾ A1¿MU«F… u8‚ž}š”om³©ÞôF÷Q%[Þí‰%ñozçÌQÄ¡¶-7ë×Z%œš*EÖ°ŠWpß7¸…PóWæ”xXYe¯Nùž£ÒZ6Ú6´#W6X¶<æ ¤ŽæÔK½zZßE‰9“]b‡šÎü”W endstream endobj 1199 0 obj << /Length1 1608 /Length2 11071 /Length3 0 /Length 11892 /Filter /FlateDecode >> stream xÚ­ueTœÝ’5î®Áw—àî ¸{»„àÁÝÝÝ]Cpw îîìã}ïܹ³î7¿fæG¯õœª:»vÕ®SMIª¤Â(bjg ”´³ufdebá(€lŒ]œTŒlåEí¬MFNJJ1G ‘3ÈÎVÜÈÈ ÐšÄ&66+%@ÌÎÞÃdná  QSÖ ¥§gø—寀±Ç?=7@涪W µ½ ÐÖùâ|Q8[f k @LQIKFA @#¥ Ú¬J.ÆÖ €<Èh뤘Ù9¬ÿq˜ØÙš‚þ*͉éKÄ `p²š€>®ÝM€ö¹ö@G“ÓÇ7ä0w4²uþè³dkbíbú»™Ýß„ìí>"l>|`JvNÎN&Ž {gÀGV%qÉðt¶0rþ+·èà °3ûˆ4µ3qù«¤¿}0^g#­ÀèîüW.c Àädomäñ‘ûÌÞô7 '­ù¿0æFަÖ@'§˜쿺ó¯:ÿ¥z#{{k¿oÛýõŸ@ÎN@k3&V¶œ&ιÍA¶Ì ŠŒ­™€•åvSûú\Ž7ˆæ¯™¡ý adjgkí0š!0+Ø9¤ÐüÏTfú¿ùÿ@âÿÿOäý߉ûïý—Gü¿}Ïÿ-ébm­`dó1ÿX0€ ãüµcþ¿X#µÇýïÀ0üï@dœ>Ú bkþ! Ë?Œ 'I;ÐT älb03²þèÑßv5[S £5Èø¡åßm0²rrþ›OÕdbeûWÓ¹xþvmMÿù‡<óf–UUR×T ÿ÷múw”Ò‡êΪöÄþ£Ž/v¦ÿyø CTÔÎàÉÈú™ÀÈÎòùã±±°x8x¼þ›|±þëüÅÈÙäÐù(š…õïÒÿã÷¯“Þ¿ÁHؙؚþ5'*ÎF¶¦£õŸ†¿Ü&.ŽŽŠþýÚ?Jþçùï!Ý&Ë v&|–)é©Î5¸Ùcâ:}=¬AöÅõªy¾UvÝ>)¡›<å†/ÕAL ¼o­óÇö¯»²t{C=8ÖÔÝIÀó\B/rÚÞ<ôuªöÏô{þÌúÅÈ©'?ÜS÷ü꾂îÝ% ÏІ§ä3ÂõN<&Mpö0t¼­7yuc¬âÍŒ'5é‚azª¦@ì¡€Ú!&²8×K`ß7iZñž;À?’e› ªÕs‰Ål ìfhìè6¹©ˆâ•Op<—3wø&M{Hj07² n $à„‘êç| 3µü= iþ= Òá}†ƒ2+ÁÛ²Ÿ-•üð‘ÐÞ\M³J ï¥ÍS7÷âÑæíKÖ%§žÆ”"#ªx¦°•Á½ܸÖÔôG.yí{I_dž¦éØ¡—æU¼s3ÑxÅÏ~¥ŽB.)•Á9qº” ]iÌ€ò¼pí:¼Dúœ_´«Ë áÌ–DÎŒ9+WÑ/»3®?¦Ð€žß'ÕI¹cg÷L¬áæ„#… ÄšÙÉO1£Ë’.}ºß‹Ìñb1ì/[ÒDì Ä®ð°H¯ÙØ Ä ´o¥Îmx¶ñ9v æϯ xÍ‚™/ÂFL‚Kv= õíÂVµ†ÐÞê<-ÈÃÊ.< þ7’pÃÆj¡aàt{…N§ Óƒ¼"yv­àJ Fa±ôˆnÁìcRM)¨Ja²AàìÑ•†åûÀý;sAŽe¸ÍÉ6ùši®X-¡òÞ¡6t™eBQfI|Ѭ áæa(\6póåì? 1Oå?ÑHȵºî®±iꆰÀ”ŽzùK¹Ø›¼‹üzÙʃ?ÖÆ q[YJàsúdÕë ù ÓŒÒa‡Þ‰q¿û"÷Ï[¿èÂ$1lH0SÈZ‚g‹íý ü;$k(~7ìBëËS á×.虊]ãòÐÔí¸ldâõÚ¨”Qï(ÞÍ®ޱ)Ñpî~Ñ܉޽ ¹“‡{…³‘ÐÔŒã™p3›4¾M±Ä[)–þªñ^بçjë—ªöF¤NÑO4DBÍK1’_qÙ#ßG½HC›&ÚWÝa³¸h{¿]d3«h¬âxó#¯*Æ™Ý\€ú&ÒbÛb I…U’Ê\«[l×{nHâ´ "z:g+ŒøpDm©ýiÅÃ;“f¤k+Ûô{Ã}Êám1å¹ê^ƦêÐÄê0x¸V6íÍpŠÍmŠyYò­ßÈXŸ ·Þ@‰t̽_%~MÞ¢—4zÕ»‰^,4û&M½€žÇyF¡§8nÉkŽPGÅË*‡ë ¼ã+@Q»i§špZCSÑ#‹¾p²ò#üírôÑaÅÙ*‡]”K!zXUSÐí%#ÀOv¡}§ŸKnz@1ƒ7fÝyS¦¨#98ÖtØñ½ZEul¼c‰«fšj@Ëæ¶øSò.ÏÊ÷ObS÷ yöP—;üm€pYšÑï™­ßÆ-§Û«Ók;~i?ÊFmq´Èe©„¹À=%«³½5D‚ö-yqˆÏHR[d,³'+0eß„H» ‘ˆæØž•?ƒÃÀœP²¿6ú_(8Î\ŸT};íÙ*%[ø=ßYl{!d‹íˆ–_`)Ë‚®IŸC»ø¦%ÙBÁ<ÜÊ£–¤Ú8@\nÕwU2Níñ¤žrmµ±½K:6Y¹¸o!fZ2á ¡Èh®Ì³ õ JîU0ª.7X'à ¥C´”ÓÄhÕ#þ†8sœ"]÷)"¼¶Ú”û$ØŸñ=k•F7U3©¹”} ‹°yyÉ‚Ü[ßqu³ÐÌ7g¿Õ'ÀÊJZ0>y6 xþ«6LA%09Õì6é­pôjÕ‡K¢|¸ðè êRÝ4:BÓ¿'»º2V6WLÎ!°!LF¬ŒwSë MíÝc7L(Áu±ï1ðÇÖÇ9i ™™ÖkÊA«‰X#Ôãçé}IÊàJÛÆýAŽù¨pþô,F;E˜!m›±&Vòå°6¢àjÿ1œ¡P°•öbºÓÕ²'âÇ–ˆqéxê´ù«îêßÏì\ùreD¦Ø‹o´ÊÃ\Ãþú,;gœHG•éÔµðøˆÌ|Û€PîY‚ñú²i^ŒÔÎøú«RÇEtèÎ,%Ú¦ÁÔÊ£ŽœY¿/þ »#*'?¬%BÉÂ&é”ã›]9ÕOÚhÈ÷À|îóg‹NP}:øbÙÔœµ$0Ÿ–‘ü(;°|çZÆOëTòXž‘ï^ _oZj~YæàD€—Åh ‘õéÛ–Îü¶oi?™i%o(Fú>öÚÛ¶7»Hx/œÎã¿%@ýçTŠ 3Fܼÿ—ÓÀó'@¡.~$Jï}¥}garœv½ŠhšNçÍ8Œ­n}_7#ÞÁ†<†Ym‰ÅöæW̬ÉmºáIK½ü(æ¸,šŠ˜¯2,¥G¢H2표3ÅGVH‘­qzËkH‘:×SmýÑÛÀ=OOë±[^-z1'ŸBqaÅWc­‹wT:V³ûsç˜mÔz‚/®”Y”Áœ2ÓP¡à«üƒãÚX¾-ÎB+cò—¦£7m¶NîìA(FáËæ_Pkð>¶…œ–Õõ'|¬hj=lðÅð´ä7…Ûùç!HZ5³t(ÐŽjkŠâ¤?J?jFÖHŒ¶RÎmíÝ*,í'#Ġ`ÁkˆžÊ'ª.ÂØF†„•+>K`&ª=Þ¡;µ_}µ¨âÝžêI>½Úo*1i¡'œo!>hC=§$ç¨[ˆBC˜Ë®û{òQ%Ue¸ÉÔ³ìÁfô³Ÿ¨P;Xe‚óž|b3ÆÕÀð χ‘0Ë»Sü°ÆÙ‘ƽ³‹n*•–S×FZ<êõý¶‚²_ü„ó+?Òte˧lçPšl€ï†TºJà½-^†@ô õ ž}ù^…G*WY¿µlʤ¼Yý'&§ G1b•r.IkËtÆ:oî³’dÎ6SRD‰u¨b÷ù ¯-R ÜàÔIw%]ÐÖQ¼Y@«?1ÙÞÝÍ7̹U©k´¨`t¨¡NœÄI•]o °&ØZƒÑê¡Åp8³¾Íb4ä*øÆ•">h6qÊ.0#Hi¡¦½'F©^o«íWSÊË~ÇZBtÖ²1æ–§ñªEZ\Ó¿½±w“ãÅO’-c&‡ô•OoļÛåì¢Òié½êù6KçÁZ9…„¸¾_<®»±5}SËRÏod%i¤ ëÝNêÁç¢Óeo¿“ 4V$wêd <‚·`w½(t[™~NK…üuž­‚oYBWY%€fÍïèex®·yNxQ¼[Æ«ÂUÉŒ¨‡Óδ÷CiæZ_šŒ¢Žß"›é{4ZÕ ¬–„€³Èä¾b÷„BSd‰ŽàÚ{›­WŠ_Žqþ«Ÿç¸×ƒ[D…î„ß\rï3÷´+eY²¨_Âj'½”Ÿ‡äµn€;¨Žø™º|•AKØPp½ÜÞÚ‘$¨Ÿ­øûfÄ$i®ð6‚›˜%·×oí¸We Ô+&…hᘎ~]B.z¥žçÏcÛÄŽÞ8@2hä¶7¹ïuÐÂvf›4Mœ7§_¤< ;j.ªŒY¢¸(úÍ6tdj7fÅ•ÙsøßIt÷öwTe¬¾¦U™¯ ž¬ xô‡èS$ú6;ŒWÖ1¶÷:(á”pqeúÏ;”?tNË{,&©Ù\Ìó±×@ñ3õáÁ c„£Y'ñH3‰—ºô[•PõfÖ)N®%—2&1Y«4$–l³Dµ\0ùOgÍ/rRid+OxðQ2c’’´‡ è£ô‚<^9™°ì‘N+Õß“QÔ”U20>«>¸PÂþ.s»pË®0#¨!5g4nh)”=ÙÎ2l ÿ£Õ §|÷µúÒ¦@_•Ýw¥ý¼ÖÞuü@gC0ƒZ±Kð™Ô¦’¦%Œë.žÕ…Nûkþël}€ˆ? ÓȤVwÎ]¾9•Ë9Rç´ÿq~JzÑÒÈØ|bzR™ß¼p(ª>¶±~.‡ø¤¹¦à{8ô²J›’Ä©ÚÙZ4{ŸÇ Hƒ!û²:ïf?ïÄ26zMq›1RãÊ'-ìŸõM浡„$Ù18­dI"Áÿ€Y¶œ¯³_zl„Ù#nJå}¡é[+ÿ x>~ô5wϺu³‚Š*Áö.ÚkÛWžH.d+Iæa½­âE išØˆò|®±øq&ƒ[,„†)¦¸\K­ƒXBíÝlsZÑDë¬Y»³„ïPœ¯æ­Y|˜é²_övýOB8á©bá KõvÑéÒKѳAîùŸIï|òñvʘm#?Aš¾sÒW°ÎZÁÊYlDä¼qÏæà›d–€hr³‡ÐóN'~|}ÚU1SFv ŠYÌPîÙ<Œ‡6PwÍÜЃǹÕçšzn†^“µÃGwÒ²èD‘Ц—NGI§b“ó¾Åpì9AÊx4M=,H7õ¨È¦vâë¡G<©Ôý7‘õÆVÓ"Ýç‹RñwðfyÅ<4m„“_ª–NE´A‰rð÷u…¯š^äÐKÔ1‡¹œìëã=\²4qzà8•è9ô, º~ã6Zq¦ñ_H1éÌ7vƒßx‘ èlBÙ㩺&ÏÄÈpÅíJ<Š‘S)ÒL:·‘Iãa”M‡"šÓy‚Ô…bØ V;¤…JÂÖñ— ×s¬ÑÝ5×™ñc²daz4!Lk(W\1ãv¥A#"@Gí‚£²D_:üðu‡\FýAa% §U鯶\Í¿ù{ƒ©mJ¥C‚Ž‘£@lÉ‹]¨ÒqrZÄáOâ)Y:cfjw!©ÖÉ2Œ'HV÷<°¼öµUJOE­j^ÈP—ͼ5Ý| Oô×#ä>œ"±166×®æf¡Jß^ØåR¹À²H)Ý/WN´a••rõZXm$n62Xåi¨?ÄK+9Zá%zøÂ*Á[ÄØRM©#Íw‚“W'6„QÌO©Ã~ÂÑþM1Zåúö¶úm¦9Ÿp‹0v•Ø3P·0­€žFg•ñwÄ‹^mñDmÝæ$CÒ,©¶|à½õ¡¥¼ëD%‹¤…Ü´FéßL¿šždRè”ÏÛ ²ã'Û)â³úe‰åà äo¦i‡XÓzü¹Æ­þeÔ‹¦/ö¶A’UÌÞàÝßuÀÂDtÀ_==´m¢­/^/Hqˆù¥ûBÙö¤mŒšåy¡–%0ô's{r¿Ž"ýµt$Y(¯ÂûMëÁ~VÁ>ZBˆ$ëq­js1ùöNÆDý€I fµ÷@ò¹šB g|M/qÛìç®ydÛ)Â/Fûc În´nlóAJ^yÁèÀ$õKE{rJ{µCN!Çb”jàvEkT©,lÉîÍØ'²y0³êƒùÎQÁFM)Wd–|Â^VSBø~!¤måm˜¤ãšù{uq×=üH.&jùÍCëœiVæ(ñà"VL¹4]¦âÅ'¡úÆ:ÚQò[½3µ™…Á²Ç‚è«Ô¢ù÷JÿÕˆÉÍÈ›ký\è !i¦¢TÖà'^Æñsâõš¦w³9nl—¤K·^2ãÛ†‘r•¸ÅJÜ[96.ôYÓ‹¥Œíw7\^$mmï×D¿KÝüR¸eB.Ù¾ƒóýi…îl€xý¶8éøýUyÕüUû#„o%Cy¡àƒ™28ú`«gÞꦾq£˜§ˆ,OÍy ü"Éõ$üú2—¹¢î=Ø{¸—Üo‚É~Azh2íñ%ÚK5€gŒs°/*fçoÆœàiÚùüX‡¼»ß¹sªb»%uâÌKŒÛ}Wáå/ÏÇÒ-™kèÅÏ7ý_:µÚ‹5ѧºÖŠUʼ…PsÑœ“°¨?Þ7R{á± 5¤F°Å™¯Ìã&Ÿ®&z=Q#¡;˜uF öøú<Èzxüè“‘HG„cŸú‰»)γã DÌ"CÁW!~!0KOª$[WðyÇh1“!"!óVƒ;§­½HZc”¢wtŘú †¨6}ŸMÓh"eªµ„6\—ÈÿšíÀUâµOd]#ºÅj¼Xc6‘Ú{![4æÅõÍwYJÝ{üC½3íy“Èβö¦@"ÁuMÓN/¶Õ·_Y;ŽWÇá=Eª# @§erÃhØQ¿ÏŽ0¼Œ¿aŸÊãå¯Òh""t4_'ŒÖ-év\iO#Âé©gO/â"0­ƒ N+<¦å”n©| £ißú¢p‡ZFÀ“æ‚e;µú,ƒ|YÓë Aé`®k0±qZ¿g/qóÃ]ãQ¬'æ )t#šs:`A¡è$¢‡÷Ó½ãÀ…ù„˜ö2—§8³¶EQû»¤Ñº¼Ïi@ÈÉ!·ùåŠ*¼Õ.ÆÉñÖ·6n!ÉÐ<Ú¶RìÅÞä›ðbæ¶Ú>…k:†©×Ÿ¥ª|¤¯ù„ª8…ã_Œ<õGRˆáQFÛâXHÄJ Ø&SZÐ&d÷Ȥ½›oU¡€´3uÍö„€CôÞ(ÕÖ£ 5%Ÿ²¶¾ã/j¨’YÜJUÚ±’tÉæG>»«TÁGS% YAb-ü:*aoë}ƒý(?ôÅdÛÛC¼DûØ!èrLÌÆ?S?%_šFÅKa=A4]ßÀQ2³Kh’“Çd, s»Ä“(ã,:›Ï¸)ã?b0†j(¬¦?ÿn¦ÙÓ=Ïú¢Ãü±9 ûø¥Ë¿ÕÂrüBx€€£#Ù“(dR™ê—¯×o5¾#•D¦+è]¨±Ë8=]»9=³†©áYaÜ_Å7uèÎ;§è°§$ÄåŽIÙú¾¶:ÊïÈ,¯­+û¿÷¬‰iüÒB$v 4‰šÁÀÙ±Cãªqéböêk𔼣ēwi!ÜöR„A†>œt!>!:{[Ÿ_B$DE¹‡¶U.~vó|ç“x¶x¹‰v²Ä鱿¹Xq÷q¯ïFÅþ3Wåé´Äÿež?:û* ‘|`6’Cq¨ì©! `•=å·ö1lÑ)0HJÚ§¯)P î3¼Ðrh`¤tñQ¸û“Þ©æ’Ôðh…3?–w]I‹Þ>ªXü.9<]ÜG„Éù¹pÕŽzÜ8ujg+yèO©1»jE¸jD7FÀÜo¡š1 /Æ>&˜ÍºÁõ)‘T Þ´ãCôO“ W”›þÉö4 ³‘æ•ìf_êÁ—)$œÇèyóâçÁ‚Q†õfµ/ ˆÈôBåÏBTÚHÎØèz³%!þ«ÄW$L{$é¾?Ƨ|ÆHÁØkXízy•î§ÑØø¢¨ÐÊ8H==‰aµåZc%ŽÕ&§§êBf ü]Ë~|#n]\h&7Ål«^:1c+H! iâþU{’ÔIX@dÃu¸¨±ÆÐ¸ …JÏeØÖÞ»ñ ,“Rœ`Z:4žØ!'Àh -<³ˆí¢Ï\q–Ž%Ô‰³ÊR‚¤(Chä«$_7t"ïòÊ|ÌC^ áÍÇëí]·Ž«¦iüÄø;Dȇç¾äHC}GDð,¿'`œ:ào â`’·«Äyð!ñB¤T¥Ã>ˆå›ƒiíÀ(ù4dEZ™,¡æDÅQ¹Qø•*iñÍ”)ºi¬\©ìsF==>¡¬÷.¬rCìèX³ŸD3¯¶©¬}­SÙÚÉë•R&ïà-#®y_®nŸ±@ýî^,¥'¬+ñºÂ׌!4Â(ôO ›„Z*Ür¥me¤¥º@ùQ³O& l^³Æ!§Tfì†Ãh£…DQ¯3TØh:=ß ßLSJkº bž©ØÒSf1'_‰¬.k“°&îA­%Ýéî¶÷1Òú—W~s77"9 bkWKÇd° y«NÇo_•àþ5"û¡“OR£30’OÓ­qûæýû ³í唜÷ÎI¨ÌxÕ¸²ÿ —ùÒñ/,×ÏœI¯{ž„%;Ù¥‰ý“J¦Üz@Áað7SÛÏ1Ân’­S ¡5ïš:ê³çÇ?Û; IzË Ë? Œ 8ŸÉ\"ÕÇñÌqèÓp¦'‚m8•MNBy’¤ø±Ei¸%Ôü…Ñá[¨ò¯yO楷J?k™£ŒŒ…^`ôpB¦…ç28d@ò<˜u»|%Ò·U0¢©xéò×V=ª)ÂTœúk3T)Ò[¨º3ÅÛ!ë ¥Ú8aáœ-¯¦ âMó3p.ÝsÃ6®Þ˜Rg•H/ÑÈz™/~NU«ZŒ[Þ¬À&òxÑ£hÛ½€`EþŸË)>fb$Ñ£‹¢¨@|êá­qÃɰ‰:.œª•ZºØ©°{{/CéÑMüµ)b¤Æïr£$zr‰¶“7ë¹¢ã-C<´ôý·ÊB0:f_^–Z ³oŒXkXPö.%ûÄæje}$–®ƒ%’"~“Íüâsg»â=椅â8_éÎ/ 6¬U¢¾…fp‡›zá=²èßÃ%£#弄½èm¿è<]JÛz6Bf[Ô¨ƒÈp'ÐòyaIÏu"ä‚| ˜Œ@%¶¼0Ñš{a;Ãc—Ä’#nA–å&+qɪ©kK'24³¦öÑ’ƒÁ509øhi?®1Ý'b‡òÏ•ÀÄá\FÌqQ±Y“fzÄ*Á;f_’[M7qªLÆR3ÚQŽ+¿„”^{}:²ö¶hƒt•7~â²ƒÑ—Ó %)­dCLCd‡Aì¡jÛÃ/’ËŸõø4W”Ðf~ů¢3¥hkžÎØ¡‘¬°O9)ÿd\fÂò¹ìµûïȶ\](½VUTæ{!ePº“¶ˆR÷ʸ7$„ À-Öà«¢dù Ž1¹qb…»8ø6¼“M+á@ F†Òæ&;wSà 5ÝÞ-¯ÍMƒ³Pê›E*ðwŽ<|z®è {¶‚bßòÔçL;æ…œ¼]Ϥ¡dÃC~@8¾µˆ6'_CÒˆ ƒXò"n\/-nå±þTæ‘î œb€!ݲný0ïË ¹6ލÁ¿ÃF;¿êȪ%&^O¾“)œ˜é:ú¬×j•Åÿóðó TŸ¼ºiÐ\N¤GÖÜæûä¤ÎCûËæ¼µkmÄe•*·e*5MN—/éõ™¿g`¶/{ó*³'âÂ0x ïQ™ï•‚ÚÌ8aé°×n1:k˜”x<¿[Qå×:Ò n&\+°Î‹h?w‹ØF[/Ë(¦bl,4ç–º× ëjŸZtµ2Ø¡íæTØ‚‰êaX‚GcÞrZÂÌ=JI®D½f÷RϘsŸwš &À1Åf»VŒ8|`ÏxÉàÎäòáàýžÌü†zZ—,)«÷Œ…]Qa»ê_¾¤¨¹}þNSv-L¸Ñs[(]ƒþ ©ÄÍÂYö 4eý„y=b àdÞ˜“v-æ`zÝWÖt™N2År»Vcm…5cCų7Ûã;¬ºW’‹} ÇHVQxšù¹!=~•X&mÒ?îXeC°/è~•åB<Ƭ]€( y:L‘zÝä¶‘ÜÍ‚·¹Í÷8ûnu-ÁÄ»mºÐ .›ÉOæ"Ò2"õMú:•:ˆ4É2œU"XAæ%Ï(z}£Ôg]¸Œ(Ýâa0=eÜ '3ò™ÕàçOrÆyœ\| ²{dôçã0Ê%MWt’¹NpƦxj©öµ¼¾­PÛL¢î2r¹*`^={˜„¿ÙEæKò,MÐ黣÷Ê—ÆÇDNêÚó1µD±"!’EAÖÂC|5ë’µIº‘ŠË±œòä×)K­ã@9X?ü?ðÞË„ßcëÈÍ¡£”×%1Ñà T¹4×+ÐÎÎì(&{+ªôsãÒð…aÅæ?:=³˜¹X«Á)ìÅÌt^º§ÊãCû½'Ab* ¡ßJ?›zß*Álæ´¨?~Ò®ÛÑûôš#£Y¦QH/‡”(#Ć—à3¼sùÝx‹zCÒ@Åš· €@êÜ…NöóÍÅ%sˆ{Zzfgnhx 0Íð—°Š¯,†z˜œe’\eÔÁÒŸáC¸ ,M Q‚uÏœm(YBB<³ÁácÚ˜ÍïˆhÓý;»ŠpXÕÜ3bÆËÐu€¤²Ù/L0§‰˜d•‰ÙDÕñø‰fM/¢5¸ûc6ª|w W¬ bófÁ1Ê.hÙFÒºûWx¼ßƒ÷O…T•H„ÎÿÎf¥9½›ûƒ Ï9šŒ0†l&‰®½ú°ú>^d´XøµÀpÏzb/‹²šžm=Y«`‘[0Qø³·øÊÔ©`¾ÙM é{ª$×´~ %º„Jm“&ê,;s.uã®Ç2•1¶®¨ EÑÚ+S ¯¾ín{,2®2C›?2Ç®Ò “ÈWé ¸84‡›ã€ãi@:qëMØ38€>‘Iú|Mç·ó©èýTùS{M¸›kÆï´$ªïv^wÜú§‡·ƒœV\¯(ü-èóý‡0uˆý²-züK<šíÓ72ìw°\žÃ*†,[”° )­Å÷—Evćꋊü™eöæãq‘‰qQÅèÕ1•}žÓÙö MGm¯“¹=\ Tü/â™öSuq‘|H¶§ÆŸÏ²Û×R÷ ÷pN¨A˜¡á|!¬7 K_m¦¾y Ò¦×`“\Ðôv1BÄâÎd_šyç­J¬ë  “Ãá[#»÷hŒÉÏÚ‚»KµÂµ’Ãi“>‹­Päu$i¶¼.Ä„kÙ«Ý/ùEÑ W°µvr‡ÖB¯—¥¢–0Ùôãõ¦4Õ½ËrxœCdݪ_ì-äQõó`îázÑ–‹1ï¥UÏÏ]‡C⪱øê6{Ñ=1kx©æo:´ÔîD%Ö`Êfu®ÍtèÃü‡bd)íO Üya1…s—þ]]ú˵",89ð6°?Ôk¾UøÕß*,v¢âÉϰæ!d#îÓwhj?§)A{º,X\~Â7´¼p\Šr td®†×£«ðF¥öÞ[Üøm<€‹0ež’Ë=…'`ì…>·¯‘ÜQ?wYÖàPž¡ A•7éKÙ’pÆ‚u'·9WåË ëÝ„xÜ 8‡.¬õüQ"ìæÐ3uw"±´ôÐ%¾Arõä|£ûE´|ÎÐB"й‘|½œ Ècž_ꮨ¢gg>­€zLß=Ì‘N)Ћù-¹£qϮŠÈtDÖ«©ÉÈ%¨²aû³™)âæ,ê¶£Ýwå"•»\óyË:V@¤÷§gFºnð1ðæ±—)»¸JÈ[F"±½Ë{Èm(úõnyVtAó­_Ÿð¸A׸çUç°ЭÒUô}péî>¡E€i®*±H]¡Úq{&­ ¯8e¶,!“Ò?±(йK0Ä8”¹g5ÞênBi¿Ó0—YDžÅU4¬ÛúŒ&äqã{ø:¶³™‚4âP OLVn¡[Àý‡ÚÔåk@IªÞ¯N>åHp[¸úIx1Ùƒ’¼¦h¸lgN­ÓɪrÄÃÉèBªÔð…U•‚7Kƹ@hß2FÝÄmæwþl«, Z)‘ù iÎÏXkÇI”9ýÑë*%îæîÕ¹ô5o&ñ³ÙkQ^Í%‹¸f;(ÍìZ%Ü ÷XcYhk»ùă0œ’(ÈUÍO BÂæ% ¾,Í:AÿÒ_a±T‡ï“Ð{¦YýMy`cíá^Ò Å’~“5cïœ^È£œÂõ–ž;›<6©œ4l›kƧ#ê„eó àô˜Ò°BŽ¡Ý!m‰ÑŒÊú„·vL±,¢á Ybh&‡ÎƒµMΓ~x`¨S<ŸŠW3w’ø¸uþöÇ''Àr˜Þq<Ã=â•>“eÙ?3FÛ&ËBˆüMµ2Ýg4qKQ¨`Œ¶ë°º ¶¬$dó•”1uTç0µƒÛâÙÏýUÊ)AeÆì}—Õ’d«æö¨iFš‡îÏ!²) ¦"ŠbêVÑZXkT즹é´žž0mÃÆ’K–rþ½^ñÑ«õFÇb1ˆVF_5¦/riñ~ Z»°}#I$Óó6C˜¹»Z Np‚„r€©ø§µíWGäXC ÞWð»’ƒó[ß_ȱr.Í6IÈdŽJ©¦"$,¡„çï§­ë‚'banñz/ü]F±Óªz¢õyGïS#(ôJ‰2{-ÌìuÏçèxÐzÈb(¶^^ž’%‡ôíXÇ’œÂ±%3D—=™ƒ××°øcÝöø% ÁÁêXd®‹ò\"ÌFrV.á ŽÉÍ©Õùp%öw×k9ÃfHv™0°Í´'Ÿ EÑ¢¤êQ—¼G²´V·ÑàÝm%,êb÷Þ]–rOçWk-ÔÒ"ä9äI:¥k:»-ê}’e]æuÅÎß²=éÃËž(¸ €²} ªÔNϘh½ W\ Ρ\ÔwºcVû¶W=èW_6•óPªP¨À{P"B#É˶—=Ä 0gØ’hÃ?ë$I°ÌÎ"žœ°™[$úi061­y‰½Ç¬ ‡÷OÇK˜ë@̼@8…i÷ÙË‘eá_b\žZ“È•˜GŸ vÑÜ‘AÃRõAã¹æ5F3¢Âš[¹U¤—T9ý>çŽå_1<ûR–ˆëe‰Z‚¸úÓù}h™z«³Änºæ™gkå¸Àõ×Áž7Ly{N¤çè¼ý¤£Iè’is¡•øÎpdVÀ ´ìÉHt¿¿¨óP¼Eë f‚ÑœŠÚjAÓŒìÊJKA/½5O¢ìLÜAZ£Ýmõ€­bêÍp¹59D¬ ÑTäª<±2µ É;5† {~— ceiÑìž6”]îSylˆö­À Ä'T.ÏB—šbdBㆠ1ș͠CÁ8/ùß©ßÛ=ôbLÖ´‹|‹ëš¨³-g#¸¦wèÅèE–™Šœæ—£b5^T:×T±ë¬17m…››ÁÇyg¬Y¾¼Ãç^?=°ˆ^üö:I,¦ß{ÞÑöƒ¹Å¸ùC57nÇØ­¸Um³äà'_øü ÒS˜÷Š«È´~ÁÂQRaâs°ÜyºJÎÉÛÆD\#&Wsç $:E dÙÌègj­»ì”[Ôqn}:ûÔæ1æ"fœ(+ŠbíYPl¹[žol¨ÕL$‹Š¦þN‰ Y×F’Ú¯”Y°YÅôÛ0>†ä-kimÞ©Á—[ e`H-žà˶”GlOUfV–M¦#š æ`?Êõv,žAé~×) †±d߯£g#(3Þy¡þÙsN| zè¨ÔuƒÂÞ&ƒUHë5.‰“ ˜émVºäª7Oáá(àƒÔ [>†îŸYbïÆ‡ ËzT_T>…¡s'Om¤‘‰]Šê*—Q*ŠV|Á8IÛ|ô/g)‚h“1ëLve Y¢ÍßjÖŠñ¸slc2…ÃA¤Ÿ %Ð÷:Ãùž)ÞµÛ¾=!âšöލ”ì2ËÕ¢`‘ºX•ÛÇÀîHCžÁ£«mÝ8‚£H\«m'ŒüéËl,&ð(¦€ »Ê†Ïy‰÷ÓmÐDª`º&…•….êÅI˜Üí‰}¨°§Ë#æç¬z>HÉÑçfeøJVíç©G:‰‡O—-б{ºr„ÇÇÀwi„kO®pÆ‚|D ‚¸±2øbr Ãb¾)£ñSl-ªI”&´Ñ¶Ì*|(aö·6l`32ÄÏ¥'û6·Ï÷:¯ˆ@\ùäg–áÚwûrÇ£oµZO‡“mP¿H1}dÄs{(¿spÕÐGtË;CÄ` 4›8Ûõ Å }©@›¤ÍΩ1·d.úóÕõÜšcîS?b9G^­Ü›êœxpI—«à‡Ïþ¯÷è ¸Õä<•FÚ £êƒóÞ¨sVZëŽkéÕ À‡Xžðƒe¶ivkj3¯+®ð댺LŒLmÎPóNÔLïpÓ/ÖØè á¦}ûÅëÊ‚hH¾Q)QŒRɰ©Þ5øK¤8ߘîÿE’| endstream endobj 1201 0 obj << /Length1 1625 /Length2 5992 /Length3 0 /Length 6816 /Filter /FlateDecode >> stream xÚ­TeX”í¶¦¤Kb@º»‘n¥•Fbfº%¤$¥¤K:$iII )¥cè<£ßÙ{Ÿë;û×9ûÇÌõ>ë^ë^÷ŠçagÑ7âWÂì@ê0(‚_X@H  v±s‡ÙBñ+à @-„-€Ä ØÙUÜ@¶0 ªj‹ÉL@@€*È "–––&`¨À\½ÝÀŽN×Cn^^¾Y~»ì¼ÿ "á`G(€õá‚À\]@PŠâÿhN €¨èé›iéj¸4tŸ4@Pª}w;Øðl‚ÂAܘò×`ƒÁ¿Kƒ  ¸”à[ÜdF…¼ìA®¿!>€+ÈÍ ‡£¾`8ÀÑÍŠ@õ€¡öwào(»ì W7ÊÃ…¡ÈôapÜÞ ìŠ ²ê«ªÿ¥ád‹øFÁ˜Ê³wÿ]Ò EƒB¶`(€y!~ç²€`¸+ÄÖ•Eæêþ#Æ:þKÀ ähë„€àp ŠûwwþU'àToëê ñþ ûãõO `q Aå´G r;‚¡‚¿—E ê ýeº»þó¹ýi×ïáF‰° oä@ ¨ C R¸þoSøÏ ù?0âÿÈ€ÿ#ãýÿ ÷ï3ú—øÿ{ŸÿN­îèÚº à¯G€zeà€G€ßï à÷C¶ÿ_!¶.`ˆ÷¿ ú»£ è/¡¿¹þŽýE­uDM„_XD@è/3®öõÁ{'€ƒ-Õ¬?ö'P È †‚PCýÓOT°ðß0c'°ýsèïîKHÿ@Pàßµ£æôG¹ Š™†¹>ï¿{Zÿxê£Vaìí ü·4“Ç0à?¿y”•a^_~aII¿¨4@XXH -.êÿorþ!þ×ù±- ì° þÿñû×Éêo4jP{ð÷Ò!l¡@ÔžýÓð¶wwsC÷ÏÕG•ýóŸ¼@ö³Ó0{ÙPç´ŒtD MNïU‹®aÌÞ0×â:ãÂü *X{`ZÄ’t¹Íuu˜@ýˆÌíGï)¤ëÍš6Ïz5„³=´ŸÇàÿ€»3Ÿl‘£E’wý¥ u1qúŽIŒïÁä£XæBO×—¿Z¿»ÆaiuÃ;8çzà‘DÉvæJ`ŸZGÕJZF^S€ÜáHÚ:?ãìèëýÜ~„ݹvŸ7;Ÿ]Ö–& ÉòámãvZgãÉ_%“•6ÌbßÕ#𫚰ƒ k]é¾"£Ó¾Uš¼è(ûs“*›ôÛÚ"#Œï­Ü(>„~૬Z~ð4R&'z6Ô—ˆßÚöR©¬~>jÊ-¾ºoxOiQô¸?‡Šs3(>yBñÙ+äÈôšiú3Nj®9¹ëø¯–Mê1ä4ŸæVÑ f„±ž*=9_ÝÈ¡¡ï•l€~Æ$‰¥ç¦±“œÙŸPÅl,Œè>r_¨%c˜ö¡ãäŒ,8¤.ák¤FnkS6íß§;X*wðlE‹Z$£4îеÖaK­¶E¬ßg/gè@Á‰`0o¡l9ÅÎê/mþÂ$9D­l…% ›ûÔ¡Ô¢ŽÇ„§ŒÛöÚ˜cŸ¥1Þ&§’Rdhki\¾PJqùùéLÃôõ¡ QOÜsÓ~ýŽ ]ANä úÛñ€ )lÖÑ,ÐYŸ*.®ër5ç&EŒWîŒãK晬>æOà•öÊ _<æØÿàRêÒÊ¢ÊÖ¨`Ù,û¨ó²YÄM·´I9ÃQ«;ŠÐ]Ùok£n,±.vt‘[f?Hk¼èßÄžŒ­ÁÁcÁãiž”¬Ô}Oûõ¡bg©„¤‚ ñ½cõ‰í¨`ˆpm{§^X ò!7> S°Q›‹Ý1Š˜´—qú&«Bn“DÕ…õ±5eTëq’‹#C«i½û‚v'ÈO *Ø Óãö{*z8¤¼ÏO²˜E^P+¡Æ~5(¸×;SÍ´t–Y›ßø9“<²¯ïÚÍãDÞßÓ¸¸'!±[益¨ß´èôùƒ- vÛ´r±î©¦¦,F©—|’cÂ(E÷úí7s'ÊŒhî'lÛ”Mfv ºt+lÛ_q–¢<íh×wpÑ/[‹>Õº§­#á"öÜèUöÐ7‚' üÕÝ´–ø`tzM©âÛ/žd8­{.7ëWôñµËˆˆ½·µ-ðJ£°ç$¿7¢ki3Aí^ª›©m\¡™«ä†ÓÇ‹îy4Ú—ÌÛUý¯Žh§Rí"mW¥dpãfj!ðãÍík5Ï(ó"k\l«=IÑI_ÛP¥ôæ 9)MÂõ#dG_]§- å¾X³2$/*V‘sb;Å´ä|çŸ.ìUKlÌ1`ú\âEÈéaw¾6´¥©päŽÿ“¢ß¬¯™Rv×+G|*·›3+#\rM-fÍyB“ñÈ_¼+Û–x«‰¶ö6÷èh¹íLù¯bk’pËyÎ…G1—®MÝy–Ú“U)Ó–àd^"ñ¹H<)MüQ “@ »æÍÕNtIÉÌ’²¸Ñ[åóSx¦q™¾ÛÀÊÂ4¦¾àáâ©ÊèêtGùŠòF«¡ï¸ŸŠã¤Wþb±h¹.3‡Ä —/ ‹'°îâVáŽþ~10KU:{1;#R  ”<‡pÛ &ëÐ…vâöß$†Æu÷{W¹(cÈ.í*tçgáÅÁpÂ|›Ý'Ч[…2Dm#ß}ú@¿H‡£÷«mË ÍsÃwû¾vWß&8ÿª4PCÙÊ_½¶7°úã·ŽáŸ?Ìò?r~.šSö¹Ôi>&·òÆõ»jƒm3¥€âô’Ño°±ü(zÚ«v c–$?êçß“£§–-*ß_ÏÖŸ¬Ø¿g•Æåýð³Ò½vP‰üLW„®åxT†±þEÛÙÙ°ð»¸ó>6øbAD–žq£`!ν;Ì*…àŒuÛ¸“gxLu„¬º8ÉûG¾Fu™ó³WëÀBi’7ÚN£E)ÓÐ)ËíMêÜ‚‘©okš)E†¦f3ÑÆòu+”W>­-kÀ$ID+·Y£ÒSmPJ“ ¸Kó6§ß³é®Ú¿÷äCd˜õX8ÔPéÔb€ `3‹§z°í9ƒíšÜa;ç6í•^•, )–§Tx®öÜÙzÈýÖ§I)t:øDÝ_óv¯om•Évv ÆJxh­Jl†y¿< ƒÑÇF'd™¨$‘UK³ÓÑïlC‰4MÇ¿nø#ãó`gIåÏ#dð«wß-!4ëcÂÖlY08%ú}wÜš~Oaé’KY1u12!— –û̓ù\¸±ö9†+ênrþÄáÏ6Iði1gÇ%+´KzÆZì*vòV›“èÍð±Ù5¿¥¼ëí-÷tN&ÒØ× ·xQ¶’Ý\¹óöü{X"µNê™`… 3÷W}!¬ên´Í'ú¤ªºãý3$¨2×U^!òéMψô¢5[ é$d$1æÓ]®ºT E±§sMóù8ÊäÕîÙÏMg Ûs *“ê.áÖã'äÑ×N´7×ïT°ºß„œÙpؾ3%=?æÖ~‚"£Ô[’wb{4>v^•ùU'Í8ß»³"?“Þ0 ˜dýˆSjN² š°R¶Ùé÷¢êOµ8®µÃ 㹩öxdEÉÉáÄR»”4¼¾å€ö²öÉñBÅ#3ƒì?n G/a 4‰'bîÄ^êRIß77ÿºtK8üýñÊÒ³_ÞbŸ«’<5J›Ën¡£¼È•íâS0=ó‹Þ‹/¼y8ÂèZ±f7ÊÇ«^mÙFß—˜·ÜT{!<šJ÷“û½\OŸSž8=¤Å¡¡.üHýrq÷Bí¨G »"ÖÚàM*éž›ŸU@ þÉC¤fŰé·oœ6|ê<{?QßOR55㺈ýW½ïÇ5hH‡ÍM©•¥ÆvÄœú)Æ?¹LZøüÄI¦çì[è¦H`3ÐòMؘ®ý ÂKtÙ:QOÞ©S¨ˆ}Þ”gX¦‰ÂÀ ÿ°Éž•m% {¨<Šœ¡â ‚ËY4ª~cûÁ?B^Ö¼À²CÈ­Ï´¾3_ÉÔC;¾wûQ*×ì—â©‹ÁYÈ#T~hõëЛôW#¶ë®Ù¬"ŠÔS`Yéhtòa# <Ú·z,äÉ,Â|VÇT5 ­¾ºjÍìÖÑ G4ã°Æüb7~ŸnN wT,çÈÚÄàó(Hã*õKô´TÍÏ ?€ºÄi°õ´¦äE³rœ\N´I¶ßZ_ûIôï./S£Ë[ÝçÖ)O)"ª×ú ønò:·™ Á‡Æ˱²÷± Áä÷^õðþާ³˜Ì¯´{|wtC_aÄo}”iàHà õh°$U†<·#<Š$@à [ï$pûEõYS¾¿SÍÑbôf¶ ´6/®ü¼B,tBthg5Èþˆ:^Ïü°…D;I.–±Ë‡AÕ\ÝLì ¨+ëkÊÞÿ¸òk´·õÇl¡T'úÞˆ¸ }enjÿ¦ÉR¢¤åæîc®Ï…©ܧþªµŸ|X_Dó9PF/+¶oT"O¿Oí<Ú¬ ?œ‹òØKx­°^¯O°SµMO®Ïš(©ÐP¤¤¿ÞA=Éøeê)0mQæ‘·[ â*ló‡©ò8úÇ•ÒZâ>íjØÒ‹‰Ù£jÇ„ñGã—«o%¿gCOÞæyÞ¶pX\¾•O•žž’kdâ"ÙäϘr“Om9X…wH ø³k Ô{ç`ð§/¸™S!Uu)^@ý“‘½%ÒØÍ^³´€ÑÒò¾)ËîDÑl˜îû:F%£.ËöS¯Á_͸•僡K*~›Ç…eÙ§"pkˆ_BL‘¥Õd1 {¬(ÉTÿË€pn›†ƒÜR¤©­æ+©_^Õ\Ìb¢÷º.œäíà.á/C¬ùžË¬ÚÓãN+dÛœgœ¯Ô6Znp[Ùˆè³Í§y÷Ê,îû Žýs¢ÛкöKR¤Lù¢`|A¡Ûà.3ÊiŠQBfè.äpQo¾žò›ûò™6gÎ똓ò*këÆZÅCêË™fœÛ®c–— ‡‰á>ÓââîOŽ«®‹U¾P÷5ªHí#æ€ÙRCž†0æ0D%ÃxðU+ã5–[å™Ù¾Y5¾‹Œ<¨uç2 àÿ2ý>á‡I•Œj¢#¬P‹ÿõëc—’»—N½}˪ qgvEût„æCÁ ;^*û}t±e‰®UÑX Bk6-H4Ï~„úÛ-s&HßøÝB‡Ü.½ˆzøm´áeNõxûÁä…ܽÊ%ѯ-ÌàåD‚¾o8£ÁhOïjôî´.™Ù‡îý€û說n„ÊÖ ;¿õp5±DþÈîíøÌ n’Ó@52½/kètªe»úeñzë ñ…—¶´ò£_´£ªœèG_®~?›—³KÙ]“É0Ï-î6š¼´º6Òz>ˆ&Ö9 +é°ÎV¶Þ¶iVصÓ0ìl7±h%žW„°<¨Eö^i{e7Åé5庤^»¤³,ÛýÔýÈåOèÀ|°F'8ŽöÒ¯H«ŸölY&Å›xZ,ÿ,}äjIÚØÖt×¼dPh·¿†f‚$¤‹ë µIÝá7µ °©]ŸZRK¶þ¥þnG Æ×·U1;ò¯ÞôíÐ’¸(L =d¿8& mƒÕEKXåÜ»öØâl¤+è™+ôW`”Y›ªºpò”ƒr1ů“u"%]9#ÑP€j:â´=«ÀtgX˜ýöÀë!!Sú~ôùÆtŽÆ¾øEd1i@Öb¬ã¦^#3€}>¤6(¦õÌÕéÔ݆Ñ9/è€[JÛ¼\SÆ"ûÕ{éy~ê ¾ƒÀÌ,]uŒ½`bI¹4¹$…¯ù³Xbô¤±^uG·›-ùÜ·¶V0?~ÿ­ Ç;tu*úØÙÂ.±[ý&<æáßð Ú_q·Ï¤àü©h|-ã3±b ÊLô¬€}ý‚WôE¼’ž+?}‹Ô6èÇ—“çD?;¶ð;½¥~Ô0´zñb§¾Nç~ó8¥ÇÔÿ8Õiã„éMÞ€‹RkI ²å½ûTåѸ•3Qï슃Ui7f«Ù›ÇËRïV2ãY5´Ô0ΫK7äî9[”äñ°¸öˆõm·üüR #º8õCÚz2ý™ùödï\‹r扭óÅ:¹tp5N1ÞùHEz>á 8¼j@2Y&œÍèýÛ`?°*"Xå˜õW©Ð·E‡“A‚à—Ƀt•Á2ë†[ [ÓçòAI‘.ê*™ˆ>† fï-—_ß=Ø®sÌh´M %ò­Žq”hÂçcò´äÂaÃó.K¢,¬ø¯8•eYg#=óXs³Ï)×Ú—fòÄùý•޾¤bžïrô»2—%Ñ ''`Ÿ1­>W3eàÅg?󕈮g¡W\g•¾ùa9ýúg~¡lp,ڦ׊z]#Ûá„νCVäìæ•Ñ{·€*k ­×SgM£E}šÚòw«—6ˆa‡ ríÑk%ø^83š2ÄÙAŸáН®•Â… ÌçìIRJñ¸ÛöŽ2U¶™—Ûc<‹…V…SfúœŠ¹JèSÑ`×;õUÓC,™©±«ðD C®H;/¶=â¼v$7ýœ”šu“ÅÃãåÅ2vÒŸfîrz+r¦C2Ì…—ÈÇ9µw“üa„_飵CK^~il‡ŸÏz4éâ<¤Ÿwè- ¼îLtÒ´’N¥)¨¢< ­Ît/äE²Ö°eë9õ\­›Ç¶Õæù÷~QTßä”Qc}’»á—| ~´ƒ>û>@‰I8•:ô Þuü~g‰¥GŒN6dŠnY¢Ø€ŸÄ%ME¥|³f¾¤JË8=Ä7¾ H‡:¾‡׳àƒJcÅû(?)\Óµå&‹ßWËÕª¶é·)Ë9§™ \È0"h=r?&¼7Uê•>–rúbâ¡ù\[ôü—‘7oŸ‡ÑÓ†vI|Q+Kytt¥œ–Ân˜Ñ)üZF¹Sç+¶tÀ¯¢©¬§EÓòëäj§ª_7™‰ñjåѵcTÄ6ZÝòí‹×îØvvx×Oð‘"9pzò"Њðú¬]ôŒ{H&_`Ùî5æœî³ÿ£··iœG¡®s‚­“.áz®u@ŒÌäiþ Èµª¶G¦×idÕŒñǬîlΟµ»¤RãÄAO]ÎO ]o·ÊwæiÍ.XÄæ ;&­KMøÖÊŸ,°°D)w\%뇧3ÒÈb ²s”"Ø©p¬ÁŠgT±£¾[4µÇæ} ëM‡éîg–eíÇhc8Î4‘uý.1 rîr¬5È­¶Ñ‘ÝñSn*¿Ê°Lg¾Ýå.)íš ‹ÖÈ2(-­vUøœ“ËGÀh_“æG÷„{ˆŽÝj‹ô˜kz·¦ûŸÜ˯a>.ølX‘ft‡$¼Óé.,£O*$ ÄÛôOe50ç L"f²Ç¹•OI`”.rVæÄã+ýôä%…ò˪þº¨ŸÀ±aƒ/|󜜰µÐÑ®9ï¶&¤ø£'¢'®x9*Æ9q!÷]N<úŸ¾hE ó<0,J5$ÆÄvå¤ÞrOPi¹}WW05»[Y^Þetƒ—8©ŽÅ‡’,ÍÕEˆþŒ^€ÞbÔ¡©²kIJžŒ<ƒª5òÓ=y!šÈ% ˆr¼n*­Ùxml´ï$Ö¸Ð-æóè?ÏwÀ¢€SÊãÞ(èÅWë;Ž‹‚„å=Zõ‰\sÛï€?‰«*†ÅRmÓ_õ ÷ÝÛ:œª–¼ÿÅÛéi endstream endobj 1203 0 obj << /Length1 1166 /Length2 3988 /Length3 0 /Length 4740 /Filter /FlateDecode >> stream xÚuSu\”YÛ‘RZ‘ÎJº»YB$†™bf˜@JRJBÑAABZ”E¥‘TJ:UB@ßÑ}w÷[÷ý~ÏÏ9×uŸ;®s‹æVHŒ+ ‹A$ ’Øåãꇷ‚£%,w?0”ƒƒ¬Qoà_4‘ÐÂp ƒÖ†ˆ¼µ‡ØŽKCÀP ¢“ƒ×™?18؇òÁÍ€óF¡‰”6áç  V~X¬7 @ZxŒàa`7bgÿ® ÖÂ`q(wXø7K[11ñ¿¨¢¢"Ø5ðO¬ àQîh° qáxc°?*SèhGlù#ÖÜ ®ƒD~Œ ö °0))¬ b’x7I4@!6ªƒFja|~$Àƒ~h¦ÂâPR¿êæ…Æ ƒÿ»¡ÐÈŸ#!ý°R¿¡Q¾~€öƒ‰èoÌ €å ÒEˆ4ð×R?JZbŸ$ô G#Cƒ±,Ø îBQnñ ÆÃý0ç„ÿ_âŸ; F¢°+àN¼†¿³aÀí½ œ€C];@$!(òãûkåH¼P$íøw¸)ÜKÙjYZŠý:û_QššbJ èeY°„´‚Ñ)ÄŒŠr2¿füK‹?uø‰šÃQÿíòwJ´¬øÇ8DÿÉÀá‰Þ ÿ´±øŸùM1 ÿm«9Ñ5ÄôZêüÿ4Ö¯5tý¼½ª"ü‡`¢x°1ø‡"ÞpÜ¿Âá>(ïÀÿqà×@[à÷ÿ?y poBíîý—L(¼.ê€4GØåO•‘?ß!`ŽÁ£~¼d°Tú gíBx¡<žx?)ü¥¤A¢Ðî`+Ñ•pò/àðÃáˆòü¼ âÙ?÷n(bƒp @€&Æ0¥hÏšè–Ã* ®‰¥~™Nùßö¿ûñÊ‚’¼I$Ït˜rx•pÉæ~Qø=KÛ¼ÇCµÂÌ„Œ4æ—NÒå/EÍVIJ&æLgôã97$k•Ma´;Tƒ»NÎÛ‰éWµ_êo_,Û·PÕêc²ŠÁ°†q^Y^ñ5£àâ)Ë/§6[Qdû¹e¦ï}ÝF1òºMâ›NcøìÉБáš'Ìå­L.£c]štra#1z BÍŽ+—}ÉeX[ß3鯭Fêm¤íâ 9BËŸ¤zi¾}x-:BKÁqç6÷ -=Ç@„œ±Ò‚Š+s4¯«uHø5­Â; ´Ëºke_ÂlPIvÎ%?cJ½óS‡ ½Ò=ã­ï0nŸÜ£»YZºŽ2mÆ|Øg†{>úku´Í-ô’T_å!±¸†©¼鯂y²b`åüÆ}šÑÓ ¦@Ky%5@²‰"—ÅZÛX=KT¤¸•êi±íÝøTeù¦dvl}úrôÊ7Óé*¹–À³o=õq0ºÅƋߛ7ÅÜRXÊ?”‚‘…º êÊéPX ×OŸö‹i‡EˆVð§4`·‡æ˜RÚmm`ñJü­*·ÀÙm;-½ƒEmöQÑöÕ4Nu½,—œ“'쬃ÖË'ÌÔ½.øü¾kQ’•¸L:R)¥$Ì”ìH!#øÒÖdnã³ä¹¯&BÎ}Š$ïû³Šï¼µðíY1‡=0§ÕJ³ß#]‚8ŠOÇH’i_§76m»NšQ|âY#ÉbwÛósh:‹==Î+º4Ö!\-ÓrÈ·ppÖ6ÑY®Šv«žo‹Í¹È‘;äMMLÉÐÏùñ™ÕtŠÒ¼¾gßLÖQSªV)t|Z¹ü¢…KLÑüjêHfª‰ÐË2ÜšoHEöàNÕT©¬À…„»eÃÍ”ÒÐÍ‚ ÅéKOJ¹;¸'à)ó¡‚ÌãW¸ ÑPF•«6F äî sﲸ¸ë¨Ýó»/©x”›J²íoJTb"Zäs—úÉM_08I‰ui žP‰`¦a*!3sÉÏÁ:»xÕÌ›A²ßf¿7°Ìå,ŒìvmV/î^—ÑM?8~טü°âZÑ™4\Ó­D²˜“–Ëîü¶k2œ´º÷©â&¸=æ]”çœM±Ö­/ÛMR®}Ö"_nÓ‡VÂ7ăØ5á/ªè‡ú–‡ïWÂn_|·m4оá{OÕš'ðMŸÕ>™{\b¯7mZL´cjÎù‹ª,ħÅòÙ2d‚HßWQ'Aƾ” êž -Å$S“ÓÔ8¯÷_Ð(úÞp*Ùø2ÿCÍ+i'ý–þTÚôtÄP‹hz¿.¹Ú&«õª.­,‰ÒÑÀoW¿µF°‹«zŒÄ†«yûËls]P±‹Ýœ®­·H–˜ >¬¹{Á ·qb(éXŽõdcªô¶[¦Æïâ-nØ”{ic É7˜‡ƒÏÐl%…Ê8èךâQíûV§¼‚av6Žc·ÚbXEÕv5Ï¿ET1^}<α¸UAyÆGÝ¡(wÎHãt˜Xº”ßàèpÔ{­`h²G[|1\òh½ÝÇïP-¹ô|Ýiõ¨¤äw ½p=ëZÈT¦gb€K EkYÓ«ÚЮ¾'Ê!áÕg.@îÖ­ó«ÜjˆV’¼•cPÓXBÑ8m [ßX¦}‘§´-+MsdÏÃÔ*Œc[ªŒM®/·âÑ”‹: tn†x‘ó%™üyìЛÉòÖ¨›°.°%¬ŒóoÜy³‚3³díô:Í r·½C¾ÕBÓ–3—3»YÑé)3©¾˜+ÏwCêÙæ×³YþýL½_7ðuc5ÅC0"œ.于ˆen±°ðA˜å®Së›ÐŠOÚc´ûÈ¡ _S™-¨ü(}n±‚ÇqcQÚt%¨çâöÆŠjÕ½BѸ î“ÞÊÑÊ[ôÛF"Ö‚Ì¥Y·Ú å÷eï.æè‚^ÀlR¿AwÊ}Ž)hÀxžÖ;È‘ŽtaH¥GþµÎÅJiYþqÈܤæuŒ¯WÔ´8àúE3|G‚Ï™•ŽÁ²lÐkÑsÄßÊúX¨ì8iÙ̴ۘ«6ÈINèFwR­${}»w—ëÃù<˰÷v<ÑÜfúQZmö® y~?yRŒDƒnÕYŠEî0ˆTzhF*úAî¬x øeÏžÚõdMòÏ?#?ÎŒÃsîœØp¡sZÒ`…§‘öèp_l ¼ý(ò ÂðZô­ß†âÚséÆõAY>g•¤6ÆëS;¬LÅFM—9c¶Y¿ÆjÌàò^Æ—‡ Ÿ%]ÀÙé#QEïjbH^_ÙŽ5Vë*¦Ä#Õt¶ïo ÜxW¶]$÷²+ÓŒ…³œïµcW˜ Ð]yÈ( ÝŒ9›]Íç>|$½'tf½]0ΠbLM[øöY-¨ÀøU%‡ìoMÓZVšûê$Çha™”åÊœç¥KŠåNߢ‚[¡.FŒì¹/H©Áʇ¬4 êÆuͰ,XºÛ0«3ä¤2O¥'…§î³;þPwöÛ¡éáõ7 ¤ˆ—X“;e”§Â´êýË-bzzÖ'Š1ÞœÖ2‰äÃgþ÷ŒM¶»‘*©ÀÙëŽqÖ•Á’s‹u}k¯W÷ü•FôG—é—|z‡§Ë‘‡ àŽ1ݧ'åþG\xç” Ééê“·¶ç)…^ùƒ¤gTkf-žÊ^´Q÷ÂÑ…®Rs§Å>zS®ŸÑ©ÿò1‡žà=ž<}Õ¨*‰Á˜kôááÒ -¯¢ÍòÏ’‘8˜×l\Èô;NáÏ'Ù]¡yjÝ+œE¿‘eaƒ{£gùEj$–o~£yŽPØ›ñU «éÓRIåwÙ˦ÕÉ|:–Ú|”zs—%Ëöxî m?ß\®ÞY„8À£Úœ´|¶áÜ“E9Wʵ²·ôÎ'î›:ë¡Î¹}4C¾¾ÍÙË!ããÂU‹›LȘϬÆÅ¨¶Ì„òö5•ã%2‹ù®ÒÍ—{ýÛºOÍßE¯íÜUõ±µº—9o¯r¯µxÂ~Ôò¶¤md^Æ3H‚Þ®‚2‹BÕpdMµ¹®îE}5­Ôþì¾Ô«iâ~öQ·ÇTXµ‚®Qãób9tVh–ZS_?'¤Õ_ó¡ã¦55·LÍÆÊœ¾bÔ#¼–XA%CÍ2ÕÅÕÖé™;s®†ŽÜB±&×ò¾‰ájk—wéK¯ÂÐë³øªÂ!VâBCBê(8—eå\( —~œ4q ñÈS´Ë÷âHà]³œÛBËÅLç¶šò/Ö¶ vmZFòèÔzu¹7Þœc­+|~‡“ëuÏ,\¨ '''š’½ÎR?½^iêËùHf–‰Ø"%QÿÛ³-ÇùZ’m#îA>H+<·ª\c\é‚üñóŽñ÷™ŽÃ‰]%@ŠWÃx¦·dúˆ »S[©ßý”ÏÕ¥!q³øƒBÏÆ“è–ƒ|‘bP©ÿ7uWzŠíƒÚéÃ¥w¨†ÛßëªÖocŠÚÄJ éDÉ+–W+†|Ø—z(;§Ôïú0Æ3’M‡/V{„\C8ò°%•cËS#›äÉh*xÑ2Ó›XÕ WËIH)n Ç‹&Œn®FaÕ|ú’õ¤û ¨9|Á„¯Kq÷ÅG¤ Ór&y³¦ÏοqáÈRòá‰Úzð@niýÅ~8X9^ÓJ¹¨´EüŬÙ[£ÕæûxÒk³Û ¤¹ØY~õ2ǘûHwÆ¢IΈ]Þ=FË´l;ÉÔ8 H@p7à7 ½Ò³”Lð'ùfɼ0€¿ SêÏ)kîgëVô»)÷§„Ÿ8PÍ¥ž–ˆR1 #«X]af9—;GÎga tbö}þiÜÊ5{ΉŠn ~- òr²ŠŸ®Ï5õidzq. ÊGÝÒÓú7äF5Ô§›ŸNj†@øAeˆü4hÕˆùéÍèÿa\KÁ endstream endobj 1205 0 obj << /Length1 1626 /Length2 17414 /Length3 0 /Length 18263 /Filter /FlateDecode >> stream xÚ¬¸eP]m³&Œ»»³qwwwww6°qww—w ·àw÷àNp txÞw朩óÍ÷gæüXUën½º¯¾»V-*2U &1K's ´“£;3+?@ä`îá¦îä ìħȤ´>å\TT®@3w“£¤™; ´H-ìì6>>>*€„“³+ÈÚÆ@«¥®CÇÀÀøŸ’Læ>ÿKóéé²vP¾x휀ŽîŸ!þ¯5€@€» `²$TTõä”e´2ÊZ #ÐÕÌ êan²(‚,€Žn@:€•“+Àþ߀…“£%èŸÒܘ?c‰¹ÌnÎ@ ЧÐÛèüŠà tu¹¹}¾@nkW3G÷ϸ;@Žö–ÿø”[9ý ³«Ó§…çî3˜ª“›»›…+ÈÙð™UURúß8ÝmÌÜÿÉíúTœ¬>--,<þ)é_ºÏ0ŸZw3£ÀèíþO.s Àäæloæó™û3˜³+è_0<Ü@ŽÖÿ‰€à ´6sµ´º¹}†ùŒýOwþ³NÀÿV½™³³½Ï¿¼þeõ@în@{+f6öÏœ­AŽ,ÿÌŠœ£•€õßrKçÿ¥óºþ«A´ÿÌ Ý'3K'G{€%Ð EÙÉý3%€öÿŽeæÿ>’ÿ(þo!ø¿…Þÿ7rÿ+GÿÛ%þ½Ïÿ5´´‡½½²™Ãçü{Ç>—Œ™#àsÏÿ,‡ÿ‹™ÈÞçÿÏé¿ZëÿVÜÉÞò¿êäÜÍ>["æhýI +3ë¿… 7i7ÐRäna°2³ÿì׿äZŽ–@W{#ð“×µÀÄÆÊú_tš6 ;Çàú· èhù_áRõ/ð,Jjº:²ò ÿ‡åú/CÕÏ!p×ôqþÄö?KQr²üÃ?aÄż~Llܼ&N¶Ï»÷ ˆ›5àÿò_Øþó¬dæî ò|ÖÍÊö¯êÿçóŸ'£ÿFÊÑÂÉòŸ±Ñp7s´üœ´ÿü£¶ðpuý$ø_—ÿ³êÿuþ×ÌÞ@ „Õe' pÛÌœ,÷zÜ‚áIIƒþ^6Èáçò&ÍÒâàZ§ž Ìè¾*Ó׺æÓüïí>K§Îoòô‡£½8ö4=éÀË"¢ º¾bôMêN†ÃPãrä¬3x¿«EÅm(}nVíÃÝI5uã²WâéNW¸«Gº` Ïâ`,Êg”@‹ŒÆ$ì.´`õ%§gÔ_hÇF†‡zn ûò“à©ÌpÓNÉRÝ}L]ïš,Þ¡Ÿ=yœÁ´Æ<œõåW%˜S,›;²•¬j6éƒrXjt™w—êjn”Ò´CâÅÊ$Õ<êŽçd\ Z—ˆÁš’³É* Ÿµ’{šÝ¡¢Æ~? Ìò°r±ÔCËsT×·ÑÆX÷bÆœ€1‘B}WðæLóbçJ›) i0äR~6Ï>Œþ¼ë;ç什ÒËö]¹E5‡Yû¦[)wCš õ£ó—ÞMPTf>¿b!ßš/íõÖ¨ùH&d!Œè@ʺ1ÝÄšs~ÜÑoä%¯[üLµ³Çk¶ð>¸Ó µe¬¬Ã­tÝ;ëj¦Í!Â_aøÌÁ‰¿Í)2\¾K£J«ØCMîY_¤„ˆ+Õœ'èù¬×¹¼p_]Zafùšûp6qòÁwAÔ%#™…™'$‹Ì}Ø2ôî/Jœ* eŒ´Â£uÍPŸ¡œŸDC*±î„å.³ó[?T\áˆscÏÛ1w ˆ¶ùs‰RÝý¨¶ öÀüד£yÁL¤;7-…“ :¯.ê’å0¾€7ÞLδŸý˜3’õi¬H¶]x¶”$H`®Ò–315œwÑJ»‡y~è [gæ-†uOÎs;í´B‚ïwì™^]t<~Ù~3z×O¼KiöÏM®Û¶â‘A žØ©b‘,iÌ9¹‰³¡0y·êeqΨwÈ.»kºWk¾Ù¼dgÒ xï vzá´¨ñ'\'[3…1oBóbðâÓ)ìÇÅîðFMÉ_ˆ0K¦3%N¿øÎáõÅ–PH„¾Þõq€R´­G\cåÄ-ß¹<¨›ì^‚ÏÇ„ãL.x>ÜÉq37TO¶2€ãÍà¹rùëÛÇ~?^1Îv©e@ “éí´ ‘v+äG†»ütù¡b…p/ìJðµ7twÜ Æ}ÔwóU"Õƒ†æÎ:o™i°öx%~ këlÆ>›¦öd(°#hÀ%J¾[ð{ÿ¦ ’Šó…ųÞjðÜuì^º›‚zÓ“Þ—t÷•_Ü䱯ȹqâ– ñõJãpªƒp$EåXWà ]øk8Ø‘>{B>¶Yœ|y¹FÔj.…Bt?°‚tA7½„E_oŠõéò"Å:Qßf‹è6ÕÑ´£ôVZ±Í¸¿qZhý²,(‘á#ØðP“ ä\ríJANNz+ÑF?(Ê$Ïym@Ï@Gá_ê`ƒTôsÙoLŸY` æ{|ÝäÆÇŒ¤/j©Ü¦w °Ý¼K(Ys:6!ó.–0ÝEODXž+q9D‡HÄSp"[ÔJMpØÊJ[fªæTcð¥¨"i -" Âÿ:qØÿÖ2„rÎЕ¿xÊ)]•’Dš× Ù Qœ˜W» 1†YË$©=ª#PÂÔ}qŽÁä=* cAÜühŒfJ.P[óGæ³™¾êµš<)t¡2S[³ØG7!: fC «@¥û½äP€Œî¡¢7MÚ>6ÔHôDa¦¹"7*Ì Æ–$5±ÛIàˆ4Cô+%t¡‘ë‡! \ꇘ4´’[}"ë×zÄàéeYéöp<ûá[14ý»nÓwCQX;!Ó$ÑNTÈxy›­+˜`öv2w®!¡‡zÌXZyº×pLùö ­–Ÿ0Šï]oúðU’‘ï=“=ûA‹ø­%’ZÄÕë÷Ò;ÅeÈŠüŽ.hâ/"Öƒ·™Çä´ÓíŒ; uc7SÃ<®ýÏ´QAêN¤B?ii 2›j¸ëlí1çÔä^æ¹5‰ZˆI¯o„\3½LKÈZ½:ÆuÊÝ…=µoDÁ|Þô±Éñƨ]:^ÆŠúgÍ>iùÑõ:^"/. þïàX-æ ·M¼ÜSÁ-³©¸tëvn£ÜA]FLûêß,„ÄÆ=!ïrCée¦.ù3D)»b¿ˆ÷9€dåˆ?&‹¤zajïÝke1\=Ã3a¡[ùtÍC4ÃO„±^¨OR¾HO»Œ!¯³È §ˆßóüye:|ôíæj\8àe,õí5}‘e ^—™H̸͑x Ù’OŸt8E ä¿“ "¤9'{@.Ý?Ólà éZ,3íNÒü¥dÀI=½XER²S‘»¾DèJ0×.4b˜q:1J¥b^ï´¢q¬@)&0ƒ0 0%n€!z”Î9û?Y&¬­kP.EÊÂÖF†¡Í¥a¥àióY³ô›Âþry (Ûüº<át>dÀöý±D'¼Nq #ñ Œ›‚± ˆÄKÙ™&V‚4 «˜×!]ͳnÛè3:Mî»Qö:ÙËœP¬]ÄÊΨtJné³oŽY~ÝÏÓ•âaÍ@1¡‚ðOUnû2ã¥c“)*ëþlc9lü<œÕh’g_µSó+=RV†\xßù^-¦%P;¥sw¶¦iÒp¡Å¸œ$w¤ä;~ÈÑTG&HÒÒ²shö›ª­øÉøµ¨Yàs[ØežE _6§ê°¸c+Rô•\¿hDšî› ¼ïQfôЇ@E7ýÉëŠó_ÖFºÀ^r¤”§N‡ŠPéØLÎåÃD¦Ÿ uáá#}íœÓë£åц‰|¿x"Z;pÐ-G'®¾Ç rZô™cø’0`ÕÐêPdïà,¸x6Ò>£-g•äóÛÛŸ³__g(¦Ö¼Ç¹W¨÷r—ã«üŠPç±]u^4’.'Kÿ˜S¯ËoücÁ‰nˆÖ<5ô&KÂÏ—€ Þ‰ ÿB2\›ý¼<»Kø75ðû6` pÝã óãA;kõ€i¸«.'QiÞŽ-ÍMíàj÷­4æPa›:qH;Ÿ¨ŠYA-y…•¥ì±–xSôÕÁ%œ¯UÔ0%¿O!AGb‘°§ðtxØö®ëóöœ»ñ—üòõ.›8ÎY¬R®<¨jb.pØY¹÷5‚¦jèÙL]4VàWLƒÂo&‚prC”,’²£/ûâÊOV<0—™ª.0õÍA³²Þ‰ƒþíËD&*ܾ‚~®Že¥»ŒMÉQgAHêÒV•”Ž ŠE˜ßOm»+˜ÙÚ6)hþ×ûÁ›ÅÖò ms„™½ÆwÁÏÐ.Czqó‰5¹Q?B,¤«;8t•C ¹ ÐâxÆûPÄÀ·_³@ù(½´šoßûÍ;×>¤%ƒg¿%Ñ­ã×F’væÍ¸ß ©ä‘`3BÀvÔS wûU.…ÏÆÒ×ï’ÎJë ‰.ìC®È2fíÉRt²w6hìç&¸ÎY$d¢j`Ÿ€í~<žè­{»±ÒgÝ•IÎyg®K½ an Žsì6­>øqÏsNxÔ,¯óè_`+dþ&ZMLœx^oõécéCÃ#V 6%ã-½¾}ª ua»âc 3ÁyfÖÆë0_»Çìì†ruë34ȇ×zÚ8Þý¹ÚL—Ìõ=½à\‚ç&†Ä¹Ø¡‚).Ï`4g­ÈM¹Â;˶.Í/]0ÍÔ­{àƒ†ÍÚÇËôlÎ×Bœ±>ª@FÀ—öfV^‚ƒG¡* 5ƒAeiŒÇA,ÿäQ"ÃÂFl”ûÅØÚÏ‘uãáJÅÑ-Ñò,µ¶¹”]潕áÈP,‚ì(náý¬óz«l£ —nÌ’N7Ù%Ó[̃ܥ-ìb~ŠuÒ™<êÕŽ`…#®“Û’‹5¾âRQ´LÛ|o´þêA½¹+J©‡Fì/X׬a1·è·o64‰#}û‰oìô©ÛIv”09‹ïï,A3#ö “œºenš¥å µÉ99±¿Ñhɰ§Ü`™….ßç¿©'‡ðѺ <{K žÐð¸Uàô¶%žšCó,3*£¯%ÅsÐ8¾na/K<âC pó¹°R„ï/$5e‘ÛQ]ÍŠ|FœDyçÕeB¼Ç¦Òþ½µ÷Õ§÷I42:¤»9-ø0ÆÕ½t@\d:©p»ûPó#å:øy õk“k_‰¯÷ý‚ ò`òôþÍV_¾ÒÖ2*j½úÂ_ûžJ˜ÉDdäé†ò÷ðïxIË)oT ZRî—Å þ¾WÍ8rÂÙ¤Æ÷¨¡‡zú½ãü§«cÕOøþÓ¿Wwe><‡(U#¼þ" Oê{{M²â’„áü¶H'=LgÏz}_ðsIomÂì9$nU”æë‰½|e¡–õé!ƒÕµDi¤³x Eh3ÕòÑQ¼œ#žøªW‚®ÛßêS}Q5wlwE‚§˜EIɼ!"o`Ò+¤ì3gó4Řôé½*ÊEp*¾Ñ"̤ÎiKÍåöF:·Úg^!t{ÁóYLA’Tñø,G‘Lpfð`âb :v©b,䳓¿”µç™¥©2I2´¨w‰èÏ$a'BZïkyÓ¸,ƒq&é³þ* .›1~tEï¼vÞx»eŸ;U Åÿù²~3RO³Ö r¬šà"ü#2¨9ïvsˆ¢Ê&%ØÈBŽf2ZÞ¶jF‚NµsÇ W”eÕ¶£ïrñ5ÐfE–|sV/³Ý¦Óæ¶‹NÙòŽ| @ ›SrˆÑ^•"¶Æ¹¨Ci[ób"zmR‰o}h~*ÈKÍTÛŸç·ÿÙOP2¾Îï‘öž©š£¦[”IÃL 8\(Î6Ï“#þA¾7#èÚŽ‡@NxǸ¨ÅrWHˆ­!`ÆçøáäùNåTdªE¢ÿ'Ó ©wºR8’CÑS-[`«þCd´ÆÜðGÃ9eÌ1Fêymù{Šjûxë—ïš–:Ûƒ z¸/oYóÊIzckr\͸¬ñc ¤õÎkàé› (±g·0MHëa«há¶qfŒk‘€©pҗʯ.–ÍýÀ«FÖBîŒ.Øß¥“·Ia’ï•^ '«==óÆ~n½w·ð Ý®¹œ«&º™¢îÅb§‹oø´‹¯æ Ñ ƒ™õ†KHìw¦CҾﵣ@¤=™àPÒ"Ã3 kÁ{AŸkh3§µŸö!ª/ ¤RN…LFÂnÛ4ÚU¶²oí!ËŽ2Ø8%=|ýâ”+;ˆ"ÁéÓ¡k›»1çUœ]±yPª3‚œæÉû©*8(ñÄ,pÖE \ Ù]Eó¾›;¨8t¤d¤?ib;z§™R/Ù•u`P`äÔÒaÀÐv bŠ“ÝÛ~Æ÷¶ ôíîÚÒpOQª¨u•ÝIö'¯ DÄzoøB_†nÂ/~CVÅuðàU›àŠÞ£SÜž`×Ï ¡©ªd“À+Œ$M•=L<\Îks\œž@qœ— s»¬9ë@Ævˆ“GèÙñtçö$~ל† °ZT}»™œ-ÐP€­ÒKwÁû±¥ýPg­^sq%¥×ê%h߃`µ’™mŽñV–|tç±yçx,¶DVòÑïÐÑÏáŽJH·1fýXï§8' …ÀHkÕ?‡dÝBfÂ/­us¢Íµ÷¼Q&™-Ò!wZ‹ÇH¨°üyr5lî‘¿úõk@Œ'ÓH uÞ÷p½·r%ræâ(SŸÎ:Ø×ºÆ´ï ¿kdÀÔÆZ&žº8 ü4ôY§Óœ¹uÉ]™_Åú¿—«úÂÀQO ÿSËy}ßl̺¼ÜŠ€XŠkž "E§åkþxP‰ûÓÅ-Ýdìâ‰eþ^@DyÃôM$8y(!‡Wˆý~B±à:lN¡ÊJ×^Í%ñpÛ—fù‚*–$àËCgOøû=Êr]ZR¶×9­šÙ4H+ð³+h©—-ûùÊ6´ä7 ŒA\±XŠéÀšNéÙÈÑÃ:ö¦œ"f.sà&4ÄïÁS%ïÆÏšu÷ éà”jȘˆ¿ª¯zÆ<$EÛP9êgÙ–1º!y¯N¥¾¦‚]Sò‡V˜EgnÀY$`éÊ@Í( ŠO“ÇÇå•«*¿¿¹(lÏÜ2óõx” „B¬¤” ñ®4˜ƒƒ‰~ÔèE2¤Ã¸fv`”è4²çÓÐýqüë,Œ &G1Z¾¢CBsEFo#Ï«¿üíd¥Î”LÆþF®é§àô¨A?¿œ–Têâb£ÑÖ¹£–¶R`1Ô»3ú×/<í@h¤»–.ù~Q"„gmžú7ygGѶٴ¿ê×o—(Ü[E“:L­­ŸkÄ7ZxðšýX¡ïvÅÆ ¬‹ê’¿ç6'ÛŽ¾µ]Üõk‡‡©‰,§r7Ô¼Öä'—h{D¸¦„_Áª¢bÚ­ûûÕ˜$$ û‹ÄAÇ–õ±³suj&þ‚¶Éxã_Ô­b¬Ù¿DÁ#¯WWÞaãš‹”raîxä¡\O2S§ó¥ñ|Ž…©’̹}•^ñ–Ú{CD¯/ZS?$|0J­§±‹¾hêƘhdN§Ïõ¡zK€7½Þ”$^”3œÜT7#w×B '× ë]ó÷¹–ˆy°m•¢ûÍùoK:~׎ƒÊºÇ Âþ‰)úÍêÿŠFøþ÷Ž&(Aª„@€¾¥°Ú¹Ÿ5£š>¹Év§pœk†™—Û%›¼xw˪¬™:ë·àHá_׋¢?ì ì¤~ͯér|ìø|ó.ÆJç N§Ô“í dï Œ2Iöž6Ü5F|°ÙŠ…[Zñ“B~ }ê3ýÔÂõ Ö=„ÑÝSXx.oíEÈ:ìßèzª¯)³"»{³”ü‡ü‘*Œù#l­4Å…ÜÊ‘éuÖŒ‰ù‘à#½m+çpÎxë0 š¨«¶nlSÄbÆqX˜ê¶â?[þÂà]QÖ þ}ß„ŠÛ;û¼­ã¯ò}Û…êh* á¼^ß}Õº"pÁœ—_í nüªF2võàyaÏŒæ§,l·RUEפ™_~\Kªç9YßiÃLAòµ [¨vùý#¢[hu½Å£CG$óYŽƒÍŠ¢šú¦›&2*¿œ‘‹:r(èßJ#˜ëåŒöP%G’(™Kó%Eš+ƒÅjŽt¹Â‘5û¾¹êŃ@wÎ5v«×Ò—¤()T""»Î4XUŸÆ¬Ñ%zOÄZm52Ú¥~ñq¸±öÔT9­g'ðÞ5KÎ÷ÏOžìbZ9x^pU¦3‚9hDk õ–=TDû¦¨³é©Áì•U ’íþˆŸHÆB°ÍÀ;o.æ…2{Aïꦠ^+“aƒÁgÊç!®ÆlºK³%Š?­ya°Î2·¹ /ÉéQôËûäxSË„ç­'OMÛ™FïÜ¿„LpªecLù™´°“F“dþèÿV–\^þ±BeµÜÜ]V!än¦}º“¹á5Ä4<Ìó†7íÒ¹ïÊ ¨¢ØâZ%&sÁ¼:mP@ÉŠÑ"ÛÊï.ÙˆðÊâ ƒÁ—Z" Ö¹Z?Žùe’˜òþ¶‡$òÑLµÌF)Kc2Éð¬N$jFQ°ü8rìËT³±?0O°X“"‰N–ï¢ç~^œåsßÍ»dÒ*ÿЮ€h Xl h!°k¢í¥+i’ˆ¢¿n‚°ëÞ¡RûI¦€›´„ž:¢éb,çä¬Zd›+‡pšâ×»òFHC\<ÊbÍëœod¾óLa/m»¿Œáñðy}e›µ1û™ÈB¯µ×€û}Š¯ŽŠEˆ a2]¥ÀìÅU‹ìý F€úìL ÜôÞåé`Šð¦ ušæ›ÿË%sÎÕ»¦Û@ ?Ôª@µ[ØÁÞêǼöºí©èYÄ Åá(mÌ ˜¾¸ÒÕEÖÌàòÒôwÚ!ù‰ß'"ï€NO™ýY™ùŠÇ”…®• g~Ëì*QñV_|mÊô¤¢Tì•Jq{>üºE'«4lV‹rò8´4 ?/„Å’?Q¥á[2”Ž~ÅMU >a:“µ£¤’x ä|M:Æø p¿¾‹nÀ–J‡MÞmBOsx™oºå©°ènUL…¨x{Åô"5zϹ£‰ÿœžÚÄ®dÀ!´³å|{)ääö!aøNIU‚7­}Ô° LŠÏ³Ð z“LöVÈéAjEzuiË®}͉*Ò²ì˜ß“¸Kzˆõ·n{a2$ ¼K´%¼Ço»OdåøÜ;s°V¤âýºbEK>ÉÿxJ6ÃÊߤ §Ý€žT÷ Cq¹ qØÈû^c"½™ÚéM ;ýþµÃ~§>ìHÇIy70Ûgr•øàUÝÓ€éÙýs›ø™5b5aÊ wÍ—]¼á©¬]24³C{Î[Á×àcíŽì©û”€U|­|°s“ëI €e¼ÔE­(ƒpúåøXˆhÎY%W|Ú>yè‡5$PL­/gH;ÏTõE}‡S·T`‘ÂjIîr— ¨…(d vl¹ò[½žÓ?ªPï´_6ŠÉ•FÐɈYk@CäÆä»ßMÛÕ|´ß‹4¬Z¯ü&¼]1¹e.zi)6F\iÙfgJfÔ¸yƒBî¡Ê—HozOd…,2pGÐ0ÐÐv·úq¼à`jwÆ~†þüŒdEXq“+s¥'D!iEìeNHqPœ¡²XƒeâÇÓ w2J—UÓjJ3ÐU‚å9‰fD§·=þpûû1œäÏ´Ìá3ÑêŸ5ŸõI`ÜÔ‹"`UJr9ÝyØ ç¼‚sÜpêäåãÍí¡èᾆB>©õ„Ô†Ç%y-Á]]PM"±¯äÔâ„'4ÎÙjìÏg-Ÿ±–ßz¡~¨$àŒZË­Fe4<ÿÅ6/‡¨^Ö»U‹3%–†¸ŒtΧQ}¡‚,†Aœ,¥èÚ=À…3ABþÆWöÄhÖ9x×y× &$,Ç9a¿Ô¹>0PâEÅÐ’Á`X ©¹®½XÜG§Pz÷õCº ªØ¾„Û‰´(i;d7å“aÛÀz…ŒØ~ÏÎcþÕó£­w!NDhO©‘0™ýŸÞ×ìhF8º”ûe¦»é8QÀe2ă¾Šè‹ÆUa"‹OYPêÚO-‹uÌPLâ µ{ß«­†Š¢ÃÑ&ß»º{Ðû£Ž %r•ê×K©ËÒù’«¯›-w®o‘¼_éî <,çÈÖŸŒ8n‰ê«‚ˆ9(üu»á”Š-MÝò±A[—¬5ÔœŽ7p‹ÔkØ"jB‰œtL¸ËSù³:¼ûÏ›T¶•(ÂHW.Ý8ê÷®®+w{ íCÅALºsrnæÄ¼1ÍØu~F!œÅ[‡òËÅíEº0öúIEŠ'÷°Ã!¢èËò½­C„¢¯Œ°¦ùØÓ©~Ç> %È!då÷š“)öFSûéG¸Á¼Ž‡®Ÿ$´jÔ+”GKÉåe¤™Êvcšš—kë³B0ÿ(´ï5÷u‹)^]'H¨ÎäMêÈ.5ðdsÒ®ýŽ×?ôÓB¶Ý‘!;òÏ_ umÆY6Ìñrÿˆ@Óùè–+ú6ĽÙ@z<ÓwNúeVú|"å<Ìd‘Svã‡ß¿P (›g ©þ1ì)9ûËëM§1–œ]hQ幦@~b÷[C«½®ú Ï2Ue mäŒpLpTß9ð£æ\þ; ÐI¢uøe8h“ḦhÄ%"Rƒš¹í¬ü{ìÉ’ bIÞÞW;‰&–€Ž«ê‘õÛc+ kpMC˜ÚêãçMJ=š7ÑÑBAÆëAÝuDœ¦L‹ž¥å²­8æx¥žÒMšUQâÏ+Ó )(…F£+¹º?_W“¼¿Xšë/xÚg˜2!Ý»Y¡£ »ÚuQ4DnyàpÍëS˜;½þÁ.Dþ<ú%›¾ãáîä²5ÃL¤AmØ q,R®46Ñ„ºžÛª†¹ÑºO›±|uiRí~|–àmA]çpåÆ,1 b8’êÀ•ÃH-(åþ²–cÚ‹uìQ¬ÿ>)5Þ]M·P®Å¤¹Ú7›,k5úÑ1eæoḛá¿Ez)cy¸bUña ÒgÞßNû侎ººx8û™ýäû'8íRø`§®Ûr4/—ZÌ$«Ú–ŽÞ lòfÌëÄ _!Ý_­XNB˽Ðt‚r– ÈuLi¡·;iWzÐì/kGÇÑ _ö½ÚùõǬž›¶ldkÑFª3N“5×⸬s>tسÃ%Ѱ÷¬A·3Í4½êɳý)ž#6ûì+ÒrùÇ"6\ âÔ=7•¸AýsÜA…Àóø\B´Éx@N°Ò °’J'üa9†¯ß2›î|úÞÑ”ôñÝyóRºÜÍ ÃØ*–¥-¸Z_ŽŠíR?LÒ‚[pQ4ÎÓúð@ö‘t}ïAïåÛ²¬ò¤©«]†œçÒ"¥ ®œ”U»s‰ÅO ]<ÔOñó™3Ñ–ÏÃmsqè{Ç}ò·¶ïi~Ví äW,H¤TMíÌ%—ŽRGÉ1šT}ø^=’‹¾Vuµ›ãz) *ÙëP†0ï¾x£ºiËAÿÄ]=¯Ue‹%‰ ¸ƒb’è\1Ù‘|åÉæ ®ÍÛ±ô⸇ŒjË2âºE úªN)v]+GèüóiSЗGNL_ ÒC3 ?èt— LŠ+¡ˆžS].ï=i× Ódµÿ"ÉÛKË…ñGêXáþD^Úê3–~ôqD2hÑKg°)Òó)9Ž/à„·švÅa0(cdŸ©–ABó‡õ0ìR]×^¢¥š}ÕdCkÿØ#WæÛ'ʘ~DõÒÍá ‡³£=íÈŠRÝÄÕâULùB½ ~S_¹*:7Ÿ§Y`Rbóüó6¦øšâÌoÕ+!iDñl?È6t«†UÃñ”B*£ê9°¼?’y1ÒÜÑÃn÷ó>‚ùÁtV°¦{¿"WœÏ%¤wà©VŒˆÉ¢¢•:ê  ÁõµÿkS0ß“ö7,iúÚñ/÷ÛIuOã'¨3\ÿRUd–‹³—ˆvÜ“d§§Å6Àß=k¬¡$ ¡ÈøO™È:8$³´³C•¶Ì¡ê¶:dû>”䥺}Uoëk(Á6r¨q^ž»â«7ž«î¼ NÓVÔ–“&Pø“®“†tÜjZfŒ×ï`w~rîVV:f—§Níµ¶IúéÚº»Ty›0°-* 0o˜ïŸÞ«=>š`ª$›› ƒŸ¨ÿ’ÛÎ_3ûH€ ä3¾éR­ú}çúÎæB§=æ‚Ê æâfŒ·Ûë¨(†¶%P„TÝ1ý€Ç,ý” GöSy{Âð^[=Ea;VF²mPšñÒ‡¶Ó؈Šów®£ïÀ0­Aý%ƒ6ö×õç!⽬ëC¿q|LPsÌ<’pјñ\Å6–õªÑS˜6‘2ö_šLóVìmO»Þ¡¾¾8óõ‹è÷`uE.^>ô7H†£CËåsü“#Âçá{íŠåoh !²,¤-Õì,˜‘E†gËù‡ þ‹@ƉÁìR’w¼ºÇk¡y :¯©ÜRö~¤µ¡Þ²Cå•@`<Óø¯öµYÔS¢õí¥®#ŸŒ‚ÛG Qàuf溒®öm›€ ê߂컺à„,Í‘Lƒ’ª¡“ñ³ûÇ„Àz}~1¬MVš¬+ö†Œµ‚ÙÓ¬V‰.%ÇJ—Zëðåi¹{ ~+ÃLOL…ÑÄv-ÝÜÞ€Âür¹M2Ƹ';9' ¥\r?•wŸ'Ød’ï “ÄÐ¥ý(ðñUÕGIØ6Ä•Á²8Æ¡/# sA…|í$/ÎZÙ®2+h%{ŒS“ü­î·2‡ßJo%{‡µø„Uq6åŸcB^ƒå]>ÇÐiÉf¿w‚¹Tu=¸=‘ ™ÖÝß‘ ÏÀ•{ö#ÈÌ,U³²d2×kkÒqtöÞá±È´:pBÊ vXÓ˜KA#/N‹±ŽqTEq›4ƒ”°£ÆÕ56ÉÎT’DÕ‹{ñ!ºˆÌÀ0¨‡ÎœµØÚ”¤'Êz8:yƒg =§¢„ç57áÌt×R¦§¢ý Ä¾Èö/”Ú—7§cIöî†ÞâNÍWeÄ¢:®édö@Oè…?{¿«åшGÞ¬´FÈØ8 ’ú`¤šh'dPgöwŽýóæ¢f—zÚv”exÆj:à½f>oÁ+‚mÖcÊÀGõN`!Ž+ÒŽ§"ëL: Úpü`– ÔðnÅL`ûs·ñ:h|ŸZDŽòü¹„xPÎÒ6u¤†±è’ƒ0–ùY dÑSŒÑ™O4÷µ|M¶_@»»h½AôüÛ)7öN$¤"ÁÑ6Ä‹ï|Kñçײ'FƒjïÍ6–¤HkœL%½ì ¤j¶äJ…¬Èê%Kä—3;¨²S*ÏhíD% YƒÄ5Ý™Ä2±TæÇø;dj´'%ÜEhb n[vÝÈ YKžAÅ;@‚92RÅO}ÍpéÚ£è+½YSs`®Ìˆ ¤î—D• ¯A;ŸS—¶aF»kŠnøLõéÓe òwŽ+ºÆÆ€P…± âE'>¯¯/9Dx%•îúfÆ,*þóF(X(tÊKrA{;áG=õû0d<ídcÙg/fUì¨ÉMºO‡°ÂçÑuˆ0k„¯]`þL.…á¸ãóú›¡OÝ?oA¦fz¦¾Çš»-D!ÝÑ®>¾RB&2HÄÖ¤©LÏð¶·®_©/ §‡k/S¨×Z¢±fNc7 êâ¾DÛÓqQ§Ìµ¡Ž'ÐЮ³ä-—)§O6d–JJe# &>˜a©6Ðùjá@öŠº®#‹`d73›½×xÝŸæ]>íÁ¨Ä uY¸L |É‘bÆAšçÈ*6ïôÒ;TÑöZ³s’Ca¨¥©IWlf4 ï-ð’_tW:‹Š¬ñ‚TZÒ¿¾5N¢ªQDuœØegɱåR÷DÂÏìüˆÐS¼D…òü3³Ã3ç—(Ã^¨—×Vb&v¯Éç"ô5Þ+å¡Ér1QcžºñfßågOÕOŽ8ÀTòÎù”þG²–¹–>…2ƒ†FoNÕo¶ß•²¥¡Žìã@ÇYÄh:LèI2¤ãà*Ÿ5¥á?­\ѣ˳¡ÇLY"ƒ·T¶þ¹Äº@øZ‡*Ýõ>\À2 µI§Ã /^h»/¤™²KV÷=Ï·×ÚÚû|§ºLÖ+Ý})G?B“IžZ;ÏèÎü]ú4n±NADíÔÈ_°3@žå‹xÄü?ÇE‹­ÈCd µ¸Ù˜Ne…û;yaÄ;#Ù —Ýù|&¤ÄžßŠì·æOÞNêóŠkÞG‹6¥“¡<ÝF9^4Úr‹ªÈÖ “zÜ6ûô Äùý_¥²VÓnbÅcؘÝm™âш‹!2ÂÓÞa™¶“–Áè™aRZÍÞÙ5OžsùH¹1¯,ÚŠ2‡—ݾqþÉ©®æ’Ͻ3¬ë„^ªûråÌ”ÐÃ&¶ÁCšë·vUN ©Ûm‡m[Äc9b0;¨³7Tðã€i–|ôÇœs;4"ÄAi›½†Á5¾¬ÙÃJ™)[汕<7ÄW§I«XæYj KªYŸŸlþM¼ìÖbD©sôË9®…2^· GÎÁˆûCXü<ú¼ÒŽ/g?ÐŽðöDaZ’ 汪÷‚ s–6“Š…¯J÷ÞÆñ„~®~ “’ýò±¨˜Ù‚÷–eÛi£¥¦ âBA}ln•sz ¼ŒãuVÛÙ…$l ‰¨´ ÅbF7"Žý­Àî{ˆ’ =9ž -ðù¸ƒ¬ÒŽ Ñp: ›ç+¾ü6ø3‹ûg$Ü1ý£oó>¹Á·Oƒ>¢ÄNŽÖšªæ&‚h¿P ZÅ t†·}›;…AïèwˆµNóŸ¢òô£ë4 %$0Oݪ^FBJêmBï`2)ÍîB€e7Œ®ÓuÙˆ1GIÛr™Öˆ¦ jè£ÿ-Œ§¶A¦ªkuþuŠ÷xFP䦆bsB\©}¾SÔ“#KåÆV¾ѳQ›ƒƒâ~,-Ùº»tkúÅg†.0]×ñué­‡ÀkÔãÕl½zÚ=úÏ„vZá;ßÄž )nÙ`í³nÖ—€2ˆ!q­AðÖÐ!ösz+É¡nIzŸ›^+% ¢mú&¤¢xí§¾éÞC)‘[©^óÝHø+‘|k†«þ†qÕÝiE7ß•ö Ž×Þöwƒ¯§áYDŠ˜t¿è֋ɾh·r †éÑéë;t:Iо¬?ÆstÆ—öý´¸êŠh¶ŸôÝ?j\“ÚrøßzL-Cºb,Ä;íåV ób&J¸ü_¸U—ÖÓ–Ùr¾AAßd9£;Û¶Ù±š)ÆBêù¶ˆ‘ #¡ÇûžŽs“c§ú˯™™' ³¹gr†µü†AÛٲ܇õ¿Ë=¦¨hݽÌ.7mHīLJ`L>ï‘ ®eñ:Iü+ê§qrMžj)MÞ_+'2ÝáY>Ð\ë< 4ñ•¹âY‚„Ñ‘>BÞ¢®åñ׺•×Â<ÒO0o”C©ZÂ:jÀ=g¦ûvE×}÷³žmñQ$g|D½Vij|#3 ¢8‹P{ˆ+ÄëE¿©Õ¸*ŽFƒˆ+CMQR×îþ”RoÏ“vé³2om«çG@ã¾ÈÚ¤{Ê'Ù6ݿпØמ½ƒÑ½B]M>DVC»Û+uôcVO»mà¥ñ¿*ò÷×Åp)%E©Ïãm‰ß('yxInß«²Wúô¢,kY(è°#u=d”OÜáÈ—ÀìÿîdrÌ›9îºfÌ´³l¸0­"^°<¹¨$Î'h‚.<8]&ò‘™ØñqkHX¶ˆôÕ=Š9æ:Óû¢¿­&¼’£7±ÈuýÙwè›±u¯l ¼~ª0WµG>F–#^pNpüzÍDhÄ¥:_UìÕh(hÖùíû4»Y½aß‹Sub9O±9õ1²å~\¨q»Ì·If„,øª+й ¯â·¥Ú†+ ¹ê÷: +Ëb^Uè{äU±oN¢C˜?Á‰þÒvGnG¡ÆY¶| Æ×™¤¿›.òhZ³¡0¯:§_5Üá¯ÈW›§Ë„ ót•Ð ·.<ÓW›i¿.u‚Ótâ<;*Lh"UVú0v…’DäÜÆ›çà7enÆŠ8]³!ûãú¨[Ìe"¼:aBúVåüEÆœ‰°{=ÇŒ›¸©þ5ØFxÏ&^ᜤDª€‘$‰ú—§©l…l Ž—‰Jm¥Lwжý/ÿü,Z£ÌÑNh´†Í7z*!doÝêˉÓõ3o)irڀέÀPĘš{ˆ’“xobãc4*!ŒtðÔ¦‰:žòˆî7W";$œ%î̇}=ŸùŸ ®ñ7£„Ðlõó±1´N[qa(–×tá…Ðezƒ~UÇÊ$á`Ï  Ý¸I â9þ­ë»Á—D£ÖqóÈÍ‹þ,×þ¢T¿ ÐJç©ÍUêZ‘HK¼ük„ÔØ&Ò¦îF‰=–$æ¯0}öÀÁò+¨ƒíJ—Eåcßña¤çQdº¢÷Uj`$.ü„/·jþÖöD„|óû¥þôÂë¡ã’Œ]Ö*0ùa߃Û5§îr£õJ ¨;Ìp¯88XX´î±ì¥›.ÿ íeü‰å£ ­;&§õçÎÁ}¬Kì¾_(…cñï0Æp£wV˜ÚøCò½¥-B!}¹v+ø/5Ù8û«Þƒ‘¿<3-jíÞÖD#¬öªMêî‡(Ye¡»60rL•ÜY=¶u>%uÚU]—¸Ê™OVþŽSÜrÓFžºç dòyà[S>ŸïLÄSý„¼³8CFO–ºžl\ü1·ûËþêꯨhÖÁ‰y’œ£¬¯ÅÜát;Šø¹µü²ùÐ-ð”5ô[ÒÄgv¦Ã˜^Nõüw¤£›—¬ûýPÍW²}3Ž¿Õ ®!%â˜Ú”‡ò¸¿CƬ¿9Ùü4ùæÖ*|’J¤‘¹áNÔñ9Yßgÿâîí@üó,}• =ç6}¬Þÿò,^¦Êòño_R´]dç°8CÓ@aÁ&É6­JaGXAEÝÚ(­D9¤©ÚPçÚì7ˆ¾ÚMä:)L·cðÕ²)G E HúF@À]y4¥Æ\#oª’#œ·à”³PïÞs±C\,²Çów¥Ê©@›B²G´ü¢1ÍðšeÔ9*ÇkÛëºÓ£ËÅñçÚJm<Èq“°Ñ>_‡Z|=…: e€¥PÈâ,|Aþ¸ÅG ÍÙQU`²Þ Ýå⃜b°^ Ïyåìûµts¡ÏÃc‘²¸bµÎA|Áȸw77µî–À©Ô&±|•„(C Œ'=Ïùü̺€x•tÎÞ¹Æz¥T>Á†ƒQC‰csÄ·• ÐoG©qðÊÆÿM²ùƒc(Ìuêæ6ó¯ƒèh B˜)v‰ÐR¦Ñ«M…t;9MvŒ®+øÕ}Ÿ\,kRõì[~¥1†aËÀ€ŽÑ%ÏS_±E¼Á‘ ‰T¢Ù™±ÏÑ^)ªL°eÛùœ–ÙŒEÄ3Åð†µ-ÃGQY2•îÒykýŠc‘ÄÁ3`ýá3º"ÕXɹFqŒK±ãgŠá!8L‘b`!”˜`_\(@ÒÜ%ä„=xéÛZ„U{ox—xN—¡Œ¥MËaí’lW7ÞÆÁ›×ϸǗJv@….ÖÔÎgoþ«×\ÿÅs÷È(¥Y4F1pçµÇÄØƒÖÊkÆ"Rý™îC«µ1a=v{ƒÅŠÓÔ ên@“¤9ÜÓ9eœŽ$†d«w]Û–‘Óðx›ÕY=‹U4*$bšêºNEüÊÀ"ÐÎ7÷R@ÇÆ`Ó÷-0«ù–ðÅërÛ¤áè‡|ê±õyð¤®0µÇ(>,"ÁZê±? Ìb(…Á£ãosvÞ>–'îׄ"|d™ÜNmáÐÏA.bËLÁdPKlÿqt…HíiP,Jˆ„1I§‰W0^—Ùªbÿ·"õ.J” s¥ “‚ø)Â>jtOây/É’éÊ0ò²½µ-ÙVÁw ýINë iü™ œGêzι}1ÊQ­i°Ñ‘[fhÒf¬[Ò nWùW²&a˜¾ßÍ•(ed4;¹[„æ+ôÜ1Nå”-ÞðËw»—×(°`œ-->ã`5íäýÞ0sn‚Ö“ÞDªLæ4ÐØ¤ÌZVcÎæK®itK-ÿwòsѳª$O¹þÀ¯[y¼¹óð÷¾žÕ[ÑÅŽÉÞÂ×kF¿ݽѣv’RN³šö¥öÐÒmˆ‰¿p€3°ßï³Éñ Þˆ“ŠÓaU8ÑFLQ™­Mø\º¸ a5†ô^öü b\@kLæç°f±I³ÖÄ(Q4YV¸U‹ð× ¬çÇ´®½q®(¶àÏq¸¤LË·,¼b”cJ†üÕ4›ÜöbÑHDàòS+_‡·ä@˜Ã^µ3vÿ™÷(-¯0&Íÿ_Ã7ªAµÃ:Á¢oYDÐìõ±cÛ¸—]¡)]cºf;?éš’ ü»€ëM5´r]$Ô®KJ+0amгüAØ `²”aœMàe¾ˆïGÑò²çN¾óºaPD”Á%®lÄë!Oç’”›yHLÔm…‹SÊL°‰( ”˜¸7ÒãWl]Q8ʼn•­ŽY7öÁï¡lĆÙp0‘ó1nøa» endstream endobj 1207 0 obj << /Length1 1630 /Length2 20038 /Length3 0 /Length 20879 /Filter /FlateDecode >> stream xÚ¬»sp¥o·&«“tÜqvlÛ6:¶“ÛèØ¶“Žm£cÛ¶m;_ÿÞwΜ©óÍü3sþxªž{áZ¸Ö½ªvízH å•hm b¶6N´Œt \9skCgGE[k9[NZE ©3௜Ž”TØhàdnk#bàä¨"@#€‘““Ž lkçî`njæ PQT£¤¦¦ùOÉ?&C÷ÿÐüõt47µý}qZÙÚYmœþBü_;*'3 ÀÄÜ þ)¯!)' —Sˆm€VygC+s#€Œ¹ÐÆH 0±uXýû0²µ16ÿ§4Gº¿X‚Ž€£ÐÈü¯ÐÍh÷Š`t°6wtüû0w˜:Ø8ýí“-ÀÜÆÈÊÙøŸþÊMlÿ•ƒí_ 뿺¿`ò¶ŽNŽFævN€¿QåEÄþ§“™Ó?±Íÿª¶&-mœÿ)é_º¿0µNæ6Ž' ›Ó?± csG;+÷¿±ÿ‚Ù9˜ÿ+ gGsÓÿÌ€à45p0¶::þ…ù‹ýOwþ³NÀÿR½•û¿¼mÿeõ?s0wrZ™ÐÁ12ýiäô7¶©¹ ý?³"icb `dø·ÜØÙî?t.@‡5ˆâŸ™¡ü›„±­•;ÀhG/gëô7$€âÿŽeºÿ>’ÿ(þo!ø¿…Þÿ7rÿ+GÿË%þ½ÏÿZÌÙÊJÎÀúïü{Çþ.Àß=ü³h¬ þ>ÖæVîÿ'¯ÿj­üwºÿ0I'ƒ¿m´1ýK ÿ…æŽbæn@cys'#3€‰ÕßžýK®bc t°2·þåö_mÐ220ü²™¹‘¥Í?$°þ[´1þ¯ü¥ë_ùÓ+ˆÈÊ‹ËSÿoì¿ åÿ‚“²»ÝßÜþG5²¶ÆÿóðŒ­À“–‘@ËÄÁø÷þýMˆ“‰Åëò_@Œÿy–5pr0whý­›ñ_Õÿç?O:ÿFÔÆÈÖøŸÑQr2°1þ;mÿSðÚÈÙÁá/ÉÿZ«þó¿ætÁ­,ÚqZ¤f¤9ÕüÈÑêíf ²+®W.Èó­²íòI Ýæ,ׯ¢k˜äúlu_8µûØ—¢:îÆ°"ïJ^æâzSöä!oýa§>ð§×-FH;S‹ô¼š—Ù‚ÐdcP=ØWPÔ-z‡Â›üÃìsõDéKì’ç‹Fòh‡èm”RƒÞŽÔ‚R“zF–püôHÞ?248ÐuÙ³Cý;–”Ûà‡wÒ)a¢“»¾Ã}½Ñ'ä« »cÅBf³Zr‚Š«ÎÛ¢3ÉCô6*cÚ3¾é— èƒÀ¢aŒ´ëeHð·h¦‚x>‚Qá)e)ÝÚöEɳe¶Õó:>®TËŒeÎhóo‡ ‹â©Ä¬›ŸÈªýóšÁqƪ Hi ª¼Sì,µØü¤¢|ˆ5¾#e‰;…Qºœ¼ðax;A*•Sûj³ÎäiyÍÁi£]Ãïíy4,‚©Î"¡_KY¢ùwy°Á’70„Ê&,*fW ¡ùS£;«]¥/÷H™_±B%6¬¸"%³Iï~Ý%é6wiut¦Š²ú#ÌñëOõ6HíÀ¸×jHt^€”HÃòEËåx³$iž} ÎV44ÐhEko—ãd¶ %gt…³í&rãe¯X0vÉ\øUr“G‚ÝÂ-ç¢jP¤F@ôèM¬N¤ªÔaëÜ4#0µLêžsÃE­Áb —w|dÞ'Ö¡…ßÀT}ÀË]×sZí"ÈHíö`¹¸d,ÄædW¢ïuà/|:w7z&þИ)Ô¶«O³[ŸrÊ\KŽ5+0´6ªÂSK†EUžàëPh”Â)uËvqS¶Ü|”ÉT³ʪErKÿ¢îª7&.Wð‘¨+”É©dµF²ö .Ñ r«uTEztq °Cc|È“g‘4qÞ«#‰|¿¼(P{®$B… g65VÄÔ ü½« fœ#·ê ÑR}ñÿ“6§òEdÿ’ņÙQÏÆÍƒe'RÐý6fÍ”¯Ç‚–ï\¡À‰ákg¾'WÔ†¯tDNç÷‰LöNËÈaÈíniör°æ¼\+¥0â\zwª®”6F­M7§í‰1#ɺºÏ&ìܲéÉÕ¦doÀ†ÈstÁéÄ…_ýÑÜSw–ª¦1JÃ{´_g(a)8¦¼ZØä§vô/"ƒboÇ:õ* áÂÍ÷bqÄ"êØm²ïe¥Ê5qT˜“”[™^¶¬å •L*ŒìlÜy×ëm¯1¯®âgx ”8ÝŽÌèŒkë§^u2éà`#a¸4ÓXØËÌÓ5¬Ô¬V ©Þ+ì€)ê½ZãÁ‚|¶o÷¸ÙH¬cXètzÂè¿NÐr$èÑÃÑF:À¶¡ýØ/¨Ù»j)›H; ¦>dGgy­dõ,ÙP¹³_íŠæ'‡ù/î:-(½ð )uµq¢´²Õ©š°ä¹žŸüR O%ÑïáIB4ïü{$<‡JèôŸUq«(¸D†@k|;À%4ß²‹Hr¯ÑdåãðXœUž«ކ¬¥?šÞÎ+F×ßz¯Oe)¢à8ÎWìFFƒÆÀaÌ9À&Ð’“²|DkTÅY'‰“}6Ñ똧9 K˜€/Ý;ÛJÛ©gð³ƒT²xÙiÃÔÏõ:½èàé‘*Ý0‚ÄÏ"j㨸A˜1.O÷{¶G¬ÈO=mXûøuƒÚwœ›mš¸ɳ£a“‰.¿/‡<¥¦×^)C:ÇÜAðc*8|Â6¢t4¤òWB{a*ìÂàCÍ Åy½ç¡zÅ" UÓz>)¡aMQ «&©/×`ŸM@¼{–G›œ€´—5¦ôŽÁ…cKá‚UàN»P(â6–ϯ«*4 °ÖÖPH6£;v•št,F±%0Ç©¿_ ýª_ªœÉRY.Ï }pôòt„¨…ôÀ»¥J`­õÉ#Í(,/ÿ±c¸“ïÀÌÖb±ëðgÄšnà4>~ïà;å"B»¶RMtñ•ß#!m‘EÛf(Púù-ú—!ÆÂeÓÇ»yªø´ù;ÐÏäLŽï„ÔÉT QçKþc,Ú¡œã•¨ô—¡}ìn‘—.N¿ÚCF×GÀýáÛ/—ÔXmã…OŸ€U£@Zz»ÂA7®Øñɨ«Ïw2‚Nuf]È4´DóÙ‡XЈ›êÍ*;o®2q‹›yãtbPÂh43bÒl*^~ãof‚þ#×õ‡éß“BÏ9\ѧ*ûÄ}pvutõì¨q[ÿlS·`9c"lJª1²ªð^…w`ðG‰º &ƒ'q£ÐRƒ°çùò=VÃ#Ž£†LÈ‹wiÙZLol²ù´©¶\Èy\ß«g–aéž)ÒƒîlàrÄr»Ýý‰ޥĖÿñ3¦‡\…ŸR¬$ÇßM<ðH“ŒÞþ)¼þA:M=èCÛÄákHQî@)ô·MĬÎX¸_½NïÕŸg Å‚MV‹Kð€6tS &¸†»½9ém;nªhã[`»#Ãf{O»ñlù`’¹ÎnZ+Ò~öQÞœí2îã"õLek0T¡ d­FƒÀen‰©Ý­1ðG~>•B—²ìS•´ý0EÏoäB9ÅX÷ ÔµàÏ24TûøÞPµÅSîø o|i^ÈðÚÍA‘OÈìïbîP­â9ÕFó:¾w=‰°æX¸Þt/ÒçØÔ¯|!àtÕ¤(Ù®¿^‚(åÊÆ‹€”Y±±Ë5«ÿd§ÆÙÃCilD #f$j$w•r*gœs°$$¼0á|Á œ²«FÎ~Qáü°cP£èæŽÉýe°jcÆ–@âqSrˆ4îòÕß½’‰,á÷Û,MoÜÑ >Ë£Þ4 &Ù$¸ÞL`Ί”=,~êC‚n§µT¢9êÊ´q@s‚Ù¨Šé ß_6b›(ÐT­ÝPu¸o€ùÈœTŘ §p©9XŸÏ×ç­þ+Ë+Ð~Ï-zòv¢ KØý!mÖÊiu9‘uöÀˆlèPMÚü²E]Öb8ôãsS< ˆ³h5îdÎÍ©©ã6˜:Äf…+Ê¿4n“8@LPsú'çNdé´ÓÞÆfdû”°´L‘žÒiäOW‹†*Ìé|‡0f©E‰a¿Ã2'‘CóÚ1t¤ý¢ä½‰ˆ±OIy¼÷÷5Âø˜ªøx_…*šô€žï¹Ç‚¼4¼ÏšÚ±?Ÿ¹¶(@iã$‰í©¤žý#Wìj{ WÕÐ[LÖ‡`ÌÎyd*Zý„ÌÏw‘H+ïxãå‰24[)Á—3®;s`貈ófÌRN¾ »àÊV{í J=BJ0É’-à=|WçFxÔd«¿¨(Ù¾-ÄŸ)7ç5’’ϰ7ÊóžJ udlá~½€•0DüöÁ ûĽwdt5„7¬€ø¦Å㳑£6žØI‡dí3Ž¿c_ž;:#<ý{}Æ)ë+ÙC­Èl—g?sy“È´€RÿÉßwy‹ay”ƒÞþ‰¯R¨æì¶FŒÅñ´­Ÿð®Cá@ºhj"S(6„Îù%øñ&Yk˜©$QÄúŠ E‰'Ï¢gNü»*vý½ùöt¿NÚø‡²´*¹'(J’ø†(ÿq$j®©¡Ð.ãfrŠŒ¡¬ì[T7%¥] Áyî di>W¥”yÍE£‘ÅBû²<·§ñªþÇòÄÆÐ™à‚÷˜náÉ9(è žìà<§$×ÖW^f¶)bÅÔ4Âô=‘ Ý'Á µaèëzb±=ÉnÜyÒþUÿZLZ/¡`¥Ï{dѻْß÷;M:q®Û>Xw縎aw#tHó¬Í—½Bïáâz,”?šCNë9¿].Òl§ç2k„ÙX‰–2 ðÒ©ÆiNÁ•ä t]×M°œÛ’ž]ìeê}c[ˆvM»àm) iËý±æ™g‡@`²`«¢vHÅ…ë0X'Ë¥Ïå}Ó?dÈ÷^&`æfVÌtÜܵ3ßÎûó£%i@×Òù÷+D`kOHó­¼ÓïiŽþn­àÕì`y!´ÃZo,t4ëz±…»ÔUDC: Ö•‚k OÿäÁÔip©¯Õã/çÑŸ¥Ž¨Â)p¦ðªûJÐS2?åY@a |ž%26•–³ÀsÒdßéâ‡|9Œ Ø›±æ+!ÖÙˆg™×6Âòüj°rÈÅ5Q彯ܠ Ââd,Ñd½ =È3ΈÀpèé´É]çµã†÷RÀ½_ƒ), µó™³.Cð–x^kÀ„ÖGÊ s(Á°¦†p‰v¦ñðÁHD §òn>ÝN]w í “,é‹Ô(½wá'5).D-ê!Pm²úÆ2f±åÑfð«áø!oôô¦QÂY;$ø€Dg‘Ü0æ^ÑMsÎ#Ý¿“ªh©w¢F·h™ªSÛ°€™Z.«¨¢dÈ ´;ÎT†ç÷šŠäÆwÑ É…¸(‚N¡® cdþÚ¹ýâ$QÍþmmmmjZøÞ”;{\`ÿzÆ|`³»%Ä;Ím·éä\IÃ]»&$À¡."3­i.ÍUÁ° 0ð[†Ç2RÜø¡ú[˜Ï1E¢}Ëâhà„w ÖˇírŠOάÔÛ…8?®äúgо<‡…™6¢ðÜp¶*ãF dPµ\=¦AØêH­IÜ#£3¶Ã^‘úx˜}‰ŸbIß— ½~¿“”D÷+æBXTf$[`%üøÜ€,Y’‡×›we%-5@ýl³Ö?§÷üîBb¥-,ѸsÄÀ%ŒcÝÔç tÕD½ðRDøÕ‡{ ’ÙåGJ’Êó5Vyà”}ýÒãš–'L5ÍÑ-m&™sû¼i©£¡j‹ð,]ã—°FV?^ƒ–¹ýiŒÛ9ÔÜW÷ãþiÈ§ï· ÜË ¾†@«ø£_­”L7ÙeЩWÙÚü™øYâ@ÇËïß:«zX5¢^§5!ššÈNXýjè±VLýÏçA€6±ÔïRœ*¨i ¶Sç0vÍwêõ{7OóbcOÌff{ÝW#¸O¤—×Öz”ÊZÅx~ZÁLÄlìz‘ŽÈ~“ ÷;»—ô÷;hÕ&”Æ3 ¯±Œa¢æVÍíŒË‡âjJ%> ¤Hx”%æeƸ­éÈ1ÛîC˜ß=3Sl²P š‡±ß<$€Uág† “ÂuŒõ†ÓJ‡ö-y>;“+Å—­çÞí‹Zþjúm tþ' µââl¿Á½Có;RØpLˆl ™D~Ž¡g¬:5:ÐÕ‘‰ÊÍb'ß ÊFØ|À {ôz¼‚ãî·+ÑÀÈÔ×7ô å¦VÆ`ŒO W3(_ ÅÔI±­iŽQ¬V·Ž‹ýa‚6µL6׉#hÍhòó7˜¼')”3Dú¸B \ÁØ S¦v㺡ÙKàS 'ö,‚b;Bà¯æq @ïië!ÅA¡6¼SUÑ%îw)ê“k-~ä/?ÌžõƒÅ5&ë“æJæ®»ÿ†9EÍ}\”YË ‰¨3LÆfmtï_€~i×Jz™ÄXwcÞ¾xÇû•5亂)e6Ih|FEXÁv#»†vkª,ûi õÖ¨ ËÑ¢k†ò®(²ÃØã#Îaqõð/ukfd½üp×UÚt_:âžYIÐèIå³³5xCV^Il! eïeˆMX6wj×tÜmPé'G`¨ŸîOáÖ æ ˜ÀÓ:¨Î¢çN“^‰ ~…±þQ¥Ù pæ^oéx¨KÔÓlåÆw4?Ij¡c,ÈYb•Á#”ÁŒÉ‡¯ …Q_OÜâO…²ŒSÝäÓcEªˆ ÿÔÑqsÑι4Eùq¯È‘öhætƒ.{gÏQ›Óòû mZ¡íûìp™|`fràz;Љ+%#5>¶fS¯]WdÍ“F÷ƼÊ929»…ËDeROU€ÎÈ^â„ø¹IkŒhY½ÕV©šþUYÍ$ñàTçØ2|'›Ì‹Þ»©å•â~›š»Ì@•o½¼+-‚¨ÜBýS~¢–'(?“­P¸ÎN $³³ºbH4xncÞÒ莾gºæÒcwÌs ¾0h3;FæåËôk¢±‚†0™\†0‚Þ—h.Š(ŠÄ¡~SõûÔ¢ª¡Ïx5ÞØ­¯^ùfîÎBFÃð‹ÝP(WµƒëwåÌ¢¬{܈:*ÒY%ÿmpn‰®<ͬñx8½îE@œBÎìn¾§ÑIT9RX‘G¡HFvÕZÛÌM‹€_@]سû]ï˃ @ꞬԳ›¿ÅF˜pA‰*xE‚¶Ü@%Î÷ Œ&´þé÷³ûTÆ`€4›6çý£6åy b«eãã „^{wYËŸOíP›f™a øÛlb‘1F¾À¥7.¢Óš¤\¸B/å,žOFN8ŒÅÈ×b{#û°‡';jŠç¨ ËœíNE?Åxjú†A/ã*béZJá’Fl*á‚2cŽNl<Jútû™|óíY“¾=9Sšm’þð×Dq…U¡ÒÄ-M×¼•ÇÐo€žþëù+þ‰?GŒ. Éfã¤ø¯ÇfÝ/²èWÄ©74=£1¡©rIñÍþ‘Ó²™›x@+Î= Äò+AÚ5C(´¹È†]gÔˆ-Œ¨HA'“Ý[‚Ãs(Â×öÏœ V^ÝkI©ï¾ tÚ“>Ykh½e&€”mx¸·¿ôçç¢å ·ÁR8¡©B ’5Ÿr‡‹î¦Ä¿ö«N•õ8¯ˆy9Kû%b3æJåø9™~õÃ)`9Ž²Û“‚iÄ`uœ¯yJ§Ó;O*ñ©Àš}dp½ÂÜGŸ‘­C÷eLS{HáÙP&³äéPŽÄrð8Û¾J¥|ð¸éïÉ©sOpç(Úâs¬t¡³P°ï­ŠH )}<•}O¼Øn§´|Ù·¯›™p‡-û&©™^Dc@5ZÇBm7Gwêì]‡öÌbyéÙóòÛ¡M)¢ÍY¨uÍê*ÏÉ&B’§ô j”­i5JmüöÙ\ì¨bÐþÛa˜o°~,•C®G/sbª¨KòÃË'=wÆ» «Îým莂WÁW0"}ó|Ê.0¯1–ùÇ üé¤S6.ÉîöàÚÚ!ñú&ŵ<M§_£òà ]ì65½Œ€ÆM¸ûSÿ†¼KsÖœt¨£ú[é>7Ä2Á1“z¹þï×|¡öM¨R×(¦•¢Õ½sz@ì¬p™«ƒàYô;]ÿ°‹v—¶ÝUn«ý ÍQµçËP‚GÏûOtŠê½²qì&vKp¬¢¤¶Ìõ[ÈPIaQʤµÑa±Ž»˜$zÒ0®Ȫ° ¯þÊbŽ£Q÷•i™òþYø€îžà‰¡¨Êé ÚÏø(Ž!»ÑYúwO8ÑäeâÂÚNmx?B‹¥ð1ù°×ËÞˆúF”kHéÁ˜îQIF… ŠÍ9ÃɩþX¿Í^×Þ> (؇4»ìáØGæ~Âa+.’¤ú¹LgÈàða;rf %~•Ôk…MòzŸ¥¥Ž_"‹øä%Þ¢‡Ö9½žJWrs#þ¸I\XGÙ“Œ”N:¬‚ª;?t<ì'÷®Žœ3HŸ¿(µ|¸E§ip?=Œ¢Š*(_i2‹ icüO%»“~8“P‚ìŸ7UÞ1…”{,p0æ®åýóŸ ¹Ô¶<“cÇá UrVο¢°”1Øš’.jiÕ®‘µ‹´úW•ҔƔLÉíÒ‰›ÉŸñ¥O1,õÓœ¥žàûOWÌ# ^¼5%'›$ãÐäM&ú¨*ù·FŒqøyZsäB“ê[´°0cÎ+#Ñžxbuq2ÅZVçÉD ñQܬÆZJ_MƒßÇnZúma¾7Ë`d6öñ®ÌInáuž;ËIuäUàK@{O±>m㤓NB¶Nøìß¾P`!ãF„>ã¤G=ÖV­›°k@ñq¾?¢tÓÎ’­\˜Çñ®˜–ºÑð"é›ÁÆB˜šq±ãºÅÌn†Eµ7'({|› | µ:.Šf¯°Ú{ JÈBõn¾„Ïøîš°gpwô#Á{81^Í"üÈÎGÍ‹$^Bî<æŠÌf+ôn_OäXnÚ¦¸7h„/ZäpQ{¨Ðîq§zDt˜ eÔÍ[/Q~¿¦ëÕÌŒœ]1õÖÑÝA¸÷2æÐš¥åð ʧm°†™˜o¾vò$Õj¨ .%в¡ì§…÷ýï±:Ñ,!M=C³:³Å"m™;÷“vHÙx㸮î4BöµQ8ÞÌáÖîSöǪRÚ¾Ú—Ïe2=?Rw|ºä?n0ÌScÕ‡X(—Ò ¡¬î}%g‹Ñª*Æ ‰ `ß2rJZ½m{S[ÂE‘Ï#ÌæìÈÍFü —EÄaVÍ%ŘºÕìŒÈDpºò(Ð€Š ¡‚›<º..q2ìËp®ZîÎ_ Š?Á§/`úBDŠƒ+)Buë=ñhGm2á`­Š.¨N™öšµE5«µ”oëÐðʹwx³èüœó)R»ríRß3 L,ø¥Ð¾7p…ÒÍ™ˆ%vÖ‰Uâµ]ä3 ²1AqØVV &¦ÄßµXZë$XP'½aTÜç¢ù>³¬!vƒ(ì0ǘ0ñH“‰hýò2—Í¥´‚q´£ð Â3 Ú…C!!ÑGÈåˆ45RlZà€ˆô'ŒË3„²)‹gý먵ªˆœÄz8‘~Ýzí:ÝÄËÙ«ÖevÉ…T𦲞ÕQSä3lcàAHàa¸ã (mÛó?:û%e¤„~–/©@¨.U.ð5z2<·©2¶„ÝF´³V×uìŒTßûÕNhÁF%fQâ³É‚×!âÃ>„ýZI‰ó±‘ü¦õŽoywg{ ÿ gç20±¦ýRÃ)4q?&@Iÿ ßI¥q±ù‰8Ûñ)‡Üô$1:L¯(þG€Ry’ðuI¦ì5®0ÅE@vÕ¸ÈzNE¹ÿâÏtݦ<›å€3 :¯m@®‡Ó“Ú¢¾u¤„)ö­½¡ßk¸)Žù¤¸v›D<0ÐÎ ìþlã”gx°ZÉ)Þ¹éÔ]ƒAK5ðrª[Ú¹ ì\%u©ODÅ¥»“ uÒJ'~µ(›)ýaÊ€”àÒë×òko µi!2oYÈ\e÷w0AºÆ?s§_|$ÓñëµLú£Ú`CWh0D¥Â'»Ùú†3¢!Œî¶É“IãÃzÏ¥ç¶l®Ø ²¦¤ð+ö(9R|€ þÝ8k0]Ù,Ä¿^UàÞãr˜ê7ž¹ö‰5¾kyâjˆ‘­I*îÎ…vô¤=†ïŽUói±6(Û˜š&ï¹ÏRŸ3ðÈáóû’5¥B-]<'0Z åçò¨ÆÍc¯A¿õ@0ƒ‡Ž9ïÅÏ6_w˜¤c‹Õ­Ý+tÕIHa÷ Q§W[’ñc ÉÖòÉ“ðdú U~rïÏà0ÇTIíð:S5 깃èœK20â=NúÇ´ëÆ°:"„©+ ê¸sjSbìøÝì 4R‚€],{(¶!9C0¹µ$ÅN'/;$\=l*œÇîÃ’ÝH…æ«”¤“sàó‰ˆ؈4L†Ý!Û†ù±¼z–¾Ô¾˜R¤À§ž5[ªÇO·„ͽA¾® ô"Ôð¸ÖìÛ¹lϤ–^ã9Kò\Ðò`vBUäïHàAÔê4#w<*¬ŠtÔÛe4›*µB‰§¢'1„—±7Iù¸Õ×Ãâh®”zRR6áã<’ÒU:JŠ<Ì™ ¶ T6—£äj\5<õÒmàq ÁšiHP_ƒl˘¿';-'FFTfŠoÁ- éÃ5–ŠhS0dѱ7/ÊYy+ÅšS§±õ}ýüÝ9ñ¬hÔe´=º°s!T²±…8@ØÎõ•P“òß}˜±yqţɽeŽ;… v¥àtNÄß ï $þ–ï"e® «Ü}Ø/S‘þ6¥?¯|¹õëÖÁ)¢uÂÙš.ã;º®êoneý®ái’L«™Rý8Á}pøÅÉh‡¯*mÂþ O@k…øÌT=b2þ§øñǧ­(Ùý5uç]µS¶Ÿ­×Vî9¯•*rŃúÕI C¸DŠòœ ½‡¦o°âùµœ¦—!«HV{_ABo%·rp¤´}Æ 8nN¥*åЧ²!HësÚç]ÞiA ±Šœ8%ÿIžüqN&¶1×>Ùº*Ëy(ÇÆ€NX°H}Â@ t•íiä~'r™ZéJçþHê¹is=~ŽÙ@b£ãÓéÝâgâ£0A,©+w!ü4Þ —Љ$št0C+álCŒõ\Gµ½}–1Ë ÎµÝÈÊ€$ªî-õûéîðä¨ÂWòáHY"HzÕv®Z/Bª§ÇÏ“jªk„ºà¥yäh4†Ì·Ÿ Ù´=pç¶s½›U{á÷ÃmñáìèvO Ú*ý)Ù‚gb)ÅgMÙNgÿùg}¤²rÆ}¯M¶;5“EsH¿éïe¼¾“Ðâ•?Âå6–FàmŒ%×gIOžhðrèæŠYÂÌlIxû—eù•誄ëby’ìÚÔã{.‰[Qùóóu] ±á£ÆaÂ#ô_‡±9«‡ã»ö+w¥PQLkâ¶_§c#ÞÚžéû¾Ñ€‘¢ó5팼ÖÁUJÂÊ®±ÇƒÛDÖ!!-ãøAkvL§´ðƒ?ÎM‡Iý#Ù:²Ë b¶5 º!¹)'¡–V¢úªþª "ê×çÙ•ò¹ˆ¯+Öz:Þ®;[{ÈŠk¾ qMTÐÝ QA§œ™‰gü>ï,±%“‡×2«ˆÁqZFŨÀeæ&‡oE+äì HšÇ*”š?ÍŒ?÷ŒÅ©™®ïõº§3O;´mÿðħýY¢˜û¨•wÞ)ºWHQCgi *zw¥¸ƒò³JÀ †ÁIµ+ |Ƶ¾ÖÁ-\Ò'ƒ‚•†+sð>$ÅUR–¦’Ô7޼ÀIÉö2H½seã']£0+Í|SJúÕ7;–ªô+QöõXé a†1ü"Â'Üi•”Ój”Ec§¯¾Ú7x¹oÞc)´Ž¤'9Å}h3MÈ2à‡Æán:³n,Ä. øiä§ò™öÇ.YØ\jxõ„\U¡g˜J›×€¿áÃx,‡O7åmñˆ/ïRÎFèõàÍçw–hü¸üÏ©pÈšÄjçÝà´2zæš4œtð™ÉÓ…âUéíp·ËŒLž Ú×<¾ªz½Â!©*.žû.>>o‚(s‹±Ÿ½j 2sÃ2T"˜éT±BVÐvÜ’ò4ioåp4gSùìÅsö"Î&®Í:Tá•Jƒ-Dê ߬¡š]õ°Ö¼°Ÿ¾ƒ±Î/aj©Ã2)ñCjJ:LàoxÝSŒ+(wjÚû`B·ά790\Ýý‚OáCÉbG{š’ç !aÄ|­Kr*û9æÁrc­Kž“ÉK1-ˆ|>ö](àáBEQ ,>ék²J”m¢õL­Œ¹»¢’qˆþIÔ̽5ÏÙÀ‘lœ"CÉ7l)¥›³y=u¼‚@9š† "9ðÌ$\Á¼šî/ðyÓÂîbŽ„É~3“:€.j?BK¹Ôö[rG"dlRÝ®¾ë•Œg%]îO6õå4„ècœªÄ™ü<ñ^(ˆ~æFMµHbn)'Ò„¯XúµBô Î;£í™9Ö‚§^õ³¯Ôts²eð®`‰Úï-âRµ~WØ´}Kî ûˆö;P†Ÿ€b¾Û`îEØ $ŸGŽó‰Ò£RŠN9jñ„±úgQï•áÐëHô¯+¹dðPšr²ŸŸè›ã¾ª÷¿{YF5äñô™0ÎOž “!ôzèáJÚ[Ú[ï( ¹ãPeû¿á•#Î^’ZŽæ!ÁµmIÎÛ$ùÇEšŒqXï'¹ÏbŽr$•ØwEêÓ27Äøö%©F-ÂåãTíƒß²”¿t7&´xQj„V¶»“©¶ û"³I„RÑ1¢õ÷6…MØý²‘˜,—-Rø}LQõ‰à™d!Ì>|é)³\(èBTIœâûÀþÉè6Ы¤-ÉU¼øÂ x!þÓ@‘%Ýo ¬ÜPÞšh¡˜†@É(_[’ó ))ÉÖm/+f»ª˜nޏ·lºz/-OM[¡ü†°h©žnM¯úGôÐQP³PzIn9ÐÂY°ï r“ЊÁÔ6Ô†ÃWÌŽHJ%*Ë?™O`Wò ‚ìË&ìOÃ)ŠÛ.Ò¤éZ‹*¼$œã ˆm­ÊVÄJ«ëËôiðž£Æ­º›g!TqLj~ Ý*Fm+zã‹Fˆ–ÇW~V¿×z†>´»–¡¨4ú9û œ£.ë7¨Ýz7µÒ ±Š~¬(¦€ê|SRG~íÂÄoÌž%ôÃ.ê—¹kmè¶ø‰å‚‘šCÖTËeo‡iÚnÃq€@ûÒš+A©²:¤0¿“qC{¶ž»P±6±-¤°³‹¯,Îö_%|§ˆ"ªÁ#æ9‚}Ø\=y¶š~{*TO’e¨óíï ùÙK}íëšÑÜaâfàQßE6bãðîs’Ñà4ÙA À“÷¥¿;H\ê©–•ï?ùÂs?4¬ÊZ1N¿9dû³õlí8xÅty_IÉ÷]åÊ¿TW¬o”ÍÉôž |ïÐTX°ÓNÙ8±llµço™€~?Æã>²¹ñ0ËÄ£ˆB±Åp‰ÊQQízÂÇÌ!3s_ŽÞžp‹Éh FŒÀºÜè®7´K?‰puïK®&˜l"CªÂ›‚cyÃKƒR8:ž(÷{C奶pÄ!Eüsg$s”¸Lö,x`$Þ²iU¨\¿qÀ–‡Â+ê}Uß2¿µ|ó'Zy¢.èøCn¾}KÔbxð}ê÷} 97ð2rLS“DÌA<iµ*lñf”÷—yòò÷Žý ª¯[Œ­ˆTË_Œ¢ÎúBÊnùxD–^}S_!ÈK/ëOÎÖì’ƒîÖÃêD™&¸úËÄ|_ÖG½rlW$œÃVÒ`º+W¨ûãA•J0×wªJGò¹Î ¤—î›{ýL(n±År“"s§3Åtô<‡ÍJ}fÉ}BÌpUeÁNž˜6„õûX;¤šG'ÊÅL°?†™ü1>”Ì;üYV¬g·,¨zEB^/ß¿~­‹šÒÔáÄbSÒ Ð]ôä ©·î2†W…Ághëeó4)‘±™™XˆƂ€Ü¥ì—Áî5e¢´;"3žÛ–ÍìoŸ¾$Q•Âvyݦ VæTˆÊoÜÔ"åöžýidJfÙw1m©ßÃwf>ÑÏtÓ逯­1(œÓ÷wÝý V7q>¤#KP ºŒ§°!w;†V¢*zÑ€…}ßsVøTw\ifœ»÷h×µëXD;vÓâEŽ pAxª,åk™ ƒ Æ`Hj‚<ö=Ó_/Àx_žm3Ao&ºº¡+oåp)MjŒ#LbýÙ¡ÄÁve’:¶xo%[!U¿®_µ¿ÐCüŽAý‡|7Eæ…\ArûÍ#MJFÊ„3Ü݉K;™'ô§n;O¢ñ(ªïâç¸y9²‰°!‹$GÇ¥ÀK—©‘?.“EÄU)©.¹á+>¹‰6œY:ºë%¾,……©z;"²­Î;~'¥:‰¢zèÈtQ7 :´@ô¥"êBWÉR¼áÈ©88üx¦¦®Øäc~[è¤Åit Ñ ÍRòu/¶†àŽ«¹qÓ¢71ŽŒ¾órU{>1S,{¸ë\q¤.¶íâÂLuŸ;Wõ…‡O~{Þ/(ÑV”RN¢zævòÑ‘Ú4‡.êùÛ–RÜóñçjUË_:Á5µ "ÇI3è!­NžÝgûí‹Ã-´°ö¶c<‚Iä´:Ùä;8/á 5¸L®ckt\‚­ÇGYìœÏ’pÂfx$:¡Šc€“Ï]üˆí¨ZS±¹”*ÏÑKögZ¶¥™yY¼ÍÀÈG¤!0 \{‚„ˆx澨FE’O “¦ohr% ˜2KÑ”ˆ2JZ{®‹éY,£‰x‘ãTU!¢áa RÇñgÛ1³Kªÿ’(bŸH©y„²•éo :f1ÙöÛ–èôK!/¦œËHr¥í…=£ò>9«Áú1@Ý%³¹uþÛ;p”:‡\KÚ†¥uM1¥1™8ª¹öB+{ÛŠ¥Ù‰äéjKÂ&UvÖý|qéS›¬9>"îlhz½šÃô’*¿#ø§·(sN\´%²yÚÒ½ ë2Ö…é«ÓÅó­\®ä x$Q`¸üã!q¢wÈ[ òÏ‚ÖÉÃËtqÛl;Á-Ø* zêOÕèJ;zÜ£Òh®Q4æñ±øÌ¯Å`D>¨ØæÛì`bN?¢ðnZ@v>–î^„’{–j2Š ”`ÈLMÏ÷U–ã­’nƒØ­ý–Ñ6Е¦0g…tè^ƒ,ž~ÇÕ‚sß0(¸°,³}ãjvQŧ„9¶ðø>&yIQþ}yd9I"CTaÄ2åÎ)ŠÐƒW Ðgö•Åð4dÔ0Ôz'Zƒ¢ à©öçx¬ò¯o¡œ˜fýEéP¬€ò&xeÕ÷ ʪƒ†‰óÝ~q¿Šú*½ ¤™ºO5Ñó–…œ5¯Í:xr÷ÒYóu‹ØáÝÝâµ^ÐðB©ØÓnß›iâÙöž?[ Õ…:I˜*«Æ™J©êbË]¥®ÑtŒ!üèû§ñõ‡BD'Fš[<Ï©WQ'k¥ØóþÄ¡ûJŠciZâöµO@º$„í>P{䮂7¦ H¿z(;z_/å)™‰‘ûu+hQô¥[@¸kC[zÁ̯¥GŸ^[ ›§t«ÊíÂZ†½täRN…YÊu¥£„‚Ñ¯ŽšXš¾Avé:}XùàÑobwÅÕž#zÕë±bñ±uàGCuî7Cz 4ßÑ.MO®\bû)ƒº¶E ’ÿ IMÜ’á²j¡Ö’# £kSý¤Òˆ{ÝJ 6‚1BÇø µ:ÑþæXÖ||Q‹Ó¶=ØêïœW†¦!Q!8|T\q‘ÑUÄW—v’~êÐOø›ñ&´Y..Ϩà5{)GÚ׸…Í69Åoi’MF襉Œ}øÐ뇙 GpØ‹´Ðžþ¦òC÷ I¦~qð8°)¼Û^P}©(¦d‰MF +'±·)ñp{º' ”””jrM˜âÖ]ûvžùü¦Ñ… ræ¢,Ëè’ +LÉzDM¼%×zIo ¶A X)fïû[r bÿ—öæ±zíz ëà)Áh†=Ïöð/}oº$*x/÷G‡vË+Ó¤[³Â'8 ´£hhÁdšœRÈ&9Vüâ¢IÍ”>¹ w•wFϬì.¦iŒ[O#˜±=.®‰Q_®¥Km‘Sa·é?c­¬£”àbT$Zé‰ù¯®« ¼ƒÞÑÏÕöœ•3çBˆvÖ­h“Õš¹Ôºneý@VDS…C´´½°ìêJögA!ÿiQÔ{RÞ¬‹êŸ{d:ÿÖ `¯u^¡ž¹Rô´×)ID`ß¿¾xƒlAéÊ£ÌÇt8gB¸…QqTE¾¼ð*¼õAÅçÕÉ÷EÑŒŽ¡øó©Ì®ûn®ŽN­ì(%´Î¥6Ýã•!˜.ˆ¶_ùXÏôq ÀÊGô£¶£ÒOj‘"óíȦ`U ØñtVÔÔѾ%(ßÍï #˜¡^»}Sª†×ã%0)Ó¬u³ë¯ÁºGjšæÿ<¤$aè¾~Ÿö©5ï|R¦¶P¢±nÒPŵÝþ0hæÉÊ|µé“ƒ;^ ×îÚÊ#Ïï 3’éí’¥y["Èo—WX1ÅíÈ¢¡. îJrÍ6w´p_ÚéCs "Ëy+µcÐ=Ebñ1÷u¬’€4[ÛAx” zT ÅçEøEºïšÈt#‘UBÕ¡%…"xëxÚÞßéÖ0?¡àÎÜŸÛ¯YÝÀeöÌ!(¥I]ó\dNø¢8©v[3€kkŸN¿7òàÄ~Ïe]Áe{¼¶³Þ1î9 Ö7Œ £[cšƒeç£XœS¶u•nš4£,J*‘(R²ª =¬çŠ–7«CØÿ9(¥ñ² Rs ­g3è?¾-û>eš«”tBÑtHB0ãa#!Áëý½ª‰X­Ü)66„À'Xt1;rt¨Ù^^¾œÒÓÑ?^”¿Ù~4u‘‡02"ñ½qÛewÁ 4×mUòÍHËš ŠgìUפ¶0»´ì3о݃¢ðX9H_¿pï'Påô|q¯nÕÃ`Ÿ„ª¾pyU‚²ÁOnrëu¹ç¡¶ïG-ˆ Ô Ÿ_t‚LÂ#’ߨÃЖçÉ‚BR…‚‹[..[^ötTxï-¥/¬õ{¥ÜE¤€9ƒ"ŸÛ’Z3é¢R‘bH(tûÆl~†Rþµ 4;°æû%m5@ÌŒK¢3f6túŨ²ÎìU»ÞZ3kÁ¿‚S½–NB®p¹2qFÿëÂŒûwÇ/1•'“UŸ?:žs7†\^‹Q‰pÙšIã»Ú|ípí€Ödiëd.Ç—Ç.k}Ó§)ÐBCMûZ¥4+Õûl³ ý (¥™e›£^oÏ^’ØcAË'’æH0i¾}5‚¬çë€G-M-õÜC…¨‚©ZFžÏVC0j “á¾ê©¹ðÙFÞ ø¢ ™qvNz{f½Ÿð¡óå1ŒoDò€Þßw°éO¬~™±WªMp+ˆ‰³}òˆ»j‰ï¼ø ³5HaÆþ«Ïù5”Ô¥@0>E¤eÌþ¿…zïÿ‚þ¾À‹Åô„&Qh[â¢ù³²Ãiñf·þQWÙœ%=޹!7b/d˜‚ï%Ü¿ìÝõÕ6Ý\°>W6Óã´%QcŠIuï׋kû¥KŸèUàÓbaÕ¸teU®æ¸dä™§ó<Ž5y©àOÀNF„1KÖ:ǺãC¤éŒ@I¦IkèK–ކmf—Î(Ûâãú¯’ëš3‹µÛ"‹ ,r58M)(Ø£$ ƒN¾ü9 ìM®€Þqû úfÔÕŠ‹2Ý8å×€pš³èË ìî¤Shïxî$Y0*üz›˜5‘ÝL)„í½6ž Î+O$©Ch•àdºÿ÷BMý—³3rZj½JiCΰû–Û¡/Q!:ÉâÚ¹m-T”ÆU‚£¹äï™jŸ$æÀ3%mE1 7kƒs þÉÔjÑñ”’Ô¦‹[ªçúƯjÎá‚÷hö}ƒß)]“ÍÀ[ÀCáŸÈ£ƒvÚ¼Z#,«1U:Ž š®ýhuÙ6§UŽ0|· Èv~M?f0ògµ?b¢b—®xÓ³U]mÀY*Ð=ä¬'ÙÅ|Y¯.lˆëÍ.û娰þ “…ƒã½K;^éR'ôUØ<õ}z[î‘sqTDj3ů؂Ø9e›+¨ŸÌÁâa$3=·òî4Q}×á)•¤7fs³9Á|ZãÙ÷c*.ûŒÆ®ØÆp‹øKGH»)\Zs:Ïý[âˆ}gû±èÕ{€à=Œ}ðúpTåDï°ªqhqÔP«Š¼ÕÛÀ°õx—£Â&å>–ºxäè¤Ä'¦°•òà#oíV—­ÐQ~RòcíÒÝ‘.õ-׫7/ÈÁî&R9•û)«gúî¬*oòÕÆC ß‘r‚ß—Ì“¯ŠÈ¦÷tš½4{à%Lô'MO?$Á\²–Né ñ/° ÃG^tʉnfOM‘àÂìx`°;ë ’…FeóP´o²`묥îw¾ãXÍž`²%‰öuçû½z%³, ð~wé8P{QZôÎtSô˜V85äÚÒƒ)©{Ì´)ÀX±%·”åG·"‚Ë›lr6¾‰úäºôDLS:ò ²¯‡é V„9p?îD0 ìᘺœ©#ûx )$œhO™dºmå—Póg²¶eækMLÑ`ævã¼"¦7$“Ì6r·.1‡&}V¸3ósÄ©p½ô1ó8 >þ'È´•¶5½¯ bͦ PëfªÌ·‚èÛ7ºR}ã»å<ªÀµðïkKLWI‡ ÇI“ùˆ§PZȧõ|Nj³ ç8¶™ 2×Ls»:-(ýÍÞPUìΕ†'qü’v<;2tf²âÅ™«.Atï÷P $ÕâwºàX˜äž×Á¬‹V»›†\ººÄÓ^í¡]="а’ÃÊ>ûÁ-Mž[ŸôA ‡â3¤²i¡ ™˜k“ sò M‰lÉÁ˜¤kR§È™|eÎ:ã =£4Çè{õr÷/È·%bê°»ú ùNPõN¨fVYÙ¾eI’lû!’Ùì ðÈŒ™A¸*]<w•ÌJ½è«4"ß–6Á6÷·qv>QÝ‘½ú ‘U%NJEH¢¡ÅVî´¢IÃs”³1:0¸ÿ|Iëiß9‹NÆ×¯Ñù4­‚xfhæY%c 0þBJVþÉGÅLHIÈ_»}Ë&ùoÙ¸ =ZŒøÎ€ëžµ®ûT£ÿd·]žÜš0ÁhsÏ@x¼€Pg¥Ú°Wîyr?¬õ°1§Ü‹«~3Ë[hAKu3–ü—T×Q¾šUýpý\bhDèu¯ÖÁ‘Tb¢²Û‚ ê%j0•,/Êën§‰¶£wÅA-Ä÷ŠBi²›/åŒýû Ë"¸>=«|¡ÿRú(Ó¨kX8qÞ ¹£k}c˜¨Ÿú ‚! ƒ¶W\ŒüÂàè¦3^ÉAÒ`O7P°êp]p(†wzëî\¥°±’ïxý7¢ŒwŠ_KÂE@ Œþž ³¼Ê÷U$úÃ=´dWæa4:=-vl¨²ë€n[pE_9M¸ªYH“+û|øšc0<Ƥâ±túÜ.U—¡EDÐJQ&âùYÓÀÕ‡#My*ŸNX—»f×mž(Bà¬],\ȲÔ?#[rô~¤ êRs\ÛGÈò—”@æ Œ¿µ¦çº¸å¯c‚R"ÿ`n3¤ÇFlÄdò‹8³¸¿÷2Ó¾î¡Ì â¶-1œAþ³øHܲzÚº±»—ÏÙ S¾îÛ6`]ˆÔj³Â§-eèAùÕõE"æÙD8ÇîøWB| µ¯–׈_ٵóƬð²!1 Al¦C §«å;ŒÉYT]Ëùè³í-J[%[¤ØlJrëj*¾/=0¾‘§½z«xYp–Á*7lõúXK`¯”N3zçC·#ÉÏ8߆=F¬¥†BÆí¢¢ÞÖkõ(¬Âuµ–ŽðƒÔY"—:ðןQ$­H;Šp²4Û/ì!UèyeÀmvàÇø«™ “ÀRö¢õzÙtB]¿6x})ኀ7‘Õrc|_Šzmœ¶.~/¢ö3Ó÷mÜ™¹FúÝuvþ…õ÷±Þƒ¾ÌsÈò/MÆŸb}Pœ9O(4fvÜËŸ­ Pj)cp/;ü"¼$šÕØ–-î‘»RoñííÙ¤°Lg0ÞÍšžHã“ZQž;<Þëµ§ã ‡™€IÚü/7 âµÖl°zd0Ô:¾`U½Æ‡2H-(ð#ç—êºâ_[­Â=L©ìÇ:á‡9Åf•О¿‘ý§)²=ôâ‹;ŒËÍÏ™”ye ­½N,¾?J.1‡‹eXF¡&ßÚe7¢(õä„©¸ ÖZj[Ï¢¶8Äâ/Y8ð+6 Ä`˜™[š¯*;ö[!7%PÂò.+ñÃÎØáeºFD*v&øØÇíÎ-·¡édgÈéVN^Í~n|ñÔ‘‰4V~Ä”þí·ãÖ%e#7䉖ù;å>qòѨê±/ÜpÒíøƒÄÅÍÝ ïÁä~jà¾bŽ,³•ä@iæÕpY®^h‰ú_¿ò&Ósš(.u]ëµ öËÈû‰ïnÅ^:v‹)Å&R_lìÍc¼2€¤ê¢ˆÕªÓ)­ý¡þdx×s#ÁKpÚÞÔ«—–]( 4.ou:ÞàÏÑ«×^îU_4»÷KW¶öІn޽VdMÒWÝqH'£Âšb" œh¤ú»ÓÉ|Di<ÊzoöLóyI“!Ñ,fà°@TÊ«f#aêú¾ãèQ…U½rò$ÞõÒêKÕLœ¹/÷!8§ñ´taMšB¬á™`|c £'¶aoöèþÅèý—£NlßÞçð0«¾$’)Ì%Ô§¯–yÔCH(U A©v–iˆ ¸p'ã)×\oÞÓâä K#)$÷g>Õá$¨É¡PDÎõ–m9¤ß’÷C^IpÔ÷œâlJYü%mxASÇzLx£Ï¢Cèè'¥g7Æu‘>Våq1‰äÞ8ø£xMg2¦öp…·7¶ÍÖ¨ ó­ýã|Ũf“CƒT³¹™‚ôûêÌ;\°ºgb­µ–”OPpåÒí½ü7§yÂ{X°è+uM’òÀQ»Ã­ˆ lŒ¸ñ_‘Dãnû.å œñ9BóÜ£ñËl=iåèQ§)ʸò>-¶;Cœ8ÉÇüŸ³Ri6ËÑ&³ŽU—wh’ù/Vïú ê¸(»H=íôæ¼³¬LÖÀ*²Š.{WYË ‰}[ŸQá“DyHIþmªÿ0)€wí_ïø¦;ê ÓoØPVÿ y‰ÞU¥mi _èy=·j–zkª+Ѧ+± :†'÷uÓbJçH,êù·Ï‹ö‡ø2¨Ö?ý¼²©þ*åѹ'{‡l)p/-%úvœéìÖÄ‹Îr1Ô™DÿœšË¡#R`´ÉJÝ_¨ÀÙ^[‚Mj›WÑßàwg3J{–Fšåžîà˜fÖLGPÄ$#•ïZŠÇæ>—u¤bÕ±¸É-ÃŒo‘J@ñÇHʧ«»S2pcÑŠ{2õUÚž*OÄ~™ÊýÅõ–ŠßšON`˜ÔŘ´€œû¨ý¥¨à±zýÊ‚R?$ì§(ò¯Ï}SRÃ¥XKÙ5pI¤`¼NáQa®v‡¤pÚæ4 pEn[Fó¬¼D«ô3 ²-)Q9⦊ôÀ§¼^k›) ˆA#–YœhD–ðÀ/¸Ö4iÎOÍÀÊšª¦u!@vS£!|¨ú6pìÐ ›UÿŸ±úŽ:eËãç°Mô¥_Ö™‹–Kª_ëJ°4Î7ÉÐuß©eåŠuuÚrÌhy'›¤Dý‰µÜ’&p©×ÿ;ˆal:b¨_ÞrŠtOÊ‹£ €zæ'¡ŽË ,x¢¨²„wýÇ1(w¦ØÅ}õ)ÿÜql6¡¡ SŠŽí“Ök KÓðÝ£5£ “­Æh×›V!þF—¾~ùL‘ =ä–rÆs cŸdä["‰ ü1—†à§½éõtH`'Áî×àšd·ï<#‰EÚÙÍ.òwB%g€¯Ji›9ªæÏ®}çZÊãÏ‹ðÄ⊠`ÐKîyˆåªçZ'ºð¿µŒ¸>Ÿˆ».²¾—ëÑûÕîÄË}†*ŠTlÁî¥e™¤†õE@tì^,nòNßèëýø²fS– pwSàv·çvʽç eòé&˜ÃŸåƒ3›Çši4) ˆ* ¢~ 7FE >É#iºHXú¥pÌïõz2G!Têõ<‹½·‡Ê1ËB@AnÇAh?½Ù§„Y‘ˆ)Dûc‘Ä^-wƒÞfôAŠÉ˜üö ëÇG‘L‘å~°¥CS“…3qÜŠôóÃ=–b„¤ÉM–¾ƒYìô*D^ùèÉ©(”$¤|_(Xd2ŒñxqÞN åù6J¦Ç[FïÏaƒ¾ ¤>¡€Ê:ø1‚ÎØ,{ŒÞæì(÷·¢FRÉçœÍ¨È6»yüNž?ÊZp"¯©øñzöמJ[B—ád,Æ÷P_ µùÅ·ÍbI\â¢ìG…ÝÜxniúàÊ}ªiФ¸‡pqKÏ‹Ç5'Ó³ué­}$&ã…t~2ÀŽÊí6Î÷½ŽžLˆÆé¸ô@I ƹåü{(òåXªÄó÷™DzÓ^Ìò#k–`•lµÍw«½Ìh.òÉãhÖp1±QîZ…a‘ƒ\Åûhîò†-*žÀ«[XFô endstream endobj 1209 0 obj << /Length1 1647 /Length2 14553 /Length3 0 /Length 15413 /Filter /FlateDecode >> stream xÚ­·eT]]³%Œw‡ www îîààîîNpw'X°àî4¸»»Cçyß¾}{Üïë?Ý÷ÇÞc¯š«fU­Y«Î8$Jª "fö&@I{;Ff^€ÈÖÄÕYÅÞVÁžGŽAhá*ãblø‹qÀSPˆ9]@övâÆ.@^€&Ð 4°²Xxxxà)böžN KµºŠ& ýZþÙ0ñü䯧3ÈÂ@ù÷à hcï` ´sùKñí¨ \,s  ¦¨¤-£  –RPHí€N‹Pr5±™ä@¦@;g ÀÜÞ `óïÀÔÞÎ ôOiÎŒ¹DœÆg )è¯ÐÃèðDp:Ù‚œÿ~@Î 'c;—¿gàbÙ™Ú¸šý“À_»¹ý¿rp²ÿ»Ãö/ö—LÉÞÙÅÙÔ äàøUI\òßyºX»üÛôØ›ÿÝifoêúOIÿÂþÒüE]ŒAvΠ‡Ë?±L€3³ƒ±çߨÉœ@ÿJÃÕdgñŸÐœ€ÆNf6@gç¿4¹ÿ9ÿ¬ð¿Uoìà`ãù/oûíú_9€\œ6æŒð,¬cšºüm²ƒgú§_dìÌí,Ìÿ¶›¹:üætú×QÿÓ34“06³·³ñ˜Íá™ì]þ†Pÿß©Ìøß'òƒÄÿ-ÿ·Èûÿ&îÕè»Äÿ¯÷ù¿RKºÚØ(Ûþm€ÏÀßAclø;kr€†±àŸ2ýÿ¸Û‚l<ÿOÎÿu·&ðßYÿOÎÿ ÿ;„ˆÅ_…X89þm9K‚<€fJ SK€¹±ÍßÃû—]ÝÎ èd²þù_çû׉™ù¿`j– Sk»Ôàø7´3û¯5üÕí_0‰Š}STW£û?LÛmVúÛ.jž@ÀÿŒ¤)ooö¿ÿP‰ŠÚ{¼X8y ¬\Ì/ãßëÈÃÊîûÿö_D,ÿ¹–7vqyt™™™YßÿñüçJÿ¿ÐHؙڛýÓGª.Ævf[ïþM]œþ*þ¯ið·òÿXÿë@SøåE{S¾«ô¬ —:œ¼¡ qݾÈ¡P‡²µâ€ûnÿôˆ-žFoµ¡ŒS¼­ž 'ï{ßh÷Gz°m¨ºS¾d4½…hë”í\tûALeH§š1Þ—ór›P:œÌûÛÊ*¥oЄSílN°—4dn…˜äÈ~¦iõñX¨`èuE'§”IGT£ÃCƒÝ×_z÷¾ÒåÆÃQðãø¥œ$»x9Ý5˜~|yqãrEpGòÆÈxw% ´#M·ûé5ûÌ@Ý^v<¥'šæÜ°lÙÈìu9tg)&@'}Ëäò ”¬#‹3 »¹BÝëã»Ga&HÙ û¦žÙé¦pßð'ÉG’‰š-óLÆãÆ8_ÓX‹ÝòŸä µÊ*a‚ꃨ«ró‘?>fbAÎ’ËÄPÁLw,qm½loC‰UÂÑk"táè&¶û‘t©ü°Ú$,šMºWBÞË1éÙ“¨Jª9“àÉÏÕBæÒVË17^oõ–\Ò~S*˜]³¾2Uà>Ã×L¿Xšk ÅMn»Å6:q+rW8gB«9!.’rùi…_S”ïö¡4ãb¯jJ·áPz Þu3wr•‚¥oŒ8'b-‚&?pp¦—‚gÕÂ`å* ÌhåÓð¾[F*#ù´!H·ÎCÎYã`F—øcëþÂÅbß„×öž$|Ž_ä…+üZ‡Ûmêg‚,£p¯©»æn‚¹ƒ$‰•[SAz‘ö§í³“I…·ïV†*•7 ›ŸÓ ],âXGwì€n¡éH²ó®— ’™c–E8'eEa@WºH‹$"öÆ­õcŧÞ+y&ãá¡E‹¤G[†Ý—€ŽšI“Ç’¿ÈrÁ)Å3MÚÕƒ³Åˆ1:)J¯ÝÏMËVñ(†—½¨S¸Ë»aÐ×Ð*& ‰Ç²R¹œñCà‚¿yY]¢QÏU꤬0\úˆ¹km9€ê¢Va`ÚòqÂø /NVeeVkAUwë¾0vZæ®!¬xOˆ%bÅ‘ìêOµÎeþLéÒt; “Ûêଊ`7ån]µþPwdï/Q"74`Pƒ]L;0ZK>Ú¦€³¶´ôq*²RhÓŸèªW[–Í…­ÂÊ>Â35Š#l7yosöÐoµbaäà77Öámy5<ËÇ·ÓG„Þ1jÝMÕ3U»‡':k‚XÚ}~§û¸~o}SErOÅ œ ¤ý´—‹úȽ“ÍŸü%+•[Ê?‘z·«ëÛR¾t»=hõu÷.—ÁN¯-Oj!2{y¹ÕE zKaQ/ŸMç‚‘[Õ‘»Ý*Ûð“æ°MʶâÞV³ÿÇ”õ"5Ôç¼qNDÀõò?F~QìX|F!°h¨s´„¦™–eUcŒd›Æ‚5{uÚÍÏ‘¹ÆO;vÑRÐbþŽnÛt›Õšº¢®×PV`äþñª‡æq¦)=Ü—2]#z«{a:µí+6ÞHóe寪áøî³]êÔUH%¸Ëc7S£Fà«R’/BÎÞŒœú…Ùž1Ò2€ži¼¥~¾SߊµV²ïÇÞ@A!t±µ»_÷ `w6¿·žQœ—.9(È쌋´!£É¡.pÕ‰-{/á)òíÓ£j |Yºgõ}ðýzewVJ á‹=Ô7=ÚJ›‰äNÝàäôù1•Ÿ1p¿RË«'„‚‰ã/t{çŸÄ˜ÔnD7ü%bŸ o”_”ÀuÂôÍÓÁ2«ª ‹³Ñ‹‘ëQyš¨Ÿö°ÑÂü ¥ç Gýäwr¤Nq š8ô¥OZw×]„*™’킘[üªd릮Lj\G5‚"úBBŠp~ø3¬ì™ötQás ´š1±1.;¨‘¿—^`ïf¨å"²¸>^ÐnNí—©¸AB¸¥øˆù§¬“*ïý]ØÄrÄmY¡Ò¿¶‚T¦–¹B{‰©ð¨èÉg‡†O˾›:è7"¼A?¦gCA¦ |ÑM&ˆâÜrC͉‘ÇT¼µíÝì.¤†³ÇsM½)µÌZ–Xµ6ô¥>HX]ç¨XÕÉêÂ65.³}­ð†ñ¨d®¥þŒÓò9/˜‚í9±/¯±š‘aœúö¡}“šhû$¶|‰ý4ÆŸ6¦ ìÃ?%ß¹«¿ÖònØ=7tøŠ&‹#öÑÏEÛ['â¤3L…f÷À§Í;Z8 n2yWï²+ÄyTõ£ƒV‡»²>¨Puž$Ý»R´ZÜwpº«šF¥\Y ¯ ë ýPV¿ ŽÚ”úâPšPìh'¼:5d¬¹˜è¶Žòä6•rs–GOJJÙµº|Yà/]‚ÿ½›ÛÄÂ!Ðm²po]ï?‰zø–&ÒCè$‰0ß6ý1ÕÜgYéVî—¯üù‰Í‘†í]T ÝâIÚ~²©‡kŠxý8sbò Õ-`FÝÙzÔÖë˜ãªú¾Øû}’/†ÖÒ »Ø„ód±:‰ƒÎ\ÆoK=]0íí+©¥!>!ʼn`¤MCðÛ×”ïãÁp0Ù\õÔ†hÓ¯ºèï |ë)¹•u¼ Xam%¿›-¬£åžaŠa»/Jí5Üz™5ì(´ÙO¢xÖTã»q£Ù-9 Æ@Þ5C((¼œŠÛEnñšIQ¸bØ`zß~ÃeÜôœ‚àá‹È“Êd`åšA2t˜PpmØ ãŸÿݱlË(š¹27½9g†vâ_’ÕÆÓ¨¬5½TüÅ%f¬º/ÞjÖBl_“¤z¿HNÊ0¬s«;WºÐ»¥¸°rïªNºr‚£Î¡jŠnj¨ŠóH.xQB®jÝun ¡“F}¸W¬#Rí*þ/Óíë¶ä.㣌•‹æ6¿i¤y2Y «K+ávmžñq_0ÁÌc¡ùGÂÚgê¼K''XáB0%L´ÔºÑ—]ÔÚ7LªN.0–x‰ñív|;Äi‚¥„ ¹zŽFe´w5 ó‡j«wüz1%Ú°W\Yž­Ý©b”ˆªvŒœs®ë„in í:žM~ˆ¡‚dþ†º×a¼‘d7ÅK2*¹½¯`QrKïIRu »ëžÈxbÝâö“5¹º0ñðæUë«Ü®{ã(of å>B‰ž/saiÈá¡î¢ØNió4¢sg)–³€a å`—¦ê’}j¯ík)±—Œå»í´U=·(þ#êÝCWý\erâ'Äúsô¸¼²‹Nþ䨅#ßj;œNÎ÷AŒDTd+ðk sí]Ïw5k\‡Ã=còMý gJЏW?¼Ý»SZã¼ë=2éƒI*¹KäÛ‹ó Ñì õp4ƒQTÿP»[ò(,î4DUcTa€ùZK vèøÉ»@Ÿa`°IÇ7#‘îʸæ­å#Ó»Ÿ–ÎîÜ‹g õz…Â.…,÷ ¦’H¨|ƒ}H|ì\®µ®V¬­ËêԘኾXe3­—†Ò¤6[BcG‘ }7"Xwˆ¼ëÆŠíÈ\Î't¶äiD7Ðy.çÂÐ¥À.3Õ¹Ž^mV v¤{̓ʴb[ ˜>%ëñúÒù‰âÚÌO÷ OµPi&xFØ K0Òw wòTVžØÅ;±Tµ%•M‡ÿw :%%‡Šô™õf`‘qBA/¢ÇR¼]L¹ˆ'|¡dï0c"àawãæý©ãÈY^¥Òaï;SGߨI©õ‰1ùlßãÓ,`šn¾‡ÐÅy/|–GçÐÓ„.‘¶[5?Ð,‹ÊqÈö÷-ék¼U¡á40ÄZÓ•G逸O9}©úˆÎ˜,ê«â•\YjƒÎ~B¦5±ocê* ò™ÑÈKøã¢°4ó-•ÞçV}ëĹNÅp»ø âªÉP¼LCw^"/_–ZÙŠCf).Ÿþ#ŶTif²ôbúËûEBììl×±KMáš.\HÍ}K&9éO³ëóðw-r’|‡5í®·[UË»µß“¥ò®Ð‰—ý«r˜ ½(£Sežo†)c`mÞ›¿oO žDTõ·™˜B¦Iq¥Rõ}žlqæµó ‘Ç`Æ0õÙùû0qÆö½Ö3 ö¦TÐö(Ç« )«{0§3ÚÒtÎÖÔ&Ùa}šÚIþ™AiÀc¦ƒK ™øêpG8Uo“°tkŽ'ULºÊKª$û‚Ã1Ÿ–ÌZ ¥qLr"¦8)UuåØf§—v‡#ÃPéFÔpKçÙ:…ÝÂÜ”{Ãþ •¬³.rÊ+E¾Â¹„ÐÃÜn§QRñ1¼»H4Ò~ÙHhòËq¢á~˜=Óph¹6ïQ‡j©Ï÷ =ígÕá9·ßoñKßùM¿(0 ^Wâ‰Û| Û¦‚²<¸E÷–«súïÉ+®ÇxsJe×z¿~ö9u` Ã¶‚:wÇ ±(VjÑVÀ…×O- :¤³:Z¨ÐMÉŸp7>’3Ë„VanFŸVX4Àö$Gœ¿ÁZIÛ*tkK3xy~ .RVé¹½1£FêîÕÞ+kû#`˜Ô&„ï¤{ý(‰jj>2Çåå´;Å*¹Úêüz§K‚Û¾á04ùèDaRµ…gdrÿ‰§‡Uh$XAæ%‡Ó잃 Bª&¦5È“+ÔH¯¿ãïX†£ HMŠEy< ¾þٲߠÏ0ä(œ® qäèµÊÀÍW3ØØž4÷'îppÉ9ûÃ\¹·@Eþ¬ð¦jÊôÇs‹pËšñnB¯Qê(aÙ/Ú΄lÝ0o޶®àÑÜ/³Oß~Ex2UOE«² 2EÄn8œçé|(Æ _phw¢O'[qÐtí¦a_m&'³'ë¡þùà~ê˶U¡£R_úJ±~hÎ$ÚÀgjŽu Û #t\òìÿGÕnYÕR},Å …m#ëØœÞ­½ã'°§¤ý–KÄh‚ônóÕõ ù^i(æ²ßš«È=CôóÞ6†ÆoÆTus¼ö'®à9iéYó}1M‚K&пê2?ȶëˆÝçwk$ŠãйœÃ.lè |ZÎK±ç‡mDÊÅ0Õór@ƒNv¡àS¡U%óZBË¥¼ƒCƒ¸i®š`ånÔÐ?H ¥L¡©¸%+åÃlñ·^öæã%Bf'1u`ìÞ­6 ñº Æ«¿¦üR}ÙGšAŽÐŸøŽ T.ãĵ÷³h~õÇæ~‡¤VJ˜ÕôäŽPH_ÑÀ‰öùkT~*˜Áwi~*Æ¢çâËѧ©Òfø LZAýïá³æåf/R‹9{"Öx(ñÏQk©Ô(åY¾ÜÇô˜VºKû•t·5GB¥¢ê«æUÓ!Ò‰E´µÊgˆהϒÉ%Tž áÍŒ^­ äÖïºÁ* 2ÆMÊéJ±«O¢¸<¯HŠ m(Yú>ߞȢ€"qóý謪ØÏYåo=ay“n‰aÿ^˜ƒ¸D–Ny¹ºb†&Á¨3{û$Yý—Ž Šôì|+ŒF’®ÒoT4>qÁ¤þÑ”¦ß©œ¨òØ Xè^]T ¢ÞÜvuŽ¢ŠÅbìä6Vó"ò·ªßßCî²ÐMa“ ,Æöù¨]R¹bwÙˆš1¬…'ç­˜V‰MçèQÉצ„Ühˆ5d*ÃXaJlog=ûÈfã›Ñãlø#ÐG­IrUm^㌾öÐѽü~[WéñÅu¬¹ÆVøê”Àgytñ]©¾'ñ'©ïWàeÚ‡›†•+¯9ÛϤ*5âr}Ÿ­>^ê1ô¬¨šˆ/Þáµ×f(°-=L„ÏRVyÔ 8—¯>»ŒFT86ðÞíùu®4^*aÖÞWe%o,!^‹Ÿ¾‡ó©DâG ÞȆl¸Øqe«(ù.åŽZ¼ÇcÔ<©}ícN^eE=&Qî̇ô5Òñ„“æÔ±Ó؈tõp>òmîq’¶@¯…Ë!r”ÕØòÁ¢³«yÐ :Oú3T8ˆ*Å®©¾¿9Ľ$eeT•tpFx=²¼s‰™4ó«jÓaz眗ï0MaÊŸÁ\Ó¦@¤Qü• þ˜úáO^ÖÅõ„@Ú?Êl¦ªÏÁáv†+n»·x2a¶1ÑñTvCk ÕíÆ&éü3¼ªscLš•U…µ’ OùCosTÂòO«äy Õ¢Ÿ,ö/j×_ŸX;{ãJ4™¤¯êX’é(^b|Mvbëø™þþM"æŽB5j}*Ï%Ñ»óÒåËDæÛ¾yodw‘®v²§´Ns²Ýw¢3^Ãs¯%¼Ö+ø¶¢íÕ|aÓ?K!Ÿý%,Œq!„é‡s‡úð]r’&çͲǷóÒe?HÇ\ÖöN¬¤áiÆÏ«äht8ÀÒAþ·¤>âK B·9}Þ\PYã-¾pƒ%vóã°† ³52ó0…Ýí»Ž m;5ôW &°§kã¤ùå–ÍK^ÏCfÌÍaSêÔ®¥¸˜õgê¼aÍùAÑ&Õ äJ &­}ˆÍ¾¨ ²¡›1Z«|o@XríD´¹7Ò¾#MO=CdiÀAñÜþæÊ›|¾x¤F™MÿŽ—è åYNl릃݇É6Œ6ý —IAÍjö`z†&€g[H²)´MÁécÙД›i¶në&c—¦¦0›¯xˆË£­¶_ÜúÃ,E6.¶U6ä44ñˆ¦k/ AhŽm.?eÝÖù.ÒÑ«qé=qTŸS8mňV>ŽJÀxœ¨ÇŠÿ¾²µ97Îæz¿Z | EãŸÝáiÖGN×õàø^S|ütÕI‚ô¶ý›;~…Nª _1šKg{»ãâª)ÊxÖ’-$Þ•4~_s‚'èþæúR« /\þÜ}j'êý:%û§e f±¦î Äp›{à\½–êŠ7¦Ût¡¼fÔ-ycK¬ÆZ¦ê8R\¤Å$3r{AÇ·Ceìãø·0ÒsãÉÍþL*Ç€ )ZøÀHäÁ—J[”ïM°‘0_ÜÃŒÅÖS¤0êà„hJ_†ÖDgØÍ6Öò»ýä¥ÌåX%Àµ!¼ÐwèÎWåd¡6¨ Õu!ä0+K=¤PùöÁ` µRÕñž?z½9m Þk³[,NËÄ×Q&Ò…|×,Û |øYh€¸âQðÈ/ÏRráRÜLs:¸¯j¼…ë,Ç[怎O"^®ÙIx¶­€ã¯Ü×øØOo½2F’K²ÐÀËù*ÝÿÑógó~{2ðë‘•‚L›Á¢€‡r͆.6»}‚F…R™çF”ÄáÒ&$%¹Í¥Ü=¹6ZßD¾z˜ng&*µŒ6–`°–zÏöd¬7 Þ–‘—U[ %éÿˆ„¼±;˜QÞüú¸NNÀè"2>öh¼=Íx0)¨²´öâ½êÊÍûØÈ˜ÄsŽ¢Ë°]Y™zÃ[€(¢k3Z­vÞcù˜gf>ÅRÒH _?Ø*ÂØãLpÙCFˆ„Ÿ_~‡…߮߸9îPv&jÁ®Éo_†wø«Ú÷iªU)bVYfp£ø0Å­íÓÖ“¼á㘀Ði‰_ÞV~È-i‡ ˆ¶Þ­½/ª±ád®Wμ•y`•¼Q°ÜÙaמô—:ÄH-«6æžÏ—œ'œ<„'²z£)&_ûÏA—Î2blûuà1€b¯ÃÀÉ9®ò„ ÇÞÌ0EÕÀóíNä4)TTÏØš.¦ u»ý5 ˜+l·žá]ž6!qøØZZdX y7>,ih«Ê$N,Qá•‚¨Òš¢Ìɹ¢ërO–|Cöf_œ–®$2æÃ´o?ƒ¸‘Öx‚Ðf¦´¹©à”bªEHu›©JQ0.I=¢ˆ!i3›Ùr¯4¥ÖÁ©è´ü‡g(¿BÓ$7{Æö€Û2Æù¶ÂúÞ“ö3áíSÎ w©o5P«à€ÏüØQѓѕï=›f…Œiû5Q€·Ëƒ†ïÊôuWYŽÇàwd96Ññ9¥ä‡&ä´–;À€ª]ýÎ#¶´¯%=gƒó« ™ŸK¡X;Âäcpm¬N@g ‡qܳ³…(Ê€$ ÕÄÂãœLe²ºþöæ ŦðvéÎ-V[EÂÏd–ÐKù§ôGÜwqÂ(ê,j7Ô,\9ðTÌ¥ZË6 NiÞ°\xÎlVÚ•I~³û¬²ye‡Z‚Û[tâ<þ Y8PŠyˆl¤/Ù=þ T{L+ Gö>%Ð4<<šÝ£+à .¦Ka #g_×xÈCmõÃç"Ké-@áåø «\ÁKBt3.•ç©»ÿå½*#’ÛÂZd*„±,‘2ãî©"¼Qs­Ë.¡ë‹:Éìô£ü8>Œ?bØŠÍ—É×·çX„GT<^Öi¾a¸MÏ")Ò¼yfh;R§ó-ù €VÆžO–·¢ÐÅZ±ØQ²A´¢Íç‰d…Ó˾™y{ÆiŽmv³Q}A8¤k9 “jn\‡v *f« |ælÉY;`øÇûΈ,KÆŒR«9I›N†yV¹hÛ¬\²sU~PU! ¾ä¿Ô ·Õ8‚ m`.–G,†ó¸8´3ׇž‚Çê`äŠ ÅµÚâ »µÉ¸n$\§sòðjÅ TçcFy4‡Á¤þã¹cUëÔM˜hŸ¹WÅ–¸óÏ]š3€Ív÷ú…´ÝJѵc×±…‘¦ ]ýMº žiRÌ®þ;LÕçϸX_-Ü+y ޝŒ|¨,ÆMží[£Ñ¯A¨Ö[$¦Z¶øâ@ñ"¸Óu}¨Ä\4I«sÈp(ïy.ëö(T ›òM%ÄgrwGŒuÞ“L|c0(i{Ñ1ñô„Ò¶¦'×”Ûž-ÈIËï9 ÕP”1Vß@´)›ÞÛcnUEI&wÇ®°záh 4NšœÑpßT9غäàWfÙ¨}§ ÍÞÖÕ mÒ*Ó‘PøÚm´Ãêe‚ø;#‘Þ~Jxô¯Ò(%EB˜ÊŒ"[BD_„(4lžoÏòç¸"›WÁÞQú}Ç<|ErÑ["4Ï ›²Å8ÉÆE¥ ú²Ýß­Ïl^9> ]ÌÒL¶íßÔX ,ìKÅx¸#„ãß9LIﲫ:Œu‹n©/-ï fp½¥¸¤¹êb”*x6®ÁŽž+¨KpIË U´^ Š¿M-œtc0Å÷$üˆðÛ®ŽŠCæ#>¥å¡J¿f‰¾ÛlcúnWߌ/µ”£½4¶]#:æYj8ëZë{ç+Ç©ZPx™Í÷ìñ,ƒ†ýˆŽÌÒØÃÃê¶Š‹Eú?k‚ßÍA r9yðÐX`fRììü¾½%·‰Nâ!g8¼FGŽtøVõqɪ*c0ΓHk>4þ'íQÓ9õ72F x ÈAó«s¸1@Ö§s:/ãêL;ÌkÜ%{,¿{ø&›§‡ãë–bßèŒÔ+k!ç–E݇2A >ˆcwÎÝüªi¸rfQ]ßá×Á°ÛºœÕž…»ìO4yp*t;²\UÌp]], 퇼à"qAjdt?I4åTvù!ΡÜÓýòvPWêÕ7Ðyx±1\wï S Íu¯…Õèbt¼ÆvƒÕ÷}EÙëÌ 1–”,î\ܪ(_ËNzðSÒ‡©KÅ\Åhø>wàÊ×½Á\®WúüŒµÈï©Î6ù÷nÏÝ)û.Á=øTíÀJSK[ä»È‰òÅ87-û›XyÅê§±ÉjÍ#¼ÖêvQ ­²ºÝM‚>Çv ú²'f…*áˆ*öÚì÷\ O4(Çç”Ï,ìꨑZt°“Ñ]}n’$ï)ûK+F€«ñÛ€M=i–Åßg«²"…uû´_n¨~=V–àW¦@óÛ·‹0Mþ1U®@“+äsiˆg>æý@¹ýµ‡~÷¬Úz•„®t;Ýà¿@ÚÑið½Ï>:×R»¹…Ì΋q±¡Ýu Ü€0F¤Ù\ *dí þ¥êQ J—VNk:Þ0bê¹3?Τ—9•Ê-ŒÐïaÀ§¼ˆªWœæ@| 'Ô¢¢¦+™- Cÿné2…É×ktPiíwêZÎe—²Ëì\CôR^6ûS…——|ÄW’×®~üâè´d>Ÿ©,> ‰žÚñÄÿV“G`°ƒþ½0ð’8«ÚEÝ-&dÜï±Æð(Oµ…Ði$†Æ6®\þ3l…öO½ÙÖÆÅu8ý)̯äò8¡œÅCËUÓYÁAÅ™U3¾Í4ê÷Ä´be[Ä„Ù÷·{¯«Ê=Ô®G¸À:Õ°)ÎuìΕ ”ÔÒçµw³y0³òóÌþSœ"Ì&Å”YDS:„«Dø ¥÷î_HÔùï$%…s¢”x «w¾ï/ÄÚ±­îÎáéßÇÅÄ¿qyàÄ,ÙΆEˆ ®Åœö°ãv½áVŸR-NZ´!úÇÞÕ†ŠºÜ 1?Éõ['·zŽá`|ã åh«zß3únBX|ÔÞ7QÁK>k˜ï=Îø «Âî&Þ«ÍN„ˆäUÙ0p M¨ÕËTØÞþ4ßérÀ„SÂSötM5|Yä7,?ݹä3Ù»´€ ™õx(‰Ô¼¯úÅÝ€O¥™Òxþ)®~Ç©C¯VÓƒÂ2Þâµ dñÞñ¢Â£Ê¹ˆr·…IÚ«¼Ìå€\¤uüè+ Æ¡µµ'Y¥#eÊ–Sy? Å+H#q`ê)Ag&ó€%ÛE|‰Çùv8梌dzÊIÌó=®"öTãìÇ"*˜Âèk5K¼È‚ÓÕ\]TõÕKÞ¦T ÓOª8?Å:¿)PsÏÉDø¼8>Vˆ±ýªYä!\]ªì”ôNËü_+^ÆØ<éf¸x¢ºËcD¬¿$^cfêí/i`çòYc*ñmèìB11œ{éún[–c™¦-¾H‘|0Ž©8ÿÞÒÎ uXP²éUY”ù¦VCôQ›C„œŸéK¸8|4ûÃ+-³°[žeU8Î\S÷êg¶íí¨ß$ñë}Ç6 ÜF]!KprpW<«²»e\Ðâ:Ò!ì\ìêÁ?)ÑŒºm'ÑÚ¯Ø}NŠ1ô‹ƒ¢ŸÌ>›Ÿí± é´g7‰ÙÒ**b.bˆ²XôhAåʯ-³á î©¼F!ewy9iÒi÷|Þ˜Šœ¸ÂqYèü›Ç±P@×O “dÍf-œááׯ෌²ÜzÉ k/)7fœN!1Ô1^¨°PÍšþ,JÊ™£§PЄ&/»¢À€à¦vjè'âž%H‘?‡@“)ØnÙ>‹R™Të*‚\±þ7È@™Òj@á~رe¥qå0Â^þxÈû8ÿûëMÑ⋹¨¢·¾V«E-Éß½EÁš…0¥ˆJµ:Ô<÷Šë:Ë%ÄÛ<Æóì²øö*4yΠ泱ȉ&šlÒ®â6®`±¡H5•Š =¦æ—‰KòÐѶpº[¡Ô¿ó£ã)WóVÙ› M¥’=T“s 7’Gâ`üÑmºeZ„Y¿Ã„Æ=¤¿v¹H µO+R4ãƒïJ,î*èú+]µ] ˆôTñЇÌmê¹5±gªØòŒRZ´‹Û"1èÅñq;÷¼¦ÂëBÍnÛWi¥—Šôkº=Ü|œñyÑLwV殊t–ú&f}s¦K²«¤^÷³)s®³÷DÔ‘#ÕבjHq-Ÿ– ì œçm:yo!»b6ñœ*â0É¥ÔË(ÌœÄìÁî×Ïe8{ÜïQ’– –2#¬h6eÂÂ)i¤û¯ñuüik .i«,?ÈʆáÉ|}°Èbç‹^oæ¿®ÂÂa#7N”ÅLÉ›aËÏHbSž÷Àö}'B¬üà„r¸eå©õ TÓ~3#D|äÇ(/Bi(ªDJ¿ªêd¢&61Té2 4·ÐìuݧV¬”hm=¡„¨û-L»O3n™†¹œ‚*¥k6¯ºïž¯1ó.ر{m-“´BXýZ¾í\Í'('麡Àšï“‹'òEm©Ž‡êiOçzп:¼Ä®K¡ÅLJè[¥¬ž" &DÑXn½Jzˆœ?Üób7&…ö|Gùpæô=ó’²ñ`/Â]mD÷ýó›ø'R¯eÙ]EM?íÅÈÉ D’ºõ¹Í턚è•ËKš+ÀóU]!ßø§*ò¡£UÚOÖóÔÑ…÷¢ôU@V½×½/h³PÌV"iˆBò–z!ýÝDŒOù7Îg²¼VÐ×{ѾÊO›˜£UOƒú¨Ð•½$«ÕNœ×l¾7M’ ˜Êöé ¢`ÈÖ9f&’˜®-²^OñHh矞ÃC,Íñ²t§§ø_•þ“¸ÏC+¤3Ö9Ù.ºcá2®RòZ¢enAfÄbÕ£“[ F«ácç¬À¨ÓÕ“OÑxÙæ3â‰öe Â=ÙÅѤ.|\p.–Ïý9ÙAÇÿÕ»;¬W1˜`Où=áfq^zál[Ö$ùI—6±|FÞ•\>]Í}JöY}£î?ó_† Ío³/š,ERÃmÊF½A=Klú%eSû4@»TÁ÷4UÄÖ´Ê\‹çKÕø»æ]˜’“ºBΑ4ó‚¾@C«öïgò(ífžFDDEÇŠóIÕËŸ6Ñåêt¹}ÆuÆ™.‚ƒ¢u½Uýw(?¦«Cioèk·%x™]áVS_+=nþDYBL@]ܯXdv­õ¤ÒŽ£Ó¥V" NæWü¼ˆ„2ÈFÒŽUq@B2.#| UàüÒ]F3”¡»¥ `sT-ú†½÷äT‚T4í¹l`ª85:ÌeÔ&ÇšgÓË«FlóÐõ$]4sm`GôÍ7Õcóš—4R@tk ÏB’7 ¡8]ÏØ>« —€àMÉÓ>·=Þ”á“ö¥îÚuÇyx´i/^ññ¥…¹†=ßI¿m‚ÆÈ·J"q×l}•‚ztþÑñàcöÙ ´™ùf ê¤È;ÞvÜKilW¤x÷‡0<Ȫ™1¾V¢‹ö¶¦þ¦nˆ‘|—¼;Ñ|¤Ë°¿:ôGsTÄDDªl…î2Z%ÊÛ²Z L'K;RÝŠ•ÖÚB -Z¦™¿‘=ÖÇ1[ði)ZY!ÜÿØ+&ðÓâ•ÖMy(GhÏn›•6’QÃú¼Ïà²zT bž0T±öA ëGhuär_ÌÈâÍ£Óy¢j>%Îb§¡¿CÈØ<ürQãWŒbÓ„L/…½q“}l“ƒwŽÎz›† Ù§H ‹q~ xšï-V0ôä•Ù4t›Âxľ›¸X?SÀ®¯µFùçf}­ :¯`Dt¿¸O*:ÞB·u¼0‚:Ê ê³† w Èåw­æý-5ÖL†*5£,>HTeÀæñðǹ¨ŒPÈ‹áÞ‚Ê0ÜÍÀãƒxãQå)ÁG96fªsL|—aÿ±ÏzÙø­|°xûÊ.渴˜×Ù•f~3â•|2Æ{ióìŠD€¹)xðóK™ÏªOÝÄuo…ü{²!Z-±Sîœ9úÝ\¾92¿ÆEsN E&k§ÔG>½•PœtIÈí»i…ÄÊ¥ƒæwθk{däÏÄfM£ô@sõeÁãlÎÌþÏÖõ…X¹yûiOÒSõ²œÿôoxN3f4,Zú¾Ïë[ÎüxIÄ8‘¢U:T™%EeŸQ`xEñÏí{è"Oôt/ {¦Ø³o«]§ÛgîâæÝX<‡2ÑwìSW‹Âk1fp• ¥Â¸”˜ß©xzÒJÒ—üÕz·‡˜t˵-Ñìw0w«× V¨c/ø¿–±Àû¡±úöò Öˆþ6)´u³¯Þ'+V³ë˜Ò©z£#å(r/DÅàȾçµÕ®¶ö!ô‚J„Љq¾þ*ÅtIøí­«õÎi8Ÿ@‹)°l|îÛXk\@‰×OCY†h…†!¼ö’ŽàÓD¿ ÆBã m'Õ¯\È|•`y`ŽiTüúâ½|*¦k¡N¬ñÆþi.ÃSª'Ü4— u¢ø­!¸]mTLOÒõllï®m¨Ä:ó>‹i¹UïÕA¹tªÀ1¨ÚO ÁÆ×àû° 9CH¦Ò@˜©ºZ¡'ì±S ¸ƒxŒnâXý’:^«ÉÚ¯Q…mf½ÝâþÕ‡Ínqø:‹¯$Æöò¬™cBZÊÓ“t½÷¾‰5Ic9=£^é–2ëšÛ£3w5b0ÑýQÉ -Zz6$}ÿyýž¡5yY±A5ÂwÊ ‡Jþ^9J†ôYŒEéÈâ½e»“\³ìmmh'Ü ÉŸ Mb‰ÀŸ¾Dq–4cüi¾³š4qªM„¦ RûG˾ý !ÍnÊÄÝÆ#••ƒÀéÕôó¿#Î' üÁï{‚° 3† ƒØÿ1PÛÕìï׈ ‹zßõ)±ô›©=žôE…¢ên<2vÓW^~Ó/ÑÊTbü£àã@€×ÇBŠkªÄRÈõÊx.ãǰ¯”–F›,AbÕ å.r{lÕlÐIÙÜš"–:—^'Æ¡øáí1ÙmGù–W_ #)|!K»BýmU±ê=BrÔÒeÎÜàX>¶&QüˆÊ–bßR¸h *þN«I¼”ü ÄØ–$]ƒ#¿’q&C÷ 7wU·ë‹Ü%©oþ(I11mpÀ¡b¬¼"ÙVt «ÿ#"·Ù꜂Á4ƒP«‰À"Ý]0‡Ÿ›•öãO!Y’ṏ+’ÓWQwJS߉ï³êíJÎË',ƒ}Šá‚_T¨ˆZG¸Ïêeˮ×Jg€öåçÜ£¢àxIZ*ÆþâT©ªÑM· •ÐòíâÙ‡cHͽ¹0“Z„eg¨cL2bëÓÏ.qÙ>Iüý°qU~b^h7q[Œ¼!·bG_lM”2±±tn›™›÷e C~J†ã®­£0pví˜ì;Ôƒø,/¯ 8„5A$QPÿN•³Àq2âFBWK§Þc›³—ˆ ÌȺ ÷D+áie8 •Éæ!{¦f!§ —gÏh’¡º þb檜 P’ú)ßG}PÐdbÁù&ÒŸi…›XÚ½GQð¨•ýeÏ Òº„íû«^Ô~è~ìðª.`…$ÏiS!±"TBâ0)Èßô]S´S¤HÄêÖG]½a×þÀ@ž¿:hü™¬Í‹E‹MªÎæORŸ$O¢"EºÔ˜ªî)ugâ"UçšÈfºá ª3¸…ØŸ÷A¯9Í÷MŠvÿ3õ»góÚ-|´â)e7œù”ðÊ Ýß®äÌb—~åkêQ‚᱊5ß2á]låʃTj^ý_tuo¨'©0e®&»<7T’Œ­| ˜·æO§3Zñi‰õ!¸& 0±nÙ[¼2£À0ê/þ¬z²äBø/£õoVUG™—è•®N!E‚§ EœäñµžIÕÐ-!‘Úwói¨)êÛ‘ CaZëˆT Õ>R,P$í…© ]ñËw"F|©\aùÆC:óÚŠä‘¡?ì»:’ŠLè\Ë=ܶTÍýƒ;j!8÷C\ÞŠ Ú\š¥:¥vì´^OµÒÔ²I4ø™½Ôã…>‘œºí9“4Œ¹—f ý¬ßŽzNsyðÄ#žé­µ¯";,ÕV0ñ¿ûÈÙLe~—¾E¼2ðq¹ÚaoéPc–"ÿ¨eë¡'•{’ªºGˆ Ã8 H•쀦vÝ4 :ä¹Ì¾ßw9&£ áÒê7zSBñé˜ç ϲ¤bröÙô©¬•ÖTG®Y5%Íjà[r®Â »a«èÂÎJdMC€AC zRáx_Èu$Ö4¢ž>øÖÕkVvºœn+F‹eY£¢cç¿‘0º¼ÄÏÑ«¸‚^Vsʽ"y6H±yÁí`}_Q< 1ˆð¢” üJ*\ ü³î¬>0ò?CªŠâ endstream endobj 1174 0 obj << /Type /ObjStm /N 100 /First 1007 /Length 4214 /Filter /FlateDecode >> stream xÚí\Ys7~ׯÀãnmyp_U©­ò;ëØŽ|Ävâò-mn(R!©¬³¿~¿Æ# EŽ,™Ë§T2Ìh4¾>Ñ-¥rL0)•gRKj¦œ¡Fd::4´`’>wNQC1-54‹€FGã5½ú- Ö*Qqc t¶1õãW4‘ÁüÁzj჉£˜’JSK3¥,Q1†)R?Ë”•snmá™ò¸3XA”ĆÁ„¡è¢e ~V2­%Q¶Šicˆ²ÕL[Ÿú¦½ N­e:…90¹Žž8“FŠÔ/0£L¢™Ñžè9ÁŒD@G ”€ËxOëuš™(ˆ е‚ ‘Î2+½ÀÎ1«qï<³F'zY›DòÖ%À=dá Xé#³A&*hEG#¼eNtýs*IËrÚIÌ >½ÀœM‚ "•D/`¬÷´¢à˜—I2ÛZù‰¿YP–(CP‘>@ PLB}„‘´bšJ—ôfP¤c2&¦ˆ¨‚þ€-üÅ0e°v4é#/51LEïR7(“%Y*‰a¦S±€UµIµÄˆ""VC ´%k”…p² +¢kƒR,@‰!ÛQ.õT¤–¸#!°Þ4HTÄð˜ÜêˆèE©%\!b˜aB©}F‹ÈAÃwbÀ]¤0€ÐÁâ8Âò,b&éî©3…1äÑ#L¸}êÜåèp¤` ù¾\<0ŒN>2Pè‚ßRØ|ïoäa\„±pŽ˜~;Ú¼`nä¯2ÍÃØ«$BCûCc(qÀä^ œH(ŒäzŸ8(%rg£!ì2‰—€M1ÕzŸ@¸#lêàš7¤ÜÉQ¡‹{©Æb‹bcÓÐÀEx+x(Øè˜F„ý»JüÖ€â*5ò[aÍ¢'Bµ…WÒžB6Â&¢©…T4RLãl“G*RÐn Þ %A*3†ƒÝgsÄnKŠØÀA+d·T7Ìã¡Ò)˜eĤ"¤ü’xÐT䑨sø1a¢h´PE„)D-¬J 샔9LèÄ¢áS0Kç`y&?ícWxQÌSáuožÊR®w Ý#¤!`³Õ#ýöÁ2OrHT•"@Qf©C{á1$öšÓÁ(,ÕW‘8lxÈXR¹Òþ± Ï~™  ¸¥ÚâRkEUªlQQà@É U<Õù(†QÙUÃyJ÷G7<öÿÀ2‹{ÏíA‚:Pm[<ÚmIdØ‹3ŠešêžØ{ å?Œq •H%œí TRÖ?ºß‰û”†AðfQ5žjøðÜô‚ÞS†‹lÎ É2IÚì ÃDbÇ"ÐÛëh±ßMx¤UW»¥=x„˼®v«eÍÂöNJO„_0þö—_Úi³bó‹Ùì}éøp1_'‚É=Kßxo@eöîÁ‹T‡§ŒâÇËÅÉËœ2~üà!ã¯Ú/kö~¸øc°tÄïƒx;_¯¨œN+~Ak\-.–'íªû‚#½{ÚžN'÷_X‚ÅI*T“íO–ÝÕâSÇé §¯SˆŸômJn¸Òèñ~?âP–Ê·¶¯c+GåÛëËØzþšÂ$}ÿQêØÊxÄy}{Ÿ1\¸ëû:¶‚:‘¬®­cïs×¥$…M0ÝWúf>ÓÀPµ×˜‡¾jñÀæñŽ’@ºèÛ)ºÒ³ÄÔ°zVžêÑ"½·p;ô}TêK_иܯ—ÛÑVhÓ{¢S.C_d;°Öö: E6žMá)¾Õp¬—Ž}èÛJ³¢Sß:)Dö¡´ ¹RM'-¤&ZV rh9ô%YN¾×ïû1¹r»Ž½Ù:ú~6Ï][%UÒèt Ý­ªe1À¾Æ¬{AV_êÿúž¶Þ÷,ìÔ»»×Óõ®A]Î葊éò™¯Þ‘û*ïD¾ÊbÍ¥ftï»ñÞ^^¶ÆæÕKªÏ|òUüQ¹úAY5ê‹+ª°yõþs‡zRŸâãê«Î¾zuÒÙf¡9oÛ°PgX%¾ÖBi§ÕG6®l4Ãm ´_!–Ëñ•H¦F³ŽlE:)bU’ê#YŽzuDì 9«í3åºYÅêˆÖÛR¥ÆµtTцm¨ŠlÛìÓ„îˆÝ­‘öI=Æí“Ö]˰š›æ쳚Ï;Z¢ëÅ]ÞõÖIïjë$Æ­Z§¼j¦ÅæEË*>¹¾ôFŒØ5>ÁìvÓ/µÍ7ksו΀’±ö½Ëêš«70:ø–/Z}¤B¦›Ù¶ ÜHån³ .Ó¢bPõ½8 zóØ.’ä¦CÚTRZ—ß\ãÆBqcE'¯M4t¸4kozd‹›¨çHÜÓ¿ûKZ[¥ÕKü^âó¾ªËP½ãA»:YNÏ׋eWÿx69Ã'ß?xþêñ/ÿx6=ûp±zº˜?¹so1;EÙäÓŠ™®ë½TÅ»c4»£Ò‘GâSUfuB¥<§ô¿?9ÿ¡~ú¼ÆäêˆÓtôÙ©Üÿ×z2›žÜšµLñ—ëöì5[>âoó £#h|ž,©Èò7~—ßã÷ùþ=È¥šÑü ÊŸñŸø1Á_òWügþ–ÿÂåþŸðSÞòüãôÜKþ‰æSþoþŸñ3>ç ¾˜·üœŸ·Ëéâ”/ùНÚ?Ú9_M¿ð5_^¶-_ÿgÁ/øÅü´]®NË–ÿÁÿÿð?ùùÛåâï§X´OõËAlé¿~øcô‹öÓÅv¤¥Òt®î8ÈÒvˆ´¯‘6~Ò¦šä1ôãÔÏ{°ßôpOVk€¸ú ¸XNNÚYûqݵ–4EjþÖ®û×hwœð“Ål1Çß³³I’X≷¿_LfW¤÷ùÏóÏO-Äù2œ_œ}€|¦Ÿ*¡RM9Í—ZÝlYÒ¿_,Ö™±¡ÐW³Éêó-Eoo"úgßÿøó›Ç›¢ÿéÃlº]üNvâ÷ðß ~¨Q¯z§ð%±?ÀŸCØ?g‹Ú”ÕÇ¡Tz™ÔâØb_ëBëoíãWǯß>ËоœŒú/ú)ÇM?!¡ÃúÑÄK`á¿k`Óc¬’»ìJÖ†eµº‰a³z k;æ}eì2ŽiÜÀÉõ2¸*x ÜþË£_7%@pí’‚')Ðt Šhõm¥P©·4v§^Ù%`:XVˆ+KWBÞdéoî¿xþäq½ô—[¾Cgw |rcÙr¸l9\¶Þ¡|¡^sŠÀ7Ö=Ò¼Ü(¨=}þöÍ‹³g‹øä}ñ· {ú¥m¢•k‹¢!=^‚ âN •gsò[,0…¶3èÈj2?¥Ø†ÈÕňoŽr““‹uìæ§Dó2æ ,ûÓ² \] ³vµúÉtyrqöqÖ~}Šw§f‰±òÐq–ž.ßï7(Òo£n :Ï<=~t¼¡:#öCª£BQî°WVªcåÀ~ÜWرâvIÑvÝ™¬sj´U?>\@6cjr:m—íjºÚ¦0í—“Ùä¬Ö›Ù Ug˜>ÕZÔÏKú´è4a<·:Ÿ]¬øïЦvµžb-·Ó½³i‡Ä~´ðFùýûúùÕ- `.Ò>ˆj8rS]h"=^ægQo0[t‘4¸×E#‡ùia·"ý;Nš÷:e U"~2’TßRQ¾:¹Þ*Õ[îªè·–Wä÷ýüÊ9ÿ4§?BIçtÔäJk›aœÍ‚i[©7vÈ•MVüm]PeÒéÌ OI’RÇ ZU·¾kÂ8énÒâN Ç¢ÜEÍÊtŠ$z‚ç¸óøšAØ*^)G-K¹Õ»ç«{æsX7‰s]gŒ—ñò²ULD8öc> {¾Î¡1ErK.NŒ^º=¦Œ©žÝ¥sÂSÈÎéýU+¯ŸÐKXҽɪMç=v×:Þ¡ûñt:˜ôpº\­É‘Yñ'“ü )/}3=]^u¿ØN‹Ž²ôËè­.h”¹]å+̹Mæ´0gkæÂ^˜ÝÀ^a0\Ãà=»wn7˜SBl2§¼ÉŠ·¨öÂÛèé j\õd-Ý(÷ÂàÎmÌæ®Ø…HV $köÂÜØã nL¸ð*5{q/ìe±WØ ãì…Z´b/ì]—Þl²(¯1€ýW±HgFWthô‚¤ËãŸôï/¤ñ?NO)–Ëî¬Rùîtwïôˆ©n:¦:«|»I:çÉtgfLwÉÓù Vù9}ãwËI´ÉÄlžÄæIÈw“ïá&ñ™x§ÇÌt3:ÿŸî¶ƒÏøo€Ëd¸l–UùÙt+°®›Ìvr¿Ý$®«80§»¸ —Ë']Wfg^ÞlUOâu&b;x×­ÈçI|ÌÏÝŠo7IÈÚCîé»`Ãbédå0óµú%wNSޏŽÖ.õÀTVÃÌÎèl`¶ÛƧIå:õÎYè__é°ÐyÉáZE4±_bÖ‘~íÃ~ºXÏY¯²£b9Ô£be‘‰ú~äé1ë=Ü]VvŠÕ2ãeûÛ,gtÃKˆ¡áj|xžèÞÜÕdb²듦íÄÂÖÆJÙ<Ñ2Zep¢T’šÁúr°\ÒÉÄGÉD‡¤J\©’o'e¤¶qUrC"¥ÆHÕèAê/2Ȇ endstream endobj 1215 0 obj << /Type /ObjStm /N 100 /First 930 /Length 3123 /Filter /FlateDecode >> stream xÚ}šO‹-·Å÷ó)zé18n•ªTCH‚ IvÆ‹‡’øÏ“Ÿ:ºs§¥{ºµxoæVW««~’ºNéNªû¶oÉËæ?dKKÝDâsÑ-ïø¼o×­lŠë&›áºÖ­àºêVÜž’î1L|Îe«¸žek¸.uk¸_tK;$þ%x¤‚ýSüŸ½Æ}ðÙÃY%FÅe‹ÿZøšç­ "³­†§Ç5½ú©¤öH&5«[d#{\G6{\l$Y}ŠlD¤m‘ ½ÈF²§-² {d#–ãgøYó-²‘ƒD6âalÄÃÙHÛËS$#­ä*håø)[N{Þâ †"V\Ï’ð[ ªÏNE!µ`ŒT$ÆË-ûSüAíµÁãDpø-oš[÷Ó˜ ÅÈAR½ƒŽ¡´Z÷óÍöè¯ °ö¤µûåHÛZŽgä´™WøE~‘.ü"‰’¼ûÅÌfä&Ù¶b†çâÚï¨-÷;wÊý޶yÜÑWCŠ M›{ Rðےд·î§±Zz˜TíhLk)à Öj`óÓn«G[,ÉøØ4k<ÃR,N2Òo5á‹á÷=uG,=ÁšÃ*Ë­»,ÈNØäîµûF{óî—b‘"¸‚Uš­Ä³Jx%SÜV‚uò 0¥–q[ÁaǯTOù–OÏ´ôK¥€|k'‹Ï±„`ýX7ùé›ož¾þÇëÛ¿_bq§Ø«{úú÷Xï·_ÿúéóËÏo[ßÅøøùå¿}7÷Oß½üï [¢úöÛq(÷c(] %ÓPûÙPùj_ Uê8Ô{ŒóP‘ÿ}¨RVCé4”œ eÇP²j‡zña¨»­°Û„½œa·»­°Û„½œa·»­°ë„Ýΰë]WØuÂngØõÀ®+ì:a×3ìz`Ï+ìy®gØó=¯°ç »žaÏö¼Â.ö|†]ì²Â.ö|†]ì²Â.v9Ã.ö´Âž&ìr†=ØÓ {š°Ëöt`O+ìû„=aßìû û>aOgØ÷û¾Â¾OØ÷3ìûö¶ Þ&èû ôöÁ¼-·‰ø~B¼}o ÞuÄÝNhרuÁºŽ¨Û éúºžsîwÖ°GÍ|(™±ÐuazMÊ}Âþôúù··ðþò)>¤ûüá—ÿÄ0_I›xTÖ‡ÂzBÜYÍ: éCîœÊèY=ŠèC ‡‘ŸEsЇú93ò?«žGñ|¨Ó0Sé<«œGá´Õ©lžUÍ£hÚ9â~çY‘¯"xÚü‡**cºgꨚEsºsª™g%ó¨˜sfä}ÍQ-Šå„é¬:ÅQ–¼Çe|ŸÄî<â¾K—wÜúð°ÜÕsšÙ“ü†bY/oœ*åi¡<ê¤^"Ó êLšÅèr”©<ž`?ÞgC¼è“}õñ苹ºE=ÍO¦Gæé±ûèß}úéå·íû/þøË_ýýíÓç·çMnao_üùíå§ß¥ç˜g {Xr,—ñž  C§÷CÄóúÓëÛÃ3ïn?<ÆÕí†Ûu¯À0å0Œ!T|04êÍðã¿>ýúöòùK$'·×ð×ý™£ö~­ó™FñÙ@ôÁH¼Í¦xdjï¶_?ýó¥‡w«ïcxÓïnÝÍŽ™2D´VG &¯ÈhÁì•2Z0}·Šy·`FnÕwŒìã©^aþZŒ Ô”GKÌ Þgðf‰)T³ÁÒmÌOv€¾ˆ«<^çqIàÑ6â‘x„¥éÇdò <¦#0 ÆÐç˜fÿUŽÑ=¤âµ²“¹ÁœÍxW‚ô&„Þ&m¿??ø/âGÁ°L¢jXæ@A:sH 9Î4‹(–í:Ä4û¯éL“êb™&å±RD¨3vS fÎ4·½ˆè¾ˆÞ"«ø{R"}«BDº—"å´@Z9VNÈl‘bšýW €´Q•¶*J–¥…ºeF •ÁŒ¦ EÉl±€Ò쿈ÍŒªš‘Fi3#Ò¨ofDÄ í./+é:Ä4û/@á«?ªŸ %Ð Š:hN¢Ð˜ÓܢęËuüsøªËðÚiî æ^Úi])@;Ch§IDñm«ðíyv_„oàìÄÙÀÙ‰³3O–så8Á¹òØ V1Íþ«ºÑÔ@7šzèFغÑ$öÆ€­@Æbpiö_Ä_@ºÑŠ( ݈téF¤ H7"]@ºÑ,–òܿǿL Ì¢,%DéÝ‘.h vN}ÁN @-6Ú-Ža§´m¾X@e–¾”¤K¢äfJËfZ@n0ÓRqNœ¥EðYBøRB8H³~tfýiÍË­‚t"Ò¤YV “ÅòYBÔ¥„¨ ͪ²‚4ëÇ ÒB¤+H³ü¯ -œ.݉Ψ³„¨K QAZˆ4zÞÁ ¤YU6Îhi–‡ Ènòð"þYB´¥„h Íú±4ëÇÒJû¥4 ÁÒ,i¾N Í5¸­$D?xy ¢8Ó›RÐùU2¿™_ ™_¯ñO»Þ‹ØÑýÒ¾‚î¯ötÅ8WÀ'+hãŠñ €_®·oiö_$€îJ û+…"B÷WŠœK&38š,è³R®_Ÿ2•/¸¯ÂèBSŒÚ_ -ªR8[€&Y*x’¥hÀrk‹ð'ý¶ì¿Dú!q‚BúMðèR9 p®<8Óበ‰+õzïö˜fÿUM–ô3FRšÒIiJ?m$¥‰´t§lû¹ãBöfÿEü·3Kн_ámÞ¯"“~*IJúÑäNÐÏ'÷Åäyä²Lg›tX%ýÌr§yAïç$ë°R”ãGç$öMœïuÿ¤ß࿈_û©/?G¿¤h½Ÿ“¢´LN^‚.Î…ó2¹îÀzL³ÿ*&E#hþœ 6Ÿò’@Ëä¤smœ ÍÚ8—EýÒI¿Á?º?"îÏéKÐýyfo&±!hãœÄ† s½>è1Íþ«@š4 ÞJg»Rúš¦@Ñ2¹²7H³Ü@纨`6é7ø/âG÷ç¬RÐý9¶ º?7ޤ#i£……6ÎíZ@÷˜fÿEøºß@èþœŽ°ÝŸÓ– erÖ:h㜎°mœ¯$Äüò¥„ðþ ñGóç,!Ðü9K´LÎ]œ³„Àבû*üYB,—?z?g ÞÏvz?§ó.AÃä,8ÐÄ9 4q^û·Î¢.%z?g‚ÞÏ+G Ðtˆ.蘜u¾åår‡&Îëbù×YB´¥„@ïç,jÐû9‹ô~^‰të_ái4qÂ{ Mœ¬Jp›%D[Iœ•Ó™&T–Rí‡2Q:ÑXR:&VRúº RIÓ5úéÅŸWûêJI8@\)é†Üÿ"à:4’’j€DR ý¯aOv6D•Ò¹4•’ˆ€QÒFJbÊHI+@éB*è´QuµO!¦”t´”Ê#YíoñH’Hék½þ×ÓA¤ùZ¢é´Amµ?!¢” 4”’`îPÒ+BJg#PBJ²BH'#6mL[íKˆ'%ñí¤tÔÁ¡¤!pN_@)é  Õë7ŠMµ¬$=D“ÒÙ4“Òt†Ò×_>JÒÊGI9@ø¨]·ƒeÒòe%å!–”Ä´’ÒQN¼©^Bò(@ñ(Ž@ðh¹þ¢LÞß%üÿ#… ’ endstream endobj 1304 0 obj << /Author (H. Sorensen, E. Knudsen, J. Wright, G. Goret and J. Kieffer) /Title (FabIO Documentation) /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.13)/Keywords() /CreationDate (D:20131027184104+01'00') /ModDate (D:20131027184104+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian) kpathsea version 6.1.0) >> endobj 1272 0 obj << /Type /ObjStm /N 32 /First 312 /Length 1209 /Filter /FlateDecode >> stream xÚXËŽ7¼ë+xŒdE6Ÿ ,²·8v''cZ[0Ø,ù¿OG½ÐÃqZÅvU±‡¤ä(;c£ì+A0>1‚hb ’É>#Ȇ©&ã,×$>¥"!"g\Šq#‘|-!ó†¬Gr †ˆ<¢h(ø%C)9DÙÈÅJ1ÄSÄÆ[LOlwÕØOŒLÆ‹YØfahp¨ÆÑøLÐÅÉøâëh6ž« .&Ø"&8ŒzkM Ÿ9|p‰È„`30/ñæúz³{¿:ͧŸŽ‡Ï§‡—矯²ßš¢øù—¹@ÐÔ¢hnÑ´´hÊ-ZÍèÝf÷îáéáÔ±™eßmnnÄSµÄe~_l Z¤¶jŠÚª)´USàRæ1oÞγǼ ¬í)ÂÚâZÖJC6(¬•ælPX+Ú p©Ä!q°™e‰3¬m2¬-­µ kKk-ÃÚÒZ˰¶´Âp‰Ç2ó[’WhÃYîxÃYne8Ëq6ÚvŘÎç½rW¢Ò+ºÌˆuR² õbeInq,‰‡†B7„·´î¾Å.Œ¥é1S×±]xpM#Þì:7§…ºdë¹i—8Ñt¦ºÅçêjd¿4V7çÏSžö÷‡éxö {pOôâ‰7]¿?|‘lGg.d Š|΋)A÷ÆÞ¾|þåãiÿí$U^÷_غçeut>Å%D ”u/×4o¾¼%9»TF‰“÷Jü|ŒH T¼ÞläýžÕòÜ×ò*À«¯¼é•_¶ÝìÎ*»p_*¨ˆ "‚ŠêgP:a|=v™.kÉÏÁ…Z*"¨ˆ "‚š•OtÃZdgºÄœ¾VTQUDUÕÔ¨|âø"*†Ïj¥…努"ªŠ¤*’ºš”O·Æ¼ }è+%ÕTCR I=MÊ&ÃÇËJ)÷•²*Ȫ «‘YId%1ýb\¬”Êè"ÿVI‰g%žÕÆ¢$Š’(ôÿîßóC]K•PTBQ %ýàÔ]ÙåŠ*(ª ¨V¬ ˜Öv¹õ¦fåÏÊŸ•?k°’áòƒ¦^Qt¾ÔÿKVØ.Ìp{8JZý{ETôï_f÷Ûþ´|ùºÙý){îg@Õ³Ù}ø~z|xž 0AÓÉXÿœ©ßñÈ/_»ŽM¯à»ýýáñx}½{ÿýéøÉJðq÷íæ†45¸½¹¹.»¯‡ç_« †ÜÅÿŽåâ6 endstream endobj 1305 0 obj << /Type /XRef /Index [0 1306] /Size 1306 /W [1 3 1] /Root 1303 0 R /Info 1304 0 R /ID [ ] /Length 2969 /Filter /FlateDecode >> stream xÚ%ÙI¨$]Z‡ñ8yoYóWó<Ïó\5O·æy¾šèVÐ^HиD— .46б¡A‘@è] ÁM ‚"r@p¡.Ž´"¸IìE{oožŠófVDF<ÿqâ½UUU?UÕ¨JUµtöŸjx8ª¦ûƒj FjÔNÁ´Úcµý†s`®Ú[µ}†ó`¾Ú{µ½† `¡Úµ=†cX4{ø™µj» õuj» —Â2µõj; —à µÍj; ¿•j[Ô¶®‚ÕjûÔ¶®µjûÕ¶®ƒõjÔ¶n€jÕ6n‚Íj‡Ôb_ÞªvLm£ah»ÚqµØUüÈj'ÔÖÆ îV;£?#.Î^µ³jk ãÂîW;¯§Rª}«¶Úðž­u›ÔâôÀQµj+ Áqµ'jqéNÀIµØß ÃSpz4+kŽZ\ö3pVmÚ2Ãsp^m•Z(«á‚Z\ƒ%†á’ZœGè¾ WfkÍVµE†WášÚ.µˆÊu¸¡¶WMšF7á–ÚiµˆÙ ÜV;§&‰£;pWí¢ZDôÜW»£&Å£ðP-æBÄûø¢vO-¾b§Ãìd¿ú³‡œº6öÁ·j~Õ0RÖ1g4Ädw †ù©šþ͸GÄdŸç{w!vïZµ}@Ô° UsqC‰OòÀþ ƒ¼ ‚4HØ zƒLÂ:Hñ ÞƒÜ&Ä`¦ ¦Ð`n &Ý`6fÞ`þæÛ`ÆfÙà1˜[ƒ»Ê`F îCƒy4¸s fÏà^7˜3Ãa0S†£pŽÃ¢Ù“ù~œL˜‰+tÛÐÔNƒ 1œÓ`8Â?\‘. W@¼‡k Ôà 8‘ªñé8PìþfªÿO oP;ÜIÕÒñÁ]x ÷SµìxÔx0§[dmx–ªõ¯âÓçð§B=¼„ˆÀëTíýy|E‡w¾2&ÎðÉM&rð1U'7Å÷$lÉá«O=FfŒ` ¦SõÿÄÝ{nªîþu çÁ|X a ñ4X ñ X ßÀòT=ú·ø¿qÓ_q[ß+Sõdq|ºÆo~j+nÈSõzO|° vÀ¶T}üIÔâþ7ß©ú²2j»À tfOª¾žZÜ‹Ýgޤê—~5÷Ó™[p*U¿r9j§áÔp.Â%¸ Wà*\ƒëpnúáÏl½…™TýÚŸÆNoø ÷à><€‡ðÈÓ]=‡ð^ÁkxïÝêã:¿KÕþ<Žö>B8ÿ _€äÎW:’;’;’»i˜sÚŽÚŽÚŽÚŽÚŽÚnqª~x?öBO·4U¿ýO1n9ðÛqÞy”wLwLwkÀc»[ÖûGtç™ÜmxªÍJþ…±g’;â;ގߎónPÛí×îx¤v‡ ¤G ŸÇ`fçêïŽÝÇóò°ß³ Ýy†N:aè„¡†N:aè„¡†Nº› \ñƒ¡ÝíTýÁÜ8®0tÂÐ C'trÐ=•&ö;â;â;â»7½#ˆ½ ûÍ´˜½HÕÏŧÌ4³wùüŠ@#̓F9hä ‘ƒF9hä ‘ƒF9hV˜5k@9hØoØoØo8j6¤ê_ÿ$. 4rÐÈA#4"Ðì9hä !¾!¾!¾!¾9œ7œ7±ø<–ªÿ¸Ç†ý†ýÆò·a¿©FΛXÛrÞÄŠ–ó&Ö¬L7¤4³OûŸþâÇÂ5Vªœ7±>å¼ Ý± }±ødºaºaºaºa:ÇU#¹!9‡€7©úßcpÞÐÝÐÝ0Ý0Ý0}%3™ÎLg;ËZ6»ó¼”vüW|ÐLh¦"/L)]øÍüf~3¿™ßÌoæ7ó›©ÍÔfV³ år«fw¼9¥ùCì”ÕlŠgj3µ™ÚLm6Å3¿™ßLOÞ—Ò’©ø¿Lg¦3Ó™éÌtf:‹O¦;ÓéÎÔf>òé”VþKì…éÌtf:3/Ó™éÌtf:3…&›Ý™îLh¾“Òæç±?¦3µùAJ[þ9jfw&9“œIÎñ^ArŽë’ãÂtÎñæ¦ã}ÁtÎñ–ÀoŽw’s¼|µÒW€±ðŸ‚i˜sȧ’§4ûh5\ÈÑ}x•Ò™ßÚRXœÒþI —ÀrXßÀJX«a ¬…u°6ÀFØ›a l…m°vÀNØ»aì…}°ÀA8‡á…cpNÀI8§á œ…spj¸á\†+p®Áu¸7áÌÀm¸wá<†‡°,¥ƒ›âú݇'ðžÁsx/ἆ7ðÞÁ{øßÂGøŸá ÈAq "EŠ9(rPä ÈA‘ƒ"e!Œa,¦ ûep^8/œÎ ç…óÂyá¼p^8/œÎ ç…óÂyá¼p^8/œÎ ç…óÂyá¼p^8/œÎ ç…óÂyá¼p^8/œÎ ç…óÂyá¼p^8/œÎ ç…óÂyá¼p^8/œÎ ç…óÂyá¼p^@8”Ò±_wSºó4¶D <‰(ìö û…ýÂ~a¿°_Ø/ìö û…ýÂ~a¿°_Ø/ìöˬý麂#˜õZ·§ž ^õk Z·§6ík­ƒz,†%°–ÁrXßÀJЪWƒ7´Z3¤Ö᫵ôj}ÚM¿Öµªµôj=¼ZC¨ÞÛaì]¡z7ì ¡Z‡¯ÖÒ«õðjM»Z—®> Gà(x¯µ¤j}¸ú$œm–:ìßOéú_ÄÅ™½ó¿ýiliXÕ5\}¤Z¦¾ Wà*\ƒëp¼ØÕ3µ÷éú6è7ÕÚ'µöIí.Zk,Ô)µŽk­ÅZ{¯­åëgð¼½×/ἆ7 [{q¯µ]k½ªZ#¯þÚTõgøì·N«e¿e¿e¿%û-ûm4zØoÙoã¦#ö[ö[ö[ö[ö[ö[ö[ö[ö[ö[öÛx?g¿e¿e¿e¿G>û-û-û-û-û-û-û-û-û-û-û-û-û-û-ÝmØ?›Òóÿ‹³<¦þelÉA+môsD =”Òw¿ŸŠEëš¶ÑK“V6ZíÅV¶Õ”m£#'­D´Rúå󱃋)ýh]l]Jé¿+¶.§Ñ†=±u%­«iôC±5ûþÁþغžFýÏbëFšZ1[Ñà·å·ÆÌû4õñ|ÚGÚùöN«wZ}4¡£ãmf§Ð;…>:¤Ñf޾r4G£ ëz¡î£9*Ô½P÷BÝ u/Ô½P÷BÝûU½+Ô u/Ô}4Q…ºê^¨ûh8G'5þŒ7ˆ†³P÷BÝ u/Ô½P÷BÝÐ;é>þªà¤ûø[B4`£;-Ô}ô^…ºê^¨'Ušú^L؉dO${"ÙÉžHöD²'’=‘ì‰dO${"ÙÉžHöD²'’=‘ì‰dO${"ÙÉžHöD²'’=‘ì‰dO${"ÙÉžHöD²'[ÒÔ¯^ý‘ß_]ý?V¥H endstream endobj startxref 226070 %%EOF fabio-0.1.3/doc/html/0000755000175000017500000000000012233272206015067 5ustar jeromejerome00000000000000fabio-0.1.3/doc/html/api/0000755000175000017500000000000012233272207015641 5ustar jeromejerome00000000000000fabio-0.1.3/doc/html/api/fabio.html0000644000175000017500000001062412121354612017607 0ustar jeromejerome00000000000000 FabIO Package — FabIO v0.1.2 documentation

FabIO Package¶

fabio Package¶

Table Of Contents

Previous topic

fabio

This Page

fabio-0.1.3/doc/html/api/modules.html0000644000175000017500000057234412233250022020205 0ustar jeromejerome00000000000000 FabIO Package — FabIO 0.1.3 documentation

FabIO Package¶

fabio Package¶

FabIO module

fabio.fabioimage Module¶

Authors: Henning O. Sorensen & Erik Knudsen

Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk

and Jon Wright, Jerome Kieffer: ESRF

class fabio.fabioimage.fabioimage(data=None, header=None)[source]¶

Bases: object

A common object for images in fable Contains a numpy array (.data) and dict of meta data (.header)

add(other)[source]¶

Add another Image - warning, does not clip to 16 bit images by default

static checkData(data=None)[source]¶

Empty for fabioimage but may be populated by others classes, especially for format accepting only integers

static checkHeader(header=None)[source]¶

Empty for fabioimage but may be populated by others classes

classname¶

Retrieves the name of the class :return: the name of the class

convert(dest)[source]¶

Convert a fabioimage object into another fabioimage object (with possible conversions) :param dest: destination type “EDF”, “edfimage” or the class itself

getclassname()[source]¶

Retrieves the name of the class :return: the name of the class

getframe(num)[source]¶

returns the file numbered ‘num’ in the series as a fabioimage

getheader()[source]¶

returns self.header

getmax()[source]¶

Find max value in self.data, caching for the future

getmean()[source]¶

return the mean

getmin()[source]¶

Find min value in self.data, caching for the future

getstddev()[source]¶

return the standard deviation

integrate_area(coords)[source]¶

Sums up a region of interest if len(coords) == 4 -> convert coords to slices if len(coords) == 2 -> use as slices floor -> ? removed as unused in the function.

load(*arg, **kwarg)[source]¶

Wrapper for read

make_slice(coords)[source]¶

Convert a len(4) set of coords into a len(2) tuple (pair) of slice objects the latter are immutable, meaning the roi can be cached

next()[source]¶

returns the next file in the series as a fabioimage

previous()[source]¶

returns the previous file in the series as a fabioimage

read(filename, frame=None)[source]¶

To be overridden - fill in self.header and self.data

readROI(filename, frame=None, coords=None)[source]¶

Method reading Region of Interest. This implementation is the trivial one, just doing read and crop

readheader(filename)[source]¶

Call the _readheader function...

rebin(x_rebin_fact, y_rebin_fact, keep_I=True)[source]¶

Rebin the data and adjust dims :param x_rebin_fact: x binning factor :param y_rebin_fact: y binning factor :param keep_I: shall the signal increase ? :type x_rebin_fact: int :type y_rebin_fact: int :type keep_I: boolean

resetvals()[source]¶

Reset cache - call on changing data

save(fname)[source]¶

wrapper for write

toPIL16(filename=None)[source]¶

Convert to Python Imaging Library 16 bit greyscale image

FIXME - this should be handled by the libraries now

update_header(**kwds)[source]¶

update the header entries by default pass in a dict of key, values.

write(fname)[source]¶

To be overwritten - write the file

fabio.fabioimage.test()[source]¶

check some basic fabioimage functionality

fabio.fabioutils Module¶

General purpose utilities functions for fabio

class fabio.fabioutils.BZ2File(name, mode='r', buffering=0, compresslevel=9)[source]¶

Bases: bz2.BZ2File

Wrapper with lock

getSize()[source]¶
setSize(value)[source]¶
size¶
class fabio.fabioutils.File(name, mode='rb', buffering=0)[source]¶

Bases: file

wrapper for “file” with locking

getSize()[source]¶
setSize(size)[source]¶
size¶
class fabio.fabioutils.FilenameObject(stem=None, num=None, directory=None, format=None, extension=None, postnum=None, digits=4, filename=None)[source]¶

Bases: object

The ‘meaning’ of a filename ...

deconstruct_filename(filename)[source]¶

Break up a filename to get image type and number

str()[source]¶

Return a string representation

tostring()[source]¶

convert yourself to a string

class fabio.fabioutils.GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None)[source]¶

Bases: gzip.GzipFile

Just a wrapper forgzip.GzipFile providing the correct seek capabilities for python 2.5

class fabio.fabioutils.StringIO(data, fname=None, mode='r')[source]¶

Bases: StringIO.StringIO

just an interface providing the name and mode property to a StringIO

BugFix for MacOSX mainly

getSize()[source]¶
setSize(size)[source]¶
size¶
class fabio.fabioutils.UnknownCompressedFile(name, mode='rb', buffering=0)[source]¶

Bases: fabio.fabioutils.File

wrapper for “File” with locking

fabio.fabioutils.construct_filename(filename, frame=None)[source]¶

Try to construct the filename for a given frame

fabio.fabioutils.deconstruct_filename(filename)[source]¶

Function for backward compatibility. Deprecated

fabio.fabioutils.deprecated(func)[source]¶

used to deprecate a function/method: prints a lot of warning messages to enforce the modifaction of the code

fabio.fabioutils.extract_filenumber(name)[source]¶

extract file number

fabio.fabioutils.getnum(name)[source]¶

# try to figure out a file number # guess it starts at the back

fabio.fabioutils.isAscii(name, listExcluded=None)[source]¶
Parameters:
  • name – string to check
  • listExcluded – list of char or string excluded.
Returns:

True of False whether name is pure ascii or not

fabio.fabioutils.jump_filename(name, num, padding=True)[source]¶

jump to number

fabio.fabioutils.next_filename(name, padding=True)[source]¶

increment number

fabio.fabioutils.nice_int(s)[source]¶

Workaround that int(‘1.0’) raises an exception

Parameters:s – string to be converted to integer
fabio.fabioutils.numstem(name)[source]¶

cant see how to do without reversing strings Match 1 or more digits going backwards from the end of the string

fabio.fabioutils.pad(mystr, pattern=' ', size=80)[source]¶

Performs the padding of the string to the right size with the right pattern

fabio.fabioutils.previous_filename(name, padding=True)[source]¶

decrement number

fabio.fabioutils.toAscii(name, excluded=None)[source]¶
Parameters:
  • name – string to check
  • excluded – tuple of char or string excluded (not list: they are mutable).
Returns:

the name with all non valid char removed

fabio.file_series Module¶

Authors:¶

  • Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk
  • Jon Wright, ESRF
class fabio.file_series.file_series(list_of_strings)[source]¶

Bases: list

Represents a series of files to iterate has an idea of a current position to do next and prev

You also get from the list python superclass:
append count extend insert pop remove reverse sort
current()[source]¶

Current position in a sequence

current_image()[source]¶

Current image in sequence

Returns:fabioimage
current_object()[source]¶

Current image in sequence

Returns:file_object
first()[source]¶

First image in series

first_image()[source]¶

First image in a sequence

Returns:fabioimage
first_object()[source]¶

First image in a sequence

Returns:file_object
jump(num)[source]¶

Goto a position in sequence

jump_image(num)[source]¶

Jump to and read image

Returns:fabioimage
jump_object(num)[source]¶

Jump to and read image

Returns:file_object
last()[source]¶

Last in series

last_image()[source]¶

Last image in a sequence

Returns:fabioimage
last_object()[source]¶

Last image in a sequence

Returns:file_object
len()[source]¶

Number of files

next()[source]¶

Next in a sequence

next_image()[source]¶

Return the next image

Returns:fabioimage
next_object()[source]¶

Return the next image

Returns:file_object
previous()[source]¶

Prev in a sequence

previous_image()[source]¶

Return the previous image

Returns:fabioimage
previous_object()[source]¶

Return the previous image

Returns:file_object
class fabio.file_series.filename_series(filename)[source]¶

Much like the others, but created from a string filename

current()[source]¶

return current filename string

current_image()[source]¶

returns the current image as a fabioimage

current_object()[source]¶

returns the current filename as a fabio.FilenameObject

jump(num)[source]¶

jump to a specific number

jump_image(num)[source]¶

returns the image number as a fabioimage

jump_object(num)[source]¶

returns the filename num as a fabio.FilenameObject

next()[source]¶

increment number

next_image()[source]¶

returns the next image as a fabioimage

next_object()[source]¶

returns the next filename as a fabio.FilenameObject

prev_image()[source]¶

returns the previos image as a fabioimage

previous()[source]¶

decrement number

previous_object()[source]¶

returns the previous filename as a fabio.FilenameObject

fabio.file_series.new_file_series(first_object, nimages=0, step=1, traceback=False)[source]¶

A generator function that creates a file series starting from a a fabioimage. Iterates through all images in a file (if more than 1), then proceeds to the next file as determined by fabio.next_filename.

Parameters:
  • first_object – the starting fabioimage, which will be the first one yielded in the sequence
  • nimages – the maximum number of images to consider step: step size, will yield the first and every step’th image until nimages is reached. (e.g. nimages = 5, step = 2 will yield 3 images (0, 2, 4)
  • traceback – if True causes it to print a traceback in the event of an exception (missing image, etc.). Otherwise the calling routine can handle the exception as it chooses
  • yields – the next fabioimage in the series. In the event there is an exception, it yields the sys.exec_info for the exception instead. sys.exec_info is a tuple: ( exceptionType, exceptionValue, exceptionTraceback ) from which all the exception information can be obtained.

Suggested usage:

for obj in new_file_series( ... ):
  if not isinstance(obj, fabio.fabioimage.fabioimage ):
    # deal with errors like missing images, non readable files, etc
    # e.g.
    traceback.print_exception(obj[0], obj[1], obj[2])
fabio.file_series.new_file_series0(first_object, first=None, last=None, step=1)[source]¶

Created from a fabio image first and last are file numbers

class fabio.file_series.numbered_file_series(stem, first, last, extension, digits=4, padding='Y', step=1)[source]¶

Bases: fabio.file_series.file_series

mydata0001.edf = “mydata” + 0001 + ”.edf” mydata0002.edf = “mydata” + 0002 + ”.edf” mydata0003.edf = “mydata” + 0003 + ”.edf”

fabio.openimage Module¶

Authors: Henning O. Sorensen & Erik Knudsen
Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:henning.sorensen@risoe.dk

mods for fabio by JPW

fabio.openimage.do_magic(byts)[source]¶

Try to interpret the bytes starting the file as a magic number

fabio.openimage.openheader(filename)[source]¶

return only the header

fabio.openimage.openimage(filename, frame=None)[source]¶

Try to open an image

fabio.adscimage Module¶

Authors: Henning O. Sorensen & Erik Knudsen
Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk
  • mods for fabio by JPW
class fabio.adscimage.adscimage(*args, **kwargs)[source]¶

Bases: fabio.fabioimage.fabioimage

Read an image in ADSC format (quite similar to edf?)

read(fname, frame=None)[source]¶

read in the file

write(fname)[source]¶

Write adsc format

fabio.adscimage.test()[source]¶

testcase

fabio.binaryimage Module¶

Authors: Gael Goret, Jerome Kieffer, ESRF, France Emails: gael.goret@esrf.fr, jerome.kieffer@esrf.fr

Brian Richard Pauw <brian@stack.nl>

Binary files images are simple none-compressed 2D images only defined by their : data-type, dimensions, byte order and offset

This simple library has been made for manipulating exotic/unknown files format.

class fabio.binaryimage.binaryimage(*args, **kwargs)[source]¶

Bases: fabio.fabioimage.fabioimage

This simple library has been made for manipulating exotic/unknown files format.

Binary files images are simple none-compressed 2D images only defined by their : data-type, dimensions, byte order and offset

if offset is set to a negative value, the image is read using the last data but n data in the file, skipping any header.

estimate_offset_value(fname, dim1, dim2, bytecode='int32')[source]¶

Estimates the size of a file

read(fname, dim1, dim2, offset=0, bytecode='int32', endian='<')[source]¶

Read a binary image

Parameters:
  • fname (string) – file name
  • dim1 – image dimensions (Fast index)
  • dim2 – image dimensions (Slow index)
  • offset – starting position of the data-block. If negative, starts at the end.
  • bytecode – can be “int8”,”int16”,”int32”,”int64”,”uint8”,”uint16”,”uint32”,”uint64”,”float32”,”float64”,...
  • endian – among short or long endian (“<” or “>”)
static swap_needed(endian)[source]¶

Decide if we need to byteswap

write(fname)[source]¶

fabio.bruker100image Module¶

class fabio.bruker100image.bruker100image(data=None, header=None)[source]¶

Bases: fabio.brukerimage.brukerimage

read(fname, frame=None)[source]¶
toPIL16(filename=None)[source]¶

fabio.brukerimage Module¶

Authors: Henning O. Sorensen & Erik Knudsen
Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk
Based on: openbruker,readbruker, readbrukerheader functions in the opendata
module of ImageD11 written by Jon Wright, ESRF, Grenoble, France

Writer by Jérôme Kieffer, ESRF, Grenoble, France

class fabio.brukerimage.brukerimage(data=None, header=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read and eventually write ID11 bruker (eg smart6500) images

TODO: int32 -> float32 conversion according to the “linear” keyword. This is done and works but we need to check with other program that we are appliing the right formula and not the reciprocal one.

HEADERS_KEYS = ['FORMAT', 'VERSION', 'HDRBLKS', 'TYPE', 'SITE', 'MODEL', 'USER', 'SAMPLE', 'SETNAME', 'RUN', 'SAMPNUM', 'TITLE', 'NCOUNTS', 'NOVERFL', 'MINIMUM', 'MAXIMUM', 'NONTIME', 'NLATE', 'FILENAM', 'CREATED', 'CUMULAT', 'ELAPSDR', 'ELAPSDA', 'OSCILLA', 'NSTEPS', 'RANGE', 'START', 'INCREME', 'NUMBER', 'NFRAMES', 'ANGLES', 'NOVER64', 'NPIXELB', 'NROWS', 'NCOLS', 'WORDORD', 'LONGORD', 'TARGET', 'SOURCEK', 'SOURCEM', 'FILTER', 'CELL', 'MATRIX', 'LOWTEMP', 'TEMP', 'HITEMP', 'ZOOM', 'CENTER', 'DISTANC', 'TRAILER', 'COMPRES', 'LINEAR', 'PHD', 'PREAMP', 'CORRECT', 'WARPFIL', 'WAVELEN', 'MAXXY', 'AXIS', 'ENDING', 'DETPAR', 'LUT', 'DISPLIM', 'PROGRAM', 'ROTATE', 'BITMASK', 'OCTMASK', 'ESDCELL', 'DETTYPE', 'NEXP', 'CCDPARM', 'BIS', 'CHEM', 'MORPH', 'CCOLOR', 'CSIZE', 'DNSMET', 'DARK', 'AUTORNG', 'ZEROADJ', 'XTRANS', 'HKL&XY', 'AXES2', 'ENDING2', 'FILTER2', 'LEPTOS', 'CFR']¶
SPACER = '\x1a\x04'¶
basic_translate(fname=None)[source]¶

Does some basic population of the headers so that the writing is possible

bpp_to_numpy = {1: <type 'numpy.uint8'>, 2: <type 'numpy.uint16'>, 4: <type 'numpy.uint32'>}¶
calc_bpp(data=None, max_entry=4096)[source]¶

Calculate the number of byte per pixel to get an optimal overflow table.

Returns:byte per pixel
gen_header()[source]¶

Generate headers (with some magic and guesses) :param format can be 86 or 100

gen_overflow()[source]¶

Generate an overflow table

read(fname, frame=None)[source]¶

Read in and unpack the pixels (including overflow table

write(fname)[source]¶

Write a bruker image

fabio.brukerimage.test()[source]¶

a testcase

fabio.cbfimage Module¶

Authors: Jérôme Kieffer, ESRF
email:jerome.kieffer@esrf.fr

Cif Binary Files images are 2D images written by the Pilatus detector and others. They use a modified (simplified) byte-offset algorithm.

CIF is a library for manipulating Crystallographic information files and tries to conform to the specification of the IUCR

class fabio.cbfimage.CIF(_strFilename=None)[source]¶

Bases: dict

This is the CIF class, it represents the CIF dictionary; and as a a python dictionary thus inherits from the dict built in class.

BINARY_MARKER = '--CIF-BINARY-FORMAT-SECTION--'¶
BLANK = [' ', '\t', '\r', '\n', '\r\n', '\n\r']¶
EOL = ['\r', '\n', '\r\n', '\n\r']¶
static LoopHasKey(loop, key)[source]¶

Returns True if the key (string) exist in the array called loop

START_COMMENT = ['"', "'"]¶
exists(sKey)[source]¶

Check if the key exists in the CIF and is non empty. :param sKey: CIF key :type sKey: string :param cif: CIF dictionary :return: True if the key exists in the CIF dictionary and is non empty :rtype: boolean

existsInLoop(sKey)[source]¶

Check if the key exists in the CIF dictionary. :param sKey: CIF key :type sKey: string :param cif: CIF dictionary :return: True if the key exists in the CIF dictionary and is non empty :rtype: boolean

static isAscii(_strIn)[source]¶

Check if all characters in a string are ascii,

Parameters:_strIn (python string) – input string
Returns:boolean
Return type:boolean
loadCHIPLOT(_strFilename)[source]¶

Load the powder diffraction CHIPLOT file and returns the pd_CIF dictionary in the object

Parameters:_strFilename (string) – the name of the file to open
Returns:the CIF object corresponding to the powder diffraction
Return type:dictionary
loadCIF(_strFilename, _bKeepComment=False)[source]¶

Load the CIF file and populates the CIF dictionary into the object :param _strFilename: the name of the file to open :type _strFilename: string :param _strFilename: the name of the file to open :type _strFilename: string :return: None

pop(key)[source]¶
popitem(key)[source]¶
readCIF(_strFilename, _bKeepComment=False)¶

Load the CIF file and populates the CIF dictionary into the object :param _strFilename: the name of the file to open :type _strFilename: string :param _strFilename: the name of the file to open :type _strFilename: string :return: None

saveCIF(_strFilename='test.cif', linesep='n', binary=False)[source]¶

Transforms the CIF object in string then write it into the given file :param _strFilename: the of the file to be written :param linesep: line separation used (to force compatibility with windows/unix) :param binary: Shall we write the data as binary (True only for imageCIF/CBF) :type param: string

tostring(_strFilename=None, linesep='n')[source]¶

Converts a cif dictionnary to a string according to the CIF syntax

Parameters:_strFilename (string) – the name of the filename to be appended in the header of the CIF file
Returns:a sting that corresponds to the content of the CIF - file.
class fabio.cbfimage.cbfimage(data=None, header=None, fname=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read the Cif Binary File data format

static checkData(data=None)[source]¶
read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

write(fname)[source]¶

write the file in CBF format :param fname: name of the file :type: string

fabio.dm3image Module¶

Authors: Henning O. Sorensen & Erik Knudsen
Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk
  • Jon Wright, ESRF
class fabio.dm3image.dm3image(*args, **kwargs)[source]¶

Bases: fabio.fabioimage.fabioimage

Read and try to write the dm3 data format

read(fname, frame=None)[source]¶
read_data()[source]¶
read_tag_entry()[source]¶
read_tag_group()[source]¶
read_tag_type()[source]¶
readbytes(bytes_to_read, format, swap=True)[source]¶

fabio.edfimage Module¶

License: GPLv2+

Authors:¶

  • Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk
  • Jon Wright & Jérôme Kieffer: European Synchrotron Radiation Facility; Grenoble (France)
class fabio.edfimage.Frame(data=None, header=None, header_keys=None, number=None)[source]¶

Bases: object

A class representing a single frame in an EDF file

bytecode¶
data¶

Unpack a binary blob according to the specification given in the header

Returns:dataset as numpy.ndarray
getByteCode()[source]¶
getData()[source]¶

Unpack a binary blob according to the specification given in the header

Returns:dataset as numpy.ndarray
getEdfBlock(force_type=None, fit2dMode=False)[source]¶
Parameters:
  • force_type (string or numpy.dtype) – type of the dataset to be enforced like “float64” or “uint16”
  • fit2dMode (boolean) – enforce compatibility with fit2d and starts countimg number of images at 1
Returns:

ascii header block

Return type:

python string with the concatenation of the ascii header and the binary data block

parseheader(block)[source]¶

Parse the header in some EDF format from an already open file

Parameters:block (string, should be full ascii) – string representing the header block
Returns:size of the binary blob
setByteCode(_iVal)[source]¶
setData(npa=None)[source]¶

Setter for data in edf frame

swap_needed()[source]¶

Decide if we need to byteswap

class fabio.edfimage.edfimage(data=None, header=None, header_keys=None, frames=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read and try to write the ESRF edf data format

appendFrame(frame=None, data=None, header=None)[source]¶

Method used add a frame to an EDF file :param frame: frame to append to edf image :type frame: instance of Frame :return: None

bpp¶
bytecode¶
capsHeader¶

property: capsHeader of EDF file, i.e. the keys of the header in UPPER case.

static checkHeader(header=None)[source]¶

Empty for fabioimage but may be populated by others classes

data¶

property: data of EDF file

delCapsHeader()[source]¶

deleter for edf capsHeader

delData()[source]¶

deleter for edf Data

delHeader()[source]¶

Deleter for edf header

delHeaderKeys()[source]¶

Deleter for edf header_keys

deleteFrame(frameNb=None)[source]¶

Method used to remove a frame from an EDF image. by default the last one is removed. :param frameNb: frame number to remove, by default the last. :type frameNb: integer :return: None

dim1¶
dim2¶
dims¶
fastReadData(filename=None)[source]¶

This is a special method that will read and return the data from another file ... The aim is performances, ... but only supports uncompressed files.

Returns:data from another file using positions from current edfimage
fastReadROI(filename, coords=None)[source]¶

Method reading Region of Interest of another file based on metadata available in current edfimage. The aim is performances, ... but only supports uncompressed files.

Returns:ROI-data from another file using positions from current edfimage
Return type:numpy 2darray
getBpp()[source]¶
getByteCode()[source]¶
getCapsHeader()[source]¶

getter for edf headers keys in upper case :return: data for current frame :rtype: dict

getData()[source]¶

getter for edf Data :return: data for current frame :rtype: numpy.ndarray

getDim1()[source]¶
getDim2()[source]¶
getDims()[source]¶
getHeader()[source]¶

Getter for the headers. used by the property header,

getHeaderKeys()[source]¶

Getter for edf header_keys

getNbFrames()[source]¶

Getter for number of frames

getframe(num)[source]¶

returns the file numbered ‘num’ in the series as a fabioimage

header¶

property: header of EDF file

header_keys¶

property: header_keys of EDF file

next()[source]¶

returns the next file in the series as a fabioimage

nframes¶

Getter for number of frames

previous()[source]¶

returns the previous file in the series as a fabioimage

read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

setBpp(_iVal)[source]¶
setByteCode(_iVal)[source]¶
setCapsHeader(_data)[source]¶

Enforces the propagation of the header_keys to the list of frames :param _data: numpy array representing data

setData(_data)[source]¶

Enforces the propagation of the data to the list of frames :param _data: numpy array representing data

setDim1(_iVal)[source]¶
setDim2(_iVal)[source]¶
setHeader(_dictHeader)[source]¶

Enforces the propagation of the header to the list of frames

setHeaderKeys(_listtHeader)[source]¶

Enforces the propagation of the header_keys to the list of frames :param _listtHeader: list of the (ordered) keys in the header :type _listtHeader: python list

setNbFrames(val)[source]¶

Setter for number of frames ... should do nothing. Here just to avoid bugs

swap_needed()[source]¶

Decide if we need to byteswap

unpack()[source]¶

Unpack a binary blob according to the specification given in the header and return the dataset

Returns:dataset as numpy.ndarray
write(fname, force_type=None, fit2dMode=False)[source]¶

Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats)

Parameters:force_type – can be numpy.uint16 or simply “float”
Returns:None

fabio.fit2dmaskimage Module¶

Author: Andy Hammersley, ESRF Translation into python/fabio: Jon Wright, ESRF

class fabio.fit2dmaskimage.fit2dmaskimage(data=None, header=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read and try to write Andy Hammersley’s mask format

static checkData(data=None)[source]¶
read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

write(fname)[source]¶

Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats)

fabio.fit2dspreadsheetimage Module¶

Read the fit2d ascii image output
  • Jon Wright, ESRF
class fabio.fit2dspreadsheetimage.fit2dspreadsheetimage(data=None, header=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read a fit2d ascii format

read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

fabio.GEimage Module¶

class fabio.GEimage.GEimage(data=None, header=None)[source]¶

Bases: fabio.fabioimage.fabioimage

getframe(num)[source]¶

Returns a frame as a new fabioimage object

next()[source]¶

Get the next image in a series as a fabio image

previous()[source]¶

Get the previous image in a series as a fabio image

read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

write(fname, force_type=<type 'numpy.uint16'>)[source]¶

Not yet implemented

fabio.GEimage.demo()[source]¶

fabio.HiPiCimage Module¶

Authors: Henning O. Sorensen & Erik Knudsen
Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk
  • Jon Wright, ESRF

Information about the file format from Masakatzu Kobayashi is highly appreciated

class fabio.HiPiCimage.HiPiCimage(data=None, header=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read HiPic images e.g. collected with a Hamamatsu CCD camera

read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

fabio.kcdimage Module¶

Authors: Jerome Kieffer, ESRF
email:jerome.kieffer@esrf.fr

kcd images are 2D images written by the old KappaCCD diffractometer built by Nonius in the 1990’s Based on the edfimage.py parser.

class fabio.kcdimage.kcdimage(data=None, header=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read the Nonius kcd data format

static checkData(data=None)[source]¶
read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

fabio.mar345image Module¶

Authors:¶

  • Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk
  • Jon Wright, Jérôme Kieffer & Gaël Goret: European Synchrotron Radiation Facility; Grenoble (France)
class fabio.mar345image.mar345image(*args, **kwargs)[source]¶

Bases: fabio.fabioimage.fabioimage

static checkData(data=None)[source]¶
nb_overflow_pixels()[source]¶
read(fname, frame=None)[source]¶

Read a mar345 image

write(fname)[source]¶

Try to write mar345 file. This is still in beta version. It uses CCP4 (LGPL) PCK1 algo from JPA

fabio.marccdimage Module¶

Authors:¶

  • Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk
  • Jon Wright: European Synchrotron Radiation Facility; Grenoble (France)

marccdimage can read MarCCD and MarMosaic images including header info.

JPW : Use a parser in case of typos (sorry?)

fabio.marccdimage.interpret_header(header, fmt, names)[source]¶

given a format and header interpret it

fabio.marccdimage.make_format(c_def_string)[source]¶

Reads the header definition in c and makes the format string to pass to struct.unpack

class fabio.marccdimage.marccdimage(*args, **kwds)[source]¶

Bases: fabio.tifimage.tifimage

Read in data in mar ccd format, also MarMosaic images, including header info

fabio.OXDimage Module¶

Reads Oxford Diffraction Sapphire 3 images

Authors:¶

  • Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk
  • Jon Wright, Jérôme Kieffer & Gaël Goret: European Synchrotron Radiation Facility; Grenoble (France)
class fabio.OXDimage.OXDimage(data=None, header=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Oxford Diffraction Sapphire 3 images reader/writer class

static checkData(data=None)[source]¶
getCompressionRatio()[source]¶

calculate the compression factor obtained vs raw data

read(fname, frame=None)[source]¶

Read in header into self.header and the data into self.data

write(fname)[source]¶

Write Oxford diffraction images: this is still beta :param fname: output filename

class fabio.OXDimage.Section(size, dictHeader)[source]¶

Bases: object

Small helper class for writing binary headers

getSize(dtype)[source]¶
setData(key, offset, dtype, default=None)[source]¶
Parameters:
  • offset – int, starting position in the section
  • key – name of the header key
  • dtype – type of the data to insert (defines the size!)

fabio.pilatusimage Module¶

Authors:¶

  • Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk
  • Jon Wright: European Synchrotron Radiation Facility; Grenoble (France)
class fabio.pilatusimage.pilatusimage(*args, **kwds)[source]¶

Bases: fabio.tifimage.tifimage

Read in Pilatus format, also pilatus images, including header info

fabio.pnmimage Module¶

Authors: Henning O. Sorensen & Erik Knudsen
Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:henning.sorensen@risoe.dk
class fabio.pnmimage.pnmimage(*arg, **kwargs)[source]¶

Bases: fabio.fabioimage.fabioimage

static P1dec(buf, bytecode)[source]¶
static P2dec(buf, bytecode)[source]¶
static P3dec(buf, bytecode)[source]¶
static P4dec(buf, bytecode)[source]¶
static P5dec(buf, bytecode)[source]¶
static P6dec(buf, bytecode)[source]¶
static P7dec(buf, bytecode)[source]¶
static checkData(data=None)[source]¶
read(fname, frame=None)[source]¶

try to read PNM images :param fname: name of the file :param frame: not relevant here! PNM is always single framed

write(filename)[source]¶

fabio.tifimage Module¶

FabIO class for dealing with TIFF images. In facts wraps TiffIO from V. Armando Solé (available in PyMca) or falls back to PIL

Authors:¶

  • Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk
  • Jérôme Kieffer: European Synchrotron Radiation Facility; Grenoble (France)

License: GPLv3+

class fabio.tifimage.Image_File_Directory(instring=None, offset=-1)[source]¶

Bases: object

unpack(instring, offset=-1)[source]¶
class fabio.tifimage.Image_File_Directory_entry(tag=0, tag_type=0, count=0, offset=0)[source]¶

Bases: object

extract_data(full_string)[source]¶
unpack(strInput)[source]¶
class fabio.tifimage.Tiff_header(string)[source]¶

Bases: object

class fabio.tifimage.tifimage(*args, **kwds)[source]¶

Bases: fabio.fabioimage.fabioimage

Images in TIF format Wraps TiffIO

read(fname, frame=None)[source]¶

Wrapper for TiffIO.

write(fname)[source]¶

Overrides the fabioimage.write method and provides a simple TIFF image writer. :param fname: name of the file to save the image to @tag_type fname: string or unicode (file?)...

fabio.xsdimage Module¶

Authors: Jérôme Kieffer, ESRF
email:jerome.kieffer@esrf.fr

XSDimge are XML files containing numpy arrays

class fabio.xsdimage.xsdimage(data=None, header=None, fname=None)[source]¶

Bases: fabio.fabioimage.fabioimage

Read the XSDataImage XML File data format

read(fname, frame=None)[source]¶

fabio.compression Module¶

Authors: Jérôme Kieffer, ESRF
email:jerome.kieffer@esrf.fr

FabIO library containing compression and decompression algorithm for various

fabio.compression.compByteOffet_numpy(data)[source]¶

Compress a dataset into a string using the byte_offet algorithm

Parameters:data – ndarray
Returns:string/bytes with compressed data

test = numpy.array([0,1,2,127,0,1,2,128,0,1,2,32767,0,1,2,32768,0,1,2,2147483647,0,1,2,2147483648,0,1,2,128,129,130,32767,32768,128,129,130,32768,2147483647,2147483648])

fabio.compression.compPCK(data)[source]¶

Modified CCP4 pck compressor used in MAR345 images

Parameters:data – numpy.ndarray (square array)
Returns:compressed stream
fabio.compression.compTY1(data)[source]¶

Modified byte offset compressor used in Oxford Diffraction images

Parameters:data – numpy.ndarray with the input data (integers!)
Returns:3-tuple of strings: raw_8,raw_16,raw_32 containing raw data with integer of the given size
fabio.compression.decByteOffet_cython(stream, size=None)[source]¶
Analyze a stream of char with any length of exception:
2, 4, or 8 bytes integers
Parameters:
  • stream – string representing the compressed data
  • size – the size of the output array (of longInts)
Returns:

1D-ndarray

fabio.compression.decByteOffet_numpy(stream, size=None)[source]¶
Analyze a stream of char with any length of exception:
2, 4, or 8 bytes integers
Parameters:
  • stream – string representing the compressed data
  • size – the size of the output array (of longInts)
Returns:

1D-ndarray

fabio.compression.decByteOffet_python(stream, size)[source]¶

Analyze a stream of char with any length of exception (2,4, or 8 bytes integers)

Parameters:
  • stream – string representing the compressed data
  • size – the size of the output array (of longInts)
Returns:

1D-ndarray

fabio.compression.decByteOffet_weave(stream, size)[source]¶

Analyze a stream of char with any length of exception (2,4, or 8 bytes integers)

Parameters:
  • stream – string representing the compressed data
  • size – the size of the output array (of longInts)
Returns:

1D-ndarray

fabio.compression.decBzip2(stream)[source]¶

Decompress a chunk of data using the bzip2 algorithm from Python

fabio.compression.decGzip(stream)[source]¶

Decompress a chunk of data using the gzip algorithm from Python or alternatives if possible

fabio.compression.decKM4CCD(raw_8, raw_16=None, raw_32=None)¶

Modified byte offset decompressor used in Oxford Diffraction images

Parameters:
  • raw_8 – strings containing raw data with integer 8 bits
  • raw_16 – strings containing raw data with integer 16 bits
  • raw_32 – strings containing raw data with integer 32 bits
Returns:

numpy.ndarray

fabio.compression.decPCK(stream, dim1=None, dim2=None, overflowPix=None, version=None)[source]¶

Modified CCP4 pck decompressor used in MAR345 images

Parameters:stream – string or file
Returns:numpy.ndarray (square array)
fabio.compression.decTY1(raw_8, raw_16=None, raw_32=None)[source]¶

Modified byte offset decompressor used in Oxford Diffraction images

Parameters:
  • raw_8 – strings containing raw data with integer 8 bits
  • raw_16 – strings containing raw data with integer 16 bits
  • raw_32 – strings containing raw data with integer 32 bits
Returns:

numpy.ndarray

fabio.compression.decZlib(stream)[source]¶

Decompress a chunk of data using the zlib algorithm from Python

fabio.compression.endianness()[source]¶

Return the native endianness of the system

fabio.compression.md5sum(blob)[source]¶

returns the md5sum of an object...

fabio.converters Module¶

Converter module. This is for the moment empty (populated only with almost pass through anonymous functions) but aims to be populated with more sofisticated translators ...

fabio.converters.convert_data(inp, outp, data)[source]¶

Return data converted to the output format ... over-simplistic implementation for the moment ... :param inp,outp: input/output format like “cbfimage” :param data(ndarray): the actual dataset to be transformed

fabio.converters.convert_data_integer(data)[source]¶

convert data to integer

fabio.converters.convert_header(inp, outp, header)[source]¶

return header converted to the output format :param inp,outp: input/output format like “cbfimage” :param header(dict):the actual set of headers to be transformed

fabio.datIO Module¶

Authors: Henning O. Sorensen & Erik Knudsen

Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk

and Jon Wright, ESRF

class fabio.datIO.columnfile(data=None, clabels=None, rlabels=None, fname=None)[source]¶

Bases: fabio.datIO.fabiodata

Concrete fabiodata class

read(fname, frame=None)[source]¶
class fabio.datIO.fabiodata(data=None, clabels=None, rlabels=None, fname=None)[source]¶

Bases: object

A common class for dataIO in fable Contains a 2d numpy array for keeping data, and two lists (clabels and rlabels) containing labels for columns and rows respectively

read(fname=None, frame=None)[source]¶

To be overridden by format specific subclasses

fabio.TiffIO Module¶

class fabio.TiffIO.TiffIO(filename, mode=None, cache_length=20, mono_output=False)[source]¶

Bases: object

getData(nImage, **kw)[source]¶
getImage(nImage)[source]¶
getImageFileDirectories(fd=None)[source]¶
getInfo(nImage, **kw)[source]¶
getNumberOfImages()[source]¶
writeImage(image0, info=None, software=None, date=None)[source]¶

fabio.readbytestream Module¶

Reads a bytestream

Authors: Jon Wright Henning O. Sorensen & Erik Knudsen
ESRF Risoe National Laboratory
fabio.readbytestream.readbytestream(fil, offset, x, y, nbytespp, datatype='int', signed='n', swap='n', typeout=<type 'numpy.uint16'>)[source]¶

Reads in a bytestream from a file (which may be a string indicating a filename, or an already opened file (should be “rb”)) offset is the position (in bytes) where the pixel data start nbytespp = number of bytes per pixel type can be int or float (4 bytes pp) or double (8 bytes pp) signed: normally signed data ‘y’, but ‘n’ to try to get back the right numbers when unsigned data are converted to signed (python once had no unsigned numeric types.) swap, normally do not bother, but ‘y’ to swap bytes typeout is the numpy type to output, normally uint16, but more if overflows occurred x and y are the pixel dimensions

TODO : Read in regions of interest

PLEASE LEAVE THE STRANGE INTERFACE ALONE - IT IS USEFUL FOR THE BRUKER FORMAT

fabio-0.1.3/doc/html/index.html0000644000175000017500000003067512233250022017067 0ustar jeromejerome00000000000000 Welcome to FabIO’s documentation! — FabIO 0.1.3 documentation fabio-0.1.3/doc/html/search.html0000644000175000017500000000653112233250023017220 0ustar jeromejerome00000000000000 Search — FabIO 0.1.3 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

fabio-0.1.3/doc/html/_modules/0000755000175000017500000000000012233272206016676 5ustar jeromejerome00000000000000fabio-0.1.3/doc/html/_modules/fabio/0000755000175000017500000000000012233272207017757 5ustar jeromejerome00000000000000fabio-0.1.3/doc/html/_modules/fabio/HiPiCimage.html0000644000175000017500000005132512233250022022601 0ustar jeromejerome00000000000000 fabio.HiPiCimage — FabIO 0.1.3 documentation

Source code for fabio.HiPiCimage

#!/usr/bin/env python
"""
Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:erik.knudsen@risoe.dk

        + Jon Wright, ESRF

Information about the file format from Masakatzu Kobayashi is highly appreciated
"""

import numpy, logging
logger = logging.getLogger("HiPiCimage")
from fabioimage import fabioimage

class HiPiCimage(fabioimage):
[docs] """ Read HiPic images e.g. collected with a Hamamatsu CCD camera""" def _readheader(self, infile): """ Read in a header from an already open file """ Image_tag = infile.read(2) print Image_tag Comment_len = numpy.fromstring(infile.read(2), numpy.uint16) Dim_1 = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dim_2 = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dim_1_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dim_2_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0] HeaderType = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dump = infile.read(50) Comment = infile.read(Comment_len) self.header['Image_tag'] = Image_tag self.header['Dim_1'] = Dim_1 self.header['Dim_2'] = Dim_2 self.header['Dim_1_offset'] = Dim_1_offset self.header['Dim_2_offset'] = Dim_2_offset #self.header['Comment'] = Comment if Image_tag != 'IM' : # This does not look like an HiPic file logging.warning("no opening. Corrupt header of HiPic file " + \ str(infile.name)) Comment_split = Comment[:Comment.find('\x00')].split('\r\n') for topcomment in Comment_split: topsplit = topcomment.split(',') for line in topsplit: if '=' in line: key, val = line.split('=' , 1) # Users cannot type in significant whitespace key = key.rstrip().lstrip() self.header_keys.append(key) self.header[key] = val.lstrip().rstrip() self.header[key] = val.lstrip('"').rstrip('"') def read(self, fname, frame=None):
[docs] """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname, "rb") self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['Dim_1']) self.dim2 = int(self.header['Dim_2']) except: raise Exception("HiPic file", str(fname) + \ "is corrupt, cannot read it") bytecode = numpy.uint16 self.bpp = len(numpy.array(0, bytecode).tostring()) # Read image data block = infile.read(self.dim1 * self.dim2 * self.bpp) infile.close() #now read the data into the array try: self.data = numpy.reshape( numpy.fromstring(block, bytecode), [self.dim2, self.dim1]) except: print len(block), bytecode, self.bpp, self.dim2, self.dim1 raise IOError, \ 'Size spec in HiPic-header does not match size of image data field' self.bytecode = self.data.dtype.type # Sometimes these files are not saved as 12 bit, # But as 16 bit after bg subtraction - which results # negative values saved as 16bit. Therefore values higher # 4095 is really negative values if self.data.max() > 4095: gt12bit = self.data > 4095 self.data = self.data - gt12bit * (2 ** 16 - 1) # ensure the PIL image is reset self.pilimage = None return self
fabio-0.1.3/doc/html/_modules/fabio/kcdimage.html0000644000175000017500000005266212233250022022413 0ustar jeromejerome00000000000000 fabio.kcdimage — FabIO 0.1.3 documentation

Source code for fabio.kcdimage

#!/usr/bin/env python
"""
Authors: Jerome Kieffer, ESRF 
         email:jerome.kieffer@esrf.fr

kcd images are 2D images written by the old KappaCCD diffractometer built by Nonius in the 1990's
Based on the edfimage.py parser.
"""

import numpy, logging
import os, string
from fabioimage import fabioimage
logger = logging.getLogger("kcdimage")

DATA_TYPES = {"u16"  :  numpy.uint16 }

MINIMUM_KEYS = [
                'ByteOrder',
                'Data type',
                'X dimension',
                'Y dimension',
                'Number of readouts']

DEFAULT_VALUES = { "Data type": "u16" }




[docs]class kcdimage(fabioimage): """ Read the Nonius kcd data format """ def _readheader(self, infile): """ Read in a header in some KCD format from an already open file @ """ oneLine = infile.readline() alphanum = string.digits + string.letters + ". " asciiHeader = True for oneChar in oneLine.strip(): if not oneChar in alphanum: asciiHeader = False if asciiHeader is False: # This does not look like an edf file logger.warning("First line of %s does not seam to be ascii text!" % infile.name) endOfHeaders = False while not endOfHeaders: oneLine = infile.readline() if len(oneLine) > 100: endOfHeaders = True break if oneLine.strip() == "Binned mode": oneLine = "Mode = Binned" try: key, val = oneLine.split('=' , 1) except: endOfHeaders = True break key = key.strip() self.header_keys.append(key) self.header[key] = val.strip() missing = [] for item in MINIMUM_KEYS: if item not in self.header_keys: missing.append(item) if len(missing) > 0: logger.debug("KCD file misses the keys " + " ".join(missing))
[docs] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname, "rb") self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['X dimension']) self.dim2 = int(self.header['Y dimension']) except: raise Exception("KCD file %s is corrupt, cannot read it" % fname) try: bytecode = DATA_TYPES[self.header['Data type']] self.bpp = len(numpy.array(0, bytecode).tostring()) except KeyError: bytecode = numpy.uint16 self.bpp = 2 logger.warning("Defaulting type to uint16") try: nbReadOut = int(self.header['Number of readouts']) except KeyError: logger.warning("Defaulting number of ReadOut to 1") nbReadOut = 1 fileSize = os.stat(fname)[6] expected_size = self.dim1 * self.dim2 * self.bpp * nbReadOut infile.seek(fileSize - expected_size) block = infile.read() assert len(block) == expected_size infile.close() #now read the data into the array self.data = numpy.zeros((self.dim2, self.dim1)) try: for i in range(nbReadOut): self.data += numpy.reshape(numpy.fromstring( block[i * expected_size / nbReadOut:(i + 1) * expected_size / nbReadOut], bytecode), [self.dim2, self.dim1]) except: print len(block), bytecode, self.bpp, self.dim2, self.dim1 raise IOError, \ 'Size spec in kcd-header does not match size of image data field' self.bytecode = self.data.dtype.type self.resetvals() # ensure the PIL image is reset self.pilimage = None return self
@staticmethod
[docs] def checkData(data=None): if data is None: return None else: return data.astype(int)
fabio-0.1.3/doc/html/_modules/fabio/marccdimage.html0000644000175000017500000010006412233250022023071 0ustar jeromejerome00000000000000 fabio.marccdimage — FabIO 0.1.3 documentation

Source code for fabio.marccdimage

#!/usr/bin/env python
"""

Authors:
........
* Henning O. Sorensen & Erik Knudsen:
  Center for Fundamental Research: Metal Structures in Four Dimensions;
  Risoe National Laboratory;
  Frederiksborgvej 399;
  DK-4000 Roskilde;
  email:erik.knudsen@risoe.dk
* Jon Wright:
  European Synchrotron Radiation Facility;
  Grenoble (France)
         
marccdimage can read MarCCD and MarMosaic images including header info.

JPW : Use a parser in case of typos (sorry?)

"""


# Base this on the tifimage (as marccd seems to be tiff with a 
# special header 

from tifimage import tifimage
import logging
logger = logging.getLogger("marccdimage")

# Now for the c definition (found on mar webpage)
# The following string is therefore copyrighted by Mar I guess

CDEFINITION = """
typedef struct frame_header_type {
         /* File/header format parameters (256 bytes) */
         UINT32        header_type;  /* flag for header type  
                                           (can be  used as magic number) */
         char header_name[16];           /* header name (MMX) */
         UINT32        header_major_version;   /* header_major_version  (n.) */
         UINT32        header_minor_version;   /* header_minor_version  (.n) */
         UINT32        header_byte_order;/* BIG_ENDIAN (Motorola,MIPS);  
                                            LITTLE_ENDIAN (DEC, Intel) */
         UINT32        data_byte_order;  /* BIG_ENDIAN (Motorola,MIPS);  
                                            LITTLE_ENDIAN (DEC, Intel) */
         UINT32        header_size;      /* in bytes                     */
         UINT32        frame_type;       /* flag for frame type */
         UINT32        magic_number;     /* to be used as a flag - 
                                            usually  to indicate new file */
         UINT32        compression_type; /* type of image compression    */
         UINT32        compression1;     /* compression parameter 1 */
         UINT32        compression2;     /* compression parameter 2 */
         UINT32        compression3;     /* compression parameter 3 */
         UINT32        compression4;     /* compression parameter 4 */
         UINT32        compression5;     /* compression parameter 4 */
         UINT32        compression6;     /* compression parameter 4 */
         UINT32        nheaders;         /* total number of headers      */
         UINT32        nfast;            /* number of pixels in one line */
         UINT32        nslow;            /* number of lines in image     */
         UINT32        depth;            /* number of bytes per pixel    */
         UINT32        record_length;    /* number of pixels between 
                                            succesive rows */
         UINT32        signif_bits;      /* true depth of data, in bits  */
         UINT32        data_type;        /* (signed,unsigned,float...) */
         UINT32        saturated_value;  /* value marks pixel as saturated */
         UINT32        sequence;         /* TRUE or FALSE */
         UINT32        nimages;          /* total number of images - size of 
                                            each is nfast*(nslow/nimages) */
         UINT32        origin;           /* corner of origin             */
         UINT32        orientation;      /* direction of fast axis       */
         UINT32        view_direction;   /* direction to view frame      */
         UINT32        overflow_location;/* FOLLOWING_HEADER,  FOLLOWING_DATA */
         UINT32        over_8_bits;      /* # of pixels with counts  255 */
         UINT32        over_16_bits;     /* # of pixels with count  65535 */
         UINT32        multiplexed;      /* multiplex flag */
         UINT32        nfastimages;      /* # of images in fast direction */
         UINT32        nslowimages;      /* # of images in slow direction */
         UINT32        background_applied;/* flags correction has been applied 
                                              hold magic number ? */
         UINT32        bias_applied;     /* flags correction has been applied
                                             hold magic number ? */
         UINT32        flatfield_applied;/* flags correction has been applied -
                                              hold magic number ? */
         UINT32        distortion_applied;/*flags correction has been applied - 
                                              hold magic number ? */
         UINT32        original_header_type;    /* Header/frame type from  file 
                                                    that frame is read from */
         UINT32        file_saved;         /* Flag that file has been  saved, 
                                              should be zeroed if modified */
         char reserve1[(64-40)*sizeof(INT32)-16];

         /* Data statistics (128) */
         UINT32        total_counts[2];  /* 64 bit integer range = 1.85E19*/
         UINT32        special_counts1[2];
         UINT32        special_counts2[2];
         UINT32        min;
         UINT32        max;
         UINT32        mean;
         UINT32        rms;
         UINT32        p10;
         UINT32        p90;
         UINT32        stats_uptodate;
         UINT32        pixel_noise[MAXIMAGES]; /*1000*base noise value (ADUs) */
         char reserve2[(32-13-MAXIMAGES)*sizeof(INT32)];

         /* More statistics (256) */
         UINT16 percentile[128];


         /* Goniostat parameters (128 bytes) */
         INT32 xtal_to_detector;  /* 1000*distance in millimeters */
         INT32 beam_x;            /* 1000*x beam position (pixels) */
         INT32 beam_y;            /* 1000*y beam position (pixels) */
         INT32 integration_time;  /* integration time in  milliseconds */
         INT32 exposure_time;     /* exposure time in milliseconds */
         INT32 readout_time;      /* readout time in milliseconds */
         INT32 nreads;            /* number of readouts to get this  image */
         INT32 start_twotheta;    /* 1000*two_theta angle */
         INT32 start_omega;       /* 1000*omega angle */
         INT32 start_chi;         /* 1000*chi angle */
         INT32 start_kappa;       /* 1000*kappa angle */
         INT32 start_phi;         /* 1000*phi angle */
         INT32 start_delta;       /* 1000*delta angle */
         INT32 start_gamma;       /* 1000*gamma angle */
         INT32 start_xtal_to_detector; /* 1000*distance in mm (dist in um)*/
         INT32 end_twotheta;           /* 1000*two_theta angle */
         INT32 end_omega;              /* 1000*omega angle */
         INT32 end_chi;                /* 1000*chi angle */
         INT32 end_kappa;              /* 1000*kappa angle */
         INT32 end_phi;                /* 1000*phi angle */
         INT32 end_delta;              /* 1000*delta angle */
         INT32 end_gamma;              /* 1000*gamma angle */
         INT32 end_xtal_to_detector;   /* 1000*distance in mm (dist in um)*/
         INT32 rotation_axis;          /* active rotation axis */
         INT32 rotation_range;         /* 1000*rotation angle */
         INT32 detector_rotx;          /* 1000*rotation of detector  around X */
         INT32 detector_roty;          /* 1000*rotation of detector  around Y */
         INT32 detector_rotz;          /* 1000*rotation of detector  around Z */
         char reserve3[(32-28)*sizeof(INT32)];

         /* Detector parameters (128 bytes) */
         INT32 detector_type;            /* detector type */
         INT32 pixelsize_x;              /* pixel size (nanometers) */
         INT32 pixelsize_y;              /* pixel size (nanometers) */
         INT32 mean_bias;                        /* 1000*mean bias value */
         INT32 photons_per_100adu;       /* photons / 100 ADUs */
         INT32 measured_bias[MAXIMAGES];/* 1000*mean bias value for each image*/
         INT32 measured_temperature[MAXIMAGES];  /* Temperature of each  
                                                    detector in milliKelvins */
         INT32 measured_pressure[MAXIMAGES]; /* Pressure of each  chamber 
                                               in microTorr */
         /* Retired reserve4 when MAXIMAGES set to 9 from 16 and 
            two fields removed, and temp and pressure added
          char reserve4[(32-(5+3*MAXIMAGES))*sizeof(INT32)]
         */

         /* X-ray source and optics parameters (128 bytes) */
         /* X-ray source parameters (8*4 bytes) */
         INT32 source_type;              /* (code) - target, synch. etc */
         INT32 source_dx;                /* Optics param. - (size  microns) */
         INT32 source_dy;                /* Optics param. - (size  microns) */
         INT32 source_wavelength;        /* wavelength  (femtoMeters) */
         INT32 source_power;             /* (Watts) */
         INT32 source_voltage;           /* (Volts) */
         INT32 source_current;           /* (microAmps) */
         INT32 source_bias;              /* (Volts) */
         INT32 source_polarization_x;    /* () */
         INT32 source_polarization_y;    /* () */
         char reserve_source[4*sizeof(INT32)];

         /* X-ray optics_parameters (8*4 bytes) */
         INT32 optics_type;              /* Optics type (code)*/
         INT32 optics_dx;                /* Optics param. - (size  microns) */
         INT32 optics_dy;                /* Optics param. - (size  microns) */
         INT32 optics_wavelength;        /* Optics param. - (size  microns) */
         INT32 optics_dispersion;        /* Optics param. - (*10E6) */
         INT32 optics_crossfire_x;       /* Optics param. - (microRadians) */
         INT32 optics_crossfire_y;       /* Optics param. - (microRadians) */
         INT32 optics_angle;             /* Optics param. - (monoch.  
                                                    2theta - microradians) */
         INT32 optics_polarization_x;    /* () */
         INT32 optics_polarization_y;    /* () */
         char reserve_optics[4*sizeof(INT32)];

         char reserve5[((32-28)*sizeof(INT32))];

         /* File parameters (1024 bytes) */
         char filetitle[128];            /*  Title                  */
         char filepath[128];             /* path name for data  file  */
         char filename[64];              /* name of data  file  */
         char acquire_timestamp[32];     /* date and time of  acquisition */
         char header_timestamp[32];      /* date and time of header  update  */
         char save_timestamp[32];        /* date and time file  saved */
         char file_comments[512];        /* comments, use as desired   */
         char reserve6[1024-(128+128+64+(3*32)+512)];

         /* Dataset parameters (512 bytes) */
         char dataset_comments[512];     /* comments, used as desired   */
         /* pad out to  3072 bytes */
         char pad[3072-(256+128+256+(3*128)+1024+512)];     

         } frame_header;
"""

import struct

# Convert mar c header file types to python struct module types
C_TO_STRUCT = {
    "INT32"  : "i",
    "UINT32" : "I",
    "char"   : "c",
    "UINT16" : "H"
    }

# Sizes (bytes) of mar c header objects
C_SIZES = {
    "INT32"  : 4,
    "UINT32" : 4,
    "char"   : 1,
    "UINT16" : 2
    }

# This was worked out by trial and error from a trial image I think
MAXIMAGES = 9


[docs]def make_format(c_def_string): """ Reads the header definition in c and makes the format string to pass to struct.unpack """ lines = c_def_string.split("\n") fmt = "" names = [] expected = 0 for line in lines: if line.find(";") == -1: continue decl = line.split(";")[0].lstrip().rstrip() try: [typ, name] = decl.split() except ValueError: logger.debug("skipping: %s" , line) continue if name.find("[") > -1: # repeated ... times try: num = name.split("[")[1].split("]")[0] num = num.replace("MAXIMAGES", str(MAXIMAGES)) num = num.replace("sizeof(INT32)", "4") times = eval(num) except Exception, error: logger.error("%s Please decode %s", error, decl) raise error else: times = 1 try: fmt += C_TO_STRUCT[typ] * times names += [name] * times expected += C_SIZES[typ] * times except KeyError: continue return names, fmt # Make these be compiled on loading module
HEADER_NAMES, HEADER_FORMAT = make_format(CDEFINITION)
[docs]def interpret_header(header, fmt, names): """ given a format and header interpret it """ values = struct.unpack(fmt, header) hdr = {} i = 0 for name in names: if hdr.has_key(name): if type(values[i]) == type("string"): hdr[name] = hdr[name] + values[i] else: try: hdr[name].append(values[i]) except AttributeError: hdr[name] = [hdr[name], values[i]] else: hdr[name] = values[i] i = i + 1 return hdr
[docs]class marccdimage(tifimage): """ Read in data in mar ccd format, also MarMosaic images, including header info """ def _readheader(self, infile): """ Parser based approach Gets all entries """ infile.seek(1024) hstr = infile.read(3072) self.header = interpret_header(hstr, HEADER_FORMAT, HEADER_NAMES) def _read(self, fname): """ inherited from tifimage ... a marccd image *is a* tif image just with a header """ return tifimage.read(self, fname)
fabio-0.1.3/doc/html/_modules/fabio/converters.html0000644000175000017500000002424112233250022023031 0ustar jeromejerome00000000000000 fabio.converters — FabIO 0.1.3 documentation

Source code for fabio.converters

#!/usr/bin/env python 
#coding: utf8
"""
Converter module. 
This is for the moment empty (populated only with almost pass through anonymous functions)
but aims to be populated with more sofisticated translators ...  

"""
__author__ = "Jérôme Kieffer"
__contact__ = "jerome.kieffer@esrf.eu"
__license__ = "GPLv3+"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"

import types, logging
logger = logging.getLogger("converter")

[docs]def convert_data_integer(data): """ convert data to integer """ if data is not None: return data.astype(int) else: return data
CONVERSION_HEADER = { ("edfimage", "edfimage"): lambda header:header, } CONVERSION_DATA = { ("edfimage", "edfimage"): lambda data:data, ("edfimage", "cbfimage"): convert_data_integer, ("edfimage", "mar345image"): convert_data_integer, ("edfimage", "fit2dmaskimage"): convert_data_integer, ("edfimage", "kcdimage"): convert_data_integer, ("edfimage", "OXDimage"): convert_data_integer, ("edfimage", "pnmimage"): convert_data_integer, }
[docs]def convert_data(inp, outp, data): """ Return data converted to the output format ... over-simplistic implementation for the moment ... @param inp,outp: input/output format like "cbfimage" @param data(ndarray): the actual dataset to be transformed """ return CONVERSION_DATA.get((inp, outp), lambda data:data)(data)
[docs]def convert_header(inp, outp, header): """ return header converted to the output format @param inp,outp: input/output format like "cbfimage" @param header(dict):the actual set of headers to be transformed """ return CONVERSION_HEADER.get((inp, outp), lambda header:header)(header)
fabio-0.1.3/doc/html/_modules/fabio/GEimage.html0000644000175000017500000016655112233250022022150 0ustar jeromejerome00000000000000 fabio.GEimage — FabIO 0.1.3 documentation

Source code for fabio.GEimage

#!/usr/bin/env python

#
# Reads the header from a GE a-Si Angio Detector
# Using version 8001 of the header from file:
#     c:\adept\core\DefaultImageInfoConfig.csv
#
#  Antonino Miceli
#  Thu Jan  4 13:46:31 CST 2007
#

# modifications by Jon Wright for style, pychecker and fabio
# 

import numpy
import struct, logging
logger = logging.getLogger("GEimage")
from fabioimage import fabioimage
from fabioutils import next_filename, previous_filename

GE_HEADER_INFO = [
    # Name, length in bytes, format for struct (None means string)
    ('ImageFormat', 10, None),
    ('VersionOfStandardHeader', 2, '=H'),
    ('StandardHeaderSizeInBytes', 4, '=L'),
    ('VersionOfUserHeader', 2, '=H'),
    ('UserHeaderSizeInBytes', 4, '=L'),
    ('NumberOfFrames', 2, '=H'),
    ('NumberOfRowsInFrame', 2, '=H'),
    ('NumberOfColsInFrame', 2, '=H'),
    ('ImageDepthInBits', 2, '=H'),
    ('AcquisitionDate', 20, None),
    ('AcquisitionTime', 20, None),
    ('DUTID', 20, None),
    ('Operator', 50, None),
    ('DetectorSignature', 20, None),
    ('TestSystemName', 20, None),
    ('TestStationRevision', 20, None),
    ('CoreBundleRevision', 20, None),
    ('AcquisitionName', 40, None),
    ('AcquisitionParameterRevision', 20, None),
    ('OriginalNumberOfRows', 2, '=H'),
    ('OriginalNumberOfColumns', 2, '=H'),
    ('RowNumberUpperLeftPointArchiveROI', 2, '=H'),
    ('ColNumberUpperLeftPointArchiveROI', 2, '=H'),
    ('Swapped', 2, '=H'),
    ('Reordered', 2, '=H'),
    ('HorizontalFlipped', 2, '=H'),
    ('VerticalFlipped', 2, '=H'),
    ('WindowValueDesired', 2, '=H'),
    ('LevelValueDesired', 2, '=H'),
    ('AcquisitionMode', 2, '=H'),
    ('AcquisitionType', 2, '=H'),
    ('UserAcquisitionCoffFileName1', 100, None),
    ('UserAcquisitionCoffFileName2', 100, None),
    ('FramesBeforeExpose', 2, '=H'),
    ('FramesDuringExpose', 2, '=H'),
    ('FramesAfterExpose', 2, '=H'),
    ('IntervalBetweenFrames', 2, '=H'),
    ('ExposeTimeDelayInMicrosecs', 8, '=d'),
    ('TimeBetweenFramesInMicrosecs', 8, '=d'),
    ('FramesToSkipExpose', 2, '=H'),
    ('ExposureMode', 2, '=H'),
    ('PrepPresetTimeInMicrosecs', 8, '=d'),
    ('ExposePresetTimeInMicrosecs', 8, '=d'),
    ('AcquisitionFrameRateInFps', 4, '=f'),
    ('FOVSelect', 2, '=H'),
    ('ExpertMode', 2, '=H'),
    ('SetVCommon1', 8, '=d'),
    ('SetVCommon2', 8, '=d'),
    ('SetAREF', 8, '=d'),
    ('SetAREFTrim', 4, '=L'),
    ('SetSpareVoltageSource', 8, '=d'),
    ('SetCompensationVoltageSource', 8, '=d'),
    ('SetRowOffVoltage', 8, '=d'),
    ('SetRowOnVoltage', 8, '=d'),
    ('StoreCompensationVoltage', 4, '=L'),
    ('RampSelection', 2, '=H'),
    ('TimingMode', 2, '=H'),
    ('Bandwidth', 2, '=H'),
    ('ARCIntegrator', 2, '=H'),
    ('ARCPostIntegrator', 2, '=H'),
    ('NumberOfRows', 4, '=L'),
    ('RowEnable', 2, '=H'),
    ('EnableStretch', 2, '=H'),
    ('CompEnable', 2, '=H'),
    ('CompStretch', 2, '=H'),
    ('LeftEvenTristate', 2, '=H'),
    ('RightOddTristate', 2, '=H'),
    ('TestModeSelect', 4, '=L'),
    ('AnalogTestSource', 4, '=L'),
    ('VCommonSelect', 4, '=L'),
    ('DRCColumnSum', 4, '=L'),
    ('TestPatternFrameDelta', 4, '=L'),
    ('TestPatternRowDelta', 4, '=L'),
    ('TestPatternColumnDelta', 4, '=L'),
    ('DetectorHorizontalFlip', 2, '=H'),
    ('DetectorVerticalFlip', 2, '=H'),
    ('DFNAutoScrubOnOff', 2, '=H'),
    ('FiberChannelTimeOutInMicrosecs', 4, '=L'),
    ('DFNAutoScrubDelayInMicrosecs', 4, '=L'),
    ('StoreAECROI', 2, '=H'),
    ('TestPatternSaturationValue', 2, '=H'),
    ('TestPatternSeed', 4, '=L'),
    ('ExposureTimeInMillisecs', 4, '=f'),
    ('FrameRateInFps', 4, '=f'),
    ('kVp', 4, '=f'),
    ('mA', 4, '=f'),
    ('mAs', 4, '=f'),
    ('FocalSpotInMM', 4, '=f'),
    ('GeneratorType', 20, None),
    ('StrobeIntensityInFtL', 4, '=f'),
    ('NDFilterSelection', 2, '=H'),
    ('RefRegTemp1', 8, '=d'),
    ('RefRegTemp2', 8, '=d'),
    ('RefRegTemp3', 8, '=d'),
    ('Humidity1', 4, '=f'),
    ('Humidity2', 4, '=f'),
    ('DetectorControlTemp', 8, '=d'),
    ('DoseValueInmR', 8, '=d'),
    ('TargetLevelROIRow0', 2, '=H'),
    ('TargetLevelROICol0', 2, '=H'),
    ('TargetLevelROIRow1', 2, '=H'),
    ('TargetLevelROICol1', 2, '=H'),
    ('FrameNumberForTargetLevelROI', 2, '=H'),
    ('PercentRangeForTargetLevel', 2, '=H'),
    ('TargetValue', 2, '=H'),
    ('ComputedMedianValue', 2, '=H'),
    ('LoadZero', 2, '=H'),
    ('MaxLUTOut', 2, '=H'),
    ('MinLUTOut', 2, '=H'),
    ('MaxLinear', 2, '=H'),
    ('Reserved', 2, '=H'),
    ('ElectronsPerCount', 2, '=H'),
    ('ModeGain', 2, '=H'),
    ('TemperatureInDegC', 8, '=d'),
    ('LineRepaired', 2, '=H'),
    ('LineRepairFileName', 100, None),
    ('CurrentLongitudinalInMM', 4, '=f'),
    ('CurrentTransverseInMM', 4, '=f'),
    ('CurrentCircularInMM', 4, '=f'),
    ('CurrentFilterSelection', 4, '=L'),
    ('DisableScrubAck', 2, '=H'),
    ('ScanModeSelect', 2, '=H'),
    ('DetectorAppSwVersion', 20, None),
    ('DetectorNIOSVersion', 20, None),
    ('DetectorPeripheralSetVersion', 20, None),
    ('DetectorPhysicalAddress', 20, None),
    ('PowerDown', 2, '=H'),
    ('InitialVoltageLevel_VCOMMON', 8, '=d'),
    ('FinalVoltageLevel_VCOMMON', 8, '=d'),
    ('DmrCollimatorSpotSize', 10, None),
    ('DmrTrack', 5, None),
    ('DmrFilter', 5, None),
    ('FilterCarousel', 2, '=H'),
    ('Phantom', 20, None),
    ('SetEnableHighTime', 2, '=H'),
    ('SetEnableLowTime', 2, '=H'),
    ('SetCompHighTime', 2, '=H'),
    ('SetCompLowTime', 2, '=H'),
    ('SetSyncLowTime', 2, '=H'),
    ('SetConvertLowTime', 2, '=H'),
    ('SetSyncHighTime', 2, '=H'),
    ('SetEOLTime', 2, '=H'),
    ('SetRampOffsetTime', 2, '=H'),
    ('FOVStartingValue', 2, '=H'),
    ('ColumnBinning', 2, '=H'),
    ('RowBinning', 2, '=H'),
    ('BorderColumns64', 2, '=H'),
    ('BorderRows64', 2, '=H'),
    ('FETOffRows64', 2, '=H'),
    ('FOVStartColumn128', 2, '=H'),
    ('FOVStartRow128', 2, '=H'),
    ('NumberOfColumns128', 2, '=H'),
    ('NumberOfRows128', 2, '=H'),
    ('VFPAquisition', 2000, None),
    ('Comment', 200, None)
    ]


[docs]class GEimage(fabioimage): _need_a_seek_to_read = True def _readheader(self, infile): """ Read a GE image header """ infile.seek(0) self.header = {} for name, nbytes, format in GE_HEADER_INFO: if format is None: self.header[ name ] = infile.read(nbytes) else: self.header[ name ] = struct.unpack(format, infile.read(nbytes))[0]
[docs] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ if frame is None: frame = 0 self.header = {} self.resetvals() infile = self._open(fname, "rb") self.sequencefilename = fname self._readheader(infile) self.nframes = self.header['NumberOfFrames'] self._readframe(infile, frame) infile.close() return self
def _makeframename(self): """ The thing to be printed for the user to represent a frame inside a file """ self.filename = "%s$%04d" % (self.sequencefilename, self.currentframe) def _readframe(self, filepointer, img_num): """ # Load only one image from the sequence # Note: the first image in the sequence 0 # raises an exception if you give an invalid image # otherwise fills in self.data """ if(img_num > self.nframes or img_num < 0): raise Exception("Bad image number") imgstart = self.header['StandardHeaderSizeInBytes'] + \ self.header['UserHeaderSizeInBytes'] + \ img_num * self.header['NumberOfRowsInFrame'] * \ self.header['NumberOfColsInFrame'] * \ self.header['ImageDepthInBits'] / 8 # whence = 0 means seek from start of file filepointer.seek(imgstart, 0) self.bpp = self.header['ImageDepthInBits'] / 8 # hopefully 2 imglength = self.header['NumberOfRowsInFrame'] * \ self.header['NumberOfColsInFrame'] * self.bpp if self.bpp != 2: logging.warning("Using uint16 for GE but seems to be wrong") # Guessing it is always unsigned int? self.data = numpy.fromstring(filepointer.read(imglength), numpy.uint16) self.data.shape = (self.header['NumberOfRowsInFrame'], self.header['NumberOfColsInFrame']) self.dim2 , self.dim1 = self.data.shape self.currentframe = int(img_num) self._makeframename()
[docs] def write(self, fname, force_type=numpy.uint16): """ Not yet implemented""" raise Exception("Write is not implemented")
[docs] def getframe(self, num): """ Returns a frame as a new fabioimage object """ if num < 0 or num > self.nframes: raise Exception("Requested frame number is out of range") # Do a deep copy of the header to make a new one newheader = {} for k in self.header.keys(): newheader[k] = self.header[k] frame = GEimage(header=newheader) frame.nframes = self.nframes frame.sequencefilename = self.sequencefilename infile = frame._open(self.sequencefilename, "rb") frame._readframe(infile, num) infile.close() return frame
[docs] def next(self): """ Get the next image in a series as a fabio image """ if self.currentframe < (self.nframes - 1) and self.nframes > 1: return self.getframe(self.currentframe + 1) else: newobj = GEimage() newobj.read(next_filename( self.sequencefilename)) return newobj
[docs] def previous(self): """ Get the previous image in a series as a fabio image """ if self.currentframe > 0: return self.getframe(self.currentframe - 1) else: newobj = GEimage() newobj.read(previous_filename( self.sequencefilename)) return newobj
[docs]def demo(): import sys, time if len(sys.argv) < 2: print "USAGE: GE_script.py <GEaSi_raw_image_file>" sys.exit() image_file = sys.argv[1] print "init read_GEaSi_data class and load header.." sequence1 = GEimage() sequence1.read(image_file) print "TimeBetweenFramesInMicrosecs = ", print sequence1.header['TimeBetweenFramesInMicrosecs'] print "AcquisitionTime = ", print sequence1.header['AcquisitionTime'] print "Mean = ", sequence1.data.ravel().mean() while 1: start = time.time() try: sequence1 = sequence1.next() print sequence1.currentframe, sequence1.data.ravel().mean(), \ time.time() - start except Exception, ex: raise ex
if __name__ == '__main__': demo()
fabio-0.1.3/doc/html/_modules/fabio/cbfimage.html0000644000175000017500000034567412233250022022414 0ustar jeromejerome00000000000000 fabio.cbfimage — FabIO 0.1.3 documentation

Source code for fabio.cbfimage

#!/usr/bin/env python
# coding: utf8
"""
Authors: Jérôme Kieffer, ESRF
         email:jerome.kieffer@esrf.fr

Cif Binary Files images are 2D images written by the Pilatus detector and others.
They use a modified (simplified) byte-offset algorithm.

CIF is a library for manipulating Crystallographic information files and tries
to conform to the specification of the IUCR
"""
__author__ = "Jérôme Kieffer"
__contact__ = "jerome.kieffer@esrf.eu"
__license__ = "GPLv3+"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
__version__ = ["Generated by CIF.py: Jan 2005 - April 2012",
              "Written by Jerome Kieffer: Jerome.Kieffer@esrf.eu",
              "On-line data analysis / ISDD ", "ESRF Grenoble (France)"]


import os, logging
logger = logging.getLogger("cbfimage")
import numpy
from fabioimage import fabioimage
from compression import decByteOffet_numpy, md5sum, compByteOffet_numpy
#import time

DATA_TYPES = { "signed 8-bit integer"   : numpy.int8,
               "signed 16-bit integer"  : numpy.int16,
               "signed 32-bit integer"  : numpy.int32,
               "signed 64-bit integer"  : numpy.int64
                }

MINIMUM_KEYS = ["X-Binary-Size-Fastest-Dimension",
                'ByteOrder',
                'Data type',
                'X dimension',
                'Y dimension',
                'Number of readouts']


STARTER = "\x0c\x1a\x04\xd5"
PADDING = 512

[docs]class cbfimage(fabioimage): """ Read the Cif Binary File data format """ def __init__(self, data=None , header=None, fname=None): """ Constructor of the class CIF Binary File reader. @param _strFilename: the name of the file to open @type _strFilename: string """ fabioimage.__init__(self, data, header) self.cif = CIF() if fname is not None: #load the file) self.read(fname) @staticmethod
[docs] def checkData(data=None): if data is None: return None elif numpy.issubdtype(data.dtype, int): return data else: return data.astype(int)
def _readheader(self, inStream): """ Read in a header in some CBF format from a string representing binary stuff @param inStream: file containing the Cif Binary part. @type inStream: opened file. """ self.cif.loadCIF(inStream, _bKeepComment=True) # backport contents of the CIF data to the headers for key in self.cif: if key != "_array_data.data": self.header_keys.append(key) self.header[key] = self.cif[key].strip(" \"\n\r\t") if not "_array_data.data" in self.cif: raise Exception("cbfimage: CBF file %s is corrupt, cannot find data block with '_array_data.data' key" % self.fname) inStream2 = self.cif["_array_data.data"] sep = "\r\n" iSepPos = inStream2.find(sep) if iSepPos < 0 or iSepPos > 80: sep = "\n" #switch back to unix representation lines = inStream2.split(sep) for oneLine in lines[1:]: if len(oneLine) < 10: break try: key, val = oneLine.split(':' , 1) except ValueError: key, val = oneLine.split('=' , 1) key = key.strip() self.header_keys.append(key) self.header[key] = val.strip(" \"\n\r\t") missing = [] for item in MINIMUM_KEYS: if item not in self.header_keys: missing.append(item) if len(missing) > 0: logger.debug("CBF file misses the keys " + " ".join(missing))
[docs] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.filename = fname self.header = {} self.resetvals() infile = self._open(fname, "rb") self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['X-Binary-Size-Fastest-Dimension']) self.dim2 = int(self.header['X-Binary-Size-Second-Dimension']) except: raise Exception(IOError, "CBF file %s is corrupt, no dimensions in it" % fname) try: bytecode = DATA_TYPES[self.header['X-Binary-Element-Type']] self.bpp = len(numpy.array(0, bytecode).tostring()) except KeyError: bytecode = numpy.int32 self.bpp = 32 logger.warning("Defaulting type to int32") if self.header["conversions"] == "x-CBF_BYTE_OFFSET": self.data = self._readbinary_byte_offset(self.cif["_array_data.data"]).astype(bytecode).reshape((self.dim2, self.dim1)) else: raise Exception(IOError, "Compression scheme not yet supported, please contact FABIO development team") self.bytecode = self.data.dtype.type self.resetvals() # # ensure the PIL image is reset self.pilimage = None return self
def _readbinary_byte_offset(self, inStream): """ Read in a binary part of an x-CBF_BYTE_OFFSET compressed image @param inStream: the binary image (without any CIF decorators) @type inStream: python string. @return: a linear numpy array without shape and dtype set @rtype: numpy array """ startPos = inStream.find(STARTER) + 4 data = inStream[ startPos: startPos + int(self.header["X-Binary-Size"])] try: import byte_offset except ImportError: logger.warning("Error in byte_offset part: Falling back to Numpy implementation") myData = decByteOffet_numpy(data, size=self.dim1 * self.dim2) else: myData = byte_offset.analyseCython(data, size=self.dim1 * self.dim2) assert len(myData) == self.dim1 * self.dim2 return myData
[docs] def write(self, fname): """ write the file in CBF format @param fname: name of the file @type: string """ if self.data is not None: self.dim2, self.dim1 = self.data.shape else: raise RuntimeError("CBF image contains no data") binary_blob = compByteOffet_numpy(self.data) # l = len(binary_blob) # if (l % PADDING) != 0: # rem = PADDING - (l % PADDING) # binary_blob += "\x00" * rem dtype = "Unknown" for key, value in DATA_TYPES.iteritems(): if value == self.data.dtype: dtype = key binary_block = [ "--CIF-BINARY-FORMAT-SECTION--", "Content-Type: application/octet-stream;", ' conversions="x-CBF_BYTE_OFFSET"', 'Content-Transfer-Encoding: BINARY', "X-Binary-Size: %d" % (len(binary_blob)), "X-Binary-ID: 1", 'X-Binary-Element-Type: "%s"' % (dtype), "X-Binary-Element-Byte-Order: LITTLE_ENDIAN" , "Content-MD5: %s" % md5sum(binary_blob), "X-Binary-Number-of-Elements: %s" % (self.dim1 * self.dim2), "X-Binary-Size-Fastest-Dimension: %d" % self.dim1, "X-Binary-Size-Second-Dimension: %d" % self.dim2, "X-Binary-Size-Padding: %d" % 1, "", STARTER + binary_blob, "", "--CIF-BINARY-FORMAT-SECTION----" ] if "_array_data.header_contents" not in self.header: nonCifHeaders = [] else: nonCifHeaders = [i.strip()[2:] for i in self.header["_array_data.header_contents"].split("\n") if i.find("# ") >= 0] for key in self.header: if (key not in self.header_keys): self.header_keys.append(key) for key in self.header_keys: if key.startswith("_") : if key not in self.cif or self.cif[key] != self.header[key]: self.cif[key] = self.header[key] elif key.startswith("X-Binary-"): pass elif key.startswith("Content-"): pass elif key.startswith("conversions"): pass elif key.startswith("filename"): pass elif key in self.header: nonCifHeaders.append("%s %s" % (key, self.header[key])) if len(nonCifHeaders) > 0: self.cif["_array_data.header_contents"] = "\r\n".join(["# %s" % i for i in nonCifHeaders]) self.cif["_array_data.data"] = "\r\n".join(binary_block) self.cif.saveCIF(fname, linesep="\r\n", binary=True) ################################################################################ # CIF class ################################################################################
[docs]class CIF(dict): """ This is the CIF class, it represents the CIF dictionary; and as a a python dictionary thus inherits from the dict built in class. """ EOL = ["\r", "\n", "\r\n", "\n\r"] BLANK = [" ", "\t"] + EOL START_COMMENT = ["\"", "\'"] BINARY_MARKER = "--CIF-BINARY-FORMAT-SECTION--" def __init__(self, _strFilename=None): """ Constructor of the class. @param _strFilename: the name of the file to open @type _strFilename: filename (str) or file object """ dict.__init__(self) self._ordered = [] if _strFilename is not None: #load the file) self.loadCIF(_strFilename) def __setitem__(self, key, value): if key not in self._ordered: self._ordered.append(key) return dict.__setitem__(self, key, value)
[docs] def pop(self, key): if key in self._ordered: self._ordered.remove(key) return dict.pop(self, key)
[docs] def popitem(self, key): if key in self._ordered: self._ordered.remove(key) return dict.popitem(self, key)
[docs] def loadCIF(self, _strFilename, _bKeepComment=False): """Load the CIF file and populates the CIF dictionary into the object @param _strFilename: the name of the file to open @type _strFilename: string @param _strFilename: the name of the file to open @type _strFilename: string @return: None """ if isinstance(_strFilename, (str, unicode)): if os.path.isfile(_strFilename): infile = open(_strFilename, "rb") else: raise RuntimeError("CIF.loadCIF: No such file to open: %s" % _strFilename) #elif isinstance(_strFilename, file, bz2.BZ2File, ): elif "read" in dir(_strFilename): infile = _strFilename else: raise RuntimeError("CIF.loadCIF: what is %s type %s" % (_strFilename, type(_strFilename))) if _bKeepComment: self._parseCIF(infile.read()) else: self._parseCIF(CIF._readCIF(infile))
readCIF = loadCIF @staticmethod
[docs] def isAscii(_strIn): """ Check if all characters in a string are ascii, @param _strIn: input string @type _strIn: python string @return: boolean @rtype: boolean """ bIsAcii = True for i in _strIn: if ord(i) > 127: bIsAcii = False break return bIsAcii
@staticmethod def _readCIF(_instream): """ - Check if the filename containing the CIF data exists - read the cif file - removes the comments @param _instream: the file containing the CIF data @type _instream: open file in read mode @return: a string containing the raw data @rtype: string """ if not "readlines" in dir(_instream): raise RuntimeError("CIF._readCIF(instream): I expected instream to be an opened file,\ here I got %s type %s" % (_instream, type(_instream))) lLinesRead = _instream.readlines() sText = "" for sLine in lLinesRead: iPos = sLine.find("#") if iPos >= 0: if CIF.isAscii(sLine): sText += sLine[:iPos] + os.linesep if iPos > 80 : logger.warning("This line is too long and could cause problems in PreQuest: %s", sLine) else : sText += sLine if len(sLine.strip()) > 80 : logger.warning("This line is too long and could cause problems in PreQues: %s", sLine) return sText def _parseCIF(self, sText): """ - Parses the text of a CIF file - Cut it in fields - Find all the loops and process - Find all the keys and values @param sText: the content of the CIF - file @type sText: string @return: Nothing, the data are incorporated at the CIF object dictionary @rtype: None """ loopidx = [] looplen = [] loop = [] #first of all : separate the cif file in fields lFields = CIF._splitCIF(sText.strip()) #Then : look for loops for i in range(len(lFields)): if lFields[i].lower() == "loop_": loopidx.append(i) if len(loopidx) > 0: for i in loopidx: loopone, length, keys = CIF._analyseOneLoop(lFields, i) loop.append([keys, loopone]) looplen.append(length) for i in range(len(loopidx) - 1, -1, -1): f1 = lFields[:loopidx[i]] + lFields[loopidx[i] + looplen[i]:] lFields = f1 self["loop_"] = loop for i in range(len(lFields) - 1): # print lFields[i], lFields[i+1] if len(lFields[i + 1]) == 0 : lFields[i + 1] = "?" if lFields[i][0] == "_" and lFields[i + 1][0] != "_": self[lFields[i]] = lFields[i + 1] @staticmethod def _splitCIF(sText): """ Separate the text in fields as defined in the CIF @param sText: the content of the CIF - file @type sText: string @return: list of all the fields of the CIF @rtype: list """ lFields = [] while True: if len(sText) == 0: break elif sText[0] == "'": idx = 0 bFinished = False while not bFinished: idx += 1 + sText[idx + 1:].find("'") ##########debuging in case we arrive at the end of the text if idx >= len(sText) - 1: # print sText,idx,len(sText) lFields.append(sText[1:-1].strip()) sText = "" bFinished = True break if sText[idx + 1] in CIF.BLANK: lFields.append(sText[1:idx].strip()) sText1 = sText[idx + 1:] sText = sText1.strip() bFinished = True elif sText[0] == '"': idx = 0 bFinished = False while not bFinished: idx += 1 + sText[idx + 1:].find('"') ##########debuging in case we arrive at the end of the text if idx >= len(sText) - 1: # print sText,idx,len(sText) lFields.append(sText[1:-1].strip()) # print lFields[-1] sText = "" bFinished = True break if sText[idx + 1] in CIF.BLANK: lFields.append(sText[1:idx].strip()) # print lFields[-1] sText1 = sText[idx + 1:] sText = sText1.strip() bFinished = True elif sText[0] == ';': if sText[1:].strip().find(CIF.BINARY_MARKER) == 0: idx = sText[32:].find(CIF.BINARY_MARKER) if idx == -1: idx = 0 else: idx += 32 + len(CIF.BINARY_MARKER) else: idx = 0 bFinished = False while not bFinished: idx += 1 + sText[idx + 1:].find(';') if sText[idx - 1] in CIF.EOL: lFields.append(sText[1:idx - 1].strip()) sText1 = sText[idx + 1:] sText = sText1.strip() bFinished = True else: f = sText.split(None, 1)[0] lFields.append(f) # print lFields[-1] sText1 = sText[len(f):].strip() sText = sText1 return lFields @staticmethod def _analyseOneLoop(lFields, iStart): """Processes one loop in the data extraction of the CIF file @param lFields: list of all the words contained in the cif file @type lFields: list @param iStart: the starting index corresponding to the "loop_" key @type iStart: integer @return: the list of loop dictionaries, the length of the data extracted from the lFields and the list of all the keys of the loop. @rtype: tuple """ # in earch loop we first search the length of the loop # print lFields # curloop = {} loop = [] keys = [] i = iStart + 1 bFinished = False while not bFinished: if lFields[i][0] == "_": keys.append(lFields[i])#.lower()) i += 1 else: bFinished = True data = [] while True: if i >= len(lFields): break elif len(lFields[i]) == 0: break elif lFields[i][0] == "_": break elif lFields[i] in ["loop_", "stop_", "global_", "data_", "save_"]: break else: data.append(lFields[i]) i += 1 #print len(keys), len(data) k = 0 if len(data) < len(keys): element = {} for j in keys: if k < len(data): element[j] = data[k] else : element[j] = "?" k += 1 #print element loop.append(element) else: #print data #print keys for i in range(len(data) / len(keys)): element = {} for j in keys: element[j] = data[k] k += 1 # print element loop.append(element) # print loop return loop, 1 + len(keys) + len(data), keys ############################################################################################# ######## everything needed to write a cif file ######################################### #############################################################################################
[docs] def saveCIF(self, _strFilename="test.cif", linesep=os.linesep, binary=False): """Transforms the CIF object in string then write it into the given file @param _strFilename: the of the file to be written @param linesep: line separation used (to force compatibility with windows/unix) @param binary: Shall we write the data as binary (True only for imageCIF/CBF) @type param: string """ if binary: mode = "wb" else: mode = "w" try: fFile = open(_strFilename, mode) except IOError: print("Error during the opening of file for write: %s" % _strFilename) return fFile.write(self.tostring(_strFilename, linesep)) try: fFile.close() except IOError: print("Error during the closing of file for write: %s" % _strFilename)
[docs] def tostring(self, _strFilename=None, linesep=os.linesep): """ Converts a cif dictionnary to a string according to the CIF syntax @param _strFilename: the name of the filename to be appended in the header of the CIF file @type _strFilename: string @return: a sting that corresponds to the content of the CIF - file. """ # sCifText = "" lstStrCif = ["# " + i for i in __version__] if "_chemical_name_common" in self: t = self["_chemical_name_common"].split()[0] elif _strFilename is not None: t = os.path.splitext(os.path.split(str(_strFilename).strip())[1])[0] else: t = "" lstStrCif.append("data_%s" % (t)) #first of all get all the keys : lKeys = self.keys() lKeys.sort() for key in lKeys[:]: if key in self._ordered: lKeys.remove(key) self._ordered += lKeys for sKey in self._ordered: if sKey == "loop_": continue if sKey not in self: self._ordered.remove(sKey) logger.debug("Skipping key %s from ordered list as no more present in dict") continue sValue = str(self[sKey]) if sValue.find("\n") > -1: #should add value between ;; lLine = [sKey, ";", sValue, ";", ""] elif len(sValue.split()) > 1: #should add value between '' sLine = "%s '%s'" % (sKey, sValue) if len(sLine) > 80: lLine = [str(sKey), sValue] else: lLine = [sLine] else: sLine = "%s %s" % (sKey, sValue) if len(sLine) > 80: lLine = [str(sKey), sValue] else: lLine = [sLine] lstStrCif += lLine if self.has_key("loop_"): for loop in self["loop_"]: lstStrCif.append("loop_ ") lKeys = loop[0] llData = loop[1] lstStrCif += [" %s" % (sKey) for sKey in lKeys] for lData in llData: sLine = " " for key in lKeys: sRawValue = lData[key] if sRawValue.find("\n") > -1: #should add value between ;; lstStrCif += [sLine, ";", str(sRawValue), ";"] sLine = " " else: if len(sRawValue.split()) > 1: #should add value between '' value = "'%s'" % (sRawValue) else: value = str(sRawValue) if len(sLine) + len(value) > 78: lstStrCif += [sLine] sLine = " " + value else: sLine += " " + value lstStrCif.append(sLine) lstStrCif.append("") return linesep.join(lstStrCif)
[docs] def exists(self, sKey): """ Check if the key exists in the CIF and is non empty. @param sKey: CIF key @type sKey: string @param cif: CIF dictionary @return: True if the key exists in the CIF dictionary and is non empty @rtype: boolean """ bExists = False if self.has_key(sKey): if len(self[sKey]) >= 1: if self[sKey][0] not in ["?", "."]: bExists = True return bExists
[docs] def existsInLoop(self, sKey): """ Check if the key exists in the CIF dictionary. @param sKey: CIF key @type sKey: string @param cif: CIF dictionary @return: True if the key exists in the CIF dictionary and is non empty @rtype: boolean """ if not self.exists("loop_"): return False bExists = False if not bExists: for i in self["loop_"]: for j in i[0]: if j == sKey: bExists = True return bExists
[docs] def loadCHIPLOT(self, _strFilename): """ Load the powder diffraction CHIPLOT file and returns the pd_CIF dictionary in the object @param _strFilename: the name of the file to open @type _strFilename: string @return: the CIF object corresponding to the powder diffraction @rtype: dictionary """ if not os.path.isfile(_strFilename): print "I cannot find the file %s" % _strFilename raise lInFile = open(_strFilename, "r").readlines() self["_audit_creation_method"] = 'From 2-D detector using FIT2D and CIFfile' self["_pd_meas_scan_method"] = "fixed" self["_pd_spec_description"] = lInFile[0].strip() try: iLenData = int(lInFile[3]) except ValueError: iLenData = None lOneLoop = [] try: f2ThetaMin = float(lInFile[4].split()[0]) last = "" for sLine in lInFile[-20:]: if sLine.strip() != "": last = sLine.strip() f2ThetaMax = float(last.split()[0]) limitsOK = True except (ValueError, IndexError): limitsOK = False f2ThetaMin = 180.0 f2ThetaMax = 0 # print "limitsOK:", limitsOK for sLine in lInFile[4:]: sCleaned = sLine.split("#")[0].strip() data = sCleaned.split() if len(data) == 2 : if not limitsOK: f2Theta = float(data[0]) if f2Theta < f2ThetaMin : f2ThetaMin = f2Theta if f2Theta > f2ThetaMax : f2ThetaMax = f2Theta lOneLoop.append({ "_pd_meas_intensity_total": data[1] }) if not iLenData: iLenData = len(lOneLoop) assert (iLenData == len(lOneLoop)) self[ "_pd_meas_2theta_range_inc" ] = "%.4f" % ((f2ThetaMax - f2ThetaMin) / (iLenData - 1)) if self[ "_pd_meas_2theta_range_inc" ] < 0: self[ "_pd_meas_2theta_range_inc" ] = abs (self[ "_pd_meas_2theta_range_inc" ]) tmp = f2ThetaMax f2ThetaMax = f2ThetaMin f2ThetaMin = tmp self[ "_pd_meas_2theta_range_max" ] = "%.4f" % f2ThetaMax self[ "_pd_meas_2theta_range_min" ] = "%.4f" % f2ThetaMin self[ "_pd_meas_number_of_points" ] = str(iLenData) self["loop_"] = [ [ ["_pd_meas_intensity_total" ], lOneLoop ] ]
@staticmethod
[docs] def LoopHasKey(loop, key): "Returns True if the key (string) exist in the array called loop""" try: loop.index(key) return True except ValueError: return False
fabio-0.1.3/doc/html/_modules/fabio/pnmimage.html0000644000175000017500000007424212233250022022442 0ustar jeromejerome00000000000000 fabio.pnmimage — FabIO 0.1.3 documentation

Source code for fabio.pnmimage

#!/usr/bin/env python
#coding: utf8
"""

Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:henning.sorensen@risoe.dk

"""

import numpy, logging
logger = logging.getLogger("pnmimage")
from fabioimage import fabioimage

SUBFORMATS = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7']

HEADERITEMS = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL']
P7HEADERITEMS = ['WIDTH', 'HEIGHT', 'DEPTH', 'MAXVAL', 'TUPLTYPE', 'ENDHDR']

[docs]class pnmimage(fabioimage): def __init__(self, *arg, **kwargs): fabioimage.__init__(self, *arg, **kwargs) fun = getattr(fabioimage, '__init__', lambda x: None) fun(self) self.data = None self.header = {'Subformat':'P5'} self.dim1 = self.dim2 = 0 self.m = self.maxval = self.stddev = self.minval = None self.header_keys = self.header.keys() self.bytecode = None def _readheader(self, f): #pnm images have a 3-line header but ignore lines starting with '#' #1st line contains the pnm image sub format #2nd line contains the image pixel dimension #3rd line contains the maximum pixel value (at least for grayscale - check this) self.header_keys = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL'] l = f.readline().strip() if l not in SUBFORMATS: raise IOError, ('unknown subformat of pnm: %s' % l) else: self.header['SUBFORMAT'] = l if self.header['SUBFORMAT'] == 'P7': self.header_keys = P7HEADERITEMS #this one has a special header while 'ENDHDR' not in l: l = f.readline() while(l[0] == '#'): l = f.readline() s = l.lsplit(' ', 1) if s[0] not in P7HEADERITEMS: raise IOError, ('Illegal pam (netpnm p7) headeritem %s' % s[0]) self.header[s[0]] = s[1] else: self.header_keys = HEADERITEMS for k in self.header_keys[1:]: l = f.readline() while(l[0] == '#'): l = f.readline() self.header[k] = l.strip() #set the dimensions dims = (self.header['DIMENSIONS'].split()) self.dim1, self.dim2 = int(dims[0]), int(dims[1]) #figure out how many bytes are used to store the data #case construct here! m = int(self.header['MAXVAL']) if m < 256: self.bytecode = numpy.uint8 elif m < 65536: self.bytecode = numpy.uint16 elif m < 2147483648L: self.bytecode = numpy.uint32 logger.warning('32-bit pixels are not really supported by the netpgm standard') else: raise IOError, 'could not figure out what kind of pixels you have'
[docs] def read(self, fname, frame=None): """ try to read PNM images @param fname: name of the file @param frame: not relevant here! PNM is always single framed """ self.header = {} self.resetvals() infile = self._open(fname) self._readheader(infile) #read the image data decoder_name = "%sdec" % self.header['SUBFORMAT'] if decoder_name in dir(pnmimage): decoder = getattr(pnmimage, decoder_name) self.data = decoder(infile, self.bytecode) else: raise IOError("No decoder named %s for file %s" % (decoder_name, fname)) self.resetvals() return self
@staticmethod
[docs] def P1dec(buf, bytecode): data = numpy.zeros((self.dim2, self.dim1)) i = 0 for l in buf.readlines(): try: data[i, :] = numpy.array(l.split()).astype(bytecode) except ValueError: raise IOError, 'Size spec in pnm-header does not match size of image data field' return data
@staticmethod
[docs] def P4dec(buf, bytecode): err = 'single bit (pbm) images are not supported - yet' logger.error(err) raise NotImplementedError(err)
@staticmethod
[docs] def P2dec(buf, bytecode): data = numpy.zeros((self.dim2, self.dim1)) i = 0 for l in buf.readlines(): try: data[i, :] = numpy.array(l.split()).astype(bytecode) except ValueError: raise IOError, 'Size spec in pnm-header does not match size of image data field' return data
@staticmethod
[docs] def P5dec(buf, bytecode): l = buf.read() try: data = numpy.reshape(numpy.fromstring(l, bytecode), [self.dim2, self.dim1]).byteswap() except ValueError: raise IOError, 'Size spec in pnm-header does not match size of image data field' return data
@staticmethod
[docs] def P3dec(buf, bytecode): err = '(plain-ppm) RGB images are not supported - yet' logger.error(err) raise NotImplementedError(err)
@staticmethod
[docs] def P6dec(buf, bytecode): err = '(ppm) RGB images are not supported - yet' logger.error(err) raise NotImplementedError(err)
@staticmethod
[docs] def P7dec(buf, bytecode): err = '(pam) images are not supported - yet' logger.error(err) raise NotImplementedError(err)
[docs] def write(self, filename): raise NotImplementedError('write pnm images is not implemented yet.')
@staticmethod
[docs] def checkData(data=None): if data is None: return None else: return data.astype(int)
fabio-0.1.3/doc/html/_modules/fabio/edfimage.html0000644000175000017500000052103512233250022022403 0ustar jeromejerome00000000000000 fabio.edfimage — FabIO 0.1.3 documentation

Source code for fabio.edfimage

#!/usr/bin/env python
# -*- coding: utf8 -*-
"""

License: GPLv2+

Authors:
........
* Henning O. Sorensen & Erik Knudsen:
  Center for Fundamental Research: Metal Structures in Four Dimensions;
  Risoe National Laboratory;
  Frederiksborgvej 399;
  DK-4000 Roskilde;
  email:erik.knudsen@risoe.dk
* Jon Wright & Jérôme Kieffer:
  European Synchrotron Radiation Facility;
  Grenoble (France)


"""
from __future__ import with_statement
import os, logging, types
logger = logging.getLogger("edfimage")
import numpy
from fabioimage import fabioimage
from fabioutils import isAscii, toAscii, nice_int
from compression import decBzip2, decGzip, decZlib


BLOCKSIZE = 512
DATA_TYPES = {  "SignedByte"    :  numpy.int8,
                "Signed8"       :  numpy.int8,
                "UnsignedByte"  :  numpy.uint8,
                "Unsigned8"     :  numpy.uint8,
                "SignedShort"   :  numpy.int16,
                "Signed16"      :  numpy.int16,
                "UnsignedShort" :  numpy.uint16,
                "Unsigned16"    :  numpy.uint16,
                "UnsignedShortInteger" : numpy.uint16,
                "SignedInteger" :  numpy.int32,
                "Signed32"      :  numpy.int32,
                "UnsignedInteger":  numpy.uint32,
                "Unsigned32"    :  numpy.uint32,
                "SignedLong"    :  numpy.int32,
                "UnsignedLong"  :  numpy.uint32,
                "Signed64"      :  numpy.int64,
                "Unsigned64"    :  numpy.uint64,
                "FloatValue"    :  numpy.float32,
                "FLOATVALUE"    :  numpy.float32,
                "FLOAT"         :  numpy.float32, # fit2d
                "Float"         :  numpy.float32, # fit2d
                "FloatIEEE32"   :  numpy.float32,
                "Float32"       :  numpy.float32,
                "Double"        :  numpy.float64,
                "DoubleValue"   :  numpy.float64,
                "FloatIEEE64"   :  numpy.float64,
                "DoubleIEEE64"  :  numpy.float64}
try:
    DATA_TYPES["FloatIEEE128" ] =  numpy.float128
    DATA_TYPES["DoubleIEEE128" ] =  numpy.float128
    DATA_TYPES["QuadrupleValue" ] =  numpy.float128

except AttributeError:
    # not in your numpy
    pass

NUMPY_EDF_DTYPE = {"int8"       :"SignedByte",
                   "int16"      :"SignedShort",
                   "int32"      :"SignedInteger",
                   "int64"      :"Signed64",
                   "uint8"      :"UnsignedByte",
                   "uint16"     :"UnsignedShort",
                   "uint32"     :"UnsignedInteger",
                   "uint64"     :"Unsigned64",
                   "float32"    :"FloatValue",
                   "float64"    :"DoubleValue",
                   "float128"   :"QuadrupleValue",
             }

MINIMUM_KEYS = ['HEADERID',
                'IMAGE',
                'BYTEORDER',
                'DATATYPE',
                'DIM_1',
                'DIM_2',
                'SIZE'] # Size is thought to be essential for writing at least

DEFAULT_VALUES = {
                  # I do not define default values as they will be calculated at write time
                  # JK20110415
                  }

[docs]class Frame(object): """ A class representing a single frame in an EDF file """ def __init__(self, data=None, header=None, header_keys=None, number=None): if header is None: self.header = {} else: self.header = dict(header) if header_keys is None: self.header_keys = self.header.keys() else: self.header_keys = header_keys[:] for key in header_keys: if key not in self.header: logger.warning("Header key %s, in header_keys is not in header dictionary, poping !!!" % key) self.header_keys.remove(key) self.capsHeader = {} for key in self.header_keys: try: self.capsHeader[key.upper()] = key except AttributeError: logger.warning("Header key %s is not a string" % key) self._data = data self.dims = [] self.dim1 = 0 self.dim2 = 0 self.start = None # Position of start of raw data in file self.size = None # size of raw data in file self.file = None # opened file object with locking capabilities !!! self.bpp = None self._bytecode = None if (number is not None) and isinstance(number, int): self.iFrame = number else: self.iFrame = 0
[docs] def parseheader(self, block): """ Parse the header in some EDF format from an already open file @param block: string representing the header block @type block: string, should be full ascii @return: size of the binary blob """ #reset values ... self.header = {} self.capsHeader = {} self.header_keys = [] self.size = None calcsize = 1 self.dims = [] for line in block.split(';'): if '=' in line: key, val = line.split('=' , 1) # Why would someone put null bytes in a header? key = key.replace("\x00"," ").strip() self.header[key] = val.replace("\x00"," ").strip() self.capsHeader[key.upper()] = key self.header_keys.append(key) # Compute image size if "SIZE" in self.capsHeader: try: self.size = nice_int(self.header[self.capsHeader["SIZE"]]) except ValueError: logger.warning("Unable to convert to integer : %s %s " % (self.capsHeader["SIZE"], self.header[self.capsHeader["SIZE"]])) if "DIM_1" in self.capsHeader: try: dim1 = nice_int(self.header[self.capsHeader['DIM_1']]) except ValueError: logger.error("Unable to convert to integer Dim_1: %s %s" % (self.capsHeader["DIM_1"], self.header[self.capsHeader["DIM_1"]])) else: calcsize *= dim1 self.dims.append(dim1) else: logger.error("No Dim_1 in headers !!!") if "DIM_2" in self.capsHeader: try: dim2 = nice_int(self.header[self.capsHeader['DIM_2']]) except ValueError: logger.error("Unable to convert to integer Dim_3: %s %s" % (self.capsHeader["DIM_2"], self.header[self.capsHeader["DIM_2"]])) else: calcsize *= dim2 self.dims.append(dim2) else: logger.error("No Dim_2 in headers !!!") iDim = 3 # JON: this appears to be for nD images, but we don't treat those while iDim is not None: strDim = "DIM_%i" % iDim if strDim in self.capsHeader: try: dim3 = nice_int(self.header[self.capsHeader[strDim]]) except ValueError: logger.error("Unable to convert to integer %s: %s %s" % (strDim, self.capsHeader[strDim], self.header[self.capsHeader[strDim]])) dim3 = None iDim = None else: if dim3 > 1: # Otherwise treat dim3==1 as a 2D image calcsize *= dim3 self.dims.append(dim3) iDim += 1 else: logger.debug("No Dim_3 -> it is a 2D image") iDim = None if self._bytecode is None: if "DATATYPE" in self.capsHeader: self._bytecode = DATA_TYPES[self.header[self.capsHeader['DATATYPE']]] else: self._bytecode = numpy.uint16 logger.warning("Defaulting type to uint16") self.bpp = len(numpy.array(0, self._bytecode).tostring()) calcsize *= self.bpp if (self.size is None): self.size = calcsize elif (self.size != calcsize): if ("COMPRESSION" in self.capsHeader) and (self.header[self.capsHeader['COMPRESSION']].upper().startswith("NO")): logger.info("Mismatch between the expected size %s and the calculated one %s" % (self.size, calcsize)) self.size = calcsize for i, n in enumerate(self.dims): setattr(self, "dim%i" % (i + 1), n) return self.size
[docs] def swap_needed(self): """ Decide if we need to byteswap """ if ('Low' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('High' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): return False if ('High' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('Low' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): if self.bpp in [2, 4, 8]: return True else: return False
[docs] def getData(self): """ Unpack a binary blob according to the specification given in the header @return: dataset as numpy.ndarray """ data = None if self._data is not None: data = self._data elif self.file is None: data = self._data else: if self._bytecode is None: if "DATATYPE" in self.capsHeader: self._bytecode = DATA_TYPES[self.header[self.capsHeader["DATATYPE"]]] else: self._bytecode = numpy.uint16 dims = self.dims[:] dims.reverse() with self.file.lock: if self.file.closed: logger.error("file: %s from %s is closed. Cannot read data." % (self.file, self.file.filename)) return else: self.file.seek(self.start) fileData = self.file.read(self.size) if ("COMPRESSION" in self.capsHeader): compression = self.header[self.capsHeader["COMPRESSION"]].upper() uncompressed_size = self.bpp for i in dims: uncompressed_size *= i if "OFFSET" in compression : try: import byte_offset#IGNORE:F0401 except ImportError, error: logger.error("Unimplemented compression scheme: %s (%s)" % (compression, error)) else: myData = byte_offset.analyseCython(fileData, size=uncompressed_size) rawData = myData.astype(self._bytecode).tostring() self.size = uncompressed_size elif compression == "NONE": rawData = fileData elif "GZIP" in compression: rawData = decGzip(fileData) self.size = uncompressed_size elif "BZ" in compression : rawData = decBzip2(fileData) self.size = uncompressed_size elif "Z" in compression : rawData = decZlib(fileData) self.size = uncompressed_size else: logger.warning("Unknown compression scheme %s" % compression) rawData = fileData else: rawData = fileData expected = self.size obtained = len(rawData) if expected > obtained: logger.error("Data stream is incomplete: %s < expected %s bytes" % (obtained, expected)) rawData += "\x00" * (expected - obtained) elif expected < len(rawData): logger.info("Data stream contains trailing junk : %s > expected %s bytes" % (obtained, expected)) rawData = rawData[:expected] if self.swap_needed(): data = numpy.fromstring(rawData, self._bytecode).byteswap().reshape(tuple(dims)) else: data = numpy.fromstring(rawData, self._bytecode).reshape(tuple(dims)) self._data = data self._bytecode = data.dtype.type return data
[docs] def setData(self, npa=None): """Setter for data in edf frame""" self._data = npa
data = property(getData, setData, "property: (edf)frame.data, uncompress the datablock when needed")
[docs] def getByteCode(self): if self._bytecode is None: self._bytecode = self.data.dtype.type return self._bytecode
[docs] def setByteCode(self, _iVal): self._bytecode = _iVal
bytecode = property(getByteCode, setByteCode)
[docs] def getEdfBlock(self, force_type=None, fit2dMode=False): """ @param force_type: type of the dataset to be enforced like "float64" or "uint16" @type force_type: string or numpy.dtype @param fit2dMode: enforce compatibility with fit2d and starts countimg number of images at 1 @type fit2dMode: boolean @return: ascii header block @rtype: python string with the concatenation of the ascii header and the binary data block """ if force_type is not None: data = self.data.astype(force_type) else: data = self.data fit2dMode = bool(fit2dMode) for key in self.header: KEY = key.upper() if KEY not in self.capsHeader: self.capsHeader[KEY] = key if key not in self.header_keys: self.header_keys.append(key) header = self.header.copy() header_keys = self.header_keys[:] capsHeader = self.capsHeader.copy() listHeader = ["{\n"] # First of all clean up the headers: for i in capsHeader: if "DIM_" in i: header.pop(capsHeader[i]) header_keys.remove(capsHeader[i]) for KEY in ["SIZE", "EDF_BINARYSIZE", "EDF_HEADERSIZE", "BYTEORDER", "DATATYPE", "HEADERID", "IMAGE"]: if KEY in capsHeader: header.pop(capsHeader[KEY]) header_keys.remove(capsHeader[KEY]) if "EDF_DATABLOCKID" in capsHeader: header_keys.remove(capsHeader["EDF_DATABLOCKID"]) #but do not remove the value from dict, instead reset the key ... if capsHeader["EDF_DATABLOCKID"] != "EDF_DataBlockID": header["EDF_DataBlockID"] = header.pop(capsHeader["EDF_DATABLOCKID"]) capsHeader["EDF_DATABLOCKID"] = "EDF_DataBlockID" # Then update static headers freshly deleted header_keys.insert(0, "Size") header["Size"] = len(data.tostring()) header_keys.insert(0, "HeaderID") header["HeaderID"] = "EH:%06d:000000:000000" % (self.iFrame + fit2dMode) header_keys.insert(0, "Image") header["Image"] = str(self.iFrame + fit2dMode) dims = list(data.shape) nbdim = len(dims) for i in dims: key = "Dim_%i" % nbdim header[key] = i header_keys.insert(0, key) nbdim -= 1 header_keys.insert(0, "DataType") header["DataType"] = NUMPY_EDF_DTYPE[str(numpy.dtype(data.dtype))] header_keys.insert(0, "ByteOrder") if numpy.little_endian: header["ByteOrder"] = "LowByteFirst" else: header["ByteOrder"] = "HighByteFirst" approxHeaderSize = 100 for key in header: approxHeaderSize += 7 + len(key) + len(str(header[key])) approxHeaderSize = BLOCKSIZE * (approxHeaderSize // BLOCKSIZE + 1) header_keys.insert(0, "EDF_HeaderSize") header["EDF_HeaderSize"] = "%5s" % (approxHeaderSize) header_keys.insert(0, "EDF_BinarySize") header["EDF_BinarySize"] = len(data.tostring()) header_keys.insert(0, "EDF_DataBlockID") if not "EDF_DataBlockID" in header: header["EDF_DataBlockID"] = "%i.Image.Psd" % (self.iFrame + fit2dMode) preciseSize = 4 #2 before {\n 2 after }\n for key in header_keys: #Escape keys or values that are no ascii strKey = str(key) if not isAscii(strKey, listExcluded=["}", "{"]): logger.warning("Non ascii key %s, skipping" % strKey) continue strValue = str(header[key]) if not isAscii(strValue, listExcluded=["}", "{"]): logger.warning("Non ascii value %s, skipping" % strValue) continue line = strKey + " = " + strValue + " ;\n" preciseSize += len(line) listHeader.append(line) if preciseSize > approxHeaderSize: logger.error("I expected the header block only at %s in fact it is %s" % (approxHeaderSize, preciseSize)) for idx, line in enumerate(listHeader[:]): if line.startswith("EDF_HeaderSize"): headerSize = BLOCKSIZE * (preciseSize // BLOCKSIZE + 1) newline = "EDF_HeaderSize = %5s ;\n" % headerSize delta = len(newline) - len(line) if (preciseSize // BLOCKSIZE) != ((preciseSize + delta) // BLOCKSIZE): headerSize = BLOCKSIZE * ((preciseSize + delta) // BLOCKSIZE + 1) newline = "EDF_HeaderSize = %5s ;\n" % headerSize preciseSize = preciseSize + delta listHeader[idx] = newline break else: headerSize = approxHeaderSize listHeader.append(" "*(headerSize - preciseSize) + "}\n") return "".join(listHeader) + data.tostring()
[docs]class edfimage(fabioimage): """ Read and try to write the ESRF edf data format """ def __init__(self, data=None , header=None, header_keys=None, frames=None): self.currentframe = 0 self.filesize = None try: dim = len(data.shape) except Exception, error: #IGNORE:W0703 logger.debug("Data don't look like a numpy array (%s), resetting all!!" % error) data = None dim = 0 fabioimage.__init__(self, data, header) if dim == 2: fabioimage.__init__(self, data, header) elif dim == 1 : data.shape = (0, len(data)) fabioimage.__init__(self, data, header) elif dim == 3 : fabioimage.__init__(self, data[0, :, :], header) elif dim == 4 : fabioimage.__init__(self, data[0, 0, :, :], header) elif dim == 5 : fabioimage.__init__(self, data[0, 0, 0, :, :], header) if frames is None: frame = Frame(data=self.data, header=self.header, header_keys=header_keys , number=self.currentframe) self.__frames = [frame] else: self.__frames = frames @staticmethod
[docs] def checkHeader(header=None): """ Empty for fabioimage but may be populated by others classes """ if type(header) != types.DictionaryType: return {} new = {} for key, value in header.items(): new[toAscii(key, ";{}")] = toAscii(value, ";{}") return new
@staticmethod def _readHeaderBlock(infile): """ Read in a header in some EDF format from an already open file @param infile: file object open in read mode @return: string (or None if no header was found. """ MAX_HEADER_SIZE = BLOCKSIZE * 20 block = infile.read(BLOCKSIZE) if len(block) < BLOCKSIZE: logger.debug("Under-short header: only %i bytes in %s" % (len(block), infile.name)) return if (block.find("{") < 0) : # This does not look like an edf file logger.warning("no opening {. Corrupt header of EDF file %s" % infile.name) return if "EDF_HeaderSize" in block: start = block.index("EDF_HeaderSize") chunk = block[start:].split("=")[1].strip() try: new_max_header_size = int(chunk.split(";")[0].strip()) except Exception: logger.warning("Unable to read header size in %s" % chunk) else: if new_max_header_size > MAX_HEADER_SIZE: logger.info("Redefining MAX_HEADER_SIZE to %s" % new_max_header_size) MAX_HEADER_SIZE = new_max_header_size while '}' not in block: block = block + infile.read(BLOCKSIZE) if len(block) > MAX_HEADER_SIZE: logger.warning("Runaway header in EDF file MAX_HEADER_SIZE: %s \n%s" % (MAX_HEADER_SIZE, block)) return start = block.find("{") + 1 end = block.find("}") # Now it is essential to go to the start of the binary part if block[end: end + 3] == "}\r\n": offset = end + 3 - len(block) elif block[end: end + 2] == "}\n": offset = end + 2 - len(block) else: logger.error("Unable to locate start of the binary section") offset = None if offset is not None: infile.seek(offset, os.SEEK_CUR) return block[start:end] def _readheader(self, infile): """ Read all headers in a file and populate self.header data is not yet populated @type infile: file object open in read mode """ self.__frames = [] bContinue = True while bContinue: block = self._readHeaderBlock(infile) if block is None: bContinue = False break frame = Frame(number=self.nframes) size = frame.parseheader(block) frame.file = infile frame.start = infile.tell() frame.size = size self.__frames += [frame] try: infile.seek(size, os.SEEK_CUR) except Exception, error: logger.warning("infile is %s" % infile) logger.warning("Position is %s" % infile.tell()) logger.warning("size is %s" % size) logger.error("It seams this error occurs under windows when reading a (large-) file over network: %s ", error) raise Exception(error) if frame.start + size > infile.size: logger.warning("Non complete datablock: got %s, expected %s" % (infile.size - frame.start, size)) bContinue = False break for i, frame in enumerate(self.__frames): missing = [] for item in MINIMUM_KEYS: if item not in frame.capsHeader: missing.append(item) if len(missing) > 0: logger.info("EDF file %s frame %i misses mandatory keys: %s " % (self.filename, i, " ".join(missing))) self.currentframe = 0
[docs] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.resetvals() self.filename = fname infile = self._open(fname, "rb") self._readheader(infile) if frame is None: pass elif frame < self.nframes: self = self.getframe(frame) else: logger.error("Reading file %s You requested frame %s but only %s frames are available", fname, frame, self.nframes) self.resetvals() # ensure the PIL image is reset self.pilimage = None return self
[docs] def swap_needed(self): """ Decide if we need to byteswap """ if ('Low' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('High' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): return False if ('High' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('Low' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): if self.bpp in [2, 4, 8]: return True else: return False
[docs] def unpack(self): """ Unpack a binary blob according to the specification given in the header and return the dataset @return: dataset as numpy.ndarray """ return self.__frames[self.currentframe].getData()
[docs] def getframe(self, num): """ returns the file numbered 'num' in the series as a fabioimage """ newImage = None if self.nframes == 1: logger.debug("Single frame EDF; having fabioimage default behavour: %s" % num) newImage = fabioimage.getframe(self, num) elif num in xrange(self.nframes): logger.debug("Multi frame EDF; having edfimage specific behavour: %s/%s" % (num, self.nframes)) newImage = edfimage(frames=self.__frames) newImage.currentframe = num newImage.filename = self.filename else: txt = "Cannot access frame: %s/%s" % (num, self.nframes) logger.error(txt) raise ValueError("edfimage.getframe:" + txt) return newImage
[docs] def previous(self): """ returns the previous file in the series as a fabioimage """ newImage = None if self.nframes == 1: newImage = fabioimage.previous(self) else: newFrameId = self.currentframe - 1 newImage = self.getframe(newFrameId) return newImage
[docs] def next(self): """ returns the next file in the series as a fabioimage """ newImage = None if self.nframes == 1: newImage = fabioimage.next(self) else: newFrameId = self.currentframe + 1 newImage = self.getframe(newFrameId) return newImage
[docs] def write(self, fname, force_type=None, fit2dMode=False): """ Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats) @param force_type: can be numpy.uint16 or simply "float" @return: None """ with self._open(fname, mode="wb") as outfile: for i, frame in enumerate(self.__frames): frame.iFrame = i outfile.write(frame.getEdfBlock(force_type=force_type, fit2dMode=fit2dMode))
[docs] def appendFrame(self, frame=None, data=None, header=None): """ Method used add a frame to an EDF file @param frame: frame to append to edf image @type frame: instance of Frame @return: None """ if isinstance(frame, Frame): self.__frames.append(frame) else: self.__frames.append(Frame(data, header))
[docs] def deleteFrame(self, frameNb=None): """ Method used to remove a frame from an EDF image. by default the last one is removed. @param frameNb: frame number to remove, by default the last. @type frameNb: integer @return: None """ if frameNb is None: self.__frames.pop() else: self.__frames.pop(frameNb)
[docs] def fastReadData(self, filename=None): """ This is a special method that will read and return the data from another file ... The aim is performances, ... but only supports uncompressed files. @return: data from another file using positions from current edfimage """ if (filename is None) or not os.path.isfile(filename): raise RuntimeError("edfimage.fastReadData is only valid with another file: %s does not exist" % (filename)) data = None frame = self.__frames[self.currentframe] with open(filename, "rb")as f: f.seek(frame.start) raw = f.read(frame.size) try: data = numpy.fromstring(raw, dtype=self.bytecode) data.shape = self.data.shape except Exception, err : logger.error("unable to convert file content to numpy array: %s", err) return data
[docs] def fastReadROI(self, filename, coords=None): """ Method reading Region of Interest of another file based on metadata available in current edfimage. The aim is performances, ... but only supports uncompressed files. @return: ROI-data from another file using positions from current edfimage @rtype: numpy 2darray """ if (filename is None) or not os.path.isfile(filename): raise RuntimeError("edfimage.fastReadData is only valid with another file: %s does not exist" % (filename)) data = None frame = self.__frames[self.currentframe] if len(coords) == 4: slice1 = self.make_slice(coords) elif len(coords) == 2 and isinstance(coords[0], slice) and \ isinstance(coords[1], slice): slice1 = coords else: logger.warning('readROI: Unable to understand Region Of Interest: got %s', coords) return d1 = self.data.shape[-1] start0 = slice1[0].start start1 = slice1[1].start slice2 = (slice(0, slice1[0].stop - start0, slice1[0].step), slice(0, slice1[1].stop - start1, slice1[1].step)) start = frame.start + self.bpp * (d1 * start0 + start1) size = self.bpp * ((slice2[0].stop) * d1) with open(filename, "rb")as f: f.seek(start) raw = f.read(size) try: data = numpy.fromstring(raw, dtype=self.bytecode) data.shape = -1, d1 except Exception, err : logger.error("unable to convert file content to numpy array: %s", err) return data[slice2] ################################################################################ # Properties definition for header, data, header_keys and capsHeader ################################################################################
[docs] def getNbFrames(self): """ Getter for number of frames """ return len(self.__frames)
[docs] def setNbFrames(self, val): """ Setter for number of frames ... should do nothing. Here just to avoid bugs """ if val != len(self.__frames): logger.warning("trying to set the number of frames ")
nframes = property(getNbFrames, setNbFrames, "property: number of frames in EDF file")
[docs] def getHeader(self): """ Getter for the headers. used by the property header, """ return self.__frames[self.currentframe].header
[docs] def setHeader(self, _dictHeader): """ Enforces the propagation of the header to the list of frames """ try: self.__frames[self.currentframe].header = _dictHeader except AttributeError: self.__frames = [Frame(header=_dictHeader)] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame(header=_dictHeader))
[docs] def delHeader(self): """ Deleter for edf header """ self.__frames[self.currentframe].header = {}
header = property(getHeader, setHeader, delHeader, "property: header of EDF file")
[docs] def getHeaderKeys(self): """ Getter for edf header_keys """ return self.__frames[self.currentframe].header_keys
[docs] def setHeaderKeys(self, _listtHeader): """ Enforces the propagation of the header_keys to the list of frames @param _listtHeader: list of the (ordered) keys in the header @type _listtHeader: python list """ try: self.__frames[self.currentframe].header_keys = _listtHeader except AttributeError: self.__frames = [Frame(header_keys=_listtHeader)] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame(header_keys=_listtHeader))
[docs] def delHeaderKeys(self): """ Deleter for edf header_keys """ self.__frames[self.currentframe].header_keys = []
header_keys = property(getHeaderKeys, setHeaderKeys, delHeaderKeys, "property: header_keys of EDF file")
[docs] def getData(self): """ getter for edf Data @return: data for current frame @rtype: numpy.ndarray """ npaData = None try: npaData = self.__frames[self.currentframe].data except AttributeError: self.__frames = [Frame()] npaData = self.__frames[self.currentframe].data except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) npaData = self.__frames[self.currentframe].data return npaData
[docs] def setData(self, _data): """ Enforces the propagation of the data to the list of frames @param _data: numpy array representing data """ try: self.__frames[self.currentframe].data = _data except AttributeError: self.__frames = [Frame(data=_data)] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame(data=_data))
[docs] def delData(self): """ deleter for edf Data """ self.__frames[self.currentframe].data = None
data = property(getData, setData, delData, "property: data of EDF file")
[docs] def getCapsHeader(self): """ getter for edf headers keys in upper case @return: data for current frame @rtype: dict """ return self.__frames[self.currentframe].capsHeader
[docs] def setCapsHeader(self, _data): """ Enforces the propagation of the header_keys to the list of frames @param _data: numpy array representing data """ self.__frames[self.currentframe].capsHeader = _data
[docs] def delCapsHeader(self): """ deleter for edf capsHeader """ self.__frames[self.currentframe].capsHeader = {}
capsHeader = property(getCapsHeader, setCapsHeader, delCapsHeader, "property: capsHeader of EDF file, i.e. the keys of the header in UPPER case.")
[docs] def getDim1(self): return self.__frames[self.currentframe].dim1
[docs] def setDim1(self, _iVal): try: self.__frames[self.currentframe].dim1 = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].dim1 = _iVal
dim1 = property(getDim1, setDim1)
[docs] def getDim2(self): return self.__frames[self.currentframe].dim2
[docs] def setDim2(self, _iVal): try: self.__frames[self.currentframe].dim2 = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].dim2 = _iVal
dim2 = property(getDim2, setDim2)
[docs] def getDims(self): return self.__frames[self.currentframe].dims
dims = property(getDims)
[docs] def getByteCode(self): return self.__frames[self.currentframe].bytecode
[docs] def setByteCode(self, _iVal): try: self.__frames[self.currentframe].bytecode = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].bytecode = _iVal
bytecode = property(getByteCode, setByteCode)
[docs] def getBpp(self): return self.__frames[self.currentframe].bpp
[docs] def setBpp(self, _iVal): try: self.__frames[self.currentframe].bpp = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].bpp = _iVal
bpp = property(getBpp, setBpp)
fabio-0.1.3/doc/html/_modules/fabio/binaryimage.html0000644000175000017500000004577312233250022023143 0ustar jeromejerome00000000000000 fabio.binaryimage — FabIO 0.1.3 documentation

Source code for fabio.binaryimage

#!/usr/bin/env python
# coding: utf8

# Get ready for python3:
from __future__ import with_statement, print_function
__doc__ = """
Authors: Gael Goret, Jerome Kieffer, ESRF, France
Emails: gael.goret@esrf.fr, jerome.kieffer@esrf.fr
        Brian Richard Pauw <brian@stack.nl>

Binary files images are simple none-compressed 2D images only defined by their :
data-type, dimensions, byte order and offset

This simple library has been made for manipulating exotic/unknown files format.
"""

__authors__ = ["Gaël Goret", "Jérôme Kieffer", "Brian Pauw"]
__contact__ = "gael.goret@esrf.fr"
__license__ = "GPLv3+"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
__version__ = "17 Oct 2012"

from fabioimage import fabioimage
import numpy, logging
logger = logging.getLogger("binaryimage")

[docs]class binaryimage(fabioimage): """ This simple library has been made for manipulating exotic/unknown files format. Binary files images are simple none-compressed 2D images only defined by their : data-type, dimensions, byte order and offset if offset is set to a negative value, the image is read using the last data but n data in the file, skipping any header. """ def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs) @staticmethod
[docs] def swap_needed(endian): """ Decide if we need to byteswap """ if (endian == '<' and numpy.little_endian) or (endian == '>' and not numpy.little_endian): return False if (endian == '>' and numpy.little_endian) or (endian == '<' and not numpy.little_endian): return True
[docs] def read(self, fname, dim1, dim2, offset=0, bytecode="int32", endian="<"): """ Read a binary image @param fname: file name @type fname: string @param dim1: image dimensions (Fast index) @param dim2: image dimensions (Slow index) @param offset: starting position of the data-block. If negative, starts at the end. @param bytecode: can be "int8","int16","int32","int64","uint8","uint16","uint32","uint64","float32","float64",... @param endian: among short or long endian ("<" or ">") """ self.filename = fname self.dim1 = dim1 self.dim2 = dim2 self.bytecode = bytecode f = open(self.filename, "rb") dims = [dim2, dim1] bpp = len(numpy.array(0, bytecode).tostring()) size = dims[0] * dims[1] * bpp if offset >= 0: f.seek(offset) else: try: f.seek(-size + offset + 1, 2) #seek from EOF backwards except IOError: logging.warn('expected datablock too large, please check bytecode settings: {}'.format(bytecode)) except: logging.error('Uncommon error encountered when reading file') rawData = f.read(size) if self.swap_needed(endian): data = numpy.fromstring(rawData, bytecode).byteswap().reshape(tuple(dims)) else: data = numpy.fromstring(rawData, bytecode).reshape(tuple(dims)) self.data = data return self
[docs] def estimate_offset_value(self, fname, dim1, dim2, bytecode="int32"): "Estimates the size of a file" with open(fname, "rb") as f: bpp = len(numpy.array(0, bytecode).tostring()) size = dim1 * dim2 * bpp totsize = len(f.read()) logger.info('total size (bytes): %s', totsize) logger.info('expected data size given parameters (bytes): %s', size) logger.info('estimation of the offset value (bytes): %s', totsize - size)
[docs] def write(self, fname): with open(fname, mode="wb") as outfile: outfile.write(self.data.tostring())
fabio-0.1.3/doc/html/_modules/fabio/fabioimage.html0000644000175000017500000026602412233250022022731 0ustar jeromejerome00000000000000 fabio.fabioimage — FabIO 0.1.3 documentation

Source code for fabio.fabioimage

#!/usr/bin/env python

"""

Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:erik.knudsen@risoe.dk

         and Jon Wright, Jerome Kieffer: ESRF

"""
from __future__ import with_statement
import os, types, logging, sys, tempfile
logger = logging.getLogger("fabioimage")
import numpy
try:
    from PIL import Image
except ImportError:
    logger.warning("PIL is not installed ... trying to do without")
    Image = None
import fabioutils, converters


[docs]class fabioimage(object): """ A common object for images in fable Contains a numpy array (.data) and dict of meta data (.header) """ _need_a_seek_to_read = False _need_a_real_file = False def __init__(self, data=None , header=None): """ Set up initial values """ self._classname = None if type(data) in types.StringTypes: raise Exception("fabioimage.__init__ bad argument - " + \ "data should be numpy array") self.data = self.checkData(data) self.pilimage = None if header is None: self.header = {} else: self.header = self.checkHeader(header) self.header_keys = self.header.keys() # holds key ordering if self.data is not None: self.dim2, self.dim1 = self.data.shape else: self.dim1 = self.dim2 = 0 self.bytecode = None # numpy typecode self.bpp = 2 # bytes per pixel # cache for image statistics self.mean = self.maxval = self.stddev = self.minval = None # Cache roi self.roi = None self.area_sum = None self.slice = None # New for multiframe files self.nframes = 1 self.currentframe = 0 self.filename = None self.filenumber = None @staticmethod
[docs] def checkHeader(header=None): """ Empty for fabioimage but may be populated by others classes """ if header is None: return {} else: return header
@staticmethod
[docs] def checkData(data=None): """ Empty for fabioimage but may be populated by others classes, especially for format accepting only integers """ return data
[docs] def getclassname(self): """ Retrieves the name of the class @return: the name of the class """ if self._classname is None: self._classname = str(self.__class__).replace("<class '", "").replace("'>", "").split(".")[-1] return self._classname
classname = property(getclassname)
[docs] def getframe(self, num): """ returns the file numbered 'num' in the series as a fabioimage """ if self.nframes == 1: # single image per file import openimage return openimage.openimage( fabioutils.jump_filename(self.filename, num)) raise Exception("getframe out of range")
[docs] def previous(self): """ returns the previous file in the series as a fabioimage """ import openimage return openimage.openimage( fabioutils.previous_filename(self.filename))
[docs] def next(self): """ returns the next file in the series as a fabioimage """ import openimage return openimage.openimage( fabioutils.next_filename(self.filename))
[docs] def toPIL16(self, filename=None): """ Convert to Python Imaging Library 16 bit greyscale image FIXME - this should be handled by the libraries now """ if not Image: raise RuntimeError("PIL is not installed !!! ") if filename: self.read(filename) if self.pilimage is not None: return self.pilimage # mode map size = self.data.shape[:2][::-1] typmap = { 'float32' : "F" , 'int32' : "F;32S" , 'uint32' : "F;32" , 'int16' : "F;16S" , 'uint16' : "F;16" , 'int8' : "F;8S" , 'uint8' : "F;8" } if typmap.has_key(self.data.dtype.name): mode2 = typmap[ self.data.dtype.name ] mode1 = mode2[0] else: raise Exception("Unknown numpy type " + str(self.data.dtype.type)) # # hack for byteswapping for PIL in MacOS testval = numpy.array((1, 0), numpy.uint8).view(numpy.uint16)[0] if testval == 1: dats = self.data.tostring() elif testval == 256: dats = self.data.byteswap().tostring() else: raise Exception("Endian unknown in fabioimage.toPIL16") self.pilimage = Image.frombuffer(mode1, size, dats, "raw", mode2, 0, 1) return self.pilimage
[docs] def getheader(self): """ returns self.header """ return self.header
[docs] def getmax(self): """ Find max value in self.data, caching for the future """ if self.maxval is None: self.maxval = self.data.max() return self.maxval
[docs] def getmin(self): """ Find min value in self.data, caching for the future """ if self.minval is None: self.minval = self.data.min() return self.minval
[docs] def make_slice(self, coords): """ Convert a len(4) set of coords into a len(2) tuple (pair) of slice objects the latter are immutable, meaning the roi can be cached """ assert len(coords) == 4 if len(coords) == 4: # fabian edfimage preference if coords[0] > coords[2]: coords[0:3:2] = [coords[2], coords[0]] if coords[1] > coords[3]: coords[1:4:2] = [coords[3], coords[1]] #in fabian: normally coordinates are given as (x,y) whereas # a matrix is given as row,col # also the (for whichever reason) the image is flipped upside # down wrt to the matrix hence these tranformations fixme = (self.dim2 - coords[3] - 1, coords[0] , self.dim2 - coords[1] - 1, coords[2]) return (slice(int(fixme[0]), int(fixme[2]) + 1) , slice(int(fixme[1]), int(fixme[3]) + 1))
[docs] def integrate_area(self, coords): """ Sums up a region of interest if len(coords) == 4 -> convert coords to slices if len(coords) == 2 -> use as slices floor -> ? removed as unused in the function. """ if self.data == None: # This should return NAN, not zero ? return 0 if len(coords) == 4: sli = self.make_slice(coords) elif len(coords) == 2 and isinstance(coords[0], slice) and \ isinstance(coords[1], slice): sli = coords if sli == self.slice and self.area_sum is not None: pass elif sli == self.slice and self.roi is not None: self.area_sum = self.roi.sum(dtype=numpy.float) else: self.slice = sli self.roi = self.data[ self.slice ] self.area_sum = self.roi.sum(dtype=numpy.float) return self.area_sum
[docs] def getmean(self): """ return the mean """ if self.mean is None: self.mean = self.data.mean(dtype=numpy.double) return self.mean
[docs] def getstddev(self): """ return the standard deviation """ if self.stddev == None: self.stddev = self.data.std(dtype=numpy.double) return self.stddev
[docs] def add(self, other): """ Add another Image - warning, does not clip to 16 bit images by default """ if not hasattr(other, 'data'): logger.warning('edfimage.add() called with something that ' + \ 'does not have a data field') assert self.data.shape == other.data.shape , \ 'incompatible images - Do they have the same size?' self.data = self.data + other.data self.resetvals()
[docs] def resetvals(self): """ Reset cache - call on changing data """ self.mean = self.stddev = self.maxval = self.minval = None self.roi = self.slice = self.area_sum = None
[docs] def rebin(self, x_rebin_fact, y_rebin_fact, keep_I=True): """ Rebin the data and adjust dims @param x_rebin_fact: x binning factor @param y_rebin_fact: y binning factor @param keep_I: shall the signal increase ? @type x_rebin_fact: int @type y_rebin_fact: int @type keep_I: boolean """ if self.data == None: raise Exception('Please read in the file you wish to rebin first') if (self.dim1 % x_rebin_fact != 0) or (self.dim2 % y_rebin_fact != 0): raise RuntimeError('image size is not divisible by rebin factor - ' + \ 'skipping rebin') else: dataIn = self.data.astype("float64") shapeIn = self.data.shape shapeOut = (shapeIn[0] / y_rebin_fact, shapeIn[1] / x_rebin_fact) binsize = y_rebin_fact * x_rebin_fact if binsize < 50: #method faster for small binning (4x4) out = numpy.zeros(shapeOut, dtype="float64") for j in range(x_rebin_fact): for i in range(y_rebin_fact): out += dataIn[i::y_rebin_fact, j::x_rebin_fact] else: #method faster for large binning (8x8) temp = self.data.astype("float64") temp.shape = (shapeOut[0], y_rebin_fact, shapeOut[1], x_rebin_fact) out = temp.sum(axis=3).sum(axis=1) self.resetvals() if keep_I: self.data = (out / (y_rebin_fact * x_rebin_fact)).astype(self.data.dtype) else: self.data = out.astype(self.data.dtype) self.dim1 = self.dim1 / x_rebin_fact self.dim2 = self.dim2 / y_rebin_fact #update header self.update_header()
[docs] def write(self, fname): """ To be overwritten - write the file """ raise Exception("Class has not implemented readheader method yet")
[docs] def save(self, fname): 'wrapper for write' self.write(fname)
[docs] def readheader(self, filename): """ Call the _readheader function... """ # Override the needs asserting that all headers can be read via python modules save_state = self._need_a_real_file , self._need_a_seek_to_read self._need_a_real_file , self._need_a_seek_to_read = False, False fin = self._open(filename) self._readheader(fin) fin.close() self._need_a_real_file , self._need_a_seek_to_read = save_state
def _readheader(self, fik_obj): """ Must be overridden in classes """ raise Exception("Class has not implemented _readheader method yet")
[docs] def update_header(self , **kwds): """ update the header entries by default pass in a dict of key, values. """ self.header.update(kwds)
[docs] def read(self, filename, frame=None): """ To be overridden - fill in self.header and self.data """ raise Exception("Class has not implemented read method yet") # return self
[docs] def load(self, *arg, **kwarg): "Wrapper for read" return self.read(*arg, **kwarg)
[docs] def readROI(self, filename, frame=None, coords=None): """ Method reading Region of Interest. This implementation is the trivial one, just doing read and crop """ self.read(filename, frame) if len(coords) == 4: self.slice = self.make_slice(coords) elif len(coords) == 2 and isinstance(coords[0], slice) and \ isinstance(coords[1], slice): self.slice = coords else: logger.warning('readROI: Unable to understand Region Of Interest: got %s', coords) self.roi = self.data[ self.slice ] return self.roi
def _open(self, fname, mode="rb"): """ Try to handle compressed files, streams, shared memory etc Return an object which can be used for "read" and "write" ... FIXME - what about seek ? """ fileObject = None self.filename = fname self.filenumber = fabioutils.extract_filenumber(fname) if hasattr(fname, "read") and hasattr(fname, "write"): # It is already something we can use return fname if isinstance(fname, (str, unicode)): self.header["filename"] = fname if os.path.splitext(fname)[1] == ".gz": fileObject = self._compressed_stream(fname, fabioutils.COMPRESSORS['.gz'], fabioutils.GzipFile, mode) elif os.path.splitext(fname)[1] == '.bz2': fileObject = self._compressed_stream(fname, fabioutils.COMPRESSORS['.bz2'], fabioutils.BZ2File, mode) # # Here we return the file even though it may be bzipped or gzipped # but named incorrectly... # # FIXME - should we fix that or complain about the daft naming? else: fileObject = fabioutils.File(fname, mode) if "name" not in dir(fileObject): fileObject.name = fname return fileObject def _compressed_stream(self, fname, system_uncompress, python_uncompress, mode='rb'): """ Try to transparently handle gzip / bzip without always getting python performance """ # assert that python modules are always OK based on performance benchmark # Try to fix the way we are using them? fobj = None if self._need_a_real_file and mode[0] == "r": fo = python_uncompress(fname, mode) # fobj = os.tmpfile() #problem when not administrator under certain flavors of windows tmpfd, tmpfn = tempfile.mkstemp() os.close(tmpfd) fobj = fabioutils.File(tmpfn, "w+b") fobj.write(fo.read()) fo.close() fobj.seek(0) elif self._need_a_seek_to_read and mode[0] == "r": fo = python_uncompress(fname, mode) fobj = fabioutils.StringIO(fo.read(), fname, mode) else: fobj = python_uncompress(fname, mode) return fobj
[docs] def convert(self, dest): """ Convert a fabioimage object into another fabioimage object (with possible conversions) @param dest: destination type "EDF", "edfimage" or the class itself """ if type(dest) in types.StringTypes: dest = dest.lower() modules = [] for val in fabioutils.FILETYPES.values(): modules += [i + "image" for i in val if i not in modules] klass = None module = None klass_name = None for klass_name in modules: if klass_name.startswith(dest): try: module = sys.modules["fabio." + klass_name] except KeyError: try: module = __import__(klass_name) except: logger.error("Failed to import %s", klass_name) else: logger.debug("imported %simage", klass_name) if module is not None: break if module is not None: if hasattr(module, klass_name): klass = getattr(module, klass_name) else: logger.error("Module %s has no image class" % module) elif isinstance(dest, self.__class__): klass = dest.__class__ elif ("__new__" in dir(dest)) and isinstance(dest(), fabioimage): klass = dest else: logger.warning("Unrecognized destination format: %s " % dest) return self if klass is None: logger.warning("Unrecognized destination format: %s " % dest) return self other = klass() #temporary instance (to be overwritten) other = klass(data=converters.convert_data(self.classname, other.classname, self.data), header=converters.convert_header(self.classname, other.classname, self.header)) return other
[docs]def test(): """ check some basic fabioimage functionality """ import time start = time.time() dat = numpy.ones((1024, 1024), numpy.uint16) dat = (dat * 50000).astype(numpy.uint16) assert dat.dtype.char == numpy.ones((1), numpy.uint16).dtype.char hed = {"Title":"50000 everywhere"} obj = fabioimage(dat, hed) assert obj.getmax() == 50000 assert obj.getmin() == 50000 assert obj.getmean() == 50000 , obj.getmean() assert obj.getstddev() == 0. dat2 = numpy.zeros((1024, 1024), numpy.uint16, savespace=1) cord = [ 256, 256, 790, 768 ] slic = obj.make_slice(cord) dat2[slic] = dat2[slic] + 100 obj = fabioimage(dat2, hed) # New object, so... assert obj.maxval is None assert obj.minval is None assert obj.getmax() == 100, obj.getmax() assert obj.getmin() == 0 , obj.getmin() npix = (slic[0].stop - slic[0].start) * (slic[1].stop - slic[1].start) obj.resetvals() area1 = obj.integrate_area(cord) obj.resetvals() area2 = obj.integrate_area(slic) assert area1 == area2 assert obj.integrate_area(cord) == obj.integrate_area(slic) assert obj.integrate_area(cord) == npix * 100, obj.integrate_area(cord) def clean(): """ clean up the created testfiles""" for name in ["testfile", "testfile.gz", "testfile.bz2"]: try: os.remove(name) except: continue clean() import gzip, bz2 gzip.open("testfile.gz", "wb").write("{ hello }") fout = obj._open("testfile.gz") readin = fout.read() assert readin == "{ hello }", readin + " gzipped file" bz2.BZ2File("testfilebz", "wb").write("{ hello }") fout = obj._open("testfile.bz2") readin = fout.read() assert readin == "{ hello }", readin + " bzipped file" ftest = open("testfile", "wb") ftest.write("{ hello }") assert ftest == obj._open(ftest) ftest.close() fout = obj._open("testfile") readin = fout.read() assert readin == "{ hello }", readin + "plain file" fout.close() ftest.close() clean() print "Passed in", time.time() - start, "s"
if __name__ == '__main__': test()
fabio-0.1.3/doc/html/_modules/fabio/dm3image.html0000644000175000017500000013424312233250022022331 0ustar jeromejerome00000000000000 fabio.dm3image — FabIO 0.1.3 documentation

Source code for fabio.dm3image

"""
Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:erik.knudsen@risoe.dk

        + Jon Wright, ESRF
"""
import logging
import numpy
from fabioimage import fabioimage
logger = logging.getLogger("dm3image")

DATA_TYPES = {  2     :  numpy.int16,
                4     :  numpy.uint16,
                3     :  numpy.int32,
                5     :  numpy.uint32,
                6     :  numpy.float32,
                7     :  numpy.float,
                8     :  numpy.int8,
                9     :  None,
                10    :  None,
                15    :  'Struct',
                18    :  None,
                20    :  None
                }

DATA_BYTES = {  2     :  2,
                4     :  2,
                3     :  4,
                5     :  4,
                6     :  4,
                7     :  8,
                8     :  1,
                9     :  None,
                10    :  None,
                15    :  'Struct',
                18    :  None,
                20    :  None
                }



[docs]class dm3image(fabioimage): """ Read and try to write the dm3 data format """ def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs) self.encoded_datatype = None self.no_data_elements = None self.grouptag_is_sorted = None self.grouptag_is_open = None self.tag_encoded_type = None self.tag_data_type = None self.tag_is_data = None self.grouptag_no_tags = None self.bytes_in_file = None self.tag_label_length = None self.go_on = None def _readheader(self): self.infile.seek(0) file_format = self.readbytes(4, numpy.uint32)[0] # should be 3 assert file_format == 3, 'Wrong file type ' self.bytes_in_file = self.readbytes(4, numpy.uint32)[0] self.byte_order = self.readbytes(4, numpy.uint32)[0] # 0 = big, 1= little print 'read dm3 file - file format ', file_format print 'Bytes in file : ' , self.bytes_in_file print 'Byte order :', self.byte_order, ' - 0 = bigEndian , 1 = littleEndian' if self.byte_order == 0: self.swap = True elif self.byte_order == 1: self.swap = False else: raise ValueError
[docs] def read(self, fname, frame=None): self.header = {} self.resetvals() self.infile = self._open(fname, "rb") self._readheader() self.go_on = True print self.go_on while self.go_on: self.read_tag_group() self.read_tag_entry() if self.infile.tell() > self.bytes_in_file: break while self.tag_is_data == 21: self.read_tag_entry() if self.infile.tell() > self.bytes_in_file: self.go_on = False (dim1_raw, dim2_raw) = self.header['Active Size (pixels)'].split() (dim1_raw, dim2_raw) = (eval(dim1_raw), eval(dim2_raw)) (dim1_binning, dim2_binning) = self.header['Binning'].split() (dim1_binning, dim2_binning) = (eval(dim1_binning), eval(dim2_binning)) self.dim1 = dim1_raw / dim1_binning self.dim2 = dim2_raw / dim2_binning #print dim1,dim2 if self.header.has_key('Data'): self.data = self.header['Data'].reshape(self.dim1, self.dim2)
[docs] def readbytes(self, bytes_to_read, format, swap=True): raw = self.infile.read(bytes_to_read) if format != None: data = numpy.fromstring(raw, format) else: data = raw if swap: data = data.byteswap() return data
[docs] def read_tag_group(self): self.grouptag_is_sorted = self.readbytes(1, numpy.uint8)[0] self.grouptag_is_open = self.readbytes(1, numpy.uint8)[0] self.grouptag_no_tags = self.readbytes(4, numpy.uint32)[0] logger.debug('TagGroup is sorted? %s', self.grouptag_is_sorted) logger.debug('TagGroup is open? %s', self.grouptag_is_open) logger.debug('no of tags in TagGroup %s', self.grouptag_no_tags)
[docs] def read_tag_entry(self): self.tag_is_data = self.readbytes(1, numpy.uint8)[0] self.tag_label_length = self.readbytes(2, numpy.uint16)[0] logger.debug('does Tag have data ? %s - 20 = Tag group , 21 = data ', self.tag_is_data) logger.debug('length of tag_label ', self.tag_label_length) if self.tag_label_length != 0: tag_label = self.infile.read(self.tag_label_length) else: tag_label = None if self.tag_is_data == 21: # This is data self.header[tag_label] = self.read_tag_type() logger.debug("%s: %s", tag_label, self.header[tag_label])
[docs] def read_tag_type(self): if self.infile.read(4) != '%%%%': raise IOError self.tag_data_type = self.readbytes(4, numpy.uint32)[0] logger.debug('data is of type : %s - 1 = simple, 2= string, 3 = array, >3 structs', self.tag_data_type) self.tag_encoded_type = self.readbytes(4, numpy.uint32)[0] logger.debug('encode type: %s %s', self.tag_encoded_type, DATA_TYPES[ self.tag_encoded_type]) if self.tag_data_type == 1: # simple type return self.readbytes(DATA_BYTES[ self.tag_encoded_type], DATA_TYPES[ self.tag_encoded_type], swap=self.swap)[0] # are the data stored in a simple array? if self.tag_encoded_type == 20 and self.tag_data_type == 3 : self.data_type = self.readbytes(4, numpy.uint32)[0] self.no_data_elements = self.readbytes(4, numpy.uint32)[0] if self.data_type == 10: logger.debug('skip bytes %s', self.no_data_elements) dump = self.infile.read(self.no_data_elements) return None logger.debug('Data are stored as a simple a array -') logger.debug('%s data elemets stored as %s', self.no_data_elements, self.data_type) read_no_bytes = DATA_BYTES[self.data_type] * self.no_data_elements format = DATA_TYPES[self.data_type] return self.readbytes(read_no_bytes, format, swap=self.swap) # are the data stored in a complex array ? # print 'tag_type + data_type', self.tag_encoded_type,self.tag_data_type #print self.tag_encoded_type , self.tag_data_type if self.tag_encoded_type == 20 and self.tag_data_type > 3 : self.tag_encoded_type = self.readbytes(4, numpy.uint32)[0] logger.debug('found array - new tag_encoded_type %s', self.tag_encoded_type) if self.tag_encoded_type == 15: # struct type ###type = self.readbytes(4,numpy.int32) struct_name_length = self.readbytes(4, numpy.int32)[0] struct_number_fields = self.readbytes(4, numpy.int32)[0] #print 'struct - name_length, number_field', struct_name_length,struct_number_fields #print self.infile.read(struct_name_length) field_info = [] for i in range(struct_number_fields): field_info.append([self.readbytes(4, numpy.int32)[0], self.readbytes(4, numpy.int32)[0]]) #print field_info self.no_data_elements = self.readbytes(4, numpy.int32)[0] #print '%i data elemets stored as ' %self.no_data_elements bytes_in_struct = 0 for i in range(struct_number_fields): bytes_in_struct += DATA_BYTES[field_info[i][1]] logger.debug('skip bytes %s', self.no_data_elements * bytes_in_struct) dump = self.infile.read(self.no_data_elements * bytes_in_struct) return None if self.tag_encoded_type == 15: # struct type ###type = self.readbytes(4,numpy.int32) struct_name_length = self.readbytes(4, numpy.int32)[0] struct_number_fields = self.readbytes(4, numpy.int32)[0] #print 'struct - name_length, number_field', struct_name_length,struct_number_fields #print self.infile.read(struct_name_length) field_info = [] for i in range(struct_number_fields): field_info.append([self.readbytes(4, numpy.int32)[0], self.readbytes(4, numpy.int32)[0]]) #print field_info field_data = '' for i in range(struct_number_fields): #print type(i) field_data = field_data + self.readbytes(field_info[i][0], None, swap=False) + ' ' field_data = field_data + '%i ' % self.readbytes(DATA_BYTES[field_info[i][1]], DATA_TYPES[field_info[i][1]], swap=self.swap)[0] return field_data
[docs] def read_data(self): self.encoded_datatype = numpy.fromstring(self.infile.read(4), numpy.uint32).byteswap()
fabio-0.1.3/doc/html/_modules/fabio/readbytestream.html0000644000175000017500000003267312233250022023662 0ustar jeromejerome00000000000000 fabio.readbytestream — FabIO 0.1.3 documentation

Source code for fabio.readbytestream

#!/usr/bin/env python
#coding: utf8

"""
Reads a bytestream

Authors: Jon Wright    Henning O. Sorensen & Erik Knudsen
         ESRF          Risoe National Laboratory
"""

import numpy, logging
logger = logging.getLogger("readbytestream")
DATATYPES = {
    # type  sign bytes
    ("int", 'n', 1) : numpy.uint8,
    ("int", 'n', 2) : numpy.uint16,
    ("int", 'n', 4) : numpy.uint32,
    ("int", 'y', 1) : numpy.int8,
    ("int", 'y', 2) : numpy.int16,
    ("int", 'y', 4) : numpy.int32,
    ('float', 'y', 4) : numpy.float32, # does this occur in bruker?
    ('double', 'y', 4): numpy.float64
    }


[docs]def readbytestream(fil, offset, x, y, nbytespp, datatype='int', signed='n', swap='n', typeout=numpy.uint16): """ Reads in a bytestream from a file (which may be a string indicating a filename, or an already opened file (should be "rb")) offset is the position (in bytes) where the pixel data start nbytespp = number of bytes per pixel type can be int or float (4 bytes pp) or double (8 bytes pp) signed: normally signed data 'y', but 'n' to try to get back the right numbers when unsigned data are converted to signed (python once had no unsigned numeric types.) swap, normally do not bother, but 'y' to swap bytes typeout is the numpy type to output, normally uint16, but more if overflows occurred x and y are the pixel dimensions TODO : Read in regions of interest PLEASE LEAVE THE STRANGE INTERFACE ALONE - IT IS USEFUL FOR THE BRUKER FORMAT """ tin = "dunno" length = nbytespp * x * y # bytes per pixel times number of pixels if datatype in ['float', 'double']: signed = 'y' key = (datatype, signed, nbytespp) try: tin = DATATYPES[key] except: logging.warning("datatype,signed,nbytespp " + str(key)) raise Exception("Unknown combination of types to readbytestream") # Did we get a string (filename) or a readable stream object? if hasattr(fil, "read") and hasattr(fil, "seek"): infile = fil opened = False else: infile = open(fil, 'rb') opened = True infile.seek(offset) arr = numpy.array(numpy.reshape( numpy.fromstring( infile.read(length), tin) , (x, y)), typeout) if swap == 'y': arr = arr.byteswap() if opened: infile.close() return arr
fabio-0.1.3/doc/html/_modules/fabio/OXDimage.html0000644000175000017500000035611612233250022022305 0ustar jeromejerome00000000000000 fabio.OXDimage — FabIO 0.1.3 documentation

Source code for fabio.OXDimage

#!/usr/bin/env python
#coding: utf8

from __future__ import with_statement
__doc__ = """
Reads Oxford Diffraction Sapphire 3 images

Authors:
........
* Henning O. Sorensen & Erik Knudsen:
  Center for Fundamental Research: Metal Structures in Four Dimensions;
  Risoe National Laboratory;
  Frederiksborgvej 399;
  DK-4000 Roskilde;
  email:erik.knudsen@risoe.dk
* Jon Wright, Jérôme Kieffer & Gaël Goret:
  European Synchrotron Radiation Facility;
  Grenoble (France)

"""

import time, logging, struct
logger = logging.getLogger("OXDimage")
import numpy
from fabioimage import fabioimage
from compression import decTY1, compTY1

try:
    from numpy import rad2deg, deg2rad
except ImportError: #naive implementation for very old numpy (v1.0.1 on MacOSX from Risoe)
    rad2deg = lambda x: 180.0 * x / numpy.pi
    deg2rad = lambda x: x * numpy.pi / 180.

DETECTOR_TYPES = {0: 'Sapphire/KM4CCD (1x1: 0.06mm, 2x2: 0.12mm)',
1: 'Sapphire2-Kodak (1x1: 0.06mm, 2x2: 0.12mm)',
2: 'Sapphire3-Kodak (1x1: 0.03mm, 2x2: 0.06mm, 4x4: 0.12mm)',
3: 'Onyx-Kodak (1x1: 0.06mm, 2x2: 0.12mm, 4x4: 0.24mm)',
4: 'Unknown Oxford diffraction detector'}

DEFAULT_HEADERS = {'Header Version':  'OD SAPPHIRE  3.0',
                   'Compression': "TY1",
                   'Header Size In Bytes': 5120,
                   "ASCII Section size in Byte": 256,
                   "General Section size in Byte": 512,
                   "Special Section size in Byte": 768,
                   "KM4 Section size in Byte": 1024,
                   "Statistic Section in Byte": 512,
                   "History Section in Byte": 2048,
                   'NSUPPLEMENT':0
                   }

[docs]class OXDimage(fabioimage): """ Oxford Diffraction Sapphire 3 images reader/writer class """ def _readheader(self, infile): infile.seek(0) # Ascii header part 256 byes long self.header['Header Version'] = infile.readline()[:-2] block = infile.readline() self.header['Compression'] = block[12:15] block = infile.readline() self.header['NX'] = int(block[3:7]) self.header['NY'] = int(block[11:15]) self.header['OI'] = int(block[19:26]) self.header['OL'] = int(block[30:37]) block = infile.readline() self.header['Header Size In Bytes'] = int(block[8:15]) self.header['General Section size in Byte'] = int(block[19:26]) self.header['Special Section size in Byte'] = int(block[30:37]) self.header['KM4 Section size in Byte'] = int(block[41:48]) self.header['Statistic Section in Byte'] = int(block[52:59]) self.header['History Section in Byte'] = int(block[63:]) block = infile.readline() self.header['NSUPPLEMENT'] = int(block[12:19]) block = infile.readline() self.header['Time'] = block[5:29] self.header["ASCII Section size in Byte"] = self.header['Header Size In Bytes']\ - self.header['General Section size in Byte']\ - self.header['Special Section size in Byte'] \ - self.header['KM4 Section size in Byte']\ - self.header['Statistic Section in Byte']\ - self.header['History Section in Byte']\ # Skip to general section (NG) 512 byes long <<<<<<" infile.seek(self.header["ASCII Section size in Byte"]) block = infile.read(self.header['General Section size in Byte']) self.header['Binning in x'] = numpy.fromstring(block[0:2], numpy.uint16)[0] self.header['Binning in y'] = numpy.fromstring(block[2:4], numpy.uint16)[0] self.header['Detector size x'] = numpy.fromstring(block[22:24], numpy.uint16)[0] self.header['Detector size y'] = numpy.fromstring(block[24:26], numpy.uint16)[0] self.header['Pixels in x'] = numpy.fromstring(block[26:28], numpy.uint16)[0] self.header['Pixels in y'] = numpy.fromstring(block[28:30], numpy.uint16)[0] self.header['No of pixels'] = numpy.fromstring(block[36:40], numpy.uint32)[0] # Speciel section (NS) 768 bytes long block = infile.read(self.header['Special Section size in Byte']) self.header['Gain'] = numpy.fromstring(block[56:64], numpy.float)[0] self.header['Overflows flag'] = numpy.fromstring(block[464:466], numpy.int16)[0] self.header['Overflow after remeasure flag'] = numpy.fromstring(block[466:468], numpy.int16)[0] self.header['Overflow threshold'] = numpy.fromstring(block[472:476], numpy.int32)[0] self.header['Exposure time in sec'] = numpy.fromstring(block[480:488], numpy.float)[0] self.header['Overflow time in sec'] = numpy.fromstring(block[488:496], numpy.float)[0] self.header['Monitor counts of raw image 1'] = numpy.fromstring(block[528:532], numpy.int32)[0] self.header['Monitor counts of raw image 2'] = numpy.fromstring(block[532:536], numpy.int32)[0] self.header['Monitor counts of overflow raw image 1'] = numpy.fromstring(block[536:540], numpy.int32)[0] self.header['Monitor counts of overflow raw image 2'] = numpy.fromstring(block[540:544], numpy.int32)[0] self.header['Unwarping'] = numpy.fromstring(block[544:548], numpy.int32)[0] self.header['Detector type'] = DETECTOR_TYPES[numpy.fromstring(block[548:552], numpy.int32)[0]] self.header['Real pixel size x (mm)'] = numpy.fromstring(block[568:576], numpy.float)[0] self.header['Real pixel size y (mm)'] = numpy.fromstring(block[576:584], numpy.float)[0] # KM4 goniometer section (NK) 1024 bytes long block = infile.read(self.header['KM4 Section size in Byte']) # Spatial correction file self.header['Spatial correction file'] = block[26:272].strip("\x00") self.header['Spatial correction file date'] = block[0:26].strip("\x00") # Angles are in steps due to stepper motors - conversion factor RAD # angle[0] = omega, angle[1] = theta, angle[2] = kappa, angle[3] = phi, start_angles_step = numpy.fromstring(block[284:304], numpy.int32) end_angles_step = numpy.fromstring(block[324:344], numpy.int32) step2rad = numpy.fromstring(block[368:408], numpy.float) step_angles_deg = rad2deg(step2rad) # calc angles start_angles_deg = start_angles_step * step_angles_deg end_angles_deg = end_angles_step * step_angles_deg self.header['Omega start in deg'] = start_angles_deg[0] self.header['Theta start in deg'] = start_angles_deg[1] self.header['Kappa start in deg'] = start_angles_deg[2] self.header['Phi start in deg'] = start_angles_deg[3] self.header['Omega end in deg'] = end_angles_deg[0] self.header['Theta end in deg'] = end_angles_deg[1] self.header['Kappa end in deg'] = end_angles_deg[2] self.header['Phi end in deg'] = end_angles_deg[3] self.header['Omega step in deg'] = step_angles_deg[0] self.header['Theta step in deg'] = step_angles_deg[1] self.header['Kappa step in deg'] = step_angles_deg[2] self.header['Phi step in deg'] = step_angles_deg[3] zero_correction_soft_step = numpy.fromstring(block[512:532], numpy.int32) zero_correction_soft_deg = zero_correction_soft_step * step_angles_deg self.header['Omega zero corr. in deg'] = zero_correction_soft_deg[0] self.header['Theta zero corr. in deg'] = zero_correction_soft_deg[1] self.header['Kappa zero corr. in deg'] = zero_correction_soft_deg[2] self.header['Phi zero corr. in deg'] = zero_correction_soft_deg[3] # Beam rotation about e2,e3 self.header['Beam rot in deg (e2)'] = numpy.fromstring(block[552:560], numpy.float)[0] self.header['Beam rot in deg (e3)'] = numpy.fromstring(block[560:568], numpy.float)[0] # Wavelenghts alpha1, alpha2, beta self.header['Wavelength alpha1'] = numpy.fromstring(block[568:576], numpy.float)[0] self.header['Wavelength alpha2'] = numpy.fromstring(block[576:584], numpy.float)[0] self.header['Wavelength alpha'] = numpy.fromstring(block[584:592], numpy.float)[0] self.header['Wavelength beta'] = numpy.fromstring(block[592:600], numpy.float)[0] # Detector tilts around e1,e2,e3 in deg self.header['Detector tilt e1 in deg'] = numpy.fromstring(block[640:648], numpy.float)[0] self.header['Detector tilt e2 in deg'] = numpy.fromstring(block[648:656], numpy.float)[0] self.header['Detector tilt e3 in deg'] = numpy.fromstring(block[656:664], numpy.float)[0] # Beam center self.header['Beam center x'] = numpy.fromstring(block[664:672], numpy.float)[0] self.header['Beam center y'] = numpy.fromstring(block[672:680], numpy.float)[0] # Angle (alpha) between kappa rotation axis and e3 (ideally 50 deg) self.header['Alpha angle in deg'] = numpy.fromstring(block[672:680], numpy.float)[0] # Angle (beta) between phi rotation axis and e3 (ideally 0 deg) self.header['Beta angle in deg'] = numpy.fromstring(block[672:680], numpy.float)[0] # Detector distance self.header['Distance in mm'] = numpy.fromstring(block[712:720], numpy.float)[0] # Statistics section (NS) 512 bytes long block = infile.read(self.header['Statistic Section in Byte']) self.header['Stat: Min '] = numpy.fromstring(block[0:4], numpy.int32)[0] self.header['Stat: Max '] = numpy.fromstring(block[4:8], numpy.int32)[0] self.header['Stat: Average '] = numpy.fromstring(block[24:32], numpy.float)[0] self.header['Stat: Stddev '] = numpy.sqrt(numpy.fromstring(block[32:40], numpy.float)[0]) self.header['Stat: Skewness '] = numpy.fromstring(block[40:48], numpy.float)[0] # History section (NH) 2048 bytes long block = infile.read(self.header['History Section in Byte']) self.header['Flood field image'] = block[99:126].strip("\x00")
[docs] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname) self._readheader(infile) infile.seek(self.header['Header Size In Bytes']) # Compute image size try: self.dim1 = int(self.header['NX']) self.dim2 = int(self.header['NY']) except: raise Exception("Oxford file", str(fname) + \ "is corrupt, cannot read it") # if self.header['Compression'] == 'TY1': #Compressed with the KM4CCD compression raw8 = infile.read(self.dim1 * self.dim2) raw16 = None raw32 = None if self.header['OI'] > 0: raw16 = infile.read(self.header['OI'] * 2) if self.header['OL'] > 0: raw32 = infile.read(self.header['OL'] * 4) #DEBUG stuff ... self.raw8 = raw8 self.raw16 = raw16 self.raw32 = raw32 #END DEBUG block = decTY1(raw8, raw16, raw32) bytecode = block.dtype else: bytecode = numpy.int32 self.bpp = len(numpy.array(0, bytecode).tostring()) ReadBytes = self.dim1 * self.dim2 * self.bpp block = numpy.fromstring(infile.read(ReadBytes), bytecode) logger.debug('OVER_SHORT2: %s', block.dtype) logger.debug("%s" % (block < 0).sum()) infile.close() logger.debug("BYTECODE: %s", bytecode) self.data = block.reshape((self.dim2, self.dim1)) self.bytecode = self.data.dtype.type self.pilimage = None return self
def _writeheader(self): """ @return a string containing the header for Oxford images """ linesep = "\r\n" for key in DEFAULT_HEADERS: if key not in self.header_keys: self.header_keys.append(key) self.header[key] = DEFAULT_HEADERS[key] if "NX" not in self.header.keys() or "NY" not in self.header.keys(): self.header['NX'] = self.dim1 self.header['NY'] = self.dim2 ascii_headers = [self.header['Header Version'], "COMPRESSION=%s (%5.1f)" % (self.header["Compression"], self.getCompressionRatio()), "NX=%4i NY=%4i OI=%7i OL=%7i " % (self.header["NX"], self.header["NY"], self.header["OI"], self.header["OL"]), "NHEADER=%7i NG=%7i NS=%7i NK=%7i NS=%7i NH=%7i" % (self.header['Header Size In Bytes'], self.header['General Section size in Byte'], self.header['Special Section size in Byte'], self.header['KM4 Section size in Byte'], self.header['Statistic Section in Byte'], self.header['History Section in Byte']), "NSUPPLEMENT=%7i" % (self.header["NSUPPLEMENT"])] if "Time" in self.header: ascii_headers.append("TIME=%s" % self.header["Time"]) else: ascii_headers.append("TIME=%s" % time.ctime()) header = (linesep.join(ascii_headers)).ljust(256) NG = Section(self.header['General Section size in Byte'], self.header) NG.setData('Binning in x', 0, numpy.uint16) NG.setData('Binning in y', 2, numpy.uint16) NG.setData('Detector size x', 22, numpy.uint16) NG.setData('Detector size y', 24, numpy.uint16) NG.setData('Pixels in x', 26, numpy.uint16) NG.setData('Pixels in y', 28, numpy.uint16) NG.setData('No of pixels', 36, numpy.uint32) header += NG.__repr__() NS = Section(self.header['Special Section size in Byte'], self.header) NS.setData('Gain', 56, numpy.float) NS.setData('Overflows flag', 464, numpy.int16) NS.setData('Overflow after remeasure flag', 466, numpy.int16) NS.setData('Overflow threshold', 472, numpy.int32) NS.setData('Exposure time in sec', 480, numpy.float) NS.setData('Overflow time in sec', 488, numpy.float) NS.setData('Monitor counts of raw image 1', 528, numpy.int32) NS.setData('Monitor counts of raw image 2', 532, numpy.int32) NS.setData('Monitor counts of overflow raw image 1', 536, numpy.int32) NS.setData('Monitor counts of overflow raw image 2', 540, numpy.int32) NS.setData('Unwarping', 544, numpy.int32) if 'Detector type' in self.header: for key, value in DETECTOR_TYPES.items(): if value == self.header['Detector type']: NS.setData(None, 548, numpy.int32, default=key) NS.setData('Real pixel size x (mm)', 568, numpy.float) NS.setData('Real pixel size y (mm)', 576, numpy.float) header += NS.__repr__() KM = Section(self.header['KM4 Section size in Byte'], self.header) KM.setData('Spatial correction file date', 0, "|S26") KM.setData('Spatial correction file', 26, "|S246") # Angles are in steps due to stepper motors - conversion factor RAD # angle[0] = omega, angle[1] = theta, angle[2] = kappa, angle[3] = phi, if self.header.get('Omega step in deg', None): KM.setData(None, 368, numpy.float64, deg2rad(self.header["Omega step in deg"])) if self.header.get('Omega start in deg', None): KM.setData(None, 284, numpy.int32, self.header["Omega start in deg"] / self.header["Omega step in deg"]) if self.header.get('Omega end in deg', None): KM.setData(None, 324, numpy.int32, self.header["Omega end in deg"] / self.header["Omega step in deg"]) if self.header.get('Omega zero corr. in deg', None): KM.setData(None, 512, numpy.int32, self.header['Omega zero corr. in deg'] / self.header["Omega step in deg"]) if self.header.get('Theta step in deg', None): KM.setData(None, 368 + 8, numpy.float64, deg2rad(self.header["Theta step in deg"])) if self.header.get('Theta start in deg', None): KM.setData(None, 284 + 4, numpy.int32, self.header["Theta start in deg"] / self.header["Theta step in deg"]) if self.header.get('Theta end in deg', None): KM.setData(None, 324 + 4, numpy.int32, self.header["Theta end in deg"] / self.header["Theta step in deg"]) if self.header.get('Theta zero corr. in deg', None): KM.setData(None, 512 + 4, numpy.int32, self.header['Theta zero corr. in deg'] / self.header["Theta step in deg"]) if self.header.get('Kappa step in deg', None): KM.setData(None, 368 + 16, numpy.float64, deg2rad(self.header["Kappa step in deg"])) if self.header.get('Kappa start in deg', None): KM.setData(None, 284 + 8, numpy.int32, self.header["Kappa start in deg"] / self.header["Kappa step in deg"]) if self.header.get('Kappa end in deg', None): KM.setData(None, 324 + 8, numpy.int32, self.header["Kappa end in deg"] / self.header["Kappa step in deg"]) if self.header.get('Kappa zero corr. in deg', None): KM.setData(None, 512 + 8, numpy.int32, self.header['Kappa zero corr. in deg'] / self.header["Kappa step in deg"]) if self.header.get('Phi step in deg', None): KM.setData(None, 368 + 24, numpy.float64, deg2rad(self.header["Phi step in deg"])) if self.header.get('Phi start in deg', None): KM.setData(None, 284 + 12, numpy.int32, self.header["Phi start in deg"] / self.header["Phi step in deg"]) if self.header.get('Phi end in deg', None): KM.setData(None, 324 + 12, numpy.int32, self.header["Phi end in deg"] / self.header["Phi step in deg"]) if self.header.get('Phi zero corr. in deg', None): KM.setData(None, 512 + 12, numpy.int32, self.header['Phi zero corr. in deg'] / self.header["Phi step in deg"]) # Beam rotation about e2,e3 KM.setData('Beam rot in deg (e2)', 552, numpy.float64) KM.setData('Beam rot in deg (e3)', 560, numpy.float64) # Wavelenghts alpha1, alpha2, beta KM.setData('Wavelength alpha1', 568, numpy.float64) KM.setData('Wavelength alpha2', 576, numpy.float64) KM.setData('Wavelength alpha', 584, numpy.float64) KM.setData('Wavelength beta', 592, numpy.float64) # Detector tilts around e1,e2,e3 in deg KM.setData('Detector tilt e1 in deg', 640, numpy.float64) KM.setData('Detector tilt e2 in deg', 648, numpy.float64) KM.setData('Detector tilt e3 in deg', 656, numpy.float64) # Beam center KM.setData('Beam center x', 664, numpy.float64) KM.setData('Beam center y', 672, numpy.float64) # Angle (alpha) between kappa rotation axis and e3 (ideally 50 deg) KM.setData('Alpha angle in deg', 672, numpy.float64) # Angle (beta) between phi rotation axis and e3 (ideally 0 deg) KM.setData('Beta angle in deg', 672, numpy.float64) # Detector distance KM.setData('Distance in mm', 712, numpy.float64) header += KM.__repr__() SS = Section(self.header['Statistic Section in Byte'], self.header) SS.setData('Stat: Min ', 0, numpy.int32) SS.setData('Stat: Max ', 4, numpy.int32) SS.setData('Stat: Average ', 24, numpy.float64) if self.header.get('Stat: Stddev ', None): SS.setData(None, 32, numpy.float64, self.header['Stat: Stddev '] ** 2) SS.setData('Stat: Skewness ', 40, numpy.float64) header += SS.__repr__() HS = Section(self.header['History Section in Byte'], self.header) HS.setData('Flood field image', 99, "|S27") header += HS.__repr__() return header
[docs] def write(self, fname): """Write Oxford diffraction images: this is still beta @param fname: output filename """ datablock8, datablock16, datablock32 = compTY1(self.data) self.header["OI"] = len(datablock16) / 2 self.header["OL"] = len(datablock32) / 4 with self._open(fname, mode="wb") as outfile: outfile.write(self._writeheader()) outfile.write(datablock8) outfile.write(datablock16) outfile.write(datablock32)
[docs] def getCompressionRatio(self): "calculate the compression factor obtained vs raw data" return 100.0 * (self.data.size + 2 * self.header["OI"] + 4 * self.header["OL"]) / (self.data.size * 4)
@staticmethod
[docs] def checkData(data=None): if data is None: return None else: return data.astype(int)
[docs]class Section(object): """ Small helper class for writing binary headers """ def __init__(self, size, dictHeader): """ @param size: size of the header section in bytes @param dictHeader: headers of the image """ self.size = size self.header = dictHeader self.lstChr = ["\x00"] * size self._dictSize = {} def __repr__(self): return "".join(self.lstChr)
[docs] def getSize(self, dtype): if not dtype in self._dictSize: self._dictSize[dtype] = len(numpy.zeros(1, dtype=dtype).tostring()) return self._dictSize[dtype]
[docs] def setData(self, key, offset, dtype, default=None): """ @param offset: int, starting position in the section @param key: name of the header key @param dtype: type of the data to insert (defines the size!) """ if key in self.header: value = self.header[key] elif key in DEFAULT_HEADERS: value = DEFAULT_HEADERS[key] else: value = default if value is None: value = "\x00" * self.getSize(dtype) else: value = numpy.array(value).astype(dtype).tostring() self.lstChr[offset:offset + self.getSize(dtype)] = value
fabio-0.1.3/doc/html/_modules/fabio/compression.html0000644000175000017500000017564212233250022023214 0ustar jeromejerome00000000000000 fabio.compression — FabIO 0.1.3 documentation

Source code for fabio.compression

#!/usr/bin/env python
# coding: utf8
"""
Authors: Jérôme Kieffer, ESRF
         email:jerome.kieffer@esrf.fr

FabIO library containing compression and decompression algorithm for various
"""
__author__ = "Jérôme Kieffer"
__contact__ = "jerome.kieffer@esrf.eu"
__license__ = "GPLv3+"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"


import logging, struct, hashlib, base64, StringIO, sys
if sys.version_info >= (3,):
    str = bytes
logger = logging.getLogger("compression")
import numpy

try:
    import gzip
except ImportError:
    logger.error("Unable to import gzip module: disabling gzip compression")
    gzip = None

try:
    import bz2
except ImportError:
    logger.error("Unable to import bz2 module: disabling bz2 compression")
    bz2 = None

try:
    import zlib
except ImportError:
    logger.error("Unable to import zlib module: disabling zlib compression")
    zlib = None

[docs]def md5sum(blob): """ returns the md5sum of an object... """ return base64.b64encode(hashlib.md5(blob).digest())
[docs]def endianness(): """ Return the native endianness of the system """ if numpy.little_endian: return "LITTLE_ENDIAN" else: return "BIG_ENDIAN"
[docs]def decGzip(stream): """ Decompress a chunk of data using the gzip algorithm from Python or alternatives if possible """ if gzip is None: raise ImportError("gzip module is not available") fileobj = StringIO.StringIO(stream) try: rawData = gzip.GzipFile(fileobj=fileobj).read() except IOError: logger.warning("Encounter the python-gzip bug with trailing garbage, trying subprocess gzip") try: #This is as an ugly hack against a bug in Python gzip import subprocess sub = subprocess.Popen(["gzip", "-d", "-f"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) rawData, err = sub.communicate(input=stream) logger.debug("Gzip subprocess ended with %s err= %s; I got %s bytes back" % (sub.wait(), err, len(rawData))) except Exception, error: #IGNORE:W0703 logger.warning("Unable to use the subprocess gzip (%s). Is gzip available? " % error) for i in range(1, 513): try: fileobj = StringIO.StringIO(stream[:-i]) rawData = gzip.GzipFile(fileobj=fileobj).read() except IOError: logger.debug("trying with %s bytes less, doesn't work" % i) else: break else: logger.error("I am totally unable to read this gzipped compressed data block, giving up") return rawData
[docs]def decBzip2(stream): """ Decompress a chunk of data using the bzip2 algorithm from Python """ if bz2 is None: raise ImportError("bz2 module is not available") return bz2.decompress(stream)
[docs]def decZlib(stream): """ Decompress a chunk of data using the zlib algorithm from Python """ if zlib is None: raise ImportError("zlib module is not available") return zlib.decompress(stream)
[docs]def decByteOffet_python(stream, size): """ Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return: 1D-ndarray """ logger.debug("CBF decompression using Python with Cython loops") dataOut = numpy.zeros((size), dtype=numpy.int64) i = 0 j = 0 last = 0 current = 0 while ((i < len(stream)) and (j < size)): if (stream[i] == '\x80'): if (stream[i + 1:i + 3] == "\x00\x80"): if (stream[i + 3:i + 7] == "\x00\x00\x00\x80"): current = struct.unpack("<q", stream[i + 7:i + 15])[0] i += 15 else: current = struct.unpack("<i", stream[i + 3:i + 7])[0] i += 7 else: current = struct.unpack("<h", stream[i + 1:i + 3])[0] i += 3 else: current = struct.unpack("<b", stream[i])[0] i += 1 last += current dataOut[j] = last j += 1 return dataOut
[docs]def decByteOffet_weave(stream, size): """ Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return: 1D-ndarray """ logger.debug("CBF decompression using Weave") try: from scipy import weave from scipy.weave import converters except ImportError: logger.warning("scipy.weave is not available, falling back on slow Numpy implementations") return decByteOffet_numpy(stream, size) dataIn = numpy.fromstring(stream, dtype="uint8") n = dataIn.size dataOut = numpy.zeros(size, dtype="int64") codeC = """ unsigned char key = 0x80; long j = 0; long last=0; long current=0; for (int i=0; i< n; i++){ if (j>=size){ //printf("i= %i<%i, j=%i < size= %i %i\\n",i,n,j,size,dataIn(i)); break; } if (dataIn(i) == key){ if ( (dataIn(i+1)==0) and (dataIn(i+2)==key) ){ if ( (dataIn(i+3)==0) and (dataIn(i+4)==0) and (dataIn(i+5)==0) and (dataIn(i+6)==key) ) { // 64 bits mode char tmp = dataIn(i+14) ; current = (long(tmp)<<56) | (long(dataIn(i+13))<<48) | (long(dataIn(i+12))<<40) | (long(dataIn(i+11))<<32) | (long(dataIn(i+10))<<24) | (long(dataIn(i+9))<<16) | (long(dataIn(i+8))<<8) | (long(dataIn(i+7))); // printf("64 bit int at pos %i, %i, value=%ld \\n",i,j,current); i+=14; }else{ // 32 bits mode char tmp = dataIn(i+6) ; current = (long(tmp)<<24) | (long(dataIn(i+5))<<16) | (long(dataIn(i+4))<<8) | (long(dataIn(i+3))); // printf("32 bit int at pos %i, %i, value=%ld was %i %i %i %i %i %i %i\\n",i,j,current,dataIn(i),dataIn(i+1),dataIn(i+2),dataIn(i+3),dataIn(i+4),dataIn(i+5),dataIn(i+6)); // printf("%ld %ld %ld %ld\\n",(long(tmp)<<24) , (long(dataIn(i+5))<<16) , (long(dataIn(i+4))<<8) ,long(dataIn(i+3))); i+=6; } }else{ // 16 bit mode char tmp = dataIn(i+2); current = (long(tmp)<<8) | (long (dataIn(i+1))); // printf("16 bit int at pos %i, %i, value=%ld was %i %i %i\\n",i,j,current,dataIn(i),dataIn(i+1),dataIn(i+2)); i+=2; } }else{ // 8 bit mode char tmp = dataIn(i) ; current= long(tmp) ; } last+=current; dataOut(j)=last; j++ ; } return_val=0; """ rc = weave.inline(codeC, ["dataIn", "dataOut", "n", "size" ], verbose=2, type_converters=converters.blitz) if rc != 0: logger.warning("weave binary module return error code %s" % rc) return dataOut
[docs]def decByteOffet_numpy(stream, size=None): """ Analyze a stream of char with any length of exception: 2, 4, or 8 bytes integers @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return: 1D-ndarray """ logger.debug("CBF decompression using Numpy") listnpa = [] key16 = "\x80" key32 = "\x00\x80" key64 = "\x00\x00\x00\x80" shift = 1 while True: idx = stream.find(key16) if idx == -1: listnpa.append(numpy.fromstring(stream, dtype="int8")) break listnpa.append(numpy.fromstring(stream[:idx], dtype="int8")) if stream[idx + 1:idx + 3] == key32: if stream[idx + 3:idx + 7] == key64: # long int 64 bits listnpa.append(numpy.fromstring(stream[idx + 7:idx + 15], dtype="int64")) shift = 15 else: #32 bit int listnpa.append(numpy.fromstring(stream[idx + 3:idx + 7], dtype="int32")) shift = 7 else: # int16 listnpa.append(numpy.fromstring(stream[idx + 1:idx + 3], dtype="int16")) shift = 3 stream = stream[idx + shift:] return (numpy.hstack(listnpa)).astype("int64").cumsum()
[docs]def decByteOffet_cython(stream, size=None): """ Analyze a stream of char with any length of exception: 2, 4, or 8 bytes integers @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return: 1D-ndarray """ logger.debug("CBF decompression using cython") try: from fabio.byte_offset import analyseCython except ImportError, error: logger.error("Failed to import byte_offset cython module, falling back on numpy method") return decByteOffet_numpy(stream, size) else: return analyseCython(stream, size)
[docs]def compByteOffet_numpy(data): """ Compress a dataset into a string using the byte_offet algorithm @param data: ndarray @return: string/bytes with compressed data test = numpy.array([0,1,2,127,0,1,2,128,0,1,2,32767,0,1,2,32768,0,1,2,2147483647,0,1,2,2147483648,0,1,2,128,129,130,32767,32768,128,129,130,32768,2147483647,2147483648]) """ flat = data.astype("int64").ravel() delta = numpy.zeros_like(flat) delta[0] = flat[0] delta[1:] = flat[1:] - flat[:-1] mask = ((delta > 127) + (delta < -127)) exceptions = numpy.nonzero(mask)[0] if numpy.little_endian: byteswap = False else: byteswap = True start = 0 binary_blob = "" for stop in exceptions: if stop - start > 0: binary_blob += delta[start:stop].astype("int8").tostring() exc = delta[stop] if (exc > 2147483647) or (exc < -2147483647): #2**31-1 binary_blob += "\x80\x00\x80\x00\x00\x00\x80" if byteswap: binary_blob += delta[stop:stop + 1].byteswap().tostring() else: binary_blob += delta[stop:stop + 1].tostring() elif (exc > 32767) or (exc < -32767): #2**15-1 binary_blob += "\x80\x00\x80" if byteswap: binary_blob += delta[stop:stop + 1].astype("int32").byteswap().tostring() else: binary_blob += delta[stop:stop + 1].astype("int32").tostring() else: #>127 binary_blob += "\x80" if byteswap: binary_blob += delta[stop:stop + 1].astype("int16").byteswap().tostring() else: binary_blob += delta[stop:stop + 1].astype("int16").tostring() start = stop + 1 if start < delta.size: binary_blob += delta[start:].astype("int8").tostring() return binary_blob
[docs]def decTY1(raw_8, raw_16=None, raw_32=None): """ Modified byte offset decompressor used in Oxford Diffraction images @param raw_8: strings containing raw data with integer 8 bits @param raw_16: strings containing raw data with integer 16 bits @param raw_32: strings containing raw data with integer 32 bits @return: numpy.ndarray """ data = numpy.fromstring(raw_8, dtype="uint8").astype(int) data -= 127 if raw_32 is not None: int32 = numpy.fromstring(raw_32, dtype="int32").astype(int) exception32 = numpy.nonzero(data == 128) if raw_16 is not None: int16 = numpy.fromstring(raw_16, dtype="int16").astype(int) exception16 = numpy.nonzero(data == 127) data[exception16] = int16 if raw_32: data[exception32] = int32 summed = data.cumsum() smax = summed.max() if (smax > (2 ** 31 - 1)): bytecode = "int64" elif (smax > (2 ** 15 - 1)): bytecode = "int32" elif (smax > (2 ** 7 - 1)): bytecode = "int16" else: bytecode = "int8" return summed.astype(bytecode)
decKM4CCD = decTY1
[docs]def compTY1(data): """ Modified byte offset compressor used in Oxford Diffraction images @param data: numpy.ndarray with the input data (integers!) @return: 3-tuple of strings: raw_8,raw_16,raw_32 containing raw data with integer of the given size """ fdata = data.flatten() diff = numpy.zeros_like(fdata) diff[0] = fdata[0] diff[1:] = fdata[1:] - fdata[:-1] adiff = abs(diff) exception32 = (adiff > 32767)#2**15-1 exception16 = (adiff >= 127) - exception32 #2**7-1) we16 = numpy.where(exception16) we32 = numpy.where(exception32) raw_16 = diff[we16].astype("int16").tostring() raw_32 = diff[we32].astype("int32").tostring() diff[we16] = 127 diff[we32] = 128 diff += 127 raw_8 = diff.astype("uint8").tostring() return raw_8, raw_16, raw_32
[docs]def decPCK(stream, dim1=None, dim2=None, overflowPix=None, version=None): """ Modified CCP4 pck decompressor used in MAR345 images @param stream: string or file @return: numpy.ndarray (square array) """ try: from mar345_IO import uncompress_pck except ImportError, error: raise RuntimeError("Unable to import mar345_IO to read compressed dataset") if "seek" in dir(stream): stream.seek(0) raw = stream.read() else: raw = str(stream) return uncompress_pck(raw, dim1, dim2, overflowPix, version)
[docs]def compPCK(data): """ Modified CCP4 pck compressor used in MAR345 images @param data: numpy.ndarray (square array) @return: compressed stream """ try: from mar345_IO import compress_pck except ImportError, error: raise RuntimeError("Unable to import mar345_IO to write compressed dataset") return compress_pck(data)
fabio-0.1.3/doc/html/_modules/fabio/xsdimage.html0000644000175000017500000005726712233250022022456 0ustar jeromejerome00000000000000 fabio.xsdimage — FabIO 0.1.3 documentation

Source code for fabio.xsdimage

#!/usr/bin/env python
# coding: utf8
"""
Authors: Jérôme Kieffer, ESRF 
         email:jerome.kieffer@esrf.fr

XSDimge are XML files containing numpy arrays 
"""
__author__ = "Jérôme Kieffer"
__contact__ = "jerome.kieffer@esrf.eu"
__license__ = "GPLv3+"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"

import logging, numpy
logger = logging.getLogger("xsdimage")
from fabioimage import fabioimage
import base64, hashlib
try:
    from lxml import etree
except ImportError:
    logger.warning("lxml library is probably not part of your python installation: disabling xsdimage format")
    etree = None

[docs]class xsdimage(fabioimage): """ Read the XSDataImage XML File data format """ def __init__(self, data=None, header=None, fname=None): """ Constructor of the class XSDataImage. @param _strFilename: the name of the file to open @type _strFilename: string """ fabioimage.__init__(self, data=data, header=header) self.dims = [] self.size = None self.coding = None self.dtype = None self.rawData = None self.md5 = None if fname is not None: self.filename = fname self.read(fname)
[docs] def read(self, fname, frame=None): """ """ self.header = {} self.resetvals() self.filename = fname infile = self._open(fname, "rb") self._readheader(infile) try: self.dim1, self.dim2 = self.dims[:2] except: raise IOError("XSD file %s is corrupt, no dimensions in it" % fname) try: self.bytecode = numpy.dtype(self.dtype).type self.bpp = len(numpy.array(0, self.bytecode).tostring()) except TypeError: self.bytecode = numpy.int32 self.bpp = 32 logger.warning("Defaulting type to int32") exp_size = 1 for i in self.dims: exp_size *= i assert exp_size == self.size decData = None if self.coding == "base64": decData = base64.b64decode(self.rawData) elif self.coding == "base32": decData = base64.b32decode(self.rawData) elif self.coding == "base16": decData = base64.b16decode(self.rawData) else: logger.warning("Unable to recognize the encoding of the data !!! got %s, expected base64, base32 or base16, I assume it is base64 " % self.coding) decData = base64.b64decode(self.rawData) if self.md5: assert hashlib.md5(decData).hexdigest() == self.md5 self.data = numpy.fromstring(decData, dtype=self.bytecode).reshape(tuple(self.dims)) if not numpy.little_endian: #by default little endian self.data.byteswap(inplace=True) self.resetvals() # # ensure the PIL image is reset self.pilimage = None return self
def _readheader(self, infile): """ Read all headers in a file and populate self.header data is not yet populated @type infile: file object open in read mode """ xml = etree.parse(infile) self.dims = [] for i in xml.xpath("//shape"): try: self.dims.append(int(i.text)) except ValueError, error: logger.warning("%s Shape: Unable to convert %s to integer in %s" % (error, i.text, i)) for i in xml.xpath("//size"): try: self.size = int(i.text) except Exception, error:#IGNORE:W0703 logger.warning("%s Size: Unable to convert %s to integer in %s" % (error, i.text, i)) self.dtype = None for i in xml.xpath("//dtype"): self.dtype = i.text self.coding = None for i in xml.xpath("//coding"): j = i.find("value") if j is not None: self.coding = j.text self.rawData = None for i in xml.xpath("//data"): self.rawData = i.text self.md5 = None for i in xml.xpath("//md5sum"): j = i.find("value") if j is not None: self.md5 = j.text
if etree is None: xsdimage = None
fabio-0.1.3/doc/html/_modules/fabio/fabioutils.html0000644000175000017500000025325312233250022023007 0ustar jeromejerome00000000000000 fabio.fabioutils — FabIO 0.1.3 documentation

Source code for fabio.fabioutils

#!/usr/bin/env python
#coding: utf8

"""
General purpose utilities functions for fabio
"""
from __future__ import with_statement
import re, os, logging, threading, sys
import StringIO as stringIO
logger = logging.getLogger("fabioutils")
from compression import bz2, gzip
import traceback
from math import ceil



FILETYPES = {
    # extension NNNimage fabioclass
    # type consistency - always use a list if one case is
    'edf'    : ['edf'],
    'cor'    : ['edf'],
    'pnm'    : ['pnm'],
    'pgm'    : ['pnm'],
    'pbm'    : ['pnm'],
    'tif'    : ['tif'],
    'tiff'   : ['tif'],
    'img'    : ['adsc', 'OXD', 'HiPiC'],
    'mccd'   : ['marccd'],
    'mar2300': ['mar345'],
    'sfrm'   : ['bruker100'],
    'msk'    : ['fit2dmask'],
    'spr'    : ['fit2dspreadsheet'],
    'dm3'    : ['dm3'],
    'kcd'    : ['kcd'],
    'cbf'    : ['cbf'],
    'xml'    : ["xsd"],
    'xsd'    : ["xsd"],
             }

# Add bzipped and gzipped
for key in FILETYPES.keys():
    FILETYPES[key + ".bz2"] = FILETYPES[key]
    FILETYPES[key + ".gz"] = FILETYPES[key]


# Compressors

COMPRESSORS = {}


dictAscii = {None:[chr(i) for i in range(32, 127)],
           }

try:
    lines = os.popen("gzip -h 2>&1").read()
    # Looking for "usage"
    if "sage" in lines:
        COMPRESSORS['.gz'] = 'gzip -dc '
    else:
        COMPRESSORS['.gz'] = None
except Exception:
    COMPRESSORS['.gz'] = None

try:
    lines = os.popen("bzip2 -h 2>&1").read()
    # Looking for "usage"
    if "sage" in lines:
        COMPRESSORS['.bz2'] = 'bzip2 -dc '
    else:
        COMPRESSORS['.bz2'] = None
except Exception:
    COMPRESSORS['.bz2'] = None

[docs]def deprecated(func): """ used to deprecate a function/method: prints a lot of warning messages to enforce the modifaction of the code """ def wrapper(*arg, **kw): """ decorator that deprecates the use of a function """ logger.warning("%s is Deprecated !!! %s" % (func.func_name, os.linesep.join([""] + traceback.format_stack()[:-1]))) return func(*arg, **kw) return wrapper
[docs]def pad(mystr, pattern=" ", size=80): """ Performs the padding of the string to the right size with the right pattern """ size = int(size) padded_size = int(ceil(float(len(mystr)) / size) * size) if len(pattern) == 1: return mystr.ljust(padded_size, pattern) else: return (mystr + pattern * int(ceil(float(padded_size - len(mystr)) / len(pattern))))[:padded_size]
[docs]def getnum(name): """ # try to figure out a file number # guess it starts at the back """ stem , num, post_num = numstem(name) try: return int(num) except ValueError: return None
[docs]class FilenameObject(object): """ The 'meaning' of a filename ... """ def __init__(self, stem=None, num=None, directory=None, format=None, extension=None, postnum=None, digits=4, filename=None): """ This class can either be instanciated by a set of parameters like directory, prefix, num, extension, ... @param stem: the stem is a kind of prefix (str) @param num: image number in the serie (int) @param directory: name of the directory (str) @param format: ?? @param extension: @param postnum: @param digits: Number of digits used to print num Alternative constructor: @param filename: fullpath of an image file to be deconstructed into directory, prefix, num, extension, ... """ self.stem = stem self.num = num self.format = format self.extension = extension self.digits = digits self.postnum = postnum self.directory = directory self.compressed = None if filename is not None: self.deconstruct_filename(filename)
[docs] def str(self): """ Return a string representation """ fmt = "stem %s, num %s format %s extension %s " + \ "postnum = %s digits %s dir %s" return fmt % tuple([str(x) for x in [ self.stem , self.num , self.format , self.extension , self.postnum , self.digits , self.directory ] ])
__repr__ = str
[docs] def tostring(self): """ convert yourself to a string """ name = self.stem if self.digits is not None and self.num is not None: fmt = "%0" + str(self.digits) + "d" name += fmt % self.num if self.postnum is not None: name += self.postnum if self.extension is not None: name += self.extension if self.directory is not None: name = os.path.join(self.directory, name) return name
[docs] def deconstruct_filename(self, filename): """ Break up a filename to get image type and number """ direc, name = os.path.split(filename) direc = direc or None parts = name.split(".") compressed = False stem = parts[0] extn = "" postnum = "" ndigit = 4 num = None typ = None if parts[-1] in ["gz", "bz2"]: extn = "." + parts[-1] parts = parts[:-1] compressed = True if parts[-1] in FILETYPES.keys(): typ = FILETYPES[parts[-1]] extn = "." + parts[-1] + extn try: stem, numstring, postnum = numstem(".".join(parts[:-1])) num = int(numstring) ndigit = len(numstring) except Exception, err: # There is no number - hence make num be None, not 0 logger.debug("l176: %s" % err) num = None stem = "".join(parts[:-1]) else: # Probably two type left if len(parts) == 1: # Probably GE format stem_numb parts2 = parts[0].split("_") if parts2[-1].isdigit(): num = int(parts2[-1]) ndigit = len(parts2[-1]) typ = ['GE'] stem = "_".join(parts2[:-1]) + "_" else: try: num = int(parts[-1]) ndigit = len(parts[-1]) typ = ['bruker'] stem = ".".join(parts[:-1]) + "." except Exception, err: logger.debug("l196: %s" % err) typ = None extn = "." + parts[-1] + extn numstring = "" try: stem , numstring, postnum = numstem(".".join(parts[:-1])) except Exception, err: logger.debug("l202: %s" % err) raise if numstring.isdigit(): num = int(numstring) ndigit = len(numstring) # raise Exception("Cannot decode "+filename) self.stem = stem self.num = num self.directory = direc self.format = typ self.extension = extn self.postnum = postnum self.digits = ndigit self.compressed = compressed
[docs]def numstem(name): """ cant see how to do without reversing strings Match 1 or more digits going backwards from the end of the string """ reg = re.compile(r"^(.*?)(-?[0-9]{0,9})(\D*)$") #reg = re.compile("""(\D*)(\d\d*)(\w*)""") try: res = reg.match(name).groups() #res = reg.match(name[::-1]).groups() #return [ r[::-1] for r in res[::-1]] if len(res[0]) == len(res[1]) == 0: # Hack for file without number return [res[2], '', ''] return [ r for r in res] except AttributeError: # no digits found return [name, "", ""] #@deprecated
[docs]def deconstruct_filename(filename): """ Function for backward compatibility. Deprecated """ return FilenameObject(filename=filename)
[docs]def construct_filename(filename, frame=None): "Try to construct the filename for a given frame" fobj = FilenameObject(filename=filename) if frame is not None: fobj.num = frame return fobj.tostring()
[docs]def next_filename(name, padding=True): """ increment number """ fobj = FilenameObject(filename=name) fobj.num += 1 if not padding: fobj.digits = 0 return fobj.tostring()
[docs]def previous_filename(name, padding=True): """ decrement number """ fobj = FilenameObject(filename=name) fobj.num -= 1 if not padding: fobj.digits = 0 return fobj.tostring()
[docs]def jump_filename(name, num, padding=True): """ jump to number """ fobj = FilenameObject(filename=name) fobj.num = num if not padding: fobj.digits = 0 return fobj.tostring()
[docs]def extract_filenumber(name): """ extract file number """ fobj = FilenameObject(filename=name) return fobj.num
[docs]def isAscii(name, listExcluded=None): """ @param name: string to check @param listExcluded: list of char or string excluded. @return: True of False whether name is pure ascii or not """ isascii = None try: name.decode("ascii") except UnicodeDecodeError: isascii = False else: if listExcluded: isascii = not(any(bad in name for bad in listExcluded)) else: isascii = True return isascii
[docs]def toAscii(name, excluded=None): """ @param name: string to check @param excluded: tuple of char or string excluded (not list: they are mutable). @return: the name with all non valid char removed """ if excluded not in dictAscii: ascii = dictAscii[None][:] for i in excluded: if i in ascii: ascii.remove(i) else: logger.error("toAscii: % not in ascii table" % i) dictAscii[excluded] = ascii else: ascii = dictAscii[excluded] out = [i for i in str(name) if i in ascii] return "".join(out)
[docs]def nice_int(s): """ Workaround that int('1.0') raises an exception @param s: string to be converted to integer """ try: return int(s) except ValueError: return int(float(s))
[docs]class StringIO(stringIO.StringIO): """ just an interface providing the name and mode property to a StringIO BugFix for MacOSX mainly """ def __init__(self, data, fname=None, mode="r"): stringIO.StringIO.__init__(self, data) self.closed = False if fname == None: self.name = "fabioStream" else: self.name = fname self.mode = mode self.lock = threading.Semaphore() self.__size = None
[docs] def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with self.lock: pos = self.tell() self.seek(0, os.SEEK_END) self.__size = self.tell() self.seek(pos) return self.__size
[docs] def setSize(self, size): self.__size = size
size = property(getSize, setSize)
[docs]class File(file): """ wrapper for "file" with locking """ def __init__(self, name, mode="rb", buffering=0): """file(name[, mode[, buffering]]) -> file object Open a file. The mode can be 'r', 'w' or 'a' for reading (default), writing or appending. The file will be created if it doesn't exist when opened for writing or appending; it will be truncated when opened for writing. Add a 'b' to the mode for binary files. Add a '+' to the mode to allow simultaneous reading and writing. If the buffering argument is given, 0 means unbuffered, 1 means line buffered, and larger numbers specify the buffer size. The preferred way to open a file is with the builtin open() function. Add a 'U' to mode to open the file for input with universal newline support. Any line ending in the input file will be seen as a '\n' in Python. Also, a file so opened gains the attribute 'newlines'; the value for this attribute is one of None (no newline read yet), '\r', '\n', '\r\n' or a tuple containing all the newline types seen. 'U' cannot be combined with 'w' or '+' mode. """ file.__init__(self, name, mode, buffering) self.lock = threading.Semaphore() self.__size = None
[docs] def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with self.lock: pos = self.tell() self.seek(0, os.SEEK_END) self.__size = self.tell() self.seek(pos) return self.__size
[docs] def setSize(self, size): self.__size = size
def __exit__(self, *args, **kwargs): """ Close the file. """ return file.close(self) def __enter__(self, *args, **kwargs): return self size = property(getSize, setSize)
[docs]class UnknownCompressedFile(File): """ wrapper for "File" with locking """ def __init__(self, name, mode="rb", buffering=0): logger.warning("No decompressor found for this type of file (are gzip anf bz2 installed ???") File.__init__(self, name, mode, buffering)
if gzip is None: GzipFile = UnknownCompressedFile else:
[docs] class GzipFile(gzip.GzipFile): """ Just a wrapper forgzip.GzipFile providing the correct seek capabilities for python 2.5 """ def __init__(self, filename=None, mode=None, compresslevel=9, fileobj=None): """ Wrapper with locking for constructor for the GzipFile class. At least one of fileobj and filename must be given a non-trivial value. The new class instance is based on fileobj, which can be a regular file, a StringIO object, or any other object which simulates a file. It defaults to None, in which case filename is opened to provide a file object. When fileobj is not None, the filename argument is only used to be included in the gzip file header, which may includes the original filename of the uncompressed file. It defaults to the filename of fileobj, if discernible; otherwise, it defaults to the empty string, and in this case the original filename is not included in the header. The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', or 'wb', depending on whether the file will be read or written. The default is the mode of fileobj if discernible; otherwise, the default is 'rb'. Be aware that only the 'rb', 'ab', and 'wb' values should be used for cross-platform portability. The compresslevel argument is an integer from 1 to 9 controlling the level of compression; 1 is fastest and produces the least compression, and 9 is slowest and produces the most compression. The default is 9. """ gzip.GzipFile.__init__(self, filename, mode, compresslevel, fileobj) self.lock = threading.Semaphore() self.__size = None if sys.version_info < (2, 7): def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with open(self.filename, "rb") as f: f.seek(-4) self.__size = numpy.fromstring(f.read(4), dtype=numpy.uint32) return self.__size def setSize(self, value): self.__size = value size = property(getSize, setSize) @property def closed(self): return self.fileobj is None def seek(self, offset, whence=os.SEEK_SET): """ Move to new file position. Argument offset is a byte count. Optional argument whence defaults to 0 (offset from start of file, offset should be >= 0); other values are 1 (move relative to current position, positive or negative), and 2 (move relative to end of file, usually negative, although many platforms allow seeking beyond the end of a file). If the file is opened in text mode, only offsets returned by tell() are legal. Use of other offsets causes undefined behavior. This is a wrapper for seek to ensure compatibility with old python 2.5 """ if whence == os.SEEK_SET: gzip.GzipFile.seek(self, offset) elif whence == os.SEEK_CUR: gzip.GzipFile.seek(self, offset + self.tell()) elif whence == os.SEEK_END: gzip.GzipFile.seek(self, -1) gzip.GzipFile.seek(self, offset + self.tell()) def __enter__(self, *args, **kwargs): return self def __exit__(self, *args, **kwargs): """ Close the file. """ return gzip.GzipFile.close(self)
if bz2 is None: BZ2File = UnknownCompressedFile else:
[docs] class BZ2File(bz2.BZ2File): "Wrapper with lock" def __init__(self, name , mode='r', buffering=0, compresslevel=9): """ BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object Open a bz2 file. The mode can be 'r' or 'w', for reading (default) or writing. When opened for writing, the file will be created if it doesn't exist, and truncated otherwise. If the buffering argument is given, 0 means unbuffered, and larger numbers specify the buffer size. If compresslevel is given, must be a number between 1 and 9. Add a 'U' to mode to open the file for input with universal newline support. Any line ending in the input file will be seen as a '\n' in Python. Also, a file so opened gains the attribute 'newlines'; the value for this attribute is one of None (no newline read yet), '\r', '\n', '\r\n' or a tuple containing all the newline types seen. Universal newlines are available only when reading. """ bz2.BZ2File.__init__(self, name , mode, buffering, compresslevel) self.lock = threading.Semaphore() self.__size = None
[docs] def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with self.lock: pos = self.tell() all = self.read() self.__size = self.tell() self.seek(pos) return self.__size
[docs] def setSize(self, value): self.__size = value
size = property(getSize, setSize) def __exit__(self, *args, **kwargs): """ Close the file. """ return bz2.BZ2File.close(self) def __enter__(self, *args, **kwargs): return self
fabio-0.1.3/doc/html/_modules/fabio/datIO.html0000644000175000017500000002526412233250022021645 0ustar jeromejerome00000000000000 fabio.datIO — FabIO 0.1.3 documentation

Source code for fabio.datIO

#!/usr/bin/env python
#coding: utf8
"""
Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:erik.knudsen@risoe.dk
         
         and Jon Wright, ESRF
"""

[docs]class fabiodata(object): """ A common class for dataIO in fable Contains a 2d numpy array for keeping data, and two lists (clabels and rlabels) containing labels for columns and rows respectively """ def __init__(self, data=None, clabels=None, rlabels=None, fname=None): """ set up initial values """ if type(data) == type("string"): raise Exception("fabioimage.__init__ bad argument - " + \ "data should be numpy array") self.data = data if (self.data): self.dims = self.data.shape self.clabels = clabels self.rlabels = rlabels if (fname): self.read(fname)
[docs] def read(self, fname=None, frame=None): """ To be overridden by format specific subclasses """ raise Exception("Class has not implemented read method yet") #import stuff from Jon's columnfile things
[docs]class columnfile(fabiodata): "Concrete fabiodata class"
[docs] def read(self, fname, frame=None): import cf_io try: infile = open(fname, 'rb') except: raise Exception("columnfile: file" + str(fname) + "not found.") try: (self.data, self.clabels) = cf_io.read(infile) except: raise Exception("columnfile: read error, file " + str(fname) + " possibly corrupt") self.dims = self.data.shape infile.close()
fabio-0.1.3/doc/html/_modules/fabio/file_series.html0000644000175000017500000012744712233250022023144 0ustar jeromejerome00000000000000 fabio.file_series — FabIO 0.1.3 documentation

Source code for fabio.file_series

#!/usr/bin/env python

"""

Authors:
........

* Henning O. Sorensen & Erik Knudsen
  Center for Fundamental Research: Metal Structures in Four Dimensions
  Risoe National Laboratory
  Frederiksborgvej 399
  DK-4000 Roskilde
  email:erik.knudsen@risoe.dk
* Jon Wright, ESRF

"""
import logging, sys
logger = logging.getLogger("fileseries")
import traceback as pytraceback

from fabioutils import FilenameObject, next_filename

from openimage import openimage


[docs]def new_file_series0(first_object, first=None, last=None, step=1): """ Created from a fabio image first and last are file numbers """ im = first_object nimages = 0 # for counting images if None in (first, last): step = 0 total = 1 else: total = last - first yield im while nimages < total: nimages += step try: newim = im.next() im = newim except Exception, error: pytraceback.print_exc() # Skip bad images logger.warning("Got a problem here: %s", error) try: im.filename = next_filename(im.filename) except Exception, error: # KE: This will not work and will throw an exception # fabio.next_filename doesn't understand %nnnn on the end logger.warning("Got another problem here: %s", error) im.filename = next_filename(im.sequencefilename) yield None yield im
[docs]def new_file_series(first_object, nimages=0, step=1, traceback=False): """ A generator function that creates a file series starting from a a fabioimage. Iterates through all images in a file (if more than 1), then proceeds to the next file as determined by fabio.next_filename. @param first_object: the starting fabioimage, which will be the first one yielded in the sequence @param nimages: the maximum number of images to consider step: step size, will yield the first and every step'th image until nimages is reached. (e.g. nimages = 5, step = 2 will yield 3 images (0, 2, 4) @param traceback: if True causes it to print a traceback in the event of an exception (missing image, etc.). Otherwise the calling routine can handle the exception as it chooses @param yields: the next fabioimage in the series. In the event there is an exception, it yields the sys.exec_info for the exception instead. sys.exec_info is a tuple: ( exceptionType, exceptionValue, exceptionTraceback ) from which all the exception information can be obtained. Suggested usage: :: for obj in new_file_series( ... ): if not isinstance(obj, fabio.fabioimage.fabioimage ): # deal with errors like missing images, non readable files, etc # e.g. traceback.print_exception(obj[0], obj[1], obj[2]) """ im = first_object nprocessed = 0 abort = False if nimages > 0: yield im nprocessed += 1 while nprocessed < nimages: try: newim = im.next() im = newim retVal = im except Exception, ex: retVal = sys.exc_info() if(traceback): pytraceback.print_exc() # Skip bad images logger.warning("Got a problem here: next() failed %s", ex) # Skip bad images try: im.filename = next_filename(im.filename) except Exception, ex: logger.warning("Got another problem here: next_filename(im.filename) %s", ex) if nprocessed % step == 0: yield retVal # Avoid cyclic references with exc_info ? retVal = None if abort: break nprocessed += 1
[docs]class file_series(list): """ Represents a series of files to iterate has an idea of a current position to do next and prev You also get from the list python superclass: append count extend insert pop remove reverse sort """ def __init__(self, list_of_strings): """ Constructor: @param list_of_strings: arg should be a list of strings which are filenames """ super(file_series, self).__init__(list_of_strings) # track current position in list self._current = 0 # methods which return a filename
[docs] def first(self): """ First image in series """ return self[0]
[docs] def last(self): """ Last in series """ return self[-1]
[docs] def previous(self): """ Prev in a sequence """ self._current -= 1 return self[self._current]
[docs] def current(self): """Current position in a sequence """ return self[self._current]
[docs] def next(self): """ Next in a sequence """ self._current += 1 return self[self._current]
[docs] def jump(self, num): """ Goto a position in sequence """ assert num < len(self) and num > 0, "num out of range" self._current = num return self[self._current]
[docs] def len(self): """ Number of files """ return len(self) # Methods which return a fabioimage
[docs] def first_image(self): """ First image in a sequence @return: fabioimage """ return openimage(self.first())
[docs] def last_image(self): """ Last image in a sequence @return: fabioimage """ return openimage(self.last())
[docs] def next_image(self): """ Return the next image @return: fabioimage """ return openimage(self.next())
[docs] def previous_image(self): """ Return the previous image @return: fabioimage """ return openimage(self.previous())
[docs] def jump_image(self, num): """ Jump to and read image @return: fabioimage """ return openimage(self.jump(num))
[docs] def current_image(self): """ Current image in sequence @return: fabioimage """ return openimage(self.current()) # methods which return a file_object
[docs] def first_object(self): """ First image in a sequence @return: file_object """ return FilenameObject(self.first())
[docs] def last_object(self): """ Last image in a sequence @return: file_object """ return FilenameObject(self.last())
[docs] def next_object(self): """ Return the next image @return: file_object """ return FilenameObject(self.next())
[docs] def previous_object(self): """ Return the previous image @return: file_object """ return FilenameObject(self.previous())
[docs] def jump_object(self, num): """ Jump to and read image @return: file_object """ return FilenameObject(self.jump(num))
[docs] def current_object(self): """ Current image in sequence @return: file_object """ return FilenameObject(self.current())
[docs]class numbered_file_series(file_series): """ mydata0001.edf = "mydata" + 0001 + ".edf" mydata0002.edf = "mydata" + 0002 + ".edf" mydata0003.edf = "mydata" + 0003 + ".edf" """ def __init__(self, stem, first, last, extension, digits=4, padding='Y', step=1): """ Constructor @param stem: first part of the name @param step: in case of every nth file @param padding: possibility for specifying that numbers are not padded with zeroes up to digits """ if padding == 'Y': fmt = "%s%0" + str(digits) + "d%s" else: fmt = "%s%i%s" super(numbered_file_series, self).__init__( [ fmt % (stem, i, extension) for i in range(first, last + 1, step) ])
[docs]class filename_series: """ Much like the others, but created from a string filename """ def __init__(self, filename): """ create from a filename (String)""" self.obj = FilenameObject(filename)
[docs] def next(self): """ increment number """ self.obj.num += 1 return self.obj.tostring()
[docs] def previous(self): """ decrement number """ self.obj.num -= 1 return self.obj.tostring()
[docs] def current(self): """ return current filename string""" return self.obj.tostring()
[docs] def jump(self, num): """ jump to a specific number """ self.obj.num = num return self.obj.tostring() # image methods
[docs] def next_image(self): """ returns the next image as a fabioimage """ return openimage(self.next())
[docs] def prev_image(self): """ returns the previos image as a fabioimage """ return openimage(self.previous())
[docs] def current_image(self): """ returns the current image as a fabioimage""" return openimage(self.current())
[docs] def jump_image(self, num): """ returns the image number as a fabioimage""" return openimage(self.jump(num)) # object methods
[docs] def next_object(self): """ returns the next filename as a fabio.FilenameObject""" self.obj.num += 1 return self.obj
[docs] def previous_object(self): """ returns the previous filename as a fabio.FilenameObject""" self.obj.num -= 1 return self.obj
[docs] def current_object(self): """ returns the current filename as a fabio.FilenameObject""" return self.obj
[docs] def jump_object(self, num): """ returns the filename num as a fabio.FilenameObject""" self.obj.num = num return self.obj
fabio-0.1.3/doc/html/_modules/fabio/fit2dmaskimage.html0000644000175000017500000004150612233250022023531 0ustar jeromejerome00000000000000 fabio.fit2dmaskimage — FabIO 0.1.3 documentation

Source code for fabio.fit2dmaskimage

## Automatically adapted for numpy.oldnumeric Oct 05, 2007 by alter_code1.py

#!/usr/bin/env python
"""

Author: Andy Hammersley, ESRF
Translation into python/fabio: Jon Wright, ESRF
"""

import numpy

from fabioimage import fabioimage


[docs]class fit2dmaskimage(fabioimage): """ Read and try to write Andy Hammersley's mask format """ def _readheader(self, infile): """ Read in a header from an already open file """ # 1024 bytes gives 256x32 bit integers header = infile.read(1024) for i, j in [ ("M", 0), ("A", 4), ("S", 8), ("K", 12) ]: if header[j] != i: raise Exception("Not a fit2d mask file") fit2dhdr = numpy.fromstring(header, numpy.int32) self.dim1 = fit2dhdr[4] # 1 less than Andy's fortran self.dim2 = fit2dhdr[5]
[docs] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ fin = self._open(fname) self._readheader(fin) # Compute image size self.bytecode = numpy.uint8 self.bpp = len(numpy.array(0, self.bytecode).tostring()) # integer division num_ints = (self.dim1 + 31) // 32 total = self.dim2 * num_ints * 4 data = fin.read(total) assert len(data) == total fin.close() # Now to unpack it data = numpy.fromstring(data, numpy.uint8) data = numpy.reshape(data, (self.dim2, num_ints * 4)) result = numpy.zeros((self.dim2, num_ints * 4 * 8), numpy.uint8) # Unpack using bitwise comparisons to 2**n bits = numpy.ones((1), numpy.uint8) for i in range(8): temp = numpy.bitwise_and(bits, data) result[:, i::8] = temp.astype(numpy.uint8) bits = bits * 2 # Extra rows needed for packing odd dimensions spares = num_ints * 4 * 8 - self.dim1 if spares == 0: self.data = numpy.where(result == 0, 0, 1) else: self.data = numpy.where(result[:, :-spares] == 0, 0, 1) # Transpose appears to be needed to match edf reader (scary??) # self.data = numpy.transpose(self.data) self.data = numpy.reshape(self.data.astype(numpy.uint16), (self.dim2, self.dim1)) self.pilimage = None return self
[docs] def write(self, fname): """ Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats) """ raise Exception("Not implemented yet")
@staticmethod
[docs] def checkData(data=None): if data is None: return None else: return data.astype(int)
fabio-0.1.3/doc/html/_modules/fabio/TiffIO.html0000644000175000017500000061022112233250023021757 0ustar jeromejerome00000000000000 fabio.TiffIO — FabIO 0.1.3 documentation

Source code for fabio.TiffIO

#/*##########################################################################
# Copyright (C) 2012 European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# This file is free software; you can redistribute it and/or modify it 
# under the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option) 
# any later version.
#
# PyMca is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
# details.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__revision__ = 1501

import sys
import os
import struct
import numpy

DEBUG = 0
ALLOW_MULTIPLE_STRIPS = False

TAG_ID = { 256:"NumberOfColumns", # S or L ImageWidth
            257:"NumberOfRows", # S or L ImageHeight
            258:"BitsPerSample", # S Number of bits per component
            259:"Compression", # SHORT (1 - NoCompression, ... 
            262:"PhotometricInterpretation", # SHORT (0 - WhiteIsZero, 1 -BlackIsZero, 2 - RGB, 3 - Palette color
            270:"ImageDescription", # ASCII
            273:"StripOffsets", # S or L, for each strip, the byte offset of the strip
            278:"RowsPerStrip", # S or L, number of rows in each back may be not for the last
            279:"StripByteCounts", # S or L, The number of bytes in the strip AFTER any compression
            305:"Software", # ASCII
            306:"Date", # ASCII
            320:"Colormap", # Colormap of Palette-color Images 
            339:"SampleFormat", # SHORT Interpretation of data in each pixel
            }

#TILES ARE TO BE SUPPORTED TOO ...
TAG_NUMBER_OF_COLUMNS = 256
TAG_NUMBER_OF_ROWS = 257
TAG_BITS_PER_SAMPLE = 258
TAG_PHOTOMETRIC_INTERPRETATION = 262
TAG_COMPRESSION = 259
TAG_IMAGE_DESCRIPTION = 270
TAG_STRIP_OFFSETS = 273
TAG_ROWS_PER_STRIP = 278
TAG_STRIP_BYTE_COUNTS = 279
TAG_SOFTWARE = 305
TAG_DATE = 306
TAG_COLORMAP = 320
TAG_SAMPLE_FORMAT = 339

FIELD_TYPE = {1:('BYTE', "B"),
               2:('ASCII', "s"), #string ending with binary zero
               3:('SHORT', "H"),
               4:('LONG', "I"),
               5:('RATIONAL', "II"),
               6:('SBYTE', "b"),
               7:('UNDEFINED', "B"),
               8:('SSHORT', "h"),
               9:('SLONG', "i"),
               10:('SRATIONAL', "ii"),
               11:('FLOAT', "f"),
               12:('DOUBLE', "d")}

FIELD_TYPE_OUT = { 'B':   1,
                   's':   2,
                   'H':   3,
                   'I':   4,
                   'II':  5,
                   'b':   6,
                   'h':   8,
                   'i':   9,
                   'ii': 10,
                   'f':  11,
                   'd':  12}

#sample formats (http://www.awaresystems.be/imaging/tiff/tiffflags/sampleformat.html)
SAMPLE_FORMAT_UINT = 1
SAMPLE_FORMAT_INT = 2
SAMPLE_FORMAT_FLOAT = 3   #floating point
SAMPLE_FORMAT_VOID = 4   #undefined data, usually assumed UINT
SAMPLE_FORMAT_COMPLEXINT = 5
SAMPLE_FORMAT_COMPLEXIEEEFP = 6



[docs]class TiffIO(object): def __init__(self, filename, mode=None, cache_length=20, mono_output=False): if mode is None: mode = 'rb' if 'b' not in mode: mode = mode + 'b' if 'a' in mode.lower(): raise IOError("Mode %s makes no sense on TIFF files. Consider 'rb+'" % mode) if ('w' in mode): if '+' not in mode: mode += '+' #if isinstance(filename, file): #does not work in python 3 if hasattr(filename, "seek"): fd = filename self._access = None else: #the b is needed for windows and python 3 fd = open(filename, mode) self._access = mode self._initInternalVariables(fd) self._maxImageCacheLength = cache_length self._forceMonoOutput = mono_output def _initInternalVariables(self, fd=None): if fd is None: fd = self.fd else: self.fd = fd # read the order fd.seek(0) order = fd.read(2).decode() if len(order): if order == "II": #intel, little endian fileOrder = "little" self._structChar = '<' elif order == "MM": #motorola, high endian fileOrder = "big" self._structChar = '>' else: raise IOError("File is not a Mar CCD file, nor a TIFF file") a = fd.read(2) fortyTwo = struct.unpack(self._structChar + "H", a)[0] if fortyTwo != 42: raise IOError("Invalid TIFF version %d" % fortyTwo) else: if DEBUG: print("VALID TIFF VERSION") if sys.byteorder != fileOrder: swap = True else: swap = False else: if sys.byteorder == "little": self._structChar = '<' else: self._structChar = '>' swap = False self._swap = swap self._IFD = [] self._imageDataCacheIndex = [] self._imageDataCache = [] self._imageInfoCacheIndex = [] self._imageInfoCache = [] self.getImageFileDirectories(fd) def __makeSureFileIsOpen(self): if not self.fd.closed: return if DEBUG: print("Reopening closed file") fileName = self.fd.name if self._access is None: #we do not own the file #open in read mode newFile = open(fileName, 'rb') else: newFile = open(fileName, self._access) self.fd = newFile def __makeSureFileIsClosed(self): if self._access is None: #we do not own the file if DEBUG: print("Not closing not owned file") return if not self.fd.closed: self.fd.close()
[docs] def getNumberOfImages(self): #update for the case someone has done anything? self._updateIFD() return len(self._IFD)
def _updateIFD(self): self.__makeSureFileIsOpen() self.getImageFileDirectories() self.__makeSureFileIsClosed()
[docs] def getImageFileDirectories(self, fd=None): if fd is None: fd = self.fd else: self.fd = fd st = self._structChar fd.seek(4) self._IFD = [] nImages = 0 fmt = st + 'I' inStr = fd.read(struct.calcsize(fmt)) if not len(inStr): offsetToIFD = 0 else: offsetToIFD = struct.unpack(fmt, inStr)[0] if DEBUG: print("Offset to first IFD = %d" % offsetToIFD) while offsetToIFD != 0: self._IFD.append(offsetToIFD) nImages += 1 fd.seek(offsetToIFD) fmt = st + 'H' numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] if DEBUG: print("Number of directory entries = %d" % numberOfDirectoryEntries) fmt = st + 'I' fd.seek(offsetToIFD + 2 + 12 * numberOfDirectoryEntries) offsetToIFD = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] if DEBUG: print("Next Offset to IFD = %d" % offsetToIFD) #offsetToIFD = 0 if DEBUG: print("Number of images found = %d" % nImages) return nImages
def _parseImageFileDirectory(self, nImage): offsetToIFD = self._IFD[nImage] st = self._structChar fd = self.fd fd.seek(offsetToIFD) fmt = st + 'H' numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] if DEBUG: print("Number of directory entries = %d" % numberOfDirectoryEntries) fmt = st + 'HHI4s' tagIDList = [] fieldTypeList = [] nValuesList = [] valueOffsetList = [] for i in range(numberOfDirectoryEntries): tagID, fieldType, nValues, valueOffset = struct.unpack(fmt, fd.read(12)) tagIDList.append(tagID) fieldTypeList.append(fieldType) nValuesList.append(nValues) if nValues == 1: ftype, vfmt = FIELD_TYPE[fieldType] if ftype not in ['ASCII', 'RATIONAL', 'SRATIONAL']: vfmt = st + vfmt actualValue = struct.unpack(vfmt, valueOffset[0: struct.calcsize(vfmt)])[0] valueOffsetList.append(actualValue) else: valueOffsetList.append(valueOffset) elif (nValues < 5) and (fieldType == 2): ftype, vfmt = FIELD_TYPE[fieldType] vfmt = st + "%d%s" % (nValues, vfmt) actualValue = struct.unpack(vfmt, valueOffset[0: struct.calcsize(vfmt)])[0] valueOffsetList.append(actualValue) else: valueOffsetList.append(valueOffset) if DEBUG: if tagID in TAG_ID: print("tagID = %s" % TAG_ID[tagID]) else: print("tagID = %d" % tagID) print("fieldType = %s" % FIELD_TYPE[fieldType][0]) print("nValues = %d" % nValues) #if nValues == 1: # print("valueOffset = %s" % valueOffset) return tagIDList, fieldTypeList, nValuesList, valueOffsetList def _readIFDEntry(self, tag, tagIDList, fieldTypeList, nValuesList, valueOffsetList): fd = self.fd st = self._structChar idx = tagIDList.index(tag) nValues = nValuesList[idx] output = [] ftype, vfmt = FIELD_TYPE[fieldTypeList[idx]] vfmt = st + "%d%s" % (nValues, vfmt) requestedBytes = struct.calcsize(vfmt) if nValues == 1: output.append(valueOffsetList[idx]) elif requestedBytes < 5: output.append(valueOffsetList[idx]) else: offset = fd.seek(struct.unpack(st + "I", valueOffsetList[idx])[0]) output = struct.unpack(vfmt, fd.read(requestedBytes)) return output
[docs] def getData(self, nImage, **kw): if nImage >= len(self._IFD): #update prior to raise an index error error self._updateIFD() return self._readImage(nImage, **kw)
[docs] def getImage(self, nImage): return self.getData(nImage)
[docs] def getInfo(self, nImage, **kw): if nImage >= len(self._IFD): #update prior to raise an index error error self._updateIFD() current = self._IFD[nImage] return self._readInfo(nImage)
def _readInfo(self, nImage, close=True): if nImage in self._imageInfoCacheIndex: if DEBUG: print("Reading info from cache") return self._imageInfoCache[self._imageInfoCacheIndex.index(nImage)] #read the header self.__makeSureFileIsOpen() tagIDList, fieldTypeList, nValuesList, valueOffsetList = self._parseImageFileDirectory(nImage) #rows and columns nColumns = valueOffsetList[tagIDList.index(TAG_NUMBER_OF_COLUMNS)] nRows = valueOffsetList[tagIDList.index(TAG_NUMBER_OF_ROWS)] #bits per sample idx = tagIDList.index(TAG_BITS_PER_SAMPLE) nBits = valueOffsetList[idx] if nValuesList[idx] != 1: #this happens with RGB and friends, nBits is not a single value nBits = self._readIFDEntry(TAG_BITS_PER_SAMPLE, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if TAG_COLORMAP in tagIDList: idx = tagIDList.index(TAG_COLORMAP) tmpColormap = self._readIFDEntry(TAG_COLORMAP, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if max(tmpColormap) > 255: tmpColormap = numpy.array(tmpColormap, dtype=numpy.uint16) tmpColormap = (tmpColormap / 256.).astype(numpy.uint8) else: tmpColormap = numpy.array(tmpColormap, dtype=numpy.uint8) tmpColormap.shape = 3, -1 colormap = numpy.zeros((tmpColormap.shape[-1], 3), tmpColormap.dtype) colormap[:, :] = tmpColormap.T tmpColormap = None else: colormap = None #sample format if TAG_SAMPLE_FORMAT in tagIDList: sampleFormat = valueOffsetList[tagIDList.index(TAG_SAMPLE_FORMAT)] else: #set to unknown sampleFormat = SAMPLE_FORMAT_VOID # compression compression = False compression_type = 1 if TAG_COMPRESSION in tagIDList: compression_type = valueOffsetList[tagIDList.index(TAG_COMPRESSION)] if compression_type == 1: compression = False else: compression = True #photometric interpretation interpretation = 1 if TAG_PHOTOMETRIC_INTERPRETATION in tagIDList: interpretation = valueOffsetList[tagIDList.index(TAG_PHOTOMETRIC_INTERPRETATION)] else: print("WARNING: Non standard TIFF. Photometric interpretation TAG missing") helpString = "" if sys.version > '2.6': helpString = eval('b""') if TAG_IMAGE_DESCRIPTION in tagIDList: imageDescription = self._readIFDEntry(TAG_IMAGE_DESCRIPTION, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if type(imageDescription) in [type([1]), type((1,))]: imageDescription = helpString.join(imageDescription) else: imageDescription = "%d/%d" % (nImage + 1, len(self._IFD)) if sys.version < '3.0': defaultSoftware = "Unknown Software" else: defaultSoftware = bytes("Unknown Software", encoding='utf-8') if TAG_SOFTWARE in tagIDList: software = self._readIFDEntry(TAG_SOFTWARE, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if type(software) in [type([1]), type((1,))]: software = helpString.join(software) else: software = defaultSoftware if software == defaultSoftware: try: if sys.version < '3.0': if imageDescription.upper().startswith("IMAGEJ"): software = imageDescription.split("=")[0] else: tmpString = imageDescription.decode() if tmpString.upper().startswith("IMAGEJ"): software = bytes(tmpString.split("=")[0], encoding='utf-8') except: pass if TAG_DATE in tagIDList: date = self._readIFDEntry(TAG_DATE, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if type(date) in [type([1]), type((1,))]: date = helpString.join(date) else: date = "Unknown Date" stripOffsets = self._readIFDEntry(TAG_STRIP_OFFSETS, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if TAG_ROWS_PER_STRIP in tagIDList: rowsPerStrip = self._readIFDEntry(TAG_ROWS_PER_STRIP, tagIDList, fieldTypeList, nValuesList, valueOffsetList)[0] else: rowsPerStrip = nRows print("WARNING: Non standard TIFF. Rows per strip TAG missing") if TAG_STRIP_BYTE_COUNTS in tagIDList: stripByteCounts = self._readIFDEntry(TAG_STRIP_BYTE_COUNTS, tagIDList, fieldTypeList, nValuesList, valueOffsetList) else: print("WARNING: Non standard TIFF. Strip byte counts TAG missing") if hasattr(nBits, 'index'): expectedSum = 0 for n in nBits: expectedSum += int(nRows * nColumns * n / 8) else: expectedSum = int(nRows * nColumns * nBits / 8) stripByteCounts = [expectedSum] if close: self.__makeSureFileIsClosed() if self._forceMonoOutput and (interpretation > 1): #color image but asked monochrome output nBits = 32 colormap = None sampleFormat = SAMPLE_FORMAT_FLOAT interpretation = 1 #we cannot rely on any cache in this case useInfoCache = False if DEBUG: print("FORCED MONO") else: useInfoCache = True info = {} info["nRows"] = nRows info["nColumns"] = nColumns info["nBits"] = nBits info["compression"] = compression info["compression_type"] = compression_type info["imageDescription"] = imageDescription info["stripOffsets"] = stripOffsets #This contains the file offsets to the data positions info["rowsPerStrip"] = rowsPerStrip info["stripByteCounts"] = stripByteCounts #bytes in strip since I do not support compression info["software"] = software info["date"] = date info["colormap"] = colormap info["sampleFormat"] = sampleFormat info["photometricInterpretation"] = interpretation infoDict = {} if sys.version < '3.0': testString = 'PyMca' else: testString = eval('b"PyMca"') if software.startswith(testString): #str to make sure python 2.x sees it as string and not unicode if sys.version < '3.0': descriptionString = imageDescription else: descriptionString = str(imageDescription.decode()) #interpret the image description in terms of supplied #information at writing time items = descriptionString.split('=') for i in range(int(len(items) / 2)): key = "%s" % items[i * 2] #get rid of the \n at the end of the value value = "%s" % items[i * 2 + 1][:-1] infoDict[key] = value info['info'] = infoDict if (self._maxImageCacheLength > 0) and useInfoCache: self._imageInfoCacheIndex.insert(0, nImage) self._imageInfoCache.insert(0, info) if len(self._imageInfoCacheIndex) > self._maxImageCacheLength: self._imageInfoCacheIndex = self._imageInfoCacheIndex[:self._maxImageCacheLength] self._imageInfoCache = self._imageInfoCache[:self._maxImageCacheLength] return info def _readImage(self, nImage, **kw): if DEBUG: print("Reading image %d" % nImage) if 'close' in kw: close = kw['close'] else: close = True rowMin = kw.get('rowMin', None) rowMax = kw.get('rowMax', None) if nImage in self._imageDataCacheIndex: if DEBUG: print("Reading image data from cache") return self._imageDataCache[self._imageDataCacheIndex.index(nImage)] self.__makeSureFileIsOpen() if self._forceMonoOutput: oldMono = True else: oldMono = False try: self._forceMonoOutput = False info = self._readInfo(nImage, close=False) self._forceMonoOutput = oldMono except: self._forceMonoOutput = oldMono raise compression = info['compression'] compression_type = info['compression_type'] if compression: if compression_type != 32773: raise IOError("Compressed TIFF images not supported except packbits") else: #PackBits compression if DEBUG: print("Using PackBits compression") interpretation = info["photometricInterpretation"] if interpretation == 2: #RGB pass #raise IOError("RGB Image. Only grayscale images supported") elif interpretation == 3: #Palette Color Image pass #raise IOError("Palette-color Image. Only grayscale images supported") elif interpretation > 2: #Palette Color Image raise IOError("Only grayscale images supported") nRows = info["nRows"] nColumns = info["nColumns"] nBits = info["nBits"] colormap = info["colormap"] sampleFormat = info["sampleFormat"] if rowMin is None: rowMin = 0 if rowMax is None: rowMax = nRows - 1 if rowMin < 0: rowMin = nRows - rowMin if rowMax < 0: rowMax = nRows - rowMax if rowMax < rowMin: txt = "Max Row smaller than Min Row. Reverse selection not supported" raise NotImplemented(txt) if rowMin >= nRows: raise IndexError("Image only has %d rows" % nRows) if rowMax >= nRows: raise IndexError("Image only has %d rows" % nRows) if sampleFormat == SAMPLE_FORMAT_FLOAT: if nBits == 32: dtype = numpy.float32 elif nBits == 64: dtype = numpy.float64 else: raise ValueError("Unsupported number of bits for a float: %d" % nBits) elif sampleFormat in [SAMPLE_FORMAT_UINT, SAMPLE_FORMAT_VOID]: if nBits in [8, (8, 8, 8), [8, 8, 8]]: dtype = numpy.uint8 elif nBits in [16, (16, 16, 16), [16, 16, 16]]: dtype = numpy.uint16 elif nBits in [32, (32, 32, 32), [32, 32, 32]]: dtype = numpy.uint32 elif nBits in [64, (64, 64, 64), [64, 64, 64]]: dtype = numpy.uint64 else: raise ValueError("Unsupported number of bits for unsigned int: %s" % (nBits,)) elif sampleFormat == SAMPLE_FORMAT_INT: if nBits in [8, (8, 8, 8), [8, 8, 8]]: dtype = numpy.int8 elif nBits in [16, (16, 16, 16), [16, 16, 16]]: dtype = numpy.int16 elif nBits in [32, (32, 32, 32), [32, 32, 32]]: dtype = numpy.int32 elif nBits in [64, (64, 64, 64), [64, 64, 64]]: dtype = numpy.int64 else: raise ValueError("Unsupported number of bits for signed int: %s" % (nBits,)) else: raise ValueError("Unsupported combination. Bits = %s Format = %d" % (nBits, sampleFormat)) if hasattr(nBits, 'index'): image = numpy.zeros((nRows, nColumns, len(nBits)), dtype=dtype) elif colormap is not None: #should I use colormap dtype? image = numpy.zeros((nRows, nColumns, 3), dtype=dtype) else: image = numpy.zeros((nRows, nColumns), dtype=dtype) fd = self.fd st = self._structChar stripOffsets = info["stripOffsets"] #This contains the file offsets to the data positions rowsPerStrip = info["rowsPerStrip"] stripByteCounts = info["stripByteCounts"] #bytes in strip since I do not support compression rowStart = 0 if len(stripOffsets) == 1: bytesPerRow = int(stripByteCounts[0] / rowsPerStrip) fd.seek(stripOffsets[0] + rowMin * bytesPerRow) nBytes = (rowMax - rowMin + 1) * bytesPerRow if self._swap: readout = numpy.fromstring(fd.read(nBytes), dtype).byteswap() else: readout = numpy.fromstring(fd.read(nBytes), dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif info['colormap'] is not None: readout = colormap[readout] else: readout.shape = -1, nColumns image[rowMin:rowMax + 1, :] = readout else: for i in range(len(stripOffsets)): #the amount of rows nRowsToRead = rowsPerStrip rowEnd = int(min(rowStart + nRowsToRead, nRows)) if rowEnd < rowMin: rowStart += nRowsToRead continue if (rowStart > rowMax): break #we are in position fd.seek(stripOffsets[i]) #the amount of bytes to read nBytes = stripByteCounts[i] if compression_type == 32773: try: bufferBytes = bytes() except: #python 2.5 ... bufferBytes = "" #packBits readBytes = 0 #intermediate buffer tmpBuffer = fd.read(nBytes) while readBytes < nBytes: n = struct.unpack('b', tmpBuffer[readBytes:(readBytes + 1)])[0] readBytes += 1 if n >= 0: #should I prevent reading more than the #length of the chain? Let's python raise #the exception... bufferBytes += tmpBuffer[readBytes:\ readBytes + (n + 1)] readBytes += (n + 1) elif n > -128: bufferBytes += (-n + 1) * tmpBuffer[readBytes:(readBytes + 1)] readBytes += 1 else: #if read -128 ignore the byte continue if self._swap: readout = numpy.fromstring(bufferBytes, dtype).byteswap() else: readout = numpy.fromstring(bufferBytes, dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif info['colormap'] is not None: readout = colormap[readout] readout.shape = -1, nColumns, 3 else: readout.shape = -1, nColumns image[rowStart:rowEnd, :] = readout else: if 1: #use numpy if self._swap: readout = numpy.fromstring(fd.read(nBytes), dtype).byteswap() else: readout = numpy.fromstring(fd.read(nBytes), dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif colormap is not None: readout = colormap[readout] readout.shape = -1, nColumns, 3 else: readout.shape = -1, nColumns image[rowStart:rowEnd, :] = readout else: #using struct readout = numpy.array(struct.unpack(st + "%df" % int(nBytes / 4), fd.read(nBytes)), dtype=dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif colormap is not None: readout = colormap[readout] readout.shape = -1, nColumns, 3 else: readout.shape = -1, nColumns image[rowStart:rowEnd, :] = readout rowStart += nRowsToRead if close: self.__makeSureFileIsClosed() if len(image.shape) == 3: #color image if self._forceMonoOutput: #color image, convert to monochrome image = (image[:, :, 0] * 0.114 + \ image[:, :, 1] * 0.587 + \ image[:, :, 2] * 0.299).astype(numpy.float32) if (rowMin == 0) and (rowMax == (nRows - 1)): self._imageDataCacheIndex.insert(0, nImage) self._imageDataCache.insert(0, image) if len(self._imageDataCacheIndex) > self._maxImageCacheLength: self._imageDataCacheIndex = self._imageDataCacheIndex[:self._maxImageCacheLength] self._imageDataCache = self._imageDataCache[:self._maxImageCacheLength] return image
[docs] def writeImage(self, image0, info=None, software=None, date=None): if software is None: software = 'PyMca.TiffIO' #if date is None: # date = time.ctime() self.__makeSureFileIsOpen() fd = self.fd #prior to do anything, perform some tests if not len(image0.shape): raise ValueError("Empty image") if len(image0.shape) == 1: #get a different view image = image0[:] image.shape = 1, -1 else: image = image0 if image.dtype == numpy.float64: image = image.astype(numpy.float32) fd.seek(0) mode = fd.mode name = fd.name if 'w' in mode: #we have to overwrite the file self.__makeSureFileIsClosed() fd = None if os.path.exists(name): os.remove(name) fd = open(name, mode='wb+') self._initEmptyFile(fd) self.fd = fd #read the file size self.__makeSureFileIsOpen() fd = self.fd fd.seek(0, os.SEEK_END) endOfFile = fd.tell() if fd.tell() == 0: self._initEmptyFile(fd) fd.seek(0, os.SEEK_END) endOfFile = fd.tell() #init internal variables self._initInternalVariables(fd) st = self._structChar #get the image file directories nImages = self.getImageFileDirectories() if DEBUG: print("File contains %d images" % nImages) if nImages == 0: fd.seek(4) fmt = st + 'I' fd.write(struct.pack(fmt, endOfFile)) else: fd.seek(self._IFD[-1]) fmt = st + 'H' numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] fmt = st + 'I' pos = self._IFD[-1] + 2 + 12 * numberOfDirectoryEntries fd.seek(pos) fmt = st + 'I' fd.write(struct.pack(fmt, endOfFile)) fd.flush() #and we can write at the end of the file, find out the file length fd.seek(0, os.SEEK_END) #get the description information from the input information if info is None: description = info else: description = "%s" % "" for key in info.keys(): description += "%s=%s\n" % (key, info[key]) #get the image file directory outputIFD = self._getOutputIFD(image, description=description, software=software, date=date) #write the new IFD fd.write(outputIFD) #write the image if self._swap: fd.write(image.byteswap().tostring()) else: fd.write(image.tostring()) fd.flush() self.fd = fd self.__makeSureFileIsClosed()
def _initEmptyFile(self, fd=None): if fd is None: fd = self.fd if sys.byteorder == "little": order = "II" #intel, little endian fileOrder = "little" self._structChar = '<' else: order = "MM" #motorola, high endian fileOrder = "big" self._structChar = '>' st = self._structChar if fileOrder == sys.byteorder: self._swap = False else: self._swap = True fd.seek(0) if sys.version < '3.0': fd.write(struct.pack(st + '2s', order)) fd.write(struct.pack(st + 'H', 42)) fd.write(struct.pack(st + 'I', 0)) else: fd.write(struct.pack(st + '2s', bytes(order, 'utf-8'))) fd.write(struct.pack(st + 'H', 42)) fd.write(struct.pack(st + 'I', 0)) fd.flush() def _getOutputIFD(self, image, description=None, software=None, date=None): #the tags have to be in order #the very minimum is #256:"NumberOfColumns", # S or L ImageWidth #257:"NumberOfRows", # S or L ImageHeight #258:"BitsPerSample", # S Number of bits per component #259:"Compression", # SHORT (1 - NoCompression, ... #262:"PhotometricInterpretation", # SHORT (0 - WhiteIsZero, 1 -BlackIsZero, 2 - RGB, 3 - Palette color #270:"ImageDescription", # ASCII #273:"StripOffsets", # S or L, for each strip, the byte offset of the strip #278:"RowsPerStrip", # S or L, number of rows in each back may be not for the last #279:"StripByteCounts", # S or L, The number of bytes in the strip AFTER any compression #305:"Software", # ASCII #306:"Date", # ASCII #339:"SampleFormat", # SHORT Interpretation of data in each pixel nDirectoryEntries = 9 imageDescription = None if description is not None: descriptionLength = len(description) while descriptionLength < 4: description = description + " " descriptionLength = len(description) if sys.version >= '3.0': description = bytes(description, 'utf-8') elif type(description) != type(""): try: description = description.decode('utf-8') except UnicodeDecodeError: try: description = description.decode('latin-1') except UnicodeDecodeError: description = "%s" % description if sys.version > '2.6': description = description.encode('utf-8', errors="ignore") description = "%s" % description descriptionLength = len(description) imageDescription = struct.pack("%ds" % descriptionLength, description) nDirectoryEntries += 1 #software if software is not None: softwareLength = len(software) while softwareLength < 4: software = software + " " softwareLength = len(software) if sys.version >= '3.0': software = bytes(software, 'utf-8') softwarePackedString = struct.pack("%ds" % softwareLength, software) nDirectoryEntries += 1 else: softwareLength = 0 if date is not None: dateLength = len(date) if sys.version >= '3.0': date = bytes(date, 'utf-8') datePackedString = struct.pack("%ds" % dateLength, date) dateLength = len(datePackedString) nDirectoryEntries += 1 else: dateLength = 0 nRows, nColumns = image.shape dtype = image.dtype bitsPerSample = int(dtype.str[-1]) * 8 #only uncompressed data compression = 1 #interpretation, black is zero interpretation = 1 #image description if imageDescription is not None: descriptionLength = len(imageDescription) else: descriptionLength = 0 #strip offsets #we are putting them after the directory and the directory is #at the end of the file self.fd.seek(0, os.SEEK_END) endOfFile = self.fd.tell() if endOfFile == 0: #empty file endOfFile = 8 #rows per strip if ALLOW_MULTIPLE_STRIPS: #try to segment the image in several pieces if not (nRows % 4): rowsPerStrip = int(nRows / 4) elif not (nRows % 10): rowsPerStrip = int(nRows / 10) elif not (nRows % 8): rowsPerStrip = int(nRows / 8) elif not (nRows % 4): rowsPerStrip = int(nRows / 4) elif not (nRows % 2): rowsPerStrip = int(nRows / 2) else: rowsPerStrip = nRows else: rowsPerStrip = nRows #stripByteCounts stripByteCounts = int(nColumns * rowsPerStrip * bitsPerSample / 8) if descriptionLength > 4: stripOffsets0 = endOfFile + dateLength + descriptionLength + \ 2 + 12 * nDirectoryEntries + 4 else: stripOffsets0 = endOfFile + dateLength + \ 2 + 12 * nDirectoryEntries + 4 if softwareLength > 4: stripOffsets0 += softwareLength stripOffsets = [stripOffsets0] stripOffsetsLength = 0 stripOffsetsString = None st = self._structChar if rowsPerStrip != nRows: nStripOffsets = int(nRows / rowsPerStrip) fmt = st + 'I' stripOffsetsLength = struct.calcsize(fmt) * nStripOffsets stripOffsets0 += stripOffsetsLength #the length for the stripByteCounts will be the same stripOffsets0 += stripOffsetsLength stripOffsets = [] for i in range(nStripOffsets): value = stripOffsets0 + i * stripByteCounts stripOffsets.append(value) if i == 0: stripOffsetsString = struct.pack(fmt, value) stripByteCountsString = struct.pack(fmt, stripByteCounts) else: stripOffsetsString += struct.pack(fmt, value) stripByteCountsString += struct.pack(fmt, stripByteCounts) if DEBUG: print("IMAGE WILL START AT %d" % stripOffsets[0]) #sample format if dtype in [numpy.float32, numpy.float64] or\ dtype.str[-2] == 'f': sampleFormat = SAMPLE_FORMAT_FLOAT elif dtype in [numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64]: sampleFormat = SAMPLE_FORMAT_UINT elif dtype in [numpy.int8, numpy.int16, numpy.int32, numpy.int64]: sampleFormat = SAMPLE_FORMAT_INT else: raise ValueError("Unsupported data type %s" % dtype) info = {} info["nColumns"] = nColumns info["nRows"] = nRows info["nBits"] = bitsPerSample info["compression"] = compression info["photometricInterpretation"] = interpretation info["stripOffsets"] = stripOffsets info["rowsPerStrip"] = rowsPerStrip info["stripByteCounts"] = stripByteCounts info["date"] = date info["sampleFormat"] = sampleFormat outputIFD = "" if sys.version > '2.6': outputIFD = eval('b""') fmt = st + "H" outputIFD += struct.pack(fmt, nDirectoryEntries) fmt = st + "HHII" outputIFD += struct.pack(fmt, TAG_NUMBER_OF_COLUMNS, FIELD_TYPE_OUT['I'], 1, info["nColumns"]) outputIFD += struct.pack(fmt, TAG_NUMBER_OF_ROWS, FIELD_TYPE_OUT['I'], 1, info["nRows"]) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_BITS_PER_SAMPLE, FIELD_TYPE_OUT['H'], 1, info["nBits"], 0) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_COMPRESSION, FIELD_TYPE_OUT['H'], 1, info["compression"], 0) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_PHOTOMETRIC_INTERPRETATION, FIELD_TYPE_OUT['H'], 1, info["photometricInterpretation"], 0) if imageDescription is not None: descriptionLength = len(imageDescription) if descriptionLength > 4: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_IMAGE_DESCRIPTION, FIELD_TYPE_OUT['s'], descriptionLength, info["stripOffsets"][0] - \ 2 * stripOffsetsLength - \ descriptionLength) else: #it has to have length 4 fmt = st + 'HHI%ds' % descriptionLength outputIFD += struct.pack(fmt, TAG_IMAGE_DESCRIPTION, FIELD_TYPE_OUT['s'], descriptionLength, description) if len(stripOffsets) == 1: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_OFFSETS, FIELD_TYPE_OUT['I'], 1, info["stripOffsets"][0]) else: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_OFFSETS, FIELD_TYPE_OUT['I'], len(stripOffsets), info["stripOffsets"][0] - 2 * stripOffsetsLength) fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_ROWS_PER_STRIP, FIELD_TYPE_OUT['I'], 1, info["rowsPerStrip"]) if len(stripOffsets) == 1: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_BYTE_COUNTS, FIELD_TYPE_OUT['I'], 1, info["stripByteCounts"]) else: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_BYTE_COUNTS, FIELD_TYPE_OUT['I'], len(stripOffsets), info["stripOffsets"][0] - stripOffsetsLength) if software is not None: if softwareLength > 4: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_SOFTWARE, FIELD_TYPE_OUT['s'], softwareLength, info["stripOffsets"][0] - \ 2 * stripOffsetsLength - \ descriptionLength - softwareLength - dateLength) else: #it has to have length 4 fmt = st + 'HHI%ds' % softwareLength outputIFD += struct.pack(fmt, TAG_SOFTWARE, FIELD_TYPE_OUT['s'], softwareLength, softwarePackedString) if date is not None: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_DATE, FIELD_TYPE_OUT['s'], dateLength, info["stripOffsets"][0] - \ 2 * stripOffsetsLength - \ descriptionLength - dateLength) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_SAMPLE_FORMAT, FIELD_TYPE_OUT['H'], 1, info["sampleFormat"], 0) fmt = st + 'I' outputIFD += struct.pack(fmt, 0) if softwareLength > 4: outputIFD += softwarePackedString if date is not None: outputIFD += datePackedString if imageDescription is not None: if descriptionLength > 4: outputIFD += imageDescription if stripOffsetsString is not None: outputIFD += stripOffsetsString outputIFD += stripByteCountsString return outputIFD
if __name__ == "__main__": filename = sys.argv[1] dtype = numpy.uint16 if not os.path.exists(filename): print("Testing file creation") tif = TiffIO(filename, mode='wb+') data = numpy.arange(10000).astype(dtype) data.shape = 100, 100 tif.writeImage(data, info={'Title':'1st'}) tif = None if os.path.exists(filename): print("Testing image appending") tif = TiffIO(filename, mode='rb+') tif.writeImage((data * 2).astype(dtype), info={'Title':'2nd'}) tif = None tif = TiffIO(filename) print("Number of images = %d" % tif.getNumberOfImages()) for i in range(tif.getNumberOfImages()): info = tif.getInfo(i) for key in info: if key not in ["colormap"]: print("%s = %s" % (key, info[key])) elif info['colormap'] is not None: print("RED %s = %s" % (key, info[key][0:10, 0])) print("GREEN %s = %s" % (key, info[key][0:10, 1])) print("BLUE %s = %s" % (key, info[key][0:10, 2])) data = tif.getImage(i)[0, 0:10] print("data [0, 0:10] = ", data)
fabio-0.1.3/doc/html/_modules/fabio/pilatusimage.html0000644000175000017500000003045312233250022023325 0ustar jeromejerome00000000000000 fabio.pilatusimage — FabIO 0.1.3 documentation

Source code for fabio.pilatusimage

#!/usr/bin/env python
#coding: utf8
"""

Authors:
........
* Henning O. Sorensen & Erik Knudsen:
  Center for Fundamental Research: Metal Structures in Four Dimensions;
  Risoe National Laboratory;
  Frederiksborgvej 399;
  DK-4000 Roskilde;
  email:erik.knudsen@risoe.dk
* Jon Wright:
  European Synchrotron Radiation Facility;
  Grenoble (France)

"""


# Base this on the tifimage (as Pilatus is tiff with a
# tiff header

from fabio.tifimage import tifimage


[docs]class pilatusimage(tifimage): """ Read in Pilatus format, also pilatus images, including header info """ def _readheader(self, infile): """ Parser based approach Gets all entries """ self.header = {} # infile = open(infile) hstr = infile.read(4096) # well not very pretty - but seems to find start of # header information if (hstr.find('# ') == -1): return self.header hstr = hstr[hstr.index('# '):] hstr = hstr[:hstr.index('\x00')] hstr = hstr.split('#') go_on = True while go_on: try: hstr.remove('') except Exception: go_on = False for line in hstr: line = line[1:line.index('\r\n')] if line.find(':') > -1: dump = line.split(':') self.header[dump[0]] = dump[1] elif line.find('=') > -1: dump = line.split('=') self.header[dump[0]] = dump[1] elif line.find(' ') > -1: i = line.find(' ') self.header[line[:i]] = line[i:] elif line.find(',') > -1: dump = line.split(',') self.header[dump[0]] = dump[1] return self.header def _read(self, fname): """ inherited from tifimage ... a Pilatus image *is a* tif image just with a header """ return tifimage.read(self, fname)
fabio-0.1.3/doc/html/_modules/fabio/openimage.html0000644000175000017500000006707512233250022022617 0ustar jeromejerome00000000000000 fabio.openimage — FabIO 0.1.3 documentation

Source code for fabio.openimage

"""

Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:henning.sorensen@risoe.dk

mods for fabio by JPW

"""
import sys, logging
logger = logging.getLogger("openimage")
from fabioutils  import FilenameObject
from fabioimage import fabioimage
import edfimage
import adscimage
import tifimage
import marccdimage
import mar345image
import fit2dmaskimage
import brukerimage
import bruker100image
import pnmimage
import GEimage
import OXDimage
import dm3image
import HiPiCimage
import pilatusimage
import fit2dspreadsheetimage
import kcdimage
import cbfimage
import xsdimage
import binaryimage

MAGIC_NUMBERS = [
    # "\42\5a" : 'bzipped'
    # "\1f\8b" : 'gzipped'
    ("FORMAT :        86" , 'bruker'),
    ("\x4d\x4d\x00\x2a"   , 'tif') ,
    # The marCCD and Pilatus formats are both standard tif with a header
    # hopefully these byte patterns are unique for the formats
    # If not the image will be read, but the is missing 
    ("\x49\x49\x2a\x00\x08\x00"   , 'marccd') ,
    ("\x49\x49\x2a\x00\x82\x00"   , 'pilatus') ,
    ("\x49\x49\x2a\x00"   , 'tif') ,
    # ADSC must come before edf
    ("{\nHEA"             , 'adsc'),
    ("{"                  , 'edf'),
    ("\r{"                , 'edf'),
    ("\n{"                , 'edf'),
    ("ADEPT"              , 'GE'),
    ("OD"                 , 'OXD'),
    ("IM"                 , 'HiPiC'),
    ('\x2d\x04'           , 'mar345'),
    ('\xd2\x04'           , 'mar345'),
    ('\x04\x2d'           , 'mar345'), #some machines may need byteswapping
    ('\x04\xd2'           , 'mar345'),
    # hint : MASK in 32 bit
    ('M\x00\x00\x00A\x00\x00\x00S\x00\x00\x00K\x00\x00\x00' , 'fit2dmask') ,
    ('\x00\x00\x00\x03'   , 'dm3'),
    ("No"                 , "kcd"),
    ("<"                  , "xsd")
    ]

[docs]def do_magic(byts): """ Try to interpret the bytes starting the file as a magic number """ for magic, format_type in MAGIC_NUMBERS: if byts.find(magic) == 0: return format_type if 0: # debugging - bruker needed 18 bytes below logger.debug("m: %s f: %s", magic, format_type) logger.debug("bytes: %s len(bytes) %s", magic, len(magic)) logger.debug("found: %s", byts.find(magic)) for i in range(len(magic)): logger.debug("%s %s %s %s ", ord(magic[i]), ord(byts[i]), magic[i], byts[i]) raise Exception("Could not interpret magic string")
[docs]def openimage(filename, frame=None): """ Try to open an image """ if isinstance(filename, FilenameObject): try: logger.debug("Attempting to open %s" % (filename.tostring())) obj = _openimage(filename.tostring()) logger.debug("Attempting to read frame %s from %s" % (frame, filename.tostring())) obj = obj.read(filename.tostring(), frame) except Exception, ex: # multiframe file #logger.debug( "DEBUG: multiframe file, start # %d"%( # filename.num) logger.debug("Exception %s, trying name %s" % (ex, filename.stem)) obj = _openimage(filename.stem) logger.debug("Reading frame %s from %s" % (filename.num, filename.stem)) obj.read(filename.stem, frame=filename.num) else: logger.debug("Attempting to open %s" % (filename)) obj = _openimage(filename) logger.debug("Attempting to read frame %s from %s" % (frame, filename)) obj = obj.read(filename, frame) return obj
[docs]def openheader(filename): """ return only the header""" obj = _openimage(filename) obj.readheader(filename) return obj
def _openimage(filename): """ determine which format for a filename and return appropriate class which can be used for opening the image """ try: imo = fabioimage() byts = imo._open(filename).read(18) filetype = do_magic(byts) if filetype == "marccd" and filename.find("mccd") == -1: # Cannot see a way around this. Need to find something # to distinguish mccd from regular tif... filetype = "tif" except IOError, error: logger.error("%s: File probably does not exist", error) raise error except: try: file_obj = FilenameObject(filename=filename) if file_obj == None: raise Exception("Unable to deconstruct filename") if (file_obj.format is not None) and\ len(file_obj.format) != 1 and \ type(file_obj.format) != type(["list"]): # one of OXD/ ADSC - should have got in previous raise Exception("openimage failed on magic bytes & name guess") filetype = file_obj.format #UNUSED filenumber = file_obj.num except Exception, error: logger.error(error) import traceback traceback.print_exc() raise Exception("Fabio could not identify " + filename) klass_name = "".join(filetype) + 'image' module = sys.modules.get("fabio." + klass_name, None) if module is not None: if hasattr(module, klass_name): klass = getattr(module, klass_name) else: raise Exception("Module %s has no image class" % module) else: raise Exception("Filetype not known %s %s" % (filename, klass_name)) obj = klass() # skip the read for read header return obj
fabio-0.1.3/doc/html/_modules/fabio/adscimage.html0000644000175000017500000006311312233250022022555 0ustar jeromejerome00000000000000 fabio.adscimage — FabIO 0.1.3 documentation

Source code for fabio.adscimage

#!/usr/bin/env python
#coding: utf8
"""

Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:erik.knudsen@risoe.dk

+ mods for fabio by JPW

"""

import numpy, logging
from fabioimage import fabioimage
logger = logging.getLogger("adscimage")

[docs]class adscimage(fabioimage): """ Read an image in ADSC format (quite similar to edf?) """ def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs)
[docs] def read(self, fname, frame=None): """ read in the file """ infile = self._open(fname, "rb") try: self._readheader(infile) except: raise Exception("Error processing adsc header") # banned by bzip/gzip??? try: infile.seek(int(self.header['HEADER_BYTES']), 0) except TypeError: # Gzipped does not allow a seek and read header is not # promising to stop in the right place infile.close() infile = self._open(fname, "rb") infile.read(int(self.header['HEADER_BYTES'])) binary = infile.read() infile.close() #now read the data into the array self.dim1 = int(self.header['SIZE1']) self.dim2 = int(self.header['SIZE2']) if 'little' in self.header['BYTE_ORDER']: try: self.data = numpy.reshape( numpy.fromstring(binary, numpy.uint16), (self.dim2, self.dim1)) except ValueError: raise IOError, 'Size spec in ADSC-header does not match ' + \ 'size of image data field' self.bytecode = numpy.uint16 logger.info("adscimage read in using low byte first (x386-order)") else: try: self.data = numpy.reshape( numpy.fromstring(binary, numpy.uint16), (self.dim2, self.dim1)).byteswap() except ValueError: raise IOError, 'Size spec in ADSC-header does not match ' + \ 'size of image data field' self.bytecode = numpy.uint16 logger.info('adscimage using high byte first (network order)') self.resetvals() return self
def _readheader(self, infile): """ read an adsc header """ line = infile.readline() bytesread = len(line) while '}' not in line: if '=' in line: (key, val) = line.split('=') self.header_keys.append(key.strip()) self.header[key.strip()] = val.strip(' ;\n') line = infile.readline() bytesread = bytesread + len(line)
[docs] def write(self, fname): """ Write adsc format """ out = '{\n' for key in self.header_keys: out += "%s = %s;\n" % (key, self.header[key]) # FIXME ??? - made padding match header bytes keyword # the cbflib example image has exactly 512... if self.header.has_key("HEADER_BYTES"): pad = int(self.header["HEADER_BYTES"]) - len(out) - 2 else: # integer division # 1234567890123456789012 # HEADER_BYTES = 1234;\n hsize = ((len(out) + 23) / 512 + 1) * 512 out += "HEADER_BYTES=%d;\n" % (hsize) pad = hsize - len(out) - 2 out += pad * ' ' + "}\n" assert len(out) % 512 == 0 , "Header is not multiple of 512" outf = open(fname, "wb") outf.write(out) # it says "unsigned_short" ? ... jpw example has: # BYTE_ORDER=big_endian; # TYPE=unsigned_short; if "little" in self.header["BYTE_ORDER"]: outf.write(self.data.astype(numpy.uint16).tostring()) else: outf.write(self.data.byteswap().astype( numpy.uint16).tostring()) outf.close()
[docs]def test(): """ testcase """ import sys, time img = adscimage() begin = time.clock() while (sys.argv[1:]): img.read(sys.argv[1]) # rim = img.toPIL16() img.rebin(2, 2) img.write('jegErEnFil0000.img') print sys.argv[1] + ": max=%d, min=%d, mean=%.2e, stddev=%.2e" % (\ img.getmax(), img.getmin(), img.getmean(), img.getstddev()) print 'integrated intensity (%d %d %d %d) =%.3f' % (\ 10, 20, 20, 40, img.integrate_area((10, 20, 20, 40))) sys.argv[1:] = sys.argv[2:] end = time.clock() print end - begin
if __name__ == '__main__': test()
fabio-0.1.3/doc/html/_modules/fabio/bruker100image.html0000644000175000017500000005113412233250022023356 0ustar jeromejerome00000000000000 fabio.bruker100image — FabIO 0.1.3 documentation

Source code for fabio.bruker100image

import numpy
import math
import logging
logger = logging.getLogger("bruker100image")
try:
    from PIL import Image
except ImportError:
    logger.warning("PIL is not installed ... trying to do without")
    Image = None

from brukerimage import brukerimage
from readbytestream import readbytestream 

[docs]class bruker100image(brukerimage):
[docs] def toPIL16(self, filename=None): if not Image: raise RuntimeError("PIL is not installed !!! ") if filename: self.read(filename) PILimage = Image.frombuffer("F", (self.dim1, self.dim2), self.data, "raw", "F;16", 0, -1) return PILimage
[docs] def read(self, fname, frame=None): f = open(fname, "rb") try: self._readheader(f) except: raise rows = int(self.header['NROWS']) cols = int(self.header['NCOLS']) npixelb = int(self.header['NPIXELB'][0]) # you had to read the Bruker docs to know this! # We are now at the start of the image - assuming # readbrukerheader worked # size = rows * cols * npixelb self.data = readbytestream(f, f.tell(), rows, cols, npixelb, datatype="int", signed='n', swap='n') noverfl = self.header['NOVERFL'].split() # now process the overflows #read the set of "underflow pixels" - these will be completely # disregarded for now data = self.data k = 0 while k < 2:#for the time being things - are done in 16 bits datatype = {'1' : numpy.uint8, '2' : numpy.uint16, '4' : numpy.uint32 }[("%d" % 2 ** k)] ar = numpy.array(numpy.fromstring(f.read(int(noverfl[k]) * (2 ** k)), datatype), numpy.uint16) #insert the the overflow pixels in the image array: #this is probably a memory intensive way of doing this - # might be done in a more clever way lim = 2 ** (8 * k) - 1 #generate an array comprising of the indices into data.ravel() # where its value equals lim. M = numpy.compress(numpy.equal(data.ravel(), lim), numpy.arange(rows * cols)) #now put values from ar into those indices numpy.put(data.ravel(), M, ar) padding = 16 * int(math.ceil(int(noverfl[k]) * (2 ** k) / 16.)) - \ int(noverfl[k]) * (2 ** k) f.seek(padding, 1) print noverfl[k] + " bytes read + %d bytes padding" % padding k = k + 1 f.close() (self.dim1, self.dim2) = (rows, cols) print self.dim1, self.dim2 self.resetvals() return self
if __name__ == '__main__': import sys, time I = bruker100image() b = time.clock() while (sys.argv[1:]): I.read(sys.argv[1]) r = I.toPIL16() I.rebin(2, 2) print sys.argv[1] + (": max=%d, min=%d, mean=%.2e, stddev=%.2e") % ( I.getmax(), I.getmin(), I.getmean(), I.getstddev()) print 'integrated intensity (%d %d %d %d) =%.3f' % ( 10, 20, 20, 40, I.integrate_area((10, 20, 20, 40))) sys.argv[1:] = sys.argv[2:] e = time.clock() print (e - b)
fabio-0.1.3/doc/html/_modules/fabio/fit2dspreadsheetimage.html0000644000175000017500000003274412233250022025111 0ustar jeromejerome00000000000000 fabio.fit2dspreadsheetimage — FabIO 0.1.3 documentation

Source code for fabio.fit2dspreadsheetimage

"""
Read the fit2d ascii image output
        + Jon Wright, ESRF
"""

import numpy

from fabioimage import fabioimage




class fit2dspreadsheetimage(fabioimage):
    """
[docs] Read a fit2d ascii format """ def _readheader(self, infile): """ TODO : test for minimal attributes? """ line = infile.readline() try: items = line.split() xdim = int(items[0]) ydim = int(items[1]) except: raise self.header['title'] = line self.header['Dim_1'] = xdim self.header['Dim_2'] = ydim def read(self, fname, frame=None): """
[docs] Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname) self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['Dim_1']) self.dim2 = int(self.header['Dim_2']) except: raise Exception("file", str(fname) + \ "is corrupt, cannot read it") bytecode = numpy.float32 self.bpp = len(numpy.array(0, bytecode).tostring()) #now read the data into the array try: vals = [] for line in infile.readlines(): try: vals.append([float(x) for x in line.split()]) except: pass self.data = numpy.array(vals).astype(bytecode) assert self.data.shape == (self.dim2, self.dim1) except: raise IOError, "Error reading ascii" self.resetvals() # ensure the PIL image is reset self.pilimage = None return self if __name__ == "__main__": import sys, time
start = time.time() img = fit2dspreadsheetimage() img.read(sys.argv[1]) print time.time() - start print img.dim1, img.dim2, img.data.shape from matplotlib.pylab import imshow, show imshow(img.data.T) show()
fabio-0.1.3/doc/html/_modules/fabio/brukerimage.html0000644000175000017500000023456312233250022023146 0ustar jeromejerome00000000000000 fabio.brukerimage — FabIO 0.1.3 documentation

Source code for fabio.brukerimage

#!/usr/bin/env python
#coding: utf8

from __future__ import with_statement

__doc__ = """

Authors: Henning O. Sorensen & Erik Knudsen
         Center for Fundamental Research: Metal Structures in Four Dimensions
         Risoe National Laboratory
         Frederiksborgvej 399
         DK-4000 Roskilde
         email:erik.knudsen@risoe.dk

Based on: openbruker,readbruker, readbrukerheader functions in the opendata
         module of ImageD11 written by Jon Wright, ESRF, Grenoble, France

Writer by Jérôme Kieffer, ESRF, Grenoble, France

"""
__authors__ = ["Henning O. Sorensen" , "Erik Knudsen", "Jon Wright", "Jérôme Kieffer"]
__date__ = "20130502"
__status__ = "development"
__copyright__ = "2007-2009 Risoe National Laboratory; 2010-2013 ESRF"
__licence__ = "GPL"

import numpy, logging, sys
from math import ceil
import os, getpass, time
logger = logging.getLogger("brukerimage")
from fabioimage import fabioimage
from fabioutils import pad
from types import StringTypes
if sys.version_info[0] < 3:
    bytes = str

[docs]class brukerimage(fabioimage): """ Read and eventually write ID11 bruker (eg smart6500) images TODO: int32 -> float32 conversion according to the "linear" keyword. This is done and works but we need to check with other program that we are appliing the right formula and not the reciprocal one. """ bpp_to_numpy = {1:numpy.uint8, 2:numpy.uint16, 4:numpy.uint32} # needed if you feel like writing - see ImageD11/scripts/edf2bruker.py SPACER = "\x1a\x04" #this is CTRL-Z CTRL-D HEADERS_KEYS = ["FORMAT", #Frame format. Always “86†or "100" for Bruker-format frames. "VERSION", #Header version #, such as: 1 to 17 (6 is obsolete). "HDRBLKS", #Header size in 512-byte blocks, such as 10 or 15. Determines where the image block begins. "TYPE", #String indicating kind of data in the frame. Used to determine if a spatial correction table was applied to the frame imag "SITE", #Site name "MODEL", #Diffractometer model "USER", #Username "SAMPLE", #Sample ID, "SETNAME", #Basic data set name "RUN", #Run number within the data set, usually starts at 0, but 1 for APEX2. "SAMPNUM", #Specimen number within the data set "TITLE", #User comments (8 lines) "NCOUNTS", #Total frame counts "NOVERFL", #Number of overflows when compression frame. "MINIMUM", #Minimum counts in a pixel (uncompressed value) "MAXIMUM", #Maximum counts in a pixel (uncompressed value) "NONTIME", #Number of on-time events "NLATE", #Number of late events. Always zero for many detectors. "FILENAM", #(Original) frame filename "CREATED", #Date and time of creation "CUMULAT", #Accumulated frame exposure time in seconds "ELAPSDR", #Requested time for last exposure in seconds "ELAPSDA", #Actual time for last exposure in seconds. "OSCILLA", #Nonzero if acquired by oscillation "NSTEPS", #steps or oscillations in this frame "RANGE", #Scan range in decimal degrees (unsigned) "START", #Starting scan angle value, decimal degrees "INCREME", #Scan angle increment between frames (signed) "NUMBER", #Sequence number of this frame in series, usually starts at 0, but 1 for APEX2 "NFRAMES", #Total number of frames in the series "ANGLES", #Diffractometer angles in Eulerian space ( 2T, OM, PH, CH). "NOVER64", #Number of pixels > 64K (actually LinearThreshold value) "NPIXELB", #Number of bytes/pixel, such as 1, 2, or 4. "NROWS", #Number of rasters in frame, such as 512, 1024, 2048, or 4096 "NCOLS", #Number of pixels/raster, such as 512, 1024, 2048 or 4096 "WORDORD", #Order of bytes in word (0=LSB first) "LONGORD", #Order of words in a longword (0=LSW first) "TARGET" , #X-ray target material: Cu, Mo, Ag, Fe, Cr, Co, Ni, W, Mn, or other. "SOURCEK", #X-ray source voltage in kV "SOURCEM", #X-ray source current in mA "FILTER" , #Filter/monochromator setting: Such as: Parallel, graphite, Ni Filter, C Filter, Zr Filter,Cross coupled Goebel Mirrors ... "CELL" , #Unit cell A,B,C,ALPHA,BETA,GAMMA "MATRIX" , #9R Orientation matrix (P3 conventions) "LOWTEMP", #Low temp flag. "TEMP", #set temperature "HITEMP", #Acquired at high temperature "ZOOM" , #Zoom: Xc, Yc, Mag used for HI-STAR detectors: 0.5 0.5 1.0 "CENTER" , #X, Y of direct beam at 2-theta = 0. These are raw center for raw frames and unwarped center for unwarped frames. "DISTANC", #Sample-detector distance, cm (see CmToGrid value) Adds: Sample-detector grid/phosphor distance, cm "TRAILER", #Byte pointer to trailer info "COMPRES", #Compression scheme ID, if any. Such as: NONE, LINEAR (Linear scale, offset for pixel values, typically 1.0, 0.0). "LINEAR", #Linear scale (1.0 0.0 for no change; 0.1 0 for divided by 10...) "PHD" , # Discriminator: Pulse height settings. X100 and X1000 only. Stores CCD phosphor efficiency (first field). "PREAMP" , #Preamp gain setting. X100 and X1000 only. SMART: Stores Roper CCD gain table index value. "CORRECT", #Flood table correction filename, UNKNOWN or LINEAR. "WARPFIL", #Brass plate correction filename, UNKNOWN or LINEAR. Note: A filename here does NOT mean that spatial correction was performed. See TYPE and string “UNWARP†to determine that. "WAVELEN", #Wavelengths (average, a1, a2) "MAXXY", #X,Y pixel # of maximum counts (from lower corner of 0,0) "AXIS", #Scan axis ib Eulerian space (1-4 for 2-theta, omega, phi, chi) (0 =none, 2 = default). "ENDING" , #Actual goniometer angles at end of frame in Eulerian space. "DETPAR" , #Detector position corrections (dX,dY,dDist,Pitch,Roll,Yaw) "LUT", #Recommended display lookup table "DISPLIM", #Recommended display limits "PROGRAM", #Name and version of program writing frame, such as: "ROTATE", #Non zero if acquired by rotation of phi during scan (or oscilate) "BITMASK", #File name of active pixel mask associated with this frame or $NULL "OCTMASK", #Octagon mask parameters to use if BITMASK=$null. Min X, Min X+Y, Min Y, Max X-Y, Max X, Max X+Y, Max Y, Max Y-X. "ESDCELL", #Unit cell parameter standard deviations "DETTYPE", #Detector or CCD chip type (as displayed on CEU). Default is MULTIWIRE but UNKNOWN is advised, can contain PIXPERCM: CMTOGRID: "NEXP", #Number of exposures: 1=single, 2=correlated sum.32 for most ccds, and 64 for 2K ccds. "CCDPARM", #CCD parameters: readnoise, e/ADU, e/photon, bias, full scale "BIS", #Potential full linear scale if rescan and attenuator used. "CHEM", #Chemical formula in CIFTAB string, such as “?†"MORPH", #Crystal morphology in CIFTAB string, such as “?†"CCOLOR", #Crystal color in CIFTAB string, such as “?†"CSIZE", #Crystal dimensions (3 ea) in CIFTAB string, such as “?†"DNSMET", #Density measurement method in CIFTAB string, such as “?†"DARK", #Name of dark current correction or NONE. "AUTORNG", #Auto-ranging: gain, high-speed time, scale, offset, full linear scale Note: If full linear scale is zero, then CCDPARM full scale is the full linear scale (BIS frames). "ZEROADJ", #Goniometer zero corrections (refined in least squares) "XTRANS", #Crystal XYZ translations (refined in least squares) "HKL&XY", #HKL and pixel XY for reciprocal space scan. GADDS only. "AXES2", #Diffractometer setting linear axes (4 ea). (X, Y, Z, Aux) "ENDING2", #Actual goniometer linear axes @ end of frame. (X, Y, Z, Aux) "FILTER2", #Monochromator 2-theta angle and monochromator roll angle. v15: Adds beam tilt angle and attenuator factor. "LEPTOS", # String for LEPTOS. "CFR", #Only in 21CFRPart11 mode, writes the checksum for header and image (2str).] ] def __init__(self, data=None , header=None): fabioimage.__init__(self, data, header) self.__bpp_file = None self.version = 86 self.__headerstring__ = "" def _readheader(self, infile): """ The bruker format uses 80 char lines in key : value format In the first 512*5 bytes of the header there should be a HDRBLKS key, whose value denotes how many 512 byte blocks are in the total header. The header is always n*5*512 bytes, otherwise it wont contain whole key: value pairs """ line = 80 blocksize = 512 nhdrblks = 5 #by default we always read 5 blocks of 512 self.__headerstring__ = infile.read(blocksize * nhdrblks) self.header = {} for i in range(0, nhdrblks * blocksize, line): if self.__headerstring__[i: i + line].find(":") > 0: key, val = self.__headerstring__[i: i + line].split(":", 1) key = key.strip() # remove the whitespace (why?) val = val.strip() if key in self.header: # append lines if key already there self.header[key] = self.header[key] + os.linesep + val else: self.header[key] = val self.header_keys.append(key) # we must have read this in the first 5*512 bytes. nhdrblks = int(self.header['HDRBLKS']) # Now read in the rest of the header blocks, appending self.__headerstring__ += infile.read(blocksize * (nhdrblks - 5)) for i in range(5 * blocksize, nhdrblks * blocksize, line): if self.__headerstring__[i: i + line].find(":") > 0: # as for first 512 bytes of header key, val = self.__headerstring__[i: i + line].split(":", 1) key = key.strip() val = val.strip() if key in self.header: self.header[key] = self.header[key] + os.linesep + val else: self.header[key] = val self.header_keys.append(key) # make a (new) header item called "datastart" self.header['datastart'] = blocksize * nhdrblks #set the image dimensions self.dim1 = int(self.header['NROWS']) self.dim2 = int(self.header['NCOLS'])
[docs] def read(self, fname, frame=None): """ Read in and unpack the pixels (including overflow table """ infile = self._open(fname, "rb") try: self._readheader(infile) except: raise rows = self.dim1 cols = self.dim2 try: # you had to read the Bruker docs to know this! npixelb = int(self.header['NPIXELB']) except Exception: errmsg = "length " + str(len(self.header['NPIXELB'])) + "\n" for byt in self.header['NPIXELB']: errmsg += "char: " + str(byt) + " " + str(ord(byt)) + "\n" logger.warning(errmsg) raise RuntimeError(errmsg) data = numpy.fromstring(infile.read(rows * cols * npixelb), dtype=self.bpp_to_numpy[npixelb]) #handle overflows nov = int(self.header['NOVERFL']) if nov > 0: # Read in the overflows # need at least int32 sized data I guess - can reach 2^21 data = data.astype(numpy.uint32) # 16 character overflows: # 9 characters of intensity # 7 character position for i in range(nov): ovfl = infile.read(16) intensity = int(ovfl[0: 9]) position = int(ovfl[9: 16]) data[position] = intensity infile.close() # Handle Float images ... if "LINEAR" in self.header: try: slope, offset = self.header["LINEAR"].split(None, 1) slope = float(slope) offset = float(offset) except Except: logger.warning("Error in converting to float data with linear parameter: %s" % self.header["LINEAR"]) self.data = data else: if slope == 1 and offset == 0: self.data = data else: #TODO: check that the formula is OK, not reverted. logger.warning("performing correction with slope=%s, offset=%s (LINEAR=%s)" % (slope, offset, self.header["LINEAR"])) self.data = (data * slope + offset).astype(numpy.float32) else: self.data = data self.data.shape = self.dim1, self.dim2 self.resetvals() self.pilimage = None return self
[docs] def write(self, fname): """ Write a bruker image """ if numpy.issubdtype(self.data.dtype, float): if "LINEAR" in self.header: try: slope, offset = self.header["LINEAR"].split(None, 1) slope = float(slope) offset = float(offset) except Except: logger.warning("Error in converting to float data with linear parameter: %s" % self.header["LINEAR"]) slope, offset = 1.0, 0.0 else: offset = self.data.min() max_data = self.data.max() max_range = 2 ** 24 - 1 #similar to the mantissa of a float32 if max_data > offset: slope = (max_data - offset) / float(max_range) else: slope = 1.0 tmp_data = numpy.round(((self.data - offset) / slope)).astype(numpy.uint32) self.header["LINEAR"] = "%s %s" % (slope, offset) else: tmp_data = self.data bpp = self.calc_bpp(tmp_data) self.basic_translate(fname) limit = 2 ** (8 * bpp) - 1 data = tmp_data.astype(self.bpp_to_numpy[bpp]) reset = numpy.where(tmp_data >= limit) data[reset] = limit data = data.newbyteorder("<") #Bruker enforces little endian with self._open(fname, "wb") as bruker: bruker.write(self.gen_header()) bruker.write(data.tostring()) bruker.write(self.gen_overflow())
[docs] def calc_bpp(self, data=None, max_entry=4096): """ Calculate the number of byte per pixel to get an optimal overflow table. @return: byte per pixel """ if data is None: data = self.data if self.__bpp_file is None: for i in [1, 2]: overflown = (data >= (2 ** (8 * i) - 1)) if overflown.sum() < max_entry: self.__bpp_file = i break else: self.__bpp_file = 4 return self.__bpp_file
[docs] def gen_header(self): """ Generate headers (with some magic and guesses) @param format can be 86 or 100 """ headers = [] for key in self.HEADERS_KEYS: if key in self.header: value = self.header[key] line = key.ljust(7) + ":" if type(value) in StringTypes: if os.linesep in value: lines = value.split(os.linesep) for i in lines[:-1] : headers.append((line + bytes(i)).ljust(80, " ")) line = key.ljust(7) + ":" line += bytes(lines[-1]) elif len(value) < 72: line += bytes(value) else: for i in range(len(value) // 72): headers.append((line + bytes(value[72 * i:72 * (i + 1)]))) line = key.ljust(7) + ":" line += value[72 * (i + 1):] elif "__len__" in dir(value): f = "\%.%is" % 72 // len(value) - 1 line += " ".join([f % i for i in value]) else: line += bytes(value) headers.append(line.ljust(80, " ")) header = "".join(headers) if len(header) > 512 * self.header["HDRBLKS"]: tmp = ceil(len(header) / 512.0) self.header["HDRBLKS"] = int(ceil(tmp / 5.0) * 5.0) for i in range(len(headers)): if headers[i].startswith("HDRBLKS"): headers[i] = headers.append(("HDRBLKS:%s" % self.header["HDRBLKS"]).ljust(80, " ")) res = pad("".join(headers), self.SPACER + "."*78, 512 * int(self.header["HDRBLKS"])) return res
[docs] def gen_overflow(self): """ Generate an overflow table """ limit = 2 ** (8 * self.calc_bpp()) - 1 flat = self.data.ravel() #flat memory view overflow_pos = numpy.where(flat >= limit)[0] #list of indexes overflow_val = flat[overflow_pos] overflow = "".join(["%09i%07i" % (val, pos) for pos, val in zip(overflow_pos, overflow_val)]) return pad(overflow, ".", 512)
[docs] def basic_translate(self, fname=None): """ Does some basic population of the headers so that the writing is possible """ if not "FORMAT" in self.header: self.header["FORMAT"] = "86" if not "HDRBLKS" in self.header: self.header["HDRBLKS"] = 5 if not "TYPE" in self.header: self.header["TYPE"] = "UNWARPED" if not "USER" in self.header: self.header["USER"] = getpass.getuser() if not "FILENAM" in self.header: self.header["FILENAM"] = "%s" % fname if not "CREATED" in self.header: self.header["CREATED"] = time.ctime() if not "NOVERFL" in self.header: self.header["NOVERFL"] = "0" # if not "NPIXELB" in self.header: self.header["NPIXELB"] = self.calc_bpp() #if not "NROWS" in self.header: self.header["NROWS"] = self.data.shape[0] #if not "NCOLS" in self.header: self.header["NCOLS"] = self.data.shape[1] if not "WORDORD" in self.header: self.header["WORDORD"] = "0" if not "LONGORD" in self.header: self.header["LONGORD"] = "0"
[docs]def test(): """ a testcase """ import sys, time img = brukerimage() start = time.clock() for filename in sys.argv[1:]: img.read(filename) res = img.toPIL16() img.rebin(2, 2) print(filename + (": max=%d, min=%d, mean=%.2e, stddev=%.2e") % ( img.getmax(), img.getmin(), img.getmean(), img.getstddev())) print('integrated intensity (%d %d %d %d) =%.3f' % ( 10, 20, 20, 40, img.integrate_area((10, 20, 20, 40)))) end = time.clock() print (end - start)
if __name__ == '__main__': test()
fabio-0.1.3/doc/html/_modules/fabio/tifimage.html0000644000175000017500000016154712233250022022437 0ustar jeromejerome00000000000000 fabio.tifimage — FabIO 0.1.3 documentation

Source code for fabio.tifimage

#!/usr/bin/env python
#-*- coding: utf8 -*-
"""
FabIO class for dealing with TIFF images. 
In facts wraps TiffIO from V. Armando Solé (available in PyMca) or falls back to PIL

Authors:
........
* Henning O. Sorensen & Erik Knudsen:
  Center for Fundamental Research: Metal Structures in Four Dimensions;
  Risoe National Laboratory;
  Frederiksborgvej 399;
  DK-4000 Roskilde;
  email:erik.knudsen@risoe.dk
* Jérôme Kieffer:
  European Synchrotron Radiation Facility;
  Grenoble (France)
   
License: GPLv3+        
"""

__authors__ = ["Jérôme Kieffer", "Henning O. Sorensen", "Erik Knudsen"]
__date__ = "11/07/2011"
__license__ = "GPLv3+"
__copyright__ = "ESRF, Grenoble & Risoe National Laboratory"
__status__ = "stable"
import time, logging, struct
logger = logging.getLogger("tifimage")
try:
    from PIL import Image
except ImportError:
    logger.warning("PIL is not installed ... trying to do without")
    Image = None
import numpy
from fabioimage import fabioimage
from TiffIO     import TiffIO

PIL_TO_NUMPY = { "I;16": numpy.uint16,
                   "F": numpy.float32,
                   "1": numpy.bool,
                   "I": numpy.int32,
                   "L": numpy.uint8,
                    }

LITTLE_ENDIAN = 1234
BIG_ENDIAN = 3412

TYPES = {0:'invalid', 1:'byte', 2:'ascii', 3:'short', 4:'long', 5:'rational', 6:'sbyte', 7:'undefined', 8:'sshort', 9:'slong', 10:'srational', 11:'float', 12:'double'}

TYPESIZES = {0:0, 1:1, 2:1, 3:2, 4:4, 5:8, 6:1, 7:1, 8:2, 9:4, 10:8, 11:4, 12:8}

baseline_tiff_tags = {
  256:'ImageWidth',
  257:'ImageLength',
  306:'DateTime',
  315:'Artist',
  258:'BitsPerSample',
  265:'CellLength',
  264:'CellWidth',
  259:'Compression',

  262:'PhotometricInterpretation',
  296:'ResolutionUnit',
  282:'XResolution',
  283:'YResolution',

  278:'RowsPerStrip',
  273:'StripOffset',
  279:'StripByteCounts',

  270:'ImageDescription',
  271:'Make',
  272:'Model',
  320:'ColorMap',
  305:'Software',
  339:'SampleFormat',
  33432:'Copyright'
  }

[docs]class tifimage(fabioimage): """ Images in TIF format Wraps TiffIO """ _need_a_seek_to_read = True def __init__(self, *args, **kwds): """ Tifimage constructor adds an nbits member attribute """ self.nbits = None fabioimage.__init__(self, *args, **kwds) self.lib = None def _readheader(self, infile): """ Try to read Tiff images header... """ # try: # self.header = { "filename" : infile.name } # except AttributeError: # self.header = {} # # t = Tiff_header(infile.read()) # self.header = t.header # try: # self.dim1 = int(self.header['ImageWidth']) # self.dim2 = int(self.header['ImageLength']) # except (KeyError): # logger.warning("image dimensions could not be determined from header tags, trying to go on anyway") # read the first 32 bytes to determine size header = numpy.fromstring(infile.read(64), numpy.uint16) self.dim1 = int(header[9]) self.dim2 = int(header[15]) # nbits is not a fabioimage attribute... self.nbits = int(header[21]) # number of bits
[docs] def read(self, fname, frame=None): """ Wrapper for TiffIO. """ infile = self._open(fname, "rb") self._readheader(infile) infile.seek(0) self.lib = None try: tiffIO = TiffIO(infile) if tiffIO.getNumberOfImages() > 0: #No support for now of multi-frame tiff images self.data = tiffIO.getImage(0) self.header = tiffIO.getInfo(0) except Exception, error: logger.warning("Unable to read %s with TiffIO due to %s, trying PIL" % (fname, error)) else: if self.data.ndim == 2: self.dim2, self.dim1 = self.data.shape elif self.data.ndim == 3: self.dim2, self.dim1, ncol = self.data.shape logger.warning("Third dimension is the color") else: logger.warning("dataset has %s dimensions (%s), check for errors !!!!", self.data.ndim, self.data.shape) self.lib = "TiffIO" if (self.lib is None): if Image: try: infile.seek(0) self.pilimage = Image.open(infile) except Exception: logger.error("Error in opening %s with PIL" % fname) self.lib = None infile.seek(0) else: self.lib = "PIL" self.dim1, self.dim2 = self.pilimage.size if self.pilimage.mode in PIL_TO_NUMPY: self.data = numpy.fromstring(self.pilimage.tostring(), PIL_TO_NUMPY[self.pilimage.mode]) else: #probably RGB or RGBA images: rely on PIL to convert it to greyscale float. self.data = numpy.fromstring(self.pilimage.convert("F").tostring(), numpy.float32) self.data.shape = (self.dim2, self.dim1) else: logger.error("Error in opening %s: no tiff reader managed to read the file.", fname) self.lib = None infile.seek(0) self.bpp = len(numpy.zeros(1, dtype=self.data.dtype).tostring()) self.bytecode = self.data.dtype.name self.resetvals() return self
[docs] def write(self, fname): """ Overrides the fabioimage.write method and provides a simple TIFF image writer. @param fname: name of the file to save the image to @tag_type fname: string or unicode (file?)... """ tiffIO = TiffIO(fname, mode="w") tiffIO.writeImage(self.data, info=self.header, software="fabio.tifimage", date=time.ctime()) #define a couple of helper classes here:
[docs]class Tiff_header(object): def __init__(self, string): if string[:4] == "II\x2a\x00": self.byteorder = LITTLE_ENDIAN elif string[:4] == 'MM\x00\x2a': self.byteorder = BIG_ENDIAN else: logger.warning("Warning: This does not appear to be a tiff file") #the next two bytes contains the offset of the oth IFD offset_first_ifd = struct.unpack_from("h", string[4:])[0] self.ifd = [Image_File_Directory()] offset_next = self.ifd[0].unpack(string, offset_first_ifd) while (offset_next != 0): self.ifd.append(Image_File_Directory()) offset_next = self.ifd[-1].unpack(string, offset_next) self.header = {} #read the values of the header items into a dictionary for entry in self.ifd[0].entries: if entry.tag in baseline_tiff_tags.keys(): self.header[baseline_tiff_tags[entry.tag]] = entry.val else: self.header[entry.tag] = entry.val
[docs]class Image_File_Directory(object): def __init__(self, instring=None, offset= -1): self.entries = [] self.offset = offset self.count = None
[docs] def unpack(self, instring, offset= -1): if (offset == -1): offset = self.offset strInput = instring[offset:] self.count = struct.unpack_from("H", strInput[:2])[0] #0th IFD contains count-1 entries (count includes the adress of the next IFD) for i in range(self.count - 1): e = Image_File_Directory_entry().unpack(strInput[2 + 12 * (i + 1):]) if (e != None): self.entries.append(e) #extract data associated with tags for e in self.entries: if (e.val == None): e.extract_data(instring) #do we have some more ifds in this file offset_next = struct.unpack_from("L", instring[offset + 2 + self.count * 12:])[0] return offset_next
[docs]class Image_File_Directory_entry(object): def __init__(self, tag=0, tag_type=0, count=0, offset=0): self.tag = tag self.tag_type = tag_type self.count = count self.val_offset = offset self.val = None
[docs] def unpack(self, strInput): idfentry = strInput[:12] ################################################################################ # # TOFIX: How is it possible that HHL (2+2+4 bytes has a size of ) ################################################################################ (tag, tag_type, count) = struct.unpack_from("HHL", idfentry) self.tag = tag self.count = count self.tag_type = tag_type self.val = None if (count <= 0): logger.warning("Tag # %s has an invalid count: %s. Tag is ignored" % (tag, count)) return if(count * TYPESIZES[tag_type] <= 4): self.val_offset = 8 self.extract_data(idfentry) self.val_offset = None else: self.val_offset = struct.unpack_from("L", idfentry[8:])[0] return self
[docs] def extract_data(self, full_string): tag_type = self.tag_type if (TYPES[tag_type] == 'byte'): self.val = struct.unpack_from("B", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'short'): self.val = struct.unpack_from("H", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'long'): self.val = struct.unpack_from("L", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'sbyte'): self.val = struct.unpack_from("b", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'sshort'): self.val = struct.unpack_from("h", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'slong'): self.val = struct.unpack_from("l", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'ascii'): self.val = full_string[self.val_offset:self.val_offset + max(self.count, 4)] elif (TYPES[tag_type] == 'rational'): if self.val_offset != None: (num, den) = struct.unpack_from("LL", full_string[self.val_offset:]) print self.val_offset self.val = float(num) / den elif (TYPES[tag_type] == 'srational'): if self.val_offset != None: (num, den) = struct.unpack_from("ll", full_string[self.val_offset:]) self.val = float(num) / den, elif (TYPES[tag_type] == 'float'): self.val = struct.unpack_from("f", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'double'): if self.val_offset != None: self.val = struct.unpack_from("d", full_string[self.val_offset:])[0] else: logger.warning("unrecognized type of strInputentry self: %s tag: %s type: %s TYPE: %s" % (self, baseline_tiff_tags[self.tag], self.tag_type, TYPES[tag_type]))
fabio-0.1.3/doc/html/_modules/fabio/mar345image.html0000644000175000017500000026306612233250022022667 0ustar jeromejerome00000000000000 fabio.mar345image — FabIO 0.1.3 documentation

Source code for fabio.mar345image

#!/usr/bin/env python
#coding: utf8 
from __future__ import with_statement
__doc__ = """

Authors:
........
* Henning O. Sorensen & Erik Knudsen:
  Center for Fundamental Research: Metal Structures in Four Dimensions;
  Risoe National Laboratory;
  Frederiksborgvej 399;
  DK-4000 Roskilde;
  email:erik.knudsen@risoe.dk
* Jon Wright, Jérôme Kieffer & Gaël Goret:
  European Synchrotron Radiation Facility;
  Grenoble (France)

         
"""

from fabioimage import fabioimage
import numpy, struct, time, sys, traceback
import logging
logger = logging.getLogger("mar345image")
from compression import compPCK, decPCK


[docs]class mar345image(fabioimage): _need_a_real_file = True def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs) self.numhigh = None self.numpixels = None
[docs] def read(self, fname, frame=None): """ Read a mar345 image""" self.filename = fname f = self._open(self.filename, "rb") self._readheader(f) if 'compressed' in self.header['Format']: # self.data = decPCK(f, self.dim1, self.dim2, self.numhigh, version=1) try: self.data = decPCK(f, self.dim1, self.dim2) except Exception, error: logger.error('%s. importing the mar345_io backend: generate an empty 1x1 picture' % error) f.close() self.dim1 = 1 self.dim2 = 1 self.bytecode = numpy.int # self.data = numpy.resize(numpy.array([0], numpy.int), [1, 1]) return self else: logger.error("cannot handle these formats yet " + \ "due to lack of documentation") return None self.bytecode = numpy.uint f.close() return self
def _readheader(self, infile=None): """ Read a mar345 image header """ # clip was not used anywhere - commented out # clip = '\x00' #using a couple of local variables inside this function f = infile h = {} #header is 4096 bytes long l = f.read(64) #the contents of the mar345 header is taken to be as # described in # http://www.mar-usa.com/support/downloads/mar345_formats.pdf #the first 64 bytes are 4-byte integers (but in the CBFlib # example image it seems to 128 bytes?) #first 4-byte integer is a marker to check endianness if struct.unpack("<i", l[0:4])[0] == 1234: fs = '<i' else: fs = '>i' #image dimensions self.dim1 = self.dim2 = int(struct.unpack(fs, l[4:8])[0]) #number of high intensity pixels self.numhigh = struct.unpack(fs, l[2 * 4 : (2 + 1) * 4])[0] h['NumHigh'] = self.numhigh #Image format i = struct.unpack(fs, l[3 * 4 : (3 + 1) * 4])[0] if i == 1: h['Format'] = 'compressed' elif i == 2: h['Format'] = 'spiral' else: h['Format'] = 'compressed' logger.warning("image format could not be detetermined" + \ "- assuming compressed mar345") #collection mode h['Mode'] = {0:'Dose', 1: 'Time'}[struct.unpack(fs, l[4 * 4:(4 + 1) * 4])[0]] #total number of pixels self.numpixels = struct.unpack(fs, l[5 * 4:(5 + 1) * 4])[0] h['NumPixels'] = str(self.numpixels) #pixel dimensions (length,height) in mm h['PixelLength'] = struct.unpack(fs, l[6 * 4:(6 + 1) * 4])[0] / 1000.0 h['PixelHeight'] = struct.unpack(fs, l[7 * 4:(7 + 1) * 4])[0] / 1000.0 #x-ray wavelength in AA h['Wavelength'] = struct.unpack(fs, l[8 * 4:(8 + 1) * 4])[0] / 1000000.0 #used distance h['Distance'] = struct.unpack(fs, l[9 * 4:(9 + 1) * 4])[0] / 1000.0 #starting and ending phi h['StartPhi'] = struct.unpack(fs, l[10 * 4:11 * 4])[0] / 1000.0 h['EndPhi'] = struct.unpack(fs, l[11 * 4:12 * 4])[0] / 1000.0 #starting and ending omega h['StartOmega'] = struct.unpack(fs, l[12 * 4:13 * 4])[0] / 1000.0 h['EndOmega'] = struct.unpack(fs, l[13 * 4:14 * 4])[0] / 1000.0 #Chi and Twotheta angles h['Chi'] = struct.unpack(fs, l[14 * 4:15 * 4])[0] / 1000.0 h['TwoTheta'] = struct.unpack(fs, l[15 * 4:16 * 4])[0] / 1000.0 #the rest of the header is ascii # TODO: validate these values against the binaries already read l = f.read(128) if not 'mar research' in l: logger.warning("the string \"mar research\" should be in " + \ "bytes 65-76 of the header but was not") start = 128 else: start = l.index('mar research') f.seek(64 + start) l = f.read(4096 - start - 64).strip() for m in l.splitlines(): if m == 'END OF HEADER': break n = m.split(' ', 1) if n[0] == '': continue if n[0] in ('PROGRAM', 'DATE', 'SCANNER', 'HIGH', 'MULTIPLIER', 'GAIN', 'WAVELENGTH', 'DISTANCE', 'RESOLUTION', 'CHI', 'TWOTHETA', 'MODE', 'TIME', 'GENERATOR', 'MONOCHROMATOR', 'REMARK'): logger.debug("reading: %s %s", n[0], n[1]) h[n[0]] = n[1].strip() continue if n[0] in ('FORMAT'): (h['DIM'], h['FORMAT_TYPE'], h['NO_PIXELS']) = n[1].split() continue if n[0] in ('PIXEL', 'OFFSET', 'PHI', 'OMEGA', 'COUNTS', 'CENTER', 'INTENSITY', 'HISTOGRAM', 'COLLIMATOR'): n = m.split() h.update([(n[0] + '_' + n[j], n[j + 1]) for j in range(1, len(n), 2)]) continue self.header = h return h
[docs] def write(self, fname): """Try to write mar345 file. This is still in beta version. It uses CCP4 (LGPL) PCK1 algo from JPA""" headers = self._writeheader() hotpixels = self._high_intensity_pixel_records() compressed_stream = compPCK(self.data) try: outfile = self._open(fname, mode="wb") outfile.write(headers) outfile.write(hotpixels) outfile.write(compressed_stream) outfile.close() except Exception, error: logger.error("Error in writing file %s: %s" % (fname, error))
def _writeheader(self, linesep="\n", size=4096):#the standard padding does not inclued """ @param linesep: end of line separator @return string/bytes containing the mar345 header """ try: version = sys.modules["fabio"].version except (KeyError, AttributeError): version = "0.1.1" lnsep = len(linesep) self.header["HIGH"] = str(self.nb_overflow_pixels()) binheader = numpy.zeros(16, "int32") binheader[:4] = numpy.array([1234, self.dim1, int(self.header["HIGH"]), 1]) binheader[4] = (self.header.get("MODE", "TIME") == "TIME") binheader[5] = self.dim1 * self.dim2 binheader[6] = int(self.header.get("PIXEL_LENGTH", 1)) binheader[7] = int(self.header.get("PIXEL_HEIGHT", 1)) binheader[8] = int(float(self.header.get("WAVELENGTH", 1)) * 1e6) binheader[9] = int(float(self.header.get("DISTANCE", 1)) * 1e3) binheader[10] = int(float(self.header.get("PHI_START", 1)) * 1e3) binheader[11] = int(float(self.header.get("PHI_END", 1)) * 1e3) binheader[12] = int(float(self.header.get("OMEGA_START", 1)) * 1e3) binheader[13] = int(float(self.header.get("OMEGA_END", 1)) * 1e3) binheader[14] = int(float(self.header.get("CHI", 1)) * 1e3) binheader[15] = int(float(self.header.get("TWOTHETA", 1)) * 1e3) lstout = [binheader.tostring() + 'mar research'.ljust(64 - lnsep)] lstout.append("PROGRAM".ljust(15) + (str(self.header.get("PROGRAM", "FabIO Version %s" % (version))).ljust(49 - lnsep))) lstout.append("DATE".ljust(15) + (str(self.header.get("DATE", time.ctime()))).ljust(49 - lnsep)) key = "SCANNER" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "FORMAT_TYPE" if key in self.header: lstout.append("FORMAT".ljust(15) + ("%s %s %s" % (self.dim1, self.header[key], self.dim1 * self.dim2)).ljust(49 - lnsep)) key = "HIGH" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key1 = "PIXEL_LENGTH" key2 = "PIXEL_HEIGHT" if (key1 in self.header) and (key2 in self.header): lstout.append("PIXEL".ljust(15) + ("LENGTH %s HEIGHT %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) key1 = "OFFSET_ROFF" key2 = "OFFSET_TOFF" if key1 in self.header and key2 in self.header: lstout.append("OFFSET".ljust(15) + ("ROFF %s TOFF %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) key = "MULTIPLIER" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "GAIN" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "WAVELENGTH" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "DISTANCE" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "RESOLUTION" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key1 = "PHI_START" key2 = "PHI_END" key3 = "PHI_OSC" if (key1 in self.header) and (key2 in self.header) and (key3 in self.header): lstout.append("PHI".ljust(15) + ("START %s END %s OSC %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) key1 = "OMEGA_START" key2 = "OMEGA_END" key3 = "OMEGA_OSC" if (key1 in self.header) and (key2 in self.header) and (key3 in self.header): lstout.append("OMEGA".ljust(15) + ("START %s END %s OSC %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) key = "CHI" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "TWOTHETA" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key1 = "CENTER_X" key2 = "CENTER_Y" if (key1 in self.header) and (key2 in self.header): lstout.append("CENTER".ljust(15) + ("X %s Y %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) key = "MODE" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "TIME" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key1 = "COUNTS_START" key2 = "COUNTS_END" key3 = "COUNTS_NMEAS" if key1 in self.header and key2 in self.header and key3 in self.header: lstout.append("COUNTS".ljust(15) + ("START %s END %s NMEAS %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) key1 = "COUNTS_MIN" key2 = "COUNTS_MAX" if key1 in self.header and key2 in self.header: lstout.append("COUNTS".ljust(15) + ("MIN %s MAX %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) key1 = "COUNTS_AVE" key2 = "COUNTS_SIG" if key1 in self.header and key2 in self.header: lstout.append("COUNTS".ljust(15) + ("AVE %s SIG %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) key1 = "INTENSITY_MIN" key2 = "INTENSITY_MAX" key3 = "INTENSITY_AVE" key4 = "INTENSITY_SIG" if key1 in self.header and key2 in self.header and key3 in self.header and key4 in self.header: lstout.append("INTENSITY".ljust(15) + ("MIN %s MAX %s AVE %s SIG %s" % (self.header[key1], self.header[key2], self.header[key3], self.header[key4])).ljust(49 - lnsep)) key1 = "HISTOGRAM_START" key2 = "HISTOGRAM_END" key3 = "HISTOGRAM_MAX" if key1 in self.header and key2 in self.header and key3 in self.header: lstout.append("HISTOGRAM".ljust(15) + ("START %s END %s MAX %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) key = "GENERATOR" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key = "MONOCHROMATOR" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) key1 = "COLLIMATOR_WIDTH" key2 = "COLLIMATOR_HEIGHT" if key1 in self.header and key2 in self.header: lstout.append("COLLIMATOR".ljust(15) + ("WIDTH %s HEIGHT %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) key = "REMARK" if key in self.header: lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) else: lstout.append(key.ljust(64 - lnsep)) key = "END OF HEADER" lstout.append(key) return linesep.join(lstout).ljust(size) def _high_intensity_pixel_records(self): flt_data = self.data.flatten() pix_location = numpy.where(flt_data > 65535)[0] nb_pix = pix_location.size if nb_pix % 8 == 0: tmp = numpy.zeros((nb_pix, 2), dtype="int32") else: tmp = numpy.zeros(((nb_pix // 8 + 1) * 8, 2), dtype="int32") tmp[:nb_pix, 0] = pix_location + 1 tmp[:nb_pix, 1] = flt_data[pix_location] return tmp.tostring()
[docs] def nb_overflow_pixels(self): return (self.data > 65535).sum()
@staticmethod
[docs] def checkData(data=None): if data is None: return None else: # enforce square image shape = data.shape assert len(shape) == 2, "image has 2 dimensions" mshape = max(shape) z = numpy.zeros((mshape, mshape), dtype=int) z[:shape[0], :shape[1]] = data return z
fabio-0.1.3/doc/html/_modules/index.html0000644000175000017500000001136312233250023020670 0ustar jeromejerome00000000000000 Overview: module code — FabIO 0.1.3 documentation fabio-0.1.3/doc/html/_static/0000755000175000017500000000000012233272207016516 5ustar jeromejerome00000000000000fabio-0.1.3/doc/html/_static/ajax-loader.gif0000644000175000017500000000124111644410761021376 0ustar jeromejerome00000000000000GIF89aòÿÿÿU|ÆÖßN€U|l–®Š«¾™¶Æ!þCreated with ajaxload.info!ù !ÿ NETSCAPE2.0,3ºÜþ0ÊIkc:œN˜f E±1º™Á¶.`ÄÂqÐ-[9ݦ9 JkçH!ù ,4ºÜþNŒ! „ »°æŠDqBQT`1 `LE[¨|µußía€ ×â†C²%$*!ù ,6º2#+ÊAÈÌ”V/…côNñIBa˜«pð ̳½ƨ+YíüƒÃ2©dŸ¿!ù ,3ºb%+Ê2†‘ìœV_…‹¦ …! 1D‡aªF‚°ÑbR]ó=08,Ȥr9L!ù ,2ºr'+JçdðóL &vÃ`\bT”…„¹hYB)ÏÊ@é<Ã&,ȤR’!ù ,3º Â9ãtç¼Úž0Çà!.B¶ÊW¬¢1  sa»°5÷•0° ‰»Ÿm)J!ù ,2ºÜþð ÙœU]šîÚqp•`ˆÝaœÝ4–…AFÅ0`›¶ Â@›1€ÂÖΑ!ù ,2ºÜþ0ÊI«eBÔœ)×à ŽÇq10©Ê°®PÂaVÚ¥ ub‚ž[;fabio-0.1.3/doc/html/_static/comment-close.png0000644000175000017500000000677211644410761022011 0ustar jeromejerome00000000000000‰PNG  IHDRóÿa OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÚ!â›ÈÝ,IDAT8Ëe’_HuÇ?Ïï}ßsŽž3ÍyòË•¶¦‹U2MvQÉÖŠFÔE¬.ŠÑÍÃÅ‚­ÄŠbÑE$DD­‹ËZF5b@QÌ"š:2§›š¦¾ïû{Ÿn.êsõåçû<_ø yî?ô½m÷²ýè·wV™ê@t£R`}Z íÄÐ_£# _=œá_@ÝËý ßw^óRë®·•%6gC-έ(K>ä| $„Éï{¯} 0) { var start = document.cookie.indexOf('sortBy='); if (start != -1) { start = start + 7; var end = document.cookie.indexOf(";", start); if (end == -1) { end = document.cookie.length; by = unescape(document.cookie.substring(start, end)); } } } setComparator(); } /** * Show a comment div. */ function show(id) { $('#ao' + id).hide(); $('#ah' + id).show(); var context = $.extend({id: id}, opts); var popup = $(renderTemplate(popupTemplate, context)).hide(); popup.find('textarea[name="proposal"]').hide(); popup.find('a.by' + by).addClass('sel'); var form = popup.find('#cf' + id); form.submit(function(event) { event.preventDefault(); addComment(form); }); $('#s' + id).after(popup); popup.slideDown('fast', function() { getComments(id); }); } /** * Hide a comment div. */ function hide(id) { $('#ah' + id).hide(); $('#ao' + id).show(); var div = $('#sc' + id); div.slideUp('fast', function() { div.remove(); }); } /** * Perform an ajax request to get comments for a node * and insert the comments into the comments tree. */ function getComments(id) { $.ajax({ type: 'GET', url: opts.getCommentsURL, data: {node: id}, success: function(data, textStatus, request) { var ul = $('#cl' + id); var speed = 100; $('#cf' + id) .find('textarea[name="proposal"]') .data('source', data.source); if (data.comments.length === 0) { ul.html('
  • No comments yet.
  • '); ul.data('empty', true); } else { // If there are comments, sort them and put them in the list. var comments = sortComments(data.comments); speed = data.comments.length * 100; appendComments(comments, ul); ul.data('empty', false); } $('#cn' + id).slideUp(speed + 200); ul.slideDown(speed); }, error: function(request, textStatus, error) { showError('Oops, there was a problem retrieving the comments.'); }, dataType: 'json' }); } /** * Add a comment via ajax and insert the comment into the comment tree. */ function addComment(form) { var node_id = form.find('input[name="node"]').val(); var parent_id = form.find('input[name="parent"]').val(); var text = form.find('textarea[name="comment"]').val(); var proposal = form.find('textarea[name="proposal"]').val(); if (text == '') { showError('Please enter a comment.'); return; } // Disable the form that is being submitted. form.find('textarea,input').attr('disabled', 'disabled'); // Send the comment to the server. $.ajax({ type: "POST", url: opts.addCommentURL, dataType: 'json', data: { node: node_id, parent: parent_id, text: text, proposal: proposal }, success: function(data, textStatus, error) { // Reset the form. if (node_id) { hideProposeChange(node_id); } form.find('textarea') .val('') .add(form.find('input')) .removeAttr('disabled'); var ul = $('#cl' + (node_id || parent_id)); if (ul.data('empty')) { $(ul).empty(); ul.data('empty', false); } insertComment(data.comment); var ao = $('#ao' + node_id); ao.find('img').attr({'src': opts.commentBrightImage}); if (node_id) { // if this was a "root" comment, remove the commenting box // (the user can get it back by reopening the comment popup) $('#ca' + node_id).slideUp(); } }, error: function(request, textStatus, error) { form.find('textarea,input').removeAttr('disabled'); showError('Oops, there was a problem adding the comment.'); } }); } /** * Recursively append comments to the main comment list and children * lists, creating the comment tree. */ function appendComments(comments, ul) { $.each(comments, function() { var div = createCommentDiv(this); ul.append($(document.createElement('li')).html(div)); appendComments(this.children, div.find('ul.comment-children')); // To avoid stagnating data, don't store the comments children in data. this.children = null; div.data('comment', this); }); } /** * After adding a new comment, it must be inserted in the correct * location in the comment tree. */ function insertComment(comment) { var div = createCommentDiv(comment); // To avoid stagnating data, don't store the comments children in data. comment.children = null; div.data('comment', comment); var ul = $('#cl' + (comment.node || comment.parent)); var siblings = getChildren(ul); var li = $(document.createElement('li')); li.hide(); // Determine where in the parents children list to insert this comment. for(i=0; i < siblings.length; i++) { if (comp(comment, siblings[i]) <= 0) { $('#cd' + siblings[i].id) .parent() .before(li.html(div)); li.slideDown('fast'); return; } } // If we get here, this comment rates lower than all the others, // or it is the only comment in the list. ul.append(li.html(div)); li.slideDown('fast'); } function acceptComment(id) { $.ajax({ type: 'POST', url: opts.acceptCommentURL, data: {id: id}, success: function(data, textStatus, request) { $('#cm' + id).fadeOut('fast'); $('#cd' + id).removeClass('moderate'); }, error: function(request, textStatus, error) { showError('Oops, there was a problem accepting the comment.'); } }); } function deleteComment(id) { $.ajax({ type: 'POST', url: opts.deleteCommentURL, data: {id: id}, success: function(data, textStatus, request) { var div = $('#cd' + id); if (data == 'delete') { // Moderator mode: remove the comment and all children immediately div.slideUp('fast', function() { div.remove(); }); return; } // User mode: only mark the comment as deleted div .find('span.user-id:first') .text('[deleted]').end() .find('div.comment-text:first') .text('[deleted]').end() .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) .remove(); var comment = div.data('comment'); comment.username = '[deleted]'; comment.text = '[deleted]'; div.data('comment', comment); }, error: function(request, textStatus, error) { showError('Oops, there was a problem deleting the comment.'); } }); } function showProposal(id) { $('#sp' + id).hide(); $('#hp' + id).show(); $('#pr' + id).slideDown('fast'); } function hideProposal(id) { $('#hp' + id).hide(); $('#sp' + id).show(); $('#pr' + id).slideUp('fast'); } function showProposeChange(id) { $('#pc' + id).hide(); $('#hc' + id).show(); var textarea = $('#pt' + id); textarea.val(textarea.data('source')); $.fn.autogrow.resize(textarea[0]); textarea.slideDown('fast'); } function hideProposeChange(id) { $('#hc' + id).hide(); $('#pc' + id).show(); var textarea = $('#pt' + id); textarea.val('').removeAttr('disabled'); textarea.slideUp('fast'); } function toggleCommentMarkupBox(id) { $('#mb' + id).toggle(); } /** Handle when the user clicks on a sort by link. */ function handleReSort(link) { var classes = link.attr('class').split(/\s+/); for (var i=0; iThank you! Your comment will show up ' + 'once it is has been approved by a moderator.'); } // Prettify the comment rating. comment.pretty_rating = comment.rating + ' point' + (comment.rating == 1 ? '' : 's'); // Make a class (for displaying not yet moderated comments differently) comment.css_class = comment.displayed ? '' : ' moderate'; // Create a div for this comment. var context = $.extend({}, opts, comment); var div = $(renderTemplate(commentTemplate, context)); // If the user has voted on this comment, highlight the correct arrow. if (comment.vote) { var direction = (comment.vote == 1) ? 'u' : 'd'; div.find('#' + direction + 'v' + comment.id).hide(); div.find('#' + direction + 'u' + comment.id).show(); } if (opts.moderator || comment.text != '[deleted]') { div.find('a.reply').show(); if (comment.proposal_diff) div.find('#sp' + comment.id).show(); if (opts.moderator && !comment.displayed) div.find('#cm' + comment.id).show(); if (opts.moderator || (opts.username == comment.username)) div.find('#dc' + comment.id).show(); } return div; } /** * A simple template renderer. Placeholders such as <%id%> are replaced * by context['id'] with items being escaped. Placeholders such as <#id#> * are not escaped. */ function renderTemplate(template, context) { var esc = $(document.createElement('div')); function handle(ph, escape) { var cur = context; $.each(ph.split('.'), function() { cur = cur[this]; }); return escape ? esc.text(cur || "").html() : cur; } return template.replace(/<([%#])([\w\.]*)\1>/g, function() { return handle(arguments[2], arguments[1] == '%' ? true : false); }); } /** Flash an error message briefly. */ function showError(message) { $(document.createElement('div')).attr({'class': 'popup-error'}) .append($(document.createElement('div')) .attr({'class': 'error-message'}).text(message)) .appendTo('body') .fadeIn("slow") .delay(2000) .fadeOut("slow"); } /** Add a link the user uses to open the comments popup. */ $.fn.comment = function() { return this.each(function() { var id = $(this).attr('id').substring(1); var count = COMMENT_METADATA[id]; var title = count + ' comment' + (count == 1 ? '' : 's'); var image = count > 0 ? opts.commentBrightImage : opts.commentImage; var addcls = count == 0 ? ' nocomment' : ''; $(this) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-open' + addcls, id: 'ao' + id }) .append($(document.createElement('img')).attr({ src: image, alt: 'comment', title: title })) .click(function(event) { event.preventDefault(); show($(this).attr('id').substring(2)); }) ) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-close hidden', id: 'ah' + id }) .append($(document.createElement('img')).attr({ src: opts.closeCommentImage, alt: 'close', title: 'close' })) .click(function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }) ); }); }; var opts = { processVoteURL: '/_process_vote', addCommentURL: '/_add_comment', getCommentsURL: '/_get_comments', acceptCommentURL: '/_accept_comment', deleteCommentURL: '/_delete_comment', commentImage: '/static/_static/comment.png', closeCommentImage: '/static/_static/comment-close.png', loadingImage: '/static/_static/ajax-loader.gif', commentBrightImage: '/static/_static/comment-bright.png', upArrow: '/static/_static/up.png', downArrow: '/static/_static/down.png', upArrowPressed: '/static/_static/up-pressed.png', downArrowPressed: '/static/_static/down-pressed.png', voting: false, moderator: false }; if (typeof COMMENT_OPTIONS != "undefined") { opts = jQuery.extend(opts, COMMENT_OPTIONS); } var popupTemplate = '\
    \

    \ Sort by:\ best rated\ newest\ oldest\

    \
    Comments
    \
    \ loading comments...
    \
      \
      \

      Add a comment\ (markup):

      \
      \ reStructured text markup: *emph*, **strong**, \ ``code``, \ code blocks: :: and an indented block after blank line
      \
      \ \

      \ \ Propose a change ▹\ \ \ Propose a change ▿\ \

      \ \ \ \ \
      \
      \
      '; var commentTemplate = '\
      \
      \
      \ \ \ \ \ \ \
      \
      \ \ \ \ \ \ \
      \
      \
      \

      \ <%username%>\ <%pretty_rating%>\ <%time.delta%>\

      \
      <#text#>
      \

      \ \ reply ▿\ proposal ▹\ proposal ▿\ \ \

      \
      \
      <#proposal_diff#>\
              
      \
        \
        \
        \
        \ '; var replyTemplate = '\
      • \
        \
        \ \ \ \ \ \
        \
        \
      • '; $(document).ready(function() { init(); }); })(jQuery); $(document).ready(function() { // add comment anchors for all paragraphs that are commentable $('.sphinx-has-comment').comment(); // highlight search words in search results $("div.context").each(function() { var params = $.getQueryParameters(); var terms = (params.q) ? params.q[0].split(/\s+/) : []; var result = $(this); $.each(terms, function() { result.highlightText(this.toLowerCase(), 'highlighted'); }); }); // directly open comment window if requested var anchor = document.location.hash; if (anchor.substring(0, 9) == '#comment-') { $('#ao' + anchor.substring(9)).click(); document.location.hash = '#s' + anchor.substring(9); } }); fabio-0.1.3/doc/html/_static/up.png0000644000175000017500000000055311644410761017657 0ustar jeromejerome00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDùC» pHYs × ×B(›xtIMEÚ!.<̓EëIDAT8ËÍ“±NA†¿õ®B‚P\EG{õ„ް³%<„ñ|éxcþþ ÀŠ cƒr6“@t×;bã$›ìü;óÿ3ø×&)—”ÿ†¹hÈ1ö“´¼!ÁÚ﫳Hzz@Ïý¨…Äç°=)p 3Ûµe°2/Üß´’ é(€úä¹ ¥%øÈ^ND^ ¼}3ûH1¨€ËDo‚Ǫ¨IS üF‹Ò±?,ð ìG`ÌÜß{¬vì±’–^ýX™Ù[b¼]พÍì&HC3{:sO&À ’²?,[öïeL#«¾éIEND®B`‚fabio-0.1.3/doc/html/_static/basic.css0000644000175000017500000001466311317504530020322 0ustar jeromejerome00000000000000/** * Sphinx stylesheet -- basic theme * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 230px; margin-left: -100%; font-size: 90%; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } img { border: 0; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable td { text-align: left; vertical-align: top; } table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } /* -- general body styles --------------------------------------------------- */ a.headerlink { visibility: hidden; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .field-list ul { padding-left: 1em; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; } p.sidebar-title { font-weight: bold; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- tables ---------------------------------------------------------------- */ table.docutils { border: 0; border-collapse: collapse; } table.docutils td, table.docutils th { padding: 1px 8px 1px 0; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.field-list td, table.field-list th { border: 0 !important; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } /* -- other body styles ----------------------------------------------------- */ dl { margin-bottom: 15px; } dd p { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dt:target, .highlight { background-color: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .refcount { color: #060; } .optional { font-size: 1.3em; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; } td.linenos pre { padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { margin-left: 0.5em; } table.highlighttable td { padding: 0 0.5em 0 0.5em; } tt.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } tt.descclassname { background-color: transparent; } tt.xref, a tt { background-color: transparent; font-weight: bold; } h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { background-color: transparent; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } } fabio-0.1.3/doc/html/_static/placeholder0000644000175000017500000000006612121417527020727 0ustar jeromejerome00000000000000#This empty file is there to keep the directory in Gitfabio-0.1.3/doc/html/_static/comment-bright.png0000644000175000017500000000665411644410761022162 0ustar jeromejerome00000000000000‰PNG  IHDRóÿa OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÚ 6 B©\<ÞIDAT8Ë…’Kh]e…¿½ÿs1mAÛÄÚ`j‚Ïh[-ˆE(FEŠÁaAœ! bI« àÈ*–BX‘"Ø4)NŠõUR‚Zˆ¹­!’×Mhj“›ssÎùÿíà–¨àãmØ‹Å^‹-\ggßÏ ÷ßì]o|ÑÑÒ¬[3±¶4§Á§6»”û©òèø¯×>zd‘¿ ]½#Œ»î8ÙþüáÇOݺ±t{5·uIÍXN!I=@Vf¾®Ÿ=v×ÀÞþ1ûº}e>;ØÉö×fvìénøvËÍÅxaÉHrÏʪJ’¦Fȹ`œÈðDò¹WZ®]ÀžSíýŸø%S)ÌWAÌœb¹ |0K=âSo7D†~\~qâÍ-ïÀËŸ\ùaóMÅ“Z,S'*æô™‘È} óF`—†ÎNnzæ674¸öËUÈ to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.2", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { return obj != null && obj == obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { if ( typeof data !== "string" || !data ) { return null; } var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, pass ) { var exec, bulk = key == null, i = 0, length = elems.length; // Sets many values if ( key && typeof key === "object" ) { for ( i in key ) { jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); } chainable = 1; // Sets one value } else if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = pass === undefined && jQuery.isFunction( value ); if ( bulk ) { // Bulk operations only iterate when executing function values if ( exec ) { exec = fn; fn = function( elem, key, value ) { return exec.call( jQuery( elem ), value ); }; // Otherwise they run against the entire set } else { fn.call( elems, value ); fn = null; } } if ( fn ) { for (; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } } chainable = 1; } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; fired = true; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
        a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true, pixelMargin: true }; // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "name", "t" ); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for ( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, paddingMarginBorderVisibility, paddingMarginBorder, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; paddingMarginBorder = "padding:0;margin:0;border:"; positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; html = "
        " + "" + "
        "; container = document.createElement("div"); container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
        t
        "; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { div.innerHTML = ""; marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.innerHTML = ""; div.style.width = div.style.padding = "1px"; div.style.border = 0; div.style.overflow = "hidden"; div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = "block"; div.style.overflow = "visible"; div.innerHTML = "
        "; support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); } div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); if ( window.getComputedStyle ) { div.style.marginTop = "1%"; support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; } if ( typeof container.style.zoom !== "undefined" ) { container.style.zoom = 1; } body.removeChild( container ); marginDiv = div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, part, attr, name, l, elem = this[0], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { attr = elem.attributes; for ( l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( elem, name, data[ name ] ); } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split( ".", 2 ); parts[1] = parts[1] ? "." + parts[1] : ""; part = parts[1] + "!"; return jQuery.access( this, function( value ) { if ( value === undefined ) { data = this.triggerHandler( "getData" + part, [ parts[0] ] ); // Try to fetch any internally stored data first if ( data === undefined && elem ) { data = jQuery.data( elem, key ); data = dataAttr( elem, key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } parts[1] = value; this.each(function() { var self = jQuery( this ); self.triggerHandler( "setData" + part, parts ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + part, parts ); }); }, null, value, arguments.length > 1, null, false ); }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise( object ); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, isBool, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; isBool = rboolean.test( name ); // See #9699 for explanation of this approach (setting first, then removal) // Do not do this for boolean attributes (see #10870) if ( !isBool ) { jQuery.attr( elem, name, "" ); } elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( isBool && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true, coords: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: selector && quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, special = jQuery.event.special[ event.type ] || {}, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers that should run if there are delegated events // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { // Don't process events on disabled elements (#6911, #8165) if ( cur.disabled !== true ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // && selector != null // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; /* falls through */ case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } // Expose origPOS // "global" as in regardless of relation to brackets/parens Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

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

        Changelog¶

        From FabIO-0.1.2 to FabIO-0.1.3:¶

        • Fixed a memory-leak in mar345 module
        • Improved support for bruker format (writer & reader)
        • Fixed a bug in EDF headers (very long headers)
        • Provide template for new file-formats
        • Fix a bug related to PIL in new MacOSX
        • Allow binary-images to be read from end

        From FabIO-0.1.1 to FabIO-0.1.2:¶

        • Fixed a bug in fabioimage.write (impacted all writers)
        • added Sphinx documentation “python setup.py build_doc”
        • PyLint compliance of some classes (rename, ...)
        • tests from installer with “python setup.py build test”

        From FabIO-0.1.0 to FabIO-0.1.1:¶

        • Merged Mar345 image reader and writer with cython bindings (towards python3 compliance)
        • Improve CBF image writing under windows
        • Bz2, Gzip and Flat files are managed through a common way ... classes are more (python v2.5) or less (python v2.7) overloaded
        • Fast EDF reading if one assumes offsets are the same between files, same for ROIs

        From FabIO-0.0.8 to FabIO-0.1.0:¶

        • OXD reader improved and writer implemented
        • Mar345 reader improved and writer implemented
        • CBF writer implemented
        • Clean-up of the code & bug fixes
        • Move towards python3
        • Make PIL optional dependency

        Python3 is not yet tested but some blocking points have been identified and some fixed.

        From FabIO-0.0.7 to FabIO-0.0.8:¶

        • Support for Tiff using TiffIO module from V.A.Solé
        • Clean-up of the code & bug fixes

        From FabIO-0.0.6 to FabIO-0.0.7:¶

        • Support for multi-frames EDF files
        • Support for XML images/2D arrays used in EDNA
        • new method: fabio.open(filename) that is an alias for fabio.openimage.openimage(filename)

        From FabIO-0.0.4 to FabIO-0.0.6:¶

        • Support for CBF files from Pilatus detectors
        • Support for KCD files from Nonius Kappa CCD images
        • write EDF with their native data type (instead of uint16 by default)
        fabio-0.1.3/doc/html/genindex.html0000644000175000017500000014211212233250023017550 0ustar jeromejerome00000000000000 Index — FabIO 0.1.3 documentation

        Index

        A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | R | S | T | U | W | X

        A

        add() (fabio.fabioimage.fabioimage method)
        adscimage (class in fabio.adscimage)
        appendFrame() (fabio.edfimage.edfimage method)

        B

        basic_translate() (fabio.brukerimage.brukerimage method)
        BINARY_MARKER (fabio.cbfimage.CIF attribute)
        binaryimage (class in fabio.binaryimage)
        BLANK (fabio.cbfimage.CIF attribute)
        bpp (fabio.edfimage.edfimage attribute)
        bpp_to_numpy (fabio.brukerimage.brukerimage attribute)
        bruker100image (class in fabio.bruker100image)
        brukerimage (class in fabio.brukerimage)
        bytecode (fabio.edfimage.edfimage attribute)
        (fabio.edfimage.Frame attribute)
        BZ2File (class in fabio.fabioutils)

        C

        calc_bpp() (fabio.brukerimage.brukerimage method)
        capsHeader (fabio.edfimage.edfimage attribute)
        cbfimage (class in fabio.cbfimage)
        checkData() (fabio.cbfimage.cbfimage static method)
        (fabio.OXDimage.OXDimage static method)
        (fabio.fabioimage.fabioimage static method)
        (fabio.fit2dmaskimage.fit2dmaskimage static method)
        (fabio.kcdimage.kcdimage static method)
        (fabio.mar345image.mar345image static method)
        (fabio.pnmimage.pnmimage static method)
        checkHeader() (fabio.edfimage.edfimage static method)
        (fabio.fabioimage.fabioimage static method)
        CIF (class in fabio.cbfimage)
        classname (fabio.fabioimage.fabioimage attribute)
        columnfile (class in fabio.datIO)
        compByteOffet_numpy() (in module fabio.compression)
        compPCK() (in module fabio.compression)
        compTY1() (in module fabio.compression)
        construct_filename() (in module fabio.fabioutils)
        convert() (fabio.fabioimage.fabioimage method)
        convert_data() (in module fabio.converters)
        convert_data_integer() (in module fabio.converters)
        convert_header() (in module fabio.converters)
        current() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        current_image() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        current_object() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)

        D

        data (fabio.edfimage.edfimage attribute)
        (fabio.edfimage.Frame attribute)
        decByteOffet_cython() (in module fabio.compression)
        decByteOffet_numpy() (in module fabio.compression)
        decByteOffet_python() (in module fabio.compression)
        decByteOffet_weave() (in module fabio.compression)
        decBzip2() (in module fabio.compression)
        decGzip() (in module fabio.compression)
        decKM4CCD() (in module fabio.compression)
        deconstruct_filename() (fabio.fabioutils.FilenameObject method)
        (in module fabio.fabioutils)
        decPCK() (in module fabio.compression)
        decTY1() (in module fabio.compression)
        decZlib() (in module fabio.compression)
        delCapsHeader() (fabio.edfimage.edfimage method)
        delData() (fabio.edfimage.edfimage method)
        deleteFrame() (fabio.edfimage.edfimage method)
        delHeader() (fabio.edfimage.edfimage method)
        delHeaderKeys() (fabio.edfimage.edfimage method)
        demo() (in module fabio.GEimage)
        deprecated() (in module fabio.fabioutils)
        dim1 (fabio.edfimage.edfimage attribute)
        dim2 (fabio.edfimage.edfimage attribute)
        dims (fabio.edfimage.edfimage attribute)
        dm3image (class in fabio.dm3image)
        do_magic() (in module fabio.openimage)

        E

        edfimage (class in fabio.edfimage)
        endianness() (in module fabio.compression)
        EOL (fabio.cbfimage.CIF attribute)
        estimate_offset_value() (fabio.binaryimage.binaryimage method)
        exists() (fabio.cbfimage.CIF method)
        existsInLoop() (fabio.cbfimage.CIF method)
        extract_data() (fabio.tifimage.Image_File_Directory_entry method)
        extract_filenumber() (in module fabio.fabioutils)

        F

        fabio.__init__ (module)
        fabio.adscimage (module)
        fabio.binaryimage (module)
        fabio.bruker100image (module)
        fabio.brukerimage (module)
        fabio.cbfimage (module)
        fabio.compression (module)
        fabio.converters (module)
        fabio.datIO (module)
        fabio.dm3image (module)
        fabio.edfimage (module)
        fabio.fabioimage (module)
        fabio.fabioutils (module)
        fabio.file_series (module)
        fabio.fit2dmaskimage (module)
        fabio.fit2dspreadsheetimage (module)
        fabio.GEimage (module)
        fabio.HiPiCimage (module)
        fabio.kcdimage (module)
        fabio.mar345image (module)
        fabio.marccdimage (module)
        fabio.openimage (module)
        fabio.OXDimage (module)
        fabio.pilatusimage (module)
        fabio.pnmimage (module)
        fabio.readbytestream (module)
        fabio.TiffIO (module)
        fabio.tifimage (module)
        fabio.xsdimage (module)
        fabiodata (class in fabio.datIO)
        fabioimage (class in fabio.fabioimage)
        fastReadData() (fabio.edfimage.edfimage method)
        fastReadROI() (fabio.edfimage.edfimage method)
        File (class in fabio.fabioutils)
        file_series (class in fabio.file_series)
        filename_series (class in fabio.file_series)
        FilenameObject (class in fabio.fabioutils)
        first() (fabio.file_series.file_series method)
        first_image() (fabio.file_series.file_series method)
        first_object() (fabio.file_series.file_series method)
        fit2dmaskimage (class in fabio.fit2dmaskimage)
        fit2dspreadsheetimage (class in fabio.fit2dspreadsheetimage)
        Frame (class in fabio.edfimage)

        G

        GEimage (class in fabio.GEimage)
        gen_header() (fabio.brukerimage.brukerimage method)
        gen_overflow() (fabio.brukerimage.brukerimage method)
        getBpp() (fabio.edfimage.edfimage method)
        getByteCode() (fabio.edfimage.edfimage method)
        (fabio.edfimage.Frame method)
        getCapsHeader() (fabio.edfimage.edfimage method)
        getclassname() (fabio.fabioimage.fabioimage method)
        getCompressionRatio() (fabio.OXDimage.OXDimage method)
        getData() (fabio.edfimage.edfimage method)
        (fabio.TiffIO.TiffIO method)
        (fabio.edfimage.Frame method)
        getDim1() (fabio.edfimage.edfimage method)
        getDim2() (fabio.edfimage.edfimage method)
        getDims() (fabio.edfimage.edfimage method)
        getEdfBlock() (fabio.edfimage.Frame method)
        getframe() (fabio.edfimage.edfimage method)
        (fabio.GEimage.GEimage method)
        (fabio.fabioimage.fabioimage method)
        getHeader() (fabio.edfimage.edfimage method)
        getheader() (fabio.fabioimage.fabioimage method)
        getHeaderKeys() (fabio.edfimage.edfimage method)
        getImage() (fabio.TiffIO.TiffIO method)
        getImageFileDirectories() (fabio.TiffIO.TiffIO method)
        getInfo() (fabio.TiffIO.TiffIO method)
        getmax() (fabio.fabioimage.fabioimage method)
        getmean() (fabio.fabioimage.fabioimage method)
        getmin() (fabio.fabioimage.fabioimage method)
        getNbFrames() (fabio.edfimage.edfimage method)
        getnum() (in module fabio.fabioutils)
        getNumberOfImages() (fabio.TiffIO.TiffIO method)
        getSize() (fabio.fabioutils.BZ2File method)
        (fabio.OXDimage.Section method)
        (fabio.fabioutils.File method)
        (fabio.fabioutils.StringIO method)
        getstddev() (fabio.fabioimage.fabioimage method)
        GzipFile (class in fabio.fabioutils)

        H

        header (fabio.edfimage.edfimage attribute)
        header_keys (fabio.edfimage.edfimage attribute)
        HEADERS_KEYS (fabio.brukerimage.brukerimage attribute)
        HiPiCimage (class in fabio.HiPiCimage)

        I

        Image_File_Directory (class in fabio.tifimage)
        Image_File_Directory_entry (class in fabio.tifimage)
        integrate_area() (fabio.fabioimage.fabioimage method)
        interpret_header() (in module fabio.marccdimage)
        isAscii() (fabio.cbfimage.CIF static method)
        (in module fabio.fabioutils)

        J

        jump() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        jump_filename() (in module fabio.fabioutils)
        jump_image() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        jump_object() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)

        K

        kcdimage (class in fabio.kcdimage)

        L

        last() (fabio.file_series.file_series method)
        last_image() (fabio.file_series.file_series method)
        last_object() (fabio.file_series.file_series method)
        len() (fabio.file_series.file_series method)
        load() (fabio.fabioimage.fabioimage method)
        loadCHIPLOT() (fabio.cbfimage.CIF method)
        loadCIF() (fabio.cbfimage.CIF method)
        LoopHasKey() (fabio.cbfimage.CIF static method)

        M

        make_format() (in module fabio.marccdimage)
        make_slice() (fabio.fabioimage.fabioimage method)
        mar345image (class in fabio.mar345image)
        marccdimage (class in fabio.marccdimage)
        md5sum() (in module fabio.compression)

        N

        nb_overflow_pixels() (fabio.mar345image.mar345image method)
        new_file_series() (in module fabio.file_series)
        new_file_series0() (in module fabio.file_series)
        next() (fabio.edfimage.edfimage method)
        (fabio.GEimage.GEimage method)
        (fabio.fabioimage.fabioimage method)
        (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        next_filename() (in module fabio.fabioutils)
        next_image() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        next_object() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        nframes (fabio.edfimage.edfimage attribute)
        nice_int() (in module fabio.fabioutils)
        numbered_file_series (class in fabio.file_series)
        numstem() (in module fabio.fabioutils)

        O

        openheader() (in module fabio.openimage)
        openimage() (in module fabio.openimage)
        OXDimage (class in fabio.OXDimage)

        P

        P1dec() (fabio.pnmimage.pnmimage static method)
        P2dec() (fabio.pnmimage.pnmimage static method)
        P3dec() (fabio.pnmimage.pnmimage static method)
        P4dec() (fabio.pnmimage.pnmimage static method)
        P5dec() (fabio.pnmimage.pnmimage static method)
        P6dec() (fabio.pnmimage.pnmimage static method)
        P7dec() (fabio.pnmimage.pnmimage static method)
        pad() (in module fabio.fabioutils)
        parseheader() (fabio.edfimage.Frame method)
        pilatusimage (class in fabio.pilatusimage)
        pnmimage (class in fabio.pnmimage)
        pop() (fabio.cbfimage.CIF method)
        popitem() (fabio.cbfimage.CIF method)
        prev_image() (fabio.file_series.filename_series method)
        previous() (fabio.edfimage.edfimage method)
        (fabio.GEimage.GEimage method)
        (fabio.fabioimage.fabioimage method)
        (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)
        previous_filename() (in module fabio.fabioutils)
        previous_image() (fabio.file_series.file_series method)
        previous_object() (fabio.file_series.file_series method)
        (fabio.file_series.filename_series method)

        R

        read() (fabio.adscimage.adscimage method)
        (fabio.GEimage.GEimage method)
        (fabio.HiPiCimage.HiPiCimage method)
        (fabio.OXDimage.OXDimage method)
        (fabio.binaryimage.binaryimage method)
        (fabio.bruker100image.bruker100image method)
        (fabio.brukerimage.brukerimage method)
        (fabio.cbfimage.cbfimage method)
        (fabio.datIO.columnfile method)
        (fabio.datIO.fabiodata method)
        (fabio.dm3image.dm3image method)
        (fabio.edfimage.edfimage method)
        (fabio.fabioimage.fabioimage method)
        (fabio.fit2dmaskimage.fit2dmaskimage method)
        (fabio.fit2dspreadsheetimage.fit2dspreadsheetimage method)
        (fabio.kcdimage.kcdimage method)
        (fabio.mar345image.mar345image method)
        (fabio.pnmimage.pnmimage method)
        (fabio.tifimage.tifimage method)
        (fabio.xsdimage.xsdimage method)
        read_data() (fabio.dm3image.dm3image method)
        read_tag_entry() (fabio.dm3image.dm3image method)
        read_tag_group() (fabio.dm3image.dm3image method)
        read_tag_type() (fabio.dm3image.dm3image method)
        readbytes() (fabio.dm3image.dm3image method)
        readbytestream() (in module fabio.readbytestream)
        readCIF() (fabio.cbfimage.CIF method)
        readheader() (fabio.fabioimage.fabioimage method)
        readROI() (fabio.fabioimage.fabioimage method)
        rebin() (fabio.fabioimage.fabioimage method)
        resetvals() (fabio.fabioimage.fabioimage method)

        S

        save() (fabio.fabioimage.fabioimage method)
        saveCIF() (fabio.cbfimage.CIF method)
        Section (class in fabio.OXDimage)
        setBpp() (fabio.edfimage.edfimage method)
        setByteCode() (fabio.edfimage.edfimage method)
        (fabio.edfimage.Frame method)
        setCapsHeader() (fabio.edfimage.edfimage method)
        setData() (fabio.edfimage.edfimage method)
        (fabio.OXDimage.Section method)
        (fabio.edfimage.Frame method)
        setDim1() (fabio.edfimage.edfimage method)
        setDim2() (fabio.edfimage.edfimage method)
        setHeader() (fabio.edfimage.edfimage method)
        setHeaderKeys() (fabio.edfimage.edfimage method)
        setNbFrames() (fabio.edfimage.edfimage method)
        setSize() (fabio.fabioutils.BZ2File method)
        (fabio.fabioutils.File method)
        (fabio.fabioutils.StringIO method)
        size (fabio.fabioutils.BZ2File attribute)
        (fabio.fabioutils.File attribute)
        (fabio.fabioutils.StringIO attribute)
        SPACER (fabio.brukerimage.brukerimage attribute)
        START_COMMENT (fabio.cbfimage.CIF attribute)
        str() (fabio.fabioutils.FilenameObject method)
        StringIO (class in fabio.fabioutils)
        swap_needed() (fabio.binaryimage.binaryimage static method)
        (fabio.edfimage.Frame method)
        (fabio.edfimage.edfimage method)

        T

        test() (in module fabio.adscimage)
        (in module fabio.brukerimage)
        (in module fabio.fabioimage)
        Tiff_header (class in fabio.tifimage)
        TiffIO (class in fabio.TiffIO)
        tifimage (class in fabio.tifimage)
        toAscii() (in module fabio.fabioutils)
        toPIL16() (fabio.bruker100image.bruker100image method)
        (fabio.fabioimage.fabioimage method)
        tostring() (fabio.cbfimage.CIF method)
        (fabio.fabioutils.FilenameObject method)

        U

        UnknownCompressedFile (class in fabio.fabioutils)
        unpack() (fabio.edfimage.edfimage method)
        (fabio.tifimage.Image_File_Directory method)
        (fabio.tifimage.Image_File_Directory_entry method)
        update_header() (fabio.fabioimage.fabioimage method)

        W

        write() (fabio.adscimage.adscimage method)
        (fabio.GEimage.GEimage method)
        (fabio.OXDimage.OXDimage method)
        (fabio.binaryimage.binaryimage method)
        (fabio.brukerimage.brukerimage method)
        (fabio.cbfimage.cbfimage method)
        (fabio.edfimage.edfimage method)
        (fabio.fabioimage.fabioimage method)
        (fabio.fit2dmaskimage.fit2dmaskimage method)
        (fabio.mar345image.mar345image method)
        (fabio.pnmimage.pnmimage method)
        (fabio.tifimage.tifimage method)
        writeImage() (fabio.TiffIO.TiffIO method)

        X

        xsdimage (class in fabio.xsdimage)
        fabio-0.1.3/doc/html/getting_started.html0000644000175000017500000005722212233250022021144 0ustar jeromejerome00000000000000 Getting Started — FabIO 0.1.3 documentation

        Getting Started¶

        FabIO is a Python module for reading and handling data from two-dimensional X-ray detectors.

        FabIO is a Python module written for easy and transparent reading of raw two-dimensional data from various X-ray detectors. The module provides a function for reading any image and returning a fabioimage object which contains both metadata (header information) and the raw data. All fabioimage object offer additional methods to extract information about the image and to open other detector images from the same data series.

        Introduction¶

        One obstacle when writing software to analyse data collected from a two-dimensional detector is to read the raw data into the program, not least because the data can be stored in many different formats depending on the instrument used. To overcome this problem we decided to develop a general module, FabIO (FABle I/O), to handle reading and writing of two-dimensional data. The code-base was initiated by merging parts of our fabian imageviewer and ImageD11 peak-search programs and has been developed since 2007 as part of the TotalCryst program suite for analysis of 3DXRD microscopy data. During integration into a range of scientific programs like the FABLE graphical interface, EDNA and the fast azimuthal integration library, pyFAI; FabIO has gained several features like handling multi-frame image formats as well as writing many of the file formats.

        FabIO Python module¶

        Python is a scripting language that is very popular among scientists and which also allows well structured applications and libraries to be developed.

        Philosophy¶

        The intention behind this development was to create a Python module which would enable easy reading of 2D data images, from any detector without having to worry about the file format. Therefore FabIO just needs a file name to open a file and it determines the file format automatically and deals with gzip and bzip2 compression transparently. Opening a file returns an object which stores the image in memory as a 2D NumPy array and the metadata, called header, in a Python dictionary. Beside the data and header attributes, some methods are provided for reading the previous or next image in a series of images as well as jumping to a specific file number. For the user, these auxiliary methods are intended to be independent of the image format (as far as is reasonably possible).

        FabIO is written in an object-oriented style (with classes) but aims at being used in a scripting environment: special care has been taken to ensure the library remains easy to use. Therefore no knowledge of object-oriented programming is required to get full benefits of the library. As the development is done in a collaborative and decentralized way; a comprehensive test suite has been added to reduce the number of regressions when new features are added or old problems are repaired. The software is very modular and allows new classes to be added for handling other data formats easily. FabIO and its source-code are freely available to everyone on-line, licensed under the GNU General Public License version 3 (GPLv3). FabIO is also available directly from popular Linux distributions like Debian and Ubuntu.

        Implementation¶

        The main language used in the development of FabIO is Python; however, some image formats are compressed and require compression algorithms for reading and writing data. When such algorithms could not be implemented efficiently using Python or NumPy native modules were developed, in i.e. standard C code callable from Python (sometimes generated using Cython). This code has to be compiled for each computer architecture and offers excellent performance. FabIO is only dependent on the NumPy module and has extra features if two other optional Python modules are available. For reading XML files (that are used in EDNA) the Lxml module is required and the Python Image Library, PIL is needed for producing a PIL image for displaying the image in graphical user interfaces and several image-processing operations that are not re-implemented in FabIO. A variety of useful image processing is also available in the scipy.ndimage module and in scikits-image.

        Images can also be displayed in a convenient interactive manner using matplotlib and an IPython shell , which is mainly used for developing data analysis algorithms. Reading and writing procedure of the various TIFF formats is based on the TiffIO code from PyMCA.

        In the Python shell, the fabio module must be imported prior to reading an image in one of the supported file formats (see Table Supported formats, hereafter). The fabio.open function creates an instance of the Python class fabioimage, from the name of a file. This instance, named img hereafter, stores the image data in img.data as a 2D NumPy array. Often the image file contains more information than just the intensities of the pixels, e.g. information about how the image is stored and the instrument parameters at the time of the image acquisition, these metadata are usually stored in the file header. Header information, are available in img.header as a Python dictionary where keys are strings and values are usually strings or numeric values.

        Information in the header about the binary part of the image (compression, endianness, shape) are interpreted however, other metadata are exposed as they are recorded in the file. FabIO allows the user to modify and, where possible, to save this information (the table Supported formats summarizes writable formats). Automatic translation between file-formats, even if desirable, is sometimes impossible because not all format have the capability to be extended with additional metadata. Nevertheless FabIO is capable of converting one image data-format into another by taking care of the numerical specifics: for example float arrays are converted to integer arrays if the output format only accepts integers.

        FabIO methods¶

        One strength of the implementation in an object oriented language is the possibility to combine functions (or methods) together with data appropriate for specific formats. In addition to the header information and image data, every fabioimage instance (returned by fabio.open) has methods inherited from fabioimage which provide information about the image minimum, maximum and mean values. In addition there are methods which return the file number, name etc. Some of the most important methods are specific for certain formats because the methods are related to how frames in a sequence are handled; these methods are img.next(), img.previous(), and img.getframe(n). The behaviour of such methods varies depending on the image format: for single-frame format (like mar345), img.next() will return the image in next file; for multi-frame format (like GE), img.next() will return the next frame within the same file. For formats which are possibly multi-framed like EDF, the behaviour depends on the actual number of frames per file (accessible via the img.nframes attribute).

        Usage¶

        Examples¶

        In this section we have collected some basic examples of how FabIO can be employed.

        Opening an image:

        import fabio
        im100 = fabio.open('Quartz_0100.tif') # Open image file
        print(im0.data[1024,1024])            # Check a pixel value
        im101 = im100.next()                  # Open next image
        im270 = im1.getframe(270)             # Jump to file number 270: Quartz_0270.tif
        

        Normalising the intensity to a value in the header:

        img = fabio.open('exampleimage0001.edf')
        print(img.header)
        {'ByteOrder': 'LowByteFirst',
         'DATE (scan begin)': 'Mon Jun 28 21:22:16 2010',
         'ESRFCurrent': '198.099',
        ...
        }
        # Normalise to beam current and save data
        srcur = float(img.header['ESRFCurrent'])
        img.data *= 200.0/srcur
        img.write('normed_0001.edf')

        Interactive viewing with matplotlib:

        from matplotlib import pyplot       # Load matplotlib
        pyplot.imshow(img.data)             # Display as an image
        pyplot.show()                       # Show GUI window
        

        Future and perspectives¶

        The Hierarchical Data Format version 5 (hdf5) is a data format which is increasingly popular for storage of X-ray and neutron data. To name a few facilities the synchrotron Soleil and the neutron sources ISIS, SNS and SINQ already use HDF extensively through the NeXus format. For now, mainly processed or curated data are stored in this format but new detectors are rumoured to provide native output in HDF5. FabIO will rely on H5Py, which already provides a good HDF5 binding for Python, as an external dependency, to be able to read and write such HDF5 files.

        In the near future FabIO will be upgraded to work with Python3 (a new version of Python); this change of version will affect some internals FabIO as string and file handling have been altered. This change is already ongoing as many parts of native code in C have already been translated into Cython to smoothe the transition, since Cython generates code compatible with Python3. This also makes it easier to retain backwards compatibility with the earlier Python versions.

        Conclusion¶

        FabIO gives an easy way to read and write 2D images when using the Python computer language. It was originally developed for X-ray diffraction data but now gives an easy way for scientists to access and manipulate their data from a wide range of 2D X-ray detectors. We welcome contributions to further improve the code and hope to add more file formats in the future as well as port the existing code base to the emerging Python3.

        Acknoledgements¶

        We acknowledge Andy Götz and Kenneth Evans for extensive testing when including the FabIO reader in the Fable image viewer (Götz et al., 2007).We also thank V. Armando Solé for assistance with his TiffIO reader and Carsten Gundlach for deployment of FabIO at the beamlines i711 and i811, MAX IV, and providing bug reports. We finally acknowledge our colleagues who have reported bugs and helped to improve FabIO. Financial support was granted by the EU 6th Framework NEST/ADVENTURE project TotalCryst (Poulsen et al., 2006).

        Citation¶

        Knudsen, E. B., Sørensen, H. O., Wright, J. P., Goret, G. & Kieffer, J. (2013). J. Appl. Cryst. 46, 537-539.

        http://dx.doi.org/10.1107/S0021889813000150

        List of file formats that FabIO can read and write¶

        In alphabetical order. The listed filename extensions are typical examples. FabIO tries to deduce the actual format from the file itself and only uses extensions as a fallback if that fails.

        Supported formats
        Python Module Detector / Format Extension Read Multi-image Write
        ADSC ADSC Quantum .img Yes No Yes
        Bruker Bruker formats .sfrm Yes No Yes
        DM3 Gatan Digital Micrograph .dm3 Yes No No
        EDF ESRF data format .edf Yes Yes Yes
        EDNA-XML Used by EDNA .xml Yes No No
        CBF CIF binary files .cbf Yes No Yes
        kcd Nonius KappaCCD .kccd Yes No No
        fit2d mask Used by Fit2D .msk Yes No Yes
        fit2d spreadsheet Used by Fit2D .spr Yes No Yes
        GE General Electric No Yes Yes No
        HiPiC Hamamatsu CCD .tif Yes No No
        marccd MarCCD/Mar165 .mccd Yes No Yes
        mar345 Mar345 image plate .mar3450 Yes No Yes
        OXD Oxford Diffraction .img Yes No Yes
        pilatus Dectris Pilatus Tiff .tif Yes No Yes
        PNM Portable aNy Map .pnm Yes No No
        TIFF Tagged Image File Format .tif Yes No Yes

        Adding new file formats¶

        We hope it will be relatively easy to add new file formats to fabio in the future. The basic idea is the following:
        1. inherit from fabioimage overriding the methods _readheader, read and optionally write. Name your new module XXXimage where XXX means something (eg tifimage).
        2. readheader fills in a dictionary of “name”:”value” pairs in self.header. No one expects to find anything much in there.
        3. read fills in self.data with a numpy array holding the image. Some redundant info which also appears are self.dim1 and self.dim2: the image dimensions, self.bpp is the bytes per pixel and self.bytecode is the numpy.dtype.type of the data.
        4. The member variables “_need_a_seek_to_read” and “_need_a_real_file” are there in case you have trouble with the transparent handling of bz2 and gz files.
        5. Register the file type (extension naming) in fabioutils.py:FILETYPES
        6. Add your new module as an import into fabio.openimage
        7. Fill out the magic numbers for your format in fabio.openimage if you know them (the characteristic first few bytes in the file)
        8. Upload a testimage to the file release system and create a unittest testcase which opens an example of your new format, confirming the image has actually been read in successfully (eg check the mean, max, min and esd are all correct, perhaps orientation too)
        9. Run pylint on your code and then please go clean it up. Have a go at mine while you are at it.
        10. Bask in the warm glow of appreciation when someone unexpectedly learns they don’t need to convert their data into another format
        fabio-0.1.3/doc/html/searchindex.js0000644000175000017500000005456412233250023017731 0ustar jeromejerome00000000000000Search.setIndex({objects:{"fabio.xsdimage.xsdimage":{read:[4,1,1,""]},"fabio.fit2dspreadsheetimage":{fit2dspreadsheetimage:[4,5,1,""]},"fabio.mar345image":{mar345image:[4,5,1,""]},"fabio.edfimage":{Frame:[4,5,1,""],edfimage:[4,5,1,""]},"fabio.OXDimage.OXDimage":{write:[4,1,1,""],checkData:[4,3,1,""],getCompressionRatio:[4,1,1,""],read:[4,1,1,""]},"fabio.binaryimage":{binaryimage:[4,5,1,""]},"fabio.fabioutils.BZ2File":{getSize:[4,1,1,""],setSize:[4,1,1,""],size:[4,4,1,""]},"fabio.fabioutils.FilenameObject":{deconstruct_filename:[4,1,1,""],tostring:[4,1,1,""],str:[4,1,1,""]},"fabio.dm3image":{dm3image:[4,5,1,""]},"fabio.fit2dspreadsheetimage.fit2dspreadsheetimage":{read:[4,1,1,""]},"fabio.kcdimage":{kcdimage:[4,5,1,""]},"fabio.xsdimage":{xsdimage:[4,5,1,""]},"fabio.HiPiCimage":{HiPiCimage:[4,5,1,""]},"fabio.file_series.filename_series":{next_object:[4,1,1,""],previous_object:[4,1,1,""],prev_image:[4,1,1,""],jump:[4,1,1,""],current:[4,1,1,""],next:[4,1,1,""],jump_image:[4,1,1,""],current_object:[4,1,1,""],jump_object:[4,1,1,""],previous:[4,1,1,""],current_image:[4,1,1,""],next_image:[4,1,1,""]},"fabio.HiPiCimage.HiPiCimage":{read:[4,1,1,""]},"fabio.bruker100image":{bruker100image:[4,5,1,""]},"fabio.datIO.columnfile":{read:[4,1,1,""]},"fabio.OXDimage":{OXDimage:[4,5,1,""],Section:[4,5,1,""]},"fabio.brukerimage":{test:[4,2,1,""],brukerimage:[4,5,1,""]},"fabio.edfimage.Frame":{getByteCode:[4,1,1,""],swap_needed:[4,1,1,""],parseheader:[4,1,1,""],bytecode:[4,4,1,""],setByteCode:[4,1,1,""],getEdfBlock:[4,1,1,""],getData:[4,1,1,""],data:[4,4,1,""],setData:[4,1,1,""]},"fabio.adscimage":{test:[4,2,1,""],adscimage:[4,5,1,""]},"fabio.cbfimage.CIF":{BINARY_MARKER:[4,4,1,""],exists:[4,1,1,""],popitem:[4,1,1,""],loadCHIPLOT:[4,1,1,""],loadCIF:[4,1,1,""],pop:[4,1,1,""],EOL:[4,4,1,""],START_COMMENT:[4,4,1,""],tostring:[4,1,1,""],readCIF:[4,1,1,""],isAscii:[4,3,1,""],BLANK:[4,4,1,""],saveCIF:[4,1,1,""],existsInLoop:[4,1,1,""],LoopHasKey:[4,3,1,""]},"fabio.cbfimage.cbfimage":{read:[4,1,1,""],checkData:[4,3,1,""],write:[4,1,1,""]},"fabio.pilatusimage":{pilatusimage:[4,5,1,""]},"fabio.fabioimage":{test:[4,2,1,""],fabioimage:[4,5,1,""]},"fabio.datIO.fabiodata":{read:[4,1,1,""]},"fabio.cbfimage":{CIF:[4,5,1,""],cbfimage:[4,5,1,""]},"fabio.converters":{convert_header:[4,2,1,""],convert_data_integer:[4,2,1,""],convert_data:[4,2,1,""]},"fabio.tifimage.tifimage":{read:[4,1,1,""],write:[4,1,1,""]},fabio:{fabioutils:[4,0,1,""],kcdimage:[4,0,1,""],fit2dspreadsheetimage:[4,0,1,""],binaryimage:[4,0,1,""],pilatusimage:[4,0,1,""],HiPiCimage:[4,0,1,""],adscimage:[4,0,1,""],mar345image:[4,0,1,""],bruker100image:[4,0,1,""],readbytestream:[4,0,1,""],datIO:[4,0,1,""],"__init__":[4,0,1,""],TiffIO:[4,0,1,""],fabioimage:[4,0,1,""],compression:[4,0,1,""],OXDimage:[4,0,1,""],converters:[4,0,1,""],fit2dmaskimage:[4,0,1,""],GEimage:[4,0,1,""],pnmimage:[4,0,1,""],dm3image:[4,0,1,""],marccdimage:[4,0,1,""],xsdimage:[4,0,1,""],cbfimage:[4,0,1,""],edfimage:[4,0,1,""],file_series:[4,0,1,""],tifimage:[4,0,1,""],openimage:[4,0,1,""],brukerimage:[4,0,1,""]},"fabio.GEimage":{GEimage:[4,5,1,""],demo:[4,2,1,""]},"fabio.edfimage.edfimage":{header_keys:[4,4,1,""],fastReadData:[4,1,1,""],dim2:[4,4,1,""],header:[4,4,1,""],dim1:[4,4,1,""],checkHeader:[4,3,1,""],bytecode:[4,4,1,""],setByteCode:[4,1,1,""],delHeader:[4,1,1,""],next:[4,1,1,""],previous:[4,1,1,""],delData:[4,1,1,""],delHeaderKeys:[4,1,1,""],data:[4,4,1,""],appendFrame:[4,1,1,""],nframes:[4,4,1,""],write:[4,1,1,""],getNbFrames:[4,1,1,""],getCapsHeader:[4,1,1,""],capsHeader:[4,4,1,""],getData:[4,1,1,""],setData:[4,1,1,""],delCapsHeader:[4,1,1,""],read:[4,1,1,""],getframe:[4,1,1,""],getDim1:[4,1,1,""],setHeaderKeys:[4,1,1,""],getDim2:[4,1,1,""],setCapsHeader:[4,1,1,""],setBpp:[4,1,1,""],getDims:[4,1,1,""],unpack:[4,1,1,""],getByteCode:[4,1,1,""],fastReadROI:[4,1,1,""],dims:[4,4,1,""],swap_needed:[4,1,1,""],getHeader:[4,1,1,""],deleteFrame:[4,1,1,""],getHeaderKeys:[4,1,1,""],setDim1:[4,1,1,""],bpp:[4,4,1,""],setDim2:[4,1,1,""],getBpp:[4,1,1,""],setNbFrames:[4,1,1,""],setHeader:[4,1,1,""]},"fabio.dm3image.dm3image":{read_data:[4,1,1,""],read:[4,1,1,""],read_tag_entry:[4,1,1,""],read_tag_type:[4,1,1,""],readbytes:[4,1,1,""],read_tag_group:[4,1,1,""]},"fabio.compression":{decZlib:[4,2,1,""],md5sum:[4,2,1,""],compTY1:[4,2,1,""],decBzip2:[4,2,1,""],decKM4CCD:[4,2,1,""],decPCK:[4,2,1,""],compByteOffet_numpy:[4,2,1,""],decTY1:[4,2,1,""],decGzip:[4,2,1,""],decByteOffet_python:[4,2,1,""],endianness:[4,2,1,""],decByteOffet_numpy:[4,2,1,""],decByteOffet_cython:[4,2,1,""],compPCK:[4,2,1,""],decByteOffet_weave:[4,2,1,""]},"fabio.tifimage":{tifimage:[4,5,1,""],Tiff_header:[4,5,1,""],Image_File_Directory_entry:[4,5,1,""],Image_File_Directory:[4,5,1,""]},"fabio.datIO":{fabiodata:[4,5,1,""],columnfile:[4,5,1,""]},"fabio.bruker100image.bruker100image":{read:[4,1,1,""],toPIL16:[4,1,1,""]},"fabio.file_series":{new_file_series:[4,2,1,""],filename_series:[4,5,1,""],numbered_file_series:[4,5,1,""],file_series:[4,5,1,""],new_file_series0:[4,2,1,""]},"fabio.fabioimage.fabioimage":{load:[4,1,1,""],getheader:[4,1,1,""],resetvals:[4,1,1,""],classname:[4,4,1,""],checkHeader:[4,3,1,""],integrate_area:[4,1,1,""],previous:[4,1,1,""],getmean:[4,1,1,""],rebin:[4,1,1,""],next:[4,1,1,""],write:[4,1,1,""],add:[4,1,1,""],getstddev:[4,1,1,""],getmin:[4,1,1,""],getmax:[4,1,1,""],save:[4,1,1,""],make_slice:[4,1,1,""],read:[4,1,1,""],readROI:[4,1,1,""],getframe:[4,1,1,""],readheader:[4,1,1,""],checkData:[4,3,1,""],update_header:[4,1,1,""],convert:[4,1,1,""],toPIL16:[4,1,1,""],getclassname:[4,1,1,""]},"fabio.openimage":{do_magic:[4,2,1,""],openheader:[4,2,1,""],openimage:[4,2,1,""]},"fabio.file_series.file_series":{next_object:[4,1,1,""],jump_image:[4,1,1,""],first_object:[4,1,1,""],last_image:[4,1,1,""],jump:[4,1,1,""],current:[4,1,1,""],len:[4,1,1,""],next:[4,1,1,""],previous_object:[4,1,1,""],current_object:[4,1,1,""],first:[4,1,1,""],first_image:[4,1,1,""],jump_object:[4,1,1,""],next_image:[4,1,1,""],last:[4,1,1,""],previous:[4,1,1,""],current_image:[4,1,1,""],last_object:[4,1,1,""],previous_image:[4,1,1,""]},"fabio.fabioutils.StringIO":{getSize:[4,1,1,""],setSize:[4,1,1,""],size:[4,4,1,""]},"fabio.pnmimage.pnmimage":{P3dec:[4,3,1,""],P7dec:[4,3,1,""],read:[4,1,1,""],P5dec:[4,3,1,""],P2dec:[4,3,1,""],write:[4,1,1,""],P4dec:[4,3,1,""],P6dec:[4,3,1,""],P1dec:[4,3,1,""],checkData:[4,3,1,""]},"fabio.mar345image.mar345image":{write:[4,1,1,""],read:[4,1,1,""],nb_overflow_pixels:[4,1,1,""],checkData:[4,3,1,""]},"fabio.readbytestream":{readbytestream:[4,2,1,""]},"fabio.tifimage.Image_File_Directory":{unpack:[4,1,1,""]},"fabio.adscimage.adscimage":{read:[4,1,1,""],write:[4,1,1,""]},"fabio.GEimage.GEimage":{write:[4,1,1,""],read:[4,1,1,""],previous:[4,1,1,""],getframe:[4,1,1,""],next:[4,1,1,""]},"fabio.brukerimage.brukerimage":{HEADERS_KEYS:[4,4,1,""],basic_translate:[4,1,1,""],read:[4,1,1,""],gen_overflow:[4,1,1,""],calc_bpp:[4,1,1,""],write:[4,1,1,""],SPACER:[4,4,1,""],gen_header:[4,1,1,""],bpp_to_numpy:[4,4,1,""]},"fabio.OXDimage.Section":{getSize:[4,1,1,""],setData:[4,1,1,""]},"fabio.binaryimage.binaryimage":{write:[4,1,1,""],swap_needed:[4,3,1,""],estimate_offset_value:[4,1,1,""],read:[4,1,1,""]},"fabio.fit2dmaskimage.fit2dmaskimage":{read:[4,1,1,""],checkData:[4,3,1,""],write:[4,1,1,""]},"fabio.TiffIO":{TiffIO:[4,5,1,""]},"fabio.pnmimage":{pnmimage:[4,5,1,""]},"fabio.marccdimage":{marccdimage:[4,5,1,""],make_format:[4,2,1,""],interpret_header:[4,2,1,""]},"fabio.fabioutils":{FilenameObject:[4,5,1,""],UnknownCompressedFile:[4,5,1,""],BZ2File:[4,5,1,""],isAscii:[4,2,1,""],StringIO:[4,5,1,""],deconstruct_filename:[4,2,1,""],nice_int:[4,2,1,""],next_filename:[4,2,1,""],previous_filename:[4,2,1,""],getnum:[4,2,1,""],toAscii:[4,2,1,""],pad:[4,2,1,""],File:[4,5,1,""],deprecated:[4,2,1,""],construct_filename:[4,2,1,""],numstem:[4,2,1,""],extract_filenumber:[4,2,1,""],GzipFile:[4,5,1,""],jump_filename:[4,2,1,""]},"fabio.TiffIO.TiffIO":{getData:[4,1,1,""],writeImage:[4,1,1,""],getInfo:[4,1,1,""],getImageFileDirectories:[4,1,1,""],getNumberOfImages:[4,1,1,""],getImage:[4,1,1,""]},"fabio.tifimage.Image_File_Directory_entry":{extract_data:[4,1,1,""],unpack:[4,1,1,""]},"fabio.fit2dmaskimage":{fit2dmaskimage:[4,5,1,""]},"fabio.fabioutils.File":{getSize:[4,1,1,""],setSize:[4,1,1,""],size:[4,4,1,""]},"fabio.kcdimage.kcdimage":{read:[4,1,1,""],checkData:[4,3,1,""]}},terms:{roi:[4,1],all:[1,2,3,4],code:[1,2,3,4],edf:[1,2,4],func:4,represent:4,skip:4,macosx:[4,3,1],roskild:4,four:4,squar:4,setdim2:4,latter:4,upgrad:2,getinfo:4,geimag:[0,4],follow:[2,3],elapsdr:4,nstep:4,maxxi:4,row:[4,3],next_object:4,cython:[2,1],decid:[2,4],gael:4,depend:[0,2,3,1],pd_cif:4,setheaderkei:4,readbruk:4,sorri:4,readabl:4,linesep:4,getmean:4,deviat:4,swap:4,getmin:4,under:[2,1],filetyp:2,isinst:4,x04:4,kcd:[1,2,4],digit:[2,4],unzip:3,everi:[2,4],string:[2,4],without:[2,4],fals:[4,3],compresslevel:4,csize:4,getdata:4,util:4,repositori:3,typeout:4,previo:4,got:3,veri:[2,1],affect:2,subprocess:3,relev:4,mar345imag:[0,4],tri:[2,4],dim:4,first_object:4,impact:1,bzip2:[2,3,4],loadchiplot:4,gui:2,jump_filenam:4,list:[2,4],loophaskei:4,iter:4,correct:[2,4],"try":[4,3],adjust:4,image_file_directori:4,detpar:4,section:[2,4],small:4,read_tag_entri:4,"_strin":4,grenobl:4,dimens:[2,4],upper:4,md5sum:4,moreov:3,nlate:4,among:[2,4],numbered_file_seri:4,crop:4,sign:4,jump:[2,4],raw_16:4,integrate_area:4,download:3,further:2,chem:4,cfr:4,port:2,append:4,"goto":4,compat:[2,4],index:[0,4],setbytecod:4,full_str:4,previous_filenam:4,appear:2,richard:4,defin:4,neg:4,sum:4,abl:2,calcul:4,overload:1,current:[2,4],delet:4,version:[0,2,3,4],build_doc:1,destin:4,"new":[1,2,4],net:3,setter:4,bytestream:4,method:[1,2,4],deduc:2,keep_i:4,getsiz:4,ongo:2,full:[2,3,4],construct:4,p1dec:4,gener:[2,4],learn:2,"2darrai":4,len:4,sinq:2,behaviour:2,totalcryst:2,countimg:4,lgpl:4,max_entri:4,trunk:3,next_imag:4,bz2file:4,modifi:[2,4],sinc:[2,3],valu:[2,4],convert:[0,2,3,4],convers:4,y_rebin_fact:4,imagecif:4,warpfil:4,fixm:4,everyon:2,prior:2,bitmask:4,dicthead:4,storag:2,implement:[1,2,4],portabl:2,orient:2,hitemp:4,via:[2,3],builder:3,sourc:[0,2,3,4],mydata0002:4,mydata0003:4,curat:2,appli:4,modul:[0,1,2,3,4],"_dicthead":4,apt:3,nframe:[2,4],esrf:[2,4],filenam:[1,2,4],unix:4,"boolean":4,pauw:4,org:[2,3],instal:[0,3,1],decrement:4,should:4,kobayashi:4,resetv:4,ccdparm:4,from:[0,1,2,3,4],kenneth:2,zip:[4,3],memori:[2,1],"float":[2,4],nexp:4,regist:2,two:[2,4],nexu:2,subvers:3,jpa:4,program:[2,3,4],msk:2,typo:4,demo:4,taken:2,prev:4,type:[1,2,4],last_object:4,more:[1,2,4],sort:4,flat:1,wrapper:4,desir:2,interpret_head:4,relat:[2,1],pylint:[2,1],uint8:4,exceptiontyp:4,warn:[4,3],trail:3,warm:2,indic:[0,4],actual:[2,4],hold:2,unpack:[4,3],cach:4,must:2,uint64:4,dim2:[2,4],none:4,graphic:2,retriev:4,sometim:[2,4],dest:4,alia:1,setup:[3,1],checkhead:4,fast:[1,2,4],dev:3,other:[2,4],displim:4,remain:2,minimum:[2,4],can:[2,3,4],endian:[2,4],deb:3,purpos:[4,3],root:3,setcapshead:4,overrid:[2,4],malform:3,kappaccd:[2,4],stream:4,give:2,edna:[2,1],lock:4,spr:2,sudo:3,templat:1,getnum:4,tag:[2,3,4],"_need_a_real_fil":2,tarbal:3,normed_0001:2,made:4,unsign:4,occur:4,normalis:2,alwai:4,lxml:[2,3],end:[4,1],soleil:2,anoth:[2,4],get:[0,2,3,4],isi:2,filenameobject:4,how:[2,4],jpw:4,pure:4,instead:[4,1],mystr:4,gzip:[1,2,3,4],simpl:4,updat:4,im270:2,noverfl:4,mar:4,xsdimag:[0,4,3],overridden:4,decbyteoffet_numpi:4,max:[2,4],pilatu:[1,2,4],npa:4,mccd:2,less:1,regress:[2,3],decbyteoffet_python:4,getnbfram:4,mai:4,redund:2,philosophi:2,data:[1,2,4],auxiliari:2,"short":4,nativ:[1,2,4],bind:[2,1],author:4,mono_output:4,correspond:[4,3],exclud:4,caus:4,inform:[2,4],environ:[2,3],allow:[2,1],suggest:4,callabl:2,"s\u00f8rensen":2,fallback:2,fastreadroi:4,first_imag:4,order:[2,4],float64:4,oper:2,todo:4,rotat:4,pymca:[2,4],over:4,move:1,becaus:2,addit:2,spreadsheet:2,p4dec:4,scientist:2,through:[1,2,4],same:[2,1],still:4,mainli:[2,4],paramet:[2,4],write:[1,2,4],style:2,do_mag:4,img:2,brian:4,x1a:4,fix:1,getheaderkei:4,bytecod:[2,4],numstem:4,platform:3,window:[1,2,3,4],setnbfram:4,file_seri:[0,4],helper:4,knudsen:[2,4],comprehens:[2,3],jump_object:4,main:2,pixel:[2,4],wordord:4,count:[4,3],them:[2,3],good:2,"return":[2,4],thei:[2,4],getnumberofimag:4,handl:[2,4],financi:2,deckm4ccd:4,gundlach:2,handi:3,exot:4,nation:4,"break":4,framework:2,x_rebin_fact:4,filter2:4,front:3,exceptiontraceback:4,now:[2,4],old:[2,4],introduct:[0,2],rumour:2,document:[0,1],name:[2,3,4],changelog:[0,1],perspect:[0,2],revers:4,radiat:4,separ:4,easili:2,fabian:[2,4],fit2dmaskimag:[0,4],mode:4,each:2,h5py:2,checkdata:4,unicod:4,european:4,deletefram:4,trailer:4,mean:[2,4],compil:2,"int":4,fail:2,citat:2,map:2,colleagu:2,chunk:4,overflow:4,idea:[2,4],im100:2,upload:2,ensur:[2,3],meta:4,"static":4,expect:[2,3],quantum:2,our:2,forgzip:4,getdim2:4,extract:[2,4],event:4,special:[2,4],out:[2,3,4],variabl:[2,3],matrix:4,routin:4,open:[1,2,4],setsiz:4,bad:3,int16:4,research:4,content:[0,4],getstddev:4,rel:2,internet:3,print:[2,4],"j\u00e9r\u00f4me":4,readcif:4,merg:[2,1],uint32:4,unus:4,hammerslei:4,franc:4,earlier:2,linear:4,manipul:[2,4],given:4,noniu:[1,2,4],standard:[2,3,4],swap_need:4,reason:2,base:[2,3,4],dictionari:[2,4],usual:2,releas:2,delheaderkei:4,"byte":[2,3,4],phd:4,bask:2,complianc:1,new_file_seri:4,wai:[2,1],exec_info:4,angl:4,could:2,traceback:4,keep:4,filter:4,length:4,enforc:4,place:3,wright:[2,4],compty1:4,filename_seri:4,retain:2,convert_head:4,imposs:2,first:[2,3,4],origin:2,pleas:[2,4],rang:[2,4],directli:2,onc:4,arrai:[1,2,4],independ:2,prev_imag:4,binary_mark:4,yourself:4,date:[2,4],xtran:4,alreadi:[2,4],done:[2,3,4],messag:4,blank:4,beamlin:2,miss:[4,3],size:4,differ:2,kcdimag:[0,4],nrow:4,workaround:4,script:2,ndarrai:4,unknown:[4,3],fmt:4,imshow:2,system:[2,4],least:2,stack:4,binari:[1,2,3,4],appl:2,too:2,accept:[2,4],time:[2,3],dm3imag:[0,4],postnum:4,conveni:2,easier:2,store:2,fit2dmod:4,shell:2,option:[2,1],especi:4,scikit:2,loadcif:4,compressor:4,getter:4,pars:4,byte_offet:4,isascii:4,marccd:[2,4],number:[2,4],strang:4,jump_imag:4,ccp4:4,deldata:4,scheme:3,target:4,keyword:4,morph:4,provid:[1,2,3,4],remov:4,structur:[2,4],charact:4,project:[2,3],toascii:4,bruker100imag:[0,4],str:4,basic_transl:4,posit:4,writeimag:4,lowtemp:4,thu:4,seri:[2,4],dettyp:4,analysi:2,comput:2,fit2dspreadsheetimag:[0,4],clip:4,coord:4,ran:3,well:2,pass:4,svnroot:3,reader:[1,2,4],nontim:4,formula:4,raw:[2,4],manner:2,have:[2,3,1],tabl:[0,2,4],need:[2,3,4],cumulat:4,previou:[2,4],seek:4,ty1:3,unknowncompressedfil:4,packag:[0,4,3],strength:2,bz2:[1,2,4],advic:3,min:[2,4],readroi:4,self:[2,4],offer:2,framenb:4,maximum:[2,4],also:[2,3,4],decgzip:4,take:[2,3],which:[2,3,4],tupl:4,combin:2,detector:[1,2,4],zlib:4,appendfram:4,noth:4,singl:[2,3,4],even:2,begin:2,sure:3,distribut:[2,3],hipic:[2,4],deploy:2,buffer:4,licens:[2,4],compress:[0,2,3,4],getbytecod:4,compr:4,most:[2,3],beta:4,ccd:[1,2,4],pair:[2,4],datablock:3,"class":[1,2,4],gain:[2,3],glow:2,hereaft:2,doi:2,don:[2,3],bug:[1,2,3,4],later:3,metal:4,rais:4,doe:4,part:[2,3],clean:[2,1],getimagefiledirectori:4,pnm:[2,4],axes2:4,axi:4,pyplot:2,fact:4,translat:[2,4],show:2,i711:2,topil16:4,openimag:[0,1,2,4],syntax:4,spacer:4,worri:[2,3],modifact:4,identifi:1,wavelen:4,trivial:4,find:[2,4],esdcel:4,help:2,xml:[1,2,4],access:2,onli:[2,4],slow:4,nbytespp:4,execut:3,facil:[2,4],mydata:4,pilatusimag:[0,4],setnam:4,writer:[4,1],figur:4,start:[0,2,4],than:[2,4],current_imag:4,rlabel:4,dict:4,analyz:4,factor:4,nice_int:4,analys:2,nb_overflow_pixel:4,hope:2,overwritten:4,reset:4,goret:[2,4],contribut:2,variou:[2,3,4],"sol\u00e9":[1,2,4],increm:4,beam:2,simplist:4,multi:[2,1],"_listthead":4,popitem:4,increas:4,next_filenam:4,requir:2,gen_head:4,debian7:3,byteord:2,getfram:[2,4],specif:[2,4],possibl:[2,4],getdim1:4,shape:2,yield:4,"public":2,"default":[4,1],readbyt:4,common:[4,3,1],contain:[2,4],oxd:[2,1],privileg:3,metadata:[2,4],where:[2,3,4],carsten:2,microscopi:2,view:2,unexpectedli:2,conform:4,set:[4,3],sampl:4,proce:4,existsinloop:4,frame:[1,2,4],knowledg:2,respect:4,accord:4,mutabl:4,datatyp:4,p6dec:4,see:[2,4],num:4,powder:4,arg:4,testcas:[2,4],tiff_head:4,dectri:2,cbf:[1,2,4],page:[0,3],estimate_offset_valu:4,http_proxi:3,lut:4,kei:[2,4],correctli:3,strinput:4,mine:2,vari:2,someth:2,label:4,xxximag:2,written:[2,4],"_ival":4,gzipfil:4,between:[2,1],"import":2,oxdimag:[0,4],attribut:2,tifimag:[0,2,4],overflowpix:4,stdeb:3,appreci:[2,4],extend:[2,4],numer:[2,4],binaryimag:[0,4],setdata:4,were:2,list_of_str:4,gethead:4,extens:[2,4],extract_data:4,extract_filenumb:4,start_com:4,ipython:2,classnam:4,comaplin:3,jon:4,thank:2,both:2,toward:1,last:4,easi:2,setdim1:4,rtype:4,howev:2,alon:4,parsehead:4,header_kei:4,decty1:4,etc:[2,4],instanc:[2,4],setbpp:4,collect:[2,4],improv:[2,1],com:3,byt:4,gatan:2,crystallograph:4,simpli:4,hkl:4,file_object:4,point:1,unittest:2,ubuntu:[2,3],pop:4,except:4,acknoledg:2,reciproc:4,getcompressionratio:4,checkout:3,linux:[2,3],getbpp:4,ending2:4,fabioutil:[0,2,4],assum:1,summar:2,quit:4,pck:4,cache_length:4,kccd:2,numpi:[2,3,4],obstacl:2,been:[1,2,3,4],viewer:2,greyscal:4,much:[2,4],skei:4,interpret:[2,4],hierarch:2,basic:[2,4],futur:[0,2,4],popul:4,"ga\u00ebl":4,previous_object:4,sfrm:2,sorensen:4,dim1:[2,4],test_al:3,search:[0,2],sampnum:4,ani:[2,3,4],togeth:2,delhead:4,hdrblk:4,rai:2,present:3,emploi:2,mar3450:2,columnfil:4,getclassnam:4,kappa:1,ndimag:2,hdf5:2,diffract:[2,4],tostr:4,properti:4,sourceforg:3,alter:2,aim:[2,4],hdf:2,"while":2,make_format:4,fil:4,shall:4,error:4,report:2,exist:[2,4],anonym:4,listexclud:4,region:4,loop:4,erik:4,propag:4,xvzf:3,increment:4,tar:3,int32:4,almost:4,frederiksborgvej:4,dataio:4,therefor:2,site:4,sting:4,print_except:4,deczlib:4,oscilla:4,cant:4,kwarg:4,delcapshead:4,getdim:4,ascii:4,sever:2,deconstruct_filenam:4,complet:3,develop:[0,2,3],welcom:[0,2],grant:2,perform:[2,4],alphabet:2,make:[1,2,4],format:[1,2,3,4],header:[1,2,4],pnmimag:[0,4],member:2,python:[0,1,2,3,4],when:[2,3,4],pad:4,edfimag:[0,4,3],savecif:4,hamamatsu:[2,4],eventu:4,readhead:[2,4],neutron:2,convert_data:4,longord:4,tiffio:[0,1,2,4],kwd:4,readbrukerhead:4,optim:4,camera:4,nest:2,assist:2,tiff:[1,2,3,4],someon:2,decompress:4,fabioimag:[0,1,2,4],capabl:[2,4],moment:4,rebin:4,initi:2,mani:[2,3],extern:2,"_data":4,typic:2,nimag:4,"g\u00f6tz":2,"_readhead":[2,4],appropri:2,center:4,choos:4,nevertheless:2,entri:4,p5dec:4,dnsmet:4,itself:[2,4],inherit:[2,4],non:[4,3],matplotlib:2,longint:4,exampl:2,command:3,thi:[2,3,4],dictionnari:4,opendata:4,make_slic:4,micrograph:2,"3dxrd":2,dimension:2,stem:4,mon:2,tag_typ:4,ccolor:4,distanc:4,newest:3,just:[2,3,4],imaged11:[2,4],"true":4,sourcek:4,modular:2,obtain:[4,3],sourcem:4,collabor:2,oxford:[2,4],quartz_0100:2,elapsda:4,behind:[2,3],increasingli:2,read_tag_typ:4,yet:[4,3,1],languag:2,autorng:4,clabel:4,adventur:2,struct:4,expos:2,current_object:4,xsdimg:4,instr:4,had:4,ncount:4,param:4,instrument:2,add:[2,4],uint16:[4,1],convert_data_integ:4,blob:4,dtype:[2,4],getmax:4,input:4,jerom:4,save:[2,4],besid:2,transit:2,float32:4,build:[3,1],bin:4,applic:2,sofist:4,fname:4,raw_8:4,transpar:2,read:[1,2,3,4],smart6500:4,zeroadj:4,adscimag:[0,4],magic:[2,4],sapphir:4,dark:4,test:[0,1,2,3,4],built:[4,3],cell:4,know:2,wide:2,gnu:2,bit:4,characterist:2,acquisit:2,you:[2,3,4],python3:[2,1],mod:4,p3dec:4,insert:4,read_data:4,image_file_directory_entri:4,mydata0001:4,like:[2,3,4],openhead:4,poulsen:2,pyfai:2,signal:4,anyth:2,zoom:4,integ:[2,4],fastreaddata:4,bpp:[2,4],force_typ:4,either:3,"_bkeepcom":4,byteswap:4,popular:2,output:[2,4],per:[2,3,4],capshead:4,concret:4,"function":[2,3,4],encount:3,www:3,gen_overflow:4,preamp:4,often:2,deal:[2,3,4],simplifi:4,acknowledg:2,"_need_a_seek_to_read":2,interact:2,calc_bpp:4,back:4,construct_filenam:4,brukerimag:[0,4],intern:2,armando:[2,4],ncol:4,superclass:4,pythonwar:3,deprec:4,successfulli:2,datio:[0,4],librari:[2,3,4],bruker:[1,2,4],outp:4,fabl:[2,3,4],xsdataimag:4,slice:4,riso:4,im0:2,decbyteoffet_weav:4,avoid:4,normal:4,definit:4,benefit:2,subclass:4,concaten:4,fabiodata:4,esd:2,leav:4,overcom:2,sequenc:[2,4],pattern:4,highli:4,process:2,object:[2,4],run:[2,3,4],fit2d:[2,4],uncompress:4,reach:4,garbag:3,usag:[0,2,4],read_tag_group:4,srcur:2,p2dec:4,cryst:2,who:2,step:4,bpp_to_numpi:4,fileobj:4,offset:[4,1],andi:[2,4],image0:4,decompressor:4,about:[2,3,4],masakatzu:4,would:2,column:4,gplv2:4,gplv3:[2,4],http:[2,3],int64:4,decbyteoffet_cython:4,integr:2,mar345:[1,2,4],estim:4,intent:2,softwar:[2,4],produc:2,block:[4,1],match:4,repair:2,doubl:4,effici:2,"final":2,here:4,marmosa:4,decpck:4,within:2,automat:2,dataset:4,load:[2,4],fall:4,right:[4,3],empti:4,getimag:4,strip:3,wrap:4,chang:[2,4],chiplot:4,next:[2,4],mar165:2,your:[2,3],cbfimag:[0,4],manag:1,octmask:4,iucr:4,p7dec:4,"_strfilenam":4,val:4,few:2,support:[1,2,4],decbzip2:4,transform:4,"long":[4,1],avail:[2,3,4],id11:4,reli:2,dm3:[2,4],interfac:[2,4],includ:[2,4],lot:[4,3],laboratori:4,call:[2,4],hen:4,hipicimag:[0,4],lowbytefirst:2,synchrotron:[2,4],svn:3,fabio:[0,1,2,3,4],interest:4,guess:4,forc:4,some:[1,2,4],enabl:2,jun:2,bother:4,decentr:2,procedur:2,pck1:4,quartz_0270:2,renam:1,line:[2,4],bytes_to_read:4,buf:4,int8:4,conclus:[0,2],info:[2,4],electr:2,npixelb:4,esrfcurr:2,cif:[2,4],temp:4,raw_32:4,whether:4,bugfix:4,update_head:4,smooth:2,displai:2,troubl:2,until:4,exampleimage0001:2,record:2,scipi:2,"case":[2,4],fundament:4,immut:4,otherwis:4,problem:2,diffractomet:4,similar:4,email:4,care:2,connect:3,model:4,featur:2,pil:[1,2,3,4],creat:[2,4],s0021889813000150:2,certain:2,dure:2,parser:4,inp:4,altern:4,repres:4,"char":4,getcapshead:4,readbytestream:[0,4],adsc:[2,4],file:[1,2,3,4],imageview:2,work:[2,4],im101:2,check:[2,3,4],compbyteoffet_numpi:4,fill:[2,4],freeli:2,readi:3,"6th":2,want:4,floor:4,titl:4,user:[2,3,4],excel:2,i811:2,headers_kei:4,proxi:3,valid:4,comppck:4,marccdimag:[0,4],varieti:2,writabl:2,scan:2,tif:[2,4],new_file_series0:4,imag:[1,2,3,4],architectur:2,sethead:4,testimag:2,xxx:2,intend:2,determin:[2,4],plate:2,stringio:4,extra:2,leak:1,azimuth:2,c_def_str:4,lepto:4,openbruk:4,previous_imag:4,intens:2,evan:2,peak:2,consid:4,last_imag:4,getedfblock:4,kieffer:[2,4],debian:[2,3],reduc:2,im1:2,sphinx:1,algorithm:[2,4],scientif:2,directori:[4,3],suit:[0,2,3],confirm:2,mask:[2,4],eol:4,mimic:4,emerg:2,obj:4,nover64:4,far:2,perhap:2,exceptionvalu:4,backward:[2,4],algo:4},objtypes:{"0":"py:module","1":"py:method","2":"py:function","3":"py:staticmethod","4":"py:attribute","5":"py:class"},titles:["Welcome to FabIO’s documentation!","Changelog","Getting Started","Installation","FabIO Package"],objnames:{"0":["py","module","Python module"],"1":["py","method","Python method"],"2":["py","function","Python function"],"3":["py","staticmethod","Python static method"],"4":["py","attribute","Python attribute"],"5":["py","class","Python class"]},filenames:["index","Changelog","getting_started","INSTALL","api/modules"]})fabio-0.1.3/doc/html/.buildinfo0000644000175000017500000000034612233250023017037 0ustar jeromejerome00000000000000# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: 59333a03b9d7fc243eb1812d88ec7e8e tags: fbb0d17656682115ca4d033fb2f83ba1 fabio-0.1.3/doc/html/_sources/0000755000175000017500000000000012233272207016712 5ustar jeromejerome00000000000000fabio-0.1.3/doc/html/_sources/api/0000755000175000017500000000000012233272207017463 5ustar jeromejerome00000000000000fabio-0.1.3/doc/html/_sources/api/modules.txt0000644000175000017500000001064512121354612021677 0ustar jeromejerome00000000000000FabIO Package ============= .. toctree:: :maxdepth: 4 :mod:`fabio` Package -------------------- .. automodule:: fabio.__init__ :members: :undoc-members: :show-inheritance: :mod:`fabio.fabioimage` Module ------------------------------ .. automodule:: fabio.fabioimage :members: :undoc-members: :show-inheritance: :mod:`fabio.fabioutils` Module ------------------------------ .. automodule:: fabio.fabioutils :members: :undoc-members: :show-inheritance: :mod:`fabio.file_series` Module ------------------------------- .. automodule:: fabio.file_series :members: :undoc-members: :show-inheritance: :mod:`fabio.openimage` Module ----------------------------- .. automodule:: fabio.openimage :members: :undoc-members: :show-inheritance: :mod:`fabio.adscimage` Module ----------------------------- .. automodule:: fabio.adscimage :members: :undoc-members: :show-inheritance: :mod:`fabio.binaryimage` Module ------------------------------- .. automodule:: fabio.binaryimage :members: :undoc-members: :show-inheritance: :mod:`fabio.bruker100image` Module ---------------------------------- .. automodule:: fabio.bruker100image :members: :undoc-members: :show-inheritance: :mod:`fabio.brukerimage` Module ------------------------------- .. automodule:: fabio.brukerimage :members: :undoc-members: :show-inheritance: :mod:`fabio.cbfimage` Module ---------------------------- .. automodule:: fabio.cbfimage :members: :undoc-members: :show-inheritance: :mod:`fabio.dm3image` Module ---------------------------- .. automodule:: fabio.dm3image :members: :undoc-members: :show-inheritance: :mod:`fabio.edfimage` Module ---------------------------- .. automodule:: fabio.edfimage :members: :undoc-members: :show-inheritance: :mod:`fabio.fit2dmaskimage` Module ---------------------------------- .. automodule:: fabio.fit2dmaskimage :members: :undoc-members: :show-inheritance: :mod:`fabio.fit2dspreadsheetimage` Module ----------------------------------------- .. automodule:: fabio.fit2dspreadsheetimage :members: :undoc-members: :show-inheritance: :mod:`fabio.GEimage` Module --------------------------- .. automodule:: fabio.GEimage :members: :undoc-members: :show-inheritance: :mod:`fabio.HiPiCimage` Module ------------------------------ .. automodule:: fabio.HiPiCimage :members: :undoc-members: :show-inheritance: :mod:`fabio.kcdimage` Module ---------------------------- .. automodule:: fabio.kcdimage :members: :undoc-members: :show-inheritance: :mod:`fabio.mar345image` Module ------------------------------- .. automodule:: fabio.mar345image :members: :undoc-members: :show-inheritance: :mod:`fabio.marccdimage` Module ------------------------------- .. automodule:: fabio.marccdimage :members: :undoc-members: :show-inheritance: :mod:`fabio.OXDimage` Module ---------------------------- .. automodule:: fabio.OXDimage :members: :undoc-members: :show-inheritance: :mod:`fabio.pilatusimage` Module -------------------------------- .. automodule:: fabio.pilatusimage :members: :undoc-members: :show-inheritance: :mod:`fabio.pnmimage` Module ---------------------------- .. automodule:: fabio.pnmimage :members: :undoc-members: :show-inheritance: :mod:`fabio.tifimage` Module ---------------------------- .. automodule:: fabio.tifimage :members: :undoc-members: :show-inheritance: :mod:`fabio.xsdimage` Module ---------------------------- .. automodule:: fabio.xsdimage :members: :undoc-members: :show-inheritance: :mod:`fabio.compression` Module ------------------------------- .. automodule:: fabio.compression :members: :undoc-members: :show-inheritance: :mod:`fabio.converters` Module ------------------------------ .. automodule:: fabio.converters :members: :undoc-members: :show-inheritance: :mod:`fabio.datIO` Module ------------------------- .. automodule:: fabio.datIO :members: :undoc-members: :show-inheritance: :mod:`fabio.TiffIO` Module -------------------------- .. automodule:: fabio.TiffIO :members: :undoc-members: :show-inheritance: :mod:`fabio.readbytestream` Module ---------------------------------- .. automodule:: fabio.readbytestream :members: :undoc-members: :show-inheritance: fabio-0.1.3/doc/html/_sources/api/fabio.txt0000644000175000017500000000024112121354612021276 0ustar jeromejerome00000000000000FabIO Package ============= :mod:`fabio` Package -------------------- .. automodule:: fabio.__init__ :members: :undoc-members: :show-inheritance: fabio-0.1.3/doc/html/_sources/getting_started.txt0000644000175000017500000003240412121415346022644 0ustar jeromejerome00000000000000Getting Started =============== FabIO is a Python module for reading and handling data from two-dimensional X-ray detectors. FabIO is a Python module written for easy and transparent reading of raw two-dimensional data from various X-ray detectors. The module provides a function for reading any image and returning a fabioimage object which contains both metadata (header information) and the raw data. All fabioimage object offer additional methods to extract information about the image and to open other detector images from the same data series. Introduction ------------ One obstacle when writing software to analyse data collected from a two-dimensional detector is to read the raw data into the program, not least because the data can be stored in many different formats depending on the instrument used. To overcome this problem we decided to develop a general module, FabIO (FABle I/O), to handle reading and writing of two-dimensional data. The code-base was initiated by merging parts of our fabian imageviewer and ImageD11 peak-search programs and has been developed since 2007 as part of the TotalCryst program suite for analysis of 3DXRD microscopy data. During integration into a range of scientific programs like the FABLE graphical interface, EDNA and the fast azimuthal integration library, pyFAI; FabIO has gained several features like handling multi-frame image formats as well as writing many of the file formats. FabIO Python module ------------------- Python is a scripting language that is very popular among scientists and which also allows well structured applications and libraries to be developed. Philosophy .......... The intention behind this development was to create a Python module which would enable easy reading of 2D data images, from any detector without having to worry about the file format. Therefore FabIO just needs a file name to open a file and it determines the file format automatically and deals with gzip and bzip2 compression transparently. Opening a file returns an object which stores the image in memory as a 2D NumPy array and the metadata, called header, in a Python dictionary. Beside the data and header attributes, some methods are provided for reading the previous or next image in a series of images as well as jumping to a specific file number. For the user, these auxiliary methods are intended to be independent of the image format (as far as is reasonably possible). FabIO is written in an object-oriented style (with classes) but aims at being used in a scripting environment: special care has been taken to ensure the library remains easy to use. Therefore no knowledge of object-oriented programming is required to get full benefits of the library. As the development is done in a collaborative and decentralized way; a comprehensive test suite has been added to reduce the number of regressions when new features are added or old problems are repaired. The software is very modular and allows new classes to be added for handling other data formats easily. FabIO and its source-code are freely available to everyone on-line, licensed under the GNU General Public License version 3 (GPLv3). FabIO is also available directly from popular Linux distributions like Debian and Ubuntu. Implementation .............. The main language used in the development of FabIO is Python; however, some image formats are compressed and require compression algorithms for reading and writing data. When such algorithms could not be implemented efficiently using Python or NumPy native modules were developed, in i.e. standard C code callable from Python (sometimes generated using Cython). This code has to be compiled for each computer architecture and offers excellent performance. FabIO is only dependent on the NumPy module and has extra features if two other optional Python modules are available. For reading XML files (that are used in EDNA) the Lxml module is required and the Python Image Library, PIL is needed for producing a PIL image for displaying the image in graphical user interfaces and several image-processing operations that are not re-implemented in FabIO. A variety of useful image processing is also available in the scipy.ndimage module and in scikits-image. Images can also be displayed in a convenient interactive manner using matplotlib and an IPython shell , which is mainly used for developing data analysis algorithms. Reading and writing procedure of the various TIFF formats is based on the TiffIO code from PyMCA. In the Python shell, the `fabio` module must be imported prior to reading an image in one of the supported file formats (see Table `Supported formats`, hereafter). The `fabio.open` function creates an instance of the Python class `fabioimage`, from the name of a file. This instance, named `img` hereafter, stores the image data in `img.data` as a 2D NumPy array. Often the image file contains more information than just the intensities of the pixels, e.g. information about how the image is stored and the instrument parameters at the time of the image acquisition, these metadata are usually stored in the file header. Header information, are available in `img.header` as a Python dictionary where keys are strings and values are usually strings or numeric values. Information in the header about the binary part of the image (compression, endianness, shape) are interpreted however, other metadata are exposed as they are recorded in the file. FabIO allows the user to modify and, where possible, to save this information (the table `Supported formats` summarizes writable formats). Automatic translation between file-formats, even if desirable, is sometimes impossible because not all format have the capability to be extended with additional metadata. Nevertheless FabIO is capable of converting one image data-format into another by taking care of the numerical specifics: for example float arrays are converted to integer arrays if the output format only accepts integers. FabIO methods ............. One strength of the implementation in an object oriented language is the possibility to combine functions (or methods) together with data appropriate for specific formats. In addition to the header information and image data, every `fabioimage` instance (returned by `fabio.open`) has methods inherited from `fabioimage` which provide information about the image minimum, maximum and mean values. In addition there are methods which return the file number, name etc. Some of the most important methods are specific for certain formats because the methods are related to how frames in a sequence are handled; these methods are `img.next()`, `img.previous()`, and `img.getframe(n)`. The behaviour of such methods varies depending on the image format: for single-frame format (like mar345), `img.next()` will return the image in next file; for multi-frame format (like GE), `img.next()` will return the next frame within the same file. For formats which are possibly multi-framed like EDF, the behaviour depends on the actual number of frames per file (accessible via the `img.nframes` attribute). Usage ----- Examples ........ In this section we have collected some basic examples of how FabIO can be employed. Opening an image: :: import fabio im100 = fabio.open('Quartz_0100.tif') # Open image file print(im0.data[1024,1024]) # Check a pixel value im101 = im100.next() # Open next image im270 = im1.getframe(270) # Jump to file number 270: Quartz_0270.tif Normalising the intensity to a value in the header: :: img = fabio.open('exampleimage0001.edf') print(img.header) {'ByteOrder': 'LowByteFirst', 'DATE (scan begin)': 'Mon Jun 28 21:22:16 2010', 'ESRFCurrent': '198.099', ... } # Normalise to beam current and save data srcur = float(img.header['ESRFCurrent']) img.data *= 200.0/srcur img.write('normed_0001.edf') Interactive viewing with matplotlib: :: from matplotlib import pyplot # Load matplotlib pyplot.imshow(img.data) # Display as an image pyplot.show() # Show GUI window Future and perspectives ----------------------- The Hierarchical Data Format version 5 (`hdf5`) is a data format which is increasingly popular for storage of X-ray and neutron data. To name a few facilities the synchrotron Soleil and the neutron sources ISIS, SNS and SINQ already use HDF extensively through the NeXus format. For now, mainly processed or curated data are stored in this format but new detectors are rumoured to provide native output in HDF5. FabIO will rely on H5Py, which already provides a good HDF5 binding for Python, as an external dependency, to be able to read and write such HDF5 files. In the near future FabIO will be upgraded to work with Python3 (a new version of Python); this change of version will affect some internals FabIO as string and file handling have been altered. This change is already ongoing as many parts of native code in C have already been translated into Cython to smoothe the transition, since Cython generates code compatible with Python3. This also makes it easier to retain backwards compatibility with the earlier Python versions. Conclusion ---------- FabIO gives an easy way to read and write 2D images when using the Python computer language. It was originally developed for X-ray diffraction data but now gives an easy way for scientists to access and manipulate their data from a wide range of 2D X-ray detectors. We welcome contributions to further improve the code and hope to add more file formats in the future as well as port the existing code base to the emerging Python3. Acknoledgements ............... We acknowledge Andy Götz and Kenneth Evans for extensive testing when including the FabIO reader in the Fable image viewer (Götz et al., 2007).We also thank V. Armando Solé for assistance with his TiffIO reader and Carsten Gundlach for deployment of FabIO at the beamlines i711 and i811, MAX IV, and providing bug reports. We finally acknowledge our colleagues who have reported bugs and helped to improve FabIO. Financial support was granted by the EU 6th Framework NEST/ADVENTURE project TotalCryst (Poulsen et al., 2006). Citation ........ Knudsen, E. B., Sørensen, H. O., Wright, J. P., Goret, G. & Kieffer, J. (2013). J. Appl. Cryst. 46, 537-539. http://dx.doi.org/10.1107/S0021889813000150 List of file formats that FabIO can read and write .................................................. In alphabetical order. The listed filename extensions are typical examples. FabIO tries to deduce the actual format from the file itself and only uses extensions as a fallback if that fails. .. csv-table:: Supported formats :header: "Python Module", "Detector / Format", "Extension", "Read", "Multi-image", "Write" :widths: 30, 30, 20, 10, 15, 10 "ADSC", "ADSC Quantum", ".img ", "Yes", "No", "Yes" "Bruker", "Bruker formats", ".sfrm ", "Yes", "No", "Yes" "DM3", "Gatan Digital Micrograph ", ".dm3 ", "Yes", "No", "No" "EDF", "ESRF data format ", ".edf ", "Yes", "Yes ", "Yes" "EDNA-XML", "Used by EDNA", ".xml ", "Yes", "No", "No" "CBF", "CIF binary files", ".cbf ", "Yes", "No", "Yes" "kcd", "Nonius KappaCCD", ".kccd ", "Yes", "No", "No" "fit2d mask", "Used by Fit2D", ".msk ", "Yes", "No", "Yes" "fit2d spreadsheet", "Used by Fit2D", ".spr ", "Yes", "No", "Yes" "GE", "General Electric", "No", "Yes", "Yes ", "No" "HiPiC", "Hamamatsu CCD", ".tif ", "Yes", "No", "No" "marccd", "MarCCD/Mar165", ".mccd ", "Yes", "No", "Yes" "mar345", "Mar345 image plate", ".mar3450 ", "Yes", "No", "Yes" "OXD", "Oxford Diffraction", ".img ", "Yes", "No", "Yes" "pilatus", "Dectris Pilatus Tiff", ".tif ", "Yes", "No", "Yes" "PNM", "Portable aNy Map", ".pnm ", "Yes", "No", "No" "TIFF", "Tagged Image File Format", ".tif ", "Yes", "No", "Yes" Adding new file formats ....................... We hope it will be relatively easy to add new file formats to fabio in the future. The basic idea is the following: 1. inherit from fabioimage overriding the methods _readheader, read and optionally write. Name your new module XXXimage where XXX means something (eg tifimage). 2. readheader fills in a dictionary of "name":"value" pairs in self.header. No one expects to find anything much in there. 3. read fills in self.data with a numpy array holding the image. Some redundant info which also appears are self.dim1 and self.dim2: the image dimensions, self.bpp is the bytes per pixel and self.bytecode is the numpy.dtype.type of the data. 4. The member variables "_need_a_seek_to_read" and "_need_a_real_file" are there in case you have trouble with the transparent handling of bz2 and gz files. 5. Register the file type (extension naming) in fabioutils.py:FILETYPES 6. Add your new module as an import into fabio.openimage 7. Fill out the magic numbers for your format in fabio.openimage if you know them (the characteristic first few bytes in the file) 8. Upload a testimage to the file release system and create a unittest testcase which opens an example of your new format, confirming the image has actually been read in successfully (eg check the mean, max, min and esd are all correct, perhaps orientation too) 9. Run pylint on your code and then please go clean it up. Have a go at mine while you are at it. 10. Bask in the warm glow of appreciation when someone unexpectedly learns they don't need to convert their data into another format fabio-0.1.3/doc/html/_sources/index.txt0000644000175000017500000000073612121413504020561 0ustar jeromejerome00000000000000.. FabIO documentation master file, created by sphinx-quickstart on Fri Mar 15 09:03:50 2013. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to FabIO's documentation! ================================= Contents: .. toctree:: :maxdepth: 2 getting_started INSTALL Changelog api/modules Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` fabio-0.1.3/doc/html/_sources/Changelog.txt0000644000175000017500000000400512233242527021343 0ustar jeromejerome00000000000000Changelog ========= From FabIO-0.1.2 to FabIO-0.1.3: ................................ - Fixed a memory-leak in mar345 module - Improved support for bruker format (writer & reader) - Fixed a bug in EDF headers (very long headers) - Provide template for new file-formats - Fix a bug related to PIL in new MacOSX - Allow binary-images to be read from end From FabIO-0.1.1 to FabIO-0.1.2: ................................ - Fixed a bug in fabioimage.write (impacted all writers) - added Sphinx documentation "python setup.py build_doc" - PyLint compliance of some classes (rename, ...) - tests from installer with "python setup.py build test" From FabIO-0.1.0 to FabIO-0.1.1: ................................ - Merged Mar345 image reader and writer with cython bindings (towards python3 compliance) - Improve CBF image writing under windows - Bz2, Gzip and Flat files are managed through a common way ... classes are more (python v2.5) or less (python v2.7) overloaded - Fast EDF reading if one assumes offsets are the same between files, same for ROIs From FabIO-0.0.8 to FabIO-0.1.0: ................................ - OXD reader improved and writer implemented - Mar345 reader improved and writer implemented - CBF writer implemented - Clean-up of the code & bug fixes - Move towards python3 - Make PIL optional dependency Python3 is not yet tested but some blocking points have been identified and some fixed. From FabIO-0.0.7 to FabIO-0.0.8: ................................ - Support for Tiff using TiffIO module from V.A.Solé - Clean-up of the code & bug fixes From FabIO-0.0.6 to FabIO-0.0.7: ................................ - Support for multi-frames EDF files - Support for XML images/2D arrays used in EDNA - new method: fabio.open(filename) that is an alias for fabio.openimage.openimage(filename) From FabIO-0.0.4 to FabIO-0.0.6: ................................ - Support for CBF files from Pilatus detectors - Support for KCD files from Nonius Kappa CCD images - write EDF with their native data type (instead of uint16 by default) fabio-0.1.3/doc/html/_sources/INSTALL.txt0000644000175000017500000000720312233247462020570 0ustar jeromejerome00000000000000Installation ============ FabIO can, as any Python module, be installed from its sources, available on sourceforge but we advice to use binary packages provided for the most common platforms on sourceforge: Windows, MacOSX and Linux. Moreover FabIO is part of the common Linux distributions Ubuntu (since 11.10) and Debian7 where the package is named python-fabio and can be installed via: :: # apt-get install python-fabio If you are using MS Windows or MacOSX; binary version have been packaged. Windows installers are executable, just download the one corresponding to you python version and run it. MacOSX builds are zipped: unzip them at the right place. Dependencies ------------ * Python 2.5 or later (python 3.x is not yet ready) * numpy - http://www.numpy.org For full functionality of Fabio the following modules need to be installed: * PIL (python imaging library) - http://www.pythonware.com * lxml (library for reading XSDimages) Installation from sources ------------------------- FabIO can be downloaded from the fable download page on sourceforge.net. Presently the source code has been distributed as a zip package and a compressed tarball. Download either one and unpack it. :: http://sourceforge.net/projects/fable/files/fabio/ e.g. :: tar xvzf fabio-0.1.3.tar.gz or :: unzip fabio-0.1.3.zip all files are unpacked into the directory fabio-0.1.3. To install these do :: cd fabio-0.1.3 and install fabio with :: python setup.py build sudo python setup.py install most likely you will need to gain root privileges (with sudo in front of the command) to install the built package. Development versions -------------------- The newest development version can be obtained by checking it out from the subversion (SVN) repository: :: svn checkout https://svn.sourceforge.net/svnroot/fable/fabio/trunk fabio cd fabio python setup.py build sudo python setup.py install For Ubuntu/Debian users, you will need: * python-imaging * python-imaging-tk * python-numpy * python-dev :: sudo apt-get install python-imaging python-imaging-tk python-numpy We provide also a debian-package builder based on stdeb: :: sudo apt-get install python-stdeb ./build-deb.sh which builds a debian package and installs it in a single command. Handy for testing. Test suite ---------- FabIO has a comprehensive test-suite to ensure non regression (about 100 tests). When you run the test for the first time, many test images will be download and converted into various compressed format like gzip and bzip2 (this takes a lot of time). Be sure you have an internet connection (and your environment variable http_proxy is correctly set-up, if you are behind a proxy). :: python setup.py build cd test python test_all.py ........................................WARNING:compression:Encounter the python-gzip bug with trailing garbage, trying subprocess gzip ..............................WARNING:edfimage:Non complete datablock: got 6928, expected 8388608 WARNING:edfimage:Non complete datablock: got 6928, expected 8388608 WARNING:edfimage:Non complete datablock: got 6928, expected 8388608 .....................WARNING:edfimage:Unknown compression scheme TY1 .....WARNING:edfimage:Unknown compression scheme FALSE ...WARNING: Non standard TIFF. Rows per strip TAG missing WARNING: Non standard TIFF. Strip byte counts TAG missing .... ---------------------------------------------------------------------- Ran 103 tests in 21.696s OK Many tests are there to deal with malformed files, don't worry if the programs comaplins in warnings about "bad files", it is done on purpose. fabio-0.1.3/doc/html/INSTALL.html0000644000175000017500000002270312233250021017056 0ustar jeromejerome00000000000000 Installation — FabIO 0.1.3 documentation

        Installation¶

        FabIO can, as any Python module, be installed from its sources, available on sourceforge but we advice to use binary packages provided for the most common platforms on sourceforge: Windows, MacOSX and Linux. Moreover FabIO is part of the common Linux distributions Ubuntu (since 11.10) and Debian7 where the package is named python-fabio and can be installed via:

        # apt-get install python-fabio
        

        If you are using MS Windows or MacOSX; binary version have been packaged. Windows installers are executable, just download the one corresponding to you python version and run it. MacOSX builds are zipped: unzip them at the right place.

        Dependencies¶

        For full functionality of Fabio the following modules need to be installed:

        Installation from sources¶

        FabIO can be downloaded from the fable download page on sourceforge.net. Presently the source code has been distributed as a zip package and a compressed tarball. Download either one and unpack it.

        http://sourceforge.net/projects/fable/files/fabio/

        e.g.

        tar xvzf fabio-0.1.3.tar.gz

        or

        unzip fabio-0.1.3.zip

        all files are unpacked into the directory fabio-0.1.3. To install these do

        cd fabio-0.1.3

        and install fabio with

        python setup.py build
        sudo python setup.py install

        most likely you will need to gain root privileges (with sudo in front of the command) to install the built package.

        Development versions¶

        The newest development version can be obtained by checking it out from the subversion (SVN) repository:

        svn checkout https://svn.sourceforge.net/svnroot/fable/fabio/trunk fabio
        cd fabio
        python setup.py build
        sudo python setup.py install

        For Ubuntu/Debian users, you will need:

        • python-imaging
        • python-imaging-tk
        • python-numpy
        • python-dev
        sudo apt-get install python-imaging python-imaging-tk python-numpy

        We provide also a debian-package builder based on stdeb:

        sudo apt-get install python-stdeb
        ./build-deb.sh

        which builds a debian package and installs it in a single command. Handy for testing.

        Test suite¶

        FabIO has a comprehensive test-suite to ensure non regression (about 100 tests). When you run the test for the first time, many test images will be download and converted into various compressed format like gzip and bzip2 (this takes a lot of time). Be sure you have an internet connection (and your environment variable http_proxy is correctly set-up, if you are behind a proxy).

        python setup.py build
        cd test
        python test_all.py
        ........................................WARNING:compression:Encounter the python-gzip bug with trailing garbage, trying subprocess gzip
        ..............................WARNING:edfimage:Non complete datablock: got 6928, expected 8388608
        WARNING:edfimage:Non complete datablock: got 6928, expected 8388608
        WARNING:edfimage:Non complete datablock: got 6928, expected 8388608
        .....................WARNING:edfimage:Unknown compression scheme TY1
        .....WARNING:edfimage:Unknown compression scheme FALSE
        ...WARNING: Non standard TIFF. Rows per strip TAG missing
        WARNING: Non standard TIFF. Strip byte counts TAG missing
        ....
        ----------------------------------------------------------------------
        Ran 103 tests in 21.696s
        OK

        Many tests are there to deal with malformed files, don’t worry if the programs comaplins in warnings about “bad files”, it is done on purpose.

        Table Of Contents

        Previous topic

        Getting Started

        Next topic

        Changelog

        This Page

        fabio-0.1.3/doc/html/py-modindex.html0000644000175000017500000002253012233250023020205 0ustar jeromejerome00000000000000 Python Module Index — FabIO 0.1.3 documentation
        fabio-0.1.3/doc/source/0000755000175000017500000000000012233272207015424 5ustar jeromejerome00000000000000fabio-0.1.3/doc/source/api/0000755000175000017500000000000012233272207016175 5ustar jeromejerome00000000000000fabio-0.1.3/doc/source/api/modules.rst0000644000175000017500000001064512121354612020402 0ustar jeromejerome00000000000000FabIO Package ============= .. toctree:: :maxdepth: 4 :mod:`fabio` Package -------------------- .. automodule:: fabio.__init__ :members: :undoc-members: :show-inheritance: :mod:`fabio.fabioimage` Module ------------------------------ .. automodule:: fabio.fabioimage :members: :undoc-members: :show-inheritance: :mod:`fabio.fabioutils` Module ------------------------------ .. automodule:: fabio.fabioutils :members: :undoc-members: :show-inheritance: :mod:`fabio.file_series` Module ------------------------------- .. automodule:: fabio.file_series :members: :undoc-members: :show-inheritance: :mod:`fabio.openimage` Module ----------------------------- .. automodule:: fabio.openimage :members: :undoc-members: :show-inheritance: :mod:`fabio.adscimage` Module ----------------------------- .. automodule:: fabio.adscimage :members: :undoc-members: :show-inheritance: :mod:`fabio.binaryimage` Module ------------------------------- .. automodule:: fabio.binaryimage :members: :undoc-members: :show-inheritance: :mod:`fabio.bruker100image` Module ---------------------------------- .. automodule:: fabio.bruker100image :members: :undoc-members: :show-inheritance: :mod:`fabio.brukerimage` Module ------------------------------- .. automodule:: fabio.brukerimage :members: :undoc-members: :show-inheritance: :mod:`fabio.cbfimage` Module ---------------------------- .. automodule:: fabio.cbfimage :members: :undoc-members: :show-inheritance: :mod:`fabio.dm3image` Module ---------------------------- .. automodule:: fabio.dm3image :members: :undoc-members: :show-inheritance: :mod:`fabio.edfimage` Module ---------------------------- .. automodule:: fabio.edfimage :members: :undoc-members: :show-inheritance: :mod:`fabio.fit2dmaskimage` Module ---------------------------------- .. automodule:: fabio.fit2dmaskimage :members: :undoc-members: :show-inheritance: :mod:`fabio.fit2dspreadsheetimage` Module ----------------------------------------- .. automodule:: fabio.fit2dspreadsheetimage :members: :undoc-members: :show-inheritance: :mod:`fabio.GEimage` Module --------------------------- .. automodule:: fabio.GEimage :members: :undoc-members: :show-inheritance: :mod:`fabio.HiPiCimage` Module ------------------------------ .. automodule:: fabio.HiPiCimage :members: :undoc-members: :show-inheritance: :mod:`fabio.kcdimage` Module ---------------------------- .. automodule:: fabio.kcdimage :members: :undoc-members: :show-inheritance: :mod:`fabio.mar345image` Module ------------------------------- .. automodule:: fabio.mar345image :members: :undoc-members: :show-inheritance: :mod:`fabio.marccdimage` Module ------------------------------- .. automodule:: fabio.marccdimage :members: :undoc-members: :show-inheritance: :mod:`fabio.OXDimage` Module ---------------------------- .. automodule:: fabio.OXDimage :members: :undoc-members: :show-inheritance: :mod:`fabio.pilatusimage` Module -------------------------------- .. automodule:: fabio.pilatusimage :members: :undoc-members: :show-inheritance: :mod:`fabio.pnmimage` Module ---------------------------- .. automodule:: fabio.pnmimage :members: :undoc-members: :show-inheritance: :mod:`fabio.tifimage` Module ---------------------------- .. automodule:: fabio.tifimage :members: :undoc-members: :show-inheritance: :mod:`fabio.xsdimage` Module ---------------------------- .. automodule:: fabio.xsdimage :members: :undoc-members: :show-inheritance: :mod:`fabio.compression` Module ------------------------------- .. automodule:: fabio.compression :members: :undoc-members: :show-inheritance: :mod:`fabio.converters` Module ------------------------------ .. automodule:: fabio.converters :members: :undoc-members: :show-inheritance: :mod:`fabio.datIO` Module ------------------------- .. automodule:: fabio.datIO :members: :undoc-members: :show-inheritance: :mod:`fabio.TiffIO` Module -------------------------- .. automodule:: fabio.TiffIO :members: :undoc-members: :show-inheritance: :mod:`fabio.readbytestream` Module ---------------------------------- .. automodule:: fabio.readbytestream :members: :undoc-members: :show-inheritance: fabio-0.1.3/doc/source/getting_started.rst0000644000175000017500000003240412121415346021347 0ustar jeromejerome00000000000000Getting Started =============== FabIO is a Python module for reading and handling data from two-dimensional X-ray detectors. FabIO is a Python module written for easy and transparent reading of raw two-dimensional data from various X-ray detectors. The module provides a function for reading any image and returning a fabioimage object which contains both metadata (header information) and the raw data. All fabioimage object offer additional methods to extract information about the image and to open other detector images from the same data series. Introduction ------------ One obstacle when writing software to analyse data collected from a two-dimensional detector is to read the raw data into the program, not least because the data can be stored in many different formats depending on the instrument used. To overcome this problem we decided to develop a general module, FabIO (FABle I/O), to handle reading and writing of two-dimensional data. The code-base was initiated by merging parts of our fabian imageviewer and ImageD11 peak-search programs and has been developed since 2007 as part of the TotalCryst program suite for analysis of 3DXRD microscopy data. During integration into a range of scientific programs like the FABLE graphical interface, EDNA and the fast azimuthal integration library, pyFAI; FabIO has gained several features like handling multi-frame image formats as well as writing many of the file formats. FabIO Python module ------------------- Python is a scripting language that is very popular among scientists and which also allows well structured applications and libraries to be developed. Philosophy .......... The intention behind this development was to create a Python module which would enable easy reading of 2D data images, from any detector without having to worry about the file format. Therefore FabIO just needs a file name to open a file and it determines the file format automatically and deals with gzip and bzip2 compression transparently. Opening a file returns an object which stores the image in memory as a 2D NumPy array and the metadata, called header, in a Python dictionary. Beside the data and header attributes, some methods are provided for reading the previous or next image in a series of images as well as jumping to a specific file number. For the user, these auxiliary methods are intended to be independent of the image format (as far as is reasonably possible). FabIO is written in an object-oriented style (with classes) but aims at being used in a scripting environment: special care has been taken to ensure the library remains easy to use. Therefore no knowledge of object-oriented programming is required to get full benefits of the library. As the development is done in a collaborative and decentralized way; a comprehensive test suite has been added to reduce the number of regressions when new features are added or old problems are repaired. The software is very modular and allows new classes to be added for handling other data formats easily. FabIO and its source-code are freely available to everyone on-line, licensed under the GNU General Public License version 3 (GPLv3). FabIO is also available directly from popular Linux distributions like Debian and Ubuntu. Implementation .............. The main language used in the development of FabIO is Python; however, some image formats are compressed and require compression algorithms for reading and writing data. When such algorithms could not be implemented efficiently using Python or NumPy native modules were developed, in i.e. standard C code callable from Python (sometimes generated using Cython). This code has to be compiled for each computer architecture and offers excellent performance. FabIO is only dependent on the NumPy module and has extra features if two other optional Python modules are available. For reading XML files (that are used in EDNA) the Lxml module is required and the Python Image Library, PIL is needed for producing a PIL image for displaying the image in graphical user interfaces and several image-processing operations that are not re-implemented in FabIO. A variety of useful image processing is also available in the scipy.ndimage module and in scikits-image. Images can also be displayed in a convenient interactive manner using matplotlib and an IPython shell , which is mainly used for developing data analysis algorithms. Reading and writing procedure of the various TIFF formats is based on the TiffIO code from PyMCA. In the Python shell, the `fabio` module must be imported prior to reading an image in one of the supported file formats (see Table `Supported formats`, hereafter). The `fabio.open` function creates an instance of the Python class `fabioimage`, from the name of a file. This instance, named `img` hereafter, stores the image data in `img.data` as a 2D NumPy array. Often the image file contains more information than just the intensities of the pixels, e.g. information about how the image is stored and the instrument parameters at the time of the image acquisition, these metadata are usually stored in the file header. Header information, are available in `img.header` as a Python dictionary where keys are strings and values are usually strings or numeric values. Information in the header about the binary part of the image (compression, endianness, shape) are interpreted however, other metadata are exposed as they are recorded in the file. FabIO allows the user to modify and, where possible, to save this information (the table `Supported formats` summarizes writable formats). Automatic translation between file-formats, even if desirable, is sometimes impossible because not all format have the capability to be extended with additional metadata. Nevertheless FabIO is capable of converting one image data-format into another by taking care of the numerical specifics: for example float arrays are converted to integer arrays if the output format only accepts integers. FabIO methods ............. One strength of the implementation in an object oriented language is the possibility to combine functions (or methods) together with data appropriate for specific formats. In addition to the header information and image data, every `fabioimage` instance (returned by `fabio.open`) has methods inherited from `fabioimage` which provide information about the image minimum, maximum and mean values. In addition there are methods which return the file number, name etc. Some of the most important methods are specific for certain formats because the methods are related to how frames in a sequence are handled; these methods are `img.next()`, `img.previous()`, and `img.getframe(n)`. The behaviour of such methods varies depending on the image format: for single-frame format (like mar345), `img.next()` will return the image in next file; for multi-frame format (like GE), `img.next()` will return the next frame within the same file. For formats which are possibly multi-framed like EDF, the behaviour depends on the actual number of frames per file (accessible via the `img.nframes` attribute). Usage ----- Examples ........ In this section we have collected some basic examples of how FabIO can be employed. Opening an image: :: import fabio im100 = fabio.open('Quartz_0100.tif') # Open image file print(im0.data[1024,1024]) # Check a pixel value im101 = im100.next() # Open next image im270 = im1.getframe(270) # Jump to file number 270: Quartz_0270.tif Normalising the intensity to a value in the header: :: img = fabio.open('exampleimage0001.edf') print(img.header) {'ByteOrder': 'LowByteFirst', 'DATE (scan begin)': 'Mon Jun 28 21:22:16 2010', 'ESRFCurrent': '198.099', ... } # Normalise to beam current and save data srcur = float(img.header['ESRFCurrent']) img.data *= 200.0/srcur img.write('normed_0001.edf') Interactive viewing with matplotlib: :: from matplotlib import pyplot # Load matplotlib pyplot.imshow(img.data) # Display as an image pyplot.show() # Show GUI window Future and perspectives ----------------------- The Hierarchical Data Format version 5 (`hdf5`) is a data format which is increasingly popular for storage of X-ray and neutron data. To name a few facilities the synchrotron Soleil and the neutron sources ISIS, SNS and SINQ already use HDF extensively through the NeXus format. For now, mainly processed or curated data are stored in this format but new detectors are rumoured to provide native output in HDF5. FabIO will rely on H5Py, which already provides a good HDF5 binding for Python, as an external dependency, to be able to read and write such HDF5 files. In the near future FabIO will be upgraded to work with Python3 (a new version of Python); this change of version will affect some internals FabIO as string and file handling have been altered. This change is already ongoing as many parts of native code in C have already been translated into Cython to smoothe the transition, since Cython generates code compatible with Python3. This also makes it easier to retain backwards compatibility with the earlier Python versions. Conclusion ---------- FabIO gives an easy way to read and write 2D images when using the Python computer language. It was originally developed for X-ray diffraction data but now gives an easy way for scientists to access and manipulate their data from a wide range of 2D X-ray detectors. We welcome contributions to further improve the code and hope to add more file formats in the future as well as port the existing code base to the emerging Python3. Acknoledgements ............... We acknowledge Andy Götz and Kenneth Evans for extensive testing when including the FabIO reader in the Fable image viewer (Götz et al., 2007).We also thank V. Armando Solé for assistance with his TiffIO reader and Carsten Gundlach for deployment of FabIO at the beamlines i711 and i811, MAX IV, and providing bug reports. We finally acknowledge our colleagues who have reported bugs and helped to improve FabIO. Financial support was granted by the EU 6th Framework NEST/ADVENTURE project TotalCryst (Poulsen et al., 2006). Citation ........ Knudsen, E. B., Sørensen, H. O., Wright, J. P., Goret, G. & Kieffer, J. (2013). J. Appl. Cryst. 46, 537-539. http://dx.doi.org/10.1107/S0021889813000150 List of file formats that FabIO can read and write .................................................. In alphabetical order. The listed filename extensions are typical examples. FabIO tries to deduce the actual format from the file itself and only uses extensions as a fallback if that fails. .. csv-table:: Supported formats :header: "Python Module", "Detector / Format", "Extension", "Read", "Multi-image", "Write" :widths: 30, 30, 20, 10, 15, 10 "ADSC", "ADSC Quantum", ".img ", "Yes", "No", "Yes" "Bruker", "Bruker formats", ".sfrm ", "Yes", "No", "Yes" "DM3", "Gatan Digital Micrograph ", ".dm3 ", "Yes", "No", "No" "EDF", "ESRF data format ", ".edf ", "Yes", "Yes ", "Yes" "EDNA-XML", "Used by EDNA", ".xml ", "Yes", "No", "No" "CBF", "CIF binary files", ".cbf ", "Yes", "No", "Yes" "kcd", "Nonius KappaCCD", ".kccd ", "Yes", "No", "No" "fit2d mask", "Used by Fit2D", ".msk ", "Yes", "No", "Yes" "fit2d spreadsheet", "Used by Fit2D", ".spr ", "Yes", "No", "Yes" "GE", "General Electric", "No", "Yes", "Yes ", "No" "HiPiC", "Hamamatsu CCD", ".tif ", "Yes", "No", "No" "marccd", "MarCCD/Mar165", ".mccd ", "Yes", "No", "Yes" "mar345", "Mar345 image plate", ".mar3450 ", "Yes", "No", "Yes" "OXD", "Oxford Diffraction", ".img ", "Yes", "No", "Yes" "pilatus", "Dectris Pilatus Tiff", ".tif ", "Yes", "No", "Yes" "PNM", "Portable aNy Map", ".pnm ", "Yes", "No", "No" "TIFF", "Tagged Image File Format", ".tif ", "Yes", "No", "Yes" Adding new file formats ....................... We hope it will be relatively easy to add new file formats to fabio in the future. The basic idea is the following: 1. inherit from fabioimage overriding the methods _readheader, read and optionally write. Name your new module XXXimage where XXX means something (eg tifimage). 2. readheader fills in a dictionary of "name":"value" pairs in self.header. No one expects to find anything much in there. 3. read fills in self.data with a numpy array holding the image. Some redundant info which also appears are self.dim1 and self.dim2: the image dimensions, self.bpp is the bytes per pixel and self.bytecode is the numpy.dtype.type of the data. 4. The member variables "_need_a_seek_to_read" and "_need_a_real_file" are there in case you have trouble with the transparent handling of bz2 and gz files. 5. Register the file type (extension naming) in fabioutils.py:FILETYPES 6. Add your new module as an import into fabio.openimage 7. Fill out the magic numbers for your format in fabio.openimage if you know them (the characteristic first few bytes in the file) 8. Upload a testimage to the file release system and create a unittest testcase which opens an example of your new format, confirming the image has actually been read in successfully (eg check the mean, max, min and esd are all correct, perhaps orientation too) 9. Run pylint on your code and then please go clean it up. Have a go at mine while you are at it. 10. Bask in the warm glow of appreciation when someone unexpectedly learns they don't need to convert their data into another format fabio-0.1.3/doc/source/_static/0000755000175000017500000000000012233272207017052 5ustar jeromejerome00000000000000fabio-0.1.3/doc/source/_static/placeholder0000644000175000017500000000006612121417527021263 0ustar jeromejerome00000000000000#This empty file is there to keep the directory in Gitfabio-0.1.3/doc/source/conf.py0000644000175000017500000001714712233242132016727 0ustar jeromejerome00000000000000# -*- coding: utf-8 -*- # # FabIO documentation build configuration file, created by # sphinx-quickstart on Fri Mar 15 09:03:50 2013. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.viewcode', "sphinx.ext.pngmath"] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'FabIO' copyright = u'2006-2013, Henning Sorensen, Erik Knudsen, Jon Wright, Gael Goret and Jerome Kieffer' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '0.1.3' # The full version, including alpha/beta/rc tags. release = '0.1.3' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'FabIOdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'FabIO.tex', u'FabIO Documentation', u'H. Sorensen, E. Knudsen, J. Wright, G. Goret and J. Kieffer', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'fabio', u'FabIO Documentation', [u'Henning Sorensen, Erik Knudsen, Jon Wright, Gael Goret and Jerome Kieffer'], 1) ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # still use the epydoc markup for now import re re_field = re.compile('@(param|type|rtype|return)') def fix_docstring(app, what, name, obj, options, lines): for i in xrange(len(lines)): lines[i] = re_field.sub(r':\1', lines[i]) def setup(app): app.connect('autodoc-process-docstring', fix_docstring) fabio-0.1.3/doc/source/Changelog.rst0000644000175000017500000000400512233242527020046 0ustar jeromejerome00000000000000Changelog ========= From FabIO-0.1.2 to FabIO-0.1.3: ................................ - Fixed a memory-leak in mar345 module - Improved support for bruker format (writer & reader) - Fixed a bug in EDF headers (very long headers) - Provide template for new file-formats - Fix a bug related to PIL in new MacOSX - Allow binary-images to be read from end From FabIO-0.1.1 to FabIO-0.1.2: ................................ - Fixed a bug in fabioimage.write (impacted all writers) - added Sphinx documentation "python setup.py build_doc" - PyLint compliance of some classes (rename, ...) - tests from installer with "python setup.py build test" From FabIO-0.1.0 to FabIO-0.1.1: ................................ - Merged Mar345 image reader and writer with cython bindings (towards python3 compliance) - Improve CBF image writing under windows - Bz2, Gzip and Flat files are managed through a common way ... classes are more (python v2.5) or less (python v2.7) overloaded - Fast EDF reading if one assumes offsets are the same between files, same for ROIs From FabIO-0.0.8 to FabIO-0.1.0: ................................ - OXD reader improved and writer implemented - Mar345 reader improved and writer implemented - CBF writer implemented - Clean-up of the code & bug fixes - Move towards python3 - Make PIL optional dependency Python3 is not yet tested but some blocking points have been identified and some fixed. From FabIO-0.0.7 to FabIO-0.0.8: ................................ - Support for Tiff using TiffIO module from V.A.Solé - Clean-up of the code & bug fixes From FabIO-0.0.6 to FabIO-0.0.7: ................................ - Support for multi-frames EDF files - Support for XML images/2D arrays used in EDNA - new method: fabio.open(filename) that is an alias for fabio.openimage.openimage(filename) From FabIO-0.0.4 to FabIO-0.0.6: ................................ - Support for CBF files from Pilatus detectors - Support for KCD files from Nonius Kappa CCD images - write EDF with their native data type (instead of uint16 by default) fabio-0.1.3/doc/source/INSTALL.rst0000644000175000017500000000720312233247462017273 0ustar jeromejerome00000000000000Installation ============ FabIO can, as any Python module, be installed from its sources, available on sourceforge but we advice to use binary packages provided for the most common platforms on sourceforge: Windows, MacOSX and Linux. Moreover FabIO is part of the common Linux distributions Ubuntu (since 11.10) and Debian7 where the package is named python-fabio and can be installed via: :: # apt-get install python-fabio If you are using MS Windows or MacOSX; binary version have been packaged. Windows installers are executable, just download the one corresponding to you python version and run it. MacOSX builds are zipped: unzip them at the right place. Dependencies ------------ * Python 2.5 or later (python 3.x is not yet ready) * numpy - http://www.numpy.org For full functionality of Fabio the following modules need to be installed: * PIL (python imaging library) - http://www.pythonware.com * lxml (library for reading XSDimages) Installation from sources ------------------------- FabIO can be downloaded from the fable download page on sourceforge.net. Presently the source code has been distributed as a zip package and a compressed tarball. Download either one and unpack it. :: http://sourceforge.net/projects/fable/files/fabio/ e.g. :: tar xvzf fabio-0.1.3.tar.gz or :: unzip fabio-0.1.3.zip all files are unpacked into the directory fabio-0.1.3. To install these do :: cd fabio-0.1.3 and install fabio with :: python setup.py build sudo python setup.py install most likely you will need to gain root privileges (with sudo in front of the command) to install the built package. Development versions -------------------- The newest development version can be obtained by checking it out from the subversion (SVN) repository: :: svn checkout https://svn.sourceforge.net/svnroot/fable/fabio/trunk fabio cd fabio python setup.py build sudo python setup.py install For Ubuntu/Debian users, you will need: * python-imaging * python-imaging-tk * python-numpy * python-dev :: sudo apt-get install python-imaging python-imaging-tk python-numpy We provide also a debian-package builder based on stdeb: :: sudo apt-get install python-stdeb ./build-deb.sh which builds a debian package and installs it in a single command. Handy for testing. Test suite ---------- FabIO has a comprehensive test-suite to ensure non regression (about 100 tests). When you run the test for the first time, many test images will be download and converted into various compressed format like gzip and bzip2 (this takes a lot of time). Be sure you have an internet connection (and your environment variable http_proxy is correctly set-up, if you are behind a proxy). :: python setup.py build cd test python test_all.py ........................................WARNING:compression:Encounter the python-gzip bug with trailing garbage, trying subprocess gzip ..............................WARNING:edfimage:Non complete datablock: got 6928, expected 8388608 WARNING:edfimage:Non complete datablock: got 6928, expected 8388608 WARNING:edfimage:Non complete datablock: got 6928, expected 8388608 .....................WARNING:edfimage:Unknown compression scheme TY1 .....WARNING:edfimage:Unknown compression scheme FALSE ...WARNING: Non standard TIFF. Rows per strip TAG missing WARNING: Non standard TIFF. Strip byte counts TAG missing .... ---------------------------------------------------------------------- Ran 103 tests in 21.696s OK Many tests are there to deal with malformed files, don't worry if the programs comaplins in warnings about "bad files", it is done on purpose. fabio-0.1.3/doc/source/index.rst0000644000175000017500000000073612121413504017264 0ustar jeromejerome00000000000000.. FabIO documentation master file, created by sphinx-quickstart on Fri Mar 15 09:03:50 2013. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to FabIO's documentation! ================================= Contents: .. toctree:: :maxdepth: 2 getting_started INSTALL Changelog api/modules Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` fabio-0.1.3/fabio-src/0000755000175000017500000000000012233272207015224 5ustar jeromejerome00000000000000fabio-0.1.3/fabio-src/marccdimage.py0000644000175000017500000003272012233175156020043 0ustar jeromejerome00000000000000#!/usr/bin/env python """ Authors: ........ * Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk * Jon Wright: European Synchrotron Radiation Facility; Grenoble (France) marccdimage can read MarCCD and MarMosaic images including header info. JPW : Use a parser in case of typos (sorry?) """ # Base this on the tifimage (as marccd seems to be tiff with a # special header from tifimage import tifimage import logging logger = logging.getLogger("marccdimage") # Now for the c definition (found on mar webpage) # The following string is therefore copyrighted by Mar I guess CDEFINITION = """ typedef struct frame_header_type { /* File/header format parameters (256 bytes) */ UINT32 header_type; /* flag for header type (can be used as magic number) */ char header_name[16]; /* header name (MMX) */ UINT32 header_major_version; /* header_major_version (n.) */ UINT32 header_minor_version; /* header_minor_version (.n) */ UINT32 header_byte_order;/* BIG_ENDIAN (Motorola,MIPS); LITTLE_ENDIAN (DEC, Intel) */ UINT32 data_byte_order; /* BIG_ENDIAN (Motorola,MIPS); LITTLE_ENDIAN (DEC, Intel) */ UINT32 header_size; /* in bytes */ UINT32 frame_type; /* flag for frame type */ UINT32 magic_number; /* to be used as a flag - usually to indicate new file */ UINT32 compression_type; /* type of image compression */ UINT32 compression1; /* compression parameter 1 */ UINT32 compression2; /* compression parameter 2 */ UINT32 compression3; /* compression parameter 3 */ UINT32 compression4; /* compression parameter 4 */ UINT32 compression5; /* compression parameter 4 */ UINT32 compression6; /* compression parameter 4 */ UINT32 nheaders; /* total number of headers */ UINT32 nfast; /* number of pixels in one line */ UINT32 nslow; /* number of lines in image */ UINT32 depth; /* number of bytes per pixel */ UINT32 record_length; /* number of pixels between succesive rows */ UINT32 signif_bits; /* true depth of data, in bits */ UINT32 data_type; /* (signed,unsigned,float...) */ UINT32 saturated_value; /* value marks pixel as saturated */ UINT32 sequence; /* TRUE or FALSE */ UINT32 nimages; /* total number of images - size of each is nfast*(nslow/nimages) */ UINT32 origin; /* corner of origin */ UINT32 orientation; /* direction of fast axis */ UINT32 view_direction; /* direction to view frame */ UINT32 overflow_location;/* FOLLOWING_HEADER, FOLLOWING_DATA */ UINT32 over_8_bits; /* # of pixels with counts 255 */ UINT32 over_16_bits; /* # of pixels with count 65535 */ UINT32 multiplexed; /* multiplex flag */ UINT32 nfastimages; /* # of images in fast direction */ UINT32 nslowimages; /* # of images in slow direction */ UINT32 background_applied;/* flags correction has been applied hold magic number ? */ UINT32 bias_applied; /* flags correction has been applied hold magic number ? */ UINT32 flatfield_applied;/* flags correction has been applied - hold magic number ? */ UINT32 distortion_applied;/*flags correction has been applied - hold magic number ? */ UINT32 original_header_type; /* Header/frame type from file that frame is read from */ UINT32 file_saved; /* Flag that file has been saved, should be zeroed if modified */ char reserve1[(64-40)*sizeof(INT32)-16]; /* Data statistics (128) */ UINT32 total_counts[2]; /* 64 bit integer range = 1.85E19*/ UINT32 special_counts1[2]; UINT32 special_counts2[2]; UINT32 min; UINT32 max; UINT32 mean; UINT32 rms; UINT32 p10; UINT32 p90; UINT32 stats_uptodate; UINT32 pixel_noise[MAXIMAGES]; /*1000*base noise value (ADUs) */ char reserve2[(32-13-MAXIMAGES)*sizeof(INT32)]; /* More statistics (256) */ UINT16 percentile[128]; /* Goniostat parameters (128 bytes) */ INT32 xtal_to_detector; /* 1000*distance in millimeters */ INT32 beam_x; /* 1000*x beam position (pixels) */ INT32 beam_y; /* 1000*y beam position (pixels) */ INT32 integration_time; /* integration time in milliseconds */ INT32 exposure_time; /* exposure time in milliseconds */ INT32 readout_time; /* readout time in milliseconds */ INT32 nreads; /* number of readouts to get this image */ INT32 start_twotheta; /* 1000*two_theta angle */ INT32 start_omega; /* 1000*omega angle */ INT32 start_chi; /* 1000*chi angle */ INT32 start_kappa; /* 1000*kappa angle */ INT32 start_phi; /* 1000*phi angle */ INT32 start_delta; /* 1000*delta angle */ INT32 start_gamma; /* 1000*gamma angle */ INT32 start_xtal_to_detector; /* 1000*distance in mm (dist in um)*/ INT32 end_twotheta; /* 1000*two_theta angle */ INT32 end_omega; /* 1000*omega angle */ INT32 end_chi; /* 1000*chi angle */ INT32 end_kappa; /* 1000*kappa angle */ INT32 end_phi; /* 1000*phi angle */ INT32 end_delta; /* 1000*delta angle */ INT32 end_gamma; /* 1000*gamma angle */ INT32 end_xtal_to_detector; /* 1000*distance in mm (dist in um)*/ INT32 rotation_axis; /* active rotation axis */ INT32 rotation_range; /* 1000*rotation angle */ INT32 detector_rotx; /* 1000*rotation of detector around X */ INT32 detector_roty; /* 1000*rotation of detector around Y */ INT32 detector_rotz; /* 1000*rotation of detector around Z */ char reserve3[(32-28)*sizeof(INT32)]; /* Detector parameters (128 bytes) */ INT32 detector_type; /* detector type */ INT32 pixelsize_x; /* pixel size (nanometers) */ INT32 pixelsize_y; /* pixel size (nanometers) */ INT32 mean_bias; /* 1000*mean bias value */ INT32 photons_per_100adu; /* photons / 100 ADUs */ INT32 measured_bias[MAXIMAGES];/* 1000*mean bias value for each image*/ INT32 measured_temperature[MAXIMAGES]; /* Temperature of each detector in milliKelvins */ INT32 measured_pressure[MAXIMAGES]; /* Pressure of each chamber in microTorr */ /* Retired reserve4 when MAXIMAGES set to 9 from 16 and two fields removed, and temp and pressure added char reserve4[(32-(5+3*MAXIMAGES))*sizeof(INT32)] */ /* X-ray source and optics parameters (128 bytes) */ /* X-ray source parameters (8*4 bytes) */ INT32 source_type; /* (code) - target, synch. etc */ INT32 source_dx; /* Optics param. - (size microns) */ INT32 source_dy; /* Optics param. - (size microns) */ INT32 source_wavelength; /* wavelength (femtoMeters) */ INT32 source_power; /* (Watts) */ INT32 source_voltage; /* (Volts) */ INT32 source_current; /* (microAmps) */ INT32 source_bias; /* (Volts) */ INT32 source_polarization_x; /* () */ INT32 source_polarization_y; /* () */ char reserve_source[4*sizeof(INT32)]; /* X-ray optics_parameters (8*4 bytes) */ INT32 optics_type; /* Optics type (code)*/ INT32 optics_dx; /* Optics param. - (size microns) */ INT32 optics_dy; /* Optics param. - (size microns) */ INT32 optics_wavelength; /* Optics param. - (size microns) */ INT32 optics_dispersion; /* Optics param. - (*10E6) */ INT32 optics_crossfire_x; /* Optics param. - (microRadians) */ INT32 optics_crossfire_y; /* Optics param. - (microRadians) */ INT32 optics_angle; /* Optics param. - (monoch. 2theta - microradians) */ INT32 optics_polarization_x; /* () */ INT32 optics_polarization_y; /* () */ char reserve_optics[4*sizeof(INT32)]; char reserve5[((32-28)*sizeof(INT32))]; /* File parameters (1024 bytes) */ char filetitle[128]; /* Title */ char filepath[128]; /* path name for data file */ char filename[64]; /* name of data file */ char acquire_timestamp[32]; /* date and time of acquisition */ char header_timestamp[32]; /* date and time of header update */ char save_timestamp[32]; /* date and time file saved */ char file_comments[512]; /* comments, use as desired */ char reserve6[1024-(128+128+64+(3*32)+512)]; /* Dataset parameters (512 bytes) */ char dataset_comments[512]; /* comments, used as desired */ /* pad out to 3072 bytes */ char pad[3072-(256+128+256+(3*128)+1024+512)]; } frame_header; """ import struct # Convert mar c header file types to python struct module types C_TO_STRUCT = { "INT32" : "i", "UINT32" : "I", "char" : "c", "UINT16" : "H" } # Sizes (bytes) of mar c header objects C_SIZES = { "INT32" : 4, "UINT32" : 4, "char" : 1, "UINT16" : 2 } # This was worked out by trial and error from a trial image I think MAXIMAGES = 9 def make_format(c_def_string): """ Reads the header definition in c and makes the format string to pass to struct.unpack """ lines = c_def_string.split("\n") fmt = "" names = [] expected = 0 for line in lines: if line.find(";") == -1: continue decl = line.split(";")[0].lstrip().rstrip() try: [typ, name] = decl.split() except ValueError: logger.debug("skipping: %s" , line) continue if name.find("[") > -1: # repeated ... times try: num = name.split("[")[1].split("]")[0] num = num.replace("MAXIMAGES", str(MAXIMAGES)) num = num.replace("sizeof(INT32)", "4") times = eval(num) except Exception, error: logger.error("%s Please decode %s", error, decl) raise error else: times = 1 try: fmt += C_TO_STRUCT[typ] * times names += [name] * times expected += C_SIZES[typ] * times except KeyError: continue return names, fmt # Make these be compiled on loading module HEADER_NAMES, HEADER_FORMAT = make_format(CDEFINITION) def interpret_header(header, fmt, names): """ given a format and header interpret it """ values = struct.unpack(fmt, header) hdr = {} i = 0 for name in names: if hdr.has_key(name): if type(values[i]) == type("string"): hdr[name] = hdr[name] + values[i] else: try: hdr[name].append(values[i]) except AttributeError: hdr[name] = [hdr[name], values[i]] else: hdr[name] = values[i] i = i + 1 return hdr class marccdimage(tifimage): """ Read in data in mar ccd format, also MarMosaic images, including header info """ def _readheader(self, infile): """ Parser based approach Gets all entries """ infile.seek(1024) hstr = infile.read(3072) self.header = interpret_header(hstr, HEADER_FORMAT, HEADER_NAMES) def _read(self, fname): """ inherited from tifimage ... a marccd image *is a* tif image just with a header """ return tifimage.read(self, fname) fabio-0.1.3/fabio-src/compression.py0000644000175000017500000003317512233175156020155 0ustar jeromejerome00000000000000#!/usr/bin/env python # coding: utf8 """ Authors: Jérôme Kieffer, ESRF email:jerome.kieffer@esrf.fr FabIO library containing compression and decompression algorithm for various """ __author__ = "Jérôme Kieffer" __contact__ = "jerome.kieffer@esrf.eu" __license__ = "GPLv3+" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" import logging, struct, hashlib, base64, StringIO, sys if sys.version_info >= (3,): str = bytes logger = logging.getLogger("compression") import numpy try: import gzip except ImportError: logger.error("Unable to import gzip module: disabling gzip compression") gzip = None try: import bz2 except ImportError: logger.error("Unable to import bz2 module: disabling bz2 compression") bz2 = None try: import zlib except ImportError: logger.error("Unable to import zlib module: disabling zlib compression") zlib = None def md5sum(blob): """ returns the md5sum of an object... """ return base64.b64encode(hashlib.md5(blob).digest()) def endianness(): """ Return the native endianness of the system """ if numpy.little_endian: return "LITTLE_ENDIAN" else: return "BIG_ENDIAN" def decGzip(stream): """ Decompress a chunk of data using the gzip algorithm from Python or alternatives if possible """ if gzip is None: raise ImportError("gzip module is not available") fileobj = StringIO.StringIO(stream) try: rawData = gzip.GzipFile(fileobj=fileobj).read() except IOError: logger.warning("Encounter the python-gzip bug with trailing garbage, trying subprocess gzip") try: #This is as an ugly hack against a bug in Python gzip import subprocess sub = subprocess.Popen(["gzip", "-d", "-f"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) rawData, err = sub.communicate(input=stream) logger.debug("Gzip subprocess ended with %s err= %s; I got %s bytes back" % (sub.wait(), err, len(rawData))) except Exception, error: #IGNORE:W0703 logger.warning("Unable to use the subprocess gzip (%s). Is gzip available? " % error) for i in range(1, 513): try: fileobj = StringIO.StringIO(stream[:-i]) rawData = gzip.GzipFile(fileobj=fileobj).read() except IOError: logger.debug("trying with %s bytes less, doesn't work" % i) else: break else: logger.error("I am totally unable to read this gzipped compressed data block, giving up") return rawData def decBzip2(stream): """ Decompress a chunk of data using the bzip2 algorithm from Python """ if bz2 is None: raise ImportError("bz2 module is not available") return bz2.decompress(stream) def decZlib(stream): """ Decompress a chunk of data using the zlib algorithm from Python """ if zlib is None: raise ImportError("zlib module is not available") return zlib.decompress(stream) def decByteOffet_python(stream, size): """ Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return: 1D-ndarray """ logger.debug("CBF decompression using Python with Cython loops") dataOut = numpy.zeros((size), dtype=numpy.int64) i = 0 j = 0 last = 0 current = 0 while ((i < len(stream)) and (j < size)): if (stream[i] == '\x80'): if (stream[i + 1:i + 3] == "\x00\x80"): if (stream[i + 3:i + 7] == "\x00\x00\x00\x80"): current = struct.unpack("=size){ //printf("i= %i<%i, j=%i < size= %i %i\\n",i,n,j,size,dataIn(i)); break; } if (dataIn(i) == key){ if ( (dataIn(i+1)==0) and (dataIn(i+2)==key) ){ if ( (dataIn(i+3)==0) and (dataIn(i+4)==0) and (dataIn(i+5)==0) and (dataIn(i+6)==key) ) { // 64 bits mode char tmp = dataIn(i+14) ; current = (long(tmp)<<56) | (long(dataIn(i+13))<<48) | (long(dataIn(i+12))<<40) | (long(dataIn(i+11))<<32) | (long(dataIn(i+10))<<24) | (long(dataIn(i+9))<<16) | (long(dataIn(i+8))<<8) | (long(dataIn(i+7))); // printf("64 bit int at pos %i, %i, value=%ld \\n",i,j,current); i+=14; }else{ // 32 bits mode char tmp = dataIn(i+6) ; current = (long(tmp)<<24) | (long(dataIn(i+5))<<16) | (long(dataIn(i+4))<<8) | (long(dataIn(i+3))); // printf("32 bit int at pos %i, %i, value=%ld was %i %i %i %i %i %i %i\\n",i,j,current,dataIn(i),dataIn(i+1),dataIn(i+2),dataIn(i+3),dataIn(i+4),dataIn(i+5),dataIn(i+6)); // printf("%ld %ld %ld %ld\\n",(long(tmp)<<24) , (long(dataIn(i+5))<<16) , (long(dataIn(i+4))<<8) ,long(dataIn(i+3))); i+=6; } }else{ // 16 bit mode char tmp = dataIn(i+2); current = (long(tmp)<<8) | (long (dataIn(i+1))); // printf("16 bit int at pos %i, %i, value=%ld was %i %i %i\\n",i,j,current,dataIn(i),dataIn(i+1),dataIn(i+2)); i+=2; } }else{ // 8 bit mode char tmp = dataIn(i) ; current= long(tmp) ; } last+=current; dataOut(j)=last; j++ ; } return_val=0; """ rc = weave.inline(codeC, ["dataIn", "dataOut", "n", "size" ], verbose=2, type_converters=converters.blitz) if rc != 0: logger.warning("weave binary module return error code %s" % rc) return dataOut def decByteOffet_numpy(stream, size=None): """ Analyze a stream of char with any length of exception: 2, 4, or 8 bytes integers @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return: 1D-ndarray """ logger.debug("CBF decompression using Numpy") listnpa = [] key16 = "\x80" key32 = "\x00\x80" key64 = "\x00\x00\x00\x80" shift = 1 while True: idx = stream.find(key16) if idx == -1: listnpa.append(numpy.fromstring(stream, dtype="int8")) break listnpa.append(numpy.fromstring(stream[:idx], dtype="int8")) if stream[idx + 1:idx + 3] == key32: if stream[idx + 3:idx + 7] == key64: # long int 64 bits listnpa.append(numpy.fromstring(stream[idx + 7:idx + 15], dtype="int64")) shift = 15 else: #32 bit int listnpa.append(numpy.fromstring(stream[idx + 3:idx + 7], dtype="int32")) shift = 7 else: # int16 listnpa.append(numpy.fromstring(stream[idx + 1:idx + 3], dtype="int16")) shift = 3 stream = stream[idx + shift:] return (numpy.hstack(listnpa)).astype("int64").cumsum() def decByteOffet_cython(stream, size=None): """ Analyze a stream of char with any length of exception: 2, 4, or 8 bytes integers @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return: 1D-ndarray """ logger.debug("CBF decompression using cython") try: from fabio.byte_offset import analyseCython except ImportError, error: logger.error("Failed to import byte_offset cython module, falling back on numpy method") return decByteOffet_numpy(stream, size) else: return analyseCython(stream, size) def compByteOffet_numpy(data): """ Compress a dataset into a string using the byte_offet algorithm @param data: ndarray @return: string/bytes with compressed data test = numpy.array([0,1,2,127,0,1,2,128,0,1,2,32767,0,1,2,32768,0,1,2,2147483647,0,1,2,2147483648,0,1,2,128,129,130,32767,32768,128,129,130,32768,2147483647,2147483648]) """ flat = data.astype("int64").ravel() delta = numpy.zeros_like(flat) delta[0] = flat[0] delta[1:] = flat[1:] - flat[:-1] mask = ((delta > 127) + (delta < -127)) exceptions = numpy.nonzero(mask)[0] if numpy.little_endian: byteswap = False else: byteswap = True start = 0 binary_blob = "" for stop in exceptions: if stop - start > 0: binary_blob += delta[start:stop].astype("int8").tostring() exc = delta[stop] if (exc > 2147483647) or (exc < -2147483647): #2**31-1 binary_blob += "\x80\x00\x80\x00\x00\x00\x80" if byteswap: binary_blob += delta[stop:stop + 1].byteswap().tostring() else: binary_blob += delta[stop:stop + 1].tostring() elif (exc > 32767) or (exc < -32767): #2**15-1 binary_blob += "\x80\x00\x80" if byteswap: binary_blob += delta[stop:stop + 1].astype("int32").byteswap().tostring() else: binary_blob += delta[stop:stop + 1].astype("int32").tostring() else: #>127 binary_blob += "\x80" if byteswap: binary_blob += delta[stop:stop + 1].astype("int16").byteswap().tostring() else: binary_blob += delta[stop:stop + 1].astype("int16").tostring() start = stop + 1 if start < delta.size: binary_blob += delta[start:].astype("int8").tostring() return binary_blob def decTY1(raw_8, raw_16=None, raw_32=None): """ Modified byte offset decompressor used in Oxford Diffraction images @param raw_8: strings containing raw data with integer 8 bits @param raw_16: strings containing raw data with integer 16 bits @param raw_32: strings containing raw data with integer 32 bits @return: numpy.ndarray """ data = numpy.fromstring(raw_8, dtype="uint8").astype(int) data -= 127 if raw_32 is not None: int32 = numpy.fromstring(raw_32, dtype="int32").astype(int) exception32 = numpy.nonzero(data == 128) if raw_16 is not None: int16 = numpy.fromstring(raw_16, dtype="int16").astype(int) exception16 = numpy.nonzero(data == 127) data[exception16] = int16 if raw_32: data[exception32] = int32 summed = data.cumsum() smax = summed.max() if (smax > (2 ** 31 - 1)): bytecode = "int64" elif (smax > (2 ** 15 - 1)): bytecode = "int32" elif (smax > (2 ** 7 - 1)): bytecode = "int16" else: bytecode = "int8" return summed.astype(bytecode) decKM4CCD = decTY1 def compTY1(data): """ Modified byte offset compressor used in Oxford Diffraction images @param data: numpy.ndarray with the input data (integers!) @return: 3-tuple of strings: raw_8,raw_16,raw_32 containing raw data with integer of the given size """ fdata = data.flatten() diff = numpy.zeros_like(fdata) diff[0] = fdata[0] diff[1:] = fdata[1:] - fdata[:-1] adiff = abs(diff) exception32 = (adiff > 32767)#2**15-1 exception16 = (adiff >= 127) - exception32 #2**7-1) we16 = numpy.where(exception16) we32 = numpy.where(exception32) raw_16 = diff[we16].astype("int16").tostring() raw_32 = diff[we32].astype("int32").tostring() diff[we16] = 127 diff[we32] = 128 diff += 127 raw_8 = diff.astype("uint8").tostring() return raw_8, raw_16, raw_32 def decPCK(stream, dim1=None, dim2=None, overflowPix=None, version=None): """ Modified CCP4 pck decompressor used in MAR345 images @param stream: string or file @return: numpy.ndarray (square array) """ try: from mar345_IO import uncompress_pck except ImportError, error: raise RuntimeError("Unable to import mar345_IO to read compressed dataset") if "seek" in dir(stream): stream.seek(0) raw = stream.read() else: raw = str(stream) return uncompress_pck(raw, dim1, dim2, overflowPix, version) def compPCK(data): """ Modified CCP4 pck compressor used in MAR345 images @param data: numpy.ndarray (square array) @return: compressed stream """ try: from mar345_IO import compress_pck except ImportError, error: raise RuntimeError("Unable to import mar345_IO to write compressed dataset") return compress_pck(data) fabio-0.1.3/fabio-src/tifimage.py0000644000175000017500000002530712233175220017367 0ustar jeromejerome00000000000000#!/usr/bin/env python #-*- coding: utf8 -*- """ FabIO class for dealing with TIFF images. In facts wraps TiffIO from V. Armando Solé (available in PyMca) or falls back to PIL Authors: ........ * Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk * Jérôme Kieffer: European Synchrotron Radiation Facility; Grenoble (France) License: GPLv3+ """ __authors__ = ["Jérôme Kieffer", "Henning O. Sorensen", "Erik Knudsen"] __date__ = "11/07/2011" __license__ = "GPLv3+" __copyright__ = "ESRF, Grenoble & Risoe National Laboratory" __status__ = "stable" import time, logging, struct logger = logging.getLogger("tifimage") try: from PIL import Image except ImportError: logger.warning("PIL is not installed ... trying to do without") Image = None import numpy from fabioimage import fabioimage from TiffIO import TiffIO PIL_TO_NUMPY = { "I;16": numpy.uint16, "F": numpy.float32, "1": numpy.bool, "I": numpy.int32, "L": numpy.uint8, } LITTLE_ENDIAN = 1234 BIG_ENDIAN = 3412 TYPES = {0:'invalid', 1:'byte', 2:'ascii', 3:'short', 4:'long', 5:'rational', 6:'sbyte', 7:'undefined', 8:'sshort', 9:'slong', 10:'srational', 11:'float', 12:'double'} TYPESIZES = {0:0, 1:1, 2:1, 3:2, 4:4, 5:8, 6:1, 7:1, 8:2, 9:4, 10:8, 11:4, 12:8} baseline_tiff_tags = { 256:'ImageWidth', 257:'ImageLength', 306:'DateTime', 315:'Artist', 258:'BitsPerSample', 265:'CellLength', 264:'CellWidth', 259:'Compression', 262:'PhotometricInterpretation', 296:'ResolutionUnit', 282:'XResolution', 283:'YResolution', 278:'RowsPerStrip', 273:'StripOffset', 279:'StripByteCounts', 270:'ImageDescription', 271:'Make', 272:'Model', 320:'ColorMap', 305:'Software', 339:'SampleFormat', 33432:'Copyright' } class tifimage(fabioimage): """ Images in TIF format Wraps TiffIO """ _need_a_seek_to_read = True def __init__(self, *args, **kwds): """ Tifimage constructor adds an nbits member attribute """ self.nbits = None fabioimage.__init__(self, *args, **kwds) self.lib = None def _readheader(self, infile): """ Try to read Tiff images header... """ # try: # self.header = { "filename" : infile.name } # except AttributeError: # self.header = {} # # t = Tiff_header(infile.read()) # self.header = t.header # try: # self.dim1 = int(self.header['ImageWidth']) # self.dim2 = int(self.header['ImageLength']) # except (KeyError): # logger.warning("image dimensions could not be determined from header tags, trying to go on anyway") # read the first 32 bytes to determine size header = numpy.fromstring(infile.read(64), numpy.uint16) self.dim1 = int(header[9]) self.dim2 = int(header[15]) # nbits is not a fabioimage attribute... self.nbits = int(header[21]) # number of bits def read(self, fname, frame=None): """ Wrapper for TiffIO. """ infile = self._open(fname, "rb") self._readheader(infile) infile.seek(0) self.lib = None try: tiffIO = TiffIO(infile) if tiffIO.getNumberOfImages() > 0: #No support for now of multi-frame tiff images self.data = tiffIO.getImage(0) self.header = tiffIO.getInfo(0) except Exception, error: logger.warning("Unable to read %s with TiffIO due to %s, trying PIL" % (fname, error)) else: if self.data.ndim == 2: self.dim2, self.dim1 = self.data.shape elif self.data.ndim == 3: self.dim2, self.dim1, ncol = self.data.shape logger.warning("Third dimension is the color") else: logger.warning("dataset has %s dimensions (%s), check for errors !!!!", self.data.ndim, self.data.shape) self.lib = "TiffIO" if (self.lib is None): if Image: try: infile.seek(0) self.pilimage = Image.open(infile) except Exception: logger.error("Error in opening %s with PIL" % fname) self.lib = None infile.seek(0) else: self.lib = "PIL" self.dim1, self.dim2 = self.pilimage.size if self.pilimage.mode in PIL_TO_NUMPY: self.data = numpy.fromstring(self.pilimage.tostring(), PIL_TO_NUMPY[self.pilimage.mode]) else: #probably RGB or RGBA images: rely on PIL to convert it to greyscale float. self.data = numpy.fromstring(self.pilimage.convert("F").tostring(), numpy.float32) self.data.shape = (self.dim2, self.dim1) else: logger.error("Error in opening %s: no tiff reader managed to read the file.", fname) self.lib = None infile.seek(0) self.bpp = len(numpy.zeros(1, dtype=self.data.dtype).tostring()) self.bytecode = self.data.dtype.name self.resetvals() return self def write(self, fname): """ Overrides the fabioimage.write method and provides a simple TIFF image writer. @param fname: name of the file to save the image to @tag_type fname: string or unicode (file?)... """ tiffIO = TiffIO(fname, mode="w") tiffIO.writeImage(self.data, info=self.header, software="fabio.tifimage", date=time.ctime()) #define a couple of helper classes here: class Tiff_header(object): def __init__(self, string): if string[:4] == "II\x2a\x00": self.byteorder = LITTLE_ENDIAN elif string[:4] == 'MM\x00\x2a': self.byteorder = BIG_ENDIAN else: logger.warning("Warning: This does not appear to be a tiff file") #the next two bytes contains the offset of the oth IFD offset_first_ifd = struct.unpack_from("h", string[4:])[0] self.ifd = [Image_File_Directory()] offset_next = self.ifd[0].unpack(string, offset_first_ifd) while (offset_next != 0): self.ifd.append(Image_File_Directory()) offset_next = self.ifd[-1].unpack(string, offset_next) self.header = {} #read the values of the header items into a dictionary for entry in self.ifd[0].entries: if entry.tag in baseline_tiff_tags.keys(): self.header[baseline_tiff_tags[entry.tag]] = entry.val else: self.header[entry.tag] = entry.val class Image_File_Directory(object): def __init__(self, instring=None, offset= -1): self.entries = [] self.offset = offset self.count = None def unpack(self, instring, offset= -1): if (offset == -1): offset = self.offset strInput = instring[offset:] self.count = struct.unpack_from("H", strInput[:2])[0] #0th IFD contains count-1 entries (count includes the adress of the next IFD) for i in range(self.count - 1): e = Image_File_Directory_entry().unpack(strInput[2 + 12 * (i + 1):]) if (e != None): self.entries.append(e) #extract data associated with tags for e in self.entries: if (e.val == None): e.extract_data(instring) #do we have some more ifds in this file offset_next = struct.unpack_from("L", instring[offset + 2 + self.count * 12:])[0] return offset_next class Image_File_Directory_entry(object): def __init__(self, tag=0, tag_type=0, count=0, offset=0): self.tag = tag self.tag_type = tag_type self.count = count self.val_offset = offset self.val = None def unpack(self, strInput): idfentry = strInput[:12] ################################################################################ # # TOFIX: How is it possible that HHL (2+2+4 bytes has a size of ) ################################################################################ (tag, tag_type, count) = struct.unpack_from("HHL", idfentry) self.tag = tag self.count = count self.tag_type = tag_type self.val = None if (count <= 0): logger.warning("Tag # %s has an invalid count: %s. Tag is ignored" % (tag, count)) return if(count * TYPESIZES[tag_type] <= 4): self.val_offset = 8 self.extract_data(idfentry) self.val_offset = None else: self.val_offset = struct.unpack_from("L", idfentry[8:])[0] return self def extract_data(self, full_string): tag_type = self.tag_type if (TYPES[tag_type] == 'byte'): self.val = struct.unpack_from("B", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'short'): self.val = struct.unpack_from("H", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'long'): self.val = struct.unpack_from("L", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'sbyte'): self.val = struct.unpack_from("b", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'sshort'): self.val = struct.unpack_from("h", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'slong'): self.val = struct.unpack_from("l", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'ascii'): self.val = full_string[self.val_offset:self.val_offset + max(self.count, 4)] elif (TYPES[tag_type] == 'rational'): if self.val_offset != None: (num, den) = struct.unpack_from("LL", full_string[self.val_offset:]) print self.val_offset self.val = float(num) / den elif (TYPES[tag_type] == 'srational'): if self.val_offset != None: (num, den) = struct.unpack_from("ll", full_string[self.val_offset:]) self.val = float(num) / den, elif (TYPES[tag_type] == 'float'): self.val = struct.unpack_from("f", full_string[self.val_offset:])[0] elif (TYPES[tag_type] == 'double'): if self.val_offset != None: self.val = struct.unpack_from("d", full_string[self.val_offset:])[0] else: logger.warning("unrecognized type of strInputentry self: %s tag: %s type: %s TYPE: %s" % (self, baseline_tiff_tags[self.tag], self.tag_type, TYPES[tag_type])) fabio-0.1.3/fabio-src/binaryimage.py0000644000175000017500000000735112233247673020104 0ustar jeromejerome00000000000000#!/usr/bin/env python # coding: utf8 # Get ready for python3: from __future__ import with_statement, print_function __doc__ = """ Authors: Gael Goret, Jerome Kieffer, ESRF, France Emails: gael.goret@esrf.fr, jerome.kieffer@esrf.fr Brian Richard Pauw Binary files images are simple none-compressed 2D images only defined by their : data-type, dimensions, byte order and offset This simple library has been made for manipulating exotic/unknown files format. """ __authors__ = ["Gaël Goret", "Jérôme Kieffer", "Brian Pauw"] __contact__ = "gael.goret@esrf.fr" __license__ = "GPLv3+" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" __version__ = "17 Oct 2012" from fabioimage import fabioimage import numpy, logging logger = logging.getLogger("binaryimage") class binaryimage(fabioimage): """ This simple library has been made for manipulating exotic/unknown files format. Binary files images are simple none-compressed 2D images only defined by their : data-type, dimensions, byte order and offset if offset is set to a negative value, the image is read using the last data but n data in the file, skipping any header. """ def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs) @staticmethod def swap_needed(endian): """ Decide if we need to byteswap """ if (endian == '<' and numpy.little_endian) or (endian == '>' and not numpy.little_endian): return False if (endian == '>' and numpy.little_endian) or (endian == '<' and not numpy.little_endian): return True def read(self, fname, dim1, dim2, offset=0, bytecode="int32", endian="<"): """ Read a binary image @param fname: file name @type fname: string @param dim1: image dimensions (Fast index) @param dim2: image dimensions (Slow index) @param offset: starting position of the data-block. If negative, starts at the end. @param bytecode: can be "int8","int16","int32","int64","uint8","uint16","uint32","uint64","float32","float64",... @param endian: among short or long endian ("<" or ">") """ self.filename = fname self.dim1 = dim1 self.dim2 = dim2 self.bytecode = bytecode f = open(self.filename, "rb") dims = [dim2, dim1] bpp = len(numpy.array(0, bytecode).tostring()) size = dims[0] * dims[1] * bpp if offset >= 0: f.seek(offset) else: try: f.seek(-size + offset + 1, 2) #seek from EOF backwards except IOError: logging.warn('expected datablock too large, please check bytecode settings: {}'.format(bytecode)) except: logging.error('Uncommon error encountered when reading file') rawData = f.read(size) if self.swap_needed(endian): data = numpy.fromstring(rawData, bytecode).byteswap().reshape(tuple(dims)) else: data = numpy.fromstring(rawData, bytecode).reshape(tuple(dims)) self.data = data return self def estimate_offset_value(self, fname, dim1, dim2, bytecode="int32"): "Estimates the size of a file" with open(fname, "rb") as f: bpp = len(numpy.array(0, bytecode).tostring()) size = dim1 * dim2 * bpp totsize = len(f.read()) logger.info('total size (bytes): %s', totsize) logger.info('expected data size given parameters (bytes): %s', size) logger.info('estimation of the offset value (bytes): %s', totsize - size) def write(self, fname): with open(fname, mode="wb") as outfile: outfile.write(self.data.tostring()) fabio-0.1.3/fabio-src/pilatusimage.py0000644000175000017500000000372212126623347020274 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ Authors: ........ * Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk * Jon Wright: European Synchrotron Radiation Facility; Grenoble (France) """ # Base this on the tifimage (as Pilatus is tiff with a # tiff header from fabio.tifimage import tifimage class pilatusimage(tifimage): """ Read in Pilatus format, also pilatus images, including header info """ def _readheader(self, infile): """ Parser based approach Gets all entries """ self.header = {} # infile = open(infile) hstr = infile.read(4096) # well not very pretty - but seems to find start of # header information if (hstr.find('# ') == -1): return self.header hstr = hstr[hstr.index('# '):] hstr = hstr[:hstr.index('\x00')] hstr = hstr.split('#') go_on = True while go_on: try: hstr.remove('') except Exception: go_on = False for line in hstr: line = line[1:line.index('\r\n')] if line.find(':') > -1: dump = line.split(':') self.header[dump[0]] = dump[1] elif line.find('=') > -1: dump = line.split('=') self.header[dump[0]] = dump[1] elif line.find(' ') > -1: i = line.find(' ') self.header[line[:i]] = line[i:] elif line.find(',') > -1: dump = line.split(',') self.header[dump[0]] = dump[1] return self.header def _read(self, fname): """ inherited from tifimage ... a Pilatus image *is a* tif image just with a header """ return tifimage.read(self, fname) fabio-0.1.3/fabio-src/TiffIO.py0000644000175000017500000013343112120434325016717 0ustar jeromejerome00000000000000#/*########################################################################## # Copyright (C) 2012 European Synchrotron Radiation Facility # # This file is part of the PyMca X-ray Fluorescence Toolkit developed at # the ESRF by the Software group. # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # PyMca is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # details. # #############################################################################*/ __author__ = "V.A. Sole - ESRF Data Analysis" __revision__ = 1501 import sys import os import struct import numpy DEBUG = 0 ALLOW_MULTIPLE_STRIPS = False TAG_ID = { 256:"NumberOfColumns", # S or L ImageWidth 257:"NumberOfRows", # S or L ImageHeight 258:"BitsPerSample", # S Number of bits per component 259:"Compression", # SHORT (1 - NoCompression, ... 262:"PhotometricInterpretation", # SHORT (0 - WhiteIsZero, 1 -BlackIsZero, 2 - RGB, 3 - Palette color 270:"ImageDescription", # ASCII 273:"StripOffsets", # S or L, for each strip, the byte offset of the strip 278:"RowsPerStrip", # S or L, number of rows in each back may be not for the last 279:"StripByteCounts", # S or L, The number of bytes in the strip AFTER any compression 305:"Software", # ASCII 306:"Date", # ASCII 320:"Colormap", # Colormap of Palette-color Images 339:"SampleFormat", # SHORT Interpretation of data in each pixel } #TILES ARE TO BE SUPPORTED TOO ... TAG_NUMBER_OF_COLUMNS = 256 TAG_NUMBER_OF_ROWS = 257 TAG_BITS_PER_SAMPLE = 258 TAG_PHOTOMETRIC_INTERPRETATION = 262 TAG_COMPRESSION = 259 TAG_IMAGE_DESCRIPTION = 270 TAG_STRIP_OFFSETS = 273 TAG_ROWS_PER_STRIP = 278 TAG_STRIP_BYTE_COUNTS = 279 TAG_SOFTWARE = 305 TAG_DATE = 306 TAG_COLORMAP = 320 TAG_SAMPLE_FORMAT = 339 FIELD_TYPE = {1:('BYTE', "B"), 2:('ASCII', "s"), #string ending with binary zero 3:('SHORT', "H"), 4:('LONG', "I"), 5:('RATIONAL', "II"), 6:('SBYTE', "b"), 7:('UNDEFINED', "B"), 8:('SSHORT', "h"), 9:('SLONG', "i"), 10:('SRATIONAL', "ii"), 11:('FLOAT', "f"), 12:('DOUBLE', "d")} FIELD_TYPE_OUT = { 'B': 1, 's': 2, 'H': 3, 'I': 4, 'II': 5, 'b': 6, 'h': 8, 'i': 9, 'ii': 10, 'f': 11, 'd': 12} #sample formats (http://www.awaresystems.be/imaging/tiff/tiffflags/sampleformat.html) SAMPLE_FORMAT_UINT = 1 SAMPLE_FORMAT_INT = 2 SAMPLE_FORMAT_FLOAT = 3 #floating point SAMPLE_FORMAT_VOID = 4 #undefined data, usually assumed UINT SAMPLE_FORMAT_COMPLEXINT = 5 SAMPLE_FORMAT_COMPLEXIEEEFP = 6 class TiffIO(object): def __init__(self, filename, mode=None, cache_length=20, mono_output=False): if mode is None: mode = 'rb' if 'b' not in mode: mode = mode + 'b' if 'a' in mode.lower(): raise IOError("Mode %s makes no sense on TIFF files. Consider 'rb+'" % mode) if ('w' in mode): if '+' not in mode: mode += '+' #if isinstance(filename, file): #does not work in python 3 if hasattr(filename, "seek"): fd = filename self._access = None else: #the b is needed for windows and python 3 fd = open(filename, mode) self._access = mode self._initInternalVariables(fd) self._maxImageCacheLength = cache_length self._forceMonoOutput = mono_output def _initInternalVariables(self, fd=None): if fd is None: fd = self.fd else: self.fd = fd # read the order fd.seek(0) order = fd.read(2).decode() if len(order): if order == "II": #intel, little endian fileOrder = "little" self._structChar = '<' elif order == "MM": #motorola, high endian fileOrder = "big" self._structChar = '>' else: raise IOError("File is not a Mar CCD file, nor a TIFF file") a = fd.read(2) fortyTwo = struct.unpack(self._structChar + "H", a)[0] if fortyTwo != 42: raise IOError("Invalid TIFF version %d" % fortyTwo) else: if DEBUG: print("VALID TIFF VERSION") if sys.byteorder != fileOrder: swap = True else: swap = False else: if sys.byteorder == "little": self._structChar = '<' else: self._structChar = '>' swap = False self._swap = swap self._IFD = [] self._imageDataCacheIndex = [] self._imageDataCache = [] self._imageInfoCacheIndex = [] self._imageInfoCache = [] self.getImageFileDirectories(fd) def __makeSureFileIsOpen(self): if not self.fd.closed: return if DEBUG: print("Reopening closed file") fileName = self.fd.name if self._access is None: #we do not own the file #open in read mode newFile = open(fileName, 'rb') else: newFile = open(fileName, self._access) self.fd = newFile def __makeSureFileIsClosed(self): if self._access is None: #we do not own the file if DEBUG: print("Not closing not owned file") return if not self.fd.closed: self.fd.close() def getNumberOfImages(self): #update for the case someone has done anything? self._updateIFD() return len(self._IFD) def _updateIFD(self): self.__makeSureFileIsOpen() self.getImageFileDirectories() self.__makeSureFileIsClosed() def getImageFileDirectories(self, fd=None): if fd is None: fd = self.fd else: self.fd = fd st = self._structChar fd.seek(4) self._IFD = [] nImages = 0 fmt = st + 'I' inStr = fd.read(struct.calcsize(fmt)) if not len(inStr): offsetToIFD = 0 else: offsetToIFD = struct.unpack(fmt, inStr)[0] if DEBUG: print("Offset to first IFD = %d" % offsetToIFD) while offsetToIFD != 0: self._IFD.append(offsetToIFD) nImages += 1 fd.seek(offsetToIFD) fmt = st + 'H' numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] if DEBUG: print("Number of directory entries = %d" % numberOfDirectoryEntries) fmt = st + 'I' fd.seek(offsetToIFD + 2 + 12 * numberOfDirectoryEntries) offsetToIFD = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] if DEBUG: print("Next Offset to IFD = %d" % offsetToIFD) #offsetToIFD = 0 if DEBUG: print("Number of images found = %d" % nImages) return nImages def _parseImageFileDirectory(self, nImage): offsetToIFD = self._IFD[nImage] st = self._structChar fd = self.fd fd.seek(offsetToIFD) fmt = st + 'H' numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] if DEBUG: print("Number of directory entries = %d" % numberOfDirectoryEntries) fmt = st + 'HHI4s' tagIDList = [] fieldTypeList = [] nValuesList = [] valueOffsetList = [] for i in range(numberOfDirectoryEntries): tagID, fieldType, nValues, valueOffset = struct.unpack(fmt, fd.read(12)) tagIDList.append(tagID) fieldTypeList.append(fieldType) nValuesList.append(nValues) if nValues == 1: ftype, vfmt = FIELD_TYPE[fieldType] if ftype not in ['ASCII', 'RATIONAL', 'SRATIONAL']: vfmt = st + vfmt actualValue = struct.unpack(vfmt, valueOffset[0: struct.calcsize(vfmt)])[0] valueOffsetList.append(actualValue) else: valueOffsetList.append(valueOffset) elif (nValues < 5) and (fieldType == 2): ftype, vfmt = FIELD_TYPE[fieldType] vfmt = st + "%d%s" % (nValues, vfmt) actualValue = struct.unpack(vfmt, valueOffset[0: struct.calcsize(vfmt)])[0] valueOffsetList.append(actualValue) else: valueOffsetList.append(valueOffset) if DEBUG: if tagID in TAG_ID: print("tagID = %s" % TAG_ID[tagID]) else: print("tagID = %d" % tagID) print("fieldType = %s" % FIELD_TYPE[fieldType][0]) print("nValues = %d" % nValues) #if nValues == 1: # print("valueOffset = %s" % valueOffset) return tagIDList, fieldTypeList, nValuesList, valueOffsetList def _readIFDEntry(self, tag, tagIDList, fieldTypeList, nValuesList, valueOffsetList): fd = self.fd st = self._structChar idx = tagIDList.index(tag) nValues = nValuesList[idx] output = [] ftype, vfmt = FIELD_TYPE[fieldTypeList[idx]] vfmt = st + "%d%s" % (nValues, vfmt) requestedBytes = struct.calcsize(vfmt) if nValues == 1: output.append(valueOffsetList[idx]) elif requestedBytes < 5: output.append(valueOffsetList[idx]) else: offset = fd.seek(struct.unpack(st + "I", valueOffsetList[idx])[0]) output = struct.unpack(vfmt, fd.read(requestedBytes)) return output def getData(self, nImage, **kw): if nImage >= len(self._IFD): #update prior to raise an index error error self._updateIFD() return self._readImage(nImage, **kw) def getImage(self, nImage): return self.getData(nImage) def getInfo(self, nImage, **kw): if nImage >= len(self._IFD): #update prior to raise an index error error self._updateIFD() current = self._IFD[nImage] return self._readInfo(nImage) def _readInfo(self, nImage, close=True): if nImage in self._imageInfoCacheIndex: if DEBUG: print("Reading info from cache") return self._imageInfoCache[self._imageInfoCacheIndex.index(nImage)] #read the header self.__makeSureFileIsOpen() tagIDList, fieldTypeList, nValuesList, valueOffsetList = self._parseImageFileDirectory(nImage) #rows and columns nColumns = valueOffsetList[tagIDList.index(TAG_NUMBER_OF_COLUMNS)] nRows = valueOffsetList[tagIDList.index(TAG_NUMBER_OF_ROWS)] #bits per sample idx = tagIDList.index(TAG_BITS_PER_SAMPLE) nBits = valueOffsetList[idx] if nValuesList[idx] != 1: #this happens with RGB and friends, nBits is not a single value nBits = self._readIFDEntry(TAG_BITS_PER_SAMPLE, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if TAG_COLORMAP in tagIDList: idx = tagIDList.index(TAG_COLORMAP) tmpColormap = self._readIFDEntry(TAG_COLORMAP, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if max(tmpColormap) > 255: tmpColormap = numpy.array(tmpColormap, dtype=numpy.uint16) tmpColormap = (tmpColormap / 256.).astype(numpy.uint8) else: tmpColormap = numpy.array(tmpColormap, dtype=numpy.uint8) tmpColormap.shape = 3, -1 colormap = numpy.zeros((tmpColormap.shape[-1], 3), tmpColormap.dtype) colormap[:, :] = tmpColormap.T tmpColormap = None else: colormap = None #sample format if TAG_SAMPLE_FORMAT in tagIDList: sampleFormat = valueOffsetList[tagIDList.index(TAG_SAMPLE_FORMAT)] else: #set to unknown sampleFormat = SAMPLE_FORMAT_VOID # compression compression = False compression_type = 1 if TAG_COMPRESSION in tagIDList: compression_type = valueOffsetList[tagIDList.index(TAG_COMPRESSION)] if compression_type == 1: compression = False else: compression = True #photometric interpretation interpretation = 1 if TAG_PHOTOMETRIC_INTERPRETATION in tagIDList: interpretation = valueOffsetList[tagIDList.index(TAG_PHOTOMETRIC_INTERPRETATION)] else: print("WARNING: Non standard TIFF. Photometric interpretation TAG missing") helpString = "" if sys.version > '2.6': helpString = eval('b""') if TAG_IMAGE_DESCRIPTION in tagIDList: imageDescription = self._readIFDEntry(TAG_IMAGE_DESCRIPTION, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if type(imageDescription) in [type([1]), type((1,))]: imageDescription = helpString.join(imageDescription) else: imageDescription = "%d/%d" % (nImage + 1, len(self._IFD)) if sys.version < '3.0': defaultSoftware = "Unknown Software" else: defaultSoftware = bytes("Unknown Software", encoding='utf-8') if TAG_SOFTWARE in tagIDList: software = self._readIFDEntry(TAG_SOFTWARE, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if type(software) in [type([1]), type((1,))]: software = helpString.join(software) else: software = defaultSoftware if software == defaultSoftware: try: if sys.version < '3.0': if imageDescription.upper().startswith("IMAGEJ"): software = imageDescription.split("=")[0] else: tmpString = imageDescription.decode() if tmpString.upper().startswith("IMAGEJ"): software = bytes(tmpString.split("=")[0], encoding='utf-8') except: pass if TAG_DATE in tagIDList: date = self._readIFDEntry(TAG_DATE, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if type(date) in [type([1]), type((1,))]: date = helpString.join(date) else: date = "Unknown Date" stripOffsets = self._readIFDEntry(TAG_STRIP_OFFSETS, tagIDList, fieldTypeList, nValuesList, valueOffsetList) if TAG_ROWS_PER_STRIP in tagIDList: rowsPerStrip = self._readIFDEntry(TAG_ROWS_PER_STRIP, tagIDList, fieldTypeList, nValuesList, valueOffsetList)[0] else: rowsPerStrip = nRows print("WARNING: Non standard TIFF. Rows per strip TAG missing") if TAG_STRIP_BYTE_COUNTS in tagIDList: stripByteCounts = self._readIFDEntry(TAG_STRIP_BYTE_COUNTS, tagIDList, fieldTypeList, nValuesList, valueOffsetList) else: print("WARNING: Non standard TIFF. Strip byte counts TAG missing") if hasattr(nBits, 'index'): expectedSum = 0 for n in nBits: expectedSum += int(nRows * nColumns * n / 8) else: expectedSum = int(nRows * nColumns * nBits / 8) stripByteCounts = [expectedSum] if close: self.__makeSureFileIsClosed() if self._forceMonoOutput and (interpretation > 1): #color image but asked monochrome output nBits = 32 colormap = None sampleFormat = SAMPLE_FORMAT_FLOAT interpretation = 1 #we cannot rely on any cache in this case useInfoCache = False if DEBUG: print("FORCED MONO") else: useInfoCache = True info = {} info["nRows"] = nRows info["nColumns"] = nColumns info["nBits"] = nBits info["compression"] = compression info["compression_type"] = compression_type info["imageDescription"] = imageDescription info["stripOffsets"] = stripOffsets #This contains the file offsets to the data positions info["rowsPerStrip"] = rowsPerStrip info["stripByteCounts"] = stripByteCounts #bytes in strip since I do not support compression info["software"] = software info["date"] = date info["colormap"] = colormap info["sampleFormat"] = sampleFormat info["photometricInterpretation"] = interpretation infoDict = {} if sys.version < '3.0': testString = 'PyMca' else: testString = eval('b"PyMca"') if software.startswith(testString): #str to make sure python 2.x sees it as string and not unicode if sys.version < '3.0': descriptionString = imageDescription else: descriptionString = str(imageDescription.decode()) #interpret the image description in terms of supplied #information at writing time items = descriptionString.split('=') for i in range(int(len(items) / 2)): key = "%s" % items[i * 2] #get rid of the \n at the end of the value value = "%s" % items[i * 2 + 1][:-1] infoDict[key] = value info['info'] = infoDict if (self._maxImageCacheLength > 0) and useInfoCache: self._imageInfoCacheIndex.insert(0, nImage) self._imageInfoCache.insert(0, info) if len(self._imageInfoCacheIndex) > self._maxImageCacheLength: self._imageInfoCacheIndex = self._imageInfoCacheIndex[:self._maxImageCacheLength] self._imageInfoCache = self._imageInfoCache[:self._maxImageCacheLength] return info def _readImage(self, nImage, **kw): if DEBUG: print("Reading image %d" % nImage) if 'close' in kw: close = kw['close'] else: close = True rowMin = kw.get('rowMin', None) rowMax = kw.get('rowMax', None) if nImage in self._imageDataCacheIndex: if DEBUG: print("Reading image data from cache") return self._imageDataCache[self._imageDataCacheIndex.index(nImage)] self.__makeSureFileIsOpen() if self._forceMonoOutput: oldMono = True else: oldMono = False try: self._forceMonoOutput = False info = self._readInfo(nImage, close=False) self._forceMonoOutput = oldMono except: self._forceMonoOutput = oldMono raise compression = info['compression'] compression_type = info['compression_type'] if compression: if compression_type != 32773: raise IOError("Compressed TIFF images not supported except packbits") else: #PackBits compression if DEBUG: print("Using PackBits compression") interpretation = info["photometricInterpretation"] if interpretation == 2: #RGB pass #raise IOError("RGB Image. Only grayscale images supported") elif interpretation == 3: #Palette Color Image pass #raise IOError("Palette-color Image. Only grayscale images supported") elif interpretation > 2: #Palette Color Image raise IOError("Only grayscale images supported") nRows = info["nRows"] nColumns = info["nColumns"] nBits = info["nBits"] colormap = info["colormap"] sampleFormat = info["sampleFormat"] if rowMin is None: rowMin = 0 if rowMax is None: rowMax = nRows - 1 if rowMin < 0: rowMin = nRows - rowMin if rowMax < 0: rowMax = nRows - rowMax if rowMax < rowMin: txt = "Max Row smaller than Min Row. Reverse selection not supported" raise NotImplemented(txt) if rowMin >= nRows: raise IndexError("Image only has %d rows" % nRows) if rowMax >= nRows: raise IndexError("Image only has %d rows" % nRows) if sampleFormat == SAMPLE_FORMAT_FLOAT: if nBits == 32: dtype = numpy.float32 elif nBits == 64: dtype = numpy.float64 else: raise ValueError("Unsupported number of bits for a float: %d" % nBits) elif sampleFormat in [SAMPLE_FORMAT_UINT, SAMPLE_FORMAT_VOID]: if nBits in [8, (8, 8, 8), [8, 8, 8]]: dtype = numpy.uint8 elif nBits in [16, (16, 16, 16), [16, 16, 16]]: dtype = numpy.uint16 elif nBits in [32, (32, 32, 32), [32, 32, 32]]: dtype = numpy.uint32 elif nBits in [64, (64, 64, 64), [64, 64, 64]]: dtype = numpy.uint64 else: raise ValueError("Unsupported number of bits for unsigned int: %s" % (nBits,)) elif sampleFormat == SAMPLE_FORMAT_INT: if nBits in [8, (8, 8, 8), [8, 8, 8]]: dtype = numpy.int8 elif nBits in [16, (16, 16, 16), [16, 16, 16]]: dtype = numpy.int16 elif nBits in [32, (32, 32, 32), [32, 32, 32]]: dtype = numpy.int32 elif nBits in [64, (64, 64, 64), [64, 64, 64]]: dtype = numpy.int64 else: raise ValueError("Unsupported number of bits for signed int: %s" % (nBits,)) else: raise ValueError("Unsupported combination. Bits = %s Format = %d" % (nBits, sampleFormat)) if hasattr(nBits, 'index'): image = numpy.zeros((nRows, nColumns, len(nBits)), dtype=dtype) elif colormap is not None: #should I use colormap dtype? image = numpy.zeros((nRows, nColumns, 3), dtype=dtype) else: image = numpy.zeros((nRows, nColumns), dtype=dtype) fd = self.fd st = self._structChar stripOffsets = info["stripOffsets"] #This contains the file offsets to the data positions rowsPerStrip = info["rowsPerStrip"] stripByteCounts = info["stripByteCounts"] #bytes in strip since I do not support compression rowStart = 0 if len(stripOffsets) == 1: bytesPerRow = int(stripByteCounts[0] / rowsPerStrip) fd.seek(stripOffsets[0] + rowMin * bytesPerRow) nBytes = (rowMax - rowMin + 1) * bytesPerRow if self._swap: readout = numpy.fromstring(fd.read(nBytes), dtype).byteswap() else: readout = numpy.fromstring(fd.read(nBytes), dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif info['colormap'] is not None: readout = colormap[readout] else: readout.shape = -1, nColumns image[rowMin:rowMax + 1, :] = readout else: for i in range(len(stripOffsets)): #the amount of rows nRowsToRead = rowsPerStrip rowEnd = int(min(rowStart + nRowsToRead, nRows)) if rowEnd < rowMin: rowStart += nRowsToRead continue if (rowStart > rowMax): break #we are in position fd.seek(stripOffsets[i]) #the amount of bytes to read nBytes = stripByteCounts[i] if compression_type == 32773: try: bufferBytes = bytes() except: #python 2.5 ... bufferBytes = "" #packBits readBytes = 0 #intermediate buffer tmpBuffer = fd.read(nBytes) while readBytes < nBytes: n = struct.unpack('b', tmpBuffer[readBytes:(readBytes + 1)])[0] readBytes += 1 if n >= 0: #should I prevent reading more than the #length of the chain? Let's python raise #the exception... bufferBytes += tmpBuffer[readBytes:\ readBytes + (n + 1)] readBytes += (n + 1) elif n > -128: bufferBytes += (-n + 1) * tmpBuffer[readBytes:(readBytes + 1)] readBytes += 1 else: #if read -128 ignore the byte continue if self._swap: readout = numpy.fromstring(bufferBytes, dtype).byteswap() else: readout = numpy.fromstring(bufferBytes, dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif info['colormap'] is not None: readout = colormap[readout] readout.shape = -1, nColumns, 3 else: readout.shape = -1, nColumns image[rowStart:rowEnd, :] = readout else: if 1: #use numpy if self._swap: readout = numpy.fromstring(fd.read(nBytes), dtype).byteswap() else: readout = numpy.fromstring(fd.read(nBytes), dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif colormap is not None: readout = colormap[readout] readout.shape = -1, nColumns, 3 else: readout.shape = -1, nColumns image[rowStart:rowEnd, :] = readout else: #using struct readout = numpy.array(struct.unpack(st + "%df" % int(nBytes / 4), fd.read(nBytes)), dtype=dtype) if hasattr(nBits, 'index'): readout.shape = -1, nColumns, len(nBits) elif colormap is not None: readout = colormap[readout] readout.shape = -1, nColumns, 3 else: readout.shape = -1, nColumns image[rowStart:rowEnd, :] = readout rowStart += nRowsToRead if close: self.__makeSureFileIsClosed() if len(image.shape) == 3: #color image if self._forceMonoOutput: #color image, convert to monochrome image = (image[:, :, 0] * 0.114 + \ image[:, :, 1] * 0.587 + \ image[:, :, 2] * 0.299).astype(numpy.float32) if (rowMin == 0) and (rowMax == (nRows - 1)): self._imageDataCacheIndex.insert(0, nImage) self._imageDataCache.insert(0, image) if len(self._imageDataCacheIndex) > self._maxImageCacheLength: self._imageDataCacheIndex = self._imageDataCacheIndex[:self._maxImageCacheLength] self._imageDataCache = self._imageDataCache[:self._maxImageCacheLength] return image def writeImage(self, image0, info=None, software=None, date=None): if software is None: software = 'PyMca.TiffIO' #if date is None: # date = time.ctime() self.__makeSureFileIsOpen() fd = self.fd #prior to do anything, perform some tests if not len(image0.shape): raise ValueError("Empty image") if len(image0.shape) == 1: #get a different view image = image0[:] image.shape = 1, -1 else: image = image0 if image.dtype == numpy.float64: image = image.astype(numpy.float32) fd.seek(0) mode = fd.mode name = fd.name if 'w' in mode: #we have to overwrite the file self.__makeSureFileIsClosed() fd = None if os.path.exists(name): os.remove(name) fd = open(name, mode='wb+') self._initEmptyFile(fd) self.fd = fd #read the file size self.__makeSureFileIsOpen() fd = self.fd fd.seek(0, os.SEEK_END) endOfFile = fd.tell() if fd.tell() == 0: self._initEmptyFile(fd) fd.seek(0, os.SEEK_END) endOfFile = fd.tell() #init internal variables self._initInternalVariables(fd) st = self._structChar #get the image file directories nImages = self.getImageFileDirectories() if DEBUG: print("File contains %d images" % nImages) if nImages == 0: fd.seek(4) fmt = st + 'I' fd.write(struct.pack(fmt, endOfFile)) else: fd.seek(self._IFD[-1]) fmt = st + 'H' numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] fmt = st + 'I' pos = self._IFD[-1] + 2 + 12 * numberOfDirectoryEntries fd.seek(pos) fmt = st + 'I' fd.write(struct.pack(fmt, endOfFile)) fd.flush() #and we can write at the end of the file, find out the file length fd.seek(0, os.SEEK_END) #get the description information from the input information if info is None: description = info else: description = "%s" % "" for key in info.keys(): description += "%s=%s\n" % (key, info[key]) #get the image file directory outputIFD = self._getOutputIFD(image, description=description, software=software, date=date) #write the new IFD fd.write(outputIFD) #write the image if self._swap: fd.write(image.byteswap().tostring()) else: fd.write(image.tostring()) fd.flush() self.fd = fd self.__makeSureFileIsClosed() def _initEmptyFile(self, fd=None): if fd is None: fd = self.fd if sys.byteorder == "little": order = "II" #intel, little endian fileOrder = "little" self._structChar = '<' else: order = "MM" #motorola, high endian fileOrder = "big" self._structChar = '>' st = self._structChar if fileOrder == sys.byteorder: self._swap = False else: self._swap = True fd.seek(0) if sys.version < '3.0': fd.write(struct.pack(st + '2s', order)) fd.write(struct.pack(st + 'H', 42)) fd.write(struct.pack(st + 'I', 0)) else: fd.write(struct.pack(st + '2s', bytes(order, 'utf-8'))) fd.write(struct.pack(st + 'H', 42)) fd.write(struct.pack(st + 'I', 0)) fd.flush() def _getOutputIFD(self, image, description=None, software=None, date=None): #the tags have to be in order #the very minimum is #256:"NumberOfColumns", # S or L ImageWidth #257:"NumberOfRows", # S or L ImageHeight #258:"BitsPerSample", # S Number of bits per component #259:"Compression", # SHORT (1 - NoCompression, ... #262:"PhotometricInterpretation", # SHORT (0 - WhiteIsZero, 1 -BlackIsZero, 2 - RGB, 3 - Palette color #270:"ImageDescription", # ASCII #273:"StripOffsets", # S or L, for each strip, the byte offset of the strip #278:"RowsPerStrip", # S or L, number of rows in each back may be not for the last #279:"StripByteCounts", # S or L, The number of bytes in the strip AFTER any compression #305:"Software", # ASCII #306:"Date", # ASCII #339:"SampleFormat", # SHORT Interpretation of data in each pixel nDirectoryEntries = 9 imageDescription = None if description is not None: descriptionLength = len(description) while descriptionLength < 4: description = description + " " descriptionLength = len(description) if sys.version >= '3.0': description = bytes(description, 'utf-8') elif type(description) != type(""): try: description = description.decode('utf-8') except UnicodeDecodeError: try: description = description.decode('latin-1') except UnicodeDecodeError: description = "%s" % description if sys.version > '2.6': description = description.encode('utf-8', errors="ignore") description = "%s" % description descriptionLength = len(description) imageDescription = struct.pack("%ds" % descriptionLength, description) nDirectoryEntries += 1 #software if software is not None: softwareLength = len(software) while softwareLength < 4: software = software + " " softwareLength = len(software) if sys.version >= '3.0': software = bytes(software, 'utf-8') softwarePackedString = struct.pack("%ds" % softwareLength, software) nDirectoryEntries += 1 else: softwareLength = 0 if date is not None: dateLength = len(date) if sys.version >= '3.0': date = bytes(date, 'utf-8') datePackedString = struct.pack("%ds" % dateLength, date) dateLength = len(datePackedString) nDirectoryEntries += 1 else: dateLength = 0 nRows, nColumns = image.shape dtype = image.dtype bitsPerSample = int(dtype.str[-1]) * 8 #only uncompressed data compression = 1 #interpretation, black is zero interpretation = 1 #image description if imageDescription is not None: descriptionLength = len(imageDescription) else: descriptionLength = 0 #strip offsets #we are putting them after the directory and the directory is #at the end of the file self.fd.seek(0, os.SEEK_END) endOfFile = self.fd.tell() if endOfFile == 0: #empty file endOfFile = 8 #rows per strip if ALLOW_MULTIPLE_STRIPS: #try to segment the image in several pieces if not (nRows % 4): rowsPerStrip = int(nRows / 4) elif not (nRows % 10): rowsPerStrip = int(nRows / 10) elif not (nRows % 8): rowsPerStrip = int(nRows / 8) elif not (nRows % 4): rowsPerStrip = int(nRows / 4) elif not (nRows % 2): rowsPerStrip = int(nRows / 2) else: rowsPerStrip = nRows else: rowsPerStrip = nRows #stripByteCounts stripByteCounts = int(nColumns * rowsPerStrip * bitsPerSample / 8) if descriptionLength > 4: stripOffsets0 = endOfFile + dateLength + descriptionLength + \ 2 + 12 * nDirectoryEntries + 4 else: stripOffsets0 = endOfFile + dateLength + \ 2 + 12 * nDirectoryEntries + 4 if softwareLength > 4: stripOffsets0 += softwareLength stripOffsets = [stripOffsets0] stripOffsetsLength = 0 stripOffsetsString = None st = self._structChar if rowsPerStrip != nRows: nStripOffsets = int(nRows / rowsPerStrip) fmt = st + 'I' stripOffsetsLength = struct.calcsize(fmt) * nStripOffsets stripOffsets0 += stripOffsetsLength #the length for the stripByteCounts will be the same stripOffsets0 += stripOffsetsLength stripOffsets = [] for i in range(nStripOffsets): value = stripOffsets0 + i * stripByteCounts stripOffsets.append(value) if i == 0: stripOffsetsString = struct.pack(fmt, value) stripByteCountsString = struct.pack(fmt, stripByteCounts) else: stripOffsetsString += struct.pack(fmt, value) stripByteCountsString += struct.pack(fmt, stripByteCounts) if DEBUG: print("IMAGE WILL START AT %d" % stripOffsets[0]) #sample format if dtype in [numpy.float32, numpy.float64] or\ dtype.str[-2] == 'f': sampleFormat = SAMPLE_FORMAT_FLOAT elif dtype in [numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64]: sampleFormat = SAMPLE_FORMAT_UINT elif dtype in [numpy.int8, numpy.int16, numpy.int32, numpy.int64]: sampleFormat = SAMPLE_FORMAT_INT else: raise ValueError("Unsupported data type %s" % dtype) info = {} info["nColumns"] = nColumns info["nRows"] = nRows info["nBits"] = bitsPerSample info["compression"] = compression info["photometricInterpretation"] = interpretation info["stripOffsets"] = stripOffsets info["rowsPerStrip"] = rowsPerStrip info["stripByteCounts"] = stripByteCounts info["date"] = date info["sampleFormat"] = sampleFormat outputIFD = "" if sys.version > '2.6': outputIFD = eval('b""') fmt = st + "H" outputIFD += struct.pack(fmt, nDirectoryEntries) fmt = st + "HHII" outputIFD += struct.pack(fmt, TAG_NUMBER_OF_COLUMNS, FIELD_TYPE_OUT['I'], 1, info["nColumns"]) outputIFD += struct.pack(fmt, TAG_NUMBER_OF_ROWS, FIELD_TYPE_OUT['I'], 1, info["nRows"]) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_BITS_PER_SAMPLE, FIELD_TYPE_OUT['H'], 1, info["nBits"], 0) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_COMPRESSION, FIELD_TYPE_OUT['H'], 1, info["compression"], 0) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_PHOTOMETRIC_INTERPRETATION, FIELD_TYPE_OUT['H'], 1, info["photometricInterpretation"], 0) if imageDescription is not None: descriptionLength = len(imageDescription) if descriptionLength > 4: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_IMAGE_DESCRIPTION, FIELD_TYPE_OUT['s'], descriptionLength, info["stripOffsets"][0] - \ 2 * stripOffsetsLength - \ descriptionLength) else: #it has to have length 4 fmt = st + 'HHI%ds' % descriptionLength outputIFD += struct.pack(fmt, TAG_IMAGE_DESCRIPTION, FIELD_TYPE_OUT['s'], descriptionLength, description) if len(stripOffsets) == 1: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_OFFSETS, FIELD_TYPE_OUT['I'], 1, info["stripOffsets"][0]) else: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_OFFSETS, FIELD_TYPE_OUT['I'], len(stripOffsets), info["stripOffsets"][0] - 2 * stripOffsetsLength) fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_ROWS_PER_STRIP, FIELD_TYPE_OUT['I'], 1, info["rowsPerStrip"]) if len(stripOffsets) == 1: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_BYTE_COUNTS, FIELD_TYPE_OUT['I'], 1, info["stripByteCounts"]) else: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_STRIP_BYTE_COUNTS, FIELD_TYPE_OUT['I'], len(stripOffsets), info["stripOffsets"][0] - stripOffsetsLength) if software is not None: if softwareLength > 4: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_SOFTWARE, FIELD_TYPE_OUT['s'], softwareLength, info["stripOffsets"][0] - \ 2 * stripOffsetsLength - \ descriptionLength - softwareLength - dateLength) else: #it has to have length 4 fmt = st + 'HHI%ds' % softwareLength outputIFD += struct.pack(fmt, TAG_SOFTWARE, FIELD_TYPE_OUT['s'], softwareLength, softwarePackedString) if date is not None: fmt = st + 'HHII' outputIFD += struct.pack(fmt, TAG_DATE, FIELD_TYPE_OUT['s'], dateLength, info["stripOffsets"][0] - \ 2 * stripOffsetsLength - \ descriptionLength - dateLength) fmt = st + 'HHIHH' outputIFD += struct.pack(fmt, TAG_SAMPLE_FORMAT, FIELD_TYPE_OUT['H'], 1, info["sampleFormat"], 0) fmt = st + 'I' outputIFD += struct.pack(fmt, 0) if softwareLength > 4: outputIFD += softwarePackedString if date is not None: outputIFD += datePackedString if imageDescription is not None: if descriptionLength > 4: outputIFD += imageDescription if stripOffsetsString is not None: outputIFD += stripOffsetsString outputIFD += stripByteCountsString return outputIFD if __name__ == "__main__": filename = sys.argv[1] dtype = numpy.uint16 if not os.path.exists(filename): print("Testing file creation") tif = TiffIO(filename, mode='wb+') data = numpy.arange(10000).astype(dtype) data.shape = 100, 100 tif.writeImage(data, info={'Title':'1st'}) tif = None if os.path.exists(filename): print("Testing image appending") tif = TiffIO(filename, mode='rb+') tif.writeImage((data * 2).astype(dtype), info={'Title':'2nd'}) tif = None tif = TiffIO(filename) print("Number of images = %d" % tif.getNumberOfImages()) for i in range(tif.getNumberOfImages()): info = tif.getInfo(i) for key in info: if key not in ["colormap"]: print("%s = %s" % (key, info[key])) elif info['colormap'] is not None: print("RED %s = %s" % (key, info[key][0:10, 0])) print("GREEN %s = %s" % (key, info[key][0:10, 1])) print("BLUE %s = %s" % (key, info[key][0:10, 2])) data = tif.getImage(i)[0, 0:10] print("data [0, 0:10] = ", data) fabio-0.1.3/fabio-src/brukerimage.py0000644000175000017500000004762512233175220020106 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 from __future__ import with_statement __doc__ = """ Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk Based on: openbruker,readbruker, readbrukerheader functions in the opendata module of ImageD11 written by Jon Wright, ESRF, Grenoble, France Writer by Jérôme Kieffer, ESRF, Grenoble, France """ __authors__ = ["Henning O. Sorensen" , "Erik Knudsen", "Jon Wright", "Jérôme Kieffer"] __date__ = "20130502" __status__ = "development" __copyright__ = "2007-2009 Risoe National Laboratory; 2010-2013 ESRF" __licence__ = "GPL" import numpy, logging, sys from math import ceil import os, getpass, time logger = logging.getLogger("brukerimage") from fabioimage import fabioimage from fabioutils import pad from types import StringTypes if sys.version_info[0] < 3: bytes = str class brukerimage(fabioimage): """ Read and eventually write ID11 bruker (eg smart6500) images TODO: int32 -> float32 conversion according to the "linear" keyword. This is done and works but we need to check with other program that we are appliing the right formula and not the reciprocal one. """ bpp_to_numpy = {1:numpy.uint8, 2:numpy.uint16, 4:numpy.uint32} # needed if you feel like writing - see ImageD11/scripts/edf2bruker.py SPACER = "\x1a\x04" #this is CTRL-Z CTRL-D HEADERS_KEYS = ["FORMAT", #Frame format. Always “86†or "100" for Bruker-format frames. "VERSION", #Header version #, such as: 1 to 17 (6 is obsolete). "HDRBLKS", #Header size in 512-byte blocks, such as 10 or 15. Determines where the image block begins. "TYPE", #String indicating kind of data in the frame. Used to determine if a spatial correction table was applied to the frame imag "SITE", #Site name "MODEL", #Diffractometer model "USER", #Username "SAMPLE", #Sample ID, "SETNAME", #Basic data set name "RUN", #Run number within the data set, usually starts at 0, but 1 for APEX2. "SAMPNUM", #Specimen number within the data set "TITLE", #User comments (8 lines) "NCOUNTS", #Total frame counts "NOVERFL", #Number of overflows when compression frame. "MINIMUM", #Minimum counts in a pixel (uncompressed value) "MAXIMUM", #Maximum counts in a pixel (uncompressed value) "NONTIME", #Number of on-time events "NLATE", #Number of late events. Always zero for many detectors. "FILENAM", #(Original) frame filename "CREATED", #Date and time of creation "CUMULAT", #Accumulated frame exposure time in seconds "ELAPSDR", #Requested time for last exposure in seconds "ELAPSDA", #Actual time for last exposure in seconds. "OSCILLA", #Nonzero if acquired by oscillation "NSTEPS", #steps or oscillations in this frame "RANGE", #Scan range in decimal degrees (unsigned) "START", #Starting scan angle value, decimal degrees "INCREME", #Scan angle increment between frames (signed) "NUMBER", #Sequence number of this frame in series, usually starts at 0, but 1 for APEX2 "NFRAMES", #Total number of frames in the series "ANGLES", #Diffractometer angles in Eulerian space ( 2T, OM, PH, CH). "NOVER64", #Number of pixels > 64K (actually LinearThreshold value) "NPIXELB", #Number of bytes/pixel, such as 1, 2, or 4. "NROWS", #Number of rasters in frame, such as 512, 1024, 2048, or 4096 "NCOLS", #Number of pixels/raster, such as 512, 1024, 2048 or 4096 "WORDORD", #Order of bytes in word (0=LSB first) "LONGORD", #Order of words in a longword (0=LSW first) "TARGET" , #X-ray target material: Cu, Mo, Ag, Fe, Cr, Co, Ni, W, Mn, or other. "SOURCEK", #X-ray source voltage in kV "SOURCEM", #X-ray source current in mA "FILTER" , #Filter/monochromator setting: Such as: Parallel, graphite, Ni Filter, C Filter, Zr Filter,Cross coupled Goebel Mirrors ... "CELL" , #Unit cell A,B,C,ALPHA,BETA,GAMMA "MATRIX" , #9R Orientation matrix (P3 conventions) "LOWTEMP", #Low temp flag. "TEMP", #set temperature "HITEMP", #Acquired at high temperature "ZOOM" , #Zoom: Xc, Yc, Mag used for HI-STAR detectors: 0.5 0.5 1.0 "CENTER" , #X, Y of direct beam at 2-theta = 0. These are raw center for raw frames and unwarped center for unwarped frames. "DISTANC", #Sample-detector distance, cm (see CmToGrid value) Adds: Sample-detector grid/phosphor distance, cm "TRAILER", #Byte pointer to trailer info "COMPRES", #Compression scheme ID, if any. Such as: NONE, LINEAR (Linear scale, offset for pixel values, typically 1.0, 0.0). "LINEAR", #Linear scale (1.0 0.0 for no change; 0.1 0 for divided by 10...) "PHD" , # Discriminator: Pulse height settings. X100 and X1000 only. Stores CCD phosphor efficiency (first field). "PREAMP" , #Preamp gain setting. X100 and X1000 only. SMART: Stores Roper CCD gain table index value. "CORRECT", #Flood table correction filename, UNKNOWN or LINEAR. "WARPFIL", #Brass plate correction filename, UNKNOWN or LINEAR. Note: A filename here does NOT mean that spatial correction was performed. See TYPE and string “UNWARP†to determine that. "WAVELEN", #Wavelengths (average, a1, a2) "MAXXY", #X,Y pixel # of maximum counts (from lower corner of 0,0) "AXIS", #Scan axis ib Eulerian space (1-4 for 2-theta, omega, phi, chi) (0 =none, 2 = default). "ENDING" , #Actual goniometer angles at end of frame in Eulerian space. "DETPAR" , #Detector position corrections (dX,dY,dDist,Pitch,Roll,Yaw) "LUT", #Recommended display lookup table "DISPLIM", #Recommended display limits "PROGRAM", #Name and version of program writing frame, such as: "ROTATE", #Non zero if acquired by rotation of phi during scan (or oscilate) "BITMASK", #File name of active pixel mask associated with this frame or $NULL "OCTMASK", #Octagon mask parameters to use if BITMASK=$null. Min X, Min X+Y, Min Y, Max X-Y, Max X, Max X+Y, Max Y, Max Y-X. "ESDCELL", #Unit cell parameter standard deviations "DETTYPE", #Detector or CCD chip type (as displayed on CEU). Default is MULTIWIRE but UNKNOWN is advised, can contain PIXPERCM: CMTOGRID: "NEXP", #Number of exposures: 1=single, 2=correlated sum.32 for most ccds, and 64 for 2K ccds. "CCDPARM", #CCD parameters: readnoise, e/ADU, e/photon, bias, full scale "BIS", #Potential full linear scale if rescan and attenuator used. "CHEM", #Chemical formula in CIFTAB string, such as “?†"MORPH", #Crystal morphology in CIFTAB string, such as “?†"CCOLOR", #Crystal color in CIFTAB string, such as “?†"CSIZE", #Crystal dimensions (3 ea) in CIFTAB string, such as “?†"DNSMET", #Density measurement method in CIFTAB string, such as “?†"DARK", #Name of dark current correction or NONE. "AUTORNG", #Auto-ranging: gain, high-speed time, scale, offset, full linear scale Note: If full linear scale is zero, then CCDPARM full scale is the full linear scale (BIS frames). "ZEROADJ", #Goniometer zero corrections (refined in least squares) "XTRANS", #Crystal XYZ translations (refined in least squares) "HKL&XY", #HKL and pixel XY for reciprocal space scan. GADDS only. "AXES2", #Diffractometer setting linear axes (4 ea). (X, Y, Z, Aux) "ENDING2", #Actual goniometer linear axes @ end of frame. (X, Y, Z, Aux) "FILTER2", #Monochromator 2-theta angle and monochromator roll angle. v15: Adds beam tilt angle and attenuator factor. "LEPTOS", # String for LEPTOS. "CFR", #Only in 21CFRPart11 mode, writes the checksum for header and image (2str).] ] def __init__(self, data=None , header=None): fabioimage.__init__(self, data, header) self.__bpp_file = None self.version = 86 self.__headerstring__ = "" def _readheader(self, infile): """ The bruker format uses 80 char lines in key : value format In the first 512*5 bytes of the header there should be a HDRBLKS key, whose value denotes how many 512 byte blocks are in the total header. The header is always n*5*512 bytes, otherwise it wont contain whole key: value pairs """ line = 80 blocksize = 512 nhdrblks = 5 #by default we always read 5 blocks of 512 self.__headerstring__ = infile.read(blocksize * nhdrblks) self.header = {} for i in range(0, nhdrblks * blocksize, line): if self.__headerstring__[i: i + line].find(":") > 0: key, val = self.__headerstring__[i: i + line].split(":", 1) key = key.strip() # remove the whitespace (why?) val = val.strip() if key in self.header: # append lines if key already there self.header[key] = self.header[key] + os.linesep + val else: self.header[key] = val self.header_keys.append(key) # we must have read this in the first 5*512 bytes. nhdrblks = int(self.header['HDRBLKS']) # Now read in the rest of the header blocks, appending self.__headerstring__ += infile.read(blocksize * (nhdrblks - 5)) for i in range(5 * blocksize, nhdrblks * blocksize, line): if self.__headerstring__[i: i + line].find(":") > 0: # as for first 512 bytes of header key, val = self.__headerstring__[i: i + line].split(":", 1) key = key.strip() val = val.strip() if key in self.header: self.header[key] = self.header[key] + os.linesep + val else: self.header[key] = val self.header_keys.append(key) # make a (new) header item called "datastart" self.header['datastart'] = blocksize * nhdrblks #set the image dimensions self.dim1 = int(self.header['NROWS']) self.dim2 = int(self.header['NCOLS']) def read(self, fname, frame=None): """ Read in and unpack the pixels (including overflow table """ infile = self._open(fname, "rb") try: self._readheader(infile) except: raise rows = self.dim1 cols = self.dim2 try: # you had to read the Bruker docs to know this! npixelb = int(self.header['NPIXELB']) except Exception: errmsg = "length " + str(len(self.header['NPIXELB'])) + "\n" for byt in self.header['NPIXELB']: errmsg += "char: " + str(byt) + " " + str(ord(byt)) + "\n" logger.warning(errmsg) raise RuntimeError(errmsg) data = numpy.fromstring(infile.read(rows * cols * npixelb), dtype=self.bpp_to_numpy[npixelb]) #handle overflows nov = int(self.header['NOVERFL']) if nov > 0: # Read in the overflows # need at least int32 sized data I guess - can reach 2^21 data = data.astype(numpy.uint32) # 16 character overflows: # 9 characters of intensity # 7 character position for i in range(nov): ovfl = infile.read(16) intensity = int(ovfl[0: 9]) position = int(ovfl[9: 16]) data[position] = intensity infile.close() # Handle Float images ... if "LINEAR" in self.header: try: slope, offset = self.header["LINEAR"].split(None, 1) slope = float(slope) offset = float(offset) except Except: logger.warning("Error in converting to float data with linear parameter: %s" % self.header["LINEAR"]) self.data = data else: if slope == 1 and offset == 0: self.data = data else: #TODO: check that the formula is OK, not reverted. logger.warning("performing correction with slope=%s, offset=%s (LINEAR=%s)" % (slope, offset, self.header["LINEAR"])) self.data = (data * slope + offset).astype(numpy.float32) else: self.data = data self.data.shape = self.dim1, self.dim2 self.resetvals() self.pilimage = None return self def write(self, fname): """ Write a bruker image """ if numpy.issubdtype(self.data.dtype, float): if "LINEAR" in self.header: try: slope, offset = self.header["LINEAR"].split(None, 1) slope = float(slope) offset = float(offset) except Except: logger.warning("Error in converting to float data with linear parameter: %s" % self.header["LINEAR"]) slope, offset = 1.0, 0.0 else: offset = self.data.min() max_data = self.data.max() max_range = 2 ** 24 - 1 #similar to the mantissa of a float32 if max_data > offset: slope = (max_data - offset) / float(max_range) else: slope = 1.0 tmp_data = numpy.round(((self.data - offset) / slope)).astype(numpy.uint32) self.header["LINEAR"] = "%s %s" % (slope, offset) else: tmp_data = self.data bpp = self.calc_bpp(tmp_data) self.basic_translate(fname) limit = 2 ** (8 * bpp) - 1 data = tmp_data.astype(self.bpp_to_numpy[bpp]) reset = numpy.where(tmp_data >= limit) data[reset] = limit data = data.newbyteorder("<") #Bruker enforces little endian with self._open(fname, "wb") as bruker: bruker.write(self.gen_header()) bruker.write(data.tostring()) bruker.write(self.gen_overflow()) def calc_bpp(self, data=None, max_entry=4096): """ Calculate the number of byte per pixel to get an optimal overflow table. @return: byte per pixel """ if data is None: data = self.data if self.__bpp_file is None: for i in [1, 2]: overflown = (data >= (2 ** (8 * i) - 1)) if overflown.sum() < max_entry: self.__bpp_file = i break else: self.__bpp_file = 4 return self.__bpp_file def gen_header(self): """ Generate headers (with some magic and guesses) @param format can be 86 or 100 """ headers = [] for key in self.HEADERS_KEYS: if key in self.header: value = self.header[key] line = key.ljust(7) + ":" if type(value) in StringTypes: if os.linesep in value: lines = value.split(os.linesep) for i in lines[:-1] : headers.append((line + bytes(i)).ljust(80, " ")) line = key.ljust(7) + ":" line += bytes(lines[-1]) elif len(value) < 72: line += bytes(value) else: for i in range(len(value) // 72): headers.append((line + bytes(value[72 * i:72 * (i + 1)]))) line = key.ljust(7) + ":" line += value[72 * (i + 1):] elif "__len__" in dir(value): f = "\%.%is" % 72 // len(value) - 1 line += " ".join([f % i for i in value]) else: line += bytes(value) headers.append(line.ljust(80, " ")) header = "".join(headers) if len(header) > 512 * self.header["HDRBLKS"]: tmp = ceil(len(header) / 512.0) self.header["HDRBLKS"] = int(ceil(tmp / 5.0) * 5.0) for i in range(len(headers)): if headers[i].startswith("HDRBLKS"): headers[i] = headers.append(("HDRBLKS:%s" % self.header["HDRBLKS"]).ljust(80, " ")) res = pad("".join(headers), self.SPACER + "."*78, 512 * int(self.header["HDRBLKS"])) return res def gen_overflow(self): """ Generate an overflow table """ limit = 2 ** (8 * self.calc_bpp()) - 1 flat = self.data.ravel() #flat memory view overflow_pos = numpy.where(flat >= limit)[0] #list of indexes overflow_val = flat[overflow_pos] overflow = "".join(["%09i%07i" % (val, pos) for pos, val in zip(overflow_pos, overflow_val)]) return pad(overflow, ".", 512) def basic_translate(self, fname=None): """ Does some basic population of the headers so that the writing is possible """ if not "FORMAT" in self.header: self.header["FORMAT"] = "86" if not "HDRBLKS" in self.header: self.header["HDRBLKS"] = 5 if not "TYPE" in self.header: self.header["TYPE"] = "UNWARPED" if not "USER" in self.header: self.header["USER"] = getpass.getuser() if not "FILENAM" in self.header: self.header["FILENAM"] = "%s" % fname if not "CREATED" in self.header: self.header["CREATED"] = time.ctime() if not "NOVERFL" in self.header: self.header["NOVERFL"] = "0" # if not "NPIXELB" in self.header: self.header["NPIXELB"] = self.calc_bpp() #if not "NROWS" in self.header: self.header["NROWS"] = self.data.shape[0] #if not "NCOLS" in self.header: self.header["NCOLS"] = self.data.shape[1] if not "WORDORD" in self.header: self.header["WORDORD"] = "0" if not "LONGORD" in self.header: self.header["LONGORD"] = "0" def test(): """ a testcase """ import sys, time img = brukerimage() start = time.clock() for filename in sys.argv[1:]: img.read(filename) res = img.toPIL16() img.rebin(2, 2) print(filename + (": max=%d, min=%d, mean=%.2e, stddev=%.2e") % ( img.getmax(), img.getmin(), img.getmean(), img.getstddev())) print('integrated intensity (%d %d %d %d) =%.3f' % ( 10, 20, 20, 40, img.integrate_area((10, 20, 20, 40)))) end = time.clock() print (end - start) if __name__ == '__main__': test() fabio-0.1.3/fabio-src/__init__.py0000644000175000017500000000131112233175156017336 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ FabIO module """ __author__ = "Jérôme Kieffer" __contact__ = "Jerome.Kieffer@ESRF.eu" __license__ = "GPLv3+" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" __date__ = "30/04/2013" __status__ = "stable" version = "0.1.3" import logging logging.basicConfig() import fabioimage import openimage from fabioutils import COMPRESSORS, jump_filename, FilenameObject, \ previous_filename, next_filename, deconstruct_filename, \ extract_filenumber, getnum, construct_filename # Compatibility with outside world: filename_object = FilenameObject from openimage import openimage as open from openimage import openheader as openheader fabio-0.1.3/fabio-src/fabioimage.py0000644000175000017500000004614312233175220017666 0ustar jeromejerome00000000000000#!/usr/bin/env python """ Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk and Jon Wright, Jerome Kieffer: ESRF """ from __future__ import with_statement import os, types, logging, sys, tempfile logger = logging.getLogger("fabioimage") import numpy try: from PIL import Image except ImportError: logger.warning("PIL is not installed ... trying to do without") Image = None import fabioutils, converters class fabioimage(object): """ A common object for images in fable Contains a numpy array (.data) and dict of meta data (.header) """ _need_a_seek_to_read = False _need_a_real_file = False def __init__(self, data=None , header=None): """ Set up initial values """ self._classname = None if type(data) in types.StringTypes: raise Exception("fabioimage.__init__ bad argument - " + \ "data should be numpy array") self.data = self.checkData(data) self.pilimage = None if header is None: self.header = {} else: self.header = self.checkHeader(header) self.header_keys = self.header.keys() # holds key ordering if self.data is not None: self.dim2, self.dim1 = self.data.shape else: self.dim1 = self.dim2 = 0 self.bytecode = None # numpy typecode self.bpp = 2 # bytes per pixel # cache for image statistics self.mean = self.maxval = self.stddev = self.minval = None # Cache roi self.roi = None self.area_sum = None self.slice = None # New for multiframe files self.nframes = 1 self.currentframe = 0 self.filename = None self.filenumber = None @staticmethod def checkHeader(header=None): """ Empty for fabioimage but may be populated by others classes """ if header is None: return {} else: return header @staticmethod def checkData(data=None): """ Empty for fabioimage but may be populated by others classes, especially for format accepting only integers """ return data def getclassname(self): """ Retrieves the name of the class @return: the name of the class """ if self._classname is None: self._classname = str(self.__class__).replace("", "").split(".")[-1] return self._classname classname = property(getclassname) def getframe(self, num): """ returns the file numbered 'num' in the series as a fabioimage """ if self.nframes == 1: # single image per file import openimage return openimage.openimage( fabioutils.jump_filename(self.filename, num)) raise Exception("getframe out of range") def previous(self): """ returns the previous file in the series as a fabioimage """ import openimage return openimage.openimage( fabioutils.previous_filename(self.filename)) def next(self): """ returns the next file in the series as a fabioimage """ import openimage return openimage.openimage( fabioutils.next_filename(self.filename)) def toPIL16(self, filename=None): """ Convert to Python Imaging Library 16 bit greyscale image FIXME - this should be handled by the libraries now """ if not Image: raise RuntimeError("PIL is not installed !!! ") if filename: self.read(filename) if self.pilimage is not None: return self.pilimage # mode map size = self.data.shape[:2][::-1] typmap = { 'float32' : "F" , 'int32' : "F;32S" , 'uint32' : "F;32" , 'int16' : "F;16S" , 'uint16' : "F;16" , 'int8' : "F;8S" , 'uint8' : "F;8" } if typmap.has_key(self.data.dtype.name): mode2 = typmap[ self.data.dtype.name ] mode1 = mode2[0] else: raise Exception("Unknown numpy type " + str(self.data.dtype.type)) # # hack for byteswapping for PIL in MacOS testval = numpy.array((1, 0), numpy.uint8).view(numpy.uint16)[0] if testval == 1: dats = self.data.tostring() elif testval == 256: dats = self.data.byteswap().tostring() else: raise Exception("Endian unknown in fabioimage.toPIL16") self.pilimage = Image.frombuffer(mode1, size, dats, "raw", mode2, 0, 1) return self.pilimage def getheader(self): """ returns self.header """ return self.header def getmax(self): """ Find max value in self.data, caching for the future """ if self.maxval is None: self.maxval = self.data.max() return self.maxval def getmin(self): """ Find min value in self.data, caching for the future """ if self.minval is None: self.minval = self.data.min() return self.minval def make_slice(self, coords): """ Convert a len(4) set of coords into a len(2) tuple (pair) of slice objects the latter are immutable, meaning the roi can be cached """ assert len(coords) == 4 if len(coords) == 4: # fabian edfimage preference if coords[0] > coords[2]: coords[0:3:2] = [coords[2], coords[0]] if coords[1] > coords[3]: coords[1:4:2] = [coords[3], coords[1]] #in fabian: normally coordinates are given as (x,y) whereas # a matrix is given as row,col # also the (for whichever reason) the image is flipped upside # down wrt to the matrix hence these tranformations fixme = (self.dim2 - coords[3] - 1, coords[0] , self.dim2 - coords[1] - 1, coords[2]) return (slice(int(fixme[0]), int(fixme[2]) + 1) , slice(int(fixme[1]), int(fixme[3]) + 1)) def integrate_area(self, coords): """ Sums up a region of interest if len(coords) == 4 -> convert coords to slices if len(coords) == 2 -> use as slices floor -> ? removed as unused in the function. """ if self.data == None: # This should return NAN, not zero ? return 0 if len(coords) == 4: sli = self.make_slice(coords) elif len(coords) == 2 and isinstance(coords[0], slice) and \ isinstance(coords[1], slice): sli = coords if sli == self.slice and self.area_sum is not None: pass elif sli == self.slice and self.roi is not None: self.area_sum = self.roi.sum(dtype=numpy.float) else: self.slice = sli self.roi = self.data[ self.slice ] self.area_sum = self.roi.sum(dtype=numpy.float) return self.area_sum def getmean(self): """ return the mean """ if self.mean is None: self.mean = self.data.mean(dtype=numpy.double) return self.mean def getstddev(self): """ return the standard deviation """ if self.stddev == None: self.stddev = self.data.std(dtype=numpy.double) return self.stddev def add(self, other): """ Add another Image - warning, does not clip to 16 bit images by default """ if not hasattr(other, 'data'): logger.warning('edfimage.add() called with something that ' + \ 'does not have a data field') assert self.data.shape == other.data.shape , \ 'incompatible images - Do they have the same size?' self.data = self.data + other.data self.resetvals() def resetvals(self): """ Reset cache - call on changing data """ self.mean = self.stddev = self.maxval = self.minval = None self.roi = self.slice = self.area_sum = None def rebin(self, x_rebin_fact, y_rebin_fact, keep_I=True): """ Rebin the data and adjust dims @param x_rebin_fact: x binning factor @param y_rebin_fact: y binning factor @param keep_I: shall the signal increase ? @type x_rebin_fact: int @type y_rebin_fact: int @type keep_I: boolean """ if self.data == None: raise Exception('Please read in the file you wish to rebin first') if (self.dim1 % x_rebin_fact != 0) or (self.dim2 % y_rebin_fact != 0): raise RuntimeError('image size is not divisible by rebin factor - ' + \ 'skipping rebin') else: dataIn = self.data.astype("float64") shapeIn = self.data.shape shapeOut = (shapeIn[0] / y_rebin_fact, shapeIn[1] / x_rebin_fact) binsize = y_rebin_fact * x_rebin_fact if binsize < 50: #method faster for small binning (4x4) out = numpy.zeros(shapeOut, dtype="float64") for j in range(x_rebin_fact): for i in range(y_rebin_fact): out += dataIn[i::y_rebin_fact, j::x_rebin_fact] else: #method faster for large binning (8x8) temp = self.data.astype("float64") temp.shape = (shapeOut[0], y_rebin_fact, shapeOut[1], x_rebin_fact) out = temp.sum(axis=3).sum(axis=1) self.resetvals() if keep_I: self.data = (out / (y_rebin_fact * x_rebin_fact)).astype(self.data.dtype) else: self.data = out.astype(self.data.dtype) self.dim1 = self.dim1 / x_rebin_fact self.dim2 = self.dim2 / y_rebin_fact #update header self.update_header() def write(self, fname): """ To be overwritten - write the file """ raise Exception("Class has not implemented readheader method yet") def save(self, fname): 'wrapper for write' self.write(fname) def readheader(self, filename): """ Call the _readheader function... """ # Override the needs asserting that all headers can be read via python modules save_state = self._need_a_real_file , self._need_a_seek_to_read self._need_a_real_file , self._need_a_seek_to_read = False, False fin = self._open(filename) self._readheader(fin) fin.close() self._need_a_real_file , self._need_a_seek_to_read = save_state def _readheader(self, fik_obj): """ Must be overridden in classes """ raise Exception("Class has not implemented _readheader method yet") def update_header(self , **kwds): """ update the header entries by default pass in a dict of key, values. """ self.header.update(kwds) def read(self, filename, frame=None): """ To be overridden - fill in self.header and self.data """ raise Exception("Class has not implemented read method yet") # return self def load(self, *arg, **kwarg): "Wrapper for read" return self.read(*arg, **kwarg) def readROI(self, filename, frame=None, coords=None): """ Method reading Region of Interest. This implementation is the trivial one, just doing read and crop """ self.read(filename, frame) if len(coords) == 4: self.slice = self.make_slice(coords) elif len(coords) == 2 and isinstance(coords[0], slice) and \ isinstance(coords[1], slice): self.slice = coords else: logger.warning('readROI: Unable to understand Region Of Interest: got %s', coords) self.roi = self.data[ self.slice ] return self.roi def _open(self, fname, mode="rb"): """ Try to handle compressed files, streams, shared memory etc Return an object which can be used for "read" and "write" ... FIXME - what about seek ? """ fileObject = None self.filename = fname self.filenumber = fabioutils.extract_filenumber(fname) if hasattr(fname, "read") and hasattr(fname, "write"): # It is already something we can use return fname if isinstance(fname, (str, unicode)): self.header["filename"] = fname if os.path.splitext(fname)[1] == ".gz": fileObject = self._compressed_stream(fname, fabioutils.COMPRESSORS['.gz'], fabioutils.GzipFile, mode) elif os.path.splitext(fname)[1] == '.bz2': fileObject = self._compressed_stream(fname, fabioutils.COMPRESSORS['.bz2'], fabioutils.BZ2File, mode) # # Here we return the file even though it may be bzipped or gzipped # but named incorrectly... # # FIXME - should we fix that or complain about the daft naming? else: fileObject = fabioutils.File(fname, mode) if "name" not in dir(fileObject): fileObject.name = fname return fileObject def _compressed_stream(self, fname, system_uncompress, python_uncompress, mode='rb'): """ Try to transparently handle gzip / bzip without always getting python performance """ # assert that python modules are always OK based on performance benchmark # Try to fix the way we are using them? fobj = None if self._need_a_real_file and mode[0] == "r": fo = python_uncompress(fname, mode) # fobj = os.tmpfile() #problem when not administrator under certain flavors of windows tmpfd, tmpfn = tempfile.mkstemp() os.close(tmpfd) fobj = fabioutils.File(tmpfn, "w+b") fobj.write(fo.read()) fo.close() fobj.seek(0) elif self._need_a_seek_to_read and mode[0] == "r": fo = python_uncompress(fname, mode) fobj = fabioutils.StringIO(fo.read(), fname, mode) else: fobj = python_uncompress(fname, mode) return fobj def convert(self, dest): """ Convert a fabioimage object into another fabioimage object (with possible conversions) @param dest: destination type "EDF", "edfimage" or the class itself """ if type(dest) in types.StringTypes: dest = dest.lower() modules = [] for val in fabioutils.FILETYPES.values(): modules += [i + "image" for i in val if i not in modules] klass = None module = None klass_name = None for klass_name in modules: if klass_name.startswith(dest): try: module = sys.modules["fabio." + klass_name] except KeyError: try: module = __import__(klass_name) except: logger.error("Failed to import %s", klass_name) else: logger.debug("imported %simage", klass_name) if module is not None: break if module is not None: if hasattr(module, klass_name): klass = getattr(module, klass_name) else: logger.error("Module %s has no image class" % module) elif isinstance(dest, self.__class__): klass = dest.__class__ elif ("__new__" in dir(dest)) and isinstance(dest(), fabioimage): klass = dest else: logger.warning("Unrecognized destination format: %s " % dest) return self if klass is None: logger.warning("Unrecognized destination format: %s " % dest) return self other = klass() #temporary instance (to be overwritten) other = klass(data=converters.convert_data(self.classname, other.classname, self.data), header=converters.convert_header(self.classname, other.classname, self.header)) return other def test(): """ check some basic fabioimage functionality """ import time start = time.time() dat = numpy.ones((1024, 1024), numpy.uint16) dat = (dat * 50000).astype(numpy.uint16) assert dat.dtype.char == numpy.ones((1), numpy.uint16).dtype.char hed = {"Title":"50000 everywhere"} obj = fabioimage(dat, hed) assert obj.getmax() == 50000 assert obj.getmin() == 50000 assert obj.getmean() == 50000 , obj.getmean() assert obj.getstddev() == 0. dat2 = numpy.zeros((1024, 1024), numpy.uint16, savespace=1) cord = [ 256, 256, 790, 768 ] slic = obj.make_slice(cord) dat2[slic] = dat2[slic] + 100 obj = fabioimage(dat2, hed) # New object, so... assert obj.maxval is None assert obj.minval is None assert obj.getmax() == 100, obj.getmax() assert obj.getmin() == 0 , obj.getmin() npix = (slic[0].stop - slic[0].start) * (slic[1].stop - slic[1].start) obj.resetvals() area1 = obj.integrate_area(cord) obj.resetvals() area2 = obj.integrate_area(slic) assert area1 == area2 assert obj.integrate_area(cord) == obj.integrate_area(slic) assert obj.integrate_area(cord) == npix * 100, obj.integrate_area(cord) def clean(): """ clean up the created testfiles""" for name in ["testfile", "testfile.gz", "testfile.bz2"]: try: os.remove(name) except: continue clean() import gzip, bz2 gzip.open("testfile.gz", "wb").write("{ hello }") fout = obj._open("testfile.gz") readin = fout.read() assert readin == "{ hello }", readin + " gzipped file" bz2.BZ2File("testfilebz", "wb").write("{ hello }") fout = obj._open("testfile.bz2") readin = fout.read() assert readin == "{ hello }", readin + " bzipped file" ftest = open("testfile", "wb") ftest.write("{ hello }") assert ftest == obj._open(ftest) ftest.close() fout = obj._open("testfile") readin = fout.read() assert readin == "{ hello }", readin + "plain file" fout.close() ftest.close() clean() print "Passed in", time.time() - start, "s" if __name__ == '__main__': test() fabio-0.1.3/fabio-src/templateimage.py0000644000175000017500000000634212233175220020416 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 #This is a template for adding new file formats to FabIO # We hope it will be relatively easy to add new file formats to fabio in the future. The basic idea is the following: # 1) inherit from fabioimage overriding the methods _readheader, read and optionally write. # Name your new module XXXimage where XXX means something (eg tifimage). # # 2) readheader fills in a dictionary of "name":"value" pairs in self.header. # No one expects to find anything much in there. # # 3) read fills in self.data with a numpy array holding the image. # Some redundant info which also appears are self.dim1 and self.dim2: the image dimensions, # self.bpp is the bytes per pixel and self.bytecode is the numpy.dtype.type of the data. # # 4) The member variables "_need_a_seek_to_read" and "_need_a_real_file" are there in case you have # trouble with the transparent handling of bz2 and gz files. # # 5) Register the file type (extension naming) in fabioutils.FILETYPES # # 6) Add your new module as an import into fabio.openimage # # 7) Fill out the magic numbers for your format in fabio.openimage if you know them # (the characteristic first few bytes in the file) # # 8) Upload a testimage to the file release system and create a unittest testcase # which opens an example of your new format, confirming the image has actually # been read in successfully (eg check the mean, max, min and esd are all correct, # perhaps orientation too) # # 9) Run pylint on your code and then please go clean it up. Have a go at mine while you are at it. # #10) Bask in the warm glow of appreciation when someone unexpectedly learns they don't need to convert # their data into another format # Get ready for python3: from __future__ import with_statement, print_function __doc__ = """ Template for FabIO Authors: Who are you ? email: Where can you be reached ? """ __authors__ = ["author"] __contact__ = "name@institut.org" __license__ = "GPLv3+" __copyright__ = "Institut" __version__ = "17 Oct 2012" import numpy, logging from fabioimage import fabioimage logger = logging.getLogger("templateimage") class templateimage(fabioimage): """ FabIO image class for Images for XXX detector """ def __init__(self, *arg, **kwargs): """ Generic constructor """ fabioimage.__init__(self, *arg, **kwargs) self.data = None self.header = {} self.dim1 = self.dim2 = 0 self.m = self.maxval = self.stddev = self.minval = None self.header_keys = self.header.keys() self.bytecode = None def _readheader(self, infile): """ Read and decode the header of an image: @param infile: Opened python file (can be stringIO or bipped file) """ #list of header key to keep the order (when writing) self.header = {} self.header_keys = [] def read(self, fname, frame=None): """ try to read image @param fname: name of the file @param frame: """ self.resetvals() infile = self._open(fname) self._readheader(infile) #read the image data self.data = numpy.zeros((self.dim2, self.dim1), dtype=self.bytecode) return self fabio-0.1.3/fabio-src/OXDimage.py0000644000175000017500000005475512233175156017260 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 from __future__ import with_statement __doc__ = """ Reads Oxford Diffraction Sapphire 3 images Authors: ........ * Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk * Jon Wright, Jérôme Kieffer & Gaël Goret: European Synchrotron Radiation Facility; Grenoble (France) """ import time, logging, struct logger = logging.getLogger("OXDimage") import numpy from fabioimage import fabioimage from compression import decTY1, compTY1 try: from numpy import rad2deg, deg2rad except ImportError: #naive implementation for very old numpy (v1.0.1 on MacOSX from Risoe) rad2deg = lambda x: 180.0 * x / numpy.pi deg2rad = lambda x: x * numpy.pi / 180. DETECTOR_TYPES = {0: 'Sapphire/KM4CCD (1x1: 0.06mm, 2x2: 0.12mm)', 1: 'Sapphire2-Kodak (1x1: 0.06mm, 2x2: 0.12mm)', 2: 'Sapphire3-Kodak (1x1: 0.03mm, 2x2: 0.06mm, 4x4: 0.12mm)', 3: 'Onyx-Kodak (1x1: 0.06mm, 2x2: 0.12mm, 4x4: 0.24mm)', 4: 'Unknown Oxford diffraction detector'} DEFAULT_HEADERS = {'Header Version': 'OD SAPPHIRE 3.0', 'Compression': "TY1", 'Header Size In Bytes': 5120, "ASCII Section size in Byte": 256, "General Section size in Byte": 512, "Special Section size in Byte": 768, "KM4 Section size in Byte": 1024, "Statistic Section in Byte": 512, "History Section in Byte": 2048, 'NSUPPLEMENT':0 } class OXDimage(fabioimage): """ Oxford Diffraction Sapphire 3 images reader/writer class """ def _readheader(self, infile): infile.seek(0) # Ascii header part 256 byes long self.header['Header Version'] = infile.readline()[:-2] block = infile.readline() self.header['Compression'] = block[12:15] block = infile.readline() self.header['NX'] = int(block[3:7]) self.header['NY'] = int(block[11:15]) self.header['OI'] = int(block[19:26]) self.header['OL'] = int(block[30:37]) block = infile.readline() self.header['Header Size In Bytes'] = int(block[8:15]) self.header['General Section size in Byte'] = int(block[19:26]) self.header['Special Section size in Byte'] = int(block[30:37]) self.header['KM4 Section size in Byte'] = int(block[41:48]) self.header['Statistic Section in Byte'] = int(block[52:59]) self.header['History Section in Byte'] = int(block[63:]) block = infile.readline() self.header['NSUPPLEMENT'] = int(block[12:19]) block = infile.readline() self.header['Time'] = block[5:29] self.header["ASCII Section size in Byte"] = self.header['Header Size In Bytes']\ - self.header['General Section size in Byte']\ - self.header['Special Section size in Byte'] \ - self.header['KM4 Section size in Byte']\ - self.header['Statistic Section in Byte']\ - self.header['History Section in Byte']\ # Skip to general section (NG) 512 byes long <<<<<<" infile.seek(self.header["ASCII Section size in Byte"]) block = infile.read(self.header['General Section size in Byte']) self.header['Binning in x'] = numpy.fromstring(block[0:2], numpy.uint16)[0] self.header['Binning in y'] = numpy.fromstring(block[2:4], numpy.uint16)[0] self.header['Detector size x'] = numpy.fromstring(block[22:24], numpy.uint16)[0] self.header['Detector size y'] = numpy.fromstring(block[24:26], numpy.uint16)[0] self.header['Pixels in x'] = numpy.fromstring(block[26:28], numpy.uint16)[0] self.header['Pixels in y'] = numpy.fromstring(block[28:30], numpy.uint16)[0] self.header['No of pixels'] = numpy.fromstring(block[36:40], numpy.uint32)[0] # Speciel section (NS) 768 bytes long block = infile.read(self.header['Special Section size in Byte']) self.header['Gain'] = numpy.fromstring(block[56:64], numpy.float)[0] self.header['Overflows flag'] = numpy.fromstring(block[464:466], numpy.int16)[0] self.header['Overflow after remeasure flag'] = numpy.fromstring(block[466:468], numpy.int16)[0] self.header['Overflow threshold'] = numpy.fromstring(block[472:476], numpy.int32)[0] self.header['Exposure time in sec'] = numpy.fromstring(block[480:488], numpy.float)[0] self.header['Overflow time in sec'] = numpy.fromstring(block[488:496], numpy.float)[0] self.header['Monitor counts of raw image 1'] = numpy.fromstring(block[528:532], numpy.int32)[0] self.header['Monitor counts of raw image 2'] = numpy.fromstring(block[532:536], numpy.int32)[0] self.header['Monitor counts of overflow raw image 1'] = numpy.fromstring(block[536:540], numpy.int32)[0] self.header['Monitor counts of overflow raw image 2'] = numpy.fromstring(block[540:544], numpy.int32)[0] self.header['Unwarping'] = numpy.fromstring(block[544:548], numpy.int32)[0] self.header['Detector type'] = DETECTOR_TYPES[numpy.fromstring(block[548:552], numpy.int32)[0]] self.header['Real pixel size x (mm)'] = numpy.fromstring(block[568:576], numpy.float)[0] self.header['Real pixel size y (mm)'] = numpy.fromstring(block[576:584], numpy.float)[0] # KM4 goniometer section (NK) 1024 bytes long block = infile.read(self.header['KM4 Section size in Byte']) # Spatial correction file self.header['Spatial correction file'] = block[26:272].strip("\x00") self.header['Spatial correction file date'] = block[0:26].strip("\x00") # Angles are in steps due to stepper motors - conversion factor RAD # angle[0] = omega, angle[1] = theta, angle[2] = kappa, angle[3] = phi, start_angles_step = numpy.fromstring(block[284:304], numpy.int32) end_angles_step = numpy.fromstring(block[324:344], numpy.int32) step2rad = numpy.fromstring(block[368:408], numpy.float) step_angles_deg = rad2deg(step2rad) # calc angles start_angles_deg = start_angles_step * step_angles_deg end_angles_deg = end_angles_step * step_angles_deg self.header['Omega start in deg'] = start_angles_deg[0] self.header['Theta start in deg'] = start_angles_deg[1] self.header['Kappa start in deg'] = start_angles_deg[2] self.header['Phi start in deg'] = start_angles_deg[3] self.header['Omega end in deg'] = end_angles_deg[0] self.header['Theta end in deg'] = end_angles_deg[1] self.header['Kappa end in deg'] = end_angles_deg[2] self.header['Phi end in deg'] = end_angles_deg[3] self.header['Omega step in deg'] = step_angles_deg[0] self.header['Theta step in deg'] = step_angles_deg[1] self.header['Kappa step in deg'] = step_angles_deg[2] self.header['Phi step in deg'] = step_angles_deg[3] zero_correction_soft_step = numpy.fromstring(block[512:532], numpy.int32) zero_correction_soft_deg = zero_correction_soft_step * step_angles_deg self.header['Omega zero corr. in deg'] = zero_correction_soft_deg[0] self.header['Theta zero corr. in deg'] = zero_correction_soft_deg[1] self.header['Kappa zero corr. in deg'] = zero_correction_soft_deg[2] self.header['Phi zero corr. in deg'] = zero_correction_soft_deg[3] # Beam rotation about e2,e3 self.header['Beam rot in deg (e2)'] = numpy.fromstring(block[552:560], numpy.float)[0] self.header['Beam rot in deg (e3)'] = numpy.fromstring(block[560:568], numpy.float)[0] # Wavelenghts alpha1, alpha2, beta self.header['Wavelength alpha1'] = numpy.fromstring(block[568:576], numpy.float)[0] self.header['Wavelength alpha2'] = numpy.fromstring(block[576:584], numpy.float)[0] self.header['Wavelength alpha'] = numpy.fromstring(block[584:592], numpy.float)[0] self.header['Wavelength beta'] = numpy.fromstring(block[592:600], numpy.float)[0] # Detector tilts around e1,e2,e3 in deg self.header['Detector tilt e1 in deg'] = numpy.fromstring(block[640:648], numpy.float)[0] self.header['Detector tilt e2 in deg'] = numpy.fromstring(block[648:656], numpy.float)[0] self.header['Detector tilt e3 in deg'] = numpy.fromstring(block[656:664], numpy.float)[0] # Beam center self.header['Beam center x'] = numpy.fromstring(block[664:672], numpy.float)[0] self.header['Beam center y'] = numpy.fromstring(block[672:680], numpy.float)[0] # Angle (alpha) between kappa rotation axis and e3 (ideally 50 deg) self.header['Alpha angle in deg'] = numpy.fromstring(block[672:680], numpy.float)[0] # Angle (beta) between phi rotation axis and e3 (ideally 0 deg) self.header['Beta angle in deg'] = numpy.fromstring(block[672:680], numpy.float)[0] # Detector distance self.header['Distance in mm'] = numpy.fromstring(block[712:720], numpy.float)[0] # Statistics section (NS) 512 bytes long block = infile.read(self.header['Statistic Section in Byte']) self.header['Stat: Min '] = numpy.fromstring(block[0:4], numpy.int32)[0] self.header['Stat: Max '] = numpy.fromstring(block[4:8], numpy.int32)[0] self.header['Stat: Average '] = numpy.fromstring(block[24:32], numpy.float)[0] self.header['Stat: Stddev '] = numpy.sqrt(numpy.fromstring(block[32:40], numpy.float)[0]) self.header['Stat: Skewness '] = numpy.fromstring(block[40:48], numpy.float)[0] # History section (NH) 2048 bytes long block = infile.read(self.header['History Section in Byte']) self.header['Flood field image'] = block[99:126].strip("\x00") def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname) self._readheader(infile) infile.seek(self.header['Header Size In Bytes']) # Compute image size try: self.dim1 = int(self.header['NX']) self.dim2 = int(self.header['NY']) except: raise Exception("Oxford file", str(fname) + \ "is corrupt, cannot read it") # if self.header['Compression'] == 'TY1': #Compressed with the KM4CCD compression raw8 = infile.read(self.dim1 * self.dim2) raw16 = None raw32 = None if self.header['OI'] > 0: raw16 = infile.read(self.header['OI'] * 2) if self.header['OL'] > 0: raw32 = infile.read(self.header['OL'] * 4) #DEBUG stuff ... self.raw8 = raw8 self.raw16 = raw16 self.raw32 = raw32 #END DEBUG block = decTY1(raw8, raw16, raw32) bytecode = block.dtype else: bytecode = numpy.int32 self.bpp = len(numpy.array(0, bytecode).tostring()) ReadBytes = self.dim1 * self.dim2 * self.bpp block = numpy.fromstring(infile.read(ReadBytes), bytecode) logger.debug('OVER_SHORT2: %s', block.dtype) logger.debug("%s" % (block < 0).sum()) infile.close() logger.debug("BYTECODE: %s", bytecode) self.data = block.reshape((self.dim2, self.dim1)) self.bytecode = self.data.dtype.type self.pilimage = None return self def _writeheader(self): """ @return a string containing the header for Oxford images """ linesep = "\r\n" for key in DEFAULT_HEADERS: if key not in self.header_keys: self.header_keys.append(key) self.header[key] = DEFAULT_HEADERS[key] if "NX" not in self.header.keys() or "NY" not in self.header.keys(): self.header['NX'] = self.dim1 self.header['NY'] = self.dim2 ascii_headers = [self.header['Header Version'], "COMPRESSION=%s (%5.1f)" % (self.header["Compression"], self.getCompressionRatio()), "NX=%4i NY=%4i OI=%7i OL=%7i " % (self.header["NX"], self.header["NY"], self.header["OI"], self.header["OL"]), "NHEADER=%7i NG=%7i NS=%7i NK=%7i NS=%7i NH=%7i" % (self.header['Header Size In Bytes'], self.header['General Section size in Byte'], self.header['Special Section size in Byte'], self.header['KM4 Section size in Byte'], self.header['Statistic Section in Byte'], self.header['History Section in Byte']), "NSUPPLEMENT=%7i" % (self.header["NSUPPLEMENT"])] if "Time" in self.header: ascii_headers.append("TIME=%s" % self.header["Time"]) else: ascii_headers.append("TIME=%s" % time.ctime()) header = (linesep.join(ascii_headers)).ljust(256) NG = Section(self.header['General Section size in Byte'], self.header) NG.setData('Binning in x', 0, numpy.uint16) NG.setData('Binning in y', 2, numpy.uint16) NG.setData('Detector size x', 22, numpy.uint16) NG.setData('Detector size y', 24, numpy.uint16) NG.setData('Pixels in x', 26, numpy.uint16) NG.setData('Pixels in y', 28, numpy.uint16) NG.setData('No of pixels', 36, numpy.uint32) header += NG.__repr__() NS = Section(self.header['Special Section size in Byte'], self.header) NS.setData('Gain', 56, numpy.float) NS.setData('Overflows flag', 464, numpy.int16) NS.setData('Overflow after remeasure flag', 466, numpy.int16) NS.setData('Overflow threshold', 472, numpy.int32) NS.setData('Exposure time in sec', 480, numpy.float) NS.setData('Overflow time in sec', 488, numpy.float) NS.setData('Monitor counts of raw image 1', 528, numpy.int32) NS.setData('Monitor counts of raw image 2', 532, numpy.int32) NS.setData('Monitor counts of overflow raw image 1', 536, numpy.int32) NS.setData('Monitor counts of overflow raw image 2', 540, numpy.int32) NS.setData('Unwarping', 544, numpy.int32) if 'Detector type' in self.header: for key, value in DETECTOR_TYPES.items(): if value == self.header['Detector type']: NS.setData(None, 548, numpy.int32, default=key) NS.setData('Real pixel size x (mm)', 568, numpy.float) NS.setData('Real pixel size y (mm)', 576, numpy.float) header += NS.__repr__() KM = Section(self.header['KM4 Section size in Byte'], self.header) KM.setData('Spatial correction file date', 0, "|S26") KM.setData('Spatial correction file', 26, "|S246") # Angles are in steps due to stepper motors - conversion factor RAD # angle[0] = omega, angle[1] = theta, angle[2] = kappa, angle[3] = phi, if self.header.get('Omega step in deg', None): KM.setData(None, 368, numpy.float64, deg2rad(self.header["Omega step in deg"])) if self.header.get('Omega start in deg', None): KM.setData(None, 284, numpy.int32, self.header["Omega start in deg"] / self.header["Omega step in deg"]) if self.header.get('Omega end in deg', None): KM.setData(None, 324, numpy.int32, self.header["Omega end in deg"] / self.header["Omega step in deg"]) if self.header.get('Omega zero corr. in deg', None): KM.setData(None, 512, numpy.int32, self.header['Omega zero corr. in deg'] / self.header["Omega step in deg"]) if self.header.get('Theta step in deg', None): KM.setData(None, 368 + 8, numpy.float64, deg2rad(self.header["Theta step in deg"])) if self.header.get('Theta start in deg', None): KM.setData(None, 284 + 4, numpy.int32, self.header["Theta start in deg"] / self.header["Theta step in deg"]) if self.header.get('Theta end in deg', None): KM.setData(None, 324 + 4, numpy.int32, self.header["Theta end in deg"] / self.header["Theta step in deg"]) if self.header.get('Theta zero corr. in deg', None): KM.setData(None, 512 + 4, numpy.int32, self.header['Theta zero corr. in deg'] / self.header["Theta step in deg"]) if self.header.get('Kappa step in deg', None): KM.setData(None, 368 + 16, numpy.float64, deg2rad(self.header["Kappa step in deg"])) if self.header.get('Kappa start in deg', None): KM.setData(None, 284 + 8, numpy.int32, self.header["Kappa start in deg"] / self.header["Kappa step in deg"]) if self.header.get('Kappa end in deg', None): KM.setData(None, 324 + 8, numpy.int32, self.header["Kappa end in deg"] / self.header["Kappa step in deg"]) if self.header.get('Kappa zero corr. in deg', None): KM.setData(None, 512 + 8, numpy.int32, self.header['Kappa zero corr. in deg'] / self.header["Kappa step in deg"]) if self.header.get('Phi step in deg', None): KM.setData(None, 368 + 24, numpy.float64, deg2rad(self.header["Phi step in deg"])) if self.header.get('Phi start in deg', None): KM.setData(None, 284 + 12, numpy.int32, self.header["Phi start in deg"] / self.header["Phi step in deg"]) if self.header.get('Phi end in deg', None): KM.setData(None, 324 + 12, numpy.int32, self.header["Phi end in deg"] / self.header["Phi step in deg"]) if self.header.get('Phi zero corr. in deg', None): KM.setData(None, 512 + 12, numpy.int32, self.header['Phi zero corr. in deg'] / self.header["Phi step in deg"]) # Beam rotation about e2,e3 KM.setData('Beam rot in deg (e2)', 552, numpy.float64) KM.setData('Beam rot in deg (e3)', 560, numpy.float64) # Wavelenghts alpha1, alpha2, beta KM.setData('Wavelength alpha1', 568, numpy.float64) KM.setData('Wavelength alpha2', 576, numpy.float64) KM.setData('Wavelength alpha', 584, numpy.float64) KM.setData('Wavelength beta', 592, numpy.float64) # Detector tilts around e1,e2,e3 in deg KM.setData('Detector tilt e1 in deg', 640, numpy.float64) KM.setData('Detector tilt e2 in deg', 648, numpy.float64) KM.setData('Detector tilt e3 in deg', 656, numpy.float64) # Beam center KM.setData('Beam center x', 664, numpy.float64) KM.setData('Beam center y', 672, numpy.float64) # Angle (alpha) between kappa rotation axis and e3 (ideally 50 deg) KM.setData('Alpha angle in deg', 672, numpy.float64) # Angle (beta) between phi rotation axis and e3 (ideally 0 deg) KM.setData('Beta angle in deg', 672, numpy.float64) # Detector distance KM.setData('Distance in mm', 712, numpy.float64) header += KM.__repr__() SS = Section(self.header['Statistic Section in Byte'], self.header) SS.setData('Stat: Min ', 0, numpy.int32) SS.setData('Stat: Max ', 4, numpy.int32) SS.setData('Stat: Average ', 24, numpy.float64) if self.header.get('Stat: Stddev ', None): SS.setData(None, 32, numpy.float64, self.header['Stat: Stddev '] ** 2) SS.setData('Stat: Skewness ', 40, numpy.float64) header += SS.__repr__() HS = Section(self.header['History Section in Byte'], self.header) HS.setData('Flood field image', 99, "|S27") header += HS.__repr__() return header def write(self, fname): """Write Oxford diffraction images: this is still beta @param fname: output filename """ datablock8, datablock16, datablock32 = compTY1(self.data) self.header["OI"] = len(datablock16) / 2 self.header["OL"] = len(datablock32) / 4 with self._open(fname, mode="wb") as outfile: outfile.write(self._writeheader()) outfile.write(datablock8) outfile.write(datablock16) outfile.write(datablock32) def getCompressionRatio(self): "calculate the compression factor obtained vs raw data" return 100.0 * (self.data.size + 2 * self.header["OI"] + 4 * self.header["OL"]) / (self.data.size * 4) @staticmethod def checkData(data=None): if data is None: return None else: return data.astype(int) class Section(object): """ Small helper class for writing binary headers """ def __init__(self, size, dictHeader): """ @param size: size of the header section in bytes @param dictHeader: headers of the image """ self.size = size self.header = dictHeader self.lstChr = ["\x00"] * size self._dictSize = {} def __repr__(self): return "".join(self.lstChr) def getSize(self, dtype): if not dtype in self._dictSize: self._dictSize[dtype] = len(numpy.zeros(1, dtype=dtype).tostring()) return self._dictSize[dtype] def setData(self, key, offset, dtype, default=None): """ @param offset: int, starting position in the section @param key: name of the header key @param dtype: type of the data to insert (defines the size!) """ if key in self.header: value = self.header[key] elif key in DEFAULT_HEADERS: value = DEFAULT_HEADERS[key] else: value = default if value is None: value = "\x00" * self.getSize(dtype) else: value = numpy.array(value).astype(dtype).tostring() self.lstChr[offset:offset + self.getSize(dtype)] = value fabio-0.1.3/fabio-src/GEimage.py0000644000175000017500000002614512233175156017111 0ustar jeromejerome00000000000000#!/usr/bin/env python # # Reads the header from a GE a-Si Angio Detector # Using version 8001 of the header from file: # c:\adept\core\DefaultImageInfoConfig.csv # # Antonino Miceli # Thu Jan 4 13:46:31 CST 2007 # # modifications by Jon Wright for style, pychecker and fabio # import numpy import struct, logging logger = logging.getLogger("GEimage") from fabioimage import fabioimage from fabioutils import next_filename, previous_filename GE_HEADER_INFO = [ # Name, length in bytes, format for struct (None means string) ('ImageFormat', 10, None), ('VersionOfStandardHeader', 2, '=H'), ('StandardHeaderSizeInBytes', 4, '=L'), ('VersionOfUserHeader', 2, '=H'), ('UserHeaderSizeInBytes', 4, '=L'), ('NumberOfFrames', 2, '=H'), ('NumberOfRowsInFrame', 2, '=H'), ('NumberOfColsInFrame', 2, '=H'), ('ImageDepthInBits', 2, '=H'), ('AcquisitionDate', 20, None), ('AcquisitionTime', 20, None), ('DUTID', 20, None), ('Operator', 50, None), ('DetectorSignature', 20, None), ('TestSystemName', 20, None), ('TestStationRevision', 20, None), ('CoreBundleRevision', 20, None), ('AcquisitionName', 40, None), ('AcquisitionParameterRevision', 20, None), ('OriginalNumberOfRows', 2, '=H'), ('OriginalNumberOfColumns', 2, '=H'), ('RowNumberUpperLeftPointArchiveROI', 2, '=H'), ('ColNumberUpperLeftPointArchiveROI', 2, '=H'), ('Swapped', 2, '=H'), ('Reordered', 2, '=H'), ('HorizontalFlipped', 2, '=H'), ('VerticalFlipped', 2, '=H'), ('WindowValueDesired', 2, '=H'), ('LevelValueDesired', 2, '=H'), ('AcquisitionMode', 2, '=H'), ('AcquisitionType', 2, '=H'), ('UserAcquisitionCoffFileName1', 100, None), ('UserAcquisitionCoffFileName2', 100, None), ('FramesBeforeExpose', 2, '=H'), ('FramesDuringExpose', 2, '=H'), ('FramesAfterExpose', 2, '=H'), ('IntervalBetweenFrames', 2, '=H'), ('ExposeTimeDelayInMicrosecs', 8, '=d'), ('TimeBetweenFramesInMicrosecs', 8, '=d'), ('FramesToSkipExpose', 2, '=H'), ('ExposureMode', 2, '=H'), ('PrepPresetTimeInMicrosecs', 8, '=d'), ('ExposePresetTimeInMicrosecs', 8, '=d'), ('AcquisitionFrameRateInFps', 4, '=f'), ('FOVSelect', 2, '=H'), ('ExpertMode', 2, '=H'), ('SetVCommon1', 8, '=d'), ('SetVCommon2', 8, '=d'), ('SetAREF', 8, '=d'), ('SetAREFTrim', 4, '=L'), ('SetSpareVoltageSource', 8, '=d'), ('SetCompensationVoltageSource', 8, '=d'), ('SetRowOffVoltage', 8, '=d'), ('SetRowOnVoltage', 8, '=d'), ('StoreCompensationVoltage', 4, '=L'), ('RampSelection', 2, '=H'), ('TimingMode', 2, '=H'), ('Bandwidth', 2, '=H'), ('ARCIntegrator', 2, '=H'), ('ARCPostIntegrator', 2, '=H'), ('NumberOfRows', 4, '=L'), ('RowEnable', 2, '=H'), ('EnableStretch', 2, '=H'), ('CompEnable', 2, '=H'), ('CompStretch', 2, '=H'), ('LeftEvenTristate', 2, '=H'), ('RightOddTristate', 2, '=H'), ('TestModeSelect', 4, '=L'), ('AnalogTestSource', 4, '=L'), ('VCommonSelect', 4, '=L'), ('DRCColumnSum', 4, '=L'), ('TestPatternFrameDelta', 4, '=L'), ('TestPatternRowDelta', 4, '=L'), ('TestPatternColumnDelta', 4, '=L'), ('DetectorHorizontalFlip', 2, '=H'), ('DetectorVerticalFlip', 2, '=H'), ('DFNAutoScrubOnOff', 2, '=H'), ('FiberChannelTimeOutInMicrosecs', 4, '=L'), ('DFNAutoScrubDelayInMicrosecs', 4, '=L'), ('StoreAECROI', 2, '=H'), ('TestPatternSaturationValue', 2, '=H'), ('TestPatternSeed', 4, '=L'), ('ExposureTimeInMillisecs', 4, '=f'), ('FrameRateInFps', 4, '=f'), ('kVp', 4, '=f'), ('mA', 4, '=f'), ('mAs', 4, '=f'), ('FocalSpotInMM', 4, '=f'), ('GeneratorType', 20, None), ('StrobeIntensityInFtL', 4, '=f'), ('NDFilterSelection', 2, '=H'), ('RefRegTemp1', 8, '=d'), ('RefRegTemp2', 8, '=d'), ('RefRegTemp3', 8, '=d'), ('Humidity1', 4, '=f'), ('Humidity2', 4, '=f'), ('DetectorControlTemp', 8, '=d'), ('DoseValueInmR', 8, '=d'), ('TargetLevelROIRow0', 2, '=H'), ('TargetLevelROICol0', 2, '=H'), ('TargetLevelROIRow1', 2, '=H'), ('TargetLevelROICol1', 2, '=H'), ('FrameNumberForTargetLevelROI', 2, '=H'), ('PercentRangeForTargetLevel', 2, '=H'), ('TargetValue', 2, '=H'), ('ComputedMedianValue', 2, '=H'), ('LoadZero', 2, '=H'), ('MaxLUTOut', 2, '=H'), ('MinLUTOut', 2, '=H'), ('MaxLinear', 2, '=H'), ('Reserved', 2, '=H'), ('ElectronsPerCount', 2, '=H'), ('ModeGain', 2, '=H'), ('TemperatureInDegC', 8, '=d'), ('LineRepaired', 2, '=H'), ('LineRepairFileName', 100, None), ('CurrentLongitudinalInMM', 4, '=f'), ('CurrentTransverseInMM', 4, '=f'), ('CurrentCircularInMM', 4, '=f'), ('CurrentFilterSelection', 4, '=L'), ('DisableScrubAck', 2, '=H'), ('ScanModeSelect', 2, '=H'), ('DetectorAppSwVersion', 20, None), ('DetectorNIOSVersion', 20, None), ('DetectorPeripheralSetVersion', 20, None), ('DetectorPhysicalAddress', 20, None), ('PowerDown', 2, '=H'), ('InitialVoltageLevel_VCOMMON', 8, '=d'), ('FinalVoltageLevel_VCOMMON', 8, '=d'), ('DmrCollimatorSpotSize', 10, None), ('DmrTrack', 5, None), ('DmrFilter', 5, None), ('FilterCarousel', 2, '=H'), ('Phantom', 20, None), ('SetEnableHighTime', 2, '=H'), ('SetEnableLowTime', 2, '=H'), ('SetCompHighTime', 2, '=H'), ('SetCompLowTime', 2, '=H'), ('SetSyncLowTime', 2, '=H'), ('SetConvertLowTime', 2, '=H'), ('SetSyncHighTime', 2, '=H'), ('SetEOLTime', 2, '=H'), ('SetRampOffsetTime', 2, '=H'), ('FOVStartingValue', 2, '=H'), ('ColumnBinning', 2, '=H'), ('RowBinning', 2, '=H'), ('BorderColumns64', 2, '=H'), ('BorderRows64', 2, '=H'), ('FETOffRows64', 2, '=H'), ('FOVStartColumn128', 2, '=H'), ('FOVStartRow128', 2, '=H'), ('NumberOfColumns128', 2, '=H'), ('NumberOfRows128', 2, '=H'), ('VFPAquisition', 2000, None), ('Comment', 200, None) ] class GEimage(fabioimage): _need_a_seek_to_read = True def _readheader(self, infile): """ Read a GE image header """ infile.seek(0) self.header = {} for name, nbytes, format in GE_HEADER_INFO: if format is None: self.header[ name ] = infile.read(nbytes) else: self.header[ name ] = struct.unpack(format, infile.read(nbytes))[0] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ if frame is None: frame = 0 self.header = {} self.resetvals() infile = self._open(fname, "rb") self.sequencefilename = fname self._readheader(infile) self.nframes = self.header['NumberOfFrames'] self._readframe(infile, frame) infile.close() return self def _makeframename(self): """ The thing to be printed for the user to represent a frame inside a file """ self.filename = "%s$%04d" % (self.sequencefilename, self.currentframe) def _readframe(self, filepointer, img_num): """ # Load only one image from the sequence # Note: the first image in the sequence 0 # raises an exception if you give an invalid image # otherwise fills in self.data """ if(img_num > self.nframes or img_num < 0): raise Exception("Bad image number") imgstart = self.header['StandardHeaderSizeInBytes'] + \ self.header['UserHeaderSizeInBytes'] + \ img_num * self.header['NumberOfRowsInFrame'] * \ self.header['NumberOfColsInFrame'] * \ self.header['ImageDepthInBits'] / 8 # whence = 0 means seek from start of file filepointer.seek(imgstart, 0) self.bpp = self.header['ImageDepthInBits'] / 8 # hopefully 2 imglength = self.header['NumberOfRowsInFrame'] * \ self.header['NumberOfColsInFrame'] * self.bpp if self.bpp != 2: logging.warning("Using uint16 for GE but seems to be wrong") # Guessing it is always unsigned int? self.data = numpy.fromstring(filepointer.read(imglength), numpy.uint16) self.data.shape = (self.header['NumberOfRowsInFrame'], self.header['NumberOfColsInFrame']) self.dim2 , self.dim1 = self.data.shape self.currentframe = int(img_num) self._makeframename() def write(self, fname, force_type=numpy.uint16): """ Not yet implemented""" raise Exception("Write is not implemented") def getframe(self, num): """ Returns a frame as a new fabioimage object """ if num < 0 or num > self.nframes: raise Exception("Requested frame number is out of range") # Do a deep copy of the header to make a new one newheader = {} for k in self.header.keys(): newheader[k] = self.header[k] frame = GEimage(header=newheader) frame.nframes = self.nframes frame.sequencefilename = self.sequencefilename infile = frame._open(self.sequencefilename, "rb") frame._readframe(infile, num) infile.close() return frame def next(self): """ Get the next image in a series as a fabio image """ if self.currentframe < (self.nframes - 1) and self.nframes > 1: return self.getframe(self.currentframe + 1) else: newobj = GEimage() newobj.read(next_filename( self.sequencefilename)) return newobj def previous(self): """ Get the previous image in a series as a fabio image """ if self.currentframe > 0: return self.getframe(self.currentframe - 1) else: newobj = GEimage() newobj.read(previous_filename( self.sequencefilename)) return newobj def demo(): import sys, time if len(sys.argv) < 2: print "USAGE: GE_script.py " sys.exit() image_file = sys.argv[1] print "init read_GEaSi_data class and load header.." sequence1 = GEimage() sequence1.read(image_file) print "TimeBetweenFramesInMicrosecs = ", print sequence1.header['TimeBetweenFramesInMicrosecs'] print "AcquisitionTime = ", print sequence1.header['AcquisitionTime'] print "Mean = ", sequence1.data.ravel().mean() while 1: start = time.time() try: sequence1 = sequence1.next() print sequence1.currentframe, sequence1.data.ravel().mean(), \ time.time() - start except Exception, ex: raise ex if __name__ == '__main__': demo() fabio-0.1.3/fabio-src/pnmimage.py0000644000175000017500000001303312233175156017400 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:henning.sorensen@risoe.dk """ import numpy, logging logger = logging.getLogger("pnmimage") from fabioimage import fabioimage SUBFORMATS = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7'] HEADERITEMS = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL'] P7HEADERITEMS = ['WIDTH', 'HEIGHT', 'DEPTH', 'MAXVAL', 'TUPLTYPE', 'ENDHDR'] class pnmimage(fabioimage): def __init__(self, *arg, **kwargs): fabioimage.__init__(self, *arg, **kwargs) fun = getattr(fabioimage, '__init__', lambda x: None) fun(self) self.data = None self.header = {'Subformat':'P5'} self.dim1 = self.dim2 = 0 self.m = self.maxval = self.stddev = self.minval = None self.header_keys = self.header.keys() self.bytecode = None def _readheader(self, f): #pnm images have a 3-line header but ignore lines starting with '#' #1st line contains the pnm image sub format #2nd line contains the image pixel dimension #3rd line contains the maximum pixel value (at least for grayscale - check this) self.header_keys = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL'] l = f.readline().strip() if l not in SUBFORMATS: raise IOError, ('unknown subformat of pnm: %s' % l) else: self.header['SUBFORMAT'] = l if self.header['SUBFORMAT'] == 'P7': self.header_keys = P7HEADERITEMS #this one has a special header while 'ENDHDR' not in l: l = f.readline() while(l[0] == '#'): l = f.readline() s = l.lsplit(' ', 1) if s[0] not in P7HEADERITEMS: raise IOError, ('Illegal pam (netpnm p7) headeritem %s' % s[0]) self.header[s[0]] = s[1] else: self.header_keys = HEADERITEMS for k in self.header_keys[1:]: l = f.readline() while(l[0] == '#'): l = f.readline() self.header[k] = l.strip() #set the dimensions dims = (self.header['DIMENSIONS'].split()) self.dim1, self.dim2 = int(dims[0]), int(dims[1]) #figure out how many bytes are used to store the data #case construct here! m = int(self.header['MAXVAL']) if m < 256: self.bytecode = numpy.uint8 elif m < 65536: self.bytecode = numpy.uint16 elif m < 2147483648L: self.bytecode = numpy.uint32 logger.warning('32-bit pixels are not really supported by the netpgm standard') else: raise IOError, 'could not figure out what kind of pixels you have' def read(self, fname, frame=None): """ try to read PNM images @param fname: name of the file @param frame: not relevant here! PNM is always single framed """ self.header = {} self.resetvals() infile = self._open(fname) self._readheader(infile) #read the image data decoder_name = "%sdec" % self.header['SUBFORMAT'] if decoder_name in dir(pnmimage): decoder = getattr(pnmimage, decoder_name) self.data = decoder(infile, self.bytecode) else: raise IOError("No decoder named %s for file %s" % (decoder_name, fname)) self.resetvals() return self @staticmethod def P1dec(buf, bytecode): data = numpy.zeros((self.dim2, self.dim1)) i = 0 for l in buf.readlines(): try: data[i, :] = numpy.array(l.split()).astype(bytecode) except ValueError: raise IOError, 'Size spec in pnm-header does not match size of image data field' return data @staticmethod def P4dec(buf, bytecode): err = 'single bit (pbm) images are not supported - yet' logger.error(err) raise NotImplementedError(err) @staticmethod def P2dec(buf, bytecode): data = numpy.zeros((self.dim2, self.dim1)) i = 0 for l in buf.readlines(): try: data[i, :] = numpy.array(l.split()).astype(bytecode) except ValueError: raise IOError, 'Size spec in pnm-header does not match size of image data field' return data @staticmethod def P5dec(buf, bytecode): l = buf.read() try: data = numpy.reshape(numpy.fromstring(l, bytecode), [self.dim2, self.dim1]).byteswap() except ValueError: raise IOError, 'Size spec in pnm-header does not match size of image data field' return data @staticmethod def P3dec(buf, bytecode): err = '(plain-ppm) RGB images are not supported - yet' logger.error(err) raise NotImplementedError(err) @staticmethod def P6dec(buf, bytecode): err = '(ppm) RGB images are not supported - yet' logger.error(err) raise NotImplementedError(err) @staticmethod def P7dec(buf, bytecode): err = '(pam) images are not supported - yet' logger.error(err) raise NotImplementedError(err) def write(self, filename): raise NotImplementedError('write pnm images is not implemented yet.') @staticmethod def checkData(data=None): if data is None: return None else: return data.astype(int) fabio-0.1.3/fabio-src/datIO.py0000644000175000017500000000341612120434325016576 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk and Jon Wright, ESRF """ class fabiodata(object): """ A common class for dataIO in fable Contains a 2d numpy array for keeping data, and two lists (clabels and rlabels) containing labels for columns and rows respectively """ def __init__(self, data=None, clabels=None, rlabels=None, fname=None): """ set up initial values """ if type(data) == type("string"): raise Exception("fabioimage.__init__ bad argument - " + \ "data should be numpy array") self.data = data if (self.data): self.dims = self.data.shape self.clabels = clabels self.rlabels = rlabels if (fname): self.read(fname) def read(self, fname=None, frame=None): """ To be overridden by format specific subclasses """ raise Exception("Class has not implemented read method yet") #import stuff from Jon's columnfile things class columnfile(fabiodata): "Concrete fabiodata class" def read(self, fname, frame=None): import cf_io try: infile = open(fname, 'rb') except: raise Exception("columnfile: file" + str(fname) + "not found.") try: (self.data, self.clabels) = cf_io.read(infile) except: raise Exception("columnfile: read error, file " + str(fname) + " possibly corrupt") self.dims = self.data.shape infile.close() fabio-0.1.3/fabio-src/file_series.py0000644000175000017500000002356612233175156020110 0ustar jeromejerome00000000000000#!/usr/bin/env python """ Authors: ........ * Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk * Jon Wright, ESRF """ import logging, sys logger = logging.getLogger("fileseries") import traceback as pytraceback from fabioutils import FilenameObject, next_filename from openimage import openimage def new_file_series0(first_object, first=None, last=None, step=1): """ Created from a fabio image first and last are file numbers """ im = first_object nimages = 0 # for counting images if None in (first, last): step = 0 total = 1 else: total = last - first yield im while nimages < total: nimages += step try: newim = im.next() im = newim except Exception, error: pytraceback.print_exc() # Skip bad images logger.warning("Got a problem here: %s", error) try: im.filename = next_filename(im.filename) except Exception, error: # KE: This will not work and will throw an exception # fabio.next_filename doesn't understand %nnnn on the end logger.warning("Got another problem here: %s", error) im.filename = next_filename(im.sequencefilename) yield None yield im def new_file_series(first_object, nimages=0, step=1, traceback=False): """ A generator function that creates a file series starting from a a fabioimage. Iterates through all images in a file (if more than 1), then proceeds to the next file as determined by fabio.next_filename. @param first_object: the starting fabioimage, which will be the first one yielded in the sequence @param nimages: the maximum number of images to consider step: step size, will yield the first and every step'th image until nimages is reached. (e.g. nimages = 5, step = 2 will yield 3 images (0, 2, 4) @param traceback: if True causes it to print a traceback in the event of an exception (missing image, etc.). Otherwise the calling routine can handle the exception as it chooses @param yields: the next fabioimage in the series. In the event there is an exception, it yields the sys.exec_info for the exception instead. sys.exec_info is a tuple: ( exceptionType, exceptionValue, exceptionTraceback ) from which all the exception information can be obtained. Suggested usage: :: for obj in new_file_series( ... ): if not isinstance(obj, fabio.fabioimage.fabioimage ): # deal with errors like missing images, non readable files, etc # e.g. traceback.print_exception(obj[0], obj[1], obj[2]) """ im = first_object nprocessed = 0 abort = False if nimages > 0: yield im nprocessed += 1 while nprocessed < nimages: try: newim = im.next() im = newim retVal = im except Exception, ex: retVal = sys.exc_info() if(traceback): pytraceback.print_exc() # Skip bad images logger.warning("Got a problem here: next() failed %s", ex) # Skip bad images try: im.filename = next_filename(im.filename) except Exception, ex: logger.warning("Got another problem here: next_filename(im.filename) %s", ex) if nprocessed % step == 0: yield retVal # Avoid cyclic references with exc_info ? retVal = None if abort: break nprocessed += 1 class file_series(list): """ Represents a series of files to iterate has an idea of a current position to do next and prev You also get from the list python superclass: append count extend insert pop remove reverse sort """ def __init__(self, list_of_strings): """ Constructor: @param list_of_strings: arg should be a list of strings which are filenames """ super(file_series, self).__init__(list_of_strings) # track current position in list self._current = 0 # methods which return a filename def first(self): """ First image in series """ return self[0] def last(self): """ Last in series """ return self[-1] def previous(self): """ Prev in a sequence """ self._current -= 1 return self[self._current] def current(self): """Current position in a sequence """ return self[self._current] def next(self): """ Next in a sequence """ self._current += 1 return self[self._current] def jump(self, num): """ Goto a position in sequence """ assert num < len(self) and num > 0, "num out of range" self._current = num return self[self._current] def len(self): """ Number of files """ return len(self) # Methods which return a fabioimage def first_image(self): """ First image in a sequence @return: fabioimage """ return openimage(self.first()) def last_image(self): """ Last image in a sequence @return: fabioimage """ return openimage(self.last()) def next_image(self): """ Return the next image @return: fabioimage """ return openimage(self.next()) def previous_image(self): """ Return the previous image @return: fabioimage """ return openimage(self.previous()) def jump_image(self, num): """ Jump to and read image @return: fabioimage """ return openimage(self.jump(num)) def current_image(self): """ Current image in sequence @return: fabioimage """ return openimage(self.current()) # methods which return a file_object def first_object(self): """ First image in a sequence @return: file_object """ return FilenameObject(self.first()) def last_object(self): """ Last image in a sequence @return: file_object """ return FilenameObject(self.last()) def next_object(self): """ Return the next image @return: file_object """ return FilenameObject(self.next()) def previous_object(self): """ Return the previous image @return: file_object """ return FilenameObject(self.previous()) def jump_object(self, num): """ Jump to and read image @return: file_object """ return FilenameObject(self.jump(num)) def current_object(self): """ Current image in sequence @return: file_object """ return FilenameObject(self.current()) class numbered_file_series(file_series): """ mydata0001.edf = "mydata" + 0001 + ".edf" mydata0002.edf = "mydata" + 0002 + ".edf" mydata0003.edf = "mydata" + 0003 + ".edf" """ def __init__(self, stem, first, last, extension, digits=4, padding='Y', step=1): """ Constructor @param stem: first part of the name @param step: in case of every nth file @param padding: possibility for specifying that numbers are not padded with zeroes up to digits """ if padding == 'Y': fmt = "%s%0" + str(digits) + "d%s" else: fmt = "%s%i%s" super(numbered_file_series, self).__init__( [ fmt % (stem, i, extension) for i in range(first, last + 1, step) ]) class filename_series: """ Much like the others, but created from a string filename """ def __init__(self, filename): """ create from a filename (String)""" self.obj = FilenameObject(filename) def next(self): """ increment number """ self.obj.num += 1 return self.obj.tostring() def previous(self): """ decrement number """ self.obj.num -= 1 return self.obj.tostring() def current(self): """ return current filename string""" return self.obj.tostring() def jump(self, num): """ jump to a specific number """ self.obj.num = num return self.obj.tostring() # image methods def next_image(self): """ returns the next image as a fabioimage """ return openimage(self.next()) def prev_image(self): """ returns the previos image as a fabioimage """ return openimage(self.previous()) def current_image(self): """ returns the current image as a fabioimage""" return openimage(self.current()) def jump_image(self, num): """ returns the image number as a fabioimage""" return openimage(self.jump(num)) # object methods def next_object(self): """ returns the next filename as a fabio.FilenameObject""" self.obj.num += 1 return self.obj def previous_object(self): """ returns the previous filename as a fabio.FilenameObject""" self.obj.num -= 1 return self.obj def current_object(self): """ returns the current filename as a fabio.FilenameObject""" return self.obj def jump_object(self, num): """ returns the filename num as a fabio.FilenameObject""" self.obj.num = num return self.obj fabio-0.1.3/fabio-src/HiPiCimage.py0000644000175000017500000000752112233175156017547 0ustar jeromejerome00000000000000 #!/usr/bin/env python """ Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk + Jon Wright, ESRF Information about the file format from Masakatzu Kobayashi is highly appreciated """ import numpy, logging logger = logging.getLogger("HiPiCimage") from fabioimage import fabioimage class HiPiCimage(fabioimage): """ Read HiPic images e.g. collected with a Hamamatsu CCD camera""" def _readheader(self, infile): """ Read in a header from an already open file """ Image_tag = infile.read(2) print Image_tag Comment_len = numpy.fromstring(infile.read(2), numpy.uint16) Dim_1 = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dim_2 = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dim_1_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dim_2_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0] HeaderType = numpy.fromstring(infile.read(2), numpy.uint16)[0] Dump = infile.read(50) Comment = infile.read(Comment_len) self.header['Image_tag'] = Image_tag self.header['Dim_1'] = Dim_1 self.header['Dim_2'] = Dim_2 self.header['Dim_1_offset'] = Dim_1_offset self.header['Dim_2_offset'] = Dim_2_offset #self.header['Comment'] = Comment if Image_tag != 'IM' : # This does not look like an HiPic file logging.warning("no opening. Corrupt header of HiPic file " + \ str(infile.name)) Comment_split = Comment[:Comment.find('\x00')].split('\r\n') for topcomment in Comment_split: topsplit = topcomment.split(',') for line in topsplit: if '=' in line: key, val = line.split('=' , 1) # Users cannot type in significant whitespace key = key.rstrip().lstrip() self.header_keys.append(key) self.header[key] = val.lstrip().rstrip() self.header[key] = val.lstrip('"').rstrip('"') def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname, "rb") self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['Dim_1']) self.dim2 = int(self.header['Dim_2']) except: raise Exception("HiPic file", str(fname) + \ "is corrupt, cannot read it") bytecode = numpy.uint16 self.bpp = len(numpy.array(0, bytecode).tostring()) # Read image data block = infile.read(self.dim1 * self.dim2 * self.bpp) infile.close() #now read the data into the array try: self.data = numpy.reshape( numpy.fromstring(block, bytecode), [self.dim2, self.dim1]) except: print len(block), bytecode, self.bpp, self.dim2, self.dim1 raise IOError, \ 'Size spec in HiPic-header does not match size of image data field' self.bytecode = self.data.dtype.type # Sometimes these files are not saved as 12 bit, # But as 16 bit after bg subtraction - which results # negative values saved as 16bit. Therefore values higher # 4095 is really negative values if self.data.max() > 4095: gt12bit = self.data > 4095 self.data = self.data - gt12bit * (2 ** 16 - 1) # ensure the PIL image is reset self.pilimage = None return self fabio-0.1.3/fabio-src/fit2dmaskimage.py0000644000175000017500000000544312233175156020500 0ustar jeromejerome00000000000000## Automatically adapted for numpy.oldnumeric Oct 05, 2007 by alter_code1.py #!/usr/bin/env python """ Author: Andy Hammersley, ESRF Translation into python/fabio: Jon Wright, ESRF """ import numpy from fabioimage import fabioimage class fit2dmaskimage(fabioimage): """ Read and try to write Andy Hammersley's mask format """ def _readheader(self, infile): """ Read in a header from an already open file """ # 1024 bytes gives 256x32 bit integers header = infile.read(1024) for i, j in [ ("M", 0), ("A", 4), ("S", 8), ("K", 12) ]: if header[j] != i: raise Exception("Not a fit2d mask file") fit2dhdr = numpy.fromstring(header, numpy.int32) self.dim1 = fit2dhdr[4] # 1 less than Andy's fortran self.dim2 = fit2dhdr[5] def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ fin = self._open(fname) self._readheader(fin) # Compute image size self.bytecode = numpy.uint8 self.bpp = len(numpy.array(0, self.bytecode).tostring()) # integer division num_ints = (self.dim1 + 31) // 32 total = self.dim2 * num_ints * 4 data = fin.read(total) assert len(data) == total fin.close() # Now to unpack it data = numpy.fromstring(data, numpy.uint8) data = numpy.reshape(data, (self.dim2, num_ints * 4)) result = numpy.zeros((self.dim2, num_ints * 4 * 8), numpy.uint8) # Unpack using bitwise comparisons to 2**n bits = numpy.ones((1), numpy.uint8) for i in range(8): temp = numpy.bitwise_and(bits, data) result[:, i::8] = temp.astype(numpy.uint8) bits = bits * 2 # Extra rows needed for packing odd dimensions spares = num_ints * 4 * 8 - self.dim1 if spares == 0: self.data = numpy.where(result == 0, 0, 1) else: self.data = numpy.where(result[:, :-spares] == 0, 0, 1) # Transpose appears to be needed to match edf reader (scary??) # self.data = numpy.transpose(self.data) self.data = numpy.reshape(self.data.astype(numpy.uint16), (self.dim2, self.dim1)) self.pilimage = None return self def write(self, fname): """ Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats) """ raise Exception("Not implemented yet") @staticmethod def checkData(data=None): if data is None: return None else: return data.astype(int) fabio-0.1.3/fabio-src/kcdimage.py0000644000175000017500000001003412233175156017345 0ustar jeromejerome00000000000000#!/usr/bin/env python """ Authors: Jerome Kieffer, ESRF email:jerome.kieffer@esrf.fr kcd images are 2D images written by the old KappaCCD diffractometer built by Nonius in the 1990's Based on the edfimage.py parser. """ import numpy, logging import os, string from fabioimage import fabioimage logger = logging.getLogger("kcdimage") DATA_TYPES = {"u16" : numpy.uint16 } MINIMUM_KEYS = [ 'ByteOrder', 'Data type', 'X dimension', 'Y dimension', 'Number of readouts'] DEFAULT_VALUES = { "Data type": "u16" } class kcdimage(fabioimage): """ Read the Nonius kcd data format """ def _readheader(self, infile): """ Read in a header in some KCD format from an already open file @ """ oneLine = infile.readline() alphanum = string.digits + string.letters + ". " asciiHeader = True for oneChar in oneLine.strip(): if not oneChar in alphanum: asciiHeader = False if asciiHeader is False: # This does not look like an edf file logger.warning("First line of %s does not seam to be ascii text!" % infile.name) endOfHeaders = False while not endOfHeaders: oneLine = infile.readline() if len(oneLine) > 100: endOfHeaders = True break if oneLine.strip() == "Binned mode": oneLine = "Mode = Binned" try: key, val = oneLine.split('=' , 1) except: endOfHeaders = True break key = key.strip() self.header_keys.append(key) self.header[key] = val.strip() missing = [] for item in MINIMUM_KEYS: if item not in self.header_keys: missing.append(item) if len(missing) > 0: logger.debug("KCD file misses the keys " + " ".join(missing)) def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname, "rb") self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['X dimension']) self.dim2 = int(self.header['Y dimension']) except: raise Exception("KCD file %s is corrupt, cannot read it" % fname) try: bytecode = DATA_TYPES[self.header['Data type']] self.bpp = len(numpy.array(0, bytecode).tostring()) except KeyError: bytecode = numpy.uint16 self.bpp = 2 logger.warning("Defaulting type to uint16") try: nbReadOut = int(self.header['Number of readouts']) except KeyError: logger.warning("Defaulting number of ReadOut to 1") nbReadOut = 1 fileSize = os.stat(fname)[6] expected_size = self.dim1 * self.dim2 * self.bpp * nbReadOut infile.seek(fileSize - expected_size) block = infile.read() assert len(block) == expected_size infile.close() #now read the data into the array self.data = numpy.zeros((self.dim2, self.dim1)) try: for i in range(nbReadOut): self.data += numpy.reshape(numpy.fromstring( block[i * expected_size / nbReadOut:(i + 1) * expected_size / nbReadOut], bytecode), [self.dim2, self.dim1]) except: print len(block), bytecode, self.bpp, self.dim2, self.dim1 raise IOError, \ 'Size spec in kcd-header does not match size of image data field' self.bytecode = self.data.dtype.type self.resetvals() # ensure the PIL image is reset self.pilimage = None return self @staticmethod def checkData(data=None): if data is None: return None else: return data.astype(int) fabio-0.1.3/fabio-src/cbfimage.py0000644000175000017500000006564612233175156017361 0ustar jeromejerome00000000000000#!/usr/bin/env python # coding: utf8 """ Authors: Jérôme Kieffer, ESRF email:jerome.kieffer@esrf.fr Cif Binary Files images are 2D images written by the Pilatus detector and others. They use a modified (simplified) byte-offset algorithm. CIF is a library for manipulating Crystallographic information files and tries to conform to the specification of the IUCR """ __author__ = "Jérôme Kieffer" __contact__ = "jerome.kieffer@esrf.eu" __license__ = "GPLv3+" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" __version__ = ["Generated by CIF.py: Jan 2005 - April 2012", "Written by Jerome Kieffer: Jerome.Kieffer@esrf.eu", "On-line data analysis / ISDD ", "ESRF Grenoble (France)"] import os, logging logger = logging.getLogger("cbfimage") import numpy from fabioimage import fabioimage from compression import decByteOffet_numpy, md5sum, compByteOffet_numpy #import time DATA_TYPES = { "signed 8-bit integer" : numpy.int8, "signed 16-bit integer" : numpy.int16, "signed 32-bit integer" : numpy.int32, "signed 64-bit integer" : numpy.int64 } MINIMUM_KEYS = ["X-Binary-Size-Fastest-Dimension", 'ByteOrder', 'Data type', 'X dimension', 'Y dimension', 'Number of readouts'] STARTER = "\x0c\x1a\x04\xd5" PADDING = 512 class cbfimage(fabioimage): """ Read the Cif Binary File data format """ def __init__(self, data=None , header=None, fname=None): """ Constructor of the class CIF Binary File reader. @param _strFilename: the name of the file to open @type _strFilename: string """ fabioimage.__init__(self, data, header) self.cif = CIF() if fname is not None: #load the file) self.read(fname) @staticmethod def checkData(data=None): if data is None: return None elif numpy.issubdtype(data.dtype, int): return data else: return data.astype(int) def _readheader(self, inStream): """ Read in a header in some CBF format from a string representing binary stuff @param inStream: file containing the Cif Binary part. @type inStream: opened file. """ self.cif.loadCIF(inStream, _bKeepComment=True) # backport contents of the CIF data to the headers for key in self.cif: if key != "_array_data.data": self.header_keys.append(key) self.header[key] = self.cif[key].strip(" \"\n\r\t") if not "_array_data.data" in self.cif: raise Exception("cbfimage: CBF file %s is corrupt, cannot find data block with '_array_data.data' key" % self.fname) inStream2 = self.cif["_array_data.data"] sep = "\r\n" iSepPos = inStream2.find(sep) if iSepPos < 0 or iSepPos > 80: sep = "\n" #switch back to unix representation lines = inStream2.split(sep) for oneLine in lines[1:]: if len(oneLine) < 10: break try: key, val = oneLine.split(':' , 1) except ValueError: key, val = oneLine.split('=' , 1) key = key.strip() self.header_keys.append(key) self.header[key] = val.strip(" \"\n\r\t") missing = [] for item in MINIMUM_KEYS: if item not in self.header_keys: missing.append(item) if len(missing) > 0: logger.debug("CBF file misses the keys " + " ".join(missing)) def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.filename = fname self.header = {} self.resetvals() infile = self._open(fname, "rb") self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['X-Binary-Size-Fastest-Dimension']) self.dim2 = int(self.header['X-Binary-Size-Second-Dimension']) except: raise Exception(IOError, "CBF file %s is corrupt, no dimensions in it" % fname) try: bytecode = DATA_TYPES[self.header['X-Binary-Element-Type']] self.bpp = len(numpy.array(0, bytecode).tostring()) except KeyError: bytecode = numpy.int32 self.bpp = 32 logger.warning("Defaulting type to int32") if self.header["conversions"] == "x-CBF_BYTE_OFFSET": self.data = self._readbinary_byte_offset(self.cif["_array_data.data"]).astype(bytecode).reshape((self.dim2, self.dim1)) else: raise Exception(IOError, "Compression scheme not yet supported, please contact FABIO development team") self.bytecode = self.data.dtype.type self.resetvals() # # ensure the PIL image is reset self.pilimage = None return self def _readbinary_byte_offset(self, inStream): """ Read in a binary part of an x-CBF_BYTE_OFFSET compressed image @param inStream: the binary image (without any CIF decorators) @type inStream: python string. @return: a linear numpy array without shape and dtype set @rtype: numpy array """ startPos = inStream.find(STARTER) + 4 data = inStream[ startPos: startPos + int(self.header["X-Binary-Size"])] try: import byte_offset except ImportError: logger.warning("Error in byte_offset part: Falling back to Numpy implementation") myData = decByteOffet_numpy(data, size=self.dim1 * self.dim2) else: myData = byte_offset.analyseCython(data, size=self.dim1 * self.dim2) assert len(myData) == self.dim1 * self.dim2 return myData def write(self, fname): """ write the file in CBF format @param fname: name of the file @type: string """ if self.data is not None: self.dim2, self.dim1 = self.data.shape else: raise RuntimeError("CBF image contains no data") binary_blob = compByteOffet_numpy(self.data) # l = len(binary_blob) # if (l % PADDING) != 0: # rem = PADDING - (l % PADDING) # binary_blob += "\x00" * rem dtype = "Unknown" for key, value in DATA_TYPES.iteritems(): if value == self.data.dtype: dtype = key binary_block = [ "--CIF-BINARY-FORMAT-SECTION--", "Content-Type: application/octet-stream;", ' conversions="x-CBF_BYTE_OFFSET"', 'Content-Transfer-Encoding: BINARY', "X-Binary-Size: %d" % (len(binary_blob)), "X-Binary-ID: 1", 'X-Binary-Element-Type: "%s"' % (dtype), "X-Binary-Element-Byte-Order: LITTLE_ENDIAN" , "Content-MD5: %s" % md5sum(binary_blob), "X-Binary-Number-of-Elements: %s" % (self.dim1 * self.dim2), "X-Binary-Size-Fastest-Dimension: %d" % self.dim1, "X-Binary-Size-Second-Dimension: %d" % self.dim2, "X-Binary-Size-Padding: %d" % 1, "", STARTER + binary_blob, "", "--CIF-BINARY-FORMAT-SECTION----" ] if "_array_data.header_contents" not in self.header: nonCifHeaders = [] else: nonCifHeaders = [i.strip()[2:] for i in self.header["_array_data.header_contents"].split("\n") if i.find("# ") >= 0] for key in self.header: if (key not in self.header_keys): self.header_keys.append(key) for key in self.header_keys: if key.startswith("_") : if key not in self.cif or self.cif[key] != self.header[key]: self.cif[key] = self.header[key] elif key.startswith("X-Binary-"): pass elif key.startswith("Content-"): pass elif key.startswith("conversions"): pass elif key.startswith("filename"): pass elif key in self.header: nonCifHeaders.append("%s %s" % (key, self.header[key])) if len(nonCifHeaders) > 0: self.cif["_array_data.header_contents"] = "\r\n".join(["# %s" % i for i in nonCifHeaders]) self.cif["_array_data.data"] = "\r\n".join(binary_block) self.cif.saveCIF(fname, linesep="\r\n", binary=True) ################################################################################ # CIF class ################################################################################ class CIF(dict): """ This is the CIF class, it represents the CIF dictionary; and as a a python dictionary thus inherits from the dict built in class. """ EOL = ["\r", "\n", "\r\n", "\n\r"] BLANK = [" ", "\t"] + EOL START_COMMENT = ["\"", "\'"] BINARY_MARKER = "--CIF-BINARY-FORMAT-SECTION--" def __init__(self, _strFilename=None): """ Constructor of the class. @param _strFilename: the name of the file to open @type _strFilename: filename (str) or file object """ dict.__init__(self) self._ordered = [] if _strFilename is not None: #load the file) self.loadCIF(_strFilename) def __setitem__(self, key, value): if key not in self._ordered: self._ordered.append(key) return dict.__setitem__(self, key, value) def pop(self, key): if key in self._ordered: self._ordered.remove(key) return dict.pop(self, key) def popitem(self, key): if key in self._ordered: self._ordered.remove(key) return dict.popitem(self, key) def loadCIF(self, _strFilename, _bKeepComment=False): """Load the CIF file and populates the CIF dictionary into the object @param _strFilename: the name of the file to open @type _strFilename: string @param _strFilename: the name of the file to open @type _strFilename: string @return: None """ if isinstance(_strFilename, (str, unicode)): if os.path.isfile(_strFilename): infile = open(_strFilename, "rb") else: raise RuntimeError("CIF.loadCIF: No such file to open: %s" % _strFilename) #elif isinstance(_strFilename, file, bz2.BZ2File, ): elif "read" in dir(_strFilename): infile = _strFilename else: raise RuntimeError("CIF.loadCIF: what is %s type %s" % (_strFilename, type(_strFilename))) if _bKeepComment: self._parseCIF(infile.read()) else: self._parseCIF(CIF._readCIF(infile)) readCIF = loadCIF @staticmethod def isAscii(_strIn): """ Check if all characters in a string are ascii, @param _strIn: input string @type _strIn: python string @return: boolean @rtype: boolean """ bIsAcii = True for i in _strIn: if ord(i) > 127: bIsAcii = False break return bIsAcii @staticmethod def _readCIF(_instream): """ - Check if the filename containing the CIF data exists - read the cif file - removes the comments @param _instream: the file containing the CIF data @type _instream: open file in read mode @return: a string containing the raw data @rtype: string """ if not "readlines" in dir(_instream): raise RuntimeError("CIF._readCIF(instream): I expected instream to be an opened file,\ here I got %s type %s" % (_instream, type(_instream))) lLinesRead = _instream.readlines() sText = "" for sLine in lLinesRead: iPos = sLine.find("#") if iPos >= 0: if CIF.isAscii(sLine): sText += sLine[:iPos] + os.linesep if iPos > 80 : logger.warning("This line is too long and could cause problems in PreQuest: %s", sLine) else : sText += sLine if len(sLine.strip()) > 80 : logger.warning("This line is too long and could cause problems in PreQues: %s", sLine) return sText def _parseCIF(self, sText): """ - Parses the text of a CIF file - Cut it in fields - Find all the loops and process - Find all the keys and values @param sText: the content of the CIF - file @type sText: string @return: Nothing, the data are incorporated at the CIF object dictionary @rtype: None """ loopidx = [] looplen = [] loop = [] #first of all : separate the cif file in fields lFields = CIF._splitCIF(sText.strip()) #Then : look for loops for i in range(len(lFields)): if lFields[i].lower() == "loop_": loopidx.append(i) if len(loopidx) > 0: for i in loopidx: loopone, length, keys = CIF._analyseOneLoop(lFields, i) loop.append([keys, loopone]) looplen.append(length) for i in range(len(loopidx) - 1, -1, -1): f1 = lFields[:loopidx[i]] + lFields[loopidx[i] + looplen[i]:] lFields = f1 self["loop_"] = loop for i in range(len(lFields) - 1): # print lFields[i], lFields[i+1] if len(lFields[i + 1]) == 0 : lFields[i + 1] = "?" if lFields[i][0] == "_" and lFields[i + 1][0] != "_": self[lFields[i]] = lFields[i + 1] @staticmethod def _splitCIF(sText): """ Separate the text in fields as defined in the CIF @param sText: the content of the CIF - file @type sText: string @return: list of all the fields of the CIF @rtype: list """ lFields = [] while True: if len(sText) == 0: break elif sText[0] == "'": idx = 0 bFinished = False while not bFinished: idx += 1 + sText[idx + 1:].find("'") ##########debuging in case we arrive at the end of the text if idx >= len(sText) - 1: # print sText,idx,len(sText) lFields.append(sText[1:-1].strip()) sText = "" bFinished = True break if sText[idx + 1] in CIF.BLANK: lFields.append(sText[1:idx].strip()) sText1 = sText[idx + 1:] sText = sText1.strip() bFinished = True elif sText[0] == '"': idx = 0 bFinished = False while not bFinished: idx += 1 + sText[idx + 1:].find('"') ##########debuging in case we arrive at the end of the text if idx >= len(sText) - 1: # print sText,idx,len(sText) lFields.append(sText[1:-1].strip()) # print lFields[-1] sText = "" bFinished = True break if sText[idx + 1] in CIF.BLANK: lFields.append(sText[1:idx].strip()) # print lFields[-1] sText1 = sText[idx + 1:] sText = sText1.strip() bFinished = True elif sText[0] == ';': if sText[1:].strip().find(CIF.BINARY_MARKER) == 0: idx = sText[32:].find(CIF.BINARY_MARKER) if idx == -1: idx = 0 else: idx += 32 + len(CIF.BINARY_MARKER) else: idx = 0 bFinished = False while not bFinished: idx += 1 + sText[idx + 1:].find(';') if sText[idx - 1] in CIF.EOL: lFields.append(sText[1:idx - 1].strip()) sText1 = sText[idx + 1:] sText = sText1.strip() bFinished = True else: f = sText.split(None, 1)[0] lFields.append(f) # print lFields[-1] sText1 = sText[len(f):].strip() sText = sText1 return lFields @staticmethod def _analyseOneLoop(lFields, iStart): """Processes one loop in the data extraction of the CIF file @param lFields: list of all the words contained in the cif file @type lFields: list @param iStart: the starting index corresponding to the "loop_" key @type iStart: integer @return: the list of loop dictionaries, the length of the data extracted from the lFields and the list of all the keys of the loop. @rtype: tuple """ # in earch loop we first search the length of the loop # print lFields # curloop = {} loop = [] keys = [] i = iStart + 1 bFinished = False while not bFinished: if lFields[i][0] == "_": keys.append(lFields[i])#.lower()) i += 1 else: bFinished = True data = [] while True: if i >= len(lFields): break elif len(lFields[i]) == 0: break elif lFields[i][0] == "_": break elif lFields[i] in ["loop_", "stop_", "global_", "data_", "save_"]: break else: data.append(lFields[i]) i += 1 #print len(keys), len(data) k = 0 if len(data) < len(keys): element = {} for j in keys: if k < len(data): element[j] = data[k] else : element[j] = "?" k += 1 #print element loop.append(element) else: #print data #print keys for i in range(len(data) / len(keys)): element = {} for j in keys: element[j] = data[k] k += 1 # print element loop.append(element) # print loop return loop, 1 + len(keys) + len(data), keys ############################################################################################# ######## everything needed to write a cif file ######################################### ############################################################################################# def saveCIF(self, _strFilename="test.cif", linesep=os.linesep, binary=False): """Transforms the CIF object in string then write it into the given file @param _strFilename: the of the file to be written @param linesep: line separation used (to force compatibility with windows/unix) @param binary: Shall we write the data as binary (True only for imageCIF/CBF) @type param: string """ if binary: mode = "wb" else: mode = "w" try: fFile = open(_strFilename, mode) except IOError: print("Error during the opening of file for write: %s" % _strFilename) return fFile.write(self.tostring(_strFilename, linesep)) try: fFile.close() except IOError: print("Error during the closing of file for write: %s" % _strFilename) def tostring(self, _strFilename=None, linesep=os.linesep): """ Converts a cif dictionnary to a string according to the CIF syntax @param _strFilename: the name of the filename to be appended in the header of the CIF file @type _strFilename: string @return: a sting that corresponds to the content of the CIF - file. """ # sCifText = "" lstStrCif = ["# " + i for i in __version__] if "_chemical_name_common" in self: t = self["_chemical_name_common"].split()[0] elif _strFilename is not None: t = os.path.splitext(os.path.split(str(_strFilename).strip())[1])[0] else: t = "" lstStrCif.append("data_%s" % (t)) #first of all get all the keys : lKeys = self.keys() lKeys.sort() for key in lKeys[:]: if key in self._ordered: lKeys.remove(key) self._ordered += lKeys for sKey in self._ordered: if sKey == "loop_": continue if sKey not in self: self._ordered.remove(sKey) logger.debug("Skipping key %s from ordered list as no more present in dict") continue sValue = str(self[sKey]) if sValue.find("\n") > -1: #should add value between ;; lLine = [sKey, ";", sValue, ";", ""] elif len(sValue.split()) > 1: #should add value between '' sLine = "%s '%s'" % (sKey, sValue) if len(sLine) > 80: lLine = [str(sKey), sValue] else: lLine = [sLine] else: sLine = "%s %s" % (sKey, sValue) if len(sLine) > 80: lLine = [str(sKey), sValue] else: lLine = [sLine] lstStrCif += lLine if self.has_key("loop_"): for loop in self["loop_"]: lstStrCif.append("loop_ ") lKeys = loop[0] llData = loop[1] lstStrCif += [" %s" % (sKey) for sKey in lKeys] for lData in llData: sLine = " " for key in lKeys: sRawValue = lData[key] if sRawValue.find("\n") > -1: #should add value between ;; lstStrCif += [sLine, ";", str(sRawValue), ";"] sLine = " " else: if len(sRawValue.split()) > 1: #should add value between '' value = "'%s'" % (sRawValue) else: value = str(sRawValue) if len(sLine) + len(value) > 78: lstStrCif += [sLine] sLine = " " + value else: sLine += " " + value lstStrCif.append(sLine) lstStrCif.append("") return linesep.join(lstStrCif) def exists(self, sKey): """ Check if the key exists in the CIF and is non empty. @param sKey: CIF key @type sKey: string @param cif: CIF dictionary @return: True if the key exists in the CIF dictionary and is non empty @rtype: boolean """ bExists = False if self.has_key(sKey): if len(self[sKey]) >= 1: if self[sKey][0] not in ["?", "."]: bExists = True return bExists def existsInLoop(self, sKey): """ Check if the key exists in the CIF dictionary. @param sKey: CIF key @type sKey: string @param cif: CIF dictionary @return: True if the key exists in the CIF dictionary and is non empty @rtype: boolean """ if not self.exists("loop_"): return False bExists = False if not bExists: for i in self["loop_"]: for j in i[0]: if j == sKey: bExists = True return bExists def loadCHIPLOT(self, _strFilename): """ Load the powder diffraction CHIPLOT file and returns the pd_CIF dictionary in the object @param _strFilename: the name of the file to open @type _strFilename: string @return: the CIF object corresponding to the powder diffraction @rtype: dictionary """ if not os.path.isfile(_strFilename): print "I cannot find the file %s" % _strFilename raise lInFile = open(_strFilename, "r").readlines() self["_audit_creation_method"] = 'From 2-D detector using FIT2D and CIFfile' self["_pd_meas_scan_method"] = "fixed" self["_pd_spec_description"] = lInFile[0].strip() try: iLenData = int(lInFile[3]) except ValueError: iLenData = None lOneLoop = [] try: f2ThetaMin = float(lInFile[4].split()[0]) last = "" for sLine in lInFile[-20:]: if sLine.strip() != "": last = sLine.strip() f2ThetaMax = float(last.split()[0]) limitsOK = True except (ValueError, IndexError): limitsOK = False f2ThetaMin = 180.0 f2ThetaMax = 0 # print "limitsOK:", limitsOK for sLine in lInFile[4:]: sCleaned = sLine.split("#")[0].strip() data = sCleaned.split() if len(data) == 2 : if not limitsOK: f2Theta = float(data[0]) if f2Theta < f2ThetaMin : f2ThetaMin = f2Theta if f2Theta > f2ThetaMax : f2ThetaMax = f2Theta lOneLoop.append({ "_pd_meas_intensity_total": data[1] }) if not iLenData: iLenData = len(lOneLoop) assert (iLenData == len(lOneLoop)) self[ "_pd_meas_2theta_range_inc" ] = "%.4f" % ((f2ThetaMax - f2ThetaMin) / (iLenData - 1)) if self[ "_pd_meas_2theta_range_inc" ] < 0: self[ "_pd_meas_2theta_range_inc" ] = abs (self[ "_pd_meas_2theta_range_inc" ]) tmp = f2ThetaMax f2ThetaMax = f2ThetaMin f2ThetaMin = tmp self[ "_pd_meas_2theta_range_max" ] = "%.4f" % f2ThetaMax self[ "_pd_meas_2theta_range_min" ] = "%.4f" % f2ThetaMin self[ "_pd_meas_number_of_points" ] = str(iLenData) self["loop_"] = [ [ ["_pd_meas_intensity_total" ], lOneLoop ] ] @staticmethod def LoopHasKey(loop, key): "Returns True if the key (string) exist in the array called loop""" try: loop.index(key) return True except ValueError: return False fabio-0.1.3/fabio-src/openimage.py0000644000175000017500000001276412233175156017561 0ustar jeromejerome00000000000000""" Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:henning.sorensen@risoe.dk mods for fabio by JPW """ import sys, logging logger = logging.getLogger("openimage") from fabioutils import FilenameObject from fabioimage import fabioimage import edfimage import adscimage import tifimage import marccdimage import mar345image import fit2dmaskimage import brukerimage import bruker100image import pnmimage import GEimage import OXDimage import dm3image import HiPiCimage import pilatusimage import fit2dspreadsheetimage import kcdimage import cbfimage import xsdimage import binaryimage MAGIC_NUMBERS = [ # "\42\5a" : 'bzipped' # "\1f\8b" : 'gzipped' ("FORMAT : 86" , 'bruker'), ("\x4d\x4d\x00\x2a" , 'tif') , # The marCCD and Pilatus formats are both standard tif with a header # hopefully these byte patterns are unique for the formats # If not the image will be read, but the is missing ("\x49\x49\x2a\x00\x08\x00" , 'marccd') , ("\x49\x49\x2a\x00\x82\x00" , 'pilatus') , ("\x49\x49\x2a\x00" , 'tif') , # ADSC must come before edf ("{\nHEA" , 'adsc'), ("{" , 'edf'), ("\r{" , 'edf'), ("\n{" , 'edf'), ("ADEPT" , 'GE'), ("OD" , 'OXD'), ("IM" , 'HiPiC'), ('\x2d\x04' , 'mar345'), ('\xd2\x04' , 'mar345'), ('\x04\x2d' , 'mar345'), #some machines may need byteswapping ('\x04\xd2' , 'mar345'), # hint : MASK in 32 bit ('M\x00\x00\x00A\x00\x00\x00S\x00\x00\x00K\x00\x00\x00' , 'fit2dmask') , ('\x00\x00\x00\x03' , 'dm3'), ("No" , "kcd"), ("<" , "xsd") ] def do_magic(byts): """ Try to interpret the bytes starting the file as a magic number """ for magic, format_type in MAGIC_NUMBERS: if byts.find(magic) == 0: return format_type if 0: # debugging - bruker needed 18 bytes below logger.debug("m: %s f: %s", magic, format_type) logger.debug("bytes: %s len(bytes) %s", magic, len(magic)) logger.debug("found: %s", byts.find(magic)) for i in range(len(magic)): logger.debug("%s %s %s %s ", ord(magic[i]), ord(byts[i]), magic[i], byts[i]) raise Exception("Could not interpret magic string") def openimage(filename, frame=None): """ Try to open an image """ if isinstance(filename, FilenameObject): try: logger.debug("Attempting to open %s" % (filename.tostring())) obj = _openimage(filename.tostring()) logger.debug("Attempting to read frame %s from %s" % (frame, filename.tostring())) obj = obj.read(filename.tostring(), frame) except Exception, ex: # multiframe file #logger.debug( "DEBUG: multiframe file, start # %d"%( # filename.num) logger.debug("Exception %s, trying name %s" % (ex, filename.stem)) obj = _openimage(filename.stem) logger.debug("Reading frame %s from %s" % (filename.num, filename.stem)) obj.read(filename.stem, frame=filename.num) else: logger.debug("Attempting to open %s" % (filename)) obj = _openimage(filename) logger.debug("Attempting to read frame %s from %s" % (frame, filename)) obj = obj.read(filename, frame) return obj def openheader(filename): """ return only the header""" obj = _openimage(filename) obj.readheader(filename) return obj def _openimage(filename): """ determine which format for a filename and return appropriate class which can be used for opening the image """ try: imo = fabioimage() byts = imo._open(filename).read(18) filetype = do_magic(byts) if filetype == "marccd" and filename.find("mccd") == -1: # Cannot see a way around this. Need to find something # to distinguish mccd from regular tif... filetype = "tif" except IOError, error: logger.error("%s: File probably does not exist", error) raise error except: try: file_obj = FilenameObject(filename=filename) if file_obj == None: raise Exception("Unable to deconstruct filename") if (file_obj.format is not None) and\ len(file_obj.format) != 1 and \ type(file_obj.format) != type(["list"]): # one of OXD/ ADSC - should have got in previous raise Exception("openimage failed on magic bytes & name guess") filetype = file_obj.format #UNUSED filenumber = file_obj.num except Exception, error: logger.error(error) import traceback traceback.print_exc() raise Exception("Fabio could not identify " + filename) klass_name = "".join(filetype) + 'image' module = sys.modules.get("fabio." + klass_name, None) if module is not None: if hasattr(module, klass_name): klass = getattr(module, klass_name) else: raise Exception("Module %s has no image class" % module) else: raise Exception("Filetype not known %s %s" % (filename, klass_name)) obj = klass() # skip the read for read header return obj fabio-0.1.3/fabio-src/dm3image.py0000644000175000017500000002211212233175156017267 0ustar jeromejerome00000000000000""" Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk + Jon Wright, ESRF """ import logging import numpy from fabioimage import fabioimage logger = logging.getLogger("dm3image") DATA_TYPES = { 2 : numpy.int16, 4 : numpy.uint16, 3 : numpy.int32, 5 : numpy.uint32, 6 : numpy.float32, 7 : numpy.float, 8 : numpy.int8, 9 : None, 10 : None, 15 : 'Struct', 18 : None, 20 : None } DATA_BYTES = { 2 : 2, 4 : 2, 3 : 4, 5 : 4, 6 : 4, 7 : 8, 8 : 1, 9 : None, 10 : None, 15 : 'Struct', 18 : None, 20 : None } class dm3image(fabioimage): """ Read and try to write the dm3 data format """ def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs) self.encoded_datatype = None self.no_data_elements = None self.grouptag_is_sorted = None self.grouptag_is_open = None self.tag_encoded_type = None self.tag_data_type = None self.tag_is_data = None self.grouptag_no_tags = None self.bytes_in_file = None self.tag_label_length = None self.go_on = None def _readheader(self): self.infile.seek(0) file_format = self.readbytes(4, numpy.uint32)[0] # should be 3 assert file_format == 3, 'Wrong file type ' self.bytes_in_file = self.readbytes(4, numpy.uint32)[0] self.byte_order = self.readbytes(4, numpy.uint32)[0] # 0 = big, 1= little print 'read dm3 file - file format ', file_format print 'Bytes in file : ' , self.bytes_in_file print 'Byte order :', self.byte_order, ' - 0 = bigEndian , 1 = littleEndian' if self.byte_order == 0: self.swap = True elif self.byte_order == 1: self.swap = False else: raise ValueError def read(self, fname, frame=None): self.header = {} self.resetvals() self.infile = self._open(fname, "rb") self._readheader() self.go_on = True print self.go_on while self.go_on: self.read_tag_group() self.read_tag_entry() if self.infile.tell() > self.bytes_in_file: break while self.tag_is_data == 21: self.read_tag_entry() if self.infile.tell() > self.bytes_in_file: self.go_on = False (dim1_raw, dim2_raw) = self.header['Active Size (pixels)'].split() (dim1_raw, dim2_raw) = (eval(dim1_raw), eval(dim2_raw)) (dim1_binning, dim2_binning) = self.header['Binning'].split() (dim1_binning, dim2_binning) = (eval(dim1_binning), eval(dim2_binning)) self.dim1 = dim1_raw / dim1_binning self.dim2 = dim2_raw / dim2_binning #print dim1,dim2 if self.header.has_key('Data'): self.data = self.header['Data'].reshape(self.dim1, self.dim2) def readbytes(self, bytes_to_read, format, swap=True): raw = self.infile.read(bytes_to_read) if format != None: data = numpy.fromstring(raw, format) else: data = raw if swap: data = data.byteswap() return data def read_tag_group(self): self.grouptag_is_sorted = self.readbytes(1, numpy.uint8)[0] self.grouptag_is_open = self.readbytes(1, numpy.uint8)[0] self.grouptag_no_tags = self.readbytes(4, numpy.uint32)[0] logger.debug('TagGroup is sorted? %s', self.grouptag_is_sorted) logger.debug('TagGroup is open? %s', self.grouptag_is_open) logger.debug('no of tags in TagGroup %s', self.grouptag_no_tags) def read_tag_entry(self): self.tag_is_data = self.readbytes(1, numpy.uint8)[0] self.tag_label_length = self.readbytes(2, numpy.uint16)[0] logger.debug('does Tag have data ? %s - 20 = Tag group , 21 = data ', self.tag_is_data) logger.debug('length of tag_label ', self.tag_label_length) if self.tag_label_length != 0: tag_label = self.infile.read(self.tag_label_length) else: tag_label = None if self.tag_is_data == 21: # This is data self.header[tag_label] = self.read_tag_type() logger.debug("%s: %s", tag_label, self.header[tag_label]) def read_tag_type(self): if self.infile.read(4) != '%%%%': raise IOError self.tag_data_type = self.readbytes(4, numpy.uint32)[0] logger.debug('data is of type : %s - 1 = simple, 2= string, 3 = array, >3 structs', self.tag_data_type) self.tag_encoded_type = self.readbytes(4, numpy.uint32)[0] logger.debug('encode type: %s %s', self.tag_encoded_type, DATA_TYPES[ self.tag_encoded_type]) if self.tag_data_type == 1: # simple type return self.readbytes(DATA_BYTES[ self.tag_encoded_type], DATA_TYPES[ self.tag_encoded_type], swap=self.swap)[0] # are the data stored in a simple array? if self.tag_encoded_type == 20 and self.tag_data_type == 3 : self.data_type = self.readbytes(4, numpy.uint32)[0] self.no_data_elements = self.readbytes(4, numpy.uint32)[0] if self.data_type == 10: logger.debug('skip bytes %s', self.no_data_elements) dump = self.infile.read(self.no_data_elements) return None logger.debug('Data are stored as a simple a array -') logger.debug('%s data elemets stored as %s', self.no_data_elements, self.data_type) read_no_bytes = DATA_BYTES[self.data_type] * self.no_data_elements format = DATA_TYPES[self.data_type] return self.readbytes(read_no_bytes, format, swap=self.swap) # are the data stored in a complex array ? # print 'tag_type + data_type', self.tag_encoded_type,self.tag_data_type #print self.tag_encoded_type , self.tag_data_type if self.tag_encoded_type == 20 and self.tag_data_type > 3 : self.tag_encoded_type = self.readbytes(4, numpy.uint32)[0] logger.debug('found array - new tag_encoded_type %s', self.tag_encoded_type) if self.tag_encoded_type == 15: # struct type ###type = self.readbytes(4,numpy.int32) struct_name_length = self.readbytes(4, numpy.int32)[0] struct_number_fields = self.readbytes(4, numpy.int32)[0] #print 'struct - name_length, number_field', struct_name_length,struct_number_fields #print self.infile.read(struct_name_length) field_info = [] for i in range(struct_number_fields): field_info.append([self.readbytes(4, numpy.int32)[0], self.readbytes(4, numpy.int32)[0]]) #print field_info self.no_data_elements = self.readbytes(4, numpy.int32)[0] #print '%i data elemets stored as ' %self.no_data_elements bytes_in_struct = 0 for i in range(struct_number_fields): bytes_in_struct += DATA_BYTES[field_info[i][1]] logger.debug('skip bytes %s', self.no_data_elements * bytes_in_struct) dump = self.infile.read(self.no_data_elements * bytes_in_struct) return None if self.tag_encoded_type == 15: # struct type ###type = self.readbytes(4,numpy.int32) struct_name_length = self.readbytes(4, numpy.int32)[0] struct_number_fields = self.readbytes(4, numpy.int32)[0] #print 'struct - name_length, number_field', struct_name_length,struct_number_fields #print self.infile.read(struct_name_length) field_info = [] for i in range(struct_number_fields): field_info.append([self.readbytes(4, numpy.int32)[0], self.readbytes(4, numpy.int32)[0]]) #print field_info field_data = '' for i in range(struct_number_fields): #print type(i) field_data = field_data + self.readbytes(field_info[i][0], None, swap=False) + ' ' field_data = field_data + '%i ' % self.readbytes(DATA_BYTES[field_info[i][1]], DATA_TYPES[field_info[i][1]], swap=self.swap)[0] return field_data def read_data(self): self.encoded_datatype = numpy.fromstring(self.infile.read(4), numpy.uint32).byteswap() fabio-0.1.3/fabio-src/adscimage.py0000644000175000017500000001120112233175156017513 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk + mods for fabio by JPW """ import numpy, logging from fabioimage import fabioimage logger = logging.getLogger("adscimage") class adscimage(fabioimage): """ Read an image in ADSC format (quite similar to edf?) """ def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs) def read(self, fname, frame=None): """ read in the file """ infile = self._open(fname, "rb") try: self._readheader(infile) except: raise Exception("Error processing adsc header") # banned by bzip/gzip??? try: infile.seek(int(self.header['HEADER_BYTES']), 0) except TypeError: # Gzipped does not allow a seek and read header is not # promising to stop in the right place infile.close() infile = self._open(fname, "rb") infile.read(int(self.header['HEADER_BYTES'])) binary = infile.read() infile.close() #now read the data into the array self.dim1 = int(self.header['SIZE1']) self.dim2 = int(self.header['SIZE2']) if 'little' in self.header['BYTE_ORDER']: try: self.data = numpy.reshape( numpy.fromstring(binary, numpy.uint16), (self.dim2, self.dim1)) except ValueError: raise IOError, 'Size spec in ADSC-header does not match ' + \ 'size of image data field' self.bytecode = numpy.uint16 logger.info("adscimage read in using low byte first (x386-order)") else: try: self.data = numpy.reshape( numpy.fromstring(binary, numpy.uint16), (self.dim2, self.dim1)).byteswap() except ValueError: raise IOError, 'Size spec in ADSC-header does not match ' + \ 'size of image data field' self.bytecode = numpy.uint16 logger.info('adscimage using high byte first (network order)') self.resetvals() return self def _readheader(self, infile): """ read an adsc header """ line = infile.readline() bytesread = len(line) while '}' not in line: if '=' in line: (key, val) = line.split('=') self.header_keys.append(key.strip()) self.header[key.strip()] = val.strip(' ;\n') line = infile.readline() bytesread = bytesread + len(line) def write(self, fname): """ Write adsc format """ out = '{\n' for key in self.header_keys: out += "%s = %s;\n" % (key, self.header[key]) # FIXME ??? - made padding match header bytes keyword # the cbflib example image has exactly 512... if self.header.has_key("HEADER_BYTES"): pad = int(self.header["HEADER_BYTES"]) - len(out) - 2 else: # integer division # 1234567890123456789012 # HEADER_BYTES = 1234;\n hsize = ((len(out) + 23) / 512 + 1) * 512 out += "HEADER_BYTES=%d;\n" % (hsize) pad = hsize - len(out) - 2 out += pad * ' ' + "}\n" assert len(out) % 512 == 0 , "Header is not multiple of 512" outf = open(fname, "wb") outf.write(out) # it says "unsigned_short" ? ... jpw example has: # BYTE_ORDER=big_endian; # TYPE=unsigned_short; if "little" in self.header["BYTE_ORDER"]: outf.write(self.data.astype(numpy.uint16).tostring()) else: outf.write(self.data.byteswap().astype( numpy.uint16).tostring()) outf.close() def test(): """ testcase """ import sys, time img = adscimage() begin = time.clock() while (sys.argv[1:]): img.read(sys.argv[1]) # rim = img.toPIL16() img.rebin(2, 2) img.write('jegErEnFil0000.img') print sys.argv[1] + ": max=%d, min=%d, mean=%.2e, stddev=%.2e" % (\ img.getmax(), img.getmin(), img.getmean(), img.getstddev()) print 'integrated intensity (%d %d %d %d) =%.3f' % (\ 10, 20, 20, 40, img.integrate_area((10, 20, 20, 40))) sys.argv[1:] = sys.argv[2:] end = time.clock() print end - begin if __name__ == '__main__': test() fabio-0.1.3/fabio-src/edfimage.py0000644000175000017500000010742712233175220017347 0ustar jeromejerome00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- """ License: GPLv2+ Authors: ........ * Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk * Jon Wright & Jérôme Kieffer: European Synchrotron Radiation Facility; Grenoble (France) """ from __future__ import with_statement import os, logging, types logger = logging.getLogger("edfimage") import numpy from fabioimage import fabioimage from fabioutils import isAscii, toAscii, nice_int from compression import decBzip2, decGzip, decZlib BLOCKSIZE = 512 DATA_TYPES = { "SignedByte" : numpy.int8, "Signed8" : numpy.int8, "UnsignedByte" : numpy.uint8, "Unsigned8" : numpy.uint8, "SignedShort" : numpy.int16, "Signed16" : numpy.int16, "UnsignedShort" : numpy.uint16, "Unsigned16" : numpy.uint16, "UnsignedShortInteger" : numpy.uint16, "SignedInteger" : numpy.int32, "Signed32" : numpy.int32, "UnsignedInteger": numpy.uint32, "Unsigned32" : numpy.uint32, "SignedLong" : numpy.int32, "UnsignedLong" : numpy.uint32, "Signed64" : numpy.int64, "Unsigned64" : numpy.uint64, "FloatValue" : numpy.float32, "FLOATVALUE" : numpy.float32, "FLOAT" : numpy.float32, # fit2d "Float" : numpy.float32, # fit2d "FloatIEEE32" : numpy.float32, "Float32" : numpy.float32, "Double" : numpy.float64, "DoubleValue" : numpy.float64, "FloatIEEE64" : numpy.float64, "DoubleIEEE64" : numpy.float64} try: DATA_TYPES["FloatIEEE128" ] = numpy.float128 DATA_TYPES["DoubleIEEE128" ] = numpy.float128 DATA_TYPES["QuadrupleValue" ] = numpy.float128 except AttributeError: # not in your numpy pass NUMPY_EDF_DTYPE = {"int8" :"SignedByte", "int16" :"SignedShort", "int32" :"SignedInteger", "int64" :"Signed64", "uint8" :"UnsignedByte", "uint16" :"UnsignedShort", "uint32" :"UnsignedInteger", "uint64" :"Unsigned64", "float32" :"FloatValue", "float64" :"DoubleValue", "float128" :"QuadrupleValue", } MINIMUM_KEYS = ['HEADERID', 'IMAGE', 'BYTEORDER', 'DATATYPE', 'DIM_1', 'DIM_2', 'SIZE'] # Size is thought to be essential for writing at least DEFAULT_VALUES = { # I do not define default values as they will be calculated at write time # JK20110415 } class Frame(object): """ A class representing a single frame in an EDF file """ def __init__(self, data=None, header=None, header_keys=None, number=None): if header is None: self.header = {} else: self.header = dict(header) if header_keys is None: self.header_keys = self.header.keys() else: self.header_keys = header_keys[:] for key in header_keys: if key not in self.header: logger.warning("Header key %s, in header_keys is not in header dictionary, poping !!!" % key) self.header_keys.remove(key) self.capsHeader = {} for key in self.header_keys: try: self.capsHeader[key.upper()] = key except AttributeError: logger.warning("Header key %s is not a string" % key) self._data = data self.dims = [] self.dim1 = 0 self.dim2 = 0 self.start = None # Position of start of raw data in file self.size = None # size of raw data in file self.file = None # opened file object with locking capabilities !!! self.bpp = None self._bytecode = None if (number is not None) and isinstance(number, int): self.iFrame = number else: self.iFrame = 0 def parseheader(self, block): """ Parse the header in some EDF format from an already open file @param block: string representing the header block @type block: string, should be full ascii @return: size of the binary blob """ #reset values ... self.header = {} self.capsHeader = {} self.header_keys = [] self.size = None calcsize = 1 self.dims = [] for line in block.split(';'): if '=' in line: key, val = line.split('=' , 1) # Why would someone put null bytes in a header? key = key.replace("\x00"," ").strip() self.header[key] = val.replace("\x00"," ").strip() self.capsHeader[key.upper()] = key self.header_keys.append(key) # Compute image size if "SIZE" in self.capsHeader: try: self.size = nice_int(self.header[self.capsHeader["SIZE"]]) except ValueError: logger.warning("Unable to convert to integer : %s %s " % (self.capsHeader["SIZE"], self.header[self.capsHeader["SIZE"]])) if "DIM_1" in self.capsHeader: try: dim1 = nice_int(self.header[self.capsHeader['DIM_1']]) except ValueError: logger.error("Unable to convert to integer Dim_1: %s %s" % (self.capsHeader["DIM_1"], self.header[self.capsHeader["DIM_1"]])) else: calcsize *= dim1 self.dims.append(dim1) else: logger.error("No Dim_1 in headers !!!") if "DIM_2" in self.capsHeader: try: dim2 = nice_int(self.header[self.capsHeader['DIM_2']]) except ValueError: logger.error("Unable to convert to integer Dim_3: %s %s" % (self.capsHeader["DIM_2"], self.header[self.capsHeader["DIM_2"]])) else: calcsize *= dim2 self.dims.append(dim2) else: logger.error("No Dim_2 in headers !!!") iDim = 3 # JON: this appears to be for nD images, but we don't treat those while iDim is not None: strDim = "DIM_%i" % iDim if strDim in self.capsHeader: try: dim3 = nice_int(self.header[self.capsHeader[strDim]]) except ValueError: logger.error("Unable to convert to integer %s: %s %s" % (strDim, self.capsHeader[strDim], self.header[self.capsHeader[strDim]])) dim3 = None iDim = None else: if dim3 > 1: # Otherwise treat dim3==1 as a 2D image calcsize *= dim3 self.dims.append(dim3) iDim += 1 else: logger.debug("No Dim_3 -> it is a 2D image") iDim = None if self._bytecode is None: if "DATATYPE" in self.capsHeader: self._bytecode = DATA_TYPES[self.header[self.capsHeader['DATATYPE']]] else: self._bytecode = numpy.uint16 logger.warning("Defaulting type to uint16") self.bpp = len(numpy.array(0, self._bytecode).tostring()) calcsize *= self.bpp if (self.size is None): self.size = calcsize elif (self.size != calcsize): if ("COMPRESSION" in self.capsHeader) and (self.header[self.capsHeader['COMPRESSION']].upper().startswith("NO")): logger.info("Mismatch between the expected size %s and the calculated one %s" % (self.size, calcsize)) self.size = calcsize for i, n in enumerate(self.dims): setattr(self, "dim%i" % (i + 1), n) return self.size def swap_needed(self): """ Decide if we need to byteswap """ if ('Low' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('High' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): return False if ('High' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('Low' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): if self.bpp in [2, 4, 8]: return True else: return False def getData(self): """ Unpack a binary blob according to the specification given in the header @return: dataset as numpy.ndarray """ data = None if self._data is not None: data = self._data elif self.file is None: data = self._data else: if self._bytecode is None: if "DATATYPE" in self.capsHeader: self._bytecode = DATA_TYPES[self.header[self.capsHeader["DATATYPE"]]] else: self._bytecode = numpy.uint16 dims = self.dims[:] dims.reverse() with self.file.lock: if self.file.closed: logger.error("file: %s from %s is closed. Cannot read data." % (self.file, self.file.filename)) return else: self.file.seek(self.start) fileData = self.file.read(self.size) if ("COMPRESSION" in self.capsHeader): compression = self.header[self.capsHeader["COMPRESSION"]].upper() uncompressed_size = self.bpp for i in dims: uncompressed_size *= i if "OFFSET" in compression : try: import byte_offset#IGNORE:F0401 except ImportError, error: logger.error("Unimplemented compression scheme: %s (%s)" % (compression, error)) else: myData = byte_offset.analyseCython(fileData, size=uncompressed_size) rawData = myData.astype(self._bytecode).tostring() self.size = uncompressed_size elif compression == "NONE": rawData = fileData elif "GZIP" in compression: rawData = decGzip(fileData) self.size = uncompressed_size elif "BZ" in compression : rawData = decBzip2(fileData) self.size = uncompressed_size elif "Z" in compression : rawData = decZlib(fileData) self.size = uncompressed_size else: logger.warning("Unknown compression scheme %s" % compression) rawData = fileData else: rawData = fileData expected = self.size obtained = len(rawData) if expected > obtained: logger.error("Data stream is incomplete: %s < expected %s bytes" % (obtained, expected)) rawData += "\x00" * (expected - obtained) elif expected < len(rawData): logger.info("Data stream contains trailing junk : %s > expected %s bytes" % (obtained, expected)) rawData = rawData[:expected] if self.swap_needed(): data = numpy.fromstring(rawData, self._bytecode).byteswap().reshape(tuple(dims)) else: data = numpy.fromstring(rawData, self._bytecode).reshape(tuple(dims)) self._data = data self._bytecode = data.dtype.type return data def setData(self, npa=None): """Setter for data in edf frame""" self._data = npa data = property(getData, setData, "property: (edf)frame.data, uncompress the datablock when needed") def getByteCode(self): if self._bytecode is None: self._bytecode = self.data.dtype.type return self._bytecode def setByteCode(self, _iVal): self._bytecode = _iVal bytecode = property(getByteCode, setByteCode) def getEdfBlock(self, force_type=None, fit2dMode=False): """ @param force_type: type of the dataset to be enforced like "float64" or "uint16" @type force_type: string or numpy.dtype @param fit2dMode: enforce compatibility with fit2d and starts countimg number of images at 1 @type fit2dMode: boolean @return: ascii header block @rtype: python string with the concatenation of the ascii header and the binary data block """ if force_type is not None: data = self.data.astype(force_type) else: data = self.data fit2dMode = bool(fit2dMode) for key in self.header: KEY = key.upper() if KEY not in self.capsHeader: self.capsHeader[KEY] = key if key not in self.header_keys: self.header_keys.append(key) header = self.header.copy() header_keys = self.header_keys[:] capsHeader = self.capsHeader.copy() listHeader = ["{\n"] # First of all clean up the headers: for i in capsHeader: if "DIM_" in i: header.pop(capsHeader[i]) header_keys.remove(capsHeader[i]) for KEY in ["SIZE", "EDF_BINARYSIZE", "EDF_HEADERSIZE", "BYTEORDER", "DATATYPE", "HEADERID", "IMAGE"]: if KEY in capsHeader: header.pop(capsHeader[KEY]) header_keys.remove(capsHeader[KEY]) if "EDF_DATABLOCKID" in capsHeader: header_keys.remove(capsHeader["EDF_DATABLOCKID"]) #but do not remove the value from dict, instead reset the key ... if capsHeader["EDF_DATABLOCKID"] != "EDF_DataBlockID": header["EDF_DataBlockID"] = header.pop(capsHeader["EDF_DATABLOCKID"]) capsHeader["EDF_DATABLOCKID"] = "EDF_DataBlockID" # Then update static headers freshly deleted header_keys.insert(0, "Size") header["Size"] = len(data.tostring()) header_keys.insert(0, "HeaderID") header["HeaderID"] = "EH:%06d:000000:000000" % (self.iFrame + fit2dMode) header_keys.insert(0, "Image") header["Image"] = str(self.iFrame + fit2dMode) dims = list(data.shape) nbdim = len(dims) for i in dims: key = "Dim_%i" % nbdim header[key] = i header_keys.insert(0, key) nbdim -= 1 header_keys.insert(0, "DataType") header["DataType"] = NUMPY_EDF_DTYPE[str(numpy.dtype(data.dtype))] header_keys.insert(0, "ByteOrder") if numpy.little_endian: header["ByteOrder"] = "LowByteFirst" else: header["ByteOrder"] = "HighByteFirst" approxHeaderSize = 100 for key in header: approxHeaderSize += 7 + len(key) + len(str(header[key])) approxHeaderSize = BLOCKSIZE * (approxHeaderSize // BLOCKSIZE + 1) header_keys.insert(0, "EDF_HeaderSize") header["EDF_HeaderSize"] = "%5s" % (approxHeaderSize) header_keys.insert(0, "EDF_BinarySize") header["EDF_BinarySize"] = len(data.tostring()) header_keys.insert(0, "EDF_DataBlockID") if not "EDF_DataBlockID" in header: header["EDF_DataBlockID"] = "%i.Image.Psd" % (self.iFrame + fit2dMode) preciseSize = 4 #2 before {\n 2 after }\n for key in header_keys: #Escape keys or values that are no ascii strKey = str(key) if not isAscii(strKey, listExcluded=["}", "{"]): logger.warning("Non ascii key %s, skipping" % strKey) continue strValue = str(header[key]) if not isAscii(strValue, listExcluded=["}", "{"]): logger.warning("Non ascii value %s, skipping" % strValue) continue line = strKey + " = " + strValue + " ;\n" preciseSize += len(line) listHeader.append(line) if preciseSize > approxHeaderSize: logger.error("I expected the header block only at %s in fact it is %s" % (approxHeaderSize, preciseSize)) for idx, line in enumerate(listHeader[:]): if line.startswith("EDF_HeaderSize"): headerSize = BLOCKSIZE * (preciseSize // BLOCKSIZE + 1) newline = "EDF_HeaderSize = %5s ;\n" % headerSize delta = len(newline) - len(line) if (preciseSize // BLOCKSIZE) != ((preciseSize + delta) // BLOCKSIZE): headerSize = BLOCKSIZE * ((preciseSize + delta) // BLOCKSIZE + 1) newline = "EDF_HeaderSize = %5s ;\n" % headerSize preciseSize = preciseSize + delta listHeader[idx] = newline break else: headerSize = approxHeaderSize listHeader.append(" "*(headerSize - preciseSize) + "}\n") return "".join(listHeader) + data.tostring() class edfimage(fabioimage): """ Read and try to write the ESRF edf data format """ def __init__(self, data=None , header=None, header_keys=None, frames=None): self.currentframe = 0 self.filesize = None try: dim = len(data.shape) except Exception, error: #IGNORE:W0703 logger.debug("Data don't look like a numpy array (%s), resetting all!!" % error) data = None dim = 0 fabioimage.__init__(self, data, header) if dim == 2: fabioimage.__init__(self, data, header) elif dim == 1 : data.shape = (0, len(data)) fabioimage.__init__(self, data, header) elif dim == 3 : fabioimage.__init__(self, data[0, :, :], header) elif dim == 4 : fabioimage.__init__(self, data[0, 0, :, :], header) elif dim == 5 : fabioimage.__init__(self, data[0, 0, 0, :, :], header) if frames is None: frame = Frame(data=self.data, header=self.header, header_keys=header_keys , number=self.currentframe) self.__frames = [frame] else: self.__frames = frames @staticmethod def checkHeader(header=None): """ Empty for fabioimage but may be populated by others classes """ if type(header) != types.DictionaryType: return {} new = {} for key, value in header.items(): new[toAscii(key, ";{}")] = toAscii(value, ";{}") return new @staticmethod def _readHeaderBlock(infile): """ Read in a header in some EDF format from an already open file @param infile: file object open in read mode @return: string (or None if no header was found. """ MAX_HEADER_SIZE = BLOCKSIZE * 20 block = infile.read(BLOCKSIZE) if len(block) < BLOCKSIZE: logger.debug("Under-short header: only %i bytes in %s" % (len(block), infile.name)) return if (block.find("{") < 0) : # This does not look like an edf file logger.warning("no opening {. Corrupt header of EDF file %s" % infile.name) return if "EDF_HeaderSize" in block: start = block.index("EDF_HeaderSize") chunk = block[start:].split("=")[1].strip() try: new_max_header_size = int(chunk.split(";")[0].strip()) except Exception: logger.warning("Unable to read header size in %s" % chunk) else: if new_max_header_size > MAX_HEADER_SIZE: logger.info("Redefining MAX_HEADER_SIZE to %s" % new_max_header_size) MAX_HEADER_SIZE = new_max_header_size while '}' not in block: block = block + infile.read(BLOCKSIZE) if len(block) > MAX_HEADER_SIZE: logger.warning("Runaway header in EDF file MAX_HEADER_SIZE: %s \n%s" % (MAX_HEADER_SIZE, block)) return start = block.find("{") + 1 end = block.find("}") # Now it is essential to go to the start of the binary part if block[end: end + 3] == "}\r\n": offset = end + 3 - len(block) elif block[end: end + 2] == "}\n": offset = end + 2 - len(block) else: logger.error("Unable to locate start of the binary section") offset = None if offset is not None: infile.seek(offset, os.SEEK_CUR) return block[start:end] def _readheader(self, infile): """ Read all headers in a file and populate self.header data is not yet populated @type infile: file object open in read mode """ self.__frames = [] bContinue = True while bContinue: block = self._readHeaderBlock(infile) if block is None: bContinue = False break frame = Frame(number=self.nframes) size = frame.parseheader(block) frame.file = infile frame.start = infile.tell() frame.size = size self.__frames += [frame] try: infile.seek(size, os.SEEK_CUR) except Exception, error: logger.warning("infile is %s" % infile) logger.warning("Position is %s" % infile.tell()) logger.warning("size is %s" % size) logger.error("It seams this error occurs under windows when reading a (large-) file over network: %s ", error) raise Exception(error) if frame.start + size > infile.size: logger.warning("Non complete datablock: got %s, expected %s" % (infile.size - frame.start, size)) bContinue = False break for i, frame in enumerate(self.__frames): missing = [] for item in MINIMUM_KEYS: if item not in frame.capsHeader: missing.append(item) if len(missing) > 0: logger.info("EDF file %s frame %i misses mandatory keys: %s " % (self.filename, i, " ".join(missing))) self.currentframe = 0 def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.resetvals() self.filename = fname infile = self._open(fname, "rb") self._readheader(infile) if frame is None: pass elif frame < self.nframes: self = self.getframe(frame) else: logger.error("Reading file %s You requested frame %s but only %s frames are available", fname, frame, self.nframes) self.resetvals() # ensure the PIL image is reset self.pilimage = None return self def swap_needed(self): """ Decide if we need to byteswap """ if ('Low' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('High' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): return False if ('High' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ ('Low' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): if self.bpp in [2, 4, 8]: return True else: return False def unpack(self): """ Unpack a binary blob according to the specification given in the header and return the dataset @return: dataset as numpy.ndarray """ return self.__frames[self.currentframe].getData() def getframe(self, num): """ returns the file numbered 'num' in the series as a fabioimage """ newImage = None if self.nframes == 1: logger.debug("Single frame EDF; having fabioimage default behavour: %s" % num) newImage = fabioimage.getframe(self, num) elif num in xrange(self.nframes): logger.debug("Multi frame EDF; having edfimage specific behavour: %s/%s" % (num, self.nframes)) newImage = edfimage(frames=self.__frames) newImage.currentframe = num newImage.filename = self.filename else: txt = "Cannot access frame: %s/%s" % (num, self.nframes) logger.error(txt) raise ValueError("edfimage.getframe:" + txt) return newImage def previous(self): """ returns the previous file in the series as a fabioimage """ newImage = None if self.nframes == 1: newImage = fabioimage.previous(self) else: newFrameId = self.currentframe - 1 newImage = self.getframe(newFrameId) return newImage def next(self): """ returns the next file in the series as a fabioimage """ newImage = None if self.nframes == 1: newImage = fabioimage.next(self) else: newFrameId = self.currentframe + 1 newImage = self.getframe(newFrameId) return newImage def write(self, fname, force_type=None, fit2dMode=False): """ Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats) @param force_type: can be numpy.uint16 or simply "float" @return: None """ with self._open(fname, mode="wb") as outfile: for i, frame in enumerate(self.__frames): frame.iFrame = i outfile.write(frame.getEdfBlock(force_type=force_type, fit2dMode=fit2dMode)) def appendFrame(self, frame=None, data=None, header=None): """ Method used add a frame to an EDF file @param frame: frame to append to edf image @type frame: instance of Frame @return: None """ if isinstance(frame, Frame): self.__frames.append(frame) else: self.__frames.append(Frame(data, header)) def deleteFrame(self, frameNb=None): """ Method used to remove a frame from an EDF image. by default the last one is removed. @param frameNb: frame number to remove, by default the last. @type frameNb: integer @return: None """ if frameNb is None: self.__frames.pop() else: self.__frames.pop(frameNb) def fastReadData(self, filename=None): """ This is a special method that will read and return the data from another file ... The aim is performances, ... but only supports uncompressed files. @return: data from another file using positions from current edfimage """ if (filename is None) or not os.path.isfile(filename): raise RuntimeError("edfimage.fastReadData is only valid with another file: %s does not exist" % (filename)) data = None frame = self.__frames[self.currentframe] with open(filename, "rb")as f: f.seek(frame.start) raw = f.read(frame.size) try: data = numpy.fromstring(raw, dtype=self.bytecode) data.shape = self.data.shape except Exception, err : logger.error("unable to convert file content to numpy array: %s", err) return data def fastReadROI(self, filename, coords=None): """ Method reading Region of Interest of another file based on metadata available in current edfimage. The aim is performances, ... but only supports uncompressed files. @return: ROI-data from another file using positions from current edfimage @rtype: numpy 2darray """ if (filename is None) or not os.path.isfile(filename): raise RuntimeError("edfimage.fastReadData is only valid with another file: %s does not exist" % (filename)) data = None frame = self.__frames[self.currentframe] if len(coords) == 4: slice1 = self.make_slice(coords) elif len(coords) == 2 and isinstance(coords[0], slice) and \ isinstance(coords[1], slice): slice1 = coords else: logger.warning('readROI: Unable to understand Region Of Interest: got %s', coords) return d1 = self.data.shape[-1] start0 = slice1[0].start start1 = slice1[1].start slice2 = (slice(0, slice1[0].stop - start0, slice1[0].step), slice(0, slice1[1].stop - start1, slice1[1].step)) start = frame.start + self.bpp * (d1 * start0 + start1) size = self.bpp * ((slice2[0].stop) * d1) with open(filename, "rb")as f: f.seek(start) raw = f.read(size) try: data = numpy.fromstring(raw, dtype=self.bytecode) data.shape = -1, d1 except Exception, err : logger.error("unable to convert file content to numpy array: %s", err) return data[slice2] ################################################################################ # Properties definition for header, data, header_keys and capsHeader ################################################################################ def getNbFrames(self): """ Getter for number of frames """ return len(self.__frames) def setNbFrames(self, val): """ Setter for number of frames ... should do nothing. Here just to avoid bugs """ if val != len(self.__frames): logger.warning("trying to set the number of frames ") nframes = property(getNbFrames, setNbFrames, "property: number of frames in EDF file") def getHeader(self): """ Getter for the headers. used by the property header, """ return self.__frames[self.currentframe].header def setHeader(self, _dictHeader): """ Enforces the propagation of the header to the list of frames """ try: self.__frames[self.currentframe].header = _dictHeader except AttributeError: self.__frames = [Frame(header=_dictHeader)] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame(header=_dictHeader)) def delHeader(self): """ Deleter for edf header """ self.__frames[self.currentframe].header = {} header = property(getHeader, setHeader, delHeader, "property: header of EDF file") def getHeaderKeys(self): """ Getter for edf header_keys """ return self.__frames[self.currentframe].header_keys def setHeaderKeys(self, _listtHeader): """ Enforces the propagation of the header_keys to the list of frames @param _listtHeader: list of the (ordered) keys in the header @type _listtHeader: python list """ try: self.__frames[self.currentframe].header_keys = _listtHeader except AttributeError: self.__frames = [Frame(header_keys=_listtHeader)] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame(header_keys=_listtHeader)) def delHeaderKeys(self): """ Deleter for edf header_keys """ self.__frames[self.currentframe].header_keys = [] header_keys = property(getHeaderKeys, setHeaderKeys, delHeaderKeys, "property: header_keys of EDF file") def getData(self): """ getter for edf Data @return: data for current frame @rtype: numpy.ndarray """ npaData = None try: npaData = self.__frames[self.currentframe].data except AttributeError: self.__frames = [Frame()] npaData = self.__frames[self.currentframe].data except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) npaData = self.__frames[self.currentframe].data return npaData def setData(self, _data): """ Enforces the propagation of the data to the list of frames @param _data: numpy array representing data """ try: self.__frames[self.currentframe].data = _data except AttributeError: self.__frames = [Frame(data=_data)] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame(data=_data)) def delData(self): """ deleter for edf Data """ self.__frames[self.currentframe].data = None data = property(getData, setData, delData, "property: data of EDF file") def getCapsHeader(self): """ getter for edf headers keys in upper case @return: data for current frame @rtype: dict """ return self.__frames[self.currentframe].capsHeader def setCapsHeader(self, _data): """ Enforces the propagation of the header_keys to the list of frames @param _data: numpy array representing data """ self.__frames[self.currentframe].capsHeader = _data def delCapsHeader(self): """ deleter for edf capsHeader """ self.__frames[self.currentframe].capsHeader = {} capsHeader = property(getCapsHeader, setCapsHeader, delCapsHeader, "property: capsHeader of EDF file, i.e. the keys of the header in UPPER case.") def getDim1(self): return self.__frames[self.currentframe].dim1 def setDim1(self, _iVal): try: self.__frames[self.currentframe].dim1 = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].dim1 = _iVal dim1 = property(getDim1, setDim1) def getDim2(self): return self.__frames[self.currentframe].dim2 def setDim2(self, _iVal): try: self.__frames[self.currentframe].dim2 = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].dim2 = _iVal dim2 = property(getDim2, setDim2) def getDims(self): return self.__frames[self.currentframe].dims dims = property(getDims) def getByteCode(self): return self.__frames[self.currentframe].bytecode def setByteCode(self, _iVal): try: self.__frames[self.currentframe].bytecode = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].bytecode = _iVal bytecode = property(getByteCode, setByteCode) def getBpp(self): return self.__frames[self.currentframe].bpp def setBpp(self, _iVal): try: self.__frames[self.currentframe].bpp = _iVal except AttributeError: self.__frames = [Frame()] except IndexError: if self.currentframe < len(self.__frames): self.__frames.append(Frame()) self.__frames[self.currentframe].bpp = _iVal bpp = property(getBpp, setBpp) fabio-0.1.3/fabio-src/readbytestream.py0000644000175000017500000000477212120434325020617 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ Reads a bytestream Authors: Jon Wright Henning O. Sorensen & Erik Knudsen ESRF Risoe National Laboratory """ import numpy, logging logger = logging.getLogger("readbytestream") DATATYPES = { # type sign bytes ("int", 'n', 1) : numpy.uint8, ("int", 'n', 2) : numpy.uint16, ("int", 'n', 4) : numpy.uint32, ("int", 'y', 1) : numpy.int8, ("int", 'y', 2) : numpy.int16, ("int", 'y', 4) : numpy.int32, ('float', 'y', 4) : numpy.float32, # does this occur in bruker? ('double', 'y', 4): numpy.float64 } def readbytestream(fil, offset, x, y, nbytespp, datatype='int', signed='n', swap='n', typeout=numpy.uint16): """ Reads in a bytestream from a file (which may be a string indicating a filename, or an already opened file (should be "rb")) offset is the position (in bytes) where the pixel data start nbytespp = number of bytes per pixel type can be int or float (4 bytes pp) or double (8 bytes pp) signed: normally signed data 'y', but 'n' to try to get back the right numbers when unsigned data are converted to signed (python once had no unsigned numeric types.) swap, normally do not bother, but 'y' to swap bytes typeout is the numpy type to output, normally uint16, but more if overflows occurred x and y are the pixel dimensions TODO : Read in regions of interest PLEASE LEAVE THE STRANGE INTERFACE ALONE - IT IS USEFUL FOR THE BRUKER FORMAT """ tin = "dunno" length = nbytespp * x * y # bytes per pixel times number of pixels if datatype in ['float', 'double']: signed = 'y' key = (datatype, signed, nbytespp) try: tin = DATATYPES[key] except: logging.warning("datatype,signed,nbytespp " + str(key)) raise Exception("Unknown combination of types to readbytestream") # Did we get a string (filename) or a readable stream object? if hasattr(fil, "read") and hasattr(fil, "seek"): infile = fil opened = False else: infile = open(fil, 'rb') opened = True infile.seek(offset) arr = numpy.array(numpy.reshape( numpy.fromstring( infile.read(length), tin) , (x, y)), typeout) if swap == 'y': arr = arr.byteswap() if opened: infile.close() return arr fabio-0.1.3/fabio-src/GEimage_old.py0000644000175000017500000005016712233175156017750 0ustar jeromejerome00000000000000 #!/usr/bin/env python """ Reads the header from a GE a-Si Angio Detector Authors: Henning O. Sorensen & Erik Knudsen Center for Fundamental Research: Metal Structures in Four Dimensions Risoe National Laboratory Frederiksborgvej 399 DK-4000 Roskilde email:erik.knudsen@risoe.dk + Jon Wright, ESRF The header information has been taken from the script read_GEaSi_data.py by Antonino Miceli Thu Jan 4 13:46:31 CST 2007 """ import numpy from fabioimage import fabioimage class GEimage(fabioimage): def _readheader(self, infile): infile.seek(0) # ADEPT self.ImageFormat = infile.read(10) # USHORT --> "=H" # ULONG --> "=L" # = means byte order is native self.header['HeaderVersion'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] self.header['HeaderSizeInBytes'] = int(numpy.fromstring(infile.read(4), numpy.uint32)[0]) self.header['UserHeaderVersion'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] self.header['UserHeaderSizeInBytes'] = int(numpy.fromstring(infile.read(4), numpy.uint32)[0]) self.header['NumberOfFrames'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] self.header['NumberOfRowsInFrame'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] self.header['NumberOfColsInFrame'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] self.header['BitsPerPixel'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] self.header['AcquisitionDate'] = infile.read(20) self.header['AcquisitionTime'] = infile.read(20) self.DUTID = infile.read(20) self.header['Operator'] = infile.read(50) self.header['DetectorSignature'] = infile.read(20) self.header['TestSystemName'] = infile.read(20) self.header['TestStationRevision'] = infile.read(20) self.header['CoreBundleRevision'] = infile.read(20) self.header['AcquisitionName'] = infile.read(40) self.header['AcquisitionParameterRevision'] = infile.read(20) # self.OriginalNumberOfRows = infile.read(2) # self.OriginalNumberOfRows = struct.unpack("=H",self.OriginalNumberOfRows)[0] # self.OriginalNumberOfColumns = infile.read(2) # self.OriginalNumberOfColumns = struct.unpack("=H",self.OriginalNumberOfColumns)[0] # self.RowNumberUpperLeftPointArchiveROI = infile.read(2) # self.RowNumberUpperLeftPointArchiveROI = struct.unpack("=H",self.RowNumberUpperLeftPointArchiveROI)[0] # self.ColNumberUpperLeftPointArchiveROI = infile.read(2) # self.ColNumberUpperLeftPointArchiveROI = struct.unpack("=H",self.ColNumberUpperLeftPointArchiveROI)[0] # self.Swapped = infile.read(2) # self.Swapped = struct.unpack("=H",self.Swapped)[0] # self.Reordered = infile.read(2) # self.Reordered = struct.unpack("=H",self.Reordered)[0] # self.HorizontalFlipped = infile.read(2) # self.HorizontalFlipped = struct.unpack("=H",self.HorizontalFlipped)[0] # self.VerticalFlipped = infile.read(2) # self.VerticalFlipped = struct.unpack("=H",self.VerticalFlipped)[0] # self.WindowValueDesired = infile.read(2) # self.WindowValueDesired = struct.unpack("=H",self.WindowValueDesired)[0] # self.LevelValueDesired = infile.read(2) # self.LevelValueDesired = struct.unpack("=H",self.LevelValueDesired)[0] # self.AcquisitionMode = infile.read(2) # self.AcquisitionMode = struct.unpack("=H",self.AcquisitionMode)[0] # self.AcquisitionType = infile.read(2) # self.AcquisitionType = struct.unpack("=H",self.AcquisitionType)[0] # self.UserAcquisitionCoffFileName1 = infile.read(100) # self.UserAcquisitionCoffFileName2 = infile.read(100) # self.FramesBeforeExpose = infile.read(2) # self.FramesBeforeExpose = struct.unpack("=H",self.FramesBeforeExpose)[0] # self.FramesDuringExpose = infile.read(2) # self.FramesDuringExpose = struct.unpack("=H",self.FramesDuringExpose)[0] # self.FramesAfterExpose = infile.read(2) # self.FramesAfterExpose = struct.unpack("=H",self.FramesAfterExpose)[0] # self.IntervalBetweenFrames = infile.read(2) # self.IntervalBetweenFrames = struct.unpack("=H",self.IntervalBetweenFrames)[0] # self.ExposeTimeDelayInMicrosecs = infile.read(8) # self.ExposeTimeDelayInMicrosecs = struct.unpack("=d",self.ExposeTimeDelayInMicrosecs)[0] # self.TimeBetweenFramesInMicrosecs = infile.read(8) # self.TimeBetweenFramesInMicrosecs = struct.unpack("=d",self.TimeBetweenFramesInMicrosecs)[0] # self.FramesToSkipExpose = infile.read(2) # self.FramesToSkipExpose = struct.unpack("=H",self.FramesToSkipExpose)[0] # # Rad --> ExposureMode = 1 # self.ExposureMode = infile.read(2) # self.ExposureMode = struct.unpack("=H",self.ExposureMode)[0] # self.PrepPresetTimeInMicrosecs = infile.read(8) # self.PrepPresetTimeInMicrosecs = struct.unpack("=d",self.PrepPresetTimeInMicrosecs)[0] # self.ExposePresetTimeInMicrosecs = infile.read(8) # self.ExposePresetTimeInMicrosecs = struct.unpack("=d",self.ExposePresetTimeInMicrosecs)[0] # self.AcquisitionFrameRateInFps = infile.read(4) # self.AcquisitionFrameRateInFps = struct.unpack("=f",self.AcquisitionFrameRateInFps)[0] # self.FOVSelect = infile.read(2) # self.FOVSelect = struct.unpack("=H",self.FOVSelect)[0] # self.ExpertMode = infile.read(2) # self.ExpertMode = struct.unpack("=H",self.ExpertMode)[0] # self.SetVCommon1 = infile.read(8) # self.SetVCommon1 = struct.unpack("=d",self.SetVCommon1)[0] # self.SetVCommon2 = infile.read(8) # self.SetVCommon2 = struct.unpack("=d",self.SetVCommon2)[0] # self.SetAREF = infile.read(8) # self.SetAREF = struct.unpack("=d",self.SetAREF)[0] # self.SetAREFTrim = infile.read(4) # self.SetAREFTrim = struct.unpack("=L",self.SetAREFTrim)[0] # self.SetSpareVoltageSource = infile.read(8) # self.SetSpareVoltageSource = struct.unpack("=d",self.SetSpareVoltageSource)[0] # self.SetCompensationVoltageSource = infile.read(8) # self.SetCompensationVoltageSource = struct.unpack("=d",self.SetCompensationVoltageSource)[0] # self.SetRowOffVoltage = infile.read(8) # self.SetRowOffVoltage = struct.unpack("=d",self.SetRowOffVoltage)[0] # self.SetRowOnVoltage = infile.read(8) # self.SetRowOnVoltage = struct.unpack("=d",self.SetRowOnVoltage)[0] # self.StoreCompensationVoltage = infile.read(4) # self.StoreCompensationVoltage = struct.unpack("=L",self.StoreCompensationVoltage)[0] # self.RampSelection = infile.read(2) # self.RampSelection = struct.unpack("=H",self.RampSelection)[0] # self.TimingMode = infile.read(2) # self.TimingMode = struct.unpack("=H",self.TimingMode)[0] # self.Bandwidth = infile.read(2) # self.Bandwidth = struct.unpack("=H",self.Bandwidth)[0] # self.ARCIntegrator = infile.read(2) # self.ARCIntegrator = struct.unpack("=H",self.ARCIntegrator)[0] # self.ARCPostIntegrator = infile.read(2) # self.ARCPostIntegrator = struct.unpack("=H",self.ARCPostIntegrator)[0] # self.NumberOfRows = infile.read(4) # self.NumberOfRows = struct.unpack("=L",self.NumberOfRows)[0] # self.RowEnable = infile.read(2) # self.RowEnable = struct.unpack("=H",self.RowEnable)[0] # self.EnableStretch = infile.read(2) # self.EnableStretch = struct.unpack("=H",self.EnableStretch)[0] # self.CompEnable = infile.read(2) # self.CompEnable = struct.unpack("=H",self.CompEnable)[0] # self.CompStretch = infile.read(2) # self.CompStretch = struct.unpack("=H",self.CompStretch)[0] # self.LeftEvenTristate = infile.read(2) # self.LeftEvenTristate = struct.unpack("=H",self.LeftEvenTristate)[0] # self.RightOddTristate = infile.read(2) # self.RightOddTristate = struct.unpack("=H",self.RightOddTristate)[0] # self.TestModeSelect = infile.read(4) # self.TestModeSelect = struct.unpack("=L",self.TestModeSelect)[0] # self.AnalogTestSource = infile.read(4) # self.AnalogTestSource = struct.unpack("=L",self.AnalogTestSource)[0] # self.VCommonSelect = infile.read(4) # self.VCommonSelect = struct.unpack("=L",self.VCommonSelect)[0] # self.DRCColumnSum = infile.read(4) # self.DRCColumnSum = struct.unpack("=L",self.DRCColumnSum)[0] # self.TestPatternFrameDelta = infile.read(4) # self.TestPatternFrameDelta = struct.unpack("=L",self.TestPatternFrameDelta)[0] # self.TestPatternRowDelta = infile.read(4) # self.TestPatternRowDelta = struct.unpack("=L",self.TestPatternRowDelta)[0] # self.TestPatternColumnDelta = infile.read(4) # self.TestPatternColumnDelta = struct.unpack("=L",self.TestPatternColumnDelta)[0] # self.DetectorHorizontalFlip = infile.read(2) # self.DetectorHorizontalFlip = struct.unpack("=H",self.DetectorHorizontalFlip)[0] # self.DetectorVerticalFlip = infile.read(2) # self.DetectorVerticalFlip = struct.unpack("=H",self.DetectorVerticalFlip)[0] # self.DFNAutoScrubOnOff = infile.read(2) # self.DFNAutoScrubOnOff = struct.unpack("=H",self.DFNAutoScrubOnOff)[0] # self.FiberChannelTimeOutInMicrosecs = infile.read(4) # self.FiberChannelTimeOutInMicrosecs = struct.unpack("=L",self.FiberChannelTimeOutInMicrosecs)[0] # self.DFNAutoScrubDelayInMicrosecs = infile.read(4) # self.DFNAutoScrubDelayInMicrosecs = struct.unpack("=L",self.DFNAutoScrubDelayInMicrosecs)[0] # self.StoreAECROI = infile.read(2) # self.StoreAECROI = struct.unpack("=H",self.StoreAECROI)[0] # self.TestPatternSaturationValue = infile.read(2) # self.TestPatternSaturationValue = struct.unpack("=H",self.TestPatternSaturationValue)[0] # self.TestPatternSeed = infile.read(4) # self.TestPatternSeed = struct.unpack("=L",self.TestPatternSeed)[0] # self.ExposureTimeInMillisecs = infile.read(4) # self.ExposureTimeInMillisecs = struct.unpack("=f",self.ExposureTimeInMillisecs)[0] # self.FrameRateInFps = infile.read(4) # self.FrameRateInFps = struct.unpack("=f",self.FrameRateInFps)[0] # self.kVp = infile.read(4) # self.kVp = struct.unpack("=f",self.kVp)[0] # self.mA = infile.read(4) # self.mA = struct.unpack("=f",self.mA)[0] # self.mAs = infile.read(4) # self.mAs = struct.unpack("=f",self.mAs)[0] # self.FocalSpotInMM = infile.read(4) # self.FocalSpotInMM = struct.unpack("=f",self.FocalSpotInMM)[0] # self.GeneratorType = infile.read(20) # self.StrobeIntensityInFtL = infile.read(4) # self.StrobeIntensityInFtL = struct.unpack("=f",self.StrobeIntensityInFtL)[0] # self.NDFilterSelection = infile.read(2) # self.NDFilterSelection = struct.unpack("=H",self.NDFilterSelection)[0] # self.RefRegTemp1 = infile.read(8) # self.RefRegTemp1 = struct.unpack("=d",self.RefRegTemp1)[0] # self.RefRegTemp2 = infile.read(8) # self.RefRegTemp2 = struct.unpack("=d",self.RefRegTemp2)[0] # self.RefRegTemp3 = infile.read(8) # self.RefRegTemp3 = struct.unpack("=d",self.RefRegTemp3)[0] # self.Humidity1 = infile.read(4) # self.Humidity1 = struct.unpack("=f",self.Humidity1)[0] # self.Humidity2 = infile.read(4) # self.Humidity2 = struct.unpack("=f",self.Humidity2)[0] # self.DetectorControlTemp = infile.read(8) # self.DetectorControlTemp = struct.unpack("=d",self.DetectorControlTemp)[0] # self.DoseValueInmR = infile.read(8) # self.DoseValueInmR = struct.unpack("=d",self.DoseValueInmR)[0] # self.TargetLevelROIRow0 = infile.read(2) # self.TargetLevelROIRow0 = struct.unpack("=H",self.TargetLevelROIRow0)[0] # self.TargetLevelROICol0 = infile.read(2) # self.TargetLevelROICol0 = struct.unpack("=H",self.TargetLevelROICol0)[0] # self.TargetLevelROIRow1 = infile.read(2) # self.TargetLevelROIRow1 = struct.unpack("=H",self.TargetLevelROIRow1)[0] # self.TargetLevelROICol1 = infile.read(2) # self.TargetLevelROICol1 = struct.unpack("=H",self.TargetLevelROICol1)[0] # self.FrameNumberForTargetLevelROI = infile.read(2) # self.FrameNumberForTargetLevelROI = struct.unpack("=H",self.FrameNumberForTargetLevelROI)[0] # self.PercentRangeForTargetLevel = infile.read(2) # self.PercentRangeForTargetLevel = struct.unpack("=H",self.PercentRangeForTargetLevel)[0] # self.TargetValue = infile.read(2) # self.TargetValue = struct.unpack("=H",self.TargetValue)[0] # self.ComputedMedianValue = infile.read(2) # self.ComputedMedianValue = struct.unpack("=H",self.ComputedMedianValue)[0] # self.LoadZero = infile.read(2) # self.LoadZero = struct.unpack("=H",self.LoadZero)[0] # self.MaxLUTOut = infile.read(2) # self.MaxLUTOut = struct.unpack("=H",self.MaxLUTOut)[0] # self.MinLUTOut = infile.read(2) # self.MinLUTOut = struct.unpack("=H",self.MinLUTOut)[0] # self.MaxLinear = infile.read(2) # self.MaxLinear = struct.unpack("=H",self.MaxLinear)[0] # self.Reserved = infile.read(2) # self.Reserved = struct.unpack("=H",self.Reserved)[0] # self.ElectronsPerCount = infile.read(2) # self.ElectronsPerCount = struct.unpack("=H",self.ElectronsPerCount)[0] # self.ModeGain = infile.read(2) # self.ModeGain = struct.unpack("=H",self.ModeGain)[0] # self.TemperatureInDegC = infile.read(8) # self.TemperatureInDegC = struct.unpack("=d",self.TemperatureInDegC)[0] # self.LineRepaired = infile.read(2) # self.LineRepaired = struct.unpack("=H",self.LineRepaired)[0] # self.LineRepairFileName = infile.read(100) # self.CurrentLongitudinalInMM = infile.read(4) # self.CurrentLongitudinalInMM = struct.unpack("=f",self.CurrentLongitudinalInMM)[0] # self.CurrentTransverseInMM = infile.read(4) # self.CurrentTransverseInMM = struct.unpack("=f",self.CurrentTransverseInMM)[0] # self.CurrentCircularInMM = infile.read(4) # self.CurrentCircularInMM = struct.unpack("=f",self.CurrentCircularInMM)[0] # self.CurrentFilterSelection = infile.read(4) # self.CurrentFilterSelection = struct.unpack("=L",self.CurrentFilterSelection)[0] # self.DisableScrubAck = infile.read(2) # self.DisableScrubAck = struct.unpack("=H",self.DisableScrubAck)[0] # self.ScanModeSelect = infile.read(2) # self.ScanModeSelect = struct.unpack("=H",self.ScanModeSelect)[0] # self.DetectorAppSwVersion = infile.read(20) # self.DetectorNIOSVersion = infile.read(20) # self.DetectorPeripheralSetVersion = infile.read(20) # self.DetectorPhysicalAddress = infile.read(20) # self.PowerDown = infile.read(2) # self.PowerDown = struct.unpack("=H",self.PowerDown)[0] # self.InitialVoltageLevel_VCOMMON = infile.read(8) # self.InitialVoltageLevel_VCOMMON = struct.unpack("=d",self.InitialVoltageLevel_VCOMMON)[0] # self.FinalVoltageLevel_VCOMMON = infile.read(8) # self.FinalVoltageLevel_VCOMMON = struct.unpack("=d",self.FinalVoltageLevel_VCOMMON)[0] # self.DmrCollimatorSpotSize = infile.read(10) # self.DmrTrack = infile.read(5) # self.DmrFilter = infile.read(5) # self.FilterCarousel = infile.read(2) # self.FilterCarousel = struct.unpack("=H",self.FilterCarousel)[0] # self.Phantom = infile.read(20) # self.SetEnableHighTime = infile.read(2) # self.SetEnableHighTime = struct.unpack("=H",self.SetEnableHighTime)[0] # self.SetEnableLowTime = infile.read(2) # self.SetEnableLowTime = struct.unpack("=H",self.SetEnableLowTime)[0] # self.SetCompHighTime = infile.read(2) # self.SetCompHighTime = struct.unpack("=H",self.SetCompHighTime)[0] # self.SetCompLowTime = infile.read(2) # self.SetCompLowTime = struct.unpack("=H",self.SetCompLowTime)[0] # self.SetSyncLowTime = infile.read(2) # self.SetSyncLowTime = struct.unpack("=H",self.SetSyncLowTime)[0] # self.SetConvertLowTime = infile.read(2) # self.SetConvertLowTime = struct.unpack("=H",self.SetConvertLowTime)[0] # self.SetSyncHighTime = infile.read(2) # self.SetSyncHighTime = struct.unpack("=H",self.SetSyncHighTime)[0] # self.SetEOLTime = infile.read(2) # self.SetEOLTime = struct.unpack("=H",self.SetEOLTime)[0] # self.SetRampOffsetTime = infile.read(2) # self.SetRampOffsetTime = struct.unpack("=H",self.SetRampOffsetTime)[0] # self.FOVStartingValue = infile.read(2) # self.FOVStartingValue = struct.unpack("=H",self.FOVStartingValue)[0] # self.ColumnBinning = infile.read(2) # self.ColumnBinning = struct.unpack("=H",self.ColumnBinning)[0] # self.RowBinning = infile.read(2) # self.RowBinning = struct.unpack("=H",self.RowBinning)[0] # self.BorderColumns64 = infile.read(2) # self.BorderColumns64 = struct.unpack("=H",self.BorderColumns64)[0] # self.BorderRows64 = infile.read(2) # self.BorderRows64 = struct.unpack("=H",self.BorderRows64)[0] # self.FETOffRows64 = infile.read(2) # self.FETOffRows64 = struct.unpack("=H",self.FETOffRows64)[0] # self.FOVStartColumn128 = infile.read(2) # self.FOVStartColumn128 = struct.unpack("=H",self.FOVStartColumn128)[0] # self.FOVStartRow128 = infile.read(2) # self.FOVStartRow128 = struct.unpack("=H",self.FOVStartRow128)[0] # self.NumberOfColumns128 = infile.read(2) # self.NumberOfColumns128 = struct.unpack("=H",self.NumberOfColumns128)[0] # self.NumberOfRows128 = infile.read(2) # self.NumberOfRows128 = struct.unpack("=H",self.NumberOfRows128)[0] # self.VFPAquisition = infile.read(2000) # self.Comment = infile.read(200) def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname, "rb") self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['NumberOfRowsInFrame']) self.dim2 = int(self.header['NumberOfColsInFrame']) self.bpp = int(self.header['BitsPerPixel']) except: raise Exception("GE file", str(fname) + \ "is corrupt, cannot read it") # More than one image can be saved in a GE file # Will only load the first one # Go to the beginning of the file infile.seek(0) infile.seek(self.header['HeaderSizeInBytes'] + self.header['UserHeaderSizeInBytes']) ReadBytes = self.dim1 * self.dim2 * (self.bpp / 8) block = infile.read(ReadBytes) block = numpy.fromstring(block, numpy.uint16) infile.close() try: self.data = numpy.reshape(block, [self.dim2, self.dim1]) except: print len(block), self.dim2, self.dim1 raise IOError, \ 'Size spec in GE-header does not match size of image data field' self.bytecode = self.data.dtype.type self.pilimage = None return self fabio-0.1.3/fabio-src/fabioutils.py0000644000175000017500000004643412233175220017747 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ General purpose utilities functions for fabio """ from __future__ import with_statement import re, os, logging, threading, sys import StringIO as stringIO logger = logging.getLogger("fabioutils") from compression import bz2, gzip import traceback from math import ceil FILETYPES = { # extension NNNimage fabioclass # type consistency - always use a list if one case is 'edf' : ['edf'], 'cor' : ['edf'], 'pnm' : ['pnm'], 'pgm' : ['pnm'], 'pbm' : ['pnm'], 'tif' : ['tif'], 'tiff' : ['tif'], 'img' : ['adsc', 'OXD', 'HiPiC'], 'mccd' : ['marccd'], 'mar2300': ['mar345'], 'sfrm' : ['bruker100'], 'msk' : ['fit2dmask'], 'spr' : ['fit2dspreadsheet'], 'dm3' : ['dm3'], 'kcd' : ['kcd'], 'cbf' : ['cbf'], 'xml' : ["xsd"], 'xsd' : ["xsd"], } # Add bzipped and gzipped for key in FILETYPES.keys(): FILETYPES[key + ".bz2"] = FILETYPES[key] FILETYPES[key + ".gz"] = FILETYPES[key] # Compressors COMPRESSORS = {} dictAscii = {None:[chr(i) for i in range(32, 127)], } try: lines = os.popen("gzip -h 2>&1").read() # Looking for "usage" if "sage" in lines: COMPRESSORS['.gz'] = 'gzip -dc ' else: COMPRESSORS['.gz'] = None except Exception: COMPRESSORS['.gz'] = None try: lines = os.popen("bzip2 -h 2>&1").read() # Looking for "usage" if "sage" in lines: COMPRESSORS['.bz2'] = 'bzip2 -dc ' else: COMPRESSORS['.bz2'] = None except Exception: COMPRESSORS['.bz2'] = None def deprecated(func): """ used to deprecate a function/method: prints a lot of warning messages to enforce the modifaction of the code """ def wrapper(*arg, **kw): """ decorator that deprecates the use of a function """ logger.warning("%s is Deprecated !!! %s" % (func.func_name, os.linesep.join([""] + traceback.format_stack()[:-1]))) return func(*arg, **kw) return wrapper def pad(mystr, pattern=" ", size=80): """ Performs the padding of the string to the right size with the right pattern """ size = int(size) padded_size = int(ceil(float(len(mystr)) / size) * size) if len(pattern) == 1: return mystr.ljust(padded_size, pattern) else: return (mystr + pattern * int(ceil(float(padded_size - len(mystr)) / len(pattern))))[:padded_size] def getnum(name): """ # try to figure out a file number # guess it starts at the back """ stem , num, post_num = numstem(name) try: return int(num) except ValueError: return None class FilenameObject(object): """ The 'meaning' of a filename ... """ def __init__(self, stem=None, num=None, directory=None, format=None, extension=None, postnum=None, digits=4, filename=None): """ This class can either be instanciated by a set of parameters like directory, prefix, num, extension, ... @param stem: the stem is a kind of prefix (str) @param num: image number in the serie (int) @param directory: name of the directory (str) @param format: ?? @param extension: @param postnum: @param digits: Number of digits used to print num Alternative constructor: @param filename: fullpath of an image file to be deconstructed into directory, prefix, num, extension, ... """ self.stem = stem self.num = num self.format = format self.extension = extension self.digits = digits self.postnum = postnum self.directory = directory self.compressed = None if filename is not None: self.deconstruct_filename(filename) def str(self): """ Return a string representation """ fmt = "stem %s, num %s format %s extension %s " + \ "postnum = %s digits %s dir %s" return fmt % tuple([str(x) for x in [ self.stem , self.num , self.format , self.extension , self.postnum , self.digits , self.directory ] ]) __repr__ = str def tostring(self): """ convert yourself to a string """ name = self.stem if self.digits is not None and self.num is not None: fmt = "%0" + str(self.digits) + "d" name += fmt % self.num if self.postnum is not None: name += self.postnum if self.extension is not None: name += self.extension if self.directory is not None: name = os.path.join(self.directory, name) return name def deconstruct_filename(self, filename): """ Break up a filename to get image type and number """ direc, name = os.path.split(filename) direc = direc or None parts = name.split(".") compressed = False stem = parts[0] extn = "" postnum = "" ndigit = 4 num = None typ = None if parts[-1] in ["gz", "bz2"]: extn = "." + parts[-1] parts = parts[:-1] compressed = True if parts[-1] in FILETYPES.keys(): typ = FILETYPES[parts[-1]] extn = "." + parts[-1] + extn try: stem, numstring, postnum = numstem(".".join(parts[:-1])) num = int(numstring) ndigit = len(numstring) except Exception, err: # There is no number - hence make num be None, not 0 logger.debug("l176: %s" % err) num = None stem = "".join(parts[:-1]) else: # Probably two type left if len(parts) == 1: # Probably GE format stem_numb parts2 = parts[0].split("_") if parts2[-1].isdigit(): num = int(parts2[-1]) ndigit = len(parts2[-1]) typ = ['GE'] stem = "_".join(parts2[:-1]) + "_" else: try: num = int(parts[-1]) ndigit = len(parts[-1]) typ = ['bruker'] stem = ".".join(parts[:-1]) + "." except Exception, err: logger.debug("l196: %s" % err) typ = None extn = "." + parts[-1] + extn numstring = "" try: stem , numstring, postnum = numstem(".".join(parts[:-1])) except Exception, err: logger.debug("l202: %s" % err) raise if numstring.isdigit(): num = int(numstring) ndigit = len(numstring) # raise Exception("Cannot decode "+filename) self.stem = stem self.num = num self.directory = direc self.format = typ self.extension = extn self.postnum = postnum self.digits = ndigit self.compressed = compressed def numstem(name): """ cant see how to do without reversing strings Match 1 or more digits going backwards from the end of the string """ reg = re.compile(r"^(.*?)(-?[0-9]{0,9})(\D*)$") #reg = re.compile("""(\D*)(\d\d*)(\w*)""") try: res = reg.match(name).groups() #res = reg.match(name[::-1]).groups() #return [ r[::-1] for r in res[::-1]] if len(res[0]) == len(res[1]) == 0: # Hack for file without number return [res[2], '', ''] return [ r for r in res] except AttributeError: # no digits found return [name, "", ""] #@deprecated def deconstruct_filename(filename): """ Function for backward compatibility. Deprecated """ return FilenameObject(filename=filename) def construct_filename(filename, frame=None): "Try to construct the filename for a given frame" fobj = FilenameObject(filename=filename) if frame is not None: fobj.num = frame return fobj.tostring() def next_filename(name, padding=True): """ increment number """ fobj = FilenameObject(filename=name) fobj.num += 1 if not padding: fobj.digits = 0 return fobj.tostring() def previous_filename(name, padding=True): """ decrement number """ fobj = FilenameObject(filename=name) fobj.num -= 1 if not padding: fobj.digits = 0 return fobj.tostring() def jump_filename(name, num, padding=True): """ jump to number """ fobj = FilenameObject(filename=name) fobj.num = num if not padding: fobj.digits = 0 return fobj.tostring() def extract_filenumber(name): """ extract file number """ fobj = FilenameObject(filename=name) return fobj.num def isAscii(name, listExcluded=None): """ @param name: string to check @param listExcluded: list of char or string excluded. @return: True of False whether name is pure ascii or not """ isascii = None try: name.decode("ascii") except UnicodeDecodeError: isascii = False else: if listExcluded: isascii = not(any(bad in name for bad in listExcluded)) else: isascii = True return isascii def toAscii(name, excluded=None): """ @param name: string to check @param excluded: tuple of char or string excluded (not list: they are mutable). @return: the name with all non valid char removed """ if excluded not in dictAscii: ascii = dictAscii[None][:] for i in excluded: if i in ascii: ascii.remove(i) else: logger.error("toAscii: % not in ascii table" % i) dictAscii[excluded] = ascii else: ascii = dictAscii[excluded] out = [i for i in str(name) if i in ascii] return "".join(out) def nice_int(s): """ Workaround that int('1.0') raises an exception @param s: string to be converted to integer """ try: return int(s) except ValueError: return int(float(s)) class StringIO(stringIO.StringIO): """ just an interface providing the name and mode property to a StringIO BugFix for MacOSX mainly """ def __init__(self, data, fname=None, mode="r"): stringIO.StringIO.__init__(self, data) self.closed = False if fname == None: self.name = "fabioStream" else: self.name = fname self.mode = mode self.lock = threading.Semaphore() self.__size = None def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with self.lock: pos = self.tell() self.seek(0, os.SEEK_END) self.__size = self.tell() self.seek(pos) return self.__size def setSize(self, size): self.__size = size size = property(getSize, setSize) class File(file): """ wrapper for "file" with locking """ def __init__(self, name, mode="rb", buffering=0): """file(name[, mode[, buffering]]) -> file object Open a file. The mode can be 'r', 'w' or 'a' for reading (default), writing or appending. The file will be created if it doesn't exist when opened for writing or appending; it will be truncated when opened for writing. Add a 'b' to the mode for binary files. Add a '+' to the mode to allow simultaneous reading and writing. If the buffering argument is given, 0 means unbuffered, 1 means line buffered, and larger numbers specify the buffer size. The preferred way to open a file is with the builtin open() function. Add a 'U' to mode to open the file for input with universal newline support. Any line ending in the input file will be seen as a '\n' in Python. Also, a file so opened gains the attribute 'newlines'; the value for this attribute is one of None (no newline read yet), '\r', '\n', '\r\n' or a tuple containing all the newline types seen. 'U' cannot be combined with 'w' or '+' mode. """ file.__init__(self, name, mode, buffering) self.lock = threading.Semaphore() self.__size = None def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with self.lock: pos = self.tell() self.seek(0, os.SEEK_END) self.__size = self.tell() self.seek(pos) return self.__size def setSize(self, size): self.__size = size def __exit__(self, *args, **kwargs): """ Close the file. """ return file.close(self) def __enter__(self, *args, **kwargs): return self size = property(getSize, setSize) class UnknownCompressedFile(File): """ wrapper for "File" with locking """ def __init__(self, name, mode="rb", buffering=0): logger.warning("No decompressor found for this type of file (are gzip anf bz2 installed ???") File.__init__(self, name, mode, buffering) if gzip is None: GzipFile = UnknownCompressedFile else: class GzipFile(gzip.GzipFile): """ Just a wrapper forgzip.GzipFile providing the correct seek capabilities for python 2.5 """ def __init__(self, filename=None, mode=None, compresslevel=9, fileobj=None): """ Wrapper with locking for constructor for the GzipFile class. At least one of fileobj and filename must be given a non-trivial value. The new class instance is based on fileobj, which can be a regular file, a StringIO object, or any other object which simulates a file. It defaults to None, in which case filename is opened to provide a file object. When fileobj is not None, the filename argument is only used to be included in the gzip file header, which may includes the original filename of the uncompressed file. It defaults to the filename of fileobj, if discernible; otherwise, it defaults to the empty string, and in this case the original filename is not included in the header. The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', or 'wb', depending on whether the file will be read or written. The default is the mode of fileobj if discernible; otherwise, the default is 'rb'. Be aware that only the 'rb', 'ab', and 'wb' values should be used for cross-platform portability. The compresslevel argument is an integer from 1 to 9 controlling the level of compression; 1 is fastest and produces the least compression, and 9 is slowest and produces the most compression. The default is 9. """ gzip.GzipFile.__init__(self, filename, mode, compresslevel, fileobj) self.lock = threading.Semaphore() self.__size = None if sys.version_info < (2, 7): def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with open(self.filename, "rb") as f: f.seek(-4) self.__size = numpy.fromstring(f.read(4), dtype=numpy.uint32) return self.__size def setSize(self, value): self.__size = value size = property(getSize, setSize) @property def closed(self): return self.fileobj is None def seek(self, offset, whence=os.SEEK_SET): """ Move to new file position. Argument offset is a byte count. Optional argument whence defaults to 0 (offset from start of file, offset should be >= 0); other values are 1 (move relative to current position, positive or negative), and 2 (move relative to end of file, usually negative, although many platforms allow seeking beyond the end of a file). If the file is opened in text mode, only offsets returned by tell() are legal. Use of other offsets causes undefined behavior. This is a wrapper for seek to ensure compatibility with old python 2.5 """ if whence == os.SEEK_SET: gzip.GzipFile.seek(self, offset) elif whence == os.SEEK_CUR: gzip.GzipFile.seek(self, offset + self.tell()) elif whence == os.SEEK_END: gzip.GzipFile.seek(self, -1) gzip.GzipFile.seek(self, offset + self.tell()) def __enter__(self, *args, **kwargs): return self def __exit__(self, *args, **kwargs): """ Close the file. """ return gzip.GzipFile.close(self) if bz2 is None: BZ2File = UnknownCompressedFile else: class BZ2File(bz2.BZ2File): "Wrapper with lock" def __init__(self, name , mode='r', buffering=0, compresslevel=9): """ BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object Open a bz2 file. The mode can be 'r' or 'w', for reading (default) or writing. When opened for writing, the file will be created if it doesn't exist, and truncated otherwise. If the buffering argument is given, 0 means unbuffered, and larger numbers specify the buffer size. If compresslevel is given, must be a number between 1 and 9. Add a 'U' to mode to open the file for input with universal newline support. Any line ending in the input file will be seen as a '\n' in Python. Also, a file so opened gains the attribute 'newlines'; the value for this attribute is one of None (no newline read yet), '\r', '\n', '\r\n' or a tuple containing all the newline types seen. Universal newlines are available only when reading. """ bz2.BZ2File.__init__(self, name , mode, buffering, compresslevel) self.lock = threading.Semaphore() self.__size = None def getSize(self): if self.__size is None: logger.debug("Measuring size of %s" % self.name) with self.lock: pos = self.tell() all = self.read() self.__size = self.tell() self.seek(pos) return self.__size def setSize(self, value): self.__size = value size = property(getSize, setSize) def __exit__(self, *args, **kwargs): """ Close the file. """ return bz2.BZ2File.close(self) def __enter__(self, *args, **kwargs): return self fabio-0.1.3/fabio-src/fit2dspreadsheetimage.py0000644000175000017500000000404012233175156022044 0ustar jeromejerome00000000000000 """ Read the fit2d ascii image output + Jon Wright, ESRF """ import numpy from fabioimage import fabioimage class fit2dspreadsheetimage(fabioimage): """ Read a fit2d ascii format """ def _readheader(self, infile): """ TODO : test for minimal attributes? """ line = infile.readline() try: items = line.split() xdim = int(items[0]) ydim = int(items[1]) except: raise self.header['title'] = line self.header['Dim_1'] = xdim self.header['Dim_2'] = ydim def read(self, fname, frame=None): """ Read in header into self.header and the data into self.data """ self.header = {} self.resetvals() infile = self._open(fname) self._readheader(infile) # Compute image size try: self.dim1 = int(self.header['Dim_1']) self.dim2 = int(self.header['Dim_2']) except: raise Exception("file", str(fname) + \ "is corrupt, cannot read it") bytecode = numpy.float32 self.bpp = len(numpy.array(0, bytecode).tostring()) #now read the data into the array try: vals = [] for line in infile.readlines(): try: vals.append([float(x) for x in line.split()]) except: pass self.data = numpy.array(vals).astype(bytecode) assert self.data.shape == (self.dim2, self.dim1) except: raise IOError, "Error reading ascii" self.resetvals() # ensure the PIL image is reset self.pilimage = None return self if __name__ == "__main__": import sys, time start = time.time() img = fit2dspreadsheetimage() img.read(sys.argv[1]) print time.time() - start print img.dim1, img.dim2, img.data.shape from matplotlib.pylab import imshow, show imshow(img.data.T) show() fabio-0.1.3/fabio-src/converters.py0000644000175000017500000000355212120434325017771 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 """ Converter module. This is for the moment empty (populated only with almost pass through anonymous functions) but aims to be populated with more sofisticated translators ... """ __author__ = "Jérôme Kieffer" __contact__ = "jerome.kieffer@esrf.eu" __license__ = "GPLv3+" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" import types, logging logger = logging.getLogger("converter") def convert_data_integer(data): """ convert data to integer """ if data is not None: return data.astype(int) else: return data CONVERSION_HEADER = { ("edfimage", "edfimage"): lambda header:header, } CONVERSION_DATA = { ("edfimage", "edfimage"): lambda data:data, ("edfimage", "cbfimage"): convert_data_integer, ("edfimage", "mar345image"): convert_data_integer, ("edfimage", "fit2dmaskimage"): convert_data_integer, ("edfimage", "kcdimage"): convert_data_integer, ("edfimage", "OXDimage"): convert_data_integer, ("edfimage", "pnmimage"): convert_data_integer, } def convert_data(inp, outp, data): """ Return data converted to the output format ... over-simplistic implementation for the moment ... @param inp,outp: input/output format like "cbfimage" @param data(ndarray): the actual dataset to be transformed """ return CONVERSION_DATA.get((inp, outp), lambda data:data)(data) def convert_header(inp, outp, header): """ return header converted to the output format @param inp,outp: input/output format like "cbfimage" @param header(dict):the actual set of headers to be transformed """ return CONVERSION_HEADER.get((inp, outp), lambda header:header)(header) fabio-0.1.3/fabio-src/mar345image.py0000644000175000017500000003441412233175156017627 0ustar jeromejerome00000000000000#!/usr/bin/env python #coding: utf8 from __future__ import with_statement __doc__ = """ Authors: ........ * Henning O. Sorensen & Erik Knudsen: Center for Fundamental Research: Metal Structures in Four Dimensions; Risoe National Laboratory; Frederiksborgvej 399; DK-4000 Roskilde; email:erik.knudsen@risoe.dk * Jon Wright, Jérôme Kieffer & Gaël Goret: European Synchrotron Radiation Facility; Grenoble (France) """ from fabioimage import fabioimage import numpy, struct, time, sys, traceback import logging logger = logging.getLogger("mar345image") from compression import compPCK, decPCK class mar345image(fabioimage): _need_a_real_file = True def __init__(self, *args, **kwargs): fabioimage.__init__(self, *args, **kwargs) self.numhigh = None self.numpixels = None def read(self, fname, frame=None): """ Read a mar345 image""" self.filename = fname f = self._open(self.filename, "rb") self._readheader(f) if 'compressed' in self.header['Format']: # self.data = decPCK(f, self.dim1, self.dim2, self.numhigh, version=1) try: self.data = decPCK(f, self.dim1, self.dim2) except Exception, error: logger.error('%s. importing the mar345_io backend: generate an empty 1x1 picture' % error) f.close() self.dim1 = 1 self.dim2 = 1 self.bytecode = numpy.int # self.data = numpy.resize(numpy.array([0], numpy.int), [1, 1]) return self else: logger.error("cannot handle these formats yet " + \ "due to lack of documentation") return None self.bytecode = numpy.uint f.close() return self def _readheader(self, infile=None): """ Read a mar345 image header """ # clip was not used anywhere - commented out # clip = '\x00' #using a couple of local variables inside this function f = infile h = {} #header is 4096 bytes long l = f.read(64) #the contents of the mar345 header is taken to be as # described in # http://www.mar-usa.com/support/downloads/mar345_formats.pdf #the first 64 bytes are 4-byte integers (but in the CBFlib # example image it seems to 128 bytes?) #first 4-byte integer is a marker to check endianness if struct.unpack(" 65535)[0] nb_pix = pix_location.size if nb_pix % 8 == 0: tmp = numpy.zeros((nb_pix, 2), dtype="int32") else: tmp = numpy.zeros(((nb_pix // 8 + 1) * 8, 2), dtype="int32") tmp[:nb_pix, 0] = pix_location + 1 tmp[:nb_pix, 1] = flt_data[pix_location] return tmp.tostring() def nb_overflow_pixels(self): return (self.data > 65535).sum() @staticmethod def checkData(data=None): if data is None: return None else: # enforce square image shape = data.shape assert len(shape) == 2, "image has 2 dimensions" mshape = max(shape) z = numpy.zeros((mshape, mshape), dtype=int) z[:shape[0], :shape[1]] = data return z fabio-0.1.3/fabio-src/bruker100image.py0000644000175000017500000000660412233175220020317 0ustar jeromejerome00000000000000import numpy import math import logging logger = logging.getLogger("bruker100image") try: from PIL import Image except ImportError: logger.warning("PIL is not installed ... trying to do without") Image = None from brukerimage import brukerimage from readbytestream import readbytestream class bruker100image(brukerimage): def toPIL16(self, filename=None): if not Image: raise RuntimeError("PIL is not installed !!! ") if filename: self.read(filename) PILimage = Image.frombuffer("F", (self.dim1, self.dim2), self.data, "raw", "F;16", 0, -1) return PILimage def read(self, fname, frame=None): f = open(fname, "rb") try: self._readheader(f) except: raise rows = int(self.header['NROWS']) cols = int(self.header['NCOLS']) npixelb = int(self.header['NPIXELB'][0]) # you had to read the Bruker docs to know this! # We are now at the start of the image - assuming # readbrukerheader worked # size = rows * cols * npixelb self.data = readbytestream(f, f.tell(), rows, cols, npixelb, datatype="int", signed='n', swap='n') noverfl = self.header['NOVERFL'].split() # now process the overflows #read the set of "underflow pixels" - these will be completely # disregarded for now data = self.data k = 0 while k < 2:#for the time being things - are done in 16 bits datatype = {'1' : numpy.uint8, '2' : numpy.uint16, '4' : numpy.uint32 }[("%d" % 2 ** k)] ar = numpy.array(numpy.fromstring(f.read(int(noverfl[k]) * (2 ** k)), datatype), numpy.uint16) #insert the the overflow pixels in the image array: #this is probably a memory intensive way of doing this - # might be done in a more clever way lim = 2 ** (8 * k) - 1 #generate an array comprising of the indices into data.ravel() # where its value equals lim. M = numpy.compress(numpy.equal(data.ravel(), lim), numpy.arange(rows * cols)) #now put values from ar into those indices numpy.put(data.ravel(), M, ar) padding = 16 * int(math.ceil(int(noverfl[k]) * (2 ** k) / 16.)) - \ int(noverfl[k]) * (2 ** k) f.seek(padding, 1) print noverfl[k] + " bytes read + %d bytes padding" % padding k = k + 1 f.close() (self.dim1, self.dim2) = (rows, cols) print self.dim1, self.dim2 self.resetvals() return self if __name__ == '__main__': import sys, time I = bruker100image() b = time.clock() while (sys.argv[1:]): I.read(sys.argv[1]) r = I.toPIL16() I.rebin(2, 2) print sys.argv[1] + (": max=%d, min=%d, mean=%.2e, stddev=%.2e") % ( I.getmax(), I.getmin(), I.getmean(), I.getstddev()) print 'integrated intensity (%d %d %d %d) =%.3f' % ( 10, 20, 20, 40, I.integrate_area((10, 20, 20, 40))) sys.argv[1:] = sys.argv[2:] e = time.clock() print (e - b) fabio-0.1.3/fabio-src/xsdimage.py0000644000175000017500000001026512233175156017410 0ustar jeromejerome00000000000000#!/usr/bin/env python # coding: utf8 """ Authors: Jérôme Kieffer, ESRF email:jerome.kieffer@esrf.fr XSDimge are XML files containing numpy arrays """ __author__ = "Jérôme Kieffer" __contact__ = "jerome.kieffer@esrf.eu" __license__ = "GPLv3+" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" import logging, numpy logger = logging.getLogger("xsdimage") from fabioimage import fabioimage import base64, hashlib try: from lxml import etree except ImportError: logger.warning("lxml library is probably not part of your python installation: disabling xsdimage format") etree = None class xsdimage(fabioimage): """ Read the XSDataImage XML File data format """ def __init__(self, data=None, header=None, fname=None): """ Constructor of the class XSDataImage. @param _strFilename: the name of the file to open @type _strFilename: string """ fabioimage.__init__(self, data=data, header=header) self.dims = [] self.size = None self.coding = None self.dtype = None self.rawData = None self.md5 = None if fname is not None: self.filename = fname self.read(fname) def read(self, fname, frame=None): """ """ self.header = {} self.resetvals() self.filename = fname infile = self._open(fname, "rb") self._readheader(infile) try: self.dim1, self.dim2 = self.dims[:2] except: raise IOError("XSD file %s is corrupt, no dimensions in it" % fname) try: self.bytecode = numpy.dtype(self.dtype).type self.bpp = len(numpy.array(0, self.bytecode).tostring()) except TypeError: self.bytecode = numpy.int32 self.bpp = 32 logger.warning("Defaulting type to int32") exp_size = 1 for i in self.dims: exp_size *= i assert exp_size == self.size decData = None if self.coding == "base64": decData = base64.b64decode(self.rawData) elif self.coding == "base32": decData = base64.b32decode(self.rawData) elif self.coding == "base16": decData = base64.b16decode(self.rawData) else: logger.warning("Unable to recognize the encoding of the data !!! got %s, expected base64, base32 or base16, I assume it is base64 " % self.coding) decData = base64.b64decode(self.rawData) if self.md5: assert hashlib.md5(decData).hexdigest() == self.md5 self.data = numpy.fromstring(decData, dtype=self.bytecode).reshape(tuple(self.dims)) if not numpy.little_endian: #by default little endian self.data.byteswap(inplace=True) self.resetvals() # # ensure the PIL image is reset self.pilimage = None return self def _readheader(self, infile): """ Read all headers in a file and populate self.header data is not yet populated @type infile: file object open in read mode """ xml = etree.parse(infile) self.dims = [] for i in xml.xpath("//shape"): try: self.dims.append(int(i.text)) except ValueError, error: logger.warning("%s Shape: Unable to convert %s to integer in %s" % (error, i.text, i)) for i in xml.xpath("//size"): try: self.size = int(i.text) except Exception, error:#IGNORE:W0703 logger.warning("%s Size: Unable to convert %s to integer in %s" % (error, i.text, i)) self.dtype = None for i in xml.xpath("//dtype"): self.dtype = i.text self.coding = None for i in xml.xpath("//coding"): j = i.find("value") if j is not None: self.coding = j.text self.rawData = None for i in xml.xpath("//data"): self.rawData = i.text self.md5 = None for i in xml.xpath("//md5sum"): j = i.find("value") if j is not None: self.md5 = j.text if etree is None: xsdimage = None fabio-0.1.3/MANIFEST.in0000644000175000017500000000070312126623347015123 0ustar jeromejerome00000000000000include README.txt include stdeb.cfg recursive-include src *.c *.h *.pyx recursive-include test *.py recursive-include doc * recursive-include pylint * recursive-include epydoc * # recursive-exclude pylint * # recursive-exclude pydoc * # recursive-exclude epydoc * recursive-exclude build * recursive-exclude dist * recursive-exclude test/tiftest * recursive-exclude test/testimages * recursive-exclude fabio.egg-info * # recursive-exclude debian * fabio-0.1.3/src/0000755000175000017500000000000012233272207014146 5ustar jeromejerome00000000000000fabio-0.1.3/src/mar345_IO.c0000644000175000017500000123044512233175156015732 0ustar jeromejerome00000000000000/* Generated by Cython 0.18 on Mon Apr 29 17:23:19 2013 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02040000 #error Cython requires Python 2.4+. #else #include /* For offsetof */ #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_FORMAT_SIZE_T "" #define CYTHON_FORMAT_SSIZE_T "" #define PyInt_FromSsize_t(z) PyInt_FromLong(z) #define PyInt_AsSsize_t(o) __Pyx_PyInt_AsInt(o) #define PyNumber_Index(o) ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \ (PyErr_Format(PyExc_TypeError, \ "expected index value, got %.200s", Py_TYPE(o)->tp_name), \ (PyObject*)0)) #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \ !PyComplex_Check(o)) #define PyIndex_Check __Pyx_PyIndex_Check #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) #define __PYX_BUILD_PY_SSIZE_T "i" #else #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #define __Pyx_PyIndex_Check PyIndex_Check #endif #if PY_VERSION_HEX < 0x02060000 #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) #define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, #define PyType_Modified(t) typedef struct { void *buf; PyObject *obj; Py_ssize_t len; Py_ssize_t itemsize; int readonly; int ndim; char *format; Py_ssize_t *shape; Py_ssize_t *strides; Py_ssize_t *suboffsets; void *internal; } Py_buffer; #define PyBUF_SIMPLE 0 #define PyBUF_WRITABLE 0x0001 #define PyBUF_FORMAT 0x0004 #define PyBUF_ND 0x0008 #define PyBUF_STRIDES (0x0010 | PyBUF_ND) #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE) #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE) typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); typedef void (*releasebufferproc)(PyObject *, Py_buffer *); #endif #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6 #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict") #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #endif #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #else #define CYTHON_PEP393_ENABLED 0 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_READ(k, d, i) ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_VERSION_HEX < 0x02060000 #define PyBytesObject PyStringObject #define PyBytes_Type PyString_Type #define PyBytes_Check PyString_Check #define PyBytes_CheckExact PyString_CheckExact #define PyBytes_FromString PyString_FromString #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromFormat PyString_FromFormat #define PyBytes_DecodeEscape PyString_DecodeEscape #define PyBytes_AsString PyString_AsString #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_Size PyString_Size #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_GET_SIZE PyString_GET_SIZE #define PyBytes_Repr PyString_Repr #define PyBytes_Concat PyString_Concat #define PyBytes_ConcatAndDel PyString_ConcatAndDel #endif #if PY_VERSION_HEX < 0x02060000 #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_VERSION_HEX < 0x03020000 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) #else #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) #else #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_NAMESTR(n) ((char *)(n)) #define __Pyx_DOCSTR(n) ((char *)(n)) #else #define __Pyx_NAMESTR(n) (n) #define __Pyx_DOCSTR(n) (n) #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE__mar345_IO #define __PYX_HAVE_API__mar345_IO #include "string.h" #include "stdio.h" #include "stdlib.h" #include "numpy/arrayobject.h" #include "numpy/ufuncobject.h" #include "ccp4_pack.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ #define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) #define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) #define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); #if CYTHON_COMPILING_IN_CPYTHON #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #ifdef __GNUC__ /* Test for GCC > 2.95 */ #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* __GNUC__ > 2 ... */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ > 2 ... */ #else /* __GNUC__ */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 #elif defined(_Complex_I) #define CYTHON_CCOMPLEX 1 #else #define CYTHON_CCOMPLEX 0 #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #include #else #include #endif #endif #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) #undef _Complex_I #define _Complex_I 1.0fj #endif static const char *__pyx_f[] = { "mar345_IO.pyx", "numpy.pxd", "type.pxd", }; #define IS_UNSIGNED(type) (((type) -1) > 0) struct __Pyx_StructField_; #define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) typedef struct { const char* name; /* for error messages only */ struct __Pyx_StructField_* fields; size_t size; /* sizeof(type) */ size_t arraysize[8]; /* length of array in each dimension */ int ndim; char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject, c_H_ar */ char is_unsigned; int flags; } __Pyx_TypeInfo; typedef struct __Pyx_StructField_ { __Pyx_TypeInfo* type; const char* name; size_t offset; } __Pyx_StructField; typedef struct { __Pyx_StructField* field; size_t parent_offset; } __Pyx_BufFmt_StackElem; typedef struct { __Pyx_StructField root; __Pyx_BufFmt_StackElem* head; size_t fmt_offset; size_t new_count, enc_count; size_t struct_alignment; int is_complex; char enc_type; char new_packmode; char enc_packmode; char is_valid_array; } __Pyx_BufFmt_Context; /* "numpy.pxd":723 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t */ typedef npy_int8 __pyx_t_5numpy_int8_t; /* "numpy.pxd":724 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t */ typedef npy_int16 __pyx_t_5numpy_int16_t; /* "numpy.pxd":725 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< * ctypedef npy_int64 int64_t * #ctypedef npy_int96 int96_t */ typedef npy_int32 __pyx_t_5numpy_int32_t; /* "numpy.pxd":726 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< * #ctypedef npy_int96 int96_t * #ctypedef npy_int128 int128_t */ typedef npy_int64 __pyx_t_5numpy_int64_t; /* "numpy.pxd":730 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; /* "numpy.pxd":731 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; /* "numpy.pxd":732 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< * ctypedef npy_uint64 uint64_t * #ctypedef npy_uint96 uint96_t */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; /* "numpy.pxd":733 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< * #ctypedef npy_uint96 uint96_t * #ctypedef npy_uint128 uint128_t */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; /* "numpy.pxd":737 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< * ctypedef npy_float64 float64_t * #ctypedef npy_float80 float80_t */ typedef npy_float32 __pyx_t_5numpy_float32_t; /* "numpy.pxd":738 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< * #ctypedef npy_float80 float80_t * #ctypedef npy_float128 float128_t */ typedef npy_float64 __pyx_t_5numpy_float64_t; /* "numpy.pxd":747 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t */ typedef npy_long __pyx_t_5numpy_int_t; /* "numpy.pxd":748 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< * ctypedef npy_longlong longlong_t * */ typedef npy_longlong __pyx_t_5numpy_long_t; /* "numpy.pxd":749 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< * * ctypedef npy_ulong uint_t */ typedef npy_longlong __pyx_t_5numpy_longlong_t; /* "numpy.pxd":751 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t */ typedef npy_ulong __pyx_t_5numpy_uint_t; /* "numpy.pxd":752 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulonglong_t * */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; /* "numpy.pxd":753 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< * * ctypedef npy_intp intp_t */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; /* "numpy.pxd":755 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< * ctypedef npy_uintp uintp_t * */ typedef npy_intp __pyx_t_5numpy_intp_t; /* "numpy.pxd":756 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< * * ctypedef npy_double float_t */ typedef npy_uintp __pyx_t_5numpy_uintp_t; /* "numpy.pxd":758 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t */ typedef npy_double __pyx_t_5numpy_float_t; /* "numpy.pxd":759 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< * ctypedef npy_longdouble longdouble_t * */ typedef npy_double __pyx_t_5numpy_double_t; /* "numpy.pxd":760 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; #else typedef float _Complex __pyx_t_float_complex; #endif #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; #else typedef double _Complex __pyx_t_double_complex; #endif #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif /*--- Type declarations ---*/ /* "numpy.pxd":762 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; /* "numpy.pxd":763 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< * ctypedef npy_clongdouble clongdouble_t * */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; /* "numpy.pxd":764 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cdouble complex_t */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; /* "numpy.pxd":766 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/ #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil) \ if (acquire_gil) { \ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ PyGILState_Release(__pyx_gilstate_save); \ } else { \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil) \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext() \ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif /* CYTHON_REFNANNY */ #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); /*proto*/ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ const char* function_name); /*proto*/ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_List_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Tuple_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (PyList_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { /* inlined PySequence_GetItem() */ PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (unlikely(l < 0)) return NULL; i += l; } return m->sq_item(o, i); } } #else if (PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } static void __Pyx_RaiseBufferFallbackError(void); /*proto*/ #define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) #define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ typedef struct { Py_ssize_t shape, strides, suboffsets; } __Pyx_Buf_DimInfo; typedef struct { size_t refcount; Py_buffer pybuffer; } __Pyx_Buffer; typedef struct { __Pyx_Buffer *rcbuffer; char *data; __Pyx_Buf_DimInfo diminfo[8]; } __Pyx_LocalBuf_ND; #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); static void __Pyx_ReleaseBuffer(Py_buffer *view); #else #define __Pyx_GetBuffer PyObject_GetBuffer #define __Pyx_ReleaseBuffer PyBuffer_Release #endif static Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; static Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1}; static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /*proto*/ #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif static int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/ #if CYTHON_COMPILING_IN_PYPY || PY_MAJOR_VERSION >= 3 static PyObject* __pyx_print = 0; static PyObject* __pyx_print_kwargs = 0; #endif static int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/ #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) #define __Pyx_CIMAG(z) ((z).imag()) #else #define __Pyx_CREAL(z) (__real__(z)) #define __Pyx_CIMAG(z) (__imag__(z)) #endif #else #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif #if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); #if CYTHON_CCOMPLEX #define __Pyx_c_eqf(a, b) ((a)==(b)) #define __Pyx_c_sumf(a, b) ((a)+(b)) #define __Pyx_c_difff(a, b) ((a)-(b)) #define __Pyx_c_prodf(a, b) ((a)*(b)) #define __Pyx_c_quotf(a, b) ((a)/(b)) #define __Pyx_c_negf(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zerof(z) ((z)==(float)0) #define __Pyx_c_conjf(z) (::std::conj(z)) #if 1 #define __Pyx_c_absf(z) (::std::abs(z)) #define __Pyx_c_powf(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zerof(z) ((z)==0) #define __Pyx_c_conjf(z) (conjf(z)) #if 1 #define __Pyx_c_absf(z) (cabsf(z)) #define __Pyx_c_powf(a, b) (cpowf(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); #if CYTHON_CCOMPLEX #define __Pyx_c_eq(a, b) ((a)==(b)) #define __Pyx_c_sum(a, b) ((a)+(b)) #define __Pyx_c_diff(a, b) ((a)-(b)) #define __Pyx_c_prod(a, b) ((a)*(b)) #define __Pyx_c_quot(a, b) ((a)/(b)) #define __Pyx_c_neg(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero(z) ((z)==(double)0) #define __Pyx_c_conj(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs(z) (::std::abs(z)) #define __Pyx_c_pow(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero(z) ((z)==0) #define __Pyx_c_conj(z) (conj(z)) #if 1 #define __Pyx_c_abs(z) (cabs(z)) #define __Pyx_c_pow(a, b) (cpow(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static int __Pyx_check_binary_version(void); #if !defined(__Pyx_PyIdentifier_FromString) #if PY_MAJOR_VERSION < 3 #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) #else #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) #endif #endif static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); /*proto*/ typedef struct { int code_line; PyCodeObject* code_object; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Module declarations from 'cython' */ /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from 'cpython.object' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'libc.stdlib' */ /* Module declarations from 'numpy' */ /* Module declarations from 'numpy' */ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ /* Module declarations from 'mar345_IO' */ static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t = { "uint16_t", NULL, sizeof(__pyx_t_5numpy_uint16_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_uint16_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_uint16_t), 0 }; static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t = { "uint32_t", NULL, sizeof(__pyx_t_5numpy_uint32_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_uint32_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_uint32_t), 0 }; static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t = { "uint8_t", NULL, sizeof(__pyx_t_5numpy_uint8_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_uint8_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_uint8_t), 0 }; #define __Pyx_MODULE_NAME "mar345_IO" int __pyx_module_is_main_mar345_IO = 0; /* Implementation of 'mar345_IO' */ static PyObject *__pyx_builtin_open; static PyObject *__pyx_builtin_RuntimeError; static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_range; static PyObject *__pyx_pf_9mar345_IO_compress_pck(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_inputArray); /* proto */ static PyObject *__pyx_pf_9mar345_IO_2uncompress_pck(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_raw, PyObject *__pyx_v_dim1, PyObject *__pyx_v_dim2, PyObject *__pyx_v_overflowPix, PyObject *__pyx_v_version, PyObject *__pyx_v_normal_start); /* proto */ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ static char __pyx_k_1[] = "shape is 2D"; static char __pyx_k_4[] = "CCP4 packed image, X: "; static char __pyx_k_5[] = "CCP4 packed image V2, X: "; static char __pyx_k_6[] = "Cannot determine the compression scheme for PCK compression (either version 1 or 2)"; static char __pyx_k_8[] = "END OF HEADER"; static char __pyx_k_11[] = "\n"; static char __pyx_k_13[] = "Error while looking for overflowed pixels in line %s"; static char __pyx_k_19[] = "ndarray is not C contiguous"; static char __pyx_k_21[] = "ndarray is not Fortran contiguous"; static char __pyx_k_23[] = "Non-native byte order not supported"; static char __pyx_k_25[] = "unknown dtype code in numpy.pxd (%d)"; static char __pyx_k_26[] = "Format string allocated too short, see comment in numpy.pxd"; static char __pyx_k_29[] = "Format string allocated too short."; static char __pyx_k_31[] = "\nNew Cython version of mar345_io for preparing the migration to Python3\n\nCompressor & decompressor for \"pack\" algorithm by JPA, binding to CCP4 libraries\n\nWarning: decompressor is just a cython porting of mar345_io, but in cython so (soon) python3 compliant.\n\nFuture: make those algorithm actually generate strings not go via files;\n it will allow a broader use of the algorithm.\n\n"; static char __pyx_k_32[] = "Jerome Kieffer"; static char __pyx_k_33[] = "Gael Goret"; static char __pyx_k_34[] = "jerome.kieffer@esrf.eu"; static char __pyx_k_35[] = "LGPLv3+"; static char __pyx_k_36[] = "2012, European Synchrotron Radiation Facility, Grenoble, France"; static char __pyx_k_39[] = "/users/kieffer/workspace-ssd/fabio-git/src/mar345_IO.pyx"; static char __pyx_k__B[] = "B"; static char __pyx_k__H[] = "H"; static char __pyx_k__I[] = "I"; static char __pyx_k__L[] = "L"; static char __pyx_k__O[] = "O"; static char __pyx_k__Q[] = "Q"; static char __pyx_k__b[] = "b"; static char __pyx_k__d[] = "d"; static char __pyx_k__f[] = "f"; static char __pyx_k__g[] = "g"; static char __pyx_k__h[] = "h"; static char __pyx_k__i[] = "i"; static char __pyx_k__j[] = "j"; static char __pyx_k__l[] = "l"; static char __pyx_k__q[] = "q"; static char __pyx_k__Zd[] = "Zd"; static char __pyx_k__Zf[] = "Zf"; static char __pyx_k__Zg[] = "Zg"; static char __pyx_k__fd[] = "fd"; static char __pyx_k__os[] = "os"; static char __pyx_k__rb[] = "rb"; static char __pyx_k__end[] = "end"; static char __pyx_k__key[] = "key"; static char __pyx_k__out[] = "out"; static char __pyx_k__raw[] = "raw"; static char __pyx_k__ret[] = "ret"; static char __pyx_k__HIGH[] = "HIGH"; static char __pyx_k__data[] = "data"; static char __pyx_k__dim0[] = "dim0"; static char __pyx_k__dim1[] = "dim1"; static char __pyx_k__dim2[] = "dim2"; static char __pyx_k__find[] = "find"; static char __pyx_k__flat[] = "flat"; static char __pyx_k__key1[] = "key1"; static char __pyx_k__key2[] = "key2"; static char __pyx_k__name[] = "name"; static char __pyx_k__open[] = "open"; static char __pyx_k__read[] = "read"; static char __pyx_k__seek[] = "seek"; static char __pyx_k__size[] = "size"; static char __pyx_k__stop[] = "stop"; static char __pyx_k__word[] = "word"; static char __pyx_k__cdata[] = "cdata"; static char __pyx_k__cdimx[] = "cdimx"; static char __pyx_k__cdimy[] = "cdimy"; static char __pyx_k__chigh[] = "chigh"; static char __pyx_k__close[] = "close"; static char __pyx_k__dtype[] = "dtype"; static char __pyx_k__empty[] = "empty"; static char __pyx_k__fname[] = "fname"; static char __pyx_k__index[] = "index"; static char __pyx_k__int32[] = "int32"; static char __pyx_k__numpy[] = "numpy"; static char __pyx_k__odata[] = "odata"; static char __pyx_k__range[] = "range"; static char __pyx_k__ravel[] = "ravel"; static char __pyx_k__shape[] = "shape"; static char __pyx_k__sizes[] = "sizes"; static char __pyx_k__split[] = "split"; static char __pyx_k__start[] = "start"; static char __pyx_k__strip[] = "strip"; static char __pyx_k__uint8[] = "uint8"; static char __pyx_k__valid[] = "valid"; static char __pyx_k__astype[] = "astype"; static char __pyx_k__hiLine[] = "hiLine"; static char __pyx_k__lenkey[] = "lenkey"; static char __pyx_k__lstrip[] = "lstrip"; static char __pyx_k__output[] = "output"; static char __pyx_k__remove[] = "remove"; static char __pyx_k__uint16[] = "uint16"; static char __pyx_k__uint32[] = "uint32"; static char __pyx_k__values[] = "values"; static char __pyx_k__mkstemp[] = "mkstemp"; static char __pyx_k__version[] = "version"; static char __pyx_k____exit__[] = "__exit__"; static char __pyx_k____main__[] = "__main__"; static char __pyx_k____test__[] = "__test__"; static char __pyx_k__cversion[] = "cversion"; static char __pyx_k__instream[] = "instream"; static char __pyx_k__orecords[] = "orecords"; static char __pyx_k__tempfile[] = "tempfile"; static char __pyx_k____enter__[] = "__enter__"; static char __pyx_k__addresses[] = "addresses"; static char __pyx_k__mar345_IO[] = "mar345_IO"; static char __pyx_k__ValueError[] = "ValueError"; static char __pyx_k__fromstring[] = "fromstring"; static char __pyx_k__inputArray[] = "inputArray"; static char __pyx_k____authors__[] = "__authors__"; static char __pyx_k____contact__[] = "__contact__"; static char __pyx_k____license__[] = "__license__"; static char __pyx_k__overflowPix[] = "overflowPix"; static char __pyx_k__RuntimeError[] = "RuntimeError"; static char __pyx_k__compress_pck[] = "compress_pck"; static char __pyx_k__normal_start[] = "normal_start"; static char __pyx_k____copyright__[] = "__copyright__"; static char __pyx_k__normal_offset[] = "normal_offset"; static char __pyx_k__uncompress_pck[] = "uncompress_pck"; static char __pyx_k__ascontiguousarray[] = "ascontiguousarray"; static PyObject *__pyx_kp_s_1; static PyObject *__pyx_kp_s_11; static PyObject *__pyx_kp_s_13; static PyObject *__pyx_kp_u_19; static PyObject *__pyx_kp_u_21; static PyObject *__pyx_kp_u_23; static PyObject *__pyx_kp_u_25; static PyObject *__pyx_kp_u_26; static PyObject *__pyx_kp_u_29; static PyObject *__pyx_kp_s_32; static PyObject *__pyx_kp_s_33; static PyObject *__pyx_kp_s_34; static PyObject *__pyx_kp_s_35; static PyObject *__pyx_kp_s_36; static PyObject *__pyx_kp_s_39; static PyObject *__pyx_kp_s_4; static PyObject *__pyx_kp_s_5; static PyObject *__pyx_kp_s_6; static PyObject *__pyx_kp_s_8; static PyObject *__pyx_n_s__HIGH; static PyObject *__pyx_n_s__RuntimeError; static PyObject *__pyx_n_s__ValueError; static PyObject *__pyx_n_s____authors__; static PyObject *__pyx_n_s____contact__; static PyObject *__pyx_n_s____copyright__; static PyObject *__pyx_n_s____enter__; static PyObject *__pyx_n_s____exit__; static PyObject *__pyx_n_s____license__; static PyObject *__pyx_n_s____main__; static PyObject *__pyx_n_s____test__; static PyObject *__pyx_n_s__addresses; static PyObject *__pyx_n_s__ascontiguousarray; static PyObject *__pyx_n_s__astype; static PyObject *__pyx_n_s__cdata; static PyObject *__pyx_n_s__cdimx; static PyObject *__pyx_n_s__cdimy; static PyObject *__pyx_n_s__chigh; static PyObject *__pyx_n_s__close; static PyObject *__pyx_n_s__compress_pck; static PyObject *__pyx_n_s__cversion; static PyObject *__pyx_n_s__data; static PyObject *__pyx_n_s__dim0; static PyObject *__pyx_n_s__dim1; static PyObject *__pyx_n_s__dim2; static PyObject *__pyx_n_s__dtype; static PyObject *__pyx_n_s__empty; static PyObject *__pyx_n_s__end; static PyObject *__pyx_n_s__f; static PyObject *__pyx_n_s__fd; static PyObject *__pyx_n_s__find; static PyObject *__pyx_n_s__flat; static PyObject *__pyx_n_s__fname; static PyObject *__pyx_n_s__fromstring; static PyObject *__pyx_n_s__hiLine; static PyObject *__pyx_n_s__i; static PyObject *__pyx_n_s__index; static PyObject *__pyx_n_s__inputArray; static PyObject *__pyx_n_s__instream; static PyObject *__pyx_n_s__int32; static PyObject *__pyx_n_s__j; static PyObject *__pyx_n_s__key; static PyObject *__pyx_n_s__key1; static PyObject *__pyx_n_s__key2; static PyObject *__pyx_n_s__lenkey; static PyObject *__pyx_n_s__lstrip; static PyObject *__pyx_n_s__mar345_IO; static PyObject *__pyx_n_s__mkstemp; static PyObject *__pyx_n_s__name; static PyObject *__pyx_n_s__normal_offset; static PyObject *__pyx_n_s__normal_start; static PyObject *__pyx_n_s__numpy; static PyObject *__pyx_n_s__odata; static PyObject *__pyx_n_s__open; static PyObject *__pyx_n_s__orecords; static PyObject *__pyx_n_s__os; static PyObject *__pyx_n_s__out; static PyObject *__pyx_n_s__output; static PyObject *__pyx_n_s__overflowPix; static PyObject *__pyx_n_s__range; static PyObject *__pyx_n_s__ravel; static PyObject *__pyx_n_s__raw; static PyObject *__pyx_n_s__rb; static PyObject *__pyx_n_s__read; static PyObject *__pyx_n_s__remove; static PyObject *__pyx_n_s__ret; static PyObject *__pyx_n_s__seek; static PyObject *__pyx_n_s__shape; static PyObject *__pyx_n_s__size; static PyObject *__pyx_n_s__sizes; static PyObject *__pyx_n_s__split; static PyObject *__pyx_n_s__start; static PyObject *__pyx_n_s__stop; static PyObject *__pyx_n_s__strip; static PyObject *__pyx_n_s__tempfile; static PyObject *__pyx_n_s__uint16; static PyObject *__pyx_n_s__uint32; static PyObject *__pyx_n_s__uint8; static PyObject *__pyx_n_s__uncompress_pck; static PyObject *__pyx_n_s__valid; static PyObject *__pyx_n_s__values; static PyObject *__pyx_n_s__version; static PyObject *__pyx_n_s__word; static PyObject *__pyx_int_0; static PyObject *__pyx_int_1; static PyObject *__pyx_int_2; static PyObject *__pyx_int_neg_1; static PyObject *__pyx_int_13; static PyObject *__pyx_int_14; static PyObject *__pyx_int_15; static PyObject *__pyx_k_tuple_2; static PyObject *__pyx_k_tuple_3; static PyObject *__pyx_k_tuple_7; static PyObject *__pyx_k_tuple_9; static PyObject *__pyx_k_slice_15; static PyObject *__pyx_k_slice_17; static PyObject *__pyx_k_tuple_10; static PyObject *__pyx_k_tuple_12; static PyObject *__pyx_k_tuple_14; static PyObject *__pyx_k_tuple_16; static PyObject *__pyx_k_tuple_18; static PyObject *__pyx_k_tuple_20; static PyObject *__pyx_k_tuple_22; static PyObject *__pyx_k_tuple_24; static PyObject *__pyx_k_tuple_27; static PyObject *__pyx_k_tuple_28; static PyObject *__pyx_k_tuple_30; static PyObject *__pyx_k_tuple_37; static PyObject *__pyx_k_tuple_40; static PyObject *__pyx_k_codeobj_38; static PyObject *__pyx_k_codeobj_41; /* Python wrapper */ static PyObject *__pyx_pw_9mar345_IO_1compress_pck(PyObject *__pyx_self, PyObject *__pyx_v_inputArray); /*proto*/ static char __pyx_doc_9mar345_IO_compress_pck[] = "\n @param inputArray: numpy array as input\n @param filename: file to write data to\n "; static PyMethodDef __pyx_mdef_9mar345_IO_1compress_pck = {__Pyx_NAMESTR("compress_pck"), (PyCFunction)__pyx_pw_9mar345_IO_1compress_pck, METH_O, __Pyx_DOCSTR(__pyx_doc_9mar345_IO_compress_pck)}; static PyObject *__pyx_pw_9mar345_IO_1compress_pck(PyObject *__pyx_self, PyObject *__pyx_v_inputArray) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("compress_pck (wrapper)", 0); if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_inputArray), __pyx_ptype_5numpy_ndarray, 0, "inputArray", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_9mar345_IO_compress_pck(__pyx_self, ((PyArrayObject *)__pyx_v_inputArray)); goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "mar345_IO.pyx":33 * * @cython.boundscheck(False) * def compress_pck(numpy.ndarray inputArray not None): # <<<<<<<<<<<<<< * """ * @param inputArray: numpy array as input */ static PyObject *__pyx_pf_9mar345_IO_compress_pck(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_inputArray) { CYTHON_UNUSED long __pyx_v_size; int __pyx_v_dim0; int __pyx_v_dim1; int __pyx_v_fd; char *__pyx_v_name; PyArrayObject *__pyx_v_data = 0; short *__pyx_v_cdata; PyObject *__pyx_v_fname = NULL; PyObject *__pyx_v_f = NULL; PyObject *__pyx_v_output = NULL; __Pyx_LocalBuf_ND __pyx_pybuffernd_data; __Pyx_Buffer __pyx_pybuffer_data; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; long __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyArrayObject *__pyx_t_7 = NULL; PyObject *(*__pyx_t_8)(PyObject *); int __pyx_t_9; char *__pyx_t_10; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; int __pyx_t_15; PyObject *__pyx_t_16 = NULL; int __pyx_t_17; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("compress_pck", 0); __pyx_pybuffer_data.pybuffer.buf = NULL; __pyx_pybuffer_data.refcount = 0; __pyx_pybuffernd_data.data = NULL; __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data; /* "mar345_IO.pyx":38 * @param filename: file to write data to * """ * cdef long size = inputArray.size # <<<<<<<<<<<<<< * cdef int dim0, dim1, i, j, fd, ret * cdef char* name */ __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_inputArray), __pyx_n_s__size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_AsLong(__pyx_t_1); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = __pyx_t_2; /* "mar345_IO.pyx":41 * cdef int dim0, dim1, i, j, fd, ret * cdef char* name * assert inputArray.ndim == 2, "shape is 2D" # <<<<<<<<<<<<<< * dim0 = inputArray.shape[0] * dim1 = inputArray.shape[1] */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!(__pyx_v_inputArray->nd == 2))) { PyErr_SetObject(PyExc_AssertionError, ((PyObject *)__pyx_kp_s_1)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #endif /* "mar345_IO.pyx":42 * cdef char* name * assert inputArray.ndim == 2, "shape is 2D" * dim0 = inputArray.shape[0] # <<<<<<<<<<<<<< * dim1 = inputArray.shape[1] * cdef numpy.ndarray[numpy.uint16_t, ndim = 1] data = numpy.ascontiguousarray(inputArray.astype(numpy.uint16).ravel(), dtype=numpy.uint16) */ __pyx_v_dim0 = (__pyx_v_inputArray->dimensions[0]); /* "mar345_IO.pyx":43 * assert inputArray.ndim == 2, "shape is 2D" * dim0 = inputArray.shape[0] * dim1 = inputArray.shape[1] # <<<<<<<<<<<<<< * cdef numpy.ndarray[numpy.uint16_t, ndim = 1] data = numpy.ascontiguousarray(inputArray.astype(numpy.uint16).ravel(), dtype=numpy.uint16) * cdef short int * cdata */ __pyx_v_dim1 = (__pyx_v_inputArray->dimensions[1]); /* "mar345_IO.pyx":44 * dim0 = inputArray.shape[0] * dim1 = inputArray.shape[1] * cdef numpy.ndarray[numpy.uint16_t, ndim = 1] data = numpy.ascontiguousarray(inputArray.astype(numpy.uint16).ravel(), dtype=numpy.uint16) # <<<<<<<<<<<<<< * cdef short int * cdata * cdata = < short int *> data.data */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__ascontiguousarray); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_inputArray), __pyx_n_s__astype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__uint16); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__ravel); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_5)); __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__uint16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__dtype), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_7 = ((PyArrayObject *)__pyx_t_6); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_data = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_data.rcbuffer->pybuffer.buf = NULL; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_data.diminfo[0].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[0]; } } __pyx_t_7 = 0; __pyx_v_data = ((PyArrayObject *)__pyx_t_6); __pyx_t_6 = 0; /* "mar345_IO.pyx":46 * cdef numpy.ndarray[numpy.uint16_t, ndim = 1] data = numpy.ascontiguousarray(inputArray.astype(numpy.uint16).ravel(), dtype=numpy.uint16) * cdef short int * cdata * cdata = < short int *> data.data # <<<<<<<<<<<<<< * (fd,fname) = tempfile.mkstemp() * name = fname */ __pyx_v_cdata = ((short *)__pyx_v_data->data); /* "mar345_IO.pyx":47 * cdef short int * cdata * cdata = < short int *> data.data * (fd,fname) = tempfile.mkstemp() # <<<<<<<<<<<<<< * name = fname * with nogil: */ __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__tempfile); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_5 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__mkstemp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) { PyObject* sequence = __pyx_t_6; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_5 = PyList_GET_ITEM(sequence, 0); __pyx_t_4 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(__pyx_t_4); #else __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); #endif __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else { Py_ssize_t index = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_3); if (unlikely(!__pyx_t_5)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(__pyx_t_5); index = 1; __pyx_t_4 = __pyx_t_8(__pyx_t_3); if (unlikely(!__pyx_t_4)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_3), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = NULL; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L4_unpacking_done; __pyx_L3_unpacking_failed:; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_8 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L4_unpacking_done:; } __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_fd = __pyx_t_9; __pyx_v_fname = __pyx_t_4; __pyx_t_4 = 0; /* "mar345_IO.pyx":48 * cdata = < short int *> data.data * (fd,fname) = tempfile.mkstemp() * name = fname # <<<<<<<<<<<<<< * with nogil: * pack_wordimage_c(cdata, dim1, dim0, name) */ __pyx_t_10 = PyBytes_AsString(__pyx_v_fname); if (unlikely((!__pyx_t_10) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_name = ((char *)__pyx_t_10); /* "mar345_IO.pyx":49 * (fd,fname) = tempfile.mkstemp() * name = fname * with nogil: # <<<<<<<<<<<<<< * pack_wordimage_c(cdata, dim1, dim0, name) * with open(name,"rb") as f: */ { #ifdef WITH_THREAD PyThreadState *_save = NULL; #endif Py_UNBLOCK_THREADS /*try:*/ { /* "mar345_IO.pyx":50 * name = fname * with nogil: * pack_wordimage_c(cdata, dim1, dim0, name) # <<<<<<<<<<<<<< * with open(name,"rb") as f: * f.seek(0) */ pack_wordimage_c(__pyx_v_cdata, __pyx_v_dim1, __pyx_v_dim0, __pyx_v_name); } /* "mar345_IO.pyx":49 * (fd,fname) = tempfile.mkstemp() * name = fname * with nogil: # <<<<<<<<<<<<<< * pack_wordimage_c(cdata, dim1, dim0, name) * with open(name,"rb") as f: */ /*finally:*/ { Py_BLOCK_THREADS } } /* "mar345_IO.pyx":51 * with nogil: * pack_wordimage_c(cdata, dim1, dim0, name) * with open(name,"rb") as f: # <<<<<<<<<<<<<< * f.seek(0) * output = f.read() */ /*with:*/ { __pyx_t_6 = PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_6)); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6)); __Pyx_GIVEREF(((PyObject *)__pyx_t_6)); __Pyx_INCREF(((PyObject *)__pyx_n_s__rb)); PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_n_s__rb)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__rb)); __pyx_t_6 = 0; __pyx_t_6 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_11 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s____exit__); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_11); __pyx_t_4 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s____enter__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L8_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L8_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /*try:*/ { { __Pyx_ExceptionSave(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14); __Pyx_XGOTREF(__pyx_t_12); __Pyx_XGOTREF(__pyx_t_13); __Pyx_XGOTREF(__pyx_t_14); /*try:*/ { __Pyx_INCREF(__pyx_t_5); __pyx_v_f = __pyx_t_5; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; /* "mar345_IO.pyx":52 * pack_wordimage_c(cdata, dim1, dim0, name) * with open(name,"rb") as f: * f.seek(0) # <<<<<<<<<<<<<< * output = f.read() * os.close(fd) */ __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L12_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_2), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L12_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "mar345_IO.pyx":53 * with open(name,"rb") as f: * f.seek(0) * output = f.read() # <<<<<<<<<<<<<< * os.close(fd) * os.remove(name) */ __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__read); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L12_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_5 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L12_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_output = __pyx_t_5; __pyx_t_5 = 0; } __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; goto __pyx_L19_try_end; __pyx_L12_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; /* "mar345_IO.pyx":51 * with nogil: * pack_wordimage_c(cdata, dim1, dim0, name) * with open(name,"rb") as f: # <<<<<<<<<<<<<< * f.seek(0) * output = f.read() */ /*except:*/ { __Pyx_AddTraceback("mar345_IO.compress_pck", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L14_except_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L14_except_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __Pyx_INCREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __Pyx_INCREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_16 = PyObject_Call(__pyx_t_11, __pyx_t_3, NULL); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L14_except_error;} __Pyx_GOTREF(__pyx_t_16); __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_16); __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L14_except_error;} __pyx_t_17 = (!__pyx_t_15); if (__pyx_t_17) { __Pyx_GIVEREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_4); __Pyx_ErrRestore(__pyx_t_5, __pyx_t_6, __pyx_t_4); __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_4 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L14_except_error;} goto __pyx_L23; } __pyx_L23:; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; goto __pyx_L13_exception_handled; } __pyx_L14_except_error:; __Pyx_XGIVEREF(__pyx_t_12); __Pyx_XGIVEREF(__pyx_t_13); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14); goto __pyx_L1_error; __pyx_L13_exception_handled:; __Pyx_XGIVEREF(__pyx_t_12); __Pyx_XGIVEREF(__pyx_t_13); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14); __pyx_L19_try_end:; } } /*finally:*/ { if (__pyx_t_11) { __pyx_t_14 = PyObject_Call(__pyx_t_11, __pyx_k_tuple_3, NULL); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_14); __pyx_t_17 = __Pyx_PyObject_IsTrue(__pyx_t_14); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } goto __pyx_L24; __pyx_L8_error:; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L1_error; __pyx_L24:; } /* "mar345_IO.pyx":54 * f.seek(0) * output = f.read() * os.close(fd) # <<<<<<<<<<<<<< * os.remove(name) * return output */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__os); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_6 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__close); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyInt_FromLong(__pyx_v_fd); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "mar345_IO.pyx":55 * output = f.read() * os.close(fd) * os.remove(name) # <<<<<<<<<<<<<< * return output * */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__os); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__remove); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_4)); __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_4)); __Pyx_GIVEREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "mar345_IO.pyx":56 * os.close(fd) * os.remove(name) * return output # <<<<<<<<<<<<<< * * @cython.boundscheck(False) */ __Pyx_XDECREF(__pyx_r); if (unlikely(!__pyx_v_output)) { __Pyx_RaiseUnboundLocalError("output"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_INCREF(__pyx_v_output); __pyx_r = __pyx_v_output; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("mar345_IO.compress_pck", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_data); __Pyx_XDECREF(__pyx_v_fname); __Pyx_XDECREF(__pyx_v_f); __Pyx_XDECREF(__pyx_v_output); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_9mar345_IO_3uncompress_pck(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_9mar345_IO_2uncompress_pck[] = "\n Unpack a mar345 compressed image\n\n @param raw: input string (bytes in python3)\n @param dim1,dim2: optional parameters size\n @param overflowPix: optional parameters: number of overflowed pixels\n @param version: PCK version 1 or 2\n @param normal_start: position of the normal value section (can be auto-guessed)\n @return : ndarray of 2D with the right size\n "; static PyMethodDef __pyx_mdef_9mar345_IO_3uncompress_pck = {__Pyx_NAMESTR("uncompress_pck"), (PyCFunction)__pyx_pw_9mar345_IO_3uncompress_pck, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_9mar345_IO_2uncompress_pck)}; static PyObject *__pyx_pw_9mar345_IO_3uncompress_pck(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_raw = 0; PyObject *__pyx_v_dim1 = 0; PyObject *__pyx_v_dim2 = 0; PyObject *__pyx_v_overflowPix = 0; PyObject *__pyx_v_version = 0; PyObject *__pyx_v_normal_start = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("uncompress_pck (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__raw,&__pyx_n_s__dim1,&__pyx_n_s__dim2,&__pyx_n_s__overflowPix,&__pyx_n_s__version,&__pyx_n_s__normal_start,0}; PyObject* values[6] = {0,0,0,0,0,0}; /* "mar345_IO.pyx":59 * * @cython.boundscheck(False) * def uncompress_pck(raw not None, dim1=None, dim2=None, overflowPix=None, version=None, normal_start=None): # <<<<<<<<<<<<<< * """ * Unpack a mar345 compressed image */ values[1] = ((PyObject *)Py_None); values[2] = ((PyObject *)Py_None); values[3] = ((PyObject *)Py_None); values[4] = ((PyObject *)Py_None); values[5] = ((PyObject *)Py_None); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__raw)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dim1); if (value) { values[1] = value; kw_args--; } } case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dim2); if (value) { values[2] = value; kw_args--; } } case 3: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__overflowPix); if (value) { values[3] = value; kw_args--; } } case 4: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__version); if (value) { values[4] = value; kw_args--; } } case 5: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__normal_start); if (value) { values[5] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "uncompress_pck") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_raw = values[0]; __pyx_v_dim1 = values[1]; __pyx_v_dim2 = values[2]; __pyx_v_overflowPix = values[3]; __pyx_v_version = values[4]; __pyx_v_normal_start = values[5]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("uncompress_pck", 0, 1, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("mar345_IO.uncompress_pck", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(((PyObject *)__pyx_v_raw) == Py_None)) { PyErr_Format(PyExc_TypeError, "Argument 'raw' must not be None"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_r = __pyx_pf_9mar345_IO_2uncompress_pck(__pyx_self, __pyx_v_raw, __pyx_v_dim1, __pyx_v_dim2, __pyx_v_overflowPix, __pyx_v_version, __pyx_v_normal_start); goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_9mar345_IO_2uncompress_pck(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_raw, PyObject *__pyx_v_dim1, PyObject *__pyx_v_dim2, PyObject *__pyx_v_overflowPix, PyObject *__pyx_v_version, PyObject *__pyx_v_normal_start) { int __pyx_v_cdimx; int __pyx_v_cdimy; int __pyx_v_chigh; int __pyx_v_cversion; int __pyx_v_orecords; int __pyx_v_normal_offset; PyArrayObject *__pyx_v_data = 0; PyArrayObject *__pyx_v_flat = 0; PyArrayObject *__pyx_v_instream = 0; PyObject *__pyx_v_end = NULL; PyObject *__pyx_v_key1 = NULL; PyObject *__pyx_v_key2 = NULL; PyObject *__pyx_v_start = NULL; PyObject *__pyx_v_key = NULL; PyObject *__pyx_v_lenkey = NULL; PyObject *__pyx_v_sizes = NULL; PyObject *__pyx_v_hiLine = NULL; PyObject *__pyx_v_word = NULL; PyObject *__pyx_v_stop = NULL; PyObject *__pyx_v_odata = NULL; PyObject *__pyx_v_addresses = NULL; PyObject *__pyx_v_values = NULL; PyObject *__pyx_v_valid = NULL; __Pyx_LocalBuf_ND __pyx_pybuffernd_data; __Pyx_Buffer __pyx_pybuffer_data; __Pyx_LocalBuf_ND __pyx_pybuffernd_flat; __Pyx_Buffer __pyx_pybuffer_flat; __Pyx_LocalBuf_ND __pyx_pybuffernd_instream; __Pyx_Buffer __pyx_pybuffer_instream; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; int __pyx_t_8; PyObject *__pyx_t_9 = NULL; Py_ssize_t __pyx_t_10; Py_ssize_t __pyx_t_11; int __pyx_t_12; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyArrayObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; PyObject *__pyx_t_17 = NULL; PyObject *__pyx_t_18 = NULL; PyArrayObject *__pyx_t_19 = NULL; PyArrayObject *__pyx_t_20 = NULL; long __pyx_t_21; long __pyx_t_22; long __pyx_t_23; long __pyx_t_24; long __pyx_t_25; long __pyx_t_26; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("uncompress_pck", 0); __pyx_pybuffer_data.pybuffer.buf = NULL; __pyx_pybuffer_data.refcount = 0; __pyx_pybuffernd_data.data = NULL; __pyx_pybuffernd_data.rcbuffer = &__pyx_pybuffer_data; __pyx_pybuffer_flat.pybuffer.buf = NULL; __pyx_pybuffer_flat.refcount = 0; __pyx_pybuffernd_flat.data = NULL; __pyx_pybuffernd_flat.rcbuffer = &__pyx_pybuffer_flat; __pyx_pybuffer_instream.pybuffer.buf = NULL; __pyx_pybuffer_instream.refcount = 0; __pyx_pybuffernd_instream.data = NULL; __pyx_pybuffernd_instream.rcbuffer = &__pyx_pybuffer_instream; /* "mar345_IO.pyx":75 * cdef numpy.ndarray[numpy.uint8_t, ndim = 1] instream * cdef void* out * end=None # <<<<<<<<<<<<<< * key1 = "CCP4 packed image, X: " * key2 = "CCP4 packed image V2, X: " */ __Pyx_INCREF(Py_None); __pyx_v_end = Py_None; /* "mar345_IO.pyx":76 * cdef void* out * end=None * key1 = "CCP4 packed image, X: " # <<<<<<<<<<<<<< * key2 = "CCP4 packed image V2, X: " * */ __Pyx_INCREF(((PyObject *)__pyx_kp_s_4)); __pyx_v_key1 = ((PyObject *)__pyx_kp_s_4); /* "mar345_IO.pyx":77 * end=None * key1 = "CCP4 packed image, X: " * key2 = "CCP4 packed image V2, X: " # <<<<<<<<<<<<<< * * if (dim1 is None) or (dim2 is None) or (version not in [1,2]) or (version is None) or (normal_start is None): */ __Pyx_INCREF(((PyObject *)__pyx_kp_s_5)); __pyx_v_key2 = ((PyObject *)__pyx_kp_s_5); /* "mar345_IO.pyx":79 * key2 = "CCP4 packed image V2, X: " * * if (dim1 is None) or (dim2 is None) or (version not in [1,2]) or (version is None) or (normal_start is None): # <<<<<<<<<<<<<< * start = raw.find(key2) * key = key2 */ __pyx_t_1 = (__pyx_v_dim1 == Py_None); if (!__pyx_t_1) { __pyx_t_2 = (__pyx_v_dim2 == Py_None); if (!__pyx_t_2) { __Pyx_INCREF(__pyx_v_version); __pyx_t_3 = __pyx_v_version; __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_int_1, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (((int)__pyx_t_5)) { __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_int_2, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_7 = ((int)__pyx_t_6); } else { __pyx_t_7 = ((int)__pyx_t_5); } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_5 = __pyx_t_7; if (!__pyx_t_5) { __pyx_t_7 = (__pyx_v_version == Py_None); if (!__pyx_t_7) { __pyx_t_6 = (__pyx_v_normal_start == Py_None); __pyx_t_8 = __pyx_t_6; } else { __pyx_t_8 = __pyx_t_7; } __pyx_t_7 = __pyx_t_8; } else { __pyx_t_7 = __pyx_t_5; } __pyx_t_5 = __pyx_t_7; } else { __pyx_t_5 = __pyx_t_2; } __pyx_t_2 = __pyx_t_5; } else { __pyx_t_2 = __pyx_t_1; } if (__pyx_t_2) { /* "mar345_IO.pyx":80 * * if (dim1 is None) or (dim2 is None) or (version not in [1,2]) or (version is None) or (normal_start is None): * start = raw.find(key2) # <<<<<<<<<<<<<< * key = key2 * cversion = 2 */ __pyx_t_3 = PyObject_GetAttr(__pyx_v_raw, __pyx_n_s__find); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_key2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_key2); __Pyx_GIVEREF(__pyx_v_key2); __pyx_t_9 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_v_start = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":81 * if (dim1 is None) or (dim2 is None) or (version not in [1,2]) or (version is None) or (normal_start is None): * start = raw.find(key2) * key = key2 # <<<<<<<<<<<<<< * cversion = 2 * if start == -1: */ __Pyx_INCREF(__pyx_v_key2); __pyx_v_key = __pyx_v_key2; /* "mar345_IO.pyx":82 * start = raw.find(key2) * key = key2 * cversion = 2 # <<<<<<<<<<<<<< * if start == -1: * start = raw.find(key1) */ __pyx_v_cversion = 2; /* "mar345_IO.pyx":83 * key = key2 * cversion = 2 * if start == -1: # <<<<<<<<<<<<<< * start = raw.find(key1) * key = key1 */ __pyx_t_9 = PyObject_RichCompare(__pyx_v_start, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (__pyx_t_2) { /* "mar345_IO.pyx":84 * cversion = 2 * if start == -1: * start = raw.find(key1) # <<<<<<<<<<<<<< * key = key1 * cversion = 1 */ __pyx_t_9 = PyObject_GetAttr(__pyx_v_raw, __pyx_n_s__find); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_key1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_key1); __Pyx_GIVEREF(__pyx_v_key1); __pyx_t_3 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_v_start); __pyx_v_start = __pyx_t_3; __pyx_t_3 = 0; /* "mar345_IO.pyx":85 * if start == -1: * start = raw.find(key1) * key = key1 # <<<<<<<<<<<<<< * cversion = 1 * lenkey = len(key) */ __Pyx_INCREF(__pyx_v_key1); __Pyx_DECREF(__pyx_v_key); __pyx_v_key = __pyx_v_key1; /* "mar345_IO.pyx":86 * start = raw.find(key1) * key = key1 * cversion = 1 # <<<<<<<<<<<<<< * lenkey = len(key) * start = raw.index(key) + lenkey */ __pyx_v_cversion = 1; goto __pyx_L4; } __pyx_L4:; /* "mar345_IO.pyx":87 * key = key1 * cversion = 1 * lenkey = len(key) # <<<<<<<<<<<<<< * start = raw.index(key) + lenkey * sizes = raw[start:start + 13] */ __pyx_t_10 = PyObject_Length(__pyx_v_key); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_v_lenkey = __pyx_t_3; __pyx_t_3 = 0; /* "mar345_IO.pyx":88 * cversion = 1 * lenkey = len(key) * start = raw.index(key) + lenkey # <<<<<<<<<<<<<< * sizes = raw[start:start + 13] * cdimx = < int > int(sizes[:4]) */ __pyx_t_3 = PyObject_GetAttr(__pyx_v_raw, __pyx_n_s__index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_key); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_key); __Pyx_GIVEREF(__pyx_v_key); __pyx_t_9 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_4 = PyNumber_Add(__pyx_t_9, __pyx_v_lenkey); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_v_start); __pyx_v_start = __pyx_t_4; __pyx_t_4 = 0; /* "mar345_IO.pyx":89 * lenkey = len(key) * start = raw.index(key) + lenkey * sizes = raw[start:start + 13] # <<<<<<<<<<<<<< * cdimx = < int > int(sizes[:4]) * cdimy = < int > int(sizes[-4:]) */ __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_start); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = PyNumber_Add(__pyx_v_start, __pyx_int_13); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PySequence_GetSlice(__pyx_v_raw, __pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_v_sizes = __pyx_t_4; __pyx_t_4 = 0; /* "mar345_IO.pyx":90 * start = raw.index(key) + lenkey * sizes = raw[start:start + 13] * cdimx = < int > int(sizes[:4]) # <<<<<<<<<<<<<< * cdimy = < int > int(sizes[-4:]) * normal_offset = start + 13 */ __pyx_t_4 = __Pyx_PySequence_GetSlice(__pyx_v_sizes, 0, 4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_cdimx = ((int)__pyx_t_12); /* "mar345_IO.pyx":91 * sizes = raw[start:start + 13] * cdimx = < int > int(sizes[:4]) * cdimy = < int > int(sizes[-4:]) # <<<<<<<<<<<<<< * normal_offset = start + 13 * else: */ __pyx_t_4 = __Pyx_PySequence_GetSlice(__pyx_v_sizes, -4, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_cdimy = ((int)__pyx_t_12); /* "mar345_IO.pyx":92 * cdimx = < int > int(sizes[:4]) * cdimy = < int > int(sizes[-4:]) * normal_offset = start + 13 # <<<<<<<<<<<<<< * else: * cdimx = < int > dim1 */ __pyx_t_4 = PyNumber_Add(__pyx_v_start, __pyx_int_13); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_normal_offset = __pyx_t_12; goto __pyx_L3; } /*else*/ { /* "mar345_IO.pyx":94 * normal_offset = start + 13 * else: * cdimx = < int > dim1 # <<<<<<<<<<<<<< * cdimy = < int > dim2 * cversion = version */ __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_v_dim1); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_cdimx = ((int)__pyx_t_12); /* "mar345_IO.pyx":95 * else: * cdimx = < int > dim1 * cdimy = < int > dim2 # <<<<<<<<<<<<<< * cversion = version * normal_offset = normal_start */ __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_v_dim2); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_cdimy = ((int)__pyx_t_12); /* "mar345_IO.pyx":96 * cdimx = < int > dim1 * cdimy = < int > dim2 * cversion = version # <<<<<<<<<<<<<< * normal_offset = normal_start * if cversion==1: */ __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_v_version); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_cversion = ((int)__pyx_t_12); /* "mar345_IO.pyx":97 * cdimy = < int > dim2 * cversion = version * normal_offset = normal_start # <<<<<<<<<<<<<< * if cversion==1: * lenkey = len(key1) */ __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_v_normal_start); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_normal_offset = ((int)__pyx_t_12); /* "mar345_IO.pyx":98 * cversion = version * normal_offset = normal_start * if cversion==1: # <<<<<<<<<<<<<< * lenkey = len(key1) * else: */ __pyx_t_2 = (__pyx_v_cversion == 1); if (__pyx_t_2) { /* "mar345_IO.pyx":99 * normal_offset = normal_start * if cversion==1: * lenkey = len(key1) # <<<<<<<<<<<<<< * else: * lenkey = len(key2) */ __pyx_t_11 = PyObject_Length(__pyx_v_key1); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_v_lenkey = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L5; } /*else*/ { /* "mar345_IO.pyx":101 * lenkey = len(key1) * else: * lenkey = len(key2) # <<<<<<<<<<<<<< * if cversion not in [1,2]: * raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") */ __pyx_t_11 = PyObject_Length(__pyx_v_key2); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_v_lenkey = __pyx_t_4; __pyx_t_4 = 0; } __pyx_L5:; } __pyx_L3:; /* "mar345_IO.pyx":102 * else: * lenkey = len(key2) * if cversion not in [1,2]: # <<<<<<<<<<<<<< * raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") * if (overflowPix is None): */ switch (__pyx_v_cversion) { case 1: case 2: __pyx_t_2 = 0; break; default: __pyx_t_2 = 1; break; } __pyx_t_1 = __pyx_t_2; if (__pyx_t_1) { /* "mar345_IO.pyx":103 * lenkey = len(key2) * if cversion not in [1,2]: * raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") # <<<<<<<<<<<<<< * if (overflowPix is None): * end = raw.find("END OF HEADER") */ __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_7), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "mar345_IO.pyx":104 * if cversion not in [1,2]: * raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") * if (overflowPix is None): # <<<<<<<<<<<<<< * end = raw.find("END OF HEADER") * start = raw[:end].find("HIGH") */ __pyx_t_1 = (__pyx_v_overflowPix == Py_None); if (__pyx_t_1) { /* "mar345_IO.pyx":105 * raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") * if (overflowPix is None): * end = raw.find("END OF HEADER") # <<<<<<<<<<<<<< * start = raw[:end].find("HIGH") * hiLine = raw[start:end] */ __pyx_t_4 = PyObject_GetAttr(__pyx_v_raw, __pyx_n_s__find); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_9 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_9), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_v_end); __pyx_v_end = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":106 * if (overflowPix is None): * end = raw.find("END OF HEADER") * start = raw[:end].find("HIGH") # <<<<<<<<<<<<<< * hiLine = raw[start:end] * hiLine = hiLine.split("\n")[0] */ __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_end); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_9 = __Pyx_PySequence_GetSlice(__pyx_v_raw, 0, __pyx_t_11); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_4 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__find); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_XDECREF(__pyx_v_start); __pyx_v_start = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":107 * end = raw.find("END OF HEADER") * start = raw[:end].find("HIGH") * hiLine = raw[start:end] # <<<<<<<<<<<<<< * hiLine = hiLine.split("\n")[0] * word = hiLine.split() */ __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_start); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_end); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_9 = __Pyx_PySequence_GetSlice(__pyx_v_raw, __pyx_t_11, __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_v_hiLine = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":108 * start = raw[:end].find("HIGH") * hiLine = raw[start:end] * hiLine = hiLine.split("\n")[0] # <<<<<<<<<<<<<< * word = hiLine.split() * if len(word) > 1: */ __pyx_t_9 = PyObject_GetAttr(__pyx_v_hiLine, __pyx_n_s__split); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_4 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_v_hiLine); __pyx_v_hiLine = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":109 * hiLine = raw[start:end] * hiLine = hiLine.split("\n")[0] * word = hiLine.split() # <<<<<<<<<<<<<< * if len(word) > 1: * chigh = int(word[1]) */ __pyx_t_9 = PyObject_GetAttr(__pyx_v_hiLine, __pyx_n_s__split); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_4 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_v_word = __pyx_t_4; __pyx_t_4 = 0; /* "mar345_IO.pyx":110 * hiLine = hiLine.split("\n")[0] * word = hiLine.split() * if len(word) > 1: # <<<<<<<<<<<<<< * chigh = int(word[1]) * else: */ __pyx_t_10 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = (__pyx_t_10 > 1); if (__pyx_t_1) { /* "mar345_IO.pyx":111 * word = hiLine.split() * if len(word) > 1: * chigh = int(word[1]) # <<<<<<<<<<<<<< * else: * print("Error while looking for overflowed pixels in line %s" % hiLine.strip()) */ __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_word, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_chigh = __pyx_t_12; goto __pyx_L8; } /*else*/ { /* "mar345_IO.pyx":113 * chigh = int(word[1]) * else: * print("Error while looking for overflowed pixels in line %s" % hiLine.strip()) # <<<<<<<<<<<<<< * chigh = 0 * else: */ __pyx_t_4 = PyObject_GetAttr(__pyx_v_hiLine, __pyx_n_s__strip); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_9 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_4)); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; /* "mar345_IO.pyx":114 * else: * print("Error while looking for overflowed pixels in line %s" % hiLine.strip()) * chigh = 0 # <<<<<<<<<<<<<< * else: * chigh = < int > overflowPix */ __pyx_v_chigh = 0; } __pyx_L8:; goto __pyx_L7; } /*else*/ { /* "mar345_IO.pyx":116 * chigh = 0 * else: * chigh = < int > overflowPix # <<<<<<<<<<<<<< * * orecords = (chigh/8.0+0.875) */ __pyx_t_12 = __Pyx_PyInt_AsInt(__pyx_v_overflowPix); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_chigh = ((int)__pyx_t_12); } __pyx_L7:; /* "mar345_IO.pyx":118 * chigh = < int > overflowPix * * orecords = (chigh/8.0+0.875) # <<<<<<<<<<<<<< * data = numpy.empty((cdimy, cdimx), dtype=numpy.uint32) * flat = data.ravel() #flat view on the data */ __pyx_v_orecords = ((int)((__pyx_v_chigh / 8.0) + 0.875)); /* "mar345_IO.pyx":119 * * orecords = (chigh/8.0+0.875) * data = numpy.empty((cdimy, cdimx), dtype=numpy.uint32) # <<<<<<<<<<<<<< * flat = data.ravel() #flat view on the data * instream = numpy.fromstring(raw[normal_offset:].lstrip(),dtype=numpy.uint8) */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_9 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__empty); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyInt_FromLong(__pyx_v_cdimy); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyInt_FromLong(__pyx_v_cdimx); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_13 = PyTuple_New(2); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_4 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_13)); __Pyx_GIVEREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0; __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_13)); __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_14 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__uint32); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_14); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__dtype), __pyx_t_14) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_14); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0; if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_15 = ((PyArrayObject *)__pyx_t_14); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __pyx_t_12 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack); if (unlikely(__pyx_t_12 < 0)) { PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_data.rcbuffer->pybuffer, (PyObject*)__pyx_v_data, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) { Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18); __Pyx_RaiseBufferFallbackError(); } else { PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18); } } __pyx_pybuffernd_data.diminfo[0].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_data.diminfo[0].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_data.diminfo[1].strides = __pyx_pybuffernd_data.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_data.diminfo[1].shape = __pyx_pybuffernd_data.rcbuffer->pybuffer.shape[1]; if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_15 = 0; __pyx_v_data = ((PyArrayObject *)__pyx_t_14); __pyx_t_14 = 0; /* "mar345_IO.pyx":120 * orecords = (chigh/8.0+0.875) * data = numpy.empty((cdimy, cdimx), dtype=numpy.uint32) * flat = data.ravel() #flat view on the data # <<<<<<<<<<<<<< * instream = numpy.fromstring(raw[normal_offset:].lstrip(),dtype=numpy.uint8) * with nogil: */ __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_data), __pyx_n_s__ravel); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_14); __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_13); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; if (!(likely(((__pyx_t_13) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_13, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_19 = ((PyArrayObject *)__pyx_t_13); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_flat.rcbuffer->pybuffer); __pyx_t_12 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_flat.rcbuffer->pybuffer, (PyObject*)__pyx_t_19, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); if (unlikely(__pyx_t_12 < 0)) { PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_flat.rcbuffer->pybuffer, (PyObject*)__pyx_v_flat, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16); __Pyx_RaiseBufferFallbackError(); } else { PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16); } } __pyx_pybuffernd_flat.diminfo[0].strides = __pyx_pybuffernd_flat.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_flat.diminfo[0].shape = __pyx_pybuffernd_flat.rcbuffer->pybuffer.shape[0]; if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_19 = 0; __pyx_v_flat = ((PyArrayObject *)__pyx_t_13); __pyx_t_13 = 0; /* "mar345_IO.pyx":121 * data = numpy.empty((cdimy, cdimx), dtype=numpy.uint32) * flat = data.ravel() #flat view on the data * instream = numpy.fromstring(raw[normal_offset:].lstrip(),dtype=numpy.uint8) # <<<<<<<<<<<<<< * with nogil: * ################################################################################ */ __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_13); __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__fromstring); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_14); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; __pyx_t_13 = __Pyx_PySequence_GetSlice(__pyx_v_raw, __pyx_v_normal_offset, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_13); __pyx_t_3 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__lstrip); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; __pyx_t_13 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_13); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_13); __Pyx_GIVEREF(__pyx_t_13); __pyx_t_13 = 0; __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_13)); __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_4 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__uint8); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__dtype), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0; if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_20 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_instream.rcbuffer->pybuffer); __pyx_t_12 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_instream.rcbuffer->pybuffer, (PyObject*)__pyx_t_20, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); if (unlikely(__pyx_t_12 < 0)) { PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_instream.rcbuffer->pybuffer, (PyObject*)__pyx_v_instream, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18); __Pyx_RaiseBufferFallbackError(); } else { PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18); } } __pyx_pybuffernd_instream.diminfo[0].strides = __pyx_pybuffernd_instream.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_instream.diminfo[0].shape = __pyx_pybuffernd_instream.rcbuffer->pybuffer.shape[0]; if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_20 = 0; __pyx_v_instream = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; /* "mar345_IO.pyx":122 * flat = data.ravel() #flat view on the data * instream = numpy.fromstring(raw[normal_offset:].lstrip(),dtype=numpy.uint8) * with nogil: # <<<<<<<<<<<<<< * ################################################################################ * # relay to whichever version of ccp4_unpack is appropriate */ { #ifdef WITH_THREAD PyThreadState *_save = NULL; #endif Py_UNBLOCK_THREADS /*try:*/ { /* "mar345_IO.pyx":126 * # relay to whichever version of ccp4_unpack is appropriate * ################################################################################ * if cversion == 1: # <<<<<<<<<<<<<< * ccp4_unpack_string( &data[0,0], &instream[0], cdimx, cdimy,0); * else:# cversion == 2: */ __pyx_t_1 = (__pyx_v_cversion == 1); if (__pyx_t_1) { /* "mar345_IO.pyx":127 * ################################################################################ * if cversion == 1: * ccp4_unpack_string( &data[0,0], &instream[0], cdimx, cdimy,0); # <<<<<<<<<<<<<< * else:# cversion == 2: * ccp4_unpack_v2_string( &data[0,0], &instream[0], cdimx, cdimy,0); */ __pyx_t_21 = 0; __pyx_t_22 = 0; if (__pyx_t_21 < 0) __pyx_t_21 += __pyx_pybuffernd_data.diminfo[0].shape; if (__pyx_t_22 < 0) __pyx_t_22 += __pyx_pybuffernd_data.diminfo[1].shape; __pyx_t_23 = 0; if (__pyx_t_23 < 0) __pyx_t_23 += __pyx_pybuffernd_instream.diminfo[0].shape; ccp4_unpack_string((&(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_uint32_t *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_data.diminfo[1].strides))), (&(*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint8_t *, __pyx_pybuffernd_instream.rcbuffer->pybuffer.buf, __pyx_t_23, __pyx_pybuffernd_instream.diminfo[0].strides))), __pyx_v_cdimx, __pyx_v_cdimy, 0); goto __pyx_L12; } /*else*/ { /* "mar345_IO.pyx":129 * ccp4_unpack_string( &data[0,0], &instream[0], cdimx, cdimy,0); * else:# cversion == 2: * ccp4_unpack_v2_string( &data[0,0], &instream[0], cdimx, cdimy,0); # <<<<<<<<<<<<<< * ################################################################################ * # handle overflows */ __pyx_t_24 = 0; __pyx_t_25 = 0; if (__pyx_t_24 < 0) __pyx_t_24 += __pyx_pybuffernd_data.diminfo[0].shape; if (__pyx_t_25 < 0) __pyx_t_25 += __pyx_pybuffernd_data.diminfo[1].shape; __pyx_t_26 = 0; if (__pyx_t_26 < 0) __pyx_t_26 += __pyx_pybuffernd_instream.diminfo[0].shape; ccp4_unpack_v2_string((&(*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_uint32_t *, __pyx_pybuffernd_data.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_data.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_data.diminfo[1].strides))), (&(*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint8_t *, __pyx_pybuffernd_instream.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_instream.diminfo[0].strides))), __pyx_v_cdimx, __pyx_v_cdimy, 0); } __pyx_L12:; } /* "mar345_IO.pyx":122 * flat = data.ravel() #flat view on the data * instream = numpy.fromstring(raw[normal_offset:].lstrip(),dtype=numpy.uint8) * with nogil: # <<<<<<<<<<<<<< * ################################################################################ * # relay to whichever version of ccp4_unpack is appropriate */ /*finally:*/ { Py_BLOCK_THREADS } } /* "mar345_IO.pyx":133 * # handle overflows * ################################################################################ * stop = normal_offset-lenkey-14 # <<<<<<<<<<<<<< * odata = numpy.fromstring(raw[stop-64*orecords: stop],dtype=numpy.int32) * odata.shape = -1,2 */ __pyx_t_4 = PyInt_FromLong(__pyx_v_normal_offset); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_13 = PyNumber_Subtract(__pyx_t_4, __pyx_v_lenkey); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_13); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyNumber_Subtract(__pyx_t_13, __pyx_int_14); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; __pyx_v_stop = __pyx_t_4; __pyx_t_4 = 0; /* "mar345_IO.pyx":134 * ################################################################################ * stop = normal_offset-lenkey-14 * odata = numpy.fromstring(raw[stop-64*orecords: stop],dtype=numpy.int32) # <<<<<<<<<<<<<< * odata.shape = -1,2 * addresses = odata[:,0] */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_13 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__fromstring); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_13); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyInt_FromLong((64 * __pyx_v_orecords)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyNumber_Subtract(__pyx_v_stop, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_stop); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_3 = __Pyx_PySequence_GetSlice(__pyx_v_raw, __pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_3)); __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_14); __pyx_t_9 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__int32); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__dtype), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_4), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __pyx_v_odata = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":135 * stop = normal_offset-lenkey-14 * odata = numpy.fromstring(raw[stop-64*orecords: stop],dtype=numpy.int32) * odata.shape = -1,2 # <<<<<<<<<<<<<< * addresses = odata[:,0] * values = odata[:,1] */ if (PyObject_SetAttr(__pyx_v_odata, __pyx_n_s__shape, ((PyObject *)__pyx_k_tuple_14)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "mar345_IO.pyx":136 * odata = numpy.fromstring(raw[stop-64*orecords: stop],dtype=numpy.int32) * odata.shape = -1,2 * addresses = odata[:,0] # <<<<<<<<<<<<<< * values = odata[:,1] * valid = (addresses>0) */ __pyx_t_9 = PyObject_GetItem(__pyx_v_odata, ((PyObject *)__pyx_k_tuple_16)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_v_addresses = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":137 * odata.shape = -1,2 * addresses = odata[:,0] * values = odata[:,1] # <<<<<<<<<<<<<< * valid = (addresses>0) * addresses = addresses[valid]-1 #addresses start at 1 !! */ __pyx_t_9 = PyObject_GetItem(__pyx_v_odata, ((PyObject *)__pyx_k_tuple_18)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_v_values = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":138 * addresses = odata[:,0] * values = odata[:,1] * valid = (addresses>0) # <<<<<<<<<<<<<< * addresses = addresses[valid]-1 #addresses start at 1 !! * values = values[valid] */ __pyx_t_9 = PyObject_RichCompare(__pyx_v_addresses, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_valid = __pyx_t_9; __pyx_t_9 = 0; /* "mar345_IO.pyx":139 * values = odata[:,1] * valid = (addresses>0) * addresses = addresses[valid]-1 #addresses start at 1 !! # <<<<<<<<<<<<<< * values = values[valid] * flat[addresses] = values.astype(numpy.uint32) */ __pyx_t_9 = PyObject_GetItem(__pyx_v_addresses, __pyx_v_valid); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_3 = PyNumber_Subtract(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_v_addresses); __pyx_v_addresses = __pyx_t_3; __pyx_t_3 = 0; /* "mar345_IO.pyx":140 * valid = (addresses>0) * addresses = addresses[valid]-1 #addresses start at 1 !! * values = values[valid] # <<<<<<<<<<<<<< * flat[addresses] = values.astype(numpy.uint32) * return data */ __pyx_t_3 = PyObject_GetItem(__pyx_v_values, __pyx_v_valid); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_v_values); __pyx_v_values = __pyx_t_3; __pyx_t_3 = 0; /* "mar345_IO.pyx":141 * addresses = addresses[valid]-1 #addresses start at 1 !! * values = values[valid] * flat[addresses] = values.astype(numpy.uint32) # <<<<<<<<<<<<<< * return data */ __pyx_t_3 = PyObject_GetAttr(__pyx_v_values, __pyx_n_s__astype); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_4 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__uint32); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; if (PyObject_SetItem(((PyObject *)__pyx_v_flat), __pyx_v_addresses, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "mar345_IO.pyx":142 * values = values[valid] * flat[addresses] = values.astype(numpy.uint32) * return data # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_data)); __pyx_r = ((PyObject *)__pyx_v_data); goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_13); __Pyx_XDECREF(__pyx_t_14); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_flat.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_instream.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("mar345_IO.uncompress_pck", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_data.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_flat.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_instream.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_data); __Pyx_XDECREF((PyObject *)__pyx_v_flat); __Pyx_XDECREF((PyObject *)__pyx_v_instream); __Pyx_XDECREF(__pyx_v_end); __Pyx_XDECREF(__pyx_v_key1); __Pyx_XDECREF(__pyx_v_key2); __Pyx_XDECREF(__pyx_v_start); __Pyx_XDECREF(__pyx_v_key); __Pyx_XDECREF(__pyx_v_lenkey); __Pyx_XDECREF(__pyx_v_sizes); __Pyx_XDECREF(__pyx_v_hiLine); __Pyx_XDECREF(__pyx_v_word); __Pyx_XDECREF(__pyx_v_stop); __Pyx_XDECREF(__pyx_v_odata); __Pyx_XDECREF(__pyx_v_addresses); __Pyx_XDECREF(__pyx_v_values); __Pyx_XDECREF(__pyx_v_valid); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":194 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< * # This implementation of getbuffer is geared towards Cython * # requirements, and does not yet fullfill the PEP. */ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_v_copy_shape; int __pyx_v_i; int __pyx_v_ndim; int __pyx_v_endian_detector; int __pyx_v_little_endian; int __pyx_v_t; char *__pyx_v_f; PyArray_Descr *__pyx_v_descr = 0; int __pyx_v_offset; int __pyx_v_hasfields; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; PyObject *__pyx_t_8 = NULL; char *__pyx_t_9; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getbuffer__", 0); if (__pyx_v_info != NULL) { __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); } /* "numpy.pxd":200 * # of flags * * if info == NULL: return # <<<<<<<<<<<<<< * * cdef int copy_shape, i, ndim */ __pyx_t_1 = (__pyx_v_info == NULL); if (__pyx_t_1) { __pyx_r = 0; goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "numpy.pxd":203 * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * */ __pyx_v_endian_detector = 1; /* "numpy.pxd":204 * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * * ndim = PyArray_NDIM(self) */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":206 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< * * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); /* "numpy.pxd":208 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: */ __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_1) { /* "numpy.pxd":209 * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< * else: * copy_shape = 0 */ __pyx_v_copy_shape = 1; goto __pyx_L4; } /*else*/ { /* "numpy.pxd":211 * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) */ __pyx_v_copy_shape = 0; } __pyx_L4:; /* "numpy.pxd":213 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") */ __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS); if (__pyx_t_1) { /* "numpy.pxd":214 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not C contiguous") * */ __pyx_t_2 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS)); __pyx_t_3 = __pyx_t_2; } else { __pyx_t_3 = __pyx_t_1; } if (__pyx_t_3) { /* "numpy.pxd":215 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_20), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "numpy.pxd":217 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") */ __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS); if (__pyx_t_3) { /* "numpy.pxd":218 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not Fortran contiguous") * */ __pyx_t_1 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS)); __pyx_t_2 = __pyx_t_1; } else { __pyx_t_2 = __pyx_t_3; } if (__pyx_t_2) { /* "numpy.pxd":219 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "numpy.pxd":221 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< * info.ndim = ndim * if copy_shape: */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); /* "numpy.pxd":222 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< * if copy_shape: * # Allocate new buffer for strides and shape info. */ __pyx_v_info->ndim = __pyx_v_ndim; /* "numpy.pxd":223 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. */ if (__pyx_v_copy_shape) { /* "numpy.pxd":226 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< * info.shape = info.strides + ndim * for i in range(ndim): */ __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); /* "numpy.pxd":227 * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); /* "numpy.pxd":228 * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] */ __pyx_t_5 = __pyx_v_ndim; for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; /* "numpy.pxd":229 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< * info.shape[i] = PyArray_DIMS(self)[i] * else: */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); /* "numpy.pxd":230 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< * else: * info.strides = PyArray_STRIDES(self) */ (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } goto __pyx_L7; } /*else*/ { /* "numpy.pxd":232 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL */ __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); /* "numpy.pxd":233 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) */ __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); } __pyx_L7:; /* "numpy.pxd":234 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) */ __pyx_v_info->suboffsets = NULL; /* "numpy.pxd":235 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< * info.readonly = not PyArray_ISWRITEABLE(self) * */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); /* "numpy.pxd":236 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< * * cdef int t */ __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(__pyx_v_self)); /* "numpy.pxd":239 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< * cdef dtype descr = self.descr * cdef list stack */ __pyx_v_f = NULL; /* "numpy.pxd":240 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< * cdef list stack * cdef int offset */ __pyx_t_4 = ((PyObject *)__pyx_v_self->descr); __Pyx_INCREF(__pyx_t_4); __pyx_v_descr = ((PyArray_Descr *)__pyx_t_4); __pyx_t_4 = 0; /* "numpy.pxd":244 * cdef int offset * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< * * if not hasfields and not copy_shape: */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); /* "numpy.pxd":246 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None */ __pyx_t_2 = (!__pyx_v_hasfields); if (__pyx_t_2) { __pyx_t_3 = (!__pyx_v_copy_shape); __pyx_t_1 = __pyx_t_3; } else { __pyx_t_1 = __pyx_t_2; } if (__pyx_t_1) { /* "numpy.pxd":248 * if not hasfields and not copy_shape: * # do not call releasebuffer * info.obj = None # <<<<<<<<<<<<<< * else: * # need to call releasebuffer */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = Py_None; goto __pyx_L10; } /*else*/ { /* "numpy.pxd":251 * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< * * if not hasfields: */ __Pyx_INCREF(((PyObject *)__pyx_v_self)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); } __pyx_L10:; /* "numpy.pxd":253 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or */ __pyx_t_1 = (!__pyx_v_hasfields); if (__pyx_t_1) { /* "numpy.pxd":254 * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): */ __pyx_t_5 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_5; /* "numpy.pxd":255 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_1 = (__pyx_v_descr->byteorder == '>'); if (__pyx_t_1) { __pyx_t_2 = __pyx_v_little_endian; } else { __pyx_t_2 = __pyx_t_1; } if (!__pyx_t_2) { /* "numpy.pxd":256 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" */ __pyx_t_1 = (__pyx_v_descr->byteorder == '<'); if (__pyx_t_1) { __pyx_t_3 = (!__pyx_v_little_endian); __pyx_t_7 = __pyx_t_3; } else { __pyx_t_7 = __pyx_t_1; } __pyx_t_1 = __pyx_t_7; } else { __pyx_t_1 = __pyx_t_2; } if (__pyx_t_1) { /* "numpy.pxd":257 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L12; } __pyx_L12:; /* "numpy.pxd":258 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" */ __pyx_t_1 = (__pyx_v_t == NPY_BYTE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__b; goto __pyx_L13; } /* "numpy.pxd":259 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" */ __pyx_t_1 = (__pyx_v_t == NPY_UBYTE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__B; goto __pyx_L13; } /* "numpy.pxd":260 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" */ __pyx_t_1 = (__pyx_v_t == NPY_SHORT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__h; goto __pyx_L13; } /* "numpy.pxd":261 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" */ __pyx_t_1 = (__pyx_v_t == NPY_USHORT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__H; goto __pyx_L13; } /* "numpy.pxd":262 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" */ __pyx_t_1 = (__pyx_v_t == NPY_INT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__i; goto __pyx_L13; } /* "numpy.pxd":263 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" */ __pyx_t_1 = (__pyx_v_t == NPY_UINT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__I; goto __pyx_L13; } /* "numpy.pxd":264 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" */ __pyx_t_1 = (__pyx_v_t == NPY_LONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__l; goto __pyx_L13; } /* "numpy.pxd":265 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" */ __pyx_t_1 = (__pyx_v_t == NPY_ULONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__L; goto __pyx_L13; } /* "numpy.pxd":266 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" */ __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__q; goto __pyx_L13; } /* "numpy.pxd":267 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" */ __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Q; goto __pyx_L13; } /* "numpy.pxd":268 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" */ __pyx_t_1 = (__pyx_v_t == NPY_FLOAT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__f; goto __pyx_L13; } /* "numpy.pxd":269 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" */ __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__d; goto __pyx_L13; } /* "numpy.pxd":270 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" */ __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__g; goto __pyx_L13; } /* "numpy.pxd":271 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" */ __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zf; goto __pyx_L13; } /* "numpy.pxd":272 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" */ __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zd; goto __pyx_L13; } /* "numpy.pxd":273 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f = "O" * else: */ __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zg; goto __pyx_L13; } /* "numpy.pxd":274 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_1 = (__pyx_v_t == NPY_OBJECT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__O; goto __pyx_L13; } /*else*/ { /* "numpy.pxd":276 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * info.format = f * return */ __pyx_t_4 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_25), __pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_8)); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_8)); __Pyx_GIVEREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L13:; /* "numpy.pxd":277 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< * return * else: */ __pyx_v_info->format = __pyx_v_f; /* "numpy.pxd":278 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< * else: * info.format = stdlib.malloc(_buffer_format_string_len) */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L11; } /*else*/ { /* "numpy.pxd":280 * return * else: * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 */ __pyx_v_info->format = ((char *)malloc(255)); /* "numpy.pxd":281 * else: * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< * offset = 0 * f = _util_dtypestring(descr, info.format + 1, */ (__pyx_v_info->format[0]) = '^'; /* "numpy.pxd":282 * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, */ __pyx_v_offset = 0; /* "numpy.pxd":285 * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, * &offset) # <<<<<<<<<<<<<< * f[0] = c'\0' # Terminate format string * */ __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_9; /* "numpy.pxd":286 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< * * def __releasebuffer__(ndarray self, Py_buffer* info): */ (__pyx_v_f[0]) = '\x00'; } __pyx_L11:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) { __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; } goto __pyx_L2; __pyx_L0:; if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) { __Pyx_GOTREF(Py_None); __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; } __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_descr); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":288 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) */ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); /* "numpy.pxd":289 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_t_1 = PyArray_HASFIELDS(__pyx_v_self); if (__pyx_t_1) { /* "numpy.pxd":290 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * stdlib.free(info.format) # <<<<<<<<<<<<<< * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) */ free(__pyx_v_info->format); goto __pyx_L3; } __pyx_L3:; /* "numpy.pxd":291 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * stdlib.free(info.strides) * # info.shape was stored after info.strides in the same block */ __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_1) { /* "numpy.pxd":292 * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< * # info.shape was stored after info.strides in the same block * */ free(__pyx_v_info->strides); goto __pyx_L4; } __pyx_L4:; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":768 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); /* "numpy.pxd":769 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":771 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); /* "numpy.pxd":772 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":774 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); /* "numpy.pxd":775 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":777 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); /* "numpy.pxd":778 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":780 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); /* "numpy.pxd":781 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":783 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. */ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { PyArray_Descr *__pyx_v_child = 0; int __pyx_v_endian_detector; int __pyx_v_little_endian; PyObject *__pyx_v_fields = 0; PyObject *__pyx_v_childname = NULL; PyObject *__pyx_v_new_offset = NULL; PyObject *__pyx_v_t = NULL; char *__pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *(*__pyx_t_6)(PyObject *); int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; int __pyx_t_10; long __pyx_t_11; char *__pyx_t_12; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_util_dtypestring", 0); /* "numpy.pxd":790 * cdef int delta_offset * cdef tuple i * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * cdef tuple fields */ __pyx_v_endian_detector = 1; /* "numpy.pxd":791 * cdef tuple i * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * cdef tuple fields * */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":794 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields */ if (unlikely(((PyObject *)__pyx_v_descr->names) == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_1 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __Pyx_XDECREF(__pyx_v_childname); __pyx_v_childname = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":795 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< * child, new_offset = fields * */ __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF(((PyObject *)__pyx_v_fields)); __pyx_v_fields = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "numpy.pxd":796 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< * * if (end - f) - (new_offset - offset[0]) < 15: */ if (likely(PyTuple_CheckExact(((PyObject *)__pyx_v_fields)))) { PyObject* sequence = ((PyObject *)__pyx_v_fields); #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); #endif } else if (1) { __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else { Py_ssize_t index = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_fields)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext; index = 0; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_3); index = 1; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = NULL; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; goto __pyx_L6_unpacking_done; __pyx_L5_unpacking_failed:; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L6_unpacking_done:; } if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF(((PyObject *)__pyx_v_child)); __pyx_v_child = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_v_new_offset); __pyx_v_new_offset = __pyx_t_4; __pyx_t_4 = 0; /* "numpy.pxd":798 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * */ __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { /* "numpy.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_27), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; /* "numpy.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_7 = (__pyx_v_child->byteorder == '>'); if (__pyx_t_7) { __pyx_t_8 = __pyx_v_little_endian; } else { __pyx_t_8 = __pyx_t_7; } if (!__pyx_t_8) { /* "numpy.pxd":802 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * # One could encode it in the format string and have Cython */ __pyx_t_7 = (__pyx_v_child->byteorder == '<'); if (__pyx_t_7) { __pyx_t_9 = (!__pyx_v_little_endian); __pyx_t_10 = __pyx_t_9; } else { __pyx_t_10 = __pyx_t_7; } __pyx_t_7 = __pyx_t_10; } else { __pyx_t_7 = __pyx_t_8; } if (__pyx_t_7) { /* "numpy.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_28), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L8; } __pyx_L8:; /* "numpy.pxd":813 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< * f[0] = 120 # "x"; pad byte * f += 1 */ while (1) { __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!__pyx_t_7) break; /* "numpy.pxd":814 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< * f += 1 * offset[0] += 1 */ (__pyx_v_f[0]) = 120; /* "numpy.pxd":815 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< * offset[0] += 1 * */ __pyx_v_f = (__pyx_v_f + 1); /* "numpy.pxd":816 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< * * offset[0] += child.itemsize */ __pyx_t_11 = 0; (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + 1); } /* "numpy.pxd":818 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< * * if not PyDataType_HASFIELDS(child): */ __pyx_t_11 = 0; (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + __pyx_v_child->elsize); /* "numpy.pxd":820 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: */ __pyx_t_7 = (!PyDataType_HASFIELDS(__pyx_v_child)); if (__pyx_t_7) { /* "numpy.pxd":821 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") */ __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_XDECREF(__pyx_v_t); __pyx_v_t = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":822 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") * */ __pyx_t_7 = ((__pyx_v_end - __pyx_v_f) < 5); if (__pyx_t_7) { /* "numpy.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_30), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L12; } __pyx_L12:; /* "numpy.pxd":826 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" */ __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 98; goto __pyx_L13; } /* "numpy.pxd":827 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" */ __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 66; goto __pyx_L13; } /* "numpy.pxd":828 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" */ __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 104; goto __pyx_L13; } /* "numpy.pxd":829 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" */ __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 72; goto __pyx_L13; } /* "numpy.pxd":830 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" */ __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 105; goto __pyx_L13; } /* "numpy.pxd":831 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" */ __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 73; goto __pyx_L13; } /* "numpy.pxd":832 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" */ __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 108; goto __pyx_L13; } /* "numpy.pxd":833 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 76; goto __pyx_L13; } /* "numpy.pxd":834 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" */ __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 113; goto __pyx_L13; } /* "numpy.pxd":835 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 81; goto __pyx_L13; } /* "numpy.pxd":836 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" */ __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 102; goto __pyx_L13; } /* "numpy.pxd":837 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf */ __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 100; goto __pyx_L13; } /* "numpy.pxd":838 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd */ __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 103; goto __pyx_L13; } /* "numpy.pxd":839 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg */ __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 102; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L13; } /* "numpy.pxd":840 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" */ __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 100; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L13; } /* "numpy.pxd":841 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: */ __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 103; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L13; } /* "numpy.pxd":842 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 79; goto __pyx_L13; } /*else*/ { /* "numpy.pxd":844 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * f += 1 * else: */ __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_25), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_5)); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5)); __Pyx_GIVEREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L13:; /* "numpy.pxd":845 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< * else: * # Cython ignores struct boundary information ("T{...}"), */ __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /*else*/ { /* "numpy.pxd":849 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< * return f * */ __pyx_t_12 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_12 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_12; } __pyx_L11:; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":850 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_v_f; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_child); __Pyx_XDECREF(__pyx_v_fields); __Pyx_XDECREF(__pyx_v_childname); __Pyx_XDECREF(__pyx_v_new_offset); __Pyx_XDECREF(__pyx_v_t); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":965 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: */ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { PyObject *__pyx_v_baseptr; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("set_array_base", 0); /* "numpy.pxd":967 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< * baseptr = NULL * else: */ __pyx_t_1 = (__pyx_v_base == Py_None); if (__pyx_t_1) { /* "numpy.pxd":968 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< * else: * Py_INCREF(base) # important to do this before decref below! */ __pyx_v_baseptr = NULL; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":970 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< * baseptr = base * Py_XDECREF(arr.base) */ Py_INCREF(__pyx_v_base); /* "numpy.pxd":971 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< * Py_XDECREF(arr.base) * arr.base = baseptr */ __pyx_v_baseptr = ((PyObject *)__pyx_v_base); } __pyx_L3:; /* "numpy.pxd":972 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< * arr.base = baseptr * */ Py_XDECREF(__pyx_v_arr->base); /* "numpy.pxd":973 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< * * cdef inline object get_array_base(ndarray arr): */ __pyx_v_arr->base = __pyx_v_baseptr; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":975 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); /* "numpy.pxd":976 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None * else: */ __pyx_t_1 = (__pyx_v_arr->base == NULL); if (__pyx_t_1) { /* "numpy.pxd":977 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< * else: * return arr.base */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(Py_None); __pyx_r = Py_None; goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":979 * return None * else: * return arr.base # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); __pyx_r = ((PyObject *)__pyx_v_arr->base); goto __pyx_L0; } __pyx_L3:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { #if PY_VERSION_HEX < 0x03020000 { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, #else PyModuleDef_HEAD_INIT, #endif __Pyx_NAMESTR("mar345_IO"), __Pyx_DOCSTR(__pyx_k_31), /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0}, {&__pyx_kp_s_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 0, 1, 0}, {&__pyx_kp_s_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 0, 1, 0}, {&__pyx_kp_u_19, __pyx_k_19, sizeof(__pyx_k_19), 0, 1, 0, 0}, {&__pyx_kp_u_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 1, 0, 0}, {&__pyx_kp_u_23, __pyx_k_23, sizeof(__pyx_k_23), 0, 1, 0, 0}, {&__pyx_kp_u_25, __pyx_k_25, sizeof(__pyx_k_25), 0, 1, 0, 0}, {&__pyx_kp_u_26, __pyx_k_26, sizeof(__pyx_k_26), 0, 1, 0, 0}, {&__pyx_kp_u_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 1, 0, 0}, {&__pyx_kp_s_32, __pyx_k_32, sizeof(__pyx_k_32), 0, 0, 1, 0}, {&__pyx_kp_s_33, __pyx_k_33, sizeof(__pyx_k_33), 0, 0, 1, 0}, {&__pyx_kp_s_34, __pyx_k_34, sizeof(__pyx_k_34), 0, 0, 1, 0}, {&__pyx_kp_s_35, __pyx_k_35, sizeof(__pyx_k_35), 0, 0, 1, 0}, {&__pyx_kp_s_36, __pyx_k_36, sizeof(__pyx_k_36), 0, 0, 1, 0}, {&__pyx_kp_s_39, __pyx_k_39, sizeof(__pyx_k_39), 0, 0, 1, 0}, {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0}, {&__pyx_kp_s_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 0, 1, 0}, {&__pyx_kp_s_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 0, 1, 0}, {&__pyx_kp_s_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 0, 1, 0}, {&__pyx_n_s__HIGH, __pyx_k__HIGH, sizeof(__pyx_k__HIGH), 0, 0, 1, 1}, {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1}, {&__pyx_n_s____authors__, __pyx_k____authors__, sizeof(__pyx_k____authors__), 0, 0, 1, 1}, {&__pyx_n_s____contact__, __pyx_k____contact__, sizeof(__pyx_k____contact__), 0, 0, 1, 1}, {&__pyx_n_s____copyright__, __pyx_k____copyright__, sizeof(__pyx_k____copyright__), 0, 0, 1, 1}, {&__pyx_n_s____enter__, __pyx_k____enter__, sizeof(__pyx_k____enter__), 0, 0, 1, 1}, {&__pyx_n_s____exit__, __pyx_k____exit__, sizeof(__pyx_k____exit__), 0, 0, 1, 1}, {&__pyx_n_s____license__, __pyx_k____license__, sizeof(__pyx_k____license__), 0, 0, 1, 1}, {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, {&__pyx_n_s__addresses, __pyx_k__addresses, sizeof(__pyx_k__addresses), 0, 0, 1, 1}, {&__pyx_n_s__ascontiguousarray, __pyx_k__ascontiguousarray, sizeof(__pyx_k__ascontiguousarray), 0, 0, 1, 1}, {&__pyx_n_s__astype, __pyx_k__astype, sizeof(__pyx_k__astype), 0, 0, 1, 1}, {&__pyx_n_s__cdata, __pyx_k__cdata, sizeof(__pyx_k__cdata), 0, 0, 1, 1}, {&__pyx_n_s__cdimx, __pyx_k__cdimx, sizeof(__pyx_k__cdimx), 0, 0, 1, 1}, {&__pyx_n_s__cdimy, __pyx_k__cdimy, sizeof(__pyx_k__cdimy), 0, 0, 1, 1}, {&__pyx_n_s__chigh, __pyx_k__chigh, sizeof(__pyx_k__chigh), 0, 0, 1, 1}, {&__pyx_n_s__close, __pyx_k__close, sizeof(__pyx_k__close), 0, 0, 1, 1}, {&__pyx_n_s__compress_pck, __pyx_k__compress_pck, sizeof(__pyx_k__compress_pck), 0, 0, 1, 1}, {&__pyx_n_s__cversion, __pyx_k__cversion, sizeof(__pyx_k__cversion), 0, 0, 1, 1}, {&__pyx_n_s__data, __pyx_k__data, sizeof(__pyx_k__data), 0, 0, 1, 1}, {&__pyx_n_s__dim0, __pyx_k__dim0, sizeof(__pyx_k__dim0), 0, 0, 1, 1}, {&__pyx_n_s__dim1, __pyx_k__dim1, sizeof(__pyx_k__dim1), 0, 0, 1, 1}, {&__pyx_n_s__dim2, __pyx_k__dim2, sizeof(__pyx_k__dim2), 0, 0, 1, 1}, {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1}, {&__pyx_n_s__empty, __pyx_k__empty, sizeof(__pyx_k__empty), 0, 0, 1, 1}, {&__pyx_n_s__end, __pyx_k__end, sizeof(__pyx_k__end), 0, 0, 1, 1}, {&__pyx_n_s__f, __pyx_k__f, sizeof(__pyx_k__f), 0, 0, 1, 1}, {&__pyx_n_s__fd, __pyx_k__fd, sizeof(__pyx_k__fd), 0, 0, 1, 1}, {&__pyx_n_s__find, __pyx_k__find, sizeof(__pyx_k__find), 0, 0, 1, 1}, {&__pyx_n_s__flat, __pyx_k__flat, sizeof(__pyx_k__flat), 0, 0, 1, 1}, {&__pyx_n_s__fname, __pyx_k__fname, sizeof(__pyx_k__fname), 0, 0, 1, 1}, {&__pyx_n_s__fromstring, __pyx_k__fromstring, sizeof(__pyx_k__fromstring), 0, 0, 1, 1}, {&__pyx_n_s__hiLine, __pyx_k__hiLine, sizeof(__pyx_k__hiLine), 0, 0, 1, 1}, {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1}, {&__pyx_n_s__index, __pyx_k__index, sizeof(__pyx_k__index), 0, 0, 1, 1}, {&__pyx_n_s__inputArray, __pyx_k__inputArray, sizeof(__pyx_k__inputArray), 0, 0, 1, 1}, {&__pyx_n_s__instream, __pyx_k__instream, sizeof(__pyx_k__instream), 0, 0, 1, 1}, {&__pyx_n_s__int32, __pyx_k__int32, sizeof(__pyx_k__int32), 0, 0, 1, 1}, {&__pyx_n_s__j, __pyx_k__j, sizeof(__pyx_k__j), 0, 0, 1, 1}, {&__pyx_n_s__key, __pyx_k__key, sizeof(__pyx_k__key), 0, 0, 1, 1}, {&__pyx_n_s__key1, __pyx_k__key1, sizeof(__pyx_k__key1), 0, 0, 1, 1}, {&__pyx_n_s__key2, __pyx_k__key2, sizeof(__pyx_k__key2), 0, 0, 1, 1}, {&__pyx_n_s__lenkey, __pyx_k__lenkey, sizeof(__pyx_k__lenkey), 0, 0, 1, 1}, {&__pyx_n_s__lstrip, __pyx_k__lstrip, sizeof(__pyx_k__lstrip), 0, 0, 1, 1}, {&__pyx_n_s__mar345_IO, __pyx_k__mar345_IO, sizeof(__pyx_k__mar345_IO), 0, 0, 1, 1}, {&__pyx_n_s__mkstemp, __pyx_k__mkstemp, sizeof(__pyx_k__mkstemp), 0, 0, 1, 1}, {&__pyx_n_s__name, __pyx_k__name, sizeof(__pyx_k__name), 0, 0, 1, 1}, {&__pyx_n_s__normal_offset, __pyx_k__normal_offset, sizeof(__pyx_k__normal_offset), 0, 0, 1, 1}, {&__pyx_n_s__normal_start, __pyx_k__normal_start, sizeof(__pyx_k__normal_start), 0, 0, 1, 1}, {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1}, {&__pyx_n_s__odata, __pyx_k__odata, sizeof(__pyx_k__odata), 0, 0, 1, 1}, {&__pyx_n_s__open, __pyx_k__open, sizeof(__pyx_k__open), 0, 0, 1, 1}, {&__pyx_n_s__orecords, __pyx_k__orecords, sizeof(__pyx_k__orecords), 0, 0, 1, 1}, {&__pyx_n_s__os, __pyx_k__os, sizeof(__pyx_k__os), 0, 0, 1, 1}, {&__pyx_n_s__out, __pyx_k__out, sizeof(__pyx_k__out), 0, 0, 1, 1}, {&__pyx_n_s__output, __pyx_k__output, sizeof(__pyx_k__output), 0, 0, 1, 1}, {&__pyx_n_s__overflowPix, __pyx_k__overflowPix, sizeof(__pyx_k__overflowPix), 0, 0, 1, 1}, {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1}, {&__pyx_n_s__ravel, __pyx_k__ravel, sizeof(__pyx_k__ravel), 0, 0, 1, 1}, {&__pyx_n_s__raw, __pyx_k__raw, sizeof(__pyx_k__raw), 0, 0, 1, 1}, {&__pyx_n_s__rb, __pyx_k__rb, sizeof(__pyx_k__rb), 0, 0, 1, 1}, {&__pyx_n_s__read, __pyx_k__read, sizeof(__pyx_k__read), 0, 0, 1, 1}, {&__pyx_n_s__remove, __pyx_k__remove, sizeof(__pyx_k__remove), 0, 0, 1, 1}, {&__pyx_n_s__ret, __pyx_k__ret, sizeof(__pyx_k__ret), 0, 0, 1, 1}, {&__pyx_n_s__seek, __pyx_k__seek, sizeof(__pyx_k__seek), 0, 0, 1, 1}, {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1}, {&__pyx_n_s__size, __pyx_k__size, sizeof(__pyx_k__size), 0, 0, 1, 1}, {&__pyx_n_s__sizes, __pyx_k__sizes, sizeof(__pyx_k__sizes), 0, 0, 1, 1}, {&__pyx_n_s__split, __pyx_k__split, sizeof(__pyx_k__split), 0, 0, 1, 1}, {&__pyx_n_s__start, __pyx_k__start, sizeof(__pyx_k__start), 0, 0, 1, 1}, {&__pyx_n_s__stop, __pyx_k__stop, sizeof(__pyx_k__stop), 0, 0, 1, 1}, {&__pyx_n_s__strip, __pyx_k__strip, sizeof(__pyx_k__strip), 0, 0, 1, 1}, {&__pyx_n_s__tempfile, __pyx_k__tempfile, sizeof(__pyx_k__tempfile), 0, 0, 1, 1}, {&__pyx_n_s__uint16, __pyx_k__uint16, sizeof(__pyx_k__uint16), 0, 0, 1, 1}, {&__pyx_n_s__uint32, __pyx_k__uint32, sizeof(__pyx_k__uint32), 0, 0, 1, 1}, {&__pyx_n_s__uint8, __pyx_k__uint8, sizeof(__pyx_k__uint8), 0, 0, 1, 1}, {&__pyx_n_s__uncompress_pck, __pyx_k__uncompress_pck, sizeof(__pyx_k__uncompress_pck), 0, 0, 1, 1}, {&__pyx_n_s__valid, __pyx_k__valid, sizeof(__pyx_k__valid), 0, 0, 1, 1}, {&__pyx_n_s__values, __pyx_k__values, sizeof(__pyx_k__values), 0, 0, 1, 1}, {&__pyx_n_s__version, __pyx_k__version, sizeof(__pyx_k__version), 0, 0, 1, 1}, {&__pyx_n_s__word, __pyx_k__word, sizeof(__pyx_k__word), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_open = __Pyx_GetName(__pyx_b, __pyx_n_s__open); if (!__pyx_builtin_open) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "mar345_IO.pyx":52 * pack_wordimage_c(cdata, dim1, dim0, name) * with open(name,"rb") as f: * f.seek(0) # <<<<<<<<<<<<<< * output = f.read() * os.close(fd) */ __pyx_k_tuple_2 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_k_tuple_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_2); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_2)); /* "mar345_IO.pyx":51 * with nogil: * pack_wordimage_c(cdata, dim1, dim0, name) * with open(name,"rb") as f: # <<<<<<<<<<<<<< * f.seek(0) * output = f.read() */ __pyx_k_tuple_3 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_k_tuple_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_3); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_3)); /* "mar345_IO.pyx":103 * lenkey = len(key2) * if cversion not in [1,2]: * raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") # <<<<<<<<<<<<<< * if (overflowPix is None): * end = raw.find("END OF HEADER") */ __pyx_k_tuple_7 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_6)); if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_7); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_7)); /* "mar345_IO.pyx":105 * raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") * if (overflowPix is None): * end = raw.find("END OF HEADER") # <<<<<<<<<<<<<< * start = raw[:end].find("HIGH") * hiLine = raw[start:end] */ __pyx_k_tuple_9 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_8)); if (unlikely(!__pyx_k_tuple_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_9); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_9)); /* "mar345_IO.pyx":106 * if (overflowPix is None): * end = raw.find("END OF HEADER") * start = raw[:end].find("HIGH") # <<<<<<<<<<<<<< * hiLine = raw[start:end] * hiLine = hiLine.split("\n")[0] */ __pyx_k_tuple_10 = PyTuple_Pack(1, ((PyObject *)__pyx_n_s__HIGH)); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_10); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10)); /* "mar345_IO.pyx":108 * start = raw[:end].find("HIGH") * hiLine = raw[start:end] * hiLine = hiLine.split("\n")[0] # <<<<<<<<<<<<<< * word = hiLine.split() * if len(word) > 1: */ __pyx_k_tuple_12 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_11)); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_12); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12)); /* "mar345_IO.pyx":135 * stop = normal_offset-lenkey-14 * odata = numpy.fromstring(raw[stop-64*orecords: stop],dtype=numpy.int32) * odata.shape = -1,2 # <<<<<<<<<<<<<< * addresses = odata[:,0] * values = odata[:,1] */ __pyx_k_tuple_14 = PyTuple_Pack(2, __pyx_int_neg_1, __pyx_int_2); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_14); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14)); /* "mar345_IO.pyx":136 * odata = numpy.fromstring(raw[stop-64*orecords: stop],dtype=numpy.int32) * odata.shape = -1,2 * addresses = odata[:,0] # <<<<<<<<<<<<<< * values = odata[:,1] * valid = (addresses>0) */ __pyx_k_slice_15 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_k_slice_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_slice_15); __Pyx_GIVEREF(__pyx_k_slice_15); __pyx_k_tuple_16 = PyTuple_Pack(2, __pyx_k_slice_15, __pyx_int_0); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_16); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16)); /* "mar345_IO.pyx":137 * odata.shape = -1,2 * addresses = odata[:,0] * values = odata[:,1] # <<<<<<<<<<<<<< * valid = (addresses>0) * addresses = addresses[valid]-1 #addresses start at 1 !! */ __pyx_k_slice_17 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_k_slice_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_slice_17); __Pyx_GIVEREF(__pyx_k_slice_17); __pyx_k_tuple_18 = PyTuple_Pack(2, __pyx_k_slice_17, __pyx_int_1); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_18); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18)); /* "numpy.pxd":215 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_k_tuple_20 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_u_19)); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_20); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20)); /* "numpy.pxd":219 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_k_tuple_22 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_u_21)); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_22); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22)); /* "numpy.pxd":257 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_k_tuple_24 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_u_23)); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_24); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24)); /* "numpy.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_k_tuple_27 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_u_26)); if (unlikely(!__pyx_k_tuple_27)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_27); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_27)); /* "numpy.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_k_tuple_28 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_u_23)); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_28); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_28)); /* "numpy.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_k_tuple_30 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_u_29)); if (unlikely(!__pyx_k_tuple_30)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_30); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_30)); /* "mar345_IO.pyx":33 * * @cython.boundscheck(False) * def compress_pck(numpy.ndarray inputArray not None): # <<<<<<<<<<<<<< * """ * @param inputArray: numpy array as input */ __pyx_k_tuple_37 = PyTuple_Pack(14, ((PyObject *)__pyx_n_s__inputArray), ((PyObject *)__pyx_n_s__size), ((PyObject *)__pyx_n_s__dim0), ((PyObject *)__pyx_n_s__dim1), ((PyObject *)__pyx_n_s__i), ((PyObject *)__pyx_n_s__j), ((PyObject *)__pyx_n_s__fd), ((PyObject *)__pyx_n_s__ret), ((PyObject *)__pyx_n_s__name), ((PyObject *)__pyx_n_s__data), ((PyObject *)__pyx_n_s__cdata), ((PyObject *)__pyx_n_s__fname), ((PyObject *)__pyx_n_s__f), ((PyObject *)__pyx_n_s__output)); if (unlikely(!__pyx_k_tuple_37)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_37); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_37)); __pyx_k_codeobj_38 = (PyObject*)__Pyx_PyCode_New(1, 0, 14, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_39, __pyx_n_s__compress_pck, 33, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_38)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "mar345_IO.pyx":59 * * @cython.boundscheck(False) * def uncompress_pck(raw not None, dim1=None, dim2=None, overflowPix=None, version=None, normal_start=None): # <<<<<<<<<<<<<< * """ * Unpack a mar345 compressed image */ __pyx_k_tuple_40 = PyTuple_Pack(30, ((PyObject *)__pyx_n_s__raw), ((PyObject *)__pyx_n_s__dim1), ((PyObject *)__pyx_n_s__dim2), ((PyObject *)__pyx_n_s__overflowPix), ((PyObject *)__pyx_n_s__version), ((PyObject *)__pyx_n_s__normal_start), ((PyObject *)__pyx_n_s__cdimx), ((PyObject *)__pyx_n_s__cdimy), ((PyObject *)__pyx_n_s__chigh), ((PyObject *)__pyx_n_s__cversion), ((PyObject *)__pyx_n_s__orecords), ((PyObject *)__pyx_n_s__normal_offset), ((PyObject *)__pyx_n_s__data), ((PyObject *)__pyx_n_s__flat), ((PyObject *)__pyx_n_s__instream), ((PyObject *)__pyx_n_s__out), ((PyObject *)__pyx_n_s__end), ((PyObject *)__pyx_n_s__key1), ((PyObject *)__pyx_n_s__key2), ((PyObject *)__pyx_n_s__start), ((PyObject *)__pyx_n_s__key), ((PyObject *)__pyx_n_s__lenkey), ((PyObject *)__pyx_n_s__sizes), ((PyObject *)__pyx_n_s__hiLine), ((PyObject *)__pyx_n_s__word), ((PyObject *)__pyx_n_s__stop), ((PyObject *)__pyx_n_s__odata), ((PyObject *)__pyx_n_s__addresses), ((PyObject *)__pyx_n_s__values), ((PyObject *)__pyx_n_s__valid)); if (unlikely(!__pyx_k_tuple_40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_40); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_40)); __pyx_k_codeobj_41 = (PyObject*)__Pyx_PyCode_New(6, 0, 30, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_39, __pyx_n_s__uncompress_pck, 59, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_41)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_13 = PyInt_FromLong(13); if (unlikely(!__pyx_int_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_14 = PyInt_FromLong(14); if (unlikely(!__pyx_int_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC initmar345_IO(void); /*proto*/ PyMODINIT_FUNC initmar345_IO(void) #else PyMODINIT_FUNC PyInit_mar345_IO(void); /*proto*/ PyMODINIT_FUNC PyInit_mar345_IO(void) #endif { PyObject *__pyx_t_1 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_mar345_IO(void)", 0); if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("mar345_IO"), __pyx_methods, __Pyx_DOCSTR(__pyx_k_31), 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (!PyDict_GetItemString(modules, "mar345_IO")) { if (unlikely(PyDict_SetItemString(modules, "mar345_IO", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_module_is_main_mar345_IO) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ /*--- Type import code ---*/ __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", #if CYTHON_COMPILING_IN_PYPY sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ /* "mar345_IO.pyx":13 * """ * * __authors__ = ["Jerome Kieffer", "Gael Goret"] # <<<<<<<<<<<<<< * __contact__ = "jerome.kieffer@esrf.eu" * __license__ = "LGPLv3+" */ __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_kp_s_32)); PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_32)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_32)); __Pyx_INCREF(((PyObject *)__pyx_kp_s_33)); PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_kp_s_33)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_33)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____authors__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; /* "mar345_IO.pyx":14 * * __authors__ = ["Jerome Kieffer", "Gael Goret"] * __contact__ = "jerome.kieffer@esrf.eu" # <<<<<<<<<<<<<< * __license__ = "LGPLv3+" * __copyright__ = "2012, European Synchrotron Radiation Facility, Grenoble, France" */ if (PyObject_SetAttr(__pyx_m, __pyx_n_s____contact__, ((PyObject *)__pyx_kp_s_34)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "mar345_IO.pyx":15 * __authors__ = ["Jerome Kieffer", "Gael Goret"] * __contact__ = "jerome.kieffer@esrf.eu" * __license__ = "LGPLv3+" # <<<<<<<<<<<<<< * __copyright__ = "2012, European Synchrotron Radiation Facility, Grenoble, France" * */ if (PyObject_SetAttr(__pyx_m, __pyx_n_s____license__, ((PyObject *)__pyx_kp_s_35)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "mar345_IO.pyx":16 * __contact__ = "jerome.kieffer@esrf.eu" * __license__ = "LGPLv3+" * __copyright__ = "2012, European Synchrotron Radiation Facility, Grenoble, France" # <<<<<<<<<<<<<< * * import cython */ if (PyObject_SetAttr(__pyx_m, __pyx_n_s____copyright__, ((PyObject *)__pyx_kp_s_36)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "mar345_IO.pyx":20 * import cython * cimport numpy * import numpy # <<<<<<<<<<<<<< * import os,tempfile * from libc.string cimport memcpy */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__numpy, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "mar345_IO.pyx":21 * cimport numpy * import numpy * import os,tempfile # <<<<<<<<<<<<<< * from libc.string cimport memcpy * #from libc.stdlib cimport free, malloc */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__os), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__os, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__tempfile), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__tempfile, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "mar345_IO.pyx":33 * * @cython.boundscheck(False) * def compress_pck(numpy.ndarray inputArray not None): # <<<<<<<<<<<<<< * """ * @param inputArray: numpy array as input */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9mar345_IO_1compress_pck, NULL, __pyx_n_s__mar345_IO); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__compress_pck, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "mar345_IO.pyx":59 * * @cython.boundscheck(False) * def uncompress_pck(raw not None, dim1=None, dim2=None, overflowPix=None, version=None, normal_start=None): # <<<<<<<<<<<<<< * """ * Unpack a mar345 compressed image */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9mar345_IO_3uncompress_pck, NULL, __pyx_n_s__mar345_IO); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__uncompress_pck, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "mar345_IO.pyx":1 * """ # <<<<<<<<<<<<<< * New Cython version of mar345_io for preparing the migration to Python3 * */ __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; /* "numpy.pxd":975 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { __Pyx_AddTraceback("init mar345_IO", __pyx_clineno, __pyx_lineno, __pyx_filename); Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init mar345_IO"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* CYTHON_REFNANNY */ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) { if (dict != __pyx_b) { PyErr_Clear(); result = PyObject_GetAttr(__pyx_b, name); } if (!result) { PyErr_SetObject(PyExc_NameError, name); } } return result; } static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (!type) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (Py_TYPE(obj) == type) return 1; } else { if (PyObject_TypeCheck(obj, type)) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%s' has incorrect type (expected %s, got %s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (likely(PyObject_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { unsigned int n = 1; return *(unsigned char*)(&n) != 0; } static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, __Pyx_BufFmt_StackElem* stack, __Pyx_TypeInfo* type) { stack[0].field = &ctx->root; stack[0].parent_offset = 0; ctx->root.type = type; ctx->root.name = "buffer dtype"; ctx->root.offset = 0; ctx->head = stack; ctx->head->field = &ctx->root; ctx->fmt_offset = 0; ctx->head->parent_offset = 0; ctx->new_packmode = '@'; ctx->enc_packmode = '@'; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->is_complex = 0; ctx->is_valid_array = 0; ctx->struct_alignment = 0; while (type->typegroup == 'S') { ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = 0; type = type->fields->type; } } static int __Pyx_BufFmt_ParseNumber(const char** ts) { int count; const char* t = *ts; if (*t < '0' || *t > '9') { return -1; } else { count = *t++ - '0'; while (*t >= '0' && *t < '9') { count *= 10; count += *t++ - '0'; } } *ts = t; return count; } static int __Pyx_BufFmt_ExpectNumber(const char **ts) { int number = __Pyx_BufFmt_ParseNumber(ts); if (number == -1) /* First char was not a digit */ PyErr_Format(PyExc_ValueError,\ "Does not understand character buffer dtype format string ('%c')", **ts); return number; } static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { PyErr_Format(PyExc_ValueError, "Unexpected format string character: '%c'", ch); } static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { switch (ch) { case 'c': return "'char'"; case 'b': return "'signed char'"; case 'B': return "'unsigned char'"; case 'h': return "'short'"; case 'H': return "'unsigned short'"; case 'i': return "'int'"; case 'I': return "'unsigned int'"; case 'l': return "'long'"; case 'L': return "'unsigned long'"; case 'q': return "'long long'"; case 'Q': return "'unsigned long long'"; case 'f': return (is_complex ? "'complex float'" : "'float'"); case 'd': return (is_complex ? "'complex double'" : "'double'"); case 'g': return (is_complex ? "'complex long double'" : "'long double'"); case 'T': return "a struct"; case 'O': return "Python object"; case 'P': return "a pointer"; case 's': case 'p': return "a string"; case 0: return "end"; default: return "unparseable format string"; } } static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return 2; case 'i': case 'I': case 'l': case 'L': return 4; case 'q': case 'Q': return 8; case 'f': return (is_complex ? 8 : 4); case 'd': return (is_complex ? 16 : 8); case 'g': { PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); return 0; } case 'O': case 'P': return sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { switch (ch) { case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(short); case 'i': case 'I': return sizeof(int); case 'l': case 'L': return sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(float) * (is_complex ? 2 : 1); case 'd': return sizeof(double) * (is_complex ? 2 : 1); case 'g': return sizeof(long double) * (is_complex ? 2 : 1); case 'O': case 'P': return sizeof(void*); default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } typedef struct { char c; short x; } __Pyx_st_short; typedef struct { char c; int x; } __Pyx_st_int; typedef struct { char c; long x; } __Pyx_st_long; typedef struct { char c; float x; } __Pyx_st_float; typedef struct { char c; double x; } __Pyx_st_double; typedef struct { char c; long double x; } __Pyx_st_longdouble; typedef struct { char c; void *x; } __Pyx_st_void_p; #ifdef HAVE_LONG_LONG typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_st_float) - sizeof(float); case 'd': return sizeof(__Pyx_st_double) - sizeof(double); case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } /* These are for computing the padding at the end of the struct to align on the first member of the struct. This will probably the same as above, but we don't have any guarantees. */ typedef struct { short x; char c; } __Pyx_pad_short; typedef struct { int x; char c; } __Pyx_pad_int; typedef struct { long x; char c; } __Pyx_pad_long; typedef struct { float x; char c; } __Pyx_pad_float; typedef struct { double x; char c; } __Pyx_pad_double; typedef struct { long double x; char c; } __Pyx_pad_longdouble; typedef struct { void *x; char c; } __Pyx_pad_void_p; #ifdef HAVE_LONG_LONG typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { switch (ch) { case 'c': return 'H'; case 'b': case 'h': case 'i': case 'l': case 'q': case 's': case 'p': return 'I'; case 'B': case 'H': case 'I': case 'L': case 'Q': return 'U'; case 'f': case 'd': case 'g': return (is_complex ? 'C' : 'R'); case 'O': return 'O'; case 'P': return 'P'; default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { if (ctx->head == NULL || ctx->head->field == &ctx->root) { const char* expected; const char* quote; if (ctx->head == NULL) { expected = "end"; quote = ""; } else { expected = ctx->head->field->type->name; quote = "'"; } PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected %s%s%s but got %s", quote, expected, quote, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); } else { __Pyx_StructField* field = ctx->head->field; __Pyx_StructField* parent = (ctx->head - 1)->field; PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), parent->type->name, field->name); } } static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { char group; size_t size, offset, arraysize = 1; if (ctx->enc_type == 0) return 0; if (ctx->head->field->type->arraysize[0]) { int i, ndim = 0; if (ctx->enc_type == 's' || ctx->enc_type == 'p') { ctx->is_valid_array = ctx->head->field->type->ndim == 1; ndim = 1; if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %zu", ctx->head->field->type->arraysize[0], ctx->enc_count); return -1; } } if (!ctx->is_valid_array) { PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", ctx->head->field->type->ndim, ndim); return -1; } for (i = 0; i < ctx->head->field->type->ndim; i++) { arraysize *= ctx->head->field->type->arraysize[i]; } ctx->is_valid_array = 0; ctx->enc_count = 1; } group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); do { __Pyx_StructField* field = ctx->head->field; __Pyx_TypeInfo* type = field->type; if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); } else { size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); } if (ctx->enc_packmode == '@') { size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); size_t align_mod_offset; if (align_at == 0) return -1; align_mod_offset = ctx->fmt_offset % align_at; if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; if (ctx->struct_alignment == 0) ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, ctx->is_complex); } if (type->size != size || type->typegroup != group) { if (type->typegroup == 'C' && type->fields != NULL) { size_t parent_offset = ctx->head->parent_offset + field->offset; ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = parent_offset; continue; } if ((type->typegroup == 'H' || group == 'H') && type->size == size) { } else { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } } offset = ctx->head->parent_offset + field->offset; if (ctx->fmt_offset != offset) { PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); return -1; } ctx->fmt_offset += size; if (arraysize) ctx->fmt_offset += (arraysize - 1) * size; --ctx->enc_count; /* Consume from buffer string */ while (1) { if (field == &ctx->root) { ctx->head = NULL; if (ctx->enc_count != 0) { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } break; /* breaks both loops as ctx->enc_count == 0 */ } ctx->head->field = ++field; if (field->type == NULL) { --ctx->head; field = ctx->head->field; continue; } else if (field->type->typegroup == 'S') { size_t parent_offset = ctx->head->parent_offset + field->offset; if (field->type->fields->type == NULL) continue; /* empty struct */ field = field->type->fields; ++ctx->head; ctx->head->field = field; ctx->head->parent_offset = parent_offset; break; } else { break; } } } while (ctx->enc_count); ctx->enc_type = 0; ctx->is_complex = 0; return 0; } static CYTHON_INLINE PyObject * __pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) { const char *ts = *tsp; int i = 0, number; int ndim = ctx->head->field->type->ndim; ; ++ts; if (ctx->new_count != 1) { PyErr_SetString(PyExc_ValueError, "Cannot handle repeated arrays in format string"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; while (*ts && *ts != ')') { if (isspace(*ts)) continue; number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) return PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %d", ctx->head->field->type->arraysize[i], number); if (*ts != ',' && *ts != ')') return PyErr_Format(PyExc_ValueError, "Expected a comma in format string, got '%c'", *ts); if (*ts == ',') ts++; i++; } if (i != ndim) return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", ctx->head->field->type->ndim, i); if (!*ts) { PyErr_SetString(PyExc_ValueError, "Unexpected end of format string, expected ')'"); return NULL; } ctx->is_valid_array = 1; ctx->new_count = 1; *tsp = ++ts; return Py_None; } static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { int got_Z = 0; while (1) { switch(*ts) { case 0: if (ctx->enc_type != 0 && ctx->head == NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; if (ctx->head != NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } return ts; case ' ': case 10: case 13: ++ts; break; case '<': if (!__Pyx_IsLittleEndian()) { PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '>': case '!': if (__Pyx_IsLittleEndian()) { PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '=': case '@': case '^': ctx->new_packmode = *ts++; break; case 'T': /* substruct */ { const char* ts_after_sub; size_t i, struct_count = ctx->new_count; size_t struct_alignment = ctx->struct_alignment; ctx->new_count = 1; ++ts; if (*ts != '{') { PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; /* Erase processed last struct element */ ctx->enc_count = 0; ctx->struct_alignment = 0; ++ts; ts_after_sub = ts; for (i = 0; i != struct_count; ++i) { ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); if (!ts_after_sub) return NULL; } ts = ts_after_sub; if (struct_alignment) ctx->struct_alignment = struct_alignment; } break; case '}': /* end of substruct; either repeat or move on */ { size_t alignment = ctx->struct_alignment; ++ts; if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; /* Erase processed last struct element */ if (alignment && ctx->fmt_offset % alignment) { ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); } } return ts; case 'x': if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->fmt_offset += ctx->new_count; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->enc_packmode = ctx->new_packmode; ++ts; break; case 'Z': got_Z = 1; ++ts; if (*ts != 'f' && *ts != 'd' && *ts != 'g') { __Pyx_BufFmt_RaiseUnexpectedChar('Z'); return NULL; } /* fall through */ case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': case 'l': case 'L': case 'q': case 'Q': case 'f': case 'd': case 'g': case 'O': case 's': case 'p': if (ctx->enc_type == *ts && got_Z == ctx->is_complex && ctx->enc_packmode == ctx->new_packmode) { ctx->enc_count += ctx->new_count; } else { if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_count = ctx->new_count; ctx->enc_packmode = ctx->new_packmode; ctx->enc_type = *ts; ctx->is_complex = got_Z; } ++ts; ctx->new_count = 1; got_Z = 0; break; case ':': ++ts; while(*ts != ':') ++ts; ++ts; break; case '(': if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; break; default: { int number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; ctx->new_count = (size_t)number; } } } } static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) { buf->buf = NULL; buf->obj = NULL; buf->strides = __Pyx_zeros; buf->shape = __Pyx_zeros; buf->suboffsets = __Pyx_minusones; } static CYTHON_INLINE int __Pyx_GetBufferAndValidate( Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) { if (obj == Py_None || obj == NULL) { __Pyx_ZeroBuffer(buf); return 0; } buf->buf = NULL; if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail; if (buf->ndim != nd) { PyErr_Format(PyExc_ValueError, "Buffer has wrong number of dimensions (expected %d, got %d)", nd, buf->ndim); goto fail; } if (!cast) { __Pyx_BufFmt_Context ctx; __Pyx_BufFmt_Init(&ctx, stack, dtype); if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; } if ((unsigned)buf->itemsize != dtype->size) { PyErr_Format(PyExc_ValueError, "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", buf->itemsize, (buf->itemsize > 1) ? "s" : "", dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); goto fail; } if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; return 0; fail:; __Pyx_ZeroBuffer(buf); return -1; } static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { if (info->buf == NULL) return; if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; __Pyx_ReleaseBuffer(info); } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack", index, (index == 1) ? "" : "s"); } static CYTHON_INLINE int __Pyx_IterFinish(void) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); PyObject* exc_type = tstate->curexc_type; if (unlikely(exc_type)) { if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) { PyObject *exc_value, *exc_tb; exc_value = tstate->curexc_value; exc_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; Py_DECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); return 0; } else { return -1; } } return 0; #else if (unlikely(PyErr_Occurred())) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { PyErr_Clear(); return 0; } else { return -1; } } return 0; #endif } static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } else { return __Pyx_IterFinish(); } return 0; } static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { PyObject *local_type, *local_value, *local_tb; #if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; #endif Py_INCREF(local_type); Py_INCREF(local_value); Py_INCREF(local_tb); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_COMPILING_IN_CPYTHON tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; /* Make sure tstate is in a consistent state when we XDECREF these objects (DECREF may run arbitrary code). */ Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_Restore(type, value, tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(type, value, tb); #endif } static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); } static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%s() got an unexpected keyword argument '%s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } #if PY_VERSION_HEX < 0x02050000 if (PyClass_Check(type)) { #else if (PyType_Check(type)) { #endif #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; #if PY_VERSION_HEX < 0x02050000 if (PyInstance_Check(type)) { type = (PyObject*) ((PyInstanceObject*)type)->in_class; Py_INCREF(type); } else { type = 0; PyErr_SetString(PyExc_TypeError, "raise: exception must be an old-style class or instance"); goto raise_error; } #else type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } #endif } __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else /* Python 3+ */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyEval_CallObject(type, args); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause && cause != Py_None) { PyObject *fixed_cause; if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { PyThreadState *tstate = PyThreadState_GET(); PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } } bad: Py_XDECREF(owned_instance); return; } #endif static void __Pyx_RaiseBufferFallbackError(void) { PyErr_Format(PyExc_ValueError, "Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!"); } static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); #else PyErr_GetExcInfo(type, value, tb); #endif } static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(type, value, tb); #endif } #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { CYTHON_UNUSED PyObject *getbuffer_cobj; #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); #endif if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); #if PY_VERSION_HEX < 0x02060000 if (obj->ob_type->tp_dict && (getbuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict, "__pyx_getbuffer"))) { getbufferproc func; #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0) func = (getbufferproc) PyCapsule_GetPointer(getbuffer_cobj, "getbuffer(obj, view, flags)"); #else func = (getbufferproc) PyCObject_AsVoidPtr(getbuffer_cobj); #endif Py_DECREF(getbuffer_cobj); if (!func) goto fail; return func(obj, view, flags); } else { PyErr_Clear(); } #endif PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name); #if PY_VERSION_HEX < 0x02060000 fail: #endif return -1; } static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyObject *obj = view->obj; CYTHON_UNUSED PyObject *releasebuffer_cobj; if (!obj) return; #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) { PyBuffer_Release(view); return; } #endif if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) { __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); return; } #if PY_VERSION_HEX < 0x02060000 if (obj->ob_type->tp_dict && (releasebuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict, "__pyx_releasebuffer"))) { releasebufferproc func; #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0) func = (releasebufferproc) PyCapsule_GetPointer(releasebuffer_cobj, "releasebuffer(obj, view)"); #else func = (releasebufferproc) PyCObject_AsVoidPtr(releasebuffer_cobj); #endif Py_DECREF(releasebuffer_cobj); if (!func) goto fail; func(obj, view); return; } else { PyErr_Clear(); } #endif goto nofail; #if PY_VERSION_HEX < 0x02060000 fail: #endif PyErr_WriteUnraisable(obj); nofail: Py_DECREF(obj); view->obj = NULL; } #endif /* PY_MAJOR_VERSION < 3 */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_VERSION_HEX < 0x03030000 PyObject *py_import = 0; py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; #if PY_VERSION_HEX >= 0x02050000 { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(1); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); #endif if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; /* try absolute import on failure */ } #endif if (!module) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } #else if (level>0) { PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4."); goto bad; } module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, NULL); #endif bad: #if PY_VERSION_HEX < 0x03030000 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3 static PyObject *__Pyx_GetStdout(void) { PyObject *f = PySys_GetObject((char *)"stdout"); if (!f) { PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); } return f; } static int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) { int i; if (!f) { if (!(f = __Pyx_GetStdout())) return -1; } Py_INCREF(f); for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) { PyObject* v; if (PyFile_SoftSpace(f, 1)) { if (PyFile_WriteString(" ", f) < 0) goto error; } v = PyTuple_GET_ITEM(arg_tuple, i); if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) goto error; if (PyString_Check(v)) { char *s = PyString_AsString(v); Py_ssize_t len = PyString_Size(v); if (len > 0 && isspace(Py_CHARMASK(s[len-1])) && s[len-1] != ' ') PyFile_SoftSpace(f, 0); } } if (newline) { if (PyFile_WriteString("\n", f) < 0) goto error; PyFile_SoftSpace(f, 0); } Py_DECREF(f); return 0; error: Py_DECREF(f); return -1; } #else /* Python 3 has a print function */ static int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) { PyObject* kwargs = 0; PyObject* result = 0; PyObject* end_string; if (unlikely(!__pyx_print)) { __pyx_print = __Pyx_GetAttrString(__pyx_b, "print"); if (!__pyx_print) return -1; } if (stream) { kwargs = PyDict_New(); if (unlikely(!kwargs)) return -1; if (unlikely(PyDict_SetItemString(kwargs, "file", stream) < 0)) goto bad; if (!newline) { end_string = PyUnicode_FromStringAndSize(" ", 1); if (unlikely(!end_string)) goto bad; if (PyDict_SetItemString(kwargs, "end", end_string) < 0) { Py_DECREF(end_string); goto bad; } Py_DECREF(end_string); } } else if (!newline) { if (unlikely(!__pyx_print_kwargs)) { __pyx_print_kwargs = PyDict_New(); if (unlikely(!__pyx_print_kwargs)) return -1; end_string = PyUnicode_FromStringAndSize(" ", 1); if (unlikely(!end_string)) return -1; if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) { Py_DECREF(end_string); return -1; } Py_DECREF(end_string); } kwargs = __pyx_print_kwargs; } result = PyObject_Call(__pyx_print, arg_tuple, kwargs); if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs)) Py_DECREF(kwargs); if (!result) return -1; Py_DECREF(result); return 0; bad: if (kwargs != __pyx_print_kwargs) Py_XDECREF(kwargs); return -1; } #endif #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3 static int __Pyx_PrintOne(PyObject* f, PyObject *o) { if (!f) { if (!(f = __Pyx_GetStdout())) return -1; } Py_INCREF(f); if (PyFile_SoftSpace(f, 0)) { if (PyFile_WriteString(" ", f) < 0) goto error; } if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0) goto error; if (PyFile_WriteString("\n", f) < 0) goto error; Py_DECREF(f); return 0; error: Py_DECREF(f); return -1; /* the line below is just to avoid C compiler * warnings about unused functions */ return __Pyx_Print(f, NULL, 0); } #else /* Python 3 has a print function */ static int __Pyx_PrintOne(PyObject* stream, PyObject *o) { int res; PyObject* arg_tuple = PyTuple_Pack(1, o); if (unlikely(!arg_tuple)) return -1; res = __Pyx_Print(stream, arg_tuple, 1); Py_DECREF(arg_tuple); return res; } #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return ::std::complex< float >(x, y); } #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return x + y*(__pyx_t_float_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { __pyx_t_float_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrtf(z.real*z.real + z.imag*z.imag); #else return hypotf(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { float denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(a, a); case 3: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, a); case 4: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_absf(a); theta = atan2f(a.imag, a.real); } lnr = logf(r); z_r = expf(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cosf(z_theta); z.imag = z_r * sinf(z_theta); return z; } #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return ::std::complex< double >(x, y); } #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return x + y*(__pyx_t_double_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { __pyx_t_double_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrt(z.real*z.real + z.imag*z.imag); #else return hypot(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { double denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(a, a); case 3: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, a); case 4: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_abs(a); theta = atan2(a.imag, a.real); } lnr = log(r); z_r = exp(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cos(z_theta); z.imag = z_r * sin(z_theta); return z; } #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { const unsigned char neg_one = (unsigned char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned char" : "value too large to convert to unsigned char"); } return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { const unsigned short neg_one = (unsigned short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned short" : "value too large to convert to unsigned short"); } return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { const unsigned int neg_one = (unsigned int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned int" : "value too large to convert to unsigned int"); } return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { const char neg_one = (char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to char" : "value too large to convert to char"); } return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { const short neg_one = (short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to short" : "value too large to convert to short"); } return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { const signed char neg_one = (signed char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed char" : "value too large to convert to signed char"); } return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { const signed short neg_one = (signed short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed short" : "value too large to convert to signed short"); } return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { const signed int neg_one = (signed int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed int" : "value too large to convert to signed int"); } return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { const unsigned long neg_one = (unsigned long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)PyLong_AsUnsignedLong(x); } else { return (unsigned long)PyLong_AsLong(x); } } else { unsigned long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned long)-1; val = __Pyx_PyInt_AsUnsignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x); } } else { unsigned PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned PY_LONG_LONG)-1; val = __Pyx_PyInt_AsUnsignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { const long neg_one = (long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)PyLong_AsUnsignedLong(x); } else { return (long)PyLong_AsLong(x); } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long)-1; val = __Pyx_PyInt_AsLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (PY_LONG_LONG)PyLong_AsLongLong(x); } } else { PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (PY_LONG_LONG)-1; val = __Pyx_PyInt_AsLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { const signed long neg_one = (signed long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)PyLong_AsUnsignedLong(x); } else { return (signed long)PyLong_AsLong(x); } } else { signed long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed long)-1; val = __Pyx_PyInt_AsSignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (signed PY_LONG_LONG)PyLong_AsLongLong(x); } } else { signed PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed PY_LONG_LONG)-1; val = __Pyx_PyInt_AsSignedLongLong(tmp); Py_DECREF(tmp); return val; } } static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); #if PY_VERSION_HEX < 0x02050000 return PyErr_Warn(NULL, message); #else return PyErr_WarnEx(NULL, message, 1); #endif } return 0; } #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; py_name = __Pyx_PyIdentifier_FromString(name); if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict) { PyObject *py_module = 0; PyObject *result = 0; PyObject *py_name = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif py_module = __Pyx_ImportModule(module_name); if (!py_module) goto bad; py_name = __Pyx_PyIdentifier_FromString(class_name); if (!py_name) goto bad; result = PyObject_GetAttr(py_module, py_name); Py_DECREF(py_name); py_name = 0; Py_DECREF(py_module); py_module = 0; if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%s.%s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if (!strict && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility", module_name, class_name); #if PY_VERSION_HEX < 0x02050000 if (PyErr_Warn(NULL, warning) < 0) goto bad; #else if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; #endif } else if ((size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%s.%s has the wrong size, try recompiling", module_name, class_name); goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(py_module); Py_XDECREF(result); return NULL; } #endif static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = (start + end) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, /*int argcount,*/ 0, /*int kwonlyargcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, /*int firstlineno,*/ __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_globals = 0; PyFrameObject *py_frame = 0; py_code = __pyx_find_code_object(c_line ? c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? c_line : py_line, py_code); } py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = py_line; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else /* Python 3+ has unicode identifiers */ if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_VERSION_HEX < 0x03000000 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_VERSION_HEX < 0x03000000 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%s__ returned non-%s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject* x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { #if PY_VERSION_HEX < 0x02050000 if (ival <= LONG_MAX) return PyInt_FromLong((long)ival); else { unsigned char *bytes = (unsigned char *) &ival; int one = 1; int little = (int)*(unsigned char*)&one; return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); } #else return PyInt_FromSize_t(ival); #endif } static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { return (size_t)-1; } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t)-1; } return (size_t)val; } #endif /* Py_PYTHON_H */ fabio-0.1.3/src/byte_offset.c0000644000175000017500000072072512233175156016645 0ustar jeromejerome00000000000000/* Generated by Cython 0.15.1+ on Fri Dec 9 12:19:09 2011 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02040000 #error Cython requires Python 2.4+. #else #include /* For offsetof */ #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_FORMAT_SIZE_T "" #define PyInt_FromSsize_t(z) PyInt_FromLong(z) #define PyInt_AsSsize_t(o) __Pyx_PyInt_AsInt(o) #define PyNumber_Index(o) PyNumber_Int(o) #define PyIndex_Check(o) PyNumber_Check(o) #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) #endif #if PY_VERSION_HEX < 0x02060000 #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) #define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, #define PyType_Modified(t) typedef struct { void *buf; PyObject *obj; Py_ssize_t len; Py_ssize_t itemsize; int readonly; int ndim; char *format; Py_ssize_t *shape; Py_ssize_t *strides; Py_ssize_t *suboffsets; void *internal; } Py_buffer; #define PyBUF_SIMPLE 0 #define PyBUF_WRITABLE 0x0001 #define PyBUF_FORMAT 0x0004 #define PyBUF_ND 0x0008 #define PyBUF_STRIDES (0x0010 | PyBUF_ND) #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) #endif #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6 #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict") #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #endif #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif /* new Py3.3 unicode representation (PEP 393) */ #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_GET_LENGTH) #define CYTHON_PEP393_ENABLED #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #else #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_VERSION_HEX < 0x02060000 #define PyBytesObject PyStringObject #define PyBytes_Type PyString_Type #define PyBytes_Check PyString_Check #define PyBytes_CheckExact PyString_CheckExact #define PyBytes_FromString PyString_FromString #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromFormat PyString_FromFormat #define PyBytes_DecodeEscape PyString_DecodeEscape #define PyBytes_AsString PyString_AsString #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_Size PyString_Size #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_GET_SIZE PyString_GET_SIZE #define PyBytes_Repr PyString_Repr #define PyBytes_Concat PyString_Concat #define PyBytes_ConcatAndDel PyString_ConcatAndDel #endif #if PY_VERSION_HEX < 0x02060000 #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_VERSION_HEX < 0x03020000 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) #else #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) #else #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_NAMESTR(n) ((char *)(n)) #define __Pyx_DOCSTR(n) ((char *)(n)) #else #define __Pyx_NAMESTR(n) (n) #define __Pyx_DOCSTR(n) (n) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE__byte_offset #define __PYX_HAVE_API__byte_offset #include "stdio.h" #include "stdlib.h" #include "numpy/arrayobject.h" #include "numpy/ufuncobject.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif /* inline attribute */ #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif /* unused attribute */ #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ /* Type Conversion Predeclarations */ #define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) #define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) #define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #ifdef __GNUC__ /* Test for GCC > 2.95 */ #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* __GNUC__ > 2 ... */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ > 2 ... */ #else /* __GNUC__ */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 #elif defined(_Complex_I) #define CYTHON_CCOMPLEX 1 #else #define CYTHON_CCOMPLEX 0 #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #include #else #include #endif #endif #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) #undef _Complex_I #define _Complex_I 1.0fj #endif static const char *__pyx_f[] = { "byte_offset.pyx", "numpy.pxd", }; /* "numpy.pxd":719 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t */ typedef npy_int8 __pyx_t_5numpy_int8_t; /* "numpy.pxd":720 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t */ typedef npy_int16 __pyx_t_5numpy_int16_t; /* "numpy.pxd":721 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< * ctypedef npy_int64 int64_t * #ctypedef npy_int96 int96_t */ typedef npy_int32 __pyx_t_5numpy_int32_t; /* "numpy.pxd":722 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< * #ctypedef npy_int96 int96_t * #ctypedef npy_int128 int128_t */ typedef npy_int64 __pyx_t_5numpy_int64_t; /* "numpy.pxd":726 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; /* "numpy.pxd":727 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; /* "numpy.pxd":728 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< * ctypedef npy_uint64 uint64_t * #ctypedef npy_uint96 uint96_t */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; /* "numpy.pxd":729 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< * #ctypedef npy_uint96 uint96_t * #ctypedef npy_uint128 uint128_t */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; /* "numpy.pxd":733 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< * ctypedef npy_float64 float64_t * #ctypedef npy_float80 float80_t */ typedef npy_float32 __pyx_t_5numpy_float32_t; /* "numpy.pxd":734 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< * #ctypedef npy_float80 float80_t * #ctypedef npy_float128 float128_t */ typedef npy_float64 __pyx_t_5numpy_float64_t; /* "numpy.pxd":743 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t */ typedef npy_long __pyx_t_5numpy_int_t; /* "numpy.pxd":744 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< * ctypedef npy_longlong longlong_t * */ typedef npy_longlong __pyx_t_5numpy_long_t; /* "numpy.pxd":745 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< * * ctypedef npy_ulong uint_t */ typedef npy_longlong __pyx_t_5numpy_longlong_t; /* "numpy.pxd":747 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t */ typedef npy_ulong __pyx_t_5numpy_uint_t; /* "numpy.pxd":748 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulonglong_t * */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; /* "numpy.pxd":749 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< * * ctypedef npy_intp intp_t */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; /* "numpy.pxd":751 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< * ctypedef npy_uintp uintp_t * */ typedef npy_intp __pyx_t_5numpy_intp_t; /* "numpy.pxd":752 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< * * ctypedef npy_double float_t */ typedef npy_uintp __pyx_t_5numpy_uintp_t; /* "numpy.pxd":754 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t */ typedef npy_double __pyx_t_5numpy_float_t; /* "numpy.pxd":755 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< * ctypedef npy_longdouble longdouble_t * */ typedef npy_double __pyx_t_5numpy_double_t; /* "numpy.pxd":756 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; #else typedef float _Complex __pyx_t_float_complex; #endif #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; #else typedef double _Complex __pyx_t_double_complex; #endif #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif /*--- Type declarations ---*/ /* "numpy.pxd":758 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; /* "numpy.pxd":759 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< * ctypedef npy_clongdouble clongdouble_t * */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; /* "numpy.pxd":760 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cdouble complex_t */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; /* "numpy.pxd":762 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/ #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #define __Pyx_RefNannySetupContext(name) __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #define __Pyx_RefNannyFinishContext() __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif /* CYTHON_REFNANNY */ #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name); /*proto*/ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); /*proto*/ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ #define IS_UNSIGNED(type) (((type) -1) > 0) /* Run-time type information about structs used with buffers */ struct __Pyx_StructField_; #define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) typedef struct { const char* name; /* for error messages only */ struct __Pyx_StructField_* fields; size_t size; /* sizeof(type) */ char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */ char is_unsigned; int flags; } __Pyx_TypeInfo; typedef struct __Pyx_StructField_ { __Pyx_TypeInfo* type; const char* name; size_t offset; } __Pyx_StructField; typedef struct { __Pyx_StructField* field; size_t parent_offset; } __Pyx_BufFmt_StackElem; typedef struct { __Pyx_StructField root; __Pyx_BufFmt_StackElem* head; size_t fmt_offset; size_t new_count, enc_count; int is_complex; char enc_type; char new_packmode; char enc_packmode; } __Pyx_BufFmt_Context; static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); #define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/ /* structs for buffer access */ typedef struct { Py_ssize_t shape, strides, suboffsets; } __Pyx_Buf_DimInfo; typedef struct { size_t refcount; Py_buffer pybuffer; } __Pyx_Buffer; typedef struct { __Pyx_Buffer *rcbuffer; char *data; __Pyx_Buf_DimInfo diminfo[32]; } __Pyx_LocalBuf_ND; #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); static void __Pyx_ReleaseBuffer(Py_buffer *view); #else #define __Pyx_GetBuffer PyObject_GetBuffer #define __Pyx_ReleaseBuffer PyBuffer_Release #endif Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/ #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) #define __Pyx_CIMAG(z) ((z).imag()) #else #define __Pyx_CREAL(z) (__real__(z)) #define __Pyx_CIMAG(z) (__imag__(z)) #endif #else #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif #if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); #if CYTHON_CCOMPLEX #define __Pyx_c_eqf(a, b) ((a)==(b)) #define __Pyx_c_sumf(a, b) ((a)+(b)) #define __Pyx_c_difff(a, b) ((a)-(b)) #define __Pyx_c_prodf(a, b) ((a)*(b)) #define __Pyx_c_quotf(a, b) ((a)/(b)) #define __Pyx_c_negf(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zerof(z) ((z)==(float)0) #define __Pyx_c_conjf(z) (::std::conj(z)) #if 1 #define __Pyx_c_absf(z) (::std::abs(z)) #define __Pyx_c_powf(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zerof(z) ((z)==0) #define __Pyx_c_conjf(z) (conjf(z)) #if 1 #define __Pyx_c_absf(z) (cabsf(z)) #define __Pyx_c_powf(a, b) (cpowf(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); #if CYTHON_CCOMPLEX #define __Pyx_c_eq(a, b) ((a)==(b)) #define __Pyx_c_sum(a, b) ((a)+(b)) #define __Pyx_c_diff(a, b) ((a)-(b)) #define __Pyx_c_prod(a, b) ((a)*(b)) #define __Pyx_c_quot(a, b) ((a)/(b)) #define __Pyx_c_neg(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero(z) ((z)==(double)0) #define __Pyx_c_conj(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs(z) (::std::abs(z)) #define __Pyx_c_pow(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero(z) ((z)==0) #define __Pyx_c_conj(z) (conj(z)) #if 1 #define __Pyx_c_abs(z) (cabs(z)) #define __Pyx_c_pow(a, b) (cpow(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static int __Pyx_check_binary_version(void); static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); /*proto*/ static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno, int __pyx_lineno, const char *__pyx_filename); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'libc.stdlib' */ /* Module declarations from 'numpy' */ /* Module declarations from 'numpy' */ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ /* Module declarations from 'cython' */ /* Module declarations from 'byte_offset' */ static __Pyx_TypeInfo __Pyx_TypeInfo_PY_LONG_LONG = { "long long", NULL, sizeof(PY_LONG_LONG), 'I', IS_UNSIGNED(PY_LONG_LONG), 0 }; #define __Pyx_MODULE_NAME "byte_offset" int __pyx_module_is_main_byte_offset = 0; /* Implementation of 'byte_offset' */ static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_RuntimeError; static char __pyx_k_1[] = "ndarray is not C contiguous"; static char __pyx_k_3[] = "ndarray is not Fortran contiguous"; static char __pyx_k_5[] = "Non-native byte order not supported"; static char __pyx_k_7[] = "unknown dtype code in numpy.pxd (%d)"; static char __pyx_k_8[] = "Format string allocated too short, see comment in numpy.pxd"; static char __pyx_k_11[] = "Format string allocated too short."; static char __pyx_k_13[] = "\nAuthors: Jerome Kieffer, ESRF \nEmail: jerome.kieffer@esrf.eu\n\nCif Binary Files images are 2D images written by the Pilatus detector and others.\nThey use a modified (simplified) byte-offset algorithm. This file contains the \ndecompression function from a string to an int64 numpy array. \n\nThis is Cython: convert it to pure C then compile it with gcc\n$ cython byte_offset.pyx \n\n"; static char __pyx_k_14[] = "J\303\251r\303\264me Kieffer"; static char __pyx_k_15[] = "jerome.kieffer@esrf.eu"; static char __pyx_k_16[] = "GPLv3+"; static char __pyx_k_17[] = "2010, European Synchrotron Radiation Facility, Grenoble, France"; static char __pyx_k_20[] = "/home/kieffer/workspace-ssd/fabio/trunk/src/byte_offset.pyx"; static char __pyx_k__B[] = "B"; static char __pyx_k__H[] = "H"; static char __pyx_k__I[] = "I"; static char __pyx_k__L[] = "L"; static char __pyx_k__O[] = "O"; static char __pyx_k__Q[] = "Q"; static char __pyx_k__b[] = "b"; static char __pyx_k__d[] = "d"; static char __pyx_k__f[] = "f"; static char __pyx_k__g[] = "g"; static char __pyx_k__h[] = "h"; static char __pyx_k__i[] = "i"; static char __pyx_k__j[] = "j"; static char __pyx_k__l[] = "l"; static char __pyx_k__q[] = "q"; static char __pyx_k__Zd[] = "Zd"; static char __pyx_k__Zf[] = "Zf"; static char __pyx_k__Zg[] = "Zg"; static char __pyx_k__key0[] = "key0"; static char __pyx_k__key8[] = "key8"; static char __pyx_k__last[] = "last"; static char __pyx_k__size[] = "size"; static char __pyx_k__tmp8[] = "tmp8"; static char __pyx_k__csize[] = "csize"; static char __pyx_k__dtype[] = "dtype"; static char __pyx_k__int64[] = "int64"; static char __pyx_k__numpy[] = "numpy"; static char __pyx_k__range[] = "range"; static char __pyx_k__tmp64[] = "tmp64"; static char __pyx_k__zeros[] = "zeros"; static char __pyx_k__stream[] = "stream"; static char __pyx_k__tmp64a[] = "tmp64a"; static char __pyx_k__tmp64b[] = "tmp64b"; static char __pyx_k__tmp64c[] = "tmp64c"; static char __pyx_k__tmp64d[] = "tmp64d"; static char __pyx_k__tmp64e[] = "tmp64e"; static char __pyx_k__tmp64f[] = "tmp64f"; static char __pyx_k__tmp64g[] = "tmp64g"; static char __pyx_k__utmp8a[] = "utmp8a"; static char __pyx_k__utmp8b[] = "utmp8b"; static char __pyx_k__utmp8c[] = "utmp8c"; static char __pyx_k__utmp8d[] = "utmp8d"; static char __pyx_k__utmp8e[] = "utmp8e"; static char __pyx_k__utmp8f[] = "utmp8f"; static char __pyx_k__utmp8g[] = "utmp8g"; static char __pyx_k__cstream[] = "cstream"; static char __pyx_k__current[] = "current"; static char __pyx_k__dataOut[] = "dataOut"; static char __pyx_k____main__[] = "__main__"; static char __pyx_k____test__[] = "__test__"; static char __pyx_k__lenStream[] = "lenStream"; static char __pyx_k__ValueError[] = "ValueError"; static char __pyx_k____author__[] = "__author__"; static char __pyx_k____contact__[] = "__contact__"; static char __pyx_k____license__[] = "__license__"; static char __pyx_k__byte_offset[] = "byte_offset"; static char __pyx_k__RuntimeError[] = "RuntimeError"; static char __pyx_k____copyright__[] = "__copyright__"; static char __pyx_k__analyseCython[] = "analyseCython"; static PyObject *__pyx_kp_u_1; static PyObject *__pyx_kp_u_11; static PyObject *__pyx_kp_s_14; static PyObject *__pyx_kp_s_15; static PyObject *__pyx_kp_s_16; static PyObject *__pyx_kp_s_17; static PyObject *__pyx_kp_s_20; static PyObject *__pyx_kp_u_3; static PyObject *__pyx_kp_u_5; static PyObject *__pyx_kp_u_7; static PyObject *__pyx_kp_u_8; static PyObject *__pyx_n_s__RuntimeError; static PyObject *__pyx_n_s__ValueError; static PyObject *__pyx_n_s____author__; static PyObject *__pyx_n_s____contact__; static PyObject *__pyx_n_s____copyright__; static PyObject *__pyx_n_s____license__; static PyObject *__pyx_n_s____main__; static PyObject *__pyx_n_s____test__; static PyObject *__pyx_n_s__analyseCython; static PyObject *__pyx_n_s__byte_offset; static PyObject *__pyx_n_s__csize; static PyObject *__pyx_n_s__cstream; static PyObject *__pyx_n_s__current; static PyObject *__pyx_n_s__dataOut; static PyObject *__pyx_n_s__dtype; static PyObject *__pyx_n_s__i; static PyObject *__pyx_n_s__int64; static PyObject *__pyx_n_s__j; static PyObject *__pyx_n_s__key0; static PyObject *__pyx_n_s__key8; static PyObject *__pyx_n_s__last; static PyObject *__pyx_n_s__lenStream; static PyObject *__pyx_n_s__numpy; static PyObject *__pyx_n_s__range; static PyObject *__pyx_n_s__size; static PyObject *__pyx_n_s__stream; static PyObject *__pyx_n_s__tmp64; static PyObject *__pyx_n_s__tmp64a; static PyObject *__pyx_n_s__tmp64b; static PyObject *__pyx_n_s__tmp64c; static PyObject *__pyx_n_s__tmp64d; static PyObject *__pyx_n_s__tmp64e; static PyObject *__pyx_n_s__tmp64f; static PyObject *__pyx_n_s__tmp64g; static PyObject *__pyx_n_s__tmp8; static PyObject *__pyx_n_s__utmp8a; static PyObject *__pyx_n_s__utmp8b; static PyObject *__pyx_n_s__utmp8c; static PyObject *__pyx_n_s__utmp8d; static PyObject *__pyx_n_s__utmp8e; static PyObject *__pyx_n_s__utmp8f; static PyObject *__pyx_n_s__utmp8g; static PyObject *__pyx_n_s__zeros; static PyObject *__pyx_int_15; static PyObject *__pyx_k_tuple_2; static PyObject *__pyx_k_tuple_4; static PyObject *__pyx_k_tuple_6; static PyObject *__pyx_k_tuple_9; static PyObject *__pyx_k_tuple_10; static PyObject *__pyx_k_tuple_12; static PyObject *__pyx_k_tuple_18; static PyObject *__pyx_k_codeobj_19; /* "byte_offset.pyx":25 * * @cython.boundscheck(False) * def analyseCython(bytes stream not None, size=None): # <<<<<<<<<<<<<< * """ * Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) */ static PyObject *__pyx_pf_11byte_offset_analyseCython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_11byte_offset_analyseCython[] = "\n Analyze a stream of char with any length of exception (2,4, or 8 bytes integers)\n @param stream: string representing the compressed data\n @param size: the size of the output array (of longInts)\n @return : int64 ndArrays \n "; static PyMethodDef __pyx_mdef_11byte_offset_analyseCython = {__Pyx_NAMESTR("analyseCython"), (PyCFunction)__pyx_pf_11byte_offset_analyseCython, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_11byte_offset_analyseCython)}; static PyObject *__pyx_pf_11byte_offset_analyseCython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_stream = 0; PyObject *__pyx_v_size = 0; int __pyx_v_i; int __pyx_v_j; PY_LONG_LONG __pyx_v_last; PY_LONG_LONG __pyx_v_current; char __pyx_v_tmp8; unsigned char __pyx_v_utmp8a; unsigned char __pyx_v_utmp8b; unsigned char __pyx_v_utmp8c; unsigned char __pyx_v_utmp8d; unsigned char __pyx_v_utmp8e; unsigned char __pyx_v_utmp8f; unsigned char __pyx_v_utmp8g; PY_LONG_LONG __pyx_v_tmp64; PY_LONG_LONG __pyx_v_tmp64a; PY_LONG_LONG __pyx_v_tmp64b; PY_LONG_LONG __pyx_v_tmp64c; PY_LONG_LONG __pyx_v_tmp64d; PY_LONG_LONG __pyx_v_tmp64e; PY_LONG_LONG __pyx_v_tmp64f; PY_LONG_LONG __pyx_v_tmp64g; char __pyx_v_key8; char __pyx_v_key0; int __pyx_v_csize; int __pyx_v_lenStream; char *__pyx_v_cstream; PyArrayObject *__pyx_v_dataOut = 0; __Pyx_LocalBuf_ND __pyx_pybuffernd_dataOut; __Pyx_Buffer __pyx_pybuffer_dataOut; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; char *__pyx_t_2; int __pyx_t_3; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyArrayObject *__pyx_t_10 = NULL; int __pyx_t_11; int __pyx_t_12; int __pyx_t_13; int __pyx_t_14; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stream,&__pyx_n_s__size,0}; __Pyx_RefNannySetupContext("analyseCython"); __pyx_self = __pyx_self; { PyObject* values[2] = {0,0}; values[1] = ((PyObject *)Py_None); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stream); if (likely(values[0])) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size); if (value) { values[1] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "analyseCython") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } __pyx_v_stream = ((PyObject*)values[0]); __pyx_v_size = values[1]; } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_stream = ((PyObject*)values[0]); __pyx_v_size = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("analyseCython", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("byte_offset.analyseCython", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_pybuffer_dataOut.pybuffer.buf = NULL; __pyx_pybuffer_dataOut.refcount = 0; __pyx_pybuffernd_dataOut.data = NULL; __pyx_pybuffernd_dataOut.rcbuffer = &__pyx_pybuffer_dataOut; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_stream), (&PyBytes_Type), 0, "stream", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "byte_offset.pyx":33 * """ * * cdef int i = 0 # <<<<<<<<<<<<<< * cdef int j = 0 * cdef long long last = 0 */ __pyx_v_i = 0; /* "byte_offset.pyx":34 * * cdef int i = 0 * cdef int j = 0 # <<<<<<<<<<<<<< * cdef long long last = 0 * cdef long long current = 0 */ __pyx_v_j = 0; /* "byte_offset.pyx":35 * cdef int i = 0 * cdef int j = 0 * cdef long long last = 0 # <<<<<<<<<<<<<< * cdef long long current = 0 * cdef char tmp8 = 0 */ __pyx_v_last = 0; /* "byte_offset.pyx":36 * cdef int j = 0 * cdef long long last = 0 * cdef long long current = 0 # <<<<<<<<<<<<<< * cdef char tmp8 = 0 * */ __pyx_v_current = 0; /* "byte_offset.pyx":37 * cdef long long last = 0 * cdef long long current = 0 * cdef char tmp8 = 0 # <<<<<<<<<<<<<< * * cdef unsigned char utmp8a = 0 */ __pyx_v_tmp8 = 0; /* "byte_offset.pyx":39 * cdef char tmp8 = 0 * * cdef unsigned char utmp8a = 0 # <<<<<<<<<<<<<< * cdef unsigned char utmp8b = 0 * cdef unsigned char utmp8c = 0 */ __pyx_v_utmp8a = 0; /* "byte_offset.pyx":40 * * cdef unsigned char utmp8a = 0 * cdef unsigned char utmp8b = 0 # <<<<<<<<<<<<<< * cdef unsigned char utmp8c = 0 * cdef unsigned char utmp8d = 0 */ __pyx_v_utmp8b = 0; /* "byte_offset.pyx":41 * cdef unsigned char utmp8a = 0 * cdef unsigned char utmp8b = 0 * cdef unsigned char utmp8c = 0 # <<<<<<<<<<<<<< * cdef unsigned char utmp8d = 0 * cdef unsigned char utmp8e = 0 */ __pyx_v_utmp8c = 0; /* "byte_offset.pyx":42 * cdef unsigned char utmp8b = 0 * cdef unsigned char utmp8c = 0 * cdef unsigned char utmp8d = 0 # <<<<<<<<<<<<<< * cdef unsigned char utmp8e = 0 * cdef unsigned char utmp8f = 0 */ __pyx_v_utmp8d = 0; /* "byte_offset.pyx":43 * cdef unsigned char utmp8c = 0 * cdef unsigned char utmp8d = 0 * cdef unsigned char utmp8e = 0 # <<<<<<<<<<<<<< * cdef unsigned char utmp8f = 0 * cdef unsigned char utmp8g = 0 */ __pyx_v_utmp8e = 0; /* "byte_offset.pyx":44 * cdef unsigned char utmp8d = 0 * cdef unsigned char utmp8e = 0 * cdef unsigned char utmp8f = 0 # <<<<<<<<<<<<<< * cdef unsigned char utmp8g = 0 * */ __pyx_v_utmp8f = 0; /* "byte_offset.pyx":45 * cdef unsigned char utmp8e = 0 * cdef unsigned char utmp8f = 0 * cdef unsigned char utmp8g = 0 # <<<<<<<<<<<<<< * * cdef long long tmp64 = 0 */ __pyx_v_utmp8g = 0; /* "byte_offset.pyx":47 * cdef unsigned char utmp8g = 0 * * cdef long long tmp64 = 0 # <<<<<<<<<<<<<< * cdef long long tmp64a = 0 * cdef long long tmp64b = 0 */ __pyx_v_tmp64 = 0; /* "byte_offset.pyx":48 * * cdef long long tmp64 = 0 * cdef long long tmp64a = 0 # <<<<<<<<<<<<<< * cdef long long tmp64b = 0 * cdef long long tmp64c = 0 */ __pyx_v_tmp64a = 0; /* "byte_offset.pyx":49 * cdef long long tmp64 = 0 * cdef long long tmp64a = 0 * cdef long long tmp64b = 0 # <<<<<<<<<<<<<< * cdef long long tmp64c = 0 * cdef long long tmp64d = 0 */ __pyx_v_tmp64b = 0; /* "byte_offset.pyx":50 * cdef long long tmp64a = 0 * cdef long long tmp64b = 0 * cdef long long tmp64c = 0 # <<<<<<<<<<<<<< * cdef long long tmp64d = 0 * cdef long long tmp64e = 0 */ __pyx_v_tmp64c = 0; /* "byte_offset.pyx":51 * cdef long long tmp64b = 0 * cdef long long tmp64c = 0 * cdef long long tmp64d = 0 # <<<<<<<<<<<<<< * cdef long long tmp64e = 0 * cdef long long tmp64f = 0 */ __pyx_v_tmp64d = 0; /* "byte_offset.pyx":52 * cdef long long tmp64c = 0 * cdef long long tmp64d = 0 * cdef long long tmp64e = 0 # <<<<<<<<<<<<<< * cdef long long tmp64f = 0 * cdef long long tmp64g = 0 */ __pyx_v_tmp64e = 0; /* "byte_offset.pyx":53 * cdef long long tmp64d = 0 * cdef long long tmp64e = 0 * cdef long long tmp64f = 0 # <<<<<<<<<<<<<< * cdef long long tmp64g = 0 * */ __pyx_v_tmp64f = 0; /* "byte_offset.pyx":54 * cdef long long tmp64e = 0 * cdef long long tmp64f = 0 * cdef long long tmp64g = 0 # <<<<<<<<<<<<<< * * cdef char key8 = 0x80 */ __pyx_v_tmp64g = 0; /* "byte_offset.pyx":56 * cdef long long tmp64g = 0 * * cdef char key8 = 0x80 # <<<<<<<<<<<<<< * cdef char key0 = 0x00 * */ __pyx_v_key8 = 0x80; /* "byte_offset.pyx":57 * * cdef char key8 = 0x80 * cdef char key0 = 0x00 # <<<<<<<<<<<<<< * * cdef int csize */ __pyx_v_key0 = 0x00; /* "byte_offset.pyx":60 * * cdef int csize * cdef int lenStream = < int > len(stream) # <<<<<<<<<<<<<< * cdef char * cstream = stream * if size is None: */ __pyx_t_1 = PyBytes_GET_SIZE(((PyObject *)__pyx_v_stream)); __pyx_v_lenStream = ((int)__pyx_t_1); /* "byte_offset.pyx":61 * cdef int csize * cdef int lenStream = < int > len(stream) * cdef char * cstream = stream # <<<<<<<<<<<<<< * if size is None: * csize = lenStream */ __pyx_t_2 = PyBytes_AsString(((PyObject *)__pyx_v_stream)); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_cstream = __pyx_t_2; /* "byte_offset.pyx":62 * cdef int lenStream = < int > len(stream) * cdef char * cstream = stream * if size is None: # <<<<<<<<<<<<<< * csize = lenStream * else: */ __pyx_t_3 = (__pyx_v_size == Py_None); if (__pyx_t_3) { /* "byte_offset.pyx":63 * cdef char * cstream = stream * if size is None: * csize = lenStream # <<<<<<<<<<<<<< * else: * csize = < int > size */ __pyx_v_csize = __pyx_v_lenStream; goto __pyx_L6; } /*else*/ { /* "byte_offset.pyx":65 * csize = lenStream * else: * csize = < int > size # <<<<<<<<<<<<<< * cdef numpy.ndarray[ long long , ndim = 1] dataOut = numpy.zeros(csize, dtype=numpy.int64) * with nogil: */ __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_size); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_csize = ((int)__pyx_t_4); } __pyx_L6:; /* "byte_offset.pyx":66 * else: * csize = < int > size * cdef numpy.ndarray[ long long , ndim = 1] dataOut = numpy.zeros(csize, dtype=numpy.int64) # <<<<<<<<<<<<<< * with nogil: * while (i < lenStream) and (j < csize): */ __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__zeros); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyInt_FromLong(__pyx_v_csize); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_5)); __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__int64); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__dtype), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; if (!(likely(((__pyx_t_9) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_9, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = ((PyArrayObject *)__pyx_t_9); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_dataOut.rcbuffer->pybuffer, (PyObject*)__pyx_t_10, &__Pyx_TypeInfo_PY_LONG_LONG, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) { __pyx_v_dataOut = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_dataOut.rcbuffer->pybuffer.buf = NULL; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_dataOut.diminfo[0].strides = __pyx_pybuffernd_dataOut.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_dataOut.diminfo[0].shape = __pyx_pybuffernd_dataOut.rcbuffer->pybuffer.shape[0]; } } __pyx_t_10 = 0; __pyx_v_dataOut = ((PyArrayObject *)__pyx_t_9); __pyx_t_9 = 0; /* "byte_offset.pyx":67 * csize = < int > size * cdef numpy.ndarray[ long long , ndim = 1] dataOut = numpy.zeros(csize, dtype=numpy.int64) * with nogil: # <<<<<<<<<<<<<< * while (i < lenStream) and (j < csize): * if (cstream[i] == key8): */ { #ifdef WITH_THREAD PyThreadState *_save = NULL; #endif Py_UNBLOCK_THREADS /*try:*/ { /* "byte_offset.pyx":68 * cdef numpy.ndarray[ long long , ndim = 1] dataOut = numpy.zeros(csize, dtype=numpy.int64) * with nogil: * while (i < lenStream) and (j < csize): # <<<<<<<<<<<<<< * if (cstream[i] == key8): * if ((cstream[i + 1] == key0) and (cstream[i + 2] == key8)): */ while (1) { __pyx_t_3 = (__pyx_v_i < __pyx_v_lenStream); if (__pyx_t_3) { __pyx_t_11 = (__pyx_v_j < __pyx_v_csize); __pyx_t_12 = __pyx_t_11; } else { __pyx_t_12 = __pyx_t_3; } if (!__pyx_t_12) break; /* "byte_offset.pyx":69 * with nogil: * while (i < lenStream) and (j < csize): * if (cstream[i] == key8): # <<<<<<<<<<<<<< * if ((cstream[i + 1] == key0) and (cstream[i + 2] == key8)): * if (cstream[i + 3] == key0) and (cstream[i + 4] == key0) and (cstream[i + 5] == key0) and (cstream[i + 6] == key8): */ __pyx_t_12 = ((__pyx_v_cstream[__pyx_v_i]) == __pyx_v_key8); if (__pyx_t_12) { /* "byte_offset.pyx":70 * while (i < lenStream) and (j < csize): * if (cstream[i] == key8): * if ((cstream[i + 1] == key0) and (cstream[i + 2] == key8)): # <<<<<<<<<<<<<< * if (cstream[i + 3] == key0) and (cstream[i + 4] == key0) and (cstream[i + 5] == key0) and (cstream[i + 6] == key8): * #Retrieve the interesting Bytes of data */ __pyx_t_12 = ((__pyx_v_cstream[(__pyx_v_i + 1)]) == __pyx_v_key0); if (__pyx_t_12) { __pyx_t_3 = ((__pyx_v_cstream[(__pyx_v_i + 2)]) == __pyx_v_key8); __pyx_t_11 = __pyx_t_3; } else { __pyx_t_11 = __pyx_t_12; } if (__pyx_t_11) { /* "byte_offset.pyx":71 * if (cstream[i] == key8): * if ((cstream[i + 1] == key0) and (cstream[i + 2] == key8)): * if (cstream[i + 3] == key0) and (cstream[i + 4] == key0) and (cstream[i + 5] == key0) and (cstream[i + 6] == key8): # <<<<<<<<<<<<<< * #Retrieve the interesting Bytes of data * tmp8 = cstream[i + 14] */ __pyx_t_11 = ((__pyx_v_cstream[(__pyx_v_i + 3)]) == __pyx_v_key0); if (__pyx_t_11) { __pyx_t_12 = ((__pyx_v_cstream[(__pyx_v_i + 4)]) == __pyx_v_key0); if (__pyx_t_12) { __pyx_t_3 = ((__pyx_v_cstream[(__pyx_v_i + 5)]) == __pyx_v_key0); if (__pyx_t_3) { __pyx_t_13 = ((__pyx_v_cstream[(__pyx_v_i + 6)]) == __pyx_v_key8); __pyx_t_14 = __pyx_t_13; } else { __pyx_t_14 = __pyx_t_3; } __pyx_t_3 = __pyx_t_14; } else { __pyx_t_3 = __pyx_t_12; } __pyx_t_12 = __pyx_t_3; } else { __pyx_t_12 = __pyx_t_11; } if (__pyx_t_12) { /* "byte_offset.pyx":73 * if (cstream[i + 3] == key0) and (cstream[i + 4] == key0) and (cstream[i + 5] == key0) and (cstream[i + 6] == key8): * #Retrieve the interesting Bytes of data * tmp8 = cstream[i + 14] # <<<<<<<<<<<<<< * utmp8a = cstream[i + 13] * utmp8b = cstream[i + 12] */ __pyx_v_tmp8 = (__pyx_v_cstream[(__pyx_v_i + 14)]); /* "byte_offset.pyx":74 * #Retrieve the interesting Bytes of data * tmp8 = cstream[i + 14] * utmp8a = cstream[i + 13] # <<<<<<<<<<<<<< * utmp8b = cstream[i + 12] * utmp8c = cstream[i + 11] */ __pyx_v_utmp8a = (__pyx_v_cstream[(__pyx_v_i + 13)]); /* "byte_offset.pyx":75 * tmp8 = cstream[i + 14] * utmp8a = cstream[i + 13] * utmp8b = cstream[i + 12] # <<<<<<<<<<<<<< * utmp8c = cstream[i + 11] * utmp8d = cstream[i + 10] */ __pyx_v_utmp8b = (__pyx_v_cstream[(__pyx_v_i + 12)]); /* "byte_offset.pyx":76 * utmp8a = cstream[i + 13] * utmp8b = cstream[i + 12] * utmp8c = cstream[i + 11] # <<<<<<<<<<<<<< * utmp8d = cstream[i + 10] * utmp8e = cstream[i + 9] */ __pyx_v_utmp8c = (__pyx_v_cstream[(__pyx_v_i + 11)]); /* "byte_offset.pyx":77 * utmp8b = cstream[i + 12] * utmp8c = cstream[i + 11] * utmp8d = cstream[i + 10] # <<<<<<<<<<<<<< * utmp8e = cstream[i + 9] * utmp8f = cstream[i + 8] */ __pyx_v_utmp8d = (__pyx_v_cstream[(__pyx_v_i + 10)]); /* "byte_offset.pyx":78 * utmp8c = cstream[i + 11] * utmp8d = cstream[i + 10] * utmp8e = cstream[i + 9] # <<<<<<<<<<<<<< * utmp8f = cstream[i + 8] * utmp8g = cstream[i + 7] */ __pyx_v_utmp8e = (__pyx_v_cstream[(__pyx_v_i + 9)]); /* "byte_offset.pyx":79 * utmp8d = cstream[i + 10] * utmp8e = cstream[i + 9] * utmp8f = cstream[i + 8] # <<<<<<<<<<<<<< * utmp8g = cstream[i + 7] * # cast them in 64 bit */ __pyx_v_utmp8f = (__pyx_v_cstream[(__pyx_v_i + 8)]); /* "byte_offset.pyx":80 * utmp8e = cstream[i + 9] * utmp8f = cstream[i + 8] * utmp8g = cstream[i + 7] # <<<<<<<<<<<<<< * # cast them in 64 bit * tmp64 = tmp8 */ __pyx_v_utmp8g = (__pyx_v_cstream[(__pyx_v_i + 7)]); /* "byte_offset.pyx":82 * utmp8g = cstream[i + 7] * # cast them in 64 bit * tmp64 = tmp8 # <<<<<<<<<<<<<< * tmp64a = utmp8a * tmp64b = utmp8b */ __pyx_v_tmp64 = __pyx_v_tmp8; /* "byte_offset.pyx":83 * # cast them in 64 bit * tmp64 = tmp8 * tmp64a = utmp8a # <<<<<<<<<<<<<< * tmp64b = utmp8b * tmp64c = utmp8c */ __pyx_v_tmp64a = __pyx_v_utmp8a; /* "byte_offset.pyx":84 * tmp64 = tmp8 * tmp64a = utmp8a * tmp64b = utmp8b # <<<<<<<<<<<<<< * tmp64c = utmp8c * tmp64d = utmp8d */ __pyx_v_tmp64b = __pyx_v_utmp8b; /* "byte_offset.pyx":85 * tmp64a = utmp8a * tmp64b = utmp8b * tmp64c = utmp8c # <<<<<<<<<<<<<< * tmp64d = utmp8d * tmp64e = utmp8e */ __pyx_v_tmp64c = __pyx_v_utmp8c; /* "byte_offset.pyx":86 * tmp64b = utmp8b * tmp64c = utmp8c * tmp64d = utmp8d # <<<<<<<<<<<<<< * tmp64e = utmp8e * tmp64f = utmp8f */ __pyx_v_tmp64d = __pyx_v_utmp8d; /* "byte_offset.pyx":87 * tmp64c = utmp8c * tmp64d = utmp8d * tmp64e = utmp8e # <<<<<<<<<<<<<< * tmp64f = utmp8f * tmp64g = utmp8g */ __pyx_v_tmp64e = __pyx_v_utmp8e; /* "byte_offset.pyx":88 * tmp64d = utmp8d * tmp64e = utmp8e * tmp64f = utmp8f # <<<<<<<<<<<<<< * tmp64g = utmp8g * current = (tmp64 << 56) | (tmp64a << 48) | (tmp64b << 40) | (tmp64c << 32) | (tmp64d << 24) | (tmp64e << 16) | (tmp64f << 8) | (tmp64g) */ __pyx_v_tmp64f = __pyx_v_utmp8f; /* "byte_offset.pyx":89 * tmp64e = utmp8e * tmp64f = utmp8f * tmp64g = utmp8g # <<<<<<<<<<<<<< * current = (tmp64 << 56) | (tmp64a << 48) | (tmp64b << 40) | (tmp64c << 32) | (tmp64d << 24) | (tmp64e << 16) | (tmp64f << 8) | (tmp64g) * i += 15 */ __pyx_v_tmp64g = __pyx_v_utmp8g; /* "byte_offset.pyx":90 * tmp64f = utmp8f * tmp64g = utmp8g * current = (tmp64 << 56) | (tmp64a << 48) | (tmp64b << 40) | (tmp64c << 32) | (tmp64d << 24) | (tmp64e << 16) | (tmp64f << 8) | (tmp64g) # <<<<<<<<<<<<<< * i += 15 * else: */ __pyx_v_current = ((((((((__pyx_v_tmp64 << 56) | (__pyx_v_tmp64a << 48)) | (__pyx_v_tmp64b << 40)) | (__pyx_v_tmp64c << 32)) | (__pyx_v_tmp64d << 24)) | (__pyx_v_tmp64e << 16)) | (__pyx_v_tmp64f << 8)) | __pyx_v_tmp64g); /* "byte_offset.pyx":91 * tmp64g = utmp8g * current = (tmp64 << 56) | (tmp64a << 48) | (tmp64b << 40) | (tmp64c << 32) | (tmp64d << 24) | (tmp64e << 16) | (tmp64f << 8) | (tmp64g) * i += 15 # <<<<<<<<<<<<<< * else: * #Retrieve the interesting Bytes of data */ __pyx_v_i = (__pyx_v_i + 15); goto __pyx_L14; } /*else*/ { /* "byte_offset.pyx":94 * else: * #Retrieve the interesting Bytes of data * tmp8 = cstream[i + 6] # <<<<<<<<<<<<<< * utmp8a = cstream[i + 5] * utmp8b = cstream[i + 4] */ __pyx_v_tmp8 = (__pyx_v_cstream[(__pyx_v_i + 6)]); /* "byte_offset.pyx":95 * #Retrieve the interesting Bytes of data * tmp8 = cstream[i + 6] * utmp8a = cstream[i + 5] # <<<<<<<<<<<<<< * utmp8b = cstream[i + 4] * utmp8c = cstream[i + 3] */ __pyx_v_utmp8a = (__pyx_v_cstream[(__pyx_v_i + 5)]); /* "byte_offset.pyx":96 * tmp8 = cstream[i + 6] * utmp8a = cstream[i + 5] * utmp8b = cstream[i + 4] # <<<<<<<<<<<<<< * utmp8c = cstream[i + 3] * # cast them in 64 bit */ __pyx_v_utmp8b = (__pyx_v_cstream[(__pyx_v_i + 4)]); /* "byte_offset.pyx":97 * utmp8a = cstream[i + 5] * utmp8b = cstream[i + 4] * utmp8c = cstream[i + 3] # <<<<<<<<<<<<<< * # cast them in 64 bit * tmp64 = tmp8 */ __pyx_v_utmp8c = (__pyx_v_cstream[(__pyx_v_i + 3)]); /* "byte_offset.pyx":99 * utmp8c = cstream[i + 3] * # cast them in 64 bit * tmp64 = tmp8 # <<<<<<<<<<<<<< * tmp64a = utmp8a * tmp64b = utmp8b */ __pyx_v_tmp64 = __pyx_v_tmp8; /* "byte_offset.pyx":100 * # cast them in 64 bit * tmp64 = tmp8 * tmp64a = utmp8a # <<<<<<<<<<<<<< * tmp64b = utmp8b * tmp64c = utmp8c */ __pyx_v_tmp64a = __pyx_v_utmp8a; /* "byte_offset.pyx":101 * tmp64 = tmp8 * tmp64a = utmp8a * tmp64b = utmp8b # <<<<<<<<<<<<<< * tmp64c = utmp8c * #Assemble data into a long long */ __pyx_v_tmp64b = __pyx_v_utmp8b; /* "byte_offset.pyx":102 * tmp64a = utmp8a * tmp64b = utmp8b * tmp64c = utmp8c # <<<<<<<<<<<<<< * #Assemble data into a long long * current = (tmp64 << 24) | (tmp64a << 16) | (tmp64b << 8) | (tmp64c); */ __pyx_v_tmp64c = __pyx_v_utmp8c; /* "byte_offset.pyx":104 * tmp64c = utmp8c * #Assemble data into a long long * current = (tmp64 << 24) | (tmp64a << 16) | (tmp64b << 8) | (tmp64c); # <<<<<<<<<<<<<< * i += 7 * else: */ __pyx_v_current = ((((__pyx_v_tmp64 << 24) | (__pyx_v_tmp64a << 16)) | (__pyx_v_tmp64b << 8)) | __pyx_v_tmp64c); /* "byte_offset.pyx":105 * #Assemble data into a long long * current = (tmp64 << 24) | (tmp64a << 16) | (tmp64b << 8) | (tmp64c); * i += 7 # <<<<<<<<<<<<<< * else: * tmp8 = cstream[i + 2]; */ __pyx_v_i = (__pyx_v_i + 7); } __pyx_L14:; goto __pyx_L13; } /*else*/ { /* "byte_offset.pyx":107 * i += 7 * else: * tmp8 = cstream[i + 2]; # <<<<<<<<<<<<<< * utmp8a = cstream[i + 1] * # cast them in 64 bit */ __pyx_v_tmp8 = (__pyx_v_cstream[(__pyx_v_i + 2)]); /* "byte_offset.pyx":108 * else: * tmp8 = cstream[i + 2]; * utmp8a = cstream[i + 1] # <<<<<<<<<<<<<< * # cast them in 64 bit * tmp64 = tmp8 */ __pyx_v_utmp8a = (__pyx_v_cstream[(__pyx_v_i + 1)]); /* "byte_offset.pyx":110 * utmp8a = cstream[i + 1] * # cast them in 64 bit * tmp64 = tmp8 # <<<<<<<<<<<<<< * tmp64a = utmp8a * current = (tmp64 << 8) | (tmp64a); */ __pyx_v_tmp64 = __pyx_v_tmp8; /* "byte_offset.pyx":111 * # cast them in 64 bit * tmp64 = tmp8 * tmp64a = utmp8a # <<<<<<<<<<<<<< * current = (tmp64 << 8) | (tmp64a); * i += 3 */ __pyx_v_tmp64a = __pyx_v_utmp8a; /* "byte_offset.pyx":112 * tmp64 = tmp8 * tmp64a = utmp8a * current = (tmp64 << 8) | (tmp64a); # <<<<<<<<<<<<<< * i += 3 * else: */ __pyx_v_current = ((__pyx_v_tmp64 << 8) | __pyx_v_tmp64a); /* "byte_offset.pyx":113 * tmp64a = utmp8a * current = (tmp64 << 8) | (tmp64a); * i += 3 # <<<<<<<<<<<<<< * else: * tmp8 = cstream[i] */ __pyx_v_i = (__pyx_v_i + 3); } __pyx_L13:; goto __pyx_L12; } /*else*/ { /* "byte_offset.pyx":115 * i += 3 * else: * tmp8 = cstream[i] # <<<<<<<<<<<<<< * current = tmp8 * i += 1 */ __pyx_v_tmp8 = (__pyx_v_cstream[__pyx_v_i]); /* "byte_offset.pyx":116 * else: * tmp8 = cstream[i] * current = tmp8 # <<<<<<<<<<<<<< * i += 1 * last += current */ __pyx_v_current = __pyx_v_tmp8; /* "byte_offset.pyx":117 * tmp8 = cstream[i] * current = tmp8 * i += 1 # <<<<<<<<<<<<<< * last += current * dataOut[j] = last */ __pyx_v_i = (__pyx_v_i + 1); } __pyx_L12:; /* "byte_offset.pyx":118 * current = tmp8 * i += 1 * last += current # <<<<<<<<<<<<<< * dataOut[j] = last * j += 1 */ __pyx_v_last = (__pyx_v_last + __pyx_v_current); /* "byte_offset.pyx":119 * i += 1 * last += current * dataOut[j] = last # <<<<<<<<<<<<<< * j += 1 * return dataOut[:j] */ __pyx_t_4 = __pyx_v_j; if (__pyx_t_4 < 0) __pyx_t_4 += __pyx_pybuffernd_dataOut.diminfo[0].shape; *__Pyx_BufPtrStrided1d(PY_LONG_LONG *, __pyx_pybuffernd_dataOut.rcbuffer->pybuffer.buf, __pyx_t_4, __pyx_pybuffernd_dataOut.diminfo[0].strides) = __pyx_v_last; /* "byte_offset.pyx":120 * last += current * dataOut[j] = last * j += 1 # <<<<<<<<<<<<<< * return dataOut[:j] */ __pyx_v_j = (__pyx_v_j + 1); } } /* "byte_offset.pyx":67 * csize = < int > size * cdef numpy.ndarray[ long long , ndim = 1] dataOut = numpy.zeros(csize, dtype=numpy.int64) * with nogil: # <<<<<<<<<<<<<< * while (i < lenStream) and (j < csize): * if (cstream[i] == key8): */ /*finally:*/ { Py_BLOCK_THREADS } } /* "byte_offset.pyx":121 * dataOut[j] = last * j += 1 * return dataOut[:j] # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __pyx_t_9 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_v_dataOut), 0, __pyx_v_j); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_r = __pyx_t_9; __pyx_t_9 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dataOut.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("byte_offset.analyseCython", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dataOut.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_dataOut); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":190 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< * # This implementation of getbuffer is geared towards Cython * # requirements, and does not yet fullfill the PEP. */ static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_v_copy_shape; int __pyx_v_i; int __pyx_v_ndim; int __pyx_v_endian_detector; int __pyx_v_little_endian; int __pyx_v_t; char *__pyx_v_f; PyArray_Descr *__pyx_v_descr = 0; int __pyx_v_offset; int __pyx_v_hasfields; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; PyObject *__pyx_t_8 = NULL; char *__pyx_t_9; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getbuffer__"); if (__pyx_v_info != NULL) { __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); } /* "numpy.pxd":196 * # of flags * * if info == NULL: return # <<<<<<<<<<<<<< * * cdef int copy_shape, i, ndim */ __pyx_t_1 = (__pyx_v_info == NULL); if (__pyx_t_1) { __pyx_r = 0; goto __pyx_L0; goto __pyx_L5; } __pyx_L5:; /* "numpy.pxd":199 * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * */ __pyx_v_endian_detector = 1; /* "numpy.pxd":200 * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * * ndim = PyArray_NDIM(self) */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":202 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< * * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self)); /* "numpy.pxd":204 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: */ __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_1) { /* "numpy.pxd":205 * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< * else: * copy_shape = 0 */ __pyx_v_copy_shape = 1; goto __pyx_L6; } /*else*/ { /* "numpy.pxd":207 * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) */ __pyx_v_copy_shape = 0; } __pyx_L6:; /* "numpy.pxd":209 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") */ __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS); if (__pyx_t_1) { /* "numpy.pxd":210 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not C contiguous") * */ __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS)); __pyx_t_3 = __pyx_t_2; } else { __pyx_t_3 = __pyx_t_1; } if (__pyx_t_3) { /* "numpy.pxd":211 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; /* "numpy.pxd":213 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") */ __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS); if (__pyx_t_3) { /* "numpy.pxd":214 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not Fortran contiguous") * */ __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS)); __pyx_t_2 = __pyx_t_1; } else { __pyx_t_2 = __pyx_t_3; } if (__pyx_t_2) { /* "numpy.pxd":215 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_4), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L8; } __pyx_L8:; /* "numpy.pxd":217 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< * info.ndim = ndim * if copy_shape: */ __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self)); /* "numpy.pxd":218 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< * if copy_shape: * # Allocate new buffer for strides and shape info. */ __pyx_v_info->ndim = __pyx_v_ndim; /* "numpy.pxd":219 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. */ if (__pyx_v_copy_shape) { /* "numpy.pxd":222 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< * info.shape = info.strides + ndim * for i in range(ndim): */ __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); /* "numpy.pxd":223 * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); /* "numpy.pxd":224 * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] */ __pyx_t_5 = __pyx_v_ndim; for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; /* "numpy.pxd":225 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< * info.shape[i] = PyArray_DIMS(self)[i] * else: */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]); /* "numpy.pxd":226 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< * else: * info.strides = PyArray_STRIDES(self) */ (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]); } goto __pyx_L9; } /*else*/ { /* "numpy.pxd":228 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL */ __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))); /* "numpy.pxd":229 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) */ __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_v_self))); } __pyx_L9:; /* "numpy.pxd":230 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) */ __pyx_v_info->suboffsets = NULL; /* "numpy.pxd":231 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< * info.readonly = not PyArray_ISWRITEABLE(self) * */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self)); /* "numpy.pxd":232 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< * * cdef int t */ __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self))); /* "numpy.pxd":235 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< * cdef dtype descr = self.descr * cdef list stack */ __pyx_v_f = NULL; /* "numpy.pxd":236 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< * cdef list stack * cdef int offset */ __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr)); __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr; /* "numpy.pxd":240 * cdef int offset * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< * * if not hasfields and not copy_shape: */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); /* "numpy.pxd":242 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None */ __pyx_t_2 = (!__pyx_v_hasfields); if (__pyx_t_2) { __pyx_t_3 = (!__pyx_v_copy_shape); __pyx_t_1 = __pyx_t_3; } else { __pyx_t_1 = __pyx_t_2; } if (__pyx_t_1) { /* "numpy.pxd":244 * if not hasfields and not copy_shape: * # do not call releasebuffer * info.obj = None # <<<<<<<<<<<<<< * else: * # need to call releasebuffer */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = Py_None; goto __pyx_L12; } /*else*/ { /* "numpy.pxd":247 * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< * * if not hasfields: */ __Pyx_INCREF(__pyx_v_self); __Pyx_GIVEREF(__pyx_v_self); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = __pyx_v_self; } __pyx_L12:; /* "numpy.pxd":249 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == '>' and little_endian) or */ __pyx_t_1 = (!__pyx_v_hasfields); if (__pyx_t_1) { /* "numpy.pxd":250 * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): */ __pyx_v_t = __pyx_v_descr->type_num; /* "numpy.pxd":251 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == '>' and little_endian) or # <<<<<<<<<<<<<< * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_1 = (__pyx_v_descr->byteorder == '>'); if (__pyx_t_1) { __pyx_t_2 = __pyx_v_little_endian; } else { __pyx_t_2 = __pyx_t_1; } if (!__pyx_t_2) { /* "numpy.pxd":252 * t = descr.type_num * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" */ __pyx_t_1 = (__pyx_v_descr->byteorder == '<'); if (__pyx_t_1) { __pyx_t_3 = (!__pyx_v_little_endian); __pyx_t_7 = __pyx_t_3; } else { __pyx_t_7 = __pyx_t_1; } __pyx_t_1 = __pyx_t_7; } else { __pyx_t_1 = __pyx_t_2; } if (__pyx_t_1) { /* "numpy.pxd":253 * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_6), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L14; } __pyx_L14:; /* "numpy.pxd":254 * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" */ __pyx_t_1 = (__pyx_v_t == NPY_BYTE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__b; goto __pyx_L15; } /* "numpy.pxd":255 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" */ __pyx_t_1 = (__pyx_v_t == NPY_UBYTE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__B; goto __pyx_L15; } /* "numpy.pxd":256 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" */ __pyx_t_1 = (__pyx_v_t == NPY_SHORT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__h; goto __pyx_L15; } /* "numpy.pxd":257 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" */ __pyx_t_1 = (__pyx_v_t == NPY_USHORT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__H; goto __pyx_L15; } /* "numpy.pxd":258 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" */ __pyx_t_1 = (__pyx_v_t == NPY_INT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__i; goto __pyx_L15; } /* "numpy.pxd":259 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" */ __pyx_t_1 = (__pyx_v_t == NPY_UINT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__I; goto __pyx_L15; } /* "numpy.pxd":260 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" */ __pyx_t_1 = (__pyx_v_t == NPY_LONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__l; goto __pyx_L15; } /* "numpy.pxd":261 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" */ __pyx_t_1 = (__pyx_v_t == NPY_ULONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__L; goto __pyx_L15; } /* "numpy.pxd":262 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" */ __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__q; goto __pyx_L15; } /* "numpy.pxd":263 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" */ __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Q; goto __pyx_L15; } /* "numpy.pxd":264 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" */ __pyx_t_1 = (__pyx_v_t == NPY_FLOAT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__f; goto __pyx_L15; } /* "numpy.pxd":265 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" */ __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__d; goto __pyx_L15; } /* "numpy.pxd":266 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" */ __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__g; goto __pyx_L15; } /* "numpy.pxd":267 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" */ __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zf; goto __pyx_L15; } /* "numpy.pxd":268 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" */ __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zd; goto __pyx_L15; } /* "numpy.pxd":269 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f = "O" * else: */ __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zg; goto __pyx_L15; } /* "numpy.pxd":270 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_1 = (__pyx_v_t == NPY_OBJECT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__O; goto __pyx_L15; } /*else*/ { /* "numpy.pxd":272 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * info.format = f * return */ __pyx_t_4 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_7), __pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_8)); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_8)); __Pyx_GIVEREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L15:; /* "numpy.pxd":273 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< * return * else: */ __pyx_v_info->format = __pyx_v_f; /* "numpy.pxd":274 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< * else: * info.format = stdlib.malloc(_buffer_format_string_len) */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L13; } /*else*/ { /* "numpy.pxd":276 * return * else: * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< * info.format[0] = '^' # Native data types, manual alignment * offset = 0 */ __pyx_v_info->format = ((char *)malloc(255)); /* "numpy.pxd":277 * else: * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = '^' # Native data types, manual alignment # <<<<<<<<<<<<<< * offset = 0 * f = _util_dtypestring(descr, info.format + 1, */ (__pyx_v_info->format[0]) = '^'; /* "numpy.pxd":278 * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = '^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, */ __pyx_v_offset = 0; /* "numpy.pxd":281 * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, * &offset) # <<<<<<<<<<<<<< * f[0] = 0 # Terminate format string * */ __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_9; /* "numpy.pxd":282 * info.format + _buffer_format_string_len, * &offset) * f[0] = 0 # Terminate format string # <<<<<<<<<<<<<< * * def __releasebuffer__(ndarray self, Py_buffer* info): */ (__pyx_v_f[0]) = 0; } __pyx_L13:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) { __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; } goto __pyx_L2; __pyx_L0:; if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) { __Pyx_GOTREF(Py_None); __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; } __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_descr); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":284 * f[0] = 0 # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) */ static CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ static CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__"); /* "numpy.pxd":285 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self)); if (__pyx_t_1) { /* "numpy.pxd":286 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * stdlib.free(info.format) # <<<<<<<<<<<<<< * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) */ free(__pyx_v_info->format); goto __pyx_L5; } __pyx_L5:; /* "numpy.pxd":287 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * stdlib.free(info.strides) * # info.shape was stored after info.strides in the same block */ __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_1) { /* "numpy.pxd":288 * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< * # info.shape was stored after info.strides in the same block * */ free(__pyx_v_info->strides); goto __pyx_L6; } __pyx_L6:; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":764 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1"); /* "numpy.pxd":765 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":767 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2"); /* "numpy.pxd":768 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":770 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3"); /* "numpy.pxd":771 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":773 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4"); /* "numpy.pxd":774 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":776 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5"); /* "numpy.pxd":777 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":779 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. */ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { PyArray_Descr *__pyx_v_child = 0; int __pyx_v_endian_detector; int __pyx_v_little_endian; PyObject *__pyx_v_fields = 0; PyObject *__pyx_v_childname = NULL; PyObject *__pyx_v_new_offset = NULL; PyObject *__pyx_v_t = NULL; char *__pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; long __pyx_t_10; char *__pyx_t_11; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_util_dtypestring"); /* "numpy.pxd":786 * cdef int delta_offset * cdef tuple i * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * cdef tuple fields */ __pyx_v_endian_detector = 1; /* "numpy.pxd":787 * cdef tuple i * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * cdef tuple fields * */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":790 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields */ if (unlikely(((PyObject *)__pyx_v_descr->names) == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_1 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; __Pyx_XDECREF(__pyx_v_childname); __pyx_v_childname = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":791 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< * child, new_offset = fields * */ __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF(((PyObject *)__pyx_v_fields)); __pyx_v_fields = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "numpy.pxd":792 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< * * if (end - f) - (new_offset - offset[0]) < 15: */ if (likely(PyTuple_CheckExact(((PyObject *)__pyx_v_fields)))) { PyObject* sequence = ((PyObject *)__pyx_v_fields); if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) { if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2); else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence)); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 792; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); } else { __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 792; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 792; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF(((PyObject *)__pyx_v_child)); __pyx_v_child = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_v_new_offset); __pyx_v_new_offset = __pyx_t_4; __pyx_t_4 = 0; /* "numpy.pxd":794 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * */ __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { /* "numpy.pxd":795 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == '>' and little_endian) or */ __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "numpy.pxd":797 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == '>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_6 = (__pyx_v_child->byteorder == '>'); if (__pyx_t_6) { __pyx_t_7 = __pyx_v_little_endian; } else { __pyx_t_7 = __pyx_t_6; } if (!__pyx_t_7) { /* "numpy.pxd":798 * * if ((child.byteorder == '>' and little_endian) or * (child.byteorder == '<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * # One could encode it in the format string and have Cython */ __pyx_t_6 = (__pyx_v_child->byteorder == '<'); if (__pyx_t_6) { __pyx_t_8 = (!__pyx_v_little_endian); __pyx_t_9 = __pyx_t_8; } else { __pyx_t_9 = __pyx_t_6; } __pyx_t_6 = __pyx_t_9; } else { __pyx_t_6 = __pyx_t_7; } if (__pyx_t_6) { /* "numpy.pxd":799 * if ((child.byteorder == '>' and little_endian) or * (child.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "numpy.pxd":809 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< * f[0] = 120 # "x"; pad byte * f += 1 */ while (1) { __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!__pyx_t_6) break; /* "numpy.pxd":810 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< * f += 1 * offset[0] += 1 */ (__pyx_v_f[0]) = 120; /* "numpy.pxd":811 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< * offset[0] += 1 * */ __pyx_v_f = (__pyx_v_f + 1); /* "numpy.pxd":812 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< * * offset[0] += child.itemsize */ __pyx_t_10 = 0; (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + 1); } /* "numpy.pxd":814 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< * * if not PyDataType_HASFIELDS(child): */ __pyx_t_10 = 0; (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + __pyx_v_child->elsize); /* "numpy.pxd":816 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: */ __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child)); if (__pyx_t_6) { /* "numpy.pxd":817 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") */ __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_XDECREF(__pyx_v_t); __pyx_v_t = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":818 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") * */ __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5); if (__pyx_t_6) { /* "numpy.pxd":819 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L10; } __pyx_L10:; /* "numpy.pxd":822 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" */ __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 98; goto __pyx_L11; } /* "numpy.pxd":823 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" */ __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 66; goto __pyx_L11; } /* "numpy.pxd":824 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" */ __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 104; goto __pyx_L11; } /* "numpy.pxd":825 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" */ __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 72; goto __pyx_L11; } /* "numpy.pxd":826 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" */ __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 105; goto __pyx_L11; } /* "numpy.pxd":827 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" */ __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 73; goto __pyx_L11; } /* "numpy.pxd":828 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" */ __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 108; goto __pyx_L11; } /* "numpy.pxd":829 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 76; goto __pyx_L11; } /* "numpy.pxd":830 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" */ __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 113; goto __pyx_L11; } /* "numpy.pxd":831 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 81; goto __pyx_L11; } /* "numpy.pxd":832 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" */ __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 102; goto __pyx_L11; } /* "numpy.pxd":833 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf */ __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 100; goto __pyx_L11; } /* "numpy.pxd":834 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd */ __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 103; goto __pyx_L11; } /* "numpy.pxd":835 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg */ __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 102; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /* "numpy.pxd":836 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" */ __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 100; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /* "numpy.pxd":837 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: */ __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 103; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /* "numpy.pxd":838 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 79; goto __pyx_L11; } /*else*/ { /* "numpy.pxd":840 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * f += 1 * else: */ __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_7), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_5)); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5)); __Pyx_GIVEREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L11:; /* "numpy.pxd":841 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< * else: * # Cython ignores struct boundary information ("T{...}"), */ __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L9; } /*else*/ { /* "numpy.pxd":845 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< * return f * */ __pyx_t_11 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_11 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_11; } __pyx_L9:; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":846 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_v_f; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_child); __Pyx_XDECREF(__pyx_v_fields); __Pyx_XDECREF(__pyx_v_childname); __Pyx_XDECREF(__pyx_v_new_offset); __Pyx_XDECREF(__pyx_v_t); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":961 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: */ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { PyObject *__pyx_v_baseptr; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("set_array_base"); /* "numpy.pxd":963 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< * baseptr = NULL * else: */ __pyx_t_1 = (__pyx_v_base == Py_None); if (__pyx_t_1) { /* "numpy.pxd":964 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< * else: * Py_INCREF(base) # important to do this before decref below! */ __pyx_v_baseptr = NULL; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":966 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< * baseptr = base * Py_XDECREF(arr.base) */ Py_INCREF(__pyx_v_base); /* "numpy.pxd":967 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< * Py_XDECREF(arr.base) * arr.base = baseptr */ __pyx_v_baseptr = ((PyObject *)__pyx_v_base); } __pyx_L3:; /* "numpy.pxd":968 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< * arr.base = baseptr * */ Py_XDECREF(__pyx_v_arr->base); /* "numpy.pxd":969 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< * * cdef inline object get_array_base(ndarray arr): */ __pyx_v_arr->base = __pyx_v_baseptr; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":971 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base"); /* "numpy.pxd":972 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None * else: */ __pyx_t_1 = (__pyx_v_arr->base == NULL); if (__pyx_t_1) { /* "numpy.pxd":973 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< * else: * return arr.base */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(Py_None); __pyx_r = Py_None; goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":975 * return None * else: * return arr.base # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); __pyx_r = ((PyObject *)__pyx_v_arr->base); goto __pyx_L0; } __pyx_L3:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, __Pyx_NAMESTR("byte_offset"), __Pyx_DOCSTR(__pyx_k_13), /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 1, 0, 0}, {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0}, {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0}, {&__pyx_kp_s_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 0, 1, 0}, {&__pyx_kp_s_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 0, 1, 0}, {&__pyx_kp_s_17, __pyx_k_17, sizeof(__pyx_k_17), 0, 0, 1, 0}, {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0}, {&__pyx_kp_u_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 1, 0, 0}, {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0}, {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0}, {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0}, {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1}, {&__pyx_n_s____author__, __pyx_k____author__, sizeof(__pyx_k____author__), 0, 0, 1, 1}, {&__pyx_n_s____contact__, __pyx_k____contact__, sizeof(__pyx_k____contact__), 0, 0, 1, 1}, {&__pyx_n_s____copyright__, __pyx_k____copyright__, sizeof(__pyx_k____copyright__), 0, 0, 1, 1}, {&__pyx_n_s____license__, __pyx_k____license__, sizeof(__pyx_k____license__), 0, 0, 1, 1}, {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, {&__pyx_n_s__analyseCython, __pyx_k__analyseCython, sizeof(__pyx_k__analyseCython), 0, 0, 1, 1}, {&__pyx_n_s__byte_offset, __pyx_k__byte_offset, sizeof(__pyx_k__byte_offset), 0, 0, 1, 1}, {&__pyx_n_s__csize, __pyx_k__csize, sizeof(__pyx_k__csize), 0, 0, 1, 1}, {&__pyx_n_s__cstream, __pyx_k__cstream, sizeof(__pyx_k__cstream), 0, 0, 1, 1}, {&__pyx_n_s__current, __pyx_k__current, sizeof(__pyx_k__current), 0, 0, 1, 1}, {&__pyx_n_s__dataOut, __pyx_k__dataOut, sizeof(__pyx_k__dataOut), 0, 0, 1, 1}, {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1}, {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1}, {&__pyx_n_s__int64, __pyx_k__int64, sizeof(__pyx_k__int64), 0, 0, 1, 1}, {&__pyx_n_s__j, __pyx_k__j, sizeof(__pyx_k__j), 0, 0, 1, 1}, {&__pyx_n_s__key0, __pyx_k__key0, sizeof(__pyx_k__key0), 0, 0, 1, 1}, {&__pyx_n_s__key8, __pyx_k__key8, sizeof(__pyx_k__key8), 0, 0, 1, 1}, {&__pyx_n_s__last, __pyx_k__last, sizeof(__pyx_k__last), 0, 0, 1, 1}, {&__pyx_n_s__lenStream, __pyx_k__lenStream, sizeof(__pyx_k__lenStream), 0, 0, 1, 1}, {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1}, {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1}, {&__pyx_n_s__size, __pyx_k__size, sizeof(__pyx_k__size), 0, 0, 1, 1}, {&__pyx_n_s__stream, __pyx_k__stream, sizeof(__pyx_k__stream), 0, 0, 1, 1}, {&__pyx_n_s__tmp64, __pyx_k__tmp64, sizeof(__pyx_k__tmp64), 0, 0, 1, 1}, {&__pyx_n_s__tmp64a, __pyx_k__tmp64a, sizeof(__pyx_k__tmp64a), 0, 0, 1, 1}, {&__pyx_n_s__tmp64b, __pyx_k__tmp64b, sizeof(__pyx_k__tmp64b), 0, 0, 1, 1}, {&__pyx_n_s__tmp64c, __pyx_k__tmp64c, sizeof(__pyx_k__tmp64c), 0, 0, 1, 1}, {&__pyx_n_s__tmp64d, __pyx_k__tmp64d, sizeof(__pyx_k__tmp64d), 0, 0, 1, 1}, {&__pyx_n_s__tmp64e, __pyx_k__tmp64e, sizeof(__pyx_k__tmp64e), 0, 0, 1, 1}, {&__pyx_n_s__tmp64f, __pyx_k__tmp64f, sizeof(__pyx_k__tmp64f), 0, 0, 1, 1}, {&__pyx_n_s__tmp64g, __pyx_k__tmp64g, sizeof(__pyx_k__tmp64g), 0, 0, 1, 1}, {&__pyx_n_s__tmp8, __pyx_k__tmp8, sizeof(__pyx_k__tmp8), 0, 0, 1, 1}, {&__pyx_n_s__utmp8a, __pyx_k__utmp8a, sizeof(__pyx_k__utmp8a), 0, 0, 1, 1}, {&__pyx_n_s__utmp8b, __pyx_k__utmp8b, sizeof(__pyx_k__utmp8b), 0, 0, 1, 1}, {&__pyx_n_s__utmp8c, __pyx_k__utmp8c, sizeof(__pyx_k__utmp8c), 0, 0, 1, 1}, {&__pyx_n_s__utmp8d, __pyx_k__utmp8d, sizeof(__pyx_k__utmp8d), 0, 0, 1, 1}, {&__pyx_n_s__utmp8e, __pyx_k__utmp8e, sizeof(__pyx_k__utmp8e), 0, 0, 1, 1}, {&__pyx_n_s__utmp8f, __pyx_k__utmp8f, sizeof(__pyx_k__utmp8f), 0, 0, 1, 1}, {&__pyx_n_s__utmp8g, __pyx_k__utmp8g, sizeof(__pyx_k__utmp8g), 0, 0, 1, 1}, {&__pyx_n_s__zeros, __pyx_k__zeros, sizeof(__pyx_k__zeros), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants"); /* "numpy.pxd":211 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_k_tuple_2 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_2); __Pyx_INCREF(((PyObject *)__pyx_kp_u_1)); PyTuple_SET_ITEM(__pyx_k_tuple_2, 0, ((PyObject *)__pyx_kp_u_1)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_1)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_2)); /* "numpy.pxd":215 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_k_tuple_4 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_4); __Pyx_INCREF(((PyObject *)__pyx_kp_u_3)); PyTuple_SET_ITEM(__pyx_k_tuple_4, 0, ((PyObject *)__pyx_kp_u_3)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_3)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_4)); /* "numpy.pxd":253 * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_k_tuple_6 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_6); __Pyx_INCREF(((PyObject *)__pyx_kp_u_5)); PyTuple_SET_ITEM(__pyx_k_tuple_6, 0, ((PyObject *)__pyx_kp_u_5)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_6)); /* "numpy.pxd":795 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == '>' and little_endian) or */ __pyx_k_tuple_9 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_9)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_9); __Pyx_INCREF(((PyObject *)__pyx_kp_u_8)); PyTuple_SET_ITEM(__pyx_k_tuple_9, 0, ((PyObject *)__pyx_kp_u_8)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_8)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_9)); /* "numpy.pxd":799 * if ((child.byteorder == '>' and little_endian) or * (child.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_k_tuple_10 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_10); __Pyx_INCREF(((PyObject *)__pyx_kp_u_5)); PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, ((PyObject *)__pyx_kp_u_5)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10)); /* "numpy.pxd":819 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_k_tuple_12 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_12); __Pyx_INCREF(((PyObject *)__pyx_kp_u_11)); PyTuple_SET_ITEM(__pyx_k_tuple_12, 0, ((PyObject *)__pyx_kp_u_11)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_11)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12)); /* "byte_offset.pyx":25 * * @cython.boundscheck(False) * def analyseCython(bytes stream not None, size=None): # <<<<<<<<<<<<<< * """ * Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) */ __pyx_k_tuple_18 = PyTuple_New(28); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_18); __Pyx_INCREF(((PyObject *)__pyx_n_s__stream)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 0, ((PyObject *)__pyx_n_s__stream)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__stream)); __Pyx_INCREF(((PyObject *)__pyx_n_s__size)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 1, ((PyObject *)__pyx_n_s__size)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__size)); __Pyx_INCREF(((PyObject *)__pyx_n_s__i)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 2, ((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i)); __Pyx_INCREF(((PyObject *)__pyx_n_s__j)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 3, ((PyObject *)__pyx_n_s__j)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__j)); __Pyx_INCREF(((PyObject *)__pyx_n_s__last)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 4, ((PyObject *)__pyx_n_s__last)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__last)); __Pyx_INCREF(((PyObject *)__pyx_n_s__current)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 5, ((PyObject *)__pyx_n_s__current)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__current)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp8)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 6, ((PyObject *)__pyx_n_s__tmp8)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp8)); __Pyx_INCREF(((PyObject *)__pyx_n_s__utmp8a)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 7, ((PyObject *)__pyx_n_s__utmp8a)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__utmp8a)); __Pyx_INCREF(((PyObject *)__pyx_n_s__utmp8b)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 8, ((PyObject *)__pyx_n_s__utmp8b)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__utmp8b)); __Pyx_INCREF(((PyObject *)__pyx_n_s__utmp8c)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 9, ((PyObject *)__pyx_n_s__utmp8c)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__utmp8c)); __Pyx_INCREF(((PyObject *)__pyx_n_s__utmp8d)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 10, ((PyObject *)__pyx_n_s__utmp8d)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__utmp8d)); __Pyx_INCREF(((PyObject *)__pyx_n_s__utmp8e)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 11, ((PyObject *)__pyx_n_s__utmp8e)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__utmp8e)); __Pyx_INCREF(((PyObject *)__pyx_n_s__utmp8f)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 12, ((PyObject *)__pyx_n_s__utmp8f)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__utmp8f)); __Pyx_INCREF(((PyObject *)__pyx_n_s__utmp8g)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 13, ((PyObject *)__pyx_n_s__utmp8g)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__utmp8g)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 14, ((PyObject *)__pyx_n_s__tmp64)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64a)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 15, ((PyObject *)__pyx_n_s__tmp64a)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64a)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64b)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 16, ((PyObject *)__pyx_n_s__tmp64b)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64b)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64c)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 17, ((PyObject *)__pyx_n_s__tmp64c)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64c)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64d)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 18, ((PyObject *)__pyx_n_s__tmp64d)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64d)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64e)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 19, ((PyObject *)__pyx_n_s__tmp64e)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64e)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64f)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 20, ((PyObject *)__pyx_n_s__tmp64f)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64f)); __Pyx_INCREF(((PyObject *)__pyx_n_s__tmp64g)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 21, ((PyObject *)__pyx_n_s__tmp64g)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__tmp64g)); __Pyx_INCREF(((PyObject *)__pyx_n_s__key8)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 22, ((PyObject *)__pyx_n_s__key8)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__key8)); __Pyx_INCREF(((PyObject *)__pyx_n_s__key0)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 23, ((PyObject *)__pyx_n_s__key0)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__key0)); __Pyx_INCREF(((PyObject *)__pyx_n_s__csize)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 24, ((PyObject *)__pyx_n_s__csize)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__csize)); __Pyx_INCREF(((PyObject *)__pyx_n_s__lenStream)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 25, ((PyObject *)__pyx_n_s__lenStream)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__lenStream)); __Pyx_INCREF(((PyObject *)__pyx_n_s__cstream)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 26, ((PyObject *)__pyx_n_s__cstream)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__cstream)); __Pyx_INCREF(((PyObject *)__pyx_n_s__dataOut)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 27, ((PyObject *)__pyx_n_s__dataOut)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__dataOut)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18)); __pyx_k_codeobj_19 = (PyObject*)__Pyx_PyCode_New(2, 0, 28, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_20, __pyx_n_s__analyseCython, 25, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC initbyte_offset(void); /*proto*/ PyMODINIT_FUNC initbyte_offset(void) #else PyMODINIT_FUNC PyInit_byte_offset(void); /*proto*/ PyMODINIT_FUNC PyInit_byte_offset(void) #endif { PyObject *__pyx_t_1 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_byte_offset(void)"); if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("byte_offset"), __pyx_methods, __Pyx_DOCSTR(__pyx_k_13), 0, PYTHON_API_VERSION); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; #if PY_MAJOR_VERSION < 3 Py_INCREF(__pyx_m); #endif __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_module_is_main_byte_offset) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ /*--- Type import code ---*/ __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ /* "byte_offset.pyx":14 * """ * * __author__ = "Jrme Kieffer" # <<<<<<<<<<<<<< * __contact__ = "jerome.kieffer@esrf.eu" * __license__ = "GPLv3+" */ if (PyObject_SetAttr(__pyx_m, __pyx_n_s____author__, ((PyObject *)__pyx_kp_s_14)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "byte_offset.pyx":15 * * __author__ = "Jrme Kieffer" * __contact__ = "jerome.kieffer@esrf.eu" # <<<<<<<<<<<<<< * __license__ = "GPLv3+" * __copyright__ = "2010, European Synchrotron Radiation Facility, Grenoble, France" */ if (PyObject_SetAttr(__pyx_m, __pyx_n_s____contact__, ((PyObject *)__pyx_kp_s_15)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "byte_offset.pyx":16 * __author__ = "Jrme Kieffer" * __contact__ = "jerome.kieffer@esrf.eu" * __license__ = "GPLv3+" # <<<<<<<<<<<<<< * __copyright__ = "2010, European Synchrotron Radiation Facility, Grenoble, France" * */ if (PyObject_SetAttr(__pyx_m, __pyx_n_s____license__, ((PyObject *)__pyx_kp_s_16)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "byte_offset.pyx":17 * __contact__ = "jerome.kieffer@esrf.eu" * __license__ = "GPLv3+" * __copyright__ = "2010, European Synchrotron Radiation Facility, Grenoble, France" # <<<<<<<<<<<<<< * * */ if (PyObject_SetAttr(__pyx_m, __pyx_n_s____copyright__, ((PyObject *)__pyx_kp_s_17)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "byte_offset.pyx":21 * * cimport numpy * import numpy # <<<<<<<<<<<<<< * import cython * */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__numpy, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "byte_offset.pyx":25 * * @cython.boundscheck(False) * def analyseCython(bytes stream not None, size=None): # <<<<<<<<<<<<<< * """ * Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_11byte_offset_analyseCython, NULL, __pyx_n_s__byte_offset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__analyseCython, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "byte_offset.pyx":1 * """ # <<<<<<<<<<<<<< * Authors: Jerome Kieffer, ESRF * Email: jerome.kieffer@esrf.eu */ __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; /* "numpy.pxd":971 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { __Pyx_AddTraceback("init byte_offset", __pyx_clineno, __pyx_lineno, __pyx_filename); Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init byte_offset"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* CYTHON_REFNANNY */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AS_STRING(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; } else { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) { #else if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) { #endif goto invalid_keyword_type; } else { for (name = first_kw_arg; *name; name++) { #if PY_MAJOR_VERSION >= 3 if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && PyUnicode_Compare(**name, key) == 0) break; #else if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && _PyString_Eq(**name, key)) break; #endif } if (*name) { values[name-argnames] = value; } else { /* unexpected keyword found */ for (name=argnames; name != first_kw_arg; name++) { if (**name == key) goto arg_passed_twice; #if PY_MAJOR_VERSION >= 3 if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice; #else if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && _PyString_Eq(**name, key)) goto arg_passed_twice; #endif } if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } } } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, **name); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%s() got an unexpected keyword argument '%s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (!type) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (Py_TYPE(obj) == type) return 1; } else { if (PyObject_TypeCheck(obj, type)) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%s' has incorrect type (expected %s, got %s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) { if (dict != __pyx_b) { PyErr_Clear(); result = PyObject_GetAttr(__pyx_b, name); } if (!result) { PyErr_SetObject(PyExc_NameError, name); } } return result; } static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (likely(PyObject_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { unsigned int n = 1; return *(unsigned char*)(&n) != 0; } static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, __Pyx_BufFmt_StackElem* stack, __Pyx_TypeInfo* type) { stack[0].field = &ctx->root; stack[0].parent_offset = 0; ctx->root.type = type; ctx->root.name = "buffer dtype"; ctx->root.offset = 0; ctx->head = stack; ctx->head->field = &ctx->root; ctx->fmt_offset = 0; ctx->head->parent_offset = 0; ctx->new_packmode = '@'; ctx->enc_packmode = '@'; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->is_complex = 0; while (type->typegroup == 'S') { ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = 0; type = type->fields->type; } } static int __Pyx_BufFmt_ParseNumber(const char** ts) { int count; const char* t = *ts; if (*t < '0' || *t > '9') { return -1; } else { count = *t++ - '0'; while (*t >= '0' && *t < '9') { count *= 10; count += *t++ - '0'; } } *ts = t; return count; } static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { PyErr_Format(PyExc_ValueError, "Unexpected format string character: '%c'", ch); } static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { switch (ch) { case 'b': return "'char'"; case 'B': return "'unsigned char'"; case 'h': return "'short'"; case 'H': return "'unsigned short'"; case 'i': return "'int'"; case 'I': return "'unsigned int'"; case 'l': return "'long'"; case 'L': return "'unsigned long'"; case 'q': return "'long long'"; case 'Q': return "'unsigned long long'"; case 'f': return (is_complex ? "'complex float'" : "'float'"); case 'd': return (is_complex ? "'complex double'" : "'double'"); case 'g': return (is_complex ? "'complex long double'" : "'long double'"); case 'T': return "a struct"; case 'O': return "Python object"; case 'P': return "a pointer"; case 0: return "end"; default: return "unparseable format string"; } } static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': return 1; case 'h': case 'H': return 2; case 'i': case 'I': case 'l': case 'L': return 4; case 'q': case 'Q': return 8; case 'f': return (is_complex ? 8 : 4); case 'd': return (is_complex ? 16 : 8); case 'g': { PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); return 0; } case 'O': case 'P': return sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { switch (ch) { case 'c': case 'b': case 'B': return 1; case 'h': case 'H': return sizeof(short); case 'i': case 'I': return sizeof(int); case 'l': case 'L': return sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(float) * (is_complex ? 2 : 1); case 'd': return sizeof(double) * (is_complex ? 2 : 1); case 'g': return sizeof(long double) * (is_complex ? 2 : 1); case 'O': case 'P': return sizeof(void*); default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } typedef struct { char c; short x; } __Pyx_st_short; typedef struct { char c; int x; } __Pyx_st_int; typedef struct { char c; long x; } __Pyx_st_long; typedef struct { char c; float x; } __Pyx_st_float; typedef struct { char c; double x; } __Pyx_st_double; typedef struct { char c; long double x; } __Pyx_st_longdouble; typedef struct { char c; void *x; } __Pyx_st_void_p; #ifdef HAVE_LONG_LONG typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': return 1; case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_st_float) - sizeof(float); case 'd': return sizeof(__Pyx_st_double) - sizeof(double); case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { switch (ch) { case 'c': case 'b': case 'h': case 'i': case 'l': case 'q': return 'I'; case 'B': case 'H': case 'I': case 'L': case 'Q': return 'U'; case 'f': case 'd': case 'g': return (is_complex ? 'C' : 'R'); case 'O': return 'O'; case 'P': return 'P'; default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { if (ctx->head == NULL || ctx->head->field == &ctx->root) { const char* expected; const char* quote; if (ctx->head == NULL) { expected = "end"; quote = ""; } else { expected = ctx->head->field->type->name; quote = "'"; } PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected %s%s%s but got %s", quote, expected, quote, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); } else { __Pyx_StructField* field = ctx->head->field; __Pyx_StructField* parent = (ctx->head - 1)->field; PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), parent->type->name, field->name); } } static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { char group; size_t size, offset; if (ctx->enc_type == 0) return 0; group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); do { __Pyx_StructField* field = ctx->head->field; __Pyx_TypeInfo* type = field->type; if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); } else { size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); } if (ctx->enc_packmode == '@') { size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); size_t align_mod_offset; if (align_at == 0) return -1; align_mod_offset = ctx->fmt_offset % align_at; if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; } if (type->size != size || type->typegroup != group) { if (type->typegroup == 'C' && type->fields != NULL) { /* special case -- treat as struct rather than complex number */ size_t parent_offset = ctx->head->parent_offset + field->offset; ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = parent_offset; continue; } __Pyx_BufFmt_RaiseExpected(ctx); return -1; } offset = ctx->head->parent_offset + field->offset; if (ctx->fmt_offset != offset) { PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch; next field is at offset %"PY_FORMAT_SIZE_T"d but %"PY_FORMAT_SIZE_T"d expected", (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); return -1; } ctx->fmt_offset += size; --ctx->enc_count; /* Consume from buffer string */ /* Done checking, move to next field, pushing or popping struct stack if needed */ while (1) { if (field == &ctx->root) { ctx->head = NULL; if (ctx->enc_count != 0) { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } break; /* breaks both loops as ctx->enc_count == 0 */ } ctx->head->field = ++field; if (field->type == NULL) { --ctx->head; field = ctx->head->field; continue; } else if (field->type->typegroup == 'S') { size_t parent_offset = ctx->head->parent_offset + field->offset; if (field->type->fields->type == NULL) continue; /* empty struct */ field = field->type->fields; ++ctx->head; ctx->head->field = field; ctx->head->parent_offset = parent_offset; break; } else { break; } } } while (ctx->enc_count); ctx->enc_type = 0; ctx->is_complex = 0; return 0; } static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { int got_Z = 0; while (1) { switch(*ts) { case 0: if (ctx->enc_type != 0 && ctx->head == NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; if (ctx->head != NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } return ts; case ' ': case 10: case 13: ++ts; break; case '<': if (!__Pyx_IsLittleEndian()) { PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '>': case '!': if (__Pyx_IsLittleEndian()) { PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '=': case '@': case '^': ctx->new_packmode = *ts++; break; case 'T': /* substruct */ { const char* ts_after_sub; size_t i, struct_count = ctx->new_count; ctx->new_count = 1; ++ts; if (*ts != '{') { PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); return NULL; } ++ts; ts_after_sub = ts; for (i = 0; i != struct_count; ++i) { ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); if (!ts_after_sub) return NULL; } ts = ts_after_sub; } break; case '}': /* end of substruct; either repeat or move on */ ++ts; return ts; case 'x': if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->fmt_offset += ctx->new_count; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->enc_packmode = ctx->new_packmode; ++ts; break; case 'Z': got_Z = 1; ++ts; if (*ts != 'f' && *ts != 'd' && *ts != 'g') { __Pyx_BufFmt_RaiseUnexpectedChar('Z'); return NULL; } /* fall through */ case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': case 'l': case 'L': case 'q': case 'Q': case 'f': case 'd': case 'g': case 'O': if (ctx->enc_type == *ts && got_Z == ctx->is_complex && ctx->enc_packmode == ctx->new_packmode) { /* Continue pooling same type */ ctx->enc_count += ctx->new_count; } else { /* New type */ if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_count = ctx->new_count; ctx->enc_packmode = ctx->new_packmode; ctx->enc_type = *ts; ctx->is_complex = got_Z; } ++ts; ctx->new_count = 1; got_Z = 0; break; case ':': ++ts; while(*ts != ':') ++ts; ++ts; break; default: { int number = __Pyx_BufFmt_ParseNumber(&ts); if (number == -1) { /* First char was not a digit */ PyErr_Format(PyExc_ValueError, "Does not understand character buffer dtype format string ('%c')", *ts); return NULL; } ctx->new_count = (size_t)number; } } } } static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) { buf->buf = NULL; buf->obj = NULL; buf->strides = __Pyx_zeros; buf->shape = __Pyx_zeros; buf->suboffsets = __Pyx_minusones; } static CYTHON_INLINE int __Pyx_GetBufferAndValidate( Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) { if (obj == Py_None || obj == NULL) { __Pyx_ZeroBuffer(buf); return 0; } buf->buf = NULL; if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail; if (buf->ndim != nd) { PyErr_Format(PyExc_ValueError, "Buffer has wrong number of dimensions (expected %d, got %d)", nd, buf->ndim); goto fail; } if (!cast) { __Pyx_BufFmt_Context ctx; __Pyx_BufFmt_Init(&ctx, stack, dtype); if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; } if ((unsigned)buf->itemsize != dtype->size) { PyErr_Format(PyExc_ValueError, "Item size of buffer (%"PY_FORMAT_SIZE_T"d byte%s) does not match size of '%s' (%"PY_FORMAT_SIZE_T"d byte%s)", buf->itemsize, (buf->itemsize > 1) ? "s" : "", dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); goto fail; } if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; return 0; fail:; __Pyx_ZeroBuffer(buf); return -1; } static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { if (info->buf == NULL) return; if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; __Pyx_ReleaseBuffer(info); } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { /* cause is unused */ Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); /* First, check the traceback argument, replacing None with NULL. */ if (tb == Py_None) { Py_DECREF(tb); tb = 0; } else if (tb != NULL && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } /* Next, replace a missing value with None */ if (value == NULL) { value = Py_None; Py_INCREF(value); } #if PY_VERSION_HEX < 0x02050000 if (!PyClass_Check(type)) #else if (!PyType_Check(type)) #endif { /* Raising an instance. The value should be a dummy. */ if (value != Py_None) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } /* Normalize to raise , */ Py_DECREF(value); value = type; #if PY_VERSION_HEX < 0x02050000 if (PyInstance_Check(type)) { type = (PyObject*) ((PyInstanceObject*)type)->in_class; Py_INCREF(type); } else { type = 0; PyErr_SetString(PyExc_TypeError, "raise: exception must be an old-style class or instance"); goto raise_error; } #else type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } #endif } __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else /* Python 3+ */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (!PyExceptionClass_Check(type)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } if (!value) { value = PyObject_CallObject(type, NULL); } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { PyThreadState *tstate = PyThreadState_GET(); PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } } bad: return; } #endif static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %"PY_FORMAT_SIZE_T"d value%s to unpack", index, (index == 1) ? "" : "s"); } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %"PY_FORMAT_SIZE_T"d)", expected); } static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { if (t == Py_None) { __Pyx_RaiseNoneNotIterableError(); } else if (PyTuple_GET_SIZE(t) < index) { __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); } else { __Pyx_RaiseTooManyValuesError(index); } } #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); #endif if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pf_5numpy_7ndarray___getbuffer__(obj, view, flags); else { PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name); return -1; } } static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyObject* obj = view->obj; if (obj) { #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) {PyBuffer_Release(view); return;} #endif if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarray_1__releasebuffer__(obj, view); Py_DECREF(obj); view->obj = NULL; } } #endif static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) { PyObject *py_import = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!py_import) goto bad; if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; #if PY_VERSION_HEX >= 0x02050000 { PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); } #else if (level>0) { PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4."); goto bad; } module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, NULL); #endif bad: Py_XDECREF(empty_list); Py_XDECREF(py_import); Py_XDECREF(empty_dict); return module; } #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return ::std::complex< float >(x, y); } #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return x + y*(__pyx_t_float_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { __pyx_t_float_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrtf(z.real*z.real + z.imag*z.imag); #else return hypotf(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { float denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(a, a); case 3: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, a); case 4: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_absf(a); theta = atan2f(a.imag, a.real); } lnr = logf(r); z_r = expf(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cosf(z_theta); z.imag = z_r * sinf(z_theta); return z; } #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return ::std::complex< double >(x, y); } #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return x + y*(__pyx_t_double_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { __pyx_t_double_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrt(z.real*z.real + z.imag*z.imag); #else return hypot(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { double denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(a, a); case 3: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, a); case 4: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_abs(a); theta = atan2(a.imag, a.real); } lnr = log(r); z_r = exp(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cos(z_theta); z.imag = z_r * sin(z_theta); return z; } #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { const unsigned char neg_one = (unsigned char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned char" : "value too large to convert to unsigned char"); } return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { const unsigned short neg_one = (unsigned short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned short" : "value too large to convert to unsigned short"); } return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { const unsigned int neg_one = (unsigned int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned int" : "value too large to convert to unsigned int"); } return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { const char neg_one = (char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to char" : "value too large to convert to char"); } return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { const short neg_one = (short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to short" : "value too large to convert to short"); } return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { const signed char neg_one = (signed char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed char" : "value too large to convert to signed char"); } return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { const signed short neg_one = (signed short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed short" : "value too large to convert to signed short"); } return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { const signed int neg_one = (signed int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed int" : "value too large to convert to signed int"); } return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { const unsigned long neg_one = (unsigned long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)PyLong_AsUnsignedLong(x); } else { return (unsigned long)PyLong_AsLong(x); } } else { unsigned long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned long)-1; val = __Pyx_PyInt_AsUnsignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x); } } else { unsigned PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned PY_LONG_LONG)-1; val = __Pyx_PyInt_AsUnsignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { const long neg_one = (long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)PyLong_AsUnsignedLong(x); } else { return (long)PyLong_AsLong(x); } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long)-1; val = __Pyx_PyInt_AsLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (PY_LONG_LONG)PyLong_AsLongLong(x); } } else { PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (PY_LONG_LONG)-1; val = __Pyx_PyInt_AsLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { const signed long neg_one = (signed long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)PyLong_AsUnsignedLong(x); } else { return (signed long)PyLong_AsLong(x); } } else { signed long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed long)-1; val = __Pyx_PyInt_AsSignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (signed PY_LONG_LONG)PyLong_AsLongLong(x); } } else { signed PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed PY_LONG_LONG)-1; val = __Pyx_PyInt_AsSignedLongLong(tmp); Py_DECREF(tmp); return val; } } static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); #if PY_VERSION_HEX < 0x02050000 return PyErr_Warn(NULL, message); #else return PyErr_WarnEx(NULL, message, 1); #endif } return 0; } #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict) { PyObject *py_module = 0; PyObject *result = 0; PyObject *py_name = 0; char warning[200]; py_module = __Pyx_ImportModule(module_name); if (!py_module) goto bad; py_name = __Pyx_PyIdentifier_FromString(class_name); if (!py_name) goto bad; result = PyObject_GetAttr(py_module, py_name); Py_DECREF(py_name); py_name = 0; Py_DECREF(py_module); py_module = 0; if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%s.%s is not a type object", module_name, class_name); goto bad; } if (!strict && ((PyTypeObject *)result)->tp_basicsize > (Py_ssize_t)size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility", module_name, class_name); #if PY_VERSION_HEX < 0x02050000 if (PyErr_Warn(NULL, warning) < 0) goto bad; #else if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; #endif } else if (((PyTypeObject *)result)->tp_basicsize != (Py_ssize_t)size) { PyErr_Format(PyExc_ValueError, "%s.%s has the wrong size, try recompiling", module_name, class_name); goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(py_module); Py_XDECREF(result); return NULL; } #endif #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; py_name = __Pyx_PyIdentifier_FromString(name); if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif #include "compile.h" #include "frameobject.h" #include "traceback.h" static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno, int __pyx_lineno, const char *__pyx_filename) { PyObject *py_srcfile = 0; PyObject *py_funcname = 0; PyObject *py_globals = 0; PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(__pyx_filename); #else py_srcfile = PyUnicode_FromString(__pyx_filename); #endif if (!py_srcfile) goto bad; if (__pyx_clineno) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; py_code = __Pyx_PyCode_New( 0, /*int argcount,*/ 0, /*int kwonlyargcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ __pyx_lineno, /*int firstlineno,*/ __pyx_empty_bytes /*PyObject *lnotab*/ ); if (!py_code) goto bad; py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = __pyx_lineno; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); Py_XDECREF(py_code); Py_XDECREF(py_frame); } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else /* Python 3+ has unicode identifiers */ if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } /* Type Conversion Functions */ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_VERSION_HEX < 0x03000000 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_VERSION_HEX < 0x03000000 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%s__ returned non-%s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject* x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { #if PY_VERSION_HEX < 0x02050000 if (ival <= LONG_MAX) return PyInt_FromLong((long)ival); else { unsigned char *bytes = (unsigned char *) &ival; int one = 1; int little = (int)*(unsigned char*)&one; return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); } #else return PyInt_FromSize_t(ival); #endif } static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { return (size_t)-1; } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t)-1; } return (size_t)val; } #endif /* Py_PYTHON_H */ fabio-0.1.3/src/ccp4_pack.c0000644000175000017500000010035512137541670016153 0ustar jeromejerome00000000000000/* Fabio Mar345 ccp4_pack decompressor Copyright (C) 2007-2009 Henning O. Sorensen & Erik Knudsen 2012 ESRF This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* part of this code is freely adaped from pack_c.c from CCP4 distribution * (which is also LGPL). The original author is Jan Pieter Abrahams * jpa@mrc-lmb.cam.ac.uk This file contains functions capable of compressing and decompressing images. It is especially suited for X-ray diffraction patterns, or other image formats in which orthogonal pixels contain "grey-levels" and vary smoothly accross the image. Clean images measured by a MAR-research image plate scanner containing two bytes per pixel can be compressed by a factor of 3.5 to 4.5 . Since the images are encoded in a byte-stream, there should be no problem concerning big- or little ended machines: both will produce an identical packed image. Compression is achieved by first calculating the differences between every pixel and the truncated value of four of its neighbours. For example: the difference for a pixel at img[x, y] is: img[x, y] - (int) (img[x-1, y-1] + img[x-1, y] + img[x-1, y+1] + img[x, y-1]) / 4 After calculating the differences, they are encoded in a packed array. A packed array consists of consequitive chunks which have the following format: - Three bits containing the logarithm base 2 of the number of pixels encoded in the chunk. - Three bits defining the number of bits used to encode one element of the chunk. The value of these three bits is used as index in a lookup table to get the actual number of bits of the elements of the chunk. Note: in version 2, there are four bits in this position!! This allows more efficient packing of synchrotron data! The routines in this sourcefile are backwards compatible. JPA, 26 June 1995 - The truncated pixel differences. To compress an image, call pack_wordimage_c() or pack_longimage_c(). These will append the packed image to any header information already written to disk (take care that the file containing this information is closed before calling). To decompress an image, call readpack_word_c() or readpack_long_c(). These functions will find the start of the packed image themselves, irrespective of the header format. Jan Pieter Abrahams, 6 Jan 1993 */ #ifndef _MSC_VER #include #else #include "stdint.h" #endif #include #include #include #include #define PACKIDENTIFIER "\nCCP4 packed image, X: %04d, Y: %04d\n" /* This string defines the start of a packed image. An image file is scanned until this string is encountered, the size of the unpacked image is determined from the values of X and Y (which are written out as formatted ascii numbers), and the packed image is expected to start immediately after the null-character ending the string. */ #define V2IDENTIFIER "\nCCP4 packed image V2, X: %04d, Y: %04d\n" /* This string defines the start of a packed image. An image file is scanned until this string is encountered, the size of the unpacked image is determined from the values of X and Y (which are written out as formatted ascii numbers), and the packed image is expected to start immediately after the null-character ending the string. */ #define PACKBUFSIZ BUFSIZ /* Size of internal buffer in which the packed array is stored during transit form an unpacked image to a packed image on disk. It is set to the size used by the buffered io-routines given in , but it could be anything. */ #define DIFFBUFSIZ 16384L /* Size of the internal buffer in which the differences between neighbouring pixels are stored prior to compression. The image is therefore compressed in DIFFBUFSIZ chunks. Decompression does not need to know what DIFFBUFSIZ was when the image was compressed. By increasing this value, the image can be compressed into a packed image which is a few bytes smaller. Do not decrease the value of DIFFBUFSIZ below 128L. */ #define CCP4_PCK_BLOCK_HEADER_LENGTH 6 #define CCP4_PCK_BLOCK_HEADER_LENGTH_V2 8 /*array translating the number of errors per block*/ static unsigned int CCP4_PCK_ERR_COUNT[] = {1,2,4,8,16,32,64,128}; /*array translating the number of bits per error*/ static unsigned int CCP4_PCK_BIT_COUNT[]= {0,4,5,6,7,8,16,32}; /*array translating the number of errors per block - can use shifts as well actually*/ static unsigned int CCP4_PCK_ERR_COUNT_V2[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}; /*array translating the number of bits per error*/ static unsigned int CCP4_PCK_BIT_COUNT_V2[]= {0,4,5,6,7,8,9,10,11,12,13,14,15,16,32}; static const unsigned char CCP4_PCK_MASK[]={0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}; static const unsigned int CCP4_PCK_MASK_16[]={0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF}; static const unsigned long CCP4_PCK_MASK_32[]={0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF}; #define pfail_nonzero(a) if ((a)) return NULL; #define max(x, y) (((x) > (y)) ? (x) : (y)) #define min(x, y) (((x) < (y)) ? (x) : (y)) #define shift_left(x, n) (((x) & CCP4_PCK_MASK_32[32 - (n)]) << (n)) /* This macro is included because the C standard does not properly define a left shift: on some machines the bits which are pushed out at the left are popped back in at the right. By masking, the macro prevents this behaviour. If you are sure that your machine does not pops bits back in, you can speed up the code insignificantly by taking out the masking. */ #define shift_right(x, n) (((x) >> (n)) & CCP4_PCK_MASK_32[32 - (n)]) void *mar345_read_data(FILE *file, int ocount, int dim1, int dim2); void *mar345_read_data_string(char *instring, int ocount, int dim1, int dim2); void *ccp4_unpack(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void *ccp4_unpack_v2(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void *ccp4_unpack_string(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void *ccp4_unpack_v2_string(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void *mar345_read_data_string(char *instring, int ocount, int dim1, int dim2){ /* first process overflow bytes - for now we just ignore them * these are stored in 64 byte records*/ int orecords=(int)(ocount/8.0+0.875); int *odata,x,y,version=0; char *c,cbuffer[64]=""; char *t_; unsigned int *unpacked_array; odata=(int*)malloc(64*8*orecords); if (!odata) return NULL; //pfail_nonzero (orecords-fread(odata,64,orecords,file)); memcpy(odata, instring, 64*orecords); t_ = instring + (64*orecords); /* there is no stdout in a gui, sorry*/ //printf("have %d overflows in %d recs\n",ocount,orecords); /* now after they have been read find the CCP4.....string and compare to dim1*/ c=cbuffer; while((*c)!=EOF){ if (c==cbuffer+63){ c=cbuffer; } // *c=(char)getc(file); *c = (char) *t_; t_++; /*set the next character to a \0 so the string is always terminated*/ *(c+1)='\0'; if (*c=='\n'){ /*check for the CCP- string*/ x=y=0; sscanf(cbuffer,"CCP4 packed image, X: %04d, Y: %04d", &x,&y); if (x==dim1 || y ==dim2){ version=1; break; } x=y=0; sscanf(cbuffer,"CCP4 packed image V2, X: %04d, Y: %04d", &x,&y); if (x==dim1 || y ==dim2){ version=2; break; } c=cbuffer; } else c++; } //printf("%d %d %d %d version %d\n",x,y,dim1,dim2,version); /* allocate memory for the arrays*/ unpacked_array=(unsigned int*) malloc(sizeof(unsigned int)*dim1*dim2); if (!unpacked_array) return NULL; /*relay to whichever version of ccp4_unpack is appropriate*/ switch(version){ case 1: ccp4_unpack_string(unpacked_array,(void*)t_,dim1,dim2,0); break; case 2: ccp4_unpack_v2_string(unpacked_array,(void*)t_,dim1,dim2,0); break; default: return NULL; } //printf("finished, %d \n",dim1*dim2*sizeof(unsigned int)); /*handle overflows*/ while (ocount>0){ unsigned int adress,value; adress=odata[2*ocount-2]; if (adress){ value=odata[2*ocount-1]; /*adresses start at 1*/ // printf("address %d %d\n",address,value); unpacked_array[adress-1]=value; } ocount--; } return unpacked_array; } /**unpack a new style mar345 image a'la what is done in CBFlib * assumes the file is already positioned after the ascii header * Perhaps the positioning should be done here as well. */ void * mar345_read_data(FILE *file, int ocount, int dim1, int dim2){ /* first process overflow bytes - for now we just ignore them * these are stored in 64 byte records*/ int orecords=(int)(ocount/8.0+0.875); int *odata,x,y,version=0; char *c,cbuffer[64]=""; unsigned int *unpacked_array; odata=(int*)malloc(64*8*orecords); if (!odata) return NULL; pfail_nonzero (orecords-fread(odata,64,orecords,file)); /* there is no stdout in a gui, sorry printf("have %d overflows in %d recs\n",ocount,orecords); */ /* now after they have been read find the CCP4.....string and compare to dim1*/ c=cbuffer; while((*c)!=EOF){ if (c==cbuffer+63){ c=cbuffer; } *c=(char)getc(file); /*set the next character to a \0 so the string is always terminated*/ *(c+1)='\0'; if (*c=='\n'){ /*check for the CCP- string*/ x=y=0; sscanf(cbuffer,"CCP4 packed image, X: %04d, Y: %04d", &x,&y); if (x==dim1 || y ==dim2){ version=1; break; } x=y=0; sscanf(cbuffer,"CCP4 packed image V2, X: %04d, Y: %04d", &x,&y); if (x==dim1 || y ==dim2){ version=2; break; } c=cbuffer; } else c++; } /* allocate memory for the arrays*/ unpacked_array=(unsigned int*) malloc(sizeof(unsigned int)*dim1*dim2); if (!unpacked_array) return NULL; /*relay to whichever version of ccp4_unpack is appropriate*/ switch(version){ case 1: ccp4_unpack(unpacked_array,(void*)file,dim1,dim2,0); break; case 2: ccp4_unpack_v2(unpacked_array,(void*)file,dim1,dim2,0); break; default: return NULL; } /*handle overflows*/ while (ocount>0){ unsigned int adress,value; adress=odata[2*ocount-2]; if (adress){ value=odata[2*ocount-1]; /*adresses start at 1*/ unpacked_array[adress-1]=value; } ocount--; } return unpacked_array; } /**unpack a ccp4-style packed array into the memory location pointed to by unpacked_array * if this is null allocate memory and return a pointer to it * \return NULL if unsuccessful * TODO change this to read directly from the FILE to not waste memory*/ void * ccp4_unpack( void *unpacked_array, void *packed, size_t dim1,size_t dim2, size_t max_num_int ){ uint8_t t_,t2,_conv; int err_val,bit_offset,num_error=0,num_bits=0,read_bits; int i; int x4,x3,x2,x1; unsigned int *int_arr=(unsigned int *) unpacked_array; FILE *instream=(FILE *)packed; //printf("file "); /*if no maximum integers are give read the whole nine yards*/ if (max_num_int==0){ max_num_int=dim1*dim2; } /*if a NULL pointer is passed allocate some new memory*/ if (unpacked_array==NULL){ if ( (unpacked_array=malloc(sizeof(unsigned int)*max_num_int))==NULL){ errno=ENOMEM; return NULL; } } /*packed bits always start at byte boundary after header*/ bit_offset=0; /*read the first byte of the current_block*/ t_=(unsigned char)fgetc(instream); //printf("%02X \n",t_); /*while less than num ints have been unpacked*/ i=0; while(i=(8-CCP4_PCK_BLOCK_HEADER_LENGTH)){ /*we'll be reading past the next byte boundary*/ t2=(unsigned char ) fgetc(instream); t_=(t_>>bit_offset) + ((unsigned char)t2 <<(8-bit_offset) ); num_error=CCP4_PCK_ERR_COUNT[t_ & CCP4_PCK_MASK[3]]; num_bits=CCP4_PCK_BIT_COUNT[(t_>>3) & CCP4_PCK_MASK[3]]; bit_offset=CCP4_PCK_BLOCK_HEADER_LENGTH+bit_offset-8; t_=t2; }else{ num_error=CCP4_PCK_ERR_COUNT[(t_>>bit_offset) & CCP4_PCK_MASK[3]]; num_bits=CCP4_PCK_BIT_COUNT[(t_>>(3+bit_offset)) & CCP4_PCK_MASK[3]]; bit_offset+=CCP4_PCK_BLOCK_HEADER_LENGTH; } } else { /*reading the data in the block*/ while(num_error>0){ err_val=0; read_bits=0; while(read_bits=8) { /*read to next full byte boundary and convert*/ _conv= (t_>>bit_offset) & CCP4_PCK_MASK[8-bit_offset]; err_val|= (unsigned int) _conv << read_bits; read_bits+=(8-bit_offset); /*have read to byte boundary - set offset to 0 and read next byte*/ bit_offset=0; t_=(unsigned char) fgetc(instream); } else { /*must stop before next byte boundary - also this means that these are the last bits in the error*/ _conv= (t_ >>bit_offset) & CCP4_PCK_MASK[num_bits-read_bits]; err_val|= _conv<dim1){ /*the current pixel is not in the first row - averaging is possible *n.b. the averaging calculation is performed in the 2's complement domain*/ x4=(int16_t) int_arr[i-1]; x3=(int16_t) int_arr[i-dim1+1]; x2=(int16_t) int_arr[i-dim1]; x1=(int16_t) int_arr[i-dim1-1]; int_arr[i]=(uint16_t) (err_val + (x4 + x3 + x2 + x1 +2) /4 ); i=i; } else if (i!=0){ /*current pixel is in the 1st row but is not first pixel*/ int_arr[i]=(uint16_t) (err_val + int_arr[i-1]); } else { int_arr[i]=(uint16_t) err_val; } i++; num_error--; } }/*else*/ } return (void *) unpacked_array; } void * ccp4_unpack_string( void *unpacked_array, void *packed, size_t dim1,size_t dim2, size_t max_num_int ){ uint8_t t_,t2,_conv; int err_val,bit_offset,num_error=0,num_bits=0,read_bits; int i; int x4,x3,x2,x1; unsigned int *int_arr; char *instream = (char *)packed; // printf("string "); // int toto; // for (toto=0;toto<16;toto++){ // printf("%02X ",(unsigned char)instream[toto]); // } // printf("\n"); /*if no maximum integers are give read the whole nine yards*/ if (max_num_int==0){ max_num_int=dim1*dim2; } /*if a NULL pointer is passed allocate some new memory*/ if (unpacked_array==NULL){ if ( (unpacked_array=malloc(sizeof(unsigned int)*max_num_int))==NULL){ errno=ENOMEM; return NULL; } } int_arr = (unsigned int *) unpacked_array; /*packed bits always start at byte boundary after header*/ bit_offset=0; /*read the first byte of the current_block*/ t_=(unsigned char)*instream; instream++; //printf("%02X \n",t_); /*while less than num ints have been unpacked*/ i=0; while(i=(8-CCP4_PCK_BLOCK_HEADER_LENGTH)){ /*we'll be reading past the next byte boundary*/ t2=(unsigned char ) *instream; instream++; t_=(t_>>bit_offset) + ((unsigned char)t2 <<(8-bit_offset) ); num_error=CCP4_PCK_ERR_COUNT[t_ & CCP4_PCK_MASK[3]]; num_bits=CCP4_PCK_BIT_COUNT[(t_>>3) & CCP4_PCK_MASK[3]]; bit_offset=CCP4_PCK_BLOCK_HEADER_LENGTH+bit_offset-8; t_=t2; }else{ num_error=CCP4_PCK_ERR_COUNT[(t_>>bit_offset) & CCP4_PCK_MASK[3]]; num_bits=CCP4_PCK_BIT_COUNT[(t_>>(3+bit_offset)) & CCP4_PCK_MASK[3]]; bit_offset+=CCP4_PCK_BLOCK_HEADER_LENGTH; } } else { /*reading the data in the block*/ while(num_error>0){ err_val=0; read_bits=0; while(read_bits=8) { /*read to next full byte boundary and convert*/ _conv= (t_>>bit_offset) & CCP4_PCK_MASK[8-bit_offset]; err_val|= (unsigned int) _conv << read_bits; read_bits+=(8-bit_offset); /*have read to byte boundary - set offset to 0 and read next byte*/ bit_offset=0; t_=(unsigned char) *instream; instream++; } else { /*must stop before next byte boundary - also this means that these are the last bits in the error*/ _conv= (t_ >>bit_offset) & CCP4_PCK_MASK[num_bits-read_bits]; err_val|= _conv<dim1){ /*the current pixel is not in the first row - averaging is possible *n.b. the averaging calculation is performed in the 2's complement domain*/ x4=(int16_t) int_arr[i-1]; x3=(int16_t) int_arr[i-dim1+1]; x2=(int16_t) int_arr[i-dim1]; x1=(int16_t) int_arr[i-dim1-1]; int_arr[i]=(uint16_t) (err_val + (x4 + x3 + x2 + x1 +2) /4 ); i=i; } else if (i!=0){ /*current pixel is in the 1st row but is not first pixel*/ int_arr[i]=(uint16_t) (err_val + int_arr[i-1]); } else { int_arr[i]=(uint16_t) err_val; } i++; num_error--; } }/*else*/ } return (void *) unpacked_array; } void * ccp4_unpack_v2( void *unpacked_array, void *packed, size_t dim1,size_t dim2, size_t max_num_int){ uint8_t t_,t2,_conv; int err_val,bit_offset,num_error=0,num_bits=0,read_bits; int i; unsigned int x4=0,x3=0,x2=0,x1=0; unsigned int *int_arr=(unsigned int *) unpacked_array; FILE *instream=(FILE *)packed; /*if no maximum integers are give read the whole nine yards*/ if (max_num_int==0){ max_num_int=dim1*dim2; } /*if a NULL pointer is passed allocate some new memory*/ if (unpacked_array==NULL){ if ( (unpacked_array=malloc(sizeof(unsigned int)*max_num_int))==NULL){ errno=ENOMEM; return NULL; } } /*packed bits always start at byte boundary after header*/ bit_offset=0; /*read the first byte of the current_block*/ t_=(unsigned char)fgetc(instream); /*while less than num ints have been unpacked*/ i=0; while(i=(8-CCP4_PCK_BLOCK_HEADER_LENGTH_V2)){ /*we'll be reading past the next byte boundary*/ t2=(unsigned char ) fgetc(instream); t_=(t_>>bit_offset) + ((unsigned char)t2 <<(8-bit_offset) ); num_error=CCP4_PCK_ERR_COUNT_V2[t_ & CCP4_PCK_MASK[4]]; num_bits=CCP4_PCK_BIT_COUNT_V2[(t_>>4) & CCP4_PCK_MASK[4]]; bit_offset=CCP4_PCK_BLOCK_HEADER_LENGTH_V2+bit_offset-8; t_=t2; }else{ num_error=CCP4_PCK_ERR_COUNT_V2[ (t_>>bit_offset) & CCP4_PCK_MASK[4] ]; num_bits=CCP4_PCK_BIT_COUNT_V2[ (t_>>(4+bit_offset)) & CCP4_PCK_MASK[4] ]; bit_offset+=CCP4_PCK_BLOCK_HEADER_LENGTH_V2; } } else { /*reading the data in the block*/ while(num_error>0){ err_val=0; read_bits=0; while(read_bits=8) { /*read to next full byte boundary and convert*/ _conv= (t_>>bit_offset) & CCP4_PCK_MASK[8-bit_offset]; err_val|= (unsigned int) _conv << read_bits; read_bits+=(8-bit_offset); /*have read to byte boundary - set offset to 0 and read next byte*/ bit_offset=0; t_=(unsigned char) fgetc(instream); } else { /*must stop before next byte boundary - also this means that these are the last bits in the error*/ _conv= (t_ >>bit_offset) & CCP4_PCK_MASK[num_bits-read_bits]; err_val|= _conv<dim1){ /*the current pixel is not in the first row - averaging is possible *n.b. the averaging calculation is performed in the 2's complement domain*/ x4=(int16_t) int_arr[i-1]; x3=(int16_t) int_arr[i-dim1+1]; x2=(int16_t) int_arr[i-dim1]; x1=(int16_t) int_arr[i-dim1-1]; int_arr[i]=(uint16_t) (err_val + (x4 + x3 + x2 + x1 +2) /4 ); i=i; } else if (i!=0){ /*current pixel is in the 1st row but is not first pixel*/ int_arr[i]=(uint16_t) (err_val + int_arr[i-1]); } else { int_arr[i]=(uint16_t) err_val; } i++; num_error--; } }/*else*/ } return (void *) unpacked_array; } void * ccp4_unpack_v2_string( void *unpacked_array, void *packed, size_t dim1,size_t dim2, size_t max_num_int){ uint8_t t_,t2,_conv; int err_val,bit_offset,num_error=0,num_bits=0,read_bits; int i; unsigned int x4=0,x3=0,x2=0,x1=0; unsigned int *int_arr=(unsigned int *) unpacked_array; char *instream=(char *)packed; /*if no maximum integers are give read the whole nine yards*/ if (max_num_int==0){ max_num_int=dim1*dim2; } /*if a NULL pointer is passed allocate some new memory*/ if (unpacked_array==NULL){ if ( (unpacked_array=malloc(sizeof(unsigned int)*max_num_int))==NULL){ errno=ENOMEM; return NULL; } } /*packed bits always start at byte boundary after header*/ bit_offset=0; /*read the first byte of the current_block*/ t_=(unsigned char)*instream; instream++; /*while less than num ints have been unpacked*/ i=0; while(i=(8-CCP4_PCK_BLOCK_HEADER_LENGTH_V2)){ /*we'll be reading past the next byte boundary*/ t2=(unsigned char ) *instream; instream++; t_=(t_>>bit_offset) + ((unsigned char)t2 <<(8-bit_offset) ); num_error=CCP4_PCK_ERR_COUNT_V2[t_ & CCP4_PCK_MASK[4]]; num_bits=CCP4_PCK_BIT_COUNT_V2[(t_>>4) & CCP4_PCK_MASK[4]]; bit_offset=CCP4_PCK_BLOCK_HEADER_LENGTH_V2+bit_offset-8; t_=t2; }else{ num_error=CCP4_PCK_ERR_COUNT_V2[ (t_>>bit_offset) & CCP4_PCK_MASK[4] ]; num_bits=CCP4_PCK_BIT_COUNT_V2[ (t_>>(4+bit_offset)) & CCP4_PCK_MASK[4] ]; bit_offset+=CCP4_PCK_BLOCK_HEADER_LENGTH_V2; } } else { /*reading the data in the block*/ while(num_error>0){ err_val=0; read_bits=0; while(read_bits=8) { /*read to next full byte boundary and convert*/ _conv= (t_>>bit_offset) & CCP4_PCK_MASK[8-bit_offset]; err_val|= (unsigned int) _conv << read_bits; read_bits+=(8-bit_offset); /*have read to byte boundary - set offset to 0 and read next byte*/ bit_offset=0; t_=(unsigned char) *instream; instream++; } else { /*must stop before next byte boundary - also this means that these are the last bits in the error*/ _conv= (t_ >>bit_offset) & CCP4_PCK_MASK[num_bits-read_bits]; err_val|= _conv<dim1){ /*the current pixel is not in the first row - averaging is possible *n.b. the averaging calculation is performed in the 2's complement domain*/ x4=(int16_t) int_arr[i-1]; x3=(int16_t) int_arr[i-dim1+1]; x2=(int16_t) int_arr[i-dim1]; x1=(int16_t) int_arr[i-dim1-1]; int_arr[i]=(uint16_t) (err_val + (x4 + x3 + x2 + x1 +2) /4 ); i=i; } else if (i!=0){ /*current pixel is in the 1st row but is not first pixel*/ int_arr[i]=(uint16_t) (err_val + int_arr[i-1]); } else { int_arr[i]=(uint16_t) err_val; } i++; num_error--; } }/*else*/ } return (void *) unpacked_array; } /* ############################################################################# ################### Everything to write Mar345 ############################## ############################################################################# */ /* Returns the number of bits neccesary to encode the longword-array 'chunk' of size 'n' The size in bits of one encoded element can be 0, 4, 5, 6, 7, 8, 16 or 32. */ int bits( int32_t *chunk, int n){ int size, maxsize, i; for (i = 1, maxsize = abs(chunk[0]); i < n; ++i) maxsize = max(maxsize, abs(chunk[i])); if (maxsize == 0) size = 0; else if (maxsize < 8) size = 4 * n; else if (maxsize < 16) size = 5 * n; else if (maxsize < 32) size = 6 * n; else if (maxsize < 64) size = 7 * n; else if (maxsize < 128) size = 8 * n; else if (maxsize < 32768) size = 16 * n; else size = 32 * n; return(size); } /* Calculates the difference of WORD-sized pixels of an image with the truncated mean value of four of its neighbours. 'x' is the number of fast coordinates of the image 'img', 'y' is the number of slow coordinates, 'diffs' will contain the differences, 'done' defines the index of the pixel where calculating the differences should start. A pointer to the last difference is returned. Maximally DIFFBUFSIZ differences are returned in 'diffs'.*/ int *diff_words( short int *word, int x, int y, int *diffs, int done){ int i = 0; int tot = x * y; if (done == 0) { *diffs = word[0]; ++diffs; ++done; ++i;} while ((done <= x) && (i < DIFFBUFSIZ)) { *diffs = word[done] - word[done - 1]; ++diffs; ++done; ++i;} while ((done < tot) && (i < DIFFBUFSIZ)) { *diffs = word[done] - (word[done - 1] + word[done - x + 1] + word[done - x] + word[done - x - 1] + 2) / 4; ++diffs; ++done; ++i;} return(--diffs); } /* Pack 'n' WORDS, starting with 'lng[0]' into the packed array 'target'. The elements of such a packed array do not obey BYTE-boundaries, but are put one behind the other without any spacing. Only the 'bitsiz' number of least significant bits are used. The starting bit of 'target' is 'bit' (bits range from 0 to 7). After completion of 'pack_words()', both '**target' and '*bit' are updated and define the next position in 'target' from which packing could continue. */ void pack_longs(int32_t *lng, int n, char **target, int *bit, int size){ int32_t mask, window; int valids, i, temp; int temp_bit = *bit; char *temp_target = *target; if (size > 0) { mask = CCP4_PCK_MASK_32[size]; for (i = 0; i < n; ++i) { window = lng[i] & mask; valids = size; if (temp_bit == 0) *temp_target = (char) window; else { temp = shift_left(window, temp_bit); *temp_target |= temp;} window = shift_right(window, 8 - temp_bit); valids = valids - (8 - temp_bit); if (valids < 0) temp_bit += size; else { while (valids > 0) { *++temp_target = (char) window; window = shift_right(window, 8); valids -= 8;} temp_bit = 8 + valids;} if (valids == 0) { temp_bit = 0; ++temp_target;}} *target = temp_target; *bit = (*bit + (size * n)) % 8;} } /* Packs 'nmbr' LONGs starting at 'lng[0]' into a packed array of 'bitsize' sized elements. If the internal buffer in which the array is packed is full, it is flushed to 'file', making room for more of the packed array. If ('lng == NULL'), the buffer is flushed a swell. */ void pack_chunk(int32_t *lng, int nmbr, int bitsize, FILE *packfile){ static int32_t bitsize_encode[33] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7}; int32_t descriptor[2], i, j; static char *buffer = NULL; static char *buffree = NULL; static int bitmark; if (buffer == NULL) { buffree = buffer = (char *) malloc(PACKBUFSIZ); bitmark = 0;} if (lng != NULL) { for (i = nmbr, j = 0; i > 1; i /= 2, ++j); descriptor[0] = j; descriptor[1] = bitsize_encode[bitsize]; if ((buffree - buffer) > (PACKBUFSIZ - (130 * 4))) { fwrite(buffer, sizeof(char), buffree - buffer, packfile); buffer[0] = buffree[0]; buffree = buffer;} pack_longs(descriptor, 2, &buffree, &bitmark, 3); pack_longs(lng, nmbr, &buffree, &bitmark, bitsize);} else { int len=buffree-buffer; if (bitmark!=0) len++; fwrite(buffer, sizeof(char), len, packfile); free((void *) buffer); buffer = NULL;}} /* Pack image 'img', containing 'x * y' WORD-sized pixels into 'filename'. */ void pack_wordimage_copen(short int *img, int x, int y, FILE *packfile){ int chunksiz, packsiz, nbits, next_nbits, tot_nbits; int32_t buffer[DIFFBUFSIZ]; int32_t *diffs = buffer; int32_t *end = diffs - 1; int32_t done = 0; fprintf(packfile, PACKIDENTIFIER, x, y); while (done < (x * y)) { end = diff_words(img, x, y, buffer, done); done += (end - buffer) + 1; diffs = buffer; while (diffs <= end) { packsiz = 0; chunksiz = 1; nbits = bits(diffs, 1); while (packsiz == 0) { if (end <= (diffs + chunksiz * 2)) packsiz = chunksiz; else { next_nbits = bits(diffs + chunksiz, chunksiz); tot_nbits = 2 * max(nbits, next_nbits); if (tot_nbits >= (nbits + next_nbits + 6)) packsiz = chunksiz; else { nbits = tot_nbits; if (chunksiz == 64) packsiz = 128; else chunksiz *= 2;}}} pack_chunk(diffs, packsiz, nbits / packsiz, packfile); diffs += packsiz;}} pack_chunk(NULL, 0, 0, packfile); } void pack_wordimage_c( short int *img, int x, int y, char *filename){ FILE *packfile = fopen(filename, "ab"); if (packfile == NULL) { fprintf(stderr,"The file %s cannot be created!\n ...giving up...\n", filename); exit(1); } else { pack_wordimage_copen(img, x, y, packfile); fclose(packfile); } } fabio-0.1.3/src/mar345_IO.pyx0000644000175000017500000001241512137541667016331 0ustar jeromejerome00000000000000""" New Cython version of mar345_io for preparing the migration to Python3 Compressor & decompressor for "pack" algorithm by JPA, binding to CCP4 libraries Warning: decompressor is just a cython porting of mar345_io, but in cython so (soon) python3 compliant. Future: make those algorithm actually generate strings not go via files; it will allow a broader use of the algorithm. """ __authors__ = ["Jerome Kieffer", "Gael Goret"] __contact__ = "jerome.kieffer@esrf.eu" __license__ = "LGPLv3+" __copyright__ = "2012, European Synchrotron Radiation Facility, Grenoble, France" import cython cimport numpy import numpy import os,tempfile from libc.string cimport memcpy #from libc.stdlib cimport free, malloc cdef extern from "ccp4_pack.h": void* mar345_read_data_string(char *instream, int ocount, int dim1, int dim2) nogil void pack_wordimage_c(short int*, int , int , char*) nogil void* ccp4_unpack_string (void *, void *, size_t, size_t, size_t) nogil void* ccp4_unpack_v2_string(void *, void *, size_t, size_t, size_t) nogil @cython.boundscheck(False) def compress_pck(numpy.ndarray inputArray not None): """ @param inputArray: numpy array as input @param filename: file to write data to """ cdef long size = inputArray.size cdef int dim0, dim1, i, j, fd, ret cdef char* name assert inputArray.ndim == 2, "shape is 2D" dim0 = inputArray.shape[0] dim1 = inputArray.shape[1] cdef numpy.ndarray[numpy.uint16_t, ndim = 1] data = numpy.ascontiguousarray(inputArray.astype(numpy.uint16).ravel(), dtype=numpy.uint16) cdef short int * cdata cdata = < short int *> data.data (fd,fname) = tempfile.mkstemp() name = fname with nogil: pack_wordimage_c(cdata, dim1, dim0, name) with open(name,"rb") as f: f.seek(0) output = f.read() os.close(fd) os.remove(name) return output @cython.boundscheck(False) def uncompress_pck(raw not None, dim1=None, dim2=None, overflowPix=None, version=None, normal_start=None): """ Unpack a mar345 compressed image @param raw: input string (bytes in python3) @param dim1,dim2: optional parameters size @param overflowPix: optional parameters: number of overflowed pixels @param version: PCK version 1 or 2 @param normal_start: position of the normal value section (can be auto-guessed) @return : ndarray of 2D with the right size """ cdef int cdimx, cdimy, chigh, cversion, orecords, normal_offset cdef numpy.ndarray[numpy.uint32_t, ndim = 2] data cdef numpy.ndarray[numpy.uint32_t, ndim = 1] flat cdef numpy.ndarray[numpy.uint8_t, ndim = 1] instream cdef void* out end=None key1 = "CCP4 packed image, X: " key2 = "CCP4 packed image V2, X: " if (dim1 is None) or (dim2 is None) or (version not in [1,2]) or (version is None) or (normal_start is None): start = raw.find(key2) key = key2 cversion = 2 if start == -1: start = raw.find(key1) key = key1 cversion = 1 lenkey = len(key) start = raw.index(key) + lenkey sizes = raw[start:start + 13] cdimx = < int > int(sizes[:4]) cdimy = < int > int(sizes[-4:]) normal_offset = start + 13 else: cdimx = < int > dim1 cdimy = < int > dim2 cversion = version normal_offset = normal_start if cversion==1: lenkey = len(key1) else: lenkey = len(key2) if cversion not in [1,2]: raise RuntimeError("Cannot determine the compression scheme for PCK compression (either version 1 or 2)") if (overflowPix is None): end = raw.find("END OF HEADER") start = raw[:end].find("HIGH") hiLine = raw[start:end] hiLine = hiLine.split("\n")[0] word = hiLine.split() if len(word) > 1: chigh = int(word[1]) else: print("Error while looking for overflowed pixels in line %s" % hiLine.strip()) chigh = 0 else: chigh = < int > overflowPix orecords = (chigh/8.0+0.875) data = numpy.empty((cdimy, cdimx), dtype=numpy.uint32) flat = data.ravel() #flat view on the data instream = numpy.fromstring(raw[normal_offset:].lstrip(),dtype=numpy.uint8) with nogil: ################################################################################ # relay to whichever version of ccp4_unpack is appropriate ################################################################################ if cversion == 1: ccp4_unpack_string( &data[0,0], &instream[0], cdimx, cdimy,0); else:# cversion == 2: ccp4_unpack_v2_string( &data[0,0], &instream[0], cdimx, cdimy,0); ################################################################################ # handle overflows ################################################################################ stop = normal_offset-lenkey-14 odata = numpy.fromstring(raw[stop-64*orecords: stop],dtype=numpy.int32) odata.shape = -1,2 addresses = odata[:,0] values = odata[:,1] valid = (addresses>0) addresses = addresses[valid]-1 #addresses start at 1 !! values = values[valid] flat[addresses] = values.astype(numpy.uint32) return data fabio-0.1.3/src/ccp4_pack.h0000644000175000017500000000570112137541667016165 0ustar jeromejerome00000000000000/* Fabio Mar345 ccp4_pack decompressor Copyright (C) 2007-2009 Henning O. Sorensen & Erik Knudsen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _MSC_VER #include #else #include "stdint.h" #endif #include #include #include #define CCP4_PCK_BLOCK_HEADER_LENGTH 6 #define CCP4_PCK_BLOCK_HEADER_LENGTH_V2 8 /*array translating the number of errors per block*/ static unsigned int CCP4_PCK_ERR_COUNT[] = {1,2,4,8,16,32,64,128}; /*array translating the number of bits per error*/ static unsigned int CCP4_PCK_BIT_COUNT[]= {0,4,5,6,7,8,16,32}; /*array translating the number of errors per block - can use shifts as well actually*/ static unsigned int CCP4_PCK_ERR_COUNT_V2[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}; /*array translating the number of bits per error*/ static unsigned int CCP4_PCK_BIT_COUNT_V2[]= {0,4,5,6,7,8,9,10,11,12,13,14,15,16,32}; static const unsigned char CCP4_PCK_MASK[]={0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}; static const unsigned int CCP4_PCK_MASK_16[]={0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF}; static const unsigned long CCP4_PCK_MASK_32[]={0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF}; #define pfail_nonzero(a) if ((a)) return NULL; void *mar345_read_data(FILE *file, int ocount, int dim1, int dim2); void *mar345_read_data_string(char *instring, int ocount, int dim1, int dim2); void *ccp4_unpack(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void *ccp4_unpack_v2(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void *ccp4_unpack_string(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void *ccp4_unpack_v2_string(void *unpacked_array, void *packed, size_t dim1, size_t dim2, size_t max_num_int); void pack_wordimage_c(short int *img, int x, int y, char *filename); fabio-0.1.3/src/cf_iomodule.c0000644000175000017500000000450412120434325016576 0ustar jeromejerome00000000000000#include #include #include #include #include "columnfile.h" static PyObject *cf_read(PyObject *self, PyObject *args, PyObject *keywds){ cf_data *cf__; PyArrayObject *py_data; PyStringObject *str; PyListObject *clabels; static char *kwlist[]={"file","mode",NULL}; const char mode[]="a "; unsigned int flags=0; /* perhaps not const */ int dim1,dim2,ocount; int dims[2]; int i; FILE *file; PyObject *py_file; if (!PyArg_ParseTupleAndKeywords(args,keywds,"O|s",kwlist,&py_file,&mode)) return NULL; file=PyFile_AsFile(py_file); if (strchr(mode,'z')){ flags|=CF_GZ_COMP; } if(strchr(mode,'b')){ cf__=(cf_data *) cf_read_bin(file,NULL,flags); }else if (strchr(mode,'a')) { cf__=(cf_data *) cf_read_ascii(file,NULL,flags); }else{ fprintf(stderr,"unrecognized mode for columnfile %s (assuming ascii)\n",mode); cf__= (cf_data *)cf_read_ascii(file,NULL,flags); } /*check for failure to read*/ if (cf__==NULL){ return Py_BuildValue("OO",Py_None,Py_None); } dims[0]=cf__->nrows;dims[1]=cf__->ncols; /*since data may be non-contigous we can't simply create a numpy-array from cf__->data, as Numpy's memory model prohibits it*/ /*i.e. py_data=(PyArrayObject*)PyArray_SimpleNewFromData(2, dims, NPY_DOUBLE, (void*)(&(cf__->data[0][0]))); * won't work*/ py_data=(PyArrayObject *)PyArray_SimpleNew(2,dims,NPY_DOUBLE); for (i=0;inrows;i++){ memcpy((double *)PyArray_GETPTR2(py_data,i,0),cf__->data[i],cf__->ncols*sizeof(double)); } clabels=(PyListObject *)PyList_New(0); for (i=0;incols;i++){ str = (PyStringObject*)PyString_FromString(cf__->clabels[i]); if (PyList_Append((PyObject*)clabels,(PyObject*)str)){ fprintf(stderr,"cannot insert column label %d\n",i); } } cf_free(cf__); return Py_BuildValue("OO", PyArray_Return(py_data),clabels); } static PyMethodDef cf_io_Methods[] = { {"read",(PyCFunction)cf_read, METH_VARARGS | METH_KEYWORDS, "call the c-columnfile reading interface. The mode keyword argument is either:\n \"a\" for ascii (the default)\n \"b\" for binary"}, {NULL, NULL, 0, NULL} }; PyMODINIT_FUNC initcf_io(void) { (void) Py_InitModule("cf_io",cf_io_Methods); import_array(); if (PyErr_Occurred()) Py_FatalError("cannot initialize cf_iomodule.c"); } fabio-0.1.3/src/stdint.h0000644000175000017500000001746112120434325015631 0ustar jeromejerome00000000000000// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2008 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __cplusplus } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef char int8_t; typedef short int16_t; typedef int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants #define INTMAX_C INT64_C #define UINTMAX_C UINT64_C #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_STDINT_H_ ] fabio-0.1.3/src/columnfile.c0000644000175000017500000001360312120434325016446 0ustar jeromejerome00000000000000#include #include #include #ifndef HAVE_ZLIB_H #define HAVE_ZLIB_H 0 #else #include #endif #include "columnfile.h" static char hdr_ctl[]="# %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s"; int compression_yes(char *fname){ /*should we use compression*/ char *p; if ( HAVE_ZLIB_H && (p=strstr(fname,".gz"))!=NULL && pnralloc;i++){ if (p->data[i]!=NULL) free(p->data[i]); } if( p->data!=NULL){free(p->data);} for (i=0;incols;i++){ if(p->clabels[i]!=NULL) free(p->clabels[i]); } if(p->clabels!=NULL){free(p->clabels);} free(p); } } int cf_write(char *fname,void *cf_handle, unsigned int FLAGS){ int status; #if HAVE_ZLIB_H if (FLAGS & CF_GZ_COMP){ gzFile gzfp=gzopen(fname,"wbh"); if (gzfp==NULL) return -1; status=-1; if (FLAGS && CF_BIN){ status=cf_write_bin_gz(gzfp,cf_handle); }else{ status=cf_write_ascii_gz(gzfp,cf_handle); } gzclose(gzfp); return status; }else{ #else if(1){ #endif FILE *fp=fopen(fname,"wb"); if (fp==NULL) return -1; status=-1; if (FLAGS && CF_BIN){ /*status=cf_write_bin(fp,cf_handle); */ }else{ status=cf_write_ascii(fp,cf_handle,0); } fclose(fp); return status; } } int cf_write_ascii(void *fp, void *cf_handle, unsigned int FLAGS){/*{{{*/ int r,c; cf_data *cf_=(cf_data *) cf_handle; #if HAVE_ZLIB_H if (FLAGS & CF_GZ_COMP){ gzprintf((gzFile)fp,"#"); for (i=0;incols;i++){ gzprintf((gzFile)fp," %s",cf_->clabels[i]); } gzprintf((gzFile)fp,"\n"); for (r=0;rnrows;r++){ for (i=0;incols;i++){ gzprintf((gzFile)fp," %g",cf_->data[i][r]); } gzprintf((gzFile)fp,"\n"); } return 0; }else{ #endif fprintf((FILE *)fp,"#"); for (c=0;cncols;c++){ fprintf((FILE *)fp," %s",cf_->clabels[c]); } fprintf((FILE *)fp,"\n"); for (r=0;rnrows;r++){ for (c=0;cncols;c++){ fprintf((FILE *)fp," %g",cf_->data[c][r]); } fprintf((FILE *)fp,"\n"); } return 0; #if HAVE_ZLIB_H } #endif }/*}}}*/ void *cf_read_ascii(void *fp, void *dest, unsigned int FLAGS){/*{{{*/ /*read the first line and figure out how many columns we have*/ char line[2048]; char *fi; /* returned by fgets */ int i,r; int nr_alloc=CF_INIT_ROWS; int nc_alloc=CF_INIT_COLS; int ncols,nrows; char **clabels,**cp; double **data,**dp; char *p; cf_data *dest_local; /*read the first line into buffer*/ #if HAVE_ZLIB_H if (FLAGS & CF_GZ_COMP){ if ((gzgets((gzFile )fp,line,2048))==Z_NULL) {fprintf(stderr,"zlib io error in %s \n",__FILE__);return NULL;} }else{ if((fgets(line,2048,(FILE *)fp))==NULL){fprintf(stderr,"io-error in %s\n",__FILE__);return NULL;} } #else if((fgets(line,2048,(FILE *)fp))==NULL){fprintf(stderr,"io-error in %s\n",__FILE__);return NULL;} #endif /*initially allocate room for 32 columns - if that is not enough should reallocate*/ clabels=(char**) malloc(CF_INIT_COLS* sizeof(char*)); for (cp=clabels;cpnon-ws slopes. when one is found read from pc-1 into header storage. exit when line is exhausted*/ /*count the number of entries*/ ncols=0; /*headers are supposed to start with # so skip that*/ if (*line=='#') p=line+1; else p=line; while (*p!='\0' || *p!='\n' || pncols=ncols; ((cf_data *) dest_local)->nrows=r; ((cf_data *) dest_local)->nralloc=nr_alloc; ((cf_data *) dest_local)->clabels=clabels; ((cf_data *) dest_local)->data=data; return (void *) dest_local; }/*}}}*/ void *cf_read_bin(void *fp, void *dest, unsigned int FLAGS){ return NULL; } fabio-0.1.3/src/columnfile.h0000644000175000017500000000302512120434325016450 0ustar jeromejerome00000000000000#ifndef CF_H #define CF_H 1 #include #include #include #define CF_INIT_ROWS 8192 #define CF_INIT_COLS 32 #define CF_HEADER_ITEM 128 #define CF_GZ_COMP 1 #define CF_BIN 2 #define repeat16_inc(name,offset) \ *((name)+(offset)),*((name)+(offset)+1),*((name)+(offset)+2),*((name)+(offset)+3),*((name)+(offset)+4), \ *((name)+(offset)+5),*((name)+(offset)+6),*((name)+(offset)+7),*((name)+(offset)+8),*((name)+(offset)+9), \ *((name)+(offset)+10),*((name)+(offset)+11),*((name)+(offset)+12),*((name)+(offset)+13),*((name)+(offset)+14),*((name)+(offset)+15) #define cf_check_realloc(p,i,chunk_size,item_size) \ do {\ if((i)%(chunk_size)==0){\ } while (0); #define cf_sscan_column(source,conversion,dest,prefix) \ do {\ int tmpi=0;\ if ((prefix)!=NULL) sscanf(source,prefix);\ while (sscanf( (source) , (conversion) , ((dest) +tmpi))){\ tmpi++;\ }\ } while (0); #define is_ws(character) \ ( (character==' ') || ((character)=='\t') || ((character)=='\v') || ((character) =='\r') || ((character) =='\n') ) typedef struct cf_data{ int ncols,nrows; unsigned int nralloc; double **data; char **clabels; } cf_data; void * cf_read_ascii(void *fp, void *dest, unsigned int FLAGS); void * cf_read_bin(void *fp, void *dest, unsigned int FLAGS); int cf_write(char *fname, void *cf_handle, unsigned int FLAGS); int cf_write_bin(void *fp, void *cf_handle); int cf_write_ascii(void *fp, void *cf_handle,unsigned int FLAGS); void cf_free( cf_data *cf_handle); #endif fabio-0.1.3/src/byte_offset.pyx0000644000175000017500000001073612120434325017224 0ustar jeromejerome00000000000000""" Authors: Jerome Kieffer, ESRF Email: jerome.kieffer@esrf.eu Cif Binary Files images are 2D images written by the Pilatus detector and others. They use a modified (simplified) byte-offset algorithm. This file contains the decompression function from a string to an int64 numpy array. This is Cython: convert it to pure C then compile it with gcc $ cython byte_offset.pyx """ __author__ = "Jerome Kieffer" __contact__ = "jerome.kieffer@esrf.eu" __license__ = "LGPLv3+" __copyright__ = "2010-2012, European Synchrotron Radiation Facility, Grenoble, France" cimport numpy import numpy import cython @cython.boundscheck(False) def analyseCython(bytes stream not None, size=None): """ Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) @param stream: string representing the compressed data @param size: the size of the output array (of longInts) @return : int64 ndArrays """ cdef int i = 0 cdef int j = 0 cdef long long last = 0 cdef long long current = 0 cdef char tmp8 = 0 cdef unsigned char utmp8a = 0 cdef unsigned char utmp8b = 0 cdef unsigned char utmp8c = 0 cdef unsigned char utmp8d = 0 cdef unsigned char utmp8e = 0 cdef unsigned char utmp8f = 0 cdef unsigned char utmp8g = 0 cdef long long tmp64 = 0 cdef long long tmp64a = 0 cdef long long tmp64b = 0 cdef long long tmp64c = 0 cdef long long tmp64d = 0 cdef long long tmp64e = 0 cdef long long tmp64f = 0 cdef long long tmp64g = 0 cdef char key8 = 0x80 cdef char key0 = 0x00 cdef int csize cdef int lenStream = < int > len(stream) cdef char * cstream = stream if size is None: csize = lenStream else: csize = < int > size cdef numpy.ndarray[ long long , ndim = 1] dataOut = numpy.zeros(csize, dtype=numpy.int64) with nogil: while (i < lenStream) and (j < csize): if (cstream[i] == key8): if ((cstream[i + 1] == key0) and (cstream[i + 2] == key8)): if (cstream[i + 3] == key0) and (cstream[i + 4] == key0) and (cstream[i + 5] == key0) and (cstream[i + 6] == key8): #Retrieve the interesting Bytes of data tmp8 = cstream[i + 14] utmp8a = cstream[i + 13] utmp8b = cstream[i + 12] utmp8c = cstream[i + 11] utmp8d = cstream[i + 10] utmp8e = cstream[i + 9] utmp8f = cstream[i + 8] utmp8g = cstream[i + 7] # cast them in 64 bit tmp64 = tmp8 tmp64a = utmp8a tmp64b = utmp8b tmp64c = utmp8c tmp64d = utmp8d tmp64e = utmp8e tmp64f = utmp8f tmp64g = utmp8g current = (tmp64 << 56) | (tmp64a << 48) | (tmp64b << 40) | (tmp64c << 32) | (tmp64d << 24) | (tmp64e << 16) | (tmp64f << 8) | (tmp64g) i += 15 else: #Retrieve the interesting Bytes of data tmp8 = cstream[i + 6] utmp8a = cstream[i + 5] utmp8b = cstream[i + 4] utmp8c = cstream[i + 3] # cast them in 64 bit tmp64 = tmp8 tmp64a = utmp8a tmp64b = utmp8b tmp64c = utmp8c #Assemble data into a long long current = (tmp64 << 24) | (tmp64a << 16) | (tmp64b << 8) | (tmp64c); i += 7 else: tmp8 = cstream[i + 2]; utmp8a = cstream[i + 1] # cast them in 64 bit tmp64 = tmp8 tmp64a = utmp8a current = (tmp64 << 8) | (tmp64a); i += 3 else: tmp8 = cstream[i] current = tmp8 i += 1 last += current dataOut[j] = last j += 1 return dataOut[:j] fabio-0.1.3/src/cf_io.pyx0000644000175000017500000000510712233175156015777 0ustar jeromejerome00000000000000""" New Cython version of cf_iomodule.c for preparing the migration to Python3 """ __authors__ = ["Jerome Kieffer"] __contact__ = "jerome.kieffer@esrf.eu" __license__ = "LGPLv3+" __copyright__ = "2013, European Synchrotron Radiation Facility, Grenoble, France" import cython cimport numpy import numpy import os,tempfile, sys from libc.string cimport memcpy from libc.stdio cimport fopen, FILE CF_H=1 CF_INIT_ROWS=8192 CF_INIT_COLS=32 CF_HEADER_ITEM=128 CF_GZ_COMP=1 CF_BIN=2 cdef extern from "columnfile.h": struct cf_data: int ncols,nrows unsigned int nralloc double **data char **clabels void * cf_read_ascii(void *fp, void *dest, unsigned int FLAGS)nogil void * cf_read_bin(void *fp, void *dest, unsigned int FLAGS)nogil int cf_write(char *fname, void *cf_handle, unsigned int FLAGS)nogil int cf_write_bin(void *fp, void *cf_handle)nogil int cf_write_ascii(void *fp, void *cf_handle,unsigned int FLAGS)nogil void cf_free( cf_data *cf_handle)nogil def read(py_file, mode="a"): """ Call the c-columnfile reading interface. The mode keyword argument is either: "a" for ascii (the default) "b" for binary """ cdef cf_data *cf__ cdef unsigned int flags=0,fd # /* perhaps not const */ cdef int i cdef FILE *file # PyObject *py_file; #Here is a big issue !!! and I got an even worse solution ! # file=PyFile_AsFile(py_file); (fd,fname) = tempfile.mkstemp() os.fdopen(fd,mode="wb").write(py_file.read()) os.close(fd) file=fopen(fname, "r"); if "z" in mode: flags|=CF_GZ_COMP if "b" in mode: cf__= cf_read_bin(file,NULL,flags) elif "a" in mode: cf__= cf_read_ascii(file,NULL,flags) else: sys.stderr.write("unrecognized mode for columnfile %s (assuming ascii)\n",mode) cf__= cf_read_ascii(file,NULL,flags); # check for failure to read if (cf__==NULL): return None, None dims=(cf__.nrows,cf__.ncols) #since data may be non-contigous we can't simply create a numpy-array from cf__->data, as Numpy's memory model prohibits it # i.e. py_data=(PyArrayObject*)PyArray_SimpleNewFromData(2, dims, NPY_DOUBLE, (void*)(&(cf__->data[0][0]))); # won't work cdef numpy.ndarray[numpy.float64_t, ndim = 2] py_data=numpy.empty(dims,dtype=numpy.float64) for i in range(cf__.nrows): memcpy(&py_data[i,0], cf__.data[i],cf__.ncols*sizeof(double)) clabels=[] for i in range(cf__.ncols): clabels.append(str(cf__.clabels[i])) cf_free(cf__) return py_data, clabels fabio-0.1.3/epydoc/0000755000175000017500000000000012233272207014642 5ustar jeromejerome00000000000000fabio-0.1.3/epydoc/fabio.fabioutils.FilenameObject-class.html0000644000175000017500000003376512126623347024745 0ustar jeromejerome00000000000000 fabio.fabioutils.FilenameObject
        Package fabio :: Module fabioutils :: Class FilenameObject
        [hide private]
        [frames] | no frames]

        Class FilenameObject

        source code

        object --+
                 |
                FilenameObject
        

        The 'meaning' of a filename ...

        Instance Methods [hide private]
         
        __init__(self, stem=None, num=None, directory=None, format=None, extension=None, postnum=None, digits=4, filename=None)
        This class can either be instanciated by a set of parameters like directory, prefix, num, extension, ...
        source code
         
        str(self)
        Return a string representation
        source code
         
        __repr__(self)
        Return a string representation
        source code
         
        tostring(self)
        convert yourself to a string
        source code
         
        deconstruct_filename(self, filename)
        Break up a filename to get image type and number
        source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, stem=None, num=None, directory=None, format=None, extension=None, postnum=None, digits=4, filename=None)
        (Constructor)

        source code 

        This class can either be instanciated by a set of parameters like directory, prefix, num, extension, ...

        Parameters:
        • stem - the stem is a kind of prefix (str)
        • num - image number in the serie (int)
        • directory - name of the directory (str)
        • format - ??
        • extension
        • postnum
        • digits - Number of digits used to print num

          Alternative constructor:

        • filename - fullpath of an image file to be deconstructed into directory, prefix, num, extension, ...
        Overrides: object.__init__

        __repr__(self)
        (Representation operator)

        source code 

        Return a string representation

        Overrides: object.__repr__

        fabio-0.1.3/epydoc/fabio.xsdimage-pysrc.html0000644000175000017500000016572212126623347021571 0ustar jeromejerome00000000000000 fabio.xsdimage
        Package fabio :: Module xsdimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.xsdimage

          1  #!/usr/bin/env python 
          2  # coding: utf8 
          3  """ 
          4  Authors: Jérôme Kieffer, ESRF  
          5           email:jerome.kieffer@esrf.fr 
          6   
          7  XSDimge are XML files containing numpy arrays  
          8  """ 
          9  __author__ = "Jérôme Kieffer" 
         10  __contact__ = "jerome.kieffer@esrf.eu" 
         11  __license__ = "GPLv3+" 
         12  __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" 
         13   
         14  import logging, numpy 
         15  logger = logging.getLogger("xsdimage") 
         16  from fabioimage import fabioimage 
         17  import base64, hashlib 
         18  try: 
         19      from lxml import etree 
         20  except ImportError: 
         21      logger.warning("lxml library is probably not part of your python installation: disabling xsdimage format") 
         22      etree = None 
         23   
        
        24 -class xsdimage(fabioimage):
        25 """ 26 Read the XSDataImage XML File data format 27 """
        28 - def __init__(self, data=None, header=None, fname=None):
        29 """ 30 Constructor of the class XSDataImage. 31 32 @param _strFilename: the name of the file to open 33 @type _strFilename: string 34 """ 35 fabioimage.__init__(self, data=data, header=header) 36 self.dims = [] 37 self.size = None 38 self.coding = None 39 self.dtype = None 40 self.rawData = None 41 self.md5 = None 42 if fname is not None: 43 self.filename = fname 44 self.read(fname)
        45
        46 - def read(self, fname, frame=None):
        47 """ 48 """ 49 self.header = {} 50 self.resetvals() 51 self.filename = fname 52 infile = self._open(fname, "rb") 53 self._readheader(infile) 54 55 try: 56 self.dim1, self.dim2 = self.dims[:2] 57 except: 58 raise IOError("XSD file %s is corrupt, no dimensions in it" % fname) 59 try: 60 self.bytecode = numpy.dtype(self.dtype).type 61 self.bpp = len(numpy.array(0, self.bytecode).tostring()) 62 except TypeError: 63 self.bytecode = numpy.int32 64 self.bpp = 32 65 logger.warning("Defaulting type to int32") 66 67 exp_size = 1 68 for i in self.dims: 69 exp_size *= i 70 assert exp_size == self.size 71 72 decData = None 73 if self.coding == "base64": 74 decData = base64.b64decode(self.rawData) 75 elif self.coding == "base32": 76 decData = base64.b32decode(self.rawData) 77 elif self.coding == "base16": 78 decData = base64.b16decode(self.rawData) 79 else: 80 logger.warning("Unable to recognize the encoding of the data !!! got %s, expected base64, base32 or base16, I assume it is base64 " % self.coding) 81 decData = base64.b64decode(self.rawData) 82 if self.md5: 83 assert hashlib.md5(decData).hexdigest() == self.md5 84 85 86 self.data = numpy.fromstring(decData, dtype=self.bytecode).reshape(tuple(self.dims)) 87 if not numpy.little_endian: #by default little endian 88 self.data.byteswap(inplace=True) 89 self.resetvals() 90 # # ensure the PIL image is reset 91 self.pilimage = None 92 return self
        93
        94 - def _readheader(self, infile):
        95 """ 96 Read all headers in a file and populate self.header 97 data is not yet populated 98 @type infile: file object open in read mode 99 """ 100 xml = etree.parse(infile) 101 self.dims = [] 102 for i in xml.xpath("//shape"): 103 try: 104 self.dims.append(int(i.text)) 105 except ValueError, error: 106 logger.warning("%s Shape: Unable to convert %s to integer in %s" % (error, i.text, i)) 107 for i in xml.xpath("//size"): 108 try: 109 self.size = int(i.text) 110 except Exception, error:#IGNORE:W0703 111 logger.warning("%s Size: Unable to convert %s to integer in %s" % (error, i.text, i)) 112 self.dtype = None 113 for i in xml.xpath("//dtype"): 114 self.dtype = i.text 115 self.coding = None 116 for i in xml.xpath("//coding"): 117 j = i.find("value") 118 if j is not None: 119 self.coding = j.text 120 self.rawData = None 121 for i in xml.xpath("//data"): 122 self.rawData = i.text 123 self.md5 = None 124 for i in xml.xpath("//md5sum"): 125 j = i.find("value") 126 if j is not None: 127 self.md5 = j.text
        128 129 if etree is None: 130 xsdimage = None 131

        fabio-0.1.3/epydoc/fabio.GEimage.GEimage-class.html0000644000175000017500000005550012126623347022520 0ustar jeromejerome00000000000000 fabio.GEimage.GEimage
        Package fabio :: Module GEimage :: Class GEimage
        [hide private]
        [frames] | no frames]

        Class GEimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               GEimage
        

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Read a GE image header
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and the data into self.data
        source code
         
        _makeframename(self)
        The thing to be printed for the user to represent a frame inside a file
        source code
         
        _readframe(self, filepointer, img_num)
        # Load only one image from the sequence # Note: the first image in the sequence 0 # raises an exception if you give an invalid image # otherwise fills in self.data
        source code
         
        write(self, fname, force_type=<type 'numpy.uint16'>)
        Not yet implemented
        source code
         
        getframe(self, num)
        Returns a frame as a new fabioimage object
        source code
         
        next(self)
        Get the next image in a series as a fabio image
        source code
         
        previous(self)
        Get the previous image in a series as a fabio image
        source code

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
          _need_a_seek_to_read = True

        Inherited from fabioimage.fabioimage (private): _need_a_real_file

        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Read a GE image header

        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 

        Read in header into self.header and the data into self.data

        Overrides: fabioimage.fabioimage.read

        write(self, fname, force_type=<type 'numpy.uint16'>)

        source code 

        Not yet implemented

        Overrides: fabioimage.fabioimage.write

        getframe(self, num)

        source code 

        Returns a frame as a new fabioimage object

        Overrides: fabioimage.fabioimage.getframe

        next(self)

        source code 

        Get the next image in a series as a fabio image

        Overrides: fabioimage.fabioimage.next

        previous(self)

        source code 

        Get the previous image in a series as a fabio image

        Overrides: fabioimage.fabioimage.previous

        fabio-0.1.3/epydoc/toc-fabio.pilatusimage-module.html0000644000175000017500000000234012120434325023334 0ustar jeromejerome00000000000000 pilatusimage

        Module pilatusimage


        Classes

        pilatusimage

        Variables

        __package__

        [hide private] fabio-0.1.3/epydoc/fabio.TiffIO-module.html0000644000175000017500000005772712126623347021242 0ustar jeromejerome00000000000000 fabio.TiffIO
        Package fabio :: Module TiffIO
        [hide private]
        [frames] | no frames]

        Module TiffIO

        source code


        Author: V.A. Sole - ESRF Data Analysis

        Classes [hide private]
          TiffIO
        Variables [hide private]
          __revision__ = 1501
          DEBUG = 0
          ALLOW_MULTIPLE_STRIPS = False
          TAG_ID = {256: 'NumberOfColumns', 257: 'NumberOfRows', 258: 'B...
          TAG_NUMBER_OF_COLUMNS = 256
          TAG_NUMBER_OF_ROWS = 257
          TAG_BITS_PER_SAMPLE = 258
          TAG_PHOTOMETRIC_INTERPRETATION = 262
          TAG_COMPRESSION = 259
          TAG_IMAGE_DESCRIPTION = 270
          TAG_STRIP_OFFSETS = 273
          TAG_ROWS_PER_STRIP = 278
          TAG_STRIP_BYTE_COUNTS = 279
          TAG_SOFTWARE = 305
          TAG_DATE = 306
          TAG_COLORMAP = 320
          TAG_SAMPLE_FORMAT = 339
          FIELD_TYPE = {1: ('BYTE', 'B'), 2: ('ASCII', 's'), 3: ('SHORT'...
          FIELD_TYPE_OUT = {'B': 1, 'H': 3, 'I': 4, 'II': 5, 'b': 6, 'd'...
          SAMPLE_FORMAT_UINT = 1
          SAMPLE_FORMAT_INT = 2
          SAMPLE_FORMAT_FLOAT = 3
          SAMPLE_FORMAT_VOID = 4
          SAMPLE_FORMAT_COMPLEXINT = 5
          SAMPLE_FORMAT_COMPLEXIEEEFP = 6
          __package__ = 'fabio'
        Variables Details [hide private]

        TAG_ID

        Value:
        {256: 'NumberOfColumns',
         257: 'NumberOfRows',
         258: 'BitsPerSample',
         259: 'Compression',
         262: 'PhotometricInterpretation',
         270: 'ImageDescription',
         273: 'StripOffsets',
         278: 'RowsPerStrip',
        ...
        

        FIELD_TYPE

        Value:
        {1: ('BYTE', 'B'),
         2: ('ASCII', 's'),
         3: ('SHORT', 'H'),
         4: ('LONG', 'I'),
         5: ('RATIONAL', 'II'),
         6: ('SBYTE', 'b'),
         7: ('UNDEFINED', 'B'),
         8: ('SSHORT', 'h'),
        ...
        

        FIELD_TYPE_OUT

        Value:
        {'B': 1,
         'H': 3,
         'I': 4,
         'II': 5,
         'b': 6,
         'd': 12,
         'f': 11,
         'h': 8,
        ...
        

        fabio-0.1.3/epydoc/toc-fabio.GEimage_old-module.html0000644000175000017500000000232212120434325023004 0ustar jeromejerome00000000000000 GEimage_old

        Module GEimage_old


        Classes

        GEimage

        Variables

        __package__

        [hide private] fabio-0.1.3/epydoc/fabio.readbytestream-pysrc.html0000644000175000017500000006537512126623347023006 0ustar jeromejerome00000000000000 fabio.readbytestream
        Package fabio :: Module readbytestream
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.readbytestream

         1  #!/usr/bin/env python 
         2  #coding: utf8 
         3   
         4  """ 
         5  Reads a bytestream 
         6   
         7  Authors: Jon Wright    Henning O. Sorensen & Erik Knudsen 
         8           ESRF          Risoe National Laboratory 
         9  """ 
        10   
        11  import numpy, logging 
        12  logger = logging.getLogger("readbytestream") 
        13  DATATYPES = { 
        14      # type  sign bytes 
        15      ("int", 'n', 1) : numpy.uint8, 
        16      ("int", 'n', 2) : numpy.uint16, 
        17      ("int", 'n', 4) : numpy.uint32, 
        18      ("int", 'y', 1) : numpy.int8, 
        19      ("int", 'y', 2) : numpy.int16, 
        20      ("int", 'y', 4) : numpy.int32, 
        21      ('float', 'y', 4) : numpy.float32, # does this occur in bruker? 
        22      ('double', 'y', 4): numpy.float64 
        23      } 
        24   
        25   
        
        26 -def readbytestream(fil, 27 offset, 28 x, 29 y, 30 nbytespp, 31 datatype='int', 32 signed='n', 33 swap='n', 34 typeout=numpy.uint16):
        35 """ 36 Reads in a bytestream from a file (which may be a string indicating 37 a filename, or an already opened file (should be "rb")) 38 offset is the position (in bytes) where the pixel data start 39 nbytespp = number of bytes per pixel 40 type can be int or float (4 bytes pp) or double (8 bytes pp) 41 signed: normally signed data 'y', but 'n' to try to get back the 42 right numbers when unsigned data are converted to signed 43 (python once had no unsigned numeric types.) 44 swap, normally do not bother, but 'y' to swap bytes 45 typeout is the numpy type to output, normally uint16, 46 but more if overflows occurred 47 x and y are the pixel dimensions 48 49 TODO : Read in regions of interest 50 51 PLEASE LEAVE THE STRANGE INTERFACE ALONE - 52 IT IS USEFUL FOR THE BRUKER FORMAT 53 """ 54 tin = "dunno" 55 length = nbytespp * x * y # bytes per pixel times number of pixels 56 if datatype in ['float', 'double']: 57 signed = 'y' 58 59 key = (datatype, signed, nbytespp) 60 try: 61 tin = DATATYPES[key] 62 except: 63 logging.warning("datatype,signed,nbytespp " + str(key)) 64 raise Exception("Unknown combination of types to readbytestream") 65 66 # Did we get a string (filename) or a readable stream object? 67 if hasattr(fil, "read") and hasattr(fil, "seek"): 68 infile = fil 69 opened = False 70 else: 71 infile = open(fil, 'rb') 72 opened = True 73 74 infile.seek(offset) 75 76 arr = numpy.array(numpy.reshape( 77 numpy.fromstring( 78 infile.read(length), tin) , (x, y)), typeout) 79 80 if swap == 'y': 81 arr = arr.byteswap() 82 83 if opened: 84 infile.close() 85 86 return arr
        87

        fabio-0.1.3/epydoc/toc.html0000644000175000017500000001626312120434325016321 0ustar jeromejerome00000000000000 Table of Contents

        Table of Contents


        Everything

        Modules

        fabio
        fabio.GEimage
        fabio.GEimage_old
        fabio.HiPiCimage
        fabio.OXDimage
        fabio.TiffIO
        fabio.adscimage
        fabio.binaryimage
        fabio.bruker100image
        fabio.brukerimage
        fabio.byte_offset
        fabio.cbfimage
        fabio.cf_io
        fabio.compression
        fabio.converters
        fabio.datIO
        fabio.dm3image
        fabio.edfimage
        fabio.fabioimage
        fabio.fabioutils
        fabio.file_series
        fabio.fit2dmaskimage
        fabio.fit2dspreadsheetimage
        fabio.kcdimage
        fabio.mar345_IO
        fabio.mar345image
        fabio.marccdimage
        fabio.openimage
        fabio.pilatusimage
        fabio.pnmimage
        fabio.readbytestream
        fabio.tifimage
        fabio.xsdimage

        [hide private] fabio-0.1.3/epydoc/api-objects.txt0000644000175000017500000027267712126623347017636 0ustar jeromejerome00000000000000fabio fabio-module.html fabio.getnum fabio.fabioutils-module.html#getnum fabio.construct_filename fabio.fabioutils-module.html#construct_filename fabio.open fabio.openimage-module.html#openimage fabio.deconstruct_filename fabio.fabioutils-module.html#deconstruct_filename fabio.__package__ fabio-module.html#__package__ fabio.version fabio-module.html#version fabio.openheader fabio.openimage-module.html#openheader fabio.next_filename fabio.fabioutils-module.html#next_filename fabio.extract_filenumber fabio.fabioutils-module.html#extract_filenumber fabio.__status__ fabio-module.html#__status__ fabio.previous_filename fabio.fabioutils-module.html#previous_filename fabio.jump_filename fabio.fabioutils-module.html#jump_filename fabio.GEimage fabio.GEimage-module.html fabio.GEimage.previous_filename fabio.fabioutils-module.html#previous_filename fabio.GEimage.GE_HEADER_INFO fabio.GEimage-module.html#GE_HEADER_INFO fabio.GEimage.__package__ fabio.GEimage-module.html#__package__ fabio.GEimage.next_filename fabio.fabioutils-module.html#next_filename fabio.GEimage.demo fabio.GEimage-module.html#demo fabio.GEimage.logger fabio.GEimage-module.html#logger fabio.GEimage_old fabio.GEimage_old-module.html fabio.GEimage_old.__package__ fabio.GEimage_old-module.html#__package__ fabio.HiPiCimage fabio.HiPiCimage-module.html fabio.HiPiCimage.__package__ fabio.HiPiCimage-module.html#__package__ fabio.HiPiCimage.logger fabio.HiPiCimage-module.html#logger fabio.OXDimage fabio.OXDimage-module.html fabio.OXDimage.deg2rad fabio.OXDimage-module.html#deg2rad fabio.OXDimage.rad2deg fabio.OXDimage-module.html#rad2deg fabio.OXDimage.__package__ fabio.OXDimage-module.html#__package__ fabio.OXDimage.decTY1 fabio.compression-module.html#decTY1 fabio.OXDimage.__doc__ fabio.OXDimage-module.html#__doc__ fabio.OXDimage.compTY1 fabio.compression-module.html#compTY1 fabio.OXDimage.logger fabio.OXDimage-module.html#logger fabio.OXDimage.DEFAULT_HEADERS fabio.OXDimage-module.html#DEFAULT_HEADERS fabio.OXDimage.DETECTOR_TYPES fabio.OXDimage-module.html#DETECTOR_TYPES fabio.TiffIO fabio.TiffIO-module.html fabio.TiffIO.FIELD_TYPE fabio.TiffIO-module.html#FIELD_TYPE fabio.TiffIO.FIELD_TYPE_OUT fabio.TiffIO-module.html#FIELD_TYPE_OUT fabio.TiffIO.TAG_ROWS_PER_STRIP fabio.TiffIO-module.html#TAG_ROWS_PER_STRIP fabio.TiffIO.TAG_PHOTOMETRIC_INTERPRETATION fabio.TiffIO-module.html#TAG_PHOTOMETRIC_INTERPRETATION fabio.TiffIO.TAG_IMAGE_DESCRIPTION fabio.TiffIO-module.html#TAG_IMAGE_DESCRIPTION fabio.TiffIO.TAG_COMPRESSION fabio.TiffIO-module.html#TAG_COMPRESSION fabio.TiffIO.TAG_DATE fabio.TiffIO-module.html#TAG_DATE fabio.TiffIO.TAG_SOFTWARE fabio.TiffIO-module.html#TAG_SOFTWARE fabio.TiffIO.TAG_NUMBER_OF_ROWS fabio.TiffIO-module.html#TAG_NUMBER_OF_ROWS fabio.TiffIO.TAG_BITS_PER_SAMPLE fabio.TiffIO-module.html#TAG_BITS_PER_SAMPLE fabio.TiffIO.TAG_COLORMAP fabio.TiffIO-module.html#TAG_COLORMAP fabio.TiffIO.__package__ fabio.TiffIO-module.html#__package__ fabio.TiffIO.SAMPLE_FORMAT_COMPLEXIEEEFP fabio.TiffIO-module.html#SAMPLE_FORMAT_COMPLEXIEEEFP fabio.TiffIO.TAG_NUMBER_OF_COLUMNS fabio.TiffIO-module.html#TAG_NUMBER_OF_COLUMNS fabio.TiffIO.SAMPLE_FORMAT_INT fabio.TiffIO-module.html#SAMPLE_FORMAT_INT fabio.TiffIO.__revision__ fabio.TiffIO-module.html#__revision__ fabio.TiffIO.SAMPLE_FORMAT_FLOAT fabio.TiffIO-module.html#SAMPLE_FORMAT_FLOAT fabio.TiffIO.SAMPLE_FORMAT_VOID fabio.TiffIO-module.html#SAMPLE_FORMAT_VOID fabio.TiffIO.TAG_SAMPLE_FORMAT fabio.TiffIO-module.html#TAG_SAMPLE_FORMAT fabio.TiffIO.TAG_STRIP_OFFSETS fabio.TiffIO-module.html#TAG_STRIP_OFFSETS fabio.TiffIO.SAMPLE_FORMAT_UINT fabio.TiffIO-module.html#SAMPLE_FORMAT_UINT fabio.TiffIO.DEBUG fabio.TiffIO-module.html#DEBUG fabio.TiffIO.TAG_ID fabio.TiffIO-module.html#TAG_ID fabio.TiffIO.TAG_STRIP_BYTE_COUNTS fabio.TiffIO-module.html#TAG_STRIP_BYTE_COUNTS fabio.TiffIO.SAMPLE_FORMAT_COMPLEXINT fabio.TiffIO-module.html#SAMPLE_FORMAT_COMPLEXINT fabio.TiffIO.ALLOW_MULTIPLE_STRIPS fabio.TiffIO-module.html#ALLOW_MULTIPLE_STRIPS fabio.adscimage fabio.adscimage-module.html fabio.adscimage.__package__ fabio.adscimage-module.html#__package__ fabio.adscimage.test fabio.adscimage-module.html#test fabio.adscimage.logger fabio.adscimage-module.html#logger fabio.binaryimage fabio.binaryimage-module.html fabio.binaryimage.__package__ fabio.binaryimage-module.html#__package__ fabio.binaryimage.logger fabio.binaryimage-module.html#logger fabio.binaryimage.__doc__ fabio.binaryimage-module.html#__doc__ fabio.bruker100image fabio.bruker100image-module.html fabio.bruker100image.__package__ fabio.bruker100image-module.html#__package__ fabio.bruker100image.readbytestream fabio.readbytestream-module.html#readbytestream fabio.bruker100image.logger fabio.bruker100image-module.html#logger fabio.brukerimage fabio.brukerimage-module.html fabio.brukerimage.__package__ fabio.brukerimage-module.html#__package__ fabio.brukerimage.readbytestream fabio.readbytestream-module.html#readbytestream fabio.brukerimage.test fabio.brukerimage-module.html#test fabio.brukerimage.logger fabio.brukerimage-module.html#logger fabio.byte_offset fabio.byte_offset-module.html fabio.byte_offset.__package__ fabio.byte_offset-module.html#__package__ fabio.byte_offset.__test__ fabio.byte_offset-module.html#__test__ fabio.cbfimage fabio.cbfimage-module.html fabio.cbfimage.md5sum fabio.compression-module.html#md5sum fabio.cbfimage.compByteOffet_numpy fabio.compression-module.html#compByteOffet_numpy fabio.cbfimage.PADDING fabio.cbfimage-module.html#PADDING fabio.cbfimage.DATA_TYPES fabio.cbfimage-module.html#DATA_TYPES fabio.cbfimage.__package__ fabio.cbfimage-module.html#__package__ fabio.cbfimage.decByteOffet_numpy fabio.compression-module.html#decByteOffet_numpy fabio.cbfimage.logger fabio.cbfimage-module.html#logger fabio.cbfimage.MINIMUM_KEYS fabio.cbfimage-module.html#MINIMUM_KEYS fabio.cbfimage.STARTER fabio.cbfimage-module.html#STARTER fabio.cf_io fabio.cf_io-module.html fabio.cf_io.read fabio.cf_io-module.html#read fabio.cf_io.__package__ fabio.cf_io-module.html#__package__ fabio.compression fabio.compression-module.html fabio.compression.compByteOffet_numpy fabio.compression-module.html#compByteOffet_numpy fabio.compression.decTY1 fabio.compression-module.html#decTY1 fabio.compression.decBzip2 fabio.compression-module.html#decBzip2 fabio.compression.decKM4CCD fabio.compression-module.html#decKM4CCD fabio.compression.__package__ fabio.compression-module.html#__package__ fabio.compression.decZlib fabio.compression-module.html#decZlib fabio.compression.endianness fabio.compression-module.html#endianness fabio.compression.logger fabio.compression-module.html#logger fabio.compression.decPCK fabio.compression-module.html#decPCK fabio.compression.decGzip fabio.compression-module.html#decGzip fabio.compression.decByteOffet_python fabio.compression-module.html#decByteOffet_python fabio.compression.decByteOffet_numpy fabio.compression-module.html#decByteOffet_numpy fabio.compression.decByteOffet_weave fabio.compression-module.html#decByteOffet_weave fabio.compression.md5sum fabio.compression-module.html#md5sum fabio.compression.compTY1 fabio.compression-module.html#compTY1 fabio.compression.decByteOffet_cython fabio.compression-module.html#decByteOffet_cython fabio.compression.compPCK fabio.compression-module.html#compPCK fabio.converters fabio.converters-module.html fabio.converters.convert_data_integer fabio.converters-module.html#convert_data_integer fabio.converters.convert_data fabio.converters-module.html#convert_data fabio.converters.CONVERSION_DATA fabio.converters-module.html#CONVERSION_DATA fabio.converters.convert_header fabio.converters-module.html#convert_header fabio.converters.CONVERSION_HEADER fabio.converters-module.html#CONVERSION_HEADER fabio.converters.logger fabio.converters-module.html#logger fabio.converters.__package__ fabio.converters-module.html#__package__ fabio.datIO fabio.datIO-module.html fabio.datIO.__package__ fabio.datIO-module.html#__package__ fabio.dm3image fabio.dm3image-module.html fabio.dm3image.DATA_BYTES fabio.dm3image-module.html#DATA_BYTES fabio.dm3image.__package__ fabio.dm3image-module.html#__package__ fabio.dm3image.DATA_TYPES fabio.dm3image-module.html#DATA_TYPES fabio.dm3image.logger fabio.dm3image-module.html#logger fabio.edfimage fabio.edfimage-module.html fabio.edfimage.decBzip2 fabio.compression-module.html#decBzip2 fabio.edfimage.BLOCKSIZE fabio.edfimage-module.html#BLOCKSIZE fabio.edfimage.MINIMUM_KEYS fabio.edfimage-module.html#MINIMUM_KEYS fabio.edfimage.decZlib fabio.compression-module.html#decZlib fabio.edfimage.NUMPY_EDF_DTYPE fabio.edfimage-module.html#NUMPY_EDF_DTYPE fabio.edfimage.decGzip fabio.compression-module.html#decGzip fabio.edfimage.DATA_TYPES fabio.edfimage-module.html#DATA_TYPES fabio.edfimage.isAscii fabio.fabioutils-module.html#isAscii fabio.edfimage.nice_int fabio.fabioutils-module.html#nice_int fabio.edfimage.DEFAULT_VALUES fabio.edfimage-module.html#DEFAULT_VALUES fabio.edfimage.__package__ fabio.edfimage-module.html#__package__ fabio.edfimage.logger fabio.edfimage-module.html#logger fabio.edfimage.toAscii fabio.fabioutils-module.html#toAscii fabio.fabioimage fabio.fabioimage-module.html fabio.fabioimage.__package__ fabio.fabioimage-module.html#__package__ fabio.fabioimage.test fabio.fabioimage-module.html#test fabio.fabioimage.logger fabio.fabioimage-module.html#logger fabio.fabioutils fabio.fabioutils-module.html fabio.fabioutils.COMPRESSORS fabio.fabioutils-module.html#COMPRESSORS fabio.fabioutils.getnum fabio.fabioutils-module.html#getnum fabio.fabioutils.construct_filename fabio.fabioutils-module.html#construct_filename fabio.fabioutils.FILETYPES fabio.fabioutils-module.html#FILETYPES fabio.fabioutils.dictAscii fabio.fabioutils-module.html#dictAscii fabio.fabioutils.deconstruct_filename fabio.fabioutils-module.html#deconstruct_filename fabio.fabioutils.nice_int fabio.fabioutils-module.html#nice_int fabio.fabioutils.__package__ fabio.fabioutils-module.html#__package__ fabio.fabioutils.toAscii fabio.fabioutils-module.html#toAscii fabio.fabioutils.isAscii fabio.fabioutils-module.html#isAscii fabio.fabioutils.logger fabio.fabioutils-module.html#logger fabio.fabioutils.next_filename fabio.fabioutils-module.html#next_filename fabio.fabioutils.key fabio.fabioutils-module.html#key fabio.fabioutils.extract_filenumber fabio.fabioutils-module.html#extract_filenumber fabio.fabioutils.i fabio.fabioutils-module.html#i fabio.fabioutils.deprecated fabio.fabioutils-module.html#deprecated fabio.fabioutils.lines fabio.fabioutils-module.html#lines fabio.fabioutils.previous_filename fabio.fabioutils-module.html#previous_filename fabio.fabioutils.numstem fabio.fabioutils-module.html#numstem fabio.fabioutils.jump_filename fabio.fabioutils-module.html#jump_filename fabio.file_series fabio.file_series-module.html fabio.file_series.next_filename fabio.fabioutils-module.html#next_filename fabio.file_series.new_file_series fabio.file_series-module.html#new_file_series fabio.file_series.__package__ fabio.file_series-module.html#__package__ fabio.file_series.logger fabio.file_series-module.html#logger fabio.file_series.openimage fabio.openimage-module.html#openimage fabio.file_series.new_file_series0 fabio.file_series-module.html#new_file_series0 fabio.fit2dmaskimage fabio.fit2dmaskimage-module.html fabio.fit2dmaskimage.__package__ fabio.fit2dmaskimage-module.html#__package__ fabio.fit2dspreadsheetimage fabio.fit2dspreadsheetimage-module.html fabio.fit2dspreadsheetimage.__package__ fabio.fit2dspreadsheetimage-module.html#__package__ fabio.kcdimage fabio.kcdimage-module.html fabio.kcdimage.__package__ fabio.kcdimage-module.html#__package__ fabio.kcdimage.DATA_TYPES fabio.kcdimage-module.html#DATA_TYPES fabio.kcdimage.DEFAULT_VALUES fabio.kcdimage-module.html#DEFAULT_VALUES fabio.kcdimage.MINIMUM_KEYS fabio.kcdimage-module.html#MINIMUM_KEYS fabio.kcdimage.logger fabio.kcdimage-module.html#logger fabio.mar345_IO fabio.mar345_IO-module.html fabio.mar345_IO.__package__ fabio.mar345_IO-module.html#__package__ fabio.mar345_IO.__test__ fabio.mar345_IO-module.html#__test__ fabio.mar345image fabio.mar345image-module.html fabio.mar345image.decPCK fabio.compression-module.html#decPCK fabio.mar345image.__package__ fabio.mar345image-module.html#__package__ fabio.mar345image.logger fabio.mar345image-module.html#logger fabio.mar345image.__doc__ fabio.mar345image-module.html#__doc__ fabio.mar345image.compPCK fabio.compression-module.html#compPCK fabio.marccdimage fabio.marccdimage-module.html fabio.marccdimage.HEADER_NAMES fabio.marccdimage-module.html#HEADER_NAMES fabio.marccdimage.CDEFINITION fabio.marccdimage-module.html#CDEFINITION fabio.marccdimage.C_TO_STRUCT fabio.marccdimage-module.html#C_TO_STRUCT fabio.marccdimage.HEADER_FORMAT fabio.marccdimage-module.html#HEADER_FORMAT fabio.marccdimage.make_format fabio.marccdimage-module.html#make_format fabio.marccdimage.interpret_header fabio.marccdimage-module.html#interpret_header fabio.marccdimage.MAXIMAGES fabio.marccdimage-module.html#MAXIMAGES fabio.marccdimage.logger fabio.marccdimage-module.html#logger fabio.marccdimage.__package__ fabio.marccdimage-module.html#__package__ fabio.marccdimage.C_SIZES fabio.marccdimage-module.html#C_SIZES fabio.openimage fabio.openimage-module.html fabio.openimage.MAGIC_NUMBERS fabio.openimage-module.html#MAGIC_NUMBERS fabio.openimage._openimage fabio.openimage-module.html#_openimage fabio.openimage.do_magic fabio.openimage-module.html#do_magic fabio.openimage.__package__ fabio.openimage-module.html#__package__ fabio.openimage.openheader fabio.openimage-module.html#openheader fabio.openimage.logger fabio.openimage-module.html#logger fabio.openimage.openimage fabio.openimage-module.html#openimage fabio.pilatusimage fabio.pilatusimage-module.html fabio.pilatusimage.__package__ fabio.pilatusimage-module.html#__package__ fabio.pnmimage fabio.pnmimage-module.html fabio.pnmimage.P7HEADERITEMS fabio.pnmimage-module.html#P7HEADERITEMS fabio.pnmimage.SUBFORMATS fabio.pnmimage-module.html#SUBFORMATS fabio.pnmimage.HEADERITEMS fabio.pnmimage-module.html#HEADERITEMS fabio.pnmimage.__package__ fabio.pnmimage-module.html#__package__ fabio.pnmimage.logger fabio.pnmimage-module.html#logger fabio.readbytestream fabio.readbytestream-module.html fabio.readbytestream.__package__ fabio.readbytestream-module.html#__package__ fabio.readbytestream.readbytestream fabio.readbytestream-module.html#readbytestream fabio.readbytestream.DATATYPES fabio.readbytestream-module.html#DATATYPES fabio.readbytestream.logger fabio.readbytestream-module.html#logger fabio.tifimage fabio.tifimage-module.html fabio.tifimage.PIL_TO_NUMPY fabio.tifimage-module.html#PIL_TO_NUMPY fabio.tifimage.TYPESIZES fabio.tifimage-module.html#TYPESIZES fabio.tifimage.__package__ fabio.tifimage-module.html#__package__ fabio.tifimage.logger fabio.tifimage-module.html#logger fabio.tifimage.TYPES fabio.tifimage-module.html#TYPES fabio.tifimage.LITTLE_ENDIAN fabio.tifimage-module.html#LITTLE_ENDIAN fabio.tifimage.baseline_tiff_tags fabio.tifimage-module.html#baseline_tiff_tags fabio.tifimage.BIG_ENDIAN fabio.tifimage-module.html#BIG_ENDIAN fabio.tifimage.__status__ fabio.tifimage-module.html#__status__ fabio.xsdimage fabio.xsdimage-module.html fabio.xsdimage.__package__ fabio.xsdimage-module.html#__package__ fabio.xsdimage.logger fabio.xsdimage-module.html#logger fabio.GEimage.GEimage fabio.GEimage.GEimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.GEimage.GEimage._need_a_seek_to_read fabio.GEimage.GEimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.GEimage.GEimage._makeframename fabio.GEimage.GEimage-class.html#_makeframename fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.GEimage.GEimage.previous fabio.GEimage.GEimage-class.html#previous fabio.GEimage.GEimage._readframe fabio.GEimage.GEimage-class.html#_readframe fabio.GEimage.GEimage.write fabio.GEimage.GEimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.GEimage.GEimage.next fabio.GEimage.GEimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.GEimage.GEimage.read fabio.GEimage.GEimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.GEimage.GEimage.getframe fabio.GEimage.GEimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.GEimage.GEimage._readheader fabio.GEimage.GEimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.GEimage_old.GEimage fabio.GEimage_old.GEimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.write fabio.fabioimage.fabioimage-class.html#write fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.GEimage_old.GEimage.read fabio.GEimage_old.GEimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.GEimage_old.GEimage._readheader fabio.GEimage_old.GEimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.HiPiCimage.HiPiCimage fabio.HiPiCimage.HiPiCimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.write fabio.fabioimage.fabioimage-class.html#write fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.HiPiCimage.HiPiCimage.read fabio.HiPiCimage.HiPiCimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.HiPiCimage.HiPiCimage._readheader fabio.HiPiCimage.HiPiCimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.OXDimage.OXDimage fabio.OXDimage.OXDimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.OXDimage.OXDimage._writeheader fabio.OXDimage.OXDimage-class.html#_writeheader fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.OXDimage.OXDimage.write fabio.OXDimage.OXDimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.OXDimage.OXDimage.read fabio.OXDimage.OXDimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.OXDimage.OXDimage.checkData fabio.OXDimage.OXDimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.OXDimage.OXDimage._readheader fabio.OXDimage.OXDimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.OXDimage.OXDimage.getCompressionRatio fabio.OXDimage.OXDimage-class.html#getCompressionRatio fabio.OXDimage.Section fabio.OXDimage.Section-class.html fabio.OXDimage.Section.getSize fabio.OXDimage.Section-class.html#getSize fabio.OXDimage.Section.__repr__ fabio.OXDimage.Section-class.html#__repr__ fabio.OXDimage.Section.__init__ fabio.OXDimage.Section-class.html#__init__ fabio.OXDimage.Section.setData fabio.OXDimage.Section-class.html#setData fabio.TiffIO.TiffIO fabio.TiffIO.TiffIO-class.html fabio.TiffIO.TiffIO._initEmptyFile fabio.TiffIO.TiffIO-class.html#_initEmptyFile fabio.TiffIO.TiffIO.writeImage fabio.TiffIO.TiffIO-class.html#writeImage fabio.TiffIO.TiffIO.getImageFileDirectories fabio.TiffIO.TiffIO-class.html#getImageFileDirectories fabio.TiffIO.TiffIO.getNumberOfImages fabio.TiffIO.TiffIO-class.html#getNumberOfImages fabio.TiffIO.TiffIO.__makeSureFileIsClosed fabio.TiffIO.TiffIO-class.html#__makeSureFileIsClosed fabio.TiffIO.TiffIO._getOutputIFD fabio.TiffIO.TiffIO-class.html#_getOutputIFD fabio.TiffIO.TiffIO.__init__ fabio.TiffIO.TiffIO-class.html#__init__ fabio.TiffIO.TiffIO._readIFDEntry fabio.TiffIO.TiffIO-class.html#_readIFDEntry fabio.TiffIO.TiffIO._parseImageFileDirectory fabio.TiffIO.TiffIO-class.html#_parseImageFileDirectory fabio.TiffIO.TiffIO.getData fabio.TiffIO.TiffIO-class.html#getData fabio.TiffIO.TiffIO._readImage fabio.TiffIO.TiffIO-class.html#_readImage fabio.TiffIO.TiffIO._updateIFD fabio.TiffIO.TiffIO-class.html#_updateIFD fabio.TiffIO.TiffIO._readInfo fabio.TiffIO.TiffIO-class.html#_readInfo fabio.TiffIO.TiffIO.getInfo fabio.TiffIO.TiffIO-class.html#getInfo fabio.TiffIO.TiffIO._initInternalVariables fabio.TiffIO.TiffIO-class.html#_initInternalVariables fabio.TiffIO.TiffIO.__makeSureFileIsOpen fabio.TiffIO.TiffIO-class.html#__makeSureFileIsOpen fabio.TiffIO.TiffIO.getImage fabio.TiffIO.TiffIO-class.html#getImage fabio.adscimage.adscimage fabio.adscimage.adscimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.adscimage.adscimage.__init__ fabio.adscimage.adscimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.adscimage.adscimage.write fabio.adscimage.adscimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.adscimage.adscimage.read fabio.adscimage.adscimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.adscimage.adscimage._readheader fabio.adscimage.adscimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.binaryimage.binaryimage fabio.binaryimage.binaryimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.binaryimage.binaryimage.__init__ fabio.binaryimage.binaryimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.binaryimage.binaryimage.write fabio.binaryimage.binaryimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.binaryimage.binaryimage.read fabio.binaryimage.binaryimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.binaryimage.binaryimage.swap_needed fabio.binaryimage.binaryimage-class.html#swap_needed fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.fabioimage.fabioimage._readheader fabio.fabioimage.fabioimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.binaryimage.binaryimage.estimate_offset_value fabio.binaryimage.binaryimage-class.html#estimate_offset_value fabio.bruker100image.bruker100image fabio.bruker100image.bruker100image-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.brukerimage.brukerimage.write fabio.brukerimage.brukerimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.brukerimage.brukerimage.__headerstring__ fabio.brukerimage.brukerimage-class.html#__headerstring__ fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.bruker100image.bruker100image.read fabio.bruker100image.bruker100image-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.brukerimage.brukerimage.write2 fabio.brukerimage.brukerimage-class.html#write2 fabio.bruker100image.bruker100image.toPIL16 fabio.bruker100image.bruker100image-class.html#toPIL16 fabio.brukerimage.brukerimage._readheader fabio.brukerimage.brukerimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.brukerimage.brukerimage fabio.brukerimage.brukerimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.brukerimage.brukerimage.write fabio.brukerimage.brukerimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.brukerimage.brukerimage.__headerstring__ fabio.brukerimage.brukerimage-class.html#__headerstring__ fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.brukerimage.brukerimage.read fabio.brukerimage.brukerimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.brukerimage.brukerimage.write2 fabio.brukerimage.brukerimage-class.html#write2 fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.brukerimage.brukerimage._readheader fabio.brukerimage.brukerimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.cbfimage.CIF fabio.cbfimage.CIF-class.html fabio.cbfimage.CIF.exists fabio.cbfimage.CIF-class.html#exists fabio.cbfimage.CIF.popitem fabio.cbfimage.CIF-class.html#popitem fabio.cbfimage.CIF.loadCHIPLOT fabio.cbfimage.CIF-class.html#loadCHIPLOT fabio.cbfimage.CIF.pop fabio.cbfimage.CIF-class.html#pop fabio.cbfimage.CIF.EOL fabio.cbfimage.CIF-class.html#EOL fabio.cbfimage.CIF.__init__ fabio.cbfimage.CIF-class.html#__init__ fabio.cbfimage.CIF.START_COMMENT fabio.cbfimage.CIF-class.html#START_COMMENT fabio.cbfimage.CIF.readCIF fabio.cbfimage.CIF-class.html#readCIF fabio.cbfimage.CIF.isAscii fabio.cbfimage.CIF-class.html#isAscii fabio.cbfimage.CIF.BLANK fabio.cbfimage.CIF-class.html#BLANK fabio.cbfimage.CIF.BINARY_MARKER fabio.cbfimage.CIF-class.html#BINARY_MARKER fabio.cbfimage.CIF._parseCIF fabio.cbfimage.CIF-class.html#_parseCIF fabio.cbfimage.CIF.__setitem__ fabio.cbfimage.CIF-class.html#__setitem__ fabio.cbfimage.CIF.tostring fabio.cbfimage.CIF-class.html#tostring fabio.cbfimage.CIF.saveCIF fabio.cbfimage.CIF-class.html#saveCIF fabio.cbfimage.CIF._splitCIF fabio.cbfimage.CIF-class.html#_splitCIF fabio.cbfimage.CIF.LoopHasKey fabio.cbfimage.CIF-class.html#LoopHasKey fabio.cbfimage.CIF._readCIF fabio.cbfimage.CIF-class.html#_readCIF fabio.cbfimage.CIF.loadCIF fabio.cbfimage.CIF-class.html#loadCIF fabio.cbfimage.CIF._analyseOneLoop fabio.cbfimage.CIF-class.html#_analyseOneLoop fabio.cbfimage.CIF.existsInLoop fabio.cbfimage.CIF-class.html#existsInLoop fabio.cbfimage.cbfimage fabio.cbfimage.cbfimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.cbfimage.cbfimage.__init__ fabio.cbfimage.cbfimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.cbfimage.cbfimage.write fabio.cbfimage.cbfimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.cbfimage.cbfimage.read fabio.cbfimage.cbfimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.cbfimage.cbfimage._readbinary_byte_offset fabio.cbfimage.cbfimage-class.html#_readbinary_byte_offset fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.cbfimage.cbfimage.checkData fabio.cbfimage.cbfimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.cbfimage.cbfimage._readheader fabio.cbfimage.cbfimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.datIO.columnfile fabio.datIO.columnfile-class.html fabio.datIO.columnfile.read fabio.datIO.columnfile-class.html#read fabio.datIO.fabiodata.__init__ fabio.datIO.fabiodata-class.html#__init__ fabio.datIO.fabiodata fabio.datIO.fabiodata-class.html fabio.datIO.fabiodata.read fabio.datIO.fabiodata-class.html#read fabio.datIO.fabiodata.__init__ fabio.datIO.fabiodata-class.html#__init__ fabio.dm3image.dm3image fabio.dm3image.dm3image-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.dm3image.dm3image.readbytes fabio.dm3image.dm3image-class.html#readbytes fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.dm3image.dm3image.__init__ fabio.dm3image.dm3image-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.write fabio.fabioimage.fabioimage-class.html#write fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.dm3image.dm3image.read_tag_group fabio.dm3image.dm3image-class.html#read_tag_group fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.dm3image.dm3image.read fabio.dm3image.dm3image-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.dm3image.dm3image.read_data fabio.dm3image.dm3image-class.html#read_data fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.dm3image.dm3image.read_tag_entry fabio.dm3image.dm3image-class.html#read_tag_entry fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.dm3image.dm3image.read_tag_type fabio.dm3image.dm3image-class.html#read_tag_type fabio.dm3image.dm3image._readheader fabio.dm3image.dm3image-class.html#_readheader fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.edfimage.Frame fabio.edfimage.Frame-class.html fabio.edfimage.Frame.bytecode fabio.edfimage.Frame-class.html#bytecode fabio.edfimage.Frame.setByteCode fabio.edfimage.Frame-class.html#setByteCode fabio.edfimage.Frame.getEdfBlock fabio.edfimage.Frame-class.html#getEdfBlock fabio.edfimage.Frame.__init__ fabio.edfimage.Frame-class.html#__init__ fabio.edfimage.Frame.getData fabio.edfimage.Frame-class.html#getData fabio.edfimage.Frame.setData fabio.edfimage.Frame-class.html#setData fabio.edfimage.Frame.parseheader fabio.edfimage.Frame-class.html#parseheader fabio.edfimage.Frame.data fabio.edfimage.Frame-class.html#data fabio.edfimage.Frame.getByteCode fabio.edfimage.Frame-class.html#getByteCode fabio.edfimage.Frame.swap_needed fabio.edfimage.Frame-class.html#swap_needed fabio.edfimage.edfimage fabio.edfimage.edfimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.edfimage.edfimage.header_keys fabio.edfimage.edfimage-class.html#header_keys fabio.edfimage.edfimage.fastReadData fabio.edfimage.edfimage-class.html#fastReadData fabio.edfimage.edfimage.dim2 fabio.edfimage.edfimage-class.html#dim2 fabio.edfimage.edfimage.header fabio.edfimage.edfimage-class.html#header fabio.edfimage.edfimage.dim1 fabio.edfimage.edfimage-class.html#dim1 fabio.edfimage.edfimage.checkHeader fabio.edfimage.edfimage-class.html#checkHeader fabio.edfimage.edfimage.bytecode fabio.edfimage.edfimage-class.html#bytecode fabio.edfimage.edfimage.setByteCode fabio.edfimage.edfimage-class.html#setByteCode fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.edfimage.edfimage.delHeader fabio.edfimage.edfimage-class.html#delHeader fabio.edfimage.edfimage.next fabio.edfimage.edfimage-class.html#next fabio.edfimage.edfimage.__init__ fabio.edfimage.edfimage-class.html#__init__ fabio.edfimage.edfimage.previous fabio.edfimage.edfimage-class.html#previous fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.edfimage.edfimage.delData fabio.edfimage.edfimage-class.html#delData fabio.edfimage.edfimage._readHeaderBlock fabio.edfimage.edfimage-class.html#_readHeaderBlock fabio.edfimage.edfimage.delHeaderKeys fabio.edfimage.edfimage-class.html#delHeaderKeys fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.edfimage.edfimage.data fabio.edfimage.edfimage-class.html#data fabio.edfimage.edfimage.appendFrame fabio.edfimage.edfimage-class.html#appendFrame fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.edfimage.edfimage.nframes fabio.edfimage.edfimage-class.html#nframes fabio.edfimage.edfimage.write fabio.edfimage.edfimage-class.html#write fabio.edfimage.edfimage.getNbFrames fabio.edfimage.edfimage-class.html#getNbFrames fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.edfimage.edfimage.setDim2 fabio.edfimage.edfimage-class.html#setDim2 fabio.edfimage.edfimage.getCapsHeader fabio.edfimage.edfimage-class.html#getCapsHeader fabio.edfimage.edfimage.capsHeader fabio.edfimage.edfimage-class.html#capsHeader fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.edfimage.edfimage.fastReadROI fabio.edfimage.edfimage-class.html#fastReadROI fabio.edfimage.edfimage.setData fabio.edfimage.edfimage-class.html#setData fabio.edfimage.edfimage.delCapsHeader fabio.edfimage.edfimage-class.html#delCapsHeader fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.edfimage.edfimage.read fabio.edfimage.edfimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.edfimage.edfimage.getframe fabio.edfimage.edfimage-class.html#getframe fabio.edfimage.edfimage.getDim1 fabio.edfimage.edfimage-class.html#getDim1 fabio.edfimage.edfimage.getByteCode fabio.edfimage.edfimage-class.html#getByteCode fabio.edfimage.edfimage.getDim2 fabio.edfimage.edfimage-class.html#getDim2 fabio.edfimage.edfimage.setCapsHeader fabio.edfimage.edfimage-class.html#setCapsHeader fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.edfimage.edfimage.setBpp fabio.edfimage.edfimage-class.html#setBpp fabio.edfimage.edfimage.getDims fabio.edfimage.edfimage-class.html#getDims fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.edfimage.edfimage.unpack fabio.edfimage.edfimage-class.html#unpack fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.edfimage.edfimage.setHeaderKeys fabio.edfimage.edfimage-class.html#setHeaderKeys fabio.edfimage.edfimage.getData fabio.edfimage.edfimage-class.html#getData fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.edfimage.edfimage.dims fabio.edfimage.edfimage-class.html#dims fabio.edfimage.edfimage.swap_needed fabio.edfimage.edfimage-class.html#swap_needed fabio.edfimage.edfimage.getHeader fabio.edfimage.edfimage-class.html#getHeader fabio.edfimage.edfimage.deleteFrame fabio.edfimage.edfimage-class.html#deleteFrame fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.edfimage.edfimage.getHeaderKeys fabio.edfimage.edfimage-class.html#getHeaderKeys fabio.edfimage.edfimage.setDim1 fabio.edfimage.edfimage-class.html#setDim1 fabio.edfimage.edfimage.bpp fabio.edfimage.edfimage-class.html#bpp fabio.edfimage.edfimage._readheader fabio.edfimage.edfimage-class.html#_readheader fabio.edfimage.edfimage.getBpp fabio.edfimage.edfimage-class.html#getBpp fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.edfimage.edfimage.setNbFrames fabio.edfimage.edfimage-class.html#setNbFrames fabio.edfimage.edfimage.setHeader fabio.edfimage.edfimage-class.html#setHeader fabio.fabioimage.fabioimage fabio.fabioimage.fabioimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.write fabio.fabioimage.fabioimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.fabioimage.fabioimage.read fabio.fabioimage.fabioimage-class.html#read fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.fabioimage.fabioimage._readheader fabio.fabioimage.fabioimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.fabioutils.BZ2File fabio.fabioutils.BZ2File-class.html fabio.fabioutils.BZ2File.getSize fabio.fabioutils.BZ2File-class.html#getSize fabio.fabioutils.BZ2File.__init__ fabio.fabioutils.BZ2File-class.html#__init__ fabio.fabioutils.BZ2File.size fabio.fabioutils.BZ2File-class.html#size fabio.fabioutils.BZ2File.setSize fabio.fabioutils.BZ2File-class.html#setSize fabio.fabioutils.File fabio.fabioutils.File-class.html fabio.fabioutils.File.getSize fabio.fabioutils.File-class.html#getSize fabio.fabioutils.File.__init__ fabio.fabioutils.File-class.html#__init__ fabio.fabioutils.File.size fabio.fabioutils.File-class.html#size fabio.fabioutils.File.setSize fabio.fabioutils.File-class.html#setSize fabio.fabioutils.FilenameObject fabio.fabioutils.FilenameObject-class.html fabio.fabioutils.FilenameObject.deconstruct_filename fabio.fabioutils.FilenameObject-class.html#deconstruct_filename fabio.fabioutils.FilenameObject.tostring fabio.fabioutils.FilenameObject-class.html#tostring fabio.fabioutils.FilenameObject.__repr__ fabio.fabioutils.FilenameObject-class.html#__repr__ fabio.fabioutils.FilenameObject.str fabio.fabioutils.FilenameObject-class.html#str fabio.fabioutils.FilenameObject.__init__ fabio.fabioutils.FilenameObject-class.html#__init__ fabio.fabioutils.GzipFile fabio.fabioutils.GzipFile-class.html fabio.fabioutils.GzipFile.getSize fabio.fabioutils.GzipFile-class.html#getSize fabio.fabioutils.GzipFile.seek fabio.fabioutils.GzipFile-class.html#seek fabio.fabioutils.GzipFile.__init__ fabio.fabioutils.GzipFile-class.html#__init__ fabio.fabioutils.GzipFile.size fabio.fabioutils.GzipFile-class.html#size fabio.fabioutils.GzipFile.closed fabio.fabioutils.GzipFile-class.html#closed fabio.fabioutils.GzipFile.setSize fabio.fabioutils.GzipFile-class.html#setSize fabio.fabioutils.StringIO fabio.fabioutils.StringIO-class.html fabio.fabioutils.StringIO.getSize fabio.fabioutils.StringIO-class.html#getSize fabio.fabioutils.StringIO.setSize fabio.fabioutils.StringIO-class.html#setSize fabio.fabioutils.StringIO.__init__ fabio.fabioutils.StringIO-class.html#__init__ fabio.fabioutils.StringIO.size fabio.fabioutils.StringIO-class.html#size fabio.fabioutils.UnknownCompressedFile fabio.fabioutils.UnknownCompressedFile-class.html fabio.fabioutils.File.getSize fabio.fabioutils.File-class.html#getSize fabio.fabioutils.UnknownCompressedFile.__init__ fabio.fabioutils.UnknownCompressedFile-class.html#__init__ fabio.fabioutils.File.size fabio.fabioutils.File-class.html#size fabio.fabioutils.File.setSize fabio.fabioutils.File-class.html#setSize fabio.file_series.file_series fabio.file_series.file_series-class.html fabio.file_series.file_series.jump fabio.file_series.file_series-class.html#jump fabio.file_series.file_series.__init__ fabio.file_series.file_series-class.html#__init__ fabio.file_series.file_series.previous fabio.file_series.file_series-class.html#previous fabio.file_series.file_series.next_object fabio.file_series.file_series-class.html#next_object fabio.file_series.file_series.last_image fabio.file_series.file_series-class.html#last_image fabio.file_series.file_series.next fabio.file_series.file_series-class.html#next fabio.file_series.file_series.current fabio.file_series.file_series-class.html#current fabio.file_series.file_series.current_object fabio.file_series.file_series-class.html#current_object fabio.file_series.file_series.first_image fabio.file_series.file_series-class.html#first_image fabio.file_series.file_series.jump_object fabio.file_series.file_series-class.html#jump_object fabio.file_series.file_series.next_image fabio.file_series.file_series-class.html#next_image fabio.file_series.file_series.last_object fabio.file_series.file_series-class.html#last_object fabio.file_series.file_series.len fabio.file_series.file_series-class.html#len fabio.file_series.file_series.jump_image fabio.file_series.file_series-class.html#jump_image fabio.file_series.file_series.first_object fabio.file_series.file_series-class.html#first_object fabio.file_series.file_series.current_image fabio.file_series.file_series-class.html#current_image fabio.file_series.file_series.previous_object fabio.file_series.file_series-class.html#previous_object fabio.file_series.file_series.last fabio.file_series.file_series-class.html#last fabio.file_series.file_series.previous_image fabio.file_series.file_series-class.html#previous_image fabio.file_series.file_series.first fabio.file_series.file_series-class.html#first fabio.file_series.filename_series fabio.file_series.filename_series-class.html fabio.file_series.filename_series.next_object fabio.file_series.filename_series-class.html#next_object fabio.file_series.filename_series.current fabio.file_series.filename_series-class.html#current fabio.file_series.filename_series.prev_image fabio.file_series.filename_series-class.html#prev_image fabio.file_series.filename_series.previous_object fabio.file_series.filename_series-class.html#previous_object fabio.file_series.filename_series.next fabio.file_series.filename_series-class.html#next fabio.file_series.filename_series.jump fabio.file_series.filename_series-class.html#jump fabio.file_series.filename_series.current_object fabio.file_series.filename_series-class.html#current_object fabio.file_series.filename_series.jump_image fabio.file_series.filename_series-class.html#jump_image fabio.file_series.filename_series.jump_object fabio.file_series.filename_series-class.html#jump_object fabio.file_series.filename_series.previous fabio.file_series.filename_series-class.html#previous fabio.file_series.filename_series.current_image fabio.file_series.filename_series-class.html#current_image fabio.file_series.filename_series.__init__ fabio.file_series.filename_series-class.html#__init__ fabio.file_series.filename_series.next_image fabio.file_series.filename_series-class.html#next_image fabio.file_series.numbered_file_series fabio.file_series.numbered_file_series-class.html fabio.file_series.file_series.jump fabio.file_series.file_series-class.html#jump fabio.file_series.numbered_file_series.__init__ fabio.file_series.numbered_file_series-class.html#__init__ fabio.file_series.file_series.next_image fabio.file_series.file_series-class.html#next_image fabio.file_series.file_series.next_object fabio.file_series.file_series-class.html#next_object fabio.file_series.file_series.last_image fabio.file_series.file_series-class.html#last_image fabio.file_series.file_series.next fabio.file_series.file_series-class.html#next fabio.file_series.file_series.current fabio.file_series.file_series-class.html#current fabio.file_series.file_series.current_object fabio.file_series.file_series-class.html#current_object fabio.file_series.file_series.first_image fabio.file_series.file_series-class.html#first_image fabio.file_series.file_series.jump_object fabio.file_series.file_series-class.html#jump_object fabio.file_series.file_series.previous fabio.file_series.file_series-class.html#previous fabio.file_series.file_series.last_object fabio.file_series.file_series-class.html#last_object fabio.file_series.file_series.len fabio.file_series.file_series-class.html#len fabio.file_series.file_series.previous_object fabio.file_series.file_series-class.html#previous_object fabio.file_series.file_series.last fabio.file_series.file_series-class.html#last fabio.file_series.file_series.current_image fabio.file_series.file_series-class.html#current_image fabio.file_series.file_series.jump_image fabio.file_series.file_series-class.html#jump_image fabio.file_series.file_series.first_object fabio.file_series.file_series-class.html#first_object fabio.file_series.file_series.first fabio.file_series.file_series-class.html#first fabio.file_series.file_series.previous_image fabio.file_series.file_series-class.html#previous_image fabio.fit2dmaskimage.fit2dmaskimage fabio.fit2dmaskimage.fit2dmaskimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fit2dmaskimage.fit2dmaskimage.write fabio.fit2dmaskimage.fit2dmaskimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.fit2dmaskimage.fit2dmaskimage.read fabio.fit2dmaskimage.fit2dmaskimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fit2dmaskimage.fit2dmaskimage.checkData fabio.fit2dmaskimage.fit2dmaskimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.fit2dmaskimage.fit2dmaskimage._readheader fabio.fit2dmaskimage.fit2dmaskimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.fit2dspreadsheetimage.fit2dspreadsheetimage fabio.fit2dspreadsheetimage.fit2dspreadsheetimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.write fabio.fabioimage.fabioimage-class.html#write fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.fit2dspreadsheetimage.fit2dspreadsheetimage.read fabio.fit2dspreadsheetimage.fit2dspreadsheetimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.fit2dspreadsheetimage.fit2dspreadsheetimage._readheader fabio.fit2dspreadsheetimage.fit2dspreadsheetimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.kcdimage.kcdimage fabio.kcdimage.kcdimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.__init__ fabio.fabioimage.fabioimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.write fabio.fabioimage.fabioimage-class.html#write fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.kcdimage.kcdimage.read fabio.kcdimage.kcdimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.kcdimage.kcdimage.checkData fabio.kcdimage.kcdimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.kcdimage.kcdimage._readheader fabio.kcdimage.kcdimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.mar345image.mar345image fabio.mar345image.mar345image-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.mar345image.mar345image._writeheader fabio.mar345image.mar345image-class.html#_writeheader fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.mar345image.mar345image.nb_overflow_pixels fabio.mar345image.mar345image-class.html#nb_overflow_pixels fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.mar345image.mar345image.__init__ fabio.mar345image.mar345image-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.mar345image.mar345image.write fabio.mar345image.mar345image-class.html#write fabio.mar345image.mar345image._high_intensity_pixel_records fabio.mar345image.mar345image-class.html#_high_intensity_pixel_records fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.mar345image.mar345image.read fabio.mar345image.mar345image-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.mar345image.mar345image.checkData fabio.mar345image.mar345image-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.mar345image.mar345image._need_a_real_file fabio.mar345image.mar345image-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.mar345image.mar345image._readheader fabio.mar345image.mar345image-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.marccdimage.marccdimage fabio.marccdimage.marccdimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.tifimage.tifimage._need_a_seek_to_read fabio.tifimage.tifimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.tifimage.tifimage.__init__ fabio.tifimage.tifimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.tifimage.tifimage.write fabio.tifimage.tifimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.tifimage.tifimage.read fabio.tifimage.tifimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.marccdimage.marccdimage._read fabio.marccdimage.marccdimage-class.html#_read fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.marccdimage.marccdimage._readheader fabio.marccdimage.marccdimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.pilatusimage.pilatusimage fabio.pilatusimage.pilatusimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.tifimage.tifimage._need_a_seek_to_read fabio.tifimage.tifimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.tifimage.tifimage.__init__ fabio.tifimage.tifimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.tifimage.tifimage.write fabio.tifimage.tifimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.tifimage.tifimage.read fabio.tifimage.tifimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.pilatusimage.pilatusimage._read fabio.pilatusimage.pilatusimage-class.html#_read fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.pilatusimage.pilatusimage._readheader fabio.pilatusimage.pilatusimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.pnmimage.pnmimage fabio.pnmimage.pnmimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.pnmimage.pnmimage.P7dec fabio.pnmimage.pnmimage-class.html#P7dec fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.pnmimage.pnmimage.__init__ fabio.pnmimage.pnmimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.pnmimage.pnmimage.P2dec fabio.pnmimage.pnmimage-class.html#P2dec fabio.pnmimage.pnmimage.write fabio.pnmimage.pnmimage-class.html#write fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.pnmimage.pnmimage.P6dec fabio.pnmimage.pnmimage-class.html#P6dec fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.pnmimage.pnmimage.P3dec fabio.pnmimage.pnmimage-class.html#P3dec fabio.pnmimage.pnmimage.read fabio.pnmimage.pnmimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.pnmimage.pnmimage.P5dec fabio.pnmimage.pnmimage-class.html#P5dec fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.pnmimage.pnmimage.P1dec fabio.pnmimage.pnmimage-class.html#P1dec fabio.pnmimage.pnmimage.checkData fabio.pnmimage.pnmimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.pnmimage.pnmimage.P4dec fabio.pnmimage.pnmimage-class.html#P4dec fabio.pnmimage.pnmimage._readheader fabio.pnmimage.pnmimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.tifimage.Image_File_Directory fabio.tifimage.Image_File_Directory-class.html fabio.tifimage.Image_File_Directory.unpack fabio.tifimage.Image_File_Directory-class.html#unpack fabio.tifimage.Image_File_Directory.__init__ fabio.tifimage.Image_File_Directory-class.html#__init__ fabio.tifimage.Image_File_Directory_entry fabio.tifimage.Image_File_Directory_entry-class.html fabio.tifimage.Image_File_Directory_entry.extract_data fabio.tifimage.Image_File_Directory_entry-class.html#extract_data fabio.tifimage.Image_File_Directory_entry.unpack fabio.tifimage.Image_File_Directory_entry-class.html#unpack fabio.tifimage.Image_File_Directory_entry.__init__ fabio.tifimage.Image_File_Directory_entry-class.html#__init__ fabio.tifimage.Tiff_header fabio.tifimage.Tiff_header-class.html fabio.tifimage.Tiff_header.__init__ fabio.tifimage.Tiff_header-class.html#__init__ fabio.tifimage.tifimage fabio.tifimage.tifimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.tifimage.tifimage._need_a_seek_to_read fabio.tifimage.tifimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.tifimage.tifimage.__init__ fabio.tifimage.tifimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.tifimage.tifimage.write fabio.tifimage.tifimage-class.html#write fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.tifimage.tifimage.read fabio.tifimage.tifimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.tifimage.tifimage._readheader fabio.tifimage.tifimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname fabio.xsdimage.xsdimage fabio.xsdimage.xsdimage-class.html fabio.fabioimage.fabioimage.load fabio.fabioimage.fabioimage-class.html#load fabio.fabioimage.fabioimage._need_a_seek_to_read fabio.fabioimage.fabioimage-class.html#_need_a_seek_to_read fabio.fabioimage.fabioimage.getheader fabio.fabioimage.fabioimage-class.html#getheader fabio.fabioimage.fabioimage.resetvals fabio.fabioimage.fabioimage-class.html#resetvals fabio.fabioimage.fabioimage.classname fabio.fabioimage.fabioimage-class.html#classname fabio.fabioimage.fabioimage.checkHeader fabio.fabioimage.fabioimage-class.html#checkHeader fabio.fabioimage.fabioimage.integrate_area fabio.fabioimage.fabioimage-class.html#integrate_area fabio.xsdimage.xsdimage.__init__ fabio.xsdimage.xsdimage-class.html#__init__ fabio.fabioimage.fabioimage.previous fabio.fabioimage.fabioimage-class.html#previous fabio.fabioimage.fabioimage.getmean fabio.fabioimage.fabioimage-class.html#getmean fabio.fabioimage.fabioimage.rebin fabio.fabioimage.fabioimage-class.html#rebin fabio.fabioimage.fabioimage._open fabio.fabioimage.fabioimage-class.html#_open fabio.fabioimage.fabioimage.next fabio.fabioimage.fabioimage-class.html#next fabio.fabioimage.fabioimage.write fabio.fabioimage.fabioimage-class.html#write fabio.fabioimage.fabioimage.add fabio.fabioimage.fabioimage-class.html#add fabio.fabioimage.fabioimage.getstddev fabio.fabioimage.fabioimage-class.html#getstddev fabio.fabioimage.fabioimage.getmin fabio.fabioimage.fabioimage-class.html#getmin fabio.fabioimage.fabioimage.readROI fabio.fabioimage.fabioimage-class.html#readROI fabio.fabioimage.fabioimage.getmax fabio.fabioimage.fabioimage-class.html#getmax fabio.fabioimage.fabioimage.save fabio.fabioimage.fabioimage-class.html#save fabio.fabioimage.fabioimage.make_slice fabio.fabioimage.fabioimage-class.html#make_slice fabio.xsdimage.xsdimage.read fabio.xsdimage.xsdimage-class.html#read fabio.fabioimage.fabioimage._compressed_stream fabio.fabioimage.fabioimage-class.html#_compressed_stream fabio.fabioimage.fabioimage.getframe fabio.fabioimage.fabioimage-class.html#getframe fabio.fabioimage.fabioimage.readheader fabio.fabioimage.fabioimage-class.html#readheader fabio.fabioimage.fabioimage.checkData fabio.fabioimage.fabioimage-class.html#checkData fabio.fabioimage.fabioimage.update_header fabio.fabioimage.fabioimage-class.html#update_header fabio.fabioimage.fabioimage.convert fabio.fabioimage.fabioimage-class.html#convert fabio.fabioimage.fabioimage._need_a_real_file fabio.fabioimage.fabioimage-class.html#_need_a_real_file fabio.fabioimage.fabioimage.toPIL16 fabio.fabioimage.fabioimage-class.html#toPIL16 fabio.xsdimage.xsdimage._readheader fabio.xsdimage.xsdimage-class.html#_readheader fabio.fabioimage.fabioimage.getclassname fabio.fabioimage.fabioimage-class.html#getclassname str str-class.html str.upper str-class.html#upper str.__getslice__ str-class.html#__getslice__ str.__ne__ str-class.html#__ne__ str.lstrip str-class.html#lstrip str.__str__ str-class.html#__str__ str.__getattribute__ str-class.html#__getattribute__ str.rpartition str-class.html#rpartition str.replace str-class.html#replace str.isdigit str-class.html#isdigit str.endswith str-class.html#endswith str.splitlines str-class.html#splitlines str.rfind str-class.html#rfind str.strip str-class.html#strip str.__rmul__ str-class.html#__rmul__ str.__lt__ str-class.html#__lt__ str.__getnewargs__ str-class.html#__getnewargs__ str.__rmod__ str-class.html#__rmod__ str.index str-class.html#index str.ljust str-class.html#ljust str.__new__ str-class.html#__new__ str.isalnum str-class.html#isalnum str.__contains__ str-class.html#__contains__ str.rindex str-class.html#rindex str.rsplit str-class.html#rsplit str.__format__ str-class.html#__format__ str.find str-class.html#find str.decode str-class.html#decode str.isalpha str-class.html#isalpha str.__eq__ str-class.html#__eq__ str.split str-class.html#split str.rstrip str-class.html#rstrip str.encode str-class.html#encode str._formatter_parser str-class.html#_formatter_parser str.translate str-class.html#translate str.isspace str-class.html#isspace str.__len__ str-class.html#__len__ str.__repr__ str-class.html#__repr__ str.startswith str-class.html#startswith str.__getitem__ str-class.html#__getitem__ str.format str-class.html#format str.rjust str-class.html#rjust str.swapcase str-class.html#swapcase str.__hash__ str-class.html#__hash__ str.zfill str-class.html#zfill str.__add__ str-class.html#__add__ str.__gt__ str-class.html#__gt__ str.capitalize str-class.html#capitalize str.__sizeof__ str-class.html#__sizeof__ str.count str-class.html#count str.lower str-class.html#lower str.join str-class.html#join str.center str-class.html#center str.__mod__ str-class.html#__mod__ str.partition str-class.html#partition str.expandtabs str-class.html#expandtabs str.istitle str-class.html#istitle str.__le__ str-class.html#__le__ str.__mul__ str-class.html#__mul__ str._formatter_field_name_split str-class.html#_formatter_field_name_split str.islower str-class.html#islower str.title str-class.html#title str.isupper str-class.html#isupper str.__ge__ str-class.html#__ge__ fabio-0.1.3/epydoc/fabio.fit2dspreadsheetimage.fit2dspreadsheetimage-class.html0000644000175000017500000003704712126623347030440 0ustar jeromejerome00000000000000 fabio.fit2dspreadsheetimage.fit2dspreadsheetimage
        Package fabio :: Module fit2dspreadsheetimage :: Class fit2dspreadsheetimage
        [hide private]
        [frames] | no frames]

        Class fit2dspreadsheetimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               fit2dspreadsheetimage
        

        Read a fit2d ascii format

        Instance Methods [hide private]
         
        _readheader(self, infile)
        TODO : test for minimal attributes?
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header, write

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        TODO : test for minimal attributes?

        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        fabio-0.1.3/epydoc/fabio.dm3image.dm3image-class.html0000644000175000017500000005026512126623347023103 0ustar jeromejerome00000000000000 fabio.dm3image.dm3image
        Package fabio :: Module dm3image :: Class dm3image
        [hide private]
        [frames] | no frames]

        Class dm3image

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               dm3image
        

        Read and try to write the dm3 data format

        Instance Methods [hide private]
         
        __init__(self, *args, **kwargs)
        Set up initial values
        source code
         
        _readheader(self)
        Must be overridden in classes
        source code
         
        read(self, fname, frame=None)
        To be overridden - fill in self.header and self.data
        source code
         
        readbytes(self, bytes_to_read, format, swap=True) source code
         
        read_tag_group(self) source code
         
        read_tag_entry(self) source code
         
        read_tag_type(self) source code
         
        read_data(self) source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header, write

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, *args, **kwargs)
        (Constructor)

        source code 

        Set up initial values

        Overrides: object.__init__
        (inherited documentation)

        _readheader(self)

        source code 

        Must be overridden in classes

        Overrides: fabioimage.fabioimage._readheader
        (inherited documentation)

        read(self, fname, frame=None)

        source code 

        To be overridden - fill in self.header and self.data

        Overrides: fabioimage.fabioimage.read
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.TiffIO.TiffIO-class.html0000644000175000017500000005145012126623347022164 0ustar jeromejerome00000000000000 fabio.TiffIO.TiffIO
        Package fabio :: Module TiffIO :: Class TiffIO
        [hide private]
        [frames] | no frames]

        Class TiffIO

        source code

        object --+
                 |
                TiffIO
        

        Instance Methods [hide private]
         
        __init__(self, filename, mode=None, cache_length=20, mono_output=False)
        x.__init__(...) initializes x; see x.__class__.__doc__ for signature
        source code
         
        _initInternalVariables(self, fd=None) source code
         
        __makeSureFileIsOpen(self) source code
         
        __makeSureFileIsClosed(self) source code
         
        getNumberOfImages(self) source code
         
        _updateIFD(self) source code
         
        getImageFileDirectories(self, fd=None) source code
         
        _parseImageFileDirectory(self, nImage) source code
         
        _readIFDEntry(self, tag, tagIDList, fieldTypeList, nValuesList, valueOffsetList) source code
         
        getData(self, nImage, **kw) source code
         
        getImage(self, nImage) source code
         
        getInfo(self, nImage, **kw) source code
         
        _readInfo(self, nImage, close=True) source code
         
        _readImage(self, nImage, **kw) source code
         
        writeImage(self, image0, info=None, software=None, date=None) source code
         
        _initEmptyFile(self, fd=None) source code
         
        _getOutputIFD(self, image, description=None, software=None, date=None) source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, filename, mode=None, cache_length=20, mono_output=False)
        (Constructor)

        source code 

        x.__init__(...) initializes x; see x.__class__.__doc__ for signature

        Overrides: object.__init__
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.adscimage-module.html0000644000175000017500000001673312126623347022027 0ustar jeromejerome00000000000000 fabio.adscimage
        Package fabio :: Module adscimage
        [hide private]
        [frames] | no frames]

        Module adscimage

        source code

        
        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:erik.knudsen@risoe.dk
        
        + mods for fabio by JPW
        
        
        Classes [hide private]
          adscimage
        Read an image in ADSC format (quite similar to edf?)
        Functions [hide private]
         
        test()
        testcase
        source code
        Variables [hide private]
          logger = logging.getLogger("adscimage")
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.cbfimage-pysrc.html0000644000175000017500000075143012126623347021522 0ustar jeromejerome00000000000000 fabio.cbfimage
        Package fabio :: Module cbfimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.cbfimage

          1  #!/usr/bin/env python 
          2  # coding: utf8 
          3  """ 
          4  Authors: Jérôme Kieffer, ESRF 
          5           email:jerome.kieffer@esrf.fr 
          6   
          7  Cif Binary Files images are 2D images written by the Pilatus detector and others. 
          8  They use a modified (simplified) byte-offset algorithm. 
          9   
         10  CIF is a library for manipulating Crystallographic information files and tries 
         11  to conform to the specification of the IUCR 
         12  """ 
         13  __author__ = "Jérôme Kieffer" 
         14  __contact__ = "jerome.kieffer@esrf.eu" 
         15  __license__ = "GPLv3+" 
         16  __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" 
         17  __version__ = ["Generated by CIF.py: Jan 2005 - April 2012", 
         18                "Written by Jerome Kieffer: Jerome.Kieffer@esrf.eu", 
         19                "On-line data analysis / ISDD ", "ESRF Grenoble (France)"] 
         20   
         21   
         22  import os, logging 
         23  logger = logging.getLogger("cbfimage") 
         24  import numpy 
         25  from fabioimage import fabioimage 
         26  from compression import decByteOffet_numpy, md5sum, compByteOffet_numpy 
         27  #import time 
         28   
         29  DATA_TYPES = { "signed 8-bit integer"   : numpy.int8, 
         30                 "signed 16-bit integer"  : numpy.int16, 
         31                 "signed 32-bit integer"  : numpy.int32, 
         32                 "signed 64-bit integer"  : numpy.int64 
         33                  } 
         34   
         35  MINIMUM_KEYS = ["X-Binary-Size-Fastest-Dimension", 
         36                  'ByteOrder', 
         37                  'Data type', 
         38                  'X dimension', 
         39                  'Y dimension', 
         40                  'Number of readouts'] 
         41   
         42   
         43  STARTER = "\x0c\x1a\x04\xd5" 
         44  PADDING = 512 
        
        45 46 -class cbfimage(fabioimage):
        47 """ 48 Read the Cif Binary File data format 49 """
        50 - def __init__(self, data=None , header=None, fname=None):
        51 """ 52 Constructor of the class CIF Binary File reader. 53 54 @param _strFilename: the name of the file to open 55 @type _strFilename: string 56 """ 57 fabioimage.__init__(self, data, header) 58 self.cif = CIF() 59 if fname is not None: #load the file) 60 self.read(fname)
        61 62 @staticmethod
        63 - def checkData(data=None):
        64 if data is None: 65 return None 66 elif numpy.issubdtype(data.dtype, int): 67 return data 68 else: 69 return data.astype(int)
        70 71
        72 - def _readheader(self, inStream):
        73 """ 74 Read in a header in some CBF format from a string representing binary stuff 75 76 @param inStream: file containing the Cif Binary part. 77 @type inStream: opened file. 78 """ 79 self.cif.loadCIF(inStream, _bKeepComment=True) 80 81 # backport contents of the CIF data to the headers 82 for key in self.cif: 83 if key != "_array_data.data": 84 self.header_keys.append(key) 85 self.header[key] = self.cif[key].strip(" \"\n\r\t") 86 87 if not "_array_data.data" in self.cif: 88 raise Exception("cbfimage: CBF file %s is corrupt, cannot find data block with '_array_data.data' key" % self.fname) 89 90 inStream2 = self.cif["_array_data.data"] 91 sep = "\r\n" 92 iSepPos = inStream2.find(sep) 93 if iSepPos < 0 or iSepPos > 80: 94 sep = "\n" #switch back to unix representation 95 96 lines = inStream2.split(sep) 97 for oneLine in lines[1:]: 98 if len(oneLine) < 10: 99 break 100 try: 101 key, val = oneLine.split(':' , 1) 102 except ValueError: 103 key, val = oneLine.split('=' , 1) 104 key = key.strip() 105 self.header_keys.append(key) 106 self.header[key] = val.strip(" \"\n\r\t") 107 missing = [] 108 for item in MINIMUM_KEYS: 109 if item not in self.header_keys: 110 missing.append(item) 111 if len(missing) > 0: 112 logger.debug("CBF file misses the keys " + " ".join(missing))
        113 114
        115 - def read(self, fname, frame=None):
        116 """ 117 Read in header into self.header and 118 the data into self.data 119 """ 120 self.filename = fname 121 self.header = {} 122 self.resetvals() 123 124 infile = self._open(fname, "rb") 125 self._readheader(infile) 126 # Compute image size 127 try: 128 self.dim1 = int(self.header['X-Binary-Size-Fastest-Dimension']) 129 self.dim2 = int(self.header['X-Binary-Size-Second-Dimension']) 130 except: 131 raise Exception(IOError, "CBF file %s is corrupt, no dimensions in it" % fname) 132 try: 133 bytecode = DATA_TYPES[self.header['X-Binary-Element-Type']] 134 self.bpp = len(numpy.array(0, bytecode).tostring()) 135 except KeyError: 136 bytecode = numpy.int32 137 self.bpp = 32 138 logger.warning("Defaulting type to int32") 139 if self.header["conversions"] == "x-CBF_BYTE_OFFSET": 140 self.data = self._readbinary_byte_offset(self.cif["_array_data.data"]).astype(bytecode).reshape((self.dim2, self.dim1)) 141 else: 142 raise Exception(IOError, "Compression scheme not yet supported, please contact FABIO development team") 143 144 self.bytecode = self.data.dtype.type 145 self.resetvals() 146 # # ensure the PIL image is reset 147 self.pilimage = None 148 return self
        149 150 151
        152 - def _readbinary_byte_offset(self, inStream):
        153 """ 154 Read in a binary part of an x-CBF_BYTE_OFFSET compressed image 155 156 @param inStream: the binary image (without any CIF decorators) 157 @type inStream: python string. 158 @return: a linear numpy array without shape and dtype set 159 @rtype: numpy array 160 """ 161 startPos = inStream.find(STARTER) + 4 162 data = inStream[ startPos: startPos + int(self.header["X-Binary-Size"])] 163 try: 164 import byte_offset 165 except ImportError: 166 logger.warning("Error in byte_offset part: Falling back to Numpy implementation") 167 myData = decByteOffet_numpy(data, size=self.dim1 * self.dim2) 168 else: 169 myData = byte_offset.analyseCython(data, size=self.dim1 * self.dim2) 170 171 assert len(myData) == self.dim1 * self.dim2 172 return myData
        173 174
        175 - def write(self, fname):
        176 """ 177 write the file in CBF format 178 @param fname: name of the file 179 @type: string 180 """ 181 if self.data is not None: 182 self.dim2, self.dim1 = self.data.shape 183 else: 184 raise RuntimeError("CBF image contains no data") 185 binary_blob = compByteOffet_numpy(self.data) 186 # l = len(binary_blob) 187 # if (l % PADDING) != 0: 188 # rem = PADDING - (l % PADDING) 189 # binary_blob += "\x00" * rem 190 dtype = "Unknown" 191 for key, value in DATA_TYPES.iteritems(): 192 if value == self.data.dtype: 193 dtype = key 194 binary_block = [ 195 "--CIF-BINARY-FORMAT-SECTION--", 196 "Content-Type: application/octet-stream;", 197 ' conversions="x-CBF_BYTE_OFFSET"', 198 'Content-Transfer-Encoding: BINARY', 199 "X-Binary-Size: %d" % (len(binary_blob)), 200 "X-Binary-ID: 1", 201 'X-Binary-Element-Type: "%s"' % (dtype), 202 "X-Binary-Element-Byte-Order: LITTLE_ENDIAN" , 203 "Content-MD5: %s" % md5sum(binary_blob), 204 "X-Binary-Number-of-Elements: %s" % (self.dim1 * self.dim2), 205 "X-Binary-Size-Fastest-Dimension: %d" % self.dim1, 206 "X-Binary-Size-Second-Dimension: %d" % self.dim2, 207 "X-Binary-Size-Padding: %d" % 1, 208 "", 209 STARTER + binary_blob, 210 "", 211 "--CIF-BINARY-FORMAT-SECTION----" 212 ] 213 214 if "_array_data.header_contents" not in self.header: 215 nonCifHeaders = [] 216 else: 217 nonCifHeaders = [i.strip()[2:] for i in self.header["_array_data.header_contents"].split("\n") if i.find("# ") >= 0] 218 219 for key in self.header: 220 if (key not in self.header_keys): 221 self.header_keys.append(key) 222 for key in self.header_keys: 223 if key.startswith("_") : 224 if key not in self.cif or self.cif[key] != self.header[key]: 225 self.cif[key] = self.header[key] 226 elif key.startswith("X-Binary-"): 227 pass 228 elif key.startswith("Content-"): 229 pass 230 elif key.startswith("conversions"): 231 pass 232 elif key.startswith("filename"): 233 pass 234 elif key in self.header: 235 nonCifHeaders.append("%s %s" % (key, self.header[key])) 236 if len(nonCifHeaders) > 0: 237 self.cif["_array_data.header_contents"] = "\r\n".join(["# %s" % i for i in nonCifHeaders]) 238 239 self.cif["_array_data.data"] = "\r\n".join(binary_block) 240 self.cif.saveCIF(fname, linesep="\r\n", binary=True)
        241
        242 ################################################################################ 243 # CIF class 244 ################################################################################ 245 -class CIF(dict):
        246 """ 247 This is the CIF class, it represents the CIF dictionary; 248 and as a a python dictionary thus inherits from the dict built in class. 249 """ 250 EOL = ["\r", "\n", "\r\n", "\n\r"] 251 BLANK = [" ", "\t"] + EOL 252 START_COMMENT = ["\"", "\'"] 253 BINARY_MARKER = "--CIF-BINARY-FORMAT-SECTION--" 254
        255 - def __init__(self, _strFilename=None):
        256 """ 257 Constructor of the class. 258 259 @param _strFilename: the name of the file to open 260 @type _strFilename: filename (str) or file object 261 """ 262 dict.__init__(self) 263 self._ordered = [] 264 if _strFilename is not None: #load the file) 265 self.loadCIF(_strFilename)
        266
        267 - def __setitem__(self, key, value):
        268 if key not in self._ordered: 269 self._ordered.append(key) 270 return dict.__setitem__(self, key, value)
        271
        272 - def pop(self, key):
        273 if key in self._ordered: 274 self._ordered.remove(key) 275 return dict.pop(self, key)
        276
        277 - def popitem(self, key):
        278 if key in self._ordered: 279 self._ordered.remove(key) 280 return dict.popitem(self, key)
        281 282
        283 - def loadCIF(self, _strFilename, _bKeepComment=False):
        284 """Load the CIF file and populates the CIF dictionary into the object 285 @param _strFilename: the name of the file to open 286 @type _strFilename: string 287 @param _strFilename: the name of the file to open 288 @type _strFilename: string 289 @return: None 290 """ 291 292 if isinstance(_strFilename, (str, unicode)): 293 if os.path.isfile(_strFilename): 294 infile = open(_strFilename, "rb") 295 else: 296 raise RuntimeError("CIF.loadCIF: No such file to open: %s" % _strFilename) 297 #elif isinstance(_strFilename, file, bz2.BZ2File, ): 298 elif "read" in dir(_strFilename): 299 infile = _strFilename 300 else: 301 raise RuntimeError("CIF.loadCIF: what is %s type %s" % (_strFilename, type(_strFilename))) 302 if _bKeepComment: 303 self._parseCIF(infile.read()) 304 else: 305 self._parseCIF(CIF._readCIF(infile))
        306 readCIF = loadCIF 307 308 @staticmethod
        309 - def isAscii(_strIn):
        310 """ 311 Check if all characters in a string are ascii, 312 313 @param _strIn: input string 314 @type _strIn: python string 315 @return: boolean 316 @rtype: boolean 317 """ 318 bIsAcii = True 319 for i in _strIn: 320 if ord(i) > 127: 321 bIsAcii = False 322 break 323 return bIsAcii
        324 325 326 @staticmethod
        327 - def _readCIF(_instream):
        328 """ 329 - Check if the filename containing the CIF data exists 330 - read the cif file 331 - removes the comments 332 333 @param _instream: the file containing the CIF data 334 @type _instream: open file in read mode 335 @return: a string containing the raw data 336 @rtype: string 337 """ 338 if not "readlines" in dir(_instream): 339 raise RuntimeError("CIF._readCIF(instream): I expected instream to be an opened file,\ 340 here I got %s type %s" % (_instream, type(_instream))) 341 lLinesRead = _instream.readlines() 342 sText = "" 343 for sLine in lLinesRead: 344 iPos = sLine.find("#") 345 if iPos >= 0: 346 if CIF.isAscii(sLine): 347 sText += sLine[:iPos] + os.linesep 348 349 if iPos > 80 : 350 logger.warning("This line is too long and could cause problems in PreQuest: %s", sLine) 351 else : 352 sText += sLine 353 if len(sLine.strip()) > 80 : 354 logger.warning("This line is too long and could cause problems in PreQues: %s", sLine) 355 return sText
        356 357
        358 - def _parseCIF(self, sText):
        359 """ 360 - Parses the text of a CIF file 361 - Cut it in fields 362 - Find all the loops and process 363 - Find all the keys and values 364 365 @param sText: the content of the CIF - file 366 @type sText: string 367 @return: Nothing, the data are incorporated at the CIF object dictionary 368 @rtype: None 369 """ 370 loopidx = [] 371 looplen = [] 372 loop = [] 373 #first of all : separate the cif file in fields 374 lFields = CIF._splitCIF(sText.strip()) 375 #Then : look for loops 376 for i in range(len(lFields)): 377 if lFields[i].lower() == "loop_": 378 loopidx.append(i) 379 if len(loopidx) > 0: 380 for i in loopidx: 381 loopone, length, keys = CIF._analyseOneLoop(lFields, i) 382 loop.append([keys, loopone]) 383 looplen.append(length) 384 385 386 for i in range(len(loopidx) - 1, -1, -1): 387 f1 = lFields[:loopidx[i]] + lFields[loopidx[i] + looplen[i]:] 388 lFields = f1 389 390 self["loop_"] = loop 391 392 for i in range(len(lFields) - 1): 393 # print lFields[i], lFields[i+1] 394 if len(lFields[i + 1]) == 0 : lFields[i + 1] = "?" 395 if lFields[i][0] == "_" and lFields[i + 1][0] != "_": 396 self[lFields[i]] = lFields[i + 1]
        397 398 @staticmethod
        399 - def _splitCIF(sText):
        400 """ 401 Separate the text in fields as defined in the CIF 402 403 @param sText: the content of the CIF - file 404 @type sText: string 405 @return: list of all the fields of the CIF 406 @rtype: list 407 """ 408 lFields = [] 409 while True: 410 if len(sText) == 0: 411 break 412 elif sText[0] == "'": 413 idx = 0 414 bFinished = False 415 while not bFinished: 416 idx += 1 + sText[idx + 1:].find("'") 417 ##########debuging in case we arrive at the end of the text 418 if idx >= len(sText) - 1: 419 # print sText,idx,len(sText) 420 lFields.append(sText[1:-1].strip()) 421 sText = "" 422 bFinished = True 423 break 424 425 if sText[idx + 1] in CIF.BLANK: 426 lFields.append(sText[1:idx].strip()) 427 sText1 = sText[idx + 1:] 428 sText = sText1.strip() 429 bFinished = True 430 431 elif sText[0] == '"': 432 idx = 0 433 bFinished = False 434 while not bFinished: 435 idx += 1 + sText[idx + 1:].find('"') 436 ##########debuging in case we arrive at the end of the text 437 if idx >= len(sText) - 1: 438 # print sText,idx,len(sText) 439 lFields.append(sText[1:-1].strip()) 440 # print lFields[-1] 441 sText = "" 442 bFinished = True 443 break 444 445 if sText[idx + 1] in CIF.BLANK: 446 lFields.append(sText[1:idx].strip()) 447 # print lFields[-1] 448 sText1 = sText[idx + 1:] 449 sText = sText1.strip() 450 bFinished = True 451 elif sText[0] == ';': 452 if sText[1:].strip().find(CIF.BINARY_MARKER) == 0: 453 idx = sText[32:].find(CIF.BINARY_MARKER) 454 if idx == -1: 455 idx = 0 456 else: 457 idx += 32 + len(CIF.BINARY_MARKER) 458 else: 459 idx = 0 460 bFinished = False 461 while not bFinished: 462 idx += 1 + sText[idx + 1:].find(';') 463 if sText[idx - 1] in CIF.EOL: 464 lFields.append(sText[1:idx - 1].strip()) 465 sText1 = sText[idx + 1:] 466 sText = sText1.strip() 467 bFinished = True 468 else: 469 f = sText.split(None, 1)[0] 470 lFields.append(f) 471 # print lFields[-1] 472 sText1 = sText[len(f):].strip() 473 sText = sText1 474 return lFields
        475 476 477 @staticmethod
        478 - def _analyseOneLoop(lFields, iStart):
        479 """Processes one loop in the data extraction of the CIF file 480 @param lFields: list of all the words contained in the cif file 481 @type lFields: list 482 @param iStart: the starting index corresponding to the "loop_" key 483 @type iStart: integer 484 @return: the list of loop dictionaries, the length of the data 485 extracted from the lFields and the list of all the keys of the loop. 486 @rtype: tuple 487 """ 488 # in earch loop we first search the length of the loop 489 # print lFields 490 # curloop = {} 491 loop = [] 492 keys = [] 493 i = iStart + 1 494 bFinished = False 495 while not bFinished: 496 if lFields[i][0] == "_": 497 keys.append(lFields[i])#.lower()) 498 i += 1 499 else: 500 bFinished = True 501 data = [] 502 while True: 503 if i >= len(lFields): 504 break 505 elif len(lFields[i]) == 0: 506 break 507 elif lFields[i][0] == "_": 508 break 509 elif lFields[i] in ["loop_", "stop_", "global_", "data_", "save_"]: 510 break 511 else: 512 data.append(lFields[i]) 513 i += 1 514 #print len(keys), len(data) 515 k = 0 516 517 if len(data) < len(keys): 518 element = {} 519 for j in keys: 520 if k < len(data): 521 element[j] = data[k] 522 else : 523 element[j] = "?" 524 k += 1 525 #print element 526 loop.append(element) 527 528 else: 529 #print data 530 #print keys 531 for i in range(len(data) / len(keys)): 532 element = {} 533 for j in keys: 534 element[j] = data[k] 535 k += 1 536 # print element 537 loop.append(element) 538 # print loop 539 return loop, 1 + len(keys) + len(data), keys
        540 541 542 543 544 545 546 ############################################################################################# 547 ######## everything needed to write a cif file ######################################### 548 ############################################################################################# 549
        550 - def saveCIF(self, _strFilename="test.cif", linesep=os.linesep, binary=False):
        551 """Transforms the CIF object in string then write it into the given file 552 @param _strFilename: the of the file to be written 553 @param linesep: line separation used (to force compatibility with windows/unix) 554 @param binary: Shall we write the data as binary (True only for imageCIF/CBF) 555 @type param: string 556 """ 557 if binary: 558 mode = "wb" 559 else: 560 mode = "w" 561 try: 562 fFile = open(_strFilename, mode) 563 except IOError: 564 print("Error during the opening of file for write: %s" % 565 _strFilename) 566 return 567 fFile.write(self.tostring(_strFilename, linesep)) 568 try: 569 fFile.close() 570 except IOError: 571 print("Error during the closing of file for write: %s" % 572 _strFilename)
        573 574
        575 - def tostring(self, _strFilename=None, linesep=os.linesep):
        576 """ 577 Converts a cif dictionnary to a string according to the CIF syntax 578 579 @param _strFilename: the name of the filename to be appended in the header of the CIF file 580 @type _strFilename: string 581 @return: a sting that corresponds to the content of the CIF - file. 582 583 """ 584 # sCifText = "" 585 lstStrCif = ["# " + i for i in __version__] 586 if "_chemical_name_common" in self: 587 t = self["_chemical_name_common"].split()[0] 588 elif _strFilename is not None: 589 t = os.path.splitext(os.path.split(str(_strFilename).strip())[1])[0] 590 else: 591 t = "" 592 lstStrCif.append("data_%s" % (t)) 593 #first of all get all the keys : 594 lKeys = self.keys() 595 lKeys.sort() 596 for key in lKeys[:]: 597 if key in self._ordered: 598 lKeys.remove(key) 599 self._ordered += lKeys 600 601 for sKey in self._ordered: 602 if sKey == "loop_": 603 continue 604 if sKey not in self: 605 self._ordered.remove(sKey) 606 logger.debug("Skipping key %s from ordered list as no more present in dict") 607 continue 608 sValue = str(self[sKey]) 609 if sValue.find("\n") > -1: #should add value between ;; 610 lLine = [sKey, ";", sValue, ";", ""] 611 elif len(sValue.split()) > 1: #should add value between '' 612 sLine = "%s '%s'" % (sKey, sValue) 613 if len(sLine) > 80: 614 lLine = [str(sKey), sValue] 615 else: 616 lLine = [sLine] 617 else: 618 sLine = "%s %s" % (sKey, sValue) 619 if len(sLine) > 80: 620 lLine = [str(sKey), sValue] 621 else: 622 lLine = [sLine] 623 lstStrCif += lLine 624 if self.has_key("loop_"): 625 for loop in self["loop_"]: 626 lstStrCif.append("loop_ ") 627 lKeys = loop[0] 628 llData = loop[1] 629 lstStrCif += [" %s" % (sKey) for sKey in lKeys] 630 for lData in llData: 631 sLine = " " 632 for key in lKeys: 633 sRawValue = lData[key] 634 if sRawValue.find("\n") > -1: #should add value between ;; 635 lstStrCif += [sLine, ";", str(sRawValue), ";"] 636 sLine = " " 637 else: 638 if len(sRawValue.split()) > 1: #should add value between '' 639 value = "'%s'" % (sRawValue) 640 else: 641 value = str(sRawValue) 642 if len(sLine) + len(value) > 78: 643 lstStrCif += [sLine] 644 sLine = " " + value 645 else: 646 sLine += " " + value 647 lstStrCif.append(sLine) 648 lstStrCif.append("") 649 return linesep.join(lstStrCif)
        650 651
        652 - def exists(self, sKey):
        653 """ 654 Check if the key exists in the CIF and is non empty. 655 @param sKey: CIF key 656 @type sKey: string 657 @param cif: CIF dictionary 658 @return: True if the key exists in the CIF dictionary and is non empty 659 @rtype: boolean 660 """ 661 bExists = False 662 if self.has_key(sKey): 663 if len(self[sKey]) >= 1: 664 if self[sKey][0] not in ["?", "."]: 665 bExists = True 666 return bExists
        667 668
        669 - def existsInLoop(self, sKey):
        670 """ 671 Check if the key exists in the CIF dictionary. 672 @param sKey: CIF key 673 @type sKey: string 674 @param cif: CIF dictionary 675 @return: True if the key exists in the CIF dictionary and is non empty 676 @rtype: boolean 677 """ 678 if not self.exists("loop_"): 679 return False 680 bExists = False 681 if not bExists: 682 for i in self["loop_"]: 683 for j in i[0]: 684 if j == sKey: 685 bExists = True 686 return bExists
        687 688
        689 - def loadCHIPLOT(self, _strFilename):
        690 """ 691 Load the powder diffraction CHIPLOT file and returns the 692 pd_CIF dictionary in the object 693 694 @param _strFilename: the name of the file to open 695 @type _strFilename: string 696 @return: the CIF object corresponding to the powder diffraction 697 @rtype: dictionary 698 """ 699 if not os.path.isfile(_strFilename): 700 print "I cannot find the file %s" % _strFilename 701 raise 702 lInFile = open(_strFilename, "r").readlines() 703 self["_audit_creation_method"] = 'From 2-D detector using FIT2D and CIFfile' 704 self["_pd_meas_scan_method"] = "fixed" 705 self["_pd_spec_description"] = lInFile[0].strip() 706 try: 707 iLenData = int(lInFile[3]) 708 except ValueError: 709 iLenData = None 710 lOneLoop = [] 711 try: 712 f2ThetaMin = float(lInFile[4].split()[0]) 713 last = "" 714 for sLine in lInFile[-20:]: 715 if sLine.strip() != "": 716 last = sLine.strip() 717 f2ThetaMax = float(last.split()[0]) 718 limitsOK = True 719 720 except (ValueError, IndexError): 721 limitsOK = False 722 f2ThetaMin = 180.0 723 f2ThetaMax = 0 724 # print "limitsOK:", limitsOK 725 for sLine in lInFile[4:]: 726 sCleaned = sLine.split("#")[0].strip() 727 data = sCleaned.split() 728 if len(data) == 2 : 729 if not limitsOK: 730 f2Theta = float(data[0]) 731 if f2Theta < f2ThetaMin : 732 f2ThetaMin = f2Theta 733 if f2Theta > f2ThetaMax : 734 f2ThetaMax = f2Theta 735 lOneLoop.append({ "_pd_meas_intensity_total": data[1] }) 736 if not iLenData: 737 iLenData = len(lOneLoop) 738 assert (iLenData == len(lOneLoop)) 739 self[ "_pd_meas_2theta_range_inc" ] = "%.4f" % ((f2ThetaMax - f2ThetaMin) / (iLenData - 1)) 740 if self[ "_pd_meas_2theta_range_inc" ] < 0: 741 self[ "_pd_meas_2theta_range_inc" ] = abs (self[ "_pd_meas_2theta_range_inc" ]) 742 tmp = f2ThetaMax 743 f2ThetaMax = f2ThetaMin 744 f2ThetaMin = tmp 745 self[ "_pd_meas_2theta_range_max" ] = "%.4f" % f2ThetaMax 746 self[ "_pd_meas_2theta_range_min" ] = "%.4f" % f2ThetaMin 747 self[ "_pd_meas_number_of_points" ] = str(iLenData) 748 self["loop_"] = [ [ ["_pd_meas_intensity_total" ], lOneLoop ] ]
        749 750 751 @staticmethod
        752 - def LoopHasKey(loop, key):
        753 "Returns True if the key (string) exist in the array called loop""" 754 try: 755 loop.index(key) 756 return True 757 except ValueError: 758 return False
        759

        fabio-0.1.3/epydoc/fabio.cf_io-module.html0000644000175000017500000001575012126623347021167 0ustar jeromejerome00000000000000 fabio.cf_io
        Package fabio :: Module cf_io
        [hide private]
        [frames] | no frames]

        Module cf_io

        Functions [hide private]
         
        read(...)
        call the c-columnfile reading interface.
        Variables [hide private]
          __package__ = None
        hash(x)
        Function Details [hide private]

        read(...)

         

        call the c-columnfile reading interface. The mode keyword argument is either: "a" for ascii (the default) "b" for binary


        fabio-0.1.3/epydoc/fabio.mar345image-module.html0000644000175000017500000002014712126623347022122 0ustar jeromejerome00000000000000 fabio.mar345image
        Package fabio :: Module mar345image
        [hide private]
        [frames] | no frames]

        Module mar345image

        source code

        
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions;
          Risoe National Laboratory;
          Frederiksborgvej 399;
          DK-4000 Roskilde;
          email:erik.knudsen@risoe.dk
        * Jon Wright, Jérôme Kieffer & Gaël Goret:
          European Synchrotron Radiation Facility;
          Grenoble (France)
        
                 
        
        
        Classes [hide private]
          mar345image
        Variables [hide private]
          __doc__ = ...
          logger = logging.getLogger("mar345image")
          __package__ = 'fabio'
        Variables Details [hide private]

        __doc__

        Value:
        """
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions\
        ;
          Risoe National Laboratory;
        ...
        

        fabio-0.1.3/epydoc/fabio.datIO.columnfile-class.html0000644000175000017500000002112612126623347023056 0ustar jeromejerome00000000000000 fabio.datIO.columnfile
        Package fabio :: Module datIO :: Class columnfile
        [hide private]
        [frames] | no frames]

        Class columnfile

        source code

        object --+    
                 |    
         fabiodata --+
                     |
                    columnfile
        

        Concrete fabiodata class

        Instance Methods [hide private]
         
        read(self, fname, frame=None)
        To be overridden by format specific subclasses
        source code

        Inherited from fabiodata: __init__

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        read(self, fname, frame=None)

        source code 

        To be overridden by format specific subclasses

        Overrides: fabiodata.read
        (inherited documentation)

        fabio-0.1.3/epydoc/index.html0000644000175000017500000000111312120434325016627 0ustar jeromejerome00000000000000 API Documentation fabio-0.1.3/epydoc/toc-fabio.fabioimage-module.html0000644000175000017500000000264712120434325022745 0ustar jeromejerome00000000000000 fabioimage

        Module fabioimage


        Classes

        fabioimage

        Functions

        test

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.marccdimage-pysrc.html0000644000175000017500000021721012126623347022212 0ustar jeromejerome00000000000000 fabio.marccdimage
        Package fabio :: Module marccdimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.marccdimage

          1  #!/usr/bin/env python 
          2  """ 
          3   
          4  Authors: 
          5  ........ 
          6  * Henning O. Sorensen & Erik Knudsen: 
          7    Center for Fundamental Research: Metal Structures in Four Dimensions; 
          8    Risoe National Laboratory; 
          9    Frederiksborgvej 399; 
         10    DK-4000 Roskilde; 
         11    email:erik.knudsen@risoe.dk 
         12  * Jon Wright: 
         13    European Synchrotron Radiation Facility; 
         14    Grenoble (France) 
         15            
         16  marccdimage can read MarCCD and MarMosaic images including header info. 
         17   
         18  JPW : Use a parser in case of typos (sorry?) 
         19   
         20  """ 
         21   
         22   
         23  # Base this on the tifimage (as marccd seems to be tiff with a  
         24  # special header  
         25   
         26  from tifimage import tifimage 
         27  import logging 
         28  logger = logging.getLogger("marccdimage") 
         29   
         30  # Now for the c definition (found on mar webpage) 
         31  # The following string is therefore copyrighted by Mar I guess 
         32   
         33  CDEFINITION = """ 
         34  typedef struct frame_header_type { 
         35           /* File/header format parameters (256 bytes) */ 
         36           UINT32        header_type;  /* flag for header type   
         37                                             (can be  used as magic number) */ 
         38           char header_name[16];           /* header name (MMX) */ 
         39           UINT32        header_major_version;   /* header_major_version  (n.) */ 
         40           UINT32        header_minor_version;   /* header_minor_version  (.n) */ 
         41           UINT32        header_byte_order;/* BIG_ENDIAN (Motorola,MIPS);   
         42                                              LITTLE_ENDIAN (DEC, Intel) */ 
         43           UINT32        data_byte_order;  /* BIG_ENDIAN (Motorola,MIPS);   
         44                                              LITTLE_ENDIAN (DEC, Intel) */ 
         45           UINT32        header_size;      /* in bytes                     */ 
         46           UINT32        frame_type;       /* flag for frame type */ 
         47           UINT32        magic_number;     /* to be used as a flag -  
         48                                              usually  to indicate new file */ 
         49           UINT32        compression_type; /* type of image compression    */ 
         50           UINT32        compression1;     /* compression parameter 1 */ 
         51           UINT32        compression2;     /* compression parameter 2 */ 
         52           UINT32        compression3;     /* compression parameter 3 */ 
         53           UINT32        compression4;     /* compression parameter 4 */ 
         54           UINT32        compression5;     /* compression parameter 4 */ 
         55           UINT32        compression6;     /* compression parameter 4 */ 
         56           UINT32        nheaders;         /* total number of headers      */ 
         57           UINT32        nfast;            /* number of pixels in one line */ 
         58           UINT32        nslow;            /* number of lines in image     */ 
         59           UINT32        depth;            /* number of bytes per pixel    */ 
         60           UINT32        record_length;    /* number of pixels between  
         61                                              succesive rows */ 
         62           UINT32        signif_bits;      /* true depth of data, in bits  */ 
         63           UINT32        data_type;        /* (signed,unsigned,float...) */ 
         64           UINT32        saturated_value;  /* value marks pixel as saturated */ 
         65           UINT32        sequence;         /* TRUE or FALSE */ 
         66           UINT32        nimages;          /* total number of images - size of  
         67                                              each is nfast*(nslow/nimages) */ 
         68           UINT32        origin;           /* corner of origin             */ 
         69           UINT32        orientation;      /* direction of fast axis       */ 
         70           UINT32        view_direction;   /* direction to view frame      */ 
         71           UINT32        overflow_location;/* FOLLOWING_HEADER,  FOLLOWING_DATA */ 
         72           UINT32        over_8_bits;      /* # of pixels with counts  255 */ 
         73           UINT32        over_16_bits;     /* # of pixels with count  65535 */ 
         74           UINT32        multiplexed;      /* multiplex flag */ 
         75           UINT32        nfastimages;      /* # of images in fast direction */ 
         76           UINT32        nslowimages;      /* # of images in slow direction */ 
         77           UINT32        background_applied;/* flags correction has been applied  
         78                                                hold magic number ? */ 
         79           UINT32        bias_applied;     /* flags correction has been applied 
         80                                               hold magic number ? */ 
         81           UINT32        flatfield_applied;/* flags correction has been applied - 
         82                                                hold magic number ? */ 
         83           UINT32        distortion_applied;/*flags correction has been applied -  
         84                                                hold magic number ? */ 
         85           UINT32        original_header_type;    /* Header/frame type from  file  
         86                                                      that frame is read from */ 
         87           UINT32        file_saved;         /* Flag that file has been  saved,  
         88                                                should be zeroed if modified */ 
         89           char reserve1[(64-40)*sizeof(INT32)-16]; 
         90   
         91           /* Data statistics (128) */ 
         92           UINT32        total_counts[2];  /* 64 bit integer range = 1.85E19*/ 
         93           UINT32        special_counts1[2]; 
         94           UINT32        special_counts2[2]; 
         95           UINT32        min; 
         96           UINT32        max; 
         97           UINT32        mean; 
         98           UINT32        rms; 
         99           UINT32        p10; 
        100           UINT32        p90; 
        101           UINT32        stats_uptodate; 
        102           UINT32        pixel_noise[MAXIMAGES]; /*1000*base noise value (ADUs) */ 
        103           char reserve2[(32-13-MAXIMAGES)*sizeof(INT32)]; 
        104   
        105           /* More statistics (256) */ 
        106           UINT16 percentile[128]; 
        107   
        108   
        109           /* Goniostat parameters (128 bytes) */ 
        110           INT32 xtal_to_detector;  /* 1000*distance in millimeters */ 
        111           INT32 beam_x;            /* 1000*x beam position (pixels) */ 
        112           INT32 beam_y;            /* 1000*y beam position (pixels) */ 
        113           INT32 integration_time;  /* integration time in  milliseconds */ 
        114           INT32 exposure_time;     /* exposure time in milliseconds */ 
        115           INT32 readout_time;      /* readout time in milliseconds */ 
        116           INT32 nreads;            /* number of readouts to get this  image */ 
        117           INT32 start_twotheta;    /* 1000*two_theta angle */ 
        118           INT32 start_omega;       /* 1000*omega angle */ 
        119           INT32 start_chi;         /* 1000*chi angle */ 
        120           INT32 start_kappa;       /* 1000*kappa angle */ 
        121           INT32 start_phi;         /* 1000*phi angle */ 
        122           INT32 start_delta;       /* 1000*delta angle */ 
        123           INT32 start_gamma;       /* 1000*gamma angle */ 
        124           INT32 start_xtal_to_detector; /* 1000*distance in mm (dist in um)*/ 
        125           INT32 end_twotheta;           /* 1000*two_theta angle */ 
        126           INT32 end_omega;              /* 1000*omega angle */ 
        127           INT32 end_chi;                /* 1000*chi angle */ 
        128           INT32 end_kappa;              /* 1000*kappa angle */ 
        129           INT32 end_phi;                /* 1000*phi angle */ 
        130           INT32 end_delta;              /* 1000*delta angle */ 
        131           INT32 end_gamma;              /* 1000*gamma angle */ 
        132           INT32 end_xtal_to_detector;   /* 1000*distance in mm (dist in um)*/ 
        133           INT32 rotation_axis;          /* active rotation axis */ 
        134           INT32 rotation_range;         /* 1000*rotation angle */ 
        135           INT32 detector_rotx;          /* 1000*rotation of detector  around X */ 
        136           INT32 detector_roty;          /* 1000*rotation of detector  around Y */ 
        137           INT32 detector_rotz;          /* 1000*rotation of detector  around Z */ 
        138           char reserve3[(32-28)*sizeof(INT32)]; 
        139   
        140           /* Detector parameters (128 bytes) */ 
        141           INT32 detector_type;            /* detector type */ 
        142           INT32 pixelsize_x;              /* pixel size (nanometers) */ 
        143           INT32 pixelsize_y;              /* pixel size (nanometers) */ 
        144           INT32 mean_bias;                        /* 1000*mean bias value */ 
        145           INT32 photons_per_100adu;       /* photons / 100 ADUs */ 
        146           INT32 measured_bias[MAXIMAGES];/* 1000*mean bias value for each image*/ 
        147           INT32 measured_temperature[MAXIMAGES];  /* Temperature of each   
        148                                                      detector in milliKelvins */ 
        149           INT32 measured_pressure[MAXIMAGES]; /* Pressure of each  chamber  
        150                                                 in microTorr */ 
        151           /* Retired reserve4 when MAXIMAGES set to 9 from 16 and  
        152              two fields removed, and temp and pressure added 
        153            char reserve4[(32-(5+3*MAXIMAGES))*sizeof(INT32)] 
        154           */ 
        155   
        156           /* X-ray source and optics parameters (128 bytes) */ 
        157           /* X-ray source parameters (8*4 bytes) */ 
        158           INT32 source_type;              /* (code) - target, synch. etc */ 
        159           INT32 source_dx;                /* Optics param. - (size  microns) */ 
        160           INT32 source_dy;                /* Optics param. - (size  microns) */ 
        161           INT32 source_wavelength;        /* wavelength  (femtoMeters) */ 
        162           INT32 source_power;             /* (Watts) */ 
        163           INT32 source_voltage;           /* (Volts) */ 
        164           INT32 source_current;           /* (microAmps) */ 
        165           INT32 source_bias;              /* (Volts) */ 
        166           INT32 source_polarization_x;    /* () */ 
        167           INT32 source_polarization_y;    /* () */ 
        168           char reserve_source[4*sizeof(INT32)]; 
        169   
        170           /* X-ray optics_parameters (8*4 bytes) */ 
        171           INT32 optics_type;              /* Optics type (code)*/ 
        172           INT32 optics_dx;                /* Optics param. - (size  microns) */ 
        173           INT32 optics_dy;                /* Optics param. - (size  microns) */ 
        174           INT32 optics_wavelength;        /* Optics param. - (size  microns) */ 
        175           INT32 optics_dispersion;        /* Optics param. - (*10E6) */ 
        176           INT32 optics_crossfire_x;       /* Optics param. - (microRadians) */ 
        177           INT32 optics_crossfire_y;       /* Optics param. - (microRadians) */ 
        178           INT32 optics_angle;             /* Optics param. - (monoch.   
        179                                                      2theta - microradians) */ 
        180           INT32 optics_polarization_x;    /* () */ 
        181           INT32 optics_polarization_y;    /* () */ 
        182           char reserve_optics[4*sizeof(INT32)]; 
        183   
        184           char reserve5[((32-28)*sizeof(INT32))]; 
        185   
        186           /* File parameters (1024 bytes) */ 
        187           char filetitle[128];            /*  Title                  */ 
        188           char filepath[128];             /* path name for data  file  */ 
        189           char filename[64];              /* name of data  file  */ 
        190           char acquire_timestamp[32];     /* date and time of  acquisition */ 
        191           char header_timestamp[32];      /* date and time of header  update  */ 
        192           char save_timestamp[32];        /* date and time file  saved */ 
        193           char file_comments[512];        /* comments, use as desired   */ 
        194           char reserve6[1024-(128+128+64+(3*32)+512)]; 
        195   
        196           /* Dataset parameters (512 bytes) */ 
        197           char dataset_comments[512];     /* comments, used as desired   */ 
        198           /* pad out to  3072 bytes */ 
        199           char pad[3072-(256+128+256+(3*128)+1024+512)];      
        200   
        201           } frame_header; 
        202  """ 
        203   
        204  import struct 
        205   
        206  # Convert mar c header file types to python struct module types 
        207  C_TO_STRUCT = { 
        208      "INT32"  : "i", 
        209      "UINT32" : "I", 
        210      "char"   : "c", 
        211      "UINT16" : "H" 
        212      } 
        213   
        214  # Sizes (bytes) of mar c header objects 
        215  C_SIZES = { 
        216      "INT32"  : 4, 
        217      "UINT32" : 4, 
        218      "char"   : 1, 
        219      "UINT16" : 2 
        220      } 
        221   
        222  # This was worked out by trial and error from a trial image I think 
        223  MAXIMAGES = 9 
        224   
        225   
        
        226 -def make_format(c_def_string):
        227 """ 228 Reads the header definition in c and makes the format 229 string to pass to struct.unpack 230 """ 231 lines = c_def_string.split("\n") 232 fmt = "" 233 names = [] 234 expected = 0 235 for line in lines: 236 if line.find(";") == -1: 237 continue 238 decl = line.split(";")[0].lstrip().rstrip() 239 try: 240 [typ, name] = decl.split() 241 except ValueError: 242 logger.debug("skipping: %s" , line) 243 continue 244 245 if name.find("[") > -1: 246 # repeated ... times 247 try: 248 num = name.split("[")[1].split("]")[0] 249 num = num.replace("MAXIMAGES", str(MAXIMAGES)) 250 num = num.replace("sizeof(INT32)", "4") 251 times = eval(num) 252 except Exception, error: 253 logger.error("%s Please decode %s", error, decl) 254 raise error 255 else: 256 times = 1 257 try: 258 fmt += C_TO_STRUCT[typ] * times 259 names += [name] * times 260 expected += C_SIZES[typ] * times 261 except KeyError: 262 continue 263 return names, fmt
        264 265 # Make these be compiled on loading module 266 HEADER_NAMES, HEADER_FORMAT = make_format(CDEFINITION) 267
        268 -def interpret_header(header, fmt, names):
        269 """ 270 given a format and header interpret it 271 """ 272 values = struct.unpack(fmt, header) 273 hdr = {} 274 i = 0 275 for name in names: 276 if hdr.has_key(name): 277 if type(values[i]) == type("string"): 278 hdr[name] = hdr[name] + values[i] 279 else: 280 try: 281 hdr[name].append(values[i]) 282 except AttributeError: 283 hdr[name] = [hdr[name], values[i]] 284 else: 285 hdr[name] = values[i] 286 i = i + 1 287 288 return hdr
        289 290
        291 -class marccdimage(tifimage):
        292 """ Read in data in mar ccd format, also 293 MarMosaic images, including header info """ 294 295
        296 - def _readheader(self, infile):
        297 """ 298 Parser based approach 299 Gets all entries 300 """ 301 infile.seek(1024) 302 hstr = infile.read(3072) 303 self.header = interpret_header(hstr, HEADER_FORMAT, HEADER_NAMES)
        304 305 306
        307 - def _read(self, fname):
        308 """ 309 inherited from tifimage 310 ... a marccd image *is a* tif image 311 just with a header 312 """ 313 return tifimage.read(self, fname)
        314

        fabio-0.1.3/epydoc/fabio.mar345_IO-module.html0000644000175000017500000001323712126623347021510 0ustar jeromejerome00000000000000 fabio.mar345_IO
        Package fabio :: Module mar345_IO
        [hide private]
        [frames] | no frames]

        Module mar345_IO

        
        New Cython version of mar345_io for preparing the migration to Python3
        
        Compressor & decompressor for "pack" algorithm by JPA, binding to CCP4 libraries 
        
        Warning: decompressor is just a cython porting of mar345_io, but in cython so (soon) python3 compliant.
        
        Future: make those algorithm actually generate strings not go via files;
                it will allow a broader use of the algorithm. 
        
        

        Authors:
        Jerome Kieffer, Gael Goret

        Contact: jerome.kieffer@esrf.eu

        Copyright: 2012, European Synchrotron Radiation Facility, Grenoble, France

        License: LGPLv3+

        Variables [hide private]
          __package__ = 'fabio'
          __test__ = {}
        fabio-0.1.3/epydoc/fabio.OXDimage-module.html0000644000175000017500000003510612126623347021542 0ustar jeromejerome00000000000000 fabio.OXDimage
        Package fabio :: Module OXDimage
        [hide private]
        [frames] | no frames]

        Module OXDimage

        source code

        
        Reads Oxford Diffraction Sapphire 3 images
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions;
          Risoe National Laboratory;
          Frederiksborgvej 399;
          DK-4000 Roskilde;
          email:erik.knudsen@risoe.dk
        * Jon Wright, Jérôme Kieffer & Gaël Goret:
          European Synchrotron Radiation Facility;
          Grenoble (France)
        
        
        Classes [hide private]
          OXDimage
        Oxford Diffraction Sapphire 3 images reader/writer class
          Section
        Small helper class for writing binary headers
        Variables [hide private]
          __doc__ = "...
          logger = logging.getLogger("OXDimage")
          rad2deg = <ufunc 'rad2deg'>
          deg2rad = <ufunc 'deg2rad'>
          DETECTOR_TYPES = {0: 'Sapphire/KM4CCD (1x1: 0.06mm, 2x2: 0.12m...
          DEFAULT_HEADERS = {'ASCII Section size in Byte': 256, 'Compres...
          __package__ = 'fabio'
        Variables Details [hide private]

        __doc__

        Value:
        """
        Reads Oxford Diffraction Sapphire 3 images
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions\
        ;
        ...
        

        DETECTOR_TYPES

        Value:
        {0: 'Sapphire/KM4CCD (1x1: 0.06mm, 2x2: 0.12mm)',
         1: 'Sapphire2-Kodak (1x1: 0.06mm, 2x2: 0.12mm)',
         2: 'Sapphire3-Kodak (1x1: 0.03mm, 2x2: 0.06mm, 4x4: 0.12mm)',
         3: 'Onyx-Kodak (1x1: 0.06mm, 2x2: 0.12mm, 4x4: 0.24mm)',
         4: 'Unknown Oxford diffraction detector'}
        

        DEFAULT_HEADERS

        Value:
        {'ASCII Section size in Byte': 256,
         'Compression': 'TY1',
         'General Section size in Byte': 512,
         'Header Size In Bytes': 5120,
         'Header Version': 'OD SAPPHIRE  3.0',
         'History Section in Byte': 2048,
         'KM4 Section size in Byte': 1024,
         'NSUPPLEMENT': 0,
        ...
        

        fabio-0.1.3/epydoc/fabio.tifimage-pysrc.html0000644000175000017500000036202012126623347021543 0ustar jeromejerome00000000000000 fabio.tifimage
        Package fabio :: Module tifimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.tifimage

          1  #!/usr/bin/env python 
          2  #-*- coding: utf8 -*- 
          3  """ 
          4  FabIO class for dealing with TIFF images.  
          5  In facts wraps TiffIO from V. Armando Solé (available in PyMca) or falls back to PIL 
          6   
          7  Authors: 
          8  ........ 
          9  * Henning O. Sorensen & Erik Knudsen: 
         10    Center for Fundamental Research: Metal Structures in Four Dimensions; 
         11    Risoe National Laboratory; 
         12    Frederiksborgvej 399; 
         13    DK-4000 Roskilde; 
         14    email:erik.knudsen@risoe.dk 
         15  * Jérôme Kieffer: 
         16    European Synchrotron Radiation Facility; 
         17    Grenoble (France) 
         18      
         19  License: GPLv3+         
         20  """ 
         21   
         22  __authors__ = ["Jérôme Kieffer", "Henning O. Sorensen", "Erik Knudsen"] 
         23  __date__ = "11/07/2011" 
         24  __license__ = "GPLv3+" 
         25  __copyright__ = "ESRF, Grenoble & Risoe National Laboratory" 
         26  __status__ = "stable" 
         27  import time, logging, struct 
         28  logger = logging.getLogger("tifimage") 
         29  try: 
         30      import Image 
         31  except ImportError: 
         32      logger.warning("PIL is not installed ... trying to do without") 
         33      Image = None 
         34  import numpy 
         35  from fabioimage import fabioimage 
         36  from TiffIO     import TiffIO 
         37   
         38  PIL_TO_NUMPY = { "I;16": numpy.uint16, 
         39                     "F": numpy.float32, 
         40                     "1": numpy.bool, 
         41                     "I": numpy.int32, 
         42                     "L": numpy.uint8, 
         43                      } 
         44   
         45  LITTLE_ENDIAN = 1234 
         46  BIG_ENDIAN = 3412 
         47   
         48  TYPES = {0:'invalid', 1:'byte', 2:'ascii', 3:'short', 4:'long', 5:'rational', 6:'sbyte', 7:'undefined', 8:'sshort', 9:'slong', 10:'srational', 11:'float', 12:'double'} 
         49   
         50  TYPESIZES = {0:0, 1:1, 2:1, 3:2, 4:4, 5:8, 6:1, 7:1, 8:2, 9:4, 10:8, 11:4, 12:8} 
         51   
         52  baseline_tiff_tags = { 
         53    256:'ImageWidth', 
         54    257:'ImageLength', 
         55    306:'DateTime', 
         56    315:'Artist', 
         57    258:'BitsPerSample', 
         58    265:'CellLength', 
         59    264:'CellWidth', 
         60    259:'Compression', 
         61   
         62    262:'PhotometricInterpretation', 
         63    296:'ResolutionUnit', 
         64    282:'XResolution', 
         65    283:'YResolution', 
         66   
         67    278:'RowsPerStrip', 
         68    273:'StripOffset', 
         69    279:'StripByteCounts', 
         70   
         71    270:'ImageDescription', 
         72    271:'Make', 
         73    272:'Model', 
         74    320:'ColorMap', 
         75    305:'Software', 
         76    339:'SampleFormat', 
         77    33432:'Copyright' 
         78    } 
         79   
        
        80 -class tifimage(fabioimage):
        81 """ 82 Images in TIF format 83 Wraps TiffIO 84 """ 85 _need_a_seek_to_read = True 86
        87 - def __init__(self, *args, **kwds):
        88 """ Tifimage constructor adds an nbits member attribute """ 89 self.nbits = None 90 fabioimage.__init__(self, *args, **kwds) 91 self.lib = None
        92
        93 - def _readheader(self, infile):
        94 """ 95 Try to read Tiff images header... 96 """ 97 # try: 98 # self.header = { "filename" : infile.name } 99 # except AttributeError: 100 # self.header = {} 101 # 102 # t = Tiff_header(infile.read()) 103 # self.header = t.header 104 # try: 105 # self.dim1 = int(self.header['ImageWidth']) 106 # self.dim2 = int(self.header['ImageLength']) 107 # except (KeyError): 108 # logger.warning("image dimensions could not be determined from header tags, trying to go on anyway") 109 # read the first 32 bytes to determine size 110 header = numpy.fromstring(infile.read(64), numpy.uint16) 111 self.dim1 = int(header[9]) 112 self.dim2 = int(header[15]) 113 # nbits is not a fabioimage attribute... 114 self.nbits = int(header[21]) # number of bits
        115
        116 - def read(self, fname, frame=None):
        117 """ 118 Wrapper for TiffIO. 119 """ 120 infile = self._open(fname, "rb") 121 self._readheader(infile) 122 infile.seek(0) 123 self.lib = None 124 try: 125 tiffIO = TiffIO(infile) 126 if tiffIO.getNumberOfImages() > 0: 127 #No support for now of multi-frame tiff images 128 self.data = tiffIO.getImage(0) 129 self.header = tiffIO.getInfo(0) 130 except Exception, error: 131 logger.warning("Unable to read %s with TiffIO due to %s, trying PIL" % (fname, error)) 132 else: 133 if self.data.ndim == 2: 134 self.dim2, self.dim1 = self.data.shape 135 elif self.data.ndim == 3: 136 self.dim2, self.dim1, ncol = self.data.shape 137 logger.warning("Third dimension is the color") 138 else: 139 logger.warning("dataset has %s dimensions (%s), check for errors !!!!", self.data.ndim, self.data.shape) 140 self.lib = "TiffIO" 141 142 if (self.lib is None): 143 if Image: 144 try: 145 infile.seek(0) 146 self.pilimage = Image.open(infile) 147 except Exception: 148 logger.error("Error in opening %s with PIL" % fname) 149 self.lib = None 150 infile.seek(0) 151 else: 152 self.lib = "PIL" 153 self.dim1, self.dim2 = self.pilimage.size 154 if self.pilimage.mode in PIL_TO_NUMPY: 155 self.data = numpy.fromstring(self.pilimage.tostring(), PIL_TO_NUMPY[self.pilimage.mode]) 156 else: #probably RGB or RGBA images: rely on PIL to convert it to greyscale float. 157 self.data = numpy.fromstring(self.pilimage.convert("F").tostring(), numpy.float32) 158 self.data.shape = (self.dim2, self.dim1) 159 else: 160 logger.error("Error in opening %s: no tiff reader managed to read the file.", fname) 161 self.lib = None 162 infile.seek(0) 163 164 self.bpp = len(numpy.zeros(1, dtype=self.data.dtype).tostring()) 165 self.bytecode = self.data.dtype.name 166 self.resetvals() 167 return self
        168
        169 - def write(self, fname):
        170 """ 171 Overrides the fabioimage.write method and provides a simple TIFF image writer. 172 @param fname: name of the file to save the image to 173 @tag_type fname: string or unicode (file?)... 174 """ 175 tiffIO = TiffIO(fname, mode="w") 176 tiffIO.writeImage(self.data, info=self.header, software="fabio.tifimage", date=time.ctime())
        177 178 179 180 #define a couple of helper classes here:
        181 -class Tiff_header(object):
        182 - def __init__(self, string):
        183 if string[:4] == "II\x2a\x00": 184 self.byteorder = LITTLE_ENDIAN 185 elif string[:4] == 'MM\x00\x2a': 186 self.byteorder = BIG_ENDIAN 187 else: 188 logger.warning("Warning: This does not appear to be a tiff file") 189 #the next two bytes contains the offset of the oth IFD 190 offset_first_ifd = struct.unpack_from("h", string[4:])[0] 191 self.ifd = [Image_File_Directory()] 192 offset_next = self.ifd[0].unpack(string, offset_first_ifd) 193 while (offset_next != 0): 194 self.ifd.append(Image_File_Directory()) 195 offset_next = self.ifd[-1].unpack(string, offset_next) 196 197 self.header = {} 198 #read the values of the header items into a dictionary 199 for entry in self.ifd[0].entries: 200 if entry.tag in baseline_tiff_tags.keys(): 201 self.header[baseline_tiff_tags[entry.tag]] = entry.val 202 else: 203 self.header[entry.tag] = entry.val
        204
        205 -class Image_File_Directory(object):
        206 - def __init__(self, instring=None, offset= -1):
        207 self.entries = [] 208 self.offset = offset 209 self.count = None
        210
        211 - def unpack(self, instring, offset= -1):
        212 if (offset == -1): offset = self.offset 213 214 strInput = instring[offset:] 215 self.count = struct.unpack_from("H", strInput[:2])[0] 216 #0th IFD contains count-1 entries (count includes the adress of the next IFD) 217 for i in range(self.count - 1): 218 e = Image_File_Directory_entry().unpack(strInput[2 + 12 * (i + 1):]) 219 if (e != None): 220 self.entries.append(e) 221 #extract data associated with tags 222 for e in self.entries: 223 if (e.val == None): 224 e.extract_data(instring) 225 #do we have some more ifds in this file 226 offset_next = struct.unpack_from("L", instring[offset + 2 + self.count * 12:])[0] 227 return offset_next
        228
        229 -class Image_File_Directory_entry(object):
        230 - def __init__(self, tag=0, tag_type=0, count=0, offset=0):
        231 self.tag = tag 232 self.tag_type = tag_type 233 self.count = count 234 self.val_offset = offset 235 self.val = None
        236
        237 - def unpack(self, strInput):
        238 idfentry = strInput[:12] 239 ################################################################################ 240 # # TOFIX: How is it possible that HHL (2+2+4 bytes has a size of ) 241 ################################################################################ 242 (tag, tag_type, count) = struct.unpack_from("HHL", idfentry) 243 self.tag = tag 244 self.count = count 245 self.tag_type = tag_type 246 self.val = None 247 if (count <= 0): 248 logger.warning("Tag # %s has an invalid count: %s. Tag is ignored" % (tag, count)) 249 return 250 if(count * TYPESIZES[tag_type] <= 4): 251 self.val_offset = 8 252 self.extract_data(idfentry) 253 self.val_offset = None 254 else: 255 self.val_offset = struct.unpack_from("L", idfentry[8:])[0] 256 return self
        257
        258 - def extract_data(self, full_string):
        259 tag_type = self.tag_type 260 if (TYPES[tag_type] == 'byte'): 261 self.val = struct.unpack_from("B", full_string[self.val_offset:])[0] 262 elif (TYPES[tag_type] == 'short'): 263 self.val = struct.unpack_from("H", full_string[self.val_offset:])[0] 264 elif (TYPES[tag_type] == 'long'): 265 self.val = struct.unpack_from("L", full_string[self.val_offset:])[0] 266 elif (TYPES[tag_type] == 'sbyte'): 267 self.val = struct.unpack_from("b", full_string[self.val_offset:])[0] 268 elif (TYPES[tag_type] == 'sshort'): 269 self.val = struct.unpack_from("h", full_string[self.val_offset:])[0] 270 elif (TYPES[tag_type] == 'slong'): 271 self.val = struct.unpack_from("l", full_string[self.val_offset:])[0] 272 elif (TYPES[tag_type] == 'ascii'): 273 self.val = full_string[self.val_offset:self.val_offset + max(self.count, 4)] 274 elif (TYPES[tag_type] == 'rational'): 275 if self.val_offset != None: 276 (num, den) = struct.unpack_from("LL", full_string[self.val_offset:]) 277 print self.val_offset 278 self.val = float(num) / den 279 elif (TYPES[tag_type] == 'srational'): 280 if self.val_offset != None: 281 (num, den) = struct.unpack_from("ll", full_string[self.val_offset:]) 282 self.val = float(num) / den, 283 elif (TYPES[tag_type] == 'float'): 284 self.val = struct.unpack_from("f", full_string[self.val_offset:])[0] 285 elif (TYPES[tag_type] == 'double'): 286 if self.val_offset != None: 287 self.val = struct.unpack_from("d", full_string[self.val_offset:])[0] 288 else: 289 logger.warning("unrecognized type of strInputentry self: %s tag: %s type: %s TYPE: %s" % (self, baseline_tiff_tags[self.tag], self.tag_type, TYPES[tag_type]))
        290

        fabio-0.1.3/epydoc/module-tree.html0000644000175000017500000002152112126623347017761 0ustar jeromejerome00000000000000 Module Hierarchy
         
        [hide private]
        [frames] | no frames]
        [ Module Hierarchy | Class Hierarchy ]

        Module Hierarchy

        fabio-0.1.3/epydoc/fabio.dm3image-pysrc.html0000644000175000017500000031555212126623347021454 0ustar jeromejerome00000000000000 fabio.dm3image
        Package fabio :: Module dm3image
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.dm3image

          1  """ 
          2  Authors: Henning O. Sorensen & Erik Knudsen 
          3           Center for Fundamental Research: Metal Structures in Four Dimensions 
          4           Risoe National Laboratory 
          5           Frederiksborgvej 399 
          6           DK-4000 Roskilde 
          7           email:erik.knudsen@risoe.dk 
          8   
          9          + Jon Wright, ESRF 
         10  """ 
         11  import logging 
         12  import numpy 
         13  from fabioimage import fabioimage 
         14  logger = logging.getLogger("dm3image") 
         15   
         16  DATA_TYPES = {  2     :  numpy.int16, 
         17                  4     :  numpy.uint16, 
         18                  3     :  numpy.int32, 
         19                  5     :  numpy.uint32, 
         20                  6     :  numpy.float32, 
         21                  7     :  numpy.float, 
         22                  8     :  numpy.int8, 
         23                  9     :  None, 
         24                  10    :  None, 
         25                  15    :  'Struct', 
         26                  18    :  None, 
         27                  20    :  None 
         28                  } 
         29   
         30  DATA_BYTES = {  2     :  2, 
         31                  4     :  2, 
         32                  3     :  4, 
         33                  5     :  4, 
         34                  6     :  4, 
         35                  7     :  8, 
         36                  8     :  1, 
         37                  9     :  None, 
         38                  10    :  None, 
         39                  15    :  'Struct', 
         40                  18    :  None, 
         41                  20    :  None 
         42                  } 
         43   
         44   
         45   
        
        46 -class dm3image(fabioimage):
        47 """ Read and try to write the dm3 data format """
        48 - def __init__(self, *args, **kwargs):
        49 fabioimage.__init__(self, *args, **kwargs) 50 self.encoded_datatype = None 51 self.no_data_elements = None 52 self.grouptag_is_sorted = None 53 self.grouptag_is_open = None 54 self.tag_encoded_type = None 55 self.tag_data_type = None 56 self.tag_is_data = None 57 self.grouptag_no_tags = None 58 self.bytes_in_file = None 59 self.tag_label_length = None 60 self.go_on = None
        61
        62 - def _readheader(self):
        63 self.infile.seek(0) 64 file_format = self.readbytes(4, numpy.uint32)[0] # should be 3 65 assert file_format == 3, 'Wrong file type ' 66 self.bytes_in_file = self.readbytes(4, numpy.uint32)[0] 67 self.byte_order = self.readbytes(4, numpy.uint32)[0] # 0 = big, 1= little 68 print 'read dm3 file - file format ', file_format 69 print 'Bytes in file : ' , self.bytes_in_file 70 print 'Byte order :', self.byte_order, ' - 0 = bigEndian , 1 = littleEndian' 71 72 if self.byte_order == 0: 73 self.swap = True 74 elif self.byte_order == 1: 75 self.swap = False 76 else: 77 raise ValueError
        78
        79 - def read(self, fname, frame=None):
        80 self.header = {} 81 self.resetvals() 82 self.infile = self._open(fname, "rb") 83 self._readheader() 84 self.go_on = True 85 print self.go_on 86 while self.go_on: 87 self.read_tag_group() 88 self.read_tag_entry() 89 if self.infile.tell() > self.bytes_in_file: break 90 91 while self.tag_is_data == 21: 92 self.read_tag_entry() 93 if self.infile.tell() > self.bytes_in_file: 94 self.go_on = False 95 96 (dim1_raw, dim2_raw) = self.header['Active Size (pixels)'].split() 97 (dim1_raw, dim2_raw) = (eval(dim1_raw), eval(dim2_raw)) 98 (dim1_binning, dim2_binning) = self.header['Binning'].split() 99 (dim1_binning, dim2_binning) = (eval(dim1_binning), eval(dim2_binning)) 100 self.dim1 = dim1_raw / dim1_binning 101 self.dim2 = dim2_raw / dim2_binning 102 #print dim1,dim2 103 if self.header.has_key('Data'): 104 self.data = self.header['Data'].reshape(self.dim1, self.dim2)
        105
        106 - def readbytes(self, bytes_to_read, format, swap=True):
        107 raw = self.infile.read(bytes_to_read) 108 if format != None: 109 data = numpy.fromstring(raw, format) 110 else: 111 data = raw 112 if swap: 113 data = data.byteswap() 114 return data
        115 116 117
        118 - def read_tag_group(self):
        119 120 self.grouptag_is_sorted = self.readbytes(1, numpy.uint8)[0] 121 self.grouptag_is_open = self.readbytes(1, numpy.uint8)[0] 122 self.grouptag_no_tags = self.readbytes(4, numpy.uint32)[0] 123 logger.debug('TagGroup is sorted? %s', self.grouptag_is_sorted) 124 logger.debug('TagGroup is open? %s', self.grouptag_is_open) 125 logger.debug('no of tags in TagGroup %s', self.grouptag_no_tags)
        126
        127 - def read_tag_entry(self):
        128 129 self.tag_is_data = self.readbytes(1, numpy.uint8)[0] 130 self.tag_label_length = self.readbytes(2, numpy.uint16)[0] 131 logger.debug('does Tag have data ? %s - 20 = Tag group , 21 = data ', self.tag_is_data) 132 logger.debug('length of tag_label ', self.tag_label_length) 133 if self.tag_label_length != 0: 134 tag_label = self.infile.read(self.tag_label_length) 135 else: 136 tag_label = None 137 138 if self.tag_is_data == 21: 139 # This is data 140 self.header[tag_label] = self.read_tag_type() 141 logger.debug("%s: %s", tag_label, self.header[tag_label])
        142 143
        144 - def read_tag_type(self):
        145 if self.infile.read(4) != '%%%%': 146 raise IOError 147 self.tag_data_type = self.readbytes(4, numpy.uint32)[0] 148 logger.debug('data is of type : %s - 1 = simple, 2= string, 3 = array, >3 structs', self.tag_data_type) 149 self.tag_encoded_type = self.readbytes(4, numpy.uint32)[0] 150 logger.debug('encode type: %s %s', self.tag_encoded_type, DATA_TYPES[ self.tag_encoded_type]) 151 if self.tag_data_type == 1: 152 # simple type 153 return self.readbytes(DATA_BYTES[ self.tag_encoded_type], 154 DATA_TYPES[ self.tag_encoded_type], 155 swap=self.swap)[0] 156 # are the data stored in a simple array? 157 if self.tag_encoded_type == 20 and self.tag_data_type == 3 : 158 self.data_type = self.readbytes(4, numpy.uint32)[0] 159 self.no_data_elements = self.readbytes(4, numpy.uint32)[0] 160 if self.data_type == 10: 161 logger.debug('skip bytes %s', self.no_data_elements) 162 dump = self.infile.read(self.no_data_elements) 163 return None 164 165 logger.debug('Data are stored as a simple a array -') 166 logger.debug('%s data elemets stored as %s', self.no_data_elements, self.data_type) 167 read_no_bytes = DATA_BYTES[self.data_type] * self.no_data_elements 168 format = DATA_TYPES[self.data_type] 169 return self.readbytes(read_no_bytes, format, swap=self.swap) 170 171 # are the data stored in a complex array ? 172 # print 'tag_type + data_type', self.tag_encoded_type,self.tag_data_type 173 174 #print self.tag_encoded_type , self.tag_data_type 175 if self.tag_encoded_type == 20 and self.tag_data_type > 3 : 176 self.tag_encoded_type = self.readbytes(4, numpy.uint32)[0] 177 logger.debug('found array - new tag_encoded_type %s', self.tag_encoded_type) 178 if self.tag_encoded_type == 15: # struct type 179 ###type = self.readbytes(4,numpy.int32) 180 struct_name_length = self.readbytes(4, numpy.int32)[0] 181 struct_number_fields = self.readbytes(4, numpy.int32)[0] 182 #print 'struct - name_length, number_field', struct_name_length,struct_number_fields 183 #print self.infile.read(struct_name_length) 184 field_info = [] 185 for i in range(struct_number_fields): 186 field_info.append([self.readbytes(4, numpy.int32)[0], self.readbytes(4, numpy.int32)[0]]) 187 #print field_info 188 self.no_data_elements = self.readbytes(4, numpy.int32)[0] 189 #print '%i data elemets stored as ' %self.no_data_elements 190 bytes_in_struct = 0 191 for i in range(struct_number_fields): 192 bytes_in_struct += DATA_BYTES[field_info[i][1]] 193 logger.debug('skip bytes %s', self.no_data_elements * bytes_in_struct) 194 dump = self.infile.read(self.no_data_elements * bytes_in_struct) 195 return None 196 197 198 if self.tag_encoded_type == 15: # struct type 199 ###type = self.readbytes(4,numpy.int32) 200 struct_name_length = self.readbytes(4, numpy.int32)[0] 201 struct_number_fields = self.readbytes(4, numpy.int32)[0] 202 #print 'struct - name_length, number_field', struct_name_length,struct_number_fields 203 #print self.infile.read(struct_name_length) 204 field_info = [] 205 for i in range(struct_number_fields): 206 field_info.append([self.readbytes(4, numpy.int32)[0], self.readbytes(4, numpy.int32)[0]]) 207 #print field_info 208 field_data = '' 209 for i in range(struct_number_fields): 210 #print type(i) 211 field_data = field_data + self.readbytes(field_info[i][0], None, swap=False) + ' ' 212 field_data = field_data + '%i ' % self.readbytes(DATA_BYTES[field_info[i][1]], 213 DATA_TYPES[field_info[i][1]], 214 swap=self.swap)[0] 215 return field_data
        216
        217 - def read_data(self):
        218 self.encoded_datatype = numpy.fromstring(self.infile.read(4), numpy.uint32).byteswap()
        219

        fabio-0.1.3/epydoc/fabio.file_series.filename_series-class.html0000644000175000017500000003304112126623347025343 0ustar jeromejerome00000000000000 fabio.file_series.filename_series
        Package fabio :: Module file_series :: Class filename_series
        [hide private]
        [frames] | no frames]

        Class filename_series

        source code

        Much like the others, but created from a string filename

        Instance Methods [hide private]
         
        __init__(self, filename)
        create from a filename (String)
        source code
         
        next(self)
        increment number
        source code
         
        previous(self)
        decrement number
        source code
         
        current(self)
        return current filename string
        source code
         
        jump(self, num)
        jump to a specific number
        source code
         
        next_image(self)
        returns the next image as a fabioimage
        source code
         
        prev_image(self)
        returns the previos image as a fabioimage
        source code
         
        current_image(self)
        returns the current image as a fabioimage
        source code
         
        jump_image(self, num)
        returns the image number as a fabioimage
        source code
         
        next_object(self)
        returns the next filename as a fabio.FilenameObject
        source code
         
        previous_object(self)
        returns the previous filename as a fabio.FilenameObject
        source code
         
        current_object(self)
        returns the current filename as a fabio.FilenameObject
        source code
         
        jump_object(self, num)
        returns the filename num as a fabio.FilenameObject
        source code
        fabio-0.1.3/epydoc/fabio.binaryimage.binaryimage-class.html0000644000175000017500000005072612126623347024507 0ustar jeromejerome00000000000000 fabio.binaryimage.binaryimage
        Package fabio :: Module binaryimage :: Class binaryimage
        [hide private]
        [frames] | no frames]

        Class binaryimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               binaryimage
        

        This simple library has been made for manipulating exotic/unknown files format.

        Binary files images are simple none-compressed 2D images only defined by their : data-type, dimensions, byte order and offset

        Instance Methods [hide private]
         
        __init__(self, *args, **kwargs)
        Set up initial values
        source code
         
        read(self, fname, dim1, dim2, offset=0, bytecode='int32', endian='<')
        Read a binary image Parameters : fname, dim1, dim2, offset, bytecode, endian fname : file name : str dim1,dim2 : image dimensions : int offset : size of the : int bytecode among : "int8","int16","int32","int64","uint8","uint16","uint32","uint64","float32","float64",...
        source code
         
        estimate_offset_value(self, fname, dim1, dim2, bytecode='int32')
        Estimates the size of a file
        source code
         
        write(self, fname)
        To be overwritten - write the file
        source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        swap_needed(endian)
        Decide if we need to byteswap
        source code

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, *args, **kwargs)
        (Constructor)

        source code 

        Set up initial values

        Overrides: object.__init__
        (inherited documentation)

        read(self, fname, dim1, dim2, offset=0, bytecode='int32', endian='<')

        source code 

        Read a binary image Parameters : fname, dim1, dim2, offset, bytecode, endian fname : file name : str dim1,dim2 : image dimensions : int offset : size of the : int bytecode among : "int8","int16","int32","int64","uint8","uint16","uint32","uint64","float32","float64",... endian among short or long endian ("<" or ">")

        Overrides: fabioimage.fabioimage.read

        write(self, fname)

        source code 

        To be overwritten - write the file

        Overrides: fabioimage.fabioimage.write
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.bruker100image-pysrc.html0000644000175000017500000013364112126623347022501 0ustar jeromejerome00000000000000 fabio.bruker100image
        Package fabio :: Module bruker100image
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.bruker100image

         1  import numpy 
         2  import math 
         3  import logging 
         4  logger = logging.getLogger("bruker100image") 
         5  try: 
         6      import Image 
         7  except ImportError: 
         8      logger.warning("PIL is not installed ... trying to do without") 
         9      Image = None 
        10   
        11  from brukerimage import brukerimage 
        12  from readbytestream import readbytestream  
        13   
        
        14 -class bruker100image(brukerimage):
        15 16
        17 - def toPIL16(self, filename=None):
        18 if not Image: 19 raise RuntimeError("PIL is not installed !!! ") 20 21 if filename: 22 self.read(filename) 23 PILimage = Image.frombuffer("F", 24 (self.dim1, self.dim2), 25 self.data, 26 "raw", 27 "F;16", 0, -1) 28 return PILimage
        29
        30 - def read(self, fname, frame=None):
        31 f = open(fname, "rb") 32 try: 33 self._readheader(f) 34 except: 35 raise 36 37 rows = int(self.header['NROWS']) 38 cols = int(self.header['NCOLS']) 39 npixelb = int(self.header['NPIXELB'][0]) 40 # you had to read the Bruker docs to know this! 41 42 # We are now at the start of the image - assuming 43 # readbrukerheader worked 44 # size = rows * cols * npixelb 45 self.data = readbytestream(f, f.tell(), rows, cols, npixelb, 46 datatype="int", signed='n', swap='n') 47 48 noverfl = self.header['NOVERFL'].split() # now process the overflows 49 #read the set of "underflow pixels" - these will be completely 50 # disregarded for now 51 data = self.data 52 k = 0 53 54 while k < 2:#for the time being things - are done in 16 bits 55 datatype = {'1' : numpy.uint8, 56 '2' : numpy.uint16, 57 '4' : numpy.uint32 }[("%d" % 2 ** k)] 58 ar = numpy.array(numpy.fromstring(f.read(int(noverfl[k]) * (2 ** k)), 59 datatype), numpy.uint16) 60 #insert the the overflow pixels in the image array: 61 #this is probably a memory intensive way of doing this - 62 # might be done in a more clever way 63 lim = 2 ** (8 * k) - 1 64 #generate an array comprising of the indices into data.ravel() 65 # where its value equals lim. 66 M = numpy.compress(numpy.equal(data.ravel(), lim), numpy.arange(rows * cols)) 67 #now put values from ar into those indices 68 numpy.put(data.ravel(), M, ar) 69 padding = 16 * int(math.ceil(int(noverfl[k]) * (2 ** k) / 16.)) - \ 70 int(noverfl[k]) * (2 ** k) 71 f.seek(padding, 1) 72 print noverfl[k] + " bytes read + %d bytes padding" % padding 73 k = k + 1 74 75 f.close() 76 77 (self.dim1, self.dim2) = (rows, cols) 78 print self.dim1, self.dim2 79 self.resetvals() 80 return self
        81 82 if __name__ == '__main__': 83 import sys, time 84 I = bruker100image() 85 b = time.clock() 86 while (sys.argv[1:]): 87 I.read(sys.argv[1]) 88 r = I.toPIL16() 89 I.rebin(2, 2) 90 print sys.argv[1] + (": max=%d, min=%d, mean=%.2e, stddev=%.2e") % ( 91 I.getmax(), I.getmin(), I.getmean(), I.getstddev()) 92 print 'integrated intensity (%d %d %d %d) =%.3f' % ( 93 10, 20, 20, 40, I.integrate_area((10, 20, 20, 40))) 94 sys.argv[1:] = sys.argv[2:] 95 e = time.clock() 96 print (e - b) 97

        fabio-0.1.3/epydoc/fabio.tifimage-module.html0000644000175000017500000004715012126623347021674 0ustar jeromejerome00000000000000 fabio.tifimage
        Package fabio :: Module tifimage
        [hide private]
        [frames] | no frames]

        Module tifimage

        source code

        
        FabIO class for dealing with TIFF images. 
        In facts wraps TiffIO from V. Armando Solé (available in PyMca) or falls back to PIL
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions;
          Risoe National Laboratory;
          Frederiksborgvej 399;
          DK-4000 Roskilde;
          email:erik.knudsen@risoe.dk
        * Jérôme Kieffer:
          European Synchrotron Radiation Facility;
          Grenoble (France)
           
        License: GPLv3+        
        
        

        Date: 11/07/2011

        Authors:
        J\xc3\xa9r\xc3\xb4me Kieffer, Henning O. Sorensen, Erik Knudsen

        Copyright: ESRF, Grenoble & Risoe National Laboratory

        License: GPLv3+

        Classes [hide private]
          tifimage
        Images in TIF format Wraps TiffIO
          Tiff_header
          Image_File_Directory
          Image_File_Directory_entry
        Variables [hide private]
          __status__ = 'stable'
          logger = logging.getLogger("tifimage")
          PIL_TO_NUMPY = {'1': <type 'bool'>, 'F': <type 'numpy.float32'...
          LITTLE_ENDIAN = 1234
          BIG_ENDIAN = 3412
          TYPES = {0: 'invalid', 1: 'byte', 2: 'ascii', 3: 'short', 4: '...
          TYPESIZES = {0: 0, 1: 1, 2: 1, 3: 2, 4: 4, 5: 8, 6: 1, 7: 1, 8...
          baseline_tiff_tags = {256: 'ImageWidth', 257: 'ImageLength', 2...
          __package__ = 'fabio'
        Variables Details [hide private]

        PIL_TO_NUMPY

        Value:
        {'1': <type 'bool'>,
         'F': <type 'numpy.float32'>,
         'I': <type 'numpy.int32'>,
         'I;16': <type 'numpy.uint16'>,
         'L': <type 'numpy.uint8'>}
        

        TYPES

        Value:
        {0: 'invalid',
         1: 'byte',
         2: 'ascii',
         3: 'short',
         4: 'long',
         5: 'rational',
         6: 'sbyte',
         7: 'undefined',
        ...
        

        TYPESIZES

        Value:
        {0: 0,
         1: 1,
         2: 1,
         3: 2,
         4: 4,
         5: 8,
         6: 1,
         7: 1,
        ...
        

        baseline_tiff_tags

        Value:
        {256: 'ImageWidth',
         257: 'ImageLength',
         258: 'BitsPerSample',
         259: 'Compression',
         262: 'PhotometricInterpretation',
         264: 'CellWidth',
         265: 'CellLength',
         270: 'ImageDescription',
        ...
        

        fabio-0.1.3/epydoc/toc-fabio.converters-module.html0000644000175000017500000000336612120434325023053 0ustar jeromejerome00000000000000 converters

        Module converters


        Functions

        convert_data
        convert_data_integer
        convert_header

        Variables

        CONVERSION_DATA
        CONVERSION_HEADER
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/toc-fabio.mar345image-module.html0000644000175000017500000000262412120434325022673 0ustar jeromejerome00000000000000 mar345image

        Module mar345image


        Classes

        mar345image

        Variables

        __doc__
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/crarr.png0000644000175000017500000000052412120434325016456 0ustar jeromejerome00000000000000‰PNG  IHDR e¢E,tEXtCreation TimeTue 22 Aug 2006 00:43:10 -0500` XtIMEÖ)Ó}Ö pHYsÂÂnÐu>gAMA± üaEPLTEÿÿÿÍð×ÏÀ€f4sW áÛЊrD`@bCÜÕÈéäÜ–X{`,¯Ÿ€lN‡o@õóðª™xdEðí螊dÐÆ´”~TÖwÅvtRNS@æØfMIDATxÚc`@¼ì¼0&+š—Šˆ°»(’ˆ€ ;; /ðEXùØ‘?Ð n ƒª†— b;'ª+˜˜YÐ#œ(r<£"IEND®B`‚fabio-0.1.3/epydoc/fabio.GEimage-module.html0000644000175000017500000003074212126623347021404 0ustar jeromejerome00000000000000 fabio.GEimage
        Package fabio :: Module GEimage
        [hide private]
        [frames] | no frames]

        Module GEimage

        source code

        Classes [hide private]
          GEimage
        Functions [hide private]
         
        demo() source code
        Variables [hide private]
          logger = logging.getLogger("GEimage")
          GE_HEADER_INFO = [('ImageFormat', 10, None), ('VersionOfStanda...
          __package__ = 'fabio'
        Variables Details [hide private]

        GE_HEADER_INFO

        Value:
        [('ImageFormat', 10, None),
         ('VersionOfStandardHeader', 2, '=H'),
         ('StandardHeaderSizeInBytes', 4, '=L'),
         ('VersionOfUserHeader', 2, '=H'),
         ('UserHeaderSizeInBytes', 4, '=L'),
         ('NumberOfFrames', 2, '=H'),
         ('NumberOfRowsInFrame', 2, '=H'),
         ('NumberOfColsInFrame', 2, '=H'),
        ...
        

        fabio-0.1.3/epydoc/toc-fabio.binaryimage-module.html0000644000175000017500000000262412120434325023144 0ustar jeromejerome00000000000000 binaryimage

        Module binaryimage


        Classes

        binaryimage

        Variables

        __doc__
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.file_series.file_series-class.html0000644000175000017500000007766312126623347024524 0ustar jeromejerome00000000000000 fabio.file_series.file_series
        Package fabio :: Module file_series :: Class file_series
        [hide private]
        [frames] | no frames]

        Class file_series

        source code

        object --+    
                 |    
              list --+
                     |
                    file_series
        
        Known Subclasses:

        
        Represents a series of files to iterate
        has an idea of a current position to do next and prev
        
        You also get from the list python superclass:
           append
           count
           extend
           insert
           pop
           remove
           reverse
           sort
        
        
        Instance Methods [hide private]
        new empty list
        __init__(self, list_of_strings)
        Constructor:
        source code
         
        first(self)
        First image in series
        source code
         
        last(self)
        Last in series
        source code
         
        previous(self)
        Prev in a sequence
        source code
         
        current(self)
        Current position in a sequence
        source code
         
        next(self)
        Next in a sequence
        source code
         
        jump(self, num)
        Goto a position in sequence
        source code
         
        len(self)
        Number of files
        source code
         
        first_image(self)
        First image in a sequence
        source code
         
        last_image(self)
        Last image in a sequence
        source code
         
        next_image(self)
        Return the next image
        source code
         
        previous_image(self)
        Return the previous image
        source code
         
        jump_image(self, num)
        Jump to and read image
        source code
         
        current_image(self)
        Current image in sequence
        source code
         
        first_object(self)
        First image in a sequence
        source code
         
        last_object(self)
        Last image in a sequence
        source code
         
        next_object(self)
        Return the next image
        source code
         
        previous_object(self)
        Return the previous image
        source code
         
        jump_object(self, num)
        Jump to and read image
        source code
         
        current_object(self)
        Current image in sequence
        source code

        Inherited from list: __add__, __contains__, __delitem__, __delslice__, __eq__, __ge__, __getattribute__, __getitem__, __getslice__, __gt__, __iadd__, __imul__, __iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __repr__, __reversed__, __rmul__, __setitem__, __setslice__, __sizeof__, append, count, extend, index, insert, pop, remove, reverse, sort

        Inherited from object: __delattr__, __format__, __reduce__, __reduce_ex__, __setattr__, __str__, __subclasshook__

        Class Variables [hide private]

        Inherited from list: __hash__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, list_of_strings)
        (Constructor)

        source code 

        Constructor:

        Parameters:
        • list_of_strings - arg should be a list of strings which are filenames
        Returns: new empty list
        Overrides: object.__init__

        first_image(self)

        source code 

        First image in a sequence

        Returns:
        fabioimage

        last_image(self)

        source code 

        Last image in a sequence

        Returns:
        fabioimage

        next_image(self)

        source code 

        Return the next image

        Returns:
        fabioimage

        previous_image(self)

        source code 

        Return the previous image

        Returns:
        fabioimage

        jump_image(self, num)

        source code 

        Jump to and read image

        Returns:
        fabioimage

        current_image(self)

        source code 

        Current image in sequence

        Returns:
        fabioimage

        first_object(self)

        source code 

        First image in a sequence

        Returns:
        file_object

        last_object(self)

        source code 

        Last image in a sequence

        Returns:
        file_object

        next_object(self)

        source code 

        Return the next image

        Returns:
        file_object

        previous_object(self)

        source code 

        Return the previous image

        Returns:
        file_object

        jump_object(self, num)

        source code 

        Jump to and read image

        Returns:
        file_object

        current_object(self)

        source code 

        Current image in sequence

        Returns:
        file_object

        fabio-0.1.3/epydoc/fabio.pnmimage-pysrc.html0000644000175000017500000022302312126623347021552 0ustar jeromejerome00000000000000 fabio.pnmimage
        Package fabio :: Module pnmimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.pnmimage

          1  #!/usr/bin/env python 
          2  #coding: utf8 
          3  """ 
          4   
          5  Authors: Henning O. Sorensen & Erik Knudsen 
          6           Center for Fundamental Research: Metal Structures in Four Dimensions 
          7           Risoe National Laboratory 
          8           Frederiksborgvej 399 
          9           DK-4000 Roskilde 
         10           email:henning.sorensen@risoe.dk 
         11   
         12  """ 
         13   
         14  import numpy, logging 
         15  logger = logging.getLogger("pnmimage") 
         16  from fabioimage import fabioimage 
         17   
         18  SUBFORMATS = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7'] 
         19   
         20  HEADERITEMS = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL'] 
         21  P7HEADERITEMS = ['WIDTH', 'HEIGHT', 'DEPTH', 'MAXVAL', 'TUPLTYPE', 'ENDHDR'] 
        
        22 23 -class pnmimage(fabioimage):
        24 - def __init__(self, *arg, **kwargs):
        25 fabioimage.__init__(self, *arg, **kwargs) 26 fun = getattr(fabioimage, '__init__', lambda x: None) 27 fun(self) 28 self.data = None 29 self.header = {'Subformat':'P5'} 30 self.dim1 = self.dim2 = 0 31 self.m = self.maxval = self.stddev = self.minval = None 32 self.header_keys = self.header.keys() 33 self.bytecode = None
        34
        35 - def _readheader(self, f):
        36 #pnm images have a 3-line header but ignore lines starting with '#' 37 #1st line contains the pnm image sub format 38 #2nd line contains the image pixel dimension 39 #3rd line contains the maximum pixel value (at least for grayscale - check this) 40 self.header_keys = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL'] 41 42 l = f.readline().strip() 43 if l not in SUBFORMATS: 44 raise IOError, ('unknown subformat of pnm: %s' % l) 45 else: 46 self.header['SUBFORMAT'] = l 47 48 if self.header['SUBFORMAT'] == 'P7': 49 self.header_keys = P7HEADERITEMS 50 #this one has a special header 51 while 'ENDHDR' not in l: 52 l = f.readline() 53 while(l[0] == '#'): l = f.readline() 54 s = l.lsplit(' ', 1) 55 if s[0] not in P7HEADERITEMS: 56 raise IOError, ('Illegal pam (netpnm p7) headeritem %s' % s[0]) 57 self.header[s[0]] = s[1] 58 else: 59 self.header_keys = HEADERITEMS 60 for k in self.header_keys[1:]: 61 l = f.readline() 62 while(l[0] == '#'): l = f.readline() 63 self.header[k] = l.strip() 64 65 #set the dimensions 66 dims = (self.header['DIMENSIONS'].split()) 67 self.dim1, self.dim2 = int(dims[0]), int(dims[1]) 68 #figure out how many bytes are used to store the data 69 #case construct here! 70 m = int(self.header['MAXVAL']) 71 if m < 256: 72 self.bytecode = numpy.uint8 73 elif m < 65536: 74 self.bytecode = numpy.uint16 75 elif m < 2147483648L: 76 self.bytecode = numpy.uint32 77 logger.warning('32-bit pixels are not really supported by the netpgm standard') 78 else: 79 raise IOError, 'could not figure out what kind of pixels you have'
        80
        81 - def read(self, fname, frame=None):
        82 """ 83 try to read PNM images 84 @param fname: name of the file 85 @param frame: not relevant here! PNM is always single framed 86 """ 87 self.header = {} 88 self.resetvals() 89 infile = self._open(fname) 90 self._readheader(infile) 91 92 #read the image data 93 decoder_name = "%sdec" % self.header['SUBFORMAT'] 94 if decoder_name in dir(pnmimage): 95 decoder = getattr(pnmimage, decoder_name) 96 self.data = decoder(infile, self.bytecode) 97 else: 98 raise IOError("No decoder named %s for file %s" % (decoder_name, fname)) 99 self.resetvals() 100 return self
        101 102 @staticmethod
        103 - def P1dec(buf, bytecode):
        104 data = numpy.zeros((self.dim2, self.dim1)) 105 i = 0 106 for l in buf.readlines(): 107 try: 108 data[i, :] = numpy.array(l.split()).astype(bytecode) 109 except ValueError: 110 raise IOError, 'Size spec in pnm-header does not match size of image data field' 111 return data
        112 113 @staticmethod
        114 - def P4dec(buf, bytecode):
        115 err = 'single bit (pbm) images are not supported - yet' 116 logger.error(err) 117 raise NotImplementedError(err)
        118 119 @staticmethod
        120 - def P2dec(buf, bytecode):
        121 data = numpy.zeros((self.dim2, self.dim1)) 122 i = 0 123 for l in buf.readlines(): 124 try: 125 data[i, :] = numpy.array(l.split()).astype(bytecode) 126 except ValueError: 127 raise IOError, 'Size spec in pnm-header does not match size of image data field' 128 return data
        129 130 @staticmethod
        131 - def P5dec(buf, bytecode):
        132 l = buf.read() 133 try: 134 data = numpy.reshape(numpy.fromstring(l, bytecode), [self.dim2, self.dim1]).byteswap() 135 except ValueError: 136 raise IOError, 'Size spec in pnm-header does not match size of image data field' 137 return data
        138 139 @staticmethod
        140 - def P3dec(buf, bytecode):
        141 err = '(plain-ppm) RGB images are not supported - yet' 142 logger.error(err) 143 raise NotImplementedError(err)
        144 145 @staticmethod
        146 - def P6dec(buf, bytecode):
        147 err = '(ppm) RGB images are not supported - yet' 148 logger.error(err) 149 raise NotImplementedError(err)
        150 151 @staticmethod
        152 - def P7dec(buf, bytecode):
        153 err = '(pam) images are not supported - yet' 154 logger.error(err) 155 raise NotImplementedError(err)
        156
        157 - def write(self, filename):
        158 raise NotImplementedError('write pnm images is not implemented yet.')
        159 160 @staticmethod
        161 - def checkData(data=None):
        162 if data is None: 163 return None 164 else: 165 return data.astype(int)
        166

        fabio-0.1.3/epydoc/toc-fabio.mar345_IO-module.html0000644000175000017500000000225612120434325022260 0ustar jeromejerome00000000000000 mar345_IO

        Module mar345_IO


        Variables

        __package__
        __test__

        [hide private] fabio-0.1.3/epydoc/fabio.fit2dmaskimage-pysrc.html0000644000175000017500000011641112126623347022646 0ustar jeromejerome00000000000000 fabio.fit2dmaskimage
        Package fabio :: Module fit2dmaskimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.fit2dmaskimage

         1  ## Automatically adapted for numpy.oldnumeric Oct 05, 2007 by alter_code1.py 
         2   
         3  #!/usr/bin/env python 
         4  """ 
         5   
         6  Author: Andy Hammersley, ESRF 
         7  Translation into python/fabio: Jon Wright, ESRF 
         8  """ 
         9   
        10  import numpy 
        11   
        12  from fabioimage import fabioimage 
        
        13 14 15 -class fit2dmaskimage(fabioimage):
        16 """ Read and try to write Andy Hammersley's mask format """ 17 18
        19 - def _readheader(self, infile):
        20 """ 21 Read in a header from an already open file 22 """ 23 # 1024 bytes gives 256x32 bit integers 24 header = infile.read(1024) 25 for i, j in [ ("M", 0), 26 ("A", 4), 27 ("S", 8), 28 ("K", 12) ]: 29 if header[j] != i: 30 raise Exception("Not a fit2d mask file") 31 fit2dhdr = numpy.fromstring(header, numpy.int32) 32 self.dim1 = fit2dhdr[4] # 1 less than Andy's fortran 33 self.dim2 = fit2dhdr[5]
        34 35
        36 - def read(self, fname, frame=None):
        37 """ 38 Read in header into self.header and 39 the data into self.data 40 """ 41 fin = self._open(fname) 42 self._readheader(fin) 43 # Compute image size 44 self.bytecode = numpy.uint8 45 self.bpp = len(numpy.array(0, self.bytecode).tostring()) 46 47 # integer division 48 num_ints = (self.dim1 + 31) // 32 49 total = self.dim2 * num_ints * 4 50 data = fin.read(total) 51 assert len(data) == total 52 fin.close() 53 54 # Now to unpack it 55 data = numpy.fromstring(data, numpy.uint8) 56 data = numpy.reshape(data, (self.dim2, num_ints * 4)) 57 58 result = numpy.zeros((self.dim2, num_ints * 4 * 8), numpy.uint8) 59 60 # Unpack using bitwise comparisons to 2**n 61 bits = numpy.ones((1), numpy.uint8) 62 for i in range(8): 63 temp = numpy.bitwise_and(bits, data) 64 result[:, i::8] = temp.astype(numpy.uint8) 65 bits = bits * 2 66 # Extra rows needed for packing odd dimensions 67 spares = num_ints * 4 * 8 - self.dim1 68 if spares == 0: 69 self.data = numpy.where(result == 0, 0, 1) 70 else: 71 self.data = numpy.where(result[:, :-spares] == 0, 0, 1) 72 # Transpose appears to be needed to match edf reader (scary??) 73 # self.data = numpy.transpose(self.data) 74 self.data = numpy.reshape(self.data.astype(numpy.uint16), 75 (self.dim2, self.dim1)) 76 self.pilimage = None 77 return self
        78 79 80
        81 - def write(self, fname):
        82 """ 83 Try to write a file 84 check we can write zipped also 85 mimics that fabian was writing uint16 (we sometimes want floats) 86 """ 87 raise Exception("Not implemented yet")
        88 89 @staticmethod
        90 - def checkData(data=None):
        91 if data is None: 92 return None 93 else: 94 return data.astype(int)
        95

        fabio-0.1.3/epydoc/fabio.file_series-pysrc.html0000644000175000017500000033347412126623347022262 0ustar jeromejerome00000000000000 fabio.file_series
        Package fabio :: Module file_series
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.file_series

          1  #!/usr/bin/env python 
          2   
          3  """ 
          4   
          5  Authors: 
          6  ........ 
          7   
          8  * Henning O. Sorensen & Erik Knudsen 
          9    Center for Fundamental Research: Metal Structures in Four Dimensions 
         10    Risoe National Laboratory 
         11    Frederiksborgvej 399 
         12    DK-4000 Roskilde 
         13    email:erik.knudsen@risoe.dk 
         14  * Jon Wright, ESRF 
         15   
         16  """ 
         17  import logging, sys 
         18  logger = logging.getLogger("fileseries") 
         19  import traceback as pytraceback 
         20   
         21  from fabioutils import FilenameObject, next_filename 
         22   
         23  from openimage import openimage 
         24   
         25   
        
        26 -def new_file_series0(first_object, first=None, last=None, step=1):
        27 """ 28 Created from a fabio image 29 first and last are file numbers 30 31 """ 32 im = first_object 33 nimages = 0 34 # for counting images 35 if None in (first, last): 36 step = 0 37 total = 1 38 else: 39 total = last - first 40 41 yield im 42 while nimages < total: 43 nimages += step 44 try: 45 newim = im.next() 46 im = newim 47 except Exception, error: 48 pytraceback.print_exc() 49 50 # Skip bad images 51 logger.warning("Got a problem here: %s", error) 52 try: 53 im.filename = next_filename(im.filename) 54 except Exception, error: 55 # KE: This will not work and will throw an exception 56 # fabio.next_filename doesn't understand %nnnn on the end 57 logger.warning("Got another problem here: %s", error) 58 im.filename = next_filename(im.sequencefilename) 59 yield None 60 yield im
        61 62 63
        64 -def new_file_series(first_object, nimages=0, step=1, traceback=False):
        65 """ 66 A generator function that creates a file series starting from a a fabioimage. 67 Iterates through all images in a file (if more than 1), then proceeds to 68 the next file as determined by fabio.next_filename. 69 70 @param first_object: the starting fabioimage, which will be the first one yielded 71 in the sequence 72 @param nimages: the maximum number of images to consider 73 step: step size, will yield the first and every step'th image until nimages 74 is reached. (e.g. nimages = 5, step = 2 will yield 3 images (0, 2, 4) 75 @param traceback: if True causes it to print a traceback in the event of an 76 exception (missing image, etc.). Otherwise the calling routine can handle 77 the exception as it chooses 78 @param yields: the next fabioimage in the series. 79 In the event there is an exception, it yields the sys.exec_info for the 80 exception instead. sys.exec_info is a tuple: 81 ( exceptionType, exceptionValue, exceptionTraceback ) 82 from which all the exception information can be obtained. 83 84 Suggested usage: 85 86 :: 87 88 for obj in new_file_series( ... ): 89 if not isinstance(obj, fabio.fabioimage.fabioimage ): 90 # deal with errors like missing images, non readable files, etc 91 # e.g. 92 traceback.print_exception(obj[0], obj[1], obj[2]) 93 94 """ 95 im = first_object 96 nprocessed = 0 97 abort = False 98 if nimages > 0: 99 yield im 100 nprocessed += 1 101 while nprocessed < nimages: 102 try: 103 newim = im.next() 104 im = newim 105 retVal = im 106 except Exception, ex: 107 retVal = sys.exc_info() 108 if(traceback): 109 pytraceback.print_exc() 110 # Skip bad images 111 logger.warning("Got a problem here: next() failed %s", ex) 112 # Skip bad images 113 try: 114 im.filename = next_filename(im.filename) 115 except Exception, ex: 116 logger.warning("Got another problem here: next_filename(im.filename) %s", ex) 117 if nprocessed % step == 0: 118 yield retVal 119 # Avoid cyclic references with exc_info ? 120 retVal = None 121 if abort: break 122 nprocessed += 1
        123 124 125
        126 -class file_series(list):
        127 """ 128 Represents a series of files to iterate 129 has an idea of a current position to do next and prev 130 131 You also get from the list python superclass: 132 append 133 count 134 extend 135 insert 136 pop 137 remove 138 reverse 139 sort 140 """
        141 - def __init__(self, list_of_strings):
        142 """ 143 Constructor: 144 145 @param list_of_strings: arg should be a list of strings which are filenames 146 147 """ 148 super(file_series, self).__init__(list_of_strings) 149 # track current position in list 150 self._current = 0
        151 152 153 # methods which return a filename 154
        155 - def first(self):
        156 """ 157 First image in series 158 159 """ 160 return self[0]
        161
        162 - def last(self):
        163 """ 164 Last in series 165 166 """ 167 return self[-1]
        168
        169 - def previous(self):
        170 """ 171 Prev in a sequence 172 173 """ 174 self._current -= 1 175 return self[self._current]
        176
        177 - def current(self):
        178 """Current position in a sequence 179 180 """ 181 return self[self._current]
        182
        183 - def next(self):
        184 """ 185 Next in a sequence 186 187 """ 188 self._current += 1 189 return self[self._current]
        190
        191 - def jump(self, num):
        192 """ 193 Goto a position in sequence 194 195 """ 196 assert num < len(self) and num > 0, "num out of range" 197 self._current = num 198 return self[self._current]
        199
        200 - def len(self):
        201 """ 202 Number of files 203 204 """ 205 return len(self)
        206 207 208 # Methods which return a fabioimage 209
        210 - def first_image(self):
        211 """ 212 First image in a sequence 213 214 @return: fabioimage 215 216 """ 217 return openimage(self.first())
        218
        219 - def last_image(self):
        220 """ 221 Last image in a sequence 222 223 @return: fabioimage 224 225 """ 226 return openimage(self.last())
        227
        228 - def next_image(self):
        229 """ 230 Return the next image 231 232 @return: fabioimage 233 234 """ 235 return openimage(self.next())
        236
        237 - def previous_image(self):
        238 """ 239 Return the previous image 240 241 @return: fabioimage 242 243 """ 244 return openimage(self.previous())
        245
        246 - def jump_image(self, num):
        247 """ 248 Jump to and read image 249 250 @return: fabioimage 251 252 """ 253 return openimage(self.jump(num))
        254
        255 - def current_image(self):
        256 """ 257 Current image in sequence 258 259 @return: fabioimage 260 261 """ 262 return openimage(self.current())
        263 264 # methods which return a file_object 265
        266 - def first_object(self):
        267 """ 268 First image in a sequence 269 270 @return: file_object 271 """ 272 return FilenameObject(self.first())
        273
        274 - def last_object(self):
        275 """ 276 Last image in a sequence 277 278 @return: file_object 279 280 """ 281 return FilenameObject(self.last())
        282
        283 - def next_object(self):
        284 """ 285 Return the next image 286 287 @return: file_object 288 289 """ 290 return FilenameObject(self.next())
        291
        292 - def previous_object(self):
        293 """ 294 Return the previous image 295 296 @return: file_object 297 298 """ 299 return FilenameObject(self.previous())
        300
        301 - def jump_object(self, num):
        302 """ 303 Jump to and read image 304 305 @return: file_object 306 307 """ 308 return FilenameObject(self.jump(num))
        309
        310 - def current_object(self):
        311 """ 312 Current image in sequence 313 314 @return: file_object 315 316 """ 317 return FilenameObject(self.current())
        318 319 320 321
        322 -class numbered_file_series(file_series):
        323 """ 324 mydata0001.edf = "mydata" + 0001 + ".edf" 325 mydata0002.edf = "mydata" + 0002 + ".edf" 326 mydata0003.edf = "mydata" + 0003 + ".edf" 327 """
        328 - def __init__(self, stem, first, last, extension, 329 digits=4, padding='Y', step=1):
        330 """ 331 Constructor 332 333 @param stem: first part of the name 334 @param step: in case of every nth file 335 @param padding: possibility for specifying that numbers are not padded with zeroes up to digits 336 337 """ 338 if padding == 'Y': 339 fmt = "%s%0" + str(digits) + "d%s" 340 else: 341 fmt = "%s%i%s" 342 343 super(numbered_file_series, self).__init__( 344 [ fmt % (stem, i, extension) for i in range(first, 345 last + 1, 346 step) ])
        347 348
        349 -class filename_series:
        350 """ Much like the others, but created from a string filename """
        351 - def __init__(self, filename):
        352 """ create from a filename (String)""" 353 self.obj = FilenameObject(filename)
        354
        355 - def next(self):
        356 """ increment number """ 357 self.obj.num += 1 358 return self.obj.tostring()
        359
        360 - def previous(self):
        361 """ decrement number """ 362 self.obj.num -= 1 363 return self.obj.tostring()
        364
        365 - def current(self):
        366 """ return current filename string""" 367 return self.obj.tostring()
        368
        369 - def jump(self, num):
        370 """ jump to a specific number """ 371 self.obj.num = num 372 return self.obj.tostring()
        373 374 # image methods
        375 - def next_image(self):
        376 """ returns the next image as a fabioimage """ 377 return openimage(self.next())
        378 - def prev_image(self):
        379 """ returns the previos image as a fabioimage """ 380 return openimage(self.previous())
        381 - def current_image(self):
        382 """ returns the current image as a fabioimage""" 383 return openimage(self.current())
        384 - def jump_image(self, num):
        385 """ returns the image number as a fabioimage""" 386 return openimage(self.jump(num))
        387 # object methods
        388 - def next_object(self):
        389 """ returns the next filename as a fabio.FilenameObject""" 390 self.obj.num += 1 391 return self.obj
        392 - def previous_object(self):
        393 """ returns the previous filename as a fabio.FilenameObject""" 394 self.obj.num -= 1 395 return self.obj
        396 - def current_object(self):
        397 """ returns the current filename as a fabio.FilenameObject""" 398 return self.obj
        399 - def jump_object(self, num):
        400 """ returns the filename num as a fabio.FilenameObject""" 401 self.obj.num = num 402 return self.obj
        403

        fabio-0.1.3/epydoc/toc-fabio.GEimage-module.html0000644000175000017500000000276712120434325022163 0ustar jeromejerome00000000000000 GEimage

        Module GEimage


        Classes

        GEimage

        Functions

        demo

        Variables

        GE_HEADER_INFO
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/toc-everything.html0000644000175000017500000006271612126623347020521 0ustar jeromejerome00000000000000 Everything

        Everything


        All Classes

        fabio.GEimage.GEimage
        fabio.GEimage_old.GEimage
        fabio.HiPiCimage.HiPiCimage
        fabio.OXDimage.OXDimage
        fabio.OXDimage.Section
        fabio.TiffIO.TiffIO
        fabio.adscimage.adscimage
        fabio.binaryimage.binaryimage
        fabio.bruker100image.bruker100image
        fabio.brukerimage.brukerimage
        fabio.cbfimage.CIF
        fabio.cbfimage.cbfimage
        fabio.datIO.columnfile
        fabio.datIO.fabiodata
        fabio.dm3image.dm3image
        fabio.edfimage.Frame
        fabio.edfimage.edfimage
        fabio.fabioimage.fabioimage
        fabio.fabioutils.BZ2File
        fabio.fabioutils.File
        fabio.fabioutils.FilenameObject
        fabio.fabioutils.GzipFile
        fabio.fabioutils.StringIO
        fabio.fabioutils.UnknownCompressedFile
        fabio.file_series.file_series
        fabio.file_series.filename_series
        fabio.file_series.numbered_file_series
        fabio.fit2dmaskimage.fit2dmaskimage
        fabio.fit2dspreadsheetimage.fit2dspreadsheetimage
        fabio.kcdimage.kcdimage
        fabio.mar345image.mar345image
        fabio.marccdimage.marccdimage
        fabio.pilatusimage.pilatusimage
        fabio.pnmimage.pnmimage
        fabio.tifimage.Image_File_Directory
        fabio.tifimage.Image_File_Directory_entry
        fabio.tifimage.Tiff_header
        fabio.tifimage.tifimage
        fabio.xsdimage.xsdimage
        str

        All Functions

        fabio.GEimage.demo
        fabio.adscimage.test
        fabio.brukerimage.test
        fabio.cf_io.read
        fabio.compression.compByteOffet_numpy
        fabio.compression.compPCK
        fabio.compression.compTY1
        fabio.compression.decByteOffet_cython
        fabio.compression.decByteOffet_numpy
        fabio.compression.decByteOffet_python
        fabio.compression.decByteOffet_weave
        fabio.compression.decBzip2
        fabio.compression.decGzip
        fabio.compression.decPCK
        fabio.compression.decTY1
        fabio.compression.decZlib
        fabio.compression.endianness
        fabio.compression.md5sum
        fabio.converters.convert_data
        fabio.converters.convert_data_integer
        fabio.converters.convert_header
        fabio.fabioimage.test
        fabio.fabioutils.construct_filename
        fabio.fabioutils.deconstruct_filename
        fabio.fabioutils.deprecated
        fabio.fabioutils.extract_filenumber
        fabio.fabioutils.getnum
        fabio.fabioutils.isAscii
        fabio.fabioutils.jump_filename
        fabio.fabioutils.next_filename
        fabio.fabioutils.nice_int
        fabio.fabioutils.numstem
        fabio.fabioutils.previous_filename
        fabio.fabioutils.toAscii
        fabio.file_series.new_file_series
        fabio.file_series.new_file_series0
        fabio.marccdimage.interpret_header
        fabio.marccdimage.make_format
        fabio.openimage.do_magic
        fabio.openimage.openheader
        fabio.openimage.openimage
        fabio.readbytestream.readbytestream

        All Variables

        fabio.GEimage.GE_HEADER_INFO
        fabio.GEimage.__package__
        fabio.GEimage.logger
        fabio.GEimage_old.__package__
        fabio.HiPiCimage.__package__
        fabio.HiPiCimage.logger
        fabio.OXDimage.DEFAULT_HEADERS
        fabio.OXDimage.DETECTOR_TYPES
        fabio.OXDimage.__doc__
        fabio.OXDimage.__package__
        fabio.OXDimage.deg2rad
        fabio.OXDimage.logger
        fabio.OXDimage.rad2deg
        fabio.TiffIO.ALLOW_MULTIPLE_STRIPS
        fabio.TiffIO.DEBUG
        fabio.TiffIO.FIELD_TYPE
        fabio.TiffIO.FIELD_TYPE_OUT
        fabio.TiffIO.SAMPLE_FORMAT_COMPLEXIEEEFP
        fabio.TiffIO.SAMPLE_FORMAT_COMPLEXINT
        fabio.TiffIO.SAMPLE_FORMAT_FLOAT
        fabio.TiffIO.SAMPLE_FORMAT_INT
        fabio.TiffIO.SAMPLE_FORMAT_UINT
        fabio.TiffIO.SAMPLE_FORMAT_VOID
        fabio.TiffIO.TAG_BITS_PER_SAMPLE
        fabio.TiffIO.TAG_COLORMAP
        fabio.TiffIO.TAG_COMPRESSION
        fabio.TiffIO.TAG_DATE
        fabio.TiffIO.TAG_ID
        fabio.TiffIO.TAG_IMAGE_DESCRIPTION
        fabio.TiffIO.TAG_NUMBER_OF_COLUMNS
        fabio.TiffIO.TAG_NUMBER_OF_ROWS
        fabio.TiffIO.TAG_PHOTOMETRIC_INTERPRETATION
        fabio.TiffIO.TAG_ROWS_PER_STRIP
        fabio.TiffIO.TAG_SAMPLE_FORMAT
        fabio.TiffIO.TAG_SOFTWARE
        fabio.TiffIO.TAG_STRIP_BYTE_COUNTS
        fabio.TiffIO.TAG_STRIP_OFFSETS
        fabio.TiffIO.__package__
        fabio.TiffIO.__revision__
        fabio.__package__
        fabio.__status__
        fabio.adscimage.__package__
        fabio.adscimage.logger
        fabio.binaryimage.__doc__
        fabio.binaryimage.__package__
        fabio.binaryimage.logger
        fabio.bruker100image.__package__
        fabio.bruker100image.logger
        fabio.brukerimage.__package__
        fabio.brukerimage.logger
        fabio.byte_offset.__package__
        fabio.byte_offset.__test__
        fabio.cbfimage.DATA_TYPES
        fabio.cbfimage.MINIMUM_KEYS
        fabio.cbfimage.PADDING
        fabio.cbfimage.STARTER
        fabio.cbfimage.__package__
        fabio.cbfimage.logger
        fabio.cf_io.__package__
        fabio.compression.__package__
        fabio.compression.logger
        fabio.converters.CONVERSION_DATA
        fabio.converters.CONVERSION_HEADER
        fabio.converters.__package__
        fabio.converters.logger
        fabio.datIO.__package__
        fabio.dm3image.DATA_BYTES
        fabio.dm3image.DATA_TYPES
        fabio.dm3image.__package__
        fabio.dm3image.logger
        fabio.edfimage.BLOCKSIZE
        fabio.edfimage.DATA_TYPES
        fabio.edfimage.DEFAULT_VALUES
        fabio.edfimage.MINIMUM_KEYS
        fabio.edfimage.NUMPY_EDF_DTYPE
        fabio.edfimage.__package__
        fabio.edfimage.logger
        fabio.fabioimage.__package__
        fabio.fabioimage.logger
        fabio.fabioutils.COMPRESSORS
        fabio.fabioutils.FILETYPES
        fabio.fabioutils.__package__
        fabio.fabioutils.dictAscii
        fabio.fabioutils.i
        fabio.fabioutils.key
        fabio.fabioutils.lines
        fabio.fabioutils.logger
        fabio.file_series.__package__
        fabio.file_series.logger
        fabio.fit2dmaskimage.__package__
        fabio.fit2dspreadsheetimage.__package__
        fabio.kcdimage.DATA_TYPES
        fabio.kcdimage.DEFAULT_VALUES
        fabio.kcdimage.MINIMUM_KEYS
        fabio.kcdimage.__package__
        fabio.kcdimage.logger
        fabio.mar345_IO.__package__
        fabio.mar345_IO.__test__
        fabio.mar345image.__doc__
        fabio.mar345image.__package__
        fabio.mar345image.logger
        fabio.marccdimage.CDEFINITION
        fabio.marccdimage.C_SIZES
        fabio.marccdimage.C_TO_STRUCT
        fabio.marccdimage.HEADER_FORMAT
        fabio.marccdimage.HEADER_NAMES
        fabio.marccdimage.MAXIMAGES
        fabio.marccdimage.__package__
        fabio.marccdimage.logger
        fabio.openimage.MAGIC_NUMBERS
        fabio.openimage.__package__
        fabio.openimage.logger
        fabio.pilatusimage.__package__
        fabio.pnmimage.HEADERITEMS
        fabio.pnmimage.P7HEADERITEMS
        fabio.pnmimage.SUBFORMATS
        fabio.pnmimage.__package__
        fabio.pnmimage.logger
        fabio.readbytestream.DATATYPES
        fabio.readbytestream.__package__
        fabio.readbytestream.logger
        fabio.tifimage.BIG_ENDIAN
        fabio.tifimage.LITTLE_ENDIAN
        fabio.tifimage.PIL_TO_NUMPY
        fabio.tifimage.TYPES
        fabio.tifimage.TYPESIZES
        fabio.tifimage.__package__
        fabio.tifimage.__status__
        fabio.tifimage.baseline_tiff_tags
        fabio.tifimage.logger
        fabio.version
        fabio.xsdimage.__package__
        fabio.xsdimage.logger

        [hide private] fabio-0.1.3/epydoc/toc-fabio.TiffIO-module.html0000644000175000017500000000752712120434325022004 0ustar jeromejerome00000000000000 TiffIO

        Module TiffIO


        Classes

        TiffIO

        Variables

        ALLOW_MULTIPLE_STRIPS
        DEBUG
        FIELD_TYPE
        FIELD_TYPE_OUT
        SAMPLE_FORMAT_COMPLEXIEEEFP
        SAMPLE_FORMAT_COMPLEXINT
        SAMPLE_FORMAT_FLOAT
        SAMPLE_FORMAT_INT
        SAMPLE_FORMAT_UINT
        SAMPLE_FORMAT_VOID
        TAG_BITS_PER_SAMPLE
        TAG_COLORMAP
        TAG_COMPRESSION
        TAG_DATE
        TAG_ID
        TAG_IMAGE_DESCRIPTION
        TAG_NUMBER_OF_COLUMNS
        TAG_NUMBER_OF_ROWS
        TAG_PHOTOMETRIC_INTERPRETATION
        TAG_ROWS_PER_STRIP
        TAG_SAMPLE_FORMAT
        TAG_SOFTWARE
        TAG_STRIP_BYTE_COUNTS
        TAG_STRIP_OFFSETS
        __package__
        __revision__

        [hide private] fabio-0.1.3/epydoc/class-tree.html0000644000175000017500000003243512126623347017607 0ustar jeromejerome00000000000000 Class Hierarchy
         
        [hide private]
        [frames] | no frames]
        [ Module Hierarchy | Class Hierarchy ]

        Class Hierarchy

        fabio-0.1.3/epydoc/toc-fabio.xsdimage-module.html0000644000175000017500000000244112120434325022453 0ustar jeromejerome00000000000000 xsdimage

        Module xsdimage


        Classes

        xsdimage

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/toc-fabio.tifimage-module.html0000644000175000017500000000445412126623347022457 0ustar jeromejerome00000000000000 tifimage

        Module tifimage


        Classes

        Image_File_Directory
        Image_File_Directory_entry
        Tiff_header
        tifimage

        Variables

        BIG_ENDIAN
        LITTLE_ENDIAN
        PIL_TO_NUMPY
        TYPES
        TYPESIZES
        __package__
        __status__
        baseline_tiff_tags
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.fabioutils.GzipFile-class.html0000644000175000017500000004220012126623347023567 0ustar jeromejerome00000000000000 fabio.fabioutils.GzipFile
        Package fabio :: Module fabioutils :: Class GzipFile
        [hide private]
        [frames] | no frames]

        Class GzipFile

        source code

        gzip.GzipFile --+
                        |
                       GzipFile
        

        Just a wrapper forgzip.GzipFile providing the correct seek capabilities for python 2.5

        Instance Methods [hide private]
         
        __init__(self, filename=None, mode=None, compresslevel=9, fileobj=None)
        Wrapper with locking for constructor for the GzipFile class.
        source code
         
        getSize(self) source code
         
        setSize(self, value) source code
         
        seek(self, offset, whence=0)
        Move to new file position.
        source code

        Inherited from gzip.GzipFile: __del__, __iter__, __repr__, close, fileno, flush, isatty, next, read, readline, readlines, rewind, tell, write, writelines

        Inherited from gzip.GzipFile (private): _add_read_data, _init_read, _init_write, _read, _read_eof, _read_gzip_header, _unread, _write_gzip_header

        Class Variables [hide private]

        Inherited from gzip.GzipFile: max_read_chunk, myfileobj

        Properties [hide private]
          size
          closed

        Inherited from gzip.GzipFile: filename

        Method Details [hide private]

        __init__(self, filename=None, mode=None, compresslevel=9, fileobj=None)
        (Constructor)

        source code 

        Wrapper with locking for constructor for the GzipFile class.

        At least one of fileobj and filename must be given a non-trivial value.

        The new class instance is based on fileobj, which can be a regular file, a StringIO object, or any other object which simulates a file. It defaults to None, in which case filename is opened to provide a file object.

        When fileobj is not None, the filename argument is only used to be included in the gzip file header, which may includes the original filename of the uncompressed file. It defaults to the filename of fileobj, if discernible; otherwise, it defaults to the empty string, and in this case the original filename is not included in the header.

        The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', or 'wb', depending on whether the file will be read or written. The default is the mode of fileobj if discernible; otherwise, the default is 'rb'. Be aware that only the 'rb', 'ab', and 'wb' values should be used for cross-platform portability.

        The compresslevel argument is an integer from 1 to 9 controlling the level of compression; 1 is fastest and produces the least compression, and 9 is slowest and produces the most compression. The default is 9.

        Overrides: gzip.GzipFile.__init__

        seek(self, offset, whence=0)

        source code 

        Move to new file position.

        Argument offset is a byte count. Optional argument whence defaults to 0 (offset from start of file, offset should be >= 0); other values are 1 (move relative to current position, positive or negative), and 2 (move relative to end of file, usually negative, although many platforms allow seeking beyond the end of a file). If the file is opened in text mode, only offsets returned by tell() are legal. Use of other offsets causes undefined behavior.

        This is a wrapper for seek to ensure compatibility with old python 2.5

        Overrides: gzip.GzipFile.seek

        Property Details [hide private]

        size

        Get Method:
        getSize(self)
        Set Method:
        setSize(self, value)

        closed

        Get Method:
        unreachable.closed(self)

        fabio-0.1.3/epydoc/fabio.fabioimage.fabioimage-class.html0000644000175000017500000012074112126623347024072 0ustar jeromejerome00000000000000 fabio.fabioimage.fabioimage
        Package fabio :: Module fabioimage :: Class fabioimage
        [hide private]
        [frames] | no frames]

        Class fabioimage

        source code

        object --+
                 |
                fabioimage
        
        Known Subclasses:

        A common object for images in fable Contains a numpy array (.data) and dict of meta data (.header)

        Instance Methods [hide private]
         
        __init__(self, data=None, header=None)
        Set up initial values
        source code
         
        getclassname(self)
        Retrieves the name of the class
        source code
         
        getframe(self, num)
        returns the file numbered 'num' in the series as a fabioimage
        source code
         
        previous(self)
        returns the previous file in the series as a fabioimage
        source code
         
        next(self)
        returns the next file in the series as a fabioimage
        source code
         
        toPIL16(self, filename=None)
        Convert to Python Imaging Library 16 bit greyscale image
        source code
         
        getheader(self)
        returns self.header
        source code
         
        getmax(self)
        Find max value in self.data, caching for the future
        source code
         
        getmin(self)
        Find min value in self.data, caching for the future
        source code
         
        make_slice(self, coords)
        Convert a len(4) set of coords into a len(2) tuple (pair) of slice objects the latter are immutable, meaning the roi can be cached
        source code
         
        integrate_area(self, coords)
        Sums up a region of interest if len(coords) == 4 -> convert coords to slices if len(coords) == 2 -> use as slices floor -> ? removed as unused in the function.
        source code
         
        getmean(self)
        return the mean
        source code
         
        getstddev(self)
        return the standard deviation
        source code
         
        add(self, other)
        Add another Image - warning, does not clip to 16 bit images by default
        source code
         
        resetvals(self)
        Reset cache - call on changing data
        source code
         
        rebin(self, x_rebin_fact, y_rebin_fact, keep_I=True)
        Rebin the data and adjust dims
        source code
         
        write(self, fname)
        To be overwritten - write the file
        source code
         
        save(self, fname)
        wrapper for write
        source code
         
        readheader(self, filename)
        Call the _readheader function...
        source code
         
        _readheader(self, fik_obj)
        Must be overridden in classes
        source code
         
        update_header(self, **kwds)
        update the header entries by default pass in a dict of key, values.
        source code
         
        read(self, filename, frame=None)
        To be overridden - fill in self.header and self.data
        source code
         
        load(self, *arg, **kwarg)
        Wrapper for read
        source code
         
        readROI(self, filename, frame=None, coords=None)
        Method reading Region of Interest.
        source code
         
        _open(self, fname, mode='rb')
        Try to handle compressed files, streams, shared memory etc Return an object which can be used for "read" and "write" ...
        source code
         
        _compressed_stream(self, fname, system_uncompress, python_uncompress, mode='rb')
        Try to transparently handle gzip / bzip without always getting python performance
        source code
         
        convert(self, dest)
        Convert a fabioimage object into another fabioimage object (with possible conversions)
        source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        checkHeader(header=None)
        Empty for fabioimage but may be populated by others classes
         
        checkData(data=None)
        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers
        Class Variables [hide private]
          _need_a_seek_to_read = False
          _need_a_real_file = False
        Properties [hide private]
          classname
        Retrieves the name of the class

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, data=None, header=None)
        (Constructor)

        source code 

        Set up initial values

        Overrides: object.__init__

        getclassname(self)

        source code 

        Retrieves the name of the class

        Returns:
        the name of the class

        toPIL16(self, filename=None)

        source code 

        Convert to Python Imaging Library 16 bit greyscale image

        FIXME - this should be handled by the libraries now

        rebin(self, x_rebin_fact, y_rebin_fact, keep_I=True)

        source code 

        Rebin the data and adjust dims

        Parameters:
        • x_rebin_fact (int) - x binning factor
        • y_rebin_fact (int) - y binning factor
        • keep_I (boolean) - shall the signal increase ?

        readROI(self, filename, frame=None, coords=None)

        source code 

        Method reading Region of Interest. This implementation is the trivial one, just doing read and crop

        _open(self, fname, mode='rb')

        source code 

        Try to handle compressed files, streams, shared memory etc Return an object which can be used for "read" and "write" ... FIXME - what about seek ?

        convert(self, dest)

        source code 

        Convert a fabioimage object into another fabioimage object (with possible conversions)

        Parameters:
        • dest - destination type "EDF", "edfimage" or the class itself

        Property Details [hide private]

        classname

        Retrieves the name of the class

        Get Method:
        getclassname(self) - Retrieves the name of the class

        fabio-0.1.3/epydoc/toc-fabio.compression-module.html0000644000175000017500000000546112120434325023220 0ustar jeromejerome00000000000000 compression

        Module compression


        Classes

        str

        Functions

        compByteOffet_numpy
        compPCK
        compTY1
        decByteOffet_cython
        decByteOffet_numpy
        decByteOffet_python
        decByteOffet_weave
        decBzip2
        decGzip
        decKM4CCD
        decPCK
        decTY1
        decZlib
        endianness
        md5sum

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.compression-module.html0000644000175000017500000007415612126623347022456 0ustar jeromejerome00000000000000 fabio.compression
        Package fabio :: Module compression
        [hide private]
        [frames] | no frames]

        Module compression

        source code

        
        Authors: Jérôme Kieffer, ESRF
                 email:jerome.kieffer@esrf.fr
        
        FabIO library containing compression and decompression algorithm for various
        
        

        Author: J\xc3\xa9r\xc3\xb4me Kieffer

        Contact: jerome.kieffer@esrf.eu

        Copyright: European Synchrotron Radiation Facility, Grenoble, France

        License: GPLv3+

        Classes [hide private]
          str
        str(object) -> string
        Functions [hide private]
         
        md5sum(blob)
        returns the md5sum of an object...
        source code
         
        endianness()
        Return the native endianness of the system
        source code
         
        decGzip(stream)
        Decompress a chunk of data using the gzip algorithm from Python or alternatives if possible
        source code
         
        decBzip2(stream)
        Decompress a chunk of data using the bzip2 algorithm from Python
        source code
         
        decZlib(stream)
        Decompress a chunk of data using the zlib algorithm from Python
        source code
         
        decByteOffet_python(stream, size)
        Analyze a stream of char with any length of exception (2,4, or 8 bytes integers)
        source code
         
        decByteOffet_weave(stream, size)
        Analyze a stream of char with any length of exception (2,4, or 8 bytes integers)
        source code
         
        decByteOffet_numpy(stream, size=None)
        Analyze a stream of char with any length of exception: 2, 4, or 8 bytes integers
        source code
         
        decByteOffet_cython(stream, size=None)
        Analyze a stream of char with any length of exception: 2, 4, or 8 bytes integers
        source code
         
        compByteOffet_numpy(data)
        Compress a dataset into a string using the byte_offet algorithm
        source code
         
        decTY1(raw_8, raw_16=None, raw_32=None)
        Modified byte offset decompressor used in Oxford Diffraction images
        source code
         
        decKM4CCD(raw_8, raw_16=None, raw_32=None)
        Modified byte offset decompressor used in Oxford Diffraction images
        source code
         
        compTY1(data)
        Modified byte offset compressor used in Oxford Diffraction images
        source code
         
        decPCK(stream, dim1=None, dim2=None, overflowPix=None)
        Modified CCP4 pck decompressor used in MAR345 images
        source code
         
        compPCK(data)
        Modified CCP4 pck compressor used in MAR345 images
        source code
        Variables [hide private]
          logger = logging.getLogger("compression")
          __package__ = 'fabio'
        Function Details [hide private]

        decByteOffet_python(stream, size)

        source code 

        Analyze a stream of char with any length of exception (2,4, or 8 bytes integers)

        Parameters:
        • stream - string representing the compressed data
        • size - the size of the output array (of longInts)
        Returns:
        1D-ndarray

        decByteOffet_weave(stream, size)

        source code 

        Analyze a stream of char with any length of exception (2,4, or 8 bytes integers)

        Parameters:
        • stream - string representing the compressed data
        • size - the size of the output array (of longInts)
        Returns:
        1D-ndarray

        decByteOffet_numpy(stream, size=None)

        source code 
        
        Analyze a stream of char with any length of exception:
                    2, 4, or 8 bytes integers
        
        @param stream: string representing the compressed data
        @param size: the size of the output array (of longInts)
        @return: 1D-ndarray
        
        

        decByteOffet_cython(stream, size=None)

        source code 
        
        Analyze a stream of char with any length of exception:
                    2, 4, or 8 bytes integers
        
        @param stream: string representing the compressed data
        @param size: the size of the output array (of longInts)
        @return: 1D-ndarray
        
        

        compByteOffet_numpy(data)

        source code 

        Compress a dataset into a string using the byte_offet algorithm

        Parameters:
        • data - ndarray
        Returns:
        string/bytes with compressed data

        test = numpy.array([0,1,2,127,0,1,2,128,0,1,2,32767,0,1,2,32768,0,1,2,2147483647,0,1,2,2147483648,0,1,2,128,129,130,32767,32768,128,129,130,32768,2147483647,2147483648])

        decTY1(raw_8, raw_16=None, raw_32=None)

        source code 

        Modified byte offset decompressor used in Oxford Diffraction images

        Parameters:
        • raw_8 - strings containing raw data with integer 8 bits
        • raw_16 - strings containing raw data with integer 16 bits
        • raw_32 - strings containing raw data with integer 32 bits
        Returns:
        numpy.ndarray

        decKM4CCD(raw_8, raw_16=None, raw_32=None)

        source code 

        Modified byte offset decompressor used in Oxford Diffraction images

        Parameters:
        • raw_8 - strings containing raw data with integer 8 bits
        • raw_16 - strings containing raw data with integer 16 bits
        • raw_32 - strings containing raw data with integer 32 bits
        Returns:
        numpy.ndarray

        compTY1(data)

        source code 

        Modified byte offset compressor used in Oxford Diffraction images

        Parameters:
        • data - numpy.ndarray with the input data (integers!)
        Returns:
        3-tuple of strings: raw_8,raw_16,raw_32 containing raw data with integer of the given size

        decPCK(stream, dim1=None, dim2=None, overflowPix=None)

        source code 

        Modified CCP4 pck decompressor used in MAR345 images

        Parameters:
        • stream - string or file
        Returns:
        numpy.ndarray (square array)

        compPCK(data)

        source code 

        Modified CCP4 pck compressor used in MAR345 images

        Parameters:
        • data - numpy.ndarray (square array)
        Returns:
        compressed stream

        fabio-0.1.3/epydoc/fabio.readbytestream-module.html0000644000175000017500000004205612126623347023122 0ustar jeromejerome00000000000000 fabio.readbytestream
        Package fabio :: Module readbytestream
        [hide private]
        [frames] | no frames]

        Module readbytestream

        source code

        
        Reads a bytestream
        
        Authors: Jon Wright    Henning O. Sorensen & Erik Knudsen
                 ESRF          Risoe National Laboratory
        
        
        Functions [hide private]
         
        readbytestream(fil, offset, x, y, nbytespp, datatype='int', signed='n', swap='n', typeout=<type 'numpy.uint16'>)
        Reads in a bytestream from a file (which may be a string indicating a filename, or an already opened file (should be "rb")) offset is the position (in bytes) where the pixel data start nbytespp = number of bytes per pixel type can be int or float (4 bytes pp) or double (8 bytes pp) signed: normally signed data 'y', but 'n' to try to get back the right numbers when unsigned data are converted to signed (python once had no unsigned numeric types.) swap, normally do not bother, but 'y' to swap bytes typeout is the numpy type to output, normally uint16, but more if overflows occurred x and y are the pixel dimensions
        source code
        Variables [hide private]
          logger = logging.getLogger("readbytestream")
          DATATYPES = {('double', 'y', 4): <type 'numpy.float64'>, ('flo...
          __package__ = 'fabio'
        Function Details [hide private]

        readbytestream(fil, offset, x, y, nbytespp, datatype='int', signed='n', swap='n', typeout=<type 'numpy.uint16'>)

        source code 

        Reads in a bytestream from a file (which may be a string indicating a filename, or an already opened file (should be "rb")) offset is the position (in bytes) where the pixel data start nbytespp = number of bytes per pixel type can be int or float (4 bytes pp) or double (8 bytes pp) signed: normally signed data 'y', but 'n' to try to get back the right numbers when unsigned data are converted to signed (python once had no unsigned numeric types.) swap, normally do not bother, but 'y' to swap bytes typeout is the numpy type to output, normally uint16, but more if overflows occurred x and y are the pixel dimensions

        TODO : Read in regions of interest

        PLEASE LEAVE THE STRANGE INTERFACE ALONE - IT IS USEFUL FOR THE BRUKER FORMAT


        Variables Details [hide private]

        DATATYPES

        Value:
        {('double', 'y', 4): <type 'numpy.float64'>,
         ('float', 'y', 4): <type 'numpy.float32'>,
         ('int', 'n', 1): <type 'numpy.uint8'>,
         ('int', 'n', 2): <type 'numpy.uint16'>,
         ('int', 'n', 4): <type 'numpy.uint32'>,
         ('int', 'y', 1): <type 'numpy.int8'>,
         ('int', 'y', 2): <type 'numpy.int16'>,
         ('int', 'y', 4): <type 'numpy.int32'>}
        

        fabio-0.1.3/epydoc/fabio.dm3image-module.html0000644000175000017500000002542112126623347021572 0ustar jeromejerome00000000000000 fabio.dm3image
        Package fabio :: Module dm3image
        [hide private]
        [frames] | no frames]

        Module dm3image

        source code

        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:erik.knudsen@risoe.dk
        
                + Jon Wright, ESRF
        
        
        Classes [hide private]
          dm3image
        Read and try to write the dm3 data format
        Variables [hide private]
          logger = logging.getLogger("dm3image")
          DATA_TYPES = {2: <type 'numpy.int16'>, 3: <type 'numpy.int32'>...
          DATA_BYTES = {2: 2, 3: 4, 4: 2, 5: 4, 6: 4, 7: 8, 8: 1, 9: Non...
          __package__ = 'fabio'
        Variables Details [hide private]

        DATA_TYPES

        Value:
        {2: <type 'numpy.int16'>,
         3: <type 'numpy.int32'>,
         4: <type 'numpy.uint16'>,
         5: <type 'numpy.uint32'>,
         6: <type 'numpy.float32'>,
         7: <type 'float'>,
         8: <type 'numpy.int8'>,
         9: None,
        ...
        

        DATA_BYTES

        Value:
        {2: 2,
         3: 4,
         4: 2,
         5: 4,
         6: 4,
         7: 8,
         8: 1,
         9: None,
        ...
        

        fabio-0.1.3/epydoc/fabio.byte_offset-module.html0000644000175000017500000001316512126623347022417 0ustar jeromejerome00000000000000 fabio.byte_offset
        Package fabio :: Module byte_offset
        [hide private]
        [frames] | no frames]

        Module byte_offset

        Authors: Jerome Kieffer, ESRF Email: jerome.kieffer@esrf.eu

        Cif Binary Files images are 2D images written by the Pilatus detector and others. They use a modified (simplified) byte-offset algorithm. This file contains the decompression function from a string to an int64 numpy array.

        This is Cython: convert it to pure C then compile it with gcc $ cython byte_offset.pyx


        Author: J\xc3\xa9r\xc3\xb4me Kieffer

        Contact: jerome.kieffer@esrf.eu

        Copyright: 2010, European Synchrotron Radiation Facility, Grenoble, France

        License: GPLv3+

        Variables [hide private]
          __package__ = 'fabio'
          __test__ = {}
        fabio-0.1.3/epydoc/fabio.fabioutils-pysrc.html0000644000175000017500000053450012126623347022123 0ustar jeromejerome00000000000000 fabio.fabioutils
        Package fabio :: Module fabioutils
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.fabioutils

          1  #!/usr/bin/env python 
          2  #coding: utf8 
          3   
          4  """ 
          5  General purpose utilities functions for fabio 
          6  """ 
          7  from __future__ import with_statement 
          8  import re, os, logging, threading, sys 
          9  import StringIO as stringIO 
         10  logger = logging.getLogger("fabioutils") 
         11  from compression import bz2, gzip 
         12  import traceback 
         13   
         14   
         15   
         16  FILETYPES = { 
         17      # extension NNNimage fabioclass 
         18      # type consistency - always use a list if one case is 
         19      'edf'    : ['edf'], 
         20      'cor'    : ['edf'], 
         21      'pnm'    : ['pnm'], 
         22      'pgm'    : ['pnm'], 
         23      'pbm'    : ['pnm'], 
         24      'tif'    : ['tif'], 
         25      'tiff'   : ['tif'], 
         26      'img'    : ['adsc', 'OXD', 'HiPiC'], 
         27      'mccd'   : ['marccd'], 
         28      'mar2300': ['mar345'], 
         29      'sfrm'   : ['bruker100'], 
         30      'msk'    : ['fit2dmask'], 
         31      'spr'    : ['fit2dspreadsheet'], 
         32      'dm3'    : ['dm3'], 
         33      'kcd'    : ['kcd'], 
         34      'cbf'    : ['cbf'], 
         35      'xml'    : ["xsd"], 
         36      'xsd'    : ["xsd"], 
         37               } 
         38   
         39  # Add bzipped and gzipped 
         40  for key in FILETYPES.keys(): 
         41      FILETYPES[key + ".bz2"] = FILETYPES[key] 
         42      FILETYPES[key + ".gz"] = FILETYPES[key] 
         43   
         44   
         45  # Compressors 
         46   
         47  COMPRESSORS = {} 
         48   
         49   
         50  dictAscii = {None:[chr(i) for i in range(32, 127)], 
         51             } 
         52   
         53  try: 
         54      lines = os.popen("gzip -h 2>&1").read() 
         55      # Looking for "usage" 
         56      if "sage" in lines: 
         57          COMPRESSORS['.gz'] = 'gzip -dc ' 
         58      else: 
         59          COMPRESSORS['.gz'] = None 
         60  except Exception: 
         61      COMPRESSORS['.gz'] = None 
         62   
         63  try: 
         64      lines = os.popen("bzip2 -h 2>&1").read() 
         65      # Looking for "usage"  
         66      if "sage" in lines: 
         67          COMPRESSORS['.bz2'] = 'bzip2 -dc ' 
         68      else: 
         69          COMPRESSORS['.bz2'] = None 
         70  except Exception: 
         71      COMPRESSORS['.bz2'] = None 
        
        72 73 -def deprecated(func):
        74 """ 75 used to deprecate a function/method: prints a lot of warning messages to enforce the modifaction of the code 76 """ 77 def wrapper(*arg, **kw): 78 """ 79 decorator that deprecates the use of a function 80 """ 81 logger.warning("%s is Deprecated !!! %s" % (func.func_name, os.linesep.join([""] + traceback.format_stack()[:-1]))) 82 return func(*arg, **kw)
        83 return wrapper 84
        85 86 -def getnum(name):
        87 """ 88 # try to figure out a file number 89 # guess it starts at the back 90 """ 91 stem , num, post_num = numstem(name) 92 try: 93 return int(num) 94 except ValueError: 95 return None
        96
        97 -class FilenameObject(object):
        98 """ 99 The 'meaning' of a filename ... 100 """
        101 - def __init__(self, stem=None, 102 num=None, 103 directory=None, 104 format=None, 105 extension=None, 106 postnum=None, 107 digits=4, 108 filename = None):
        109 """ 110 This class can either be instanciated by a set of parameters like directory, prefix, num, extension, ... 111 112 @param stem: the stem is a kind of prefix (str) 113 @param num: image number in the serie (int) 114 @param directory: name of the directory (str) 115 @param format: ?? 116 @param extension: 117 @param postnum: 118 @param digits: Number of digits used to print num 119 120 Alternative constructor: 121 122 @param filename: fullpath of an image file to be deconstructed into directory, prefix, num, extension, ... 123 124 """ 125 126 127 self.stem = stem 128 self.num = num 129 self.format = format 130 self.extension = extension 131 self.digits = digits 132 self.postnum = postnum 133 self.directory = directory 134 self.compressed = None 135 if filename is not None: 136 self.deconstruct_filename(filename)
        137 138
        139 - def str(self):
        140 """ Return a string representation """ 141 fmt = "stem %s, num %s format %s extension %s " + \ 142 "postnum = %s digits %s dir %s" 143 return fmt % tuple([str(x) for x in [ 144 self.stem , 145 self.num , 146 self.format , 147 self.extension , 148 self.postnum , 149 self.digits , 150 self.directory ] ])
        151 __repr__ = str 152
        153 - def tostring(self):
        154 """ 155 convert yourself to a string 156 """ 157 name = self.stem 158 if self.digits is not None and self.num is not None: 159 fmt = "%0" + str(self.digits) + "d" 160 name += fmt % self.num 161 if self.postnum is not None: 162 name += self.postnum 163 if self.extension is not None: 164 name += self.extension 165 if self.directory is not None: 166 name = os.path.join(self.directory, name) 167 return name
        168 169
        170 - def deconstruct_filename(self, filename):
        171 """ 172 Break up a filename to get image type and number 173 """ 174 direc, name = os.path.split(filename) 175 direc = direc or None 176 parts = name.split(".") 177 compressed = False 178 stem = parts[0] 179 extn = "" 180 postnum = "" 181 ndigit = 4 182 num = None 183 typ = None 184 if parts[-1] in ["gz", "bz2"]: 185 extn = "." + parts[-1] 186 parts = parts[:-1] 187 compressed = True 188 if parts[-1] in FILETYPES.keys(): 189 typ = FILETYPES[parts[-1]] 190 extn = "." + parts[-1] + extn 191 try: 192 stem, numstring, postnum = numstem(".".join(parts[:-1])) 193 num = int(numstring) 194 ndigit = len(numstring) 195 except Exception, err: 196 # There is no number - hence make num be None, not 0 197 logger.debug("l176: %s" % err) 198 num = None 199 stem = "".join(parts[:-1]) 200 else: 201 # Probably two type left 202 if len(parts) == 1: 203 # Probably GE format stem_numb 204 parts2 = parts[0].split("_") 205 if parts2[-1].isdigit(): 206 num = int(parts2[-1]) 207 ndigit = len(parts2[-1]) 208 typ = ['GE'] 209 stem = "_".join(parts2[:-1]) + "_" 210 else: 211 try: 212 num = int(parts[-1]) 213 ndigit = len(parts[-1]) 214 typ = ['bruker'] 215 stem = ".".join(parts[:-1]) + "." 216 except Exception, err: 217 logger.debug("l196: %s" % err) 218 typ = None 219 extn = "." + parts[-1] + extn 220 numstring = "" 221 try: 222 stem , numstring, postnum = numstem(".".join(parts[:-1])) 223 except Exception, err: 224 logger.debug("l202: %s" % err) 225 raise 226 if numstring.isdigit(): 227 num = int(numstring) 228 ndigit = len(numstring) 229 # raise Exception("Cannot decode "+filename) 230 231 self.stem = stem 232 self.num = num 233 self.directory = direc 234 self.format = typ 235 self.extension = extn 236 self.postnum = postnum 237 self.digits = ndigit 238 self.compressed = compressed
        239
        240 -def numstem(name):
        241 """ cant see how to do without reversing strings 242 Match 1 or more digits going backwards from the end of the string 243 """ 244 reg = re.compile(r"^(.*?)(-?[0-9]{0,9})(\D*)$") 245 #reg = re.compile("""(\D*)(\d\d*)(\w*)""") 246 try: 247 res = reg.match(name).groups() 248 #res = reg.match(name[::-1]).groups() 249 #return [ r[::-1] for r in res[::-1]] 250 if len(res[0]) == len(res[1]) == 0: # Hack for file without number 251 return [res[2], '', ''] 252 return [ r for r in res] 253 except AttributeError: # no digits found 254 return [name, "", ""]
        255
        256 @deprecated 257 -def deconstruct_filename(filename):
        258 """ 259 Function for backward compatibility. 260 Deprecated 261 """ 262 return FilenameObject(filename=filename)
        263
        264 -def construct_filename(filename, frame=None):
        265 "Try to construct the filename for a given frame" 266 fobj = FilenameObject(filename=filename) 267 if frame is not None: 268 fobj.num = frame 269 return fobj.tostring()
        270
        271 -def next_filename(name, padding=True):
        272 """ increment number """ 273 fobj = FilenameObject(filename=name) 274 fobj.num += 1 275 if not padding: 276 fobj.digits = 0 277 return fobj.tostring()
        278
        279 -def previous_filename(name, padding=True):
        280 """ decrement number """ 281 fobj = FilenameObject(filename=name) 282 fobj.num -= 1 283 if not padding: 284 fobj.digits = 0 285 return fobj.tostring()
        286
        287 -def jump_filename(name, num, padding=True):
        288 """ jump to number """ 289 fobj = FilenameObject(filename=name) 290 fobj.num = num 291 if not padding: 292 fobj.digits = 0 293 return fobj.tostring()
        294
        295 296 -def extract_filenumber(name):
        297 """ extract file number """ 298 fobj = FilenameObject(filename=name) 299 return fobj.num
        300
        301 -def isAscii(name, listExcluded=None):
        302 """ 303 @param name: string to check 304 @param listExcluded: list of char or string excluded. 305 @return: True of False whether name is pure ascii or not 306 """ 307 isascii = None 308 try: 309 name.decode("ascii") 310 except UnicodeDecodeError: 311 isascii = False 312 else: 313 if listExcluded: 314 isascii = not(any(bad in name for bad in listExcluded)) 315 else: 316 isascii = True 317 return isascii
        318
        319 -def toAscii(name, excluded=None):
        320 """ 321 @param name: string to check 322 @param excluded: tuple of char or string excluded (not list: they are mutable). 323 @return: the name with all non valid char removed 324 """ 325 if excluded not in dictAscii: 326 ascii = dictAscii[None][:] 327 for i in excluded: 328 if i in ascii: 329 ascii.remove(i) 330 else: 331 logger.error("toAscii: % not in ascii table" % i) 332 dictAscii[excluded] = ascii 333 else: 334 ascii = dictAscii[excluded] 335 out = [i for i in str(name) if i in ascii] 336 return "".join(out)
        337
        338 -def nice_int(s):
        339 """ 340 Workaround that int('1.0') raises an exception 341 342 @param s: string to be converted to integer 343 """ 344 try: 345 return int(s) 346 except ValueError: 347 return int(float(s))
        348
        349 350 -class StringIO(stringIO.StringIO):
        351 """ 352 just an interface providing the name and mode property to a StringIO 353 354 BugFix for MacOSX mainly 355 """
        356 - def __init__(self, data, fname=None, mode="r"):
        357 stringIO.StringIO.__init__(self, data) 358 self.closed = False 359 if fname == None: 360 self.name = "fabioStream" 361 else: 362 self.name = fname 363 self.mode = mode 364 self.lock = threading.Semaphore() 365 self.__size = None
        366
        367 - def getSize(self):
        368 if self.__size is None: 369 logger.debug("Measuring size of %s" % self.name) 370 with self.lock: 371 pos = self.tell() 372 self.seek(0, os.SEEK_END) 373 self.__size = self.tell() 374 self.seek(pos) 375 return self.__size
        376 - def setSize(self, size):
        377 self.__size = size
        378 size = property(getSize, setSize)
        379
        380 -class File(file):
        381 """ 382 wrapper for "file" with locking 383 """
        384 - def __init__(self, name, mode="rb", buffering=0):
        385 """file(name[, mode[, buffering]]) -> file object 386 387 Open a file. The mode can be 'r', 'w' or 'a' for reading (default), 388 writing or appending. The file will be created if it doesn't exist 389 when opened for writing or appending; it will be truncated when 390 opened for writing. Add a 'b' to the mode for binary files. 391 Add a '+' to the mode to allow simultaneous reading and writing. 392 If the buffering argument is given, 0 means unbuffered, 1 means line 393 buffered, and larger numbers specify the buffer size. The preferred way 394 to open a file is with the builtin open() function. 395 Add a 'U' to mode to open the file for input with universal newline 396 support. Any line ending in the input file will be seen as a '\n' 397 in Python. Also, a file so opened gains the attribute 'newlines'; 398 the value for this attribute is one of None (no newline read yet), 399 '\r', '\n', '\r\n' or a tuple containing all the newline types seen. 400 401 'U' cannot be combined with 'w' or '+' mode. 402 """ 403 file.__init__(self, name, mode, buffering) 404 self.lock = threading.Semaphore() 405 self.__size = None
        406 - def getSize(self):
        407 if self.__size is None: 408 logger.debug("Measuring size of %s" % self.name) 409 with self.lock: 410 pos = self.tell() 411 self.seek(0, os.SEEK_END) 412 self.__size = self.tell() 413 self.seek(pos) 414 return self.__size
        415 - def setSize(self, size):
        416 self.__size = size
        417 size = property(getSize, setSize)
        418
        419 -class UnknownCompressedFile(File):
        420 """ 421 wrapper for "File" with locking 422 """
        423 - def __init__(self, name, mode="rb", buffering=0):
        424 logger.warning("No decompressor found for this type of file (are gzip anf bz2 installed ???") 425 File.__init__(self, name, mode, buffering)
        426 427 if gzip is None: 428 GzipFile = UnknownCompressedFile 429 else:
        430 - class GzipFile(gzip.GzipFile):
        431 """ 432 Just a wrapper forgzip.GzipFile providing the correct seek capabilities for python 2.5 433 """
        434 - def __init__(self, filename=None, mode=None, compresslevel=9, fileobj=None):
        435 """ 436 Wrapper with locking for constructor for the GzipFile class. 437 438 At least one of fileobj and filename must be given a 439 non-trivial value. 440 441 The new class instance is based on fileobj, which can be a regular 442 file, a StringIO object, or any other object which simulates a file. 443 It defaults to None, in which case filename is opened to provide 444 a file object. 445 446 When fileobj is not None, the filename argument is only used to be 447 included in the gzip file header, which may includes the original 448 filename of the uncompressed file. It defaults to the filename of 449 fileobj, if discernible; otherwise, it defaults to the empty string, 450 and in this case the original filename is not included in the header. 451 452 The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', or 'wb', 453 depending on whether the file will be read or written. The default 454 is the mode of fileobj if discernible; otherwise, the default is 'rb'. 455 Be aware that only the 'rb', 'ab', and 'wb' values should be used 456 for cross-platform portability. 457 458 The compresslevel argument is an integer from 1 to 9 controlling the 459 level of compression; 1 is fastest and produces the least compression, 460 and 9 is slowest and produces the most compression. The default is 9. 461 """ 462 gzip.GzipFile.__init__(self, filename, mode, compresslevel, fileobj) 463 self.lock = threading.Semaphore() 464 self.__size = None
        465 466 467 if sys.version_info < (2, 7):
        468 - def getSize(self):
        469 if self.__size is None: 470 logger.debug("Measuring size of %s" % self.name) 471 with open(self.filename, "rb") as f: 472 f.seek(-4) 473 self.__size = numpy.fromstring(f.read(4), dtype=numpy.uint32) 474 return self.__size
        475 - def setSize(self, value):
        476 self.__size = value
        477 size = property(getSize, setSize) 478 @property
        479 - def closed(self):
        480 return self.fileobj is None
        481
        482 - def seek(self, offset, whence=os.SEEK_SET):
        483 """ 484 Move to new file position. 485 486 Argument offset is a byte count. Optional argument whence defaults to 487 0 (offset from start of file, offset should be >= 0); other values are 1 488 (move relative to current position, positive or negative), and 2 (move 489 relative to end of file, usually negative, although many platforms allow 490 seeking beyond the end of a file). If the file is opened in text mode, 491 only offsets returned by tell() are legal. Use of other offsets causes 492 undefined behavior. 493 494 This is a wrapper for seek to ensure compatibility with old python 2.5 495 """ 496 if whence == os.SEEK_SET: 497 gzip.GzipFile.seek(self, offset) 498 elif whence == os.SEEK_CUR: 499 gzip.GzipFile.seek(self, offset + self.tell()) 500 elif whence == os.SEEK_END: 501 gzip.GzipFile.seek(self, -1) 502 gzip.GzipFile.seek(self, offset + self.tell())
        503 504 if bz2 is None: 505 BZ2File = UnknownCompressedFile 506 else:
        507 - class BZ2File(bz2.BZ2File):
        508 "Wrapper with lock"
        509 - def __init__(self, name , mode='r', buffering=0, compresslevel=9):
        510 """ 511 BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object 512 513 Open a bz2 file. The mode can be 'r' or 'w', for reading (default) or 514 writing. When opened for writing, the file will be created if it doesn't 515 exist, and truncated otherwise. If the buffering argument is given, 0 means 516 unbuffered, and larger numbers specify the buffer size. If compresslevel 517 is given, must be a number between 1 and 9. 518 519 Add a 'U' to mode to open the file for input with universal newline 520 support. Any line ending in the input file will be seen as a '\n' in 521 Python. Also, a file so opened gains the attribute 'newlines'; the value 522 for this attribute is one of None (no newline read yet), '\r', '\n', 523 '\r\n' or a tuple containing all the newline types seen. Universal 524 newlines are available only when reading. 525 """ 526 bz2.BZ2File.__init__(self, name , mode, buffering, compresslevel) 527 self.lock = threading.Semaphore() 528 self.__size = None
        529 - def getSize(self):
        530 if self.__size is None: 531 logger.debug("Measuring size of %s" % self.name) 532 with self.lock: 533 pos = self.tell() 534 all = self.read() 535 self.__size = self.tell() 536 self.seek(pos) 537 return self.__size
        538 - def setSize(self, value):
        539 self.__size = value
        540 size = property(getSize, setSize)
        541

        fabio-0.1.3/epydoc/fabio.edfimage.edfimage-class.html0000644000175000017500000021537112126623347023232 0ustar jeromejerome00000000000000 fabio.edfimage.edfimage
        Package fabio :: Module edfimage :: Class edfimage
        [hide private]
        [frames] | no frames]

        Class edfimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               edfimage
        

        Read and try to write the ESRF edf data format

        Instance Methods [hide private]
         
        __init__(self, data=None, header=None, header_keys=None, frames=None)
        Set up initial values
        source code
         
        _readheader(self, infile)
        Read all headers in a file and populate self.header data is not yet populated
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code
         
        swap_needed(self)
        Decide if we need to byteswap
        source code
         
        unpack(self)
        Unpack a binary blob according to the specification given in the header and return the dataset
        source code
         
        getframe(self, num)
        returns the file numbered 'num' in the series as a fabioimage
        source code
         
        previous(self)
        returns the previous file in the series as a fabioimage
        source code
         
        next(self)
        returns the next file in the series as a fabioimage
        source code
         
        write(self, fname, force_type=None, fit2dMode=False)
        Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats)
        source code
         
        appendFrame(self, frame=None, data=None, header=None)
        Method used add a frame to an EDF file
        source code
         
        deleteFrame(self, frameNb=None)
        Method used to remove a frame from an EDF image.
        source code
         
        fastReadData(self, filename=None)
        This is a special method that will read and return the data from another file ...
        source code
        numpy 2darray
        fastReadROI(self, filename, coords=None)
        Method reading Region of Interest of another file based on metadata available in current edfimage.
        source code
         
        getNbFrames(self)
        Getter for number of frames
        source code
         
        setNbFrames(self, val)
        Setter for number of frames ...
        source code
         
        getHeader(self)
        Getter for the headers.
        source code
         
        setHeader(self, _dictHeader)
        Enforces the propagation of the header to the list of frames
        source code
         
        delHeader(self)
        Deleter for edf header
        source code
         
        getHeaderKeys(self)
        Getter for edf header_keys
        source code
         
        setHeaderKeys(self, _listtHeader)
        Enforces the propagation of the header_keys to the list of frames
        source code
         
        delHeaderKeys(self)
        Deleter for edf header_keys
        source code
        numpy.ndarray
        getData(self)
        getter for edf Data
        source code
         
        setData(self, _data)
        Enforces the propagation of the data to the list of frames
        source code
         
        delData(self)
        deleter for edf Data
        source code
        dict
        getCapsHeader(self)
        getter for edf headers keys in upper case
        source code
         
        setCapsHeader(self, _data)
        Enforces the propagation of the header_keys to the list of frames
        source code
         
        delCapsHeader(self)
        deleter for edf capsHeader
        source code
         
        getDim1(self) source code
         
        setDim1(self, _iVal) source code
         
        getDim2(self) source code
         
        setDim2(self, _iVal) source code
         
        getDims(self) source code
         
        getByteCode(self) source code
         
        setByteCode(self, _iVal) source code
         
        getBpp(self) source code
         
        setBpp(self, _iVal) source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        checkHeader(header=None)
        Empty for fabioimage but may be populated by others classes
        source code
         
        _readHeaderBlock(infile)
        Read in a header in some EDF format from an already open file
        source code

        Inherited from fabioimage.fabioimage: checkData

        Class Variables [hide private]
        Properties [hide private]
          nframes
        Getter for number of frames
          header
        property: header of EDF file
          header_keys
        property: header_keys of EDF file
          data
        property: data of EDF file
          capsHeader
        property: capsHeader of EDF file, i.e.
          dim1
          dim2
          dims
          bytecode
          bpp

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, data=None, header=None, header_keys=None, frames=None)
        (Constructor)

        source code 

        Set up initial values

        Overrides: object.__init__
        (inherited documentation)

        checkHeader(header=None)
        Static Method

        source code 

        Empty for fabioimage but may be populated by others classes

        Overrides: fabioimage.fabioimage.checkHeader

        _readHeaderBlock(infile)
        Static Method

        source code 

        Read in a header in some EDF format from an already open file

        Parameters:
        • infile - file object open in read mode
        Returns:
        string (or None if no header was found.

        _readheader(self, infile)

        source code 

        Read all headers in a file and populate self.header data is not yet populated

        Parameters:
        • infile (file object open in read mode)
        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        unpack(self)

        source code 

        Unpack a binary blob according to the specification given in the header and return the dataset

        Returns:
        dataset as numpy.ndarray

        getframe(self, num)

        source code 

        returns the file numbered 'num' in the series as a fabioimage

        Overrides: fabioimage.fabioimage.getframe

        previous(self)

        source code 

        returns the previous file in the series as a fabioimage

        Overrides: fabioimage.fabioimage.previous

        next(self)

        source code 

        returns the next file in the series as a fabioimage

        Overrides: fabioimage.fabioimage.next

        write(self, fname, force_type=None, fit2dMode=False)

        source code 

        Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats)

        Parameters:
        • force_type - can be numpy.uint16 or simply "float"
        Returns:
        None
        Overrides: fabioimage.fabioimage.write

        appendFrame(self, frame=None, data=None, header=None)

        source code 

        Method used add a frame to an EDF file

        Parameters:
        • frame (instance of Frame) - frame to append to edf image
        Returns:
        None

        deleteFrame(self, frameNb=None)

        source code 

        Method used to remove a frame from an EDF image. by default the last one is removed.

        Parameters:
        • frameNb (integer) - frame number to remove, by default the last.
        Returns:
        None

        fastReadData(self, filename=None)

        source code 

        This is a special method that will read and return the data from another file ... The aim is performances, ... but only supports uncompressed files.

        Returns:
        data from another file using positions from current edfimage

        fastReadROI(self, filename, coords=None)

        source code 

        Method reading Region of Interest of another file based on metadata available in current edfimage. The aim is performances, ... but only supports uncompressed files.

        Returns: numpy 2darray
        ROI-data from another file using positions from current edfimage

        setNbFrames(self, val)

        source code 

        Setter for number of frames ... should do nothing. Here just to avoid bugs

        getHeader(self)

        source code 

        Getter for the headers. used by the property header,

        setHeaderKeys(self, _listtHeader)

        source code 

        Enforces the propagation of the header_keys to the list of frames

        Parameters:
        • _listtHeader (python list) - list of the (ordered) keys in the header

        getData(self)

        source code 

        getter for edf Data

        Returns: numpy.ndarray
        data for current frame

        setData(self, _data)

        source code 

        Enforces the propagation of the data to the list of frames

        Parameters:
        • _data - numpy array representing data

        getCapsHeader(self)

        source code 

        getter for edf headers keys in upper case

        Returns: dict
        data for current frame

        setCapsHeader(self, _data)

        source code 

        Enforces the propagation of the header_keys to the list of frames

        Parameters:
        • _data - numpy array representing data

        Property Details [hide private]

        nframes

        Getter for number of frames

        Get Method:
        getNbFrames(self) - Getter for number of frames
        Set Method:
        setNbFrames(self, val) - Setter for number of frames ...
        Delete Method:
        'property: number of frames in EDF file'
        

        header

        property: header of EDF file

        Get Method:
        getHeader(self) - Getter for the headers.
        Set Method:
        setHeader(self, _dictHeader) - Enforces the propagation of the header to the list of frames
        Delete Method:
        delHeader(self) - Deleter for edf header

        header_keys

        property: header_keys of EDF file

        Get Method:
        getHeaderKeys(self) - Getter for edf header_keys
        Set Method:
        setHeaderKeys(self, _listtHeader) - Enforces the propagation of the header_keys to the list of frames
        Delete Method:
        delHeaderKeys(self) - Deleter for edf header_keys

        data

        property: data of EDF file

        Get Method:
        getData(self) - getter for edf Data
        Set Method:
        setData(self, _data) - Enforces the propagation of the data to the list of frames
        Delete Method:
        delData(self) - deleter for edf Data

        capsHeader

        property: capsHeader of EDF file, i.e. the keys of the header in UPPER case.

        Get Method:
        getCapsHeader(self) - getter for edf headers keys in upper case
        Set Method:
        setCapsHeader(self, _data) - Enforces the propagation of the header_keys to the list of frames
        Delete Method:
        delCapsHeader(self) - deleter for edf capsHeader

        dim1

        Get Method:
        getDim1(self)
        Set Method:
        setDim1(self, _iVal)

        dim2

        Get Method:
        getDim2(self)
        Set Method:
        setDim2(self, _iVal)

        dims

        Get Method:
        getDims(self)

        bytecode

        Get Method:
        getByteCode(self)
        Set Method:
        setByteCode(self, _iVal)

        bpp

        Get Method:
        getBpp(self)
        Set Method:
        setBpp(self, _iVal)

        fabio-0.1.3/epydoc/toc-fabio.cbfimage-module.html0000644000175000017500000000335712120434325022416 0ustar jeromejerome00000000000000 cbfimage

        Module cbfimage


        Classes

        CIF
        cbfimage

        Variables

        DATA_TYPES
        MINIMUM_KEYS
        PADDING
        STARTER
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.openimage-pysrc.html0000644000175000017500000020336412126623347021727 0ustar jeromejerome00000000000000 fabio.openimage
        Package fabio :: Module openimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.openimage

          1  """ 
          2   
          3  Authors: Henning O. Sorensen & Erik Knudsen 
          4           Center for Fundamental Research: Metal Structures in Four Dimensions 
          5           Risoe National Laboratory 
          6           Frederiksborgvej 399 
          7           DK-4000 Roskilde 
          8           email:henning.sorensen@risoe.dk 
          9   
         10  mods for fabio by JPW 
         11   
         12  """ 
         13  import sys, logging 
         14  logger = logging.getLogger("openimage") 
         15  from fabioutils  import FilenameObject 
         16  from fabioimage import fabioimage 
         17  import edfimage 
         18  import adscimage 
         19  import tifimage 
         20  import marccdimage 
         21  import mar345image 
         22  import fit2dmaskimage 
         23  import brukerimage 
         24  import bruker100image 
         25  import pnmimage 
         26  import GEimage 
         27  import OXDimage 
         28  import dm3image 
         29  import HiPiCimage 
         30  import pilatusimage 
         31  import fit2dspreadsheetimage 
         32  import kcdimage 
         33  import cbfimage 
         34  import xsdimage 
         35  import binaryimage 
         36   
         37  MAGIC_NUMBERS = [ 
         38      # "\42\5a" : 'bzipped' 
         39      # "\1f\8b" : 'gzipped' 
         40      ("FORMAT :        86" , 'bruker'), 
         41      ("\x4d\x4d\x00\x2a"   , 'tif') , 
         42      # The marCCD and Pilatus formats are both standard tif with a header 
         43      # hopefully these byte patterns are unique for the formats 
         44      # If not the image will be read, but the is missing  
         45      ("\x49\x49\x2a\x00\x08\x00"   , 'marccd') , 
         46      ("\x49\x49\x2a\x00\x82\x00"   , 'pilatus') , 
         47      ("\x49\x49\x2a\x00"   , 'tif') , 
         48      # ADSC must come before edf 
         49      ("{\nHEA"             , 'adsc'), 
         50      ("{"                  , 'edf'), 
         51      ("\r{"                , 'edf'), 
         52      ("\n{"                , 'edf'), 
         53      ("ADEPT"              , 'GE'), 
         54      ("OD"                 , 'OXD'), 
         55      ("IM"                 , 'HiPiC'), 
         56      ('\x2d\x04'           , 'mar345'), 
         57      ('\xd2\x04'           , 'mar345'), 
         58      ('\x04\x2d'           , 'mar345'), #some machines may need byteswapping 
         59      ('\x04\xd2'           , 'mar345'), 
         60      # hint : MASK in 32 bit 
         61      ('M\x00\x00\x00A\x00\x00\x00S\x00\x00\x00K\x00\x00\x00' , 'fit2dmask') , 
         62      ('\x00\x00\x00\x03'   , 'dm3'), 
         63      ("No"                 , "kcd"), 
         64      ("<"                  , "xsd") 
         65      ] 
         66   
        
        67 -def do_magic(byts):
        68 """ Try to interpret the bytes starting the file as a magic number """ 69 for magic, format_type in MAGIC_NUMBERS: 70 if byts.find(magic) == 0: 71 return format_type 72 if 0: # debugging - bruker needed 18 bytes below 73 logger.debug("m: %s f: %s", magic, format_type) 74 logger.debug("bytes: %s len(bytes) %s", magic, len(magic)) 75 logger.debug("found: %s", byts.find(magic)) 76 for i in range(len(magic)): 77 logger.debug("%s %s %s %s ", ord(magic[i]), ord(byts[i]), magic[i], byts[i]) 78 raise Exception("Could not interpret magic string")
        79 80
        81 -def openimage(filename, frame=None):
        82 """ Try to open an image """ 83 if isinstance(filename, FilenameObject): 84 try: 85 logger.debug("Attempting to open %s" % (filename.tostring())) 86 obj = _openimage(filename.tostring()) 87 logger.debug("Attempting to read frame %s from %s" % (frame, 88 filename.tostring())) 89 obj = obj.read(filename.tostring(), frame) 90 except Exception, ex: 91 # multiframe file 92 #logger.debug( "DEBUG: multiframe file, start # %d"%( 93 # filename.num) 94 logger.debug("Exception %s, trying name %s" % (ex, filename.stem)) 95 obj = _openimage(filename.stem) 96 logger.debug("Reading frame %s from %s" % (filename.num, filename.stem)) 97 obj.read(filename.stem, frame=filename.num) 98 else: 99 logger.debug("Attempting to open %s" % (filename)) 100 obj = _openimage(filename) 101 logger.debug("Attempting to read frame %s from %s" % (frame, filename)) 102 obj = obj.read(filename, frame) 103 return obj
        104 105
        106 -def openheader(filename):
        107 """ return only the header""" 108 obj = _openimage(filename) 109 obj.readheader(filename) 110 return obj
        111 112
        113 -def _openimage(filename):
        114 """ 115 determine which format for a filename 116 and return appropriate class which can be used for opening the image 117 """ 118 try: 119 imo = fabioimage() 120 byts = imo._open(filename).read(18) 121 filetype = do_magic(byts) 122 if filetype == "marccd" and filename.find("mccd") == -1: 123 # Cannot see a way around this. Need to find something 124 # to distinguish mccd from regular tif... 125 filetype = "tif" 126 except IOError, error: 127 logger.error("%s: File probably does not exist", error) 128 raise error 129 except: 130 try: 131 file_obj = FilenameObject(filename=filename) 132 if file_obj == None: 133 raise Exception("Unable to deconstruct filename") 134 if (file_obj.format is not None) and\ 135 len(file_obj.format) != 1 and \ 136 type(file_obj.format) != type(["list"]): 137 # one of OXD/ ADSC - should have got in previous 138 raise Exception("openimage failed on magic bytes & name guess") 139 filetype = file_obj.format 140 #UNUSED filenumber = file_obj.num 141 except Exception, error: 142 logger.error(error) 143 import traceback 144 traceback.print_exc() 145 raise Exception("Fabio could not identify " + filename) 146 klass_name = "".join(filetype) + 'image' 147 module = sys.modules.get("fabio." + klass_name, None) 148 if module is not None: 149 if hasattr(module, klass_name): 150 klass = getattr(module, klass_name) 151 else: 152 raise Exception("Module %s has no image class" % module) 153 else: 154 raise Exception("Filetype not known %s %s" % (filename, klass_name)) 155 obj = klass() 156 # skip the read for read header 157 return obj
        158

        fabio-0.1.3/epydoc/fabio.marccdimage.marccdimage-class.html0000644000175000017500000003721612126623347024420 0ustar jeromejerome00000000000000 fabio.marccdimage.marccdimage
        Package fabio :: Module marccdimage :: Class marccdimage
        [hide private]
        [frames] | no frames]

        Class marccdimage

        source code

                   object --+        
                            |        
        fabioimage.fabioimage --+    
                                |    
                tifimage.tifimage --+
                                    |
                                   marccdimage
        

        Read in data in mar ccd format, also MarMosaic images, including header info

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Parser based approach Gets all entries
        source code
         
        _read(self, fname)
        inherited from tifimage ...
        source code

        Inherited from tifimage.tifimage: __init__, read, write

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]

        Inherited from tifimage.tifimage (private): _need_a_seek_to_read

        Inherited from fabioimage.fabioimage (private): _need_a_real_file

        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Parser based approach Gets all entries

        Overrides: fabioimage.fabioimage._readheader

        _read(self, fname)

        source code 

        inherited from tifimage ... a marccd image *is a* tif image just with a header


        fabio-0.1.3/epydoc/fabio.mytest-module.html0000644000175000017500000000701212120434325021413 0ustar jeromejerome00000000000000 fabio.mytest
        Package fabio :: Module mytest
        [hide private]
        [frames] | no frames]

        Module mytest

        source code

        fabio-0.1.3/epydoc/fabio.pilatusimage.pilatusimage-class.html0000644000175000017500000003723012126623347025074 0ustar jeromejerome00000000000000 fabio.pilatusimage.pilatusimage
        Package fabio :: Module pilatusimage :: Class pilatusimage
        [hide private]
        [frames] | no frames]

        Class pilatusimage

        source code

                   object --+        
                            |        
        fabioimage.fabioimage --+    
                                |    
                tifimage.tifimage --+
                                    |
                                   pilatusimage
        

        Read in Pilatus format, also pilatus images, including header info

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Parser based approach Gets all entries
        source code
         
        _read(self, fname)
        inherited from tifimage ...
        source code

        Inherited from tifimage.tifimage: __init__, read, write

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]

        Inherited from tifimage.tifimage (private): _need_a_seek_to_read

        Inherited from fabioimage.fabioimage (private): _need_a_real_file

        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Parser based approach Gets all entries

        Overrides: fabioimage.fabioimage._readheader

        _read(self, fname)

        source code 

        inherited from tifimage ... a Pilatus image *is a* tif image just with a header


        fabio-0.1.3/epydoc/toc-fabio.marccdimage-module.html0000644000175000017500000000421312120434325023105 0ustar jeromejerome00000000000000 marccdimage

        Module marccdimage


        Classes

        marccdimage

        Functions

        interpret_header
        make_format

        Variables

        CDEFINITION
        C_SIZES
        C_TO_STRUCT
        HEADER_FORMAT
        HEADER_NAMES
        MAXIMAGES
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.xsdimage-module.html0000644000175000017500000001462312126623347021707 0ustar jeromejerome00000000000000 fabio.xsdimage
        Package fabio :: Module xsdimage
        [hide private]
        [frames] | no frames]

        Module xsdimage

        source code

        
        Authors: Jérôme Kieffer, ESRF 
                 email:jerome.kieffer@esrf.fr
        
        XSDimge are XML files containing numpy arrays 
        
        

        Author: J\xc3\xa9r\xc3\xb4me Kieffer

        Contact: jerome.kieffer@esrf.eu

        Copyright: European Synchrotron Radiation Facility, Grenoble, France

        License: GPLv3+

        Classes [hide private]
          xsdimage
        Read the XSDataImage XML File data format
        Variables [hide private]
          logger = logging.getLogger("xsdimage")
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.OXDimage.Section-class.html0000644000175000017500000003117612126623347022770 0ustar jeromejerome00000000000000 fabio.OXDimage.Section
        Package fabio :: Module OXDimage :: Class Section
        [hide private]
        [frames] | no frames]

        Class Section

        source code

        object --+
                 |
                Section
        

        Small helper class for writing binary headers

        Instance Methods [hide private]
         
        __init__(self, size, dictHeader)
        x.__init__(...) initializes x; see x.__class__.__doc__ for signature
        source code
         
        __repr__(self)
        repr(x)
        source code
         
        getSize(self, dtype) source code
         
        setData(self, key, offset, dtype, default=None) source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, size, dictHeader)
        (Constructor)

        source code 

        x.__init__(...) initializes x; see x.__class__.__doc__ for signature

        Parameters:
        • size - size of the header section in bytes
        • dictHeader - headers of the image
        Overrides: object.__init__

        __repr__(self)
        (Representation operator)

        source code 

        repr(x)

        Overrides: object.__repr__
        (inherited documentation)

        setData(self, key, offset, dtype, default=None)

        source code 
        Parameters:
        • offset - int, starting position in the section
        • key - name of the header key
        • dtype - type of the data to insert (defines the size!)

        fabio-0.1.3/epydoc/toc-fabio.brukerimage-module.html0000644000175000017500000000265712120434325023160 0ustar jeromejerome00000000000000 brukerimage

        Module brukerimage


        Classes

        brukerimage

        Functions

        test

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.OXDimage.OXDimage-class.html0000644000175000017500000005012512126623347023014 0ustar jeromejerome00000000000000 fabio.OXDimage.OXDimage
        Package fabio :: Module OXDimage :: Class OXDimage
        [hide private]
        [frames] | no frames]

        Class OXDimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               OXDimage
        

        Oxford Diffraction Sapphire 3 images reader/writer class

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Must be overridden in classes
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code
         
        _writeheader(self)
        @return a string containing the header for Oxford images
        source code
         
        write(self, fname)
        Write Oxford diffraction images: this is still beta
        source code
         
        getCompressionRatio(self)
        calculate the compression factor obtained vs raw data
        source code

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        checkData(data=None)
        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers
        source code

        Inherited from fabioimage.fabioimage: checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Must be overridden in classes

        Overrides: fabioimage.fabioimage._readheader
        (inherited documentation)

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        write(self, fname)

        source code 

        Write Oxford diffraction images: this is still beta

        Parameters:
        • fname - output filename
        Overrides: fabioimage.fabioimage.write

        checkData(data=None)
        Static Method

        source code 

        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers

        Overrides: fabioimage.fabioimage.checkData
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.mar345image-pysrc.html0000644000175000017500000055143712126623347022010 0ustar jeromejerome00000000000000 fabio.mar345image
        Package fabio :: Module mar345image
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.mar345image

          1  #!/usr/bin/env python 
          2  #coding: utf8  
          3  from __future__ import with_statement 
          4  __doc__ = """ 
          5   
          6  Authors: 
          7  ........ 
          8  * Henning O. Sorensen & Erik Knudsen: 
          9    Center for Fundamental Research: Metal Structures in Four Dimensions; 
         10    Risoe National Laboratory; 
         11    Frederiksborgvej 399; 
         12    DK-4000 Roskilde; 
         13    email:erik.knudsen@risoe.dk 
         14  * Jon Wright, Jérôme Kieffer & Gaël Goret: 
         15    European Synchrotron Radiation Facility; 
         16    Grenoble (France) 
         17   
         18            
         19  """ 
         20   
         21  from fabioimage import fabioimage 
         22  import numpy, struct, time, sys 
         23  import logging 
         24  logger = logging.getLogger("mar345image") 
         25  from compression import compPCK, decPCK 
        
        26 27 -class mar345image(fabioimage):
        28 _need_a_real_file = True
        29 - def __init__(self, *args, **kwargs):
        30 fabioimage.__init__(self, *args, **kwargs) 31 self.numhigh = None 32 self.numpixels = None
        33
        34 - def read(self, fname, frame=None):
        35 """ Read a mar345 image""" 36 self.filename = fname 37 f = self._open(self.filename, "rb") 38 self._readheader(f) 39 if 'compressed' in self.header['Format']: 40 try: 41 self.data = decPCK(f, self.dim1, self.dim2, self.numhigh) 42 except Exception, error: 43 logger.error('%s. importing the mar345_io backend: generate an empty 1x1 picture' % error) 44 f.close() 45 self.dim1 = 1 46 self.dim2 = 1 47 self.bytecode = numpy.int # 48 self.data = numpy.resize(numpy.array([0], numpy.int), [1, 1]) 49 return self 50 51 else: 52 logger.error("cannot handle these formats yet " + \ 53 "due to lack of documentation") 54 return None 55 self.bytecode = numpy.uint 56 f.close() 57 return self
        58
        59 - def _readheader(self, infile=None):
        60 """ Read a mar345 image header """ 61 # clip was not used anywhere - commented out 62 # clip = '\x00' 63 #using a couple of local variables inside this function 64 f = infile 65 h = {} 66 67 #header is 4096 bytes long 68 l = f.read(64) 69 #the contents of the mar345 header is taken to be as 70 # described in 71 # http://www.mar-usa.com/support/downloads/mar345_formats.pdf 72 #the first 64 bytes are 4-byte integers (but in the CBFlib 73 # example image it seems to 128 bytes?) 74 #first 4-byte integer is a marker to check endianness 75 if struct.unpack("<i", l[0:4])[0] == 1234: 76 fs = '<i' 77 else: 78 fs = '>i' 79 80 #image dimensions 81 self.dim1 = self.dim2 = int(struct.unpack(fs, l[4:8])[0]) 82 #number of high intensity pixels 83 self.numhigh = struct.unpack(fs, l[2 * 4 : (2 + 1) * 4])[0] 84 h['NumHigh'] = self.numhigh 85 #Image format 86 i = struct.unpack(fs, l[3 * 4 : (3 + 1) * 4])[0] 87 if i == 1: 88 h['Format'] = 'compressed' 89 elif i == 2: 90 h['Format'] = 'spiral' 91 else: 92 h['Format'] = 'compressed' 93 logger.warning("image format could not be detetermined" + \ 94 "- assuming compressed mar345") 95 #collection mode 96 h['Mode'] = {0:'Dose', 1: 'Time'}[struct.unpack(fs, l[4 * 4:(4 + 1) * 4])[0]] 97 #total number of pixels 98 self.numpixels = struct.unpack(fs, l[5 * 4:(5 + 1) * 4])[0] 99 h['NumPixels'] = str(self.numpixels) 100 #pixel dimensions (length,height) in mm 101 h['PixelLength'] = struct.unpack(fs, l[6 * 4:(6 + 1) * 4])[0] / 1000.0 102 h['PixelHeight'] = struct.unpack(fs, l[7 * 4:(7 + 1) * 4])[0] / 1000.0 103 #x-ray wavelength in AA 104 h['Wavelength'] = struct.unpack(fs, l[8 * 4:(8 + 1) * 4])[0] / 1000000.0 105 #used distance 106 h['Distance'] = struct.unpack(fs, l[9 * 4:(9 + 1) * 4])[0] / 1000.0 107 #starting and ending phi 108 h['StartPhi'] = struct.unpack(fs, l[10 * 4:11 * 4])[0] / 1000.0 109 h['EndPhi'] = struct.unpack(fs, l[11 * 4:12 * 4])[0] / 1000.0 110 #starting and ending omega 111 h['StartOmega'] = struct.unpack(fs, l[12 * 4:13 * 4])[0] / 1000.0 112 h['EndOmega'] = struct.unpack(fs, l[13 * 4:14 * 4])[0] / 1000.0 113 #Chi and Twotheta angles 114 h['Chi'] = struct.unpack(fs, l[14 * 4:15 * 4])[0] / 1000.0 115 h['TwoTheta'] = struct.unpack(fs, l[15 * 4:16 * 4])[0] / 1000.0 116 117 #the rest of the header is ascii 118 # TODO: validate these values against the binaries already read 119 l = f.read(128) 120 if not 'mar research' in l: 121 logger.warning("the string \"mar research\" should be in " + \ 122 "bytes 65-76 of the header but was not") 123 start = 128 124 else: 125 start = l.index('mar research') 126 f.seek(64 + start) 127 l = f.read(4096 - start - 64).strip() 128 for m in l.splitlines(): 129 if m == 'END OF HEADER': 130 break 131 n = m.split(' ', 1) 132 if n[0] == '': 133 continue 134 if n[0] in ('PROGRAM', 'DATE', 'SCANNER', 'HIGH', 'MULTIPLIER', 135 'GAIN', 'WAVELENGTH', 'DISTANCE', 'RESOLUTION', 136 'CHI', 'TWOTHETA', 'MODE', 'TIME', 'GENERATOR', 137 'MONOCHROMATOR', 'REMARK'): 138 logger.debug("reading: %s %s", n[0], n[1]) 139 h[n[0]] = n[1].strip() 140 continue 141 if n[0] in ('FORMAT'): 142 (h['DIM'], h['FORMAT_TYPE'], h['NO_PIXELS']) = n[1].split() 143 continue 144 if n[0] in ('PIXEL', 'OFFSET', 'PHI', 'OMEGA', 'COUNTS', 145 'CENTER', 'INTENSITY', 'HISTOGRAM', 'COLLIMATOR'): 146 n = m.split() 147 h.update([(n[0] + '_' + n[j], n[j + 1]) for j in range(1, len(n), 2)]) 148 continue 149 self.header = h 150 return h
        151
        152 - def write(self, fname):
        153 """Try to write mar345 file. This is still in beta version. 154 It uses CCP4 (LGPL) PCK1 algo from JPA""" 155 headers = self._writeheader() 156 hotpixels = self._high_intensity_pixel_records() 157 compressed_stream = compPCK(self.data) 158 try: 159 outfile = self._open(fname, mode="wb") 160 outfile.write(headers) 161 outfile.write(hotpixels) 162 outfile.write(compressed_stream) 163 outfile.close() 164 except Exception, error: 165 logger.error("Error in writing file %s: %s" % (fname, error))
        166
        167 - def _writeheader(self, linesep="\n", size=4096):#the standard padding does not inclued
        168 """ 169 @param linesep: end of line separator 170 @return string/bytes containing the mar345 header 171 """ 172 try: 173 version = sys.modules["fabio"].version 174 except (KeyError, AttributeError): 175 version = "0.1.1" 176 lnsep = len(linesep) 177 178 self.header["HIGH"] = str(self.nb_overflow_pixels()) 179 binheader = numpy.zeros(16, "int32") 180 binheader[:4] = numpy.array([1234, self.dim1, int(self.header["HIGH"]), 1]) 181 binheader[4] = (self.header.get("MODE", "TIME") == "TIME") 182 binheader[5] = self.dim1 * self.dim2 183 binheader[6] = int(self.header.get("PIXEL_LENGTH", 1)) 184 binheader[7] = int(self.header.get("PIXEL_HEIGHT", 1)) 185 binheader[8] = int(float(self.header.get("WAVELENGTH", 1)) * 1e6) 186 binheader[9] = int(float(self.header.get("DISTANCE", 1)) * 1e3) 187 binheader[10] = int(float(self.header.get("PHI_START", 1)) * 1e3) 188 binheader[11] = int(float(self.header.get("PHI_END", 1)) * 1e3) 189 binheader[12] = int(float(self.header.get("OMEGA_START", 1)) * 1e3) 190 binheader[13] = int(float(self.header.get("OMEGA_END", 1)) * 1e3) 191 binheader[14] = int(float(self.header.get("CHI", 1)) * 1e3) 192 binheader[15] = int(float(self.header.get("TWOTHETA", 1)) * 1e3) 193 lstout = [binheader.tostring() + 'mar research'.ljust(64 - lnsep)] 194 lstout.append("PROGRAM".ljust(15) + (str(self.header.get("PROGRAM", "FabIO Version %s" % (version))).ljust(49 - lnsep))) 195 lstout.append("DATE".ljust(15) + (str(self.header.get("DATE", time.ctime()))).ljust(49 - lnsep)) 196 key = "SCANNER" 197 if key in self.header: 198 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 199 key = "FORMAT_TYPE" 200 if key in self.header: 201 lstout.append("FORMAT".ljust(15) + ("%s %s %s" % (self.dim1, self.header[key], self.dim1 * self.dim2)).ljust(49 - lnsep)) 202 key = "HIGH" 203 if key in self.header: 204 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 205 key1 = "PIXEL_LENGTH" 206 key2 = "PIXEL_HEIGHT" 207 if (key1 in self.header) and (key2 in self.header): 208 lstout.append("PIXEL".ljust(15) + ("LENGTH %s HEIGHT %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) 209 key1 = "OFFSET_ROFF" 210 key2 = "OFFSET_TOFF" 211 if key1 in self.header and key2 in self.header: 212 lstout.append("OFFSET".ljust(15) + ("ROFF %s TOFF %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) 213 key = "MULTIPLIER" 214 if key in self.header: 215 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 216 key = "GAIN" 217 if key in self.header: 218 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 219 key = "WAVELENGTH" 220 if key in self.header: 221 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 222 key = "DISTANCE" 223 if key in self.header: 224 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 225 key = "RESOLUTION" 226 if key in self.header: 227 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 228 key1 = "PHI_START" 229 key2 = "PHI_END" 230 key3 = "PHI_OSC" 231 if (key1 in self.header) and (key2 in self.header) and (key3 in self.header): 232 lstout.append("PHI".ljust(15) + ("START %s END %s OSC %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) 233 key1 = "OMEGA_START" 234 key2 = "OMEGA_END" 235 key3 = "OMEGA_OSC" 236 if (key1 in self.header) and (key2 in self.header) and (key3 in self.header): 237 lstout.append("OMEGA".ljust(15) + ("START %s END %s OSC %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) 238 key = "CHI" 239 if key in self.header: 240 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 241 key = "TWOTHETA" 242 if key in self.header: 243 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 244 key1 = "CENTER_X" 245 key2 = "CENTER_Y" 246 if (key1 in self.header) and (key2 in self.header): 247 lstout.append("CENTER".ljust(15) + ("X %s Y %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) 248 key = "MODE" 249 if key in self.header: 250 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 251 key = "TIME" 252 if key in self.header: 253 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 254 key1 = "COUNTS_START" 255 key2 = "COUNTS_END" 256 key3 = "COUNTS_NMEAS" 257 if key1 in self.header and key2 in self.header and key3 in self.header: 258 lstout.append("COUNTS".ljust(15) + ("START %s END %s NMEAS %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) 259 key1 = "COUNTS_MIN" 260 key2 = "COUNTS_MAX" 261 if key1 in self.header and key2 in self.header: 262 lstout.append("COUNTS".ljust(15) + ("MIN %s MAX %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) 263 key1 = "COUNTS_AVE" 264 key2 = "COUNTS_SIG" 265 if key1 in self.header and key2 in self.header: 266 lstout.append("COUNTS".ljust(15) + ("AVE %s SIG %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) 267 key1 = "INTENSITY_MIN" 268 key2 = "INTENSITY_MAX" 269 key3 = "INTENSITY_AVE" 270 key4 = "INTENSITY_SIG" 271 if key1 in self.header and key2 in self.header and key3 in self.header and key4 in self.header: 272 lstout.append("INTENSITY".ljust(15) + ("MIN %s MAX %s AVE %s SIG %s" % (self.header[key1], self.header[key2], self.header[key3], self.header[key4])).ljust(49 - lnsep)) 273 key1 = "HISTOGRAM_START" 274 key2 = "HISTOGRAM_END" 275 key3 = "HISTOGRAM_MAX" 276 if key1 in self.header and key2 in self.header and key3 in self.header: 277 lstout.append("HISTOGRAM".ljust(15) + ("START %s END %s MAX %s" % (self.header[key1], self.header[key2], self.header[key3])).ljust(49 - lnsep)) 278 key = "GENERATOR" 279 if key in self.header: 280 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 281 key = "MONOCHROMATOR" 282 if key in self.header: 283 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 284 key1 = "COLLIMATOR_WIDTH" 285 key2 = "COLLIMATOR_HEIGHT" 286 if key1 in self.header and key2 in self.header: 287 lstout.append("COLLIMATOR".ljust(15) + ("WIDTH %s HEIGHT %s" % (self.header[key1], self.header[key2])).ljust(49 - lnsep)) 288 key = "REMARK" 289 if key in self.header: 290 lstout.append(key.ljust(15) + str(self.header[key]).ljust(49 - lnsep)) 291 else: 292 lstout.append(key.ljust(64 - lnsep)) 293 key = "END OF HEADER" 294 lstout.append(key) 295 return linesep.join(lstout).ljust(size)
        296 297
        299 flt_data = self.data.flatten() 300 pix_location = numpy.where(flt_data > 65535)[0] 301 nb_pix = pix_location.size 302 if nb_pix % 8 == 0: 303 tmp = numpy.zeros((nb_pix, 2), dtype="int32") 304 else: 305 tmp = numpy.zeros(((nb_pix // 8 + 1) * 8, 2), dtype="int32") 306 tmp[:nb_pix, 0] = pix_location + 1 307 tmp[:nb_pix, 1] = flt_data[pix_location] 308 return tmp.tostring()
        309
        310 - def nb_overflow_pixels(self):
        311 return (self.data > 65535).sum()
        312 313 @staticmethod
        314 - def checkData(data=None):
        315 if data is None: 316 return None 317 else: 318 # enforce square image 319 shape = data.shape 320 assert len(shape) == 2, "image has 2 dimensions" 321 mshape = max(shape) 322 z = numpy.zeros((mshape, mshape), dtype=int) 323 z[:shape[0], :shape[1]] = data 324 return z
        325

        fabio-0.1.3/epydoc/fabio.fabioimage-module.html0000644000175000017500000001712412126623347022170 0ustar jeromejerome00000000000000 fabio.fabioimage
        Package fabio :: Module fabioimage
        [hide private]
        [frames] | no frames]

        Module fabioimage

        source code

        
        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:erik.knudsen@risoe.dk
        
                 and Jon Wright, Jerome Kieffer: ESRF
        
        
        Classes [hide private]
          fabioimage
        A common object for images in fable Contains a numpy array (.data) and dict of meta data (.header)
        Functions [hide private]
         
        test()
        check some basic fabioimage functionality
        source code
        Variables [hide private]
          logger = logging.getLogger("fabioimage")
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/epydoc.css0000644000175000017500000003722712120434325016646 0ustar jeromejerome00000000000000 /* Epydoc CSS Stylesheet * * This stylesheet can be used to customize the appearance of epydoc's * HTML output. * */ /* Default Colors & Styles * - Set the default foreground & background color with 'body'; and * link colors with 'a:link' and 'a:visited'. * - Use bold for decision list terms. * - The heading styles defined here are used for headings *within* * docstring descriptions. All headings used by epydoc itself use * either class='epydoc' or class='toc' (CSS styles for both * defined below). */ body { background: #ffffff; color: #000000; } p { margin-top: 0.5em; margin-bottom: 0.5em; } a:link { color: #0000ff; } a:visited { color: #204080; } dt { font-weight: bold; } h1 { font-size: +140%; font-style: italic; font-weight: bold; } h2 { font-size: +125%; font-style: italic; font-weight: bold; } h3 { font-size: +110%; font-style: italic; font-weight: normal; } code { font-size: 100%; } /* N.B.: class, not pseudoclass */ a.link { font-family: monospace; } /* Page Header & Footer * - The standard page header consists of a navigation bar (with * pointers to standard pages such as 'home' and 'trees'); a * breadcrumbs list, which can be used to navigate to containing * classes or modules; options links, to show/hide private * variables and to show/hide frames; and a page title (using *

        ). The page title may be followed by a link to the * corresponding source code (using 'span.codelink'). * - The footer consists of a navigation bar, a timestamp, and a * pointer to epydoc's homepage. */ h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } h2.epydoc { font-size: +130%; font-weight: bold; } h3.epydoc { font-size: +115%; font-weight: bold; margin-top: 0.2em; } td h3.epydoc { font-size: +115%; font-weight: bold; margin-bottom: 0; } table.navbar { background: #a0c0ff; color: #000000; border: 2px groove #c0d0d0; } table.navbar table { color: #000000; } th.navbar-select { background: #70b0ff; color: #000000; } table.navbar a { text-decoration: none; } table.navbar a:link { color: #0000ff; } table.navbar a:visited { color: #204080; } span.breadcrumbs { font-size: 85%; font-weight: bold; } span.options { font-size: 70%; } span.codelink { font-size: 85%; } td.footer { font-size: 85%; } /* Table Headers * - Each summary table and details section begins with a 'header' * row. This row contains a section title (marked by * 'span.table-header') as well as a show/hide private link * (marked by 'span.options', defined above). * - Summary tables that contain user-defined groups mark those * groups using 'group header' rows. */ td.table-header { background: #70b0ff; color: #000000; border: 1px solid #608090; } td.table-header table { color: #000000; } td.table-header table a:link { color: #0000ff; } td.table-header table a:visited { color: #204080; } span.table-header { font-size: 120%; font-weight: bold; } th.group-header { background: #c0e0f8; color: #000000; text-align: left; font-style: italic; font-size: 115%; border: 1px solid #608090; } /* Summary Tables (functions, variables, etc) * - Each object is described by a single row of the table with * two cells. The left cell gives the object's type, and is * marked with 'code.summary-type'. The right cell gives the * object's name and a summary description. * - CSS styles for the table's header and group headers are * defined above, under 'Table Headers' */ table.summary { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin-bottom: 0.5em; } td.summary { border: 1px solid #608090; } code.summary-type { font-size: 85%; } table.summary a:link { color: #0000ff; } table.summary a:visited { color: #204080; } /* Details Tables (functions, variables, etc) * - Each object is described in its own div. * - A single-row summary table w/ table-header is used as * a header for each details section (CSS style for table-header * is defined above, under 'Table Headers'). */ table.details { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } table.details table { color: #000000; } table.details a:link { color: #0000ff; } table.details a:visited { color: #204080; } /* Fields */ dl.fields { margin-left: 2em; margin-top: 1em; margin-bottom: 1em; } dl.fields dd ul { margin-left: 0em; padding-left: 0em; } dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } div.fields { margin-left: 2em; } div.fields p { margin-bottom: 0.5em; } /* Index tables (identifier index, term index, etc) * - link-index is used for indices containing lists of links * (namely, the identifier index & term index). * - index-where is used in link indices for the text indicating * the container/source for each link. * - metadata-index is used for indices containing metadata * extracted from fields (namely, the bug index & todo index). */ table.link-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; } td.link-index { border-width: 0px; } table.link-index a:link { color: #0000ff; } table.link-index a:visited { color: #204080; } span.index-where { font-size: 70%; } table.metadata-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } td.metadata-index { border-width: 1px; border-style: solid; } table.metadata-index a:link { color: #0000ff; } table.metadata-index a:visited { color: #204080; } /* Function signatures * - sig* is used for the signature in the details section. * - .summary-sig* is used for the signature in the summary * table, and when listing property accessor functions. * */ .sig-name { color: #006080; } .sig-arg { color: #008060; } .sig-default { color: #602000; } .summary-sig { font-family: monospace; } .summary-sig-name { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:link { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:visited { color: #006080; font-weight: bold; } .summary-sig-arg { color: #006040; } .summary-sig-default { color: #501800; } /* Subclass list */ ul.subclass-list { display: inline; } ul.subclass-list li { display: inline; } /* To render variables, classes etc. like functions */ table.summary .summary-name { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:link { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:visited { color: #006080; font-weight: bold; font-family: monospace; } /* Variable values * - In the 'variable details' sections, each varaible's value is * listed in a 'pre.variable' box. The width of this box is * restricted to 80 chars; if the value's repr is longer than * this it will be wrapped, using a backslash marked with * class 'variable-linewrap'. If the value's repr is longer * than 3 lines, the rest will be ellided; and an ellipsis * marker ('...' marked with 'variable-ellipsis') will be used. * - If the value is a string, its quote marks will be marked * with 'variable-quote'. * - If the variable is a regexp, it is syntax-highlighted using * the re* CSS classes. */ pre.variable { padding: .5em; margin: 0; background: #dce4ec; color: #000000; border: 1px solid #708890; } .variable-linewrap { color: #604000; font-weight: bold; } .variable-ellipsis { color: #604000; font-weight: bold; } .variable-quote { color: #604000; font-weight: bold; } .variable-group { color: #008000; font-weight: bold; } .variable-op { color: #604000; font-weight: bold; } .variable-string { color: #006030; } .variable-unknown { color: #a00000; font-weight: bold; } .re { color: #000000; } .re-char { color: #006030; } .re-op { color: #600000; } .re-group { color: #003060; } .re-ref { color: #404040; } /* Base tree * - Used by class pages to display the base class hierarchy. */ pre.base-tree { font-size: 80%; margin: 0; } /* Frames-based table of contents headers * - Consists of two frames: one for selecting modules; and * the other listing the contents of the selected module. * - h1.toc is used for each frame's heading * - h2.toc is used for subheadings within each frame. */ h1.toc { text-align: center; font-size: 105%; margin: 0; font-weight: bold; padding: 0; } h2.toc { font-size: 100%; font-weight: bold; margin: 0.5em 0 0 -0.3em; } /* Syntax Highlighting for Source Code * - doctest examples are displayed in a 'pre.py-doctest' block. * If the example is in a details table entry, then it will use * the colors specified by the 'table pre.py-doctest' line. * - Source code listings are displayed in a 'pre.py-src' block. * Each line is marked with 'span.py-line' (used to draw a line * down the left margin, separating the code from the line * numbers). Line numbers are displayed with 'span.py-lineno'. * The expand/collapse block toggle button is displayed with * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not * modify the font size of the text.) * - If a source code page is opened with an anchor, then the * corresponding code block will be highlighted. The code * block's header is highlighted with 'py-highlight-hdr'; and * the code block's body is highlighted with 'py-highlight'. * - The remaining py-* classes are used to perform syntax * highlighting (py-string for string literals, py-name for names, * etc.) */ pre.py-doctest { padding: .5em; margin: 1em; background: #e8f0f8; color: #000000; border: 1px solid #708890; } table pre.py-doctest { background: #dce4ec; color: #000000; } pre.py-src { border: 2px solid #000000; background: #f0f0f0; color: #000000; } .py-line { border-left: 2px solid #000000; margin-left: .2em; padding-left: .4em; } .py-lineno { font-style: italic; font-size: 90%; padding-left: .5em; } a.py-toggle { text-decoration: none; } div.py-highlight-hdr { border-top: 2px solid #000000; border-bottom: 2px solid #000000; background: #d8e8e8; } div.py-highlight { border-bottom: 2px solid #000000; background: #d0e0e0; } .py-prompt { color: #005050; font-weight: bold;} .py-more { color: #005050; font-weight: bold;} .py-string { color: #006030; } .py-comment { color: #003060; } .py-keyword { color: #600000; } .py-output { color: #404040; } .py-name { color: #000050; } .py-name:link { color: #000050 !important; } .py-name:visited { color: #000050 !important; } .py-number { color: #005000; } .py-defname { color: #000060; font-weight: bold; } .py-def-name { color: #000060; font-weight: bold; } .py-base-class { color: #000060; } .py-param { color: #000060; } .py-docstring { color: #006030; } .py-decorator { color: #804020; } /* Use this if you don't want links to names underlined: */ /*a.py-name { text-decoration: none; }*/ /* Graphs & Diagrams * - These CSS styles are used for graphs & diagrams generated using * Graphviz dot. 'img.graph-without-title' is used for bare * diagrams (to remove the border created by making the image * clickable). */ img.graph-without-title { border: none; } img.graph-with-title { border: 1px solid #000000; } span.graph-title { font-weight: bold; } span.graph-caption { } /* General-purpose classes * - 'p.indent-wrapped-lines' defines a paragraph whose first line * is not indented, but whose subsequent lines are. * - The 'nomargin-top' class is used to remove the top margin (e.g. * from lists). The 'nomargin' class is used to remove both the * top and bottom margin (but not the left or right margin -- * for lists, that would cause the bullets to disappear.) */ p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; margin: 0; } .nomargin-top { margin-top: 0; } .nomargin { margin-top: 0; margin-bottom: 0; } /* HTML Log */ div.log-block { padding: 0; margin: .5em 0 .5em 0; background: #e8f0f8; color: #000000; border: 1px solid #000000; } div.log-error { padding: .1em .3em .1em .3em; margin: 4px; background: #ffb0b0; color: #000000; border: 1px solid #000000; } div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; background: #ffffb0; color: #000000; border: 1px solid #000000; } div.log-info { padding: .1em .3em .1em .3em; margin: 4px; background: #b0ffb0; color: #000000; border: 1px solid #000000; } h2.log-hdr { background: #70b0ff; color: #000000; margin: 0; padding: 0em 0.5em 0em 0.5em; border-bottom: 1px solid #000000; font-size: 110%; } p.log { font-weight: bold; margin: .5em 0 .5em 0; } tr.opt-changed { color: #000000; font-weight: bold; } tr.opt-default { color: #606060; } pre.log { margin: 0; padding: 0; padding-left: 1em; } fabio-0.1.3/epydoc/fabio.datIO.fabiodata-class.html0000644000175000017500000002342412126623347022636 0ustar jeromejerome00000000000000 fabio.datIO.fabiodata
        Package fabio :: Module datIO :: Class fabiodata
        [hide private]
        [frames] | no frames]

        Class fabiodata

        source code

        object --+
                 |
                fabiodata
        
        Known Subclasses:

        A common class for dataIO in fable Contains a 2d numpy array for keeping data, and two lists (clabels and rlabels) containing labels for columns and rows respectively

        Instance Methods [hide private]
         
        __init__(self, data=None, clabels=None, rlabels=None, fname=None)
        set up initial values
        source code
         
        read(self, fname=None, frame=None)
        To be overridden by format specific subclasses
        source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, data=None, clabels=None, rlabels=None, fname=None)
        (Constructor)

        source code 

        set up initial values

        Overrides: object.__init__

        fabio-0.1.3/epydoc/toc-fabio.openimage-module.html0000644000175000017500000000332612120434325022621 0ustar jeromejerome00000000000000 openimage

        Module openimage


        Functions

        do_magic
        openheader
        openimage

        Variables

        MAGIC_NUMBERS
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.fabioutils.BZ2File-class.html0000644000175000017500000003173512126623347023266 0ustar jeromejerome00000000000000 fabio.fabioutils.BZ2File
        Package fabio :: Module fabioutils :: Class BZ2File
        [hide private]
        [frames] | no frames]

        Class BZ2File

        source code

         object --+    
                  |    
        bz2.BZ2File --+
                      |
                     BZ2File
        

        Wrapper with lock

        Instance Methods [hide private]
        file object
        __init__(name, mode='r', buffering=0, compresslevel=9)
        Open a bz2 file.
        source code
         
        getSize(self) source code
         
        setSize(self, value) source code

        Inherited from bz2.BZ2File: __delattr__, __getattribute__, __iter__, __new__, __setattr__, close, next, read, readline, readlines, seek, tell, write, writelines, xreadlines

        Inherited from object: __format__, __hash__, __reduce__, __reduce_ex__, __repr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]
          size

        Inherited from bz2.BZ2File: closed, mode, name, newlines, softspace

        Inherited from object: __class__

        Method Details [hide private]

        __init__(name, mode='r', buffering=0, compresslevel=9)
        (Constructor)

        source code 
                    Open a bz2 file. The mode can be 'r' or 'w', for reading (default) or
                    writing. When opened for writing, the file will be created if it doesn't
                    exist, and truncated otherwise. If the buffering argument is given, 0 means
                    unbuffered, and larger numbers specify the buffer size. If compresslevel
                    is given, must be a number between 1 and 9.
                    
                    Add a 'U' to mode to open the file for input with universal newline
                    support. Any line ending in the input file will be seen as a '
        ' in
                    Python. Also, a file so opened gains the attribute 'newlines'; the value
                    for this attribute is one of None (no newline read yet), '
        ', '
        ',
                    '
        ' or a tuple containing all the newline types seen. Universal
                    newlines are available only when reading.
                    
        
        
        Returns: file object
        Overrides: object.__init__

        Property Details [hide private]

        size

        Get Method:
        getSize(self)
        Set Method:
        setSize(self, value)

        fabio-0.1.3/epydoc/fabio.OXDimage-pysrc.html0000644000175000017500000073370412126623347021426 0ustar jeromejerome00000000000000 fabio.OXDimage
        Package fabio :: Module OXDimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.OXDimage

          1  #!/usr/bin/env python
         
          2  #coding: utf8
         
          3  
         
          4  from __future__ import with_statement 
          5  __doc__ = """
         
          6  Reads Oxford Diffraction Sapphire 3 images
         
          7  
         
          8  Authors:
         
          9  ........
         
         10  * Henning O. Sorensen & Erik Knudsen:
         
         11    Center for Fundamental Research: Metal Structures in Four Dimensions;
         
         12    Risoe National Laboratory;
         
         13    Frederiksborgvej 399;
         
         14    DK-4000 Roskilde;
         
         15    email:erik.knudsen@risoe.dk
         
         16  * Jon Wright, Jérôme Kieffer & Gaël Goret:
         
         17    European Synchrotron Radiation Facility;
         
         18    Grenoble (France)
         
         19  
         
         20  """ 
         21  
         
         22  import time, logging, struct 
         23  logger = logging.getLogger("OXDimage") 
         24  import numpy 
         25  from fabioimage import fabioimage 
         26  from compression import decTY1, compTY1 
         27  
         
         28  try: 
         29      from numpy import rad2deg, deg2rad 
         30  except ImportError: #naive implementation for very old numpy (v1.0.1 on MacOSX from Risoe) 
         31      rad2deg = lambda x: 180.0 * x / numpy.pi 
         32      deg2rad = lambda x: x * numpy.pi / 180. 
         33  
         
         34  DETECTOR_TYPES = {0: 'Sapphire/KM4CCD (1x1: 0.06mm, 2x2: 0.12mm)',
         
         35  1: 'Sapphire2-Kodak (1x1: 0.06mm, 2x2: 0.12mm)',
         
         36  2: 'Sapphire3-Kodak (1x1: 0.03mm, 2x2: 0.06mm, 4x4: 0.12mm)',
         
         37  3: 'Onyx-Kodak (1x1: 0.06mm, 2x2: 0.12mm, 4x4: 0.24mm)',
         
         38  4: 'Unknown Oxford diffraction detector'} 
         39  
         
         40  DEFAULT_HEADERS = {'Header Version':  'OD SAPPHIRE  3.0',
         
         41                     'Compression': "TY1",
         
         42                     'Header Size In Bytes': 5120,
         
         43                     "ASCII Section size in Byte": 256,
         
         44                     "General Section size in Byte": 512,
         
         45                     "Special Section size in Byte": 768,
         
         46                     "KM4 Section size in Byte": 1024,
         
         47                     "Statistic Section in Byte": 512,
         
         48                     "History Section in Byte": 2048,
         
         49                     'NSUPPLEMENT':0
         
         50                     } 
        
        51 52 -class OXDimage(fabioimage):
        53 """ 54 Oxford Diffraction Sapphire 3 images reader/writer class 55 """
        56 - def _readheader(self, infile):
        57 58 infile.seek(0) 59 60 # Ascii header part 256 byes long 61 self.header['Header Version'] = infile.readline()[:-2] 62 block = infile.readline() 63 self.header['Compression'] = block[12:15] 64 block = infile.readline() 65 self.header['NX'] = int(block[3:7]) 66 self.header['NY'] = int(block[11:15]) 67 self.header['OI'] = int(block[19:26]) 68 self.header['OL'] = int(block[30:37]) 69 block = infile.readline() 70 self.header['Header Size In Bytes'] = int(block[8:15]) 71 self.header['General Section size in Byte'] = int(block[19:26]) 72 self.header['Special Section size in Byte'] = int(block[30:37]) 73 self.header['KM4 Section size in Byte'] = int(block[41:48]) 74 self.header['Statistic Section in Byte'] = int(block[52:59]) 75 self.header['History Section in Byte'] = int(block[63:]) 76 block = infile.readline() 77 self.header['NSUPPLEMENT'] = int(block[12:19]) 78 block = infile.readline() 79 self.header['Time'] = block[5:29] 80 self.header["ASCII Section size in Byte"] = self.header['Header Size In Bytes']\ 81 - self.header['General Section size in Byte']\ 82 - self.header['Special Section size in Byte'] \ 83 - self.header['KM4 Section size in Byte']\ 84 - self.header['Statistic Section in Byte']\ 85 - self.header['History Section in Byte']\ 86 # Skip to general section (NG) 512 byes long <<<<<<" 87 infile.seek(self.header["ASCII Section size in Byte"]) 88 block = infile.read(self.header['General Section size in Byte']) 89 self.header['Binning in x'] = numpy.fromstring(block[0:2], numpy.uint16)[0] 90 self.header['Binning in y'] = numpy.fromstring(block[2:4], numpy.uint16)[0] 91 self.header['Detector size x'] = numpy.fromstring(block[22:24], numpy.uint16)[0] 92 self.header['Detector size y'] = numpy.fromstring(block[24:26], numpy.uint16)[0] 93 self.header['Pixels in x'] = numpy.fromstring(block[26:28], numpy.uint16)[0] 94 self.header['Pixels in y'] = numpy.fromstring(block[28:30], numpy.uint16)[0] 95 self.header['No of pixels'] = numpy.fromstring(block[36:40], numpy.uint32)[0] 96 97 # Speciel section (NS) 768 bytes long 98 block = infile.read(self.header['Special Section size in Byte']) 99 self.header['Gain'] = numpy.fromstring(block[56:64], numpy.float)[0] 100 self.header['Overflows flag'] = numpy.fromstring(block[464:466], numpy.int16)[0] 101 self.header['Overflow after remeasure flag'] = numpy.fromstring(block[466:468], numpy.int16)[0] 102 self.header['Overflow threshold'] = numpy.fromstring(block[472:476], numpy.int32)[0] 103 self.header['Exposure time in sec'] = numpy.fromstring(block[480:488], numpy.float)[0] 104 self.header['Overflow time in sec'] = numpy.fromstring(block[488:496], numpy.float)[0] 105 self.header['Monitor counts of raw image 1'] = numpy.fromstring(block[528:532], numpy.int32)[0] 106 self.header['Monitor counts of raw image 2'] = numpy.fromstring(block[532:536], numpy.int32)[0] 107 self.header['Monitor counts of overflow raw image 1'] = numpy.fromstring(block[536:540], numpy.int32)[0] 108 self.header['Monitor counts of overflow raw image 2'] = numpy.fromstring(block[540:544], numpy.int32)[0] 109 self.header['Unwarping'] = numpy.fromstring(block[544:548], numpy.int32)[0] 110 self.header['Detector type'] = DETECTOR_TYPES[numpy.fromstring(block[548:552], numpy.int32)[0]] 111 self.header['Real pixel size x (mm)'] = numpy.fromstring(block[568:576], numpy.float)[0] 112 self.header['Real pixel size y (mm)'] = numpy.fromstring(block[576:584], numpy.float)[0] 113 114 # KM4 goniometer section (NK) 1024 bytes long 115 block = infile.read(self.header['KM4 Section size in Byte']) 116 # Spatial correction file 117 self.header['Spatial correction file'] = block[26:272].strip("\x00") 118 self.header['Spatial correction file date'] = block[0:26].strip("\x00") 119 # Angles are in steps due to stepper motors - conversion factor RAD 120 # angle[0] = omega, angle[1] = theta, angle[2] = kappa, angle[3] = phi, 121 start_angles_step = numpy.fromstring(block[284:304], numpy.int32) 122 end_angles_step = numpy.fromstring(block[324:344], numpy.int32) 123 step2rad = numpy.fromstring(block[368:408], numpy.float) 124 step_angles_deg = rad2deg(step2rad) 125 # calc angles 126 start_angles_deg = start_angles_step * step_angles_deg 127 end_angles_deg = end_angles_step * step_angles_deg 128 self.header['Omega start in deg'] = start_angles_deg[0] 129 self.header['Theta start in deg'] = start_angles_deg[1] 130 self.header['Kappa start in deg'] = start_angles_deg[2] 131 self.header['Phi start in deg'] = start_angles_deg[3] 132 self.header['Omega end in deg'] = end_angles_deg[0] 133 self.header['Theta end in deg'] = end_angles_deg[1] 134 self.header['Kappa end in deg'] = end_angles_deg[2] 135 self.header['Phi end in deg'] = end_angles_deg[3] 136 self.header['Omega step in deg'] = step_angles_deg[0] 137 self.header['Theta step in deg'] = step_angles_deg[1] 138 self.header['Kappa step in deg'] = step_angles_deg[2] 139 self.header['Phi step in deg'] = step_angles_deg[3] 140 141 142 zero_correction_soft_step = numpy.fromstring(block[512:532], numpy.int32) 143 zero_correction_soft_deg = zero_correction_soft_step * step_angles_deg 144 self.header['Omega zero corr. in deg'] = zero_correction_soft_deg[0] 145 self.header['Theta zero corr. in deg'] = zero_correction_soft_deg[1] 146 self.header['Kappa zero corr. in deg'] = zero_correction_soft_deg[2] 147 self.header['Phi zero corr. in deg'] = zero_correction_soft_deg[3] 148 # Beam rotation about e2,e3 149 self.header['Beam rot in deg (e2)'] = numpy.fromstring(block[552:560], numpy.float)[0] 150 self.header['Beam rot in deg (e3)'] = numpy.fromstring(block[560:568], numpy.float)[0] 151 # Wavelenghts alpha1, alpha2, beta 152 self.header['Wavelength alpha1'] = numpy.fromstring(block[568:576], numpy.float)[0] 153 self.header['Wavelength alpha2'] = numpy.fromstring(block[576:584], numpy.float)[0] 154 self.header['Wavelength alpha'] = numpy.fromstring(block[584:592], numpy.float)[0] 155 self.header['Wavelength beta'] = numpy.fromstring(block[592:600], numpy.float)[0] 156 157 # Detector tilts around e1,e2,e3 in deg 158 self.header['Detector tilt e1 in deg'] = numpy.fromstring(block[640:648], numpy.float)[0] 159 self.header['Detector tilt e2 in deg'] = numpy.fromstring(block[648:656], numpy.float)[0] 160 self.header['Detector tilt e3 in deg'] = numpy.fromstring(block[656:664], numpy.float)[0] 161 162 163 # Beam center 164 self.header['Beam center x'] = numpy.fromstring(block[664:672], numpy.float)[0] 165 self.header['Beam center y'] = numpy.fromstring(block[672:680], numpy.float)[0] 166 # Angle (alpha) between kappa rotation axis and e3 (ideally 50 deg) 167 self.header['Alpha angle in deg'] = numpy.fromstring(block[672:680], numpy.float)[0] 168 # Angle (beta) between phi rotation axis and e3 (ideally 0 deg) 169 self.header['Beta angle in deg'] = numpy.fromstring(block[672:680], numpy.float)[0] 170 171 # Detector distance 172 self.header['Distance in mm'] = numpy.fromstring(block[712:720], numpy.float)[0] 173 # Statistics section (NS) 512 bytes long 174 block = infile.read(self.header['Statistic Section in Byte']) 175 self.header['Stat: Min '] = numpy.fromstring(block[0:4], numpy.int32)[0] 176 self.header['Stat: Max '] = numpy.fromstring(block[4:8], numpy.int32)[0] 177 self.header['Stat: Average '] = numpy.fromstring(block[24:32], numpy.float)[0] 178 self.header['Stat: Stddev '] = numpy.sqrt(numpy.fromstring(block[32:40], numpy.float)[0]) 179 self.header['Stat: Skewness '] = numpy.fromstring(block[40:48], numpy.float)[0] 180 181 # History section (NH) 2048 bytes long 182 block = infile.read(self.header['History Section in Byte']) 183 self.header['Flood field image'] = block[99:126].strip("\x00")
        184
        185 - def read(self, fname, frame=None):
        186 """ 187 Read in header into self.header and 188 the data into self.data 189 """ 190 self.header = {} 191 self.resetvals() 192 infile = self._open(fname) 193 self._readheader(infile) 194 195 infile.seek(self.header['Header Size In Bytes']) 196 197 # Compute image size 198 try: 199 self.dim1 = int(self.header['NX']) 200 self.dim2 = int(self.header['NY']) 201 except: 202 raise Exception("Oxford file", str(fname) + \ 203 "is corrupt, cannot read it") 204 # 205 if self.header['Compression'] == 'TY1': 206 #Compressed with the KM4CCD compression 207 raw8 = infile.read(self.dim1 * self.dim2) 208 raw16 = None 209 raw32 = None 210 if self.header['OI'] > 0: 211 raw16 = infile.read(self.header['OI'] * 2) 212 if self.header['OL'] > 0: 213 raw32 = infile.read(self.header['OL'] * 4) 214 #DEBUG stuff ... 215 self.raw8 = raw8 216 self.raw16 = raw16 217 self.raw32 = raw32 218 #END DEBUG 219 block = decTY1(raw8, raw16, raw32) 220 bytecode = block.dtype 221 222 else: 223 bytecode = numpy.int32 224 self.bpp = len(numpy.array(0, bytecode).tostring()) 225 ReadBytes = self.dim1 * self.dim2 * self.bpp 226 block = numpy.fromstring(infile.read(ReadBytes), bytecode) 227 228 logger.debug('OVER_SHORT2: %s', block.dtype) 229 logger.debug("%s" % (block < 0).sum()) 230 infile.close() 231 logger.debug("BYTECODE: %s", bytecode) 232 self.data = block.reshape((self.dim2, self.dim1)) 233 self.bytecode = self.data.dtype.type 234 self.pilimage = None 235 return self
        236
        237 - def _writeheader(self):
        238 """ 239 @return a string containing the header for Oxford images 240 """ 241 linesep = "\r\n" 242 for key in DEFAULT_HEADERS: 243 if key not in self.header_keys: 244 self.header_keys.append(key) 245 self.header[key] = DEFAULT_HEADERS[key] 246 247 if "NX" not in self.header.keys() or "NY" not in self.header.keys(): 248 self.header['NX'] = self.dim1 249 self.header['NY'] = self.dim2 250 ascii_headers = [self.header['Header Version'], 251 "COMPRESSION=%s (%5.1f)" % (self.header["Compression"], self.getCompressionRatio()), 252 "NX=%4i NY=%4i OI=%7i OL=%7i " % (self.header["NX"], self.header["NY"], self.header["OI"], self.header["OL"]), 253 "NHEADER=%7i NG=%7i NS=%7i NK=%7i NS=%7i NH=%7i" % (self.header['Header Size In Bytes'], 254 self.header['General Section size in Byte'], 255 self.header['Special Section size in Byte'], 256 self.header['KM4 Section size in Byte'], 257 self.header['Statistic Section in Byte'], 258 self.header['History Section in Byte']), 259 "NSUPPLEMENT=%7i" % (self.header["NSUPPLEMENT"])] 260 if "Time" in self.header: 261 ascii_headers.append("TIME=%s" % self.header["Time"]) 262 else: 263 264 ascii_headers.append("TIME=%s" % time.ctime()) 265 266 header = (linesep.join(ascii_headers)).ljust(256) 267 268 269 NG = Section(self.header['General Section size in Byte'], self.header) 270 NG.setData('Binning in x', 0, numpy.uint16) 271 NG.setData('Binning in y', 2, numpy.uint16) 272 NG.setData('Detector size x', 22, numpy.uint16) 273 NG.setData('Detector size y', 24, numpy.uint16) 274 NG.setData('Pixels in x', 26, numpy.uint16) 275 NG.setData('Pixels in y', 28, numpy.uint16) 276 NG.setData('No of pixels', 36, numpy.uint32) 277 header += NG.__repr__() 278 279 NS = Section(self.header['Special Section size in Byte'], self.header) 280 NS.setData('Gain', 56, numpy.float) 281 NS.setData('Overflows flag', 464, numpy.int16) 282 NS.setData('Overflow after remeasure flag', 466, numpy.int16) 283 NS.setData('Overflow threshold', 472, numpy.int32) 284 NS.setData('Exposure time in sec', 480, numpy.float) 285 NS.setData('Overflow time in sec', 488, numpy.float) 286 NS.setData('Monitor counts of raw image 1', 528, numpy.int32) 287 NS.setData('Monitor counts of raw image 2', 532, numpy.int32) 288 NS.setData('Monitor counts of overflow raw image 1', 536, numpy.int32) 289 NS.setData('Monitor counts of overflow raw image 2', 540, numpy.int32) 290 NS.setData('Unwarping', 544, numpy.int32) 291 if 'Detector type' in self.header: 292 for key, value in DETECTOR_TYPES.items(): 293 if value == self.header['Detector type']: 294 NS.setData(None, 548, numpy.int32, default=key) 295 NS.setData('Real pixel size x (mm)', 568, numpy.float) 296 NS.setData('Real pixel size y (mm)', 576, numpy.float) 297 header += NS.__repr__() 298 299 KM = Section(self.header['KM4 Section size in Byte'], self.header) 300 KM.setData('Spatial correction file date', 0, "|S26") 301 KM.setData('Spatial correction file', 26, "|S246") 302 # Angles are in steps due to stepper motors - conversion factor RAD 303 # angle[0] = omega, angle[1] = theta, angle[2] = kappa, angle[3] = phi, 304 if self.header.get('Omega step in deg', None): 305 KM.setData(None, 368, numpy.float64, deg2rad(self.header["Omega step in deg"])) 306 if self.header.get('Omega start in deg', None): 307 KM.setData(None, 284, numpy.int32, self.header["Omega start in deg"] / self.header["Omega step in deg"]) 308 if self.header.get('Omega end in deg', None): 309 KM.setData(None, 324, numpy.int32, self.header["Omega end in deg"] / self.header["Omega step in deg"]) 310 if self.header.get('Omega zero corr. in deg', None): 311 KM.setData(None, 512, numpy.int32, self.header['Omega zero corr. in deg'] / self.header["Omega step in deg"]) 312 313 if self.header.get('Theta step in deg', None): 314 KM.setData(None, 368 + 8, numpy.float64, deg2rad(self.header["Theta step in deg"])) 315 if self.header.get('Theta start in deg', None): 316 KM.setData(None, 284 + 4, numpy.int32, self.header["Theta start in deg"] / self.header["Theta step in deg"]) 317 if self.header.get('Theta end in deg', None): 318 KM.setData(None, 324 + 4, numpy.int32, self.header["Theta end in deg"] / self.header["Theta step in deg"]) 319 if self.header.get('Theta zero corr. in deg', None): 320 KM.setData(None, 512 + 4, numpy.int32, self.header['Theta zero corr. in deg'] / self.header["Theta step in deg"]) 321 322 if self.header.get('Kappa step in deg', None): 323 KM.setData(None, 368 + 16, numpy.float64, deg2rad(self.header["Kappa step in deg"])) 324 if self.header.get('Kappa start in deg', None): 325 KM.setData(None, 284 + 8, numpy.int32, self.header["Kappa start in deg"] / self.header["Kappa step in deg"]) 326 if self.header.get('Kappa end in deg', None): 327 KM.setData(None, 324 + 8, numpy.int32, self.header["Kappa end in deg"] / self.header["Kappa step in deg"]) 328 if self.header.get('Kappa zero corr. in deg', None): 329 KM.setData(None, 512 + 8, numpy.int32, self.header['Kappa zero corr. in deg'] / self.header["Kappa step in deg"]) 330 331 if self.header.get('Phi step in deg', None): 332 KM.setData(None, 368 + 24, numpy.float64, deg2rad(self.header["Phi step in deg"])) 333 if self.header.get('Phi start in deg', None): 334 KM.setData(None, 284 + 12, numpy.int32, self.header["Phi start in deg"] / self.header["Phi step in deg"]) 335 if self.header.get('Phi end in deg', None): 336 KM.setData(None, 324 + 12, numpy.int32, self.header["Phi end in deg"] / self.header["Phi step in deg"]) 337 if self.header.get('Phi zero corr. in deg', None): 338 KM.setData(None, 512 + 12, numpy.int32, self.header['Phi zero corr. in deg'] / self.header["Phi step in deg"]) 339 340 # Beam rotation about e2,e3 341 KM.setData('Beam rot in deg (e2)', 552, numpy.float64) 342 KM.setData('Beam rot in deg (e3)', 560, numpy.float64) 343 # Wavelenghts alpha1, alpha2, beta 344 KM.setData('Wavelength alpha1', 568, numpy.float64) 345 KM.setData('Wavelength alpha2', 576, numpy.float64) 346 KM.setData('Wavelength alpha', 584, numpy.float64) 347 KM.setData('Wavelength beta', 592, numpy.float64) 348 349 # Detector tilts around e1,e2,e3 in deg 350 KM.setData('Detector tilt e1 in deg', 640, numpy.float64) 351 KM.setData('Detector tilt e2 in deg', 648, numpy.float64) 352 KM.setData('Detector tilt e3 in deg', 656, numpy.float64) 353 354 # Beam center 355 KM.setData('Beam center x', 664, numpy.float64) 356 KM.setData('Beam center y', 672, numpy.float64) 357 # Angle (alpha) between kappa rotation axis and e3 (ideally 50 deg) 358 KM.setData('Alpha angle in deg', 672, numpy.float64) 359 # Angle (beta) between phi rotation axis and e3 (ideally 0 deg) 360 KM.setData('Beta angle in deg', 672, numpy.float64) 361 362 # Detector distance 363 KM.setData('Distance in mm', 712, numpy.float64) 364 header += KM.__repr__() 365 366 SS = Section(self.header['Statistic Section in Byte'], self.header) 367 SS.setData('Stat: Min ', 0, numpy.int32) 368 SS.setData('Stat: Max ', 4, numpy.int32) 369 SS.setData('Stat: Average ', 24, numpy.float64) 370 if self.header.get('Stat: Stddev ', None): 371 SS.setData(None, 32, numpy.float64, self.header['Stat: Stddev '] ** 2) 372 SS.setData('Stat: Skewness ', 40, numpy.float64) 373 header += SS.__repr__() 374 375 HS = Section(self.header['History Section in Byte'], self.header) 376 HS.setData('Flood field image', 99, "|S27") 377 header += HS.__repr__() 378 379 return header
        380 381
        382 - def write(self, fname):
        383 """Write Oxford diffraction images: this is still beta 384 @param fname: output filename 385 """ 386 datablock8, datablock16, datablock32 = compTY1(self.data) 387 self.header["OI"] = len(datablock16) / 2 388 self.header["OL"] = len(datablock32) / 4 389 with self._open(fname, mode="wb") as outfile: 390 outfile.write(self._writeheader()) 391 outfile.write(datablock8) 392 outfile.write(datablock16) 393 outfile.write(datablock32)
        394
        395 - def getCompressionRatio(self):
        396 "calculate the compression factor obtained vs raw data" 397 return 100.0 * (self.data.size + 2 * self.header["OI"] + 4 * self.header["OL"]) / (self.data.size * 4)
        398 399 @staticmethod
        400 - def checkData(data=None):
        401 if data is None: 402 return None 403 else: 404 return data.astype(int)
        405
        406 -class Section(object):
        407 """ 408 Small helper class for writing binary headers 409 """
        410 - def __init__(self, size, dictHeader):
        411 """ 412 @param size: size of the header section in bytes 413 @param dictHeader: headers of the image 414 """ 415 self.size = size 416 self.header = dictHeader 417 self.lstChr = ["\x00"] * size 418 self._dictSize = {}
        419 - def __repr__(self):
        420 return "".join(self.lstChr)
        421
        422 - def getSize(self, dtype):
        423 if not dtype in self._dictSize: 424 self._dictSize[dtype] = len(numpy.zeros(1, dtype=dtype).tostring()) 425 return self._dictSize[dtype]
        426
        427 - def setData(self, key, offset, dtype, default=None):
        428 """ 429 @param offset: int, starting position in the section 430 @param key: name of the header key 431 @param dtype: type of the data to insert (defines the size!) 432 """ 433 if key in self.header: 434 value = self.header[key] 435 elif key in DEFAULT_HEADERS: 436 value = DEFAULT_HEADERS[key] 437 else: 438 value = default 439 if value is None: 440 value = "\x00" * self.getSize(dtype) 441 else: 442 value = numpy.array(value).astype(dtype).tostring() 443 self.lstChr[offset:offset + self.getSize(dtype)] = value
        444

        fabio-0.1.3/epydoc/fabio.converters-pysrc.html0000644000175000017500000005325112126623347022153 0ustar jeromejerome00000000000000 fabio.converters
        Package fabio :: Module converters
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.converters

         1  #!/usr/bin/env python  
         2  #coding: utf8 
         3  """ 
         4  Converter module.  
         5  This is for the moment empty (populated only with almost pass through anonymous functions) 
         6  but aims to be populated with more sofisticated translators ...   
         7   
         8  """ 
         9  __author__ = "Jérôme Kieffer" 
        10  __contact__ = "jerome.kieffer@esrf.eu" 
        11  __license__ = "GPLv3+" 
        12  __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" 
        13   
        14  import types, logging 
        15  logger = logging.getLogger("converter") 
        16   
        
        17 -def convert_data_integer(data):
        18 """ 19 convert data to integer 20 """ 21 if data is not None: 22 return data.astype(int) 23 else: 24 return data
        25 26 27 CONVERSION_HEADER = { 28 ("edfimage", "edfimage"): lambda header:header, 29 } 30 CONVERSION_DATA = { 31 ("edfimage", "edfimage"): lambda data:data, 32 ("edfimage", "cbfimage"): convert_data_integer, 33 ("edfimage", "mar345image"): convert_data_integer, 34 ("edfimage", "fit2dmaskimage"): convert_data_integer, 35 ("edfimage", "kcdimage"): convert_data_integer, 36 ("edfimage", "OXDimage"): convert_data_integer, 37 ("edfimage", "pnmimage"): convert_data_integer, 38 } 39
        40 -def convert_data(inp, outp, data):
        41 """ 42 Return data converted to the output format ... over-simplistic implementation for the moment ... 43 @param inp,outp: input/output format like "cbfimage" 44 @param data(ndarray): the actual dataset to be transformed 45 """ 46 return CONVERSION_DATA.get((inp, outp), lambda data:data)(data)
        47
        48 -def convert_header(inp, outp, header):
        49 """ 50 return header converted to the output format 51 @param inp,outp: input/output format like "cbfimage" 52 @param header(dict):the actual set of headers to be transformed 53 """ 54 return CONVERSION_HEADER.get((inp, outp), lambda header:header)(header)
        55

        fabio-0.1.3/epydoc/fabio.edfimage-pysrc.html0000644000175000017500000140573412126623347021532 0ustar jeromejerome00000000000000 fabio.edfimage
        Package fabio :: Module edfimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.edfimage

          1  #!/usr/bin/env python 
          2  # -*- coding: utf8 -*- 
          3  """ 
          4   
          5  License: GPLv2+ 
          6   
          7  Authors: 
          8  ........ 
          9  * Henning O. Sorensen & Erik Knudsen: 
         10    Center for Fundamental Research: Metal Structures in Four Dimensions; 
         11    Risoe National Laboratory; 
         12    Frederiksborgvej 399; 
         13    DK-4000 Roskilde; 
         14    email:erik.knudsen@risoe.dk 
         15  * Jon Wright & Jérôme Kieffer: 
         16    European Synchrotron Radiation Facility; 
         17    Grenoble (France) 
         18   
         19   
         20  """ 
         21  from __future__ import with_statement 
         22  import os, logging, types 
         23  logger = logging.getLogger("edfimage") 
         24  import numpy 
         25  from fabioimage import fabioimage 
         26  from fabioutils import isAscii, toAscii, nice_int 
         27  from compression import decBzip2, decGzip, decZlib 
         28   
         29   
         30  BLOCKSIZE = 512 
         31  DATA_TYPES = {  "SignedByte"    :  numpy.int8, 
         32                  "Signed8"       :  numpy.int8, 
         33                  "UnsignedByte"  :  numpy.uint8, 
         34                  "Unsigned8"     :  numpy.uint8, 
         35                  "SignedShort"   :  numpy.int16, 
         36                  "Signed16"      :  numpy.int16, 
         37                  "UnsignedShort" :  numpy.uint16, 
         38                  "Unsigned16"    :  numpy.uint16, 
         39                  "UnsignedShortInteger" : numpy.uint16, 
         40                  "SignedInteger" :  numpy.int32, 
         41                  "Signed32"      :  numpy.int32, 
         42                  "UnsignedInteger":  numpy.uint32, 
         43                  "Unsigned32"    :  numpy.uint32, 
         44                  "SignedLong"    :  numpy.int32, 
         45                  "UnsignedLong"  :  numpy.uint32, 
         46                  "Signed64"      :  numpy.int64, 
         47                  "Unsigned64"    :  numpy.uint64, 
         48                  "FloatValue"    :  numpy.float32, 
         49                  "FLOATVALUE"    :  numpy.float32, 
         50                  "FLOAT"         :  numpy.float32, # fit2d 
         51                  "Float"         :  numpy.float32, # fit2d 
         52                  "FloatIEEE32"   :  numpy.float32, 
         53                  "Float32"       :  numpy.float32, 
         54                  "Double"        :  numpy.float64, 
         55                  "DoubleValue"   :  numpy.float64, 
         56                  "FloatIEEE64"   :  numpy.float64, 
         57                  "DoubleIEEE64"  :  numpy.float64} 
         58  try: 
         59      DATA_TYPES["FloatIEEE128" ] =  numpy.float128 
         60      DATA_TYPES["DoubleIEEE128" ] =  numpy.float128 
         61      DATA_TYPES["QuadrupleValue" ] =  numpy.float128 
         62   
         63  except AttributeError: 
         64      # not in your numpy 
         65      pass 
         66   
         67  NUMPY_EDF_DTYPE = {"int8"       :"SignedByte", 
         68                     "int16"      :"SignedShort", 
         69                     "int32"      :"SignedInteger", 
         70                     "int64"      :"Signed64", 
         71                     "uint8"      :"UnsignedByte", 
         72                     "uint16"     :"UnsignedShort", 
         73                     "uint32"     :"UnsignedInteger", 
         74                     "uint64"     :"Unsigned64", 
         75                     "float32"    :"FloatValue", 
         76                     "float64"    :"DoubleValue", 
         77                     "float128"   :"QuadrupleValue", 
         78               } 
         79   
         80  MINIMUM_KEYS = ['HEADERID', 
         81                  'IMAGE', 
         82                  'BYTEORDER', 
         83                  'DATATYPE', 
         84                  'DIM_1', 
         85                  'DIM_2', 
         86                  'SIZE'] # Size is thought to be essential for writing at least 
         87   
         88  DEFAULT_VALUES = { 
         89                    # I do not define default values as they will be calculated at write time 
         90                    # JK20110415 
         91                    } 
        
        92 93 -class Frame(object):
        94 """ 95 A class representing a single frame in an EDF file 96 """
        97 - def __init__(self, data=None, header=None, header_keys=None, number=None):
        98 if header is None: 99 self.header = {} 100 else: 101 self.header = dict(header) 102 103 if header_keys is None: 104 self.header_keys = self.header.keys() 105 else: 106 self.header_keys = header_keys[:] 107 for key in header_keys: 108 if key not in self.header: 109 logger.warning("Header key %s, in header_keys is not in header dictionary, poping !!!" % key) 110 self.header_keys.remove(key) 111 112 self.capsHeader = {} 113 for key in self.header_keys: 114 try: 115 self.capsHeader[key.upper()] = key 116 except AttributeError: 117 logger.warning("Header key %s is not a string" % key) 118 self._data = data 119 self.dims = [] 120 self.dim1 = 0 121 self.dim2 = 0 122 self.start = None # Position of start of raw data in file 123 self.size = None # size of raw data in file 124 self.file = None # opened file object with locking capabilities !!! 125 self.bpp = None 126 self._bytecode = None 127 if (number is not None) and isinstance(number, int): 128 self.iFrame = number 129 else: 130 self.iFrame = 0
        131
        132 - def parseheader(self, block):
        133 """ 134 Parse the header in some EDF format from an already open file 135 136 @param block: string representing the header block 137 @type block: string, should be full ascii 138 @return: size of the binary blob 139 """ 140 #reset values ... 141 self.header = {} 142 self.capsHeader = {} 143 self.header_keys = [] 144 self.size = None 145 calcsize = 1 146 self.dims = [] 147 148 for line in block.split(';'): 149 if '=' in line: 150 key, val = line.split('=' , 1) 151 # Why would someone put null bytes in a header? 152 key = key.replace("\x00"," ").strip() 153 self.header[key] = val.replace("\x00"," ").strip() 154 self.capsHeader[key.upper()] = key 155 self.header_keys.append(key) 156 157 # Compute image size 158 if "SIZE" in self.capsHeader: 159 try: 160 self.size = nice_int(self.header[self.capsHeader["SIZE"]]) 161 except ValueError: 162 logger.warning("Unable to convert to integer : %s %s " % (self.capsHeader["SIZE"], self.header[self.capsHeader["SIZE"]])) 163 if "DIM_1" in self.capsHeader: 164 try: 165 dim1 = nice_int(self.header[self.capsHeader['DIM_1']]) 166 except ValueError: 167 logger.error("Unable to convert to integer Dim_1: %s %s" % (self.capsHeader["DIM_1"], self.header[self.capsHeader["DIM_1"]])) 168 else: 169 calcsize *= dim1 170 self.dims.append(dim1) 171 else: 172 logger.error("No Dim_1 in headers !!!") 173 if "DIM_2" in self.capsHeader: 174 try: 175 dim2 = nice_int(self.header[self.capsHeader['DIM_2']]) 176 except ValueError: 177 logger.error("Unable to convert to integer Dim_3: %s %s" % (self.capsHeader["DIM_2"], self.header[self.capsHeader["DIM_2"]])) 178 else: 179 calcsize *= dim2 180 self.dims.append(dim2) 181 else: 182 logger.error("No Dim_2 in headers !!!") 183 iDim = 3 184 # JON: this appears to be for nD images, but we don't treat those 185 while iDim is not None: 186 strDim = "DIM_%i" % iDim 187 if strDim in self.capsHeader: 188 try: 189 dim3 = nice_int(self.header[self.capsHeader[strDim]]) 190 except ValueError: 191 logger.error("Unable to convert to integer %s: %s %s" 192 % (strDim, self.capsHeader[strDim], self.header[self.capsHeader[strDim]])) 193 dim3 = None 194 iDim = None 195 else: 196 if dim3 > 1: 197 # Otherwise treat dim3==1 as a 2D image 198 calcsize *= dim3 199 self.dims.append(dim3) 200 iDim += 1 201 202 else: 203 logger.debug("No Dim_3 -> it is a 2D image") 204 iDim = None 205 if self._bytecode is None: 206 if "DATATYPE" in self.capsHeader: 207 self._bytecode = DATA_TYPES[self.header[self.capsHeader['DATATYPE']]] 208 else: 209 self._bytecode = numpy.uint16 210 logger.warning("Defaulting type to uint16") 211 self.bpp = len(numpy.array(0, self._bytecode).tostring()) 212 calcsize *= self.bpp 213 if (self.size is None): 214 self.size = calcsize 215 elif (self.size != calcsize): 216 if ("COMPRESSION" in self.capsHeader) and (self.header[self.capsHeader['COMPRESSION']].upper().startswith("NO")): 217 logger.info("Mismatch between the expected size %s and the calculated one %s" % (self.size, calcsize)) 218 self.size = calcsize 219 220 for i, n in enumerate(self.dims): 221 setattr(self, "dim%i" % (i + 1), n) 222 223 return self.size
        224 225
        226 - def swap_needed(self):
        227 """ 228 Decide if we need to byteswap 229 """ 230 if ('Low' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ 231 ('High' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): 232 return False 233 if ('High' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ 234 ('Low' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): 235 if self.bpp in [2, 4, 8]: 236 return True 237 else: 238 return False
        239 240
        241 - def getData(self):
        242 """ 243 Unpack a binary blob according to the specification given in the header 244 245 @return: dataset as numpy.ndarray 246 """ 247 data = None 248 if self._data is not None: 249 data = self._data 250 elif self.file is None: 251 data = self._data 252 else: 253 if self._bytecode is None: 254 if "DATATYPE" in self.capsHeader: 255 self._bytecode = DATA_TYPES[self.header[self.capsHeader["DATATYPE"]]] 256 else: 257 self._bytecode = numpy.uint16 258 dims = self.dims[:] 259 dims.reverse() 260 with self.file.lock: 261 if self.file.closed: 262 logger.error("file: %s from %s is closed. Cannot read data." % (self.file, self.file.filename)) 263 return 264 else: 265 self.file.seek(self.start) 266 fileData = self.file.read(self.size) 267 268 if ("COMPRESSION" in self.capsHeader): 269 compression = self.header[self.capsHeader["COMPRESSION"]].upper() 270 uncompressed_size = self.bpp 271 for i in dims: 272 uncompressed_size *= i 273 if "OFFSET" in compression : 274 try: 275 import byte_offset#IGNORE:F0401 276 except ImportError, error: 277 logger.error("Unimplemented compression scheme: %s (%s)" % (compression, error)) 278 else: 279 myData = byte_offset.analyseCython(fileData, size=uncompressed_size) 280 rawData = myData.astype(self._bytecode).tostring() 281 self.size = uncompressed_size 282 elif compression == "NONE": 283 rawData = fileData 284 elif "GZIP" in compression: 285 rawData = decGzip(fileData) 286 self.size = uncompressed_size 287 elif "BZ" in compression : 288 rawData = decBzip2(fileData) 289 self.size = uncompressed_size 290 elif "Z" in compression : 291 rawData = decZlib(fileData) 292 self.size = uncompressed_size 293 else: 294 logger.warning("Unknown compression scheme %s" % compression) 295 rawData = fileData 296 297 else: 298 rawData = fileData 299 300 expected = self.size 301 obtained = len(rawData) 302 if expected > obtained: 303 logger.error("Data stream is incomplete: %s < expected %s bytes" % (obtained, expected)) 304 rawData += "\x00" * (expected - obtained) 305 elif expected < len(rawData): 306 logger.info("Data stream contains trailing junk : %s > expected %s bytes" % (obtained, expected)) 307 rawData = rawData[:expected] 308 if self.swap_needed(): 309 data = numpy.fromstring(rawData, self._bytecode).byteswap().reshape(tuple(dims)) 310 else: 311 data = numpy.fromstring(rawData, self._bytecode).reshape(tuple(dims)) 312 self._data = data 313 self._bytecode = data.dtype.type 314 return data
        315 - def setData(self, npa=None):
        316 """Setter for data in edf frame""" 317 self._data = npa
        318 data = property(getData, setData, "property: (edf)frame.data, uncompress the datablock when needed")
        319 - def getByteCode(self):
        320 if self._bytecode is None: 321 self._bytecode = self.data.dtype.type 322 323 return self._bytecode
        324 - def setByteCode(self, _iVal):
        325 self._bytecode = _iVal
        326 bytecode = property(getByteCode, setByteCode) 327
        328 - def getEdfBlock(self, force_type=None, fit2dMode=False):
        329 """ 330 @param force_type: type of the dataset to be enforced like "float64" or "uint16" 331 @type force_type: string or numpy.dtype 332 @param fit2dMode: enforce compatibility with fit2d and starts countimg number of images at 1 333 @type fit2dMode: boolean 334 @return: ascii header block 335 @rtype: python string with the concatenation of the ascii header and the binary data block 336 """ 337 if force_type is not None: 338 data = self.data.astype(force_type) 339 else: 340 data = self.data 341 fit2dMode = bool(fit2dMode) 342 for key in self.header: 343 KEY = key.upper() 344 if KEY not in self.capsHeader: 345 self.capsHeader[KEY] = key 346 if key not in self.header_keys: 347 self.header_keys.append(key) 348 349 header = self.header.copy() 350 header_keys = self.header_keys[:] 351 capsHeader = self.capsHeader.copy() 352 353 listHeader = ["{\n"] 354 # First of all clean up the headers: 355 for i in capsHeader: 356 if "DIM_" in i: 357 header.pop(capsHeader[i]) 358 header_keys.remove(capsHeader[i]) 359 for KEY in ["SIZE", "EDF_BINARYSIZE", "EDF_HEADERSIZE", "BYTEORDER", "DATATYPE", "HEADERID", "IMAGE"]: 360 if KEY in capsHeader: 361 header.pop(capsHeader[KEY]) 362 header_keys.remove(capsHeader[KEY]) 363 if "EDF_DATABLOCKID" in capsHeader: 364 header_keys.remove(capsHeader["EDF_DATABLOCKID"]) 365 #but do not remove the value from dict, instead reset the key ... 366 if capsHeader["EDF_DATABLOCKID"] != "EDF_DataBlockID": 367 header["EDF_DataBlockID"] = header.pop(capsHeader["EDF_DATABLOCKID"]) 368 capsHeader["EDF_DATABLOCKID"] = "EDF_DataBlockID" 369 370 # Then update static headers freshly deleted 371 header_keys.insert(0, "Size") 372 header["Size"] = len(data.tostring()) 373 header_keys.insert(0, "HeaderID") 374 header["HeaderID"] = "EH:%06d:000000:000000" % (self.iFrame + fit2dMode) 375 header_keys.insert(0, "Image") 376 header["Image"] = str(self.iFrame + fit2dMode) 377 378 dims = list(data.shape) 379 nbdim = len(dims) 380 for i in dims: 381 key = "Dim_%i" % nbdim 382 header[key] = i 383 header_keys.insert(0, key) 384 nbdim -= 1 385 header_keys.insert(0, "DataType") 386 header["DataType"] = NUMPY_EDF_DTYPE[str(numpy.dtype(data.dtype))] 387 header_keys.insert(0, "ByteOrder") 388 if numpy.little_endian: 389 header["ByteOrder"] = "LowByteFirst" 390 else: 391 header["ByteOrder"] = "HighByteFirst" 392 approxHeaderSize = 100 393 for key in header: 394 approxHeaderSize += 7 + len(key) + len(str(header[key])) 395 approxHeaderSize = BLOCKSIZE * (approxHeaderSize // BLOCKSIZE + 1) 396 header_keys.insert(0, "EDF_HeaderSize") 397 header["EDF_HeaderSize"] = str(BLOCKSIZE * (approxHeaderSize // BLOCKSIZE + 1)) 398 header_keys.insert(0, "EDF_BinarySize") 399 header["EDF_BinarySize"] = len(data.tostring()) 400 header_keys.insert(0, "EDF_DataBlockID") 401 if not "EDF_DataBlockID" in header: 402 header["EDF_DataBlockID"] = "%i.Image.Psd" % (self.iFrame + fit2dMode) 403 preciseSize = 4 #2 before {\n 2 after }\n 404 for key in header_keys: 405 #Escape keys or values that are no ascii 406 strKey = str(key) 407 if not isAscii(strKey, listExcluded=["}", "{"]): 408 logger.warning("Non ascii key %s, skipping" % strKey) 409 continue 410 strValue = str(header[key]) 411 if not isAscii(strValue, listExcluded=["}", "{"]): 412 logger.warning("Non ascii value %s, skipping" % strValue) 413 continue 414 line = strKey + " = " + strValue + " ;\n" 415 preciseSize += len(line) 416 listHeader.append(line) 417 if preciseSize > approxHeaderSize: 418 logger.error("I expected the header block only at %s in fact it is %s" % (approxHeaderSize, preciseSize)) 419 for idx, line in enumerate(listHeader[:]): 420 if line.startswith("EDF_HeaderSize"): 421 headerSize = BLOCKSIZE * (preciseSize // BLOCKSIZE + 1) 422 newline = "EDF_HeaderSize = %s ;\n" % headerSize 423 delta = len(newline) - len(line) 424 if (preciseSize // BLOCKSIZE) != ((preciseSize + delta) // BLOCKSIZE): 425 headerSize = BLOCKSIZE * ((preciseSize + delta) // BLOCKSIZE + 1) 426 newline = "EDF_HeaderSize = %s ;\n" % headerSize 427 preciseSize = preciseSize + delta 428 listHeader[idx] = newline 429 break 430 else: 431 headerSize = approxHeaderSize 432 listHeader.append(" "*(headerSize - preciseSize) + "}\n") 433 return "".join(listHeader) + data.tostring()
        434
        435 436 437 -class edfimage(fabioimage):
        438 """ Read and try to write the ESRF edf data format """ 439
        440 - def __init__(self, data=None , header=None, header_keys=None, frames=None):
        441 self.currentframe = 0 442 self.filesize = None 443 try: 444 dim = len(data.shape) 445 except Exception, error: #IGNORE:W0703 446 logger.debug("Data don't look like a numpy array (%s), resetting all!!" % error) 447 data = None 448 dim = 0 449 fabioimage.__init__(self, data, header) 450 if dim == 2: 451 fabioimage.__init__(self, data, header) 452 elif dim == 1 : 453 data.shape = (0, len(data)) 454 fabioimage.__init__(self, data, header) 455 elif dim == 3 : 456 fabioimage.__init__(self, data[0, :, :], header) 457 elif dim == 4 : 458 fabioimage.__init__(self, data[0, 0, :, :], header) 459 elif dim == 5 : 460 fabioimage.__init__(self, data[0, 0, 0, :, :], header) 461 462 if frames is None: 463 frame = Frame(data=self.data, header=self.header, 464 header_keys=header_keys , 465 number=self.currentframe) 466 self.__frames = [frame] 467 else: 468 self.__frames = frames
        469 470 @staticmethod
        471 - def checkHeader(header=None):
        472 """ 473 Empty for fabioimage but may be populated by others classes 474 """ 475 if type(header) != types.DictionaryType: 476 return {} 477 new = {} 478 for key, value in header.items(): 479 new[toAscii(key, ";{}")] = toAscii(value, ";{}") 480 return new
        481 482 @staticmethod
        483 - def _readHeaderBlock(infile):
        484 """ 485 Read in a header in some EDF format from an already open file 486 487 @param infile: file object open in read mode 488 @return: string (or None if no header was found. 489 """ 490 491 block = infile.read(BLOCKSIZE) 492 if len(block) < BLOCKSIZE: 493 logger.debug("Under-short header: only %i bytes in %s" % (len(block), infile.name)) 494 return 495 if (block.find("{") < 0) : 496 # This does not look like an edf file 497 logger.warning("no opening {. Corrupt header of EDF file %s" % infile.name) 498 return 499 while '}' not in block: 500 block = block + infile.read(BLOCKSIZE) 501 if len(block) > BLOCKSIZE * 20: 502 logger.warning("Runaway header in EDF file") 503 return 504 start = block.find("{") + 1 505 end = block.find("}") 506 507 # Now it is essential to go to the start of the binary part 508 if block[end: end + 3] == "}\r\n": 509 offset = end + 3 - len(block) 510 elif block[end: end + 2] == "}\n": 511 offset = end + 2 - len(block) 512 else: 513 logger.error("Unable to locate start of the binary section") 514 offset = None 515 if offset is not None: 516 infile.seek(offset, os.SEEK_CUR) 517 return block[start:end]
        518 519
        520 - def _readheader(self, infile):
        521 """ 522 Read all headers in a file and populate self.header 523 data is not yet populated 524 @type infile: file object open in read mode 525 """ 526 self.__frames = [] 527 bContinue = True 528 while bContinue: 529 block = self._readHeaderBlock(infile) 530 if block is None: 531 bContinue = False 532 break 533 frame = Frame(number=self.nframes) 534 size = frame.parseheader(block) 535 frame.file = infile 536 frame.start = infile.tell() 537 frame.size = size 538 self.__frames += [frame] 539 try: 540 infile.seek(size, os.SEEK_CUR) 541 except Exception, error: 542 logger.warning("infile is %s" % infile) 543 logger.warning("Position is %s" % infile.tell()) 544 logger.warning("size is %s" % size) 545 logger.error("It seams this error occurs under windows when reading a (large-) file over network: %s ", error) 546 raise Exception(error) 547 548 if frame.start + size > infile.size: 549 logger.warning("Non complete datablock: got %s, expected %s" % (infile.size - frame.start, size)) 550 bContinue = False 551 break 552 553 for i, frame in enumerate(self.__frames): 554 missing = [] 555 for item in MINIMUM_KEYS: 556 if item not in frame.capsHeader: 557 missing.append(item) 558 if len(missing) > 0: 559 logger.info("EDF file %s frame %i misses mandatory keys: %s " % (self.filename, i, " ".join(missing))) 560 self.currentframe = 0
        561 562
        563 - def read(self, fname, frame=None):
        564 """ 565 Read in header into self.header and 566 the data into self.data 567 """ 568 self.resetvals() 569 self.filename = fname 570 571 infile = self._open(fname, "rb") 572 self._readheader(infile) 573 if frame is None: 574 pass 575 elif frame < self.nframes: 576 self = self.getframe(frame) 577 else: 578 logger.error("Reading file %s You requested frame %s but only %s frames are available", fname, frame, self.nframes) 579 self.resetvals() 580 # ensure the PIL image is reset 581 self.pilimage = None 582 return self
        583
        584 - def swap_needed(self):
        585 """ 586 Decide if we need to byteswap 587 """ 588 if ('Low' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ 589 ('High' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): 590 return False 591 if ('High' in self.header[self.capsHeader['BYTEORDER']] and numpy.little_endian) or \ 592 ('Low' in self.header[self.capsHeader['BYTEORDER']] and not numpy.little_endian): 593 if self.bpp in [2, 4, 8]: 594 return True 595 else: 596 return False
        597
        598 - def unpack(self):
        599 """ 600 Unpack a binary blob according to the specification given in the header and return the dataset 601 602 @return: dataset as numpy.ndarray 603 """ 604 return self.__frames[self.currentframe].getData()
        605 606
        607 - def getframe(self, num):
        608 """ returns the file numbered 'num' in the series as a fabioimage """ 609 newImage = None 610 if self.nframes == 1: 611 logger.debug("Single frame EDF; having fabioimage default behavour: %s" % num) 612 newImage = fabioimage.getframe(self, num) 613 elif num in xrange(self.nframes): 614 logger.debug("Multi frame EDF; having edfimage specific behavour: %s/%s" % (num, self.nframes)) 615 newImage = edfimage(frames=self.__frames) 616 newImage.currentframe = num 617 newImage.filename = self.filename 618 else: 619 txt = "Cannot access frame: %s/%s" % (num, self.nframes) 620 logger.error(txt) 621 raise ValueError("edfimage.getframe:" + txt) 622 return newImage
        623 624
        625 - def previous(self):
        626 """ returns the previous file in the series as a fabioimage """ 627 newImage = None 628 if self.nframes == 1: 629 newImage = fabioimage.previous(self) 630 else: 631 newFrameId = self.currentframe - 1 632 newImage = self.getframe(newFrameId) 633 return newImage
        634 635
        636 - def next(self):
        637 """ returns the next file in the series as a fabioimage """ 638 newImage = None 639 if self.nframes == 1: 640 newImage = fabioimage.next(self) 641 else: 642 newFrameId = self.currentframe + 1 643 newImage = self.getframe(newFrameId) 644 return newImage
        645 646
        647 - def write(self, fname, force_type=None, fit2dMode=False):
        648 """ 649 Try to write a file 650 check we can write zipped also 651 mimics that fabian was writing uint16 (we sometimes want floats) 652 653 @param force_type: can be numpy.uint16 or simply "float" 654 @return: None 655 656 """ 657 658 outfile = self._open(fname, mode="wb") 659 for i, frame in enumerate(self.__frames): 660 frame.iFrame = i 661 outfile.write(frame.getEdfBlock(force_type=force_type, fit2dMode=fit2dMode)) 662 outfile.close()
        663 664
        665 - def appendFrame(self, frame=None, data=None, header=None):
        666 """ 667 Method used add a frame to an EDF file 668 @param frame: frame to append to edf image 669 @type frame: instance of Frame 670 @return: None 671 """ 672 if isinstance(frame, Frame): 673 self.__frames.append(frame) 674 else: 675 self.__frames.append(Frame(data, header))
        676 677
        678 - def deleteFrame(self, frameNb=None):
        679 """ 680 Method used to remove a frame from an EDF image. by default the last one is removed. 681 @param frameNb: frame number to remove, by default the last. 682 @type frameNb: integer 683 @return: None 684 """ 685 if frameNb is None: 686 self.__frames.pop() 687 else: 688 self.__frames.pop(frameNb)
        689
        690 - def fastReadData(self, filename=None):
        691 """ 692 This is a special method that will read and return the data from another file ... 693 The aim is performances, ... but only supports uncompressed files. 694 695 @return: data from another file using positions from current edfimage 696 """ 697 if (filename is None) or not os.path.isfile(filename): 698 raise RuntimeError("edfimage.fastReadData is only valid with another file: %s does not exist" % (filename)) 699 data = None 700 frame = self.__frames[self.currentframe] 701 with open(filename, "rb")as f: 702 f.seek(frame.start) 703 raw = f.read(frame.size) 704 try: 705 data = numpy.fromstring(raw, dtype=self.bytecode) 706 data.shape = self.data.shape 707 except Exception, err : 708 logger.error("unable to convert file content to numpy array: %s", err) 709 return data
        710
        711 - def fastReadROI(self, filename, coords=None):
        712 """ 713 Method reading Region of Interest of another file based on metadata available in current edfimage. 714 The aim is performances, ... but only supports uncompressed files. 715 716 @return: ROI-data from another file using positions from current edfimage 717 @rtype: numpy 2darray 718 """ 719 if (filename is None) or not os.path.isfile(filename): 720 raise RuntimeError("edfimage.fastReadData is only valid with another file: %s does not exist" % (filename)) 721 data = None 722 frame = self.__frames[self.currentframe] 723 724 if len(coords) == 4: 725 slice1 = self.make_slice(coords) 726 elif len(coords) == 2 and isinstance(coords[0], slice) and \ 727 isinstance(coords[1], slice): 728 slice1 = coords 729 else: 730 logger.warning('readROI: Unable to understand Region Of Interest: got %s', coords) 731 return 732 d1 = self.data.shape[-1] 733 start0 = slice1[0].start 734 start1 = slice1[1].start 735 slice2 = (slice(0, slice1[0].stop - start0, slice1[0].step), 736 slice(0, slice1[1].stop - start1, slice1[1].step)) 737 start = frame.start + self.bpp * (d1 * start0 + start1) 738 size = self.bpp * ((slice2[0].stop) * d1) 739 with open(filename, "rb")as f: 740 f.seek(start) 741 raw = f.read(size) 742 try: 743 data = numpy.fromstring(raw, dtype=self.bytecode) 744 data.shape = -1, d1 745 except Exception, err : 746 logger.error("unable to convert file content to numpy array: %s", err) 747 return data[slice2]
        748 749 750 ################################################################################ 751 # Properties definition for header, data, header_keys and capsHeader 752 ################################################################################
        753 - def getNbFrames(self):
        754 """ 755 Getter for number of frames 756 """ 757 return len(self.__frames)
        758 - def setNbFrames(self, val):
        759 """ 760 Setter for number of frames ... should do nothing. Here just to avoid bugs 761 """ 762 if val != len(self.__frames): 763 logger.warning("trying to set the number of frames ")
        764 nframes = property(getNbFrames, setNbFrames, "property: number of frames in EDF file") 765 766
        767 - def getHeader(self):
        768 """ 769 Getter for the headers. used by the property header, 770 """ 771 return self.__frames[self.currentframe].header
        772 - def setHeader(self, _dictHeader):
        773 """ 774 Enforces the propagation of the header to the list of frames 775 """ 776 try: 777 self.__frames[self.currentframe].header = _dictHeader 778 except AttributeError: 779 self.__frames = [Frame(header=_dictHeader)] 780 except IndexError: 781 if self.currentframe < len(self.__frames): 782 self.__frames.append(Frame(header=_dictHeader))
        783 - def delHeader(self):
        784 """ 785 Deleter for edf header 786 """ 787 self.__frames[self.currentframe].header = {}
        788 header = property(getHeader, setHeader, delHeader, "property: header of EDF file") 789
        790 - def getHeaderKeys(self):
        791 """ 792 Getter for edf header_keys 793 """ 794 return self.__frames[self.currentframe].header_keys
        795 - def setHeaderKeys(self, _listtHeader):
        796 """ 797 Enforces the propagation of the header_keys to the list of frames 798 @param _listtHeader: list of the (ordered) keys in the header 799 @type _listtHeader: python list 800 """ 801 try: 802 self.__frames[self.currentframe].header_keys = _listtHeader 803 except AttributeError: 804 self.__frames = [Frame(header_keys=_listtHeader)] 805 except IndexError: 806 if self.currentframe < len(self.__frames): 807 self.__frames.append(Frame(header_keys=_listtHeader))
        808 - def delHeaderKeys(self):
        809 """ 810 Deleter for edf header_keys 811 """ 812 self.__frames[self.currentframe].header_keys = []
        813 header_keys = property(getHeaderKeys, setHeaderKeys, delHeaderKeys, "property: header_keys of EDF file") 814
        815 - def getData(self):
        816 """ 817 getter for edf Data 818 @return: data for current frame 819 @rtype: numpy.ndarray 820 """ 821 npaData = None 822 try: 823 npaData = self.__frames[self.currentframe].data 824 except AttributeError: 825 self.__frames = [Frame()] 826 npaData = self.__frames[self.currentframe].data 827 except IndexError: 828 if self.currentframe < len(self.__frames): 829 self.__frames.append(Frame()) 830 npaData = self.__frames[self.currentframe].data 831 return npaData
        832
        833 - def setData(self, _data):
        834 """ 835 Enforces the propagation of the data to the list of frames 836 @param _data: numpy array representing data 837 """ 838 try: 839 self.__frames[self.currentframe].data = _data 840 except AttributeError: 841 self.__frames = [Frame(data=_data)] 842 except IndexError: 843 if self.currentframe < len(self.__frames): 844 self.__frames.append(Frame(data=_data))
        845 - def delData(self):
        846 """ 847 deleter for edf Data 848 """ 849 self.__frames[self.currentframe].data = None
        850 data = property(getData, setData, delData, "property: data of EDF file") 851
        852 - def getCapsHeader(self):
        853 """ 854 getter for edf headers keys in upper case 855 @return: data for current frame 856 @rtype: dict 857 """ 858 return self.__frames[self.currentframe].capsHeader
        859 - def setCapsHeader(self, _data):
        860 """ 861 Enforces the propagation of the header_keys to the list of frames 862 @param _data: numpy array representing data 863 """ 864 self.__frames[self.currentframe].capsHeader = _data
        865 - def delCapsHeader(self):
        866 """ 867 deleter for edf capsHeader 868 """ 869 self.__frames[self.currentframe].capsHeader = {}
        870 capsHeader = property(getCapsHeader, setCapsHeader, delCapsHeader, "property: capsHeader of EDF file, i.e. the keys of the header in UPPER case.") 871
        872 - def getDim1(self):
        873 return self.__frames[self.currentframe].dim1
        874 - def setDim1(self, _iVal):
        875 try: 876 self.__frames[self.currentframe].dim1 = _iVal 877 except AttributeError: 878 self.__frames = [Frame()] 879 except IndexError: 880 if self.currentframe < len(self.__frames): 881 self.__frames.append(Frame()) 882 self.__frames[self.currentframe].dim1 = _iVal
        883 dim1 = property(getDim1, setDim1)
        884 - def getDim2(self):
        885 return self.__frames[self.currentframe].dim2
        886 - def setDim2(self, _iVal):
        887 try: 888 self.__frames[self.currentframe].dim2 = _iVal 889 except AttributeError: 890 self.__frames = [Frame()] 891 except IndexError: 892 if self.currentframe < len(self.__frames): 893 self.__frames.append(Frame()) 894 self.__frames[self.currentframe].dim2 = _iVal
        895 dim2 = property(getDim2, setDim2) 896
        897 - def getDims(self):
        898 return self.__frames[self.currentframe].dims
        899 dims = property(getDims)
        900 - def getByteCode(self):
        901 return self.__frames[self.currentframe].bytecode
        902 - def setByteCode(self, _iVal):
        903 try: 904 self.__frames[self.currentframe].bytecode = _iVal 905 except AttributeError: 906 self.__frames = [Frame()] 907 except IndexError: 908 if self.currentframe < len(self.__frames): 909 self.__frames.append(Frame()) 910 self.__frames[self.currentframe].bytecode = _iVal
        911 bytecode = property(getByteCode, setByteCode)
        912 - def getBpp(self):
        913 return self.__frames[self.currentframe].bpp
        914 - def setBpp(self, _iVal):
        915 try: 916 self.__frames[self.currentframe].bpp = _iVal 917 except AttributeError: 918 self.__frames = [Frame()] 919 except IndexError: 920 if self.currentframe < len(self.__frames): 921 self.__frames.append(Frame()) 922 self.__frames[self.currentframe].bpp = _iVal
        923 bpp = property(getBpp, setBpp)
        924

        fabio-0.1.3/epydoc/toc-fabio.dm3image-module.html0000644000175000017500000000274312120434325022345 0ustar jeromejerome00000000000000 dm3image

        Module dm3image


        Classes

        dm3image

        Variables

        DATA_BYTES
        DATA_TYPES
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.cbfimage.cbfimage-class.html0000644000175000017500000005546712126623347023232 0ustar jeromejerome00000000000000 fabio.cbfimage.cbfimage
        Package fabio :: Module cbfimage :: Class cbfimage
        [hide private]
        [frames] | no frames]

        Class cbfimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               cbfimage
        

        Read the Cif Binary File data format

        Instance Methods [hide private]
         
        __init__(self, data=None, header=None, fname=None)
        Constructor of the class CIF Binary File reader.
        source code
         
        _readheader(self, inStream)
        Read in a header in some CBF format from a string representing binary stuff
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code
        numpy array
        _readbinary_byte_offset(self, inStream)
        Read in a binary part of an x-CBF_BYTE_OFFSET compressed image
        source code
         
        write(self, fname)
        write the file in CBF format
        source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        checkData(data=None)
        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers
        source code

        Inherited from fabioimage.fabioimage: checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, data=None, header=None, fname=None)
        (Constructor)

        source code 

        Constructor of the class CIF Binary File reader.

        Parameters:
        • _strFilename (string) - the name of the file to open
        Overrides: object.__init__

        checkData(data=None)
        Static Method

        source code 

        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers

        Overrides: fabioimage.fabioimage.checkData
        (inherited documentation)

        _readheader(self, inStream)

        source code 

        Read in a header in some CBF format from a string representing binary stuff

        Parameters:
        • inStream (opened file.) - file containing the Cif Binary part.
        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        _readbinary_byte_offset(self, inStream)

        source code 

        Read in a binary part of an x-CBF_BYTE_OFFSET compressed image

        Parameters:
        • inStream (python string.) - the binary image (without any CIF decorators)
        Returns: numpy array
        a linear numpy array without shape and dtype set

        write(self, fname)

        source code 

        write the file in CBF format

        Parameters:
        • fname - name of the file
        Overrides: fabioimage.fabioimage.write

        fabio-0.1.3/epydoc/toc-fabio.mytest-module.html0000644000175000017500000000170512120434325022201 0ustar jeromejerome00000000000000 mytest

        Module mytest



        [hide private] fabio-0.1.3/epydoc/toc-fabio.fit2dmaskimage-module.html0000644000175000017500000000235412120434325023544 0ustar jeromejerome00000000000000 fit2dmaskimage

        Module fit2dmaskimage


        Classes

        fit2dmaskimage

        Variables

        __package__

        [hide private] fabio-0.1.3/epydoc/toc-fabio-module.html0000644000175000017500000000235012126623347020664 0ustar jeromejerome00000000000000 fabio

        Module fabio


        Variables

        __package__
        __status__
        version

        [hide private] fabio-0.1.3/epydoc/fabio.binaryimage-module.html0000644000175000017500000002136312126623347022374 0ustar jeromejerome00000000000000 fabio.binaryimage
        Package fabio :: Module binaryimage
        [hide private]
        [frames] | no frames]

        Module binaryimage

        source code

        Authors: Gael Goret, Jerome Kieffer, ESRF, France Emails: gael.goret@esrf.fr, jerome.kieffer@esrf.fr

        Binary files images are simple none-compressed 2D images only defined by their : data-type, dimensions, byte order and offset

        This simple library has been made for manipulating exotic/unknown files format.


        Version: 17 Apr 2012

        Authors:
        Ga\xc3\xabl Goret, J\xc3\xa9r\xc3\xb4me Kieffer

        Contact: gael.goret@esrf.fr

        Copyright: European Synchrotron Radiation Facility, Grenoble, France

        License: GPLv3+

        Classes [hide private]
          binaryimage
        This simple library has been made for manipulating exotic/unknown files format.
        Variables [hide private]
          __doc__ = ...
          logger = logging.getLogger("binaryimage")
          __package__ = 'fabio'
        Variables Details [hide private]

        __doc__

        Value:
        """
        Authors: Gael Goret, Jerome Kieffer, ESRF, France
        Emails: gael.goret@esrf.fr, jerome.kieffer@esrf.fr
        
        Binary files images are simple none-compressed 2D images only defined \
        by their : 
        data-type, dimensions, byte order and offset
        
        ...
        

        fabio-0.1.3/epydoc/fabio.GEimage-pysrc.html0000644000175000017500000035022312126623347021256 0ustar jeromejerome00000000000000 fabio.GEimage
        Package fabio :: Module GEimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.GEimage

          1  #!/usr/bin/env python
         
          2  
         
          3  #
         
          4  # Reads the header from a GE a-Si Angio Detector
         
          5  # Using version 8001 of the header from file:
         
          6  #     c:\adept\core\DefaultImageInfoConfig.csv
         
          7  #
         
          8  #  Antonino Miceli
         
          9  #  Thu Jan  4 13:46:31 CST 2007
         
         10  #
         
         11  
         
         12  # modifications by Jon Wright for style, pychecker and fabio
         
         13  # 
         
         14  
         
         15  import numpy 
         16  import struct, logging 
         17  logger = logging.getLogger("GEimage") 
         18  from fabioimage import fabioimage 
         19  from fabioutils import next_filename, previous_filename 
         20  
         
         21  GE_HEADER_INFO = [
         
         22      # Name, length in bytes, format for struct (None means string)
         
         23      ('ImageFormat', 10, None),
         
         24      ('VersionOfStandardHeader', 2, '=H'),
         
         25      ('StandardHeaderSizeInBytes', 4, '=L'),
         
         26      ('VersionOfUserHeader', 2, '=H'),
         
         27      ('UserHeaderSizeInBytes', 4, '=L'),
         
         28      ('NumberOfFrames', 2, '=H'),
         
         29      ('NumberOfRowsInFrame', 2, '=H'),
         
         30      ('NumberOfColsInFrame', 2, '=H'),
         
         31      ('ImageDepthInBits', 2, '=H'),
         
         32      ('AcquisitionDate', 20, None),
         
         33      ('AcquisitionTime', 20, None),
         
         34      ('DUTID', 20, None),
         
         35      ('Operator', 50, None),
         
         36      ('DetectorSignature', 20, None),
         
         37      ('TestSystemName', 20, None),
         
         38      ('TestStationRevision', 20, None),
         
         39      ('CoreBundleRevision', 20, None),
         
         40      ('AcquisitionName', 40, None),
         
         41      ('AcquisitionParameterRevision', 20, None),
         
         42      ('OriginalNumberOfRows', 2, '=H'),
         
         43      ('OriginalNumberOfColumns', 2, '=H'),
         
         44      ('RowNumberUpperLeftPointArchiveROI', 2, '=H'),
         
         45      ('ColNumberUpperLeftPointArchiveROI', 2, '=H'),
         
         46      ('Swapped', 2, '=H'),
         
         47      ('Reordered', 2, '=H'),
         
         48      ('HorizontalFlipped', 2, '=H'),
         
         49      ('VerticalFlipped', 2, '=H'),
         
         50      ('WindowValueDesired', 2, '=H'),
         
         51      ('LevelValueDesired', 2, '=H'),
         
         52      ('AcquisitionMode', 2, '=H'),
         
         53      ('AcquisitionType', 2, '=H'),
         
         54      ('UserAcquisitionCoffFileName1', 100, None),
         
         55      ('UserAcquisitionCoffFileName2', 100, None),
         
         56      ('FramesBeforeExpose', 2, '=H'),
         
         57      ('FramesDuringExpose', 2, '=H'),
         
         58      ('FramesAfterExpose', 2, '=H'),
         
         59      ('IntervalBetweenFrames', 2, '=H'),
         
         60      ('ExposeTimeDelayInMicrosecs', 8, '=d'),
         
         61      ('TimeBetweenFramesInMicrosecs', 8, '=d'),
         
         62      ('FramesToSkipExpose', 2, '=H'),
         
         63      ('ExposureMode', 2, '=H'),
         
         64      ('PrepPresetTimeInMicrosecs', 8, '=d'),
         
         65      ('ExposePresetTimeInMicrosecs', 8, '=d'),
         
         66      ('AcquisitionFrameRateInFps', 4, '=f'),
         
         67      ('FOVSelect', 2, '=H'),
         
         68      ('ExpertMode', 2, '=H'),
         
         69      ('SetVCommon1', 8, '=d'),
         
         70      ('SetVCommon2', 8, '=d'),
         
         71      ('SetAREF', 8, '=d'),
         
         72      ('SetAREFTrim', 4, '=L'),
         
         73      ('SetSpareVoltageSource', 8, '=d'),
         
         74      ('SetCompensationVoltageSource', 8, '=d'),
         
         75      ('SetRowOffVoltage', 8, '=d'),
         
         76      ('SetRowOnVoltage', 8, '=d'),
         
         77      ('StoreCompensationVoltage', 4, '=L'),
         
         78      ('RampSelection', 2, '=H'),
         
         79      ('TimingMode', 2, '=H'),
         
         80      ('Bandwidth', 2, '=H'),
         
         81      ('ARCIntegrator', 2, '=H'),
         
         82      ('ARCPostIntegrator', 2, '=H'),
         
         83      ('NumberOfRows', 4, '=L'),
         
         84      ('RowEnable', 2, '=H'),
         
         85      ('EnableStretch', 2, '=H'),
         
         86      ('CompEnable', 2, '=H'),
         
         87      ('CompStretch', 2, '=H'),
         
         88      ('LeftEvenTristate', 2, '=H'),
         
         89      ('RightOddTristate', 2, '=H'),
         
         90      ('TestModeSelect', 4, '=L'),
         
         91      ('AnalogTestSource', 4, '=L'),
         
         92      ('VCommonSelect', 4, '=L'),
         
         93      ('DRCColumnSum', 4, '=L'),
         
         94      ('TestPatternFrameDelta', 4, '=L'),
         
         95      ('TestPatternRowDelta', 4, '=L'),
         
         96      ('TestPatternColumnDelta', 4, '=L'),
         
         97      ('DetectorHorizontalFlip', 2, '=H'),
         
         98      ('DetectorVerticalFlip', 2, '=H'),
         
         99      ('DFNAutoScrubOnOff', 2, '=H'),
         
        100      ('FiberChannelTimeOutInMicrosecs', 4, '=L'),
         
        101      ('DFNAutoScrubDelayInMicrosecs', 4, '=L'),
         
        102      ('StoreAECROI', 2, '=H'),
         
        103      ('TestPatternSaturationValue', 2, '=H'),
         
        104      ('TestPatternSeed', 4, '=L'),
         
        105      ('ExposureTimeInMillisecs', 4, '=f'),
         
        106      ('FrameRateInFps', 4, '=f'),
         
        107      ('kVp', 4, '=f'),
         
        108      ('mA', 4, '=f'),
         
        109      ('mAs', 4, '=f'),
         
        110      ('FocalSpotInMM', 4, '=f'),
         
        111      ('GeneratorType', 20, None),
         
        112      ('StrobeIntensityInFtL', 4, '=f'),
         
        113      ('NDFilterSelection', 2, '=H'),
         
        114      ('RefRegTemp1', 8, '=d'),
         
        115      ('RefRegTemp2', 8, '=d'),
         
        116      ('RefRegTemp3', 8, '=d'),
         
        117      ('Humidity1', 4, '=f'),
         
        118      ('Humidity2', 4, '=f'),
         
        119      ('DetectorControlTemp', 8, '=d'),
         
        120      ('DoseValueInmR', 8, '=d'),
         
        121      ('TargetLevelROIRow0', 2, '=H'),
         
        122      ('TargetLevelROICol0', 2, '=H'),
         
        123      ('TargetLevelROIRow1', 2, '=H'),
         
        124      ('TargetLevelROICol1', 2, '=H'),
         
        125      ('FrameNumberForTargetLevelROI', 2, '=H'),
         
        126      ('PercentRangeForTargetLevel', 2, '=H'),
         
        127      ('TargetValue', 2, '=H'),
         
        128      ('ComputedMedianValue', 2, '=H'),
         
        129      ('LoadZero', 2, '=H'),
         
        130      ('MaxLUTOut', 2, '=H'),
         
        131      ('MinLUTOut', 2, '=H'),
         
        132      ('MaxLinear', 2, '=H'),
         
        133      ('Reserved', 2, '=H'),
         
        134      ('ElectronsPerCount', 2, '=H'),
         
        135      ('ModeGain', 2, '=H'),
         
        136      ('TemperatureInDegC', 8, '=d'),
         
        137      ('LineRepaired', 2, '=H'),
         
        138      ('LineRepairFileName', 100, None),
         
        139      ('CurrentLongitudinalInMM', 4, '=f'),
         
        140      ('CurrentTransverseInMM', 4, '=f'),
         
        141      ('CurrentCircularInMM', 4, '=f'),
         
        142      ('CurrentFilterSelection', 4, '=L'),
         
        143      ('DisableScrubAck', 2, '=H'),
         
        144      ('ScanModeSelect', 2, '=H'),
         
        145      ('DetectorAppSwVersion', 20, None),
         
        146      ('DetectorNIOSVersion', 20, None),
         
        147      ('DetectorPeripheralSetVersion', 20, None),
         
        148      ('DetectorPhysicalAddress', 20, None),
         
        149      ('PowerDown', 2, '=H'),
         
        150      ('InitialVoltageLevel_VCOMMON', 8, '=d'),
         
        151      ('FinalVoltageLevel_VCOMMON', 8, '=d'),
         
        152      ('DmrCollimatorSpotSize', 10, None),
         
        153      ('DmrTrack', 5, None),
         
        154      ('DmrFilter', 5, None),
         
        155      ('FilterCarousel', 2, '=H'),
         
        156      ('Phantom', 20, None),
         
        157      ('SetEnableHighTime', 2, '=H'),
         
        158      ('SetEnableLowTime', 2, '=H'),
         
        159      ('SetCompHighTime', 2, '=H'),
         
        160      ('SetCompLowTime', 2, '=H'),
         
        161      ('SetSyncLowTime', 2, '=H'),
         
        162      ('SetConvertLowTime', 2, '=H'),
         
        163      ('SetSyncHighTime', 2, '=H'),
         
        164      ('SetEOLTime', 2, '=H'),
         
        165      ('SetRampOffsetTime', 2, '=H'),
         
        166      ('FOVStartingValue', 2, '=H'),
         
        167      ('ColumnBinning', 2, '=H'),
         
        168      ('RowBinning', 2, '=H'),
         
        169      ('BorderColumns64', 2, '=H'),
         
        170      ('BorderRows64', 2, '=H'),
         
        171      ('FETOffRows64', 2, '=H'),
         
        172      ('FOVStartColumn128', 2, '=H'),
         
        173      ('FOVStartRow128', 2, '=H'),
         
        174      ('NumberOfColumns128', 2, '=H'),
         
        175      ('NumberOfRows128', 2, '=H'),
         
        176      ('VFPAquisition', 2000, None),
         
        177      ('Comment', 200, None)
         
        178      ] 
        179  
         
        180  
         
        
        181 -class GEimage(fabioimage):
        182 183 _need_a_seek_to_read = True 184
        185 - def _readheader(self, infile):
        186 """ Read a GE image header """ 187 188 infile.seek(0) 189 190 self.header = {} 191 for name, nbytes, format in GE_HEADER_INFO: 192 if format is None: 193 self.header[ name ] = infile.read(nbytes) 194 else: 195 self.header[ name ] = struct.unpack(format, 196 infile.read(nbytes))[0]
        197
        198 - def read(self, fname, frame=None):
        199 """ 200 Read in header into self.header and 201 the data into self.data 202 """ 203 if frame is None: 204 frame = 0 205 self.header = {} 206 self.resetvals() 207 infile = self._open(fname, "rb") 208 self.sequencefilename = fname 209 self._readheader(infile) 210 self.nframes = self.header['NumberOfFrames'] 211 self._readframe(infile, frame) 212 infile.close() 213 return self
        214
        215 - def _makeframename(self):
        216 """ The thing to be printed for the user to represent a frame inside 217 a file """ 218 self.filename = "%s$%04d" % (self.sequencefilename, 219 self.currentframe)
        220
        221 - def _readframe(self, filepointer, img_num):
        222 """ 223 # Load only one image from the sequence 224 # Note: the first image in the sequence 0 225 # raises an exception if you give an invalid image 226 # otherwise fills in self.data 227 """ 228 if(img_num > self.nframes or img_num < 0): 229 raise Exception("Bad image number") 230 imgstart = self.header['StandardHeaderSizeInBytes'] + \ 231 self.header['UserHeaderSizeInBytes'] + \ 232 img_num * self.header['NumberOfRowsInFrame'] * \ 233 self.header['NumberOfColsInFrame'] * \ 234 self.header['ImageDepthInBits'] / 8 235 # whence = 0 means seek from start of file 236 filepointer.seek(imgstart, 0) 237 238 self.bpp = self.header['ImageDepthInBits'] / 8 # hopefully 2 239 imglength = self.header['NumberOfRowsInFrame'] * \ 240 self.header['NumberOfColsInFrame'] * self.bpp 241 if self.bpp != 2: 242 logging.warning("Using uint16 for GE but seems to be wrong") 243 244 # Guessing it is always unsigned int? 245 self.data = numpy.fromstring(filepointer.read(imglength), numpy.uint16) 246 self.data.shape = (self.header['NumberOfRowsInFrame'], 247 self.header['NumberOfColsInFrame']) 248 self.dim2 , self.dim1 = self.data.shape 249 self.currentframe = int(img_num) 250 self._makeframename()
        251 252
        253 - def write(self, fname, force_type=numpy.uint16):
        254 """ Not yet implemented""" 255 raise Exception("Write is not implemented")
        256
        257 - def getframe(self, num):
        258 """ 259 Returns a frame as a new fabioimage object 260 """ 261 if num < 0 or num > self.nframes: 262 raise Exception("Requested frame number is out of range") 263 # Do a deep copy of the header to make a new one 264 newheader = {} 265 for k in self.header.keys(): 266 newheader[k] = self.header[k] 267 frame = GEimage(header=newheader) 268 frame.nframes = self.nframes 269 frame.sequencefilename = self.sequencefilename 270 infile = frame._open(self.sequencefilename, "rb") 271 frame._readframe(infile, num) 272 infile.close() 273 return frame
        274
        275 - def next(self):
        276 """ 277 Get the next image in a series as a fabio image 278 """ 279 if self.currentframe < (self.nframes - 1) and self.nframes > 1: 280 return self.getframe(self.currentframe + 1) 281 else: 282 newobj = GEimage() 283 newobj.read(next_filename( 284 self.sequencefilename)) 285 return newobj
        286
        287 - def previous(self):
        288 """ 289 Get the previous image in a series as a fabio image 290 """ 291 if self.currentframe > 0: 292 return self.getframe(self.currentframe - 1) 293 else: 294 newobj = GEimage() 295 newobj.read(previous_filename( 296 self.sequencefilename)) 297 return newobj
        298 299
        300 -def demo():
        301 import sys, time 302 303 if len(sys.argv) < 2: 304 print "USAGE: GE_script.py <GEaSi_raw_image_file>" 305 sys.exit() 306 307 image_file = sys.argv[1] 308 309 print "init read_GEaSi_data class and load header.." 310 sequence1 = GEimage() 311 sequence1.read(image_file) 312 313 print "TimeBetweenFramesInMicrosecs = ", 314 print sequence1.header['TimeBetweenFramesInMicrosecs'] 315 print "AcquisitionTime = ", 316 print sequence1.header['AcquisitionTime'] 317 318 319 print "Mean = ", sequence1.data.ravel().mean() 320 321 while 1: 322 start = time.time() 323 try: 324 sequence1 = sequence1.next() 325 print sequence1.currentframe, sequence1.data.ravel().mean(), \ 326 time.time() - start 327 except Exception, ex: 328 raise ex
        329 330 331 332 333 if __name__ == '__main__': 334 demo() 335

        fabio-0.1.3/epydoc/fabio.fit2dmaskimage-module.html0000644000175000017500000001330212126623347022766 0ustar jeromejerome00000000000000 fabio.fit2dmaskimage
        Package fabio :: Module fit2dmaskimage
        [hide private]
        [frames] | no frames]

        Module fit2dmaskimage

        source code

        Author: Andy Hammersley, ESRF Translation into python/fabio: Jon Wright, ESRF

        Classes [hide private]
          fit2dmaskimage
        Read and try to write Andy Hammersley's mask format
        Variables [hide private]
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.kcdimage-pysrc.html0000644000175000017500000015506512126623347021533 0ustar jeromejerome00000000000000 fabio.kcdimage
        Package fabio :: Module kcdimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.kcdimage

          1  #!/usr/bin/env python 
          2  """ 
          3  Authors: Jerome Kieffer, ESRF  
          4           email:jerome.kieffer@esrf.fr 
          5   
          6  kcd images are 2D images written by the old KappaCCD diffractometer built by Nonius in the 1990's 
          7  Based on the edfimage.py parser. 
          8  """ 
          9   
         10  import numpy, logging 
         11  import os, string 
         12  from fabioimage import fabioimage 
         13  logger = logging.getLogger("kcdimage") 
         14   
         15  DATA_TYPES = {"u16"  :  numpy.uint16 } 
         16   
         17  MINIMUM_KEYS = [ 
         18                  'ByteOrder', 
         19                  'Data type', 
         20                  'X dimension', 
         21                  'Y dimension', 
         22                  'Number of readouts'] 
         23   
         24  DEFAULT_VALUES = { "Data type": "u16" } 
        
        25 26 27 28 29 -class kcdimage(fabioimage):
        30 """ 31 Read the Nonius kcd data format """ 32 33
        34 - def _readheader(self, infile):
        35 """ 36 Read in a header in some KCD format from an already open file 37 @ 38 """ 39 oneLine = infile.readline() 40 alphanum = string.digits + string.letters + ". " 41 asciiHeader = True 42 for oneChar in oneLine.strip(): 43 if not oneChar in alphanum: 44 asciiHeader = False 45 46 47 if asciiHeader is False: 48 # This does not look like an edf file 49 logger.warning("First line of %s does not seam to be ascii text!" % infile.name) 50 endOfHeaders = False 51 while not endOfHeaders: 52 oneLine = infile.readline() 53 if len(oneLine) > 100: 54 endOfHeaders = True 55 break 56 if oneLine.strip() == "Binned mode": 57 oneLine = "Mode = Binned" 58 try: 59 key, val = oneLine.split('=' , 1) 60 except: 61 endOfHeaders = True 62 break 63 key = key.strip() 64 self.header_keys.append(key) 65 self.header[key] = val.strip() 66 missing = [] 67 for item in MINIMUM_KEYS: 68 if item not in self.header_keys: 69 missing.append(item) 70 if len(missing) > 0: 71 logger.debug("KCD file misses the keys " + " ".join(missing))
        72 73
        74 - def read(self, fname, frame=None):
        75 """ 76 Read in header into self.header and 77 the data into self.data 78 """ 79 self.header = {} 80 self.resetvals() 81 infile = self._open(fname, "rb") 82 self._readheader(infile) 83 # Compute image size 84 try: 85 self.dim1 = int(self.header['X dimension']) 86 self.dim2 = int(self.header['Y dimension']) 87 except: 88 raise Exception("KCD file %s is corrupt, cannot read it" % fname) 89 try: 90 bytecode = DATA_TYPES[self.header['Data type']] 91 self.bpp = len(numpy.array(0, bytecode).tostring()) 92 except KeyError: 93 bytecode = numpy.uint16 94 self.bpp = 2 95 logger.warning("Defaulting type to uint16") 96 try: 97 nbReadOut = int(self.header['Number of readouts']) 98 except KeyError: 99 logger.warning("Defaulting number of ReadOut to 1") 100 nbReadOut = 1 101 fileSize = os.stat(fname)[6] 102 expected_size = self.dim1 * self.dim2 * self.bpp * nbReadOut 103 infile.seek(fileSize - expected_size) 104 block = infile.read() 105 assert len(block) == expected_size 106 infile.close() 107 108 #now read the data into the array 109 self.data = numpy.zeros((self.dim2, self.dim1)) 110 try: 111 for i in range(nbReadOut): 112 self.data += numpy.reshape(numpy.fromstring( 113 block[i * expected_size / nbReadOut:(i + 1) * expected_size / nbReadOut], bytecode), 114 [self.dim2, self.dim1]) 115 except: 116 print len(block), bytecode, self.bpp, self.dim2, self.dim1 117 raise IOError, \ 118 'Size spec in kcd-header does not match size of image data field' 119 self.bytecode = self.data.dtype.type 120 self.resetvals() 121 # ensure the PIL image is reset 122 self.pilimage = None 123 return self
        124 125 126 @staticmethod
        127 - def checkData(data=None):
        128 if data is None: 129 return None 130 else: 131 return data.astype(int)
        132

        fabio-0.1.3/epydoc/fabio.kcdimage.kcdimage-class.html0000644000175000017500000004201112126623347023225 0ustar jeromejerome00000000000000 fabio.kcdimage.kcdimage
        Package fabio :: Module kcdimage :: Class kcdimage
        [hide private]
        [frames] | no frames]

        Class kcdimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               kcdimage
        

        Read the Nonius kcd data format

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Read in a header in some KCD format from an already open file @
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header, write

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        checkData(data=None)
        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers
        source code

        Inherited from fabioimage.fabioimage: checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Read in a header in some KCD format from an already open file @

        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        checkData(data=None)
        Static Method

        source code 

        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers

        Overrides: fabioimage.fabioimage.checkData
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.brukerimage.brukerimage-class.html0000644000175000017500000004511612126623347024520 0ustar jeromejerome00000000000000 fabio.brukerimage.brukerimage
        Package fabio :: Module brukerimage :: Class brukerimage
        [hide private]
        [frames] | no frames]

        Class brukerimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               brukerimage
        
        Known Subclasses:

        Read and eventually write ID11 bruker (eg smart6500) images

        Instance Methods [hide private]
         
        _readheader(self, infile)
        the bruker format uses 80 char lines in key : value format In the fisrt 512*5 bytes of the header there should be a HDRBLKS key, whose value denotes how many 512 byte blocks are in the total header.
        source code
         
        read(self, fname, frame=None)
        Read in and unpack the pixels (including overflow table
        source code
         
        write(self, fname)
        Writes the image as EDF
        source code
         
        write2(self, fname)
        FIXME: what is this?

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
          __headerstring__ = ''
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        the bruker format uses 80 char lines in key : value format In the fisrt 512*5 bytes of the header there should be a HDRBLKS key, whose value denotes how many 512 byte blocks are in the total header. The header is always n*5*512 bytes, otherwise it wont contain whole key: value pairs

        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 

        Read in and unpack the pixels (including overflow table

        Overrides: fabioimage.fabioimage.read

        write(self, fname)

        source code 
        
        Writes the image as EDF
        
        FIXME:  this should call edfimage.write if that is wanted?
                obj = edfimage(data = self.data, header = self.header)
                obj.write(fname)
                or maybe something like: edfimage.write(self, fname)
        
        
        Overrides: fabioimage.fabioimage.write

        fabio-0.1.3/epydoc/fabio.datIO-pysrc.html0000644000175000017500000005455512126623347020771 0ustar jeromejerome00000000000000 fabio.datIO
        Package fabio :: Module datIO
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.datIO

         1  #!/usr/bin/env python 
         2  #coding: utf8 
         3  """ 
         4  Authors: Henning O. Sorensen & Erik Knudsen 
         5           Center for Fundamental Research: Metal Structures in Four Dimensions 
         6           Risoe National Laboratory 
         7           Frederiksborgvej 399 
         8           DK-4000 Roskilde 
         9           email:erik.knudsen@risoe.dk 
        10            
        11           and Jon Wright, ESRF 
        12  """ 
        13   
        
        14 -class fabiodata(object):
        15 """ 16 A common class for dataIO in fable 17 Contains a 2d numpy array for keeping data, and two lists (clabels and rlabels) 18 containing labels for columns and rows respectively 19 """ 20
        21 - def __init__(self, data=None, clabels=None, rlabels=None, fname=None):
        22 """ 23 set up initial values 24 """ 25 if type(data) == type("string"): 26 raise Exception("fabioimage.__init__ bad argument - " + \ 27 "data should be numpy array") 28 self.data = data 29 if (self.data): 30 self.dims = self.data.shape 31 self.clabels = clabels 32 self.rlabels = rlabels 33 if (fname): 34 self.read(fname)
        35
        36 - def read(self, fname=None, frame=None):
        37 """ 38 To be overridden by format specific subclasses 39 """ 40 raise Exception("Class has not implemented read method yet")
        41 42 #import stuff from Jon's columnfile things 43 44
        45 -class columnfile(fabiodata):
        46 "Concrete fabiodata class"
        47 - def read(self, fname, frame=None):
        48 import cf_io 49 try: 50 infile = open(fname, 'rb') 51 except: 52 raise Exception("columnfile: file" + str(fname) + "not found.") 53 try: 54 (self.data, self.clabels) = cf_io.read(infile) 55 except: 56 raise Exception("columnfile: read error, file " + str(fname) + " possibly corrupt") 57 self.dims = self.data.shape 58 infile.close()
        59

        fabio-0.1.3/epydoc/fabio.fit2dspreadsheetimage-module.html0000644000175000017500000001335112126623347024346 0ustar jeromejerome00000000000000 fabio.fit2dspreadsheetimage
        Package fabio :: Module fit2dspreadsheetimage
        [hide private]
        [frames] | no frames]

        Module fit2dspreadsheetimage

        source code

        
        Read the fit2d ascii image output
                + Jon Wright, ESRF
        
        
        Classes [hide private]
          fit2dspreadsheetimage
        Read a fit2d ascii format
        Variables [hide private]
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/str-class.html0000644000175000017500000022167112126623347017462 0ustar jeromejerome00000000000000 str
        str :: Class str
        [hide private]
        [frames] | no frames]

        Class str

        object --+    
                 |    
        basestring --+
                     |
                    str
        

        str(object) -> string

        Return a nice string representation of the object. If the argument is a string, the return value is the same object.

        Instance Methods [hide private]
         
        __add__(x, y)
        x+y
         
        __contains__(x, y)
        y in x
         
        __eq__(x, y)
        x==y
        string
        __format__(S, format_spec)
        default object formatter
         
        __ge__(x, y)
        x>=y
         
        __getattribute__(...)
        x.__getattribute__('name') <==> x.name
         
        __getitem__(x, y)
        x[y]
         
        __getnewargs__(...)
         
        __getslice__(x, i, j)
        x[i:j]
         
        __gt__(x, y)
        x>y
         
        __hash__(x)
        hash(x)
         
        __le__(x, y)
        x<=y
         
        __len__(x)
        len(x)
         
        __lt__(x, y)
        x<y
         
        __mod__(x, y)
        x%y
         
        __mul__(x, n)
        x*n
         
        __ne__(x, y)
        x!=y
        a new object with type S, a subtype of T
        __new__(T, S, ...)
         
        __repr__(x)
        repr(x)
         
        __rmod__(x, y)
        y%x
         
        __rmul__(x, n)
        n*x
        size of S in memory, in bytes
        __sizeof__(S)
         
        __str__(x)
        str(x)
         
        _formatter_field_name_split(...)
         
        _formatter_parser(...)
        string
        capitalize(S)
        Return a copy of the string S with only its first character capitalized.
        string
        center(S, width, fillchar=...)
        Return S centered in a string of length width.
        int
        count(S, sub, start=..., end=...)
        Return the number of non-overlapping occurrences of substring sub in string S[start:end].
        object
        decode(S, encoding=..., errors=...)
        Decodes S using the codec registered for encoding.
        object
        encode(S, encoding=..., errors=...)
        Encodes S using the codec registered for encoding.
        bool
        endswith(S, suffix, start=..., end=...)
        Return True if S ends with the specified suffix, False otherwise.
        string
        expandtabs(S, tabsize=...)
        Return a copy of S where all tab characters are expanded using spaces.
        int
        find(S, sub, start=... , end=...)
        Return the lowest index in S where substring sub is found, such that sub is contained within s[start:end].
        string
        format(S, *args, **kwargs)
        int
        index(S, sub, start=... , end=...)
        Like S.find() but raise ValueError when the substring is not found.
        bool
        isalnum(S)
        Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
        bool
        isalpha(S)
        Return True if all characters in S are alphabetic and there is at least one character in S, False otherwise.
        bool
        isdigit(S)
        Return True if all characters in S are digits and there is at least one character in S, False otherwise.
        bool
        islower(S)
        Return True if all cased characters in S are lowercase and there is at least one cased character in S, False otherwise.
        bool
        isspace(S)
        Return True if all characters in S are whitespace and there is at least one character in S, False otherwise.
        bool
        istitle(S)
        Return True if S is a titlecased string and there is at least one character in S, i.e.
        bool
        isupper(S)
        Return True if all cased characters in S are uppercase and there is at least one cased character in S, False otherwise.
        string
        join(S, iterable)
        Return a string which is the concatenation of the strings in the iterable.
        string
        ljust(S, width, fillchar=...)
        Return S left-justified in a string of length width.
        string
        lower(S)
        Return a copy of the string S converted to lowercase.
        string or unicode
        lstrip(S, chars=...)
        Return a copy of the string S with leading whitespace removed.
        (head, sep, tail)
        partition(S, sep)
        Search for the separator sep in S, and return the part before it, the separator itself, and the part after it.
        string
        replace(S, old, new, count=...)
        Return a copy of string S with all occurrences of substring old replaced by new.
        int
        rfind(S, sub, start=... , end=...)
        Return the highest index in S where substring sub is found, such that sub is contained within s[start:end].
        int
        rindex(S, sub, start=... , end=...)
        Like S.rfind() but raise ValueError when the substring is not found.
        string
        rjust(S, width, fillchar=...)
        Return S right-justified in a string of length width.
        (head, sep, tail)
        rpartition(S, sep)
        Search for the separator sep in S, starting at the end of S, and return the part before it, the separator itself, and the part after it.
        list of strings
        rsplit(S, sep=... , maxsplit=...)
        Return a list of the words in the string S, using sep as the delimiter string, starting at the end of the string and working to the front.
        string or unicode
        rstrip(S, chars=...)
        Return a copy of the string S with trailing whitespace removed.
        list of strings
        split(S, sep=... , maxsplit=...)
        Return a list of the words in the string S, using sep as the delimiter string.
        list of strings
        splitlines(S, keepends=...)
        Return a list of the lines in S, breaking at line boundaries.
        bool
        startswith(S, prefix, start=..., end=...)
        Return True if S starts with the specified prefix, False otherwise.
        string or unicode
        strip(S, chars=...)
        Return a copy of the string S with leading and trailing whitespace removed.
        string
        swapcase(S)
        Return a copy of the string S with uppercase characters converted to lowercase and vice versa.
        string
        title(S)
        Return a titlecased version of S, i.e.
        string
        translate(S, table, deletechars=...)
        Return a copy of the string S, where all characters occurring in the optional argument deletechars are removed, and the remaining characters have been mapped through the given translation table, which must be a string of length 256.
        string
        upper(S)
        Return a copy of the string S converted to uppercase.
        string
        zfill(S, width)
        Pad a numeric string S with zeros on the left, to fill a field of the specified width.

        Inherited from object: __delattr__, __init__, __reduce__, __reduce_ex__, __setattr__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __format__(S, format_spec)

         

        default object formatter

        Returns: string
        Overrides: object.__format__

        __getattribute__(...)

         

        x.__getattribute__('name') <==> x.name

        Overrides: object.__getattribute__

        __getslice__(x, i, j)
        (Slicling operator)

         

        x[i:j]

        Use of negative indices is not supported.

        __hash__(x)
        (Hashing function)

         

        hash(x)

        Overrides: object.__hash__

        __new__(T, S, ...)

         
        Returns: a new object with type S, a subtype of T
        Overrides: object.__new__

        __repr__(x)
        (Representation operator)

         

        repr(x)

        Overrides: object.__repr__

        __sizeof__(S)

         
        Returns: size of S in memory, in bytes
        Overrides: object.__sizeof__

        __str__(x)
        (Informal representation operator)

         

        str(x)

        Overrides: object.__str__

        center(S, width, fillchar=...)

         

        Return S centered in a string of length width. Padding is done using the specified fill character (default is a space)

        Returns: string

        count(S, sub, start=..., end=...)

         

        Return the number of non-overlapping occurrences of substring sub in string S[start:end]. Optional arguments start and end are interpreted as in slice notation.

        Returns: int

        decode(S, encoding=..., errors=...)

         

        Decodes S using the codec registered for encoding. encoding defaults to the default encoding. errors may be given to set a different error handling scheme. Default is 'strict' meaning that encoding errors raise a UnicodeDecodeError. Other possible values are 'ignore' and 'replace' as well as any other name registered with codecs.register_error that is able to handle UnicodeDecodeErrors.

        Returns: object

        encode(S, encoding=..., errors=...)

         

        Encodes S using the codec registered for encoding. encoding defaults to the default encoding. errors may be given to set a different error handling scheme. Default is 'strict' meaning that encoding errors raise a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and 'xmlcharrefreplace' as well as any other name registered with codecs.register_error that is able to handle UnicodeEncodeErrors.

        Returns: object

        endswith(S, suffix, start=..., end=...)

         

        Return True if S ends with the specified suffix, False otherwise. With optional start, test S beginning at that position. With optional end, stop comparing S at that position. suffix can also be a tuple of strings to try.

        Returns: bool

        expandtabs(S, tabsize=...)

         

        Return a copy of S where all tab characters are expanded using spaces. If tabsize is not given, a tab size of 8 characters is assumed.

        Returns: string

        find(S, sub, start=... , end=...)

         

        Return the lowest index in S where substring sub is found, such that sub is contained within s[start:end]. Optional arguments start and end are interpreted as in slice notation.

        Return -1 on failure.

        Returns: int

        istitle(S)

         

        Return True if S is a titlecased string and there is at least one character in S, i.e. uppercase characters may only follow uncased characters and lowercase characters only cased ones. Return False otherwise.

        Returns: bool

        join(S, iterable)

         

        Return a string which is the concatenation of the strings in the iterable. The separator between elements is S.

        Returns: string

        ljust(S, width, fillchar=...)

         

        Return S left-justified in a string of length width. Padding is done using the specified fill character (default is a space).

        Returns: string

        lstrip(S, chars=...)

         

        Return a copy of the string S with leading whitespace removed. If chars is given and not None, remove characters in chars instead. If chars is unicode, S will be converted to unicode before stripping

        Returns: string or unicode

        partition(S, sep)

         

        Search for the separator sep in S, and return the part before it, the separator itself, and the part after it. If the separator is not found, return S and two empty strings.

        Returns: (head, sep, tail)

        replace(S, old, new, count=...)

         

        Return a copy of string S with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.

        Returns: string

        rfind(S, sub, start=... , end=...)

         

        Return the highest index in S where substring sub is found, such that sub is contained within s[start:end]. Optional arguments start and end are interpreted as in slice notation.

        Return -1 on failure.

        Returns: int

        rjust(S, width, fillchar=...)

         

        Return S right-justified in a string of length width. Padding is done using the specified fill character (default is a space)

        Returns: string

        rpartition(S, sep)

         

        Search for the separator sep in S, starting at the end of S, and return the part before it, the separator itself, and the part after it. If the separator is not found, return two empty strings and S.

        Returns: (head, sep, tail)

        rsplit(S, sep=... , maxsplit=...)

         

        Return a list of the words in the string S, using sep as the delimiter string, starting at the end of the string and working to the front. If maxsplit is given, at most maxsplit splits are done. If sep is not specified or is None, any whitespace string is a separator.

        Returns: list of strings

        rstrip(S, chars=...)

         

        Return a copy of the string S with trailing whitespace removed. If chars is given and not None, remove characters in chars instead. If chars is unicode, S will be converted to unicode before stripping

        Returns: string or unicode

        split(S, sep=... , maxsplit=...)

         

        Return a list of the words in the string S, using sep as the delimiter string. If maxsplit is given, at most maxsplit splits are done. If sep is not specified or is None, any whitespace string is a separator and empty strings are removed from the result.

        Returns: list of strings

        splitlines(S, keepends=...)

         

        Return a list of the lines in S, breaking at line boundaries. Line breaks are not included in the resulting list unless keepends is given and true.

        Returns: list of strings

        startswith(S, prefix, start=..., end=...)

         

        Return True if S starts with the specified prefix, False otherwise. With optional start, test S beginning at that position. With optional end, stop comparing S at that position. prefix can also be a tuple of strings to try.

        Returns: bool

        strip(S, chars=...)

         

        Return a copy of the string S with leading and trailing whitespace removed. If chars is given and not None, remove characters in chars instead. If chars is unicode, S will be converted to unicode before stripping

        Returns: string or unicode

        title(S)

         

        Return a titlecased version of S, i.e. words start with uppercase characters, all remaining cased characters have lowercase.

        Returns: string

        zfill(S, width)

         

        Pad a numeric string S with zeros on the left, to fill a field of the specified width. The string S is never truncated.

        Returns: string

        fabio-0.1.3/epydoc/redirect.html0000644000175000017500000000567412126623347017353 0ustar jeromejerome00000000000000Epydoc Redirect Page

        Epydoc Auto-redirect page

        When javascript is enabled, this page will redirect URLs of the form redirect.html#dotted.name to the documentation for the object with the given fully-qualified dotted name.

         

        fabio-0.1.3/epydoc/fabio.adscimage.adscimage-class.html0000644000175000017500000004420712126623347023560 0ustar jeromejerome00000000000000 fabio.adscimage.adscimage
        Package fabio :: Module adscimage :: Class adscimage
        [hide private]
        [frames] | no frames]

        Class adscimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               adscimage
        

        Read an image in ADSC format (quite similar to edf?)

        Instance Methods [hide private]
         
        __init__(self, *args, **kwargs)
        Set up initial values
        source code
         
        read(self, fname, frame=None)
        read in the file
        source code
         
        _readheader(self, infile)
        read an adsc header
        source code
         
        write(self, fname)
        Write adsc format
        source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, *args, **kwargs)
        (Constructor)

        source code 

        Set up initial values

        Overrides: object.__init__
        (inherited documentation)

        read(self, fname, frame=None)

        source code 

        read in the file

        Overrides: fabioimage.fabioimage.read

        _readheader(self, infile)

        source code 

        read an adsc header

        Overrides: fabioimage.fabioimage._readheader

        write(self, fname)

        source code 

        Write adsc format

        Overrides: fabioimage.fabioimage.write

        fabio-0.1.3/epydoc/fabio.GEimage_old.GEimage-class.html0000644000175000017500000003644412126623347023364 0ustar jeromejerome00000000000000 fabio.GEimage_old.GEimage
        Package fabio :: Module GEimage_old :: Class GEimage
        [hide private]
        [frames] | no frames]

        Class GEimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               GEimage
        

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Must be overridden in classes
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header, write

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Must be overridden in classes

        Overrides: fabioimage.fabioimage._readheader
        (inherited documentation)

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        fabio-0.1.3/epydoc/fabio.tifimage.Tiff_header-class.html0000644000175000017500000002025612126623347023711 0ustar jeromejerome00000000000000 fabio.tifimage.Tiff_header
        Package fabio :: Module tifimage :: Class Tiff_header
        [hide private]
        [frames] | no frames]

        Class Tiff_header

        source code

        object --+
                 |
                Tiff_header
        

        Instance Methods [hide private]
         
        __init__(self, string)
        x.__init__(...) initializes x; see x.__class__.__doc__ for signature
        source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, string)
        (Constructor)

        source code 

        x.__init__(...) initializes x; see x.__class__.__doc__ for signature

        Overrides: object.__init__
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.file_series.numbered_file_series-class.html0000644000175000017500000003314512126623347026370 0ustar jeromejerome00000000000000 fabio.file_series.numbered_file_series
        Package fabio :: Module file_series :: Class numbered_file_series
        [hide private]
        [frames] | no frames]

        Class numbered_file_series

        source code

        object --+        
                 |        
              list --+    
                     |    
           file_series --+
                         |
                        numbered_file_series
        

        mydata0001.edf = "mydata" + 0001 + ".edf" mydata0002.edf = "mydata" + 0002 + ".edf" mydata0003.edf = "mydata" + 0003 + ".edf"

        Instance Methods [hide private]
        new empty list
        __init__(self, stem, first, last, extension, digits=4, padding='Y', step=1)
        Constructor
        source code

        Inherited from file_series: current, current_image, current_object, first, first_image, first_object, jump, jump_image, jump_object, last, last_image, last_object, len, next, next_image, next_object, previous, previous_image, previous_object

        Inherited from list: __add__, __contains__, __delitem__, __delslice__, __eq__, __ge__, __getattribute__, __getitem__, __getslice__, __gt__, __iadd__, __imul__, __iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __repr__, __reversed__, __rmul__, __setitem__, __setslice__, __sizeof__, append, count, extend, index, insert, pop, remove, reverse, sort

        Inherited from object: __delattr__, __format__, __reduce__, __reduce_ex__, __setattr__, __str__, __subclasshook__

        Class Variables [hide private]

        Inherited from list: __hash__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, stem, first, last, extension, digits=4, padding='Y', step=1)
        (Constructor)

        source code 

        Constructor

        Parameters:
        • stem - first part of the name
        • step - in case of every nth file
        • padding - possibility for specifying that numbers are not padded with zeroes up to digits
        Returns: new empty list
        Overrides: object.__init__

        fabio-0.1.3/epydoc/fabio.compression-pysrc.html0000644000175000017500000041114312126623347022320 0ustar jeromejerome00000000000000 fabio.compression
        Package fabio :: Module compression
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.compression

          1  #!/usr/bin/env python 
          2  # coding: utf8 
          3  """ 
          4  Authors: Jérôme Kieffer, ESRF 
          5           email:jerome.kieffer@esrf.fr 
          6   
          7  FabIO library containing compression and decompression algorithm for various 
          8  """ 
          9  __author__ = "Jérôme Kieffer" 
         10  __contact__ = "jerome.kieffer@esrf.eu" 
         11  __license__ = "GPLv3+" 
         12  __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" 
         13   
         14   
         15  import logging, struct, hashlib, base64, StringIO, sys 
         16  if sys.version_info >= (3,): 
         17      str = bytes 
         18  logger = logging.getLogger("compression") 
         19  import numpy 
         20   
         21  try: 
         22      import gzip 
         23  except ImportError: 
         24      logger.error("Unable to import gzip module: disabling gzip compression") 
         25      gzip = None 
         26   
         27  try: 
         28      import bz2 
         29  except ImportError: 
         30      logger.error("Unable to import bz2 module: disabling bz2 compression") 
         31      bz2 = None 
         32   
         33  try: 
         34      import zlib 
         35  except ImportError: 
         36      logger.error("Unable to import zlib module: disabling zlib compression") 
         37      zlib = None 
         38   
        
        39 -def md5sum(blob):
        40 """ 41 returns the md5sum of an object... 42 """ 43 return base64.b64encode(hashlib.md5(blob).digest())
        44 45
        46 -def endianness():
        47 """ 48 Return the native endianness of the system 49 """ 50 if numpy.little_endian: 51 return "LITTLE_ENDIAN" 52 else: 53 return "BIG_ENDIAN"
        54 55
        56 -def decGzip(stream):
        57 """ 58 59 Decompress a chunk of data using the gzip algorithm from Python or alternatives if possible 60 61 """ 62 63 if gzip is None: 64 raise ImportError("gzip module is not available") 65 fileobj = StringIO.StringIO(stream) 66 try: 67 rawData = gzip.GzipFile(fileobj=fileobj).read() 68 except IOError: 69 logger.warning("Encounter the python-gzip bug with trailing garbage, trying subprocess gzip") 70 try: 71 #This is as an ugly hack against a bug in Python gzip 72 import subprocess 73 sub = subprocess.Popen(["gzip", "-d", "-f"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 74 rawData, err = sub.communicate(input=stream) 75 logger.debug("Gzip subprocess ended with %s err= %s; I got %s bytes back" % (sub.wait(), err, len(rawData))) 76 except Exception, error: #IGNORE:W0703 77 logger.warning("Unable to use the subprocess gzip (%s). Is gzip available? " % error) 78 for i in range(1, 513): 79 try: 80 fileobj = StringIO.StringIO(stream[:-i]) 81 rawData = gzip.GzipFile(fileobj=fileobj).read() 82 except IOError: 83 logger.debug("trying with %s bytes less, doesn't work" % i) 84 else: 85 break 86 else: 87 logger.error("I am totally unable to read this gzipped compressed data block, giving up") 88 return rawData
        89 90
        91 -def decBzip2(stream):
        92 """ 93 94 Decompress a chunk of data using the bzip2 algorithm from Python 95 96 """ 97 if bz2 is None: 98 raise ImportError("bz2 module is not available") 99 return bz2.decompress(stream)
        100 101
        102 -def decZlib(stream):
        103 """ 104 105 Decompress a chunk of data using the zlib algorithm from Python 106 107 """ 108 if zlib is None: 109 raise ImportError("zlib module is not available") 110 return zlib.decompress(stream)
        111 112
        113 -def decByteOffet_python(stream, size):
        114 """ 115 Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) 116 117 @param stream: string representing the compressed data 118 @param size: the size of the output array (of longInts) 119 @return: 1D-ndarray 120 121 """ 122 logger.debug("CBF decompression using Python with Cython loops") 123 dataOut = numpy.zeros((size), dtype=numpy.int64) 124 i = 0 125 j = 0 126 last = 0 127 current = 0 128 while ((i < len(stream)) and (j < size)): 129 if (stream[i] == '\x80'): 130 if (stream[i + 1:i + 3] == "\x00\x80"): 131 if (stream[i + 3:i + 7] == "\x00\x00\x00\x80"): 132 current = struct.unpack("<q", stream[i + 7:i + 15])[0] 133 i += 15 134 else: 135 current = struct.unpack("<i", stream[i + 3:i + 7])[0] 136 i += 7 137 else: 138 current = struct.unpack("<h", stream[i + 1:i + 3])[0] 139 i += 3 140 else: 141 current = struct.unpack("<b", stream[i])[0] 142 i += 1 143 last += current 144 dataOut[j] = last 145 j += 1 146 return dataOut
        147
        148 -def decByteOffet_weave(stream, size):
        149 """ 150 Analyze a stream of char with any length of exception (2,4, or 8 bytes integers) 151 152 @param stream: string representing the compressed data 153 @param size: the size of the output array (of longInts) 154 @return: 1D-ndarray 155 156 """ 157 logger.debug("CBF decompression using Weave") 158 try: 159 from scipy import weave 160 from scipy.weave import converters 161 except ImportError: 162 logger.warning("scipy.weave is not available, falling back on slow Numpy implementations") 163 return decByteOffet_numpy(stream, size) 164 dataIn = numpy.fromstring(stream, dtype="uint8") 165 n = dataIn.size 166 dataOut = numpy.zeros(size, dtype="int64") 167 codeC = """ 168 unsigned char key = 0x80; 169 long j = 0; 170 long last=0; 171 long current=0; 172 for (int i=0; i< n; i++){ 173 if (j>=size){ 174 //printf("i= %i<%i, j=%i < size= %i %i\\n",i,n,j,size,dataIn(i)); 175 break; 176 } 177 if (dataIn(i) == key){ 178 if ( (dataIn(i+1)==0) and (dataIn(i+2)==key) ){ 179 if ( (dataIn(i+3)==0) and (dataIn(i+4)==0) and (dataIn(i+5)==0) and (dataIn(i+6)==key) ) { 180 // 64 bits mode 181 char tmp = dataIn(i+14) ; 182 current = (long(tmp)<<56) | (long(dataIn(i+13))<<48) | (long(dataIn(i+12))<<40) | (long(dataIn(i+11))<<32) | (long(dataIn(i+10))<<24) | (long(dataIn(i+9))<<16) | (long(dataIn(i+8))<<8) | (long(dataIn(i+7))); 183 // printf("64 bit int at pos %i, %i, value=%ld \\n",i,j,current); 184 i+=14; 185 }else{ 186 // 32 bits mode 187 char tmp = dataIn(i+6) ; 188 current = (long(tmp)<<24) | (long(dataIn(i+5))<<16) | (long(dataIn(i+4))<<8) | (long(dataIn(i+3))); 189 // printf("32 bit int at pos %i, %i, value=%ld was %i %i %i %i %i %i %i\\n",i,j,current,dataIn(i),dataIn(i+1),dataIn(i+2),dataIn(i+3),dataIn(i+4),dataIn(i+5),dataIn(i+6)); 190 // printf("%ld %ld %ld %ld\\n",(long(tmp)<<24) , (long(dataIn(i+5))<<16) , (long(dataIn(i+4))<<8) ,long(dataIn(i+3))); 191 i+=6; 192 } 193 }else{ 194 // 16 bit mode 195 char tmp = dataIn(i+2); 196 current = (long(tmp)<<8) | (long (dataIn(i+1))); 197 // printf("16 bit int at pos %i, %i, value=%ld was %i %i %i\\n",i,j,current,dataIn(i),dataIn(i+1),dataIn(i+2)); 198 i+=2; 199 } 200 }else{ 201 // 8 bit mode 202 char tmp = dataIn(i) ; 203 current= long(tmp) ; 204 } 205 last+=current; 206 dataOut(j)=last; 207 j++ ; 208 } 209 return_val=0; 210 """ 211 rc = weave.inline(codeC, ["dataIn", "dataOut", "n", "size" ], verbose=2, type_converters=converters.blitz) 212 if rc != 0: 213 logger.warning("weave binary module return error code %s" % rc) 214 return dataOut
        215 216 217
        218 -def decByteOffet_numpy(stream, size=None):
        219 """ 220 Analyze a stream of char with any length of exception: 221 2, 4, or 8 bytes integers 222 223 @param stream: string representing the compressed data 224 @param size: the size of the output array (of longInts) 225 @return: 1D-ndarray 226 227 """ 228 logger.debug("CBF decompression using Numpy") 229 listnpa = [] 230 key16 = "\x80" 231 key32 = "\x00\x80" 232 key64 = "\x00\x00\x00\x80" 233 shift = 1 234 while True: 235 idx = stream.find(key16) 236 if idx == -1: 237 listnpa.append(numpy.fromstring(stream, dtype="int8")) 238 break 239 listnpa.append(numpy.fromstring(stream[:idx], dtype="int8")) 240 241 if stream[idx + 1:idx + 3] == key32: 242 if stream[idx + 3:idx + 7] == key64: 243 # long int 64 bits 244 listnpa.append(numpy.fromstring(stream[idx + 7:idx + 15], 245 dtype="int64")) 246 shift = 15 247 else: #32 bit int 248 listnpa.append(numpy.fromstring(stream[idx + 3:idx + 7], 249 dtype="int32")) 250 shift = 7 251 else: # int16 252 listnpa.append(numpy.fromstring(stream[idx + 1:idx + 3], 253 dtype="int16")) 254 shift = 3 255 stream = stream[idx + shift:] 256 return (numpy.hstack(listnpa)).astype("int64").cumsum()
        257 258
        259 -def decByteOffet_cython(stream, size=None):
        260 """ 261 Analyze a stream of char with any length of exception: 262 2, 4, or 8 bytes integers 263 264 @param stream: string representing the compressed data 265 @param size: the size of the output array (of longInts) 266 @return: 1D-ndarray 267 268 """ 269 logger.debug("CBF decompression using cython") 270 try: 271 from fabio.byte_offset import analyseCython 272 except ImportError, error: 273 logger.error("Failed to import byte_offset cython module, falling back on numpy method") 274 return decByteOffet_numpy(stream, size) 275 else: 276 return analyseCython(stream, size)
        277
        278 -def compByteOffet_numpy(data):
        279 """ 280 Compress a dataset into a string using the byte_offet algorithm 281 282 @param data: ndarray 283 @return: string/bytes with compressed data 284 285 test = numpy.array([0,1,2,127,0,1,2,128,0,1,2,32767,0,1,2,32768,0,1,2,2147483647,0,1,2,2147483648,0,1,2,128,129,130,32767,32768,128,129,130,32768,2147483647,2147483648]) 286 287 """ 288 flat = data.astype("int64").ravel() 289 delta = numpy.zeros_like(flat) 290 delta[0] = flat[0] 291 delta[1:] = flat[1:] - flat[:-1] 292 mask = ((delta > 127) + (delta < -127)) 293 exceptions = numpy.nonzero(mask)[0] 294 if numpy.little_endian: 295 byteswap = False 296 else: 297 byteswap = True 298 start = 0 299 binary_blob = "" 300 for stop in exceptions: 301 if stop - start > 0: 302 binary_blob += delta[start:stop].astype("int8").tostring() 303 exc = delta[stop] 304 if (exc > 2147483647) or (exc < -2147483647): #2**31-1 305 binary_blob += "\x80\x00\x80\x00\x00\x00\x80" 306 if byteswap: 307 binary_blob += delta[stop:stop + 1].byteswap().tostring() 308 else: 309 binary_blob += delta[stop:stop + 1].tostring() 310 elif (exc > 32767) or (exc < -32767): #2**15-1 311 binary_blob += "\x80\x00\x80" 312 if byteswap: 313 binary_blob += delta[stop:stop + 1].astype("int32").byteswap().tostring() 314 else: 315 binary_blob += delta[stop:stop + 1].astype("int32").tostring() 316 else: #>127 317 binary_blob += "\x80" 318 if byteswap: 319 binary_blob += delta[stop:stop + 1].astype("int16").byteswap().tostring() 320 else: 321 binary_blob += delta[stop:stop + 1].astype("int16").tostring() 322 start = stop + 1 323 if start < delta.size: 324 binary_blob += delta[start:].astype("int8").tostring() 325 return binary_blob
        326 327
        328 -def decTY1(raw_8, raw_16=None, raw_32=None):
        329 """ 330 Modified byte offset decompressor used in Oxford Diffraction images 331 332 @param raw_8: strings containing raw data with integer 8 bits 333 @param raw_16: strings containing raw data with integer 16 bits 334 @param raw_32: strings containing raw data with integer 32 bits 335 @return: numpy.ndarray 336 337 """ 338 data = numpy.fromstring(raw_8, dtype="uint8").astype(int) 339 data -= 127 340 if raw_32 is not None: 341 int32 = numpy.fromstring(raw_32, dtype="int32").astype(int) 342 exception32 = numpy.nonzero(data == 128) 343 if raw_16 is not None: 344 int16 = numpy.fromstring(raw_16, dtype="int16").astype(int) 345 exception16 = numpy.nonzero(data == 127) 346 data[exception16] = int16 347 if raw_32: 348 data[exception32] = int32 349 summed = data.cumsum() 350 smax = summed.max() 351 if (smax > (2 ** 31 - 1)): 352 bytecode = "int64" 353 elif (smax > (2 ** 15 - 1)): 354 bytecode = "int32" 355 elif (smax > (2 ** 7 - 1)): 356 bytecode = "int16" 357 else: 358 bytecode = "int8" 359 return summed.astype(bytecode)
        360 decKM4CCD = decTY1 361
        362 -def compTY1(data):
        363 """ 364 Modified byte offset compressor used in Oxford Diffraction images 365 366 @param data: numpy.ndarray with the input data (integers!) 367 @return: 3-tuple of strings: raw_8,raw_16,raw_32 containing raw data with integer of the given size 368 369 """ 370 fdata = data.flatten() 371 diff = numpy.zeros_like(fdata) 372 diff[0] = fdata[0] 373 diff[1:] = fdata[1:] - fdata[:-1] 374 adiff = abs(diff) 375 exception32 = (adiff > 32767)#2**15-1 376 exception16 = (adiff >= 127) - exception32 #2**7-1) 377 we16 = numpy.where(exception16) 378 we32 = numpy.where(exception32) 379 raw_16 = diff[we16].astype("int16").tostring() 380 raw_32 = diff[we32].astype("int32").tostring() 381 diff[we16] = 127 382 diff[we32] = 128 383 diff += 127 384 raw_8 = diff.astype("uint8").tostring() 385 return raw_8, raw_16, raw_32
        386
        387 -def decPCK(stream, dim1=None, dim2=None, overflowPix=None):
        388 """ 389 Modified CCP4 pck decompressor used in MAR345 images 390 391 @param stream: string or file 392 @return: numpy.ndarray (square array) 393 394 """ 395 396 try: 397 from mar345_IO import uncompress_pck 398 except ImportError, error: 399 raise RuntimeError("Unable to import mar345_IO to read compressed dataset") 400 if "seek" in dir(stream): 401 stream.seek(0) 402 raw = stream.read() 403 else: 404 raw = str(stream) 405 406 return uncompress_pck(raw, dim1, dim2, overflowPix)
        407 408
        409 -def compPCK(data):
        410 """ 411 Modified CCP4 pck compressor used in MAR345 images 412 413 @param data: numpy.ndarray (square array) 414 @return: compressed stream 415 416 """ 417 try: 418 from mar345_IO import compress_pck 419 except ImportError, error: 420 raise RuntimeError("Unable to import mar345_IO to write compressed dataset") 421 return compress_pck(data)
        422

        fabio-0.1.3/epydoc/fabio.brukerimage-pysrc.html0000644000175000017500000024176312126623347022265 0ustar jeromejerome00000000000000 fabio.brukerimage
        Package fabio :: Module brukerimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.brukerimage

          1  #!/usr/bin/env python 
          2  """ 
          3   
          4  Authors: Henning O. Sorensen & Erik Knudsen 
          5           Center for Fundamental Research: Metal Structures in Four Dimensions 
          6           Risoe National Laboratory 
          7           Frederiksborgvej 399 
          8           DK-4000 Roskilde 
          9           email:erik.knudsen@risoe.dk 
         10   
         11  Based on: openbruker,readbruker, readbrukerheader functions in the opendata 
         12           module of ImageD11 written by Jon Wright, ESRF, Grenoble, France 
         13   
         14  """ 
         15   
         16  import numpy, logging 
         17  logger = logging.getLogger("brukerimage") 
         18  from fabioimage import fabioimage 
         19  from readbytestream import readbytestream 
         20   
         21   
        
        22 -class brukerimage(fabioimage):
        23 """ 24 Read and eventually write ID11 bruker (eg smart6500) images 25 """ 26 27 # needed if you feel like writing - see ImageD11/scripts/edf2bruker.py 28 29 __headerstring__ = "" 30 31
        32 - def _readheader(self, infile):
        33 """ 34 the bruker format uses 80 char lines in key : value format 35 In the fisrt 512*5 bytes of the header there should be a 36 HDRBLKS key, whose value denotes how many 512 byte blocks 37 are in the total header. The header is always n*5*512 bytes, 38 otherwise it wont contain whole key: value pairs 39 """ 40 lump = infile.read(512 * 5) 41 self.__headerstring__ += lump 42 i = 80 43 self.header = {} 44 while i < 512 * 5: 45 if lump[i - 80: i].find(":") > 0: 46 key, val = lump[i - 80: i].split(":", 1) 47 key = key.strip() # remove the whitespace (why?) 48 val = val.strip() 49 if self.header.has_key(key): 50 # append lines if key already there 51 self.header[key] = self.header[key] + '\n' + val 52 else: 53 self.header[key] = val 54 self.header_keys.append(key) 55 i = i + 80 # next 80 characters 56 # we must have read this in the first 512 bytes. 57 nhdrblks = int(self.header['HDRBLKS']) 58 # Now read in the rest of the header blocks, appending 59 rest = infile.read(512 * (nhdrblks - 5)) 60 self.__headerstring__ += rest 61 lump = lump[i - 80: 512] + rest 62 i = 80 63 j = 512 * nhdrblks 64 while i < j : 65 if lump[i - 80: i].find(":") > 0: # as for first 512 bytes of header 66 key, val = lump[i - 80: i].split(":", 1) 67 key = key.strip() 68 val = val.strip() 69 if self.header.has_key(key): 70 self.header[key] = self.header[key] + '\n' + val 71 else: 72 self.header[key] = val 73 self.header_keys.append(key) 74 i = i + 80 75 # make a (new) header item called "datastart" 76 self.header['datastart'] = infile.tell() 77 #set the image dimensions 78 self.dim1 = int(self.header['NROWS']) 79 self.dim2 = int(self.header['NCOLS'])
        80
        81 - def read(self, fname, frame=None):
        82 """ 83 Read in and unpack the pixels (including overflow table 84 """ 85 infile = self._open(fname, "rb") 86 try: 87 self._readheader(infile) 88 except: 89 raise 90 91 rows = self.dim1 92 cols = self.dim2 93 94 try: 95 # you had to read the Bruker docs to know this! 96 npixelb = int(self.header['NPIXELB']) 97 except: 98 errmsg = "length " + str(len(self.header['NPIXELB'])) + "\n" 99 for byt in self.header['NPIXELB']: 100 errmsg += "char: " + str(byt) + " " + str(ord(byt)) + "\n" 101 logger.warning(errmsg) 102 raise 103 104 self.data = readbytestream(infile, infile.tell(), 105 rows, cols, npixelb, 106 datatype="int", 107 signed='n', 108 swap='n') 109 110 #handle overflows 111 nov = int(self.header['NOVERFL']) 112 if nov > 0: # Read in the overflows 113 # need at least int32 sized data I guess - can reach 2^21 114 self.data = self.data.astype(numpy.uint32) 115 # 16 character overflows: 116 # 9 characters of intensity 117 # 7 character position 118 for i in range(nov): 119 ovfl = infile.read(16) 120 intensity = int(ovfl[0: 9]) 121 position = int(ovfl[9: 16]) 122 # relies on python style modulo being always + 123 row = position % rows 124 # relies on truncation down 125 col = position / rows 126 #print "Overflow ", r, c, intensity, position,\ 127 # self.data[r,c],self.data[c,r] 128 self.data[col, row] = intensity 129 infile.close() 130 131 self.resetvals() 132 self.pilimage = None 133 return self
        134 135
        136 - def write(self, fname):
        137 """ 138 Writes the image as EDF 139 140 FIXME: this should call edfimage.write if that is wanted? 141 obj = edfimage(data = self.data, header = self.header) 142 obj.write(fname) 143 or maybe something like: edfimage.write(self, fname) 144 145 """ 146 logger.warning("***warning***: call to unifinished " + \ 147 "brukerimage.write. This will write the file" + \ 148 fname + "as an edf-file") 149 150 151 outfile = self._open(fname, "wb") 152 outfile.write('{\n') 153 i = 4 154 for k in self.header_keys: 155 out = (("%s = %s;\n") % (k, self.header[k])) 156 i = i + len(out) 157 outfile.write(out) 158 out = (4096 - i) * ' ' 159 outfile.write(out) 160 outfile.write('}\n') 161 # Assumes a short-circuiting if / or ... 162 if not self.header.has_key("ByteOrder") or \ 163 self.header["ByteOrder"] == "LowByteFirst": 164 outfile.write(self.data.astype(numpy.uint16).tostring()) 165 else: 166 outfile.write(self.data.byteswap().astype( 167 numpy.uint16).tostring()) 168 outfile.close()
        169 170 171 172
        173 -def test():
        174 """ a testcase """ 175 import sys, time 176 img = brukerimage() 177 start = time.clock() 178 for filename in sys.argv[1:]: 179 img.read(filename) 180 res = img.toPIL16() 181 img.rebin(2, 2) 182 print filename + (": max=%d, min=%d, mean=%.2e, stddev=%.2e") % ( 183 img.getmax(), img.getmin(), img.getmean(), img.getstddev()) 184 print 'integrated intensity (%d %d %d %d) =%.3f' % ( 185 10, 20, 20, 40, img.integrate_area((10, 20, 20, 40))) 186 end = time.clock() 187 print (end - start)
        188 189 190 191 if __name__ == '__main__': 192 test() 193

        fabio-0.1.3/epydoc/toc-fabio.datIO-module.html0000644000175000017500000000243312120434325021653 0ustar jeromejerome00000000000000 datIO

        Module datIO


        Classes

        columnfile
        fabiodata

        Variables

        __package__

        [hide private] fabio-0.1.3/epydoc/fabio.tifimage.Image_File_Directory_entry-class.html0000644000175000017500000002444212126623347026740 0ustar jeromejerome00000000000000 fabio.tifimage.Image_File_Directory_entry
        Package fabio :: Module tifimage :: Class Image_File_Directory_entry
        [hide private]
        [frames] | no frames]

        Class Image_File_Directory_entry

        source code

        object --+
                 |
                Image_File_Directory_entry
        

        Instance Methods [hide private]
         
        __init__(self, tag=0, tag_type=0, count=0, offset=0)
        x.__init__(...) initializes x; see x.__class__.__doc__ for signature
        source code
         
        unpack(self, strInput) source code
         
        extract_data(self, full_string) source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, tag=0, tag_type=0, count=0, offset=0)
        (Constructor)

        source code 

        x.__init__(...) initializes x; see x.__class__.__doc__ for signature

        Overrides: object.__init__
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.fabioutils.filename_object-class.html0000644000175000017500000001575612120434325025172 0ustar jeromejerome00000000000000 fabio.fabioutils.filename_object
        Package fabio :: Module fabioutils :: Class filename_object
        [hide private]
        [frames] | no frames]

        Class filename_object

        source code

        The 'meaning' of a filename

        Instance Methods [hide private]
         
        __init__(self, stem, num=None, directory=None, format=None, extension=None, postnum=None, digits=4) source code
         
        str(self)
        Return a string representation
        source code
         
        tostring(self)
        convert yourself to a string
        source code
        fabio-0.1.3/epydoc/fabio.pilatusimage-module.html0000644000175000017500000001370612126623347022573 0ustar jeromejerome00000000000000 fabio.pilatusimage
        Package fabio :: Module pilatusimage
        [hide private]
        [frames] | no frames]

        Module pilatusimage

        source code

        
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions;
          Risoe National Laboratory;
          Frederiksborgvej 399;
          DK-4000 Roskilde;
          email:erik.knudsen@risoe.dk
        * Jon Wright:
          European Synchrotron Radiation Facility;
          Grenoble (France)
        
        
        Classes [hide private]
          pilatusimage
        Read in Pilatus format, also pilatus images, including header info
        Variables [hide private]
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.openimage-module.html0000644000175000017500000003400212126623347022043 0ustar jeromejerome00000000000000 fabio.openimage
        Package fabio :: Module openimage
        [hide private]
        [frames] | no frames]

        Module openimage

        source code

        
        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:henning.sorensen@risoe.dk
        
        mods for fabio by JPW
        
        
        Functions [hide private]
         
        do_magic(byts)
        Try to interpret the bytes starting the file as a magic number
        source code
         
        openimage(filename, frame=None)
        Try to open an image
        source code
         
        openheader(filename)
        return only the header
        source code
         
        _openimage(filename)
        determine which format for a filename and return appropriate class which can be used for opening the image
        source code
        Variables [hide private]
          logger = logging.getLogger("openimage")
          MAGIC_NUMBERS = [('FORMAT : 86', 'bruker'), ('MM\x00*',...
          __package__ = 'fabio'
        Variables Details [hide private]

        MAGIC_NUMBERS

        Value:
        [('FORMAT :        86', 'bruker'),
         ('MM\x00*', 'tif'),
         ('II*\x00\x08\x00', 'marccd'),
         ('II*\x00\x82\x00', 'pilatus'),
         ('II*\x00', 'tif'),
         ('{\nHEA', 'adsc'),
         ('{', 'edf'),
         ('\r{', 'edf'),
        ...
        

        fabio-0.1.3/epydoc/toc-fabio.edfimage-module.html0000644000175000017500000000356012120434325022416 0ustar jeromejerome00000000000000 edfimage

        Module edfimage


        Classes

        Frame
        edfimage

        Variables

        BLOCKSIZE
        DATA_TYPES
        DEFAULT_VALUES
        MINIMUM_KEYS
        NUMPY_EDF_DTYPE
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/toc-fabio.cf_io-module.html0000644000175000017500000000226712120434325021737 0ustar jeromejerome00000000000000 cf_io

        Module cf_io


        Functions

        read

        Variables

        __package__

        [hide private] fabio-0.1.3/epydoc/toc-fabio.pnmimage-module.html0000644000175000017500000000311412120434325022445 0ustar jeromejerome00000000000000 pnmimage

        Module pnmimage


        Classes

        pnmimage

        Variables

        HEADERITEMS
        P7HEADERITEMS
        SUBFORMATS
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.cbfimage.CIF-class.html0000644000175000017500000012653112126623347022065 0ustar jeromejerome00000000000000 fabio.cbfimage.CIF
        Package fabio :: Module cbfimage :: Class CIF
        [hide private]
        [frames] | no frames]

        Class CIF

        source code

        object --+    
                 |    
              dict --+
                     |
                    CIF
        

        This is the CIF class, it represents the CIF dictionary; and as a a python dictionary thus inherits from the dict built in class.

        Instance Methods [hide private]
        new empty dictionary
        
        
        __init__(self, _strFilename=None)
        Constructor of the class.
        source code
         
        __setitem__(self, key, value)
        x[i]=y
        source code
        v, remove specified key and return the corresponding value
        pop(self, key)
        If key is not found, d is returned if given, otherwise KeyError is raised
        source code
        (k, v), remove and return some (key, value) pair as a
        popitem(self, key)
        2-tuple; but raise KeyError if D is empty.
        source code
         
        loadCIF(self, _strFilename, _bKeepComment=False)
        Load the CIF file and populates the CIF dictionary into the object
        source code
         
        readCIF(self, _strFilename, _bKeepComment=False)
        Load the CIF file and populates the CIF dictionary into the object
        source code
        None
        _parseCIF(self, sText)
        Parses the text of a CIF file
        source code
         
        saveCIF(self, _strFilename='test.cif', linesep='\n', binary=False)
        Transforms the CIF object in string then write it into the given file
        source code
         
        tostring(self, _strFilename=None, linesep='\n')
        Converts a cif dictionnary to a string according to the CIF syntax
        source code
        boolean
        exists(self, sKey)
        Check if the key exists in the CIF and is non empty.
        source code
        boolean
        existsInLoop(self, sKey)
        Check if the key exists in the CIF dictionary.
        source code
        dictionary
        loadCHIPLOT(self, _strFilename)
        Load the powder diffraction CHIPLOT file and returns the pd_CIF dictionary in the object
        source code

        Inherited from dict: __cmp__, __contains__, __delitem__, __eq__, __ge__, __getattribute__, __getitem__, __gt__, __iter__, __le__, __len__, __lt__, __ne__, __new__, __repr__, __sizeof__, clear, copy, fromkeys, get, has_key, items, iteritems, iterkeys, itervalues, keys, setdefault, update, values

        Inherited from object: __delattr__, __format__, __reduce__, __reduce_ex__, __setattr__, __str__, __subclasshook__

        Static Methods [hide private]
        boolean
        isAscii(_strIn)
        Check if all characters in a string are ascii,
        source code
        string
        _readCIF(_instream)
        Check if the filename containing the CIF data exists
        source code
        list
        _splitCIF(sText)
        Separate the text in fields as defined in the CIF
        source code
        tuple
        _analyseOneLoop(lFields, iStart)
        Processes one loop in the data extraction of the CIF file
        source code
         
        LoopHasKey(loop, key)
        Returns True if the key (string) exist in the array called loop
        source code
        Class Variables [hide private]
          EOL = ['\r', '\n', '\r\n', '\n\r']
          BLANK = [' ', '\t', '\r', '\n', '\r\n', '\n\r']
          START_COMMENT = ['"', '\'']
          BINARY_MARKER = '--CIF-BINARY-FORMAT-SECTION--'

        Inherited from dict: __hash__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, _strFilename=None)
        (Constructor)

        source code 

        Constructor of the class.

        Parameters:
        • _strFilename (filename (str) or file object) - the name of the file to open
        Returns:
        new empty dictionary
        
        
        Overrides: object.__init__

        __setitem__(self, key, value)
        (Index assignment operator)

        source code 

        x[i]=y

        Overrides: dict.__setitem__
        (inherited documentation)

        pop(self, key)

        source code 

        If key is not found, d is returned if given, otherwise KeyError is raised

        Returns: v, remove specified key and return the corresponding value
        Overrides: dict.pop
        (inherited documentation)

        popitem(self, key)

        source code 

        2-tuple; but raise KeyError if D is empty.

        Returns: (k, v), remove and return some (key, value) pair as a
        Overrides: dict.popitem
        (inherited documentation)

        loadCIF(self, _strFilename, _bKeepComment=False)

        source code 

        Load the CIF file and populates the CIF dictionary into the object

        Parameters:
        • _strFilename (string) - the name of the file to open
        • _strFilename (string) - the name of the file to open
        Returns:
        None

        readCIF(self, _strFilename, _bKeepComment=False)

        source code 

        Load the CIF file and populates the CIF dictionary into the object

        Parameters:
        • _strFilename (string) - the name of the file to open
        • _strFilename (string) - the name of the file to open
        Returns:
        None

        isAscii(_strIn)
        Static Method

        source code 

        Check if all characters in a string are ascii,

        Parameters:
        • _strIn (python string) - input string
        Returns: boolean
        boolean

        _readCIF(_instream)
        Static Method

        source code 
        • Check if the filename containing the CIF data exists
        • read the cif file
        • removes the comments
        Parameters:
        • _instream (open file in read mode) - the file containing the CIF data
        Returns: string
        a string containing the raw data

        _parseCIF(self, sText)

        source code 
        • Parses the text of a CIF file
        • Cut it in fields
        • Find all the loops and process
        • Find all the keys and values
        Parameters:
        • sText (string) - the content of the CIF - file
        Returns: None
        Nothing, the data are incorporated at the CIF object dictionary

        _splitCIF(sText)
        Static Method

        source code 

        Separate the text in fields as defined in the CIF

        Parameters:
        • sText (string) - the content of the CIF - file
        Returns: list
        list of all the fields of the CIF

        _analyseOneLoop(lFields, iStart)
        Static Method

        source code 

        Processes one loop in the data extraction of the CIF file

        Parameters:
        • lFields (list) - list of all the words contained in the cif file
        • iStart (integer) - the starting index corresponding to the "loop_" key
        Returns: tuple
        the list of loop dictionaries, the length of the data extracted from the lFields and the list of all the keys of the loop.

        saveCIF(self, _strFilename='test.cif', linesep='\n', binary=False)

        source code 

        Transforms the CIF object in string then write it into the given file

        Parameters:
        • _strFilename - the of the file to be written
        • linesep - line separation used (to force compatibility with windows/unix)
        • binary - Shall we write the data as binary (True only for imageCIF/CBF)
        • param (string)

        tostring(self, _strFilename=None, linesep='\n')

        source code 

        Converts a cif dictionnary to a string according to the CIF syntax

        Parameters:
        • _strFilename (string) - the name of the filename to be appended in the header of the CIF file
        Returns:
        a sting that corresponds to the content of the CIF - file.

        exists(self, sKey)

        source code 

        Check if the key exists in the CIF and is non empty.

        Parameters:
        • sKey (string) - CIF key
        • cif - CIF dictionary
        Returns: boolean
        True if the key exists in the CIF dictionary and is non empty

        existsInLoop(self, sKey)

        source code 

        Check if the key exists in the CIF dictionary.

        Parameters:
        • sKey (string) - CIF key
        • cif - CIF dictionary
        Returns: boolean
        True if the key exists in the CIF dictionary and is non empty

        loadCHIPLOT(self, _strFilename)

        source code 

        Load the powder diffraction CHIPLOT file and returns the pd_CIF dictionary in the object

        Parameters:
        • _strFilename (string) - the name of the file to open
        Returns: dictionary
        the CIF object corresponding to the powder diffraction

        fabio-0.1.3/epydoc/fabio.fabioutils.UnknownCompressedFile-class.html0000644000175000017500000002650312126623347026352 0ustar jeromejerome00000000000000 fabio.fabioutils.UnknownCompressedFile
        Package fabio :: Module fabioutils :: Class UnknownCompressedFile
        [hide private]
        [frames] | no frames]

        Class UnknownCompressedFile

        source code

        object --+        
                 |        
              file --+    
                     |    
                  File --+
                         |
                        UnknownCompressedFile
        

        wrapper for "File" with locking

        Instance Methods [hide private]
        file object
        __init__(self, name, mode='rb', buffering=0)
        Open a file.
        source code

        Inherited from File: getSize, setSize

        Inherited from file: __delattr__, __enter__, __exit__, __getattribute__, __iter__, __new__, __repr__, __setattr__, close, fileno, flush, isatty, next, read, readinto, readline, readlines, seek, tell, truncate, write, writelines, xreadlines

        Inherited from object: __format__, __hash__, __reduce__, __reduce_ex__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from File: size

        Inherited from file: closed, encoding, errors, mode, name, newlines, softspace

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, name, mode='rb', buffering=0)
        (Constructor)

        source code 
                Open a file.  The mode can be 'r', 'w' or 'a' for reading (default),
                writing or appending.  The file will be created if it doesn't exist
                when opened for writing or appending; it will be truncated when
                opened for writing.  Add a 'b' to the mode for binary files.
                Add a '+' to the mode to allow simultaneous reading and writing.
                If the buffering argument is given, 0 means unbuffered, 1 means line
                buffered, and larger numbers specify the buffer size.  The preferred way
                to open a file is with the builtin open() function.
                Add a 'U' to mode to open the file for input with universal newline
                support.  Any line ending in the input file will be seen as a '
        '
                in Python.  Also, a file so opened gains the attribute 'newlines';
                the value for this attribute is one of None (no newline read yet),
                '
        ', '
        ', '
        ' or a tuple containing all the newline types seen.
                
                'U' cannot be combined with 'w' or '+' mode.
                
        
        
        Returns: file object
        Overrides: object.__init__
        (inherited documentation)

        fabio-0.1.3/epydoc/toc-fabio.OXDimage-module.html0000644000175000017500000000354012120434325022310 0ustar jeromejerome00000000000000 OXDimage

        Module OXDimage


        Classes

        OXDimage
        Section

        Variables

        DEFAULT_HEADERS
        DETECTOR_TYPES
        __doc__
        __package__
        deg2rad
        logger
        rad2deg

        [hide private] fabio-0.1.3/epydoc/fabio.pnmimage-module.html0000644000175000017500000002654312126623347021707 0ustar jeromejerome00000000000000 fabio.pnmimage
        Package fabio :: Module pnmimage
        [hide private]
        [frames] | no frames]

        Module pnmimage

        source code

        
        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:henning.sorensen@risoe.dk
        
        
        Classes [hide private]
          pnmimage
        Variables [hide private]
          logger = logging.getLogger("pnmimage")
          SUBFORMATS = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7']
          HEADERITEMS = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL']
          P7HEADERITEMS = ['WIDTH', 'HEIGHT', 'DEPTH', 'MAXVAL', 'TUPLTY...
          __package__ = 'fabio'
        Variables Details [hide private]

        P7HEADERITEMS

        Value:
        ['WIDTH', 'HEIGHT', 'DEPTH', 'MAXVAL', 'TUPLTYPE', 'ENDHDR']
        

        fabio-0.1.3/epydoc/identifier-index.html0000644000175000017500000037161712126623347021004 0ustar jeromejerome00000000000000 Identifier Index
         
        [hide private]
        [frames] | no frames]

        Identifier Index

        [ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ ]

        A

        B

        C

        D

        E

        F

        G

        H

        I

        J

        K

        L

        M

        N

        O

        P

        R

        S

        T

        U

        V

        W

        X

        _



        fabio-0.1.3/epydoc/fabio.GEimage_old-module.html0000644000175000017500000001402212126623347022233 0ustar jeromejerome00000000000000 fabio.GEimage_old
        Package fabio :: Module GEimage_old
        [hide private]
        [frames] | no frames]

        Module GEimage_old

        source code

        
        Reads the header from a GE a-Si Angio Detector
        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:erik.knudsen@risoe.dk
        
                + Jon Wright, ESRF
        
                The header information has been taken from the script read_GEaSi_data.py
                by
                Antonino Miceli
                Thu Jan  4 13:46:31 CST 2007
        
        
        Classes [hide private]
          GEimage
        Variables [hide private]
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.marccdimage-module.html0000644000175000017500000005211612126623347022341 0ustar jeromejerome00000000000000 fabio.marccdimage
        Package fabio :: Module marccdimage
        [hide private]
        [frames] | no frames]

        Module marccdimage

        source code

        
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions;
          Risoe National Laboratory;
          Frederiksborgvej 399;
          DK-4000 Roskilde;
          email:erik.knudsen@risoe.dk
        * Jon Wright:
          European Synchrotron Radiation Facility;
          Grenoble (France)
                 
        marccdimage can read MarCCD and MarMosaic images including header info.
        
        JPW : Use a parser in case of typos (sorry?)
        
        
        Classes [hide private]
          marccdimage
        Read in data in mar ccd format, also MarMosaic images, including header info
        Functions [hide private]
         
        make_format(c_def_string)
        Reads the header definition in c and makes the format string to pass to struct.unpack
        source code
         
        interpret_header(header, fmt, names)
        given a format and header interpret it
        source code
        Variables [hide private]
          logger = logging.getLogger("marccdimage")
          CDEFINITION = '\ntypedef struct frame_header_type {\n ...
          C_TO_STRUCT = {'INT32': 'i', 'UINT16': 'H', 'UINT32': 'I', 'ch...
          C_SIZES = {'INT32': 4, 'UINT16': 2, 'UINT32': 4, 'char': 1}
          MAXIMAGES = 9
          HEADER_FORMAT = 'IccccccccccccccccIIIIIIIIIIIIIIIIIIIIIIIIIIII...
          HEADER_NAMES = ['header_type', 'header_name[16]', 'header_name...
          __package__ = 'fabio'
        Variables Details [hide private]

        CDEFINITION

        Value:
        '''
        typedef struct frame_header_type {
                 /* File/header format parameters (256 bytes) */
                 UINT32        header_type;  /* flag for header type  
                                                   (can be  used as magic numb\
        er) */
                 char header_name[16];           /* header name (MMX) */
                 UINT32        header_major_version;   /* header_major_version\
        ...
        

        C_TO_STRUCT

        Value:
        {'INT32': 'i', 'UINT16': 'H', 'UINT32': 'I', 'char': 'c'}
        

        HEADER_FORMAT

        Value:
        'IccccccccccccccccIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIccccccccccccc\
        cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccIII\
        IIIIIIIIIIIIIIIIIIIccccccccccccccccccccccccccccccccccccccccHHHHHHHHHHH\
        HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\
        HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHiiiiiiiiiiiiiiiiiiiiiii\
        iiiiicccccccccccccccciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiccccccc\
        ccccccccciiiiiiiiiiccccccccccccccccccccccccccccccccccccccccccccccccccc\
        cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\
        ...
        

        HEADER_NAMES

        Value:
        ['header_type',
         'header_name[16]',
         'header_name[16]',
         'header_name[16]',
         'header_name[16]',
         'header_name[16]',
         'header_name[16]',
         'header_name[16]',
        ...
        

        fabio-0.1.3/epydoc/fabio.edfimage-module.html0000644000175000017500000004275012126623347021651 0ustar jeromejerome00000000000000 fabio.edfimage
        Package fabio :: Module edfimage
        [hide private]
        [frames] | no frames]

        Module edfimage

        source code

        
        
        License: GPLv2+
        
        Authors:
        ........
        * Henning O. Sorensen & Erik Knudsen:
          Center for Fundamental Research: Metal Structures in Four Dimensions;
          Risoe National Laboratory;
          Frederiksborgvej 399;
          DK-4000 Roskilde;
          email:erik.knudsen@risoe.dk
        * Jon Wright & Jérôme Kieffer:
          European Synchrotron Radiation Facility;
          Grenoble (France)
        
        
        Classes [hide private]
          Frame
        A class representing a single frame in an EDF file
          edfimage
        Read and try to write the ESRF edf data format
        Variables [hide private]
          logger = logging.getLogger("edfimage")
          BLOCKSIZE = 512
          DATA_TYPES = {'Double': <type 'numpy.float64'>, 'DoubleIEEE128...
          NUMPY_EDF_DTYPE = {'float128': 'QuadrupleValue', 'float32': 'F...
          MINIMUM_KEYS = ['HEADERID', 'IMAGE', 'BYTEORDER', 'DATATYPE', ...
          DEFAULT_VALUES = {}
          __package__ = 'fabio'
        Variables Details [hide private]

        DATA_TYPES

        Value:
        {'Double': <type 'numpy.float64'>,
         'DoubleIEEE128': <type 'numpy.float128'>,
         'DoubleIEEE64': <type 'numpy.float64'>,
         'DoubleValue': <type 'numpy.float64'>,
         'FLOAT': <type 'numpy.float32'>,
         'FLOATVALUE': <type 'numpy.float32'>,
         'Float': <type 'numpy.float32'>,
         'Float32': <type 'numpy.float32'>,
        ...
        

        NUMPY_EDF_DTYPE

        Value:
        {'float128': 'QuadrupleValue',
         'float32': 'FloatValue',
         'float64': 'DoubleValue',
         'int16': 'SignedShort',
         'int32': 'SignedInteger',
         'int64': 'Signed64',
         'int8': 'SignedByte',
         'uint16': 'UnsignedShort',
        ...
        

        MINIMUM_KEYS

        Value:
        ['HEADERID',
         'IMAGE',
         'BYTEORDER',
         'DATATYPE',
         'DIM_1',
         'DIM_2',
         'SIZE']
        

        fabio-0.1.3/epydoc/toc-fabio.kcdimage-module.html0000644000175000017500000000312012120434325022411 0ustar jeromejerome00000000000000 kcdimage

        Module kcdimage


        Classes

        kcdimage

        Variables

        DATA_TYPES
        DEFAULT_VALUES
        MINIMUM_KEYS
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/toc-fabio.readbytestream-module.html0000644000175000017500000000266312120434325023673 0ustar jeromejerome00000000000000 readbytestream

        Module readbytestream


        Functions

        readbytestream

        Variables

        DATATYPES
        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.HiPiCimage-module.html0000644000175000017500000001442212126623347022042 0ustar jeromejerome00000000000000 fabio.HiPiCimage
        Package fabio :: Module HiPiCimage
        [hide private]
        [frames] | no frames]

        Module HiPiCimage

        source code

        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:erik.knudsen@risoe.dk
        
                + Jon Wright, ESRF
        
        Information about the file format from Masakatzu Kobayashi is highly appreciated
        
        
        Classes [hide private]
          HiPiCimage
        Read HiPic images e.g.
        Variables [hide private]
          logger = logging.getLogger("HiPiCimage")
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.adscimage-pysrc.html0000644000175000017500000020316712126623347021701 0ustar jeromejerome00000000000000 fabio.adscimage
        Package fabio :: Module adscimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.adscimage

          1  #!/usr/bin/env python 
          2  #coding: utf8 
          3  """ 
          4   
          5  Authors: Henning O. Sorensen & Erik Knudsen 
          6           Center for Fundamental Research: Metal Structures in Four Dimensions 
          7           Risoe National Laboratory 
          8           Frederiksborgvej 399 
          9           DK-4000 Roskilde 
         10           email:erik.knudsen@risoe.dk 
         11   
         12  + mods for fabio by JPW 
         13   
         14  """ 
         15   
         16  import numpy, logging 
         17  from fabioimage import fabioimage 
         18  logger = logging.getLogger("adscimage") 
         19   
        
        20 -class adscimage(fabioimage):
        21 """ Read an image in ADSC format (quite similar to edf?) """
        22 - def __init__(self, *args, **kwargs):
        23 fabioimage.__init__(self, *args, **kwargs)
        24
        25 - def read(self, fname, frame=None):
        26 """ read in the file """ 27 infile = self._open(fname, "rb") 28 try: 29 self._readheader(infile) 30 except: 31 raise Exception("Error processing adsc header") 32 # banned by bzip/gzip??? 33 try: 34 infile.seek(int(self.header['HEADER_BYTES']), 0) 35 except TypeError: 36 # Gzipped does not allow a seek and read header is not 37 # promising to stop in the right place 38 infile.close() 39 infile = self._open(fname, "rb") 40 infile.read(int(self.header['HEADER_BYTES'])) 41 binary = infile.read() 42 infile.close() 43 44 #now read the data into the array 45 self.dim1 = int(self.header['SIZE1']) 46 self.dim2 = int(self.header['SIZE2']) 47 if 'little' in self.header['BYTE_ORDER']: 48 try: 49 self.data = numpy.reshape( 50 numpy.fromstring(binary, numpy.uint16), 51 (self.dim2, self.dim1)) 52 except ValueError: 53 raise IOError, 'Size spec in ADSC-header does not match ' + \ 54 'size of image data field' 55 self.bytecode = numpy.uint16 56 logger.info("adscimage read in using low byte first (x386-order)") 57 else: 58 try: 59 self.data = numpy.reshape( 60 numpy.fromstring(binary, numpy.uint16), 61 (self.dim2, self.dim1)).byteswap() 62 except ValueError: 63 raise IOError, 'Size spec in ADSC-header does not match ' + \ 64 'size of image data field' 65 self.bytecode = numpy.uint16 66 logger.info('adscimage using high byte first (network order)') 67 self.resetvals() 68 return self
        69 70
        71 - def _readheader(self, infile):
        72 """ read an adsc header """ 73 line = infile.readline() 74 bytesread = len(line) 75 while '}' not in line: 76 if '=' in line: 77 (key, val) = line.split('=') 78 self.header_keys.append(key.strip()) 79 self.header[key.strip()] = val.strip(' ;\n') 80 line = infile.readline() 81 bytesread = bytesread + len(line)
        82 83
        84 - def write(self, fname):
        85 """ 86 Write adsc format 87 """ 88 out = '{\n' 89 for key in self.header_keys: 90 out += "%s = %s;\n" % (key, self.header[key]) 91 # FIXME ??? - made padding match header bytes keyword 92 # the cbflib example image has exactly 512... 93 if self.header.has_key("HEADER_BYTES"): 94 pad = int(self.header["HEADER_BYTES"]) - len(out) - 2 95 else: 96 # integer division 97 # 1234567890123456789012 98 # HEADER_BYTES = 1234;\n 99 hsize = ((len(out) + 23) / 512 + 1) * 512 100 out += "HEADER_BYTES=%d;\n" % (hsize) 101 pad = hsize - len(out) - 2 102 out += pad * ' ' + "}\n" 103 assert len(out) % 512 == 0 , "Header is not multiple of 512" 104 outf = open(fname, "wb") 105 outf.write(out) 106 # it says "unsigned_short" ? ... jpw example has: 107 # BYTE_ORDER=big_endian; 108 # TYPE=unsigned_short; 109 if "little" in self.header["BYTE_ORDER"]: 110 outf.write(self.data.astype(numpy.uint16).tostring()) 111 else: 112 outf.write(self.data.byteswap().astype( 113 numpy.uint16).tostring()) 114 outf.close()
        115 116
        117 -def test():
        118 """ testcase """ 119 import sys, time 120 img = adscimage() 121 begin = time.clock() 122 while (sys.argv[1:]): 123 img.read(sys.argv[1]) 124 # rim = img.toPIL16() 125 img.rebin(2, 2) 126 img.write('jegErEnFil0000.img') 127 print sys.argv[1] + ": max=%d, min=%d, mean=%.2e, stddev=%.2e" % (\ 128 img.getmax(), img.getmin(), img.getmean(), img.getstddev()) 129 print 'integrated intensity (%d %d %d %d) =%.3f' % (\ 130 10, 20, 20, 40, img.integrate_area((10, 20, 20, 40))) 131 sys.argv[1:] = sys.argv[2:] 132 end = time.clock() 133 print end - begin
        134 135 136 if __name__ == '__main__': 137 test() 138

        fabio-0.1.3/epydoc/fabio.datIO-module.html0000644000175000017500000001427212126623347021106 0ustar jeromejerome00000000000000 fabio.datIO
        Package fabio :: Module datIO
        [hide private]
        [frames] | no frames]

        Module datIO

        source code

        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:erik.knudsen@risoe.dk
                 
                 and Jon Wright, ESRF
        
        
        Classes [hide private]
          fabiodata
        A common class for dataIO in fable Contains a 2d numpy array for keeping data, and two lists (clabels and rlabels) containing labels for columns and rows respectively
          columnfile
        Concrete fabiodata class
        Variables [hide private]
          __package__ = None
        hash(x)
        fabio-0.1.3/epydoc/fabio.binaryimage-pysrc.html0000644000175000017500000013702512126623347022252 0ustar jeromejerome00000000000000 fabio.binaryimage
        Package fabio :: Module binaryimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.binaryimage

         1  #!/usr/bin/env python 
         2  #coding: utf8  
         3  from __future__ import with_statement 
         4  __doc__ = """ 
         5  Authors: Gael Goret, Jerome Kieffer, ESRF, France 
         6  Emails: gael.goret@esrf.fr, jerome.kieffer@esrf.fr 
         7   
         8  Binary files images are simple none-compressed 2D images only defined by their :  
         9  data-type, dimensions, byte order and offset 
        10   
        11  This simple library has been made for manipulating exotic/unknown files format.   
        12  """ 
        13   
        14  __authors__ = ["Gaël Goret", "Jérôme Kieffer"] 
        15  __contact__ = "gael.goret@esrf.fr"#, jerome.kieffer@esrf.eu" 
        16  __license__ = "GPLv3+" 
        17  __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" 
        18  __version__ = "17 Apr 2012" 
        19   
        20  from fabioimage import fabioimage 
        21  import numpy, logging 
        22  logger = logging.getLogger("binaryimage") 
        
        23 24 -class binaryimage(fabioimage):
        25 """ 26 This simple library has been made for manipulating exotic/unknown files format. 27 28 Binary files images are simple none-compressed 2D images only defined by their : 29 data-type, dimensions, byte order and offset 30 """ 31
        32 - def __init__(self, *args, **kwargs):
        33 fabioimage.__init__(self, *args, **kwargs)
        34 35 @staticmethod
        36 - def swap_needed(endian):
        37 """ 38 Decide if we need to byteswap 39 """ 40 if (endian == '<' and numpy.little_endian) or (endian == '>' and not numpy.little_endian): 41 return False 42 if (endian == '>' and numpy.little_endian) or (endian == '<' and not numpy.little_endian): 43 return True
        44
        45 - def read(self, fname, dim1, dim2, offset=0, bytecode="int32", endian="<"):
        46 """ 47 Read a binary image 48 Parameters : fname, dim1, dim2, offset, bytecode, endian 49 fname : file name : str 50 dim1,dim2 : image dimensions : int 51 offset : size of the : int 52 bytecode among : "int8","int16","int32","int64","uint8","uint16","uint32","uint64","float32","float64",... 53 endian among short or long endian ("<" or ">") 54 """ 55 self.filename = fname 56 self.dim1 = dim1 57 self.dim2 = dim2 58 self.bytecode = bytecode 59 f = open(self.filename, "rb") 60 dims = [dim2, dim1] 61 bpp = len(numpy.array(0, bytecode).tostring()) 62 size = dims[0] * dims[1] * bpp 63 64 f.seek(offset) 65 rawData = f.read(size) 66 if self.swap_needed(endian): 67 data = numpy.fromstring(rawData, bytecode).byteswap().reshape(tuple(dims)) 68 else: 69 data = numpy.fromstring(rawData, bytecode).reshape(tuple(dims)) 70 self.data = data 71 return self
        72
        73 - def estimate_offset_value(self, fname, dim1, dim2, bytecode="int32"):
        74 "Estimates the size of a file" 75 with open(fname, "rb") as f: 76 bpp = len(numpy.array(0, bytecode).tostring()) 77 size = dim1 * dim2 * bpp 78 totsize = len(f.read()) 79 logger.info('total size (bytes): %s', totsize) 80 logger.info('expected data size given parameters (bytes): %s', size) 81 logger.info('estimation of the offset value (bytes): %s', totsize - size)
        82
        83 - def write(self, fname):
        84 with open(fname, mode="wb") as outfile: 85 outfile.write(self.data.tostring())
        86

        fabio-0.1.3/epydoc/help.html0000644000175000017500000002472512126623347016500 0ustar jeromejerome00000000000000 Help
         
        [hide private]
        [frames] | no frames]

        API Documentation

        This document contains the API (Application Programming Interface) documentation for this project. Documentation for the Python objects defined by the project is divided into separate pages for each package, module, and class. The API documentation also includes two pages containing information about the project as a whole: a trees page, and an index page.

        Object Documentation

        Each Package Documentation page contains:

        • A description of the package.
        • A list of the modules and sub-packages contained by the package.
        • A summary of the classes defined by the package.
        • A summary of the functions defined by the package.
        • A summary of the variables defined by the package.
        • A detailed description of each function defined by the package.
        • A detailed description of each variable defined by the package.

        Each Module Documentation page contains:

        • A description of the module.
        • A summary of the classes defined by the module.
        • A summary of the functions defined by the module.
        • A summary of the variables defined by the module.
        • A detailed description of each function defined by the module.
        • A detailed description of each variable defined by the module.

        Each Class Documentation page contains:

        • A class inheritance diagram.
        • A list of known subclasses.
        • A description of the class.
        • A summary of the methods defined by the class.
        • A summary of the instance variables defined by the class.
        • A summary of the class (static) variables defined by the class.
        • A detailed description of each method defined by the class.
        • A detailed description of each instance variable defined by the class.
        • A detailed description of each class (static) variable defined by the class.

        Project Documentation

        The Trees page contains the module and class hierarchies:

        • The module hierarchy lists every package and module, with modules grouped into packages. At the top level, and within each package, modules and sub-packages are listed alphabetically.
        • The class hierarchy lists every class, grouped by base class. If a class has more than one base class, then it will be listed under each base class. At the top level, and under each base class, classes are listed alphabetically.

        The Index page contains indices of terms and identifiers:

        • The term index lists every term indexed by any object's documentation. For each term, the index provides links to each place where the term is indexed.
        • The identifier index lists the (short) name of every package, module, class, method, function, variable, and parameter. For each identifier, the index provides a short description, and a link to its documentation.

        The Table of Contents

        The table of contents occupies the two frames on the left side of the window. The upper-left frame displays the project contents, and the lower-left frame displays the module contents:

        Project
        Contents
        ...
        API
        Documentation
        Frame


        Module
        Contents
         
        ...
         

        The project contents frame contains a list of all packages and modules that are defined by the project. Clicking on an entry will display its contents in the module contents frame. Clicking on a special entry, labeled "Everything," will display the contents of the entire project.

        The module contents frame contains a list of every submodule, class, type, exception, function, and variable defined by a module or package. Clicking on an entry will display its documentation in the API documentation frame. Clicking on the name of the module, at the top of the frame, will display the documentation for the module itself.

        The "frames" and "no frames" buttons below the top navigation bar can be used to control whether the table of contents is displayed or not.

        The Navigation Bar

        A navigation bar is located at the top and bottom of every page. It indicates what type of page you are currently viewing, and allows you to go to related pages. The following table describes the labels on the navigation bar. Note that not some labels (such as [Parent]) are not displayed on all pages.

        Label Highlighted when... Links to...
        [Parent] (never highlighted) the parent of the current package
        [Package] viewing a package the package containing the current object
        [Module] viewing a module the module containing the current object
        [Class] viewing a class the class containing the current object
        [Trees] viewing the trees page the trees page
        [Index] viewing the index page the index page
        [Help] viewing the help page the help page

        The "show private" and "hide private" buttons below the top navigation bar can be used to control whether documentation for private objects is displayed. Private objects are usually defined as objects whose (short) names begin with a single underscore, but do not end with an underscore. For example, "_x", "__pprint", and "epydoc.epytext._tokenize" are private objects; but "re.sub", "__init__", and "type_" are not. However, if a module defines the "__all__" variable, then its contents are used to decide which objects are private.

        A timestamp below the bottom navigation bar indicates when each page was last updated.

        fabio-0.1.3/epydoc/fabio.fabioutils-module.html0000644000175000017500000010361412126623347022246 0ustar jeromejerome00000000000000 fabio.fabioutils
        Package fabio :: Module fabioutils
        [hide private]
        [frames] | no frames]

        Module fabioutils

        source code

        General purpose utilities functions for fabio

        Classes [hide private]
          FilenameObject
        The 'meaning' of a filename ...
          StringIO
        just an interface providing the name and mode property to a StringIO
          File
        wrapper for "file" with locking
          UnknownCompressedFile
        wrapper for "File" with locking
          GzipFile
        Just a wrapper forgzip.GzipFile providing the correct seek capabilities for python 2.5
          BZ2File
        Wrapper with lock
        Functions [hide private]
         
        deprecated(func)
        used to deprecate a function/method: prints a lot of warning messages to enforce the modifaction of the code
        source code
         
        getnum(name)
        # try to figure out a file number # guess it starts at the back
        source code
         
        numstem(name)
        cant see how to do without reversing strings Match 1 or more digits going backwards from the end of the string
        source code
         
        deconstruct_filename(*arg, **kw)
        decorator that deprecates the use of a function
        source code
         
        construct_filename(filename, frame=None)
        Try to construct the filename for a given frame
        source code
         
        next_filename(name, padding=True)
        increment number
        source code
         
        previous_filename(name, padding=True)
        decrement number
        source code
         
        jump_filename(name, num, padding=True)
        jump to number
        source code
         
        extract_filenumber(name)
        extract file number
        source code
         
        isAscii(name, listExcluded=None)
        Returns: True of False whether name is pure ascii or not
        source code
         
        toAscii(name, excluded=None)
        Returns: the name with all non valid char removed
        source code
         
        nice_int(s)
        Workaround that int('1.0') raises an exception
        source code
        Variables [hide private]
          logger = logging.getLogger("fabioutils")
          FILETYPES = {'cbf': ['cbf'], 'cbf.bz2': ['cbf'], 'cbf.gz': ['c...
          COMPRESSORS = {'.bz2': 'bzip2 -dc ', '.gz': 'gzip -dc '}
          dictAscii = {None: [' ', '!', '"', '#', '$', '%', '&', '\'', '...
          lines = 'bzip2, a block-sorting file compressor. Version 1.0....
          __package__ = 'fabio'
          i = 126
          key = 'cbf'
        Function Details [hide private]

        deconstruct_filename(*arg, **kw)

        source code 

        decorator that deprecates the use of a function

        Decorators:
        • @deprecated

        isAscii(name, listExcluded=None)

        source code 
        Parameters:
        • name - string to check
        • listExcluded - list of char or string excluded.
        Returns:
        True of False whether name is pure ascii or not

        toAscii(name, excluded=None)

        source code 
        Parameters:
        • name - string to check
        • excluded - tuple of char or string excluded (not list: they are mutable).
        Returns:
        the name with all non valid char removed

        nice_int(s)

        source code 

        Workaround that int('1.0') raises an exception

        Parameters:
        • s - string to be converted to integer

        Variables Details [hide private]

        FILETYPES

        Value:
        {'cbf': ['cbf'],
         'cbf.bz2': ['cbf'],
         'cbf.gz': ['cbf'],
         'cor': ['edf'],
         'cor.bz2': ['edf'],
         'cor.gz': ['edf'],
         'dm3': ['dm3'],
         'dm3.bz2': ['dm3'],
        ...
        

        dictAscii

        Value:
        {None: [' ',
                '!',
                '"',
                '#',
                '$',
                '%',
                '&',
                '\'',
        ...
        

        lines

        Value:
        '''bzip2, a block-sorting file compressor.  Version 1.0.5, 10-Dec-2007\
        .
        
           usage: bzip2 [flags and input files in any order]
        
           -h --help           print this message
           -d --decompress     force decompression
           -z --compress       force compression
        ...
        

        fabio-0.1.3/epydoc/frames.html0000644000175000017500000000111312120434325016775 0ustar jeromejerome00000000000000 API Documentation fabio-0.1.3/epydoc/fabio.fabioutils.File-class.html0000644000175000017500000003250412126623347022743 0ustar jeromejerome00000000000000 fabio.fabioutils.File
        Package fabio :: Module fabioutils :: Class File
        [hide private]
        [frames] | no frames]

        Class File

        source code

        object --+    
                 |    
              file --+
                     |
                    File
        
        Known Subclasses:

        wrapper for "file" with locking

        Instance Methods [hide private]
        file object
        __init__(name, mode=..., buffering=...)
        Open a file.
        source code
         
        getSize(self) source code
         
        setSize(self, size) source code

        Inherited from file: __delattr__, __enter__, __exit__, __getattribute__, __iter__, __new__, __repr__, __setattr__, close, fileno, flush, isatty, next, read, readinto, readline, readlines, seek, tell, truncate, write, writelines, xreadlines

        Inherited from object: __format__, __hash__, __reduce__, __reduce_ex__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]
          size

        Inherited from file: closed, encoding, errors, mode, name, newlines, softspace

        Inherited from object: __class__

        Method Details [hide private]

        __init__(name, mode=..., buffering=...)
        (Constructor)

        source code 
                Open a file.  The mode can be 'r', 'w' or 'a' for reading (default),
                writing or appending.  The file will be created if it doesn't exist
                when opened for writing or appending; it will be truncated when
                opened for writing.  Add a 'b' to the mode for binary files.
                Add a '+' to the mode to allow simultaneous reading and writing.
                If the buffering argument is given, 0 means unbuffered, 1 means line
                buffered, and larger numbers specify the buffer size.  The preferred way
                to open a file is with the builtin open() function.
                Add a 'U' to mode to open the file for input with universal newline
                support.  Any line ending in the input file will be seen as a '
        '
                in Python.  Also, a file so opened gains the attribute 'newlines';
                the value for this attribute is one of None (no newline read yet),
                '
        ', '
        ', '
        ' or a tuple containing all the newline types seen.
                
                'U' cannot be combined with 'w' or '+' mode.
                
        
        
        Returns: file object
        Overrides: object.__init__

        Property Details [hide private]

        size

        Get Method:
        getSize(self)
        Set Method:
        setSize(self, size)

        fabio-0.1.3/epydoc/toc-fabio.bruker100image-module.html0000644000175000017500000000251312120434325023370 0ustar jeromejerome00000000000000 bruker100image

        Module bruker100image


        Classes

        bruker100image

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.pilatusimage-pysrc.html0000644000175000017500000006333012126623347022444 0ustar jeromejerome00000000000000 fabio.pilatusimage
        Package fabio :: Module pilatusimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.pilatusimage

         1  #!/usr/bin/env python 
         2  #coding: utf8 
         3  """ 
         4   
         5  Authors: 
         6  ........ 
         7  * Henning O. Sorensen & Erik Knudsen: 
         8    Center for Fundamental Research: Metal Structures in Four Dimensions; 
         9    Risoe National Laboratory; 
        10    Frederiksborgvej 399; 
        11    DK-4000 Roskilde; 
        12    email:erik.knudsen@risoe.dk 
        13  * Jon Wright: 
        14    European Synchrotron Radiation Facility; 
        15    Grenoble (France) 
        16   
        17  """ 
        18   
        19   
        20  # Base this on the tifimage (as Pilatus is tiff with a 
        21  # tiff header 
        22   
        23  from fabio.tifimage import tifimage 
        24   
        25   
        
        26 -class pilatusimage(tifimage):
        27 """ Read in Pilatus format, also 28 pilatus images, including header info """ 29 30
        31 - def _readheader(self, infile):
        32 """ 33 Parser based approach 34 Gets all entries 35 """ 36 37 self.header = {} 38 39 # infile = open(infile) 40 hstr = infile.read(4096) 41 # well not very pretty - but seems to find start of 42 # header information 43 if (hstr.find('# ') == -1): 44 return self.header 45 46 hstr = hstr[hstr.index('# '):] 47 hstr = hstr[:hstr.index('\x00')] 48 hstr = hstr.split('#') 49 go_on = True 50 while go_on: 51 try: 52 hstr.remove('') 53 except Exception: 54 go_on = False 55 56 for line in hstr: 57 line = line[1:line.index('\r\n')] 58 if line.find(':') > -1: 59 dump = line.split(':') 60 self.header[dump[0]] = dump[1] 61 elif line.find('=') > -1: 62 dump = line.split('=') 63 self.header[dump[0]] = dump[1] 64 elif line.find(' ') > -1: 65 i = line.find(' ') 66 self.header[line[:i]] = line[i:] 67 elif line.find(',') > -1: 68 dump = line.split(',') 69 self.header[dump[0]] = dump[1] 70 71 return self.header
        72 73 74
        75 - def _read(self, fname):
        76 """ 77 inherited from tifimage 78 ... a Pilatus image *is a* tif image 79 just with a header 80 """ 81 return tifimage.read(self, fname)
        82

        fabio-0.1.3/epydoc/fabio.converters-module.html0000644000175000017500000004014612126623347022277 0ustar jeromejerome00000000000000 fabio.converters
        Package fabio :: Module converters
        [hide private]
        [frames] | no frames]

        Module converters

        source code

        Converter module. This is for the moment empty (populated only with almost pass through anonymous functions) but aims to be populated with more sofisticated translators ...


        Author: J\xc3\xa9r\xc3\xb4me Kieffer

        Contact: jerome.kieffer@esrf.eu

        Copyright: European Synchrotron Radiation Facility, Grenoble, France

        License: GPLv3+

        Functions [hide private]
         
        convert_data_integer(data)
        convert data to integer
        source code
         
        convert_data(inp, outp, data)
        Return data converted to the output format ...
        source code
         
        convert_header(inp, outp, header)
        return header converted to the output format
        source code
        Variables [hide private]
          logger = logging.getLogger("converter")
          CONVERSION_HEADER = {('edfimage', 'edfimage'): <function <lamb...
          CONVERSION_DATA = {('edfimage', 'OXDimage'): <function convert...
          __package__ = 'fabio'
        Function Details [hide private]

        convert_data(inp, outp, data)

        source code 

        Return data converted to the output format ... over-simplistic implementation for the moment ...

        Parameters:
        • inp, outp - input/output format like "cbfimage"
        • data(ndarray) - the actual dataset to be transformed

        convert_header(inp, outp, header)

        source code 

        return header converted to the output format

        Parameters:
        • inp, outp - input/output format like "cbfimage"
        • header(dict) - the actual set of headers to be transformed

        Variables Details [hide private]

        CONVERSION_HEADER

        Value:
        {('edfimage', 'edfimage'): <function <lambda> at 0x2136500>}
        

        CONVERSION_DATA

        Value:
        {("edfimage", "edfimage"): lambda data: data, ("edfimage", "cbfimage")\
        : convert_data_integer, ("edfimage", "mar345image"): convert_data_inte\
        ger, ("edfimage", "fit2dmaskimage"): convert_data_integer, ("edfimage"\
        , "kcdimage"): convert_data_integer, ("edfimage", "OXDimage"): convert\
        _data_integer, ("edfimage", "pnmimage"): convert_data_integer,}
        

        fabio-0.1.3/epydoc/toc-fabio.byte_offset-module.html0000644000175000017500000000226612120434325023170 0ustar jeromejerome00000000000000 byte_offset

        Module byte_offset


        Variables

        __package__
        __test__

        [hide private] fabio-0.1.3/epydoc/fabio.tifimage.tifimage-class.html0000644000175000017500000004553112126623347023301 0ustar jeromejerome00000000000000 fabio.tifimage.tifimage
        Package fabio :: Module tifimage :: Class tifimage
        [hide private]
        [frames] | no frames]

        Class tifimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               tifimage
        
        Known Subclasses:

        Images in TIF format Wraps TiffIO

        Instance Methods [hide private]
         
        __init__(self, *args, **kwds)
        Tifimage constructor adds an nbits member attribute
        source code
         
        _readheader(self, infile)
        Try to read Tiff images header...
        source code
         
        read(self, fname, frame=None)
        Wrapper for TiffIO.
        source code
         
        write(self, fname)
        Overrides the fabioimage.write method and provides a simple TIFF image writer.
        source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
          _need_a_seek_to_read = True

        Inherited from fabioimage.fabioimage (private): _need_a_real_file

        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, *args, **kwds)
        (Constructor)

        source code 

        Tifimage constructor adds an nbits member attribute

        Overrides: object.__init__

        _readheader(self, infile)

        source code 

        Try to read Tiff images header...

        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 

        Wrapper for TiffIO.

        Overrides: fabioimage.fabioimage.read

        write(self, fname)

        source code 

        Overrides the fabioimage.write method and provides a simple TIFF image writer.

        Parameters:
        • fname - name of the file to save the image to
        Overrides: fabioimage.fabioimage.write

        fabio-0.1.3/epydoc/fabio.GEimage_old-pysrc.html0000644000175000017500000034017012126623347022114 0ustar jeromejerome00000000000000 fabio.GEimage_old
        Package fabio :: Module GEimage_old
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.GEimage_old

          1  
         
          2  #!/usr/bin/env python
         
          3  
         
          4  """
         
          5  Reads the header from a GE a-Si Angio Detector
         
          6  
         
          7  Authors: Henning O. Sorensen & Erik Knudsen
         
          8           Center for Fundamental Research: Metal Structures in Four Dimensions
         
          9           Risoe National Laboratory
         
         10           Frederiksborgvej 399
         
         11           DK-4000 Roskilde
         
         12           email:erik.knudsen@risoe.dk
         
         13  
         
         14          + Jon Wright, ESRF
         
         15  
         
         16          The header information has been taken from the script read_GEaSi_data.py
         
         17          by
         
         18          Antonino Miceli
         
         19          Thu Jan  4 13:46:31 CST 2007
         
         20  
         
         21  """ 
         22  
         
         23  import numpy 
         24  from fabioimage import fabioimage 
         25  
         
        
        26 -class GEimage(fabioimage):
        27 28
        29 - def _readheader(self, infile):
        30 31 infile.seek(0) 32 33 # ADEPT 34 self.ImageFormat = infile.read(10) 35 36 # USHORT --> "=H" 37 # ULONG --> "=L" 38 # = means byte order is native 39 40 self.header['HeaderVersion'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] 41 self.header['HeaderSizeInBytes'] = int(numpy.fromstring(infile.read(4), numpy.uint32)[0]) 42 self.header['UserHeaderVersion'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] 43 self.header['UserHeaderSizeInBytes'] = int(numpy.fromstring(infile.read(4), numpy.uint32)[0]) 44 45 self.header['NumberOfFrames'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] 46 self.header['NumberOfRowsInFrame'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] 47 self.header['NumberOfColsInFrame'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] 48 self.header['BitsPerPixel'] = numpy.fromstring(infile.read(2), numpy.uint16)[0] 49 50 self.header['AcquisitionDate'] = infile.read(20) 51 self.header['AcquisitionTime'] = infile.read(20) 52 53 self.DUTID = infile.read(20) 54 55 self.header['Operator'] = infile.read(50) 56 57 self.header['DetectorSignature'] = infile.read(20) 58 self.header['TestSystemName'] = infile.read(20) 59 self.header['TestStationRevision'] = infile.read(20) 60 self.header['CoreBundleRevision'] = infile.read(20) 61 self.header['AcquisitionName'] = infile.read(40) 62 self.header['AcquisitionParameterRevision'] = infile.read(20)
        63 64 # self.OriginalNumberOfRows = infile.read(2) 65 # self.OriginalNumberOfRows = struct.unpack("=H",self.OriginalNumberOfRows)[0] 66 67 # self.OriginalNumberOfColumns = infile.read(2) 68 # self.OriginalNumberOfColumns = struct.unpack("=H",self.OriginalNumberOfColumns)[0] 69 70 # self.RowNumberUpperLeftPointArchiveROI = infile.read(2) 71 # self.RowNumberUpperLeftPointArchiveROI = struct.unpack("=H",self.RowNumberUpperLeftPointArchiveROI)[0] 72 73 # self.ColNumberUpperLeftPointArchiveROI = infile.read(2) 74 # self.ColNumberUpperLeftPointArchiveROI = struct.unpack("=H",self.ColNumberUpperLeftPointArchiveROI)[0] 75 76 # self.Swapped = infile.read(2) 77 # self.Swapped = struct.unpack("=H",self.Swapped)[0] 78 79 # self.Reordered = infile.read(2) 80 # self.Reordered = struct.unpack("=H",self.Reordered)[0] 81 82 # self.HorizontalFlipped = infile.read(2) 83 # self.HorizontalFlipped = struct.unpack("=H",self.HorizontalFlipped)[0] 84 85 # self.VerticalFlipped = infile.read(2) 86 # self.VerticalFlipped = struct.unpack("=H",self.VerticalFlipped)[0] 87 88 # self.WindowValueDesired = infile.read(2) 89 # self.WindowValueDesired = struct.unpack("=H",self.WindowValueDesired)[0] 90 91 # self.LevelValueDesired = infile.read(2) 92 # self.LevelValueDesired = struct.unpack("=H",self.LevelValueDesired)[0] 93 94 # self.AcquisitionMode = infile.read(2) 95 # self.AcquisitionMode = struct.unpack("=H",self.AcquisitionMode)[0] 96 97 # self.AcquisitionType = infile.read(2) 98 # self.AcquisitionType = struct.unpack("=H",self.AcquisitionType)[0] 99 100 # self.UserAcquisitionCoffFileName1 = infile.read(100) 101 # self.UserAcquisitionCoffFileName2 = infile.read(100) 102 103 # self.FramesBeforeExpose = infile.read(2) 104 # self.FramesBeforeExpose = struct.unpack("=H",self.FramesBeforeExpose)[0] 105 106 # self.FramesDuringExpose = infile.read(2) 107 # self.FramesDuringExpose = struct.unpack("=H",self.FramesDuringExpose)[0] 108 109 # self.FramesAfterExpose = infile.read(2) 110 # self.FramesAfterExpose = struct.unpack("=H",self.FramesAfterExpose)[0] 111 112 # self.IntervalBetweenFrames = infile.read(2) 113 # self.IntervalBetweenFrames = struct.unpack("=H",self.IntervalBetweenFrames)[0] 114 115 # self.ExposeTimeDelayInMicrosecs = infile.read(8) 116 # self.ExposeTimeDelayInMicrosecs = struct.unpack("=d",self.ExposeTimeDelayInMicrosecs)[0] 117 118 # self.TimeBetweenFramesInMicrosecs = infile.read(8) 119 # self.TimeBetweenFramesInMicrosecs = struct.unpack("=d",self.TimeBetweenFramesInMicrosecs)[0] 120 121 # self.FramesToSkipExpose = infile.read(2) 122 # self.FramesToSkipExpose = struct.unpack("=H",self.FramesToSkipExpose)[0] 123 124 # # Rad --> ExposureMode = 1 125 # self.ExposureMode = infile.read(2) 126 # self.ExposureMode = struct.unpack("=H",self.ExposureMode)[0] 127 128 # self.PrepPresetTimeInMicrosecs = infile.read(8) 129 # self.PrepPresetTimeInMicrosecs = struct.unpack("=d",self.PrepPresetTimeInMicrosecs)[0] 130 131 # self.ExposePresetTimeInMicrosecs = infile.read(8) 132 # self.ExposePresetTimeInMicrosecs = struct.unpack("=d",self.ExposePresetTimeInMicrosecs)[0] 133 134 # self.AcquisitionFrameRateInFps = infile.read(4) 135 # self.AcquisitionFrameRateInFps = struct.unpack("=f",self.AcquisitionFrameRateInFps)[0] 136 137 # self.FOVSelect = infile.read(2) 138 # self.FOVSelect = struct.unpack("=H",self.FOVSelect)[0] 139 140 # self.ExpertMode = infile.read(2) 141 # self.ExpertMode = struct.unpack("=H",self.ExpertMode)[0] 142 143 # self.SetVCommon1 = infile.read(8) 144 # self.SetVCommon1 = struct.unpack("=d",self.SetVCommon1)[0] 145 146 # self.SetVCommon2 = infile.read(8) 147 # self.SetVCommon2 = struct.unpack("=d",self.SetVCommon2)[0] 148 149 # self.SetAREF = infile.read(8) 150 # self.SetAREF = struct.unpack("=d",self.SetAREF)[0] 151 152 # self.SetAREFTrim = infile.read(4) 153 # self.SetAREFTrim = struct.unpack("=L",self.SetAREFTrim)[0] 154 155 # self.SetSpareVoltageSource = infile.read(8) 156 # self.SetSpareVoltageSource = struct.unpack("=d",self.SetSpareVoltageSource)[0] 157 158 # self.SetCompensationVoltageSource = infile.read(8) 159 # self.SetCompensationVoltageSource = struct.unpack("=d",self.SetCompensationVoltageSource)[0] 160 161 # self.SetRowOffVoltage = infile.read(8) 162 # self.SetRowOffVoltage = struct.unpack("=d",self.SetRowOffVoltage)[0] 163 164 # self.SetRowOnVoltage = infile.read(8) 165 # self.SetRowOnVoltage = struct.unpack("=d",self.SetRowOnVoltage)[0] 166 167 # self.StoreCompensationVoltage = infile.read(4) 168 # self.StoreCompensationVoltage = struct.unpack("=L",self.StoreCompensationVoltage)[0] 169 170 # self.RampSelection = infile.read(2) 171 # self.RampSelection = struct.unpack("=H",self.RampSelection)[0] 172 173 # self.TimingMode = infile.read(2) 174 # self.TimingMode = struct.unpack("=H",self.TimingMode)[0] 175 176 # self.Bandwidth = infile.read(2) 177 # self.Bandwidth = struct.unpack("=H",self.Bandwidth)[0] 178 179 # self.ARCIntegrator = infile.read(2) 180 # self.ARCIntegrator = struct.unpack("=H",self.ARCIntegrator)[0] 181 182 # self.ARCPostIntegrator = infile.read(2) 183 # self.ARCPostIntegrator = struct.unpack("=H",self.ARCPostIntegrator)[0] 184 185 # self.NumberOfRows = infile.read(4) 186 # self.NumberOfRows = struct.unpack("=L",self.NumberOfRows)[0] 187 188 # self.RowEnable = infile.read(2) 189 # self.RowEnable = struct.unpack("=H",self.RowEnable)[0] 190 191 # self.EnableStretch = infile.read(2) 192 # self.EnableStretch = struct.unpack("=H",self.EnableStretch)[0] 193 194 # self.CompEnable = infile.read(2) 195 # self.CompEnable = struct.unpack("=H",self.CompEnable)[0] 196 197 # self.CompStretch = infile.read(2) 198 # self.CompStretch = struct.unpack("=H",self.CompStretch)[0] 199 200 # self.LeftEvenTristate = infile.read(2) 201 # self.LeftEvenTristate = struct.unpack("=H",self.LeftEvenTristate)[0] 202 203 # self.RightOddTristate = infile.read(2) 204 # self.RightOddTristate = struct.unpack("=H",self.RightOddTristate)[0] 205 206 # self.TestModeSelect = infile.read(4) 207 # self.TestModeSelect = struct.unpack("=L",self.TestModeSelect)[0] 208 209 # self.AnalogTestSource = infile.read(4) 210 # self.AnalogTestSource = struct.unpack("=L",self.AnalogTestSource)[0] 211 212 # self.VCommonSelect = infile.read(4) 213 # self.VCommonSelect = struct.unpack("=L",self.VCommonSelect)[0] 214 215 # self.DRCColumnSum = infile.read(4) 216 # self.DRCColumnSum = struct.unpack("=L",self.DRCColumnSum)[0] 217 218 # self.TestPatternFrameDelta = infile.read(4) 219 # self.TestPatternFrameDelta = struct.unpack("=L",self.TestPatternFrameDelta)[0] 220 221 # self.TestPatternRowDelta = infile.read(4) 222 # self.TestPatternRowDelta = struct.unpack("=L",self.TestPatternRowDelta)[0] 223 224 # self.TestPatternColumnDelta = infile.read(4) 225 # self.TestPatternColumnDelta = struct.unpack("=L",self.TestPatternColumnDelta)[0] 226 227 # self.DetectorHorizontalFlip = infile.read(2) 228 # self.DetectorHorizontalFlip = struct.unpack("=H",self.DetectorHorizontalFlip)[0] 229 230 # self.DetectorVerticalFlip = infile.read(2) 231 # self.DetectorVerticalFlip = struct.unpack("=H",self.DetectorVerticalFlip)[0] 232 233 # self.DFNAutoScrubOnOff = infile.read(2) 234 # self.DFNAutoScrubOnOff = struct.unpack("=H",self.DFNAutoScrubOnOff)[0] 235 236 # self.FiberChannelTimeOutInMicrosecs = infile.read(4) 237 # self.FiberChannelTimeOutInMicrosecs = struct.unpack("=L",self.FiberChannelTimeOutInMicrosecs)[0] 238 239 # self.DFNAutoScrubDelayInMicrosecs = infile.read(4) 240 # self.DFNAutoScrubDelayInMicrosecs = struct.unpack("=L",self.DFNAutoScrubDelayInMicrosecs)[0] 241 242 # self.StoreAECROI = infile.read(2) 243 # self.StoreAECROI = struct.unpack("=H",self.StoreAECROI)[0] 244 245 # self.TestPatternSaturationValue = infile.read(2) 246 # self.TestPatternSaturationValue = struct.unpack("=H",self.TestPatternSaturationValue)[0] 247 248 # self.TestPatternSeed = infile.read(4) 249 # self.TestPatternSeed = struct.unpack("=L",self.TestPatternSeed)[0] 250 251 # self.ExposureTimeInMillisecs = infile.read(4) 252 # self.ExposureTimeInMillisecs = struct.unpack("=f",self.ExposureTimeInMillisecs)[0] 253 254 # self.FrameRateInFps = infile.read(4) 255 # self.FrameRateInFps = struct.unpack("=f",self.FrameRateInFps)[0] 256 257 # self.kVp = infile.read(4) 258 # self.kVp = struct.unpack("=f",self.kVp)[0] 259 260 # self.mA = infile.read(4) 261 # self.mA = struct.unpack("=f",self.mA)[0] 262 263 # self.mAs = infile.read(4) 264 # self.mAs = struct.unpack("=f",self.mAs)[0] 265 266 # self.FocalSpotInMM = infile.read(4) 267 # self.FocalSpotInMM = struct.unpack("=f",self.FocalSpotInMM)[0] 268 269 # self.GeneratorType = infile.read(20) 270 271 # self.StrobeIntensityInFtL = infile.read(4) 272 # self.StrobeIntensityInFtL = struct.unpack("=f",self.StrobeIntensityInFtL)[0] 273 274 # self.NDFilterSelection = infile.read(2) 275 # self.NDFilterSelection = struct.unpack("=H",self.NDFilterSelection)[0] 276 277 # self.RefRegTemp1 = infile.read(8) 278 # self.RefRegTemp1 = struct.unpack("=d",self.RefRegTemp1)[0] 279 280 # self.RefRegTemp2 = infile.read(8) 281 # self.RefRegTemp2 = struct.unpack("=d",self.RefRegTemp2)[0] 282 283 # self.RefRegTemp3 = infile.read(8) 284 # self.RefRegTemp3 = struct.unpack("=d",self.RefRegTemp3)[0] 285 286 # self.Humidity1 = infile.read(4) 287 # self.Humidity1 = struct.unpack("=f",self.Humidity1)[0] 288 289 # self.Humidity2 = infile.read(4) 290 # self.Humidity2 = struct.unpack("=f",self.Humidity2)[0] 291 292 # self.DetectorControlTemp = infile.read(8) 293 # self.DetectorControlTemp = struct.unpack("=d",self.DetectorControlTemp)[0] 294 295 # self.DoseValueInmR = infile.read(8) 296 # self.DoseValueInmR = struct.unpack("=d",self.DoseValueInmR)[0] 297 298 # self.TargetLevelROIRow0 = infile.read(2) 299 # self.TargetLevelROIRow0 = struct.unpack("=H",self.TargetLevelROIRow0)[0] 300 301 # self.TargetLevelROICol0 = infile.read(2) 302 # self.TargetLevelROICol0 = struct.unpack("=H",self.TargetLevelROICol0)[0] 303 304 # self.TargetLevelROIRow1 = infile.read(2) 305 # self.TargetLevelROIRow1 = struct.unpack("=H",self.TargetLevelROIRow1)[0] 306 307 # self.TargetLevelROICol1 = infile.read(2) 308 # self.TargetLevelROICol1 = struct.unpack("=H",self.TargetLevelROICol1)[0] 309 310 # self.FrameNumberForTargetLevelROI = infile.read(2) 311 # self.FrameNumberForTargetLevelROI = struct.unpack("=H",self.FrameNumberForTargetLevelROI)[0] 312 313 # self.PercentRangeForTargetLevel = infile.read(2) 314 # self.PercentRangeForTargetLevel = struct.unpack("=H",self.PercentRangeForTargetLevel)[0] 315 316 # self.TargetValue = infile.read(2) 317 # self.TargetValue = struct.unpack("=H",self.TargetValue)[0] 318 319 # self.ComputedMedianValue = infile.read(2) 320 # self.ComputedMedianValue = struct.unpack("=H",self.ComputedMedianValue)[0] 321 322 # self.LoadZero = infile.read(2) 323 # self.LoadZero = struct.unpack("=H",self.LoadZero)[0] 324 325 # self.MaxLUTOut = infile.read(2) 326 # self.MaxLUTOut = struct.unpack("=H",self.MaxLUTOut)[0] 327 328 # self.MinLUTOut = infile.read(2) 329 # self.MinLUTOut = struct.unpack("=H",self.MinLUTOut)[0] 330 331 # self.MaxLinear = infile.read(2) 332 # self.MaxLinear = struct.unpack("=H",self.MaxLinear)[0] 333 334 # self.Reserved = infile.read(2) 335 # self.Reserved = struct.unpack("=H",self.Reserved)[0] 336 337 # self.ElectronsPerCount = infile.read(2) 338 # self.ElectronsPerCount = struct.unpack("=H",self.ElectronsPerCount)[0] 339 340 # self.ModeGain = infile.read(2) 341 # self.ModeGain = struct.unpack("=H",self.ModeGain)[0] 342 343 # self.TemperatureInDegC = infile.read(8) 344 # self.TemperatureInDegC = struct.unpack("=d",self.TemperatureInDegC)[0] 345 346 # self.LineRepaired = infile.read(2) 347 # self.LineRepaired = struct.unpack("=H",self.LineRepaired)[0] 348 349 # self.LineRepairFileName = infile.read(100) 350 351 # self.CurrentLongitudinalInMM = infile.read(4) 352 # self.CurrentLongitudinalInMM = struct.unpack("=f",self.CurrentLongitudinalInMM)[0] 353 354 # self.CurrentTransverseInMM = infile.read(4) 355 # self.CurrentTransverseInMM = struct.unpack("=f",self.CurrentTransverseInMM)[0] 356 357 # self.CurrentCircularInMM = infile.read(4) 358 # self.CurrentCircularInMM = struct.unpack("=f",self.CurrentCircularInMM)[0] 359 360 # self.CurrentFilterSelection = infile.read(4) 361 # self.CurrentFilterSelection = struct.unpack("=L",self.CurrentFilterSelection)[0] 362 363 # self.DisableScrubAck = infile.read(2) 364 # self.DisableScrubAck = struct.unpack("=H",self.DisableScrubAck)[0] 365 366 # self.ScanModeSelect = infile.read(2) 367 # self.ScanModeSelect = struct.unpack("=H",self.ScanModeSelect)[0] 368 369 # self.DetectorAppSwVersion = infile.read(20) 370 371 # self.DetectorNIOSVersion = infile.read(20) 372 373 # self.DetectorPeripheralSetVersion = infile.read(20) 374 375 # self.DetectorPhysicalAddress = infile.read(20) 376 377 # self.PowerDown = infile.read(2) 378 # self.PowerDown = struct.unpack("=H",self.PowerDown)[0] 379 380 # self.InitialVoltageLevel_VCOMMON = infile.read(8) 381 # self.InitialVoltageLevel_VCOMMON = struct.unpack("=d",self.InitialVoltageLevel_VCOMMON)[0] 382 383 # self.FinalVoltageLevel_VCOMMON = infile.read(8) 384 # self.FinalVoltageLevel_VCOMMON = struct.unpack("=d",self.FinalVoltageLevel_VCOMMON)[0] 385 386 # self.DmrCollimatorSpotSize = infile.read(10) 387 388 # self.DmrTrack = infile.read(5) 389 390 # self.DmrFilter = infile.read(5) 391 392 # self.FilterCarousel = infile.read(2) 393 # self.FilterCarousel = struct.unpack("=H",self.FilterCarousel)[0] 394 395 # self.Phantom = infile.read(20) 396 397 # self.SetEnableHighTime = infile.read(2) 398 # self.SetEnableHighTime = struct.unpack("=H",self.SetEnableHighTime)[0] 399 400 # self.SetEnableLowTime = infile.read(2) 401 # self.SetEnableLowTime = struct.unpack("=H",self.SetEnableLowTime)[0] 402 403 # self.SetCompHighTime = infile.read(2) 404 # self.SetCompHighTime = struct.unpack("=H",self.SetCompHighTime)[0] 405 406 # self.SetCompLowTime = infile.read(2) 407 # self.SetCompLowTime = struct.unpack("=H",self.SetCompLowTime)[0] 408 409 # self.SetSyncLowTime = infile.read(2) 410 # self.SetSyncLowTime = struct.unpack("=H",self.SetSyncLowTime)[0] 411 412 # self.SetConvertLowTime = infile.read(2) 413 # self.SetConvertLowTime = struct.unpack("=H",self.SetConvertLowTime)[0] 414 415 # self.SetSyncHighTime = infile.read(2) 416 # self.SetSyncHighTime = struct.unpack("=H",self.SetSyncHighTime)[0] 417 418 # self.SetEOLTime = infile.read(2) 419 # self.SetEOLTime = struct.unpack("=H",self.SetEOLTime)[0] 420 421 # self.SetRampOffsetTime = infile.read(2) 422 # self.SetRampOffsetTime = struct.unpack("=H",self.SetRampOffsetTime)[0] 423 424 # self.FOVStartingValue = infile.read(2) 425 # self.FOVStartingValue = struct.unpack("=H",self.FOVStartingValue)[0] 426 427 # self.ColumnBinning = infile.read(2) 428 # self.ColumnBinning = struct.unpack("=H",self.ColumnBinning)[0] 429 430 # self.RowBinning = infile.read(2) 431 # self.RowBinning = struct.unpack("=H",self.RowBinning)[0] 432 433 # self.BorderColumns64 = infile.read(2) 434 # self.BorderColumns64 = struct.unpack("=H",self.BorderColumns64)[0] 435 436 # self.BorderRows64 = infile.read(2) 437 # self.BorderRows64 = struct.unpack("=H",self.BorderRows64)[0] 438 439 # self.FETOffRows64 = infile.read(2) 440 # self.FETOffRows64 = struct.unpack("=H",self.FETOffRows64)[0] 441 442 # self.FOVStartColumn128 = infile.read(2) 443 # self.FOVStartColumn128 = struct.unpack("=H",self.FOVStartColumn128)[0] 444 445 # self.FOVStartRow128 = infile.read(2) 446 # self.FOVStartRow128 = struct.unpack("=H",self.FOVStartRow128)[0] 447 448 # self.NumberOfColumns128 = infile.read(2) 449 # self.NumberOfColumns128 = struct.unpack("=H",self.NumberOfColumns128)[0] 450 451 # self.NumberOfRows128 = infile.read(2) 452 # self.NumberOfRows128 = struct.unpack("=H",self.NumberOfRows128)[0] 453 454 # self.VFPAquisition = infile.read(2000) 455 456 # self.Comment = infile.read(200) 457 458 459
        460 - def read(self, fname, frame=None):
        461 """ 462 Read in header into self.header and 463 the data into self.data 464 """ 465 self.header = {} 466 self.resetvals() 467 infile = self._open(fname, "rb") 468 self._readheader(infile) 469 # Compute image size 470 try: 471 self.dim1 = int(self.header['NumberOfRowsInFrame']) 472 self.dim2 = int(self.header['NumberOfColsInFrame']) 473 self.bpp = int(self.header['BitsPerPixel']) 474 except: 475 raise Exception("GE file", str(fname) + \ 476 "is corrupt, cannot read it") 477 478 # More than one image can be saved in a GE file 479 # Will only load the first one 480 481 482 # Go to the beginning of the file 483 infile.seek(0) 484 infile.seek(self.header['HeaderSizeInBytes'] + self.header['UserHeaderSizeInBytes']) 485 486 ReadBytes = self.dim1 * self.dim2 * (self.bpp / 8) 487 block = infile.read(ReadBytes) 488 block = numpy.fromstring(block, numpy.uint16) 489 490 infile.close() 491 492 try: 493 self.data = numpy.reshape(block, [self.dim2, self.dim1]) 494 except: 495 print len(block), self.dim2, self.dim1 496 raise IOError, \ 497 'Size spec in GE-header does not match size of image data field' 498 499 self.bytecode = self.data.dtype.type 500 self.pilimage = None 501 return self
        502

        fabio-0.1.3/epydoc/toc-fabio.fabioutils-module.html0000644000175000017500000000707012126623347023030 0ustar jeromejerome00000000000000 fabioutils

        Module fabioutils


        Classes

        BZ2File
        File
        FilenameObject
        GzipFile
        StringIO
        UnknownCompressedFile

        Functions

        construct_filename
        deconstruct_filename
        deprecated
        extract_filenumber
        getnum
        isAscii
        jump_filename
        next_filename
        nice_int
        numstem
        previous_filename
        toAscii

        Variables

        COMPRESSORS
        FILETYPES
        __package__
        dictAscii
        i
        key
        lines
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.brukerimage-module.html0000644000175000017500000001717012126623347022403 0ustar jeromejerome00000000000000 fabio.brukerimage
        Package fabio :: Module brukerimage
        [hide private]
        [frames] | no frames]

        Module brukerimage

        source code

        
        
        Authors: Henning O. Sorensen & Erik Knudsen
                 Center for Fundamental Research: Metal Structures in Four Dimensions
                 Risoe National Laboratory
                 Frederiksborgvej 399
                 DK-4000 Roskilde
                 email:erik.knudsen@risoe.dk
        
        Based on: openbruker,readbruker, readbrukerheader functions in the opendata
                 module of ImageD11 written by Jon Wright, ESRF, Grenoble, France
        
        
        Classes [hide private]
          brukerimage
        Read and eventually write ID11 bruker (eg smart6500) images
        Functions [hide private]
         
        test()
        a testcase
        source code
        Variables [hide private]
          logger = logging.getLogger("brukerimage")
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.xsdimage.xsdimage-class.html0000644000175000017500000004304712126623347023331 0ustar jeromejerome00000000000000 fabio.xsdimage.xsdimage
        Package fabio :: Module xsdimage :: Class xsdimage
        [hide private]
        [frames] | no frames]

        Class xsdimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               xsdimage
        

        Read the XSDataImage XML File data format

        Instance Methods [hide private]
         
        __init__(self, data=None, header=None, fname=None)
        Constructor of the class XSDataImage.
        source code
         
        _readheader(self, infile)
        Read all headers in a file and populate self.header data is not yet populated
        source code
         
        read(self, fname, frame=None)
        To be overridden - fill in self.header and self.data
        source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header, write

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, data=None, header=None, fname=None)
        (Constructor)

        source code 

        Constructor of the class XSDataImage.

        Parameters:
        • _strFilename (string) - the name of the file to open
        Overrides: object.__init__

        _readheader(self, infile)

        source code 

        Read all headers in a file and populate self.header data is not yet populated

        Parameters:
        • infile (file object open in read mode)
        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 

        To be overridden - fill in self.header and self.data

        Overrides: fabioimage.fabioimage.read

        fabio-0.1.3/epydoc/fabio.fit2dmaskimage.fit2dmaskimage-class.html0000644000175000017500000004545112126623347025506 0ustar jeromejerome00000000000000 fabio.fit2dmaskimage.fit2dmaskimage
        Package fabio :: Module fit2dmaskimage :: Class fit2dmaskimage
        [hide private]
        [frames] | no frames]

        Class fit2dmaskimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               fit2dmaskimage
        

        Read and try to write Andy Hammersley's mask format

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Read in a header from an already open file
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code
         
        write(self, fname)
        Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats)
        source code

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        checkData(data=None)
        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers
        source code

        Inherited from fabioimage.fabioimage: checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Read in a header from an already open file

        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        write(self, fname)

        source code 

        Try to write a file check we can write zipped also mimics that fabian was writing uint16 (we sometimes want floats)

        Overrides: fabioimage.fabioimage.write

        checkData(data=None)
        Static Method

        source code 

        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers

        Overrides: fabioimage.fabioimage.checkData
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio.file_series-module.html0000644000175000017500000003113312126623347022372 0ustar jeromejerome00000000000000 fabio.file_series
        Package fabio :: Module file_series
        [hide private]
        [frames] | no frames]

        Module file_series

        source code

        
        
        Authors:
        ........
        
        * Henning O. Sorensen & Erik Knudsen
          Center for Fundamental Research: Metal Structures in Four Dimensions
          Risoe National Laboratory
          Frederiksborgvej 399
          DK-4000 Roskilde
          email:erik.knudsen@risoe.dk
        * Jon Wright, ESRF
        
        
        Classes [hide private]
          file_series
        Represents a series of files to iterate has an idea of a current position to do next and prev
          numbered_file_series
        mydata0001.edf = "mydata" + 0001 + ".edf" mydata0002.edf = "mydata" + 0002 + ".edf" mydata0003.edf = "mydata" + 0003 + ".edf"
          filename_series
        Much like the others, but created from a string filename
        Functions [hide private]
         
        new_file_series0(first_object, first=None, last=None, step=1)
        Created from a fabio image first and last are file numbers
        source code
         
        new_file_series(first_object, nimages=0, step=1, traceback=False)
        A generator function that creates a file series starting from a a fabioimage.
        source code
        Variables [hide private]
          logger = logging.getLogger("fileseries")
          __package__ = 'fabio'
        Function Details [hide private]

        new_file_series(first_object, nimages=0, step=1, traceback=False)

        source code 
        
        A generator function that creates a file series starting from a a fabioimage.
        Iterates through all images in a file (if more than 1), then proceeds to
        the next file as determined by fabio.next_filename.
        
        @param first_object: the starting fabioimage, which will be the first one yielded
            in the sequence
        @param nimages:  the maximum number of images to consider
            step: step size, will yield the first and every step'th image until nimages
            is reached.  (e.g. nimages = 5, step = 2 will yield 3 images (0, 2, 4)
        @param traceback: if True causes it to print a traceback in the event of an
            exception (missing image, etc.).  Otherwise the calling routine can handle
            the exception as it chooses
        @param yields: the next fabioimage in the series.
            In the event there is an exception, it yields the sys.exec_info for the
            exception instead.  sys.exec_info is a tuple:
            ( exceptionType, exceptionValue, exceptionTraceback )
            from which all the exception information can be obtained.
        
        Suggested usage:
        
        ::
        
            for obj in new_file_series( ... ):
              if not isinstance(obj, fabio.fabioimage.fabioimage ):
                # deal with errors like missing images, non readable files, etc
                # e.g.
                traceback.print_exception(obj[0], obj[1], obj[2])
        
        

        fabio-0.1.3/epydoc/fabio.bruker100image-module.html0000644000175000017500000001360612126623347022624 0ustar jeromejerome00000000000000 fabio.bruker100image
        Package fabio :: Module bruker100image
        [hide private]
        [frames] | no frames]

        Module bruker100image

        source code

        Classes [hide private]
          bruker100image
        Variables [hide private]
          logger = logging.getLogger("bruker100image")
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.pnmimage.pnmimage-class.html0000644000175000017500000006154712126623347023326 0ustar jeromejerome00000000000000 fabio.pnmimage.pnmimage
        Package fabio :: Module pnmimage :: Class pnmimage
        [hide private]
        [frames] | no frames]

        Class pnmimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               pnmimage
        

        Instance Methods [hide private]
         
        __init__(self, *arg, **kwargs)
        Set up initial values
        source code
         
        _readheader(self, f)
        Must be overridden in classes
        source code
         
        read(self, fname, frame=None)
        try to read PNM images
        source code
         
        write(self, filename)
        To be overwritten - write the file
        source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        P1dec(buf, bytecode) source code
         
        P4dec(buf, bytecode) source code
         
        P2dec(buf, bytecode) source code
         
        P5dec(buf, bytecode) source code
         
        P3dec(buf, bytecode) source code
         
        P6dec(buf, bytecode) source code
         
        P7dec(buf, bytecode) source code
         
        checkData(data=None)
        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers
        source code

        Inherited from fabioimage.fabioimage: checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, *arg, **kwargs)
        (Constructor)

        source code 

        Set up initial values

        Overrides: object.__init__
        (inherited documentation)

        _readheader(self, f)

        source code 

        Must be overridden in classes

        Overrides: fabioimage.fabioimage._readheader
        (inherited documentation)

        read(self, fname, frame=None)

        source code 

        try to read PNM images

        Parameters:
        • fname - name of the file
        • frame - not relevant here! PNM is always single framed
        Overrides: fabioimage.fabioimage.read

        write(self, filename)

        source code 

        To be overwritten - write the file

        Overrides: fabioimage.fabioimage.write
        (inherited documentation)

        checkData(data=None)
        Static Method

        source code 

        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers

        Overrides: fabioimage.fabioimage.checkData
        (inherited documentation)

        fabio-0.1.3/epydoc/toc-fabio.file_series-module.html0000644000175000017500000000343112120434325023143 0ustar jeromejerome00000000000000 file_series

        Module file_series


        Classes

        file_series
        filename_series
        numbered_file_series

        Functions

        new_file_series
        new_file_series0

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.mytest-pysrc.html0000644000175000017500000001106312120434325021267 0ustar jeromejerome00000000000000 fabio.mytest
        Package fabio :: Module mytest
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.mytest

        1  import fabioutils 
        2  fabioutils.deconstruct_filename("merged.azim") 
        3   
        

        fabio-0.1.3/epydoc/fabio.fabioimage-pysrc.html0000644000175000017500000062112312126623347022043 0ustar jeromejerome00000000000000 fabio.fabioimage
        Package fabio :: Module fabioimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.fabioimage

          1  #!/usr/bin/env python 
          2   
          3  """ 
          4   
          5  Authors: Henning O. Sorensen & Erik Knudsen 
          6           Center for Fundamental Research: Metal Structures in Four Dimensions 
          7           Risoe National Laboratory 
          8           Frederiksborgvej 399 
          9           DK-4000 Roskilde 
         10           email:erik.knudsen@risoe.dk 
         11   
         12           and Jon Wright, Jerome Kieffer: ESRF 
         13   
         14  """ 
         15  from __future__ import with_statement 
         16  import os, types, logging, sys, tempfile 
         17  logger = logging.getLogger("fabioimage") 
         18  import numpy 
         19  try: 
         20      import Image 
         21  except ImportError: 
         22      logger.warning("PIL is not installed ... trying to do without") 
         23      Image = None 
         24  import fabioutils, converters 
        
        25 26 27 -class fabioimage(object):
        28 """ 29 A common object for images in fable 30 Contains a numpy array (.data) and dict of meta data (.header) 31 """ 32 33 _need_a_seek_to_read = False 34 _need_a_real_file = False 35
        36 - def __init__(self, data=None , header=None):
        37 """ 38 Set up initial values 39 """ 40 self._classname = None 41 if type(data) in types.StringTypes: 42 raise Exception("fabioimage.__init__ bad argument - " + \ 43 "data should be numpy array") 44 self.data = self.checkData(data) 45 self.pilimage = None 46 if header is None: 47 self.header = {} 48 else: 49 self.header = self.checkHeader(header) 50 self.header_keys = self.header.keys() # holds key ordering 51 if self.data is not None: 52 self.dim2, self.dim1 = self.data.shape 53 else: 54 self.dim1 = self.dim2 = 0 55 self.bytecode = None # numpy typecode 56 self.bpp = 2 # bytes per pixel 57 # cache for image statistics 58 self.mean = self.maxval = self.stddev = self.minval = None 59 # Cache roi 60 self.roi = None 61 self.area_sum = None 62 self.slice = None 63 # New for multiframe files 64 self.nframes = 1 65 self.currentframe = 0 66 self.filename = None 67 self.filenumber = None
        68 69 @staticmethod
        70 - def checkHeader(header=None):
        71 """ 72 Empty for fabioimage but may be populated by others classes 73 """ 74 if header is None: 75 return {} 76 else: 77 return header
        78 79 @staticmethod
        80 - def checkData(data=None):
        81 """ 82 Empty for fabioimage but may be populated by others classes, especially for format accepting only integers 83 """ 84 return data
        85
        86 - def getclassname(self):
        87 """ 88 Retrieves the name of the class 89 @return: the name of the class 90 """ 91 if self._classname is None: 92 self._classname = str(self.__class__).replace("<class '", "").replace("'>", "").split(".")[-1] 93 return self._classname
        94 classname = property(getclassname) 95
        96 - def getframe(self, num):
        97 """ returns the file numbered 'num' in the series as a fabioimage """ 98 if self.nframes == 1: 99 # single image per file 100 import openimage 101 return openimage.openimage( 102 fabioutils.jump_filename(self.filename, num)) 103 raise Exception("getframe out of range")
        104
        105 - def previous(self):
        106 """ returns the previous file in the series as a fabioimage """ 107 import openimage 108 return openimage.openimage( 109 fabioutils.previous_filename(self.filename))
        110
        111 - def next(self):
        112 """ returns the next file in the series as a fabioimage """ 113 import openimage 114 return openimage.openimage( 115 fabioutils.next_filename(self.filename))
        116
        117 - def toPIL16(self, filename=None):
        118 """ 119 Convert to Python Imaging Library 16 bit greyscale image 120 121 FIXME - this should be handled by the libraries now 122 """ 123 if not Image: 124 raise RuntimeError("PIL is not installed !!! ") 125 if filename: 126 self.read(filename) 127 if self.pilimage is not None: 128 return self.pilimage 129 # mode map 130 size = self.data.shape[:2][::-1] 131 typmap = { 132 'float32' : "F" , 133 'int32' : "F;32S" , 134 'uint32' : "F;32" , 135 'int16' : "F;16S" , 136 'uint16' : "F;16" , 137 'int8' : "F;8S" , 138 'uint8' : "F;8" } 139 if typmap.has_key(self.data.dtype.name): 140 mode2 = typmap[ self.data.dtype.name ] 141 mode1 = mode2[0] 142 else: 143 raise Exception("Unknown numpy type " + str(self.data.dtype.type)) 144 # 145 # hack for byteswapping for PIL in MacOS 146 testval = numpy.array((1, 0), numpy.uint8).view(numpy.uint16)[0] 147 if testval == 1: 148 dats = self.data.tostring() 149 elif testval == 256: 150 dats = self.data.byteswap().tostring() 151 else: 152 raise Exception("Endian unknown in fabioimage.toPIL16") 153 154 self.pilimage = Image.frombuffer(mode1, 155 size, 156 dats, 157 "raw", 158 mode2, 159 0, 160 1) 161 162 return self.pilimage
        163
        164 - def getheader(self):
        165 """ returns self.header """ 166 return self.header
        167
        168 - def getmax(self):
        169 """ Find max value in self.data, caching for the future """ 170 if self.maxval is None: 171 self.maxval = self.data.max() 172 return self.maxval
        173
        174 - def getmin(self):
        175 """ Find min value in self.data, caching for the future """ 176 if self.minval is None: 177 self.minval = self.data.min() 178 return self.minval
        179
        180 - def make_slice(self, coords):
        181 """ 182 Convert a len(4) set of coords into a len(2) 183 tuple (pair) of slice objects 184 the latter are immutable, meaning the roi can be cached 185 """ 186 assert len(coords) == 4 187 if len(coords) == 4: 188 # fabian edfimage preference 189 if coords[0] > coords[2]: 190 coords[0:3:2] = [coords[2], coords[0]] 191 if coords[1] > coords[3]: 192 coords[1:4:2] = [coords[3], coords[1]] 193 #in fabian: normally coordinates are given as (x,y) whereas 194 # a matrix is given as row,col 195 # also the (for whichever reason) the image is flipped upside 196 # down wrt to the matrix hence these tranformations 197 fixme = (self.dim2 - coords[3] - 1, 198 coords[0] , 199 self.dim2 - coords[1] - 1, 200 coords[2]) 201 return (slice(int(fixme[0]), int(fixme[2]) + 1) , 202 slice(int(fixme[1]), int(fixme[3]) + 1))
        203 204
        205 - def integrate_area(self, coords):
        206 """ 207 Sums up a region of interest 208 if len(coords) == 4 -> convert coords to slices 209 if len(coords) == 2 -> use as slices 210 floor -> ? removed as unused in the function. 211 """ 212 if self.data == None: 213 # This should return NAN, not zero ? 214 return 0 215 if len(coords) == 4: 216 sli = self.make_slice(coords) 217 elif len(coords) == 2 and isinstance(coords[0], slice) and \ 218 isinstance(coords[1], slice): 219 sli = coords 220 221 if sli == self.slice and self.area_sum is not None: 222 pass 223 elif sli == self.slice and self.roi is not None: 224 self.area_sum = self.roi.sum(dtype=numpy.float) 225 else: 226 self.slice = sli 227 self.roi = self.data[ self.slice ] 228 self.area_sum = self.roi.sum(dtype=numpy.float) 229 return self.area_sum
        230
        231 - def getmean(self):
        232 """ return the mean """ 233 if self.mean is None: 234 self.mean = self.data.mean(dtype=numpy.double) 235 return self.mean
        236
        237 - def getstddev(self):
        238 """ return the standard deviation """ 239 if self.stddev == None: 240 self.stddev = self.data.std(dtype=numpy.double) 241 return self.stddev
        242
        243 - def add(self, other):
        244 """ 245 Add another Image - warning, does not clip to 16 bit images by default 246 """ 247 if not hasattr(other, 'data'): 248 logger.warning('edfimage.add() called with something that ' + \ 249 'does not have a data field') 250 assert self.data.shape == other.data.shape , \ 251 'incompatible images - Do they have the same size?' 252 self.data = self.data + other.data 253 self.resetvals()
        254 255
        256 - def resetvals(self):
        257 """ Reset cache - call on changing data """ 258 self.mean = self.stddev = self.maxval = self.minval = None 259 self.roi = self.slice = self.area_sum = None
        260
        261 - def rebin(self, x_rebin_fact, y_rebin_fact, keep_I=True):
        262 """ 263 Rebin the data and adjust dims 264 @param x_rebin_fact: x binning factor 265 @param y_rebin_fact: y binning factor 266 @param keep_I: shall the signal increase ? 267 @type x_rebin_fact: int 268 @type y_rebin_fact: int 269 @type keep_I: boolean 270 271 272 """ 273 if self.data == None: 274 raise Exception('Please read in the file you wish to rebin first') 275 276 if (self.dim1 % x_rebin_fact != 0) or (self.dim2 % y_rebin_fact != 0): 277 raise RuntimeError('image size is not divisible by rebin factor - ' + \ 278 'skipping rebin') 279 else: 280 dataIn = self.data.astype("float64") 281 shapeIn = self.data.shape 282 shapeOut = (shapeIn[0] / y_rebin_fact, shapeIn[1] / x_rebin_fact) 283 binsize = y_rebin_fact * x_rebin_fact 284 if binsize < 50: #method faster for small binning (4x4) 285 out = numpy.zeros(shapeOut, dtype="float64") 286 for j in range(x_rebin_fact): 287 for i in range(y_rebin_fact): 288 out += dataIn[i::y_rebin_fact, j::x_rebin_fact] 289 else: #method faster for large binning (8x8) 290 temp = self.data.astype("float64") 291 temp.shape = (shapeOut[0], y_rebin_fact, shapeOut[1], x_rebin_fact) 292 out = temp.sum(axis=3).sum(axis=1) 293 self.resetvals() 294 if keep_I: 295 self.data = (out / (y_rebin_fact * x_rebin_fact)).astype(self.data.dtype) 296 else: 297 self.data = out.astype(self.data.dtype) 298 299 self.dim1 = self.dim1 / x_rebin_fact 300 self.dim2 = self.dim2 / y_rebin_fact 301 302 #update header 303 self.update_header()
        304
        305 - def write(self, fname):
        306 """ 307 To be overwritten - write the file 308 """ 309 raise Exception("Class has not implemented readheader method yet")
        310
        311 - def save(self, fname):
        312 'wrapper for write' 313 self.write(fname)
        314
        315 - def readheader(self, filename):
        316 """ 317 Call the _readheader function... 318 """ 319 # Override the needs asserting that all headers can be read via python modules 320 save_state = self._need_a_real_file , self._need_a_seek_to_read 321 self._need_a_real_file , self._need_a_seek_to_read = False, False 322 fin = self._open(filename) 323 self._readheader(fin) 324 fin.close() 325 self._need_a_real_file , self._need_a_seek_to_read = save_state
        326
        327 - def _readheader(self, fik_obj):
        328 """ 329 Must be overridden in classes 330 """ 331 raise Exception("Class has not implemented _readheader method yet")
        332
        333 - def update_header(self , **kwds):
        334 """ 335 update the header entries 336 by default pass in a dict of key, values. 337 """ 338 self.header.update(kwds)
        339
        340 - def read(self, filename, frame=None):
        341 """ 342 To be overridden - fill in self.header and self.data 343 """ 344 raise Exception("Class has not implemented read method yet")
        345 # return self 346
        347 - def load(self, *arg, **kwarg):
        348 "Wrapper for read" 349 return self.read(*arg, **kwarg)
        350
        351 - def readROI(self, filename, frame=None, coords=None):
        352 """ 353 Method reading Region of Interest. 354 This implementation is the trivial one, just doing read and crop 355 """ 356 self.read(filename, frame) 357 if len(coords) == 4: 358 self.slice = self.make_slice(coords) 359 elif len(coords) == 2 and isinstance(coords[0], slice) and \ 360 isinstance(coords[1], slice): 361 self.slice = coords 362 else: 363 logger.warning('readROI: Unable to understand Region Of Interest: got %s', coords) 364 self.roi = self.data[ self.slice ] 365 return self.roi
        366 367
        368 - def _open(self, fname, mode="rb"):
        369 """ 370 Try to handle compressed files, streams, shared memory etc 371 Return an object which can be used for "read" and "write" 372 ... FIXME - what about seek ? 373 """ 374 fileObject = None 375 self.filename = fname 376 self.filenumber = fabioutils.extract_filenumber(fname) 377 378 if hasattr(fname, "read") and hasattr(fname, "write"): 379 # It is already something we can use 380 return fname 381 if isinstance(fname, (str, unicode)): 382 self.header["filename"] = fname 383 if os.path.splitext(fname)[1] == ".gz": 384 fileObject = self._compressed_stream(fname, 385 fabioutils.COMPRESSORS['.gz'], 386 fabioutils.GzipFile, 387 mode) 388 elif os.path.splitext(fname)[1] == '.bz2': 389 fileObject = self._compressed_stream(fname, 390 fabioutils.COMPRESSORS['.bz2'], 391 fabioutils.BZ2File, 392 mode) 393 # 394 # Here we return the file even though it may be bzipped or gzipped 395 # but named incorrectly... 396 # 397 # FIXME - should we fix that or complain about the daft naming? 398 else: 399 fileObject = fabioutils.File(fname, mode) 400 if "name" not in dir(fileObject): 401 fileObject.name = fname 402 403 return fileObject
        404
        405 - def _compressed_stream(self, 406 fname, 407 system_uncompress, 408 python_uncompress, 409 mode='rb'):
        410 """ 411 Try to transparently handle gzip / bzip without always getting python 412 performance 413 """ 414 # assert that python modules are always OK based on performance benchmark 415 # Try to fix the way we are using them? 416 fobj = None 417 if self._need_a_real_file and mode[0] == "r": 418 fo = python_uncompress(fname, mode) 419 # fobj = os.tmpfile() 420 #problem when not administrator under certain flavors of windows 421 tmpfd, tmpfn = tempfile.mkstemp() 422 os.close(tmpfd) 423 fobj = fabioutils.File(tmpfn, "w+b") 424 fobj.write(fo.read()) 425 fo.close() 426 fobj.seek(0) 427 elif self._need_a_seek_to_read and mode[0] == "r": 428 fo = python_uncompress(fname, mode) 429 fobj = fabioutils.StringIO(fo.read(), fname, mode) 430 else: 431 fobj = python_uncompress(fname, mode) 432 return fobj
        433
        434 - def convert(self, dest):
        435 """ 436 Convert a fabioimage object into another fabioimage object (with possible conversions) 437 @param dest: destination type "EDF", "edfimage" or the class itself 438 """ 439 if type(dest) in types.StringTypes: 440 dest = dest.lower() 441 modules = [] 442 for val in fabioutils.FILETYPES.values(): 443 modules += [i + "image" for i in val if i not in modules] 444 klass = None 445 module = None 446 klass_name = None 447 for klass_name in modules: 448 if klass_name.startswith(dest): 449 try: 450 module = sys.modules["fabio." + klass_name] 451 except KeyError: 452 try: 453 module = __import__(klass_name) 454 except: 455 logger.error("Failed to import %s", klass_name) 456 else: 457 logger.debug("imported %simage", klass_name) 458 if module is not None: 459 break 460 if module is not None: 461 if hasattr(module, klass_name): 462 klass = getattr(module, klass_name) 463 else: 464 logger.error("Module %s has no image class" % module) 465 elif isinstance(dest, self.__class__): 466 klass = dest.__class__ 467 elif ("__new__" in dir(dest)) and isinstance(dest(), fabioimage): 468 klass = dest 469 else: 470 logger.warning("Unrecognized destination format: %s " % dest) 471 return self 472 if klass is None: 473 logger.warning("Unrecognized destination format: %s " % dest) 474 return self 475 other = klass() #temporary instance (to be overwritten) 476 other = klass(data=converters.convert_data(self.classname, other.classname, self.data), 477 header=converters.convert_header(self.classname, other.classname, self.header)) 478 return other
        479
        480 -def test():
        481 """ 482 check some basic fabioimage functionality 483 """ 484 import time 485 start = time.time() 486 487 dat = numpy.ones((1024, 1024), numpy.uint16) 488 dat = (dat * 50000).astype(numpy.uint16) 489 assert dat.dtype.char == numpy.ones((1), numpy.uint16).dtype.char 490 hed = {"Title":"50000 everywhere"} 491 obj = fabioimage(dat, hed) 492 493 assert obj.getmax() == 50000 494 assert obj.getmin() == 50000 495 assert obj.getmean() == 50000 , obj.getmean() 496 assert obj.getstddev() == 0. 497 498 dat2 = numpy.zeros((1024, 1024), numpy.uint16, savespace=1) 499 cord = [ 256, 256, 790, 768 ] 500 slic = obj.make_slice(cord) 501 dat2[slic] = dat2[slic] + 100 502 503 obj = fabioimage(dat2, hed) 504 505 # New object, so... 506 assert obj.maxval is None 507 assert obj.minval is None 508 509 assert obj.getmax() == 100, obj.getmax() 510 assert obj.getmin() == 0 , obj.getmin() 511 npix = (slic[0].stop - slic[0].start) * (slic[1].stop - slic[1].start) 512 obj.resetvals() 513 area1 = obj.integrate_area(cord) 514 obj.resetvals() 515 area2 = obj.integrate_area(slic) 516 assert area1 == area2 517 assert obj.integrate_area(cord) == obj.integrate_area(slic) 518 assert obj.integrate_area(cord) == npix * 100, obj.integrate_area(cord) 519 520 521 def clean(): 522 """ clean up the created testfiles""" 523 for name in ["testfile", "testfile.gz", "testfile.bz2"]: 524 try: 525 os.remove(name) 526 except: 527 continue
        528 529 530 clean() 531 import gzip, bz2 532 gzip.open("testfile.gz", "wb").write("{ hello }") 533 fout = obj._open("testfile.gz") 534 readin = fout.read() 535 assert readin == "{ hello }", readin + " gzipped file" 536 537 538 bz2.BZ2File("testfilebz", "wb").write("{ hello }") 539 fout = obj._open("testfile.bz2") 540 readin = fout.read() 541 assert readin == "{ hello }", readin + " bzipped file" 542 543 ftest = open("testfile", "wb") 544 ftest.write("{ hello }") 545 assert ftest == obj._open(ftest) 546 ftest.close() 547 fout = obj._open("testfile") 548 readin = fout.read() 549 assert readin == "{ hello }", readin + "plain file" 550 fout.close() 551 ftest.close() 552 clean() 553 554 print "Passed in", time.time() - start, "s" 555 556 if __name__ == '__main__': 557 test() 558

        fabio-0.1.3/epydoc/fabio.HiPiCimage.HiPiCimage-class.html0000644000175000017500000003653312126623347023627 0ustar jeromejerome00000000000000 fabio.HiPiCimage.HiPiCimage
        Package fabio :: Module HiPiCimage :: Class HiPiCimage
        [hide private]
        [frames] | no frames]

        Class HiPiCimage

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               HiPiCimage
        

        Read HiPic images e.g. collected with a Hamamatsu CCD camera

        Instance Methods [hide private]
         
        _readheader(self, infile)
        Read in a header from an already open file
        source code
         
        read(self, fname, frame=None)
        Read in header into self.header and...
        source code

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header, write

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]
        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        _readheader(self, infile)

        source code 

        Read in a header from an already open file

        Overrides: fabioimage.fabioimage._readheader

        read(self, fname, frame=None)

        source code 
        
        Read in header into self.header and
            the data   into self.data
        
        
        Overrides: fabioimage.fabioimage.read

        fabio-0.1.3/epydoc/toc-fabio.fit2dspreadsheetimage-module.html0000644000175000017500000000242612120434325025120 0ustar jeromejerome00000000000000 fit2dspreadsheetimage

        Module fit2dspreadsheetimage


        Classes

        fit2dspreadsheetimage

        Variables

        __package__

        [hide private] fabio-0.1.3/epydoc/fabio.bruker100image.bruker100image-class.html0000644000175000017500000004063212126623347025160 0ustar jeromejerome00000000000000 fabio.bruker100image.bruker100image
        Package fabio :: Module bruker100image :: Class bruker100image
        [hide private]
        [frames] | no frames]

        Class bruker100image

        source code

                   object --+        
                            |        
        fabioimage.fabioimage --+    
                                |    
          brukerimage.brukerimage --+
                                    |
                                   bruker100image
        

        Instance Methods [hide private]
         
        toPIL16(self, filename=None)
        Convert to Python Imaging Library 16 bit greyscale image
        source code
         
        read(self, fname, frame=None)
        Read in and unpack the pixels (including overflow table
        source code

        Inherited from brukerimage.brukerimage: write, write2

        Inherited from brukerimage.brukerimage (private): _readheader

        Inherited from fabioimage.fabioimage: __init__, add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]

        Inherited from fabioimage.fabioimage: checkData, checkHeader

        Class Variables [hide private]

        Inherited from brukerimage.brukerimage: __headerstring__

        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        toPIL16(self, filename=None)

        source code 

        Convert to Python Imaging Library 16 bit greyscale image

        FIXME - this should be handled by the libraries now

        Overrides: fabioimage.fabioimage.toPIL16
        (inherited documentation)

        read(self, fname, frame=None)

        source code 

        Read in and unpack the pixels (including overflow table

        Overrides: fabioimage.fabioimage.read
        (inherited documentation)

        fabio-0.1.3/epydoc/toc-fabio.adscimage-module.html0000644000175000017500000000263712120434325022576 0ustar jeromejerome00000000000000 adscimage

        Module adscimage


        Classes

        adscimage

        Functions

        test

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.fit2dspreadsheetimage-pysrc.html0000644000175000017500000010226212126623347024221 0ustar jeromejerome00000000000000 fabio.fit2dspreadsheetimage
        Package fabio :: Module fit2dspreadsheetimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.fit2dspreadsheetimage

         1   
         2   
         3  """ 
         4  Read the fit2d ascii image output 
         5          + Jon Wright, ESRF 
         6  """ 
         7   
         8  import numpy 
         9   
        10  from fabioimage import fabioimage 
        11   
        12   
        13   
        14   
        
        15 -class fit2dspreadsheetimage(fabioimage):
        16 """ 17 Read a fit2d ascii format 18 """ 19
        20 - def _readheader(self, infile):
        21 """ 22 23 TODO : test for minimal attributes? 24 """ 25 line = infile.readline() 26 try: 27 items = line.split() 28 xdim = int(items[0]) 29 ydim = int(items[1]) 30 except: 31 raise 32 self.header['title'] = line 33 self.header['Dim_1'] = xdim 34 self.header['Dim_2'] = ydim
        35
        36 - def read(self, fname, frame=None):
        37 """ 38 Read in header into self.header and 39 the data into self.data 40 """ 41 self.header = {} 42 self.resetvals() 43 infile = self._open(fname) 44 self._readheader(infile) 45 # Compute image size 46 try: 47 self.dim1 = int(self.header['Dim_1']) 48 self.dim2 = int(self.header['Dim_2']) 49 except: 50 raise Exception("file", str(fname) + \ 51 "is corrupt, cannot read it") 52 bytecode = numpy.float32 53 54 self.bpp = len(numpy.array(0, bytecode).tostring()) 55 56 #now read the data into the array 57 try: 58 vals = [] 59 for line in infile.readlines(): 60 try: 61 vals.append([float(x) for x in line.split()]) 62 except: 63 pass 64 self.data = numpy.array(vals).astype(bytecode) 65 assert self.data.shape == (self.dim2, self.dim1) 66 67 except: 68 raise IOError, "Error reading ascii" 69 70 self.resetvals() 71 # ensure the PIL image is reset 72 self.pilimage = None 73 return self
        74 75 76 if __name__ == "__main__": 77 import sys, time 78 start = time.time() 79 img = fit2dspreadsheetimage() 80 img.read(sys.argv[1]) 81 print time.time() - start 82 print img.dim1, img.dim2, img.data.shape 83 from matplotlib.pylab import imshow, show 84 imshow(img.data.T) 85 show() 86

        fabio-0.1.3/epydoc/fabio.TiffIO-pysrc.html0000644000175000017500000135132112126623347021101 0ustar jeromejerome00000000000000 fabio.TiffIO
        Package fabio :: Module TiffIO
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.TiffIO

           1  #/*########################################################################## 
           2  # Copyright (C) 2012 European Synchrotron Radiation Facility 
           3  # 
           4  # This file is part of the PyMca X-ray Fluorescence Toolkit developed at 
           5  # the ESRF by the Software group. 
           6  # 
           7  # This file is free software; you can redistribute it and/or modify it  
           8  # under the terms of the GNU Lesser General Public License as published by the Free 
           9  # Software Foundation; either version 2 of the License, or (at your option)  
          10  # any later version. 
          11  # 
          12  # PyMca is distributed in the hope that it will be useful, but WITHOUT ANY 
          13  # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
          14  # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more 
          15  # details. 
          16  # 
          17  #############################################################################*/ 
          18  __author__ = "V.A. Sole - ESRF Data Analysis" 
          19  __revision__ = 1501 
          20   
          21  import sys 
          22  import os 
          23  import struct 
          24  import numpy 
          25   
          26  DEBUG = 0 
          27  ALLOW_MULTIPLE_STRIPS = False 
          28   
          29  TAG_ID = { 256:"NumberOfColumns", # S or L ImageWidth 
          30              257:"NumberOfRows", # S or L ImageHeight 
          31              258:"BitsPerSample", # S Number of bits per component 
          32              259:"Compression", # SHORT (1 - NoCompression, ...  
          33              262:"PhotometricInterpretation", # SHORT (0 - WhiteIsZero, 1 -BlackIsZero, 2 - RGB, 3 - Palette color 
          34              270:"ImageDescription", # ASCII 
          35              273:"StripOffsets", # S or L, for each strip, the byte offset of the strip 
          36              278:"RowsPerStrip", # S or L, number of rows in each back may be not for the last 
          37              279:"StripByteCounts", # S or L, The number of bytes in the strip AFTER any compression 
          38              305:"Software", # ASCII 
          39              306:"Date", # ASCII 
          40              320:"Colormap", # Colormap of Palette-color Images  
          41              339:"SampleFormat", # SHORT Interpretation of data in each pixel 
          42              } 
          43   
          44  #TILES ARE TO BE SUPPORTED TOO ... 
          45  TAG_NUMBER_OF_COLUMNS = 256 
          46  TAG_NUMBER_OF_ROWS = 257 
          47  TAG_BITS_PER_SAMPLE = 258 
          48  TAG_PHOTOMETRIC_INTERPRETATION = 262 
          49  TAG_COMPRESSION = 259 
          50  TAG_IMAGE_DESCRIPTION = 270 
          51  TAG_STRIP_OFFSETS = 273 
          52  TAG_ROWS_PER_STRIP = 278 
          53  TAG_STRIP_BYTE_COUNTS = 279 
          54  TAG_SOFTWARE = 305 
          55  TAG_DATE = 306 
          56  TAG_COLORMAP = 320 
          57  TAG_SAMPLE_FORMAT = 339 
          58   
          59  FIELD_TYPE = {1:('BYTE', "B"), 
          60                 2:('ASCII', "s"), #string ending with binary zero 
          61                 3:('SHORT', "H"), 
          62                 4:('LONG', "I"), 
          63                 5:('RATIONAL', "II"), 
          64                 6:('SBYTE', "b"), 
          65                 7:('UNDEFINED', "B"), 
          66                 8:('SSHORT', "h"), 
          67                 9:('SLONG', "i"), 
          68                 10:('SRATIONAL', "ii"), 
          69                 11:('FLOAT', "f"), 
          70                 12:('DOUBLE', "d")} 
          71   
          72  FIELD_TYPE_OUT = { 'B':   1, 
          73                     's':   2, 
          74                     'H':   3, 
          75                     'I':   4, 
          76                     'II':  5, 
          77                     'b':   6, 
          78                     'h':   8, 
          79                     'i':   9, 
          80                     'ii': 10, 
          81                     'f':  11, 
          82                     'd':  12} 
          83   
          84  #sample formats (http://www.awaresystems.be/imaging/tiff/tiffflags/sampleformat.html) 
          85  SAMPLE_FORMAT_UINT = 1 
          86  SAMPLE_FORMAT_INT = 2 
          87  SAMPLE_FORMAT_FLOAT = 3   #floating point 
          88  SAMPLE_FORMAT_VOID = 4   #undefined data, usually assumed UINT 
          89  SAMPLE_FORMAT_COMPLEXINT = 5 
          90  SAMPLE_FORMAT_COMPLEXIEEEFP = 6 
          91   
          92   
          93   
        
        94 -class TiffIO(object):
        95 - def __init__(self, filename, mode=None, cache_length=20, mono_output=False):
        96 if mode is None: 97 mode = 'rb' 98 if 'b' not in mode: 99 mode = mode + 'b' 100 if 'a' in mode.lower(): 101 raise IOError("Mode %s makes no sense on TIFF files. Consider 'rb+'" % mode) 102 if ('w' in mode): 103 if '+' not in mode: 104 mode += '+' 105 #if isinstance(filename, file): #does not work in python 3 106 if hasattr(filename, "seek"): 107 fd = filename 108 self._access = None 109 else: 110 #the b is needed for windows and python 3 111 fd = open(filename, mode) 112 self._access = mode 113 114 self._initInternalVariables(fd) 115 self._maxImageCacheLength = cache_length 116 self._forceMonoOutput = mono_output
        117
        118 - def _initInternalVariables(self, fd=None):
        119 if fd is None: 120 fd = self.fd 121 else: 122 self.fd = fd 123 # read the order 124 fd.seek(0) 125 order = fd.read(2).decode() 126 if len(order): 127 if order == "II": 128 #intel, little endian 129 fileOrder = "little" 130 self._structChar = '<' 131 elif order == "MM": 132 #motorola, high endian 133 fileOrder = "big" 134 self._structChar = '>' 135 else: 136 raise IOError("File is not a Mar CCD file, nor a TIFF file") 137 a = fd.read(2) 138 fortyTwo = struct.unpack(self._structChar + "H", a)[0] 139 if fortyTwo != 42: 140 raise IOError("Invalid TIFF version %d" % fortyTwo) 141 else: 142 if DEBUG: 143 print("VALID TIFF VERSION") 144 if sys.byteorder != fileOrder: 145 swap = True 146 else: 147 swap = False 148 else: 149 if sys.byteorder == "little": 150 self._structChar = '<' 151 else: 152 self._structChar = '>' 153 swap = False 154 self._swap = swap 155 self._IFD = [] 156 self._imageDataCacheIndex = [] 157 self._imageDataCache = [] 158 self._imageInfoCacheIndex = [] 159 self._imageInfoCache = [] 160 self.getImageFileDirectories(fd)
        161
        162 - def __makeSureFileIsOpen(self):
        163 if not self.fd.closed: 164 return 165 if DEBUG: 166 print("Reopening closed file") 167 fileName = self.fd.name 168 if self._access is None: 169 #we do not own the file 170 #open in read mode 171 newFile = open(fileName, 'rb') 172 else: 173 newFile = open(fileName, self._access) 174 self.fd = newFile
        175
        176 - def __makeSureFileIsClosed(self):
        177 if self._access is None: 178 #we do not own the file 179 if DEBUG: 180 print("Not closing not owned file") 181 return 182 183 if not self.fd.closed: 184 self.fd.close()
        185
        186 - def getNumberOfImages(self):
        187 #update for the case someone has done anything? 188 self._updateIFD() 189 return len(self._IFD)
        190
        191 - def _updateIFD(self):
        195
        196 - def getImageFileDirectories(self, fd=None):
        197 if fd is None: 198 fd = self.fd 199 else: 200 self.fd = fd 201 st = self._structChar 202 fd.seek(4) 203 self._IFD = [] 204 nImages = 0 205 fmt = st + 'I' 206 inStr = fd.read(struct.calcsize(fmt)) 207 if not len(inStr): 208 offsetToIFD = 0 209 else: 210 offsetToIFD = struct.unpack(fmt, inStr)[0] 211 if DEBUG: 212 print("Offset to first IFD = %d" % offsetToIFD) 213 while offsetToIFD != 0: 214 self._IFD.append(offsetToIFD) 215 nImages += 1 216 fd.seek(offsetToIFD) 217 fmt = st + 'H' 218 numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] 219 if DEBUG: 220 print("Number of directory entries = %d" % numberOfDirectoryEntries) 221 222 fmt = st + 'I' 223 fd.seek(offsetToIFD + 2 + 12 * numberOfDirectoryEntries) 224 offsetToIFD = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] 225 if DEBUG: 226 print("Next Offset to IFD = %d" % offsetToIFD) 227 #offsetToIFD = 0 228 if DEBUG: 229 print("Number of images found = %d" % nImages) 230 return nImages
        231
        232 - def _parseImageFileDirectory(self, nImage):
        233 offsetToIFD = self._IFD[nImage] 234 st = self._structChar 235 fd = self.fd 236 fd.seek(offsetToIFD) 237 fmt = st + 'H' 238 numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] 239 if DEBUG: 240 print("Number of directory entries = %d" % numberOfDirectoryEntries) 241 242 fmt = st + 'HHI4s' 243 tagIDList = [] 244 fieldTypeList = [] 245 nValuesList = [] 246 valueOffsetList = [] 247 for i in range(numberOfDirectoryEntries): 248 tagID, fieldType, nValues, valueOffset = struct.unpack(fmt, fd.read(12)) 249 tagIDList.append(tagID) 250 fieldTypeList.append(fieldType) 251 nValuesList.append(nValues) 252 if nValues == 1: 253 ftype, vfmt = FIELD_TYPE[fieldType] 254 if ftype not in ['ASCII', 'RATIONAL', 'SRATIONAL']: 255 vfmt = st + vfmt 256 actualValue = struct.unpack(vfmt, valueOffset[0: struct.calcsize(vfmt)])[0] 257 valueOffsetList.append(actualValue) 258 else: 259 valueOffsetList.append(valueOffset) 260 elif (nValues < 5) and (fieldType == 2): 261 ftype, vfmt = FIELD_TYPE[fieldType] 262 vfmt = st + "%d%s" % (nValues, vfmt) 263 actualValue = struct.unpack(vfmt, valueOffset[0: struct.calcsize(vfmt)])[0] 264 valueOffsetList.append(actualValue) 265 else: 266 valueOffsetList.append(valueOffset) 267 if DEBUG: 268 if tagID in TAG_ID: 269 print("tagID = %s" % TAG_ID[tagID]) 270 else: 271 print("tagID = %d" % tagID) 272 print("fieldType = %s" % FIELD_TYPE[fieldType][0]) 273 print("nValues = %d" % nValues) 274 #if nValues == 1: 275 # print("valueOffset = %s" % valueOffset) 276 return tagIDList, fieldTypeList, nValuesList, valueOffsetList
        277 278 279
        280 - def _readIFDEntry(self, tag, tagIDList, fieldTypeList, nValuesList, valueOffsetList):
        281 fd = self.fd 282 st = self._structChar 283 idx = tagIDList.index(tag) 284 nValues = nValuesList[idx] 285 output = [] 286 ftype, vfmt = FIELD_TYPE[fieldTypeList[idx]] 287 vfmt = st + "%d%s" % (nValues, vfmt) 288 requestedBytes = struct.calcsize(vfmt) 289 if nValues == 1: 290 output.append(valueOffsetList[idx]) 291 elif requestedBytes < 5: 292 output.append(valueOffsetList[idx]) 293 else: 294 offset = fd.seek(struct.unpack(st + "I", valueOffsetList[idx])[0]) 295 output = struct.unpack(vfmt, fd.read(requestedBytes)) 296 return output
        297
        298 - def getData(self, nImage, **kw):
        299 if nImage >= len(self._IFD): 300 #update prior to raise an index error error 301 self._updateIFD() 302 return self._readImage(nImage, **kw)
        303
        304 - def getImage(self, nImage):
        305 return self.getData(nImage)
        306
        307 - def getInfo(self, nImage, **kw):
        308 if nImage >= len(self._IFD): 309 #update prior to raise an index error error 310 self._updateIFD() 311 current = self._IFD[nImage] 312 return self._readInfo(nImage)
        313
        314 - def _readInfo(self, nImage, close=True):
        315 if nImage in self._imageInfoCacheIndex: 316 if DEBUG: 317 print("Reading info from cache") 318 return self._imageInfoCache[self._imageInfoCacheIndex.index(nImage)] 319 320 #read the header 321 self.__makeSureFileIsOpen() 322 tagIDList, fieldTypeList, nValuesList, valueOffsetList = self._parseImageFileDirectory(nImage) 323 324 #rows and columns 325 nColumns = valueOffsetList[tagIDList.index(TAG_NUMBER_OF_COLUMNS)] 326 nRows = valueOffsetList[tagIDList.index(TAG_NUMBER_OF_ROWS)] 327 328 #bits per sample 329 idx = tagIDList.index(TAG_BITS_PER_SAMPLE) 330 nBits = valueOffsetList[idx] 331 if nValuesList[idx] != 1: 332 #this happens with RGB and friends, nBits is not a single value 333 nBits = self._readIFDEntry(TAG_BITS_PER_SAMPLE, 334 tagIDList, fieldTypeList, nValuesList, valueOffsetList) 335 336 337 if TAG_COLORMAP in tagIDList: 338 idx = tagIDList.index(TAG_COLORMAP) 339 tmpColormap = self._readIFDEntry(TAG_COLORMAP, 340 tagIDList, fieldTypeList, nValuesList, valueOffsetList) 341 if max(tmpColormap) > 255: 342 tmpColormap = numpy.array(tmpColormap, dtype=numpy.uint16) 343 tmpColormap = (tmpColormap / 256.).astype(numpy.uint8) 344 else: 345 tmpColormap = numpy.array(tmpColormap, dtype=numpy.uint8) 346 tmpColormap.shape = 3, -1 347 colormap = numpy.zeros((tmpColormap.shape[-1], 3), tmpColormap.dtype) 348 colormap[:, :] = tmpColormap.T 349 tmpColormap = None 350 else: 351 colormap = None 352 353 #sample format 354 if TAG_SAMPLE_FORMAT in tagIDList: 355 sampleFormat = valueOffsetList[tagIDList.index(TAG_SAMPLE_FORMAT)] 356 else: 357 #set to unknown 358 sampleFormat = SAMPLE_FORMAT_VOID 359 360 # compression 361 compression = False 362 compression_type = 1 363 if TAG_COMPRESSION in tagIDList: 364 compression_type = valueOffsetList[tagIDList.index(TAG_COMPRESSION)] 365 if compression_type == 1: 366 compression = False 367 else: 368 compression = True 369 370 #photometric interpretation 371 interpretation = 1 372 if TAG_PHOTOMETRIC_INTERPRETATION in tagIDList: 373 interpretation = valueOffsetList[tagIDList.index(TAG_PHOTOMETRIC_INTERPRETATION)] 374 else: 375 print("WARNING: Non standard TIFF. Photometric interpretation TAG missing") 376 helpString = "" 377 if sys.version > '2.6': 378 helpString = eval('b""') 379 380 if TAG_IMAGE_DESCRIPTION in tagIDList: 381 imageDescription = self._readIFDEntry(TAG_IMAGE_DESCRIPTION, 382 tagIDList, fieldTypeList, nValuesList, valueOffsetList) 383 if type(imageDescription) in [type([1]), type((1,))]: 384 imageDescription = helpString.join(imageDescription) 385 else: 386 imageDescription = "%d/%d" % (nImage + 1, len(self._IFD)) 387 388 if sys.version < '3.0': 389 defaultSoftware = "Unknown Software" 390 else: 391 defaultSoftware = bytes("Unknown Software", 392 encoding='utf-8') 393 if TAG_SOFTWARE in tagIDList: 394 software = self._readIFDEntry(TAG_SOFTWARE, 395 tagIDList, fieldTypeList, nValuesList, valueOffsetList) 396 if type(software) in [type([1]), type((1,))]: 397 software = helpString.join(software) 398 else: 399 software = defaultSoftware 400 401 if software == defaultSoftware: 402 try: 403 if sys.version < '3.0': 404 if imageDescription.upper().startswith("IMAGEJ"): 405 software = imageDescription.split("=")[0] 406 else: 407 tmpString = imageDescription.decode() 408 if tmpString.upper().startswith("IMAGEJ"): 409 software = bytes(tmpString.split("=")[0], 410 encoding='utf-8') 411 except: 412 pass 413 414 if TAG_DATE in tagIDList: 415 date = self._readIFDEntry(TAG_DATE, 416 tagIDList, fieldTypeList, nValuesList, valueOffsetList) 417 if type(date) in [type([1]), type((1,))]: 418 date = helpString.join(date) 419 else: 420 date = "Unknown Date" 421 422 stripOffsets = self._readIFDEntry(TAG_STRIP_OFFSETS, 423 tagIDList, fieldTypeList, nValuesList, valueOffsetList) 424 if TAG_ROWS_PER_STRIP in tagIDList: 425 rowsPerStrip = self._readIFDEntry(TAG_ROWS_PER_STRIP, 426 tagIDList, fieldTypeList, nValuesList, valueOffsetList)[0] 427 else: 428 rowsPerStrip = nRows 429 print("WARNING: Non standard TIFF. Rows per strip TAG missing") 430 431 if TAG_STRIP_BYTE_COUNTS in tagIDList: 432 stripByteCounts = self._readIFDEntry(TAG_STRIP_BYTE_COUNTS, 433 tagIDList, fieldTypeList, nValuesList, valueOffsetList) 434 else: 435 print("WARNING: Non standard TIFF. Strip byte counts TAG missing") 436 if hasattr(nBits, 'index'): 437 expectedSum = 0 438 for n in nBits: 439 expectedSum += int(nRows * nColumns * n / 8) 440 else: 441 expectedSum = int(nRows * nColumns * nBits / 8) 442 stripByteCounts = [expectedSum] 443 444 if close: 445 self.__makeSureFileIsClosed() 446 447 if self._forceMonoOutput and (interpretation > 1): 448 #color image but asked monochrome output 449 nBits = 32 450 colormap = None 451 sampleFormat = SAMPLE_FORMAT_FLOAT 452 interpretation = 1 453 #we cannot rely on any cache in this case 454 useInfoCache = False 455 if DEBUG: 456 print("FORCED MONO") 457 else: 458 useInfoCache = True 459 460 info = {} 461 info["nRows"] = nRows 462 info["nColumns"] = nColumns 463 info["nBits"] = nBits 464 info["compression"] = compression 465 info["compression_type"] = compression_type 466 info["imageDescription"] = imageDescription 467 info["stripOffsets"] = stripOffsets #This contains the file offsets to the data positions 468 info["rowsPerStrip"] = rowsPerStrip 469 info["stripByteCounts"] = stripByteCounts #bytes in strip since I do not support compression 470 info["software"] = software 471 info["date"] = date 472 info["colormap"] = colormap 473 info["sampleFormat"] = sampleFormat 474 info["photometricInterpretation"] = interpretation 475 infoDict = {} 476 if sys.version < '3.0': 477 testString = 'PyMca' 478 else: 479 testString = eval('b"PyMca"') 480 if software.startswith(testString): 481 #str to make sure python 2.x sees it as string and not unicode 482 if sys.version < '3.0': 483 descriptionString = imageDescription 484 else: 485 descriptionString = str(imageDescription.decode()) 486 #interpret the image description in terms of supplied 487 #information at writing time 488 items = descriptionString.split('=') 489 for i in range(int(len(items) / 2)): 490 key = "%s" % items[i * 2] 491 #get rid of the \n at the end of the value 492 value = "%s" % items[i * 2 + 1][:-1] 493 infoDict[key] = value 494 info['info'] = infoDict 495 496 if (self._maxImageCacheLength > 0) and useInfoCache: 497 self._imageInfoCacheIndex.insert(0, nImage) 498 self._imageInfoCache.insert(0, info) 499 if len(self._imageInfoCacheIndex) > self._maxImageCacheLength: 500 self._imageInfoCacheIndex = self._imageInfoCacheIndex[:self._maxImageCacheLength] 501 self._imageInfoCache = self._imageInfoCache[:self._maxImageCacheLength] 502 return info
        503
        504 - def _readImage(self, nImage, **kw):
        505 if DEBUG: 506 print("Reading image %d" % nImage) 507 if 'close' in kw: 508 close = kw['close'] 509 else: 510 close = True 511 rowMin = kw.get('rowMin', None) 512 rowMax = kw.get('rowMax', None) 513 if nImage in self._imageDataCacheIndex: 514 if DEBUG: 515 print("Reading image data from cache") 516 return self._imageDataCache[self._imageDataCacheIndex.index(nImage)] 517 518 self.__makeSureFileIsOpen() 519 if self._forceMonoOutput: 520 oldMono = True 521 else: 522 oldMono = False 523 try: 524 self._forceMonoOutput = False 525 info = self._readInfo(nImage, close=False) 526 self._forceMonoOutput = oldMono 527 except: 528 self._forceMonoOutput = oldMono 529 raise 530 compression = info['compression'] 531 compression_type = info['compression_type'] 532 if compression: 533 if compression_type != 32773: 534 raise IOError("Compressed TIFF images not supported except packbits") 535 else: 536 #PackBits compression 537 if DEBUG: 538 print("Using PackBits compression") 539 540 interpretation = info["photometricInterpretation"] 541 if interpretation == 2: 542 #RGB 543 pass 544 #raise IOError("RGB Image. Only grayscale images supported") 545 elif interpretation == 3: 546 #Palette Color Image 547 pass 548 #raise IOError("Palette-color Image. Only grayscale images supported") 549 elif interpretation > 2: 550 #Palette Color Image 551 raise IOError("Only grayscale images supported") 552 553 nRows = info["nRows"] 554 nColumns = info["nColumns"] 555 nBits = info["nBits"] 556 colormap = info["colormap"] 557 sampleFormat = info["sampleFormat"] 558 559 if rowMin is None: 560 rowMin = 0 561 562 if rowMax is None: 563 rowMax = nRows - 1 564 565 if rowMin < 0: 566 rowMin = nRows - rowMin 567 568 if rowMax < 0: 569 rowMax = nRows - rowMax 570 571 if rowMax < rowMin: 572 txt = "Max Row smaller than Min Row. Reverse selection not supported" 573 raise NotImplemented(txt) 574 575 if rowMin >= nRows: 576 raise IndexError("Image only has %d rows" % nRows) 577 578 if rowMax >= nRows: 579 raise IndexError("Image only has %d rows" % nRows) 580 581 if sampleFormat == SAMPLE_FORMAT_FLOAT: 582 if nBits == 32: 583 dtype = numpy.float32 584 elif nBits == 64: 585 dtype = numpy.float64 586 else: 587 raise ValueError("Unsupported number of bits for a float: %d" % nBits) 588 elif sampleFormat in [SAMPLE_FORMAT_UINT, SAMPLE_FORMAT_VOID]: 589 if nBits in [8, (8, 8, 8), [8, 8, 8]]: 590 dtype = numpy.uint8 591 elif nBits in [16, (16, 16, 16), [16, 16, 16]]: 592 dtype = numpy.uint16 593 elif nBits in [32, (32, 32, 32), [32, 32, 32]]: 594 dtype = numpy.uint32 595 elif nBits in [64, (64, 64, 64), [64, 64, 64]]: 596 dtype = numpy.uint64 597 else: 598 raise ValueError("Unsupported number of bits for unsigned int: %s" % (nBits,)) 599 elif sampleFormat == SAMPLE_FORMAT_INT: 600 if nBits in [8, (8, 8, 8), [8, 8, 8]]: 601 dtype = numpy.int8 602 elif nBits in [16, (16, 16, 16), [16, 16, 16]]: 603 dtype = numpy.int16 604 elif nBits in [32, (32, 32, 32), [32, 32, 32]]: 605 dtype = numpy.int32 606 elif nBits in [64, (64, 64, 64), [64, 64, 64]]: 607 dtype = numpy.int64 608 else: 609 raise ValueError("Unsupported number of bits for signed int: %s" % (nBits,)) 610 else: 611 raise ValueError("Unsupported combination. Bits = %s Format = %d" % (nBits, sampleFormat)) 612 if hasattr(nBits, 'index'): 613 image = numpy.zeros((nRows, nColumns, len(nBits)), dtype=dtype) 614 elif colormap is not None: 615 #should I use colormap dtype? 616 image = numpy.zeros((nRows, nColumns, 3), dtype=dtype) 617 else: 618 image = numpy.zeros((nRows, nColumns), dtype=dtype) 619 620 fd = self.fd 621 st = self._structChar 622 stripOffsets = info["stripOffsets"] #This contains the file offsets to the data positions 623 rowsPerStrip = info["rowsPerStrip"] 624 stripByteCounts = info["stripByteCounts"] #bytes in strip since I do not support compression 625 626 rowStart = 0 627 if len(stripOffsets) == 1: 628 bytesPerRow = int(stripByteCounts[0] / rowsPerStrip) 629 fd.seek(stripOffsets[0] + rowMin * bytesPerRow) 630 nBytes = (rowMax - rowMin + 1) * bytesPerRow 631 if self._swap: 632 readout = numpy.fromstring(fd.read(nBytes), dtype).byteswap() 633 else: 634 readout = numpy.fromstring(fd.read(nBytes), dtype) 635 if hasattr(nBits, 'index'): 636 readout.shape = -1, nColumns, len(nBits) 637 elif info['colormap'] is not None: 638 readout = colormap[readout] 639 else: 640 readout.shape = -1, nColumns 641 image[rowMin:rowMax + 1, :] = readout 642 else: 643 for i in range(len(stripOffsets)): 644 #the amount of rows 645 nRowsToRead = rowsPerStrip 646 rowEnd = int(min(rowStart + nRowsToRead, nRows)) 647 if rowEnd < rowMin: 648 rowStart += nRowsToRead 649 continue 650 if (rowStart > rowMax): 651 break 652 #we are in position 653 fd.seek(stripOffsets[i]) 654 #the amount of bytes to read 655 nBytes = stripByteCounts[i] 656 if compression_type == 32773: 657 try: 658 bufferBytes = bytes() 659 except: 660 #python 2.5 ... 661 bufferBytes = "" 662 #packBits 663 readBytes = 0 664 #intermediate buffer 665 tmpBuffer = fd.read(nBytes) 666 while readBytes < nBytes: 667 n = struct.unpack('b', tmpBuffer[readBytes:(readBytes + 1)])[0] 668 readBytes += 1 669 if n >= 0: 670 #should I prevent reading more than the 671 #length of the chain? Let's python raise 672 #the exception... 673 bufferBytes += tmpBuffer[readBytes:\ 674 readBytes + (n + 1)] 675 readBytes += (n + 1) 676 elif n > -128: 677 bufferBytes += (-n + 1) * tmpBuffer[readBytes:(readBytes + 1)] 678 readBytes += 1 679 else: 680 #if read -128 ignore the byte 681 continue 682 if self._swap: 683 readout = numpy.fromstring(bufferBytes, dtype).byteswap() 684 else: 685 readout = numpy.fromstring(bufferBytes, dtype) 686 if hasattr(nBits, 'index'): 687 readout.shape = -1, nColumns, len(nBits) 688 elif info['colormap'] is not None: 689 readout = colormap[readout] 690 readout.shape = -1, nColumns, 3 691 else: 692 readout.shape = -1, nColumns 693 image[rowStart:rowEnd, :] = readout 694 else: 695 if 1: 696 #use numpy 697 if self._swap: 698 readout = numpy.fromstring(fd.read(nBytes), dtype).byteswap() 699 else: 700 readout = numpy.fromstring(fd.read(nBytes), dtype) 701 if hasattr(nBits, 'index'): 702 readout.shape = -1, nColumns, len(nBits) 703 elif colormap is not None: 704 readout = colormap[readout] 705 readout.shape = -1, nColumns, 3 706 else: 707 readout.shape = -1, nColumns 708 image[rowStart:rowEnd, :] = readout 709 else: 710 #using struct 711 readout = numpy.array(struct.unpack(st + "%df" % int(nBytes / 4), fd.read(nBytes)), 712 dtype=dtype) 713 if hasattr(nBits, 'index'): 714 readout.shape = -1, nColumns, len(nBits) 715 elif colormap is not None: 716 readout = colormap[readout] 717 readout.shape = -1, nColumns, 3 718 else: 719 readout.shape = -1, nColumns 720 image[rowStart:rowEnd, :] = readout 721 rowStart += nRowsToRead 722 if close: 723 self.__makeSureFileIsClosed() 724 725 if len(image.shape) == 3: 726 #color image 727 if self._forceMonoOutput: 728 #color image, convert to monochrome 729 image = (image[:, :, 0] * 0.114 + \ 730 image[:, :, 1] * 0.587 + \ 731 image[:, :, 2] * 0.299).astype(numpy.float32) 732 733 if (rowMin == 0) and (rowMax == (nRows - 1)): 734 self._imageDataCacheIndex.insert(0, nImage) 735 self._imageDataCache.insert(0, image) 736 if len(self._imageDataCacheIndex) > self._maxImageCacheLength: 737 self._imageDataCacheIndex = self._imageDataCacheIndex[:self._maxImageCacheLength] 738 self._imageDataCache = self._imageDataCache[:self._maxImageCacheLength] 739 740 return image
        741
        742 - def writeImage(self, image0, info=None, software=None, date=None):
        743 if software is None: 744 software = 'PyMca.TiffIO' 745 #if date is None: 746 # date = time.ctime() 747 748 self.__makeSureFileIsOpen() 749 fd = self.fd 750 #prior to do anything, perform some tests 751 if not len(image0.shape): 752 raise ValueError("Empty image") 753 if len(image0.shape) == 1: 754 #get a different view 755 image = image0[:] 756 image.shape = 1, -1 757 else: 758 image = image0 759 760 if image.dtype == numpy.float64: 761 image = image.astype(numpy.float32) 762 fd.seek(0) 763 mode = fd.mode 764 name = fd.name 765 if 'w' in mode: 766 #we have to overwrite the file 767 self.__makeSureFileIsClosed() 768 fd = None 769 if os.path.exists(name): 770 os.remove(name) 771 fd = open(name, mode='wb+') 772 self._initEmptyFile(fd) 773 self.fd = fd 774 775 #read the file size 776 self.__makeSureFileIsOpen() 777 fd = self.fd 778 fd.seek(0, os.SEEK_END) 779 endOfFile = fd.tell() 780 if fd.tell() == 0: 781 self._initEmptyFile(fd) 782 fd.seek(0, os.SEEK_END) 783 endOfFile = fd.tell() 784 785 #init internal variables 786 self._initInternalVariables(fd) 787 st = self._structChar 788 789 #get the image file directories 790 nImages = self.getImageFileDirectories() 791 if DEBUG: 792 print("File contains %d images" % nImages) 793 if nImages == 0: 794 fd.seek(4) 795 fmt = st + 'I' 796 fd.write(struct.pack(fmt, endOfFile)) 797 else: 798 fd.seek(self._IFD[-1]) 799 fmt = st + 'H' 800 numberOfDirectoryEntries = struct.unpack(fmt, fd.read(struct.calcsize(fmt)))[0] 801 fmt = st + 'I' 802 pos = self._IFD[-1] + 2 + 12 * numberOfDirectoryEntries 803 fd.seek(pos) 804 fmt = st + 'I' 805 fd.write(struct.pack(fmt, endOfFile)) 806 fd.flush() 807 808 #and we can write at the end of the file, find out the file length 809 fd.seek(0, os.SEEK_END) 810 811 #get the description information from the input information 812 if info is None: 813 description = info 814 else: 815 description = "%s" % "" 816 for key in info.keys(): 817 description += "%s=%s\n" % (key, info[key]) 818 819 #get the image file directory 820 outputIFD = self._getOutputIFD(image, description=description, 821 software=software, 822 date=date) 823 824 #write the new IFD 825 fd.write(outputIFD) 826 827 #write the image 828 if self._swap: 829 fd.write(image.byteswap().tostring()) 830 else: 831 fd.write(image.tostring()) 832 833 fd.flush() 834 self.fd = fd 835 self.__makeSureFileIsClosed()
        836
        837 - def _initEmptyFile(self, fd=None):
        838 if fd is None: 839 fd = self.fd 840 if sys.byteorder == "little": 841 order = "II" 842 #intel, little endian 843 fileOrder = "little" 844 self._structChar = '<' 845 else: 846 order = "MM" 847 #motorola, high endian 848 fileOrder = "big" 849 self._structChar = '>' 850 st = self._structChar 851 if fileOrder == sys.byteorder: 852 self._swap = False 853 else: 854 self._swap = True 855 fd.seek(0) 856 if sys.version < '3.0': 857 fd.write(struct.pack(st + '2s', order)) 858 fd.write(struct.pack(st + 'H', 42)) 859 fd.write(struct.pack(st + 'I', 0)) 860 else: 861 fd.write(struct.pack(st + '2s', bytes(order, 'utf-8'))) 862 fd.write(struct.pack(st + 'H', 42)) 863 fd.write(struct.pack(st + 'I', 0)) 864 fd.flush()
        865
        866 - def _getOutputIFD(self, image, description=None, software=None, date=None):
        867 #the tags have to be in order 868 #the very minimum is 869 #256:"NumberOfColumns", # S or L ImageWidth 870 #257:"NumberOfRows", # S or L ImageHeight 871 #258:"BitsPerSample", # S Number of bits per component 872 #259:"Compression", # SHORT (1 - NoCompression, ... 873 #262:"PhotometricInterpretation", # SHORT (0 - WhiteIsZero, 1 -BlackIsZero, 2 - RGB, 3 - Palette color 874 #270:"ImageDescription", # ASCII 875 #273:"StripOffsets", # S or L, for each strip, the byte offset of the strip 876 #278:"RowsPerStrip", # S or L, number of rows in each back may be not for the last 877 #279:"StripByteCounts", # S or L, The number of bytes in the strip AFTER any compression 878 #305:"Software", # ASCII 879 #306:"Date", # ASCII 880 #339:"SampleFormat", # SHORT Interpretation of data in each pixel 881 882 nDirectoryEntries = 9 883 imageDescription = None 884 if description is not None: 885 descriptionLength = len(description) 886 while descriptionLength < 4: 887 description = description + " " 888 descriptionLength = len(description) 889 if sys.version >= '3.0': 890 description = bytes(description, 'utf-8') 891 elif type(description) != type(""): 892 try: 893 description = description.decode('utf-8') 894 except UnicodeDecodeError: 895 try: 896 description = description.decode('latin-1') 897 except UnicodeDecodeError: 898 description = "%s" % description 899 if sys.version > '2.6': 900 description = description.encode('utf-8', errors="ignore") 901 description = "%s" % description 902 descriptionLength = len(description) 903 imageDescription = struct.pack("%ds" % descriptionLength, description) 904 nDirectoryEntries += 1 905 906 #software 907 if software is not None: 908 softwareLength = len(software) 909 while softwareLength < 4: 910 software = software + " " 911 softwareLength = len(software) 912 if sys.version >= '3.0': 913 software = bytes(software, 'utf-8') 914 softwarePackedString = struct.pack("%ds" % softwareLength, software) 915 nDirectoryEntries += 1 916 else: 917 softwareLength = 0 918 919 if date is not None: 920 dateLength = len(date) 921 if sys.version >= '3.0': 922 date = bytes(date, 'utf-8') 923 datePackedString = struct.pack("%ds" % dateLength, date) 924 dateLength = len(datePackedString) 925 nDirectoryEntries += 1 926 else: 927 dateLength = 0 928 929 nRows, nColumns = image.shape 930 dtype = image.dtype 931 bitsPerSample = int(dtype.str[-1]) * 8 932 933 #only uncompressed data 934 compression = 1 935 936 #interpretation, black is zero 937 interpretation = 1 938 939 #image description 940 if imageDescription is not None: 941 descriptionLength = len(imageDescription) 942 else: 943 descriptionLength = 0 944 945 #strip offsets 946 #we are putting them after the directory and the directory is 947 #at the end of the file 948 self.fd.seek(0, os.SEEK_END) 949 endOfFile = self.fd.tell() 950 if endOfFile == 0: 951 #empty file 952 endOfFile = 8 953 954 #rows per strip 955 if ALLOW_MULTIPLE_STRIPS: 956 #try to segment the image in several pieces 957 if not (nRows % 4): 958 rowsPerStrip = int(nRows / 4) 959 elif not (nRows % 10): 960 rowsPerStrip = int(nRows / 10) 961 elif not (nRows % 8): 962 rowsPerStrip = int(nRows / 8) 963 elif not (nRows % 4): 964 rowsPerStrip = int(nRows / 4) 965 elif not (nRows % 2): 966 rowsPerStrip = int(nRows / 2) 967 else: 968 rowsPerStrip = nRows 969 else: 970 rowsPerStrip = nRows 971 972 #stripByteCounts 973 stripByteCounts = int(nColumns * rowsPerStrip * bitsPerSample / 8) 974 975 if descriptionLength > 4: 976 stripOffsets0 = endOfFile + dateLength + descriptionLength + \ 977 2 + 12 * nDirectoryEntries + 4 978 else: 979 stripOffsets0 = endOfFile + dateLength + \ 980 2 + 12 * nDirectoryEntries + 4 981 982 if softwareLength > 4: 983 stripOffsets0 += softwareLength 984 985 stripOffsets = [stripOffsets0] 986 stripOffsetsLength = 0 987 stripOffsetsString = None 988 989 st = self._structChar 990 991 if rowsPerStrip != nRows: 992 nStripOffsets = int(nRows / rowsPerStrip) 993 fmt = st + 'I' 994 stripOffsetsLength = struct.calcsize(fmt) * nStripOffsets 995 stripOffsets0 += stripOffsetsLength 996 #the length for the stripByteCounts will be the same 997 stripOffsets0 += stripOffsetsLength 998 stripOffsets = [] 999 for i in range(nStripOffsets): 1000 value = stripOffsets0 + i * stripByteCounts 1001 stripOffsets.append(value) 1002 if i == 0: 1003 stripOffsetsString = struct.pack(fmt, value) 1004 stripByteCountsString = struct.pack(fmt, stripByteCounts) 1005 else: 1006 stripOffsetsString += struct.pack(fmt, value) 1007 stripByteCountsString += struct.pack(fmt, stripByteCounts) 1008 1009 if DEBUG: 1010 print("IMAGE WILL START AT %d" % stripOffsets[0]) 1011 1012 #sample format 1013 if dtype in [numpy.float32, numpy.float64] or\ 1014 dtype.str[-2] == 'f': 1015 sampleFormat = SAMPLE_FORMAT_FLOAT 1016 elif dtype in [numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64]: 1017 sampleFormat = SAMPLE_FORMAT_UINT 1018 elif dtype in [numpy.int8, numpy.int16, numpy.int32, numpy.int64]: 1019 sampleFormat = SAMPLE_FORMAT_INT 1020 else: 1021 raise ValueError("Unsupported data type %s" % dtype) 1022 1023 info = {} 1024 info["nColumns"] = nColumns 1025 info["nRows"] = nRows 1026 info["nBits"] = bitsPerSample 1027 info["compression"] = compression 1028 info["photometricInterpretation"] = interpretation 1029 info["stripOffsets"] = stripOffsets 1030 info["rowsPerStrip"] = rowsPerStrip 1031 info["stripByteCounts"] = stripByteCounts 1032 info["date"] = date 1033 info["sampleFormat"] = sampleFormat 1034 1035 outputIFD = "" 1036 if sys.version > '2.6': 1037 outputIFD = eval('b""') 1038 1039 fmt = st + "H" 1040 outputIFD += struct.pack(fmt, nDirectoryEntries) 1041 1042 fmt = st + "HHII" 1043 outputIFD += struct.pack(fmt, TAG_NUMBER_OF_COLUMNS, 1044 FIELD_TYPE_OUT['I'], 1045 1, 1046 info["nColumns"]) 1047 outputIFD += struct.pack(fmt, TAG_NUMBER_OF_ROWS, 1048 FIELD_TYPE_OUT['I'], 1049 1, 1050 info["nRows"]) 1051 1052 fmt = st + 'HHIHH' 1053 outputIFD += struct.pack(fmt, TAG_BITS_PER_SAMPLE, 1054 FIELD_TYPE_OUT['H'], 1055 1, 1056 info["nBits"], 0) 1057 fmt = st + 'HHIHH' 1058 outputIFD += struct.pack(fmt, TAG_COMPRESSION, 1059 FIELD_TYPE_OUT['H'], 1060 1, 1061 info["compression"], 0) 1062 fmt = st + 'HHIHH' 1063 outputIFD += struct.pack(fmt, TAG_PHOTOMETRIC_INTERPRETATION, 1064 FIELD_TYPE_OUT['H'], 1065 1, 1066 info["photometricInterpretation"], 0) 1067 1068 if imageDescription is not None: 1069 descriptionLength = len(imageDescription) 1070 if descriptionLength > 4: 1071 fmt = st + 'HHII' 1072 outputIFD += struct.pack(fmt, TAG_IMAGE_DESCRIPTION, 1073 FIELD_TYPE_OUT['s'], 1074 descriptionLength, 1075 info["stripOffsets"][0] - \ 1076 2 * stripOffsetsLength - \ 1077 descriptionLength) 1078 else: 1079 #it has to have length 4 1080 fmt = st + 'HHI%ds' % descriptionLength 1081 outputIFD += struct.pack(fmt, TAG_IMAGE_DESCRIPTION, 1082 FIELD_TYPE_OUT['s'], 1083 descriptionLength, 1084 description) 1085 1086 if len(stripOffsets) == 1: 1087 fmt = st + 'HHII' 1088 outputIFD += struct.pack(fmt, TAG_STRIP_OFFSETS, 1089 FIELD_TYPE_OUT['I'], 1090 1, 1091 info["stripOffsets"][0]) 1092 else: 1093 fmt = st + 'HHII' 1094 outputIFD += struct.pack(fmt, TAG_STRIP_OFFSETS, 1095 FIELD_TYPE_OUT['I'], 1096 len(stripOffsets), 1097 info["stripOffsets"][0] - 2 * stripOffsetsLength) 1098 1099 fmt = st + 'HHII' 1100 outputIFD += struct.pack(fmt, TAG_ROWS_PER_STRIP, 1101 FIELD_TYPE_OUT['I'], 1102 1, 1103 info["rowsPerStrip"]) 1104 1105 if len(stripOffsets) == 1: 1106 fmt = st + 'HHII' 1107 outputIFD += struct.pack(fmt, TAG_STRIP_BYTE_COUNTS, 1108 FIELD_TYPE_OUT['I'], 1109 1, 1110 info["stripByteCounts"]) 1111 else: 1112 fmt = st + 'HHII' 1113 outputIFD += struct.pack(fmt, TAG_STRIP_BYTE_COUNTS, 1114 FIELD_TYPE_OUT['I'], 1115 len(stripOffsets), 1116 info["stripOffsets"][0] - stripOffsetsLength) 1117 1118 if software is not None: 1119 if softwareLength > 4: 1120 fmt = st + 'HHII' 1121 outputIFD += struct.pack(fmt, TAG_SOFTWARE, 1122 FIELD_TYPE_OUT['s'], 1123 softwareLength, 1124 info["stripOffsets"][0] - \ 1125 2 * stripOffsetsLength - \ 1126 descriptionLength - softwareLength - dateLength) 1127 else: 1128 #it has to have length 4 1129 fmt = st + 'HHI%ds' % softwareLength 1130 outputIFD += struct.pack(fmt, TAG_SOFTWARE, 1131 FIELD_TYPE_OUT['s'], 1132 softwareLength, 1133 softwarePackedString) 1134 1135 if date is not None: 1136 fmt = st + 'HHII' 1137 outputIFD += struct.pack(fmt, TAG_DATE, 1138 FIELD_TYPE_OUT['s'], 1139 dateLength, 1140 info["stripOffsets"][0] - \ 1141 2 * stripOffsetsLength - \ 1142 descriptionLength - dateLength) 1143 1144 fmt = st + 'HHIHH' 1145 outputIFD += struct.pack(fmt, TAG_SAMPLE_FORMAT, 1146 FIELD_TYPE_OUT['H'], 1147 1, 1148 info["sampleFormat"], 0) 1149 fmt = st + 'I' 1150 outputIFD += struct.pack(fmt, 0) 1151 1152 if softwareLength > 4: 1153 outputIFD += softwarePackedString 1154 1155 if date is not None: 1156 outputIFD += datePackedString 1157 1158 if imageDescription is not None: 1159 if descriptionLength > 4: 1160 outputIFD += imageDescription 1161 1162 if stripOffsetsString is not None: 1163 outputIFD += stripOffsetsString 1164 outputIFD += stripByteCountsString 1165 1166 return outputIFD
        1167 1168 1169 if __name__ == "__main__": 1170 filename = sys.argv[1] 1171 dtype = numpy.uint16 1172 if not os.path.exists(filename): 1173 print("Testing file creation") 1174 tif = TiffIO(filename, mode='wb+') 1175 data = numpy.arange(10000).astype(dtype) 1176 data.shape = 100, 100 1177 tif.writeImage(data, info={'Title':'1st'}) 1178 tif = None 1179 if os.path.exists(filename): 1180 print("Testing image appending") 1181 tif = TiffIO(filename, mode='rb+') 1182 tif.writeImage((data * 2).astype(dtype), info={'Title':'2nd'}) 1183 tif = None 1184 tif = TiffIO(filename) 1185 print("Number of images = %d" % tif.getNumberOfImages()) 1186 for i in range(tif.getNumberOfImages()): 1187 info = tif.getInfo(i) 1188 for key in info: 1189 if key not in ["colormap"]: 1190 print("%s = %s" % (key, info[key])) 1191 elif info['colormap'] is not None: 1192 print("RED %s = %s" % (key, info[key][0:10, 0])) 1193 print("GREEN %s = %s" % (key, info[key][0:10, 1])) 1194 print("BLUE %s = %s" % (key, info[key][0:10, 2])) 1195 data = tif.getImage(i)[0, 0:10] 1196 print("data [0, 0:10] = ", data) 1197

        fabio-0.1.3/epydoc/fabio.pdf0000644000175000017500000240565012126623347016437 0ustar jeromejerome00000000000000%PDF-1.2 %Çì¢ 212 0 obj <> stream xœíœ[o7Çß_b÷Hë™ñøòØ¥U„rT!U})" Ðõëw|9çØM8$‡ ¤ ÎÆëõÌú7󟽽´‚AÇ?åÿç§‹ôãÃO›ÖëÅ»”té6|»Z|ý ‚À)æaõre$«Pó`²V§‹ßÆo–Zz0ãal’÷ìpüay@•A7Þ‹›½fÖn|³<@«,x;>O;jƒ@ãûØvØðxÛräìø¢ês¶D–Ñ-Ž/µÒŽA†ŸÆÆ#¸²™œ!;¾JÇ ¨eZo¶]ζÇù}õc²Ô*0C²Ô+¼È)ã,«£hb2 ÉJv‰^»Øêì’]C¶ ÐÚl(ôÙ*P:Ž™*’Qlœ½l ÈÚ£½ó¦Ùþ*OŸ½ÆlUés–ƒÆF«Ä²ÄT!#Þnæòg’´±Í'Ѷh8XþUÙL³YWm¨Ú´m¯}ì0ŠLôçËÅj­¬£4¿`ÄÛi~wÓY0ÚfÛº@ñ”(_<$f\ûЊ;¹ô0dš¥³#çŠ}œÆýÕ⑬üò÷øÃëa*X´¦^÷Ž+ƒ /ù»yUÆ5*S•Y3dz@âV2e¦àd#3oÈaXw@\w¦'jÄT_Oô °^ºJì ß-}ÌÈ!4ªà¬j?¯âW’§y¶M|³ ƒõ®%ܱmŒ›.ÜÕ†öp×Ã]†iZå 5=9ÞÓ,”CmfG©£t(‘ünv¡D”î.ã•¢à$25&8®“KlK¥%‹?H¸(ùßù†¼Óx9PXC5…ÇÛfƒ™–5’i[7t’:IWXAZæÄf0ñz¼hZ‘×­ªV9]¼9*?0VyÛ\)zñ‘÷G•šÊÕ$6Ð\Mº®ÌTh©Mí´tZ®N Y«°,¸…åp›K*AWÕ=o…¯ØR SÕ¹p…bÛ: eøYdž¸ÀAh\Ñ š)A<å5²²¨}¹µA·ìšQš‡"½89úÂ)†SÙbE¤ÚÍ–“Åã«úV†P”‡Ø:¸2°xÌJx©½z×£š)ØÉ¯G[%â~½„v_úÿ–Й—W*]ÊÌ6ÛÉKh2FâîB oA ݸ¡“ÔIÚ£( ”¨ Içåÿ,JèÆÔNËüiqÓÓ‚rö¡e~5tí‹ÎPgèãE4Ÿ0*7üodý}T‹äœ X÷>ŒJO€ÓÖÓåQWÌGêì ô›óu6‰Ù×QË6®ö“ײ( ¨ztc–µlcæå%C׳‡~òZQÁÀ.”&¨ecXƒDÿ6¸UR¤Þ\fw¹›y®ÜMlN«9¼Œú_u°:X»Ä:Z)û|hÀšiiÛ˜ÚÓP§eZXäú}h™]iÛø¢34S†Â¤¥-P*¾™¥íÃôzeðf|’^Í•!$­÷LwXÏß>ÿîáµ”­1(jݸ}sÔ©É^›Éd78%+a}Âf[ÁÖf^^té0¿°ö$Â&ìeª¦-f5+ÜÅÔ¥ìÃ¥lÔÆ'Û¢ö^zyŸ9À͸A»V[t :PW—å$ñß 5Ó"¶1µg¢[LŽ—|ì>àÌ®žm|Ñqê8]]Ø ]Òn‚—ÖWɦæcÿw¯'ÅÉq|¤ºõÅåU‡l^M÷y–MÎb§ÈÓΜ5“÷ÙS;8œOÇpqpæ'öj_tœæÓ¤ß6p¬Ýú¨yc•À ÚÛö½;é ö¾B¿±¬†ña™i?zXnY4«nY˜ÉoYȹ—4ÍÕûi³¼eјyyiеÃmvÓŽEfi7ß½˜ª nZ¬.~¢îNÆ-Hœ(1‹µ¡²¼¶H<)a6~¼[“;V«ýÞ•ß)ɽSÖ 6XÍôÆEcjçƒ?©î†¨ÙÇçX޶Ú•e^-¾cù÷_vÛÔendstream endobj 213 0 obj 1847 endobj 258 0 obj <> stream xœíK“5€ï&?ÂÇñÁB­n½®P Ïlq¡8l²¤²»$•OklÏ´vl¯×Ön¼c(ŠF}­î–F~?Õ ¦:ý³üÿË«IûÇ)L¿ïRo'ï'°üƒ^›~u6ùòWãô4ªèŒ£éÙë ,ðfꔵnzv5ù½ùz¦•шÑ7?ÍæZm1Íœ 1PtÍY_âi*a0 Pzìy*`½ ÁüqöÝ„éÀ ŸwméHnÕú@˪œ&»¬ÊêÚÒ`í°D[Dz1$„ÔØÓ³É/RÚNÿ›x£y¤Þ+Ó«‰%­•Ž]Îåä9 ðþ÷b³øŒ]'>ÐQKS¹¥2tÜ'Bô•ú„h¹©ÆlÊžSÁ5?÷òüÀ¹J;ò¾ù»îÝln‚²}ó*•%§½v²ð¿m¶5`bófÑ Ym²âÿ¤´÷ÄÒîu§©´A‘k…˜Ë‚GjYÚ>„µÉøðIŠüÊ>svLúâÉÅàí5€S<¡ •<Íbc»¤˜N·á´‘óFAÀÅìñ³y4¤,7ýCˆw‰˜³Î˲:OÙ.8°¾ù(Ò—íÖè –5m^·pWMógJB.bóB<ùF<Ù¢gTZ »Ì^>#t ˆfE«¹/[øtŒ¬e•WmVuUsÑ·ôj–¨Eëžt®­MŠƒ0—oû­ŽYÔ)iƒ¦;¼Äµz 8‘ùwŽ_˜1«7Ù*1@¿R~‰ÛŸƒ6¨ y6  ¢çÙô±_3šk‘~)4ØR˵#t©P•òѥ³NcQ…g£òóÞ¢ðî’¬ÊqÊÑsEá6¬L‡Õo³€ÊDYÙthsAÂ#J¼ð\Š"aE¬ £¬LU¦î™)t !lƒ ;¨„t9à‡¢·rÁIi. 4d ž—§DR¶ÊI8¯øQÍ…6²š‹>¹`ÓF*‹c0¼,çò©´UÚó–Ù¦çiÑvÓ-ÆõÙÐ{Ë­GÕ!_˜¤qø—ÀŒ½㕵›è»päP+8'N(˜äÆîÎøÂLR§ŠÓÂL6¦HÍbò„ãŒ2m*~-òeõZ]Ð|Zˆn‰=µ>XìI ]„žbñГõÜ é^ïöÐÓãõ‘³aîn\TëãÔe,î$[çxÂûmT™ÃdÉ•DïZäAµ<âO‹:²< ß9V7äVy«¼íhí³«ª¸Œ·7•››œ µ.TãÇôàèòàQ.ýÕÝÁ›œÉ¢âTqº››l¸©•ËßO>°lÿí uuåàmA–…¾f}3™üÒU7“ÿù½hùNLïF›òn´IA¬ÞþhÝh9ÌÝjœ‚:5ÅÝhŠl^ ÛFUa7ZøÈòtÕÛúd° æ ô˜êµÉí^vÛ½—ݶRcÈ™.—k%¯’7ð (w“2òFêPgC­KVç0ph5aó,÷vX·ûTr”»¯Fu¹ªPíµ\aL¿r³ër5’ã Ù¨+C•¡Ãâ ˆdh|&ŸK%küd•?«hÀªÍdöyL†•²Ó¤lÓŽ#Ä4IÂ`ÇDZ¯±?úá¬SyT‹;î6»r]Î>G?\T:ÞÕú¾ÞÇfÖ,ö˜¶øf²5¸=¼RD_fƒ¾ÅH©îö‰©Úr\;ƼNÃŽŒâËÂlÈ•°JØÁ„m4f(( -CÇoˈ"âÀÔ;QáòÞ&9»Aþæª0k'±˜rüßÿBŸpendstream endobj 259 0 obj 2048 endobj 309 0 obj <> stream xœíKsÜ6 Çï;ù{ÔÌÀǵ&ÓvúŒÛK§‡&i҇ݤï™~úB¯ÀÈŽå·q´œLbFæŠÄñ'HiÛZ[Ûþ~>½ÜtÿÝÂö“}é—Íoþc‡jÛ÷Ï7ï}å¼Ý&“¼ó´=¾áÁm‚aöÛóËÍ·Í;kœEL¡ù|wfM´ìk>“Ã"%ßœ5>lk8ŒÓ Ô~ìq[Çè¾;ÿxC†l”†ÏŸíÛ²‰üU[" §ò–x8GÚ·eyZ£;ÇÐBÛØ‡ç›/7d,oÿÙgÅÒL€íå†ÉZcÓþÈÅæ±8ð‘ü}q³ûÜà>Ÿ¤‘{÷\1"Sû3di‡ ù´»öà`óRƒŽ©yÖöчæ/U¾hË!±³¡ùAªG¯qó¼=Là’k¾o‹£OØåc„æÏ®í`h¨a£óW5ä^SóGw¥‰-àþNÜ©¯^ïlvÑ0aîqîl°Ébc»"GKªÕÛn+_×Rô&¡´à£3@^Ý[DÀÐ7Š(õ¾EôHRáŒFhî"˜Rêol€8y,w÷¼ Ö÷.Œø©?KçìïOߌþhçÞØÛCÝ{­ÑÀɇ¹Ñb -!ÆÅÅôÿ)%ßò5Ì,†âÅÞx^pðÆº¡»ËÈ“zƺb1ÆB;”ñLÆÜÈØ7»ˆÆ%›d8ÜW•aŒõBF’ªñD‘t¡ªü €#‰GG!L›\ «„-&ìFqBQ„ÇD›øû©Mt£ú4ƒäÆÔ|Ô!ëDýA¯½ÉGGÑÊyJf@y™^$Yœ þ6™ñÚä:Ö!PP^d82ÒÇg¦D†š_L`¢X«ñ¶,Œ…ÔˆHÖ»¨kè°á5©æ‚ü‚†¡w SA«' ãá¢lŠðO!÷U%¯’wy`åò˜¶\«2òÚî<%¯ãÀ¨èÃó$ I¨‹½`IŽmÌ–æãG…Ð@‹ÖÑd+¾ i«+C•¡e I{D´!72ôظUjQ¥›^ 4"‚=挩ÊnNì¼ dŸû_4d’³BÊÝRÉZ?Y®¸.”P`(¹™º èB÷UÀ](„þRñRªX‰WÎæéã·OáŽÖ2wÕ°Vá[Ö8xó£®Cj£+A• ey’^›"´:a˜¹¥’UɺӚ “3ÞÓdÑ$ÜÿE“ËîŒÑŠ@ű¶>‰ª¡Û|±Û3Ûïé@±îk*™sÕ¢ _Talƒ©´ë]TÉLž/.ªú8…1ËOž!šÀ0“°‹*Z¦ë™1Ž-j:uEꋱØÃɉŽ"õµ*m•¶eZßz âS­?¥mM )™Õ•¡ÊÐ"†(‘‰2´ºùræ–JÖúÉ¢’óe 2RËìãõùr¼ŸóeõTƒnÿÁõÓèé$¹;áøàÃ1&É™GÕ$™‹O’e|‘(;•ðq½“äÌäùŠ¢JŽS¹˜äØF©ºÎ$¬Ä$y|öHñ¨Ô³âc-û`¨ Úø X¬ `{MÁXŽM?lMóâÌêÊÐI1äË3䨀õ Zß¼X»¥’µ~²Byù(s]š)ÿJl0Ô|èx¤w ¾å…‘Ì)5xUÄ–/ Î ^+ÙG˜Y]:)†bq†0¦V®-dhu0sK%k¥dó©² ÑƒÎOFÒý\9ü,oÞ`˜¤éÚɱ6fN÷ÇÜ`ˆÌýôÅ5é¶µ“wùåP™ÑóeGÕ%§0z–ßbˆ„2$áLÆVñr¨ÌäJX%ìÈ„‰æ ?Ýp=a%Tw~3ʾÊ!{{˯m^Í ´ã*{•½fÝÌôÍ(SòÖ”·R6רuRü´éðÍüXé¾4]ú¿AëËZi·T²ÖOÖAnÊZ¹ÈÆã0ÿpcÚÆ®-k¥/Q¿aTW×—>¼Õ\ =”Ú7&®2¿«ÄU(ž¸rNÝá^òÛ5'®2£ç+*MNa-¿ïÃy0³[EÞJ[\ùª|i¾Ê-Xïù"éuœfV"mõ°…01dÞD›m·o¾¿úï°Ë„±hÈØü¬reã–¬›ÂlI¬ ô¹£+Šï<Š©ø,Üaž2Û®>EqMy¬ÌêÎ*CËr,?y!C«Ëden©d­”¬qöu„¯—juLL4S(R¡¨¾ô0 YZœò—ýªª«ÕËþ{nØjmxŒ@¦TYÅmY ³`¹¹ŒV"µÕ•¡ÊÐ"† Ê/ÓB„V§µW*W•«»KAQÚ˜›3äRðn9Ãcdå3›çG¦ºN±òßT^Ú³s¼ù—Y]:)†Ê©0p³s70´>ý§ÝRɪd Éðss¾€üZj@JÁA–çû¥/;÷ÚBñËpH‚jóÏØ¢®Ð_yç4¿zQù•ª=Ü?t9ÕG³ò°Às<{Küu*6ŠÄ<–Šuì„}Èo\eôþ0Zþ™@éá0;èW¢ µÕ··çÖÅPùç"¢¹zþ`„Ö' •W*W•«ô£õÂÃÜb( u¡KÐü«HÑ2ìÕD©½•|ãÇ´‡j;)ÞÊ¿Ú7‘Aò³WÂÂ:´`fueè„']Ãö E¹Ävö3éã—©Î÷BþýB)9Oendstream endobj 310 0 obj 2045 endobj 360 0 obj <> stream xœí[“Ü´Çß§øóèyX¡–Z—~…ŠsŠs- x!µl8‡:_ÿ´l¯ÝŠÆYÏØ“l<ªT­Ö֥ǿîþ˲ç½V°×éOÿÿÏ÷»öÇ=ìÿ>”îvì ÿA÷‡í?¹Ý}üµñzOмñ¸¿ýuý ÁìƒåœßßÞï¾o>=he´µšn´ŠÚycšp5PDòÍíxÄgéƒ`cy¦Ó¾I¸àb4?Üþm‡ uäŽoŸ }iBÿЗ û¦¼F×7å"}ip®<¢m£ïÌ¢…ÔÙg·»ïPi·ÿß.Í3 AØßïj­4 5¿ï¾a~ÁŸO›Ï¸cæM*:Ü{âž(v64<&´6 5z,ª4ÚGîØ÷ÝžøyB PÌÐ*r„ëF¯à”1å‘èUcÚfi ëÇ4•±vnL‹ÇcŒ1í«TMÆé˜Ç•>ÔÄìý&âÐ+N'ýÍ3Q}©lÃ…|Ö•¡ÊÐ2†Ð+ÃêuCÛS\Ò,•¬í“Ï! &–‚¼AÅ`¨ƒ‚)ÔX§•æxц)’ÇëRBã ëì8Ô¼=¡™ Í$-”O]P=%|^¼c‡Ð-(d£¬¸_î°ú‚‚ žÓäb=¡¤½¿¡´‰599éJP%hAùª¥…mnI.3K%kûdáúdq^æMXHÖuo‚ÈlX)«”•‚µòaî²%– ¾—NùÏÖ;ïÔ@CLؤø'Û¬Y£Xö&ä §©Eî?©Äh¸Æ5ç¨Dαkb´×IÚ•OÐÊQk9X4(Š*B>¦#ÊÕ‚ ˜n'ôþ*ÂâöB91Ä=`>Ìêv®Òí Á0[yâF”§œõ#YqM·Å[Ÿ!î#ør7Èi mOzJ³T²*Yg¥1åUËÀºrå)LX«ŒÂɨˆ4SxºÃ;¹Ó˜í@ÝsQsÉC™œÆ)K<)˧›n§×ø¡æuœrèrK=½“F{e äìvKô¯ÿ„F­"Í^ÜuÛÐÙ¬«WýWš¸˜¦ö,£‹Š¢)ö,›§¿g¹8Krär\÷m§Qs°—ÊMÆw]¸‹8l,æœÂLù|ìgÜz|‰íÆÙçÇíÆqõíÆÈ~O(Ò's4}Û?Ü­Ù”ç{Ïê^¯Á½žõHÈÛ K²Á—å8ab³ñ*Eæ-¢G™«t¢Ä!M5~×®)B¶Ô3òçcñ2O?¬d¶­ôUúJÀ0”¡¤¯_ÅÞ†@³®¬2´Œ!HIù™ÓÚÜ ¢Ì,•¬í“uÖƒhSÒÛFJÒÛnBzKýZÔ÷OòFÎ#ÇûqmŰ#èb*ŸèõãÁ–M#‹rXçˆùÔÈ%Ä|öIÓ(æõêbÞö¯±”v»b>›òüL§¦B›uØ£—¾ÀsÖ;eMœIØ{ó²•×¢~bßëom¥½;(ÅŒß]cÀ²[›^ØëöA»Xg• ¥v)Ý’þÏf]ƒ^ehC M¹Éú4†6§ÿ3³T²¶OÖYOýNê å õOSýßÒî³ô¬Uû)«‰ÈgC‘”‚›¨ÜÙKÆÖÜ£i…Ü6ëËmÍK1€–ÛrÊó‹šy\ƒ4«ËmC.=Á9“°5äö]ûT©eåÛòdæ>[ß¶Ý\Hßöy~fŸJ[¥mQžo8*yëŠ<¿¤mKZ9›ue¨2´Œ¡œ—¯§?¡ÍiåÌ,•¬í“e×ÔÊY}8*Ô²{šjyBÿÊ·X[)ùÅ|ŠâuÈíúdR¾}"Œ…jÎy÷6q”e5—ÙõËvx†¼†î+å¼ ñ=ëWHt\]¢§û@Q—ÂmW¢gSžŸÏÔ„çÜòYo`™tËàT¤òé!¿Y·|l™“g÷ž6eönÔ­ïFµåBù”ß°•S®n´ºQéF×Pûå3 [c¥sbíRÀ)îï ù*R§§±J‘[}•¼JÞ̈|áy?lIÞ–V=³Y×èUZÆ3Ê]v§1´¹UÏÌ,•¬í“µêË9=«åò ¡ðÁÊënóÏù”DïOagPØau… éM}Tæÿá1…ý!í_6éùIHÍR®Á—®÷µÇcÆ(cËýzÇÛÄ×þeS®„UÂ.Lp:ýLÂÖøÚ¿ÇW±dø[¼§ï‚ï´Ö±¤ +{eoý·tðåà ·à%z[ú>9é½*A‹â(fC¹uï4‚6·ˆ%­R¹º6®LúŒ÷76­Ü¤·f>ãë`¼(®¸çüïÿo&&endstream endobj 361 0 obj 2250 endobj 410 0 obj <> stream xœíßsÜ4Çßþ÷è{ˆ´ZIû ´ 0ül††Ú´¡C’þ†òß³²ó*¾kœX ©OÓi«ht’v­Ïê»¶uy»ÖʬuúÓÿÿü|Õþ¸6ëo¶¥?VoW¦ÿA÷ÍÖŸ¯>ýÉz½&EÞz·>~¹2ý‚]0 ѯÏW¿4Ÿo´²€BóýæH«¨Ñ[Û|ÇÕ†¢#ß-§Öˆã.}ìij€c´¿½rÆ(§#||²K“ó—cAˆ®ïÊk‡}WÝv,mÇ-Ú>úÁÀIƒ=>^ý¸rJãúŸU°š- A³>_¡ÓZiÚÖœ­ž²¿ä¿§ûÝgÍ÷yâA(vî³<‡èš¸9äqœi¾mç<h^sµQ#5'©ÚGo04‹òY*B«Có‚›Gd¯aó2U;cÉ6¿¥¢‰Ñ4ÏÄ'_‰O¾¦¢vW¿á¾­²Ñ[F+vµi.öôwÞÏ×ÈdßýuºõÿVèn£µ*ÊýlÚQ5iht[Ĩ]_Lµb×]WÜ5hôŠ€óÑ*㼸¸_ܶuÎðàxVGhA!»èÉ&E¨»²oûòóÖŸ^훿ÚrgÏ«®?äÕÙ]¬nùÑ?ÛËÐg†ÞÄÓ;6H*XÈfóq 1Î.Òý‘Šÿó&Cñbg<ÎèÁÏËÒu¸‡ê»Z,†[Hq'âfÜ~ÞDP–4qlÚ6}·92J{B•hñL@u&š¼lö°9Þ›î6ir…­ÂV¶½šÅEÖ##ÉBS²¼ÙÓ\ÚwOd¨ÛMM`¥â²I¶$;‚ÄIßç@0YÙèhïFÙˆ«±[ؘò¼G‘–®6q¤•&×H[#ížHkÊËë/÷‰° Y#²ñ³WŽÊT •¹ÒßÜ$‘ã^ÚÑeþ!óÙ»ìæœ?ª¹ÕVvs:ÌKp]”eŠÜëV(+”7XBšgŠníM%ƒ2-â1”í’·ÃÚ–Õ¼3ò¶Çbì$YÔ1ßÖ$\¿ ¸XVÙ YmŒ™+¾ rRO!·ºîq§b8ñÐι™8Ù§†›ËB^Š;b¼ÇÙ¨ÐCŽ›hÜ“gÙÎËí‹9´÷":‰{MÚ^º¥BvPÙ’);^ë–º…Cjª~Î~!Ê"×~H2ïîÎÁ¡xŽÞó¦Ä%íÒ½Ü<3yºü¨úäÀB'ÏÁYg+s"l¥sð Q–Éó䤺-ÞYRÝi•ÌE¸ ܬ„UÞ» ¸´ˆÇÀ-)¿Î¬®ûWÅ©N‚´‰ÓâòëÌ-²ƒ‚ ‹æ×:¦Õ2ʯÍÃ̯ߵ¸ù|wOv(§õlØPBýߎÞèÜåcrƒ@²ù”\6éGäMT&ãýd ÷8dñw’£Ë+´;G÷ÅstG^E§ fÉ/fFO1UåXöųtÏØMÄm/f&WØ*l%aÛ§vœçlÕÄŽ}˜bGÊÙüÑî |‚4Î]¨éÑÝâ$”'ÈáMÇQ´´×‰“8ZJ“k´¬ÑrO´ å¥ Ò8ÎvÃV⾤àÑèa‚'r${¼‡‡U ‰™[*z½þ°NÉ{ŸÎ¥ G÷>Çè-éQBfuÅ©âT 'ƒÊ8˜‰Óâ%dn©dT^.jH·Å'ÊE( Å3HµøI·a'¡[ÛLŒ—:Oxºës®A®ÙV¤¯D¸q†† \n·ÜC%É"§<5ArÛ8‚Ù)‡ºœdE½¢>k?2ÊNÞNaêT} A¦ Ót˜)âLš'N3·TÈ*d³Ä)ø ÀN½—é ˆÓ¯ÚÖ¨L~Ï9éÀA±úÄ(¦™#c«Çtfc[sÉêQEorwÁ/Ò-"åñJÆ¥}o™ˆ8híôzPÒšâm’í´ÃÇâ«vÔt1h»Ñ§|ÑO¾©ë"›¥Õ×ìãuK_N;É*†“Å"w&NËÓÍÒ-² Ù<Ý †×íÔ›ºøt3°«Ø(¡›ûš9ºYºc®n&x©›gLðR7Ë Þ·n¶6øÜõ´ŸézîBù®‹Á29ï‹ ‹^õù¬ïAâû4…|^5.1n‡!5Y¾ãBäû`sï¥b(i^ÉnòMï=0-O¼K·TÈ ²[}CÙ¾ã–õ ™wGàažwx?ÒìOc¢6ù‰ÎÛ|yÒ]}ȼ+Î>˜áìƒ-~öÁP>ØQ*;S±Eœ}ÈLž.?ª>9°Ðy«ïû0lިɬ•8úð¾£ÍÚœªLéßæ»“²{#åÒéŸÊ]å®T^`G~¤Q^0oI2«+N§b8APQ‡™8-.ÍÎÜR!;(Èò/*3Ʀ˽>2‘Múpé÷4âv=‹ÕwÊÿþ«ª\bendstream endobj 411 0 obj 1848 endobj 449 0 obj <> stream xœí\Y“äÄ~oáÿ~TÛ´¨¬»x2Æ p,†ypØ{°‡wfvYÖþ½¿:$euKÓs´äéÀ±Á¢U—*ªüò˪’~X‹–Ö"þ)ÿr±Jÿ\Óú‹þêÕꇕˆÒlý§³Õ_K+Ö¡ VZ½>{¶¢ò€ö¢µÊ®¢Ö»>»X}Û|µ‘®u¶y´­V$ChžÄ[Fj×¼Ú+Üc??.¿ßl•2­•ºy¶ÙŠV)OÎóÆãmã¼Rªy™›( q¯û&ÿ8û|õàlõ·•n…Yÿgå¤X;é ­/VF ÑŠÐß9_}3m6ù5éVi+¹ÙN®m@çÁg‹i³%’ZÁx%Zï„‚Ê[j…Ö>šÿ(+4Ì·²•VJþóóh…“^Y•ìw¦U"dû×Foýv’Õ}$ó59çÌï;‰öCwiøA--`Å—«³ßÛ|²ñÔ׃"å:ÏiCó—äY<ùæaÝ’ÑÍZ ï¥2JŒ£jÉ4OË“ø¥ù7»>Ïãcàëh$Yá„í$® ÄSÒ‡NÃ?Çæ6(#¢Ž¸&”°Í»t “F—±wi­n>Læ#…7ŸZë(àÙSŒ˜ÈV;9\~.up†7л vcmièAõwGÍÝvm£áÊ«¬ØGÉ}Ö£Meë‹|ÞvyªøU7o“‡-Ü}ØZµS ¸àó4¥¤°e8´©ô3-IB˜”Ö—{ÖÔ]c2Ù`ºÖ?ç9€ib1ù㸛 ýžKvD"Ò¬=†ÈGÃ(„alÞ&ƒ­ ÒCKdOÒÞÇ,äØlåÁšpÕ#ZBóElí…•Êtº Í{©G/³ÕýâC̼ñIMä0C™Ô.d]?Ž=HAÆ>w/#V…¬À':öäK`a}à“ gºk¥™éc¶hWjÔi}ë–yêú„ŽÆIÅ,lþȺy\¤£šoØp~°ÿ$>JšB­ ïïøÏl{´½b|ÞôãóKV:Ά8ÞS6=BNáù±é1=à×µ†Ì¸Ö+Ý Yq)_å“ñ!{ƒD䣯k_<Z\æ *Q9÷C—ì~¦+Z«Œºµðh"þ.‡»Bñ±}="Ü—Ñ¥±²Jž/÷8ɹ|ºíʰàb¡Kí¾rÀæÞÅ9“Çï¿KPqä½ÄL¿z?33Dói²S‘å Zù¾xSq59PMpƒ,Ñ3K˜”zT{!O6qVIêäzŒO«?– –¨Ê×<»'‚¬ –ݽ›#xÍTç;ì. à•å ÀôÄà¢håÒbF¦ dyr}u²BrÙÛܱ12Tlæeî.¶þ("Hð:Ô¼æùÐIÍ#ÒƒŽd¬º1—¶u:çNã÷ŸL´aFîW]Uhm-Q£#VC÷RÁ ãÇ99Ðk¥\·Ï+­°]½J¾Qʶ½ßϺ£n¸98è‘Ì!Œˆ¯„s‹Y/ü€Ù9».£ªºI3†âÆf]Ú…t£Õïe³³k;ãÛW9-ëš†Ž´íÔA£ƒ]Ž@¥¾ f]7mЮ…gûòÓ5¿¿;h`hš±\Pnm€Ù\ó‘©5·ùÕ~õ—îóö¼RÝ—štœÕãUbLÀÆœÜZ–²Èwäç]èér*—µ`NåbyN óæT.vñœÊòe9H¨ƒ’ˆ/…ØÑÞñC ¬- ÙRŒ^Þïx Fef(DÓ†ï£E’‡Ñk¥=bÛå! ƒ¤£fHõÞëZV¿{ÞK2ð˜»çZ¶’\-V2Yr&sDýkk¹‡ëPk0Åì]ÖTŽ,ÇeŸ²Õ¤9û¬JÓü³ù•¦ O¦4%ÕŠ —[‰Ô¶ZÕrH©e˦ËŽ͵ZENƒ\™ZîáœêP½!Vî„q§Hb²±ª“Ÿf;J×ô<”Ðct±‚;<ିs›£4¨v¼’± ”@{'iØJpYG÷õ,ÿò“Õ£ø#ãÊÞp}‘Ýç«Ïc_]ŠvgtŽWЦ6Èt×,EÓñïnP<î´M®p­+r)•·ðn싾5? ^J©´Ax}ÇäNgÓ'¶Í¦K©T#WãùõþQÜnBÅJn¢¨ïRÖìï¸ÿéªE°ŸhÞtPÉ].Tby:˜kÕ²¤ƒJîÍÒÁ-K,~ò›3Èß°ë;oRÄ׳hŠóÑyÁ) Xí›ßm´Ce&ÜÅþ¹1B\‰ÍºµÇz¿èÐÌ;¼94÷÷ 6+áÂJÞ›Ù"Zîýž¹6ç÷!âû =ó#\¯gÌÒC ^2¸ôžÜ‰-xÅt$Ù‡f934s¹ B3Ë¡ÙÏ Í\îL#sšÆh(R.,¡ ]# ˜‰¤\Û7nÃÉEhmê¡U‘›DSùšÀÀÏÇ‹\‰šà$^±@Ú1”‡Žšk.¡ö TË] tÀ*”ÔµXv°»¦:¾¹! ØqóÁÐñÍÅ£±šïÔf¬õéIJ`,óP øV¦é(½šÅ|Ÿ4TW² ËüŸÝ3Dýk¡GÙ÷#ÎOÉ€ ¹Øq³ž1± ’ &•¹™1±KS ãùë 2øæ§´¡a}õJ2ƒóýOª¤¥Cþióãì¿:7R»~¼‰¯Í(ºSâé³—ñýr” åâ•r“U'‡ø‚ñÛo3Ò*’7ø(M‚Ëó ÈaP0q"<Ù½ƒ@§³,%LT|?êçb4]Ôs¹ †=ËNÀ϶)ÓÅ=—»Dàóc´|ɉoTŒ·Dã_˜n)V™|Ø}ˆaÞ¨ÿéŽã6ÛlN-“§Ö„‘šl®ÜVBº’»\HWbyHϵ°^Bº’»ÈJ3iVˆ©cÅÙ?H.·æœ ®c¾~_»aÌg£O/æ æ×ÈæÒ\»-]È3± F<“Ê~¶5§ðLì)œ}FˆGþmö•&!èüóêˆQúyï ücC<岯ÛM….zFØKÊïfÞìûFìK‹{ß7}·åtΑ¤ˆû1=×2}Ó\î‚AÍÅò¨ž«颚˽a§[}\bØŠ¨‚vêõ—××Mï‡>Tµ›Þø>ñô^…~þù×tºð”ÀÁè»Üñõ LêrÀÀ„²÷|çNöLê(ì~†Jú4yb½è} *¶ŸûL½çøû¿½èš¤endstream endobj 450 0 obj 3452 endobj 493 0 obj <> stream xœå\Y“$µ~oáÿ~sµƒºž|±Àâ°1LàcGì9»Þ–óïý¥¤ªJuWíôU¦!¡ÎR¦R©/S©¬úf+…ÚJú§þ}ðb“ÿw«¶Ÿ ­g›o6ªþ¬dÛ?žo>øB{¹M"yííöüñFÕ‚Þ£„s~{þbóÏî«]4B'iº{;)¬1Ê„îÛÝ™ÒÛº§»3)ŒqANqŸº]pÚ§î9#yDmëe¾{Cí¬ ñ_çw7VFá‡çÁøó"ø:¨Ò)u¨Ëiºg;gÑBûùbl‚  ¯m÷¸p*DN\ŒÆ˜~FƒÝ«„dúè|ó÷ÒmØ-¡¡ÔöÅÆY)…LCÏóÍ—³ª¶NM©:z‘LŠ[ŸÀ³¾=èøc™tólnÆÔ+)OÎBZ¹¡©bôÉ”Éùè•« ’Ó2”É9hÆvoÉwùÑ œI ùsÖ΋eÖ*ö‚9.˜õÐ’Q½`îάu"tgS1:©fí_VûˆQ7ý̲ª5›-Ë#|ÐÝköà[Ö®:,-HtΛ:á2Fµ6u,æ¡E’ª#ëÁ:IÖÎíú93!Þ?AŸiöŒÜ/¢vÕ­Ä6l«. Ì&>>:7<›ôM±y‰&çĨ¿% +¬n)˜¢ï3±øLÇAÊâÈøâŸåÕ×a{¦”€½øº£5Ñ0Wß}‰””6hÇ),e°˜,Y¬v¾W¥ÕFûÂX[1“WY¥° 0Ù~ŒakÊíÇø÷â;ÏLí<=EtÁ„²étf%S‚¸rdËx®s|IOÖ´|ßǪ¸y|1î*‚µpãéz+Lð-[Ïx……¦Òε|¿Þ VÑÛRƒpg1 ’.¶ä±Ù˜®†‹ï1tã(öhG&­¥ç‰Y±&Aâo´+…åÀð}Ï» }OŒaæÊÕ1aà®Lœ!h•CFm=gðe$—a/¼¢5šAo¿o‰šö&ìË·{ó´—R z5a¢ñÔO!w0v·§*²/ìA{§ÚÓåç«b"8\âÔq7«O%»Ï;[ErÝ?h±àuM“óqÙáïIž«QmýþHœÝ"\.ql÷z]~eb¿úÙTËêÛ”°cïeR¿«¦-'㈘ÊpèˆôÂŽˆó]Ñq¶‘ñŠ ;"Î÷'航ÇqR™²µŸ‡§,$åÙ†‰a²ãzÂúG_ÄGár½Û·eF¾™ômJÑXM2"a¡cƒãÅ8l>ÇQøaI6¤ ~ðpøQ! 0›÷fòzo@+¢â\¸;xÀá¸ÿ´<è¨/ÞÏŸzßáuE¿££ôÚ¸yø€¿ÊF‰oŠiçý>i«Žªsr2¶Œ¸Œ >çÒ³,ùÑý'·­‘!5X”28ú=+²Ë,?Lø–ÑÐÌ'.D²O`Bò\­(±¶K1û–ßÔ‰Žl¦1ÙHv±Çds2 ìqXK‡˜lÆdÆvEHf\9"/’÷ˆÌØ®¢Î„y5äŒØdf[;6Ýг¸К0'#”Å5‘öçÐs,®‰àNCoêݧY: ¤º¿eסfv: ÕIñÌ,AœÃÄþ:úŽ?ÌT.v…–Æ Ìû‘ÁÎ^âe‰ÎÕß—£pLÇ$JæS9– \>®sJÌ@4ãbÆ^Û‡¬®¹RÊ‹¨s iØ"BÍêÈtS+ˆç…R±]Áöb+O.Â]~iÆïœsÕr’C]°¤EÖ2Ï]”;ɘì»ÅGsó/zõN'¤&2LûY™—åÂÒ›´ŸKÊŠRªû¼žTðv7È&™æ¦}âô’ÐÊíE|'à©€äÐU¹…]绢¯âl¹³ZÊ3÷Ίó= ou»9ï…ŽnöÚ/ÿlã/àÚ­NâÕĵŸ_8ßÁ³M+`aœïOxÊá³±ãÓÓø0›~ðNxoyEV‹ô³ ¿|8¥² ØNv"xXªD§âCÃw=|hئ¦[ñ¡á»>°ÊK¨q¾¦Y²[‘—7„Ù0ÁÄiòÏqEødúäË+x»½åû/êyD—CxͦýìâK'â8/,u]Ùãç»"p¶Šñbwµûo’ð6µ2\Š I‹ ÓM áõÌÎçu‹|ëójm^Åͯ^oõÃkæ ú9ƽsúÏ1’ õ=à0É ­&‰¥ î*p4|×ކíp°þ%€£‘áŠÀanŠ<~`;þVOŽÞ šM8ä_•_þï¡ÄI‚K¸êÖÌôY8ß³³0 pVˆ$úlƒJMÁÕ\­Ö}*‡H&Q)ìPbÌ£ 6.8 KpÌpQg® 98ÙIxA—k¼è’oï¶TkØÅoÊå–Ø—»Šˆ9æºW§.ÑòÅÆÌ‰M•ÔÌeÏt}òômF™§=¹Û ºI´&ÂÆÂï)4|W„ Îv6ü°ÁeX6æª0yécKoËÚ¶$“Š¡îì"í5% ±Ü·cërÏy‹;×¼'yXMoSpMÐЃƒ>æš—£ÊLèÜ¡a…Á„î‡ñ.Ÿ_ÖîÝó–K{ÝÔlò¥îÜ*ØâZY%õU+C'K.­ã,kçN­Ž gÜ!t-\ÙÞð]º8Û9èb¯^-]\†+A×5K:ÿ;F.¼‚½†9XtiƒÞŒylMwcKsîî´‡6v¿ÙÙ@¯­‡¹ržï}–@šKË«B¯hät­€'Xj›­òœ¿cöúáHRð|#cJoÎQÕ\uÅ¿%ð1ÉgÝ Íï¨ t2å£Xµ÷þØ|>6Íq°C[ÖXwUXoËä5‚a¶\;[†7†pÜ–iìà®gR$ a$™Hý€Ë÷Å °ý;F.ÙxIQùÞW„øAùˆ)4ötéÞm=| ë[›b´µ×[šú8“´ÔQpÉR)ÍL¦vp“Q‰>«f¸ÉÔ±9ü©äéÍ!}‡?NUàS]þ0â^[Ön¦Âž'„xÏHR!d·#Ú\}Ïg`½¦0 ™'b‘mØéÍNÕÛí¨Ù}Û¾%7ÚXß’Í{£%3ð{:6_eÉ£–öm›Y2ˆ\q<Õ’ûŽci®h{! “a‹HMú> ƒ±@üÿýóŽ:endstream endobj 494 0 obj 3213 endobj 527 0 obj <> stream xœíZY“Å~Ÿ_1Á =¶]•u;lGØ l aØàü°«c‘ÙCH+ þ½¿:;«§gö˜5…T“ÊÎÎÊÊüò¨þq-F¹ñOùûéÅ*ý\ËõßÛê‡Õ+Y~ˆÂ¶þëñê÷_‘ë0KV¯_¬dyÀÑÚ)9c×Ç«o‡7b$¡TpÃùæHŒJY¥‡PµRR¹áM¤:§•óq­”… Ó͑…¢ ‡G‘ƒ´T~x™EGn¸€ á=‘ *Ïé0œMËç‘[› ý¿Žÿ¶RÖ>(hyü Šý#þc «$ W›#r£qPçY$ç•RÃ[¶.Ê+r6ÊÅjôR/2ÙKhŸ•ÂpÊž|Éž¼šXFF.›ÕR×Í iL}2 ßÞm’’wk©ìÕ+\Üì£ãÕ?WzfýnåHàXœ\_¬Œå|õõî3–~-õ¨´¥ÙÛáÁç3&¨/É`ÃÙªR*i}´ª¢ÈE°*¨VŒÚ–ɦZÚ ²MáÙ¦ÎkC[–ÑÚG›¶_æó.¾ÜäáWÙ¦Eà“tÆj¯²Q•×V¨ú¬·*5Û(c Ó™ì*­uÎD»›È1#£M°C°ú|uü»d ¼ÈHg|UÆYéY,ä‡ÇXN˜*ÂÀ¯‡Ë¼5hx—p †ë¢uÐMë$쪼„´çO¦@Òû2Í í…’9L â\›“áÒ »ñäk$7ä8ÇûÝ&ÿ „G3¶kÒvÛÞ…í­Y‰€•+›©PnŒ•É/X¬€FL‹•E¡æ!ßl‚ƒ¢çÑ…5$ûáurUµu3pžÓÉÎËsæñKNR`"è€SY¯ÜH.ïÐÙD·ã¸¬“‰ùb¢xFº—#IcGí4„fŠ)¿ˆ©E9'L¶L€Èç~4yWÛ,i§òL»F¹¿vJ;*uÚ}’¼<˜`‹ é³ý@ËÓä Â;'óñ"C¯óñº€ƒTÃ++ ¤“ØÀy¦h4vîü8"ÍvÜ(lÇõdt£µìd ¡;YSˆã'[dï·Yæ ÁQW”ÿe¢~%©cø*/C`¨$QxŽël± ëÒÙZXÝõ:–®@õŤè㨨ÔÂéáËÈà…%e¶1£m‡"7í~ÌàêýB˜ñír ~8Þg{¢mç,¸O®C~YØõ¢mŽ Š;lscÓ21`gTs Œ.!áDÔ×E»U;¥ÚZEÙ«——ßÜooÁk®^–ðåD}1-¿^4ÑÉ¢„g‹ LÆðé¢ê'‹¼Ë{›‚TK”­³L’l¼¸ÜFà\&KÛ!°2Á¯2¡Ç^ ̨‰co‘¹$Úhfàr!"$PFhPL£d.$Ê ÎåA±×qyBFÑeGS°¿Êcã}7²xÊ ˜2 ºfy«©FSþÊw;@Ë>ú~ ù1tÖÐÈf¡·FºfÙ9}Ü¿ô}¸h'“;ŸÞµ“„mnVš{5÷aB­=sãB¸-ÏÝ{NNÄíï9Uë9?NÚB×:òî²´Žÿ¥AC· –­9 úp#ç,DBw"ÏØ$ƒu©‹M¿CTigJÖÁÙÓá^MƒÄS N>†È¿“\´¹ä»î š€£]OCVI 7†°ÖÚžBðXÛ)Œ" ]^«á¾•)R´Ñ£r÷ çâöpn©ìÊÇö‚íâ¤Ûg²¡NãH•Ybœ¨ 2¢Nñ™*ëµöZSãµJÙÊ#{²ÌGƒêAß¿ ŠéýS‡š/¢ZŒò1Õp \%$´K$µÖpZeIE&ƒ¢õ^h'¡¹Äa dAì4µÄŸ~\qšAÎ[ákW¯BÁŸÒÕ S¸ƒ,ᣠü»›€ð7Mšþ/…§ @²ÆÂE üÎK[ÛCJ3€¤EršŸšxÂyÂ\tdÓC>ùžå8„F¥ßéæŽe£œ÷»†¥J{Ë‚i X)|\J­–4l\ .–2.…O®4e2ä=gu¦gûZ—J(oÃÒ¸4óÃà]þDáUþ7©§#_Y0¥±å2Ç]Æõ¤•Ï%Þ6ÄéÔVqMq½øv´pðSÙ™ô\û r$ï_‰ ÕEÎ@8%bîškxÎèòzƒã†Éå½U1qö׬ü§¾ Ý*jàÚûv{µ§û™WùËoc@¡]]b³ ëXØë1û$i/…M?ï‘ëš—C ª—lFÐ%÷Ïâµ›ýt§–’Ãe¾‹w>ß³´²[ÈŒ%VÒ1Ê¢lM3ÑHì@lÍ«…)1õKê./ù ùü’§`ž‹²J§^õ–ʶ)gÒVÎ}ÉV[Q§ùÌ>Ñl@õî5YžmÏ%(>);¦[›'ߎóÀ ïdžtáùŒí†m’¿i"G§•Àæ¿å*Žu†ÿdEg®UfÅÚ966î6¸ÃYʶL¼ND3¢5LãåB­•ª¤Rë8Ô– µNbÙ®˜¾bÛS1-½_ ÞŸŽƒßK?øûÙQ슨Ê> stream xœÍ[K“$7¾÷¯èc ÁR*õâvƒcÏÍpØñÚ³ëÝÙYïÃvðëùRRU¥º«{e‚ª5Y©/ß™*í{3Ú½‘ÿ´ÿÿövW~îíþ/óÓ«Ý;Û~˜F¶ÿÃÕîw_Q0û<æ@÷Wßïl{!Ò>:;zöW·»o†?^˜‘Œs9¯/.Íè\p<<Ã*;g]ÞËjŒìb’gçühl>»¸´£q”íð©P[—†—•…‡[ð0)šøEÎÃÍòøP³Ïœþuõç qLÙåÕsû«ü1Sp–†»‹KŠ£€ó\–}Lιá£znàÅ |ñ4&k‡ïër²@_AXÊy¸Vo¾ToÞ-$£Zn²åIXc½ŸÞ,Ì¥-\ª´š¬ÁEØO¯vÿØñhüþç]$³Ä8F»¿Ýy6à”ç•×»¯w *aæ0&/²Z— ‘PP8/ŠÜ„üéZ©@1ŸJ]pÈUx´Ä,îí“Tñ\øûx0(xOAÜvÒ‘ÜÝ ¶gÒb*Ã6ô$×ËÎz·»Qý8z•RšœÅ>ÇÉY)ÅÄÅ@^¿-JÆH¤ß,û~§øŒŠ¾n‹ì[ä¯0Ü(þJѵ@JÅe?|]|jÚM! ß.ÄJûÝþoæ÷f§3ûÏðß›ÇzŠKÒ£¸Þ]¬#kݸ µßÃÛÞ{³% À~ïZÁ½Mq¥‚Ç€Ä T‚zƒX±|Qy§‰¬¥‘BGå⻣:YêmXà Ò† ‹Š©Xkû+‰+id’ãÔ-¨3RîÒbZ”1G ¢EÕ‹A1IÏ©¨Ðûc‹Mb`Ìp6÷bT—¬ ›þ39Ãaø-z|FW¥*/nð|‘µ=—'.åʼnKa9qÑ·ÐG¡õ|±ð(Ña)À'4 ¯JRvÝÝðIñ Fÿš; M»Õ [Ÿ°”?LXÊ K8†x+HBäOšdE' žð ƽ˜Š~îwŠû› Bå0\Ú D,‚£«7ú°²ig”nSïj¦ji¦š‘öZùwSAˆ,=¦¸8l eEÕàãÅ{‹–útJA2(ªC×Ýö«Øµ[fÔªÅg{!±l{l½úêóu’wÁ98¢¨E—ÎbhF³x‰p;ªá>U£YçY¿÷£œâù“ì`³ìV§Z%´³ õ èæEÍÒ1ÐZîTId5HÊN|¯€…¼¹ÏvëÊÐG[˜ü¤‚ý~4SÃ: "a*½•ÞS³×صwÊjêݹ~ I‹ë÷>'É•ÁEOÒ*N+O¨ `BZ˜JË[+óc´G­åÝÕtSü¯—pi9®Æ N%Í6ÁŸ¨+óaS)D‡õ«’,rÃÒU Í³Szä~–¶è,F²®×£öF-~óC—`œÛË5ë$Ñ´Ö¬ì%íL.æ§ñÔ¢£†g¯W®¯ŠºQp92’ÎçòlBFùë©`Î@r hæ´Y–ïßõD'p¢á¸/=¯Ç*Â2§|Ò‡¯—¬ð”¼­E 5§¸këŸÊW?] EÒ÷h¹u¥Õ\îG޹{á™X6Æ“ýÃ= ÑO“ÞRß4ÖÌxºKùRžëäÒ9ÍõH,c{«Èƒ øóQ.aÿ¸˜ “£iïìšv·I†àFªžþd Ä ytø8”wÌ«=úäÜÿ¤¶úO Ò«÷è߬N·?KZDꊋÚÙÀ)Œv ¶åt°ƒ„50ïˆ`-ÞTt¤…àJ¿oÜ©ÐÅ{ƒ®9Œ²< ‡_±ƒî²pݘM:¨9zÑJW êÇ¥ÛkyZOH)¾³K ò1°—.¢úÅNÉ @6 —äë¿ÝbÕÑèPöÆÈ\ÜÁÂZ-wTìt}x°(ßâÿ‹–ñ®ËRž-šƒM—/„ñ@ág;”2 ù<˜t³ˆ!ɼï¸<’TÝ> ìhSÊ ´zyƒƒä€ø‘ö £ƒT)i×a8¢y¥5õµÑWTŒœê:ªG7õŒ´0EÓÜ;ÈщÅÛ9‹*RrDNã#T§x …´_’á*i¿dVÜ …Ü…¨,)Ù±£–½ <¯‡e½7ZáB”ühx/%zð­9`³MèêɃUF“"Åj‘B2TH½¬9Ör2S‘d¨´ETp€ìºØ¾Û˜Ê ¸À"Ô=."‚¡RG…§7¡jdUC•.N·ÝÿV K'/=-cÙ"žd‘.ˆÈG> "ò˜E¢Nˆ½zz»A<„oH¼É8ÍWçY('öг°–<+¡åÜæYØØzÖ©ÏjTZ:Vƒ¹#kqR~mï1Îx¹ìª‰ÿ”·@ LÅy‹Þɰà5.’a{𒎳¹<*_Ú· —kj&žVüǹh\×SÊlïý€z4­ÎJíÒ-;ê¢J} Vm½±Zh å>*õÃ¥áê©mü¦° Ì#'jÓ‰C̃+®åΡð¸D“C^ZN1i¹£Z®¥ÄÌ>ûÁ­/Ôf¥|…áK¹Ñ8»œõ­Xuçõ­3ËÖwem 'ѵÌ÷f;§©îÊÖN‡³dŽŒBPowÉCû]o€=„"¢p0rCRnO+‘I†›óVJëEX¾y0åaV­ô·r›|Êí¢…g²õíó:ù PoË•{\Kd”Nò á¼òt„o²9@ø‰Ú¾)ÜàQºv)-F.t«Á99´{Sü­Èu¼vÖ„×`ÃŽ¤†•·Ä©”ÛÙ/Ãrµ +9ç%çdÑ€tÊ¢õwgQ–2@Ú¢ÂÙÑ=·þÖ-Š^#c fìæCTWÿÐp¡“zSd3zEJmÉék«ÕÉÆÖäB?vRœ‹rU¡;,ã€z“Ë— ™¶y¾‘[hßÉß­'*ÁÕ¶¸Ò,­„&}¶\/Ô¾wË!N46Ì<ŠÕyê»…â¥z±zt½ž§˜ÜT&.fšSžGõêùý ¹Þé@Áu€H!W¯YÎ.$yÎ_Y¾®V Žl5gïZy©›7s1Ÿòfaòˆ„ëQ0Ë„Ð{]¶ÊË£V¢›—Ÿx¥pL.髃j3iï8çìB»à”ŽäTA‡i{ïIh ÓòÏCÆG´”uÓ’º©£É×ïøk`–íP':•!óË'¦%—µ…NK6ñA2k¼·$3ìþ_“ÙÝjûaaД畿XÊÓ±5fÚ§Ó´aàí½vld> stream xœ½ZKs¹ ¾Ï¯èSÒJ2\àÓ§ll­SûH*ÒTrØÊA¶,Y«Çx×RRûï>º6Dz·*e—MÁ À|D³ýó …düUþ~{¿I?jøn^Ýn~Þ¨òƒ,jÃ_v›¯ÎÀÊ!ˆ`ÁêawµQeƒƒÁ¡ÆØaw¿ùq|y"HÄàÆ»“­ˆõxAR¨Ð£Ô9ÎÇ5¢R…ñõÉV ‰Ôx5@+ôãM6a¸ñžlHï$Löœãõ²|µµ Úÿ{÷í Tž¼Ü]’c?Ä `QÁ¸?Ù‚Æ‘;—QlœGÄñ‰­‹óÎF»´^©ñ*‹½"ï³ Bß°7lç~QL\‚ÕJOÁJeÌ´3o£MVr´J¬ÖXéb°§»Í?6ZH3üwc­ðq¡ ÃpOK’Yp·9ÿ\˜É‚pÊÖX³èxºXJg×H*çÈHôGKŠ.Ì’£„J ÔêÎ 8øì RJznFZ)TÖG¤¢[$µèy™×ÊÌ8;#¨L3ÎÎkŠÒÑÒÚGœç7y£sÞŧ6xªõŒs1ø:eÂXí1^[‰Ó^o1 À ±†?éš™LX+k3sBÊœ’“€”Q‚ „7ùÇ/H'í„]SÖs9gÒH—ðýêÌh3(%‚1*ÚÜªÉØV{J&¨Ü€g¹5UFލ¬/Øú²¬¥MDaR½ŽLú>¯ õF´bb,“8©¼c*L~Yoå¿”Ñó¯jñ¬¾gòûòTƒÑºQF(é2ÔEû4‹e0Óó“x›×(µÏ™üf1ø5?0õëZûUrôª .í|låiý–­™þžÉY"ÐD™aØ}¿ÙýáÇÉÑÚ[?²5ÇdßIìG&ƒ¡*¦ÆùkÎ&hsÒȯ‹IíÆ¿314ÁLyø¥“·‡Öù¤ 3ò»¥BNÛ̦ÏÛ¥¾ë”“_¶Î4ðPƒhˆß¬¶T5A—Î|ùŒl¯Ôѱæ9(£©M¿a*OëNVAñö¹ïg{µ’ùÞ»Œˆ¤cଓ§•ü5.pØxqR*U,L#ÇÑžl¼LÝ|Þ‰‰W%/„^7?µ{yþ¦À“Ã4yÝÔäÁ 5ÎkÖÈ:RQ¿,ˆà¦é‹[nTžŽªÊykÝtßÑß–§§27õùk÷§ }XAãoLã¢Ítc‘“¯Î æðÝÂßwTÞ´&i¹Ò<®Ÿt~­Ù ¤'s:oÎúûÔºJÆ·lÍ;ìMŸ+fù5óû?îü‰Ò(¥QÇ p¶5Ô!ÇH_±§pžÝ2¹frÉä²–OÇËY' m2šSüŽy»’`V¤ìŒÏþ}[MQÞ1ù‹ã(6{9Š¢#ÿŒ3ê(…ÿ¹S¹+-Ë+½±):>Ü0…ôêåiXÍãMdŠ?.‡ö·X'v¤Áþ_Ïh>¿ñ±ˆ·ìŸ–bâ£Â9‹Ÿ]ßÔÅAÞû0ÇŽ=£™˜³Û¿yb&WÁu'¯«–´òâÁ ¯ò,6v–ý}ëýr°Å¹+*åg_3µåÙkå€Nê·­™ek:*®:Õ»¯Ã^{ÐûÚ¯ÉuÞ3oÙºí|Š~¨O„<œ¹îéÏû\Ì,w ô~K@š¼ÖÒ«¦ö …W³äØÛæÁ›áô¶I&„6:š ióÛækæÉiÇÃs(«ŒÙ[Š6Ð+óÖ(o.~‹·dBXz­®¼½ìxØN Ù[Áä¢_èƒw*ÕäÂËcø×Loe*^#±Uº¨õ§9凎úÛ“Ü­·ñt÷8êiá(J‚ÔAzájÅ´ù0ð‚¥›Ÿê¶£Ã÷ª%ü—RÞMþêêÙ`Vá3ƒ«,72ìöDñÒ„JA€ö>×@r ©Ÿ®˜œU)ètïåÇž*È©2š eõZÙÇuÊ­†ù:,©ä+Æ|å“Xˆ2‹~¹‚ ä)½Jbp TºÖ“FŠE[í¹:Ü€4Å‘K¤4K‚ÓBêO_hµM«Lœ– ¥æÅ›6 òà¡JÀt`xÔËe›vHÿÎ<œ%_î!j"Ayàá«NÒ©É#”6¸5H“ú‡|-§U9Wh[°ºRÙ—*¢º¢&ŠêN›Ñ ŽfqÎç„©G–cZ¦6Ps"Ç4Ú¶ù’RIElgtè‰(IKI£„5³$kju_iQ©;Wiõ³oWëƒÞâE™ `Jö?ÄûW ˱àµu"8ÖRfÓ !xW©\³õ»E}ά2ÒÅÛyÕõw©¡$a­å\k®½9·U}Úg\·ù ê˜\òÑP ‚ ó•9UW¹IO5—+¤-lš5VoˆµŠwÕåjà÷©‘>ŸßVÞ´“>³ÓôœªªÄKª¦‚¶mEREð\ÏL9Í)¨¼€ çO«3Å¿düÅ™šsY! G¿Ó÷5¼rí§zm¦iiíS€Ô•ÉkÆôØô—!ºD§—M[2Æ{Ö„¥1BÇï#?%RÉuK‹ñvcãÔÒKÔ&ñr¼6"bª€È‰¢R'%‘ÀQßùEIG%Gƒõ—p†s18 ^‰\XÁ«9†‹:ÈÈ$º|ÔsÖx UD–[Xl€Ã°f$ÒQÏ —ßç¯GÁÚçPÓä@ÚzÜ#Q}>ÒÛ™]{¾6ËGKHÙ4”TK¿VBâ ;Kç%Ñ”¦±/á9KŒõŸÆsóPÑ!ÿ¦¦£©à™¾Í´é½Yˆ®w N_þ"/–v3šFÿÜntŠ¡^k7¥> stream xœÍ[KsÜÆ¾óWìqY"3ÝóLU.‰]ŽótlÝâ$Ë¢d‹\›‘ìT~}¾ž=»À’KTå²6zúÝ_€wf°;#ÿ´ÿswU~îìîÓÕ÷W?^ÙöÃ4²Ýo^\ýòK f—‡(¸Ý‹7W¶ÝiÙއ݋»«¿í{m2Ì9îß_ߘ9°Û¿Äªc¶÷ÿÕÇ$×Ì~06ï?»¾±ƒaÊvÿ©P³œöï* )îïÀäDdhä]ÞßÎ—ß µóÙ¥¿¿øý{0´ R¾x Áþ$ÌØÒþp}Cqðâ¼–e3ï?ªë&x„SÛß"Ú=Âñ<»äZŠE yq{‹@ä<¥õ/ŠWƒO†·P²ä3óý}¹4ÐÅ– ³È+‰W2GR.Š‚@0Ùå Dáhí‚(×.Ö="ÇLË>ÉCt³$¿òä¢K£Oœ×äØÌÄ4IòçêBz#ñ-×l÷jýÛùzY7âÉ-__÷ôº>åZ LïÝàRIšž õ#=NBõÍøV¾œSK_C½­#…½E‚ùV¶Ûò½,£/åPsÿq.Çv*놥sŸÈ?(s*9©å¤çXHÞ«õ7êzP×oý‚Äåúõ M‘˜Ðx¨#¿Wä¯{ÇŠß-¼vɳ¯Îÿ ”}ÛkR¬Í4r)$/Oí1®[ï-æ¿i>mšÉ´)…f1nf«dÕ¯Øå/sZîºFGEóË :4ЃÚüAéün.-" (¡Vv·mFgåý¯®opUÂ>oJA!”Ì*5SŠ(²¯f&š÷A‘Ô~B"ÞÀ¥­ãÒIECÅt1PÇåV]kÅò¼Î?¶YoûçÛß¡¥ë펪‰¨Ù¼e9h÷^Ú}kíãOÝÚGŒ ¨I„òól=äÅzpäÁC+…ŸÅ-gBöˆÀdR³h‚¢[àq”þÔ`( Y`D=.a'qê“@QÔ¡:z®ÑÕºùƒü™Õî„À!ÒIHk3 n¼šwÖ»õãäVJÉ5¨ÝÚâ;eþƒ¢Ñë¥ÆdpÃþåí¼ï·ŠÏ èë¶‘ "íT̺Õ*%Ãíqû®|*^òd"‚ö«ê ÄX³n iÿÍL¬¬ßí?Ý7ÅšÙ}†o/N¨B–ûp±J¬mÃ×j¿§Ž+{;é4Á÷{WààmІO€C ¸@–p”Á‰b ø’›V$W°– •GñÕ:˜K²‚…Œ²`Du¶ÊªkËýr)TýlÒÆjsŽZ@Š˜)B¯Å$3’¢ÂüŒ-6©ÈÊ6÷jh?·Ò‚€h±Š1h±Ò‰®SÑ›¸”G.…åÈDßH×˽àírk×¾/Ó K÷ÜR§Lf}ù?éÉm}”¥üACÑI–p* Ä[$ô’üîÑê¯[ˆnËTì3s×]ìþSW2 ¨¸ɱ„N€Ê¢SºM|×ú¯f¤{¯â»™ D'¨«Â$ˆ-Îó^%Ado9B#²bØ”‚nËzûEÙuXfôª[ÅgAöB^±ƒÃÀÓá«§‹`Sd9a„5¢ôœ¬$Ï ~Ä®…Ïrì½Tmð$°N€âÙüÅh3$òO¦ZÁ›ÐgÓ?KüSš<OŒùÍç§Å“‚‚kuRZS§*h/Ýu¡v?i'÷4ýZØ#ðm·þzNeÇþ¤ŠÍ±45½òàº3‡j€|¤‘Ô yzs½Nœµ¬Ð±¡îÛ2ç8`r÷ ²´(‡=8;­<£EÐ0¥¡LNÒ¢^®H{;•ælí(qšüXÇÊhrP7ëšÖœüJƒÓÅ€c¨µ`ž)wµ`eôø¾N´l_4À™Év ¨34­<P\iÈ#Ðã.ï:¦Z Z³‹uz>dã4<Ò÷ªÒ¢'ÿ'`‰¼ÿaÊŸµˆÐ¹´6~œ¸è”}¼Y{¾d(”|ÿ²ø:uçŸËµ ‰—·LÉÈ|ë.Ýöl‡Y†.«æs”Z —ÇZõjJŸ (Tp¾å‹þ«¾ÖÞ[ëo?]£TF—ºVè2°Z˜Š&Xº^Šƒc$·Òž^@ cZ·Kgjìë3q^NÆï¿ë:-ÖPŠ@Z˜°ÿX1EgåaÇäë ®ÏãÂUŸ‰‰‹„Ã"„ôzXÀãóaéqAË£žß¹ìmm¨9(ÆnZyNAËN‰…òØ0VÆ‹•YƒÒçá€xüx‰HâþÞ…)P§¬Œ«ìÇÇÝØ|cÑEÑüßS¬qñ¿;Ú9¨Ó‘ïßÊ,Z¿|’1Ã8Í;o0”f5Í+zš×Tuš×TÏœæ¤t±†Ìʹê´sëºÈ¨cÛ9î64I+ᜬçõF‚ ¸Ž¢Ü‡-F‹!ø°ÅÅ,g…±“‹"îèåâ2dM%g…ªâ Ôˆ¼—>1ÅO ikü$9¥½ô÷‹h½€”®8›Ý…ÑAá¬%9@Ö"a éÑÉcøMMG „[1úcà·,ȃ\ÝsÚòp$9âjˆèœ…ë&ÑYØõœµ™C!Èó9A›“ÉÓrAr‘²¼…¥äŽÁa&﵋è~±3A2HMÊ%y_Énq šê`t*{ƒ+êSk #zGåXwÐg(7î?éÌMjÎl²8X'j™Î?äIÛ,Ð÷4XÄ̇bÞ#."Õg·H;ÚTòÁP/o?Ÿ¬r*pŽ#šV¨¯@_Q¹ ZšêbPïA…©ÇºÑi9ÀZ<[Ô.8zÕçyƒUH‘f5k!*¤^×k;™¨H*TÚ¢*8ÀOvÙOO„ï6¦2Îbúž \Ddäµ8M…Æâ&é C¾O‹Ž*(NÃî©‚¥‹—ž¿æ±lVÏ£—vID>ºã$"Y$êR€Ü r´E=Ü’ÛäœðÕEÚ‰=Ž,¬¥£ÈJ€œÛ" óqd­=OR£ÒŒX 掬#†¥ýÚ>bØxù@!ÿ)o,0ç-vg’aÁk¹H†× /å8ëÔ‘wÏåŠ-Ò³ qÝðó³‚Wõ(4ÛGŸŒŸÌG‹³Rû"ÁqÿpB½y `½±Ú††C9äQª»¸z*T¿)­ÀóÈJo:íÍÈþõýò½‡ð¸È¡0¾yÙÛû4¿½ÿEyqÜeιt†”lý2¡ÞøƒœÔl²Ó¯÷+Úö¦?PËø¶`Ž»–ÞîÏÀH¨œœ¼^_ÚCK˜êk}O£‰èM–ƒÎ»y%aæ‰á9ïþ[Ϙ¥=˜zŒ…íL¼¼æMɧœ»÷ýë‹æžÑô7s)thŸä•„ÓÊó%dGƒ3G~¢?I¨F7¸ä.íÅ„»/Þ)ò¦¯ªGqüØ‘ÔÔò–\*‡å6Dçç¹:Ç)=§¥çèÓˆd`R>m O=àpì|ÚxŸ©sÙ§@cµä¯ V½Ù Ø<Õ¾gˆ°, ËôúÊâ¡:ÝÚÑtõëƒÕ¢Þ•! ‚zyñ#”ÌÜ0Ýò— ‡îK–Û|Gª>ex5Ë ö=ÌG¹ƒzFÑXØ0ñ(~?åQ¨3Å;u£þxB1¹­Lä; ýMŸ¹õüþ…\ït*@‘ë¼¢…|UæäCJèô¬å«êÅòUJq†Ëž[“©›7w9GnMõiË/ˆ.çiÈ}ÔÙy«<_j#ò´üÌ7F—…É¥€õ çŒÖ;Må)“»KS´Ø£ÒÛî{ÖÚÒT挅í@9Q73Ý/?kU/k-žeŒúNºÛD3'hF³¶ÐYIpŒ×Ûý¦b&˜+þÖ²ÃbûnfÐòÓMù)ÿ0÷§SgL&ìÜÓL8™Õz+kw'¦og'AfD¶Ù ê+D1˜øi¥RÉ(ž:ªÌò$AS]ÚõEm–#cÚÙóÏ,‚µ°(#r@Ô©ø%fQTN¾®ê©&ÃNF<6¾Ž{+´*îÛÂSiÖ?ZõK­²@wê¡n0y.¦íæùRUÍ[ü÷ßf°‰Rendstream endobj 550 0 obj 3619 endobj 555 0 obj <> stream xœÅÙr·ñ}¿b*É0ñ¸W¥* eG±å#+y°ó@rÅM®(“”UÊ×»ÇLc1X‘rÊ)YØl4ú>€ùiàL ÿäÏw«øã †¯¦ÕÕê§•È?ðŒ6üídõésiùX°Òêáäb%ò'§3Æ'»Õ÷ãñg’+Üx}´æL)«ôx P­”Pn¼C¨sZ9k¥ ã"ŒOC„à¤/Ó>㤿õÔBù LN¡à€¹÷Rr™ÔÁ™q›Nw:Œ/[[î¸ýÏÉ—+e 3<€$'`þkümV 9Þ­¥cÆËç•Rã[²Î*é,†óBŒ ìH˜¸2„ñŒì¼$;ofFÀI!–kSag…pajxÒÚVàV#ñ í¼Ì1 ÔÈç'«®4ãfx·r’ƒ}cN »•Ñh… r½zÑwá¡™ÒVî9‹ @<øä,úh-„¸¤z!”°U¯$bIP=@­–R‚æ§eT¼6¨¤xgøVR¼óÚ€iƵö¨øiãeÚèœwx `KšŸ >vRÎYUð#})3lÉ¥‚ŒgmÄ´AÉ‚·ÉšHöÃÖ\N‹Põ”‡½Ç¢[¬‰2Àm«Äx6'Ã^[ž³0wætAOïSžCRû +øBHFøBHFv:!Yxˆë…´á ia~Sgó¦näx¢ÜôÔ<ÌUa/€Ö„¨ëµ” ʹ©ÖZZ¥&Ç\V¸ÁgIÏ —ŸR_KO²*#*‰g¶ÈòÉÄ6•±Ã·yH)%û¤zòq@Z(×ùÆ[ãk»QÊ”L Ów0PqÁñÚÂà›|ºÆ’Î†Øøà‘úÖ$»p0LJtc½&Þ•B^Êt•’Á©VåHË‚ ÞA¿þ +‰.4ͱဂ&HìJ°áØ[AK°-)É}Q?&åßaȬŠËÍ ài2¡=ÀfÊ‹ñ -ŒU²´}e6ÂÍÜ$ªŠ¨Ã Æébí?£0F–ót5¢æwk øéüu‡“6,ƒT._è}2ÇÃâño—¸-è3ñ4e*²ˆøå†P`ñ’5NY_àÐP>‚å„X`åöÚRa¤ü#ʹlÉôÌÉŸÝk§½[lܾø‰“o:­8}ÂØ{­i9ÐPgÔd–2•Vm|þê%À(”G·cBÎ?rõ=9W70 dO§OV oßåá¯\£ï}lQ¾¤xõ0*ûjÚÿŒ ÷)½¨½™o×{Ÿ=ÐKzaO/FèuïÍÓÁ¹mž8šû˜MmW4»Ðõ§xãØ”Þë3~ÓcâµÕo©>ªšÎö_–; Y+”YྣrüùZ(nì\ ¶ï–¹èoæ9a¯‹Á­9W8·kƒ¦w¿bØøŸŽ,°ì6ÿ¿‘¥{>¶#ôøæÃ…¦fSxÙo à,øsq/ZÜK£  FÀ„B…9˜Õb^tršùØ)íÒÓ)h@àc ÞÁC›/4Äh ’wÈãÔ©ü™£ŒßéÝ#:(F£ÃÝJ¬!M•Ü,Wõ[üµÂOovˆçkI°ÄñÜvœÍ'ÓÓnù¡Ù 3œÎ_{æòxIìpCp(<–Sç9lO·ó¹/ FðÓ±Æÿñ´e3Õ¥OxØî—ñD'õMFrÞû"œ-k×ÛüýSB&Ú¯Î=훜އ¿ÛÇzŠ‚Y<ºvAÄT7ꈜ÷ð/œ;gk,9РVg§ÂïxiC¥¡#ôðÍrX+}È×ObþYNKÂíþÿ @d/endstream endobj 556 0 obj 2953 endobj 560 0 obj <> stream xœÍ[K“· ¾Ï¯˜ãlU¶M‚àëš8;ïØºÅ9H–-ËÒîÚŽd§òëód7Á™î}uR•J9îå A_Üþ~úÍ•™È8—ãéýÕµ™œ ŽO/±ÊÎYOÿ”ÕÙÅ$ÏÎùÉØ|ú 6çHöô¶¾ç#ÅÓ_器º4,«]ôò –MJD†Ú–œ£?½©»GΧo„šƒ‰&üãÅïÎûÉ› M^¼†ð’_3gétwuMqò"¿–e“sîôQ=7Å Œñ4%kOßÖåd¡a•ÂRΧWêÍ·êÍ»N2©åj`ØÔÍ Æúq½ZÄdÃò¥EÊFoúc³ˆ‡MÄ"¿}qøÛ'ã¿"ø7Æ)ÚãÍÁ³¯¼¬¼?|yÈ1€ÔCfk¬…põOù i¢Ð÷nbßß 6Ž`•=x«`ÃûPò>$I5⊺1øo¯®!@rœ†åÕ¯lB×Ñ"/ÇE4Šv²A‰N1‰ºóï^p~¾èHgó(úW§.Øé««ú‡3ðá¯}ŒˆnwRЉ%gýÚ#ÂcæR^œ¹–3}}EÙË|ú®ó(¾·‚u3çÓ»ΤlOŸ– eG&‚4‹zÄÖ°>ËR~˜e)̲„KQ ÞŠ$a”ä3M²b“΄}<ý¤ÅxP¦bŸÎýNq¿½"?%ÉŸE¬„Õ}XÙtpʰ©wHþ‘fªiÁÞ«˜n&‘ 8*a ŸÂXq³´ AZ^d©ïÁ¦$è€eðõ°ýªì:,3Pîâ³"{!ÿV0ÌqLv¶SY~¼6¡à\ˆ 6€ÉX”¾v6NÉ»ã5ò3ûªúv-|Öc¯Y5Æà.K;¼Úæ¾üuÀºDþQÂT+xÆlúW‰Ê)ÞOÎóäóãâ©<®[u{-«©S´OÝu¯µ?N¿ö|;¬¿î)°îØŸØœKSÓ+OÌK¯° Ÿi$xa9›ë}tâle…Ž õn/Ðè|&¢cHÆMå‰ÑÛyá &r…%±¨—²^FN¥¹9J”&?£˜dpƒÚú²F´æ¢à7Ê›†CEx=H àEGø»‚ågÐ¥Z¦)¸c@ ª­ †êŸÏ)ýè#c}Ù,ÛÂ=Õë:–ô{ˆ\ÃçͶ!Ö­~WAÊÍåá"Ÿ~Xòf+tiMtEý¸pÑ©úp‘öc±} <ÿ¢x9þ"‰#CíÏåÙHGq}ÛÅ”où©ÛÞ[YÖ[–ÍÊòsŒŠ„‚ëfŒzÕ…z«’Nu÷—zÑÓ×Ú{[uíç+@d”¦R£„€µÐÂÔ`i‡ÃðÂKqpŒÄÍÙ㡨‰Ù¥B`´XoVÄ£Ÿlœ“ñms ·ÆRD‹…õk0fÚ“UÎêùþ†0+ÕsÎ\d!¥×­ÿJ#^®bY6yr¹³2l²ƒ}ò…‡¥”¾×–¨(z{Š5.>/~¶.KµÝHÊýwßô°(B¹è¢O3jGùAÈ!‹¯|š8—.“­Ÿ¼‹¥]Ú£‚~vrFrw# ôŒ¾ê{|¯øVfѶ1¦ôÍ–`XÆuˈ¯&ö¶2 튪ÍíŠê¹£»‰rrSCæõzȬŒ9±®Qæ§¾Þãž±¡IZ ‚À‡ƒª°ÎDQ¢Éå]š²¤ñ¨è½y?ëÚel§ÑMž;=`Ü NEø-Ñ.Ù£R<¾Nq]긲úV›¥œ´(G ‡£•Üd ln¹±Ør•ÀÖ.íÀQLë®Yœ ×TŠÀZ.ç`u7JïC€¨’h—ôNΣü(ýc&¢ 4[0újéT>vìÞ˜lº‘r†ó´‘`58o4d°É QîÃ#Å|Øãb'ƒq‹"Þåre(ÈšJNâ£S“ k펦 NÈ]:Ì‘5ҟ혡N‡¶Ã÷(}rî,~RH{ã'™FéoWÛõÒ„ºb7;…ÑAÁÖR96V"a é1Á[¼«èH ÁF¨ûm' ˆÞ k£,Og’Ë÷’8ˆî²pÝ%:¦ “ÎjÎÖС:Èýˆ  Êäi8R–VWÉc(µ‹¨~q0A2H]Ê%3…d÷8Eu2:•½1P|Le¬%Ìè;]AŸ!X ÕË;$äÚ'Ÿ¥ÆÖvŽ#ZVZS_}MÅÀT7P=¹©g´ …)ðz =‘–¬ÕÓ#uæ&†pZ>BuŠgZHû„WTÒ~E¿K ùn[Yt-žØ±£–M£<ËAì ¼÷F\ˆ’ŸíÞKÉ£Qx}¸¨] ¨gVM Š•ÒB*¤Q×K9éT$•ö¨ ð“]÷Ó#Ûw“Ì€J,BÝã0ÈEDpT¨PøBÜ%=aÈ÷iÕQ¥‹Óm÷¿`iðÒóW˺zµtH"ò@¦³$"Y$j(@î¡Îí‚Ißx—s"š¯!²PNìyda-EVB˹/²°±;¬­IjTê«|g1Nʯ#Æ/—o4òŸòÑÁSqÞcwG2,x-ɰÀ£ðÇY§Ž\1‘+{¤w2,ÄmÃ÷¯êQh¶~¿˜Vg¥vÁ‡ÝøuB]9Pm½±Úh rÈ£UçÒpT@¿+­ÀóÈFmºhê!& MßÔ*W¬„Ç5š h%Ë)&Ë ߸^;Š™}ö'ÚZ¾¶VÊ—Ü@’Ï'œ]Îí 3¤dë5¦úârR;9“åLBNýÉx«iK:Ùˆ®…ìåÀÎiêâ3lU–eÎ Xæ§\z\ˆÔʤGÒD© Lr»gYaŽ{è‚OZ/ÄòéžÕCûÊ÷çr›|ÊíúŒlP?‡ËQ¯CQh°,@¬kJÅßJÂeåù:¦‰Í™„Ÿªí›Ñ ¥s—òbBn—i Úu»FþƒX¶7á5øq ©©å-q*‡å6Dö}`®Îa¥ç²¢ôœ}J1Ë‘K÷i[|jEKÒ>ÞQï³Æõþ™…±ÚÛží;G9þGÛ…~ê¶hg", `{Él«ØÉÆÖêÂBv6‹r5¡G,Cõ&—{ 2sÃtía¡ýI~·ž¨¤XÛâFH³4šôe'xÕePûÞõ£ÜI}£h,lXx¿_ò(Ôwâ­z±Æ4›I3yS™¸˜ç 'õyR¯Þ¿!×;] Päº_ÑB.i²œ`„.ßZ¾¬^ ŽlugïZ‘©›7w1o rÛ™,ÑmŽ¿Ã?ožuÈMT´0Fí[åþ¨è–e%@åø˜û½[Âä`£0¨9³õ.SyIÀ!¹[.Ii ÉÚÍEâ>k miŠq”c“ñ MåDÃÌt»þ­UÝÒZ=˘õ]t;·‰3#B'fmA[‰¥³Á¬ñÞf úÿW0»[E°ï;ƒ– ¼$¨üþ¡¨ otžûg°t$7Æãü^;< 2$r hÇêQ &~^¨42‰'Mƒž-FMóä¸Î¥P³|ù/ÄuŸá“ÁJV`ˆœi}ÐzÉÅNƒ:/÷ÍbãÅzçVW";Dü¼ðXšMë¡-Zù/œ4íÒ£CÕ`r‡ÑöŸ¸åQáåüÿë³ñ'endstream endobj 561 0 obj 2936 endobj 565 0 obj <> stream xœÝ[[sÇ~?yÌ8å‡xåBËÜ/8• FÇ€’Øe'UYBFG`±—üõôÜv¿9³# ‰r¥RvÙsšÞÞ¾~ÓÓ³ü°f#_³ðOþÿóÍ*þ\óõÃiõrõÊç,³­?Û_Ý~" [ûÑaÔzÿhÅóV¬­ä£Öf½¿Y}3ÜÛa£`Rz;œîì²QJ#Õp@T%%—vx¨Ö*i]XK©GÆýðxGXzÐðá+âåÞ[Á‡½]> ­=N’0m…6ÄÁœ‚‰"Ù*?ÏËï·Ò^¹ì¹’š—–ôÝ?$ÿþÐ #¹^íìÒ{µ%ÅY['¥ÞÁ:›!…5A.­FÇùp”ÈŽ“I .¼žÁ“'ðä«™er6›4If¦t6[y니ø–Öl#²ÑQn2ÚhÃl°úþþê/+52½þqe£HY;Z¾Þ¬´b$ÉO”ÓÕÓ~ع[s5JeÄVØ'áÞ¥°kR™ M–'÷r.¹qÁ½R.Aî%ªQBòî´ŒÎUÜx™œkõHY’œkÒ”ÁL)œ;=x’´ÖÙðâŽR-97 |¼#ƒó¼"窠ÜPÃÞ °lÂZh©./2†œ: Œ^åÆX«ƒWo?ÑJ¯9½Ö[ð%ªÐ„ðy7îäWYQö÷æUo;âO'FàB›°¦ÑÏ;üïZå— OõR§åYŽš’%jˆ´(½h–Ø=ìuŒýÔê š">&E¸£v®ÊxÀÄ% Ç,oø?eEv³&˜ñ¸9žÀqòUí¯™?uv©…)Ò‘±,1³OgìxÔÿìbÈjv¸·­ Mÿ ôO·P¢Ú>ëð°öÖâ.„ˆý²ƒ©—鸑þ«ƒÙß“O™'Ÿª°MO,X|“3•ýÓµ&?„õ.ÈU —Õô²1=éXù¦õPã¹Óv3@ëãzËœ`ûÖ˜ˆ˜¸§@‡=d)¸Í³ܱCÇbxô…ý­1Ÿý}«O³Åb‚!‚`ÂŒ­[QçÒí.m ÐÅ| ®}ë³yüûÊS<¬ë[”üôÖÀòëð"F'Ã^þs'<çé0‹è´µ¿FÑ®jIN:®;ê¬q—9/Éï°?zЯÿd «×œÎ;ÒƒN@ö8DglˆJ@«xÌ ½‘þëöu…°¸ CÄQ[™…þ¢ $†ïíxÎ–Û ô<¦þIËÓt {]u ³SÓ×¼êyçU§-½ÙÓö®Ðv®°cuœô¬‚pðûv:š×;Ãö‹ú|»3ÿHü8ò˜ø3ôH? 2'åªIÍ­veè` ·Ï“7ümÇSnK!’NZ‘ଫàFðÎÏ!OžsH? H"KðpgdÆVÒY:= {¼ò£qk%4™ƒ¦Ù8œ窊d (Eöµ†4V¤ž³£)å]gvLTsÜY7g¶± ÐÌšo'Ç R¡ÒüIÜã±Ã¾×[“‰Eþ±}¶iU±‡xôž:lµ³½tñÇGÀôÖ_Áz¯íŸšÁHêÒ`dÁ˜¸Æw•î¡Jš©p¦¤Ù.%,'Åh°p2¡*ã©s—X8A¶‘7*JdS¨i¡r‹e2–”V[B“ UQ]jÃÅ%„6|¸2¶[B¿ ÌNYåìb½ùpÂr¼°ã(ðga [FŠyäõqÛà6V<6ˆ–ÞÔ!ÖÕÇuæ6V{.¶|1äwµÝu¢O¡­R?‡¶$º¡èT;D&T‰®µÏmšÔ¿I¢k¥\ÓRt2·JôËë¢MôɆíÔ¿I¢£ ÿ¿‰~•ÄïY2ѧÐn§>&º¦˜YÈóô»JóЬÖiž%ß$Í•m¹ßK‰¡„LS!½×|ØyÁÈ1ª"ß‹d'¤ÌqùxöD\(%¹š‘Ûé® ­tø„™ôó:vP±ðø<Øê|ý礱óÅ&Å¨É cPŠb©m›ü¼]œ7)EÔ¢¢—õJñh:k.V¢}˜n~Ók8“ld¼*³§²¹ä†¾=õ.·nG™x5§€ÿ^g½W®ÄÔîE:‡õO =µo[Ç]eG'Œ¨&Èè*<!ÝÀzÓ®#ÿ­ẙ脪‰í¨:ˆò®¼x= J#Šˆ7«I5¡*™I…0ÐB|\J øt#9vá ¹½ns*Äm(EàÔ#p¦ßœÂ{K Î ÙŠ'ýÝ%ÀÇ\ÒÖ¯†»}?’NI@Ô5á"#Õ¸‹#C(Lúy5¤úµµš_ rw÷{3js uI¥”œZáæ¥N½%QÛÿA”ĹÛV@¤ßƒõêuúúÂV숀 Ÿ4'ê­[õ ²þ O©ÿNkË%ŸïÅk–³ò­>òϰÆ;ü1àBà,W5ˆIF´Ì7e†‰ÊÛðxwІ›Ïy£s{½¸ðáÂÒÝÈRO˜¡PªnE÷åk óŽ˜[—Ãâ…9Waš¶šÛSh>fŒ,„ $v£@,²qÆ+< ŸfÂŒ·PpÆ‹\iÆ‹\לñ’ˆ‘@Flx=Èð€3Þt¬„wõ¬3Èf6|ÿ 6h%kK59IÖ\.ÎmkÂÊÉ·Ûèy¬¬üñ‹ 1Ññ´¶ðñË…°rÚ„ž\µâ˜ÐNDZýœÐ™pUž÷t9½]„ÑӇˋ×xbºÆ‹p•ï¨ð6ï«òÅ¥ãGíT·ŽÛô²§ØÄ1$o´Ó÷ÇQ^t¡À㬖(cŠù¬©®²±íJCÕÅDŠ0N¿)’:à›4Ã÷q“”å^-ls%Q‘„¹c.\©lÂu‹Šø)±’"M­¹³AÂÄEg<¤éu0ÃÚ`ž Ó!™cxŠÚÑdÅAmfêpRº.\Œ‰nè<™e+ý’G=)Hߤƽ1W¦¢@|ôb.°âÂ÷K:,›¥÷+=Ï3(Ýâß à–Ž1ž"NRÍD‰˜iáêÖò‰+Õ9^®…yô¤¤F˜Sm+iJ®“xËù¿Xλäîè¡]!,óI5Ïb¨¹Í;@I:pL"L‘Ò3i?í’áëv¯ñpƒIô«ø¤S^ÉîÀ³Ý$= ouñƒ¨§Ë;üë)Ñ¡x±\~[ƒªüøÍ«L¦‘'nR”o’cy;ÐÈ, £_QÚÑúú0>zØœ'XÍggYßæ+ïX­=ê¥k€Æ;NÔ+nBÜso8®s’Q"Á_ßTåLÈõ.¡ªÉ)Æç¿?¥¦ål}Lÿý/ä8Rendstream endobj 566 0 obj 3117 endobj 571 0 obj <> stream xœí\[· ~ßöGìãÙ"«J¢®úÒ8hÓ¦Mêh¤vÖ^»±wÝK}?ê2C3sö2H‹AdŽ–C‘"E~Ôeþ}ª•9ÕüOûÿ×oNÊÏSsúçé雓Ÿ˜öC7²Óß?9ùícôiV9ØàNŸ¼81í…hO#å}8}òæäËÝGgZYM”ãîõÙ¹VDÜî)Z‘¡¸û–[ct?y¥MÞ}vf#^ f÷Кœ£5»GgçFYï³Ù½ªÌ|´q÷:%kµíœ£Ë»Ëùñ9S;Ÿ]úç“?‡à!ï“ ˆøþc¶ŒÝ]Ÿ£_!Ø7û˜ˆh÷^<75ÈÆÀ|ñ¤’1»µ9èQ…06çÝ3ñæ+ñæõL¢DsS’Tµƒv¾©írÌEéåPí`›Ò…oU:ø #kýñ““¿8¥ýé÷'ÑjX*FÍé›ï48å©åõÉëf·fÅì!ƒyNÕìžÅð°«êÅŒÑ÷;»Ül  ñ,l5F"‚¬«ÕÞìÞq³‰ÆSÞ½äç‚ñ‘ío3„j¯Ö\œÊÁÆ)Mª'øTÏ.¨„§))r¬¾†?¤<µ°úÒ$ ,AÒ‚Äu’Õ2éÔ•½7r„r‚zÃŒr‘ê0ÝmMp!6s™ˆˆ½ÆU‚^Б¿Ã}]É¡H '#ÇBòZ´¿ÏJ<¿ô —狚"±E·ù• ¿ Ëv7°Ú9$ϾÿPöå¨Im²K!yz8½ÝxGÈ.ÿËá“C³ ™J¦Yœ çó¨d &¢_—Ïæi¹ûîÌN= Z„iªá¹u~#t~5‡É9!V¯MFf¥Ý‡gç°&¡Ÿ% X„Ì*5ÙdŸÍL$ïkARóeÉÒ.­Ž#"¦‹Á\.ųÔH –Çd¹¥ÿÒÞúÏ!ÜÖ¿CJ—Ýßì;TQ²¹è²ì¤{Ïé¾¥öþS¦öŽ· €P~GŽD<‘$­EbÑ–Šðù%„-(I\i°*¡õû’š’O9ˆâUEq¸ÎJ.;’Hc9‘r"&ó3®ðSaŠœ|ÞÏ£}(–ò¨w!«)¶_ÇMŽšš¬J6VSÿý,¡¸âˆµd æòq-‘‚ÝÅþ6ñHNSÉü‚™D•Ó/–̯ªoùÜ2åtüZLS»×ÅUíÕv(pï˜!£0ê(S£0‚<"ŸàeÕÉB^¿mC—ÇÑmÍY¼×4z=>³FÀþ'-J»<_¡]wÌ1 ôLöéÉ“ß|¹ûüŒÌP5È8 Û«ïç¬*Ž([;´K>µªÒÑée‹4›‰øx±$`{³Ø>±ÍÁLqö™a¶tŸ÷³§J óvn~?åªwÕ¦"»_OÒrÒFW³»H~)¨YêóÀ¹Ѿ€ã/àãç >¾çîɉ²ƒ÷ñÉ™ÂM@èX®ÒÓJ…­a  –'±$j-±˜8Y.k¸€”ë6ǧHê(¢té~9™B> åZзe­v˜®}écu¥DĤáYbÉþjfù¸J“´=D&¨TÒÙ+Ñ•`³ [x)ÆÐ>lšÃ×}a¯/4Üg‡” Ú˜°œ²²HG÷©úçDœWúÏ xÀByÝðŠLûržÉð*iDÜ–$òUϟלtܯrEX,Á]§¡D(x;Å}×… ³·á kqk íá1<Á·GæÏd[„]R¬«‰Z*tÑç!vvb\!ŽŒrO9U!LŒŸK­%;í‹´§¨4µˆ¨4E8K€¢AF¸Ö2PÁܘ\’ªµÈ8ˆª€‘µŒƒFcRnZÞ%~ÈÔ½õC„ðÈ)ìÈèU ‚q»oÊhE­MØ=’€MÆLѾ8ÿƒ.3ïuÛÅ\!‰bé] ¼Þ3v^^t´*ÎÝ?lÕ³ÌߟhÕóÜXO§¼§i«@ýåYŽïØåMVÿ±º¼ÓáHÝTæ©qÛaR[wƒ)%ÞÏ0µÁÛ”ÌÈ'rD’ý±¾o|Þ«Kø-„Í·s£”òíR_·Äìƒ|ž!}&€ªi”ãÐßJͶ€˜ É¿Ì`×\ëåy-ôpV6¹â¡i7c¸`ò#À—r5›SìvF¶ÓxÄüz&ù±ºYÀàW7s˜Hm´ê‹"}Ïï’Ž¥¿JÖ¯–þ+Þ÷®yœ£ÕD&Ÿ›ÎeÛöíbÆZÎR—µí2êDèn|ÀŽÝʸ¸êƒk%‡D"ÓópN•\-¾©å~®µÜ×l­ìõ²ŽêßChù¹a£G5 “Õy5Ê=å“È6a´æ‚͸hTvobä”O$AOæGæË² 7‡ïqÙ[&”¹…Ö7ºD2nG­Ç%ã”_mãõ<%´iFܾ€ë¦qOõ=à„Ùä ô&h)€^0gš¨r}¯¶Ý¥Å-Ð$¨M2‚Ÿ”Q0”m)@ÉZŽH/ŸWì‘r3’l4ýl †>pE€G8®ã€â ¶d8ã•§ZÑxÃ&>Fsý† B’•ŒÞtžÏæžeo×Jü8xÕ&ÀÐöj]=%Œq-hd{)è#ªì >—s¿Ï%èk·‘xrŠY»Zå/d¸üÅ@׉䭎p›/ª1àYmtShž\‰Åèý_MïMΦOÿ€/ïë(”BY4Þb„Y ‰îî~Tk¥kÇ[ËÁ]×yäMŠš– "ð Xؘ,„‰b´áƒIS O´%eÃ@åIûKª{®-€Ÿc _•u! îg,\&mŒE E¡)´Ñ :Õ°1ñ™(AEˆ6mRLÕeÚÇxã ­ÊÄÅMÖu®¼‡ü ·©&. jé )ûå2Øh~Ìw¼uUæW‰ÂåØPŽ©(+Ênu]¦æ>WA\rʃNy(ü:꓌¶sj:¾MÀ#v|” p>S¥À/*ŠHF¡rï(âpG®–Ë[]“2àÜ’;f›0•Ï‚0…|¥H“"\­ãªý–ŒÙÅé´–8&p%4@•[­ðEšJl’[Lö÷íjmJ‰@v40 +q¹“[|¾Œ:`éÉݪ`¯º÷D…¡bFa"—o—†Ì†om‡ú¶M@³¨8TäŒ@Ñ[^Tì-È`Z˜Î§BŸJ{ô¨ËÑ€Wü3¥a)A®4F!º© ~%Ÿ ÎGþ°ðª,¿©5°=Ø ­hàReãèø»eÁBYCã8Jo”ê‹2haBFÁõ°ƒ—kÔINªQçj9¹Šˆ"‹žã™;…X¹o-—gPá¾V.‰²L®*Ü* ¶Ôm)äVÂùãâÁÚaqä~Ö!£t^ÉzS¢a½õÝÜ_t»\…,«g9‡¨l¤U¹žœ&¹O¨­ÜÍ÷º2P¦£kK”2†}wØË­m¼I.]®ŒÚ媠;Aà mÙºtvt†þàÀèäIŸós«Ý§ù´DŠÎð¥‰>ˆç»#†>¨rîŠ9Ò¾ÃpðéÈVäA¨3IyDw⋵ˆ@€ÂSoyPÀ³0å‹*5Ô­àù•²aÁõ‡¢¾}4Ô‘çÁAÎ-² mçZþ+×b±à_‚oe_.ì'cõòÖdÞ‘0¢¼í-²¼•Tµ¼•T,oÁµw®&]±×]¶Åå´º­XýÒ¡C¤Îñµ›QUŒŽ²Q²¨Ø6iê0z4*zçÊ“ŸUöàŒÍ`¹=ÑC"H¡"âµ¼-²G£RÜþ(×wQV,-è Ír[£1æfm¨œi r˜‹›´ x±]6Íb¶:0 tÁ¨;)FFéÉ­û*ñm’žxµÆÒߥbY[r–4kǼֶ[–6çÌçÌgõ1j0Þ8HÁ HT‘ãþ–A |Øbbâų8Èe£æóƒô¼m²¤â2DDœ‡HOâœGégÀ·¶(3QÌ:ðͦ$'ù¬ù4Ê ƒÏ(S;B™B›t¤lõô[ f¾+åJ¼]>NJD{þ“€¹6úO ŒäGé—O•C’]qv§áZ:…3¨ûìèhÃôˆøÚ¦¤Ã­ úm^½7Èœã–Õžäð+Ñ)3×M¢ŸóÞË9kgÓD!ô~®ä[‰k½]H.ò½Á.È.îi#¯*Jª¤1A6)—øÂ®Ùb$UÔÇB*¯5¯ b¡-)ã*G2ƒ>@x°@¸q?¥e< QÊ;p°iÄÁ¢q–ya‰‚wžf)€¾U’`Ñ£ìPzD\AjœÝ>`ÚÙM!,Šœw0>ÅËéi£a7k{CƒôæÏ4•$ͽ½ü,,ù¾éàK(‹‡NÅv é,S5`àű}¢aÜ…òrƒüYƒÊaÖàžH9L cÏ×G¡øâ–i&I^»EpÏiÎŽ‚Ëå.9ô·>¸[1•L8AM:pP iÐ3Çš@:å”6¨ °Y¶Ïá:¿Ë5ß$”EšsAJe­Õ| \Ð Ë…¸Er‹‚Þ§EÄ&!öDp’JÖZ/†S©U5¼)'õÑíMëyŸLL{Ëçó–iÏS5$·É( Kz²†Ùó&4¥Ñ›R mÞ„Niß›Ö6sD94£RÚ" ?!ΰfðÒ˜ìF’`®Û¼AlâCÝ•ÃCÇ›,^He¹pƒàq³˜(ü±>0°ArâB ®ø|=­ÊÍfÛ†ô\)µC[4nˆ Ùµç)”õ›YqW Ô@Ã:m™Fà€:c%÷¤ýv|ü.MùŽó8x±¡_ù¿ßgiìüYšÏË-—©_±¦Ê‘ÛéÅ·|þ”·‚œün mŸ°é;P98¾r³ôÙš\.Vít¥A«¹¡a»Mäho¨¬ý½™[,b£¿ÍR‹·Œ'Ôȼ*Uè·ÊIþv³ëWOçÐç$¹²$œZ.!9«œÞ“ðÑ 2<2"çT¢CŽKé ¹¸“v‡‹bí¾Yt~.„«qœÐsjzv›23NØ´5H›æŒ”Zo²ìYùøÑÅe›Yd.—)£#q€ЪÝdítÄÈÖk-õžˆ¸êS^.ÓÕþr_Þ$yΟØñüE¾àøÊDZþÏõpoŸø5?Š»*ÏfD¿×ó­{â2]ãQì~È£P_ϯċòS‚ÉeeR.ðÉË|J¼z¼ÿB.{: Èu\Ö‚or8^™à:í¡|Q­X>PŒá²ïÇökçÍ\ÎY·&ˆø¾Â=ÎA.ÏÓºÅ8z™»Êó£Dššx2rY˜\Ø( rN½ƒ©‚I‡%-†ö4aºÏ·Í<Ÿ ê›þÙ'Ø®ÚÈxX´Ý¹°1ÆrœÖ)Þ×J¡LÑÎŽ§hˆª_š ïœÍ,1àø¡`‹)ÙÀÁó|bûE—Æì²¼æXg=±û!±›r '#±Ã6dk^7ó§þüô(<âÿý/Ätmendstream endobj 572 0 obj 4520 endobj 579 0 obj <> stream xœÝ\Ks·¾3ù›Û2eN4€œÊ%Qªœ—D<¤*ÎA2-Ñ–()²ÇúõùÀÌ4fg(’Sy8%•8ÄöýB÷× ¬þ~0ƒ=ùÓ~~qsV~=ØÃ獵g?³íÓÈ¿¼<ûÙŸ]4‡<äè¢?\>;³ív&;„—7g=þêÜ Îe>¾<¿0Q$|‚QOd‰ßÈ(³'NòLcóñ± )¹ã—òì£a_¨çwå9˜lèøU<°ããë:;û||5Oó·ËßžQËÄàôò ÌýA>Í.’uxéÂ1HÁÒU})Ññ[õÜ ÇQxÂÓ¬=>«ÃÉB‚*˜u9Ÿª7¿Ro¾žI5üÙ9–wœü6GãÃñÑù…œÏœÇ)Ê*7 0É×VŒîø|ž·),@M"õ¯/Ïþtæß±3°óÀöps¼ÁLyyyöø,û<Ät`CI~‚È3Ì÷¡Á¼‡˜¬¬6ްñfˆuµM÷²é`íC°Ú½l !û€Iýàró±OE\—B‚èOŠÖ=^5Éx çBS‰M‘Ò¤ç™ð¹âpÙÁ!y7x³àð‘Z¾z¼7x pgØšLÄöx[¸µÑG®Ænäo„$o©:<^ËÑw$¯Ëx°Î'x¼³a’³Ç+9Ç-g³i„«l:t6åhå½›+ß®±¸jSø`ö`/Aß4Vö¹u1Ú¶ï8†TÜ]Du‰“¯Š´ÙeĈö &ÙôØ5‰|êÈod2ÅT½¡Î~ª¥I¶¥Þ´–8äÎóÇNKѹÁi%ÉÔ|«Ž­ûý¨£‹wýF²p{[ã†÷¯‹OY¶£œˆ¡º¼ÈŽîEìb®.ålð^bøD8¡=q¯Ý í[ùÜçJ kKÜ)^ I>þzž ,à³§fÞòù»ÙïOm1j°3÷ZöÉaèf©v¡±ÆB_ñƒ‹ˆÅ ²&Àºa©T! !uT™”:ª{{u(–I‘£Ân¯žtc‘B%–+n‰%Kô2!Ÿ"$h*D8@G5©uÔáBñÚã}’<­<¾ Ü•æžq@"ä$î]UZŒC.¯yÓ[ø ›Àº0$@9 ¼T:%´ØËø[ÐG¤pÚ˜b¬ŽÔ_ÌÝBoqÞ¯Ôä§¡WfcxF²¼rÀ~ŒËT1Èkezìš°A(b×ÈÒ4f®æ3ÚÞUðBÆÇÙ7°‘±Ê!ÄÈ`E¬îØ‹o#Å7ʘ?„à`¶hçÛÊ„\Mÿ¸æ)à¼15ÞÚüA‡<“Tä·ë9¿içÐÔo€f±ÿ³éIÞÊ$qÈ x@(*¯‚ÅgE3Ž)wÞ[&—¤áß …Iލæê¦Uwmæ¾8¶oÉÛüyÙø²3šª6hŸôŒLS_Ù&äÈëi­ýâÕ<ßBkÓ|M%Àç¶ÚY]‘ð‹~ùû³ËŸJÔ’ u‰¯.ǯ9 h­[‰eA {-MPäâ•‚ü2WÕR€î¯å9¦hC C¨º,J‚Z½´áîPñ¤õ&ÔW(²GèÓ‡¯Ã·kÌÎCÊÓH ìÆ‘lÀ)±`™6*/©U¨Zm‘³C8ÁY7¥’GQ#9#5Ûzpê:ª„Š‘:ªûFƒT|„)ŸZ¶ÕâÕzÈi;›²ssu^@šA”ªCô½¨iö’ wc4@óÆÄ^ŒÏÕÿP2põ¹HDè†?رªýFJnÄv=…ÿ^JÍ‚†W˜n5X}ìí4Î÷ѼãV—G^AAžW–o8Ó"«߯qµ¾<ÀÍóÝaù€­9’_Í9[ÁÜS¼é½óÇOʆÇvŽ#6µµ¢nÿj~lLg§±ôz¦axPcéóó9€L^–“¢Á6ðHÙ!—ýçæ_à<@K¾ÌgE)PçŸÅÙÁ¹EšI‘Õ×M¯AÞ Ò€K"GþGН[ÄuqKEK¡¬©îëëp3ªSÌì®DwIs+‰cÜ {ˆÑ1HI2j/%à׊Ê;Ä'Þ%ê}2©CoY­÷ÍgqO‘ý=uÐoMó^e¶–å|M’l#Þ¬>¡4^‡=gúºôøeM±É÷o®¹›‹ˆÓž•6iˆ±³€‹A2XG%nºËN˜Bºq½î‚ŠØ‹ì_eÊ.•°?s›±9¨ßB.3fÔJÆî=2a „¡ØË´¦w ¯RèÕ%YõzÇK§GQYàUÚ¥wL18·ÐûÕÅjÛIšµ1fÆI;i–C®gœ‚ÑÑH¨à0Þïb\yÞöŒß}±y¨ó½ëž+êW“ôÚÏ4 þv¢|.ÚV'hèÂA7p6CèT³ÏÏÉvÕ—n4Þ¡]ª1R7®çQuuKÒ>hÎÜÏJík¥kG¤°ˆbMÌ÷jüK5þñ-,Ç€Ÿ~º#¸ÿ$æ‘ vÓÖ|V­ ÈÝ庫äEkò®ª¢Öba3²®”û'õÒëÞ±„qi™D¤03Vê(i• ,û^Eêwë.vZë,ŒzÑÞ¹ÛÕ†Q¿PãzÁO6ŒýD_mмUã÷ëαQBß¿,nâÃýGª¶|Ž}=«cÇ"\dFYnùÏ„(yö@}ÿ8ÇB(yMŠR•¿]Z¬qsµ®#½¯>Ô‡J¼ÞDz­UæYë 1ç@·mYªÑi `» ÜÌ=QB]ÞÝÚQçTæ »M„ºèJ¼ë=±‚ ÿóN±çœa9fÐü9”%Ò†ÓTÒÔ¦Žªð(׃”ësi>ŽèÒ|,óIúr#Unï•‘ŽÊƒŽ¨èV€ã,xPµ@dÆ®á¢@@G«N@ÐESûŠæmÌ€z¥ål§tþRkŠD÷ÙC1ÙıÄÎN¤Å!“¢AU)ÐïN"lÖX¦á?ßÈÈ"¨%ì¸þEäþÄ1  µ„®#IÛíNVº‘mŸè¸ÓIªN].6F¶ÚQûÿŒm.a¿9ÛÆÛ4Q‰mšè± S Òª˜wJo¿"Å›U8:7'aab1«„ÍÆx0ÔQ%) öÈàÈ!¤ä^Í·.G·ð“=ò¤Y=úu¸w—&·¦¿j@ͰKéÀstÝ\¯ ¤³ XµUYÜG¯¶«IgNSRI`L' "IDs>G:ªKÖPTm¤K;å(1ª´*ÙÉc«ÌY§eö­³"}ô÷ø¤\ºËïGîóE“çEÎóssóÐÛÝh®ê‹ß¿‘æ)|0+®V—‡‡Ûyõe¤Ïþ«‹MŸF”Á'çÁ~¨Pirž6ÒQÂÒ²¢j#ÚÅ€ð`µ‹•fÃ>+”æbúøy«Ä~¤krí{j|ݳrvþ!¹tÜÈ_Ìk¶å³Eºµ–÷t¥ô …º§ò£u©wR>àÆÚDóÁr;‹7Q˜6‘œ5¬/KGêaÒoœi4ã–³uò­è'å\Êâ 0ñxõò8¡¾™DþÅ ÚV; ¥0§É?U ëµJ­¯–éô–zÀ4:: 5]R‹•vãäP£¥+7ÿºgó£js¦!“ÿ½F\PWPì{¦TüLsªú“V·ús »©¨èV1ž»£j›„ÉwÈ\ƒê­sÿ{\/Óu ¦Ð¢­fî{qrš{²þØ¢»½7”úㆽ}ÁŠ!×Ûx£]ºÒ‹e-0_¨¸sÏmað;Ýˬ}1ÿßmȾ(…%êTÏôŠÕiGô݆&ßll¯{jøðmKÚ¼Ëéñ*ԛȪ7!Ù;¨÷ê¶Ã‹qK–}µ÷u»‰cíFiµåí‹m]$ÈyÂ7e|ä?ž&µêS7ÝAò­h°r Zž¢hîRSÍðs¼ ~ŽPÖ–cb…dÛÀí—ŠÃZ–*•›“ÞêûÄÆ"¿”ë2$íH>^™Js3Â$F„¡¹„2<¢pò+B’öˆ˜3ê…±²ÞÊÇ$_öx}#°Þøt^ãk5oŒm¨!¯Ì‹$r–›±Ò” ƒ¶´m¹;Ž´KÁ ¸£ Èô¡£º÷uß ßmÁO7¤”ºcÎÛ.ê­l"(–M¬¹qä± 0¥BÜÇq/*”4¸Ž(¡É»$EÌqÔ ÚµòF_/¼/Àiå=¢îÍ¥fëY‰†Hš€}Hnïl‡Ä æ·Ït'‘6fÖ®à:#mµÎ¬F¶ãÛ•ëáÔQyd»¤“Ó_¦X1Mmp©0´jÈBrÓMñE”¤ëÝq_®Û„Ž*•[C{¸—»o9ôÜo}}¨ÕU\OÓè¢c÷|¯T¹otíÔœ¥w0‹­y9¹Ðâ“owTðò÷(‰äÐ(Ä=&&‡âŒ;¾ã©çKpÉ.3¡dPç!ÜTœsÏýõ* ÐÉöZÃ×*C^‡‚ùfŸ‘tÚÉ2à\g§(-cÚ%C¬÷Û÷X€å‚©Þ>”œ44zîÑÂ’ÜaÚç?I.jqÏý:6*w¸AdzÚQT²Ü¦™YòV®÷ôN1lŽÖò»’Ž ¿¡ôz˜´’tˆç°ìÅ{£Î9^¾á´à~5pÇ:e™uë$ÅÀ"çèƒÅÁÀ…Z@Š!Œõž n= yvY.*¾9úÒ1²w*Hd—pInêÙ=†ARŒÞÊÁ¹”Û±…19Ùí¨*6ÞÁ<¦@¸ñÿNËê¢TðV:‡»˜ö͈ŠçÓ3/—’Ï3ár#]1Á¼G\AªßÝ!bÛ¹]!Sêå’#öàêiùÖlë0ŠÞq¤úô5*&OÕ½A½ŤI¾5žU¿u¢ô!·FïFõ¨½Äõ•^{Q¹Äó5tÜ.Q½¤JêE½/¬/‘NóÙKIÒqp18MÄr<ïb-Ò¶™Vªõb2½oú†ÈX(XoÊÓ™og¨ä$Í7€“–±¦bAl{¤“‹B,S¬™æŽ°^Žß;¿*Çï æ]ʽ_9DÇ~%gôR“¬Ù¦€» ”®¾¤ÐÃYsL¹åÚñl‰Pš mw±äXÀîÒ;K„5[Ê©fÇ<–d­©2ïâž3BwÚVü|±àéÜ!Üq!^ùv•aÑf|Ñ·O+öÈIo+òY¾B׉N’©ÞV(ëíø(,ÿ•>º›yÇ/ûýe¿‹€¤–‘ .àå 5UiÂÚù¿‰Óã$±9<Ç¿ÿò1&Áendstream endobj 580 0 obj 4055 endobj 583 0 obj <> stream xœUMsU7 Ýß_ᥳˆ«K²·-]P†¶”·`†aI¡^”Nÿ>òµs¯_>†ÉL¢èÉÒ9²ü1@Âígü½8.ë¿ãÍz·|\pü~<,?üA ¡¦ª¤9^/8Œ‚1& ‡ãò<þt‰€¹Z|v‰Y9Ç—îÍÌÈÿm^³ÌVšÍ, °Æ§Í-&¥Pü³ÙYÁ@ãÅd^m ßöäbdñªg·\ã?{š‡_/™Í+=\zqÛ×JÊHtNæP/é²fŽÿMöh€É´ÕäV*ˆñuwôzcHµÆWSäÛ)òj‡¤ÉýÛ™Oà•­Íj)ØéêœsJ 5{‡ Á»0æÎ—UõA˜Ñë¸ù!VÊFMÍ5i Z Õh/iw4V¾ãLU¥TÍA›§¥l_çK@LUg~Q89WAÍÏ1î$ÿÚº "Źz¹ÎYöð6Í/L$c°(ï’gðïS…›çû+äì‘p£ÂÓñƒtpSü»D ê aUŽP³Z—kÀ?4ˆJFîŠz˜ëx¹Zý‚”‹ßñ·,²õÙÅÉSŸ›gêóZSUß³¦Ãq¢©·¸ã-•¿Æ˜ðÝšúÌÔìň&«3ö°ÝutI±o-sfã_+_hXº¢è@:uÎ^SÇFZ;]„’sÛP^¨/GmûŒsiÔ]µb?µï(DëGÔäÌÞWûÁï ÖrÍÜ—rÿþy×ô¶‡7õ9aš ߸=#®¡P}[;.=ÃÑ=‚Ieót””$åUÙŸ™Ôýs®w«VÛži)<÷P­·Nª8ÞS)ëZn> stream xœÍ\Ûr·}g~bßû¢ûäüBôQ9-U÷ýù…ò½õÚwß$³õAkÝýí7©M å]÷òü‚Z}²{5˜ƒô¡ûê\ô††‹±{W¾†+¿Ÿºô`¾"³"Çzÿ.´Ò¦ûs¶C÷ij¡}0ÿ¸úËÙ£«³¿™^ØÃ¯g^‰ƒWÞ÷^®Ï¬¢±ZÞœ=Û ièœÂÐyup‘aˆš;¿RYòm ”Zº¨Uê¥(€duF)Eñ«Í>#]ÔCø¼íµÔCøÈ«$…ïBö˜ÂW/|=\è}ðé[¨· Úé!|eÀ«Ô¦˜ZiÆþÙžã§„Q2ÇFwV«?jjC _q]öÑZ™\×§¨ùñÙÕï¿è.³›ÞˆXŠBwoó|chÀfÕQ[©Lè~Ê_Op¾{PÜpÒ_êðK­ìÉñõ«o(ÌŸe÷¼³A¨î²OÑõ=M~÷,a§˜P¾J ßÞÒ=…W¹>XÝ] Mß=ÊPt ñ4£2RÒe}iB»2ïÈ3Ó¬Ôoy;HÆŠÈž1 Ó]~7 h,ëŒþ›¿G ò°û9Ç3Êèä0Y¥ØW§åb Ñ…Ž½"m ‘r%àÞ†‘)È,D ÝgçQ÷Q—¾ü¢ù伆ë°Ï‹i^ß@——C;8ÔFPÓV-F{N8C@“…%ÁVC’ámût–²Tê|]-Ô‹f*Ü,è)|£ ¥¥`KƒfŠ ª~œƒlˆ‘à:ÛI3Ê¢×ÕSe¼Nh'„£¥¡6Š":CøÁFл¯Óiá¢_›ÒÜý‡<ÖȪZÚ°.(Ûïrwoì4£Ãäðs´ ŸeN©“é=Ìéh`sJù¬§¯ù,{Ÿ{I!]oÜr¿ì¥¡^Rý­–¡— ´<°^Du{mGß­òCDJiPÕG©†èÿ4ŸB^ØOʲ¤åçR"õkR¦ÕG3;f¬ïjªQ–†VZpÀ«h9—Ük«)íð^^Ѽ³^•™5ÎŒ«%ÎG2“”ÐëÄLŒÍ"½ä´9®wÄ´²jdþ ,V‚–ÌS!ßYR%|©‘Äþq=yíÐÖ‚ªvè³$n £r ÃH\,KF£×Ÿ®»^Pù$²bC`\HU[‘úF£4[¶¤º§{þ§ôÁ)JYj™Œ*Â9 Z¦ÞË”‹½é¬.Î'§Ó›þ4Mg1°é$­Ï¦³ŒÝ2ÖöbÔÇåÇC¹åìJ3]ŠXã 县§ò— ,¯ 8 †OC©¢rI÷®ZNÁ—=Ç÷Éú©*—ÝsÀšjr)‚¢ >×Þ´ÄÐ<ûî pºTåN(*Žiµ'˜£Ú¹Å 2÷ÎîijZ‚시zi×:A¢zÈö^˜Ã…$öÚe¥ÔÒ˜m7Ÿ-su•VåÏ\~-bC×îElòʶæ×7`ÿÚ/÷ÄYC2—+ŠS˜8‹‰“ æ>8g›,-⤪]¦Û›\`ËeÉ©’VÑI†*M¦‹hru’¡&…j8Hº ÷’aÜ›V€%ßjHo É>ßÉñÍЗmñíU­ZW¹iû˜î4ÆÞjcõw`§¯§»8º3òÝ{`~ Ýû5´_,‰ûÿöO¡ý ú¼öï¡ýfù½¹} íï ý3´ßƒöÎ/,U¤Âº1 ÙŒQðÐΓe ¥:§<Ò]P´lcÊ»Ïð<Ýϯ˼‚®g{q=H³I€p3B÷×`»ü'Ðîon/³_(ˇE cöT­D Ù¯0û™ Å,û•±²Ÿ‰¡c³]dXö Ùyü«¬t±†µz‚¬I÷Ÿ1P´o¨؆˜0bÁ–—K©CpÓ=2%AÝDBy“”Û„D%„È‘¼?M‚‚bl¨|‘Ê•yÓÓ ùãgâá|jXr˜C÷RâÜbYˆyr}.o³ )º æÑÀÄluÂbÎcGÛ$fOåµ>RËž¬h¹Z´ 8î@ÊÂQÊ G)Ä[+¹©J>HU2ÁíguùN÷Œ{·'혚o¤Ý¾vÁ…w*]¿'Ýê9sdÛÏÔI¤½´IºÅÀ¤›ü¥kÓÞ·‹tîͱÒ5ÚqéC‹tG«6ðû¸Â5i£§©DxŽâãšà‘•cèð†¼¤’õF& 6=DQ%¹4AŠ4çÒ2Lð(鲤½¼…þdÚ Ù[–#ýÁKÉt Yr©æÊDÐ÷-˜¸¯fðçª9쩹zú®žjVVr5ªYGofj.c·¨™ähu'2Ò6¤i[ Œ¶i›ßi¤mÛ¶e1Ò–¦Ã…ciëuH™'ÚC mã’õdB*žæ#k ¡w®÷Mirn†pã¡+(åý[,ƒ ½ù:ämï%Q#¯C”2oX56åW™Ãy#söå‡á¸wùá&öÞ“ßÉu&H§™ü,ùäA}Ãg&>I÷ý(¾2r‹ø MòxRðÖâ3N€òÒ§Ù!`ïmŠ8¨y&”ŽPê 2í˜x:JO(óõ€rc;flû@8§ej½0­_j¥Nô\=-ZAüïT+zO+Õõ¹zP+Fšî™Êg¦•T·ó…ªŒÜ¢",ÕÅGj…BÛ[PËð¹E/•±~>cuÿà §„&p”öûìâÉè¨ÈÚrtÇl€¤*9Lˆ”¾±@ŒÑê© ÜÔÜX—"­ ›Ë¶E¤õŠtogcr}.[©¢´á3ŠTÅèÓáÁk.[Ú^×(Réûpô‚&–’éS‹@Â.h丠Šr\Ð%î£~›«G¤„õ½®A#R*è©pÒCefAÛ¸g|¾ö”AEÏ+ÔÇû{¿£\'ö1IßȾ}£ïTÀ{7„“ëLÒ^¡€ÓË”?'&á`iPÂãØ V‘ô üq¦‹ÒÛ,“ŠGCƒ2îaÉXaý½\ÙÓX[Q¦XÎ)Ú@HæÂ½Ê»ñ¶Ïÿ¬²º>§(2XGjB#¤—¯)ãØ-„$qPÒ;’ÞQ^DBC !Üÿ_®î/Vƒ3ç\ ÃÓ;eØÞ±ˆÉõ9çažÊ–òŠ1Ìú˜–¿kιã‘a.m»#æ”N§&†C ÃÈþ©ù‘pLseÃL«Ø]®•4•5˜Œ£7sŸ‘èý3Ï<îm M®3ŽÉi½ç9¯#5±ˆ3²ŒÝÂH(*Ç2Ò=¼l52²Z‰@Vž^ã„õþ³j:¤1•ÖñTP·`Mïõ +n ­è$ßm¢NæÅm0=µù£öi"–Rª,˜‹«EJèнKIß¶ž­®ÏÅ…RR1¤7;&)“’P²ÇÇry覧r*ãXã»ï{´Nà•cõTkæ×†h\Sl¤J¯Ž–“^³!YiÏÁ‚ê?‡Ç{Ç=jü+›ž±1H¿Á“þøž_>ÐŽcÉîËìx<þ!Ø?‡ö´Aÿùùršë Ýæq´y>¿VSÊV¨zÝVÄ‹ý—Ð~–Ûù´þø"A¶ÿy£={1Ï ó“þãÝ;âß:f¿á—žÏDòËmÏÄ3°m|3à)ô¿ZŽƒ³"è^ï½å·@Ÿ~ÃAžtt¿ê¥Bö`W yÞ+Ì{Ò§7¸1ï 7ä½tøL{{çyƵ½Ç¼7Zò{DÞ“ÞæšÊ—^låS³²}°2 Îä,%7d`†ã7˜o“ YÍv–ÕnÑÞJº0Š^±f½·òà8ЉáéqÀ¢YïýÌ:dâ5Z>àv¾]y³êŶהKCOu7{ýÍî(ùe'œ5€I?¥Ã®|u3.ysî,íú¢Ë£U5³Ä y4ýžLÊ65Ž–GÓé^âz–YOÛõ3©3½õww@ùõ<Æu%iQªM{!£å°–@ŠØn[kyM-½Më—‘-`U²iÅÁ>g Óãų†t?lž†Y&âJžšo¢Â~*FÀ÷ý3KÕT¹Ž"ÓMúY¦›b`ºÑJ§§½× %µèF»Þ¨;×v>ýÐè¦XZtƒ`ïR7lÕÍé`«n,—Íž"ê$Ï5Ò¢„rßOܖЍ.Î5‚Š €é]IÅÀ!ˆZ\eìEÐ÷8ýP„¢eX3EK‹"ì]*¢‚­Š8lUÄØÁh*nŠ]žùÇÕ¥Ôf«NŒÊ©ô˜««EKèÄ}ïö-µT]œ« µ$ŒæZ*ÖGÇáÑpí3öBei•M¿äèN—RS¢:ÄT¦úrôôës«’÷åç²"å#£†ßJÖ“{ëûÊ{Ÿ]Kö2HÏ{ü’yb©¦¡`ŽÃQ-’µ¶óÓ/XËxyžåéd÷ŸÌ-çÓš·©/ÝNZßýpnIïéG*¿‚Á¾Í—¥ùšF(?æG¤‚_æ$Š:$WÆò ýJ %ˆØ…Ú¬S)ßÒÿÿhØ0endstream endobj 588 0 obj 3727 endobj 591 0 obj <> stream xœÝ\Û’$7}øˆ~£†` I™ºAðØŽàfÀlD»Þµ½xwÇ^ &øzNJ*Uª§zfºË ì°{ÕÙªLå9©Ì”j??˜ÙŒüÓþÿáë«òǃ=üªúôêó+Ûþ`šØágO®~ø æç\àÓ®lûAt‡Hvö>ž¼¾úóôók3;C”ãôêúÆÌDxzŠQ&²§¿ËhŒL1Ég"?›§'ëï^Ößùèâôùìcö>M¿(ãÞ0M¿•ÉGþ¯O~yE r =y~#ßfȺéöúÆEÌ€'?¯s%"šþ¡>7=ÉÅ0½hNÖNÕád¡hÕߺœ§gê—/Õ/oW‘Y W»Læ0HW»9,Nµ‹cN‹]X»Þ}rõû+ž?|yÁbÇ8G{x}åÙ˜Ùä>òêêW™óÒ!JòÙúÀ92˜÷²±³•§-#Ѱ™C}ÚIœØt°v†Ç¬Æ‰õ4gö˜”g—XÞs]ò ‹ö´¬ãçiz]Æ=9çÅ#XX›¥¾$Ž#á{¥á2²CCb7³9Òðõø ]6øè§áWK&¯o‹¶6phØm⟉Hðliú¢¸8ùx¹­¶ŽÓô¦ˆGö¾ÛYÃÊÎeDÛÙ|°Š³U>]Ÿ‚¿xŠò)æö2rÿŠ…MŸƒ™¡èå+Y±?\ßXø”`ÑOSÍ-ìô»²J”³·Ó¯E(g;½»w³­7_˼€²Ö3œâúÈ%Êz†ïŽ”}Ožn)¥à÷8rŠÓÅGЛyjFËÓO…ÍÖ$G´bѤA5`ÑÚ ïQÖɹQÙ?j KÐüádº)1Ì©zÝX Ǥt¸± ¯AñÊ/vt—FŠXÅ&@Û™„Fƒê×™Ä ·ÐœœÉ5ð2(’r'K¥œ3!M?Z%Dë~àBÔCÙÎÉ/aŸkØ÷&¥» ê&*NuW’bP„H}Ä 6÷yC¾y2G j#{¤•ý*Ô•í º\ÙÎ ­ìÏûÃ]CŸ G¤L‹rå‡éO=ßß2zaZ‡Ó1÷pOýpÏßǽnâ15÷ˆýȽ60pzɽو‘=ÜÇ—íþ«¤žóvNS¯ì¡žÒõ«d^×µ3ïr];ó”®ßñô7﮿ÕÃz×éïÒ´#o îƒÈ»Ÿ¦j…¾–†ûXÚ-xÛ,\XjB˜É)–¶ÍRŸ]ÂÖ¯YÚæ)kl˜9@*ºÆ#Xó}¤Jù„úhÂÅ8HÍø¤æNguÿîèƒo(`˵´lm.®ÏŽ™}öÀãæ°˜‚ bÙ¥] ¹„is9Dõêe˜å)OŸR°>ÊZ‘m‚¢ÏÕpEr¦¨fc_‚@5>!ð³o¼Î3p¸ŒÎ CÒ(äTI»ŒHþ°”­£–3â+|Í6—Ùcˆ¤Ï²ŒÔ± ÐÓR SÑ u.ÜLPY¦˜qno¶1ÖúH¯¬qÙJ¢¬$,nàÑ "ìÅ)§e¾„ŸŒÛ|ôx‡ 3’§6ßOÖ|s·ÎHÖcêÚ¾bÿ}£Æ_Œ{ñ] ¹ ã$—Àº&þ¡í­ mý‹Ñ®F#¸¯×)B²} ]Á˜Qz£ÿ‘j½_Œ°“MÁ_t˜ ²@(³5qlã…СÀ±²asÁi“|¾Ð‡NùÊŒ{ï]B9l"î°R´v¬Ý-znKë)‡‘ÄHyÙL–÷a Œ¹ÑCõÙŒ¥)©,2™ ¶W?`ϦõÙ=¥Ë¿í’,¹ÏqÏ{wÓàòù•ú\vÇlöð…n']Hð˜l—mú¿\ò7”ÍIƒ“±ÌEì_k¥3N¯; ð'i<¡pžDì!’7î#e§s¥žÐR¡Ô*ZêÜÆJ™)S C\Î_®: ¼–:N1îEÕ é,¥AAÂŽnF1ô$-Å’„Æ]f` “F3ô†©×ýägñ&“äC|æ 㺘}¥ÆµÌ¿UÊÞRy®‰ö@¤mÜ0£²~\‡9æ V›mv¨ä€Uê'¹7%qT@îJsƒ\ð’?RÓ]~ÂrÆ;úI—/¯N¬£6[}^m’²Ôj ¹ rÐH!—#fÔ%cJ’»Ã&L8Œ6m­;‚D)ÃôÓ%U×cQvP%eнkÝ1¢ðѺ?¯°fßó‘"GíŒUq’´š´JÀ'ot4)†y—â’à±ÿhÍuü¶‘‡´hÖéÖÒ›n½ÆÙj;ÿG•@¯GÑ:#[W‘ž$žÝ`3Ä×±F|Ýýç5ˆ‰J,„}«v ·'"Éó5ðèŸ6óØ’h™âvÏÀ¶žAY­G4 ¶7¨ üˆbÀw²3c¡—?—°ž=Ë… %’Pk‘sc:JMTИAv•xrk‚7¢òмr6B·*‡Œ$J¤´C_šJFº¬´Ã0®ÄKm€vÔx'ÌéZñÓöJ|Ò?ÂکɵüóÊ$äÎň…$x]º:—,ª ¼¹–†›²õÓNqNk§ñüfåâ’s nÝ DSzkŸbÑ}Š¥çAr%e‘Êíw¼ö)›”~¦¬¥ÚÈБ̯^êYF|°3§KÚPe*ðŠ Ã¦†œ¼jLßži½ ÎLÃÅÕP~}"u‘—¸€H5ì0‡¾j£eªS§ZiíHÄCﮆ¥‡­®÷œ(‹à™žQOÇï¹]ŽRÿéz±µ9l8Õç@“âœþ¸ý]ÕÝÜG”›;d(¦.U!ÓF)¬S¿,V¥ÚÈ,#`€å‹°XˆçÞ†Çë"ï×iÞ[Ï(u'Nwݵø;ZHãò…W·Äô0Ý*>u{ìÄųmd0PäÜ·‰Í³{pÉZÄÕ쪫µý ÁÖ¥M¯¡‘u? ;'úˆâDç—3IÓ«h‡ I¾Z…–ÍA…—Š‚(7¢¤ò;(èän-AÁw4Ùôj|»GŠì3ßEñq9@·E\7‰K²^ò¥…ê]ƒÚ»,ÁéãUÇz·±‡sVjIñ˜ï«ÄC}ÞÔÖ"Ï>O›åSÅó/弯¡ŽÞv ÒMdîùQ€ïì €Ëð–ÛÈ ¬ï×Y«TÏÂøÕí>Ä#Ÿ¶þÙt¶OZiŽf=+øàÎæAÙÏáA’Œñ‘8\`Ñ,:ÂØVTÐ ÔFZ Ód C‡/ºÄ×ahQÆ$ Õñ¡JUÚ±€‘ ®{ëÿ+îtüuq)0úѣ⯟3æ>7þRüÚãobQ@ì ¶˜Þ ¸h)›“•fë*µŒhèÛ¼: }9h\¤.„¾•®iÐÿRÕŠÉrɳ5 4=%‚ Ã;%—FfdsÙ†ÿ!‚èåeŸ|8¢{0OæsIi¶Ÿu²«¶_ªÔ_ê’àö~œÜ@éf~û%Á™gÛ ê¸TÛ¯ŽU°Ðž{{]szpeÔ)þPg®–ºôðô¨¸nÇèޅƈ;^ÇÔ¾¯¬ÞXò¹®@9¨=§„îÂ-ñ{¯}DÅ׫cyiMÇê6rÿ±¹ßŠÂ8ÈþÉ5— j,•k }–ãôÉ‹º³Ê…ê·¬r  k~½‘›Ìñ|’>¿tjY.lQ,ç# ùoåki>M·¯E€á7Ý>[Ÿñ75o,Z_[¼U`}Øñ«“9|(וR)´­ÙŽ—v-ë´ òpÂ*söuc/¯¿–[RÁÅá0ëø¨äÔy¢>»Õ§ê$f=ý`< Ñj³\ÊÌd¹Ó­E’“ñ+Qñ9N´5¼Ù^õH<÷8lT;$š)‘hKã|‡ÞÑʾ5*~úÄ®›ÓŽr[Ž8ì /W»ÖιZ£µvåR:i©…÷X&D\g¸ë’z@£rÈM—À’„«VD’Àš—k^ˤrd‡ærŸ0ûQó÷ì:¦)pÓ2úlTß<ë'Cê õĉ“:ÇÏYNí»ñX0–K¡Êx’›£µ píÃŽ"9ôakÉ!a‹Z+¼†¢5—·ÊSV2dI…–K4GAŽE5ÿdól[ŸŠw‰UïY1ºùläTMëïs˜³örJ¹°C¹ÂTÁ}ñÊG¹¨«Cɹw 5OD#f’\EÙ…™$×mâ¨ù›ÍóWI.-b”º:ÉP0 låŽÆ–—ÆH‹Èëj{6ÉøÄbbom*×ÐËØ öÆŽ;ZIsÔjS–)÷¨Mr·âhOчÚG‡×K´i'x¿œY;ï¶G—¥UºjÏq´,bo‹ÚødÀ‡=†%¹ce÷8ælm½1°y -†äZ¼–‘ë;{h‹Vøëôêm[¹k½Ge^œ·j|÷6†K¨YVNÏI¥~ÞGì!‡òF“½ôÓÝž .GÊÞæ°ÈA^–•÷o„žå–¥1åÔe¤%ç5_WR¨|˜©³Ós”aT&•[O4J¦×Ýûl—×/xÔ+¡¼¢ôsØâ‘’TI(_¥$«Š~—ò·ÕÔ)V+ÎÌ¿±cÍ£ä-µQ-éµê/ï)zy?qòò’gbU^ßÓ.Ð¥ÐÅ%’šÊδZ!q)¤ÑÖëæÑ¥œD¦´ÇTÌ0ËåM?=2)·1•rnUËa—ã0èåœôÃÒ ….Ä]Ú;¹}š6uçöâÆáòYWTk¡µšç±{$r>ò1‰œG‘u(÷°¹í Bßx—s"Ò¬YØHì1²0–Ž•XîCLÇÈÒ¾9Q©û¾¦Üt_•"Ùw툒·_í þ»¼Gu¹¯ëë—®;9)¼ÖËI=À£ò޳¦Žü=\r¥yö$%A<½ðëCÔ˜p> stream xœ¥UMo1 ½"ÇôÐàï$W>€{ChK¡Ð¥´ñ÷q&³³3¥E v¥ŒóìØï9ÞË ´ïô<ÞãkÀðl^}.œ^`‚…›áþk25U#“°9prÈ2cRµ°ÙoãÃHÌ5ÇóƒCHÌÆß»U˜‘süÞ¬9 çÒÖÌškÜìýκŸfÊñ^[k®ª%>í Âñe[0b}·y:pñ72Ohsâ9¼ªÔd%dàÒžõh³á_07XLØNÛY2$ë§ÝÙ'XbrÅpÙ'¨œª¨•Duj–­\*Zœ´÷##âî%nG»2‘6EœX,Æe¦„$³ï/2ÜYþ#CJ72|´8¾·®€/5»®È`Þ¯Wc¶hbSïNðo b*Èñz”¸h5YA.zK#I‰_GxÕ¹Î.Ž,êÜY–uNšš³˜p¡éΰÒ46¿ío*ÿ‰1åÛ5õ¬âé•Ö¿cÞÍÏ%E¯¨UÙ™ŸF¾0c銢ß+íÔ9C¸£Ž3YítªH»‘ž¨BµvYJ£nº›#öªí£7p:bÛ î¦ei=Úüy`<@ªO•ãýþõ^ÓßÕ˜9¼©ÏŠi#J´$º¹åƒ€–œ0óO‚ì õ˜:[:J‹Ïˆª²ÏÎêî.·Û5«‰m :vû¨Y/œÌpš†Ù´õ;ÉT|õæÇJµÐní3ˆgvÐ'}›T‹l9c"Y×ä£Í~‰òûá-°Bͼî8\QŸW]o뮟 ‹¹“?Ÿ&·üß±+ ÄA=Yó<òGýï-K0/gf |ôß_*Q‚rendstream endobj 596 0 obj 717 endobj 599 0 obj <> stream xœ½Z[s%5~?¿¢‹‡¥³[ÇØ’¯¼,0EÁpˤØ؇\HÉIH ø÷+_[}Ü}&“­¢˜bE–uûdÉ=o)Ô ãåïóÝ&ý8¨á˶ºÙ¼Ù¨òƒ,lÃ''›ŽÁÊ!ˆ`Áêáär£ÊƒC%Œ±ÃÉnóÃøâH ˆÁ·G[)-êñ”¨Q¡Tç4:׈FH*‡Óa¼ˆÆïaÆ}×ÚJ'íxenÜÑVIÌ ‹¹š–?¥&hÿß“/6¤‘°2ú'¤ñWñ—,*ï¶àèlÒ³háq|dëb‚³Q.¢Žv^f²W¤hVBAãÛyÍvÞO,‚‘ÙN~þ[¼í½Äd/X(>°†vF'|z²ùn£…4ß’âè2ì6FK’åvóz=)””¨-ì%… $<øœîh«2'{[)TÖGo#D. k‰j5³Û2ùZ+0ûÚA9”}í¼6 ÈÔ­Rk}Ý6^çÎyO!nðöìë"í̧銫 ‚5äê"Æ[Œþ¥54Öð­WLzr1¦.þàØh3(%‚1*ºÇ‚ ´|µ9ùçãÇ9ñ49gXY?°õÏe-m1¤¬ËkCÏ*ú‡G[£@:ãçŒüc¿cô;F¿^¡_‘Úß0É„Ý`Ç×½’(µ)¹ W>ñïñTCþ‘ORÒŸ2ŽßØÎkF¿‰ì”“Ç/ûCû#£_ôÊp…?S8ÖPZ?lRhsyñg?ôÒk, ‰Šá¾ì=YmM6!ŒŸ1–Çeg6²õnÝÙmýÀxøÞÛI`=^qÓ‚û:xÔÎýg¶.I,ÔâÜõ°"þ¶ø2Ô¤ìlâIÉóà|…ÿ±ßËýW O U3±†$CkÔù~]z 2]X/òE"¸zOqÉ} •§«y–äY×+ǯðÇ÷åô”åZeŽYòqÌñt?Y Ç׌ã´wu'‘;žž§LãÛ©F¼Za9ëEò4ìøó'ž¿æÕ T\Ó9:Ê_¢_¬Ð9?/Æ7lÍ!v¶^,ýŠéýÇ <!7Ê@nÔ#2r`[ÃÜähéKv ¯³[F׌.]Îéõz9^1è÷ÞÜIøMÛs͹Ïw}t©xËèŽ]·—ÇN¬Ðßáf:X¹?ZÉ× òüîdŠnö D½©cö¡ˆMwuqmjcîÙúbžÎõ®~ÂÕÇYx 9[qþ}«>œã¯©qù‚‘¿eÞøÏŽ(0Ð\ 0v¼q à–åi$wÖÌÎS=où HÛf·GÁæ ÊGœàµH þˆ}Ó‡M´M$')ÌDÞRø uÉDh²ÂÏ9ãIài°™ñ9Ö*Ü0ÅÓ¤x¶Ø5 ‹]Ëô®qå<(”gD˜F<-QPÊ·oÐ0ðýQ ›²¥F“äR¨Èźb·ìã¸ù˜à]ô4š‰šB5ë(•âC nõ9nT&vW†D‰ºdQê•À;óCA 7¾ Ú!ýžiØ(Ï×)‘´ÜÓðå~s!“6¸¥È&ö_§ XÐn‚Õ3–¾Ö9m¦Àæàhfg£0;kLqÂð˜Â,¦dÜ·ë¢üŒÊ $á[“2Ö†‹ÇRâ:k¼„b^FúÕÊš¡ž_æ}¬›æûÑF¬)·ÆXsÍ;Ü"ÈОf(vüNËyÒúÜ*eŽÅ×M¥ÜÔB~»Ò—\1:_ókþn…_ô{»^‡÷û¯ÞQ>òÞ½^Jé‡÷4.Øš7wç}ãÆ&¾<åöÊu#)?wñbli ´+"«<¡Ÿ¨f Ò^îÆ";r)©,ݘÐBG<*ièÖ2’¹Œt§p.J?çf\ï È:U! –°_ãÐÐãg7ï9ÃÝMNæàÝŒe¦Í³ÊÈti0¨€ÓÉsK 9 ç\Ô¤˜9Wuóí>ðÿ˜sü-0Ÿ!ã²Gïæ;˜sH29}B7Wí§8Ohí|ë…RBÂSyÞ½]‚`ã”{¸]ÂÖ.½`MïzxCPn^GÒ·G'ì±\LAãÜùžVNùY×Å; .åŠ]È{G‡:#B”5lÑÒ–ø FžßyaêRu|„ÿ%鵡)Àã doqÂ<ñm ,¦vÀéX7*%!,Ñôtá¿qéÈÂÛçÔç¢yM’@)Ÿ£yÙ¬8›+Œ6ÙÅ —¿Èt닌4.‰ejM §ïò—‰`íSJVU m=¬À+žÒƒ]:_›é;¥[jÖRŒjP¬rHUÎÚFIµ0Ѩ|A|°KE.|{<—k!*ê@éoúuªÆ3ZABí¬žMXZëVë¦X/ùÖ†ûíò·&¥<Τ¬À°žšÖ…_©ôÒOEtê-§&}ÀŸ¤ô§ÆÂ¿ˆý­¢Ö!ºs @€a¯Æ4'“&-û”„Yš]Äoq¬'î]$;º¥ž“æq§©oòeghqüøe6Rú^O0{9¬°à9$xÂófoE“‡| ­óvðMr‚ÔzÌgBíôІ{Ÿ‰¢.ÞØú$ ‚Uk®àd>oœÎuOŠÜëŽdigï 1*ü ß ¤ÿò„Ä©ÐZKöTFQgÿN€2ÀøJ®/Ó·yÕ–­ÈáŠþÿ?W`´¹endstream endobj 600 0 obj 2183 endobj 603 0 obj <> stream xœí\[s%µ~wåGœÇc*gÐ¥uKU^R Iëª<@¼»à]À6,»@å×çkI3jÍ™9¶ÏI¥(`,÷H}ýº[ÒøÛôNñ?õÿ/n/ò;½ûËôôÕÅ·ºþ *ÙîwWïb¼Ú¥!yãiwõÅ…®/³ VÎùÝÕíŧûß_ªÁ(kSØ}yPƒµÞÒþ£d­¶aÿ†@6D~¶Ö J§‘"PÚ¿d \Œ¦£~ÁÏäUP~ÿºÌí‚ û[¼ª@l”‘ÓÜ´ÇÏó›.Qü×ÕŸ/ÀÑàUûW/Áñ_ù—Éx«Íþþò`ÖŸ•‹h­Ý¿ÏU*k‚çy­¥!àÍ/ÊpÔ`´0¡MJûçâÍ×âÍûF2ˆañ¦\ÿ-äEµ§)Zð¦êÀ;¼ÉJøÃÕÅ?.hPn÷ÃE0 v ‚ìn/)Ì”¦‘¯/ž­;…Ñ+Ná&O±8E`&ÌEEÚ` ··ËÃúò µcf‹m ˜¤-`Yrzÿ–‡uÐΦý+~öÑkØ|ðE %õÕá¬>JÐ^œDð:ˆžÈO>Ø8Xbñ•KCLÓ‹ŸÀM„ª¼6zðTÓH€ý+UÕfJfð xí‡à@¬ƒÖÓkEàÔtTqd;ªU½ë¸ÓzHÎi©wL1h"žb `‹ò³“^‡ýt¨½#mÇáèm,ú´Ñ&c&Á{ô`¬d»,&sªÞA%î†àY€–Lõ á>˜“TCØÝ²O²¾“r ¿#Å7E|C¡8pÛ¼»F!‡ß6—鯝…æ¾æ#øÙé,<6Úùï§÷Þ-³šñE'à¦e1u*È÷ÑÅÕ{ŸîÿοŒ(¬‰J¡{ýMáÒ*Þ›Ž_>¸òþ7—B21ãàÄ?2sŒ~zÿe6¯Ww“¼èµ>ñ2´õ*$87,ìáüÄ{‚Qý4A!9NŠQDšèˆžŠ ))æ99€´õ.@nÉFÌ2 ƒì!iBÝñ‡ÔD¡Ž !8Ú …§ÅÐ !Mñce«bÒ’õ5‘&PÌöZÖÆ«éiÍçÖ&—ô/Ǹ=ó•b ™%t.ôn"¸å'Ea¬>*ÁÝ¥›jx¸\MÆÜšèÒ¯«„ÌqF&x¤s—Óù”º§‘º§2@ë0Q•2 ŽH*—"CÕY* ÇÂÔZ” "Äê9y¾ŠÏì\ô(˜ªßdÂÏh„“šÌ³"aªcù~9µ¸Á[3ÁõÏŸa%Þ- xÉÛäì xTEËl{›5D*#8\Î\pÔDé ¬ éVZÞ<ͧÓe›p=Õ8ùmK•r’‹©'Nþ&"ç^ÄøÝ<®[´s€,nl\Ëâ²s`—.Ž©¨€¤S¦ýxBN®î=¢; W¯Y±"‰sIw˜ñ²äq¥*ƒ \ÞvÕÀ«.Ÿr¡Úyÿ«6*Ó¾¯_F~ÿ¢%r©‚çËUDÍšÓ}D½sþ,u$A^Îr#ž¥D¢¨x€Y&_X?×õ“÷­OhåòoVrÝÌ« /ky¥áü4"p~Ê„b"ÊŒQ:Ý`“$ª#2¯P@܈¤bÐ4Ú¸)©†‘ÃK¤ý‘*º˜R—`dY»E´ V&že\e\¶ú¿(Å8øÃO•bRti«£*aU+Íué«õÇ °Š8Ak]+ˆ^òŽ×,Év âd´n)B.$Z½(Ô ~$Â\±\s%ˆßö*ú?ðþo/ï8 Ýk; ~D²†Â'¨8Â+HdÉž<Hκ¥@ ˆ!gJµ4ù0kAÛdòæšå¶åEæETª"ÚÀõbݰ5!ärP±ÓºÈ-:{#i78[\­BßþµåÍßû[&@æ # T-ÿŸ·•åj÷ƒøáèUçõÕf¯…ïÏà¢Â ûë›¶îçbžAЗeƒUp»c6ËR«ó næ [æ)ÉÅ¡—‡?k»ZE»Ñ×½óB,´ß­7½7ùšÚýÿÞ<ÕS,š5¸lï.Zˆ‘¤nì¥Xïñ§2+k“6œ!ûµKÆq:µÜ,|O£Ù==†qûrìÛ>@· !Ó§[çẠšç½<Øzµ ¸•ÀQÙ›$“·d†‰Œ]J y=9.«‹eFà0GœÌvFêïýÈHÙŒùÓƒ¢;‰j#SåÑKuÚi“÷{¼S¢0yIp0ÜR‚˳­n -¯W…œH2&;"©š*uòº{n[P×Ù·­BºŽSý#Ò‡\}‘õüƒ°aa–1~‰õL^r¡7îê€kñêitLH­Ç, ã¦GqpÈ 3&é\½F´EÈ-¬DÃJÌ-ؾøúÉ úza Y.qÊ÷ûq?¶|`)Ãûšr­•ÍA¹ìÝÄ,|¬C‹U—·K^)>n% rüeÛ·<ÂŽ<É÷vä†Ô|»£„dŒ‘¶¶§+}x-Df ÀQVBuƒVy‡«+>F%øÄ@ÓÀ- f¼Ís¢0%‡]¯ð|ìB…æ4œ°»Â*²åªú^¼\}Ñó™_µ•w+ùnœ“'²Á—€'˜ÁÄð¤pOúúW¥ƒ1ËjFZ1PÆŽŸZ>QáÓyhe9çHÅ„¬XBW™½ÛÜq¦ÆG"¾t²šòÜvwùwT F‡¤HÕŸ|dˆ‘ût'ᆧÔ(¤¾™âhÍ%dL­õ6íÜB†îÉÌ 8û”$ŽûO²­½1]û!?+ŸEúò²“*mʈþÄe—ë“ÅÌQ}†:؉MN vD¤ç)ÙÑÊ#S1–å_µµ´ÞZž+G½\mJ°8°ä’™RŒBß½pÍÁÐJÝöx+­»’a”ùé 7EåöósinŠ+ŽHÆeÀ±4߬™líÅóÉÀ-§ãvv o¸óNV'+;7Ë€–Tл ›‚Ζsä|Þ:ŽœuFL|× SS´ÇWXfæHªâÇmÄ® ;h4PÌI×Hý|[÷¢ÛþRÌ[& Ú-wÆ“µRðÈóhi‰÷sS¾¬q M#åJ“†§øŽ aF®£zªM•ã;„˜Â ÑÖ]ê•’x­C‘Î(Q@”ÐÍ1 ª(…àB6ìD…vÓEÃO[$%޳^Гy|9Óz3yXnƺ–K AøÃlâå_ 3æ7ïû² íÖèùÂ\ãÛhëŽoŒWlGŸ²I:¾ ByŠÓ,fÂ#ÓFrO’/k¡uÛso ý¾ë¨"+h÷|›.¹žûÇt0k[.’fmÿ¶m%¿kàúЦ®I)ñŒ&>´F|'RŠoùæ¤ ¼Üù-J²|Èù-&¶HÉHú’/ðFÏ—Íu{’TÉ] Î9Ü[¨8¥žûVî­íÖLMçHB¸sIñ^{'ƒK ¤ò– ¼M2x;˜ìéç[ ð•U>eÝ@}øØhíÌ¢[ý'z®ã{îïËé|úè Míèâ_¹n,‘Ö¯v,a áÑÁZ´)ép A+J¨:-¬³÷z™siy˜q¿BǺM<ë&ÖѨ8Ë9kM(ñÞµN¾6²Æ™e@¢`Òà:»O|…µ“. û…NQ!@6 ùöºÞb$ÕAÉPvJåMÉÆøÊxGEVfÐ3˜Ç€ú)-ƒÆ¦tà;[˜¦jDÁóŸÜ4.P}Q‹hÊæ}ÅåR}t;°3› S ÔK$yÄ—O¡K¹Ã3Ô¢¾ú‚Š<ï8Iª'õ„”'|¬~ú’×âîŽØóù« ÁŸAv 3)¸üb„oT\~·I 䑘§R<±bG.z8„_Ï_I‘ g¢èøRêæ§<Ó3/7ÿ¤ duvc•P¤p²jR0BùØËšBI'•a„Š[D5|d§G–ï:ÄÜ6¶ òùŽ/cx/6vTH|>lâÞ ÉwqÑP¹Š“e÷¿`Ið’ýWkËšx¹´ "ã̓È8ô"ABáo|Ò&(àðõ‘6'ðµhéYH'zîY‹3ÏŠ(9·y¶sÏZ;ø­R«XúŽ$=ÆrúÕ½ÇXÐâߤ-¬c tÅi‹Þ­áfÁI¾øIQÏ<Ãq’¡Ãß:ÚoâÞr³Öß6󟗽ʤ·f·nª~ö`ûÓqY@”õJKu 0TÖçM!:å‚«§Ú¸Ma…)Ь䦣ò Þé?æÌŸæòË÷§QJæ]̧}ËiÚ·œç[›”ìxµÔúuù¶¼˜?î¬J$?ö´õ»OT-ãU´äÉvŸ†.}ë™(1 óÎ]H¾ÅNåšØãh²€ñ6otÞ¶‘ÀßÊú³¾Ùt|8è0)ôX9ó5þz W~ÏQ®›:‹¤0¿z[ >N#çsÈ%&©‡ÈONŠÒ¹rßæˆ3ù7í+Ôz—ØÁŽI -§ ÅúÑj ׿brN#BÎѦ¾]³ièlJ)ò{·GV>}Ipå;\DÚjH嵸)ˆ²+éñ2q€f,ÓebqÅùM1ºÖ£êÊ-ä·E£ŽrFJù÷ÜPÝò—(÷Ý}e˯¹ŽT\h~ÞxëÞ·­ÜAœQÔ)´ŸæÈv?ž#Sß7Š×âEy…ZL"?;ßÌŒëçWO¯ŸÉåJÇ d¾N3ÀRðÕgb`ÎZž+æ+áÙ”Üø5eY¼š‹ÈÐ#â^ù..Ç©gö½×é¶TjR‰v>óâ23)XÏ rŽü~¸å)çÁÝ…©ui½õ½³ÚЦ|„«+O(LÿBEí™î–CÅ­ªÅ½ŒQÞI¶¹N$˜Y0¯³:ÐiÉè4³:÷0ã¤~©`v¿ˆ`_¶ j€Ò üû·-A[cÒáÜ>¦Uä<%5ÍïÅñ< ?B“htþ⽜ˆ¢3qÓH¡â^Þ—T“b'%vʯJŸ‹âÎñëÀciÖÿ†‰[ú&–kw0ê .ÿµ˜¬AÓþ¦L{°yƒÿþuˆwendstream endobj 604 0 obj 4022 endobj 609 0 obj <> stream xœí[[o·~?í8èKW­Ãû%Oun7H¡/I,Ë–UK²’XMüïû ÉåÏîúÈR €#¢©áp®gÈõ[)ÔVÒõçó«MþëVm¿j£×›7ªþEV²í''›¾Õ^n“H^{»=y¹QuAÐÛ`”pÎoO®6ߟI¡¥1) —G;)ŒñÆÏ0kQ& ?ÓlÖ„Hccœ* §4í‚‹Qe¡ : ×l¾r 6 ?í”Þ¥4¼+2EÕ­¼µÄ2-»•çÓðQ[—lü÷É—ã¬p¤ÖÉôøý.io”ÞítÀþ¬l1Ã-W]žØb$¢RÃË2”-2(š²yå[ùf"lzüšÍ3îÕ6Ðg´Áoº•sÛä•çÓ°ØÆË =çó“Í?7VH·ýe´„ÛCAm¯6ÎJðJmæróÝz ©¸UVëõ^ ùæ)–ŠP@iÁ‹”2ÊGrƒÑD¥áÌz«µ†Ú0;Á*ŸLqBp!Wœ¢uZAY²µ‘œÐ^”…!Ä@»€ZGÄmqBe8'ÞDø€¦ †óþ‰(´òJûâë“OýÊ«LãŒóŽ/=gûg'(ïCpä2 ß*%’C Â€¶ô盓¿|?<¹%6šoKø¾*³^ÍÊa"cÒVúš”*i²íǰ\¤ßèáï4íµŽŽÂdZZäÒÞ«ùZ%DSO¾°“‘ÖwKß2 ŽÁÆ$û_’Iµ´±§æ\8÷«b»ä39B !†¯ˆB&“L¬I¼‹wÎò™MtÉ7, VwrÈ,—ÍN>Ï31™á»fèo³G­R`ýEfae’eDAæa:*¡œvcnÏëÂNC³çL¼¬ŽÉò­™ºœWñ’«gUòªxVCÚX¢¬.í=›¡PkᓱólÌ™„?äï<ÿ7À6ä4U^/íh.qè ‰1m¤Ç¹RE0À±2k ŸošEÍðŸ‰àý±T$ïc©‘³_gL +üRTE)׸ªŸœNKêgwqz¦èAõɃ»Ñ…;üt:G~’%³Ê!xÀ\OÁƒaäI C¼ ›þ±Rƒ Œ=5@tSÝ>+±Ëãh‰‹ñKbeØxQH äh:GfmÓ›–¶{‚ÄÙhp„aéÉÅÛ¤–1¸.mWÀéfâÂq`Íû\†Mg$¬°þ Ù>Ÿ÷à4x°Áq«¸¤6[†œáI¶R©…†#é*%g[Æ;·fÊQ+‹c?*šÂÕzÜxµÌ * is|䘈x²â(%£uÏXÂsÖ|¾úV'@£=¢#ÖrÊj ¹SßqÂt‚·ì,iXMµSÈ{MFš»ÊI?5¥&ˆ×â{ÁS”šœü˜*§ ,ÂÛ—tI1tç0ÕMPW&µZ,œM›ìÁ­Œ@è…³ÍÚö…?…y,”1d×ÔJÝsB0(C°Z‡Ûèç"Õ4w‡‰€Ë ZÓMs&§ÓJn±5ôzW ¢@þjZÉ©«àŠÓoÁô¹ÅÇ×վƯ%þY—=Y7#:˜YHìüjÍÁ’™aBÙÛE¼å,˜_—N$b}^5²ˆ_ËA,ã^¤®qäý£¿­¦EJf„´)ë^³møé‰8¿í¨ÁóGìgGÄ#ñ/2íamö¬ã§øZ5sÀ½¦²`l"ov£†]Að¯£\2#æXdžmÝ‹Kˆœ.Vüim’WµM2NkŸÆÈB«'’ÅŽÅÑÑ•ÚÑ¡˜#B ·†'7]å0 ¡;ï$s&ŒfÙ £žd¿@ÇÔúÉ$+è8Îhägž6i\‡ó8¶FÏŽMT5ÕA; |"úÝj‡•F«,µX–*'$3a6><¨âòF"‘#õ¯êó„0‡öªh4íÝ“§þi‡²”9)ºC=ä¬dâé~\bÍ3ë!õñN“©×‡š‹»ëS áÁF¼Ï¦ÜŠiÙF‹ äQ¼¨ß©Ö§ }í¼À¾žÏ çsüuÿË‚_ )m!Ÿf ˆ.¶[§‚£û!£°yìÀ$;Ða$l9æÒHb¨L9 }|jf]ïç'}ïÞÆßýÚ¦ö±ÁưÔÉä %^ñ°Rƒ‹À¦šÔüNæ¿ÍŸËݤT¾m~¦3`•ÆÉ+6ÙÃÇ›"zÙ¼R¯mRB|»\rƒ×–ãΖ{%W)¡Ç+(â÷n^£”«$*yƒnMS»R™_¢qåPûfo/œìo½êË½Öæ.ßl£˜ÛÐéîŒ3áø³vñÅçkg©ë‰ˆW ˆã² u­üÌY;g–oNguÞ eÚ¡dGel_Ûñ‚®ó^nt­• ŒïJ‘‡ ™LYõ4C$VÅ.ÚðÔâ_hÛ1‰kAÃIbeŽKKÅÍ7%#è"³ˆeÈ+ÿ*vœ Àe êF;“„v!–ý"ËÁVõY!Že¯nH Æq8ÍéT^2nj5 ]{9I6 ·U>‚^MÐé‹i‚MîJ€y†0 DmÆØ)Ÿ_ØÉ\Ÿ_”ƒ1¬S‡£Ú”7˜¯ rŒ¯Z;®uÓTÛ@÷~LÂ6s ]æÊ= ?[1z ì|U¼àÒL~3ù[Vp^å—œÖM-αLÏ6Ãô}ªe°ðäÓ:ÑùTIë®f^&*…ƒKX¿æZˆ•’ïÚL¡rQ¸ØQ!ÔCè¨Ö­ïãC&a|f*2¨\M—Xtüp@|Þ#T6•ÒÁ ¸P¬lìE7 ¢wDˆKŸ:¢KÍVûñvèB4 #]¯ß "r±6¾0"Zj£˜c¨D¢–¾a#QÌrp3ÛÔ*ÛÊ`‡`G›Ÿ\S}?yÀAºoœ®Nð€Cu /pÄ;…û VZ ¦±PÈÏD%ç+ã•×’¸L’wqPò÷º¿“ü7qÿå~¡UÝÎæùø‚¯WèÅ|íTÀ×y^ƒ=ý@^0^+ý0°¿ü‰²ñsžÍ™æq)ÚË _{µ²vAá<æòüp41%×X]ºÕÀªÉ…Ã?uh>NtÉ’¢uW³tãhŽfÏÑ.š3Í9UAsNuO4 €†.á~³|ûÌëì×Sv‡§¤ ü ôÙÓ•Êî^S#™ž*Z¤]GÕÒ¿Ùv’þÜ¿Iúÿ™eÌËyDçùÓ•ôç©ÊøÌº™j?Äy@‡˜ºÓbœ¸+Íš<è-5±¥ö½ÏbÁ®[ÁÎÛ{^wóÊ”w+t¹Ž¢#æw“æ(^Ô_O…üZPÐÇcϾ2¬%°ÖÒvkùõÁ^i¼zÏ…Ž Ù(u‰ˆ½Ö’n:èÓ£òƒÑýËONö0e’Š\¯囡œÒÁžŒ39óòœÝê(­ð¡QY¢²BÝ«ÔÓ[íM†¾ìå—M‹…[à½nˆzOä£6üžhå*yË^ÅW.ª>L‹÷î_šÿ…ý­ Sñ£]þB™âOm€~Þ·™Œ‘yŽ` ‰|£RD…îÉß #&â'â&*5ú3÷ïnü:£‚ä<ßfíÔøYáè 9»…àÌçéYnôÒS©Ø¯]IÏQš<¾³4 íà(Mt2-I“õãýòû¥¡d+vÊ¥l~ºÖ º~Eðøèýøèýøè]ö™¾¶Yxã~üèíñ£·ÇÞ?zûÝô†Â‡?û78ð”¨ûvŠþyŠ­Ïzú.¦ [)·çøÿÿ¼{ºxendstream endobj 610 0 obj 2854 endobj 613 0 obj <> stream xœí][“\·q~_çGLéų.í1и§’<$v%NœÄ‘øfåÉ%--צE]üëý5€ƒÓ8ƒ33;C•Ê©”$ò,¶t7úŽ‹þ´S“Þ)þ§þýåÃMþq§wÿѾ¾ºùÓ®?¨ ¶ûçg7¿üŒ¼Ú¥)yòv÷ìõ®í‚Ñ“s~÷ìáæ÷û¹U)cRØ}{§&c¼±ûçhµÆhöæÖ¬ ‘¿q“Òiÿ‚›]p1Òþméè…ý;Ñ^G 6íßßÞéIy—Òþ‡¡RÔ]Ï@+t#Õõ¼_>_1´uÉÆÿ}öï7ÆÙÉ1YÏ^‚Žÿäß%òFÓþñöަö/Ëdѳÿ ¾+­†‚çañ5E­÷¯KsÔ ¶à )5bsÏ·¢çã2‰æ-ðw¢]Œ^yzfÞü¦ëyÈ›Üó~ù,¼ñ*(ÏÌùõ³›ÿ¹±“r»ïn),{Sл‡gÆJ­åë›Ï·eˆô† ù„ÁS,2 g˜€Ì†°HnOãf rµcdË¢¾¤ `jI9½ÿ†›uÐΤýþöÑkx]!ºl(ëZ›³„Úô!éÉú)âË'c™|åÒSkaò°‰`•פ'O€j-XŠªr3%š|Â^û)8k¨Ï¤uka`­,0¥*BíLµÉwwZOÉA¾ß1Ĥ­å!&La~«ƒ×¬|à›wV›¹9z ?M4‰¨1B£'2AèûämO Ãl1‡;“ ?$œWÊ÷d|±/ l•Œä/?s¦c”òÐôýÏl·œ#Šèk謃Z+¶2ÆF[u9Oe¼56@ß@‚ëxŸB¶M–ö¿È)†h‡˜hšRò ÖGm ®šl¾#kfÃiÁtˆa™ÀG‰F€4[‰Æi”âÝb ¿*³›hÿë‘w±bª*ˆj'ÆÆDN¯[@¶µZ+zÂô:ÒOŸ­V^ûe~£´Í øGòظõ¸Ìÿ³±P|³ÈêxþÈ ÿ<Þ?.tÞ: tE…ظ¯zË{0¸gnE!q/DRôC¥¦Ö‚<ËŽÔ°¡Å—Óš«@øŠVO¬É«e„±ƒ#F0]HýÏ×TõÞ‰viVø&ÿó\´BO­´ï½pH¡¸¦­¢{è‡ú?\¹—¥'p9PÁ}8";ÿpåèÇ%sŽ!fxȵP‚M®Eå§k ÕWµüYv#Ö@À;÷+möìð‰žM->‘ÿ•Üs”–/ɉB¦$?”18—•kB‘¼ïzÞ‹ïWŽ…ÇÙvô«|ÿýFᑬlÅr®z“™’ÒsŽ„'jÙö˜à?-¤H"×pûi1ÜÜÏÇÓýè°²â.¿úYþŽ.yÛZ[Ìh‹ .×á ¹ÿâEe‰a« QSKD+3-´‚ž±^Õ2DVX;z׸`Â,7ˆ+É à\šñ¼ÓXK7‡¼ˆ˜I†·‡‹è”as*b€DÊÅýß-ýd)©ë¾xujdÇ#K [Q-¥&Y ’\†¬’C÷de”(y®•H*P=©LC!“¯nÒùÚ[VäUÅÔáÁª[×Iê‰ÊA&.Ž)_PFs •©Êµ ›kŒç<¨I¦*JÎlaú—>wâŽ*uS¾.­.õ ø¦S¦Ë˜­¥de…½7KÅz•…Q„s»No3:Íþ•Åòð8ÔJ rH áxªÜƒ~[”µb,•õÁ¤ÍElYgв§úã#*뺥êø>ºÐô1GÏÒ#ñµOýòbƒ‰T_Ï{*ÛŸ4ø5+ÐMÄ2Fp¦)ÅxÆkVå\Ò²Êy¡"V|"¾?]üœlþâýâ ¥¦Ie”SÑN—MÅ43Õ¨bÕŸ÷$xÚi؜ürÙ8pq@dÇ`o6ö4ÒC½«e+oGñÛb¿Öîå~®kQçšß,sË~rëç›ÒÓ¯œÍûyO,t±ÄñÙÝ0B²NZè“”»VÊR/¤x˜ éd¸<¸J–äu•~¬¤O*ææ€A™) èÔüÉ-iæ?=yú6çÁ&Y Gf!Zu—{ü{|"½+¶‘rI>VeÉUßËGy+ÔO„eGò²F‘ØX<ÀJ)ó?!/äù­ Ýô2;’Û/"/UÝVEUݹB (× Rí—[:(B`ãåA”¹EÖ‘ ÒÚÉÈ:2 ô uaÙªÄ'½Ä®d­Ë­&qT¤;BRÊŠŽHÙ®Ö\ám²ÝöÎÁŽTg ‰qÈ-7Úñ®|k¸dCÊÑ)õtr„Xb÷|Éu4JÚþË&x´‘Ï1dcL¼kp ¶1ÂfõÈ~{ë5Bwݳôë‚ì G±Ú<#db㊖Ç,LiÎ/+ëçÚg©ëC{‘BÕÒ;—ê>Ra_–³ÅèƒÊ~. *û›åÕQÚ?Z[ÿ?]Ûÿ/çï†ê˜àµŒh”¿7Kµ«ò÷°T;×h­‚Ì…0i篨Òel±¿Î«`Rrzˆ‹q[g 6|¦_E!%ôì·nßt1K©hÅ.dÔ6òÞó\Óòf]Üț̆J!™7´Ã\D³n]C›ñÛrÍ‹£lÎZ8ÊÙéšè|ƒJ¥_ié ¥Ò5Ï-k†ZMF × (ˆ‰¹Æ5¦ÂRYéïòJGËÑà¶Ý+zq»#Ï`Ô’çþ løüÂGÛðMq±:³>Ϭ¸KœW"LéO0>»ž·c@ØÉ»—a9! ð RuÍÂê|„ÌøX&t‰ŒÙLd"½¥·sœîê ÖÁÐG™ÍØx¤ÞXT?§©?ý ÉÿÏž>Föt ñA5ßKýG<ôXÊv‰õyÖáéüc-pÍÕîÁH†¬=z2ã±U#»Wƒ:9õ†qGsÍ!µášsÓ Oú¶ÒpÌi9ãFN+ÐŽïøzí7™ÿ(Ÿ4|°ë¯ÄT¶v g)€^0'kÙ¸Èq%³ß"v¦èpu<ïù׆o =>0€…=! Àî@Õ”îÅ2³œíq?t-{ /„+y+ôãQÀÈöìzBTè°~¿ÌûJŒ3uÑO§íŸ¢Y¦Ú_àp¿vyeœ¢9Žæºýç˹ÿÂÝè«`Áýnþw­_5µûWüwÿTAAp6A:iÑ‚Š$YcnÅtçßrÛ˜Újâ𤛺h‘Ó1¨ñÁ¸¼é¤=Áý¸È7SÊýŽË—£ºrg°dLÁ±ŽóÜÆstíáÞŒYp¶\Þ°îƒ<ã9â…U©ÕLÚ¼`²2õ÷~F¤î;Y=“NDz‹®°,ë­w–Áûj÷¼—U*5 ¨Ž; W¤Ÿ3n:`9DL<’r§W~ËS!yV! Š-øÜðCÔób W{êÃë%v°Èš;o¸±C;@¡¤Î‡( ?ØÕbp—FÐÁ]Ï {ºÚ°¡sƒµ/²~T¢w½pI”Åq‰Â÷‹Jž˜ŠøâÇY¢µqÖaµ=³21c%ç ´˜u|dëôLñ¼™¤*Èv`ØŽ<È·ÂìœÄ†ë¹‡1"òÝi¹S·ôIÞR‘Sëú¶Epƒ<}‡˜ÂÂ… β‰É¶† Ê@aò&™7Û²{¾ó¡Õ Û£æ„ÅÕÓlÙr¶r¸«‹ É’YÄèãi+MÊý‰ÓŽã£ÁÌA2y;rÒšCÛ0q°5ŸuOÞy;¦c™þ͵>qš3×»°mJc!íÀH$2%:˜‰Fî*;<Ï…°€tz·oA`È•îÍt8×N´¦¨ø<ðÝœÛQ ጛ Ž Vož:ª¸åú°Y]SÎå?ïdtrF]\´UiBîB`Ý]¹h›/¤Î-]¢µPrÏCp W ÚùÖú îYQü\ÃíÒ°; Š1©™TY¸Ÿ®Rð(’í?ˆqË`A»qb¼ìñ?Ï›¸dË+R‰ ¼µ”74$ÅwPP3ÞÉPO]SÅ=ó »^»Ü‰·2)Œ«ƒÃ²ü]ÓbB%ˆ` ;RÁ‰: àgÒU”ZÖ³žÐ£Šyx{ÝÓ÷Ëä±r+Ô}4J ÀÏ'ÐU¸#ü‹a…¼¨Þn;¾K×Õûðü¢È‚7iE\ù“x£ vÅtPlW®¢Ž¯ÊÛ2ÄáÒ =áÁÒ[ro%^Æ€ë¦ÇžOÌD×AEfÐUØós#ÉõØŸ“Ál•\$ÌV]|)Ñ‹rñF"²0)¥ÄWÖòÁ5ËÆHò ?-cB)wþ&~!Áùk–ØÀ%óŽ·À‹zôx™·' eà܅Ź{§Ôc¿„{[Õš±ÐÀéZ”Jf\R¼çÜÑà’GB#¡¼áï*¼™¨HúÅ+øM©>aÝd{õ1ј•üD¯•ŸÈ;ˆ¡ÇþÝ0œÎ»J0]aa;²øÀoR-(Y­1P/hƒzt@X-{•ÓáÂn0ýTtZPgéõÒçX¸åi…9äj ê&ñ¨W¡nø‘‡•ÏÙJ Dˆ÷aÉäk"KŽÆÉJ“ëÖ%x¾û×SàýBÇ‚¨  Wùy/}ÍÂÀ©NJª²S*i$Zhã7µ:(k¤½y scÌ•AbÓ‘fuàŠ× mçE\p(xçfÁÑ÷e°ˆ¤Ìð™×ŽÇ0R½v;µ£«L¾ã£“:]! Éóñ*Pì#Ør¸Ž…CÞ4·Ô ¾úʦšêÉA½EšE× ˆLs…iXÝ•1ŸŸ•ø¼SXQÁá[øŠÃ¯à®¢‚M,C,T<1b‡/›ú5pP¿->$Î@øòtòŽ]õÈËâŸ\™@]œX%)ì¬*ØBAt;ZS(î¤A[¨x ©Äû.A×éÌð]‡˜sÀ-‚ß³¾Ã‹ˆ³‹ŸWaOHò].Ô©Û•ÃMÅ×ÝÉÙBžƒ/픈\°k%"‡\$HS@übºÊ°úúh¯ZœÀO2IÉ‚;ÑkÉB[\IVDÈydE>E©·×f#UZ"V…¼#I‰1ì~u/1FÁ舿Ò5¨cdÅé¾âdÁI¼ˆ“Û#Ïæ8IÕá7]yOèì ' a›ñK1¿ULúºÝì%›ªÇ¢L¿{  ˆ°^iÉ†Êø\ä¤ÛpõP°6î*µÂÈG6|ÓAxPƒô¯Ýæ§ŽyŒ;9äæË`O{ì–nÛc·¿ËGfm2ó¹^ãcÔå áÒ1¿~9•¸&¡æ×pl}QË|Ä/ykº·sGá&›²5@ÏrŸÅ±B- å Øy0½€š°óK ÀÀ¡‹®ñðæ VJ±PÕmÎÿÊåØrZÞ©× œÂðºY¸O΀†­år ÅXj…á¯7¨ðÉ‘{»18½Á——ûæƒÜù} "ï1•Gö‚uKÂ\Ç :[‹ s^SeÀ@¹¦µA®iL¦¾\&Ù¿À°~…¶…·P,dÕÒ¦y"Wÿu%Ý=É÷f9È-Ž—¿/k®µo7`øx½ŠâlΡøŠJù§Üàœ<-¾¼pûØçË|ˆ'$¨8LþbÁAÌû¸Tr'±E!ï,‰{J‡cdhñ`ÖàRO>Ë'‘ÏòÊY“èz|þ .g:D ãu¦‚öZ.`°m[-Ÿ—UÌÇñë½ 7?Q&—7‡6Y=ôtæqñšÂÔï{©ÓËTiù”L4­ùˆcdR¶_=2p9ò}åN“›þuªí‚TdèŸÝYyn8ª£ÈÐ"èãieዃڅ͵"øå­ã§sçƒÉE¬]Y#í°¢ó›n!„|jUgé!>”#T>«è<«¨ç·%פ@Îu°3#Ã1Ç÷%FAxQÞ‹Æ{`>Bš_û©ƒÝçn|oraöë®óëüä«ñ|Ë‹5¿NËÿgÀ¶O!÷øó¯ƒkîØendstream endobj 614 0 obj 5333 endobj 619 0 obj <> stream xœ¥VÉn1½÷WøØ9ĸVÛW– €¹!H0ñ÷”—îqgA )ãy~e»^=—ç« \(ýód?Õ¯Üãuôqú:Aÿ:ÍÝÝMwž£—}VTv»Ó z@D ¼ˆºÝ~z9ß; QŽó§£ãà‰”x~m(Åù[AcdŠ©Œ‰ÄÈó›K””p>o1Ο¼¯9Ï—GÇàƒJÎó¯Æ9Á&roì`a6‘g‡á»ÂfÉœ^íM$쥤µ{ky<)s•ç‹£cŒ¶…þmÛ,Ñüc÷\ £–emäÀ|Úà–l;`^“­‘çCäÅâø6úçVïÚX>‹6d3›ÈëÚÔȳði£!-â<ØMÏ&öAÜÏ)b°²Çè#¸ý$l­¼"Ÿ¦Sæì5¹(•O# þü ÇÖušx(»-H ¼¶Ýnu,$à³XUÇ‚Ï,¶({ÌݶOKº˜$Y꯫hláÉ„*¸¢tI )¥UäH6?œpAþã„Äè9\9áýaûv‰Øjœd>±¢µwYO Ê[¹;ýK¡¨0Ðü½º IVÞP.*.€œÌW…Ydͳ‡‡<d̳×TMECM`SÓ¨PâöתügÅôÆšš3Ûñ’%Á]±“’ *ôûUR5|ISLÜ„„ŒÙÚK›Ÿ©\-0?§ }_¯–MÍ mõë*­¹]ÕmT)JÞ86*)¢ÇQ¤²tü£FB7û~ÑHµº«jô°$f{hÝ„‚5 œßWOA„%Oë`Òìe.‚Å^Qs³‚0—Þg电tJS¯Ø«wÁʽ,ó ˆµ×õ-ö…ja’FôÍaã‡êœ™zyëü÷ƒï¯×bQpSœ¸U™´¿*{á@ÓK ªµR#A«®¬HcIò’6¬LöÎmXÿìêìIë¢öLÉ»zÕìU.½|8-Eó;os²'ÚZÂȲbذVY ¯?:žSyúÇwào9·êgýö†ß&dw. 9±dÕž¨ªÞY‡«2ÁÙÿßëûÛ‘endstream endobj 620 0 obj 800 endobj 623 0 obj <> stream xœí[Yo]·~¿è¸ÈK¯Šˆå¾èK“tMÒ4ŠMdË–U[’#;qóïû —s†÷ðHºRÔ@‘Å5g8œõ’þn+…ÚJú§þùìr“ܪퟧѫÍwU•lûۓͯ¿Ñ^n“H^{»=y±Qõƒ ·Á(áœßž\nþ±ûôH -Ia÷úèX c¼±»SÌZc” »·4‚5!ÒØ'¤J»§4í‚‹QïnŽŽ•Þ¥´ûžM¿:ÒAX-ýî9ÍZ/ƕ؆°Se•`ÓN‡E"tØ]bZ‚­–ºŠgSp»ó™š­òÏ“?m°'A›—Û“3lôKúmÒÞ(½»>:†h.`{gEàhŒiÂçqU†Ñ!‹‘ˆJí^”騠"…ÒiÒFþò‚}y=“6ÍÉ«>Œ³ÝúEyʧ‘òˆXͬåpÈåX*/“œÏúŠÃ:¤¼ÏO6ÝX!Ýöý&h · Aµ½Ü8+Á+M3¯7OÖ}PÅ­²ÂX¯÷|Ð'0O±ø`®”vØz±’RFùHV2š¨4¬„YoµÖPÒ4Ì6"™b£à\¶Ø(Dë´ÂfIaÖF²ÑôáEù0„hPë¿/6ª ù Mkå•öuy8œ‚‰ LÚ¢ï8MÕI“%2És¶¡œ<,6ºÉ«’MÂÇ­·Î‹¨É£¤“bž ‡º/ œp‹ˆ¦@Ñ4c]Áßíš³Úšk*eX¦n¨Š~••]Dœp4siíø®§j ~Ï$œf.¡±Ý“ð³¥ïž‘ŒôHï“fò7ÙŒÎ"rÞeo‰.yÛ‘\W/Ò6î®2y°n¶h1ŽeûœfØ>›M Âp›Ö‰Î¦Ò҂ܦÄ3·kÌmŠ„•,„Ñ’We ÞE©ëötDÎ(±6—¸ÓÞ+S4™´‘Ö/m=IÞYÿNɇ¶†o C¶æ’/Öh™¦\ÛÕ•-Zü58î>™)Jæpðs¾(yþ”8^—=:T¢Ÿ²ß¢“:ÏÇl|µB/–ßfšçlþq  ÏÍ ›ÿvÇ~øˆŸ®|ð=¿Z”Ó+F#WÆl|ÉÆ§‹©ÔÖmæ#6þöhà}S¼MÞ×Ådõ¾ÒÄ>ë@—5±‹ÀÊ›¨”ThTÖŠ`@¥¤S»i¦P!ú]ì¨à»!tTG3öã3S©rH¼¡Z‰úhcQgÙg,f_•@H1t$+!>)V9±- ù mû:›•Ì©¢EhvT-!̪ÝOH\ÿ­ a‰]ñô/™ÿ¿Xú3¯E‚àÁÌø,ÜyÖÔ¾ƒ3wFYŽšÙÛÄ}iÔ8ЫC¼Äà&ô:„Xz‚XŸ2üÀ‘ǵhü›Û¬œ’§³¡xýföË(Ô› ;àʼn«ÞreÌ1‡5ÜÎýÜYD«‰xmRŒ# O>à -|Ã9a jÿ+ƒÓPTX½ï9O!ê°ÊÖQæQ”Δ6ç›:“C3ÏÙ­M¨oÎMT–¨ …ör:lOo-8yä‚ì/¦]œöÛ¤Ôd]Qñqˆ2ï£6•‡&˜˜f¨>YZ‡äý}r] z»·ìâÖõŒÚÖ·nî6án¹á´!èbOm½ŸfrÍsjk=:t÷—óL€5”}ˆ=£ƒÉžÖ£ÔfO¢Zµ'3„/*´ù[4z `ë(WjØ¥$èB“„¦«(v(ÊœÂ{# ª§O§–þÔ”5Új¦‰lã<O0ÈÅÆmÆ&w·W ¥:! %‡”šiÆße:–u×Ú vT@Õt™¤£“i™¤÷£$‰HÒyÍ“t“7o-*óцws_›×|`Qáò#Ó]òÎøCÃ!Ø汊&ÛåµÒšRUb9C‡bÅãÑÀ'‡ú;œÎ'ŽÎºÊa“>eDyJ£r”b£‚rH‚/iì£W.ŸÔ•¨u95¬Ó¥r'€‰Bªí{ TqŒ€WÕ„¸“ˆišÉ… ŸFÊ@ú!È]gŒG¥y·ÝX/õ–"(TXX»{›¬é\ùë¼02j÷G 4ä*w_ˆ `Ámíçñ°ðÛ½è[çE¹¦BJÓÉ‹J 5«Fÿ–N£Ó¾©9`&IÇËHR¶ÀíÓpy´%¨]±ñûxÎXÃåƒP©­‘ÿ"3—ÁXÝ-Êd¹b$§s±,îmej8 Ú IUÄní´çßy”ˆaˆº“P5¦‘µ‚£¯Ø<ëS‡h‚-fÚvk)ý1‚i ôB ',dtU PÉéêÝÕ\°?ä ZS1(fïèHbCƒt¹ ]—iéMqFmRB þXZêÙ¤˜¬Õ³#óÐÖ’“íàçùÞàN0ÄëÚÕÄü¼0ŒÒ×P0ÁªŽvƼJòUøüÄh¸ä ‰Ä׽缙W%AþÕÌû—9ƒÕ§¾Ì~^ô6h¦Ùl2ê'GÇÀ„"b‡wJ?i¿…¡= ÿ ýÖêúè·ºå¹×qî_³rÖ,Ë„ûI,ß*÷-ü¿Y.âK]¬ˆ¸³G ˆî[y§ç9$ïÓ9ñUö¢²†Z.|måc: weù³.“ä[Y0áé”%Ö¡ÕeœÃækô}FãÆz·"ø^‰«[^;v„-gÙfŽly(Ö Ý IÛLG•69Q™à°U%£… ¶‚ˆz­ÇàVmÁÓ×ûaÞw𞆟ŸM=Íñ ‘4,õ­‘ÏÌüÄ^T…Ÿ«à§š/ˆ;Q¦2Ùt€(hÕ@”›#¸‚rZß!È*ÖI;Kò?‰ƒ)ÄŠƒ™ì›ì‚Ö(ÛçuιÚSèöÓW™¶# A ¤ÁÛÍÌ‘¿zÕAÅ;ÆDTÈá>÷Ào†u†§m¾AŽ@^®¿^'ëgsùáLæs°³¡ `Wô ¡ *qQµ†CŽRQnfå;&ã}a†ö½ÓÑ Ów+ˆ®¡DýõÿЇ „Öº©ý˜Fö ñ±g\é9´)(Hçgz59=唤ÂðN3¨ž#0£Ë5uS'ç¶3ó½_=逓_ÃÍ$u·ÞÝfft1Á†.NQ YµQ¥ò]™¹ ƒ8ãV.øTþSõ‰d>“ŠÞ9Ñ㣵Bv~™U‚ꑪ=Ð2¢PÖgw:`ËІp6KIÀE:%$ Xå„3%t+¬¸¡_zcy}IiDsª±r:¿Væ«] öÃSVˆ¹xùiƒQÑ[îÄ Ÿç+äÌÿsmQ‚hwz¾ÿm fá§cý,`h¡#wÁ™u²>tŒ¶ž!/Ù”Hs*Rx’-'½òÕôöïÙLÌLÅ—¼®G|M®)·¿Ç燺••„*Sï[JV£ù{›#¶ÈýŸú®-h "@·nÁlE)CL”Ÿº¢ÕèAàézö7÷ÿw%Ÿ\Îxºè^‹õLõqIKõþš™ku­†m;E¬KÒ¨~«d¸/>-‘Á³@çÖŒæþ!^øF_–-—:K1ËR`-ªâ“)«v£?o›H˜ÑlJK¤'Í9‚Ù6×ÍOÌJS³Ù¯½ÌüÕv z/å@C¯ÀWÛi¦>äŠôd“S9#¨óbT?Ñrô÷ˆ½Þ/² Î>¬|×Çkyå¡ ½%áê „òý6tˆt­Ì¨Œ2XâQÛ0t–úm𣃹P6ì@¶ÝG¬·kç7·åÄÌ%7MÔ`yàê—㎠¸ZH+ý,ûD¹]œ0-:®}ã-ð$‹_Šb÷ßêäßû^’?Ü‚¤{&ÇW_leš›ÊÌ}y!%Aqw¸ŠÌ‡‹¬õ2œŒ7§¬Ô¿-?"ÖL˜Ï™èÃäIvÖûrh½‚ɇ²s·L¨UçŒÏ@öL^ú°ü¨…âû‹P^¯î‹ÐZÄ|¬B¾£3å”ÕÖS•;»wó7ð¬\žµè—n `ƒÜµ»—0+qJ?˜/-ou(ãÓýŠõÕk!uµÈ-ÃØ)T‡®:îSï^ÉÞoüž’ϳnulØX¶Ù—¦ÄW¶;ì, H{;Ê í|)½h y䬅÷ÑÓ'kZp½{JÚ¨QIZÀÿÛÌjXþSar(Q:]‘vé;…æÖä‘ý4N÷šùœ‡7ò<©±¦þ6žõ@ =òqý#z_ZžŸŽì-›NÏÏÏOC°ÎñÿÿúξÞendstream endobj 624 0 obj 3444 endobj 629 0 obj <> stream xœÍZKs·¾óWìqXŽF7×8©”“ÊKfåç ZEKmE²SùõùƒiìÎò5JJå²= ö4úÝ_óÓÎ~çôŸöÿïoÏêÏßýa~z{öÓ™o?\#Ûýúòì«Ý®Œ%RäÝåë3ß^H´KÁ"qwy{ö÷áës7’ ¡¤áÝù…Cˆ‡—Xå|Hÿt5%)ës2:_†+]–$9ÓðáüÂ.J)Ã'³üöœÒÈäâðO]åèž1§4øi—Äep«7“D’( ·Xv`KŽšx\’ × µÙå—¿?ƒN£*ïv—¯ èõ¯…bð4Ü_@4IPïÕ$p!ì…¯ÏÍROcö~x=-gkLRx*³5ê›7æÍ»…d4Ë–¼Ù#wûOÆó±¬O‰ýÂÚ­>Z9ŽWI®—Ƕ‹`5Þo/ÏþzÆ£“Ý/g‰Â&¥1ùÝí™°¯2¯¼;ûöt ú¸ó~,"ÞÆ`‰cqÁïbÁ%Ox[Uã#$TÉ)§Ìj‡8ÆL-ˆ<ÅèÃ,¡'¦1å ›W™2M?Ÿ!ÞÓôþ"XM_ v‹Š%ÃŽ7æùûI6‘â­œÃwÃuìb¾;Ÿ~ÇqøBñËñð^5§8wïþ»z„JNÃGËe0\ö,ë_KTøqbÉ¢3S[î?WîÁeHl5¹3¶ÿ4si6ð%úYA@ÍÔ{$ì·­Ëv[ëÚW{‚d/ª—#Ñðg%Èœj£ÏNIi}ÛÙ”ÈuöüÔmßÌ >@|@aú shøR¢Ñ‡°¯NW‹PÍØ} 2ût~ïô?ékë=»þÑÐÿ|.Ac€›úˆ äÜ;#ËZ Xa|F³™•Fѱ/¼T§DŒÔÕ É´–(«Ú©!Õ¢~\@ÿñ» ¾“ñ>- „À§<‚Xö®ÓUëQ›K«%ªèŽ1c'Ñ¢¢ŒIö Ï)+!‚ce‰ìleåÍzÖ¯ß!ɇÇTÕç«Ä t¹ rA4 ¥ÉzßÔÂëC!„›îMžÓð¦îH!—¶a@·ô­V á˜(Á¬–”<2h!3{­õµB ‚˜ôÏA!ÄÝ­0RµæjÙãÃwb–¼Luu"X6›]URD‡B B@:ê+„ÆH<¯¨³°–:*Ä:KGõT—:Q¨¤,Ð)xré Ù¦q*m*~è½8E%cC—­Œ4ƒ;Ua‘:¢Lc(›4eX/ôŠÞÛÖöº.²GàìÜá¹Ñcµ“/D ~Ë´IöäÇœ„×°ôˆ´Pºfg³ê1Nš•¼Mp´‘›¼ƒÍ}'7Ö â¥£bäâ&íÀQLë®YmGG®!-§‘­\·c½ôeÌÒQe5Ð&é±+ÒKm¬½Ò©ª'<ÒÑØ~kÑÍÕÜÎ?-Õ¾¸Öá6}°ÕÈ}úŒ}ñ“cÞ?9*˜î¥¿ŠiѲˆÒ•³³CP8ì=áÕN$¬!=:"x‹75…|ÂèAÄItÞh{£-’#®ÆÔ‰ŠrÝ$: ¸Ë=ç27³H+HQd?M’ÐzAâDe”Î/ È.h—ÐýRg‚ì ›”‚Ùoq šêèl*‹sP¼Oe¬e@厊ƒí Ï,Pnøé ]•ö›,͉‹Ì+§9sY¤ú³‹" żG\‚"Õg·D¤m*ù`¨W6H‰È…O„ –:€98Žh^i ~ú†ŠQSCGõdPÏ€ •©Ní]€Øy±ó¬±˜ƒ)5D°òºS:ÐBá—Vø…Já—›´Ð£Ê‰Å¢Å;zÙØû@X‡ßNxg ®DYÆH›„myÔ oOଠìõìÁª¤h³Z´Ð s¯kIS;™©H+TÞ¢*8ÀO~ÝO„ï>å:.béÇN."‚£rG…ÆÓ&é C¾äUGUga÷LÁ²ÅËÎ_ËX¶¨'è¥]‘$>L"Ì"É–äúܦR é3orNøê" íÄFÖòAde@Îm‘…ÃadYßœ•Äê0w1AÛ¯ï#&8Ñ»)K„ü§²Et°ÀT\¶Ø= bå"¸^Ëq±©£W%£›¤:,¤Ó†_NÔ¯¦ƒÊâóTÜ{Vd™¬ÎJíN‹C„ÿ¶ÂƒzÌo`½óÖ†.ÄzÈcTç ¸z*TÙ”V`yäDo:‚Ó&Jš½È¬7Êã ‡bñÓ)fÑ«, z3VoÚRa)2Щå ïµ}Åá/z5¹„RÚAgÌÙO7wÓ‹èôˆŒ8ƒâ¥GãäÄ[ÚšN>µp+{%r–ºú ›$“e…‹V‰P!.$š«uG‘ÐD¢Óc›Ûe%9Ýý/åõ&0GËNyRlçÕªG±Y2ìT#S¯g=+ÓcÞ€†Ð.= Ø¢%1Z'¦ßEÂyåù¦‘Ý„¿1Û7ƒ;<*j×ÖâbI“ל hpcÈT’°ÝΚð|Ø‘Li%ž8׃rË2,O¾a£ç¼bôÜ{­S[—¶…Χ0°¾w{äåû,†dÛ"«0R PrðÍbõè Xê}ÕÎ%XEEí¥ç¯­[gŸÌ……üÞt!!ý&sða  ¨¸u|Òy¦kWæ•öƒþÝ QM¯¶Å­’–ôåBpµÈ`ö½[ŽqGs?ÑXø8ó¨~?æQ©ïŠóâÓìJ"ËäzbR¡½aêóh^½ÿJnw: Êu¿ª…~“Àzz¡ås¾gùvòb ä'gp‘ÐÌ´ys3ñ)AÞ/Læèv»ßáßë§Fê#ºYì£Î/[•åÑ1ÌËF€‰ãc>}9%L©¬ýfo½ãTžð0¹»4%àϾô¶÷ž5‚¶4ÕŽ³/lOT2uóÒûõ[Ðé†C\~Î/ö, ±–Æžo¾ŽYðO¤@ÁªŸ¢~vß)%Vd¨2T²T³«f·tîlnÙh§8Ëè¶ðXšÓHÖ0PÐCK(*€{yQ]BË×ÿi~4ÿþdzóPendstream endobj 630 0 obj 2845 endobj 635 0 obj <> stream xœÅÙr·ñ}¿b*ÉlJ [O‰E+‰-;Š•<ØyàMš‡d‰´JŸÆ5ÓX VK:•”UØj4ú¾†¿ œ‰‡ÿòß§w«øã †ï¦ÓÍê—•È?ðŒ6|}´úê <óŒŽ.V"_°0X)˜Öf8º[ý8¾Zs\JoÇÛõ†3)Tã1B•”BÚñc€Z«¤uá,¥f\øñ$€µÕÎÁøa½ŒíýøHÀ7k°L7ãy€*Ã-ž3²²v¼Nj v¼Ã9Þåu«üx9 ‘}»’Z!ã …::C9¾ÿêÁHã»õ_Ö¹?Kü8)eá-ž³¬läOÌ 1^$°(lâB€Ÿ„7¯ÉÍw3 #`ŠžÅEn«÷“n„ñKº Èׄ“V7²fâÛ™„F"A3ß­þ±RŒëáÓÊG“[ˬîVZq¤ä'Èíêmß„„bRØò㑸wÉDt°•Í‘}š!ûÑBHa\0‡„pÐ5 PÓ1#(C&cXÍÐõ’1¬SŠ4£” Ƙ.^§‹Ö:^ Œ8ôßdŒL0¡kn£-ÐÙ…`òóèYm!Ñu8:aT¤0ÆZ]­WÞqFc¸–ÚhÊÕ%yž öøêP+=Á¼Ö"èÒx|³:úã㟓ë*tä#ùü@ÎWùÌM–4Ÿ?¤³F÷H‘šá/×-€!;ã_ øœ ßø=_wà—™¤²ãß `Ì ÞŒo[&%W¦brÊ|ÄßÂ)‚ü>½$¸¿!ÈÍk¿ èèÀZŽßµFôG?k™¡ G|Âp0¬F?5n؉¦MièÕÊ~h©[j$Ì}Ñj²Èe’0¾&(˾"þ¾ òhªÀg­AhaÙ†Ç@ÂéqÛhCy×É…gN H“ÔùÜPÒ¹(ý…ÿ¶;F./;¦< 8‚ÀÅ\?푉:çómSIV—ñÏE 9~ÛÉfÅÄNÿÚƒ*éUËVÄQÊ”«†·…¶Å¯·¯Æ÷—6²v:•‰&’ÛÎݳǿ®žJݤg8—:î¼yºL; ´q90´Š)¯†ô8[—HG¯ZXË~>çñÜ ˆÞwN «^1áµÍùVB"KqÚ—>p„GL|Ò'‹H‡OÊi `DŽ|”£7cÕA'—NO Ǹ>­¼2Ìá)l`0ÐÃ’„kLP~‚„%‰×±ô @ ±&ˆá_ÿò*eÖVY¥xö>0(…)-¯S¨`çYMaë@$ 8ņÒì_ üÓH‚ü§umJº+òN±Ä —ê¨ ˜Ü-¡Ù)!8øwñ8¬ƒ,ã²núÓÒ´Æá)J+¼â\V8§'ú­g1¸)~¦cŒÛ¶FËêhÙÉŠ„Xqòt¢ +yD†<ÃÖé§k³/„Ì¡ñϵǒ ’ØZá3nÚg©Òlæ( 8'sÜ”Žo5.¡<ÃÖNZm‹G¿ŸI_ûáX°Î’çù?bQ·Ú>G§B‡‰T#QƒÆÏÞçKpÚy_顬í4~”•øï„à ò|¥T쇽¸Nùo—,Ñßω1gíªPÚh•ž ›Œ£ˆœ„ÈYljÄѦPÙT¹°Ö¦6Í´Ÿ‘1Ç`WÈ F(¨¬±è¸ÖhÇs)ÌaÙ9“@Ëkkë‰ómë?ÃÖè[L[SΛ¸•Àý´ïFÛÑR—ü¸qi¼L‹d…)^—Ûé~h;CÏ´å¹ïà³ön3ÒníÍyèÍ¥XÅ~×i{†—x¾i%ø©­émÏ:Þ†å'ÒH´ ®É±¶Ã—²Ž\P—DS× 3ÓX‚ ƒ±°tû{ׂ=A–vL» ÝÒÚ ëÉêãÔæ1(©í}ø‚SŒrUy>%ñx“œÜ;[¡tÂwÒ¬ÐØŒqMeÀÄŽVKªQI²ÆÂ“®±¦`Ÿt»~KøS}üOÂÿ$b.ZnFÿ…íjÄ'tZ‡žTµíâÔ¡%vÿUµÈ€}qžÞSÃ)ÇÛý{*9÷T¯H§@[#Ú5äòlñOüøm±5D”“Ùj´RcÆoŠFZ¨:­^Ö›®ªçSTè°ØêYš¸ÔÌR8¼ÁóF«%ú6»*|ý9v²´B94i˜’‘wŽA ¯ð%”8v‡è«Bf)ƒ¦@¾™3– X#æ9ÙÆÚ Ú[„ ™uáb’â¸3ä ¥“†Ú–àÆÌ4âL¹@$$² ¿Kß½1û$µÂ@¼º›Rì|_rfé}¥ç_ÀV8¶ùÛTò Ä> stream xœí\Y·±~Ÿ_qÏžÉâjÀ/Ùìı…Ä€‡‘F­™c$+ɯÏW$»»ØË™¥aÄŒ‹\÷”ª‹µ/$Oÿ°SÞ)þ¿úßg×'ùÏÞýexúîä‡]ÿPm÷û''¿ýÂxµK]òÆÛÝ“'º¾Ì.îœó»'×'_ï?E—¦…­WÅRasÑéÎû¾°õ3ö¤@ÏŒ  !cÿSd$Wþf)Žôä4ñ,УdðËÝiË­pCñzš+üráU«{” ~݃iÿ±$²ì'm»€ÒŠªÖ'ìOÄr¾ðÏücGÖ µÜ™U¯æúñ¥t.¢ü­€¿Ï½šC©©­Þ²Ä¯ÚW³‚É>«ÌýÅœáü¼`–Œ?1ËðÜ œw¾àHùùÀÏæUY*‰ò‚Á˜Í“›¶2Ûç-Å^XIE8É»ù›²ÍÏe%1&öòe¸ÔÙïÆgv*ôØdÃî –I®„³4æSÁÍ·c|PÄCÇÜDÒE«¶Gx¤qú<+%‘/K‹ôp‡´A¨Ç‚Í×sò3—“þÔ­øÜ‘Uœ÷xY“ÿreÙó9ù™ä·cÀÌéo*ˆŒâÒ¹_®¼{>Wñ çVÐì~ïEÕyJf:â>\j÷ÝýSw~^ui¾›Ó\¯èz*ÑTÛ>mO"ƒ¥ÿ³"·(Ò ÷àj-u\­HzYüÕ\“ùÕïV–z¿:[ú¹gÛ™íûL¹ˆ4Š1D& °Ì¦s·™gÖ©ÛÌ:¥³1Ábµ\¿9Åþ:nýRÇ­w¼¼‚&hî°eÖgŽC÷Òì5NBÃì%&¡~ª–°R}/C,J¦‹rBë!Íì¥(t>ˆÙËRÄü·iKÕò– ÑæÙko2yÌ®Ìa¡SÆÿºÙú¸9ÌN{¡ŸÃú?7l0bµ.8W ŸÇ oò®Œ%Êþ&ì¿ú¬˜•L*³ˆ¡”œæÅ›†NiZ/—· ßdo© ¸aCÏN癥œ$Ócî† ˆë´žC° ,Cà)¢~¼­W!G'\ZœpƒÙ!.:$î¢Ô?ål¥ÉðV†Ñâ=/jŒ©¦" ¼•^ϪLž <"’,;»‹| ÃUâ—tTJB…[þgâcÅÃ5#X”'#ØCU ѧãÊrµC'þ˜½j"b½¾Z¼ûJ˜ö p$«½{%{?ùªÛÃñu¿C`Ù°?Šd3妄Wêls=¢( M$â|ÁMÞÊ,ÙÎZTÌ6N&s(FÀæw‡$®ÑE DYähŒaä% $Ðý0Ñ€«%ê|…۹¹#ûit}Ëû ñ²ÌiÕHÞ­8™ (ø’ ÐÒcJirÁÊ~ÁweëÆ,ëEÄtÍá¿}£€tÙ£f¹uY­0PG9p„“õ¹J\+‘[y¢+8^òYþU[Kë­Õ·O‘*7—2WÈ4°ä’™Ò m±o^8Ïwl‚±+MÚýˆ"LëºI ½®Ü˜d㥨Üþs~.Óbq¥€N ö§9áP°š¯f¶öâùxß`0D•[¶}à"à“NN ýøxÊ2MhI¥“yS rŽå›=ä1 -ñøè™š—šÐVÆ‹•Y½Aµæ÷ýF]3מic2'gø¯3|;ôâÿºùrûß º…XÐny¯a0W?o›àLÙòëçí"çm‰Uæm‰õÈy$P¥êåÕ㊅ydæ2 ˆÓÑ3-D5BXË·˜[Q¡Î4HÑt”6Ij9ÐZAF¦Ü,.¼ó ÍÖL–›°î1—y’Hv‹fïAw1L˜ç+²ÐÊ3¨•nHiΆ|TAºá0$j°8±l’$àÅfÙ4‹¥pféÜ[É´N-÷dÑ­»+²‚6qO¼}äZîï3º¬X¤ÁY;¹ÑÞŽÙõ®ã,“R⛂£øÐšåó+)>xÐH’ ¼Üù-J‰Î;¿ÅÄÄ»y¡áËÅwîsãž$ïæ‰Œóî *N©å~ì÷¤!eŸ2`Œ2ð-ñ(ƒŒ\R|ŒÑÈà’çc å‰;¼M2xÊ¿ûÙb Š| ¼ ŠDÿ‰>nõŸè¹‘o¹¿Yì§óáRWÕnœBI§°Zç#YÉ`‰ïôo*:ÜBØ¥ßÕžÖÑŸ/ôÉšcQ–» çð«.4¬Sbª›X'¾1©9kSèñÞŽ“|d3Ë É“:ר%x‹©¹•. ú…FQ!@6 ù÷Oz‹aPT;%CÙ)ÁÛP,bˆn°,É úæAéÆþ”–ÁdÓˆf5šƒM‰jÄ‘ç… > ¹@÷ÝEÙ,b*#~jtŒ$ÕF·ó;³)åƒZ½´ÁA’Güpûä‘jò³!ÞÆë!µ©/¾À²È©Ô`=¸©·hA3QþYdã rfÌ[L‹Û;bkÌç.‚?ƒê&RpûÅ~Äâö+¸MRðK ‰QŠvì¨e]k‡ðkÙâÛ÷RáŒ]çÍ&æ—<Ó2/wÿ¤ äõèÁ*¡Iáb5JÁÊÇVÖJ9° g¨¸ETP€ô²îÙ¾ëó 8²eP÷¬oø2Æ(þÄBáóa÷C¾‹‹†Ê]œl»ÿ+–L^rþDzQ<‡ZÚ‘qÁNƒÈ8Ì"A¦<ñU­MâA,í&ã4_g¡œè©g'žÑrnó,,LSÏZ;ñ£Òر*ÌIz qùÕ­Çrü±‰„ø7i ë ©8mÑ;œäËð°`[æ9':ükz¾ä°…{âa!¬+~ÜÍZ6+“¾óìz6-ÎJõ+–Úãq7@´õJKu 1Täó&Ýæ†«ÅB¶q›Â $0¬Ô¦µ Çí—ò'!˜Æšãc(»˜þ0€? ðy¾#iõ—:ÉǨËgÊ‹ßóÆ3ÿÐÕÊ/Üú40ý}Üä-5ßXúp@²)'•ø3 å’êF@¹‰w?œ€‚ “Kœ¯°WëG\€ÕŽ0V»\°PpŠÑòÏÇëXùr¹ÓêÃô‡%+ZTR Ã#‡=d‡|ÚhÕ„ÃäÛ¢t¸\ä&ž+ò),]ÝÍèß_Cèoñ:رA)Q–oñæ}síƒuãì\Œc…œ=DÊYmªù y0hþ«±f4¹ÓºžÙ÷øÝËekBG ³5¤à‹¡â&z/4UõÒn€N‘]†K»â*ñm1·Ö½ÒÊmß7E—ÎæI Œ:•ò-¼¡´åoš{Áį¹U\~:ò Ö=Œû¹8¨¨$´hd‹ÏidìÈq%^”W•‘ËB„¿Ì ¿ÒЯŸ_=¾~F—+ÍÈ|g€¥à/XÞÆà<:¸|Y¬˜¯^gcØä¨Vš²x5—µÆ®1"îo?àçr„úÈ?°h½NK¥ñQ*‘ð#/v.3“rêj™Aáéµ7â!§aÝ„©çMq#Ôßsæq³h Ó`ÐáWÐ)˜Û›à7ËG¢âNÕâ†F/ï [£“*[ŸÆ|H"ñ_~x/Ã5ú©T·¤±r°øóLc‡ÅÜõíH †¦B“ÿýÍX”ævt8µL£i«ÌÄë{uïÄóŒˆØÏ×ýó(7@ â±ÁJÄ' ëÁ^¸Qb¨©a³Wc<ŸKn‘Bx‡¨‘ MŸï ,Ë¿ l±ÍZœj_ú|ýÆÕèöp_œ‡‹Ï“5?ˆEcßûav8…®¶¿m’øÅžN²kÍ?GÉwâýþ§Éqb£. 䆸jN/£äx¨ŸÒ’kÎe§†oR¡K*1&Á<´;㟨D]¯3˜ñnixÕãÿÿ ¼endstream endobj 640 0 obj 4413 endobj 645 0 obj <> stream xœ¥UKoÔ0¾çWä†÷PwÆ3ã±9ò¸€@V\‡ÒÒRµÛÒRÄßgœ8‰Ón%Ziãýòyß<ö¦=”O}ïºágýëùtÑÝtX@¥õ϶Ýáû¡Ï>ǹߞvX/hè•ЋÄ~»ë>¹çðˆ²ºËÍx¢HìŽ e"$u? ªÊ¤©œ‰Äf÷¥À¢’Rp·›ô%g÷³/6A=ˆîkA9‚Ú¹’YÕEƒºy» LÞ•³;[Ž‘ÏÛW [àlImO,7åm‘0¸ëÍyµèOÆxM± çš+¢³“Oˆît„Z²còœìpó¼¹y½P|·ôš®E»ò?jƒ1ïӦϛHjCUfð]Mˆ)ʼÜvï:ö ý¯NXÉU½b¿ë„Á,å¹ì>t™³©W TžF¿Ã1»}Ì€‹· Q`ðqôöh·bê}Á¶[QÈg3jÅεeß–tC’d© š²]/2\(©’`Š”fI+Ùû& ù‰ƒg¸á‹Æý8@lUM⎭hHmÚn‡h1r¬ƒPéß % #¹»¡’äÈ+Êõ€ Nîj +‹ÌyŽÅá&Ï ió¬5¦¢Ç¦¦°ª©F,÷vª\X­ýì&ˆçb AŒ/32²$yI+V&Û,+ÖãêǽýÙÓ… ÂUýoeŠB"Sg¨†MÍ¡U($M\ÖÂ>Êí¸D¬XuïaÙ6Ù]ƒ·œ¡(%Ù`^-&ÏOsQP)ø@múËz\‹d‹Ö*Û²’¥(¼bÍ<—å~kÿC#ÛàxYKùqc%Ê6QÓ Q€<.O[^Ö˜¶Ôæv›Þö}rOFQàð½Ø7N}’iu?[qÓ™€ãÃ~žÓ½ßám?«äÕŽš€?å<*›É»çÿ”,°ºJ´Åm«u–-˜s>ПÙ÷o˜)endstream endobj 646 0 obj 728 endobj 649 0 obj <> stream xœÍZIs·¾¿äG¼Cª2/'«O‰å¥Êv\ŽÍòÅÎÁ­%)ÚmëßçkƒiÌ›y¤Rª’@¨ÑË× º1üy¯F½Wü§þûäj—ÜëýçmõÓîç®?¨J¶ÿð|÷·¯Wû4&o¼ÝŸ?Ýéz ˜} =:ç÷çW»ï†o‘F“ ?Ôh‰4…á—Ù•·! /gj$rÁIqÁÛ.8ãÓðRüÈkëUP~xÍë,…øïóÏväÍè ”8¿„Üò&ãI›áÕáÌpßËÂ7Ñp+ÖU™àYVcÔzxZ¶£±j§MJ“vùä qòÕL2Ší‹Ä[ònx[ˆ†7ÙØ¢Ìd–ƒalÊÇç»íì¨Üþ·Ó”FgUØöWØñØÑmçåî›wõXŒ)ÄÞUBû?d=#²fŸlfÒ³êï|ÛtF!BƒfE­R£Jm礢:îµÉz³'H“XtÔY|‰µÖÆœâm­IûÈÞ&Ã' ¼]o1pv[f_[€HÅ×Áˆ¹âë­3¾æµ6²¯ÛÁå`1°V$’§âëÊðâÀR°Å×ÖÀ™¡2.ú  „Ðp6Ø ‘£cS ¸Šn4¡üøÐp*ø9©pv¯QÆ!9²{"Ò¥I7‚“:³ž,ÌﵓCèAØè²”3‚Þè’wÿ¸eè `,’!çÂð¼ìÀÈŠ‰€š “XåCQD'ÃŽûàp…ƇÏ~£l¬Á§÷pV=HÊúŽáUvœSˆv­ñ Ÿ3…J6¹d‹ƒwqÊ»Ê2ƒBÑô5QYÇGÌI‡röqƇb¢á›fò×%§µïOŠüˆ´´EA›¼ç kzK¥^ŠužâðFÒ)­©çTŒ+H Êz+GÁü§¬-©˜ô]¨¸äí¦Ø¿óæ[ iªGuòº£:[2nˆ½=pЮèaþÅîü/ß ù˜ ÁP§-ò–PgRòÇYY«Éu>;Ð¥gß.QEvëÙs[~©º:è^—£Îõzmxú™X/À*\욎· ‰ÅÒ’*&¼ùfø-Q•:ñ’ù±?å9ç¢äxÍõˆrÂ7 ²ü*ÌŠRÇ¢–S8àƒÕÃWsÚlùAZ&ÎUh² á2P75 Rã-KžlД|CÏHe9v‚»l_Ï–]V?‰<(ö8¬V;™TÈË%Æùáœ}†²ƒÊ]™x×gc‹pšÐ1 v‚š:›:Ó„²_à‚mdça«µ:Ô •*[9åštÚ›C¤N—…÷QßwÁqLçò~3Ë‘±"“IB«*ߊü ûEŽAtè"Jr8ËBtdrYse±Ü–y’µÀµ^iƒLÑ•Ûòd2Š€%¡/I5PJr?o@Hn¯«‚è}f§-j_&@Ÿ$CjzÁTsuû¡äŸJ¸"Ô+uºÆ% 1:œ(E4yt™6ÇÚ•ŒÀÜÌ'e’mÝbuíÕŒ…¾\×V®Þs6D-3îzNÏ­º²Íº2)éY”éYD’qÍî¾}·0!„œËX*4Õ04ì½&òŠÜ¸QŸ•>*N'3õ«ÊÜSç×e›o람¶¡ãáÅA[Å`*»žRu®ò¢Û¹)±ó´ÅG¬ ›Wê/]x‚ó$Œ(”UFô'Œ9·!çs"ºÚeU2fu[ÙÚÊä$<.7ò&€2}^5Øk‹œ”»Gþʦ¡“_íl³¼7Å/˜É—¥%7±‰º4νiŠÞåRëZÀBÃqËÒkw"©»þÝ·-\ÏäMÕëòÈF6ÝÉÎçD…ðqQ¦¥‚O¦Æ_š3ìI)~–¬jÍGu~ÄÔ±æ}®ËÚvæòº:b±¸ÌË“‚geâS]BÃŽQÓzoxÔœvNO›Ý8M›`2˜Æg#¦Íªu½£R›íF§ù8W¿’Ë¥Ešù{^“IDÓh»Ñ”’Í*MDžL³¸`Uj¯iªvûÀ°çmJ¦€ÙÖ"ë1ÌsÚå7¯ÃêXì46éÉÁóøZ¨-¨5ÆSmt£¾ÎÕ[£³Xç®r'êßçÊ!Ãæ°\•©@Æ›ÿY¦,©é¸¼r_•ŸÀÿ6+Ÿ6|¸&³ŒÉ­ÚÙã2Tgmæ¨R˜^(Q¤w™¯­ ²€®‡8æS.}ˆ?Î]lÏ,Na/鑯3ìÙ+•€å䄉„øöº3ØÔ`=ýB1uŒZ@z/ÞjN¼Pdw?ðÙ&W”ú@l ï{&dîåž›É=¹È¥ ”ö]Ñy1û¡Þ:¥0=Ïã쵌Â]^ów“j^“O J¬õÆþ£r"L§w­”\ëpÉÆ5‡ç“¸¢q°î \ijoEþ‰ á ÷4£d¯´õ,(/ð­³Ún8Õ?ãIí.W¦­7Is$(¢Ó>9D=j‡n]ò…m«•é»n¯¢%Ñ·Ö‡JÄÃð)“zƒ¸3˾L¶ZkýÆÅŒvýúg£Gu¦ãwžRÕ®ÅPµñ,"Í]4-+7;ú0‹¼ú"œŠ]¦ˆ¢V¾[èÈ塀ø{g§üÇxÀ‚$¹Ç%P²'s%Ââͪ¨Eì˜_ç:&®ªá¯s]Ú(#U:äêI–§Eíëú"jÛÇÌžßD2­äCJܬ/’æbî‡^  U…K×ÚÌdÓèã· ÕA¨òã¼ÁMæ}iœ ààDm‡Gïîþ8rÜ®j0¬Û³œúiäKQ—¥ùWyß9'mž?ÛØ@ø¡_Ûy¸~dMž„~m^#œû˜5wfò›9Ú߈VC’ÈV·$fàÙ›Å1VXÙv„•“?Mn½…?ëFçOí<Ÿ»:ò0SiÜ~£õØãçTþ¦òÀ»¶S¨\]ì¨æ!tTï8Ê€ÅHl…Nü9.ƒ/Þ·Š´èRîñÒÞ€ÕNþÆ+L@à!Ï{C0¢ž*Zþ",©Zà5h—Áù€PDèó;VÇQ1ÉýãôI•oçˆ+qk¸Ãû`¦(¥Î!…L«YD-¨îz±Å R÷/–7­¼Ò+½àsÎ ©e€Ëpú}yª]8+/¬ gælÎÊãN42œëN΂ª†³ zh8+~'JÅò}mñkù8p%ZMLh·¤†„ûEûÞ"ƒ^¤£B¿I½-6r]ü†»Þ!NG«´ö½…ëb ìÂõé\†Ÿu“epÍØ.«±SÀ)íúúY7îK³ À]ùEnÜ”¡=Q~Êïá›ÐFLËfÚ?Ãßÿ¸s—endstream endobj 650 0 obj 2530 endobj 653 0 obj <> stream xœÍ[[sÅ~?á-àT^´J¬eî*•Š/˜ÂB@¤B™¤JÖÍIØr@ùõéžÛöìì \)ªÌœVïLO_¾ééÞýqÍF¾fø_úÿáf~®ùú³2úaõ㊧,±­í¯>üJ¶ö£7¨õþÉŠ§¬X[ÉG­Íz³z1<Þe£`Rz;œïî±QJ#ÕpT%%—vxƒTk•´ÇRê‘q?"Yf™^âX[íœ> ã ÌÂ` ˜È3Zå‡ÓixfÑ^¹í?[IãG ‚±õþˆö9þÑ #¹.w÷„…yA £¸‚“RoÉ8‰/…58/ŒFÇùpÉŽƒüQ.¼Ï2‡'ÏÈ“—ËHÈi»6\=š¶+á‘…í†iN§áñ4 î÷ãýÕßWjdzýÓÊ ¶±v´|½YiÅ`._(端û†ænÍÕ(•3C“{ ̓…õ B±»Ç¹Ð£VQÉœKn*Y |B€’j”t\†AÅŠ/£Š­ÁG¢Š­SZpØø™RU\<‹Zë,®‚‚8p´¨â4áaä×Ì¢ZËpƒ,BKm4ü”ÌÔ PÖ Z?üJ+½æ|ôZsT‰r ¦€áóÕþ_ £_)0at 4¾&ãWiÌL8_DZ;ÇÈHôv÷4#ˆ3<#äßïj0 7<îLòoà£÷¼ZfC8Žqj9j7|F8ÎjŽB?!ôBO<’)S­ÿ`ücBþš°EèO§1ªZƒ·ÞÃ-èµÇmt„?¯µXèß·Â7ÊÛ¢²BÉN~ < < ¤~©à×µ(eîÃÏeíÌaTV{ÖE%¸êA:ᫎ¯ë •1‰úAyo©öðÇÇd|“ô®e9*ÐißÌñ9ÜAÜgÅÝé¸:ÁtÒ¡S(;š°ú»¡•¦qIrWmà6üšÎ…Wò‡ñw»(‡ÃÕÏýynÄ&ºöZß ¿o:ò\G0'ª ¦[%,ßäJo\á:ݸ„µ°Õ…‹[Å|¹Mz–d‘N)Ðä«H–^DÉ%G¥Hð‡|9€;¤á6¯ièšNxÌŽS€<ÃS.Ý pn·2Á ÷rKn¹[ž{ô¸næþ9ˆ"¼KæåÂ¸Ë ¹pp^\“ÛQ¸¥ßw̓iÁ“1Éß׫(áþöÌŒïØpiMÉÀ¬xòñQ8¥E¶¼‰ ¨‚ á!tm¼(3/½t©ºcvL¤JA”üwÑý´7*ÓUæw¯Æµ¤Èaà6–œ¼ÜÆ„ÓÎûâÀVcDJ‹»ÊÙƒý4ŒÖѲ2 Ä€¸ÝÙõ¨”/jý>Ì"¬ôÕé….J%¬52iM3ã*ö‘hê‡ÉÜ·(Py%—VnDzÊÙŠ' '÷Ü>»—ŒeßfGX6OÖÌÌs•ÍS Ë7èœMvˆ)B¦WáA7Y-há6«¸¿V¬ .Bz¯yÞ•TnÉjÁ×á„–²µÕ(\` @Ä),àäùnH]D²PXÒ¶,B.“B‹šŽ.M¦C×6£f:JqÎD%ÞQYˆúÔAg!ÊÓ,ä¿1§†{×BW“P|¢“œ“1¥_£&¸Þì:pWtˆq€„ád5ÜGT›§F¸(;£’¾œ´Mצ>ˆZ³`²´™Y7Ö¦¶^¸wxH5]ucó.dž´ªç à!W9;Á¥XµæÎHñÛh•CX18ÖmÅr‡sÚêf¡©v¿Œá¼LbI4Ê&("§Íð§ Z:HÚ“~Ú‰¸'á/È8•¢yB}Üñá»’R) jÃ*® ”çå”Òœªª¤BêÒðÊÆ­j±a/€zœØ ¸+#K× L™\~”öö¦9ÅSSkÌÐ5L ×T+bgá ®T¹r/ <É®ËN…²þN$Ì”{H($9l&ᓎғ—c:²dÒÀ~5yü5É( ÍXc€X¥'‹Fã(²ÏL¡ûL6&‹*6̈́ʦÖ2|nÓXy»ÆÌ¢M`ñ}„H£pEí´3îœÿ­­‹äs뿃­Á·F‰¶¦’7ҬܹÛ¥+H°hô ‰ÐGÇr‰NgкKŽ{¥Ê3¶Ï.U»Êøù/”¡×Ê¥Äðㄉw_’q¯–ÐØãua3aL×ÂRbã4%pŠÓÌC‰œÚåÀI„*p”ç³ÀIsß'pàTj¢Ó)!‡‡ûèhppÃ¥úánÙ—F‡=JŒVƒ,\1<ë å]dQ¸”¬e!ëKŽVšvNibªEWóà½O¨Rù~µPÝ9«P=™Ý8ga=»qîXè•ÕiP]tì(ÖÏLL7ƒ! ´þMkç³–Rî@õ$Ö¡«[/æhf¹CÆÕáj2¶²£ö0.jús̽¼~Q«‹Øn±XI›W”AúPGÍNÚ±Ùéhá-¡÷štݱ£ðÍú‚Ãxç­Áe‚‘‚Ë_æëv­=H¥d®~}·”­6:ãb‘’ 8ÌAšB²r¾†äD¨ ™Y1zC!çVæ^ )?df>é™’œÇâ&€@¾¨~Q¶oÒý;â¶öp8·Ž7RÊ»l$V’kSù ÂË« ­¿Ý×E€ßªÇípMÅú­2«à±Vüb9¼†:ÅÎGm(7-«Þû79¿îÌùß6ªè³çigÝ…>U“Ýõx¨lO:²mÚ9›–ÍržQ<8(?ÕÿƒêÐT;­µöÚ¿ë$£G-ÃC×}0u wZ-5ïzÌ:„©ÅE©½c¢3n±„a•) 302¾ £ðˆ.0¦¹ïŒÂÛQËФFHSÕT½“\)JÿxÊ GƒC“ØsdºUb¿—ÞNmã…þ×Ú•wUç}íYæÏÄ™q¸Ã[åp¡1îþkòåðøMפûTïiÍ#²¦^F&€'ÿ‡4 ``âàSgBÀÖ‡—{7uHëw»àåvY1¾$©ÁCrñ|BÂ"¦8–)-ÝðE*¶r_[©·ˆ[…ò­ân\"î{‰[Ýqs±Íäe畤g“[/*Ì΄Êä <>·iœ¹8ƒ; ¸–0>•*8Ó|4ºP"—v£v(Îڊ뻯Â#~€ö¸šà¿×=!]@ÊÒ©ü‘T™YÜ4Ù‚VbªÞ¨ÆêgÍå@}5WqÆ¢Ú¹ÃÞÇ=‰:Þ÷±RÕÑh’Ò+Ð"ßV+šš;8ug£ qçD¸+Ï/Ô¸kÁöÓÈç·´aÄÔ†¡ \ÚM¡ýÚÂ/U¬'«NÖËÉ€LCÚ§ óÑ~ï¬Ñ}qaOx¿¹@kÏzØšÆ/b·^æ¶HŠ5w$ûŸ‚ âVYsÇÔèÐ*\X…H‘)!¨MÁÅ+mºp)ä2ïX]´·'ÖüÂû/'eõ6Z¼T©¯o ©¤íþ…I™z³Pzz Äs”ª^,Ø.À–]l]?vkÖWzúðÜ-%¶¯£=…`3¦Pü¸t.öú E {{Õaþ YÁk=Ç÷eŒÏö W-M€$fz=¯üb$é¨5Ñ&¥å9Ú8ä Õ:h+€€ãm“÷B™sS^ÝÀ—o‹ä=,u¢r°KÎ0wÁHN7{(¾´ðvC|/¡yw0;óqlöÃ…*|w—.Vg•?Æ—(ò•Z£ë(¸X>¶goÈ𭈎õt£»ïB$±\ü¸.9þÂ[ù¤Bf€Ïe+I®Æ.…æ ßÀUäkEŽ)äzOcÖëSë^NŠ2,ñÄÖ§ðïÿ¯ ¾Òendstream endobj 654 0 obj 3343 endobj 657 0 obj <> stream xœí\[“µ~ßâGœÇ³)vÔºRÅ IˆñäÁöÚkƒ× ¾@œ_Ÿ¯u™iÍ™9{™Š¢€YmO«ÕêË×-Íþ¸SƒÞ)þ§þÿÑåIþq§w_ŒOߟüx¢ëª’í>¾òÁ=ãÕ. Éow÷ŸœèúB0»@zpÎïî_ž|³ÿ㩌"JaÿüôL DžìþF-‘¦°Å£!X ‘Ÿ‰Ü tÚ?âaëUP~ÿŸ]p1šý{âù\Œ2c°i1=>Î\\²ñŸ÷ÿrB> ‚©ÝýsˆöWþe2ž´Ù_ž™¾è¼Ì‰hÿFž¸ðz?½ò;(·ûù$…½ azwy⬯4Ž»7Óc^cHØ·6¬OÏ´vü«²#PGÒ„µ°rŒrzÿš‡uÐŽÒþ)?ûèµ ¼i05 ”M«ÃÙ¢l‚AÅQ F-$뇈'(dYÊ¥!¦q„5‘ M„Öœ·° µÙFTõš’|Âû^{ˆ5¬}Ðzab­,5U„—PGµº:î´’sZîX ÚZf1Ø@e²­Y¼ûP¡öÎjjÃÑS,ê¤HɘQ?0=’Â=oûeÀ‡`;ªˆ9Ü —á—Å+åûe|»/Îi•ϦüÁ=G,B %Ý|ù‡çŒÅ 4üÑÁeaåÞ‘¶úi0>~si >Á–+¿÷³z•Yœ>@óTÉÏYÓ-1 >fEí¬õuØ`ŽÅé‚ ÝGüb´Áƶxë$u´ q\üß&]±Oð3)Ìù¢<;¢•ò¼,€¼¡Û¬Ÿ‚%xšW§|bõÛï T—œÏåïóöPHfÿ2G7«uÛä™Pìmf“ZòòßZªÍiïS™* £¥f.³X•‚‘ªYV£K¿u|{ÚÓçP’"ˆbsv°1ÇX3ýx‡‘"#°@…Ȱ@4H’y5db€›c5d._ò€NHuT\±.ø¥p—7yNÁÚ ä“GUîx• RH4Ý𜮺7ŸNÌ—!p7ÏóÉž`Ã*ºN^gP„W“örÍŸ3,ÈbâýgU,8ÝÇ™‹E %èWîU/H²úõŒ{ÿ¶,…ù±Æè]ÇDŠ[W‘P^Î-¨®NÎt^æ7Öw$òÕaî\ó¼— Úøòäþ¾ÙuJºÌà,«° ÍËñâaŽŒq ¤Án\ò)PB+•6œËw^ÁÎáŒÈ&DSm䘅Ï\tÌP|d´çWÂ^ -IëýLŒ?ãÏ]:¿ÏÍ¥!`ÿá< Ϲß4Ôh ¥|Úmw1ý´b„—<ªlð“Q9è_~pQß`’÷ÆI–ÌÕ™ŽÅU&y9á(¹ÎZGùƒ?ÛgŒ¡( ̈I*°ÖØýÛ8CNö¹ð#öíU ÌÈk¶&Nµ¤8Ì,‚#¢s㳸{gÐÖ“ß5Ïâ]üû”Uö?B7@ÕaÉgb©Œç]è_•!ÆeQìAcêQý8Çð]ï¿1SÇd!PgYfñ£8kÒ޽sA™Rú`ö0øq ÃÚ„Ôz¢ˆ’§#º-ªEÒJ1óä0-ÀùA@–£Â6Ç5@ Á!J@¬Awò¡LCô±ì €ZRÕ:Uãªg¬pÚ€¬pZ±"jD©¾ÅÃìЄ ª#² ²^#•[QQJ5ª[–?   @)抆!+ BAÚ|:?2º¯íþû¬ê ë'2aÔÄ`‘[e"Yô!ßN¸ý¶UËo®l˜Â3mPåîÎ@f­ ѧy}”’Ó-ö'ï9æV‡xÍaG'ß·%sÉe´º*äXHëšIŽ™DvÄžˆç¡Ç¸}„î%ÎÏç+4Ybðn:ò‚ü¼ßXÞwmcègÍc¹’¬m2ËA oÕQ="éÿR}R5 ’IU¶¤qØ’š´òŽ[R¿Ã½ÿÜ»ÅÉ@iªÊÃú†¦Ü>â‹)·7˜@ŽC¹ìRµ‘ŽŠï=tçþmD‚ È‹ü˜ Jî·Mäú ©#‡ØŸsŠŠ.¦Ô! yz/ÛPq,'TNȤÿ°…ƒMüRØB’¶|ÚT±”O1™‡BZ>m?n8©$§¨möxj·PȶoK–¹{dÓ ß[.ÍÇÓš—.¹ùãI%Ö#C£\O±ë 7yn´Ò­˜Gù_ÙAÞ âfÖ¡dc«…].$O a.W ̇×À>«}&à)Z,‡Gc­˜+›n£±˜s ê9Vzÿ{þmäàÃð3ž:Í­a)!OùqLÑ"?¶\k ,¢¡Èµmäh¡B‹…J0;XÖt=çù<«CÃçó-7âÓ/ÄÈ,<ª©T×J ÇzZjBð|bˆGhɲõºÈ'l–e‹£bs5¾ä_ßK½ºd û7’€”ªÁæá4³œíj?¼j"Gù‡"¹=ûy%häx9!*¼°p1ÍûXðºÁÓâæÙ¡˜eªUþB†‹y.| ØpÁÕí¿.›³ªÚ¾vª ±Ð~7ÿ‹ñ½ÑèÔîOø÷â¶–B±ISo.Z,#IÝЩ˜ïæ—ŸWæ¶\z×Ï]ˆÓ1¨å¾ÐÁö´7»3c G¾Éw#s°:ŸZp²C)qã/< Dµ¡Šöt9öV×:®&!òþù°>g"c¿ŸGÄš^îŒÜ¦T (I:[=pZíÖÊJž”r¿Y Ö’Ñ–£«£×[8r‹Ý.Òφ–Ò‘ƒ)°È.R9½¹áÀŽ1cÉïzaŒ«Â”îa²æWŽ åÛñ‹`u›™h›y#aRf!/'%©åþÒ—¯Ú“íšk¶G!Ûñ>%°ß¢ï4yb1õmg]8º¸ÙLáf#@Ž‹}žB–dòSÞ‡r2sÔ˺ç+¹Í!£4®’ÏëDBö”Ø¡Z¾Lt‰‘„PíÇ‘;”Š`dš™rn,¹bínæšé {ÎhÎB]“±v± sKÅÉd͵¾/…Aï““6‰+ ¡Ekô’¶hÑr>),&-J“”çùâ4ná´¼‹„‹!+T¹æFóVM¢Þ—xê˜PĨ YLêï ü0ù¬¬ª=)'îµRBÊbë(„°‘mœ–¦ÍGŠËös/Û€G-.KÆîºò¢·7%skOºMëÐL™gc–E¼.ï,F!–+êõ–æÃI–åÓâk¹sÿeûÚ Á~:uÜ'u½gKïU€b˜:dÇå‚ ¸æÔ‹LÆ®`´£>”Õhüüb !_ñs-2:£ù2‡ Vóc#½Ï×LÌ+!ywªº–wn–µdLÒ¡¦û¢£®$ÀïB™»åtU§0pÌ{—ïQjC&ç“2p—Û¥Âd–!‰ä°·ðoß X ­“ÛU>gN³ ºÕ.EQï®:¿îw‚oaÆÙp±>^ ~È Ãäó‡zX®±ãHùœOÇÁøŽ ¾Ç-EAuÛ=UŽ¿ŽeHµw¼²a×Üú“ Ìûq“YZL¨¢\gSìa·Thg0 ž±e¥6òyu·Ð£xôðZ7 Ôo“ÇÎÍD÷‘O’(`ߢÙ${ÐüM/üñVù5ûd«¼Ü÷=,:Ém´‚Îu'·áÛûD`”Û´:~Ó‡[³˜ ¶k!þnTÈE­S/=Yàw×Qq ´›¤ç/I“륿I ³v já»›ƒÞéÚ à£……I)ñ©ã´|hÍò÷ÀrùÄ_ Sè¨`åÎoQMyç·l1rR.¸0è¥ç«l1I*B6ç.ÒKzé'ì·Ö¥)¦5ðçˆQ:¹¤¸ÏÝ­Á%ü/©©àʉ¤VØ8cÆ‘ ê ÐTÖóudIukPoA3SäûÞ@*Ó§³IêwÇ>ÿÅ!ŸAv ³U0üâ?Q1ü nÓ*øoÝÓ*n‰Ø‘ˆ~\þаÞñßé–袼Ù$¼ã”gzáeLnÁ5—ãoVX%€NVÓ*8Bùد5…’NF*Ã*nY*8`Ÿôò>ݾës 8‰e÷¬ïä2Æ(þc’ ‰Ï‡MÒù..nTFqvÿ[,¼ú»1J|> stream xœÍZY“·~géGÌã0eN€Æ”_r(å8q{+/–$­%m¼‡¼ÖZÑ¿Ï×fÐ ‡»\)Uq9v°ÍÆÑ÷×Mþ4¨IŠÿ©ÿÿòj“ÿôðå²úqóÓF×?Teþp¶ùí7äÕ¦äÉÛáìÕF× †`ôäœή6ßܪ‰”1)Œ—ÛšŒñÆŽÏAµÆhÆŸ™‚5!òÚ7)ä¾/ò>§¬ŸnwzÒ&9ýýÙ_7Ƨ)à"5œãª¿3_"o47Û…É\pÎd¢1f¼ëúCÁ?ðÅfŠZ¯ 9j¼§áð‹á4?ÃÁv¤¶Ì2†d]rÇÉ;­4~Íz› d¹ÍÚñ1ꢳ²ñ-O“QÉBXÖ)§%ï;^ê Œ¶Eï!yxŽä΄KBŒ‹–’M“ƒŠ¯b )<©XA§ò@©ƒ÷ž¦À´P¢¢É†ûU­ã õ”œÓRÕÚ™ º|À=Á}ÅRPtºzž½Äb{„—0Ý"WýAGoš¤„ð¹xáBùø‹jï…×W¥+,œ&2Ê#V³åH{ëC1WeË,ÞYmŠE± vìXnJ˜k²q¼ÎìÁ:·ÈYŒc…œ EÈ9ÛÔ{¤iÓJèlêÈð¾«+ß§1gÖm ŸIq~‚±ŠÆ¾Èé &Õˆ¥Sˆ|ßd}é c±¨F²qEuОUgùTÔEÚYËi u*yNjÆFV]MX™÷–?׎(‡X½âŠY±Íu¬ÏËöqo9‚™ré’ƒöËÙî‡gdî›Æq!6Ÿ¶*’‡¼.‡˜hVL^Obëý÷gvyÓáò»îKÁÁº)˜ñÙÈ¥È9‚]¾-Vô†t1†MΔd_/¯æ²–챇\·CïVÃ_ðïëÇzrä¼ï½N·«R[J%š…,pzé?ö˜”Xÿ˜gÛE{‡¡¼à~pwaj¢ÙK½ußý‰ÍߦHp.Ö7û‘÷º¢‚à]ÌE™UF1D[òN”"ÍkÔ\ÃÆÔÁر_1Bù9Äóé‡XdÛ׉Lf&Ò¤¬Hf•Ði‰¬ÝKfõìOIf'ÿkMf7«ìß퀠v Pþü]+P‡ÖXt¸oŸNÓZ¢z©iÞÊ\ZiÈ.H” ¸À®'ïJárþ×q%Üq=Ú·ƒ&>bòI²o/úÑíŒ:Åk‘H?{™ÀP¿%Ê=œ ãZ4»h±Ó~ÕâìùZ™Þó+áTžGÂ``çÒDÉÏ™´@’w#±ž*lÑ‘KwÉ¡w@ÏÒ Üea ^‡ÎUÜð¿Üî¡Ûš­8öSöqÉdcXÞÁ7qÁ€˜˜ÊOéƒn„iÎ18öˆ Ž3ÃÈêÒ?Þ•Ê(ë›í¬Ž`]LjJS°ì»3%Û>Óìà´Å qá…"äåÏðžD4Øàס˜ä¼åÛ áÎ+bœáÂèm4ŽJ©Jápzh”,ÓPMmDRaæÅ)…žöãÀ>P„‰8–*(R¼ÊåÁ0ì•Îñ¢¡äcÈx~õRfÀeç“¶”½C½-S*8§(Aý$ÖÕ#ÔÃì‘0ÆC¹CëÁØ~ØTèªGžåM!A¹(öƒŸKûåP@<“; G~j’V])Ïç¼B”§•‘ð Ä <4àC=æ§TúÏp œÈÆþåïêmm~94õ]Œ½-Ï%½c,õ"¼îè×[N-*ºYþ¼óç"4Ü´#¿i÷Ìj‰kÅÍ1eÝC!Å™¡ã‘©æz9EjS ü!»—Q !~¿Ý!âú^ùíóò¾ 4ò´GÃ?‚ž§=‹Çðç™Y./A –G ¬:ˆ]®¥mê©êòÎU9ð2òü>¢à’YŸUh<Ñ>¤“§BÝyó5Ϲ(FÇ#~(xåö8ÿ®½Dx ke7«eÇÙÒÝH5¾YV³‡i|^ dœ û~½Äëš<ÀX@æZÚÂ[Á!1„¤¿/hù<OÌçÌÍ^ó¢qß­:íe³Á»ò ¬÷õÁdòæ1Ù ¦\OÍ!j"ìÇj†¯PH÷Ûœýæ”išY'ë6MËóM €vÝø«NÈ´ƒIÞðÚGÏ–‚I {DÒ>äµiYœ”ÞQAËX¡½HO%h½ü™ã+à@âÈW XÏ™«(S" Pì`ÎW3i= ¶x!Ižˆ:k$ÏcË­Šºo>Õ®Î2/DѼ^¯±u*ePãh 3âyõ¶ÁN7’‘¬Ýi"¬ã{w"<{TsлmÁDz\†¢-»ÌY‡ø±¢ÕZ­ähcäq>ï³M?È;ŒŽšìyN‘ýXç ™dîd²ÈRö˜O‹ùÚP±´€R^¡1‘ã9ó§UõxøilÕèsfOŸ­cdOŒâÂþ•¨Š7"ã_ïò^}¡Ë#³èÙ¶ç/cð&d!ãBÉä ¦öçG8gBŸžOt¬ãöO…+€€“µÄQ²ÂÉrר ùîôÛZbB^•ôŽÜxBñù߀½„”&:søzkt‡õå¤ü„y¿LP]ž#šK‘Ä8ÇhЇØÒ™EÎÕ3åÞ(í½x‰Rh8òгžc´)[bRiá§‚~!è—‡^Ÿé×bý\ð\ ºˆ’ñwû)rχ‘˜¼¾Ì=È9»G:‚hËhíͼÑùCôÈú„Kž,—H\NîþM!›ðßvä„èµë©|ÓÊŽøM‰lŸâjÄç æ]C-2às¯’ç;ã¿¶ ÒF—M䪜aMZ“WËjKÒðV3¡½?‚ãå‘’çX•9ãVð|x ²îšøÂLÿh%~üe‹( ]¼É;n÷å©}Þ¢ýþ?H¤1kÐøÅ°>ÊÓu”—›°fys©ê±[Ò–ço\òÄ.YtK !ƒÛä,É$SD“Ó1=ÝA¤˜Ï„n½è ëJ;Ú¡Ò2x€§×ÝûИåI¤äâÁ½é¸j „žÇqÏÓZœ™"[œ¹Q—Y¸RÝ—)B­‘\•"›*Dwý1ÇÒfûnÖš* `â™yëªfŠl«$Wé«$×G6V8À†DÕ¯Óìc`åH—Õñ ÐÓ<ÔiÅK)x8zQg("x<ÞIúDI×=ÔCÿE}MÒ_Yÿup}@ωà˜ÙlwÖë)Ìwì.kÍ#®B fö_D1¥]ÖY®<Sj]ØÑ¾*zТéjvÚf 5pŽ&æÂöŸìK”2¿IC&ïÅZtkót0•ÆmNøý?Rþã¾àXÏíPî„ò¥ÄÉ}yä–ÈÏ„8¸ab»6Ÿ¸w<›èò‘èáƒÈUÊ*=¢Xw2Éó¶ênéŸP°â‹µMÊH@⡜à1HãÚ}‚˜d-H˜ò©Å˘û²¬ˆ9§–ƒéú}£Û}ç;E‡çuôiÅÄ¿üPP0t.Ö¦«}»³÷Å„ÞCe²O:&úʈ€[¢ÕùÅ^Un5r©Ó¢FÎõ\fáJuŸyøg‘níg‘FAz4h…“^¶¶)?_ 6vYŠŸÒ¼Æÿ Eß[endstream endobj 663 0 obj 2955 endobj 667 0 obj <> stream xœí[ÛnÇ}_è#æq6ð¶û~qà—8&àÈŽ‡ÈKâY’%G¤EK¤ý½Oõe¦zv–¸6B â°XSÝ]uªêT/ùÓ …$ý«_Ÿ^nò·ƒOO¯6?mTýFVµáO盿Ñ^I$¯½οߨúBÐC0J8ç‡óËÍ¿ÆÏ¶RhiL ãÅv'…1ÞØñ ¤ÖeÂø–¤!X"=ã„T‰¿÷E~ÏIkƳíN e’Sßžÿec| Éáü–úŠô’öFéñõv§ƒp <#± Ñ3ް纣ƒŸÓÂFD¥Æï‹8*ì§lSé”ÆïØ›?°7_Ï*‚‰ŸÒ³õÎËнú¨<¼2^âU£ÖRó•^ÌÏg+tÞÏÏ7ßX!ÝðË&h _‡ ‚.7ÎJØJ“äbóM„¡˜¬OA/|V–.‰˜& )''¡å/c6A«I ¥…OYë T”É9ű"6/õà“Fƈ+¸Z ë‚¢ Q`•¶bàÐ;« ”LznRk!­j‘þ÷XBm¥EÝ™n4iÒK`rNûP\ª]ÀgÞmzÐ>­.¯¼&ÅfYï¢Ô«Ë¡œ““ú«yͺ<¤ÆwÛõµàç³nû³î|)º4ì´ÚB1«å$‘>YÀNƒ/‰öj«ã L]Y{çwåçÊÙ‚år”œ~POÒŽ?R¢éßÔ(éà¦ë¢­s°bR§q3¿XmXG)Ø„•¥m0$¥GmìÂŒoÊÑáÊØíÿšÉë‚ðD§>/Î_ÌK:°¾dó—SȾù,\åçìÈh}go^¥+é¥Ã¦-½œwÊmð]ÿBN•Q·"3»ò¤‹\ª(ÞsÌ“I&îÅ—jrYŸÓ³61õ+ñç׈D)j¸{Säõä*œÇÎÑQÍ„‘8ГRû°ußÔ Ê`ݸ—ûq¨®h)ÐåÏ®íe§’ S”-}“‰ð¯¥QEobq²‰àZ)ûCrY¤=e‚CxÌøÏm2"­Ë¦Åâ±t«‚W¡Ú°±|>‹×ë’I©€Â¦+Ûü9¿£S 3ÚSó¥qs…s‰º\!ôx6Då+ÚjÚæp› (õ†ª¨Ž8ó"1ž²g GëÐkè\+ò@¡p5ÂÕ]f—öG&kÙ‡¹%aÈ J¦îŒ<ÕVСÉ÷²âÂÔW¸½¢E«sWÎ /ÊžÀb/g@E‚îá‚åÍÍjrAŸ1°£Éd}MJÑ¢R…V{fàðº‘ÏÈÁÅ7Ë ï!7|²ÝYp®׿Fžî3/$˜Nq¦•ªsæU‰kJ}þËÊ7_”Ë[»ÏG]ÅËÕrÿæÀ{ÜøZ>Øæ Ø+L% tޏ™JÛàõ¢5 Ñ —C·Ï¢CG_#Á¦ÒŸØ ¸œ#.7ó¶&á¼­q@h¡FÆ›„k¹ä¼i5 gŠNÊH%ofŠÐÒ(Ç0E ª€ý@¦X¼V‹6o¼9\æ.àPïÝj·¨6ž˜% Q¡L¦KŠ–fhÜåÝi±¯Œô]MyqÁ Íã¥l«i2jïÍù4q̾gòÌYáFh·zj–.6nd“Kö8nÔu˜L‰Ì>yôÂa^ûs­~¾5FËwR Gò¾yÒüšŠ=âH;H¬b –¨X¦Qm_nÎÿpÿi’Uû¹V¼ MŠS)ŽV®r<¯úÝ™ ÀÆÈIì)kð\¼Ym•äÞ nkXJº– ¶ÏËtÕ5ºÿ’³fðú½,®CˆNœè·àD{Th&&“„“‰äHi'­TßË®`:á ÓjN…°/@W3*-%œ>† Y¬£ âE—3!^˜ŸÍÅø³\ÐÑÑ‘¾ _‘gùn¾µë<ˆ[¸¯Wlüê†5ò‡< G……÷“ä6·/ŽÑÜà »éºôHg[Bç$Ÿ•–ê’¯õ1Ÿ¯Ç‘-÷£ )ç&T¤7Zå_…ç*Eµ2ÍÕWÝä%HýÌáÖܤQP…bîÑNIº >Â=0!d1ÑÜó;ØãÒl©O?ßÚ„~73Ò¬p5Ÿ6ÃÞ³9­WpÀ!ÿjH¬ÕëxFo%l~útî4ÍÖqí„ÔChêgËòT æ“¿]Ìy4ÛÛŒA¨ž,˜w7Ê¥hEN|º.¥2éùÛÛK‰¿µ”  ’©¶/s¨@ûÛ“Z„CðµäÓǺk…/»>[®cbþ ¦^YvwÐgÆO·Oôâb((FV)iO½'µÛš`ÜZóEËaŒ/r¨¹,˜B¦-rûôÞãÖ'ßC0özðúE?ç–írnAtýÈÎxàŽ·Ú)Œ0Ôqóo[£ºÆÆÇ.gsýÚ”ƒF¨;9·“S×Ê`Ùçj訊ª¦ÖJDOME£%È4In­š}5™š Âa?‰¦5•9¡x 8¹åÕç&¿Xâ·ÊdÏO˜Î%“³ El¸oíû¥ÓiÓü~¸¬Cµç€e.÷ÄÛä?“],ËúÚÕ¢‘ÕOqV‰N?\ƒ-Yµ ñÝõ=p¿Ðu¬O©\¤(cX¡ùÅJ'ŒÆ+…PÞ§®×½`Ñ;š%v õÄQgì6ɱ è\á„݇‹ÝüñÙýï~S€·PkMMpß/´êç~]iß‹K‰)cë/g´ už ›„Om…–ž´R}/K:-åŒè”Š€O¬Êyºëe«Q@€:ê×<ŒÔ"ùZ+xxÌögÖ³[gVb[‡îî£ bd…¿Qg4 óT £„eßwXQ餽×ï6²"iÕÿ|fŽÚMóv MAáMw>ÙóÏifÝë¿É̪“OÈð6³¶o˜Y©°¯Ó̺ˆØif½73k¼#+ –Ê%u£ýMrgÚtçtbý–õ?Œ‰UƒC 8t«äîÐUôÛçö„݇‹ÝH÷¼§‰µÎ§ó9Ͱl‚l³(´ä¤•ê{Yr+5ÔníOKŒ‘)ô»h^VjhÊ_’Ð-7=N›–à üÿ+¼Œƒendstream endobj 668 0 obj 2369 endobj 671 0 obj <> stream xœíZYoeÅ~¿šqß87н/H<”‘HH”€•’=žIð2x⟯÷êsúØ;ˆ€"ô-W/UõÕzï{6ó= ÿäÿŸ^îâÇ=ßÿ±®¾ßý°ãùËlû/ŽwŸ~# ÛûÙaÔþø|Çó+öVòYk³?¾Ü}7}y`³`Rz;]ŽØ,¥‘j:UIÉ¥ÞªµJZÖRê™qO÷}÷i¦äôüpÄg.½æÿ8þÃN?[\ÄöÇg¸êOÏ #¹˜®GÂÎÚ₳@ÖÖI)§÷dŸ#…5ÓËp±œçÓy";Ž÷¤gráýô‚ìü'ÙyÝXfB> ke´a¶Ûú,­%¶L—ØÊœ‚ zÓ«¶|ÙN òþþx÷ך™Þÿ¸³‚A×ÖΖï/wZ1œå+åb÷íÎA`ôÊÌ+ˤ™MdfÚÏÎWJ`öšKïq•›˜ Lb6>2mB»=ç³×šS(x‡·3±7žÏ’¹„‡¨;Å­áÙôŠYü;ý.¬¹•Ú‰Ž~ mpÉ-wÝV²š o0ô ÒÎ^jQ ñ÷)aC1³Ò$WÜ ñL=ó  ®4d®„»D×r(:N˜E:³‰þ6@Zkaìô.cÓ훃B®'AZÔÓçÁá½cÎB€ž™Aš¾Í•Á1+ýº-ƒç ¯H+Á0îËÁP æsšµÜ_¢¡‘‚'Ѹ“Ö‹öÊ9CDYàEK¿?ªØæø&Óx7¬ò*Ô ¸Å 0˯A«gååô·ƒ—@£3\4•ÎPp€rÍfÆjöœ[<gêôLT4Y14Šë Ðq„¤QŒF‰†·!kËŒÁ ñw”fá3€öº¥ì‹P⫈¬ØÒ¨]¶Œ‘ 1(Yt(YjyR´<)•˜TaòyW t< 6”S¦ÐjHz\Ç,)‡ÀÅ‘ŸRiT¸Üi‚r©s‚p‹Û¤˜>$›‘ßdÎ/£aªŸ …¤Âç5ýŽ‘ XÝ*„VhP(Ý¥¯q‹¸)5kª—-ªáõ¨­¬D Éç-2PW‡YD úA%LƒÜÎBTÊc 1ä +VJ¿·{žF•Qâ$Ì‚C VІ†(ŒOZ¼KyQ1oe*Ê ir¶*þóÀî”U®Ø©Ok6'åß'$!¬*›VÍ,yâz&ü§ËÄ’×焇ܵ)IúØä+S¡d!ðevªâ¬yäÞ©˜@q Ðh–—Æí8üþéÊNì lT¨oµ«}éÕâ-‹ÃõìCRhÜMëŸ4­KÀaÿM Ç«a^}måÚfá»Ô|{«U"/±P«×Â?D­Ï ÆNÈú‚¬†¹óFloj1Ô†X¿è ×!á‰@­/Rùø„I£ydÈ1âÒ†ØlLHI˜K>4ô^´/à ]Ò¿! ¹ ;™f¦v+}É;rOß“ÅÊ’9Ú´Åð„icà‹†Ý•ÀŠŽEŸþÕÕ÷x]oÚ"£õVãô_é–èÆ,¥XtsWé%!vÿØ$Þº…XZ.µb‰d/ïC?Žê§Ôun¼ã­É"žVìÝÑ¢¯É0‹`5b dôpãgíä\â4E¹ÇUr9ý¨´᎟»ýSNð4Þ*í_¡<ºýSpCoÜÃÛ¿çë|é=R*¶ˆ'„ç’ÐiNþlYŽ-¢Šƒ’E­ÞîõÙ2T‘âŸU[´‰oáš´(™Áå#]mkS~˜=Žº½F:ë@{AM ˜« ¼Ý ¿!ô{”ÂÈÓ—ÃJlYŒ¨ìm2°5¢tªAz%…‰¾ïëá[ן帩}mVuãu‰Ä÷%ªÈMóÃËœXO¦[S^S=æ›ØÌ+d½¨Âeª´}4$äwa’ÈîÛ2˜Ì‰‚3aë qÕqó¡ˆÜ±§Q ÁþØøgMœëp=·t5ɧDÞf´«¥„ñ†ÇH*ÃcUëÜãï‹”ŽËZtZŠre ¸A•*ü­ ÜÀÅ ×#nÒ„¯ñD*úè„7aF)mWÄѺ•Öªô È«6~ÕŽOàLа¿„œD<µAcèäUÁY¬\¥> stream xœí\[“7~?áGœÇ³+$uë–*^H‘ $!lñxˆ½¶ ñÚÎÚ®`~=_KsiÍÎÙ=»ãWRɬÜ#µúòõ×Ò¬¿ß[ãöVþþÿøjWÜ»ýçÓÓw»ïwnøÁbû__ì~ù•v_L‰>òþâéÎ /$¿OäLqqµûúðÉ™5Þ•tx~vn Q$>|ƒQ&r”¯e4%¦”å™(ëŠ~ï·õ½`™Ÿž;ã¨÷׋ßí(“°Ý_\b©ß‹\ñ‘œ?¼<;÷É„„.e8¤LD‡·êyP‡|Ї'²0™ìÜáiÎú45/åðH½ù­zóå,bÔðcyæ¢MÝ«?kÏ„WWxÕæì½õz¥góã“yÙïo.vܱ±aÿÃ.y [§d’Û_í[ÌU¦‘ç»?í2ìÁÂÑd<%KÑÄ*lC1¹L#"\‚…TØvÉd©qRÞÄ*t4\Þ;gJN‡BÉÐÝú},ÎÍ-Ú–\Ž”ÿ¨KÖºØlŠÅ£B‚m¿‡7Õ¨™Š÷z\Ì! G½0…ÆnŒ‡¿Z@°ƒ| NQF˜R™ä_KÈ…àcjZ:Ä@@˜À²1gb#ùXV×wÑ$*yœï5²cÈÖ¯.ŸŒ Áæ•å?—0‡—ò¤ üêïÎV—õÁäÌÓ®Ïú]ë )™MõH¾y9X?ÿx»ã­>N’—sÊ;›=Âýo²Ÿa¼a#>FGÈMÉïx^ ‘[4s‰¡e˜‚kж³˜Ž0 ÖÁx€Ô­ñnœ™»ásìÅ´zÁZ®¸§ᚆH¢«ø –ãNzÐÏsœõ+ÚÊl, ÕÌD$'BúK`ùœd/Ú$¹d 2ÝBת“%%û²Ÿa|OoýªF—¯fE߈õ`b±Œ”O17$Ó‘»ÌðàBâ\|±»øùׇ/Ï€fu !™×òŒˆaøL_Õñ@Þ‡t’ëq=Ïäº,`SœKûsGSjŽÏ•Ÿž¨ñwjüã%`,&H‚O€q§cýñØ‚pÁº€± Þ4ƒ†ãÞ½:cà¸íáêW¢0N~½þÞusˆsqHJ.Æ"QƒgÉ;Ô :!¥âPÆyV >Zå| 1Îceão•Ÿªñçñ÷dïË!tÊÝmÀb¤÷Ú—S”Üjd~ïX«Váü_P'xB/pŽr¾rN›ñë‘ü9h¿(-’ŽK¥ÛŽ\r¹#fOšh •HÐ VIÑ@A‡ƒÐá™úŽ#ŠúŽ,Zòr*Ãk4’§I ¦6T´Ô0¢¹6Å#ŸØ·G¤H¶H¨ã¿G²- ?u‚§/jœøTã=_Ih™Z|ç­¯&ÙUèI £‘ÿ'éz-œ÷¢ëc \£ëÁ¡»‹]Ü@×¹àBùÀ×ÿë¡_(9öþ‘`äeäR >0òŒü#ÿ¿fäsuø©0ò™ O]ä‘lCÊõÛãH'…‡ i©aDSr.£Þ*JNXÒø´…’cª8܇hPÐ\YÇå ŸT÷ä‘ß©gÅÈ¿”áˆQògJþ‡:[ è!ÎL²_Eœö~t.5íD\3bï`ËaR‡Ý‰Ÿm5" fº²Ý¶ŽÙØõ:ú[RÂÒ@ÁØ–äµøª¥×!'wkó0v Ûïc×0þ¸¡kÀ®aâá"§… ühð0¡„7”œö'Ôd QŠù0–Bv‡fÌ¿\oM®ôÏéÓøH¹Iƒ¸Fî•Qen)ug–uYú¬«K5/=å2vÊTœ5/ûŒç ™¸–Xî‡rð\-9˜'wÑ[{rd;oçâ¡Åçù^7yî.ÈÊc—“Àœ±ÀR“$f2ø ¢=¹Š»ÃÈSbwqXíï€ya ÐÇͬù8+7úF\õ¹¦3ÍA;9)†‘´áfG—Kô#õ…ê`“|#r<‹ßÞ•Þ’:ü‡Ê<ÝáïH<Ðfѱ¯nîhïXRúOöŽ5bPc/¨aˆçS–[íqäVlï[ 1b0…É2‰¥ŒÈ>›Z¹æÖŸ.1`¾L²aü…zþFÉ\©ñ'jü®¶,'xaþîT\§¬mLQ!IßVBv',r'Fé)^¶ar®[Pa†×IÿÒ×Z›Gúúc¸Æ_³Í锢þ þ{ÙjÂZ@úI¶šw#Ñ Mÿ&°ªbèZO¨K×µn=åЈ²E«5Ä\ÉGº¼›õaDçAàÙËt3ĶJ÷z"½á)/a<‘›r¤µýHAí{ä6·äâ¦þñrn‡<óH³Ç³¬žMI¼œãfÈÉDìug©ÐÞÐZÎÞÔlªFol!e'©2¼WG:)t^ ÈZjéZKì©Ý M#Y>Qã-­¥Kpa!ÍÈýÐYÊ… ìxäB¦k&¿Qø7fSh´<ê«ÏÖ›¤õ{4íeûý¤îÛ1x>fx5=®ƒšD²›–?áZ'BµQü;…ó*ˆÜå säoïÇ—9X-µÖµ¶eãÚ2‡xŠ.´ ¨U†™nkm@Ê·–hø\t€-0àßÁ£]=x”z  ñ$qõ„Q£ß Š ?S 'ž¡õ›µD1=üŽéØÉbâR'‡ù¶th®'Ñ”lAÏ&ù¡[,¥ißÊ2Õ,«ßÕZ¹íócT¿ºÙÜ-Ñt¶iDaÛ„“ [ý­ø8rû¡Í*±G_åЩùúX⾈YGõœE¬n‡ˆ«ÛoMøu«'àvƒk‡SŠ7"xd©Z!W–K± &PB,OµîZþ˜äCå—W"€ ‚Ô¸Ô“=ž×›ç½)ùNÕÉ¸Õ Îb‹ž§1ÆPb'ÈHŸ£¤î‰˜B>Á–)àñá3S7š:4`»%­9ì×÷Š›«T€Ÿy“â°Nè×¥eß fkgˆ.¸Z••^¡{ƒ:#4DTÎÈÃMÚ#prÌÇÍÞ09’Sv ž:ÙWN@U‘ÞiÓÞ"޳WÛñ=I_½Œ¸“BŸáh˦1…pæu—U„ÓõrÕeðx8Ð @^öÚû½c=ù²tì}µ'±E¦Ü`éÕyLµktÍ]¿Î™7šÐ‚©ÃgÀ[¿Ñ4 «’*˜*oÚh*R‡7¹I(mchrå©SuG g)²RF·èŽÐI¹^wmêïçz>i n`ÕV$>ýÉb-„`4±lR×{³ ©ûYš42wFdo{ÅY®©‰Ù¤9€ÒÛE.kB¥Œ>+ZA5EÍÔ»œ¢w&åN*`›—äæ0o jÊò)]&9Hö÷Ú£…BÇÚI97Õ:Ì€"íN2vÇ5õÁ´ý¬)¿:ê~4ÓÔ·óI÷› ”Tí`–Ššû$a©¨] b´Ëtß«©¨Å¯;¸ê»Æ°ÓYwX§ó„`€ú<áT„ÿi© àMÆ Ǽæàæ¼c›rØ=ŠK€ýNƒG$/vбÜï4x‰äM;ÅØÓÚv’›JD¨ r‘¦„+ ¶,œsÈr%ÐZ ‘ÈÔIÝ›,£e'™´uù7òPñ³™e:P©N‡ºJ¯®+@F¯¥<±üæÞu=l}¯î=)2Áã™´^ìëÝK§=#l·GN0ÿ6c3š·0ö ›šïRÐÿ´é×kNˆ€œ´†¨Âp»}Ä"·¯ZJ~wÕÆMûH$×i›¼‹œ;i½ŠÜʦ^û†Ú¹ªD9ŽÚ¤¼ÜÙÖ)”òGŽT‹º©ÍKQÔšx¤¨q:h¼XÙ4˜ÂDÏëÆ>µÅ@°6±ŒªÆN*y“Ã&í1§Oñ$k÷ÇòMó ®N!Êaj¯y@j²&­¸mÒ¼~L™7Ù?›T´^ÙâÜkŸm’´£1ݤ¼ü*†;nuŨT‡ã³œi(=J$C‹()ÉÊÂ,EÖiM7¨‹)ä j‹­ÉI\è )@©òV¾ØPBr!Ÿ7Š|áòP^¬uѪÅéòŒXp£WcYΡ´¢bÁ îÝâ°\l²sD?Ê^Qp£×‹"wY*Rh”oÒØ_"Ÿ`èvëX¿˜Q½N΋À-•MôŠª__j)$qțǫ!l ovò¡R‹];_Öj±‹±G4Î~’`³à[Ç.¤Õw»JdÞ‚üò™.¡ÌÁk[×-0¶å©“’“¯Ma)Àñ„ýi”­Ø©%d+÷j±­Ž’qB8•MQÏB¶ò"êõ]þàëŸÊÚ5ú+¯§õnà|\¬ô+½º+Sz×9@µ®“íßäÌÐ íŽÁ¤håÔßÏr._ÝÁ$ûs’N ½G½Û¡ö±€óÒô8mÝîŸá¿ÿR`Ûendstream endobj 676 0 obj 3505 endobj 679 0 obj <> stream xœÍ[Y¯TÇ~åGŒòâ3R渻«zˈ$pɲy0¾Ø`|ß@–Ÿ¯ºÏR=sæ.3ØXHp¦§ººº–¯–3ü²6½]ù3üûýŪ|\ÛõWÓÓ›Õ/+;|0ÙúîÙê˧.˜uîsp×g?¬ì°!ºu$Û{Ög«oº{Ó;C”c÷ófkz¢@Ü}‡U&²»ÉjŒL1É3‘ïÍzßòϦîÁfk{KÙÛçg]QÈ}ÄAf}vŽ£ ]v¬ëÞm¶.ö>â€sYö1Q÷Q=â‹¡{)SŸ¬í~¨ËÉBž*¦u9w/ÔÎ×jç»™¤WËßË3Ll¶þ¡>¶tØjRrÎ8}ÒóãË™‹Ü÷þÙê+î_ÿg®cì£]_¬<ðÊÓÊÏ«g‡ gÃÚÚ>{oµárè³!»'äT­W®a]vÐW >AÜ—jý»rm—bâ€ ‡îÛ®~`b÷íF}ó§Í–M†äæ€wŠÑûó}2ì»ÿ¸œâ 8²ƒýÀ6 $è+Õ3ɤl«Úls°“f›(D‹ Ã~óIšé½·ÓŠÚedR3u¯DL— ­b%Ïä.;×Û¼Áe{çêÇ#\ûûX÷Ï®P5 ÔÔ¢vóÀ&¯•ih¦ƒ}bpãmáÞt(-Ñø_ªõúÂrAñ—Až ž¹dD›€ˆó}yäËñÀ¿’,ÈSø\¥f—ç%*Ëåó·a[è˶ ÎÖædÌë­%¸JÅÚo<{Sþ">Vï%nu¿dÐ& J´Bz„pÏÀàA!vQ!‚ G<»e„˜9&DElDxŠìhþB~¾,½}ïá®×Ð*XŠøEè \1bóÇ)âß#¥ž"Ìw¾‡|õúsüh¼è®3Î\°Ýa(iÄe¾|êÉkdÙ:®Ùe  ò.V'zXâ éÜuo7"‡³»WåHG)nIÈâHÌ5ë"ÁÁRé¦ íQ{Ñ+K€ñ®³ìQŠ6f °ÜŽè!QHEØ-¹“d¶OqGx…ºÑeŠJ5¢}Nú ‡¡•ÜÎèÜ6rc-Ã_*fÄà)· x±[6Í"òì™wÖYË…¢»OÔJOŒ2Ð7TIt’ô8ÇdßJ¯kBç3´Ï ¨«VE<_.Ú,e¸;z `{·,P¿!’"œNº[Ì}È‚憖É^ÀMË•ó¶amÛ`ÐS±M|bÛ>©e \4Ä&îÍmÅ¢@iÅÖ¢þw®’gIQ‰iI| ¾„|4;âÁÿÓÄ hAÝIÑK14ªPÌð¼U(™€ TS%n|þé÷¶²˜¥×•É¡žkOËúBlp–mŠ}Іb‡*&5—À"ž"¨(Ÿ³`Ñs:ÌMѬ3 l3ËÎ(¼ŒÆfŸ‡¬: Ï!ôVÇ2{c{:)–ÁB¬pØN×ê=°TsZª¤1iebícÅ:'ùX Àñ§(>!MåF¥h§zÛª”³˜'5Tbžx’ðèÞse±¬xÕ­¼¨mF¦¼4êÁ…†¨t¹¶ùÕ _Í ë܉íPâÔoæþuR‘ÒißôÈ­ozôÂ:«€*ÃIöTõþ¦ö­ š=ïÜ2òŸðØ ß`\mi¬ ï<‘çÎÍe23BÏw´¼ì Cëå«îï2 hiò0¢oª“ƺñ½´r=At (Ù¡Ñ´%¶lDÇ5N r`"M] ˆCbJs[ÃÀð´F[oPµDÓgQôÍ("Ü:–³@3­$ÊRà]m°´XN£m‚žÀ”{gr5ØãÒ¢%ŸòÐ{Æö$5´´h'‡öh¾¥ãHø^I8­/!±ëÑ)µþE?(ÜàQÊéLȱZ ~ʨþ_+ò÷BZ®Ï>ÞJãíu VÞ[^ô2¦A:.„>ü~ða1„QtýV!¼x—otþÞýˆòO!W\Nºuд£Øü¦á:«*àþô̹ÔóöÐ8'`Ù…R œ„¯œê|Æ…:ê…Ø@çÀûèt­ÍQÏæ×Ûg¢“¢ôÎÓ‚@L–Y­«7×®¼¤«Ðû\ºE_^RŒ+G½”öÒÔµòÝ›…ÒEå£Z=C@;>Ktéôñ‚ÜÐOzÝM§@¿–ûsžÝ÷×ç<bûëæ/Ž šÉ$»a¤ƒÆYi‡UÐ MÐ@pywцQ:r,3•Ÿ;„ýz£ü„ÖÈï]ì7óõFL>Â&¢Ï—€ñ.H7®#ô*‹Y6£4¸>uºjE‰¼(“.›Ð¹V—WŠ–÷7 í[å[µ~O=?TÏÐßݧ/4ÕúõüT=}€çõüDÑè½öùš³}žåù™z¾¯žïíí­¿]Ôwy²¯=þúy§ºi|r¥&äWÜÈhRø° œrùA¹ð÷ Órʱ÷!ü>§åçóª:a0.‡í)~V×®)¥ÆÌ-jŽûô`œ¥¿†Áø¸¢㚪Æ5Õ‘ƒq’ß’¨ñj.[fáå÷§3‰…{ùÑš’¤£m/A1ÊÄM±ø©k¨&åNjÛU·òj¹žÔK½qá¦4‡'á~iN-°£µüÚ(ŒǫþÇȹKÓ㤳þÿ¥¨Eœendstream endobj 680 0 obj 2846 endobj 683 0 obj <> stream xœXK7¾ò#Zœzã¸\®²Í1JrH¤$#.$`³ËjYåßçó£ÝîÝY«HÄcÊõøê«Gón²†&›ÿkÿy½+?'š~í§«Ý»µ¶‰M?wßÿáÔNÉ$uê§ãùŽÚƒà¦ÀdDt:^ïžÍO÷‘K–çç{k<3q˜ßïd¬úæËýÁf .Œ/òµqšæ×ƒÈ?ùìÕ«ó¿ù‚çÿ>þ²ã˜ y/Žg0ü[þÛä”ÉÍ7ûƒ PÅgUqdæùãpnFØÍFp2‘h>¯×‘Blî‘Kiq¯¼¼^Þ¬"f¸~Y½ø=jÌ^ÿtÜý¾óÆÊôi'.9Ú„·iºÞ ;Üp¿y½ûó[Æ m³rÚçîOp‰ ÁÊNxkMýæ³NPœÈöên±B¢L±Ú§’:2 91âkΈ˜4æœÁs¼pÈnÕ;ç²~,ó¤‰kÆ‚P§â¢GÈXæ™÷1g¬?¼¬Cˆ![ÉŽDV®k _j:,Ž„Œ 9.ŽR2šêÏ€‚÷Hטæ[TŽ£oÙ…¦‡L¤zäCVp`èVG•÷Z 3´ýÜ¢‹äb–)GšÞÃ<% ZñÀðM‹“uqO8ÍжènÇP©a+ÎÇñe)Oo‰t£±¢'¯&⤠ã +8f%™˜úM†3‰…”Lø µÜ@Êý ÐW°ÐSÌítDC ¢Šúû쪃ߺt˜šç¥Ì=TÅF ϒ õMåÞ|þšk÷Aø¡Š oÜñ¨EN´È×fr·kGÒõŒë“6)·?î6÷[›cgI¨–¨ñ&jÜ­??£~G«&¡CKŸ#§J\±cQCµTƒJ´¥lqkšù‡ÕáùU.UpÊÅìÔ…‡Z6ÙÜßÜcèãªñºô±š Úo¿«G/›gͺM¾Ò"9±1VZœí¬*q^kM4-oºî‹ª/„­@©?ßQ¸ce´~¾Váh¼Áà%l^‚6ž|Ôù˜Úè0§^u—Zˆ±#ã“j’xHKP«(4ÌW{4`’¶þ+åÂ6&š?ísQ¥ä69ã8«ÉÁmâx¿/œœA«^ø|QgLë’ËŒòàñèGÅìÈxf—“•p˜ð¹VÉæY“`ÌÁ–¶0Ò°R‘S))"ûËìûaqþ@ŒZ©<BÃ}”]Á(Mc^oA–ÔmÓ]:*%Œc^R/ÜG^]¶òB›Ð©è–ôbnú¸ä¼`ùóî$d,ž‘˹•(àʈċn½á`ý—pàáщ*Ë^<¿‡q?oO!ÌÉ3g/ËÍ8_–Y%QµK¥ú®Þ<` aÂQÖ¡/Ìl·Îì§û’a5Ü ¨qˆãy”y±Žç׃È8óNíeŠxì;%V-iH`~ô‹ ××É`ù›Äa(^¯?û¥<Nàá±)€,)JõIÁ#JLiƒÁu¹Ï›µŒ¯[žøb‘Å»þóÁÞ±Gk°·¼ûñÌÛÂe5…S-âo×M­íd’ÔßÝ7;Yð²&´&Å/1öŸkŒK¯¬/yl›Í©{> stream xœíZ[sd7~ùçqv©[Wž PlB?‘@•½¾fm¯³¶7l~=­{kæÛ‰ •T¥RµÑ´[R«/ß×ÒÌ7“j’ñ¿òÿ×W«ôqRÓgmôfõÍJ•²¨M¬>zVNA VO§+U&hppr¨„1v:¸Z}¹þëf+E‹ Öo7[Ò0Ýú8Šóˆ¸¾gãË8¦8»>Ùli$¼RëÓ,öÊùõáF MË…°>b3/ØÌ·]E0ñë8ÖÖXé¸Ê ¥÷Ö7yE¤?­ßm¶JH‹FGSÚÌÛ8vN#Ù’Ç6hZý‚ÙÈV¿î+þëàå꓃Õ?VZH3}»r 'Î §¦«•Ñ’ìMr¹úb9ÊOJ ÔxLd -â³óU2\ k:#è4)&J¡²ÑÒ-Bœ’Z ’6LÑÊÌqF ÂçµE‰ŽÒÚLj´‰y¢s>z;âÑbŽHYð5ÿÃUƒAc Å!®c¤Ã+«Àæ8ÙÑßÉ÷Á_ÇM¨û¦õóò(¥ÕˆºdŒÃG¯Œ6“R"£¢µ§s ?_üæËõrÞjÊ®œ e|ÇÆçe,m9a¿ËcCI•-+òßm¶F Ã®_2ñ¯7†b))ÍOù7i A Û\1“¸4 rÅgLãbÔhòS&?eò¢ƒRÛaÿÝðO˜ø ¦þŠÉ?íãèjCcý´G0ÓÁ1%æÉÂ1Œ¿½Øä_ï¿ç¼\Öä‚ä Ó™q`Ò™q ×IãwLÿ÷ :· çkŠ}ù®~ôò¶º™ Ö•ýü)ËÖC6>bã¿0?ü­¤Q<νp´àåÃù‡ºbÈð;–KR¹fò»'$ÃõÃò䜳œ±2˜º-Ï…¤Âsáf?n{1¿ÝÏ‘¤³s,Cø‚¨êIö¬<Ž*:ÒS&Ä™]g¬Oãë÷²h)Óf¬ß[¿Yªõiêå&æ)¬uÄ9)ËÎö< <5Cp/ݱñù‘3D§ûN­ÇKƒ°~Ïćû`»fkø2÷ûÞˆãL ‰\;1lëi·Â€ËgNü œ–¡±e˜†^k:Zc({#NûÆgºbq¤U®îmùÞF ‹¹8úe\¤öÅRMZLÛ‰€jÚ‰ðP9åç×!î[µÿ“L@lrŽèÖÏc² .ä¹{ö}ÖßõbŸÝŸb¢ÁÿÎ,mXˆáÜž()¬L•j¢bwÖŽ|•Û)G9.c.óº Зf×Qç#¡ôDÙò_åô3Áê*'Œß¥ŠýWèÉ;¦øS¢zã »k;¡|gýì)~†F2} BU¡€Ç“Ý­Csë×ip„@üˆ,!ŠUÔ/çf¤õƒº`žzÓÃýˆuÐ8·k'sjAµwƒNT°j‡ÌÛAĶ÷5æÃS=ó¤ðÜÔð|H68)•@ç¢Ç!Cw¦ó4Ñ÷¨%/<5K톕-j©? Á¨z*Ô~.j)׉º€oþàhpk€*NÇ~³®÷UÑuCbK°tdH¼RJ‹‡ŽoÍ[½~‘ïm…‘&7¸Z+%a0ï¸mÄsêpa#®³·‘'üŽÝ³WB0Ã"Ÿø"—lÌåwÑÊS?l<¥kLˆy‚„õŸ£ªJØoÊ6×ídÜÒ£îm¾7Ÿø"{ÍQÈÊavh9Œ¢G¢3Œ.ÍÂûšOlÝv¦tz,ÏÐ$?$;Ã¥|¡WÞ¢¯C]KXK¢u7¨<§¡n5š{÷ï¹ |ÀbÆ ¼ïPÄØfýÛ- HP6Úb «²‡¼Ÿbå¯Ù¸\µ½uÒýß+ JÐTD ÷ýè×½[yÝ‹#w%ohØÌâ?r™i1«§oWA[ái¤‰$H=>xHC‘M<õZ^š‰îïšš.ÒjCGVæñgÆÓåY$x¡#DQõÒßt~©¯ @…vÜÝ`ØÁx60O±™³É ƒ@‡-ƒ¿Zï¶03µ0t¶Ö¤ÅÌ*0¢|kðtzR*É[4ˆ÷Ô¬@V›Öp|µ÷ç/PÁ“—£gB!úLJ}mô5¤L;æè_ ÚBî;&_ ‹ë.¾Í°¢Ø+LÔ8ï'ECúÚDkBVj…­!¾|5úÓ"ÙH9‚Þiá¯æ©IïBddì@7¿…&†£9§Þ,Œw늪Ȥ*jÓ$¬bZõ)+›V(ó’dÐ’Ô r­"á5ŠÖÄ7!^£’¼ðœÅWUΛ”fåzÁ4J J ÚlÈ×ãÅÍÆó=›¸¹‚nÕU¯sÕEøéètµºêÇgT::iÀì¥Ò™ ÒzH2~;Ÿm‡jþxBE±JœénúkLIÙ÷±±±bÊa¡½8î-ÀRÕ•ûh©÷n8±T¼âÎûÞí¬aXŽ·šE®¥ÝËMéȳTª½pZ©²Â©EˆV{A ß‹°J-£¥4×*’¡Té «TRŠõ¬J%t1¾|Óp<_d¬ãJ=‘1t\׿©¸i‹Ìóª‹ÏQ?˜Wo7‘µ ÔWF ¶4õ¥Ä× ]hó»ôS±ïªßgfB-¾×"¢¡æ°¡Aùø4ÈOøSA 8G8‰uyU°[óÍ<ÏTYâÌReA¥v>‘f x”YB¢óMl69±÷Ú}“gÓuj©H;kÏ M½E¤m{ó@ʼr9˜ô­Ïòð @pÆöþná vSïnƒ¥ürÄWáÇå7¯ñò6kWiNˆù›ÂÒݵi›rÑ’nÆÎèø¸ó›^v!PH±æóÛñ¢66;YÌø$} QWà_÷,ùån?ÏR†.4€ßƒv‚ÚMÜh»µ#ÃÔt ¡>D8?ø<ûù*ý¯œ ݽ·ÎÒ@å&` \ñnî*%x/‚AÇ[ZÚq¥"á@7š ¬c$@Zº^¼~ €Ót×0O%“Ø{I)ü ¤Û$ô»Øü­›Ú2mÕÏÀÒ+”OÏ 0d‚s¿ðÁÀ½Ö`ƒ:ò<”îÿ ^Àÿ3̰Ûp‡Šx é:ô4 ƒžcÚ›ñnZ%ƒ Ö€ˆEÂÁN…ø#Þñ’ÐIŸv€,>ìþ™|¤‚ ¦þŠ&!G»£GZ^NÿüN9diE¸òñ9' úƒþâ~ˆãÀ¶ôíÂQ¶#ûïyÓ»ûc-¯‹¿üZhyA¶Ž3 ÙÎTÌ"-lZ¡ÌK’k€0mæW–(ãw8èI+C®~pˆN‡µlÃf´œÎèßÿ˜.®Oendstream endobj 688 0 obj 2502 endobj 691 0 obj <> stream xœí[[o\E~þÄ<žALoߪ/‘VHìXk_–}pâÄDÄãÄ’_¿_ßΩ>sÆqvˆ6A#ô”«»ëòUu}ñä—µj-Ó?õÿ®VùãZ­ÿ<®~^ý²Rõƒ¬jë/ÏVøA;¹Ž":íìúìÉJÕ ^¯½Q‚È­Ï®Vÿ¾Ù%¢q¸Ýl¥ OÚÅaW×!èáQZ['e4Ã˼&EÊ OÓÚgìð|©1Þö;_¤µ÷ä¤ù÷ÙŸV†Hh+Î.pñ_Ó£vFiìßj]Æe0Æ4‹òúY¹Íhï†Ç›-V"(5<)â |γJׇlçS¶óù¤"˜¸ºC=W¹ÂRÂ-õp]N4øÑp³Ù*!!›LwVw­-eí¢õc ²ìôÝtbŠÎ×g«ïWVHZ¿Zy-‘(ï…Wë«Y ;â(y¶úÇ*© ­+/.+KŠ"ÄQ’”#IhÑš‚t´šZZ¸¬tG*¬ B¤8ŽbH˜Ðk•020]À;åÈ*S£‚3á…Ø(¯Âðe‡ ½^gx)¦ ,l´ýÖ¿§5ÂKÖŸðà¨Ó©{MÔzHåL7ÉJ*ÅG©…±£äpGǶwýzƒªòÎÓ’[É´á§T‰Jx‡˜”¶0h1KƧK¿Ôit«š‡R6\}2‘¥m¢jú/pº&Ô´/¶he­¶@°H E+R°õ.߯¢°Zþ¸éƒ’ƒ ˆž:—†ž>Þww'ä½B JÚ¿Ø¥^ ƒ±©ÿ$gtðÁ–vUBRau >&Ç´s¥BŒ4‚d }^zKãP%_»mÔFZ—zNZ[9†§œÂ/½*Ǹè*ŠøIkR¨Díð&X 4f»-u'ÜT›Pm¯dЭƒVg^N¡Ng$íˆÞÇÙm4 ´Þäxúyб‹77šqÉNàŽ·K4rŠŸ÷kŽ5ª2ªÒÕ§`ëër§¶®ó†{ù¼s§ziºê4Óa0Ø^n$Àjšñ°L»)Ìf›ü4ê„hßýE0A' 1vAáî¼H‡ÓxG« ¸¹eAµÂ_ØxÉ,âò¦_ᨢSc™¥´²ìê|ÛÜØ¢@S Š7ß¡5€ª‘»)ÈYç;yi;d´>Øà;9?'j¥Ç¿µYâ¶i+¢RÉ4¤’Z#šjŠ#a¯ÖªüœÉ¯˜üÁ$_îáx­­ÖSÿ{{‰s0²ƒ”T0rÖ´³Ð}H…'µ/Æ<7ë¢+×dIdf-¡Ýþ¸h(45^‰¼´®ò e£sïj6aÕ±”§G txºbZ.48o&_„̶å-Ã9†}БÍþ±Ó,5Ÿ• Kðc;'ÛmçÒMÓ&´÷Aµ— îÝ‹°nZÜÝcçå,Ýô§ó ܶ`’§’Ï™«<Ö´7ä Ì¿![j÷–#9 xÔZtH¥ß]/†i>]:ïpâÆ W-€ò9ÒÏ‹…ŸÞêWG6Ó[ŒŸÈù>:‹jX¤òe¢¾×p2¹ ÑåG¨Ò_VgŸ¾ Ý“AÕ š‘£¾‰£RƒéÂÀÈBÏw:ðVêý9ä;oTóõ¾NTë¡çûiÞ+r®óz Æ>Kª[›íO!ßòèó6óí6ËÂ+fþ'Bs”,w¯Øoèï˜üA-vã y©â¯˜ú–ɹ{L¾l~-×iO&ï®Kfb#«aŒ¢±h™Q+Ö}YÒi¶¸Rp£0J ƒ¦Éx ƒÑx60+~à VŒÀTÁü¥sœyøÛ~iͤ/žNìäce3ïõKk8›GRil¦}<‚Íh„sæÄfNlf\ŸØLWœÍÄ—™yâ2ïÎe¬:‘™…$žÈÌ™9È}ÿ¬fb#Ïa,£ñE˜ašV,ûŠäΑ\ÓÒßÄ2R ©ÍšœiÐÌs‘þ&•—£Ñr}‰ÿþ¬ó;eendstream endobj 692 0 obj 2150 endobj 695 0 obj <> stream xœí\KsÇ ¾¯ó#6·ÝTØîF¿]•‹íäÇy8¬T¥”dÑ’U‘¨˜‘¢$¿>ú1ƒ™]’»"Kb±¤’zAL7€þ€°Óüi­•YkþÓþözU>®Íú›aôÕO+Ó>èÆ¶þò|õùwô:«(¸õùó•iDZGk”÷a}þzõdó›m2*Çœ7ï¶gZùè)äÍe§D›ghû÷óß®¬÷Š,¤8¿ÀÂßò3kÏŸQÄS6n.êóÉZÛ%*ãWu5K1l~Øža¤’1›ç•œLL›§E CÐå{ñäKñ䛑E rS‚FÉòC EHÓæŸuF‹m®¶gFé`½cQ†'›ºÎB–:ÙÅÁPEF1ûå8#[ç×ç«?­œÒ~ý~Ic£bTѬ_¯¼Ó#”W«?¯’Ҍٕ0ŠÚ ³öY¥«H´Õ„§=ë²³s«šaË{eØX&ärå3` ¥ë£.·p±¢„Y[ïŒíF°DFè Bo–—× r‡ç]¦î5ÛT·ñÀeå÷v"—ƒkÛl:ÿEÙr,îцÅHdœ#'ȋ멨ã°üvº|1oNN$$O*Q!5ÄV4­Úô+–S'‚GWhQŠÉ±Uá‹.‡À.joçÙAYJ«]¨à0¶ x¥Éð§2¶ÀÅè4àsQç°®P‡UÞÖ qB—¶…¼Ï†ùyò”Lõþ|B¹Ü’GØr±OÈvduÊòÁJIÚÔ&3á¾ãéÜ]ûuq‹ôn Êé<†µ›¬÷ce jJžØh°¬ ö¢à×ùy*¦0û„:ð:ÞV (¡S;PŽÀ ¦äÝ+ ŸÕ€àsp,ô-‚ÜrG_ Û¼t9å¾-Øc¶¢ÝÃ&{†‰ðîÖg&+¶cuµ?"DTɼÃmãa×1Øè2®,DÂ(*ç)¨p:âo‹&ÎO¼ß©lL„h´Rf¾Ð4Þñ‘Fÿb¤/FëUërôÀ‹›Ow­_œûj²&¶3†Ô1I9Åeƒ>E«‹Ásªë~WÍrÚ{ Èh.­‘môÊ!AúË6ÃR؋ɽªóÅ`b›£œ?ŒäåØ+­ï.dÈy»Ç Îö”xþ\Œ«3œ¼£å&Û)C[‹›&ºÍû1$p,‚²æXÍ÷pµ™‡’I[¾Î— ’ã!]´š ót@ünuþ‹'‡L · „äv¿brrÑUÜ5—©S]öxùnÜŽª¹×!Asþ±Î¼ “ÄØÔfÒü©®&ª0þñ¨ÜÅž/î'bF-fü¥ ›=tº¿ä‰{øïzÝtÇëÚèîÜŒ/òéUèqó¶‚-Ê¢X©rá<§ Éf—ŒûJ;ì’,ub÷Г[17˜GŠv”&¢£½Þµ*iYäMŠh ªÌ¿]ð éY«)QAz® Çj±SdµØ+OTcAQ•g§L¸<ÇÈ ¹EÖ§Îhdƒ$êSp¡†ð§Ô§¨ž¹Ì¯‰áÅx€Ë3^”­ç%¶Gëmþ*ÆÕx¥œ]®ÓøÕ;uÚ˜õ®Ó®¶.+ƒ$®ÕcE>_‘J 씲!ÂÆž•óʲ]ñAµrÈb3Q†R4ÕIG‹¥AœEµ=jW¤/] ±µŽÐ‘3¯[jMš[VQ¨K°«réu1'žSuÍX$‡Ã…1Žw¨™»*³Ã'“†ž:¦a¿/ò›7⿜ç=²ÔßMÙt ÛÛhæˆ#’%ÛÇœU–¦O–±~’éŒÍÔôvƒ>1Ól‹x”½JÇÞéOh‹xÒìGÕlßÖÀä¬1­êÈgÙȹùφŒXfÕ=en^Ø/•%ßu´Te—*i!/—wÖA$æ’áÙ˜Äß´Ås“¡Œgõ{ïÎ,7H–l›ÎʪRØWÛ’›ÿ«ÕvÈó‚bBŒYê̵É3ÿ¯™Œm$=]Hö/¤Ò²$x6µòbsBŠ0O`)­y JûÏÍâÞ÷nWM^ˆñ›/Ü}úIÁýñ58z‰=í*Œæ|?=Ó‹—xª®56ß*ÃÙ’qTŒå`|œJ3œÄŽO÷ÌS(”åý$¥úâºøä9@ !ïõ zËTǽÕ|­s %VÖá‚ÿ¥HT¹õ2)åøK¯'XÞfÆß¬Ú¯ÖxãÞ<߆4q¥?H›IúU0 F¦±Ñûý ö>Avük›3n :œ-ÿ: Å!\G¢¸QNAqàP“z‚5J„T×u ý‘#Z6. Ñ]T¸Gt»løhîF9Ý/SOaG¡èÜܳæÚ àž§F‘0F:ýòçcÿ2Â÷ïjNêjŸøU§¡Ó¯z–ÚXcSihl‰¦RoPË \¹=W(’Ëfl—djÙÄ"Ø‹›4cËf€t8¼¦‰…-W)Ä›6±¾)F†á|-]Ê[\[õ•Œ¯ d’O9÷qË×ÛÅÍ™[£÷ÕÝ"©Œ£ê¥Ûã"=ÜG5{œŠvfÈt¸ÍðAz[×÷Wl@¶±56š:E6šzËŠ¼‹W®ÏUÊ„ ö™¶¿:E¶¶ *Cnœ­-pÙÎudk‹(sÕxÄõ¡öªy6·yUËC±c;Y£„¢•ÕîÓxW|»G·¸O3 ë­ ÖËl"¾ëæz™Ý?žPf£C4¡O¸Ì¾Û—ÉwJjÆÒ‰%5›Ç~Ê%õ„Cúi+´9zúì*ê:ÏG^Q÷WEîü2̽œC;Ë&çÅ"Á‡Û]÷¸þ Ùò-4á¶£¿5Ï¿mn%/K.¤NDé˜Ôiž•ñs1û¼iú@. ùÝ{gEkÒ)ú âZÇÆ¦¼Y×` ¡ªŒ5Ï+Ù§;6·/jì‘‘¾çøÕÕ¸„õšÃw€‹ogwøPáÔu©|=c<ßî”#ÎaL¡> stream xœíZKoǾ/ò#¹d˜„î®~H€¼Ž#Qˆ\¬(Q¢h‰”DYvôïóU?fªwgå%™Jذ{‹5ÝÕõüªfÞnµ2[Íÿ´ÿ?½Þ”Ÿ[³ýb^½Ü¼Ý˜öC7¶íïÎ6¿zdƒÞf•ƒ n{ö|cÚÑn#å}Øž]o¾ž~¢•ÕD9N¯NNµ" ä¦sP‘¡8½cjŒŽbâ5‘WÚ䙜óô-/×YÓt{rj”.ÆœýiCÞ+K8÷ìGý™ù² dìôúäÔFå#¸`²‰ˆ¦÷bÝÄ!ÃôŒ&•Œ™žWr2§Ši,„x"ž¼O¾^X” ?-2t”,×XꔬÕvzSw$ü©_‹¼cQæ'wtƒuÈ»_ Åî7ËŽ¬?žmþºqJûí÷›h5L£Šf{½ñNCŽÀ û^U€£,±ôJl!¬·j±Óh±¦ õÀv9UAU½‡œVíá²c˜9£iöÑè•Clþý$Cå0ê`ëWu¿Ll{8ʳy™|(Ó-f¤)rÞœX¯Rż]SÕ¥½ ‘ËÖ9LNRsŒ ÀîëwIç£zWtÎù%&ËÃð3º*ž!#ûm¹qdˆØ_9§'–’(¼=Èr;¸&‹±áqL/½—BÐÐ/°®g¬»àÚN¸¶CdŸq¹S®ä9[I®F‘@Ú¡6«,4¸ >I£` X«€Ì5J€MÝœ^Б8øÄìr U£À›5TmɪúIS¾/¨V€f‰¯Ï¾YuÜ-ùýøµ’ï”äB/ùýçJ>nĉ쓯ùOÅ/ïv ñcê{Éáÿ¯ïŸh}¿rõbÔoÐ¨Ž“:¦©ìÈõCÙ ŸtÙÙ‡Ü2á¯ÿpãøl²4 K7ÆXI mms²«ùÁÅ£0£|ô|U®C`)É3*%¹—wpA tÊ= 7j5ŠœjµÃ´2‘¬X«æhü'‹k)sÀÆÒ!®„½%Ï“ÅöÒ%¤»µLƒ¥ß«¤.«¶Žì\HÂÌ„ª­ãx¢[œèUf$Ô Îî>ú4ž=èŠqAôU­_ 8sD"ž¯ #†m³|3áÞò‘³PêŽ|8 ÷†àÊ€fŪ…ýÍ’ Z‚ð(û‹7…™j1j5Œ[n9–[vkή_¬Ùƒ5uqèë]óÞ`¨vD'•lÓ–lèdÞ¹<°–ù@¤¡}+w¹wÌ~+[Île)÷^´–\ ?ô¬Afõê– èg ÇjÉwuªãW¢*É1Ú¥ Ëõ•XßàWûÏŠqÜ€%ÊúË;Êðl?‘úPË*˜žŠµ<àZ¬ßìoº;CìƒB—ë«ûKIyZ¡Ÿ“cXu·Ú‰3VÚ¹1I6‚ +ʈ~È’e纓Ñ&ðTšI.aF{t1S*—Oʧ NãÀuç ÍŠoêø[%{³ :Yƒ%fxY]<§x Ÿõj¼Ž\†ÄÎÆ›z(‰F.ô~äꑾèvL þA?JðÿLÄËsáŸÜ?9üÒÏÅ>{jtðÁ¡Áä†:Ñ ÇòÜEeå€ÅŽÆQ´à(9îpHbÑx•—Ö`Ð ýØÐ[¹æ Æ*¢Fà#¶§LE1÷w9‹ïÃP¾@ù0}S`ÙÕY}Y ,¼ Ng4‹f"&] ÿF)Rhnk3‚(›™Ë1°Š¹OJH !Añ»æþUÀ“Õž«áyâŽe¥-(­€lS› ÷íUp,"2ß›&<{\(5e€Â¸ÎÂ?“&åï…Eç> !¨@ Ü×aNy²l·=eähý0C/úë>àý¨§^FËV< ›6ã!Û1.V ^鳟N‹¬N± }ˆÃ€Ð*Í< ü ³Ëׂ».DJ£rý{^HG8EclPéXιôÚÎÙ@‹ÿñ`Iú\k 9Ü Mâ$‡ÊgsÉŒô¸ûf}Ì'ù¬r§ìx»r¦§µæ×ûlŽï¾÷&ru¤£ÑH\'WÒ¥„Ò¿š†Èºü¼Jίšå./–ÉcÓ‚a=#š;økG°ÉLó}ÎdtT(Àq…Ü¢]ž”“€¿„›¿_¶ó}#nøh>±Ô4‰ŠojÌÕ¿²2fi­xÌ_c@‰êÃ/dj8pRü‰€OÛ‡MÖï}Èyä“ï÷ÆÆ07r‰À®#9œüîp)ú8‚@Ùã½—#ò:•£ÁçÞU2à÷/–`i†[ŸÍÇPx¸û5ˆqgËyÖÈ/鈧ÜÚöA2²ã<ñ§anYÖM²óðZ'†4žÿT'æ6†\Þ"«V©Ž=$Áë‚©eŒ2 øôBk±Ê÷ß›õiJ+Ï.Å4¬SäË.äTl*ÞuÉw¦>UÊV KS`CéMˆàôP^c%°†'És×*ÍnîïÔÓ>B“ÈO|v1Í´jµIHDèÝB¤&š-oFèìqB¯÷\@»TU³}×woíƒ×ßì1x±zþÖòˆÏ’<ϲ ûôáä웕—…*’Ørõm]Mg†øSÏöš®ÿ|Àk:ƒÆ±@íë~ùÚ}þb$m~ÏäCCâÙ•g‚på9*¸÷CT4ÊGå¬[ùÀ–€Q5®©ùÛ¿"¿«ßÓF—k6(ËYf½½ÄÿC2 endstream endobj 700 0 obj 2710 endobj 703 0 obj <> stream xœÝ[Ë’\· Ý÷Wô.=©Ì5 ðéJ²H*›<*y’ìE$E²)zXŠ­¿Ï/`ÏQORªRÙe±¡Ó¼$.p@¶ßìÍb÷Fþ©>~¹+÷vÿ§>ú÷îÍÎÖ¦Âö¿»Ú}õ€‚Ùç% nõtgë"í#ÛÅû°¿z¹{xøý…YÈ0çxxqqiæÀîðOX³åxøQ¬1:ŽIÆÌ~16ws·w2tÞdÇ·—v1ÁÅøÝÕwìýBŒç^=Á£þ"¸L-^]\R\|ÄžˆÙÇÄ̇÷j\—ÃÃá_ò`^’µ‡§«9Y¬g]¦%,â‘úæsõÍW²(óã²æàƒ‰òC“‘¡ÃëuFÆ_µm±w²”þÍ#ß`²ÃìÏÕÕìÿ3ŠwþpµûÛÎ-ÆïÚE2x51.Ñî_î¼3XGî–»ov n0»°$Œ¢á°„6>/)w‹€³7@ù}>-P3DKÈT³Xò>dë+3ZăŒšEÀÖ8»XšP qÄêÆ`´ioí’½·:1Åb“)6iÈÇp˜e­øNüè-¹ç!lc‚µÄ'—#Ä¥ó§ÕëÎÆ`#И$xgy}1ÎDüÛ½n}Äß;½›`1‘Ÿ÷lZ⌂¯­?qÏasÏÁ/ybìùÛÃÊ gBYäW  wX_ßøº1!“Ä­Þq”ÓXZe¸â…+Í yÑ(k \¿%† ãÉ!hPµL4„ŽŠ‡@a6yè /5«eâ¡BU*Ô¹aQ\3ÕÓ¢X¤+Ù[㕹!8dì!8ÜTËT„s .Hzáø¢8lÚžgÕäìéNÜÝ6ß|”’<ïî®|û¦lÉ@þÐ&á‚È·?pÞ£~Vø* #…\WoW—ZÛ]Í9{[„£e zß·Ñ=Mú+h’qu’ÖÙ|ˆ–àhöᢾ½',ïõ…Cð!ïbà±äU¤ÚÄ1o{ ù×§ã|¯$Á_ʚɄý%*1td=‘¨¤ÄˆÄ’⑵dÒÓ⊜×@D1ɉ"´ó«¯ÅöÝZƒƒË5²W0D8²ËPÌ?ŒéôS«q›¢Z=\Ï÷vD˜¼>l×å¦õ½[!l\hcÙÿôз³_®“8ClC‰ýywõˇ‡+õBN~ªZv¾òR³Y4H,8üã"3Þ3Þ§¦õ %Q×9gjóö‹vŒ6îñF%/–×Xd­Íèxr‚öÙ‘>j¯ýÙð_‰“1=!,ø«ªÿ½ „”~½õ±7D›^ý×—]eJñ~ÁÔײ̩cMž5e)!'ªOBéj(¹3CàÅ”P;'Ð]s'ªpNeNäÃÜ*Ãmñ^øãñ>ÒZMèÒ±jž—DafC3;à¨Ì÷¢Û«¼*º­~{’µBûáü^ıl]¡P ÄA§­÷¡Œ:–ò¼ÞÏ.”GÝþBÙE9djR¹~º‡XvA*ü5±\÷‚¿˜Öi#§¾ÎߎŒ¹é©¼XS÷ëÝ$÷ F·(jtšy:j¥YµL(' ´Ó¨jÑdäÙƒ&£#n¨c2²A2qšŒÕ2‘Q¡*ê\2"È ì62ÞxhTí¨Â4atY×KFåW\ϲ™bÆ.“Þ‚83yöRrj3J¢<Ÿè¥í$°g'Ý5,C\ס c óf¸K›¯‘¸©°™Ää¸uŠ4>Þ‡ÆVr–»Öónj“@(/ßá%•3 +ÚÚuKy;VŽ—Â„ ù>¡îúv,úèuб\¥Ï&½£5Ά&(ÚKµ>ÓšìQ×ôï‡:Ó_¬…\±*„AØàôöì79)!C Ijj] ÷r’¼žg'é>üb[èj')=¥}ª¿y¢×ò½¤OŠ-¢}~º¯cïœß|ƒLvb]‘Ó’æz ¾CÉëpoŽÁkßðK ¤ý²öy¯ü²5H_n[ÀògÊ£-hÝhPi 4è̶S ç '¿ô§4¿º¸•øts×<º‹`¤»›§àJw¡wOÁËáÊ„kM¨#I3F—4J`4±/QŸ6Ë„ŠèbYKšf™$ s^O¡»%’”†-Iè#ˆt%išEKZ%F)i0¢Âž.i´D¹AŒ´³F&òê" ;óVï£wÌ4ïÕ'ZÌ´×@àÍ©{½á"Œ1G{ýì½É'=ÄgïÊ¥b•5íã=dÄo6|MÖ> stream xœÝZM·½Ï¯˜ôYšd¿‚ä’ —| ˆ¼ÈEÎÁ’¢ÄŽÛŠ9ÿ>¯Ø$»¸Û£]D†a@f×¾&‹ÅzUÅêùîh;Zù¯ýÿå›C}<ºãïÆè‡ï®=Ø;þêæðé3í±˜}äãÍëƒk/$LäLñxóæð|ùõ•5Þ•´|}um Q$^¾€”‰¥å_"M‰)ec]âR–w2ä`‹¥åíÕµ36rJ¹ùíB0ž°îÍ+,õÁÉù囫kŸLHXà•ˆCÊD´ü[›:äS\þ* “ÉÎ-¯WqvÐgUÓy(ñB½ù¥zó› b”øeÕ9†h“†¼ÁÐæì½õ˷댄?õmQ`Qe¼yË6ǘýK¥£šýŸÛŒbßÜþt`cÃñý!y‹£IÉ$w|sl¡G’¯Ÿ2Ì`áh2FÉR4±‚m(&—!p ¨pŒ1dãꀼ‰¥‚ÚÒ¥ˆ¤cqÁ8™ÑÁdÔ%v–q~BeøM¨“ÎèòÑ9SBpÚ1…qÌ2…!›W¬çÎ.E—š±]Ž”‡ÅœËØSÒšxŸM̳¾^¬1íJŒéÎT7îª —MÖÍê~¾¬nÍ6VŸÿôY i³ ²Qqß ÜÁ5оµV0”ÁÇŽþÙêU![¿;9vT©ðå¿W7_Ý2šDjÊϯf…«QKf-Ž7o²¯nå·Ç ŒU2X"3&ø ­¶ª{g_r·TL³¢.QŠþBЙwø­•Šq6åaØ_npB/TwØø¶aË`Fhft’ÄTÚ["˜0Á3b€5ÉDDGeåöAÜe"[WLl’‰‰ Õ˜¨P—2‘áœ>|‰ˆcÁŽ6RúèMIZ)ÂÎ:©NXš¦ Rp&Ÿ©ù>)‘\r³æOLJœ4ì–Ïc±ô‘ñc¸ãÁ9©ÓXCÁz°9ÜJ²Š3>çiÛŠlCa²Obxè(Þ.æN:ítÉ„²6_4ªI4'BD<…U'¬õ†Ò'B†}SQœèÍ Z9¡Qr"Ô|ïr¢>”¹°"‚KˆKYkâqŠ¡Ìúzl=N XÏã†9ÈDÇu›9?Q°‡56ŸåÓƒ’„‚n7t‰F‘$!«ïV]¢Y‚³Ì¿±ˆ„·v·óG9¶dÞYÔ%šEµ²H£.d!ºç>D£å}-ùrÈ¥¨Ä„Ú?‘VŠ"ÉÁOª“4Ÿ‚F±X4ž©ú‰êN挳êåÔM唋l÷sG–ô¼åŽ•wÏ—ÏîÉLQ:å›2Ì{k=ùØ[êÉÅm ñîšN:å')}ÇQ®Q«{à¯qy®W4yëÙzáŽ%‡ÉCÔE\W4o«ãÀÈ1Iª£ Îò竚u¼_¾¨ y–ÞÎt±_ç`*¾/Ó«¢;ÛòŒªÕ%è‰9ê&¦%¤M[[e£9£{6ï÷‰$—˜‘_\]‡ª£[¾0 •éÅ—jün]{Å|ÚìûÇ¥Þ­FÆÙååï‚F©—Ël‹[dá ò±„ƒV= ›ÅDyâ!²ªp½¹úÉÃW¢“/7 ûbŒÖ… ÕýKi+¼^¥!;ФïKŒ½N!\ÍýG‹ÿ#KÆÓdµ·[û«k‹LÛêÕþIµ=²µ´üüêš §–ÓãNmèbfâ­‘­8${„`BìkPXšE]P[ ,WY ÊÅ” ôи†üWrSnÄ-"÷³œ½Wb—õkAPµöò6J”M!C“¢GkäavÄÁ R&žP·’ç–ʆD¥²‘}¶:'ÊãôwÆ…µAšD§M§›¾—¡OÜÍšÖ—5¬Ù$SÖT¨–5êÒ¬i‘ülkñé(§ƒâ·»PeP¸2O J€Ì³‚Žr­ÐŠÁBâ3·q"ƒÂÃ}˜·ñ[ö¾ Ͻ‚lO( ½´ |VÇÓâM#QklÔÒÑé¾~×Àßn>ù±†@)šú5¥…À.Ð!PƒjÔ  C ¦@0+'°î¢ ß *yv‹ˆ^âÉP®†>7k™$Ò ×T¨[áp„¨ UˆêÑ·”¦—M0a«'ÝJî’)"ÚX¤·³…D èćK/yÛg»D‡DZC¢F]1E)wBbkã8¸7ŒSÊ» cãfR¨â­M0ÌÜ„*Ó¶. ˆò¹€æM|ôkú“6Œ½ü©GX?&¾"<øþYt»}ëVñü1gïN¾9ö(Ç$±1 Tiï…Û_e\AL,A¡ºDSÉÁØ0¹¢P^À•pµ÷³Q©K4•4j¥’F]H%'†ý•¤m,?ùº·mYvªÔc+ŸéçMàui%kT ù!Ïy›8A%œÎ:Ŷ‰•ž¶m =¢«?>‚[.ÖßïM忺m|?¹6Wåêƒ6!ÅÞôn´i’nrç‡d¡8n÷I±vݯ¿cL\–0†Ci{üþý›Ø`¯endstream endobj 708 0 obj 2312 endobj 711 0 obj <> stream xœÝ[Ys·~ßèGì›vS&Œ£q¹*/‰ý’£’Ht^l?P¤,)‘(š"­X¿>Ý8f3ÀòRb)%–8 öÝ>¾n`ÚJ¡¶’þ•ß§o6éãVmÿ4=ýkóÓF•²m¼ùò‰vrEtÚÁöøÇ*/x½õF kÝöøÍæ»ÝöRhiLô»×û#)Œqv'8 Æ(ãwïhÔ{0>г1VH§áwWôVFiv—û#%¤ï8þãÆX+´ÁuÏp©¿]ÔÎ(½{»?Ò^X œÑ°õÁ³»fÏ…£½Û=§…Jí~ÌÃA!?™M¥‘‰gìÍWìÍ·3‰`ç‰ggôœä >Ê´–zw‘g4ø§*–±@¬Lo.tƒÏ.ÎþŠñÈf?Ÿg$í|s¼ùû„´Û÷¯%n÷«í›‰|Äiäõæé& Ú‘0‚Ÿ¼4N¸D,m!N#D­D*»uÈ„°©êRiáQY:Fˆq뢲BÑŒ ížê+ J(ÝP´#ÓP Q…­R"Z«¸1âBÐÂÈ-2)¤ÇŸ¬HPÞ)¿û€ŠTFyʨà é—tm•†@¶Û„&ý*QgÕµ¬¡b Ó½p®+­“§˜…û~—¤KòåkÕº¦‰ªúÌÓ$D›Ñ™|±Z…¸-…üûýrú…æœ5°=R-,äמ¤U‚‹Á6º½Êã\Õï,¨ää4”çɦ·¢Ùýcqr£5ú%:àÚ!»qÙÂ<˜¨ë24ÜLƒˆJyä“V™Ïd*¢w'÷ÎtÕi\[U }Ä™b:ød4lƒ"b  ™„$Ñäe€a€ì¢s™O¥C¹Ù0Ÿú2ëÜbàØý²èg>ÄÝyÔÝz\Ù{¶×V`À—Hh#Èþ›Œ¯]DWÑ¥Øq4ë‡íã_‰(€‡àw?ïQ\p‹ø4…W#ÁÕg²•†Å3S]’ò¿Ú&‚|£ Â6Ù‚Úý3y«ö&6“œ²ç+Æ‹˜×Ÿ]7*&‚A íÊòJŒ®¼ê@rÝhB$' ˜÷¢»z.ú~ iNñ†…¥Öö †úL .hk{U“l?á ŒmÔ®j¾µÁè}Ce1 ·*(™ó€¥<0Çü:Âb~MHQ,¯¥‘†JKŒ~S•žd¬#S`9‰T%Z&Œ°‘'™2Ò$FU’ £ºo’¡ßÖ¯“ r%´Y7Û¡ÆHîs¥#î¨my×”1,§¢pî–¼÷-‘@òÜð~×òïd–Fl7ÒâVS ¥¤‚@8I£1™e³ÑóÇ{H†ÊšÑ¾Ö>v5ˆTUúô‡$ æýŠïÿ¼9þíÿkd´í0²ÈXxdäD)2r¢{FFëEƒÛle²9ì) 2ˆ…fžp¡(´o˜Ò „æDy1-狨7¡) ² Tã)ÁÃYhhв1p¢2ÂcxŒ¿Yг„¿O„š|Á õ¥0;á.‡S3 ãà˜Ç°úzÅ݇…æán|@uJ§§hò?F°¼HªQÈ…®¡òé!1Ha•%KtMX°Dhü“›öuŽ`›¨Q¡M˜%jšû5 ýIœã—L¬l!Ö+^61ˆ(T­D3Þ ¸+Ô}Y—ñ ùI³iQ Tö§¦š£‹Õž¯V«#ÎÓ®*ÇÔnw8 áäÙ¼Š˜ÞìWxeýϪÀ³ëún”ÿ;VL¾ðbÞ’)l,Rij§¤Ábvÿ€Å›ÿëHCåœ2UáYÂØqhL# §É`p`WY‚ïëùóšV5;Ì)@wµ=†ØÔñ¿õõêfò/Z³šÝ“U¡Ú 9E'ƒ3šbÆ+ç":ɤŒ«Y< u¸oˆ8y wàñÀDþh–“ §€|mÁY4Ìg~N¤‹>µ.Ëãev&£em…—S‚üÝŒd ƒh Œ:R>“f‹lb +gt¶Î‘dm«¢ s‹¬ @¨-Ö´\?> /V?PñÐGÉË,ÃñxÎç;Ïy%Ϻ…"u˜.×ã5Fçu† ˜°Ý.xL/ºI¼­hlŽéE®ÀšÓ­!€³iŽÅ{eTäú'J»ûÛ>õá¤nòå<ÁÏœ‡$U- (ÐqÛÁ:j‹‹‰„MÍFä4[WÈŽ&KGtZc‚7 þ»¯‘ÏR …àjΊ€ÞÓ ”ë`³ÓVL§.b Øß–Ž¢ë6¹»ßÂgض|¿ögôž¥Ã}ëM¼ñJT2Âbcˆt3>UrÍ Ú“TÌz óE‡¸¨£é-†NR.l­Ñ4Íc{`Ú¼æÎìé&¥æ¨Íã¾Iþ&£9Cåé NɲéäcÕ,ïÖÌ­R³ñ[ŒÕø™ùq+ge$sÞîkضâÍAú¹Š,1/X<"3Ï¡è vˆå¡ÆU jÒ÷`÷x_oÝw<®G)Ã*³³'7žléhÛ]mñTÆÔÃŽÇ««ÜÝBWn¯|;Ì%¥¼çÅUvÄ܃úö¼Ëøi)`1Tø©›SÄ5 FÉák†ØF§mk²œåzFs‰³«ÞÎ[f||åE2F'ë7])’òÜÏ ¿ë¦œÚx0tSÖám0ËÍD|Ýç¯=ž»©¿Á–óÇóA¿ÊÕÌׯîonÐðÅGAýbXWíÖÑÁâã®èý¤ÝžÚ=y¿'NÔ¢£Ü;Çõv4ÇIñ …àu:ž9gß/©y—ÛèÍØf²³èyÜà¡® ‹gv¸wîN¤à|¼ênÞá>FŒÃË ½«Æßþ—¶Î‚/çV¶+"¿ƒÐËW»—«-}±So•‹1ßMÓÖ9º^GîQÓáÔÌ¡[ÚárIwd‘£U¼c¶Ÿøó‹õb˜í`CºP¢wE™‘Ÿ&nl\YôíE£þ[†ÎGØ¢æ-£Ffu¸nnÒ–ÖÍ9m™H7G_pèÄÓ4>0æqgÔûϬ5úQ¾ 1jŸÎÍÌ©¡Êš™µ1ŠTr¢Šå½4rÐWµí}·›®Ôf›î`Èòõ È_åö˜ Ýô81-·/ðÿÿ&¦ê$endstream endobj 712 0 obj 3340 endobj 715 0 obj <> stream xœÝ\Ys·~߸üöÍC—8ÁÕ8R•—$NUW*<È~I]±DÒ2ÙúõiÜ`—«U¬£\e ¡ Ñøúøz@ý¸e3ß2ÿ_úóâÅ&ü¸åÛ¿•§6?nxú%±íÎ6¿ýFh¶u³ÓB«íÙã O/±5’Ïz{öbó`úã ›“Ò™éùÉ)›¥ÔRMqTIÉ¥™~ò£Æ(i¬–fÆ]vnºõ ˜crzyrÊg¦•1ߟýu#f!qݳK\êk/ç„–\L×'§ÂÌ`pK? ÆJ)§Wä9©#…ÑÓ#¿°œ-çÓã8l9êÕä•8'o>#o^W‘™ _5hf¨È |dÖ ÁÄtg”øWy[”W¥¼¹° >k§pögDG2ûUÑ[竳Í?7jf°}½1‚áÑ3¾}±ÅPWFžoîo,šÒ³Å'äžufàfëʈvÀP ¶ %®ŽBy…Ĭ]"‡Û-ç³à9Îâ¶™ØjÇgÉl„O´·ZZÜBUƒâÍ‹’î÷ŠxsV8<é"@Þó¦ð‹jº¨BTº‚œï¦Å´‰â Z:žåïû3´´èή=Rªø½xt`™èÎnf€;NâAwއ ñDãB¸gåfˆGŽO–«´ãh‡ˆ #´Ëoi)øô$N†Íû†PnòÚ¿÷âVe³!Pq7sflÙÙí†ÊÛü,™Òt¼»*÷gm°g8AkiœðŽƒWœkƒÏh®4>ÁÑÎd)˜)xêèÌu•BI@Ÿ¦øî¤§>쬚ƒƒX³Á5Eýq·Ëé.g8Ú+zÜW^!îÄga¥²1 q¡5:W ®J*îƒk–xD$| zvˆËûþÑÌB)}³pˆfÜaJá4?]ñIœC83@tÏéi³¢—ଫžR2«§ Ñî"¾‡Á!Â# nƒh0V5ú%½¹C”ÝÞíÌ© ä!oç4æOa¤óÊ–…^F -›é®Ê.êdÝ=v )t/ˆF…Ö:û®×ù˜ËY¹æËú÷t±¸{…¾ƒ 6$2f…ÎèÐ15-1ÕÝWJ¨âÐŒ^G«1Ý?í.îµ<ÍjžâŸNñFÙ%’ÉQ=$v|U òœä6 FæŽun„u]¼c`\¥{†¦»°y Á„0m”hƳ …e‰/?”Ó7‰cÆ05ý7Ã!?Âbr‘}ŽÙ¡‹ü×Ï íâЯ2úEã7åðdãZôÍlÔxA‹>"t²Ò ±Ï%“V ™ ±¥‡/ޱµhMR~äWäÄ;†Ð’Å”û­‡ƒiìtámí,3¸Ó“¥Ãs]0yDT>xÄü)fN%äá¼òÌ2¨á"Œì!̾XGר/¿$ñŸNsѤÈ­¥¬ s&ÞtCç‹™쮎8Zâ6ïí݇ñì*‡#tåöÜ´Ãt£„÷(y"Žˆ±fúöª«øEt †¡)arŠuá°Äk¬>sFP_Ù]}욤sÖ( ã+ÏH; žñZî(Mè …rÃΗ)Mü÷éY £i zÞÍ8)c1ŒqälÀÊæ,©ð«¾~?UÀÒ713,ºñWªM×ë ƒ™éútÆ{És‘ûÐáQü¾YÅÐ N·A¡³XÕG&!Û]WÕ/sáÚîùgÿ¬8ŽÓàB—OQ™ØÓ2[kY-ᘾ 3bH¶Ðôoã¸rÊ7‡Kû0,ŠT:i¯NNÿ:qhT)R†…k¦zWq£¹Is($ y?Ümü…–›&$Ò#” ,˧ÿÔ$Ðñôeù[0µtg‹µY›h³6÷}A#Nѳjß74R˜ó0ÃQ©4B»Ã p~ÚF!1;sLw¤™¥‚ÝaÒˆAöá Èëp¨¬sÑ Z Òø´¼Ú=33Y»uï½o¬qé,Û›€A.ÀP`€C®ðy˜wj—Í`OýÕ!mYÚ¶&ËßF÷Aî?õtz±DdäàôûmÆÞÁˆÉ¢#íKÓüeñÞþš¨»ùÚÎàÛf¥ëœ~:¢é Üã×DOñk^3ÚŠÕמÍ ©±„ùo:;±|®t7¤’–óäv1Íã0`T ½êAÿ®–\™Gk{X-7(9Šr®¡Ü‰0.ûµ4òÓ%?ëâ\w4“Wƒ~^‰ å7™aÒü³·-Cv¹êø.¡èUñ½w ¸µ]=áh× ]3&.¡ü§JPÓ¿OJ#à©™}âܘ¤=Bª¨4…Š_õË7R¨ÅnBÒ”æüQÓ«ÃÅ¢©L9 Ý0$JcÓ‡2Ô4ŸeÚîîÞO Äú­ŸEã ëÛ^Imð€-Àw·O"FHÇé»UÙÜVGá5lúMa§»)ÓuP³cñ…SeFÝo &p/µÙ,JÉš‰«=tƒâ;$¦–õ{!Ý›>¼_®÷zhTcôÑ£_ÚvšX;ÛéåÚ‚èM¿üZEg¡Ì榫#©[ú½õËdwNÉS§ü\}½4ÅÍÚÚ^•6¨¯FŸmÒ«š‘²â_ü0Әф!·lóˆ‹ÓœC˪ũõ†0Œbîá7~Bt0Ò‘ñ§‡t™V—Iò|÷Ò¬øÁ«Wü ð:" oZ›ç‹bï³Ô™u蘛Cët›ŠÕ#npEâ’Ö¼Ÿ`Åuèe“öjb6𨫕Q)ÎHe”«, J)ß‹#” ­2*•Fh-&G; R‹¡”Ä”sL-æÃ†ô7ü}úû¬ÚUµýåî–¹ÀŠ”3ñáNƒž5i™×º©_”hûäø&ýºj«Ÿù܉Èÿ¯K~HU&qà ¼Þþ©¶É%–_™^‰úã%¨d¸ï°ÝŸšÖ×ñJ¨PƒË ôÆR¹¬Ùí´ôEmêÜõ¼ 3:åñun¿õ}Þ­ãhqÐ.—3ãUrá8¸E0¸^§è§å¾”ì-ìeÓE<ÞRøâÓÔ˜r-nwHkm°F.«44mÀå ¤MÂ#tUШHÀ«ûÙcßuºûu3;öI]S0> stream xœíšKs7€ïSû#æØ³q àãËn%‡löX•K’ƒcùUÑ+Š\ÙŸðÙäLdk,EJ©ì²9šÑšßÖZÁZÇ?åÿWg«ôq ëÿ¶Ñ¯«ßVP>袶þ÷ñê_ß«×Ak,­ß¬ <àÌÚ!(f»>>[ý8ýg£•шÁM§›#­-ÒôR¤„è¦ß£Ô9Bçã‘•†ÐÄ!L×qH¬ƒÆéjsJ[rîçãoVȬ ʺÇ'²Ôÿ¢^0ÁL›#ã;Yà$ŠÙyDœ>tãbg§×qaT`z“ÅÄžl&1â—îÉ÷Ý“³Šêį’Í–­v½Ê™ µ÷Æh3]æQ~T·…LÑ”öä–odlÉìï;»ÙÏç£w¾:^}·"¥yýÇÊ-¡qN9XŸ­˜´ØšätõbåÅí¢È*/#§Ñ*›”5åC“DåÀZ´x-‹Ý(ZU"ZFÙ´ö¦ø5€ ÌЧNð²omÖ6€Bísþ¤­8 Nö'¹j™%¨qHLqx‹~úJëC è¸”í—’Ì @P3æ§)§ ië²>ã`I"chú/’ßµxØ,Noc†Ìê_ä±×fqv§€Y6ZÔG…ÙX'y*CïƒÅœx ¡æÅ%ÁJôéðÓ!3ÀD6¥=Hcˆ‰))E1ß«,šbÄ[AB_&ÿ2ª{rä«o‰{õ @;ßœ¥r(Ä:_ǨŘN¾Ò¸asWŸ¿ÎÞE'‰tž£kÑ@ίä‚e¯‹ñéÞ*ÄÒLÿi3ª÷Ç=xRé(y6Ê›tŠÍüñæÃio<œÄ1ùl~›ªz*%1»}úuc¤PH!HeUÆM<: )T¶\tÿ‘ÅÄÑûUádö'4í8ÎDñXTmŽë²ž+‰[ž{™k¼ó4šJ*š©ì§6^æ Sóƒ§ÝƒóŠ9ŒµR“¾Jç}ÀºzŠp?¾è&¼*+žþˆÙ¦½¶¼Ûžš8>QurT ËlE×­æƒîfCi£þç×{ìì½t>¯ò6¯bæ[~ŒâÈçó¶L¿Õ'xMàRhÛȺRó­&ÇåÊd–¹¦„©§ÄY™·Õøá„ÕÉä”êXŽÓß§5¼ žd\g9ÂTv `®r±³d³û+’Àþ° ¨“s£TÆÓRvÈÅû fpb¨ÌÉÙÌÑó†åNB®Æ©r*õlÁ3G<Ï(®’ÅërùrJ›ëU2hp#ü«¤‡¿Ñ(îá/Zx(üuP´ÿ”¶¤üÝëûóÞ…!g),![(É}ÓA¸¯+DÉx0ÛE{ˆävÑÖñ*:íòñ€¢Í>Ä{ròi:$WD¢¡z]w šËÆU'mUÈLDZD’ªì‡¹"·j4V’7YÌrUÝWYO£ŠcA®Ð±¦X1óÝ<óË®Rô¶õó½ÚÝU*jýnûbWʸí²-Ñ@1Æiã4ájœ;ï˜÷ní²9µ«Û½r>îZêÓìÿ³„X¹ó›½æ÷F¿*fH3Î\ç;©[±7dq™×¥p{åç‹Ïû¹Ï€!J×yEË®z#i—e$™Æ :Y]qÅç‹ÆF뎪y}E½!†8î\ò(åÚ–‡’‰¸ÃÌäf¹¿wŸ/²”Ÿ_ÇŒûÓ¥8B:µvÒ¶±ú)ìn7܂ڣÝ5m‘³®ß®Žÿùdø*÷ 9ÕèË;vƒWOÇ}/±v&_£oG¾JQ‡Wܳ¶J-¹ÕÉíµŠ¤g­lÙu¬-VpjYLf wCíå†wsT;íeØÆ×þ1Á–µKï lëÇ`+i,ùþ ÛÇ ÛR‚_ŠË>®zô÷ÀÕ\ÛwzªŒ[¹r{½ór5ÛñÌÕ‡ájðO«Ÿ‘«3åigÊU`™ {é€Y%ƒj=¶°UÒcUz_qPU™Ê*{V)vÊᬞÌ!ëUÞ&±16 òm‰Î2ø%ý½½×¾W À*׸Z?ÀU .Þ¹ž¹ú\=iÎë§{Û=ØË¯w °ÝÜÞ#*ÛëÇ~ÅF¹0§ö±FùE®~2(óÅÀî†z¾rì u–$«¼9Ù¿ÿÍa÷“r egwâ¤G\âd:8³d÷-œ¬ msý`òsvŸ3´7ghUþ‰’·ž’U2hIÅ_WIOIÃR¼‡æýaÍ'¾…’½ç/â»]c$d$»ñC¤»îk=µsˆr§ö]çY?BH Ê:xrˆœëÕ÷ÝŸ+?¤(ï”\â%¸}.¸Êíë†nä#éêÙž¸ˆ{pÎäuœ÷Úñ‘®JÌ:ˆ¿µ÷$®Ý»r—÷¾Žb¾[£*É­éSU1zhMnñš Þì&˜hMÐãJBx{'v›[Ù=übé¹Ç}ðžYÚp>³´bY”ÌØâVÉ % áø~¹Jzx W†×  ‡µ¸rjU¸­ÅíÇ—‹¯ˆå”ÄoÙ€ƒåûðMqøxøm „®Ã­à·Ñ’æéñûi¶¸‹_ºYèjwêvß°\.¿]î·Ö ðƒ¿;v Ãcxwœíx~wüü;Ù{ë̹†Ú™s™¢DcW\%7–mÃK_uí––Ž% ¬.4¤üÍvGaòmØlÖë·òïŸ`LÕ·endstream endobj 720 0 obj 2011 endobj 723 0 obj <> stream xœí[Ko$·¾ü#æ8 Vm‹ÏC.1 O$^!—؇¬­ÖÑËk9‹üûŸ]ì&5ÍÊX /¬nªš,Öó«"õÃVL°á¿üóüf_·°ýS}úÏæ‡ ä‘ɶ¿;Û|ù4bë'o¤QÛ³Ë ä¬ÜZ„Ik³=»Ùüs÷Õ‰˜¤@ôvw}r*&Dƒj÷/Uˆ€v÷cµV¡uáQO|ö~÷•^àîýÉ)LÂ(k¿;û㵞$Òºg´Ô_—AîîNN¥´¥.°¶w?±çÌJkvÿ ãäv—iØñ“ØIL¼a_¾c_ÞÍ$><m„å$7ô(œ“RÈÝ}šéWe[¨U`¥~¹ =¯höwŒG6ûí÷"’²ŽœäeC‡‘ær¿ŸgÁk~CŸ(ªŒ×žñ–Ì,QDI¤ °1B­‘ Iû ±sD‘÷HVæz(Áâµ~Z2ó ®¬pDæºAÓGäé—!©n0k³ A_•º!,ú*[˳Ò7Mò9}é{Φu„eÓš™AøJ•2sáTÊ;ÚÏße„çoLXþVÞRÔ>*+§Cé™rÍ÷±Là²$ M•ŽkÒúmU__Üi¼Tr6¡K:“¿ZçböP[l"X1ŽVšÜö• Uõ6dOå釱;Kâ¶àRw6ýþ:´X)Š)Wâž“ÖB¿ëgIWî¡(eQ^ÀÊG¹ˆ#XÏŒÅ|H;í«ߦHFI€‡#˜ùw9rC$‹{oú-=|$&xã›pÞ¯Ýý¼¼¸í–QCq±dJàÍèeîQ |ÂnŽj!òô™š{j”¾2’“vÕ¤û,q ‘Xçìå£UîMšÑèÚúAk–é(ОmˆB’W^ÍŸ­aDb¹vŽÖXËí)ØóÙù]K_`Ë3­ÇYYªßû=˜…yE#ÁV£n+ë³±FÕí‰$™e ¶ÃîFîôº äW Ž‹`Eá#|0gë:²uÍü@Úu<ñ§Nƒžâ9zFTF8:@ЂA"Q$ëc 擲6¥.w˜Gh}u@”û4aBHIH3¢-ˆ A†‹pôpU‡û¥É½{&'_Ìû ò'lb v1gr>ƒ“™“Œ^„¡Âî}ò”Â÷a •"óáäoµSV¹¢¥95¡#a]•ìÄÂÉÄ<ˆw…`a+lTÈ{بÒá’óëØ‚? 8b½ƒQ|fG<œFr)©ñû™d^‘W¸ƒðôEÓÏYµYT§ç‘²ûÔ=÷L2`:»†3ä†2éƒ.ù«RÇ›QùzQçX|7節¼Ð»¿…ìëÈšl~Áû*Ö<¾S,¤câÍT§¨ ´™«Ó÷È€%uytÑv æjXœD’Ì…ô¶·ånK%³9J¹oå—#æÌÀ$£Xµ )³8ù3uelM0Ñ~/º"â®ÉWš}ï¡4´Ôª‹R°ÓÀ©ú“o‡óÄ#㯠ƒõÀøÇaÕWŠ*ºe8´ ¯Íï<ÁIòG_Ä´¬ãLPíaŽº­$§€ª×ìî„°e<ЦŸ¨¬kT¼ïá%{4Ï8@!uÊ ‚e};"µKC8EÚ—é{Œ:÷µÈª÷Ü(ò~ÕÄÑTFÛs9ˆ’qߣpýß‹]\WâëuZ Í5ˆ¶¼¼Ë|ìÜÆØ{ác’ƒšÕ¡.ø…„ÈŸ¥LW ’,p• HTX©|þ.Ž4T`)¼òhZFx¨’2Õ•,TUè5*…ž¨ô\‡ÊÑÅÎ÷¬†{Ç”ÿxIäæå.s^¹Zº?V ÆÇ\ ÄÛ2"ø¬$‰€·QYFÛ쉳¸Ž. Á{zÜ9y”×#²Ð̾dÝÏÙ#dAÕµhP—FåS®‚ÎõV‡Zß#íêWÝÏFÀ¢ºi¯‹v‘w:`mÕé¯ZS¯RMÚÏœ©6”„e´e~Qîzþ!Ð C±HÚY»ö°®¥‡käò¿è?•~™ žVx±Í…™vn7¬úÐn²ªU#Ë5µÏ`ùèâ¤:Ê×ÚÝ_ôø’¯rèW7”PGRh§Ò|Ù&°JÉ¥Ùr#kí.¼uäç{¼N¦]êˆÈ%v.µ&KLf 4¿ï]*›d¹T¬’‰Ñše F€NŽ ÷j'Š]ÏÎfŸ¸äf?eƒ;Mí N½?ýD, ],¥Äcx÷ÊŠnHîJÏ ú7—ÛÓµôÈ>æˆË.’ N¨7¬· Í6ÍÕö½½6`?÷<ØÑy÷бù‚Ûn¶ìÙ‡^Øoöª†Ã×:‚aøR•œšîJyžIÝûã¿p³\HÜjòA#|‚g*ý­ŸU~çëceZlßÒÿÿf ¼èendstream endobj 724 0 obj 2748 endobj 727 0 obj <> stream xœí[[o\·~_øGì㪰X’3¼èK‹<´MÑ6úâä!Ö6vYVb©Nþ}‡×3Ûω§¬A¤(ÒlŒìJY´.Ûx XTƒÊY5“ÆÒèéÈêòñÄ"k–³fIŒ¾ZØ7»lb(­Ëô:Q ‚ªôÏÒN’4¢‡ËÛhQ ùÓ¬b㥮î„r@g\ÈßF×2FÓ$£Qd&(§üpKEêµ¶ tÒ ÄM&xIÞháu²½ü¼]ÁöV;E,fý>‹–¯=.²ÚÚªkÐÞy̺Î<’_i+‚»{E.K.®Ée£ÈÚA(ºmó"…Õ%„”%^u;­§dq/È1 2bLPÑK#5šK Ñ–q2Xmë>i|ÄŠ u#¬ê$¾*ò—5ÛAôiZƒ|ëQ+O3ß±ãê²ìëáØÊª¡°ÓíwÍÆoòÄ5ùee©§~µP· ÷8¨ëLÃ8ES ˜Ž§¹"¹qobL9 Z46‹ÎŒ*O‰)“è S̘ÿ[ôR©¹¦ïoô‘ëÓÊö©Peæ¹â¹ÉÞtðºãí‚ѳ³{šmFk32høÍ>Ü=\ãj¹eS­êHO×3lž¡FÒ'rÊ«S9ýŸã°¤$Hsb¦Ž›îažw¨wl¶i=>~ÿæR¼],~ñÍ7ýzÉš›ÙþM›w¹Èµ?ˆZÉdœÚRÊý=>ÉÄ<þÙ_¹}÷\dŠxþñ˜Þ½;‰# 7þlð…±dðæ»× a°–é$¯ë)ÿ–7S¦Õ\!Ü W!´ÚïKv²|±Î¼kˆ."ùjsö»ç»¯3°°Á—ð…Ê[ðà¸Yp Ç*ñ€`÷¯“@'¤9l.PÉk ]·‰Ãô®‘‚žrÝér´²ríažÝ/$Õ¬ÈåîNŒ-Ìš.˜ð¥¹:xЪø£†Å„? %Üi"î\0fá³âU+Á … ¯ÖNe‚ô$£ª#ÕbÐÄ0TKTHÕÁ1¨–ž0:ƒnÜ€ØåvÀíã¼Á;>sh¨zBù¼ZÚº’¿Y丈E‘5dwÑoG¯dæüö4î*ùå"GÌïNRd²0v-ò}§ýCää{žŸ`F)[$¦ä•[ûrRŽíµIÙPËsWmÉÅG3¼‹ZÚé D<ïµÈ`uErXpãú‚­3FÛÌc¾eÄ©2 Þÿ}‰‹¼h»žØí³Š™€£˜ikÔZÙø©ïÝr„µ¸ù.ÙºHI³Åþá­àª³buvÙÅf&K®»M/²²ÀjuÕÄ7Gž¬ ûƒ``âäʾ7·XT˜]¬rcæÅ'?güÖ@šÞL®u†–ÿ03\UvbHïªcSáiÚ‚ŒÑ™ÊRÁª'P¨C°<.ß§¹?ÞóúyÕW÷6þYí´Ô2­šbµL­ŠÀ8Êž¼,ª#¢ëïCꯞ4IF“UODñqÆÕ€0ºêàpʧôÉÕúk:0'¥ƒ ¨,áUV“:çÿ•ÕG¬¬ø |æ•gÚÕʪþ<¢²Šmg:¯ì¨_%¸{TøSj€º|ù›ËÍm±Þ%ì' É~‹ƒÝåt?Á°µ‰4K)Gi×m2ËB«Çéi†¢Èïi¹8½/¹Y—P)K}™||€é½ÈÁ[:§`î¬ÎZ&~è –W³=ðùJn5›t9Wl9£Ê\ª{Õµ Ó§5¢/–Ë¥!8­ûœVX°ß<~P`ŽÄK†n(eèšíµ3” -Ëöu¤£²ðräPG8&PÎáø›^¢Â#1™ŸÀ&ø1‡¨2¦¦dË(ýË59k¯Z êqâ€åmAy´í”µ=sè’õ«Û_?Ä®Ð{?~x²È CzÙÜ=¾8oð„qRDz·Ph9N¥`…“úÑgR*o‘eÒúóˆLJœÒ ø›”¬Ç7»˜éÛ‘©« û‹[^Þý¸Á›uÎà횃mž “b)¶)̪jöÂâ=SS}‹Òé#ž¿Ç]#~N«&WngÙYKlÏÈ 9ÖOf÷ˆ“¼]]1î×ÐGvu—õi‚Uí‰ÿª…X{l1žbY^-¸ARVd‰—ë/=†ó7Ó]¨²<»c¼Êo½ýêùïvÌí–þ%£8xìB9ÏëÒÞµˆ¼“?»Kž] ÏÚLßy×rM2àI;Ò4Y|Ëp]Àê „3 6ñªñ3æÙÍû:H/1éýt^>ÉÍö‚‹6c¸¨b,¢2*”yiäÖô¢Íè/Ó$l¤akÈ“ãbJ/&ÿÝ9‡a'ÛgcZn_Òÿ šyendstream endobj 728 0 obj 2791 endobj 731 0 obj <> stream xœí\Ks·¾oùGìq™"'ÏC.IåÄqU,–/N¶h=Ê$EKbÿûtã5`w©¥F¥r•= ÷FwãûºGúe+&¹ôOþïó›Mü¹•Û¿Õ§Ÿ7¿ldþ!²Øö—›ß«¬Ø†)XeõöòÅFæœÚ:“1v{y³ù~÷§31)ÜîúìBLôîÕÜî:§Áyz0“¡‡°{OÚˆ `÷öìBNÂjçþuù× 3)Àu/¯p©¿“\P¤Ú½9»Pn2¸¢aã<ìîÙsV”³»Ÿha˜¼”»iØKÔ'©)*ñ#{ó5{óÍ,2±áçQgk¬p\ä…÷J µ»K3þ¯²-0šT©o.lƒÏ6hœý5Ó‘Í~;ÏHÖùóåæ= ³ý°qJàÑ879¹½Ù-PPG®7Ï6ÍŽ‚AÛÉã“`'…… “u„„ƒ(e¶Vh5IƒRe¥ÔdC”ºŽô[)§`Œä®<î[¨­ rá“ÿ¼¥=)iµuh1ôUk´<ڪƙ|#}¼:“–ÎÊ:A©2î-õhÜH¥=š¯LOÖ#5-WÓ¸I #‹·ýs—ÜM ë’¼f[ƒB•Wx:ª;½%ïšÅÏÓq/TwvTÆÚ;‹¿£03F¡ ¢Iô “ ÒIß]RâQ[[7tÖnˆ»OðzŠGãš¼Š^¡æŸûÛî=l'QÅtÖÏ( ”<‹´ em9kPÞyÎ:éˆ1¦ìØÝ+ _ w¥5†/mY9ùlë{$aUN'yŠWÍŠ€óI‘CM (Š$E,IkÓS „¶yWÙ²Nï©bBYH+›ßåý—œ5ùÅ7Îqª‹©P•ó¤·Ã½óéòê³MOÛ8ÎeëÐä ™4F5³¼Ÿ÷À'y5¿XÍšÝV½¯’€F»rë¼H3cíï‘kÁô¼:‹÷Òä®x4?®?™ûy.~›V4B6Òý ÞÍ£Üø|lRô¢hz!a Z&}ñŽÁã¦QwìÒ|w¤Œ_8 wõódXíäoÕKE@GÛèI£È¸fòÌ.ç)2”2=)ÞFÂá°‡wù> "ù¡qÞª_…o î]÷Ž8BÓU‹‰í/4,ðÒÇwRh Oú=AGÎ¥ÅÌWÃ0ÉòÚýé¬Ê'S˜²!´DÌEiXò0}ÓŸ0†DQ;†„Iº'ƒ+÷ŸûÙg›.ƒÕÕ¡¹/¸#ó`Óqñ&g`ä|8#'’õ‰‰Ú㽉@Nk¹}Óû^Áîלõ ¸ëdkž¡;Y·ú’ÙâÝlþƒž?'Ôi‰.–, 1‡œÚ;¥5ËڌΪ‡ìÓà¼Eü&ž¯Á©È™%àåvÿI{‡ÍLq7K\¶x_ŠBj´6ßoÉaºêjÀPD{’‘¸aâµÆÆû'C®í—|©ˆ÷ø’q”¨LáKåç |ÉDˆ:ÇULÌé¾Ö‡.æ­¾%†³q¹Éxªâ)ŒçÄýµYãv'ÇÀËæíR“«ùò,7œÔk2„³X8Ñt×&ú|d6/_cÿ\ ª6`~ü>©6ðGlöª.˜gÆS®gÁÙëÌ–ð–<ˆ tá@ŽûÒ È&€×±nç—§g‹A¬)H&áÁó*‘RÒ®aH G첎áÞ¯5¯ì\„;w.IT†«F ÷“;®¥»í00<?ÇLƒºÎÍJ®e''¦Œ?½mç`ú+ÄDB›5e"¬ä‡”é&ûG½¯eÑÌÍ×Ëä*pi>_¶Ið®yñnöñÑQ51ñ&¯IJFÃVõÃò^ë0ÜÓª‘³ÇôºµÇ`t•¢wd) ÜvÉ5ïÜÒ¿¨èC®ËWyΞù2_õ·S‚Ù¬B¸Wiaº~ó&Ç…„¨•³Ñê½§šÐI1 ‘Ý–Êîšfåþúb_Cq–MGU+¾z¶º£”h²Ñ"_+%1ðÃ[ƒß¤Fz•ëÁöì' pôt ÐÒ/'­ ´{Šf-hýlè{¹Ü}žvؽD9"ê3m.#œ6 ®sU*¤÷ÒH#eµç"ô“St°–…QtÑÔÃ;¢k£=tmœ£óΗá$ýnç Ôä¤öO“£§œ‰ù«JÌ3‹o“»K SXlß­ÑCÀ¨OÃÝKÍèh©Fç¡Æy¦¥åç ´ïÎI¹OÃJùUȃþ®BÁ_“°4þc9é‰åXFK#’Ýs#xSÚ–`‡+STÜÇ}çÆÕ¦§ÓŠâu›Z-~6Ù˜Ñâ¡-ËãÎ%"$áñfM(ØÅzkÄ"¡I¨ÍJ¥3bF0¿4…17rŠ1êo”{ܪ%r/®`LV¨¹­^N&czc—˜žTNCU¶H®ãøè@~ÓA¸ËRw)SøøãÈJ­Ízd ûÇž–ØñËaãû!Ьw¹£˜?Ð1¨®HüA çÀÜ–8­_ç“…M²–5+¥°Ë"a’bæ«= žü¤~U j“:i9€ï£|t›± 픆ù|¦öÙ%ôü„÷ÓWá*{Šh{3or1DJvó°\É·Ò³úGSUKa¡?®cÏy+則Þ<3Ÿ¸ëï Û)ü ˆ‚Ù_<–ÎQQÌ÷i²ï÷–¹‡‘ë¢+ Œ˜ÃŒæ+—`h¾p°ÆV©ÞK#”¡Ä¸TáüAAx:Œ? Âr MÌz>r_S¶![wúÌJõGlH`Ä+¹&tÍÇC>’þjÆ+'rw “Zp•6ÇìýÁ/®˜™OÌ0íãõb—zp3&p@ÕoäÇß!Æs²+³Ù—¡øjŽ€n[vÇ}3¹¨;$ý›ºÃ©[m˜û4¥^ö¿kÇœÖÓ´³~ËvLé¬l¯?DK \ù^éõRGŸÎ7™¬[1â¾ßâ²ý¯{9uãV¾Éß8{}ëËoŠûþMÁ'ÿÒ\{ ͵™°VÒÌk!¿(…ä³2ÒH¡CNÂq©<Â)²D“¢§1ŠŒRñKÜ(²’³¿>•"enWn½/¯„¦ÿgÙ$Ò*ÿD;rñ[£D©:Óa2"Ø–gã —ÒóÁÛY%Ì<µüv a§‘ÎÁÜjx²|Sá =©P(gùyëÄèðÂ:!ãÕ«&£ÂñÉ&ïÝ:Ù(TMíÍøj9û·K¾T ½¨åŠÍÅ-8XòA…Ö‹5ÞÎÆG-‚ʃw¡ kº&îã¶?óM‰½ógdÚ2÷ÕAè×뀽ˆE"\ט^Ôî댳%Õí‹CsHÛ"~j( ÖçÑý6Mp9ÛTȇˆf‚qW¯:ˆÙùyGý¢l€ƒ“Á5Æñ??§{üz˜¼âÁp èñIÎ1Öí@ÏŒ•Ђë;Ûõ~WŠÊÖf}aÚ‘ àNžºÜΆg&šw@°}Ýiߺ)uí¿O1!0Ó8µ€ÙÑü÷MLpÌ¿õ\A‹‹2å!Pº^ãÌO€šÿOü9£ÁŠH,È¥ J…ü^Ù{5#§ïüÕ Z)Ø„¦T„W³IS†Ã´!ëcUZl_â¿ÿ ™n(endstream endobj 732 0 obj 3047 endobj 735 0 obj <> stream xœí[Io\¹¾7ü#úØX/dq?ä’ ²±…äÉÁ¶lˈ$klyœù÷©âöНIu·ÚvĘÁ ›®GkÿÈòk1ɵ òÿ_]¯âϵ\ÿ±Žþµúq%ó‘ÉÖ¿>_ýòX±S°`õúüÍJ欒“1v}~½úÇæ7[1P*¸ÍÕöLLJY¥7/pV+%•Û|¤Yç´ržÆJ™IÈP§CØÜÑP„Ú|ØžÉIXíÜ?Ïÿ°RÆL pßó ÜêÏDÀ* ›÷Û3p“q¸ÁMç•R›OlœÙQàìæ5m¬&/åæMšöùIlJ@&^²/ß±/ßÏ$›~y¶Æ ÇI®q(¼°¹M+*ü£r,e4±R¿\ÈÇ6h\ýã‘­~3¯HÒùíùê¯+= ³þ¼r P5ÎMN®¯WF ä#Ô™«Õó•G±#aÐvò8rBÙÉFbaÂäC!â`R™52 “PHUf &‰†–#ýZÊ)#¹åǰ¶ANJød>ñÔZ8ü7Ùò:h…š¡£j\Ê“ðÐÆ¤ÑÚ64üÛÏ‘ÆbŠÒÓÒYÙ®y‰’”Öh©Hzħå|¢PÙÚ~Ø$sÓºDoTs.N ‚,ôÏãNµÝå-Y×Lþ4©ÛxÝÕÝ$Bygò[â]I'I:àØ‡dJ­ÄlžÌ»oþ]§»Œ ßXãŽàµV¥ò‘ÜݰY´ µ†äïR ‹QàCÒœ8IŸ”a°uñ_¹×Nû"qm89[8_E8%t¸2Vm„Íww•dˆþÈ2W.@òG<µ‰Qˆ$N…þžÈ»óÿÝ“þ°mÉyü^OÑ9½ÉC 0ÿ¼ßÝí½îî$ &yû³è™¾tŽƒ¬•*ÙI>Ó' •àµI–”gQÔ(\4=Øœo½œÐÌ?ÌþY>RÚÇPåçS Hª¥°OÓãÃó¼2Cˆ .[&bøQà×eŸ(ü;6þ˜V ƒ ý ¤Ž¼%'¾Ì{*»œ&¾AÛ™ïP¸’ÁJÊ"à1‚ßHìó=Ÿ4 V’‹">C väˉŸTŠI4k<äÓ´„vjó;Ò€4`9]16ø òÁP9”µ+ùX •.ùÏÛXH3…PÝ(Ÿ\aÊ\ìX×@ÑXrdêï»´ʇȇnô>3B»•íΤš‚–iS~ˆÛÙîî˜9rpò›™|!¹$ZwŒAÆ8MÑ· 3YÆ ËG½`‘="KuÙ›S¦ã[¶??ÝMµ•›Y‡}‚·i?­ÙÜ¥½­ #“Ø¡F§CþogN¹Œ¹!Œ¼q~Ùh6XéŽÕ [÷lãJz—ìXNÔøÞáÁš"&t?°ÜF¸^˜Ô/æŸ&)9Ýz"çã=[ûvaõ™¹hõ&qÈã çö:¶:XËÎÛ1Ö|ö¡]8¬2=Ì]i½ì²ïMÕDä·2‘#C*q§‘;.ÓíÉá øú>ËO/|—¶Q4E¼ü|ŸfÙÙç[”‚kÎÿ&-‡(hhZ­Ê£¹C¬¼‹¹3ËÌ0'T,ô—–`Íp—Ÿ·Ë)+LªˆR`/QSÍVΰ"Á'†ž%”`ƒÏQOKo‹À2zøTÑC$V£’²œ™tP›¿m:ŒhÐËUZ/¢‘´†VÊ64=*ƒ”®q—9S4¦ÕS`­ð2ðC˜gæÍ®Ì0HWС?†Ë §2AùC–Ž!uH†!‘ «Íp ˆ4X˜} ’G o«F À<hqëBžbF„|—3$|ÁÑa4=)­c`­NT¨2p&‰‘¸ƒOfq„I y“g4Ã$åç ˜ÄX‰Aç bdG™òv èm×ø9Kãw#+Z‡—£,W!‚ëÅÞ(}^2ߟnM„Žƒ0‹<ÑÍbuÇ”v #‹d?sZ@‹¶Ã#òù6œÁû·÷üè—]ž¹%ðÓ~Ì„²au‹Û~ùÆ­¢";¬XYõ~K•œvó,Fë%´+GªXÇm~OÂb‡–EáA£ófT“8nPÍ+ZÏânÀç®HniÓŠB¹ÔG1R³]ÁG!¦uøäaR²º@Ï"ai‘9Ö¹]žgÈ—Ûaš^„ðŒÕlá‰!^<±+¢›®›/7Y‡2²œ&Çß]R„Ñ«vLê%ûõú(ÜÔüÑ£kªL£ã·@œ¢ØŠ%ºœï ÉJìëA`t•ð¦Þ”6ç[¸aô-cNt3˜¹íŸ É„e÷.V(áO«ó_<~ŒPùè‰ÇïŽ<Ⱦó ºÝR3~ŸèDm!”0” øÐqÀ°Gžhh<¥ºÀ‰ò (*XÒ4(H¥&íN(×DkÙ(Ÿ·ŠŠOe @cÅi…)ŠÕõ3_ƒÙ_ÿ) (¢ú¯az ÇÔðÚ*U "Ì?O¨áµxZ/5}‹x‚UñH¬tØ)âÑvЈî+â‘BXÂ“æ· b߆CKxi0,“‹“å¾,ŒïáG—VË:" á[–F´¥Ý A{h)ᵯˆŸó4ªý/ŠÙìÞU‘ ™Š‘b}’êGT P–‹”ÈwÜp½ë=pÔŠžÀëý…ôOÑi x7 á¯sè—µò•ݪ£g5óðݧyñaž¥‘ÿ‘Dk¾Džå…G/Î9©fE–“J~C*S©Bþ.Î4TKpk9UžáYìùcY©d¡z`TÏŒKÅ ÍØéÑ@E@QPTøZÖ>¢$§¬‘$ÞœäÊÏ’ÖN“PöëÜT^,ùz£›ž=i vâ%TÀ—ÑûÌÖ'Ô;¼D{^EQ±Z‹¦ÁÙÊÃŽñ,\  » Qrû=}åô¸›¸ãÒxzz´èTº½PÞ›n*8=¬î¿F9µ“Kâöõ][._Dk‚ÍcåÊ f:#×<.ó'ñtÍc„ß&²Ð½çNÕ=Ø1Dçöfp÷ï‘xQ¯¸ðO»W\<XÍS.rßÛ[+ü¿aò}µÂœ¹kõÀ2w©JUª¿‹3 •7ˆ^x­Pfx­ ÅXËj´!¤6§Ô à¦%µ[+ðg¼¬¡Ø]x3k–ƒc®8®P¾ä^Mâðµj‹ÓzAïyÔË‚ØÁœž¯¨ Ù´ŸR)Œ»A ‡Û#8áÍsÛ'ï‹LÛ;„mæyÇèkêb5"”Ô(.çw[JyÓ4ø™"mŸ%ò2r¥T,?O(:5ùþ¨Ù–}Ô¥ûo|ìf¼sù,¼¶ß°;üoÿöÃZ?ø"|Ìš{>)Çt¢'WÿÚh)Ö±èøé·±ö[ÌÝpgì’d&¿éW—¬äË÷‘Ñ&׎Þ,ù‹$»Æf/­í‹$6?·“ÙÑSÐ#š0³É€:â©•@Å<°×’‡¿e.ß“9lê¾ÊŽèûÖpk{êï~+Á²ü~¨;&Ç 4‰v?Pikéd³QÆñŽ­SLÆú}ÙÐcÐ0Ëå'iÀh›`Ã.âˆÝªƒˆÌÍÇòOݪ´¢Ñ¹yâý¾¾=ì 8¤„E ^qsÿ\4Šv[Sw®RgôÇ¿œwE‚ìIF 2Q{ýÊ¢CyW¾¦IÔµaY{‘-£q!š¹· T—¦•xw¦z†ÞiØ¥þú¶g3=¶!¾v†6È<‹ë ¿Xƒwnt2I²ûÌ'·{`²7llÙø;Œ<FΠ®Kê @D*@°Ãb™i¨ ÊBjN•g8ŒôžÐŠÄê‘þÞ)(ñ zLe0SÚÜóYÞZõ|ŵÍÔÚU‰ÒHù˜®›¥aR¶`ˆòó !cÚúÞÉ:zI;ÎWy¤=êÖíû ].kðªñ“¯½§,ǯÓÊ̽^ ¦÷Wï•ÀzÔÚ`J§K˜è¥&ýM{§&Æ2¬<‹õ[üï2KPwendstream endobj 736 0 obj 3053 endobj 739 0 obj <> stream xœµYKs]· Þßé¸Ë£NÄøÚ6é¢ÏIM7I±ÇN,ËQí¦Ó_ß$Ï9àõ•kûN&3á€><©ŸÞÑÑëãÿOïíÇ#ÿ¼~:ü| ñƒlÇßß~÷UHþX]M!ÉñæÙÆ93“‹1oîß,Ÿ_yIÎÿ¼ùÓctqïÍ-®ú«òÕ˜Âru²‹Ü*9æÂÌË[sêpÈiù^/fWˆ–g\út5)@‰'æËæËûÅòÓ¦sŠÉgËr‡£/%–×]"ãW«YEUÙ¾<ñ Ω ¤¿0:é¯v‰ê?Üþ~çãñ—CÐäì2ïQ<ô¨ååáëCÛÁX%¹‚Söœ\jÌ>VWêFQæ=¸â1Q)Ž•k¥€+¸T×£¡CåHäjŒdC§ØíÃ1UrìKŸÿ•žR¢VÔ.ö22¡û[sŽ!{²PE˜s÷à`Ø]2}új¿ô‡¡S"Å^A¤E¾„5ûÇwC6-@§ssBÐîڞѼ±ß—h݃«ª§‰üj÷ÔÉEªl^·ð!ùÚÓ`¨eï|Ö‚&d®“ϺlÉ4‘ïWëéÖ®‘8‰~9¾+dÑÛyíÕö»zH³‰Ïº1× §çW­¼#¢3Å5 ±_ª‡: >.uŽ’§æ< c”Ρiгª·›OõâëõækbW…öd=·{ì¼1áõ|'£1ÚZõq¹Ùe†aY‘zqä&-käjäXæg·ïNû·flÊANÃV¥©Ïl¬Øh~»Çä.ÙB`+€r„ÞKm=íý -â/‡›ß~³|Õ„—TË0G¨$x0Ü*ZW¶îñÐkjøRs,G'•—\U Ía”«(¸³L­¦Ë®a½æñ®#è:”{Å@—a»ºo«å£c£?GíÏ{/^)¶¯}\âØ´õAx_ÉÏ•|Œz s­£Þ[¹&õΫÖ× ò y* ?‡ãCæ¬Þï0€$uŽ„:›á×X¡è"Z£–°c€{ô׬óÐý2’ÓÞ“ýŽÜ. ‰ÜC±3ì—½ÓsÂŽ1g\¢]‘<ì²QÔK Ô±‰+2Ô‰ë#Û'Dèh¬"\ µ;ôvªgËê™´jaôHxm“àBÌ!Æx(ϦÂI.LL%8®Y*EgöÉP;”msKÓýdžêº'Á‚1Á”€Ü‰ê©°Kl™07éps‰înJ>Qþ‘Œ=3&Ì Û;«`Å€y6¥ éÄ…S–‹Ì¨cYü ÖQá V7È0zʬidõ +¢2Ô„è(_¢=D¸ØCw×Þö¢GZÊÛ³}É0ïÆa@]±jÇ‚†3CbEOŸ\€Õåð"ãc>Hç¡iÖýhrzŒÅ’fí O™¬\ s¹Hû‚4”ú+BÃÁ'ô£6T¹( #òI>XUÿÓš=ëvµkÂ)è¦c4aäφÅËœåØÎëi–¬¾¢S©\$±°¥É‰§ oÚ'Ñ÷‡‰+OAÿ)Ú·0˳öv ·ž·£âc#ä™™T{ÇÞÝ=*F¶ ùaÛš1@Ýã¹¢‰¯õ´¢}¤­ë‘tn î\·Ãž²+Òc &Ô Sy†±‰œ·Ù,ú&e3D`.e†þ'} «Ø2m ¿Ü¯Žr(¤UHòÈx+Ðl¶ýOXÖ}±ùSËÄP0Óo.Š9&6–£GŽ¥9–#ìRš¸ ÚùEøBÀùP|Ç¢È>œb5LMöT6]jtW }Ö‹¬/‚²ûZT­gáóäRÔ_-_êkcÂ0]ë½S)Ô_ û‡¯u³ÃÆXuáS'Ì¿–·åa‘ MÅþÖ»ˆKr)$UàDNkg©oÞ턾‘|OÖ^Fè`±ê;ãJ )êæ'¼3RÔò ÜI»•tÐþÖ„‚>_§õï®Ñ#–™iµÜ»­`ìц´i¸Q>]C–àÄŸhø…Ýl»ÓQ²ŠöL}áñ©æi³}aØ_ïËïØ‰#pœXz–Á )m}ÃL-1š$SpÄØ¹QŒ+¦XsmÇt,¦R1-Àþ»e|þþ]ô<¦¨­%ú ‰`R¤ÔŸÆû3®yF­¦PŽÝuð¥í-6¤:½¿~E£¯©½faëÆß ïƒþžb-ÅÆwÊŠÏb±Ô'ûÅ?îÚíµâéþû7;¦ï ±ûpÂgøpótÑÒg=½~7öÙ¤Ó¡ÌX5Ú>K:¬”Î…>„éÐr¡å> stream xœí\ioÅþîò#®øÂu‹‡Ù—¨ªš²´ ,T ú!±q’;&Ä ù÷=³?ó.¾vn´B•èøxÞ™3gyÎ2ãü°áLlxü_ùÿ“óƒôãFl>i£ï~8å^¦mþr|ðÞ—ÒòM`ÁJ«7Çg¢|àäÆ)ÁŒ±›ãóƒo¶_zÅdàj{ï3­”PnûôðH0nµsÛG‡Gœ)eœt8ã~$g¤ ÛÇ0å»8Ö–;n·?ƱsZ9ÿïã”UÌ+M\ŸÒÆÿˆ¿ Ò*!·O¤£åháÓ¼°WJm¯`\6QÒÙ¸ ˜b{–É^8_Ø2„Ê^úò|ù¤Oa@>É\â§\W4¶ÛçydÍpÀ"&eôöY"¹2e"Žþy 7›NrRŒs̉ÍùÑœ3åñÁWëZ~#4SÚʉ–m ÅƒÏZioéIØKBF,%A'ôQJÆ/$逨VK)Im˜4 … *kÀF¦5à¼6RâiµöQíÃGùCç|”nbÄ“1d ”Oð‡ÑBrWœù Eª°Ö9…Ê™$•KŸ/·n}N’¼QÒš$ù(5»‚cD”š"ZIÃOŽÿÍöýÈ:wNªÌ®’žÎ­ÁÍ‘|È,³Žû²£´–ñ4´âÚf®‚ÔܺéÔö<Ë)X[LŸŒBDÓŒ$ }´ü8Ô&KÝç\+‘ð´Œå¶Ç‰_/ÉÖö%Á‡?Æm%ýÂ-’ɇÏâä * gÎü2^¤áÞ×m¤N– ƒ`Úéɩڅììx€,θ÷³Â†SÃXî²ï÷,Êž” ¶/óΤ§í·[`Ž&KÏTð—M¢W}1î=˜ŒgE–N3§Vʉe$|#Ƹ«ð†K¿ÌŸBºQ΂K²Ð¢ Z m˜lçaÙDé“"Ý6^Óô"cŠC•)ÉÎE°ô›,TÒœ@áÝ›O¦é¢á„“ú%7n Â|äò¥5&J樈æH(ò¹,Ÿ{ƒüªnæþ–ôL0!uoùñ0íÈ^Á¢¯ºWô­N@¯xht'‹LÉɕߖy :sÿ}–/Røì«á.pªÆÿhƒ ›]Œ#q“hÝN¥P”ÛL>›{K²µhÿ 2Ðzl<ÕQp›x€hÑh8ý-zv2 ‰NT/í‘%T.=*zé£'¢Ñã*]šÈ7zèÚ¦è;¸|S¼Ìa±,SÆŠr × æ1ˆUÑI‚é²€î&þœæ¡Åò˜¢$–-¥$©,‘U¨öN8E&\¨ÕÂî”n…[  †€M+Ç%×ÞæÙšfÁl2Y!E›}‘U8±œ qß:û§Ž¨dÕmfqOAÊ•”#í»'zL˜›u ø‹û“N´ô¿‚3sVt¸´'jØÈ õj\W2Pòè¶ŸÄ<¨ üˆèn¿Ëæg‚Õ•®ClX6q¡|Œ*£‰¿Ÿ ÕB3`g|Î"õƒ±'ý^Ÿ4%Ô)*úßNc7LëÐÄúŸg²Á”@säÈEj†[?M皤¾ïêÞ!@´ZÍAÿÇž3?æ YˆÆ0Ùʶ-¬-«§JæF깬êIñ=8Î…@çQ×CÉ-20=Lú®µ$…]Z³ŽyË›Ö>L©ŒÀô`Ak5’ÆKãA“$¦„¯úz/Á‹ jœÄ$6¸ž(i³aÍã2ªëÉtoË 7Û/ÓŽ:æ˜{§m#´©µàš$(…wþG‡^0a¤A|ÂE0ës‡”Îë˜æy2×hïæM¶S)ÝöFN3($–²ÇûË~øn–š#••ÃÜ,柤LD†À¼¯öë®Dg2@§G×ø4a}äc\Ê­á­ò¿­ÑÕ…5§°î†)7ˆÓŽP·2Òý";„§ê4³¥¢Ržw(‚h³ýC‡–$(©‹s™÷àþÆ¥à¥í¢t'¼ ¥M@Eáªý¢g+'° P”˜ÐÀ—E~$2ÓZ1Ѫ7/‚¦„”F”¸ f\lÇpCšÛ1ÁÐù¹Ùhã-J³…øeÖìnÚ@œ.M›àc×Hn4­é¹Î0†ñ0S‹ÄêŠ% Bp›6ž„&ÐtZ¯y¬ÐΉbI²Q^á´³AŒç8í*,1˜¾!èOá•ÂtNÅîØ> :ÇTZD³)Òµ£a¡|1 eºŒ!ľè€:P7ľEžoÔÀ±fƨžXŸ¶.5;Ë0·À„ÖRyqB×{±xÅí“ă×,Y¡‹ÝÇ@ö¯·½Ö®­"´±Õ®;Ï«þØÁ(]6±žá<Ë!×j‡½³…˜–âù½ ÷„ájk L¥Û§ÝR/ÏŠçØïXáp .%&AIƒFØhd\h³2Ê0‹ì‰9…³ JQ¨ Ã@ Ò:ößöªè›B¾Q Š™ÐT…²Pá9nTs/3±P—S/ïÅáõ^ž/,\l^¤!Ù¦Œ}¼kkFAy”¶m‘w»-/îIÖ`Èïëô'Nb°•”­W÷)Èr¹Y(n‡[loI¿°IK†ï°•÷6AÕ½VÙ~J®ˆí° tµ˜õ× ÂÈÃYÄ-ûº°tŠr±$oÝ?3oHZ¦„˜vÿà^ õ=yXiÕ¢Œ†qÞdC[Ê,’ZÁTÊÌpއ½‚A>1ö^ØÂQŒ^q¿ØÍSÁÿ,…Íjjÿ?WØàöûößRY®ƒSXâœâï£ûyåBéu“ÅJh/–T˜×Õ;ñöy]ëúãõŽ :®Œ !»#OV.XZ½£&ÞâýÊéò”§µLЯ³ ÂK†ÿ2hVËgoÏ’? ¿Ž„6‚¢|=•ñ 3Zš,ì/›ÑV Œ)íÃ)a‚Tè§S¿^ÈV‡TÓÛG0éè¨Ö ÁéwF8ÞeIo*Å›ÿYfJêXÑY¹U¦„µ_Sï€g©›á‰ÁòÆI{ó˜û_4ÿ•ë=üžŽ¶”¸§£5³¥IjláWÊ+${ï%%ÏJÀ›î·©²ß¦~}I «W¡oÀpÎýž,>†)ˆìKª%ï ”õX:/`Ë}*¥ïÅu³9Nº ÑÄû¿óNñ”˜]WSËù³!™DqÄ@()ÍgI&ùÅÊ Â];°ÔT´H6Ê«s¨´$ÁN8ü`Eö¥„Iéä‚fÓôË^”8žaá”ù­¹Ó¦+6+GÃ9ÎYuêHÄuZƒN-Õ/fÐiYû²TÁɹ51c sºH cBÁƒ•ñ® ½¦ÙÆùTû¯ k²-ª‰ÌÈùÌoÓÛµúǤ;|WÑwúŒÅ`ªófx­Ž‹ :>:Ž1"^¬Ìgóoû»Û1KãOoÉÃw0g)Œ§Þ†I'0Æ ðÏçŒÂdßVùÙiŒûÖÔ`0 æ2Í€¦n…NdcJkÁ‰ ap"¥ìĉÊÚû8Q|ÉSaçýþþûóx¤ò¸ð³¯ñ5]¹ÿ’BªúŽÒ†¿G*áY¯?>ìo=<¥uyÏø‡k±Câ Õ°ªQ^å Þ0m&ù2|÷ƒìWFÒåñ¼¤›»}“õöq{dñµ¹ýäQðàög“ÖÇ"&O‚ÇzgÅ£1Ñ>›#F͹¦Iúµ(ñŒS}')€ TtÃ[pÐ{·#ÖÌ\O[Ü9cÁ¬am¬Jíâ9Ù¡Žýc·ÿE¹‡ØäîÅñWsܲdªxè'sІ‡G#ßAª?¼%ÃçúéýþŠÍÜÛ!Pò»œýigä”ÞÝOn<÷ƒäÅš(óèÒpjo0º(¥ÇèRCtáñ’Çè×&Ê>ÑE’Spõf£‹Ôñ~£K¡ì]ð %žhbñ.ümæÝÃyiBËN¡^F—ßÂÈmÂÈçðå¿€þÁoad5Œ$1Ö¶ÔBúŽË?Ÿ‡llëL;ðÍ_”–qI‡ãñŸ. Q6V‘¢Q®ó—iH¨•5UYÒF'¤ÜÒ¨úúo9t=›ÓG·,‚bçЈÖß‹Cª¦e#‡k¥WáÐ %†Xµf‹(s¶{<- »†`S°«†–ØsBK!`h!F™"KY:N"éY¦í†ŽB`›SžLz«”<Ëxfü0‹€Ï¹aÖ­£T`ÊÆEçµëv¹ü2›²ð÷[7èz÷e¸‹aÎ`´dR'5$$5Îòš€}˜UÃIí4âì_q¼‘îBôÙrgù$ºBÑ; Ž[·Ijjß`ÍLQjH”*á¦sV%U5ÿ·Z¤6†$nëí¾Éÿ‹Óa«Û°‡oÐÿ ;n{ endstream endobj 744 0 obj 3770 endobj 747 0 obj <> stream xœÕ[YoÇ~'ü#ö)X渻«Oâø@b;"ɃRÔeQ¤,‘VôïóU3Õ;3—k1dÈÍbuwÝW~Þ¨Aoÿ©ÿüê(ÿ¸Ñ›oÆÕË£ŸtýAU´Í_N>yd¼Ú¤!yãíæôé‘®‚ÙÒƒs~súêè‡íçÇj0Š(…íåñ‰ˆ<Ùí –HSؾeh–Bä5‘”NÛ§Ù*obÃ6mÏìBÐ*l_”ó\0a{}|b~”‹‚âb4rç ƒ­SI‘ÿçôë#Šf0Ú€üÓ PüwFLÆ“6ã± ³‰h{+Ö•+2ÁoŸ0ý4D­+ýuhôk“FúóÎbçõ„2°¼Tœ"yù[THqû^FIZæëËÓ£ÙA¹Í»£`TÂôæÕ‘³J *Ë£ï×õ¬ãF[ÜàÍŽž}Âá)=ë¬FDåO´6np¶SkÒ>²0Éð¾õÖYŽË,J«}¢"Êà˜H%xrFC'zPÖFå¸ñEÙBÌ–À„DØYe=°\éT yH–¤qÑÍ’Ø;2,I,ɤȂü䑳n£õœÓ,A˜ÁòÛ£Ó?þ°ý¬XŒ…¢ŠiÔõX?¯kå+‰uý¦¬Š±¸B…z|â´ÀÆö¯üD _ ø•€¿X?«GÚP,¥¢ †Ó%¿ý~N$)ë;"(ÄgüœÆÈÊMì»_ Œ7bç Éè°ZÓ‚øf$H­=ðçb]XÓ¢ê쪛•ã/«,S3ÊOÒ(¥<^Á¿ï•òkŒg‚“n–ØTR\„šÖ2øzýô¬dd/Žs†ñfH¡%yò\‘:"§vF.=ëÅÊõ+ø|ùI½]Zù#a{Òådºî5VµñÀ8›Kzv¢ŒuÒ:ÏÁ—Sˆøvå|~¤´ÂþÍÝøç} XR Ôiô€³9C퀖¾^QïÕ„òï{øÅ³•ô!£÷Ç%ù®rø^ È\öUo"µˆê·“–ø)¡ø ±Å\Â’Óh¸„×µŠŒ­ˆ®¥mÔÛ'xS$å,.©j2¨K›Ù ,õ:t8µr¥4–¼åI½ÇSÕ*„CÑ¥|²iÑ6¡ü´Äe¼r¨÷GWñ÷ÅA¥¾±QãWH#$™ü‡ûI”­Ўçán0h)rS“…‰.¢g‘È>jPh'¹956~/(!§¬Dw(übEè¨" #R>…%•fô×¥£°hQ²¥b[ò¶C¹®fd,;£ë&åXÁç|6FaoB§Ðé :C©S>Až±´Ò~°~cª2ÀÒÊéÁ»R°\\ì°`ê!tXëÒ÷‹öÄÄ.‡#Šð_s—…NÍÖHM&¢Í+œ6ÞC°9BYôa¡Cy&ÖO&ôQ°}7¾‚˜Þ`lϨƒŒ¨ÇŠFÚa¦7ж3Ï*Ú=Æ?P!pÇ, QilŠa[µWÎWìÖ(K+Ëݪ¢kÅçw+éBFø Û›ê(…Îx«š©zŸúðS÷ÅÙSšÁl,– ËiñHn¦Hþ¹S2 ËUcCÀyLðYQ;á€@}H©#Cn¬ẃ·,Ö¹f2‘Å,HˆT|-\…%2åñÇO9žQ ¸Õ½¤«‰l;ù\„{PdKìÑ&X ’ý(Ã솼ŽÂˆe r J(vhCTÅ®÷÷}¡×{È>Ï‚H]§jÞ?t§7^ ¯S½¥¼ÌMäuþ­B½ùž·¸_*Îzá®Ì:ŒçW“º1 i ²)íºÌ£cln5*Ê ¬ÂvuÙ@®_OüV1€+Åð¬0I)Î] n?Ÿ@V8z9òhCêÀâì‹f°l< Uƒp†þÔhrU‹ySp6OÚ‡™•¶ õXm›;»d¥â"@ÜV² Í]œKzÕ]`€&"r+ßIð²¿5ŸÞí»š¼…ùeîl?wøÐîºqôáËñHb«A¤Ø©‚Aíé wX‡á¸ñ!&À>$6N`wæl=:– ›kˆ$ÞJÍ&ÌQ_ýú:{¥5輦#˜˜+½UY:yÍŽÇb á^•Z?’ûö—ìÔÞ›%y2Bx"Ø&¢š†–o¸'_Ô ƒñ1´¹?69‹bz\–‰–?9ľEp–8þUÿ›àS3ì½g᥆ƒZóäÇG¯]¨Õ’ŽÆ”yU—š"QI”Þ¼CWce,j%mJ[‘ õ’{î4ÐvéÐ[n“+X®aÕ7Ó”ÌàÈVú`¢AëRºeôWØ(±¢uXû¿èìµµ|ÄÐ^Òå4éj¹È¬%$ :3•ð&ÁhIÒG­·=DY +âwO.–{~‚r”ï¸hÑ•ã[íV©úXƒn>÷–¿pδç84o3½Ê/µ^^Úƒñi¹¶„G"Gµó>žÂÁâõHæÖ«ÔÐ/¦bølZ–WcôF9±µÀ´x=j9tEí¸?M5æb«žøq4êf}ö{G³>'ÀB{´ÿôHA ;H4yVÉB£ªqÇcçÇð/§¨Å«9ò¤ÃE áSßa"Úgžñ+‹èèá~3™¹äw%"§Ojª‹jïS¹b¡ü5Ç(¢2¶*#…´, ,Ñ'ïˆ#9“öÇO¨â)ö>âàk6;IH ‰Áx7ÍÉL?> ž¦8Ø|¢6ˆò¦ÔZ;X5ó¹Z½i•Qleš¯§Bs¡žÛm­gº eÜe9] GCp‘vv 0¾g¡þaò«d*ß•w(Ù——'ú¾î•eÕìÙ®ŸÜq3O),¡níÑt¢å"ô>µ™˜"Lé8AyhR¸áÉm²PÓÈÙ89ËßeI¤ˆB­CÚ7Ãzxކ#¸†5Eo(ÖL ›´cƒ5‚„ jÇ~¢‡ÚOäÂ'ôÔ_-tù]¡+Lb· F¡¤QXßôFÜ£C‚¶ìAI‡+ »"ôììKI‡Â–-[¯—9Ç"-;”çwéŽtJ|êA¤SâozÚמÇÄór HÞ_2g–’ è\§—àív¸ È~¡ATpƒ˜‹üb¥Q ’ê ¤+;¥ÀxïÊ€ñ3Q‡eIfÐ#nìo©G]”rV£88Hâ8¢(QÐ,éüož»˜Ë¿ø,T çÏ!. ˜÷—Cê½Ûy¸9(äã”zéaÂ϶®¶õü*êóçìyýÂMÿöuZŽÜ«Í3üý?çÐQóendstream endobj 748 0 obj 3744 endobj 751 0 obj <> stream xœå[Y“ܶ~Ÿò˜ÇÙT–ºq¦*/qR)çpï[œɲ[»kË++ɯÏ×H4f9ÒîÐN\•²-sÀ&Øw ¶¾Ý›ÉîüÓþÿÅõ®üÜÛý–«¯wßîlûaÙþ×W»_ü‚Ùç) nõ|gÛ‘ö‘íä}Ø_]ïþ~øøÂLd˜s<¼¾¸4s`wx‚UÇl9¾“ÕÇ$×Ì~26¾eL4áp[©£ËóÎ:¼•k£5ñp “ÖoêºÇÏÃGêº=ë#Å×}û\ý~lj&² ®žé?ÉÝL-áå—±X}V7KÌ<¿¼\·™bq5%kÏër²¬ l)çÃSõä+õäm'™Ô²~©Úå®àM6|ø¤»˜ÓáÏr™ ”éD®ß^íþºs“ñûw»HÖ‰qŠv½óÎ@cyYy½ûl—Cž Û}ÈŽAbqQý)÷­±v"×ï»vúý“®bÃOfï­vÛÃ7—xwr~¦`¼}ÑR€ÏñÂå0EÍ9žà’ó}XeŠþ|ÎÅÂõùÎùçÅúçËÃÏ‹‹Ÿ u޽I“Òµw`P1ì½Yt+·“ŸϰOŸF†KäÙ GàAÕwJŽ'ŵ(ÁŸ†õ;%ž2Y/# ¸¼ðŸC˜BRòåÈSXÄ'm¤³ÅÃã°‡]·{”kö DéDqaˆ,#?tŽ©er©ß÷0H<ŸcòÈ‘iÕ P–­™¡òxøw5Nv1T¹¾UÆyŽÔ`‘08w‘í/þªoP^à‹ZÞ,÷ïºMï[cÑá±}M Ôç¨5-Ï¥87¡ #¿•^À£Tûe¥R êLUfôzÕ£›†,yF¶@R§jµG” Êèò툩4JŠ[€ƒÒîh™³àòš '¨Í.Z´ß´8{¾‘´ç·…‡Ò<2SzìšaÓ¢<Û¢M2êF¿žZ¤[J– ÈŠôþ±Êz¯+I 6°¥šˆKOžŒ-ëgÖ©Cïò¶gFoúòGýòµÊE_öMZÍýÇ×àJ&Ê.Ç\K¦Æˆ/XU) ¾„Qžówó,íeªÿé„ôämÊ ¥äFÌ+ŃʚÛ{ã¢ÀÁë¾IP,ω ôðö.ábÏ)žŒb6ˆ¤[ ­ˆ BHÄ’µ„™k­,p¥œ>˜h€æóÁȼOÙ¿·'kÌÈöGÜx#—?ÀÀqªûOt {—‘&Š)H’`Ô¼RÚ YƒB] ê4SÙòÅyP!ç)1¶ZáÙÀ’Ó'Br´øò©ºÚ¢0øRBr½‹.Ï¥~Õ+¦>úÐcYvWµ% Ë‹j2òß…Ö&nQX–ïGay°F!™VƒðÒ Nƒr.‰k[Ê¡51ÒØÑÞ4ËçüòâÒÉIÞóè2¶ ÍÉáÅ3ÑÜ}hYÀg劧^ÿä>çeíxZ]š^:l’n{´å?Kê/g~É®æQ¯gqšèfáþåjH½9ñÜÝ ÞŸ]ˆo øGғɳãLãàÖÝï[÷EviÔŽ>ÒTEA †õÆ(—¤É¼¿w9Ÿ&øRÙ—*¾¬¨*¾ 9wž©r{®¬¼ÿÜÆŸè_QÉ&£:²1–3€Š~ѺxxYT‚,›aeQÚ9 Eˆ =àà×IôBI†Ð¿³~ò\c®•ï7r›åõíµÍ8ÒRËLÃOû›õÛn'õãY¡§”Ðâó2`-÷*«+ì¸\¨žF}Qg92Ñü4aÃ(ÅþŠŠ-Ëaâ)XZØÛ]"É0à}é3=5ö¿K·*%|¥ö­›¡÷Z«þmdv)ÎF>8*—j+ƒK)ªæRŠê\—ℼ݆zN`—SˆëQƒ/4I áœô­£¨NÏ¢D€€›$uI¾û ‚>r¦#ˆÏf °ÜënX¡’îx ï͘?†/"Æð÷*>†V|“5$#,šo*çójh*x¹[”„-¦àóT¬8ðE€¢yäK2¯PE%Keœ³ âœGî_®6;«Ó ]ïNàÎËŒÆdX SìdRƒ7ÉdXÃm²@ÌV>)¾’œ1ŒáÉùÈRH[ý'É A¹¿YmÓÞIZDêŠ ¹8…ÑNᬥcKXCx D°–ÛTtB¸J¿7 2+ÍZg]¼7èšãä3óç,'RëåjSVÆ›£š£{à±×]²ÐÛÞZ¶¾–<­'$¥Ÿìƒ“¯×ƒtÕ/*HëÛì’äÄÛn1ŒŒ<Ê^h e/ƒÖ T2n´)”±Òû1-ãyÈRÞY€ƒMÇÕˆŠçûÇ8c{ç¾å3bÄG$óqy$©1º}@ØÑ¦”ïeàØæ 2O[CÉV&KûÀõ¼¢g®5U»ÖTgN^9Ô‘ÑAΜ¼VüµáëAŠ6­¨Úö)Úö ÅySØŠ¯:ˆ=0ßf±5QÇÞÂ|›È˜ÿoLd+)ÚPö k›ËîTm4{ƒ¨ótöª7­ØjÚš¯yF[SÕ1í-Ü·Ií5CýГڊñ6¬=ˆ×æµUÙÞ"^›ÚÞbœ6µ­øjƒÛ÷mv[S•ñí-Ì· î“¶yèwgjâÖ\µ9nMTG¹7°>OsoÐû<Í­øjÝóm¦[Qµ±î-Ü·ÉÿIMvwÑçán-ú<ß­©êˆ÷ÍSÞ«æý‘§¼OŒ‚ü”¦¼m„˜ú<ã¼ f?H#S©ÖgÀˆ æTAUNA7Ly[ô©ê™òî.+çs8Oyþ4¦¼»œËŠ’s¶©œ\$mÓ¶0ØÔÉñ½×6•½Óûç…?0å-žo­ý™òî:ìÓt¸è•m–µë{º×SÞVކ"«)ïyEOykª:孩ΜòÆRŒð!oÅlòDjCÞŠª ykªE±‹•¯Ö²UŽßJsRH(+ ›¥ò¡ÐyˆLˆóýïQ‡åR}+}?ÿ#“>endstream endobj 752 0 obj 3532 endobj 756 0 obj <> stream xœÕ[YoÇ~ß_±ÈCÛ~úýðy= ç+ëk²~SÖÜEÊúç¼6ðΣB|°3B2ˆ3ü‰_öKB¿$ô³úiÙR»á/„…E226ØáÅ\Hŵí„\€ Ÿø'_1Ó‚ùf"P¯½"ô7d]‚˜;YáyvÔõÊöçÅ–¡åL'”4^­ðßÌŸ¥ö«Š'ƒ¨‘X]’SDU¯%òÕúîÉÉ(YOr©’,¸Z©èÎsG ‚Ü9ͬ³•ãWøãá»r:òç$öhÊQºê=V¼ñ-á8š[z¶#Å:GDàó"ž­°¼œoI£pÆ};âùµƒhÝ0fçü%úñ òS0~KÖ4Å^®ƒE£ŸÁYIÏaG`G‹_!òh˜ëlªÊOÈqpw„® :ïéµÎ<_ÑìýÜ*ÔZ𨠖®*DÉ©ñ/æ1 ÊsB|»gÏR'²ú=JÔ­þÇ•È]HYé³=ÙŠ o'Ha™0ÆÛmìž}+~7Ví¯WÜYñÑ«áwȃÓy¹˜ÕÕGcÑ^áÑV¯¯ú (ÍíØ±ít`2¶l;…*tÖ-õ¶Ê )±·mëÒ^z!}äI=¯ÃßFI™#ËhœR<#ѰÖHA¿j…ëxJK«Bë…ËërNìK“#aåMëñÄFƒ¢1ò`ˆý=7œ„ØÞß•-üV{Ÿ,˜%€YÙýƒÂhË:(Ó`SÃ$f4-¤ú ½ñ˜Z¨j×-¥¡Z7M¥v ¿ åã%TZ¢ Ÿ¬|¤¸ nÉ¥‰ý]54f—¬x,Xݱ\•0’:æEdwÚŒÍÎÑDÏF!zVŸzîoħ…ÐùÔ:©˜ú4î \¿Ýbvѧƒ†0ØS©l°°ÎÏeÑNz m9Öyz’ÖÂJµæ®n‚wÎß+ø¢«ZLEWÁgéª$m…çʈšü™£BrësIÈËãŸ`ÞÔnî|)ÈÑ5ÅîË~6v†é,ŸÝSÚòRþa ùͼþÎZV5/J3ž\„s[» LZÓ³~8Xˆ™–$-fºD*1SÓÆÚÐCa!ti,ž¤MÙû!ic0¡àLŽ9-ÕðùaŒ3L\ 냦”PÖ$ŒÃŸ¢ÍãªQ>FR(äøïþš MyÌ2Oó2#baÀm¥ ¹Yjš¹ÉS"Þ,O5ÎZËÓ“†î‹9m0"¡"WnIáqxÔ:ú¨ÔÌ í룿ìè[´_>)ÄVÊ‹ÊNóøW’ïú|ã—²´Í¤-ð»•í)ÄLFÝé•Ö‚d±%ôOöGˆxÃ×´ýC6N02ÜÅ8© DDXÕAÍ>ì$ÒH«þfçÿÖ/³=©htУAûq~¹«qš_L7îó‹²HHí&™r×` á¸`2²ÎaÊziú:Ò0mZYhQ:JRG ¡«#"^ŒhZGâÞ <¤ŽHÔ«û×줎ÊCêå‹Ôå|1"}—eçõR!Ñf^Gš¥ºÊ²×R·×"Þÿ~A9ã¢#?ª·…ªKf­—¹õ”¦¶îÒáÑxqizüÌÜ-}§Ü¶çîn ´CHY™ÁU—[‚ݲŒ~ÊO5™p‹eî°ÌýíJ3L/V^OwLw›‚pó%s¹ºù îÌ0hŽ;-:$*9PqG  :Ü)Š;*8Íx‡;eïÈ%¸°LÛ-pÀA– ÜfM£d.ã™ñRȹŽëÞÒ[•AƇœšïZ{™s³ŒŠ¯È¨ø6'dð®cY™,Gð3ÜÅ7¡Dƒ±_ê^S#©žËëh-ÊUqi´í»‚TÔÿ•Ñ”ö$'³‰¬»{žõ4sÈ>³€M5 qÐ`’Lˆ1 +á®<÷4¹“[¥-A“WØ{®ùäxÍ—Þ–;,z[Gï³Êőÿ雇:+\}½Fo¼T94^ Ñ+ÂÂ#%×] œþÉmÙ,ïjÅÙ¡»RhE³ïéE |l Óñ]ù©z©z WR¦!鲯CúÄWH ±8W ¯8 !eX"é-Ø2§“ŽL6æãG`‰sQ9¹•¿ér­sÒt8ê•Ì}G6ðÂ}Ët‹ö©ì! K›¨ê¦…](ý">¬½ dUÒ£· p‹·ž¯ÐÚ¥ó1nýZ¶ˆ˜ñ˜äM©rÖVBBÂDx9 «™Ddrñ†ícP ÌüøÓBjá«7£Ê(ÛeÀË1‘ÖnWë7 -ïžwÝ7 ²žõÍD—w u~’^íÉðxÒb‚ï„ Én;)á·@^áb*°Jµ \vÑt¿Ëñ°uŸ—c”'‡ìtÝÜÉkR…VAt,WùIŽÑüÃ8•ÌÞR•H¥O¾ÎbðëÈoF© öŒ–„(Á8ˆÆN" A~§N¾}È‚:št4¥èèJJOP>’‚~;§`CÚÛc?Ý2Ja6rã2çÐÍ«\&§—M&þ”¿˜»FÇäÆÜU| œ0P"½<³Þ “ý!˜ðRæÛÚBÎu*(GjwŒˆí^8+Ô?ƒrå -J¥¤ò‹1MFpeέ”xó*ó ‹ò1Z@/k6°X8—J¥b¯”Üv¢M²ãÀÕqÝ÷m÷L`tÆ e9ƒ ­µ—ˈRÞã  »u!‚JQŒku¯†R!V:Êåq†¹£Ëݳ‚w¸íÕ¨÷ò1OJÛ§:# Î"ÚMÉûøÅ¦1²~ÃO9ƒVÓ¤5H0]¾stˆÙEÈÁð€$iWšr¾9-‡OǤX”DH‚m’¥ŒC¸Æ×¤hô ^Á¾,Ó(é¢nr¦Ã!š5c¿H=±i"½Í§+dB.À70ªHZÞþEIÑ•UIïQUºn§Ô·µiÞ ”MçáÈ,mËÔü¢Ã<ÚƒE{nâýaåx7b5…ÖËåžeöAN¡ST;ÏõýÐ/˜RЫéïí¹›eQ¾ Ñæ> stream xœÕ\Ks·¾oåGìq˜ '@ãª\§'ÎËæÍÎA²$Z¶HÊ´dÇùõùÀ »3ärG.'•J2{€ýn4f¿Ý«Qïÿ§þÿ—7»üϽÞÿe~úf÷íNרJ¶ÿÝÕîן’Wû4&OÞî¯^ít}!Ð>=:ç÷W7»Ï‡ß_¨‘”1) o..ÕhŒ7vx†QkŒ6aøŽGC°&D~6ÆJ§á»àb¤áÔ ¤h0åÍ`ÓðºÌç…ŽäY#¹n/™Úºdã¿®þ¼ŠÑ«Ú_½Ê¿òy£i¸»¸¤€¥­‚ˆÆ˜á½x®;1<Ï‹§1j=¼*ÃQc+„¦”†çâÍ×âÍ»F2Ša¹èñÎ3¹œåxç™äº=–{çUà­ÿáj÷Ï•Ûÿ° ¤ ±Æ ÷7;gæJóÈ›Ýg»i€0Y?F<eüè3±riŒiaâä¨ÜÞ[ Õ šF@E£O™jU£tÜk=&ç´Ô¨^ÑÞ'=‹ZÝóžH{ëCÝŸŽÞ0Û™ySE0ªíÕ†·Íó{9?¹Ñ›Y¾Š XåC!w¦ƒc¡Ó&é‰þ;ÖkçhZ_CêŠzgl´Uù´¸¼öc0)Nóý*›wQÑâò[¶‰¼M>ÜæG…½è¬Úè #ô‚9dU $.B½ªdÓ ˜ õ”û ›FíˆbB¢e™¤1؆ä·Lm°q’‰u’‹©g$+"t0¶b~6Êú¡:þ²=/#°£'3‹å‹‹žþR;7ˆí„d¡÷™ìê"êÑfߣ4VO|1.»‚ý&À¼š¾ç'´©L!ïñ|/`ß7,_dÂB¡dÓ£uÝ$·e=›ÌpYYGÃ/ÚkoÄlo q0Ýy ¶}[´N:yÝ­"'y•ÅMPèâÊêðW‹ð²bö#9Ú€u7Π=F%ííLû¢€ÿ[еµå*ˆq>œšŠpWŸì®~ùùð÷¦UšqögIS¾Z÷l†ß\\Z„ňuÄV$èçm9÷ ©;÷‘̆Yê8-6‡ žºY®Å³ÜѸ,‘È#ëçñº~òþ±õY©äò÷‡aY3‘ Œ¡§øwŽ5†Õ Ó‰KŽOa%«ÀÕ­~uÁºErÒTýΚ­­#égë˜t‹í¤d5‡/íûF!ØÙ;ʨ¡µïŽÂ)ð|7^ñ™œÞ4’º[ïÜìQ™|NGL8N&Zâ0ÈÄaJB@åyŠ$d騰X*©êH—ªheF-SPAvSª‚àNÉœ“ªÀXëRÐÙQA)]yl¢IDÝ$ÙMX¬ ‹áÌå0ðšä°þÂd]OY öHŠò;k .°Þ5ûXÎN͘ŒÒOÀåàTø‡ vî„Wåòo኉™ é•ðÐÒ‹¿ÿp iV±Z¤Í^töióˆði³T p;/ZG$•KÐÕ ½è4"½(ÊUé / *$Ê›¼¨‹¼u:·à“Î)r·k4æÉA?¥þÝO@ÊéôŸžÚr9:³.ÿq´ãN›\žÏ—Ób…ÉkK-ö·òl«çäËkÆÕ΂œH“= ÉÙ3’Ï·¢!”/ (Äè8§4+ä‹Ðó?„ ôr¾=“—¦ˆ Qw‡Eò¨ýa:&O BÇI.3È’ÎìrbÀ¥6ˆàµ×¹b+F· ü¢ìš`@Ò©×[Isa‰S¾k×ÕFM¶ÉG–B`5§é–hx­íüöÈÇ,[6xªF‹U—H¯O[IÚ‚m¤å†ó÷Âï<ŠÆªp°‘bk†«©­µ¶¤¯ÙˆTñîaªk‘ß QÞ#¶åK/7; í<ðp¦ë£˜U£7V¡Bó°?auõ4¹¶Ü‡•¶ª‹>ع³œ›nÍYvÅâ-Ä€Ú0[¼;ò{RÕ¿)-oZæ2 ìà‰K¹’à Í#gðS ½â)̧f²S.=¾Ô±ÊEßÝÅ߉/“šmúЛ óîTÇÆSjdRog3ZÓiRkÍð÷ó,Òr4À À™S;à“Ùše퉺Kó³ò¨Õ(,/;³Ò¤ìП¸ì÷GŽ:æg°cêÇk3wNŸ7Pò Äm~ÐÄòþWe½v‡Ez²ï/œa°¯n`I$˜’L›ýÕ™gù^R »’·î@àǕ֙öáÜÔs€Õ(7üƒŸKuST) qD,þ$;¬FùÑdíÅóƒ†Ë7—ÈÌ—ØpßÖÛXÞÉäd!EÏ.:´¤Òˆâ~F—xŸc¹©6œãÐ’…‘û½I ®¦:´Ó,:P¤“³ø|ã ósKTC“Lÿî#·L¸`X~:zéʼK7Z µ¢?ßQĨæ¿ó–É‚vË•÷¬ )xd(™S厉†Ò£ÄŸGX0Eô¬ØºŽê©*£_¢ÆØŠ£é4mQeÖ ©ëÒɈ]@cAå&8Í »­‚;#uDåÜzËN¹ jú>h÷ò^@Áî­{1yH3A ·H›°#¹Œá¼¸õ&ø,‹Vr-!¤v¯ô´ÀMZçºÃ1¸-ÓQ±ÛÚ´;n=Ø<Å‚hΑhˆ…·—1àºéÑë°BG™A›Ðc•\þ”úhíDGÒ¬¹ÑvµQ\¹[)s“â‚‘L× ¼žIÀ ¹I-© åÎoa¦½ó[Dlñ‘SH\_xêÐç² I*ƒÜAxœsÐs3+¥}Ë&׃fжÇ3H#3.)>Ôïöà’S''ÏöfÓ¼)kúùIó=+òÅðÞ|L4æ@¢[õ'z.zô·‹ÙzNBàºBc»UP %•Âj›–Æ`V³›‚§v…é%¿:k¯—1ÇnöÈ FÐA7‰gÝÝðýôƒ˜³Vsˆ ò};'¨u29ZvH6÷ð$îà-jò~wÑ/t,ˆ ²isQ>ê-‚APåÞfCå8q§Þ”1¹Ó&©¬‘ô ð˜îÆþ”’AÝÔmÍj$›8Ž)Šæ…óî 5ȾÇ(“EÔ|†o¿vÚMÂáÛ®f!œèCÍÂX<Ьˆ”s›fåk¶z]6+¥RËXêŽ$5ÆpøÕ½Æåø«uIû§´:¦@Uœ¶ðÝPŽ=q±`{ð쎓4þ’›ïÝoAo¸XëŒo½‚úajÒÛšå­šªŸ–™¾9!î"ˆ´^iÉ$†ª\•[·9áê©àmÜ&³Â¨GVbÓQzPo› 7?q›€ç¸D’CZšO1ù†Œuø›B{,Ÿ&ë’hmøRkŽd|ΛLJõÌÓǨË/”ù&&F%>žàóRNKÚlY: ™¾’LÞ#©ËÇbÉapÉ&v S¾Ž–¯œ!:Ìå^Úi4U\äÏ®nÚH¾9¨Ï»¨Ê÷Ü>wd©篼)º˜Rwu°|^ä âÃáeÕâ-")Šá†p9¡±4Zu€ð£…/ôðÈI|ÿaT½§ùZ·/¦»rìHäg·™FM¿" ®hÖoÊ´žXW~| ÿB¿S)_Xàò¬[þ¡‚»î‡ ¿æ:RñKâ{D±îÝÁ×åµ]!?ˆŸ›Ï‘©Å's¯Å‹+ŸÌ]—IøgäO*LëçW^?“Ë•Žd\à]ðX>Ì`o:·]>+RÌ?J‘…a“35Þ”ÅåW“+@Ä/[<ánã²úÈ¿÷Z§ÛR©=J&šãÏ9ëª'^v\“²ëÁ üLÜ;6åÙ»3SÒë­ïU‘V3uÄBÁø„|R¤®|º]n»Šë[‹ÇÓ~ç½òD:3—͙ՎK©}ïÌêÜ[œjgý¿êÌî=Ø×m‚j v6PþûÁg¹½4fʧã4×™N2É×t†â¹V$²®4FQ ¸y¤PqI;ªd¸£ ©ž¬×‰&žy§Û¬×­œçOž”“hó 3Ûï Éß"T|™ÉõT3W'6ÆWN¯ù#©ñuàTšUî!-Zøu/Ãù;ÒuäŠ?þÎÜsíG¶âü(üå5þ÷¿hðŒ€endstream endobj 761 0 obj 4194 endobj 766 0 obj <> stream xœÍ[Ys·~ßò[þÀVìYÇ ã>äT*T(ùÐa™¦”R䤊Ëâ!“¢Sù÷i3óa1CJ¤¢JYeõ¶z€F_7€™ß–œ‰%ÿ•¿_ž,ÒÏ¥X>¨×‹ß¢üàElywwñ厴|X°ÒêåîáB”œ\:%˜1v¹{²xÑýmÅ™äJׯ֜)e•îöˆ«•Êu‘ëœVÎGZ)øÝý•,¸ºóÕZ0nµsýcN‡î„Hî½”\vqm¹ãöŸ»ß-” ÌÑü|¹»O<Šÿ¤UBvg«µtÌ8šw?²óJ©î袥’ÎÆ‰b^ˆî0³½ 5³B’r?Ó¯àɳQ„ÕFM éZ)ðI¦=R­ f:I%®÷Þî⇅fÜ,ÿ½p’“ œcN,OFs+ œãÅóþ~)4SÚÊ Ú@ƒŸý)’»¤ dBOžÒ0£³‘…PÂúhd%ã’ÖH\«¥”dãL&Ö•Mì £PÈ&v^)háÑéZûhâáÁWùA缋³DE<ÅS6ñ8`”÷šÌ§7ÜE G’b'˜$¤QÆœç,ƒXçL´ð—;F›¥ €4FDëXɤ•D>\ì~þ¢{˜CL“7³Ž…~ ôA¡¹uÝ)Й6äòJæÎjm„d¤N÷5°Ÿ€øCàÿ| ü?ü¸Š~½·@¿K ßý vô9LxQëÝÓqB¡Èhý| Æ½ŽŽcMÐi¾™8_œæóh:Ã%Ù7ˆôië4ò«þQñ†vÝ÷õäq&l÷ck§ôä9ð€ÿ.1p:ÆÀ§ãšîµ£+®m¯{⿎â”ÍFuÚI“ø%ð÷[g¢2IÍq§Ž*ÒQq%–ëâíýü×[þí̺ϣö*‚c…i³¦*I¥b¹œ±0.pø'ó–ßÔ2aä³w8áÜÎŒÍ&l‰*4.| ü_j{§©œìËY3ÕÛ™á‹-C¡‰‹kÂLFû½œ‘¿l•ŸZxΗ:,O‹×´ê½–¤ÏÚÑ{Ͳxè¶W¹´Kj úÊþ DO€ÎŠOÍIñm²4ÓÏÉ5ŽYMRÄk‘õÙ™)gµÁŠkƒÄ^köÄG;"c^bhàñpføŸ¯Æ,²‰± ù$óàUÃDÄæû`—s 1ùökM–ê×3PzÍòÿø¿Ï@õ¯dIÈ’ºS @$4¡R­zVúè5 §a8|^óû2´3³¸‹Ö0ÁŽ[èÇE'zbã'@cÔa”*Æ”O›gѧl†‘ ü‰jÖ,Ÿýk«OSP1®/0NXkVÔ9Ê'ì¨Êeд|¶=út¬y‡´ÀÐÆ.îíX]?m'XÅy8m{æÒï_«8D¢‚¢jšfñUòjÆt‡34Öœÿ{`9ln1â0qÞÌd?F74dØï!æaç0QÎKžÕž¹Vætºë@˜Þo Þ´XÐ'*ËX­s×qfª—3S·ü¦‚LTŠ>E"Úô»ž«*Å錑~žA¡ƒÑ?uÀÇåa|ìÕÖ˜t,êóÓjü‘7Ži[=nÇÜWö ÎçXM»je„£tñ@—­ÒG™´Ûö¢{¶ çJʬ Ñ4KQ\ÒV¹‡RÚ)[á*™²™VaØ…'‘ƒ2UéhÊ›át!èÀ¬_jAK12ž,pÃÙȈ ï*ã¤[ªà_4 õ’"°Ð×QŒ¶ì(„‰0j–šÓ<>äsŠÔQIO¿Ce€~ó/¥ÁU+•Ú)úwаçÜBC¥%YtCÃí£Sp‘·ÁM¹4‰¿ÉZ¨œQôX°º9+a$u Ý(î´=š£a=×Y|JB’ 1ú´gT>¥þ(>wÒxùj‹ÙIŸrJ#MêyǬ*Kë¬ñ\–åIï¼Î…n‚Χ8ÒZ2ÔõÖ׃æ›Þ¿¯)¶(ÃM­y“°Jò0œƒ‘ïÊñXòhŽ Ém)sYbòJ æM¿BÌÅû¤76f“ò¬}¶©ÝˆéßS‡¹úÞ£súñÇvb¬s‰>lëY³/Ìhž÷…‹I4ÎÕ£y4Câ A³™J˜8^If1q £J¨S˜8ql«n•8ȶ‡š»))(¤Lò`\9-òI–מŒœÎé'ƒëܯqÒÅÛA8ªM÷mbÛ@±ëº¤Àô–Ë-©B0¢M­amU²]»¶«S ×öQRË@4 ˆY·¡u€ K¯B¦,½KÚWÈZU€Hgãs'MÈÜ&@ ¥Ë©þv6–ªÛÚM‘à¥"z5¬J(kÒLÌ*"3®zÆM4Ñq"Uk³?’Ë…1Ö‡¤ÒU{°ÔfÞ&ÜP¿nš&› ·Ã¡˜ MÃBìÚzéÏ 8·!8±•Ç3»‰æ¸ÁtóN‚¤ŽuÕe:ÏE¯ÎŸ3ªÅ¦µq»éñ‰AÒæM[%ú4£&šòHèj»‡ÏsãþôÍ̼Xñg,…–ØT%Ú‚¼ž¶ì¤5mTð½yþò~Öü"Uqªp8,ý-Ð÷®¤s•ÀÊD{ ?úºP[ M¹ˆžÿßÜÔÅÓf ´Ø?àÐf5@ì—Ô/8€þü‘_†àˆ@ä#;y+äñ°àÙã§òFA+!:@Üç€ýÚÒjâƒ>V*aÈ ^åŸ7уV+܆ðPÒÆ\(êæõ¨Ž3š‰0¨ã|  ÐÍÕqžÜju@…¶"iNÛŸ^c²US†F·U…éZ·]]†P¿ÿó2„ÝøÄ¶äÊÓ(|详0£/O‚SKмf Ή»‡óV1×Ñ`â3À»½ùË™gû¾¨±o­ÉÝ´w­O‰?”‘ÕŒ‘7À˜ k™¬í}ÿÓ>›‘™°UƒÃ¨C,s‰T(+'àèáò®‚ê1W+ðvÕ¡ æÂˆÕ=£k'| ÖýØ·khÓÅ]Îz„êj;ö¸ú…b=¼+F5Á3)ãØñ=ˆ¡V)‚…s…­Š7µÂÕV!þùMühÇM<½zVj}”=ã‹™´úøø*ÇÖL¿†2xâ½Øö5y"BÅÆGͨðu«æõ•Ö?ו߅'ŸwÆ ßƒüNkœF³÷3ÚxkF ~£þ“« U㕨ì‡*´>©ñŠbT3(;¬ŒŸÇÆãäsUvljŸ4£}TJ0׬O¼‚Õ\Èœµ(úÉHâ-¶¼Ž±¿` ^ƒÆBÿáý3BdŠE øøÅÃE~4×¾ùMám‚è±X›ê؃¦ ¨9Wÿt$¾mÞ¼ZÔ:qþ(j?ÎH¾¤}alPª¡ç–†K>È£XnK±•N…ö]ÑòäIþ²"ØüÙÄk¿9eOZU=XØ!X8bëÛ0#sïÇãÁÄgŠ-74Å:EN§+I§´Y›}^õ—|Ã×Ea ‡DåË#úÿ÷¿Óðendstream endobj 767 0 obj 3078 endobj 770 0 obj <> stream xœÕ[Is·¾¿òxÇy©p  ±:å‹·Cg‘_â$Ñ.’i)Šòëó5€Á4†3ÅWIe— 6{€F¯_÷ Ù«QïÿSÿÿôj—ÜëýÚêb÷ËN×TeÛuºûü‘ñjŸÆä·ûÓg;]fHÎùýéÕîïÃ×5E”Âpy8Q#‘';<Õi ïL ÁRˆ¼&r£Òiøîõ˜BJÃÍáDÊۦǂMÖ*Fc”~æ-¬WAùœþ~G>ç«ýé$øž›Œ'm†‡Fpî“]ˆD4¼ë*%™àyc¬Æ¨õ𬣆˜E m Üñä?Å“/f–±ß%uµà³²&<ÒÝLœô|^Š]ø¾ßžîþº³£rû7»`LÂôþjç¬Â^©Q.w?lÛÓè {ú„ÍS,öÔ,†ƒ•ìçe¾cHÖ%7˜u²†µã_‹@IîÂÊ1Êéá“uÐŽÒpÎk½vÒÐHÑY%gDZ ~›"|ZHÖ+(ŽdYÊ¥1¦FaM$H¡5¯½W£ÀWUlJfô xíá]`ÖðêQëFaf­,$5üØQǵi÷^&À£¶–·m b‡ìlV¯Ãp jﬦ‰=Å¢OŠ”Œi ‚ÿèÑa8zÛ_ñ:ÛqEœáîy ¿z h^)ß_ã§¡D§U>ûòçuJ°H%”ôÌ¿r:qÎøP¢@# bnîÙhk ãSÙo) Ä'8sÝï·ÙC½‹Ê¬ yªìg¬i‚–$P—YÑF;k}%œ±z¼1cPaÚîK~0Ú`ãtyë$wµ ±]þO³®8(xM g^—µCÖ(Z)ëu,\Þçþt“à<ßNùÄê· á¨^9Ïäï³y($Ã)éÍj=y!G›F¦9J-ùúŸ²Zr€¢Ä¤ÑEzdÃŽ÷ ½…˜Sèa œÓGÞ…D„ÒÛ9¶Ø _~R¦2Q7ßÊ'Ád4Ê>®SBÖ¸Ê!lU 5&tJÛª—‚Š“±PªÖ#Ù-ª¸ôáäLzÅde¬(&¯‹btD¾b~:ÌÏ2ÿ L¦÷'`4pßÂöŸ\1LŠ¡–ë¦ÊR0TtcDâê)q)àr©l£ä‚œÛ—'øQÇõ¾þNe ÈëEÝ+2²rPÌ"Ò~G~Õ—”r ²¸F' °—öîÈ⠸¬A‘G]ÁG*ö×uOê}sÍִİƾ§:úãìþ&øü¥ Kžÿf¯7ÈT#ÀØ‚·P×€¾lõ\*éáw…lC*ˆL'¼žœ6!Ñmÿäš»¡«ˆØKXx”Fï; ïv\ì¦GÙ [0ïíôT\ãrCòÚb=ß)!8´ !“Ô‡A–Iz()å€~޹¶@ÎòýÖôŽ$aÑnu§3âëõÒ©Ô;x÷QzÇ£1 ½Ÿ·F³PZ6 Ý !ê%£c’"¡‹‚izÁÉ)™˜ cíQ‚#°­Õ½àÏþ+y¼úÈM ê¼EFÝsÁ}Ýn/ýì•(’¯ ‡AY¸YÖÎYCÈôÄùìD§ÒÁqÂÿó\²‡—è§B¯7¢èÜl$’³9ïÈGëíÐwÒðg,De *Ð2;4huÿ5+Kn"ƒî•eµ>%¸P†ÿ”,Ý9¯'g¹ÿ•L€Y©czß´ž"T›÷Äâfu‚Wó„nJ‚öE â¡ùÇt't›QœàPž;⼜6å%¤)d¾–þ·q¥Vײ½ÖµqÞV[>·µ¹ä?+eì;SÅ+`¸Ê£$¼éöº>aG ðГÒI¿¾žCr‚^•ëlÂ)x?O"ÚÔ¡QÄÔ¡M0´«L0*Er¹ã(™*AN9lpÀ6VL9Àd«IÀ÷Ñ›½‹~´®úÍËy ñ¸€e<]3ÜÏúif£þ­S¬2ª8Ÿ•d¹Mî¡€¦v¥²Ü̽÷*( à©aâܦ©ìOÖÏ|Á J4ÕÉK wÑX×{x˜¢v¯U&]ðŠb[eKžqÊÌ?> É4oñžû­â-áÒýKÉrSk Z3CÈÙžwEˆЮ,¨-Êå1Õë¦l’ncìœkÕ[Í,Éû&*ùáÛìœèèiø¦¸²3NßM—ñwÀ…–oÄÖ‹””…%¹‰|p!s‡ÐCŠz³”üfg°/ÖÔÉ©ïmÙQûþB/‘š#â„Ü"óNYü³y‹zzà~ahn'¤ lþ¸;ý û@ÅVî‘ôÒî;2ÆuÙDŒLײÌ2‡­vöè®r4@°—\öri¢J*è‚þEª·¢Ìjd|›æ”5#0 ž¶€œh Ÿ¿¤iÚQ¹¥Á^¾wnv¥Êªè6«éŒ²$h~l_’ÏçÓ§(Ã!ë€bÃ?WÃݱêÒ÷+  ò”ÓUòpÉ‹­æpvIünòI”œVCä øíËœÅU_Z¾äPF'ˆ`ÿõÖsÖ+çPõSÐÑ&[ÏEa@ÉmÇDFî(&–/楈•zƒ”¢|ÆZÜp§:ÓºèŸ'¦˜¥èv8ƒ7‘WÌ[²L;LHótV@½OW»ë¡b-ç’ÖO> stream xœµ[Ks·¾³ü#¶|Z¦Â Ðgªr±ãT%±SŽÍäbç JÖÃ2I™–â(¿>_˜AcvV&¹q¥ÊF¿ÑÝèýqg&»3ò¿öÿO¯ÏÊ?wv÷×åëõÙg¶ýÃ4°Ý'—g¿ûŠ‚Ùå) nwùü̶ ‘v‘íä}Ø]^Ÿ}³ÿôÜLd˜sÜÿp~a&æÀnÿ«ŽÙrÜÿ$«1:ŽI¾™ýdlÞ'Ë.˜hÂþ™|ûèS¢ýGêûX >ÈÐŒ1º¼Ñ?+Ÿ]ú×å_Î8ä)‚0³»|Ò¾?f li{~AxAP;-1óþúnä3Å xñ5%k÷Ïër² ¿a)çý•ÚùJí¼í ÓˆPØõ`x  ±ËزÁnAó¢*,Âïg—g?s“ñ»ŸÏ"è&Æ)ÚÝõ™w¸ò²òÃÙ×g r`vaJøŠ†Ã °ñyJyYàì  üÎåœ''Pó  h ¹@µ›vÖNÙ{«m''Ñ8íB¶›T èE‘’·äRãϦÀiÿ¶¬'—ï?+R2Ù[†ô`ÐÁ;|B5vÑ€þ¤ìLÙdªŠt6Eï°Ö¡¼§çøŠ.ØýëbÑDŒBoÐôFØwö<ÛÑ·ûjH΄Xá=ü9¸g;Ãÿ$.á=…X²°ª ‘àÙ%×l*RÈ›çÛ0EÎiÆ÷ÛâAÁ'C›ÇÇÉzoð޼£…ýqÞß»ŒoŸ!|ykÃLÇLks"‚–sUùÉŠþ‰Bšú‡Կ¢oV?0L)®Ô_ÔLÖ9rû÷o„´Ä°ÿi"";Ù<óüO.º4kÈy ÖML‹†þV ¡%±ùfãÂþF­׿·)pS ~ˆ’(YšÁ‹ß³ Lv™c5ôúùE1t‚ ‚\‘þó/ ž+v÷HaýI å‰Öjý§Ž!' @³wðÅ s‚t%R$Oà¶)êÿ<%öÀ¹-WÛû¡²ä¶%8IÑDpp]½~]Ö=ù­Å™hX×xŠhœ‰ÎlKv”­» ËSF¤í>\#Îl E¶wjýé¡ÌçUdh½+‹Û'@„Ö'/q~^ù  DÎRŠÉ0¸¬\¸õ^õF­+£Øÿ~N×q¥ÇÅ\ßž#nØh+n‡È‘­à¦4!èÞY" SSŠ5ÆÊ²Ov&°þR\‰¹0o´&Ë•,«ÎWµ7o•µëõ¢R›qÇró= ÷Ñ[A'8õpäm=‡‘L\U²#{M¶Æq³Pò¼oÍ×"ê©Ú¨‘<«„PðÕKk\ªyJû~-R !P%TãBøXóíÝBI;>DGMP…A>A­;õýqÅžfåÔUÅ„˜€˜¾ß]~~vù›o"Þ-4hÚoÎ †l;EÌVí ê[áÛŒÌ6#SJóé¸ì—Û»fïÀ_»›ŒÂ-b©XB2)êk_Gô»G˜`f5QŒ6àn¾Q7r vä:íÊ.a;YBwNð;9'e„È—œÉ‘àËÆ÷“:GÝoUXjüÀ~g.6£ÕEDò‡«äB¤G< W¯”Jtd µþL­qx—u óèÑlÁãÿåZÅUý¸¬·^—Úå$4Íf#˜´1_mšø1·­ÁP¾ÞWÇB,üY¸[Í•È:D½8HæÑÎÓîKŠÒ9z¸þ.½åïaŽ„6‡1Ê>9”ª6ˆ9g©‚C¡Ö(ñ®K²º¼1cPnì2 ,¥€ÅAp©xjåר¹‘‡}ŒÎ IwížðLÄA£†!Z /Ô·F>KÖÆRb2ÒuÖ~ÕðuUÊþ¥˜–³Fµ|ǹ8 ¨÷¥Lm:DD‘URv‘Q‹#®Õ0"Ô‹¯~U³©Óf–U*Áw½úÓIçè@yÿÏó …#U28]VYÛ|Œ,Kò“³c©@3c0f‹xU•ép^Ë>x®u›hŒÏ¶AšfxÀU‡Ða¢¶8Â>(Ðà\-ukδi=÷±™±Ž­&M‰t¢}¤fiÿ^o|©ÃërS/¹û8¼*˾vU¢4¿xUÂF$îAÏà~†üXN½¬Ð™×˺v’K–ØªÂøvÛ¬Ÿnٽƫ]Ko<®©d¥'¢WŸWBÅ{°¢T²~Úµ¨~ÕéØª¿êä.GnÈÊâPt––£Áw¼VoÒ’èd÷EÛ~Ñbô³ÞP†T¬ç»¦÷këm`ƒº‘DvÔ/û´M½¯8PG7: „Ög?i¦ãì|`Q«Žƒ­ŸåZþþº·Š‚¥(kM81")Åz{m^Ñíµ¹U(¿@嶯¬|¸ ³YÂEÚ¹„øZ÷Ïå¾²\L¶8”uqÿ²˜2qÊ-Ðv[˜ˆKÒ§%çÄPJôEôrÖOžcI²šáÝÉŸY:À·×à¦-Ý^õ3¾Wx+²h}l臭[U9âúΧ&KkÀ7¹eE¤„µ¦(Ï(4¨ãM…°Y/ oA!»*Ð#\‡ê¼°ä¹:·Q¥~/é4I3á$GV!¤‰ D¨•OâÔAz<2ªû¢K§Ð¾j†UÚƒ³Ó¨¦Í­H‰Q?k ø¥´|N¡=Ú)Åñ. KG29¥¤…9<­è&k s;е { œ›üIܬ˜¶USmÝaÛT xÔ¦‹Rç‘zvˆP~€J" “¨Ç9&û‘úc¹ò± C»†Ñ•ÇvÉ¥* ½QÚ…$¡šµ 5(oh°ˆ•¬Ü‡S„(Â)*fb?Å.ŠØ1Ò%¸\/JnhqC=CÄ9Ô¿Ül¸érrè¹P|Fî;è ™‡ô|Oá!ðDÕÒ­˜ÁvF:¹Ñ}µéÊ~RH§ÚO Òï©ïõ¼v±ÒK@èŠ]ìÎÀ(Œ6 dS„­IXƒ{ @Ж;éÒ‘LÂzqö­K‡cËN¬7è;ÇáZžV”î¦8ŽìXO"¥?¶ºstiÕ®£P HÁû¹œ$OÛÉEB52è%7Åw·_D€Šn:M/ÉL!ÙSƒKu2Ú•½1`|te¬¥Éºʱ¾AA

        Àíè¤Hõò ’üGÒ''5XMס8¢e¥%õ5ÑWP¨™PNêRЂÎ4HïF·>Ï›%Š®ž4jÎK"Öôn§¸âBÒ/‰ðJÒ¯èOâBÆW*ŠÎÅ3vÜeÓ¨÷É’Ñ-ðöÌè$âÛ3ã@üÆ«[Q. ]Xe$)rYu.$B…4òšc½N(’•Na '»­§{¦ï6¦Rv²÷ž ]D$2.¾O¢žPëû´©¨’Åé´û¿*`éà56Õ粬³çq—ND>ºµ‘O2Ý£¡‚Å=wR(÷ ɤœˆäk°,\'vmYXK+ËJH9O³,ÌkË:ö`£J¥ž±ÔY[ ËõkG‹aãeÂPÁÿ)ŸB:P *ΧÈIНé")ÜH¼„ã¬]Gæõ&N¢ž¥XˆÇßßž®úƒ~;Ö+ÒH6k¥å`|ªZ½´´ÞX-$†2ÿG£Ã¸’pPˆ6þ$· Ô#Gô =Ì 7Tã¨eŽTp\°Ì9 •,Íc+³’sûÔ?ËsxÌÎg_¬6—/¬•›Ìï¿,^—9çÖú )ÕV|ÛøFÞb&6YÚòÔHÆ[ [<ËF$0­Ésp̺ŽeŽzêIºðiÇ™Üþ¥Ý‹ÛaY¨=áûÁD\(9£dr×}%CŨ1@e½S=*:ܤ(†;…ËÊã)dG“3+ ÿ¨_Û,>%‰×ƒËKâ+þ¦?6¶7H= ÕËêôêMÎ÷Ú¹*Ç)>—Åç¬Ó˜½øZ×i[tê¥=è´á~Tª 'C…-ƒÓ9ðAÿúX:¥ÖUº¸Vòcî0‹J5ÿè­‹#³õýÓ'–È'Ϧˆ8åA±Ñ@kÛ37ÛÈt± ]X§›ˆ«GØeãUŸÂ‰ëþØ8‰>SÕ ÔJ=ú¢qæÒèÞ¶å0ŽzŒpºx&%ôýÒ¦íRŸ44õš´ú ä>Ó0Z7]~º#¬Áÿ]¦ØÒªjos¦µÄ€b2v<~{"ðåf{lã¡~%Ǧ:›pU†Å7ÖA‡¼uma¸8P7è0 ¸9ž@ÍìejÊ ^RNqˆÇLáöPH«Ç°Ã ±°3„‘ÆÎ"¬jhƒšÅÇQºJ|ma¡¦àA| ÷#æÚñÁ¸,‘zVE›íð2=¾hÏ/Ńò¤­Ÿ£ÛÌM.¿–‘&&. =ê_çû=‘¹¸®oبÐôªz?ÿ¾#hïýŽõ˜€š<4æE†ký ’69¯ µík œ …*%®éŒEr4¿¬T(é¤*³è¡϶\(ÂÜ’úžZ¾d)íYòì2½»ÿTåŽzÙÏSj«Þ—©³OÿbòGÃâÖ»±•GÔŸ ÓH§[„щ­Ï+ÅVÊšÛ‘¼»ø¸@9"éè>ÂþcöhëE­ô«8Ó˜±l§KZµ” !ë—õ $rÃrÂ夶~˜€pñÁóëHêÆùÎ÷ØHÒu€ïÛ,?3qå\z†aY©/éµhå±»î+Òa„¾áÄšL;“±³>Ë/ä<‡Ù ÊúUw”cÅLsÚ€Š§9 ™ðo+wÙ¡·$§â.<<Ä“/¬ÏE8wñYÍ›:G{?Ò®‚ý³9gÍð¦ó2 =&GúEé}ûȪY½äç¬G¸õÆqî9ó*é.ËãtiÍdSýñd¢úzqÆ»<õʼ ìáH–qùúSšxÏÊT®â/ÌØ”äû~36ÒþñºýC”'C¼»1¸$µ¾(4ôÛåsñM³{ÿþD{­endstream endobj 775 0 obj 3919 endobj 778 0 obj <> stream xœí[[o·~?ð8oYCrx-З¶‚^QGíKÒÛ²­4¶¤ÈVÒþû~¼íW\ërÒº 6ÏœYîp83ßÇáñ÷{)Ô^¦?õßowùã^íÿ0¾Û}¿Sõƒ¬jûßœì>ªÜGvfòj§ê^ï=)a­ÛŸ¼Ý}=ýöH -‰¢ŸÞKAäÈLÏ 5DŠüô.I½7äCY!Uœ^&±qÒK7¦±õ6==aã·˜Eb ¥n3z§×˰Ìb£ ÿ8ùýŽ\†ÉýÉ)LûSú2jGJOGÇÚc^T߈hºfãj>iïÒ¼‰ Ôôªˆƒ‚ýÅ¥cœž³'¿eO^,*¢Ÿ0-×bÁu¹„GËÍÓ¼^†l–´Þ/NvÝ!íþÇ×{ã½ðjÿvgÄ\q–¼Ù}µ½ÑZml´‹˜<†²Ñ*™a±}f Ë0¯ÑGlh,VGÇJÙôUÙ¸#*ÂZ’s´´jzŸÄÊ+Kq:Kcœ²>mBMÁ#ÅgUœ#ÊDT˜½TðB4NŒœ§ È$OHEˆ³$y"š¯9¥•pZ³;Ñ´ªccÔÂELà”CtAY!Ü…R³$)+i`©î´Ò„:­Í-Pa¯”ˆÖ*¾˜B(cÒÂx*ûƒÍ(ÎáCå¬QÔÄÁQ(þ¤@QëÙAˆ%4q‘ŸÂ™~HdáM§ð{Çe¸á2ày)]¿Œo¦’FºËŸ?µÔ9Á ÆPT-™ß¥:c­v¾dBBZä,ÂÜY2ÁÔDõÚÅ2ßÚ˜Oæ:ß/s„:¤¾ÞÃóTÕO“§ 1ZŠ@fGkeqU¬ñŽáëµ^ú6ݯӃÁxÚâåÚQ(éüø?/¾JI‘Æ$ñÎó2¶¨Å+e<6À Ôé>ë'¯f ÎòꤋÉý&"ý<Õ%gá)ÿ>où¨§«\ÞŒRm“WF¥lS¨4¹%/ÿ1»%'( & Xê‘Ñ3Þ)õVf¶ÔÃxOŸyß1CX*ý{ɰ­Ö¨—j«tPslÕò œ‹ð?ö ˜¤ë^X øMÉlm³|ô2ÔÊãIŽ›²U+·D«ã=Ü’]1pK·¨„¾‹[¾9ZžMúÇä­°(¿ÇPÔp@Qû ¨,t@嬋ÕJ´QÚÄšÆe’z8Çœ)^OV6 .~Ϫ—?Ë; ƒG±~“f °gúáÈ¢;Ðúûù¹ë±©™¨¦Ci*®òÇÝÉ/¾žþ²„'Þ€;øîñ+æâ« ‹Oo}óô«£cJB­ÌÕ~ÐC›’´îŸ30t“¼è½>Û"ú°.à•¸ƒ°Jÿ–£ñÂÍ‚ŒÝÑšÄõ¸JJì”î Ý1ˆòœXC` ¤p»A´LÎkШóÂhfˆ.Ö :û@FM®XL ¹ŠÚuÀ*4"-ø~|+þ•¹É7}kI3wÉû5öÆÙ<ÚŠ¹­É¹þiË»‰˜¯œd@}B׳ÂÛ4’Æ;ÝÍu~4 @œîm<ç¶–Î㺮Pc­Ðt»\y8Š¨Í¬{fس„1ì™­+åg­ÂÖ«„kÙP0˜RpFLÅV+Æè¡d«¡ßˆ}P@½·ÁáðRãæÅX³7Nì/äû%#ßEÁ)S€"•›¾Ìàl˜OqEûYa° ²ps«B2Ùfõ¡¸ÍõÿžÄúl¡³•ÂÃ9î)ÿþ3»a¸¶3b¤ì´4¥ê€,PræØqÛKì|‘w’b´ªeit.¡kMÝ÷ ©T$°±‚ÃØD—?x&^5Êp žÏÏÇðÌ'©rÄÌ">Ëk6~YêQ îç³Ñ×KI¨ì!ÕÏ™÷Ò”U—ÙÜ?õäÉ–Y™g4!·òrô.ζªØ¨–‚Ý=Ï¥hñrÞ|гåƒJžUÞ5ΤºŠ¼e`e*¢†ðñ€a$ùÿ·yxˆ b*††Üu^#T·°b1ƒ÷gùÝ%½ß Øøë_¤ÝЉëŽùAùÞ¹Š•’|ÉUøOד¤÷±ÈÜBå%g CÉoQZDàx[ MPäJUÂQÙÐ@ŽÊ8™ ¡2Å A¥²2Œ¼¼Žá Gú¡(úÚS¶­·˜¼@$I¬Eq¯§[=?õ¡ÑM¼‡)¼%ÂL©Çl­o1$Šñž¤fäbÉ#!Jªt¬i$¢~ü`÷¦_Ç:ÔOŒR—PÊê9³¾„z•£0Xä*ÙÚ®âó$¶Ø\WÚì·Ï²öS–_¥i(Ý`¬gŸÕùö¢¨c!\ú³Ê&ÅÆ¢âUK¤³8O7t²Å Cwê¼ËrÚolÚweÂþ–GS{&¼±qÖ/%»›t›&«<»é&WÖà0{cwþ›þã¾XÆ}ÙZG7²áxqKe$É-ŸøÈcå#œÅÞJ2¶ØÄ‚î3›`èÞ˜´ä¬ësYÒii)ûN@“p>A!7£Ÿ0`ÊÂB'p^ÖƒZ¹a”> ~Lçy"I8™¸ìȇ¥=r#¤ cºLWh*«gÉCn)ÉBoåù¸_ÀÇ-…[¨S9èýϹP:íÉ tÛû³·Ú æLCÛöñ€#;Ÿ:ÙÅ¿+[n4z·Ö‚ó#t_ÃòQØö¹úªœBÉ*V:Žªî|>.‚£s,J•‹"ï뎷þæÆI³Z¤Éwàò¶°¤ã\–tl™MgަËcEÒi¹„çç‰&áùcÒXþCˤˆÙ²ï×KÞ”,35Kú®”Ž!¯XÇoœXéÂÌGM,F‡‰µb³„hɕLJd93‹‹ÿÆb}iððÀ«§åHɯ¥o”)JŽsx{¦Ï‡“q RÛ>ù¼]³ºÉI}6©Âʸå /n¾³Ñ¯ÖGûº.¬´ÑøÁ%ÛªÔÚRICÉØ%sí¥…F¥+¹!O– ¹Ê\Ç?¸z¥ˆ«†ÚyY~Dš­üSæ3'>;Ê¿÷J7šng戮]Y ¢vmCœ½qEÓšy\›Ý{,–ëÕjD>)Øb ç¸/Vð‚Ín5¹úykSÒú¸±B%Ç›ÁF-‡¾ó˜¹ô†Y­l„UÙHÒúùJÁÅ`;VQvd¢!^@yo&­Îç{ÑéïG#­»Zú¦Ì—Ýt½TÞ—‹x똕òÝ&ütÎi=í•zŽëÍßÒÂÉ­t©¸¥¯eHMý¸ò.t$|)¬F JW;ɲÓZê«§èd@¿Ò fΰÍ0³á/ŒwÂð¦_“tZ4Tz®U%J+òÈs†ÒÐ"@Õ!(­múŸ-R* Nö&l⫼Ä.Ò꯵–˜+)‹PìâyhV ›~ ø8Û„µ7èÉèœ]:„è¨: ßK³‹€?7ùø‡š`Úâ!sh 8Öï}pmâšÃé—½·×Ú'cª0kè:ˆ½±fuá5¼HºAóÁHfŸuÅ"ßâ?¾ðÿ¬<… ¾‰¢G÷$[–~Û{€Ÿ& zÒ¸Xvüí§l~ܱùòé2íçÓ¼Ú2‘G83±GÎåQfÀ*P†0:ƒÚ,a 6¤"šµb}.K:-)A-ת£ ÆÓ F¥”Më0 ؃͵Éq9æjQÈÎ+?eá?@¿`Ì(ëŸÏÁQÍΡ¥ÁïuVAËÆŒôòñ@SÎcÏíG´Ëñt<•ò¶ƒßÌåë›ow¶¥±#¬ vpÆû„NŸÐéç„NKKk‹á•ä*ÝÙ[² ³¬~4¦)flbHÑPZrÖŠõ9ykó³ þ“I¸GÓÞ‚äºv/á–ÿŸ§çál´Ü¿ÆßÿÐ'±‰endstream endobj 779 0 obj 2922 endobj 782 0 obj <> stream xœí[Ko]·Þ_øG\tuna±|?dÓ&Y´“¦B7I–eÉA,ÉÑ£®ûë;Ãçðž+É7@"·àPÏp8Ïo†ÔÏ[ÎÄ–ãùÿ¯.6ñÇ­Øþ¥Ž~Úü¼ùž—mÿx¼ùÃwÒòm`ÁJ«·Çg‘?prë”`ÆØíñÅæûéO;Î$W*¸éíîˆ3¥¬ÒÓK˜ÕJ 妜uN+çq¬”a\„é5NkË·Ó)Ž3ÞËé_Ée¡èt˜ÎÛ0Q1Aûÿy£l`ãÛãS`íküeV 9]펤ºÀPÞÍ+¥¦;2Îì+é,Ò…óBLgiÚ à?1!dÓ ùòGòåU[Âz‚x\îÈÇUðÉฑÌy*xÞ/7ÛhÆÍöýÆIºqŽ9±½ØÍV¨3o7ßx;, Ú2#Ç•e6.æ&0ê .†Ã*³µÚ:&%¬*3°J2­šŽð[!X0FPÓ .·6¦¸Oös §Öh¡òé„·ÊOÿŽºsœ ;ÝF9z´ÂS#}KéKÂr¡¨ý‡)é]sëÒz£:~4X¯ ¢¬¿A 6FZ—8 jÖ´Fi¯³ 8iÃp˜Äs•ýwýþTKÁkEàd^FáËöã~¡Ú½Bu‚ •dzÝÈG‚ó‘™çÁò“Î×-¿lÓè¬Ò2´{úá›¶âu^Á=ý.ïh-¨4ªQËàÒÀÅøxÖG§sÖx°ùLΛìQyú§Á­*|ð’‡ԶñR´A+:F®É—?ö{Ö5ùÀ+p?Ô¸ô´_¦úd…ƒž¡ÝÂ*t‹OWÚt»\‘tþWsí¬ìˆœ“1a lƒ·ÇÝÿþûéü­×Nƒ€ÿµ.­o:§WäDMÙ8+/ËB‰š>ÛiˆÜöÙr$²vt–æ­—ê*y†ú‘, D’¿¤ƒµ÷í¯ë¶¿¬û,ýE¡Š©±×0’c8Dlƒ»Eç2C¢s ô°H1I}™éVÅ|G¥ š àœƒLKVIXìÊ$(]Š\ïñÌÒÉ.Z+D=]¬U g…£é€¦ŒahV°’+ñë¥ËÀÀ|¡÷¼Àp{Ç„}—å8š ä-"6J8HQFš' ‡cQ€˜ƒ`Ô¬\5ǹÞéc¦W82BØÂ$d9Ï~ˆl˜ö¨rÉÐŒ¤Tž©P&öYÑŒ½bE@§è­è6YŽÖROÞ!g^ÕX_9[âpH)ê‘?o±5KHºNί¶ò‚d˜+t/ÉüëÞ¥—:‘tǼ%(¡èÊÓ»>ÎÖùÏæØqžƒ_Ý÷žø 蜤 æZ`•t¶¬»jMÄHßÅßro€eYÇYß•wÃò%ÑDðFý`ázdÔ™îu3n7W* iÀ-¹OÙéw„ô#…|:ô£àº ÖX*dTÂwÉÎmðCû5Ä]ë@QóG=9áRMÿØ0qp¢Î·Þ’š$ÑÐàOeœ^Ãx ·yqÕÈ 3ÇøÝ¾Íá?þà©ö¨5Œ­B¯-R¡—ZV!!Rì—™n•GTMûe†ö,Ì:ÒÐh˜;¤% lÃ3ž¦.÷®¹*¨hµ®]ñ䨤|Ú†_í‚¿vâ¾D ª¾·©àViO¨§à¨¥/ä…µ¥|7ùº!~ƒ–ÂzŘÓúéV̤Þ% µs›o/ÁPÝ“:?è¾rð†Öû` :8E%1î$'ÇkHH3%œü툥Àk¤³v%£!&@’/mòãm=¢X¼‹TF+Qï%W2¤$Oו€"\+i»ÂŠæåQlúŒF²{¥çV®3h*¢4úʪ”ê·½¶Jý6ìèéËèZP¶«é‹dDFí DÏ–Æ DÎRß§P-Äœç/ÆåQ)?VM^ HÑš4lç TîSè Ae-ýpцq¦¿Æh—ÕÚäÒRá™õæïÎÒãÂGb­f*óÎqƒ黿ãø;Ì}cÞ§éÏQªÁñÒ&Z6çoä²ÕUuÐÕ±mq1ŠAi( ]î¯Ç ‹R0xêÀEœ+]²¶|HÖÆÈWø×MÁÞ¬¢ø´ª¦Nn¨µ"ç†Z V„b-Àe¦[¥J˜®Ê3&œH×k7kö_~Ù “>×€4 A»TeTÜkª¤ó )ËÒ¿>) „ O)Ë”ær/¢%B±!Ò#¡=ølšß|Þ›Ìp’‚ÓƒýœT~<')Ðâ/”„‡ê ”pµYf<ÁB®¾¢I9Èp‹»cЀ$‘/.m‚Œ c:'?_! ¿úá¬å·‘ó5LC&Ã>Ø%órØ`’ÅŽ†FÄ¥ÃIé]~H,áË –ÓéGË΋uº¶/­©ðO¹ti‚â¾ë v/€âŠ‘L×Â<X\šÐNæm’‘2E¢õ^…¾-Šê ]Óiq³’¶î.Vn@¢XXi1dÒ8ú_…À4â,¡ñjgÞhP•?¯tæ±i¯!-õ½|Úzw¯fÿ^Ï›¿$mÍ•0S—>O×€R‹Þa­NïMäñèwÍôiV¯¹ÄÚ-'y„G?œ½¤£žW©,L{–˜?§{î]Áé±áE¡7Eç¯+ ?'‰œÐË%át÷Bj‡‰:Þ²~ºW#P]1nEÙã¸,… Ý;³<Ñ­áEBå ©…°p”@0µä€EÔA­g&³Þ$,r]P¡–¨´IØë´·¦aú-é_Ðyn_6c[ë?ÃðW|ï|¬¦¯”Ò¦@ŒwïÆ¯ÝÝšSTºÕO[ ,BM(غüx¶° wåiR½o"šB?|÷Àýâ v™Vâ0ØÐAëòÇÏŸµ1%8{£8„_eîy¼A±º6Fè/SK(g×’ÓìZ9ÆÐ 8ÊÝÛ~¬ú¬\ÍÔ³Fkd%Ø9' 1XdX¥GÏ@Ò1]~™Î1b_:†\“ô¿v¹žuŠŸ-ÁQ\q•ð5$4á«'_¤£8î:|MÀ3ÅÔänÍ,¡fd}ÊF`H„ÝùTä"9N³V+éÌ3Ï4Çý S·vÕŒÍ^‰Õ?е!º„õðgíùnεXï°(©ÆVDýjp]ÖóĬvý¥ól¬±‰¤È•7±¸üXMÈ0 PÁø¾È£\4¬¼èæ¯Mª%S«¾IoS åjÄʨ0Vž‚µ½©&Ö:¬ýÉiöp¼öÖtÝR‡Zi¦:…ú“¤\ÄšRf¡MÉak£½#­ t87 §¹4ÜçͰè¹nÏ/W/šÒß Ñ§TkoŸš#œçSE#åmÆÚÃıÃÝ”?¢ m Eéõãnè kÙ(¿ã¾½]u3¯(äˆ+,zH) œ“ñ*ŠñkA ~)„0ŽZ.”™½ÀIšÑß·*ޝâÕÖ@]oËÛþâTÕaešoÏáßÿ´âXendstream endobj 783 0 obj 3129 endobj 786 0 obj <> stream xœí[ÉrǽOø#æØpíÚGèb[6mÉ…ðEòH R$ ÿÞ/k묞îÁ2 ‡RH=É쬬¬ÌW/«š?nÅ(·‚þ)ÿÿîr“~nåöËöôýæÇ,?DQÛþædó«çʉm£SÎlO^mdyÁ«­×r´ÖmO.7ß ¿=£ZG?\‹Qk§Íp ©ÑZj?| ©÷Fû@ÏZÛQÈ8¼$±q 7œÑ³õ65ü‚=_ŠÀƒªZô&çÓc¶b£ ÿ<ùÓF»8z8&¶'gpíÏô‡Q9-ÕðöèXyØ…Ce´ µ®Ùsq_+ïÈ.žÆ åð*‹ƒ„ÿÙ ©b^°7ß°7ßN*co¦k1áÎ2]W¦›ÌœOÌ Í÷‹“Íß7fvûïWkãýèåörc€­Ø$›¯7q‡b4n xòB»Ñ%eaãb“r´Zvkƒ•£rЪh©ÑŤµš;2l¥£µ’çN ´âj뢵9_9bdMá¥`¼rÚáñïp•L4zxžŸ] ¶„C†ù»gˆ˜tÖHRG²*míðWR@è¬ñÃiL-½LiCþ:î¯w£T2Ö<úvȉd„óYßên~å £¬ú¨$¬UÎg%rÇ"½°"ÎjLÉ)¯\\_ºÑ몽ÏR9„ZÞc²ð­ª§”ÒÂi%Ë 0&\õEû¨†˜¥šÄ3*ø’ĘgôŠ«/:i OË;8©½lêß™8Z)©`𤎩tŠ#ïIˆb^Ë,œâºèÒR©ÐVísr(oB]4c¹:ì šCÉklQ€ô¬…q9REþrz^ô@™Ñ)ÝÖíÛ£^Ÿ—k Ð¥RVA¥*TÓÏýÅåö——X®­„€Ú=dYOÄ/Ê\P9¡‡×T * / HéF· k1)s#©â´  }–›±0çÅ®š>Ïö„ÍlàLsΡRÏ™¹bD'<Ä?À˜PøU¶  ¥Â¦„P(ueLlWóE,c¾ß•[¶,¡š^Õ x`ÂÚ˜§½‡%\ùŠåÓë¦1s„F‰BRù… Ê—Å (¼h |äⳌNv–ëBÚ¸J?Æè¨èÀ&:×½xu”¶Tä´´º¦tØ­\]s…Iq1ŸìiYuCŒîcs–ÃOGVãɫäðÍÔ‰Óòs•Ó€L›9MW—¥£‘ÙñYZ¦4’04MøzÊVžòïÙ|x|Jv‰ÐRÄÚy䫽iMY°ùêñäç6@! SdŸ" ]ÑÐÁ„Οíe^üêÄjÆéáÊ>`;Ò;9ÙŠãUBaåuŸE\¥ÌÌ»µŠà±æãðÌý,;k€@#svölˆ§hV×SfÔÅP;ù¾PUóp!†Î fî]©l%€çR%`±E#ç'Ï^ÌtIÐl-%¨Í&Yò-G¬LÆ£,J¨­p\YJÚ…øªT‡l‹(¡k®’ÅÍ-&+liêžØs¿ ª÷Õæä—߬²7Îð®'ö–¦„ýÎ8ŸªÖÛÑD=üã("rZ©Žõ]d{ÞI_lU†Äk›v”Òw«ñœÀ \-“ÆL"ú½å8MãFÇ g>ßdOsVªhy)ñãÉZKÖ»Gß\®›/ˆ…Mçº3á¾­Ùàû1—/Wlª€h7xa›Ï.¡;Ìñ2] kàî–À ¢ÄÔYB÷„’z®°´gž³çÙ¾µÃ˜«cª¡eëFZ{q•ëøññ]"Ò¢ï:>§€E4Ù®r~ôš*Õ‡ H^]8¿ŽÑJ,#…—ú¢°š6¨IÊØø)gë© Áæ9sg A…9wOL¸ô£è>iƒcf•ðN³v­ÅC¬k­’NË#tÁp­"éz[í`ß²ÞZ›è÷ÞÞÔx4÷Ä¿ór[°Ê° w©ñPÁ†t¨Ð ï÷GÑŒ Þw Èñ./œUJ˜Î8뜗»[Þ¹§kn#fëå]š$8€eqµIª?h’0#Úìò*ý%ŽGp˜'ò»“Fmâ߀«þ<¹Ð. òrü.ÇÔ¨þæiíŽio—:׺™A®\Ç6äx¹ZT-Å›„¥x+âBU+–÷’¤Ó".$º¢*^T@LËð¢¢2‡mÆæ'ÚÓ‹ _¦ÌˆXá~¨)ò^énYJw·:ÜwÂ¥‰1ÈvÂUP‡Hdì±O»¹ø”ðж"X+)<Ý(UÉ="£—¾à÷íH‡û”ÒÒhº¨»Í)ÍTª X©Ö²‡–jZ±¼—$í¯Rq­"áà }€Ûƒ"8:è\]Y0G»sªØ ´½?4ЂÄO¬³ ·îµ0i*DÛK”VJí¨ÐÛ4É=z-EДL°%äß‹–f‹¾Úä³åÝÖƒëÒyùô©!}ÜIßW=@ç íâ~­È©ˆ²hS‘³þ<9Á`¾ÿß{=Qïµ ó1ÌÒÊÄ|Å ÒR TÉ=–&Pݦ_î[Á|î åϺ7Ì7+ŸyζªÄ?V(uù %ø\‡;Ò²íîCµR‹_|¥MaÎ <­?˜'èÐV jG»¼TôACl’½PØÞŽè@20úÊs/X‰½aýÀä|qyý>cò—L~ÊžÏVtøêýz¾#Íw0y:“z˜Dº9aëF¹óáwý§Ë ôAø^¿ß¼Sî|àKÔO?":ín´Ý— Ÿm¥-´~¶eûm1·Dð壬üóõ$gs‚ænÓÉÀ]7ó[|£5QÈFc' YÙ(”TSŠåµ$é´À’ú¹ª¤ã¬Ê›1ðO´€ ·ØÔ÷’ViÕDæí”èœb»ÆY]4OÉYïÞÎJƒm¹Üë¨éç¤ âhÿgŽ•Ð„ú{yp*æ«T¬ÆŽU÷jl ­sËil§’mV²­ü•ýšU²w2€‡…¿“ª©qÆNˆ^A8QZ7ý-QÓ›Ób{ŽÿþÇ2×endstream endobj 787 0 obj 3064 endobj 790 0 obj <> stream xœí[ÛŽ·}ä#æ±'°ï /± I 8ÊÂ/–Ö–µ¬•Ö²„@ŸÃn’]œí™Ý–²«D°`±kªy©Ë9ÅšÑo[­h«óåïŸ/7ãã–¶o£_7¿m¨<袶ýëÙæOMÐ[VLpÛ³g*/D³–”÷a{v¹ùaør§•ÑÖr^îiem°n8‡ÔYK6¿giŒÎÆ”ÇÖz¥‰‡_²Øužæ±>%3üAŒ/1‹ÆÀhSgŒŽ‡‹y8ÍâÙ¥Ïþ¶±UÄÆôöì)¶ömþM°d†×»G&b^l¨¬–¬µÃ;1.Û·&†Ïþ’7 ˆýƒÅ5pÒŒæ7)q°y[fOÃÕ¸mŠ”†÷ªee}3XC°|VÑ㈯eøfr³5:û  ½Tx´­ÛnY[ÐØé3vÎ8Y%'+æØ¡#0·J¤–gà1¡U%™=\¡RÈ -£¢[ƒÌs"ô'¬™Ûéˆ?Kù„ø7+Ù+¸‡ï™aP‹È,ó}1V)Á'mö™¢É8“mƒ=g· ß‘×Ü$Ç ¾ŸÅà˜hýÁŸÎ!|>e¢œ·Ü\†ø_Ç£lSiÆ'2¨î*ÍÔÇ4ãCTäÜt”¯Ef¾’ðÍVI8+àâ=ÓX;f„²R>ŸçþeR  ÙÕ2 Ê%¯–QXòã:HøbŽ•nÊL"¸ ]'n”GÝ,eçf‚äiç\ÉÁùc¤˜‘_W-Ó½®b{Â*/Å äiÆŒ'&41ÆÅC§¹+QÔeP£Úƒ¼>“Æw;ÔÆf$qKùÄé´Èÿ#^I¹œG`]Kl…Ópb•ÎÐN¨årU]%GóÞùż‡ISž~ð5ë;âov|{@þç}¤ÜËK‘±Õ¼ÇÛ®6˜ÜâuÈ©’?Ö Ξõ*ø>ö¤k{7# p¯óÓ‹È}ßÇ,4®æ0<¤"cïz¢QÓÊÁW-g.JÝÄ'&’¬.—X}æØ&ÛøFmZ\Þ%÷8©U$’Õ]džH¦±:aàoºgupÍur#™©–É Ü5¤ÎÎÝ#©ßþºåP`ªÐx°>®àA—À¤õ¾õ´ã§Ô€®aòê5’_-÷ÃÊ›W®öïrõZJŽ9T[rˆP­a-ß´¸¼×ª¦¦‚¯—Þ¢U$29pEceY$´àZ“Ihì齈/GÖH>ddž\Íy% ço„ºœR¾z %?-F{‚1RüøÙFáHº¥x-Ý2@L·œÚ·t+kÒÍæ%ÌCko<_N|™o°AV¬¥è%†_3ßÜ*;å÷c¼ØÜ©Ê9Òöèq,KÉÕ¤(C|l#‡ëæÈK›®$—8@ÙŸ{5ÿ×½q‹}Ñ躜|Ô•³ÐZ™Q¿1@ýÊ ÐòM‹Ë{£¤Ó 0"ËR­J$Ϧ˜oü3Ï@‹n¾å‹©L½ŸÒZY š±GuDqöp® Mk³õÃç^Íš^ÍóƦ70¼qרõš¯qgÍDž=cTȾƷqÓ$wpw~Ó{×»ûÄB„åéz‹)(K§gm‹)*kÍq~ÃfMXà·ývÂb=ò º³ ûZ™ä<¼ïf“áh”½¦"¸s« ï+mâçVÓrl<˜VÓ\s´ºGÔµ~VéEÖú¥J:­˜líi­"骧}ßj21òÊ/`HœËžÜjz@ENÍwÙOá2m<û­.¨+êÜ TšKœØ»:t5‚øzaøæPó~¦¶¼i‘7-¦¾ïU%–‰Ô÷½ª¤ËTìÑ-3¶²ï…*X}‹ßà¼i+Ùæ—[Ö>¦žYkšÂÍ“ÍÒM",ݼ¦‘€U‹Ë{£Dj6€°ZU"}KþŽÒ·ÐB%°Ê·´'‹oñïê[дþÓø?Œ_ÜÀ4Vù±ÂŠ0WðMr§oñáW:{‹žÇ÷»˜W'ùm¾8Üòµ”çã,°‡Gs5‰ˆ qå×OUÒi!2€R«Hº˜uXG[³Áâv½*d±eùà‘ù£ÙÒM2[º9ÍÁvºsm‘tZ¡ÕýÞ³J:×Üm:×"nÕªÎáÄ‘ùÀÑM®ýáÈäê GE²ޤÁÿûxÔB¨IæjÑHÖ5%.¯’NKã’ž¤Ò$›ò X ¦U?PF@&Ñ£½«þËØ[€Q³tó«°tu6 |÷Ç*9êÔÅ ÿØÀ¢bÖˆ KeÐ% Ãüó߆m³z{ÿÿÚ:Uendstream endobj 791 0 obj 2262 endobj 794 0 obj <> stream xœÕ\Iw$· ¾ëùGô±•U¸/9&vöű'¹Ø9Ìâ;¶¤É8¶ãüú| Y$PUÝ’º²¾,S¢P – @²ô׃šôAÑÚ¿/o¯Ê}øuúòê¯Wºý Ùá'Ï®~ô‘ ê§Lp‡g¯¯t{!šC´zò>žÝ^}rü鵚Œ²6ÇãW×7j²6Xw|ŽQg­¶ñø5ÆèlLôl­Ÿ”ÎÇÏhØU8¾¢g}Jæø{¾…£ÌÌ1º||3+Ÿ]úó³_]Ù§ÁÔáÙ+ˆö[úe6Ájs¼¿¾1|!P›-Ykß°ç&¾51_O)÷"Î^ÊBòv²Tó¨Ìr¡:‰ZOÙ{ͱ“yÜBÖ“U©èM±’ׯ¥¦ŸNÁ¦ãßÊxrÙÙãOÊxJ*êã÷Å«Q)f›ïþ”žMò 6ƒçלT†á Á;m95Y’D\ä&o}ž¡ôé±bÉ©+½·BE‡ˆ°YÏô_STxoB¬3iÀÇapJðÖ%×`MÈ›óë<áWß§×rþâyøÍ“߆æî£ÙߦìT¹¾WGUÔåwŒªTx ÅsT€ÊÏT—¢óÓPQ²†SÿÝBEñxCEVÙ\Š O<~ÒÈiÿ=T„)Úœf~?,©5ø¤Ì2 ‡Dd 2jš,eTHÜB",éEÛ_^ßhLï ™5F»xü¼8ÓØ”íñ]µ2³n¶©‚ôðˆDãÈõ -êQ‡ò¨_d¼£_[ªÚïo‰Þr†yUCô‹13Ÿí~b?¬^5 ©­½êTŽf~7E@ðžÑðñÛ¶¤ðÂñù›1ïgŒÏÄèë´Ñ¢þ{¾³Nu’?“á ãÏ ]cÏD¹?~\HhÖM!_bf}1ÿ]¯ÃM~Žÿ½y*R(á­„‹fjdn{Íæ{|kxbn§ ™œ»Æ’× 5éfè¡CUÌáÆÐk>gR¾"´›„àaê9çYå‚XÊF6¤‰È—×&@玟5å™3ÍÞ¿,yØäï‰3Vˆñ76!çÙw[’*Ú¤÷ìå»kƒä¡ Ð·$J€•„€ïFE4 Pž7Õ/¿é“¶²¢ÎÃyr>\®¯F –eLgƒÏwÝœú¶ä&—C˜'u>vy«ð›ò¦G Üi\$x\Ÿ|ctr¾g÷wO2cšÅBÃj–Xå]¦õsFþ÷Šªy›s•Ê\(ª}xê\kÔWÎNKþ¶±Ôæ7³™ntY ‹­ðÇ+¤º/‚îFÄmFÈ,F'¬Ñšª¡Ï)ÕÇ Ïu†Xú·#¼7¥™}^¤ñ~¡ Å(­°ˆœ;—ý݉4qâÝUãæÑdT7%Ü€Î-hÚãê#ç«Ó°ÙºxȦXñMÍÌÏ×B¯ÛÊs›±BvË‹ÂóÜv|>ÈëÂ:´*—/K¾\ÄI·¦ :¢èef´Á›)º=f TœNš‘gD®=Gϲܼg³b…¢~À75Þ_xÿ¨Ø% µø= óx“©b¤ ¤‰çSB5»Äñ#¦my9x?SoÒ5#áK\fC2õÓÌÉ žw5[!9£ºÙjæäýÜØ ÞÌšJ̸K”5¥Û™¹Î'¥S‰ëÛkoi^.œËùÚ†6vb/<'ŸÇx²Š8¿úš4ÁY"AñÐýžký*Pô›—6cVÍÈÃcSFQ$iÚƒoÞy ô‘WW›µ7éfÔ[…Òµ8åK„¼µ &ê#—„<P#g¨$l!ÿ9+0Ζ Ë*e«ôXùdîàE}C)œUò¯¼g­Ô_ßÊ,j¿ÝötOå¨G?¸è‘©Ö ê×GÈYK´r*\É©žèR° S*bAjÕ¥'ʆS%1/>8(YŽèªj‡ UâJ8äXøP¨ ëLFÑvBÞ¥©ƒõ¬Tôlª[íâ`!ГtS€ç¢‡d§`9Q„ß’Ù%{ÞãBø×eGÇP6æŠgæÕsRW΀Žfr­`s-äÆX^•s´•¼C;°ŠÍ¶k6³ôÊ5ÐVw\.JwÉJé­CíêU"í’ó¨ì¥ôiÞNårNÃs$_®Ç"þÍH®Õ&çL§C}X ΓF‚ IRPÑ`Øc$° Žn‹-J,ë\.SöV¤ôtÆ›2§²(ŠXƹh݃‰s–Ò¾¹(ó¸S ¼w<@:Ÿíœ h37 ?kë»tv2é{ fèÃÃÇ¢’œ ›P%Hü$”§;ñ“VÚ(¥¿Û¬<¾£´ˆÔ‡Ù(…ÓÚàU!Æ‚ÈSk³Gn*!Ü £?´QE'ô¾æ8,ËÓBràjŠBt›‰ë.ÑmFØ,ÖœS}+ñ¾ÍKÖûlvùÑäÉ ¿ÄসÐ.bõ‹ÂIái—rI¡]Ö{ƒEuR<”½RP\†2ÆPt;Aå,_A/,nÜ¿Ó3ÞŠ,åŽÔ;ìÚÍN2s9ÙæàÕ÷”x±ˆfÉ\V\IJF·;³+åƒJ½¼ 9 ~¨|¢ÍWËu8Θ>ÒŠúZè3*è²§zrQïP‚¦r€¬:ö·=‹2š×\>ƒÕ).´ ò‹2ü ¢ò+ú]ZP·YY -žX±c-›¤<ÂOŠ¥½WÜàD”üÌ.á=-yF ¿±9R\À¨‹«Œ"…«¡e¨¤®9Öå¤SÊPiªà?ém?=²|×1•pˆe°î¹ ä2ÆÐíA……/Ä]Ò4ù>m:ªTq¼ìþKX.ÛÜ6êmHI×ÛØõÅ·´ã`AÌÎ7/~qICå÷~ŸÉ†ã~\œ71 IÝ4 ³ A=‘öHã>‰h“WÌKݯòÙŒ_/x7ûU¿ÛÅÄß\=ûÁ'§”>}³}žö_Q8.n=’… ¡?²›}õ±~ÝÂ<ñQ¥Ö!ŸÄGŸ«ý½žGzÌ,s Ï,OÚ ™¥ ðÌ‚Ú(ÕË~"×\v¿·gú´Ë¬)nGvëÝ~\e‡!ŸÈM¾YûA%,”ÅîˆÊ)Y·Ç< ì‘\ª÷—Úa“è\ü±æ0çÌÑÅ[H˜£S- ÄÍ‘\¤ÓèaŽ6 ÌU–ð˜yï1}nkŽsEüoi aŽNµ47GT±ñ\ÌÑ„9|È t4Þ{Ì4}¤[Ìñb˜ƒõ1¼ “__çûuF[´kkëum–öÖëTK{rëù$˜Ú€°M,KÜzô©›º¬%œ­G×>íÊzcÕÌÚ] a’!PW·S “ ªÙXÃ$|Ú€0€Éåôáve’K>ã @/‰ت=•&w*Zg°ö/yÙËïj™ õ¼\¿ÿ-h3 -ˆÔ«\>> [DN'öq3Xà÷ÚSN Ú·Dšéˆ”“²¯‰_ ؼ÷c°~cYo]7å/$°¿Œ°æQ¨ïÿÓ ·lyfLÞT&6æ¹’¯Ï{õüü…œÏ´ Èu^Ò‚jGw²èP¨ßÿ¸z1ØRšÂª.û9ðëäÍ]ÎwJ»Áä ßÇn7 ¬cuzL•Ç#7¢íÃ~0»-L.ç0R˜O¯»õVuÓÀep‹0Õ^/òT{oOž¢›‚6¯»­Ž=iÝ­×ÝvÓÏVÌs=éÐmižÌ4ý«Y2kÂJŠ>WVj¼÷$3ú¶à5™Ýof°¿ -@]Pú}“€ÎÙÖÞè6\ú‡[Z§hèû€[i{mçë`®½ …@OT?ñÐèÉæJCw‹§É–ö§Í“qéÜ—8LΥݸfÈ–>ma²"‡Ð}7®i²œÆ¡[ô‚f¶è°ž°º¶ñôy½@ü<ðXš“ÖCQ±ñWà,]C@Ùâ¡jP ïaü]¶ñÈòåüÿ?¤eì|endstream endobj 795 0 obj 4235 endobj 800 0 obj <> stream xœ½Ùr·ñ}Ë1•‡d™Ò¸=Å‘•­ÄŽÄJReçEŠæi‰Œ“¿O7®i,fv—ËK.l5}Àð—31pü“ÿÿîzÄð]]].~YˆüÏhߟ¿––+­ŽÏ"oprpJ0cìp|½øqùâˆ3É• nyu´âL)«ôò Z)¡ÜòBÓÊy\+eay‘5·Òl§Ãò-‚s‚»åE¢gœtËÛˆ¢ƒ3 øÀÜ{)¹¤TÎÇå{ÄÖ–;nÿuüíBYÁ„ Êñ)pÿü× ­ŽXIgϧ‰ ¯”Z>u–PIg‘0¬˜"Ë¢¼pE!C•%î¼ ;oGFÀûS¹ ;{D”óq¹¦‘¯Ž[hÆÍðëÂIvŽ91\/Œæ@+TÈÕâͼ·? µrÍ[lâÁ'oѤ  äp´Bft2ƒJXfPwH0@­–R‚ê2A T2‚3 -©Ïym¤ÁW‚q­=ª¯n¼HóèO‘ÞšŒ n¤% •ˆM©d¸· ki”±†R9'èÑ ¯vÑ Ÿ¿6Ú B°`Œ@ Zɤ•°|µ8þãË/’£jp„ä‘y}OÖòšÛ,_^Lkn‘¢1ß­Œ ØY¾$à÷ý†Àoüb~žIj·üž 0CÜ»|Ó3©¸¶ “Pæ#þNä÷é$L_Œdç_":¸­QËïúC#úŸöÌP†#>a kÀ;­VBiSÒy±ƒ²ï{êÅ–H¡¹ÏzMY£LJ.¿&(Ó<62õõ¼²ëúžàнWÉ bøõŒš&Ô×±@­öŽÀ?uvbîdIæÝQ÷3䯲.CqÊN&ê”ÔÞÍà?ô{©þŠà‘á Š'“¤QÅj|;O=*Ü—G©°I\©k”roHᡬ7NN#ëbæø|<|•O^®Eâá5q>s4ݶ&Ëæø+Á8éUÝQ¤ÉŽºç áøj̯fPÞö$©vø÷›ñ#ÎÛl³@Êé4:'Ò_„ŸÎÀ)>MÆ—dMCìí|²¨ðsÂ÷¿gÂógP# F½TÈÖЊŒ’~IN¡yvEàšÀ9ó^ÊËë>õÊ J*_¹P0åœêüº÷ƒÎ¯üùfÛu{©íØ ü•icæþÓŒ¿N*õïŽ&›áá²MÐXûP›™“^ B T®ogÌ{3¢üc‡p8Ÿ©4i?KyÇ–3»úñ±×­Mòr­ƒ_̨ílf=wl©r^7mÍ‚N í×­#çö|l.W¥+QÚTçSŽ͹2™Ðyûc/`T¹i÷Î^ãrsn4tá7©ÝVAB‘„%Œ**$u+¯ƒ®}²³"[N‘ÚÓÑñÀ~Ê›:¡x˜aB Ú2+íp!qJáòQ¨œR‚á€e B‚¯V…8- ÖÆYfTV™e‚Ç©I0â0…94T²÷YO8(N±†¥HüÛ:“þ´$üÓQHtZ ^³È± !¨ 9þ¸YD»QDP’02‰øîHZ¬ÖA‚Áø¢³£ i-Ø<#Àw‰³›ƒ­Y"À©²™¥‡¹ ƒÇ¡`Óð;±$¿)ŸdJ$ú³Æst­ºólô2º“¤)'ž¹rV6TÎÉú}’ÍŠæÌ‡tŽ6˜™p%K¯š•C›„9Nn*zøÁ¦;ïQÝW±¹ÐŠCj]ˆ £¢F@…¨Ñ¤,äÔ&š2d8™_s|Y2óoI+rL+? Ð$)™-a4“kx­.53gŠóvÌ We&,»hÒAJTÞ©šX gT@Ò×n8NºA9ea„ÇÜS Þ0â>:kDÞ8%ÅÆ6YzãChôPn¤4Tø*°ÔÀ­4„à ٟC^¥ù‡_Î¥ÄT¸ nʲýn,*9HB J_>œ6£a“q4‘³BˆœÅ¦N!mšMæ µ)ÒV{%[Á!1h`ÒµwIaW3â|fMÓ0iãzSWÆãoe|ÒÔàZL¡© ã]Ô*ÉC½ªƒÓi“¼BrëSœ0&¯Á´@¶se¼šiHi—G×´™½™ÁgýÞ®[£9üÕ#y˜ëèJ•?üŽ ‘õÄtºqDOð4Þ_ÏЙ2®)“]G žêKM€e_*ád 9lRd4á¤Ã}×]€!–àÂB;0¨&K˜àF0k*$aÏŒo°Àk°š!öÇ Ø ¹ º›nQh­¿L~¼ÛÔEôªXa¸ÃDD€LΤn5ÀŒj± 4-V ïªÚõð”€'êøMþý˜ÔÝ5Ò[›‰K¡ˆOèôî\5µîàÔ¡®×Ä3`WœÇ÷PâÅ€Ývî¡ÔØC½ m…h—˱ƒÿ⻜™å,v Ëkß[EcÎU`Ú–åDJ®2ç­5é‚Ѱ€´`HÅäòJ«"˜5Œ/1?džB•ާN&]#Þ¤4A…÷–ÒBZÌVB:é¤@bäE˜ ’xš³*ÄB¢0{Å”€©"sÊa¤G+ï¯{Ft¿3•nŸ°`l"7[0†uyCÃÀÏ 8-ÊNÙ#\(R™` ¦˜ .´‚@D®¤;<&ÞÇ8¨Š0®‘K†Û#YÓAàüJ¢ÚHÌ(µ|3òû0nŸƒ}Z+Ÿ›Xá„ß5Èêz¢/Žðç#ɘx,TÉû¿ŒÀ?'WÚéH‚~Z'T2¿OLê"X‘Ë`K§†ìõ­åRrá z/×gyz—°…Ã-×5¥<gÁ±Gn1„6ÛìÙ·¹“¼˜¾Ó ˆ sK—×”¿ˆÇëYn¥‹[=ò˜¢¥³´ó¢Ùùv~KP¯—xÁªMþ>¦±¿JÒ1ˆpøcžÕcÒóX€¡Xºæø¬V¬½<&ÂGlz‡?ÞI%­’sƒâ„÷Lç»xÿ#˜qèëÆÃάèǰ²Kª=F¯ž‰å~±Ò&¾ûÙ¶,¸‹ªC;Em|/.Q[”°íNtGPþO;>­™`tçЛ ÷ÏtQvð$î“‚¾Á¥…#ä œùB1áž^¹iú“kYlú^ŸÞ‘ü§Èó[𒚢ô˜ëÁ¦uHߦdë£äﱂ@kh—ÿŒßäy`ÿ ¡f"ŽŸUˆxí åa2ÒÌñ´€*×dmÈz"ã­®Ãr“ä‹_1 ÇŒ¬O¡{´Z&˜ßõÁ[­É HäýÒž1mùèE›DzЃZ§¶Lü\=u\Ž á[÷ÜGq¹€2-s |POh/Æ×L% óvNÈæÃ5@ úH…ìq$@n$˜Ê—U4O]¾‰üªC÷|wc#JÞò S‡©4w#íÇbì´*šíйpœUèµÂôm íÝî&ÇU*ÀDhc&¤ eæ#ºî¾Ý%üm’ ¨i‰7Ü?ÑD´—Äk4>Tèy»oL…_¸èMStêÿ«%zyI‘~èÒ]ãï 0Ú–±­Ór§@{Iâõ‡™”O\:óÄÜ»JJÁ›gjKºùÊ ³Ê4iæs(RË×>RÜ‚yíôÛ‡ÈoÑX?wÀ» ¦¥ô>f þˆ‹˜^ÿŸ³x¿6|DTØÞwÐO ÞgràÄ?ZíįµGzJybÊ=J$í¢`h¦`U&—~ë«¿N¾‹ÿʽÁY ·àg¨sãTûÕ8LÎ鼿\3ím«[a%Ybªî~í"ÃñÙ> eT'bŸo2s7Û=k›¢y–À²½šÈH…è^×ô;È“jXV­aEsʬ¥ééT9ST&î!'?¹„®Hú«RÆ¥VŸ‰eâÉŽ¿rèê²ve|8‡¿ÿ ëÓÜendstream endobj 801 0 obj 3046 endobj 804 0 obj <> stream xœí[[oÇ ~?È8o]Ñf8ùèKÛ½$mêE¤²dIn,Û‘¥Äù÷%ç¶œÕîÑå$œ]î\8ä÷‘3£ï·j„­âÿÊÿO.7éu Û¿·§ï6ßo ¼¨¢¶ýÃÑæ³gÚ©m£Ó·Gg(x½õFkÝöèróÍðÇ5jeLôëƒC5ã Ç$EcÀøáK½Gã?cGq8KʨœUÛcž³ØzÊ/s{Ök?¼I*½íÄ—$V!h­´lå|z|ÁÚè”Wî¿GÛ#øHS9:¥ÑÉ¿Fí hêâP{ê›Æ|šGŒ1Ãx.34Ú;n˜žÆPæbø:бÍ%}ùR|ùfR…øñ­¼_Þ¶HR9Ÿgùühó¯ ŽÊnÜx­h½=l/7µ›äÕæëuoѰâ-.Rã1do†¥ÅÃ!NÉ >¢v0Ëb88°üS^3²@Csá‰kea¸f1x°&üì‚ËžsHþ d‘¼¬EœÜ#yehVä™d…ˆn ôä¼ ä¢l eãb“°%"&Õ¸@'­&ñ«V1lŒzt‘ íÑ[RŠ™ IXÒHu§(ÖL§µº¶c´äP# r#z“×!y ‚wà‡×dCpÁTqp&d{š`¢ÖÍ@ä?0j#HA>:ì§Ah0zì´õaï9 ·8 ²¼R®ŸÆ·CŽ_‚σüì™5€ÊD¨áþŽÁÊZí|Ž ±ÕäæÎ X‚Ðks{óÑÐð 9siïÓä¡Î¥»÷dy§Úœ²¥ ùhðò˜ ­Á"º"ÖÔÇb÷Z^ùÚÜïùÀC"$b`§&5hÈ9$¾& u g.6Ô1†Ìh7Fe™ÐªÆ[–úQc!Û¼”<õª!Åפü8ÅŒžâç·#†¬¡Xfþ{ûîfy¨ ™!ù6ÄL_lŽ~ûÍðÏiq©šÁ¹ï>¿kxµ2âÓ;{~wpˆ”ª„P‚¥ŒŸØØZæ þ×bµk䤷zËØÇJÆÓšðvë´f’d¤ŒèG× N#yˆï•qm§ôP4%߉!µIÙ›¤Ð»Ú%èüZSè¨Åð(÷ 9@7>Ê‹±Ó" —Z…€‰nm¢ÛF­M"¨µÑ48lZ±|—$–¢Õ´™‰$së¬J2W&1ð#˜·Æ§%Ò„¨³‘O¨=2fÞ}!x7+8Àá»dm¯¸á/‰$‚ -ËÚÇi!Ãçí¯2¿8\O´®±ÊC9õbb²ê%½Êßm ^Ó»‚í6Xʆ\Åöúº¶[£Ò%Ýù<­¤‰‘ÒÝKP…Ñ9Fñ«×Œˆ~ÊxO‹H)MÃ)‰dW©Pj÷X·D²‘"w_ŒH¶r.ž_d¾aç~Þ]h@Óò– úÖHæ½Â<+J*l*‹hôÆÓ\_ä¯Tâ³*”£|»Ô—d"9Þ빋,?-\IµÃóMhDõX³rO²‰‹©Ç–J*ï*7CGk,,‘0D>/0ËçÕM…Ò ê¸ ¨«°IZ¦iÅò]’tZV ©U$¸*eseÙ$–ØÝï…­H¹;±Ç>Øú' ¢¥ìÁˆF‚ë"B8úU=8uÕÀ½’kÀ !Ëë>I. |DÈùH„¤26m ’;Gãª7¯) ëWÓþ²æÆ×u6*èfOa«ƒXå§ìfŽŒŸÝ )L‹µò‡¢¤áÖ‘‚©ZqyÀùc£í܉[œ¯øßuñ9ìKµ“•Ù•Y[Jk»Àš0d¹8ÏÝ(ìD›r=«#ßjŽ ¨`]óÂY4-Ö…³s‘Y5ÉDV÷ˆ?šR,ŸAÝ+­Z„ÈTeE¡U%’™¢zvÄà8T÷¡G¢ƒ1øRßeËXеìíwúåL@÷j¥ÌÈ;§ÊsLËg±(Õ/$[£µ­½ò¶ãr)âØUK¨ûïîEêÞÜÏjÿK|†.„ÑV:+o{°R­ïênù³d.4€8ß̹s‹Cê—ëæ –ÂÞ¹ngç¢ÛaØâ ¥#2¢Xå„2vá}–Å6ÀÐÏÆ}À½.h˜-¨ ä eóèYvt²¯] €›É‹EáÌó7>mü ÿ>ˆ»äÏ›¿š\»´&ê;=ž‘Àg(·Ùï~éÕð|dr^ö\%T@®IÈ5À„ {X­’NKQ!ÒÃj‘HX5Ž ÐG «Ä€4Ù}`•VvŒÎßVÏÒʱSü8ÉÍ,z¥:“ž (| â8M)ê©Ä0ÊÔ)TtÑ™b€”»/‡Š (=Gç]ÕÇú„Îåmt&‹/t–È+s"Xb‹[ª‹ø-©-ÝÞ‘Ÿ,çJM£æGùغª^2ü+b–YI°˜jßJè » ™³˜ƒÝ´ä®¤–ÞiVå¯hyç‰`ªœ¹¬eír¤kl׊3Gª$NåvÎD)wv³íï…º.ÉÅäwÔuu€kØ8!UÃFTõHK5­X¾K’N‹Œ\VjI‡àttm¬ñ#>ꜹÅõC3Î1òv™M%Lþ–4ïÄÈcé7V)‹Œs%xZOÛO’Cºø ’ﲌ66˜*¯ûà”†Ñ}2œz»Ü\Ÿ“ò:êüjˆÝÜîÝÙŠh— 0Xýt: šD@@ƒ°¡?b«’NK騱U‰í({#AGŸ”½âG‚ŽŽŠB©l¾^Þü}/€Fäf˹†¥ ß?a‚Å(r;×Ù…"ì8ù¶MB‘úºŠhÏjž E^wÒjï'䨻¡4ŽÝ©Q°æ#.<¦(m¸ ¢´F¼vèùÂÚñUÒiYð}9W%€Š€|2ÐÂRQ¼×öUýÙƒe=&“‹¯øÙQK†¿²ñòAÌÉŽÚk¾{Ø”Ýô¼œ~øÑýt¸ñàÂÌ’ûVõODa&;c‘µÛt%¨»®aQ–vŸR]41MÈÏÄõ¦•4o :¦XnÐ!b¹¢s.塪d÷_ÏÙ¥¿ž£àK—-eJ®^rtÓß6†öØ­¶çôïÿóšóÖendstream endobj 805 0 obj 2978 endobj 808 0 obj <> stream xœí[YÇ ~äGÌãLàíÔ}p‚$Hç{߬²8?nÅ$·‚þ”ÿ½Ø¤[¹ý{{úaóãF–¢°mÿt¾ùÝ7ʉmœ¢SÎlÏodyÁ«­×r²ÖmÏ_l¾Ûýy/&%´Ž~÷|&&­6»‡ ­¥ö»×DõÞhèYk; w³N…ÊíMÜ]Ùz/…ß=ËãY¯üî:±˜èmG~²A)¡ø(OæÇ+â6Nxáþsþ·vr’>b)ç—þŸômTNK…)ΔÇÜù2K´Ö»·ì¹¬P+ïh` Û‘ûŠŸ.gUÌ3‰€g³¬\…ƒS8Y'~áiAÖw¯¾b¯6üÐÆR^‹ #5‡|v>ôÅ̲fc_ä½êfá|@†@&VqBvõ[`7¤ëÞØh`²] ¢Š8þ°HàíµmFîyøbgÇ^íÄovâ7ô „j\±¼—(œË¯'cW¥pŒA'Œa \D€:cXoH{9°÷Érg ºÔ„§,<•I[¨¤55^X£•hïžÇ'VZLi,‰Ji;¢E£| @Á¶ gï—È¡SÚ™ŠÊÂÏ*qˆbŸ*Fs T"]E%º¢’@~iTb]ˆ“s˜Ô'` ÌŽ6ïï·s¨›S ÑJø—8„Xà¼)‰YG¹Áˆ'+âõ20åÌqå<¼% À§ë;¤ó¦µÌÒ²È<%È÷0Ÿ¸#jbqhòуñ&¤ç¤­!Wu~–DT"x[ŒÙùÎ÷àÔ~®Šý~pì*[`ålûÝŠÐU@ºŠ!tMËlj¶C´ètT8è£E.´ ¸”ö ’š#(©=×Á[ñ!½ø¸á¤„j”CFÌ*ª¹ þˆHb¿œ‡90!'}`!Ù+ºôH›r›yDXŽÐ;›‡šZ$#×þUžGT!^òp«’ ¹Û+Z;¼jÓeJïj+`VˆA·*€M¹TÄög&ÙájÝ¥ÆTï(îr ­xÏeÖAîbéÚ0ÅgOÔr}/hXeU¨ÃJ#;;™‡uÆø*ÆÉÉœ‚§JÅÞµ«isCîî O³LkrFtÂ]C‡Ú˜ÆË{‰Òq}á<ä\…Â1¤ Nä Pà f`OÈ!ê+p¯¯Rì¶&'a‡Ån¨IûOˆÁî_ﶈڅ†|ÊÇv²”ÞÖÐ O äáìµ.muÇýô  -E¸GzhìšáÏfØ Ÿ™a5i$~®qÅü^¦t\žNcù ¥3|K†‚\gä)†àøêî†_Ê£ ÛŽ~ÙŒ½<šEA‘•ö1:š¡=B/1̸èsðƒq¾úCýxŠ?P)Úš_×¼C‡àhPü©0‘Æ61²«îjÉ œØgƒB?«F9Ê-nÚœ¦Q˜Ó4ÔÎ7®ì€…Òq)&¥9W¡p7…cà;ÍÝTiOrS|gpV†n7Nùi>{”ò³K‡7¹æ‘ 5O1YªWYAR®$û)˹Ÿ£#Ç«ÐDÍOpt¨ð¶ Ž?2Ÿºìù¥¥Çõ¡“ œ»/Ö"¶î¾&¢pˆÖª^[áz/æ…Z¶–а:áàÐï÷$Ôväý cߥ´Ú_îb?¼g¡‚%ƒ¬P:>ØBIb×_ƒ¬e47µôê¯6¹“lp—¹}¬ÅèÅ3˪W*ÞG}ùR58åz÷!O,mäù÷U¾€0j ¶5M°dà!ÃôoçlàùŒúY€] Ÿs0kᓳÁekDŒ•Òq¦1¼}¥Rºð é§(YøÔ°OB÷:AµÈÕAÉ”ßûzª"sónïñ¤Ö] æ·Äl”1È¡¹ã§9°ŽûÄ>eN®5¹Ô§Ä>9å0û&)Ìhiü€0‰Š¡/äT·÷háý,ˆ[%˜­ÀãÅóŸìaq4‡Ž2äŸ/bVnšÖÊ®‹['—Š)G›d–ølÕ›;5ÊìNÍ3µÑ)–×¥ãR‡Oâ+…û/ËŸû¯’ÔSw’#=Ñwà‹ ¶œ­fáDûÁ"ÞŸñS›óà>Êi=ICªÜ¥]“ÎEú®RŽíÇbÖvåè|sËý ë«×ÀE~TÞ€ŽùÉÒIáçV“^žjHLT¸Ú“D8ZœìE÷"µk–Æ­‚öQUpiŒ'©’²¢Í¶ \Â=òóïó’• 0mÍ–¬´‚ߘS–Œ!&£ìpwTÛ´Ì‹y§Êî`Q²îŽƒË¶ÝQç€ô\T§¨íõ$QqŽÆ0Þd'ç›»_k{¾ÛýÀfºJwŒ­ÓÛM«éGK¡pˆ0ý x# ëSôƒ!`ÿ¦×Ï×t Æq$éCh½(ì&¢¬ÝØ®¼ŽÔŸ!s€y*ÿ–ѯæçÕ[eÅRÌc—¨º¢t>'TQ>ž€*È¥¢òÇaë#vÉ˨j¹d¥²h]É-Qj-‰[IóæCÿûƒÎÒåµdƒB’½6H=肃½W·.,p¡€©žÿcsþÛïvÿÚk¹ÚgÀé¼¥sP1\6Mtã@å…š¢Dàá×{? à*üQQ©FYÀü”…¤ÖPgå¨ö“v­¡Æoé²6t©¯Ç¿¸`ôg}"|(-õç2Ùè\Žt×s’´.5<ôÒ>îí±IõˆÑyÚûåù,‘æóÅäOsV:·î}yŒ¡^!yCué»`ØlÅjÃhßÛ8^ƒnìXÙ}¸I=%Âú.òErÅ ‚á:1ë(ɸûú~“ÅÎ! F‹c㌤ Ág¥~8fßÒ‡ÒYTí»PN±o‰R;‹~Vûž¥­ö}‚´Õ¾¹´¿°}ø¿}ÿlöMR5€50°+F¿€ CàXúèJ†@¿`кQ>ƨ¬¢‹,b2 c5I¾¼î ØFé[k?¿äWFu…ºý·—ò¡¹…ñzÂ˵)ÓogL\1Mnx÷­]Œ.Ós¯¢v At^ÆUÛ H›O6΋ŒËµ÷þåÌÞ%\…ðÖòl‚ôˆGõ“¹œÑê'¬œQK#à ¬2RÁ{øŠ1JW>¡Yxsƒ„)Nñ¤ê‰„ø Œß'mK=vñ’ÉJ»ìÿ`ý„¸a<œ¯•2Â5"z^ß«‚rZ{ÐCz¬¶*õ(µÚjýxB„.?Õ<ß9ÕšòR•lÙctí¢žÎÛøò~þí  ‹«þ;™å%víÈK Pî˜ÌÙáSP ]´s—ú›µð_J C@uÉF`.Ù¼[X9ñ>B8º“ÊŽ~ôM­_Bé­uðQÀ¼›dÛc“XlŸàßÿ´7åéendstream endobj 809 0 obj 3451 endobj 812 0 obj <> stream xœí\]¯$µ}¿âGŒxš‹r;¶ËŸ‘ò’@$’r¥<@Ø]Ø]ؽ Ë.„üúœ²Ýv¹§{îG i‘"x|«Ýe»êÔ©²g¾?¨IÿSÿÿøåEþxЇ¿´Ö·ß_èúAU±Ã®/~û™ñê¦ä·‡ë¯/t} ˜C =9ç×//>?þñRMF¥p|qy¥&"Oöø%z-‘¦pü{C°"·‰Ü¤t:~…­ò&ÎÒÁ¦ã#îv!hŽÏËx.˜p|•El nè~‰n£1ÊÈQžöæW,m½ ÊÿûúÏäõ¤CÂT®Ÿ@ûOø¯ÉxÒ¯¸2ï†ÎOŠ‘ˆŽoE»ÎLð<0ZSԺ΅¢ó\´Im.ùÉçâÉW]dÝå¹xòtE²ÈÓÞ\¬ÈG×ÿ¸°“r‡Ÿ.‚QØà¦ //œU+µžÿ¼ˆØ<&마VPä'Ÿ…•KSL­‡…“Srï]œ „æ™É§,´i:´ž’sZÚ_Ь»9ø¤'R±a¶1«þŤaž*9þxIjòÖR²Žž"O™÷rpc'ÂëªQ|q,Vã EÜÑ ‹…ùSÒ³üìÎÊ‹46ÂÁV°xÞ‘¶nm0>­¾^û)PjïÿMö¬™2«¯“öÐmïƒorSy2:o¾&4Ûº1ŒÐpU¬]Š®ùÇ—ãRHcIÑNy'¢3S4ÙLÿx~oýÙ½ pR*[ûOCEë]t!e=fÇ351`u¿»¼Ò“‰ÖqËĉ¢™wÂx¯óƒp™É;Þ ^ƒåfoCÌ&m½ðyߔ㛾(ò=mª“À%»D3ÿ¹CšÿìI²³PªOqÇ ã`¨!H¡Ú3x›öiÂvwƒ~—»Yž¥+{’×{hçù×*›â,†Š€P<€)`ùŸõæyiKÉ "õEÎZ¿j­ÞN1èô+rÜ@Ø*þ^ñÖ@Ö /ºœ:´ò)¬94…dVu´„0kõÒ£‚ĦG“Õ͹½Ç—5H„ ,Tß’üBøÖ öD¸ ¼YºÙ³âãXŸUÓöIþà7îڇ͞;0Œëôã^Ÿz¾sI³yÒàh]é5á¥HÆ#8}r±Þ¶‘oJ˘‹ÇÞô½KBÝMdíMHkÓzÆ4¼‚×7©TŸË=ƒ3ìª=Õœw !^¢£¨¹moÏ¢¶nÊü–÷öm‡)ÄBë´„1‰Wy¡)ÚtJ.¤CiJy™ðx–ÏviUûøÍñü¨õ/®”&#ÀíWÑXòãœE{U+§ÈÍ:Ê·-s¤'c`èe‰ ¶v½·¨bL·ÀéŒ£Ž©¥Jç;ÐÔ©ègƒmØQ‰œV"ŠšgatŸÁØYb7ˆ%e‡î›KÄPà3\½Þ€.ùäU+o‘ñ ˆ#?³Ð. à• ü”:¿í*ÃÏ›x“ •ò¹œj褓׳>IÑ òMQ Y%?ÉMEQh'eèI(0Eö×å-.jX/ôq˜áÏ—ˆU’>ò㥣) I^DÚœkšR°³ ‹¥X¬v›i 0°­ˆÐñ¹EÏ3ÖCеX?÷ RÌjÉJ©Ú3DŽAÚ‰ˆà8ÙÛRó™åÝ jù²{Ú=2NkhIßCE º‰×ùkì÷õ¥eƒPæ¡TÙ¤)XÛ҉߳x´ÁÆy³¬“âx™ ±©ò7`¯Dæx#ú¿£ÅZtñ†âÙè² ëØ.ç´ S?î 2ÌxUÍ¿¯/#˜P¦3’=ªÁ†Ü'"±QêÇ‚Rš–Ñ -‰¤Ñ E Yó›ò>›èxU±Î¶Óù±“T‚à¼F,—o‘ƒˆð!9ò³UõÖÓ€*a]hu†EPéœüIX¤Ú=Y ]2ÜŠþMDoøÚz¾6¬fF¯¬®=ƒ”"‡RµG"ºåbH"º»Ý2[`dk~QPm™¹éÓsÏ å MQ •ŽÁï•r“,XZAq×ù„”‰*X~ÆGÆ8:þ<8ª ÇyÙ²¿¬šT·ï(üâ<ïþ…Èÿ½M¢w‡Å0Q·<â1/€ÓšOÑŠ:Â/1û{Ô58W3ñZ’;7“]E ¼ëÇ=àÍÀS9>)Á’Ö–nÔLÊù1ÈEè,ÎÞ³b¼ ªóÐO+ùv€&F/¨dÇ¢ÊS1Üó–¬/ ¿™ø.êÁ_—± þcXtÔ2±ià+Œ^ö3Ç­¼ >¤AP-8Ûêu?x¶:÷¹²b†Þ—,«lò~ŽšËòTOHŸ–Ÿ–óÚâÉgªè3O_Ó;O½”Z@'\3êgC©¥”Øš"25’g޼‘?æ}'“ˆdwQ›°”¾œ¸¹|TºoÖ«;q0—ÌÑ®fE¯¸6’˜Õý&Ã'k‹ý-ùL”¹Û«Sc”½~Z&Oú®þQR¶°–5Õl±lG*jÒB¥RÝz6)ÐLIZ‡ $Û(¥¹O›Ú#¥(D>IæÉHÿt$ˆ¢“ÛujK«ÕÎw¾/SŸ&;€ò¸~_bàNõØ©ÑöY£ˆÙ¿2ô¤/x½PêMYŠÍ£¹½ `çîNq süªŸv„/D«)èÓÓÖº™òÞ^¨iþd){£¤þ¨ûãlÖ~¥$>ËQd$ûª¾^Ûa¼Niàã›®ŠœÃIYÓ*¿£¼ 6 xÿj&½Q ‘zHÜ^/µÜMß²h‹ø·… uÍ‚7ç×,N°¥]k–ƒ—ËônéÎy¾ùšŒV&4Å9”,—¤œƒèv>EnˆM‹Ã”Ö–#>:‰ô¹{q àjÖuˆ_rJ§.ÀGP·»€ w·œ©/£ãNñ:M puý׋ë>?~ $RR ½²¿¤:Ž¢P-àyÂÅU¹Ub(”4$¯£›q£«³ü ú¥ýîtÚc®Á•¿ûLJ+<òä&Ö͹Bç‰ôsÌ癇>JdŽ¥bj›t; å÷ûb€ò¢RLtü°ìãÁþ”µ¦½ÄÛÑÜ8ŠœpOÞë67”lc¼?g aµBäFÖ»NG¥×Hr}öƒ÷b¾€“7³¸W ||Ñ©lÁG &²ÅÉ:Ej=‚"5º¥ŒjR©>—{ÎÅUGn-®s€aNÁÖÓ\Rš¯RÜ”Û@ž}Õmáua(Lƒê½\0A¬š \–]ÈÅ|„ ·ÚMŽBž}e¯ùÏÄ×¥_½dP8>yÔßñ· ´+ÛVúËNˆGðhè@¹®¥V˜·±­‡W }H$ü åhRH©û^¨£&ʃ2•Ýðý-³“©÷JÖ4P-mñBå$¸(hÂ8U,Òd¡˜oi왩\&*¹p Y÷K-º{«§q›V ›7.tÐÀÊA VîüžEÂ\±ß³Åd˜¡ z™€'F½€9¼)¾X#ç!ÚóÉCJ£öÏVYŽ ÁM¢ÏÁ!ŒÒÉÈ%Åu˜ƒKÈN†}òdøòýž9xšL±ôï@àS[é>ùÜtP]ZØO%{´ž ߣö7«Ù]Ïz˜U0 %Âjmðè úàƒvËî :Ì$ìÆ¢gg_ :òB—eëõ2æX„åi¡9ìj ƒê”xÔ]ªò ¸ˆ92[aÉŒB¼s3g5ά’ &ßÄzo§°˜]@ô ÃDÙ5¹¨&õžAP”teÇeF3º2ú"_»R\ÛåÊpcÉq4 ”³ä`׊cˆº‰]g©çržgb´©k>EI ó‘q9€ÔèÝÎÃíÌ.ÈÇ zi‡$ÿaúdƒ…­eºŽ3¦õTR_ˆ¾B΄ÔFJÝ›ÔãIʃ"aðç¿%ÑoÔ ꜗÀ‘ÔÏ :…Å,˜~1Âw)¦_Áíš‘³ ÑgqOÆŽX6{àà~£ZÚñ-aŠ.ºÉ›]Ê;yfT^O¶Î.œX%þrD’³`„Bk˜k %œ4)Ã÷L#ð¾Ö÷éŽô]‡˜sÀ®–Aܳ~Ð˾é)>vioø+Iqu£dÙ3Óîÿ À’à5ÝÎiYŸžC,œÈ8´Ndr‘ ¡¾‡8· Ø}}´»6'D?Z‰^Zúâ²¢§–…ÓÒ²äÞl¤J±*äIZ qøÕ£ÅèAþoÒÕ1²â´gÝÉp²à¤^†“;*Ïpœ¤ëðWÑù‹Z{´'NÂöÂ÷/½=ê5Ù”(Os¥ùÆ•áo{XÐz¥år€òwÔÌè06®Q hãv¹†@>²›NèA­·ƒŠßnÈ?ºÀc\*™ëîšÀáoö˜z³Ü#NÖ%w¤õnƒÔÉÜñÓ|8k¥z÷Ï0uùq‚ò —ÎL¤—'øäÇ(§¥lö,@`æ³®ä-‘”.‡‰‚ü’•M¼¢:¹ x¹Ü‹èÐ:JMøn2AGc¸Fú²÷$&$ú‚¡v| å0(`%ÖËÇù’”‰Ž¿\t‡ãœŽŠ‘Ô8¡aëy¸†Ä×ñÔBÃå©Q=)BÓÕ»õrÙU;Lz.Ä¿ë÷'ë9”Ã>"ãµÖõܹlŽól=bžóžFÓ®~•=­Þúhø¹—'»ü ª 'C†­ùò†ïT܇LŠf eâÐPŠ—BªS~£²6o}›ÚÒ<ý`®üÅt9µzÓŒë›uÅ»|i¯œ°ÆÓ/—åƒqmïp µ~Ê'Λ¬ÛºÚö‹œzÍGZ§Ü6giÓÒ‚=’É•jÇ`ÁœDŒ¨TÇ>šµŽJ³çó'q¢…äòŽï³Õ»0¯ ji=û~ùÙq/Ò|5U%ŸïdÙȾ/¢¤ßå5ü@ ñc.ÊÞGýÅßôò ò¯÷¿¿é tºm —Û3,´å¼rXèú\Í=çù´ÈR91u­§Hq*©D\I–R÷†Äò?öÃNÏâˆø(P* Ì‚aJˆ¹ R@xVDJµ…m‹¸\|i÷\Êa÷µã®2› \ùÅ*bê¦æ0]¯ªÙ‡þ Qª5ÛÚ¨ÃSü÷̃^endstream endobj 813 0 obj 4119 endobj 816 0 obj <> stream xœí›YÇ €ßúäeÆð–«È:ä%@ dßœxu]·ú,åkúmBž÷ÇÒSâh#!ù1&1îj a¿oÕ–ŽqhYÎg2`íÃ…E'R÷ž5"­ “ÒÀÏ{k+ýµµŽÃZ'ò–ÛZç Ag‚‹$ý¹úi4w¦O4»ßï)ÂLr¡º ³4õ›âö˜€,Ò‡š ‚Ñ&‹=¼©Ñ@½-Ÿx3¯5­ F×I•6DŠd½ŠôäµfÑB»¤bê¦Erš´ÜÖ9”õ¤Õ%)EeìÃL™¬Ô˜B/Z¯aëbPÑaËÕ4õïD”ÝMâìÛd–ÜLªó˜`bYIg©ß8˜JªO-†­g’"õòІõÏÝäÜEßá0)KÙS×/Y €Oy1!Æäy1YJë@P*þ ÉfqÊ‘ÝZÿû± û­*v4QAÈKÓÏã+㮌ÊG[VFaÆŽ§WWb 0¸-bš7k´Fä‹w‹ä’2PßúcÀ*¹KZè§Í7Bz]rLò}Ø–Y¶÷}¯”(äy¡Ùƒ„¿Þ_PQ1økÔñPg<Fè8ôÁç8Ðåüß®Ìã]Qñe@]ü²‘¼g÷aÏ‹i(ÉH‹ß‹…¥¹&½Ú³·RTR¬ug>´UË ìU&y3<—ÎQGðÔÞô¼”WppˆÛI›‡qÑÆqa|¾ F¶r3yçzæèn-§º^tnðüïwÏY‰ÖLÌ¿º"4¤-_ΰFc —¼V&^ ~î´œñ‚ k‹½àª0Å”Ñi貎ÛZ.,L9O3”T'•)t‰H -‘v­TßË’A ÐJ­*‘)˦ĥ©LY¨ƳR…™¶PÀøJ$]™adæ¹ÙÓ~%Den¿.å%¸Å`i_â©)¨&›€òF¤zséÔêZeF[•åþ¹lL6}T2‰§×sPýyNÒ– X«ƒ_f…±8•”ü¹ø+Ùa-=›âì•…åâ¹¹?mo•k•œ#? Ýg½5‰ßN ¨/Óªy½çäeƒãê3—ì8ÄT)[Ka[ ¡amGÀš‡@ûÍYí^Ä£¶„ÂZ8È@¹¼Ÿåèœi¦²àe¦Ê[6ñ‚m“<¥¾79¨ ²i 2SÈwȈoø -ÓµR}/K­èì(µªd€ ZK™R@ÆFGÕ×9Œ±Ã?Ç/üðäËüh%~ x¨ò‡HñÆ!UÔó/ 8´  —lNûyp,›!šb÷µ²³„¯¶nrîŲØ9Š…^—¢,nÙ¥sãCùsoÜ#ÊæÛ¢ ‰^Ó\N@;Q·áó[À—}bZÒã'§Ÿ\÷cÔwb¬•…ÊÆ¬âE6¸Úˆ<½È Ñ®œ9!yuZÚäö*= Û?ïP$f¢õÁÙ@ÕX§-ÂO,핬…sÕ I¥à›7ËÒUTi²^íøŒƒöíò›Õ2Þ9©] ÝÚu.təʞO^´ÀVZÔÊÖC©ýMr°ÄýìžÂ'û¸­¬›ïG_–[¥œÄ§É©•Êsr…¶Ñ´pz9ûIq5õ„Ð%SBè¹­îJ©¾–%ƒC’ZU"3áˆù2æ²ä¬¤iËþèÉŒ8v9<}ÊÚ ©)×Äò Gd5Ñ Hdsþh#‘‡˜†4oz#PEÕ%'Ì›š(&—ó~6 ­žûæ£6iqÔ&žd~ê˵~$Ʀ8Ͻ٠¿ýí 6/ö´Yr¯ö‰™n=‡T|ÖDz„ÅþSž"¡µñu 0Z'ÙûÃ#‰¼î­¼™:ÍÙŠ,A±´Ü¿U|„>Oý<ÿ¾ô=çëé”+?Ÿ‘í1FZ®Ø\|ñtj¶ñ]¤¡Ü›Ï’øAjÁ¸¾ƒª™Sœy²S³ƒ\ߎÎÃj!:U¥=#¦C4ÊQŸçlnË&;—&r1r%r›dÐòäDIžR4Éf‚`&-×N)N3º@^‹­F=“ÀÎZß.榋† LMs©Mc©G:†¯ ®KN!0%Ií8Á³  í9~ÌîçYÙýä³ý·4ŠlLº…ca <ÿ”^Ø!­rÚ‚²â^âë)I5œ£Ì®%Œ÷©æ‚è©C¡3Øi·öV6ØØv‹ÖIuêL‡ØGþWη_7s4É%˜€òàÁ%ÉbÒ ¨p4›–7ÚÏsRϼ+>z¹'ß·ãíÏtÆ®^‡¬e–›¡¶î›J¹W‰ã¨1K±(´WO¬æå7sYæ’ñ4?³?¦£7¯œe;Iöºóœå´›òbJ°°Ù88©Z¼—YÍÕ]"XݹÆw­Âý*´L ãÁQ“Èì@Ë@&O§I ÛàÔì@ i'G‹eû³½‚ÖÆË”py‚'­'7YÔ $BPê’S Oä;óÿÊøOµMÊk¢VÿH~ß1³£É+tf_->¾¨—yç¡&ÞÇÇ©~y¸‘δzÿTT',Šã¿öó ªCô|-_¼raÿ?‡¬ä°ÄÔÊ%g984ÚOtö—ÜG½ pöÈm@3ïÏ&ºtž º4RÒ §(HÕ$ƒ×¶Nò¬Iž¡¥@Á3àïÆNªûŠ8Þˆ–yÄw ? ²­}ó~±6>€Ÿ%_ ZÐ|1q¼‡I]rR… *”&ú¬~î'(^¿À±äK ~íç9ðã’Ì£OCà—o< üœöóÜʹÏÁ¾N¢.™HÔ¡†´â8@­J-ÐìR«J$ú ÃÖÊ;@Òr꤃Ⱦšb*%þ“ŠLƒ•KÀ‰Ž‡uÕ±¹ÁX&lùȯKNA¢r¥‰i”_ ¹Ç°LB©| ˜RÙ­´¬}hMú˜Ý?¹QúÐ5€êÌ™Ðúó €’óÉWW6'‚ÑÖÉxW/±põxà©Ø8¡ª³qBU£›Ú•Ry­H-ò®‘„V• l¤@SòrÊä¿MpÖå”áªÙú­mþBŒ’;‡Ç‹;aŠJåwë•å¹K“¡n’SjÒ¥‰i."hþ$Í>!!†â¼À.˜á-a€åožAʾÿøœâò ‹Ák¸Ü©·§0ý<'x©ú…GÕÊUîÅ×ŽàÆ õÙN0|x¶øQØÆ{ ¿.á×#1ª!‹à¨AÁ-ý%-ÔÄ8À­£‘sþÉ ùo:a°igúc±Þ¾¢ÿþŠ„,’endstream endobj 817 0 obj 2893 endobj 820 0 obj <> stream xœÕ[Ùn\Ç}Ÿ¯˜8‹ïb§·êE@œX’8‰b Å)Ò„¸™”bÅ_Ÿê½ú.3$G$ذ{J5u«k9uºïèÇ5gbÍÃ?ùÿG«øq-Ö©«×«W"àYmý‡ÃÕモ†¯=óF½>ø¯áO½4JÈájs -šCÃÇɰSJ oÉ:?DIkÂCpÅœÃI;a]vOHï‹{ñ›gä›WM…ñíP߼Á¤êÔõQLž®þ±ÒŒÃú§••³c1Hb}±Í9ã¾JÎWÏVŽqŠ^æpe¹2ÌDež9_%AÙG-Xƒ÷ŸŽZE‚Z’µ«G¸µÌZ=Þ…äʵñ‚)îR Žja°iš[üwø*¬…Uàd'?Âð %¬pÝWÉ:„&ø`¨Ê2¯@–úùÏ Hs“õAu>k,råEÑ¿ŒYàVis,0ÊAŒF¼•©xVÌ:J”+_ >Š©4ผ}¾e sEýŸÉ (ít®šçÅŒt.Õ µžÄµtVøá]u CW—ÔÞÛ`ÄyËã¸5n|èEí™öVáìÆŒ@›5°¿ÏpÚjWâªj{&¸u5®KiŽ;¸JkÅq—Dþª­ç#«™‘½’ÚM¯O»÷Èb: Å/ÛÇ}jÚbT*é§%°JBoküš ˆrc´±<•()!cŸpFå\*§¼”œÚ!=1hŒŠ®„b^ RÆ©ê“#9ÄDNÂ=<wÉ(ôN¢&?ú$¼ðF¤=d37d}Ö ?¸#°ô4 §ÊØ!ˆDݯ‚Ø0…X}´Á…7Z?Ôo¥–“ÆUþÜèáuŒ Œ³‘9(^ éJ‡µœn‰œºö„Èßù‘S›o‰ÎñB¸©üñŽª…þœ„•†x”’dœÌ©×"6ýI㈙ ò ¢z“òáloá&¿o ˜²]^ßµlfKrºá·ÉˆDà8ž-Ž&ecÜõõà8 ê‹ã»ÔÆ»ÙFÕ^«£Â€ÆÇÑ>Å * ˆ¤ Ù’Ç^Änï@àœL±dCcã—Ç,´Ùþ>Ü8ÁpDÝô…öŽP©†Xp7-ÃÀ‰á›`@€êÓ~>-($ªØCþ2ü<çNârÒŸúÖ™oàZ[žõâ"òJmlq±q P×Õ)Z„Å„ÝChýÒr£9K宽\ê‚¶ªð¦ ¸:˜2+Cƒ5¾U$”oî†Z îV$–(ÖÕÊÊð´å8Â4axàPÛïÅðÀâÀU™áÑ&Iá@ÜÂjÌ ù‹x O£÷?7†×ŒʆÜ]lçlΛBÏ¢³™³©œMc±¸¶÷σ´q¡ i+÷)SÀs ùTI|ÎfÐK­ýˆ³E<'ÕO€³¯ãX¥Ûšæn$,Êßùñ´Z©üN$lË7óc÷º-é$Í¡ei߉ŽáÄA ¢0íûa䂎ۡ¶Àtôä²}q47ËX¿#ͥ͠íFéÏž„Q¿þ—K×ûfܧ¬­Û‚¨‡ŠÈ}úíêð·Ï±#C:µš|Z4w/kdF5Q½¡˜¸›·:@P²Ÿ'm¥1úa–®^6é”7DYS.Jk„¢ÛA¹—‹D÷<³<»Dç.K›á¿œ$¬\´F9N·p¯׈¼Ö2!´ø*X³Ž‡pelâèÓcÐýld°RB ±D-@ˆe‘tZ€õÃ)I-J?±:M¸8iôµDðj¹®50¡Ó\¿lõMÙ$!™¤3ÆÔCàžkÌoÜqˆ$SUð'EÈŒê|¤Ž]"ÁO»t¶•‚ €(áMw‡ h`µztpDЊõ¥Â̰óEØLffåãöà˜­ 8aE Ͽ¡œŽ§\×±ÿ‘x± A¿IЙà J xDm—»P£ù FhÛÙè†Ü—D]‹áNäT?d!>VɨgKc‘Ámcô«Ñôf>Õ¹n•ZêÌ;M[%ϰ4V?YfN¯w1Ea ¨¸ëUXˆ™éJŒ°nd8]”UÐ.hd—¸>¡b9Îù™AËŒf–Üí”Θ‚£;Zd2ÑN‰{3®l»?i㤎42NÊhB-YN’i4ÉðÜʵL· ­dôðÄîr§5Ë•'¤ :BÄ0,°+Zšt:P—uQ2F+³ø^m&³Qýºñ”ŒW€¼°S¡—g‰ÖX -±)9šì³JÈ>KN¥j-sš]N¹×á{“,?`´ ŽÍ‹ÜR!‚#F)2E¥Ó…õ.8¨™­ž³ÿ€\cm1rM=Ÿô­’Ü—F4˜;z²Ju!Ã9åqÓ˜4Z0Ý[™›¶S"§kúâêrAŸM¿ÛN¶3@ÿí=}x5gQÞ‘ /ˆÒ Y¿ ë—d}FÖÔ‰t¡#œ7ýùŽêŸ“õ-YS ½íŠ©¶O-¦q‹Ñ†â^2C* hCI'9#m¨`%{4”ôè@ obƒ(ç  k,MÒˆsPY-òÏ”÷ †ÃvVþ÷S"Ï:ÏÿÏ&§ÆÒSm;]ßíÜÎÖ.ë¶óÞºLãÖºìdtY>êHÀ“Ö¢ý%)ã£i¹Fùɘï·ë(Á‘œáÉÿùT%š9"ò&£þ÷Dþhs€Óéž™39iªÒý£$œÂ\f[ëÖ»”*Õ%I]‡Gés—@?8ì˜-ï“@ÞGå€ý0.‹§i­>½OZ©O½ïy«;Mw ɸhºç‚ò$ßYpWÅÐb fþê®â‚q©Ö€ÔЈ´éïäZ> stream xœí[YoÇ~_èGì›—wÒÕw ‚$Hr8‰Ã·8´(J”H‰¦¨Dú÷ùª™êÝ’»„#Ø,XÍfMO_Óúa­Z+þ¯þýâz•\ÓúOãêíê‡ÕT%[ÿötõËoµWë4$¯½]Ÿ^¬¨>ô:œóëÓëÕ?7¿;QƒVƤ°¹:ÙªÁoìæ »Ö2aówC°&D^ãEió‡“- d’£ÍeyÎ=ž‘×/ym½ ÊoÞñÚ£n‡›6×X*ìi¥;ò¿ò:*¯Û|²unðљ͛|ºÅ~¬ä.Ù¸y!ž¼+Û*)ó¯Ó?®ŒC𢟞CÚ¿ðo“ö†ôæýÉVðÏ wѳù(ÖU£ƒç÷a5D¢ÍEÙŽ•aH§ÄŒŽO^Š'ßO$ƒØ>þÉ¢·#—¬ ²N~ºúûÊÊ­ÿ³ ZÁ%”Dë땳 öHãÎÕêËþEqM4$çhÇ¿|Âá)ÿÒ™G0ýF‰uÖ„¥H0¥/‘vÐ-ÜÛ:º1¯ Ið  Ù⥱ˆcUÀŸì‘ÁãÉD¤¨¨›Þê“ò”—õ¥ÞDx$Ƚ³dºÃ¯3Îhí:òì‘Þ9§=›ÈëÁhðû†Ã@g|¥ÖʳCâl£<‚*ÛÇD—¼eݳ޼ԛ³¶Þ?¯tñÓ÷ù)C´ÕÿmÂ+ÞäsMc´÷`ÿ…Xß7ÊúÑÔDÎâ-kï•AôÀΤƒ\wØÎeÏ®½õnq¤²Lå`“c¼4 6˜µ‡tˆòâEg¬U©ùï'ƒ\ Å¿¯N£íè4Ù–>%SËS>fk’nÖÁR/:Mu7¼È^ËoÝ÷7+·G3Éýþf´Jù[p>6#„Í“ýmkS¶ÈVëw;Í¢„ Íæ5¿@C#)#ž†Ý€Ó_eñ.§¯3 6yßyá™pÙwåëŠfêƒu×À¯ñWüš0Ø:·¿(ow²³B¡ –gÓWâhÉÈôrÉRÏ5Ÿ¬bÅãzÆÂºjQ“̦&Àf q^þ‚AŽ1iÏãÆe9$!G9@Üì61ò9þUIM@ë^ž0vk…äšíIœIløDôä²ªÆ AU²WÝ.Κ€ôÔG$l@}²°%VÉy0ŒöÊ¥!¦¶Áá§]·Ö ²DmCLÊT5w¤¤Ÿð<ÒOÉ„Bb w2®( >uGQ€˜ŽêP\Qq kq„¢OWd¿›ï<ê1’AT>ƒ·½(‘†`;ªˆw¸GŠágÅ0°ò½ßm †rBq>g:%”á Ôjš\Áq^ªù 958D2¹w[+ ˜4ÍBù!8s=ïë]ßßy}€æ=Š„ý×gíjdë%+â¬JAϾ_C 5–h¿Ê¥Ÿ Àƒúzë$ub¤Š£ôße9T‘>Jò+gÝ9­—@¥yˆL ‘ƒü&€¯Ñ”S‹FíRç~©‘y ùþ§$6*ž‘áó)町3÷is{‚CÆqúÀÊùZ DZÆÕˆ]msI[¸)ñóÉ,»M€2ô“R%²üBhiArá3¹%9¼Ø;|qKæí®f’ÓéÍdmÌh&¯‹f(" ä];«™­qz`¶d°Yˆñ©,хШԨ Æê Ah csE=ê©3Êw­ˆB*¦§¹ãuS`v§wbÿÇŵH¶ZhE8бpe ·õ?;¸z% IîKMnž/”"Éë<ö©=J ý‘¹é™0v©éÕHYlét$ òEç°{ô㻓ž>zpó;l§-ø›+`=ýxDý–"pÁ(®”o§S[øzjVdô¡ôÜsÊÖ]ö3²sÉ%=%b}4 ÞÇîÑÞ‹I^eS$ß/fEÛOnkçò8 n‚qc?hô\[‡#*§ˆj/ÉÆ›i µõ— Âßíú@¥?oRò4†GGP÷ç²G¨=Î «8£cJžpWUiÒRÛy3ÛHÞ í-7˜»™=nÅ~sŽÑ<´dWS¦9sÕ ~óötÞ{-q>©ôrJ¼£U-¸®¯Ïæ|µ¢Ï‰ÑífõmcS&ñ›ÉåowÓ_}§hásž·ðìÀ‡ç)@à¾ôãDY´ëxØñu‘<Ó+κ[|ÏSsLIד:žZ™sÊ01Øé\S™‰–ÁßN uc«[‘o3Ž”ƒ+¹/ÏsÒYf&âÑ#Ûè]Û¹Éj{¾[÷¯Åþói>!–Ô”†ïÄ1«7“ ‹ " yÝBzX•‘#£·Y °i¢Üj`âh b,EÕ³‘âSáÂ*[ù峂I$ØÍ[{6Û6}n›C-hÕêGqܵØþP¡ÑJjJ@Û™9Äá(î…¯å ÏÛlp;éd7áÛK-8PÔ'‚×SdŽŽ“^êW>>jz;õ °,ZÇîý‡Z)„VƒNæ¸Ü÷€ÝF¡ õL,¾ûòÙÏÇÇ¥˜ÍÞ?5%å–òåÃ&:Ÿ KUÃYæòÔ$}ŸŒó~KÿáÇŽ;@‰èégZ?i‰–g =ÐZ¿Î(ÏÃâ(× †„óO‚‰ÏÒ%Â|Ø –^yýnY8Î7 z[Ê>\{Íh§’q—bïÕÂþÝ‚ÀZê›ã@p! ÍÇÄá™:_–˜( ,/!æ˜ÓnàåœêÍB>”ÕgENK¡ÍY9̧†Œ0¡ –ú*é7W ÒÌÀ{ëg*vù¤ÔÏ¿s1ÍÈ%Ši‰:Ò w9’‘I¾CQìùÄàá,qHzñÕ#Âùl!ž$DX<\ä1‚&ɾZÓ£7îšÝ›)W,™íõƒÚl lï/c õB3t;3ÓK¡±ß0#¦ÀéĬ ǹZ^ßëj{eêyM×HÆûÑJ>,u„98k›0êÜpc¦ë;.™ç¦3ŒÝž=¸‹þ{ZË€¦ÎÒÎt–å¬%Íb5šUÊÌô–{SÃ{Ëm"´{:õP®Lå¡[E¶¸ÓxK­I3I&…Uå£R&`5.göš Õk*9ü3xد|”M¤!äZþVœøsk²aðãFþ&›œå/¯’(¦!uD‡~’MqH‘Ï ø_–÷ÚÆ…\;Ê )@-ØÓZAêøÓšò-Ieœ°£ªßð‚ŽcßçÛŽü>ß¾ôƒJT©>—w:*— @RÕîF@esº t­Ì1ŸïÛÜþH©×‚äµ®:Þ°Éš6Òà@KŸ¯¥qþþ¿ÿ|žüŠvGÏíýò¶]›@óXµX›@·Ÿ0ÖŒ[ð™¬Éo³&­!Û™ º³`Ú2§Ór‚"£ÿî Ò_ôaHxÎeç=Ö—êÔ‚æ*ºÅióRé7Å»7fÆh}ܾ?Æ‘&5R¥ú\Þ鍸ò iIUwd´‘ƒ­ƒ‘ѦOž»Lƒ×âþMÛ‘÷o$U¹#©Ž¼ƒ#†àêÅ9{”3É›é.Ž ™ ž¯ÛŽA8K÷b˜ˆòÃH*«-_^|œó`o ]/Æ—é&È,€4ä ˜B¹Ã™‘£ýøä³<½ù?r<9òÀ!†Vÿ<ë1rhõ’›ê±¶!ë1I”ë1Itd=†# ŒH3óiIt’¢™˜ 2¡µ1‡:‹•Øq‡=öÜŽ*êCMPíä‡ ­Çü к!?9A^¼l;• ±»Y7dvH JͰÇ|a‚mÕß‘µ_À·¡ÞÚ—õ—¼:=S£åOPú®a¾šŽ™¿Cà˼îK–qâRÂcÊ8B p"m`\| +7Ô"ny•¡  WP%YD•öÛò·F,ÓS^$àÊIHüÛÍJÅ$d?Ü;Șo²Ätf©<›Âa H-°Râ_9Ymç^{¡:˜ùWTFÑ øÎ0œ–ïÂf‹…éß5™q92­Ö¯ðÿÿÊ!Ÿendstream endobj 825 0 obj 3017 endobj 828 0 obj <> stream xœÅ[Ys$Å~Wð#摵ëȬÃ~ÛøÀÇêÁÆ»+vYXiaÙ̯÷—UÕ]Y3=#i›€€V);;¯Ê[ßnÌd7Fþiÿ~{Q~ÜØÍŸ–§¯/¾½°íÓÀ6__üú.˜Mžrp6×/.l{!ºMôvb›ëÛ‹m?¹4“3Þç¸}}ye&íSœ’÷ÖÇíwr#ù˜äÙ{žŒÍÛ'rÌ‘SrÛwòLl²ñÛ·—Wv2sÞ¾ªø8º¸½Sà/+òHyûiaC~ûWyL&8Ïÿ¾þã…qŠ!‚æëùùmvÁ[·}syå"¸›Š6yï·ïÕscÅ»¶_Ñ~JÖn_ÔãdÁKeÑ:úL½ùJ½ù¦ƒLêøt,šD-4 ®IW²™üþúâï4Þüp.#„d7·LÆL&/'¯/ž\$è €™Ä ŦP€ ç)ååD€3‹ðy§Éh>›B.@MͦµSf¶ÚÔrš(· ÙNÞ¤jo7† LÖ‹b ›‚OÛçrìm´IÔ+6a%˜Í]dA&âß*;Ÿ(S18X° "什+„ Úgçv¥häE…Dž¬oÄ)ùåä¾¢H|àûƒNÚëÊw 62¨Ìè„Y‰¡>¶·…AöαV„„ I 4…”Ó|k>ßÖkÃ&5xöÉGà³á¿gÀìB#Ì&AÍk›}6³ñGB^¥À† €  †Q·J@œ,ƒºüƒ‚ÝïìðUMÍ‚yZ´l¼W™_“Ÿ<ÑÂöç—£˜Š…äDS±ÞÄnJ®Ü×®Pë/î`‘79>‚KòŸbõ¸JÙ «.M°Ù4ÓfÒ€ª³tS9ˆóîÒ1nõ"4üöVŠ,Ž[PFÏoWŒ¢ùTxPºxËù@{ËÙñˆf ÜÞ’ƒcÄž×,Á;® qµžO‹4­/·B$à,Åí—… çSnL€µUÕ(ƒD=x„‹%¹é`‚ yœ#®¾èŽà­üÚKôs+c@ ~Ö¿ñ•Â[‘EËpÀ @ÿØ®ÿÍ:ÎN\ü¯ߎ–‘Îð(öžÔ#o#PH²#(—è´\m úúh[kw‚à¦æçr{ßöó…cKø û¿BûŽÇ®´BÊ8¨)@s;¤‡ä§à5¢¯øÊsh—XwˆQ¼¾ChhÉBÕ†’ú!?£”´0çE+º5¹èÆY†½ P„ðyw@+vëª)žV‡¦UÕ€H4]HMK£©÷ÿÄTE=¾c2Ô‰ 42À(ï;g‹o®Üí¼¨>Ú…”3”§…©Ay£@¶8@ÁÊ9œ#$ @ ç¨Ø£$B éroŒt‰.Ñ¥C¡~ÓçêQ*Bx#õ_®& %?·Ùæ`;Dçó’¾dž³‘h:ðÀ9LyÐÒf\ '5Þn¸vî,—Hõò’î¤O&kºÅIñÜNZR_}…Љüõè¤Dû‚t ¡ß"ãgÁ3£”ÔÙûÉY=j¯bú BÍI#«ð\ÅòdÄî,VIB¥Y}lZ_<¦+D*%‰¦îbr(ÚPJ’3ˆ‡c þ°štÆ÷“R™¾7:õïJë)1{¡Û_c’¢‰›( PQ2¶s¸ !~]5LëÔÚ®\ÙŽ]á(våàÏ´+ ¨5ÉŠnJrw K裸ž˜5UŒ%§‘vþ<0Ȱh{é,-;{–Ü£t@¢&+²@ÄGŽ%X+(øÏ¢>f¸îtXð½wõ¬7Áž? M¡‘¬¦ém¤BÞ ·êëÞwë©0!>$}­<åX*IźŒt&£¯•gøwÖµ XLx z[ãwHMÁ 6[p\!¾:†M–°“ {Ï´5ý±Ì|b&μõëÇ´,¿Úþ­´«)ûœ[×-¤dëô§¾Xº´“7Y*c™ñ8ÃVÖ›e#b'5˜y¯¡ë$û¨;Õ”‘Òmà ýÄ\fêµù0˜çÏÄARÛ~^åVœ2 ¥)P!//Jû¬ô'È꣎æZ9V.'§Sè%˜ §3mô„Gns¥2qГ§W ü›>êi£'”µ4€ìϸ"q/ÛªrHñ¹œ(>g—nj×i;tê³yÐiÃ}¼ ½®SDÖŒ@ʈ§‰œêE[–}›ÐDH>f™Ãµ©Œ\E ÙYt>º«¸ŠÏ’ʃP69”>>ÒYˆnž> ì[ù½eçÊkŸ¸P¼ÆIŸ>ëþª#((#Äçý÷ïºN÷µ±ÈpW?ƒ¤­”܃¤Û{-ë ’o€nÈk+ÛJ¾1ŸT(N§ ÷4Æêѹq?pà³?"|¸œœNÒT쥋¯©õ±äöOðY0y …# É.RÜ•¾¶|hLjÌnùíà¡0ôÑm(Ș-Vá¹v‹#Ìͨç©Ýt‹“$BÈðÉn?Q^OÏ€µÔSnÙ¶ˆoÆí“=—²7û~¥0ª±ùKåiÊ­W¢l[L\2’`BœDª¿ÄÉ'KÂ0×E(K—\žuâÞ»Tº)\V>à?‘lĶôA‘Rlqµ¾ºÿ¡líC2µÙÿR4¿I©n NzEBŠ´‡a’ I6û央œQÚ@¡yJa†’ïäJÁÁ< —Rr”6ס…—¡mâY׿¡Ò,. ÐÌX"ÙKq³‹ÇÍœ±håýýëµzU‡ÅIÁìkAs(\>ØX#‡õ­Ü0S¤yåL«ëW%xÇ*qnîËSnj\¯vçÇeÂŽãÑÆÊ%¦8´t;A[§šPiÜÚÛ.“u–Äp¶_äL¨c@Rþ}må4Ú½šV¼we 72JšüeïŒ5*Žïà¦tX¾à®æosm‚ãF÷­ ÷žfNž®CêÌŸŒ³‡ômU 9/ËeÂÄC+ jEBû™²u&‹vY 94„ºëýÄj²¨‘\Xum™]éI\ͨÅFYAù@[ÿ@Æ“–}DíÅþP8ö _hø±rüúÈ<´¬`¸\×çPƒ4öw ²Øo#8ÛY.bYÿ,ã^ˆF²n{:›P «e™c²sýç‹ë_=¤£õcÛ˱±‹!Û¡~j%¤–åH/ƒk^ßH½˜|‰»‹0î€xèã‰øP1ªƒã‡÷0meÓ°oîtÅ`ñ1l®¬´ÿaøLçâßK8…Œk÷h.~`ƒJ7÷syEÒ9HQÇV”è?¶¤8ºfòðÚ7’õ‡z³Š$ßpýRÌsép×iõ|Rûà¨AB r”«†zt#®5¤È›òæ{ìéÓw£´†x éKÒ"#œ²0 ¡8Jý­¡v¶'{LœOtLœã+<Š,½?9Ÿ P²ŒT;¢°lS½Þ(ä6g­·;’™ã°þT+ÝBÔUû“½PZ"ìO;²ckÞùíâUÿÿñ 5kèøfÿ2 F%/"_N”ÈõyÔÃaPr; ûa“¶ *Æõ¬ëÚˉ“Fáy*¶ÉjT#™Ö¢YQ±¤BMÅe•ÿD#9B¹g9?:‡  måó­½+0Pøß£ê‰‘³ùa&¶¨|9Q*_ŒŒ/P¹½Ç÷­ò^Ķ)Iû—^Ä~R>gƒÕ¡¯Ýuè—•¶˜MžÉ‡wªQ­êIÕ¶õ;pÏwZO`~©R¨ö¤í3Á¨Ápi2U…Í«"ó‰Þ ×Pu'\C¸2ÞÝ ›hý¨*ÈKUèä?ÂÈ⫬ð((Ù{sé,6¼tÎòÀÆÑÍ„|žtp » z 3¼û? Ú·=ƒÛëÊ”}&}tp/<{ÿ uãï/a1ä±m¥ù{¯ûR{ KO ²0[}C£gë+ EªQ…h0üUËq^Û§Ö·>Tht³ü~”fl¡ú“#µG·‹SŒÝ„žx”nŽ#¯nE!o Á'—–’A÷Ú’²»wt#­š[¾ç/ªÎ¤à»îÂV©±)7NÁYk/ä®aãÊÊ\ÜÎáòjiKk¿¢i®Ë¥|ôªAkˆá ¯Òv¯ŸW‘–>ª­ÓhóZ‘V¾Û/*ÑžïI|åÿÁ÷­Pà©.9Cq;öu Œ™ñÇãB¥„è}:z-ËõRk¥.®â±+,$þgë K˜«÷“{¦¿ô ‹0ÈšAçpCœß\IáˆÐXØ‹ýoÆiy\b­Ù¼Äÿ Ø1Ü„endstream endobj 829 0 obj 3859 endobj 832 0 obj <> stream xœ¥WKo7 ¾ú#9«ŠâKê±´@›í©è!‰ë4ͮݤ1 ô×—zÌŒfm'Ž^™CQ¿gßÞÁèóOû|uÊ¿#ŒÏ–ÕÛáÝíßÜÆo÷Ã׿ñcrI‚и¿ mÐ0*‚c–q~Ÿ¾;ó.xĤÓálç¢ M/ÌJˆ€:ý›­ª„ó‘‡4==ÛL Ó›º5,1Êúϼ&ñêåýŠ:µ,öçvðOùi ‚¦«³]PÇjÇg3kDÄéº[·ÀTr`[¹0]TsË®& !¥ée·óM·ójuqùñQú?”û²O~ëÞ§ÞU3×ä‡ýðË@Îóx3hð†ŽZ‘`<LÞ;ŸËax>$JNâ¨cþ4'ÏÞ­†Ïñ±¸£$oæÓf‹zòNêi÷ âà3ôÄF—ˆ-(¹»~Î× ‘£•êE)Ùö8‹1n4(¸–$¢=ï2œ-_!RpäO2ü¾;¾¢CÞ–<½2½Xc¼/Ù‚h¶¹ÿ“]„ ö¶- m\®Š!Pœ.‹»órÏ u÷œ-ý=¦bUtÐa:6˜ª@Þw¼…òÇ+&wbjLdéE»µŠ•"A2~6š«pôaú¯Øs‚Š)ÀÛ˜.ž¢œ3\*²xÖ¨¯ˆrÚ°|6<Ôç3dâ)Ì µ¡¡«'ß­]c„8± ¥UÅÔÊ´ví†Cu±[ê¦3Õ~‹ÜªØN5¹µzúf%j;û('}t Tv)û;4Á « W‚†¨‘²Þ1;J(Óß…ý8·g…Òzb]¨úžd€­::rÊS"YÍ!(9Ž‹%½ÚhdMê$,^”½Ôâ?ŠªmÖØÑ‚v»Pñù*©ÑšïÐ1õ.vÚ(#´,,µÇ€³ðΖ’y¶‰Œvv¬2½X,²IÄ£„“Ø”ÃB˜·~Ýûœ/Qž+Æ(|ïmOtb7C—©É6Y €õ>ªF·–2놖;7m¢u“—íD+PÚBÙ—¢xd¹LÓ“Îüi…Ëîyg4nÞœ´cóî¤|ú«zÔMÀú†NH`=“3¢ Ô}¼××kª­lÜwßJBH¦Ö8#¹VTë—¥dÃs^.BíÇ×ö÷î­¸endstream endobj 833 0 obj 1083 endobj 836 0 obj <> stream xœÅ\[sG~ü½ùˆX›¹_HñT…kH / ²eÙNdÉ‘ìû×Ó=—îÝ™£#­!«qooO÷×—éí³?‹I üOùÿg¯ÒŸÇòøÏóÕG?Éò‡(dÇ¿{rôù×ʉã8E§œ9~rq$Ë ^{-'kÝñ“×Gßî~"&%´Ž~wyr*&­6»3X5ZKíw·¸ê½Ñ>àµÖv2îþxr*'©£•»Wù>ëÕÌ#]?Çkã„îßOþt¤Ÿ¼ó Å“sxð_ñ_£rZªÝõÉ©ò“õð¸s\¶>h­wïÈua¬•wÈ®¦ åî"/ Òe¡¥Šq÷”ÜùŠÜyÝH&²üp.TÄ·i¿VDÁÉ©èD›¨“?<9úÇ‘™„=~ä•ëxP’<~}d“ˆóÊåÑ7cS+90µ‹À<†lj…b[0ŽÙ‰v™ôࣱÑîlY‚­¥ÅÊVƒD©Á ¸-%iëÒK«ãî%^»à¤õhX› JeÖå¤A M `ZˆÆM®œ×aÒ5!lœBœWP¤  5-‚ŒªºT¦RÅÆ¨&“nòˆ%~’r^Ab) HªUGÑŒjhŽ¥œ¢µ’šXLÒdbêl‡„ #½“~w:”Ωërp:d}ê £R³‚orRš :9÷®*9™‡¸¼Nˆ2"z•#†7´™áBŒBÇÊðq‚¨³A¨îó=¨Þ‰™œ>èúĦt‚%JÐ <]F?Ç¯ß u0Þ„º{c)yœ¤ðaÞý”•eEõZ ãèz÷©2@ ÷زör~èÓ¼#í£‚H»1³ûEÛéî&0nKÐòÒ¹X­å´’»MWFcq.þ¬šùî„“'—ÍNN€O[k&R0QíÏ}ž°yöã!ˆAäÏ¢Ö¿7Gؽ!»yNÖAŸVj”À—v 6äÄS(^‘;/‰žsýH@Ã=!Ë/99r`çׄ䚜s«\ÏÈò!¿jŸ.ïÄX«wÈò ¹“®?.ä–“¿çä‰ré5瘞™è¡>ëÜ©bUiZ¦›¾i$7kí®8fÉYµZ¦*c¾~‘ugc˜ƒ!ÕïŠÿáIŸõŽ\_ž¤Z)B>‡€[Àý–T §?·k¼í´Þw bE›o~O0vCÔúЬ¿¬_‘õ´[…Ž]õZYVëœê7DÊŽO¤kÊêìÕ€æà nRîO¸Xï¯h»ë ï ¿lx^yEVõ§ä<¤¢² ‰·k𠧬xÇ„¹¨OÒlùmuKÉtz=`~K Ø~´d™qþ<Ã3`µ>Ãó?kÛ­x“Íe¤#¤¾¼;ŽRî »]è—-y졄 Þ,IÚq! `0Ü(¼ý?苌*|ìb5ªßáõ:“ÇêÌõ¢f¨¦º£AïŠåÙ ßá³Tò2ãÔ[8¬èŠÓçýGf<Ò„G#ó DXZŸƳüÊòˆ0ù)6¯—ba÷ÛJÎÀIIB“35)IÎT놺üi*’rùÓµ²VyšYªÜ« °b³.Ä2›[žŠhh+í/GO~õmÕ}E?¨Í¹„š¸ê>QF¨5ê•îs䨫ûlµƒuŸ“ÚÀÈ4D]®E¹×ú®¦£ÛA<¡‚½[³§Ø§Qaݨ{_xÞ¢8rÒòW9=Ÿ HÎ^iê8: u½§æä ‡p=|EÑ"ÉfRšd¿$»¨Æ1UÁ½Ü›w.s Õ)õ‹µ=öÆ´N)¼b&¾áºîšõõú±Ô-³4—à¶9åNõþÓé÷qáõ¨hÁt$×·µÒê¤Ç|MãÝ;‚“ŽVÈ!ž&…ÇÅA oȺÙE;¾2§Ù X£§Åɲ!,F®D"lKÊÀ˜â÷V\wsòÍ`ýœ\?®(Ô=+-'QgkUÓª«ç5ýP PËSü<³™éokIc훵ñÒ:=Ÿ¼Zk²¥H náót°583:à¬Ú É•Båã çB'LsS¤”€k!¿aÏlU¢êU‰{„=Ä«rDP,èŸqíòx]$aE(Ì×-`X›ÖtNªŒƒÃùÎA°0©¥ÜÅá=ÆØ¨®¥b––#7 ¾WÛ8ù“~}8 ÍÏXÞ®å_U±ôÞEæÞV:þ“Pß]:~šºð@M÷¸ ‚É=azÀ1~th¢îC;÷=˜wÀ^ãM= ².*ö‡ϸ jhY§Ï|ýž‘瞢ž¼™Ûîûs0‰Iå6šƒo9øÍ &-ú…KNë½Ó*•ëC?év¶±DFÇÙWß[“æ° ¹ÇÉë¸k•jÂÝ=}`ÓC;6윶‚Ô¢°®\(0çü@ëÚ'H™8)%<ƒ‰_HÃHj&\t¦k&üŠ, ‹i®9›y}~¹â/ùþ–lZõŸµ÷D›Sä‚yØ}sØ ÍI«Ð³5NöEîB¸ŠÃFݺù·>Õ®O4ë{Ÿ·€GÓûƒ_~ÔøÜ1¦ïÕ~Ô èC¿hÌÛ!Ûp4ï=Mçlü!é4UV±õy7( 2ÝÈd«Zn.—^³ªå:¯Žè±„šoUÍæ3] åÃÕÒðëW‚Í=þ6ÐÆ °uôI× Í‡åÔ>šWÂçÎÐͦS?0òÎ+—ÎÁ,Ëê`ç=Ë"ÖÞstCm»å­5:çfçá÷XrK–Ý—ŠŽÆSêU£²£[ÁežŠÔVï@©CŒ*Œ½/yÔê}Î*çCÏåèÇù~Í}¯`3¹sR¬^4ݶüv;f”Ž'›khãjƒ£ µ_§+³Jå×Ü®5Æž­ïÜÛ}Ù£`žys·ñà“ò'šŽHËŸõï<ð°7¯/¬·tk±CëIà´W2é×x›.[Æ@Ù\›‰F§¤2ú–¢£’Îd3bÄ@ ù¯8{DœÒJ6·^ ^Æç2££ªÁåþø–)yû%±ª Máš'«Ò|©rrÊ;f­‚Ïý ›“»ïÛüZž¥RÎɤr½|áÝžÁñ«¢ÒèPž•‚Šê‚óŒg§ÕÔÆ…ŠÀçmôÖäª2!ôî×'§FÛ)ÿiöTDçQ´<¢ò´48ë‰Ã‡¦æ…4¡­Á‰VJ"JtßŦ§ž‚sdβhè*kÈX¶JïLÏÍWV•—eCÐu…ÙX•Çõ6#Oð„lä<¯-<ü·gdS.FN¡øFÖ‚—?Ÿ•øo¼Ï¬­3mF<žÎÑ~ìI5$¸xÈf“Ï+Ää3|àX:Seø”•½“¯º;ù XPŸ¬’_bDíCì#"vÓ&•±d.íq ¹¨Dyï0‹À¥DQ@%6¤TÌ@c5vMfÝà?küåÉõk$0*fm( (›Ó¶ƒ¸j‹~Ó£—?­ˆÞÁ(gü“B¤€-*3¯ä_È~Ψ¬žŒeT÷ÍLÂâoj€”ÑdÝ ò5­AÎH’¦çžÎ8CdÿXm‹äÞÀ wò¾Ô;2ƒ*@ã/ш„RwÐ|ÑY,MžÆ7ì#ÿNÒÞÓÚ»V$H'x€0pF]qàH©„ ã7 jó ¸Dø«|ª÷÷XI gì&¹1LlçDɱk"¨,uoxMâÃ9î»›^*§F~Ù–ïà˜~ºÊ²Sá#£“=P”WØÅõ@ñÔ‹w ïƒ#ýÂQÙÉÞÀÝ©åÖç…)•þü`€˜Q-x"ÚáØ %ÍüB;3‰•£Ì‹&ᑦm Jf[º&7î*i{F#è@‚K"Á«96U½;;+^YîŽkÈ'¿ï„,â5ßYE››%°t4¿ð…N y_“½+f}ª1Þ? s”é hàÕ~¿''ž^õ¥«°A¯»à¢L¡2–ëÄ›››<[™|í½ÅTUáo_¼6¥ä Jëáy¡ÃßX¿ß{û-Ü/‹«É)´±÷þë†TR̺CÀi8²xÓ É5:þ…ÞsÙ|Š;{·¶ìI¶òµÚeíÁSxDL{|ª ©(?ÿÈägj^?mÏøžðÍ̼,HÍía­(*­B ë˜ù[«°®ÐV!¥Ê­BJõÀV¡Äo ˜˜+…‹öVŽf`ú&ðuR¶‰ÎÊ#Ú”ø’Èm4Ö'|wÆh¬J)•X¯nÙvžÅbw÷íê€L"—óÏßLz¶2 •Gô„MÒC–³&ré_¶Œ@ß)q€„4­Ç.‘¿PC0—ߒƈ]´F…>Í[vgcMßö£$ÎS)Ñj ¥ð]³gTX'¸MÒãX–UU¤Ôx×MR½>’r"b+–ˆí ~ïŠoÎYüL.xiÓæ\€ºÍn2M€£†¤n«BØÇ`Ò‡°ÑI¨°yc·™¬ÿšr¶Â× Ml­¢ÇõÄ“W ü¤Ù±_Ph±_qhãÄB^ìCo”×ÀiTë- ÑΦÁ"— ipI…’Æ>tØ”€Å$Ãâ´ò ÔÇ>Xl¹±5dþb‘Èm„}D&7¬êÔHQm“i€”²ošÃZb*uÕ¨T ‡79®àP`x^0:½-Ù$¼VïõØ2ƒ8F$Ø–¦\ü ~¾Ž‰n¥ãŽc@Ž¥ãÜ»i')Õ½{)&M=Õxú–ÃÁx°Ž±Œ ¬ã6}`¹tG£ÔµguÔ±×Â:Ÿž ‡o,)׬¡ƒ§Gœé¤‡ýrô Á4¯²Æ:ªüÔ¾e°‚ñÛâÈãT{(ÚéŒòàÏ!ªö9įÒt œQbùžÓ ó"óoð47iñuÙü½DB[>(´¬èŒf_W\|.7héñu©€\ƒûó*”ÑBŸ¿áéMܹùr6©8~ÿû_ÖHRendstream endobj 837 0 obj 4513 endobj 840 0 obj <> stream xœÍXÛn7 }_ä#yšjU”DQzíÅ@[´@S÷©èƒãÄi¯í¸ ôë{t™Îî:n (Ä ‡¢¨ÃËüv°†[þôŸ»Mýï@ÃóêÍæí†úlW¾:Û|ùÌE;d“£‹a8»ÜPß nO†9g»Íoã×[kœõ>Ëxµ=±ÆûèÃxi𞼌©Hð’ÊÚ{6–òø+4(gq4^ NÉoÚÚ9Wò›­K&¸@ã‡å@­ÐüÑÝz¸„<î°´øì¬o•öÝö„Œœóø²ˆC´‚÷|×Zç…2sZÌÏLãëvy¸>Q×}«'Ž¿Ÿ}¿ñQŒD”g/€Þåkvø\Ü>qËÀ¬Ÿ‘¼÷ã{µî†½“X ceÑxÙĉàjCžnö\í|­vÞ,*F‰oE»ø®Þ—m¶kuíº‚¶`òíÙæçM0–‡q€DÃnÃÁ"~y–\m~ÙäMLƒXŸÊO(Y¶f|Šì1[İœ6IÄkb;íÞì 4™ÌL:;ˆ½Éa4—{ŠüT®ë'@u^¡ Øž@Î"gïwšPŠ~Äñø®<œ$Ÿá¡Î»çá7êø`±äñ¢d©·ÉvW½¥¢´ÀvõÛ¢9P=¶åV*7UÎäBBÎu Ìó=[p‚ºç$Ñ÷ì1@ÑŠé$XÅT"•}»ƒ(±x4¦à`p/á¡#VA¢ ~všKä„"ów•;æL-¦äb$ÓÙÃý(gDf­}Œ4"ÂyÅòI°B…Ñ8 H1-ŃýqŽOxÄX™Tñø®VBP¼—soLÿ¨ü!¡^C Õ…•Àš¨äÅÅÜèãˆC(Õ ~¢ŠÔzëC*TêªêÞ•ïĽÚ÷#vEÛ8O”W¥ D†• ¼8¤ßÑ }YÃ’ƒh·ëçЊ‘Üa¼X(Ó*f§UË —WèÔs HQ¬E(3Ç/€ZIÈ«ï×í;`XÓÚN@Ü, ÍéëÙð+åÆtÈ j3w×:šG+žÖŒ<Ý™ïVrH³I*¡Dƒ9ÆÉAI]Q9_W»z®\íÆ$ºÃ}шWÛô÷2iYÆêXth`8L]eì²³_Š2|®§$ã`\‹uD/+…øžkhªúíÑ‹é8¾Ü2zbëÅuñ©´bU<º`Åzüºx4ßS<ЈùÿZ<”ôùrðŸ‹z@ÈÁ÷Ôïï–y‰ Á½Ð¬PÆT»®-mSÑ!K(¶:¡ŒˆP"Ëh cCx*”¡Oyë$ë;aHÄì µ0j€+­Ö Ã=à5ã:èŠñ]ðou>qàƒ‰#èÖ×g!< F«Ö¦ÏKäÒ‘˜!0ÛãY³ÌŽWM]IVsdØë K"v ^Xe«Ë¨O]ÁçþÂÊej Z|³Å«Üv({Ë‘×Ëp§=ÑžbÕ,ØÇÅ„4ï›.õZë¼XÌœ–¥Mnz|tp½ð<ëä|Àc6¹ 6œ€mÅåöðÒå9ÎŒtö9^2ß»u#Ðl·ô·…É(;8e`_ÆÿX8ê$”Lœ$•ÉUv%—󬊼ÌÊNBuÃ{’-<ÀK©rìÉÒÇur›Gñx †°]¸ä"|bd—,’êy‘Å8"éžw ´â#=Ç‹qCÀÂ"uªç—3þçëõæ§ÇBÓäDÑÝôˆ‘ýáF[y¿¨ô0ƒœ²R×xêÑÅ(ùi•û: Ü·÷h,’CNDrìÁ€qXš%5U–†[±ß-ÉÉØô¨wkÂN/C`œ“ýŒ26ù’oºÜ<_²ó¾GžQéÙ­”*t®Zw³âQñ'+U[[yÿðËR×]MŒÒéu0 Mõ¬žÚë ä:ÿÍâVñu§È^#¦ÁéþÇ©ƒu}´¢§Ää –s+„uȵ"nÝ™e•9}öôÀK̲>yÙúË$Al•}:µîÚŒ]Ÿ*qO•”"?”*õIý´™‘Ú¦Ö¡k«úŒ²ŽÞÖÑþcª>(ÀÈ‹mq;"Q+‚·iBøcŸŽ/^íê7¤hµ8Ê£ÑÔÒæ¾²ü2rYÎ)o‡Wø÷3k3endstream endobj 841 0 obj 1622 endobj 844 0 obj <> stream xœÍ\Is·¾3þ¼é1ÇØ—¸rHRqÊY‹ÎÅ΋(Ò&ùdR2#ÿút0@c¼7ä(K¥’ŒÀžF£ûë Ìûñ üáâÿŸßŒÿ<ä‡JO?üxÀã?X$;üíÉÁg_ Ãýà0êðäò€Ç¬8´’Z›Ã“Ûƒo7¿;bƒ`Rz»¹9:fƒ”FªÍ)Œ*)¹´›µVIëðYJ=0î7ß÷Þ ¾¹C mµsbóCx‚™b|{$Ü „â›Ç0£½ß¼Æae˜…g²¦gJsAØ|l¸ôšo®ÃâAô¤ˆñ9¾*¹6ÿ<ùã4v°Æ‚*O.@{Á¿zF±…Π³8‡“RnÞ“çÈX k1< ŽóÍevD šçVvFÞ¼&on3É@†ŸÏ…Šøn\¯fž•äTt¢ZÔÉïOþ~ ¦¬`1 J⇷Z1°ŸO#7¯úx¼ƒWã¹w¯ÅÖ`µaùqÔƒõJ{½1ía¶æÿ¬ ñ\‚pY‚Æ¥s˵ô›+|6ÎpmѰà1P ‡G-(JÈZpà ¯ÌààÉXé©PLûÁù4‚šð ­I®8jé6•š¨¢b½ƒñÀÀp3X Äœhà< 1gÀŠ‹‚Ê·Ë‚ªkî9¼ÖœšX \)d1(+ƒFl(n G?½­¸œ†‘.èS:é…H ¼ñAH* „™Á¨r« *sè…Ë0Íe€æ3å2¾ÛVÌXò³¯µ,”  TJÏ'‡À0¥µ012pp7 ÎÁ0IåTtC+ŒüæÒ€øÀù½j´c¢9½ÍÀF$#¦d1ú8”&ЊA8&b5çÇŤæüt¢í‘HK†^’0ã“R¤õ¢7=÷6ÅÏ_#¹SV¹IûJSr?pf]Òþ‹`, )S>KÈ!ÆÅqBÓ–@ Fȧ@Zž$8Ë냰 ºpÞƒÑAÀ0 ¦Ä#¨åÆøÉvFBÊ|³GMJü¦šØð$íÌDþÝÑœ~ÆþbD:qx ʰœðÞß²ë„ä-ðšŒÃ¢5—ƒaˆWxÔƒÓ.øH¤¸&oÞ›¾&ãÇ9è€vOÈðUIŽÜã–l ÉE)ã$×9>%äw™ãÙüMŒÎ² G:þ2’ë’ü±$I ûnKŽãü»^êÓÆ›ÂO*‡é¢ï3É}­ÝŠcÐw‡'ËLÊHÏo‚î´w)|RýVü/ O:×{ò|s4VW*–€ùŽL ÿñ2?ãkÇÓ{Ç –×áåG‚±{¢Ök2þ®3~GÆÇÕ ô¾I¯ËÉ:§„ú-‘²áã3åNuvÝ¡yCh‚'˜A˜%žpY¯/j»é Èo2ž+¯ê þÔ€œå’G•H¼«i&8Å›B˜Ëi&Y ¿›Ü’:Ýv˜?(¶_ÌYœ¿ðtXß'xþ«¶]Å›,. 5²è!õj¥(Üv›Ð»ˆK²¶ÀF+`@4zìX’µáBÀ4`˜^xûo:ÐçU8ílSTßãÓs ÷“®çejª;ôîPÎ;yw0[¤’«€S«a{#'œ¾nOðI)Ÿ °q<¬Lò•á`üc,ÇZaó›H.2¾IEBs3µ(ÉÍTm† þ8É‚T~V+«JÓ4ÆRå~¨b@Ŧ®Ã›‡2ÑȆøQPþùàä—ßNÊŸ QÆTg*¡p”?RJ¨_dêJù!rìT~0Ûb凤ֱ2 Q7µ¦(÷©¾›ÒÑC'žPÁÞ×ì)øiT¨¢uïm‡çŠÃÉ?rÒói‡ä"–©†§“Pך5$_ضç}Û¬(š%Ù@JƒÚ—c—“qÔ¤àVî ޛʜ‘„ê”:ÏemA­Q`2+ ß—ºnšõ¶ž–!g6°“,%xÈND¹S½ÿ´ ý¾ŒÜ¡e9šöäêAøaª´鱨á“pÒ0B…ìâiVxŸÖ‘\´á+)Í:Qôfr Œ ¢Á¢çJ$Äæ¤ Œ)~÷ pÂu3)ßwÆ/ÈóË …²e¥yæ¤1ê´V5­ºZ>1åŠjyŠŸ³>›Dÿ0˜4Ö¾­7ŽÓýÉu­Éœ#1¸¹%)欳Œœ3pNÚ Ù•BåçN6•ŽRS$–€µŒ€ßsæ*Q´ªÄÂ.ñªDôOKí–ñ:JBñNó6Çë…µé”ÍI‘±x/ÞìÄÊÞæ`†’©”[PöÀÓè‹õêá) L¥U@Ï ¨ëM]œð£v}Ø‹Ìç+ïjù«*–¾;KÜë*ÇoõþÊñã”… 5ÝâÒ‰%O„é‚]|oÓD݇7µ= ÿm€} 7ÓN¸‡º¦ØYh<-U0E–:{†çÇ‚<´å`UjïNÁ$$Å×hHzè¤à·˜4kÎ=xoíV©\Ú9·±Œ92Î^|gIBÀŒä ¯'à.ª#îžè=˜.mØÛ´ R³ºzâB™òI8EÓ~„”òƒÌ"ñ iZ$³¾ô”¿"Ã:࢚mÉ&§£S`ð¦\ÞœM®ýƒòž“gC†œ1ŸðõÔÖirÒô´†ÉŽÈ>€ ßmÓÕ­¿zO[ïgêw_çxGÛÒ»c_˜ª¿ëH[ie[•õ:éç™yÞb«ˆTÅëš­ÚL‡lü!iôTªØúº:™®g³ª–KÅáÜmªZ®qrDw%Ô~Uu–ì§šÌʇ»¹åëÁËìíh£“ Šs::Ó6ÃyYNmù>4†öš¦˜ú¡ oœ¸4ƒ,Õ`ã˜ek÷ÅãÞPÛfþj|!´:—¿’Û£/r¸lž)P©WõÊŽFp—9' ¨UG Ô!zÆÎ3QçT98lz”½çcÍ}§` Ž¥sR¬õΙr‚{èHÓËG³MÂdZ_C­³u¡ök4eª\¾-í:%ÁÎí…óúÍÍ— .Soh6.Þ)¤Ëãð§í7nöÒøÌzÕ͸;¤›`Ò¯ñ5éŒw:Þ-.Â)¯äxi(Þ•££àF3bDA ù#Ø{x)b;X+˜]`Óh4åËBQÞ‹¼ úêè©Ü+ÆäæWGÇJêÁ9ûq–/”¦ÛbáJ£ÄCl—‚ò^VôÊ& Œ7½Vx–9±€=õB£wƒw#OªšÜËŒº Rº%˜Ö ¸…5"Â{0¼Oð'­ *ð+׬B7€‹ ¦oY(Éœçuï«^RYê´µq•žz˜ë1§ôè/v€êî"ñ wÀÁm¡÷‰àv¼¸®ìÔþˆwG`Ê[ù8b¶·tŠë¸B‘«£ÒÊñv²f€~çɽãi„Þ;žî0ãG‰Ê‡÷ÂÈ.ck©[ƶâPxpos9ªƒc$ÃKÄ{‡Q5B:­"-ÞÁŒ·)…µ½¹€=(R»1r‚$-qšîéÞãŸ%~°½E¡GP¼HËb¨>Ë3ÓÙ¶ùGõªpnê+Ä»±×Ä*[B3Öo’;m]%C²á ¿mxÕc‹E$ù"$§Ó Sú*x‘ŽÑ4J\Bsg!&¾ zôdÅçUw¤ÚޥלØáà¿ožŠ óÌ•@DIŒ®Uç?‰—ÓÂÀ ¦”!øŒ†À§Úw§…‘ƒÒXÆ T'9‰ŽÒRŸ¦yãU3ÿL¨ã›ZC˜£—Ò“'O Œ9Êú"ÏÑ—éváUN‘{柛óæ"h¦Ê1·3Ƀ6„Mçìÿ#þ$[¯á 8õüco <` ²PI™Á…J#á› îa *8(¨žš»™ÆO­1~‹Õ©hh‘ÖH t7/˜r‘¢î¼è"”Â`Ê¥‚òQ91H¿j¥ÊáÅB»@›_DzÈS¥™ Xn&ºqr0’Y°›«d·j“™ðuÞfJÆ îØ4†­Z"ª`Übf¥¢BE¥¨øHA‹ñ5 €ïEÛéø/ý£e ph%3•Khì •Ò PÖ•7ƒR«¤L¬ûæ µâÞ’Wy »(*¡–à[¥[Ø…`UPA©¬Íªuhð2mVY?â´…\Ö˜Á—rA`•W@嘧qà9Ò;ؼy_J¿' öÊÙýýÖhÁ³”@ßç"·S™'%I"Jô¤2`¼2rÀ˜(R¥fj0«‚žÄ WXƒ‡R±Œ/e’½™z¢´áó¿5’[5p6 yK¶C÷ ƒ*@â·}DB©ÛÉrÞhàN¨ ¨aØ®X±Žðå©~¢ ¤5¹Hà†•BÁ.~ î|Ř+´UƒÚlnžìî¨Þñ{jÎ ÷I¹vÖ&eo‚?ugxŇ}Üw÷­TN|EÚX»9ŽßßÙ)òäónûì¶œ±eb½¸Wxë é!îiQOÛ«aê˹‘)•þb±F@L/f<í°m†’&ùæ ±0”yÔ$L©âÖªäbI[òâΨ2.OñníHpC$¸N±iÒ»ÑIñB ·?®!Ÿp YÄÊò@x-5 b`ih~æ ¶ò®cˆ¦˜E?ÇÙn˜£LÇ_WQàÕv·'‡‘hmJ«°AŸ›à¢L¡2î–ëÄ›³›œW&¯ý±  UMðÆã)+U,yœ²»_hðWÚîöž‘ýî7ÑÕøàògí#ˆTƘµG@iØñ¦>F×høzÏMö©ÒÙ›µeK²Ê×:ÍAÊtúÿ¥9¸%ýï ßÀÌrÝîç¢(¶ ¹V [¹U8ÐV!¥ ­BJõÌV!°€ùD¨.ó¹%ÍÀô¬45yczåírüU"·’XŸ”«SJb½J©¬ÇzuÍê”?Ý/V÷Ôþ tØÉ$r¨Ÿ•)¥7Ža+“PYD[%=d9­|)ýUÎTñHHSP[ì¢ùð7æÂ9²÷ØEËT‚I,š×¬XÀ›ªmƒ…ý(ަ)‚ìÎ$žÆÛ‚ ë³JzÜéÌÔ«ªH©ñ¾™¤Z}$a˜ÇV,Û(ü´rqFCà/T`œ\µ8ã nÓ«Lã`«Á©Û ç8ö1 ésØè$TؼÑëL–ÊþM9[àñB[ oñ*à ±Å`ÅÌ:?i6Bìg$RAì%H¤2l&/ö¡WÊ«`7*åH£Ç«D.ãÆ«…ôÆ›ÁP(IìC»UX ÜÍ N+%G—4 æÜ˜2 ¿è$r+¦A¾Æuj¤‚¨¶Ê4ÀJ Þ6Ͳ–˜»jT*·[K\)<É.ò‚’ãiÉ*᥀|/û–éüÈiDb‹ ¥ñøa¦vÍMé8 ä˜;Γ[‘zà\¬Ñ»åX@S±,}]ÂAY°ŽÒXǬ úÀré [-¨k!ÏJ/}«1„u>Ý D&O,)뢡ƒ»G¼ôJ7ûqëYÜÃÐJªüÁGÏñš]<Œ9H€ ‚h~Š€,z©}ãmŽò&±-Ž<Ž¥…¢8îQžý“"ÿÀäWãïÂÅÇß[€`êxøÉÍðâ[ÜÍ ’y<.K¿@IhãQ2ɧFˆ7J¿W9ûJ\ ¦ ÄãR¹æØ xüHÃæ_Wué‘\­yÿûo"H¾|endstream endobj 845 0 obj 4616 endobj 849 0 obj <> stream xœÕ\I“%µ¾wð#Þ×^Yûbƒ Æ6áƒÇ‡îfèe˜5à×;SkJ%½¥§!px¡ÐË’R©O™_¦TýÓ†-|Ãð?éŸoοnøæïåédzŸÎxú–Ä6Ÿ\œýñ_°_¼Fm.žžñô‚+ù¢µÙ\Üœýgûé9[“ÒÛíõùŽ-R©¶—Ъ¤äÒn_a«µJZ‡ÏRê…q¿ýü|Ç&…çÛ_PBf™Ù~ûÐVØí |ÖV;'¶Ÿ¡8—^óFäš<W»ùïÅ—gÒØÅ J_<=ÿ¿za$Û»ó°Ð3h÷$Žá¤”Û7ä9u,…5Ø1<-ŽóíÓØì8L&Α ï·WäÍïÉ›wUd!Í÷ï…ªø:ÌW3ÏZqª:1>Úäogÿ‹i9^SÀ W žƒI¨d±/·%å0#œ³`Ùíó`/n¹‹+Êa7éh:°Ϧ“VÍ%¸V w3( »ÆàÞ—Ê¡éÒŽ ²/ñw®…û. qƒ¢ðšnD/«ÀUÕŒ{Væý.§xËMé#¬ûº }W%Þ ³…Up*OI)¡ékaFd¸ûõZ€12äg=xR{|UƒMTðyÊ.Bòí£míæÛ¸F  ©¼–€Ý ¸´^Œô “YÜÖN 2Ùæsøß³S#…^´ë#êP¬>R èÒL8>4Δƒq&[eë­·aÙ<ýÆl¶˜bt‡ákö€K2{7˜1Á5 ƒâ@Š#ÖhÇD ËT÷‹ùÑ8l•vN_í¦RÀÒT1l±bk{ß žÑ¢>5+sb¶y=€Àá3‰Š™¤ßÀ¢êó’² .ÜÖ¦‚™ñöS’y]G`¶ÉÂRºcá¿¡` ¼i±À°ž œÎQ`ý=é…d>Ÿá#s"çÈI‚ŽÙex+ÐèÅ£ÜfK+ ±@@Ç/94Ì$'s>ŸšÃ ;-¾ +ðo.3º¡.®¹–°Ñ@¯qŸÊ`.Æ––€ÅЫÉÀ¾Þ)R°?ýý²mŒyb£¼]¼Lûëi,á`ÞI—ùª.Ö,5]ÈjííEÂf˽HXš^Þ·¯É«4Û^ˆLŸVF$ü…|Žº«"þ3cøíœ¶ÜucÚGô}‰Ý ¦œÁOŠ£É!Ï3D&ùš ɃaßUm(«¡®†ex‚(/]®•U:{4ÊÓàŸºÛÙÑ6 B²](Öï¹M­Äm¢˜gnß6AS4ìƒâîÙŒ¹}E2Wu =T¾6à“¨Æ³dm˜;e>ÏZ…„Ô³ÖÞ‚áMª]únZmž•R,*NŸ ÄJ2Ä…çŠ'ío ÚzUç30v`’©üv¶D˜%›à ¸â™=*ë2©„u&"VO`m ãÀøç¸yœS¾%ÙÛhÝtq»Ú¦ˆ›¢“®´>íGÁie{—íi%`Ai)µ U„ô;öJ{ áoØÌ1*jü)…5>¬j'€ÅyAÓ°Ïž‡Má xXœ˜–鄈uéÔ—ŽQ+–na|󈀞À I@wd~q¾´º€äHŒ3`lŠu©|0ðÉXoHuaïA ²x/?“‹¹%²8àà\4RŽ/Z6R§FäJÀ¼Ó¹B¡AþvY’ó—^ˆ+…¸HªŸÛÕÎBJ ±ª‘r0†>rc. Ù2ƒ0Mgñh[]ha—|`ª!}Ù»¤rGò Z%¨¹Â0ÈpL½Ëý}T·ôpx v7ÌgñÃ¥‰& º¬a#VÚÁiÛÌaBYp¨#¤RUõgwÊ*—M¤4‡|ˆÉâ_—zGÅ-iÿ®>5È‹ä)V@|³8ë¦[N†€R(Ä!€ãâÞÚÿ[<I,¤¹´ºK­ò‚j`B«¨M(Ê㣕lU†Î€{K^¤‚÷pŠÆswîžFö aÒqs‚±Jßí³PNo§’w+“aCä¼"“N‰>³‡j«c|µµ¼þd%µBVe.ž;£Ç ëÑy}·8iï@â-äS]3F/Qÿõ¾×;<†.f¥":ߟcd‚oˆì€!a$Y1>ãÈïº ¥Ž«`=…UÝÑ i¨*;{3ÀN~Œ|Ç;;" ¨Q" Ö»=ü<ð(9執}Nè$å³”•Ö ¤ã¤}©´Ž4ÄÛÃúfÐ'$  ß‘©ôˆž¨½J¼Z²” L¸%þºË?ïòöd”úË9& .–ýÂìµ›eøÓŠTyÕŒVÁ‘&ÇœìʵáEà›èc²ðlxú&x ù)pMt2Ø·v¼Q°béI"ß°‚”ÆÙ $¥¾±Š^æ‚4Àa­³áŒÜˆ9‰ cVk¥®4Y*ÅÅ[ì׸.óJI0_š[×ylÓØ…Žs¹²Ún¥ðܾëSPÌ¥.IÞrJŠzuåí¹–‹ÕVt¢5Åy3®ñ/eÔÔmª2 ¨ÕŸ=_á ³°mäè!H®îSh™áÔçÑ#—×§MV¢=d(ÛvžÇd2§º]<˳3ȵïq1s öG fóCu—倨©é<'Rð2š¨Ä,ÛÏ ²o‚w [ªü3:´ Ue ÿ¡-^¿ø øÚnX-Ȱ–vRp‹c츄€ú¶b…âƒøy8-ÆùŸž*zûM‚<3£õò’ÓõÚS¸)a4«I5Š—xA£]¨ZAKðpóÐÙ³¬Á¿× bÌÑ÷D"ÝHT8ùtK}úÌ[P3ŽjJ"!§Ã<¡’ଠYý"âÈ£‘*ã–ÔÛžŒmKJX—ë Öº®.ª_ošïz'…ÈUòÍ_Ï£þúhYöˆÜózûã󴎼¬£PjêQºÃý&ÔC3€‰ï¦yÑ8´~˜zR®´­T¥§±±¶+ ~œm!ÃfÕâ|MêC€×vsñÕÙÅ0*ùó1ˆ-\ç÷å‹Ö¾ÈM¸'Û¯ÇÄWSw®-H0;Düà.÷xD¿/E$;Æ5‡JìŽûF‚ÆKTHŒl;!C¢«âXg®Ç&S“,ŽNæç(,­åžÍ€°Ò®÷FØ,ŒhiBp•xÐW9¹[2à€è ‰œ8Ö¬‘õ“®£{LJP@ÿšºò. Ø“LFG¹ùq¯öy蟌E(1)—zÄ=",zf«Ëà ,S™6tî©BfFÒ \Çw—’÷åÇœÍμ¨J³Ül²¯s|{¨Ãp7ÓôDéiÊzíðü©Co ݱ3ŠÍ7ã%H–²°M’zšG+Q2ƒ›[ý••qÒ"ñçGì4Œ8SA©&Ð õjî&K¨CvÇfô,ÆÚŽý哇Jî(à3Ò€®ÓSèXrrH\êqPõæ]®Û{˜\¨ísƒO½Z­‹´­3þ¸J§ÚVÔ£a¥ƒ¬dàƒ‡ŠMЧ3‡P/ÁõؾÖ*™ÇOƒfîv?0»ÅìÙ:ÌÙÉU½›…û€ ¬Íj ÔÈ͆×è´9Þ”ø9ÎÐ| .»ò¢ó¯\,ª£*mÉÄ/úl!§Ò³ùQ%#1X–IBæ(nC™,¢[-¬œ" Ø]è/ ni]bBJºz™äxìnŽ)GL:º´U¤hæ0j Fok†¼¿=ájºžÄÁ•_UErŽxˆKYÂOPŸAU¢Š\B£arr°þ8¸gmy7Ó\ðóÕ­%šâç©Vs À†ÅãY…íèOŽŽo?$ëD-HÛ˽í¹x­u®^Þ¨šVªép?ß3 ¼¨[ýHXIÇD`tx¤}×IæqR—SFà>$»âä £ûK „c"C|POL/ÚˆÆyõyLR¸ ¨ã Uä¸0vŒuG$F‡SI¤¾nŸ£Yùù³‚rç3Q5z¶èë+Ž«XHCÖ¬rXC`f»@Ÿ×¾‡ÔqÀ6ÄzsQvRÓ:Lu.Ðaé)Vàtº¤2¥ efYÍѾÙPÚÒ ¸µ4šÊõQ! 'ŸíPÞw¯írä«ÃÎÇ©fdÅoÃ^±ä˜êTBì]aŽÆÒ†4p/¬‹ò¯Rù sZ”E,èÁ'atÅ™´µfSõÃÕ;<îX㛕ÈJQnjŽî H£[M¯ÃËüžJ˜YŒÐ{R÷lq ¢žá2K¶…©"èè?ŠR¥dó"å†ëàS^°öôvYÂöÉ3¥Ûg= ð?Ì)¦ÍÇÅðÅê¯êÉ…4Ùwkö»®T&tè¸e:p=é¾ËàS¾Á…ŽúLï_ ñ48‘ ½ï¿&0wU„Ž(·˜•ÇhçÇ_ʦŸú%J*ÞÁNp ¨€AÆÂÕ”¯Žãܳ{Dë|¶;0ªˆhÑjæ¤Óå ÑöRê¿Jñ=„ൿL‘yÈóM—C… T[]ŸŸÇN†§µœj†â (.˜ç3ûIñÌW‰ù0Ô›©ùÕ*MÊEéÜŸã]’îL€0bt"ùË åö¹ãDqT|ˆK Ðj‚‰–ã´<$ªHýè¯ kŠŠñ©ÍÇIm0.YÃI•`û7cfÖ›RèÔ¸Ä5;__+úý6Ùg3â–K¼fï9]»üÇÜŒk§eOXTÑ}ð=³Ùì/"Ü•Ïl¤´ùÂqU£PmíËU«ÊZº,@¢›#IkC9מŧ—nwYuº'¨1õ‰ªÚÙ™Äø«üñÝѤ`øR¬àB‘¨¶™O±é óÛ¯¿VFñSK¼&ü›¥–qoœ æI']ícÙÙeFð þ¯Åç8lVŸ ö5auÍjR~¤VüSξ‡Ÿîûlö·ûâ¶7UüQŠEo¼îñã[0~NUZðºº\-®R¿¢B'Þi‡.b ³Ž~µ: ˜ÔDê4¤sÐ9QOã_Ik§ -$ ’ æ15Réû3Í4ž’/Ër ý²,¥æŒÄË·ä+µÜ²×,Bþd°§…ÜhH+ðÓ¥`ÿîœ 6?’¿ñó þÿÁlXQendstream endobj 850 0 obj 4452 endobj 854 0 obj <> stream xœí[Ù’G}û#îcáij_ LL0›^lFkAi'r©£•ÉKöüí2Í?Nw¤Ÿ½ó`úô|~IßFå´TÓëãå13¸;Ïk­õôŽ=—‰µòŽ&ÆÓ¤œžäá ±™¼G©bœ±7Ÿ³7_/$3¾ÿ,œÅ·i¿VDÑ“sÖ™ðI&¿9=úË‘™…=|ä•€2=„$GÖ1‹ØF^}u (Fãæ€'/´›]"6Î!¶"ŽV€Ê\°zÖ TuTjv1Qí‚M†ƒ”s´Vr°Å@ Uå¬EȈ{šög¥2¡è\§C–‡&=}‘Ig,¢1Ò;é4 kée÷&I†Xpœ#gyô|3eøá|&·ºãØÀ"t”•þ Y…µÊXJèÚB3±³ÚS0à•‹ÃåeœñU›ï›ã~ý¤H¨Á’‘×.òª>É4ª˜ßË#•—é;FUF:%[(Þr%ƒÊVªû*ë9U”œ€k„Çß‘’uTª(Ùàù¾JÖppÁËÿœ–Ýìu u¾O’µ:„.ïi»ÂUò÷ËšgËžùòïˆÁ¢Ó•A˜·²¢ õv€kêo#Lý J ´àÊHGe„&ÇèÊœqöè9àtŒ•ê¾€CˆÖ_8þü"ÉÄ…ÍX†fv>ü/ÁÉZÑÈ_/úhÌJ2>%­1n¼Ìx§å¡†æb¿Ç’"(?Kœ(쥮®=ŒüUÚ½p šÃwØ.§Û¸#&°?%ò`<Þ-\ËÉã,Ó¡È*„˜ÆÄ‘ ƒ[›M¥ç7À#ÁN6G¬–×Ù] d˜ícò—9<"aP)ÌÚäUïé Vš&c×*ë3ã“r"HHÓ$g ·¡k|•Ê9¼ø}~ÑI3}¼P¼\´\§–xDª-ÍLš NV&#’˜=ôí*#$µ:œ&䯮ŒÍ©Ô,XB²w8ýÃÑéO¾ž~yÅv•s8=—Ò»2ÁEÊ=Mt®Ûà«c'¦DŠ2´‘(\ÇÂG,Ãà;á“°WùNÞÔaʳ¤áP¥‘Ëý¼ R¤Ã\UYFñË"œ©e[™¡L7¤esKã§?-Ø'ÑkÊÜUúglôeÞ Ò _± ŸnY¥5o¯Ÿ<ƒAANÏå-c=ã˨ˆNDMI~]—/ö$¹k÷©d@–ïM+ »ÎÚŠr†U-Œ[´*»á×yåOöŠUÉežÔ%N¤†9oãÄ]ðfmF ©ñ±ì'¹Í«/2µ¯¥A™3?PdšfÇ&žäa !~Üô°r M⟼øá>mtÍCÈèäÖ®hŸ±#Y1¶ ÎÉyžBAT÷Ä)¾„5)f‡Q@ñ‹uüXùæUüø´0ÒUÁäqbúy‘Jè7ÁÍòÙÁWevT†ïQxÂkmÛ·¶4ƒðÙ‚Õªù„ˆê„¬›dñ]¦6Q0kÎ!KÖÓûÇdñ¼Õp¨q|óœm¥“è¹ÓÊ«†<´Ðáeجb¿ »Wª£ 0Jù mø€`­¤„h¬;¾bгíù’1 ˜8£R!Ë«‡p)fëVÜó ‹ÃÿrS)t§| Û߆Rd×ý6(ÒtN¥aÖÂÚ±Ò>Ö-6åt*bÍ{·­ØUÈ×/@ɨ¿Å™Ë ùª7²oBœ¾¹jÓ³:ŽyÖ\¸aF5{³)ÂÛÆ÷ÒºœœyPð#¼›E£wKÌR~«¨ûs™Q±(Ctª±ïöÛ˜¼wy¾ɦmBŽz5g*4•íä~gò“$J¥¢LŽêÄ W÷̽œw§•x­cÉg(r÷$«ð|Ë[pÀ±5”^Z¶qãw¹É¼“«RoXz^ §ÜÎÝíæìõ ‡srQZ”ÛšoSË Ö¥ÿ–soèþÓïk-ã“tÔð9Ð_²é]ËÁž’ü, ZKW'™‹ >O®èr¦ÕÚšI,9m‡/ŽvòãaTIRZújúsºâ[‹åäV»š*íÅKÚ¬E4Ø ›B¾Èi“œhYû}Ñ­9u¾á‘/A+"ÿqá m >JNöÅÚ@®nGã‘ÎiJ¨´¡{ZuĆ€Ìû>÷´¤ÍáLS’&Ëõ–?¦4:Xj%‹¶Hà¡¿‹4nQJØõµ¿ž§^2ã°ÜŸC³+ͯŒ•kex¤Û í à* ÎÔ²µ_.÷VËMÇÔ ã$9Hæë¯¯¹7ù¬¨ÞÑ£ò™í³°}V*é¸NË@§SÀŽÞ»Øhù^õŒÌ€º’â"»{×ß JÖüùËÕÑ@¯ÓÆáZËÄaÛ£ZˈKD ߣ¼ t¡!Ds‰ÐÜn‘ˆ‚·¯ºC^V;´¼÷˜ãÆVNïNr…ï&•FÕI®PU9Izä”NNB zïb#¹ë{coPå$¨p ¬‘ -å\åv ‡M– „Ëà|}ñ*» )«Ñ¥›”üV#¨Á(ªø|XehGݺÄdéV)~[’.ÕÐk¶ÜvÊ«}XZl±ËåµÜfðÒ¹˜Û Ö{ÄŸÁ‹‰ärñŸ¯]C!áWE—}o]CSËZå\y B]¼¼÷Ói¶®w¼oq 7¾v6¾<¶Ù粃õÎézôl—Ï·£Ø•BŸ:°6˜B ‚θwî —Ü᳄^Ì ýD«D97F}€T‡GþÔ܆樂GÐíQÔµÎ[J*žoçK$é‡*.8Ù2±L³M6Pcêu²¡ÀǬ™<óg.ñë):©ÚöJêì=$ÑPtñĆ'ÑX8l#÷ç°&‡ÿ‰Æ²Ï6ÂöY5б90æÏF%êÃüÃ!®ãpýÍè‚…’f†sû°¸w°XÔÒ)<¨NyTOÑØÅF ‚QQÞÎÕœÜ-AÄš¡Jê“ãu¸·Ôkv‘Úäeà^­f—çèN}ÖrŽ~æÌÑob||sð^$pÎÛcjKAãt»©ì±{]KT}ÑÄ×Z ½ ·ÝGåM­›[y<;EŒ°–"€œþÙŽz7èZp³Æs2Úå7iä=êÀmiöô…i ü—…è*I¢!ÿ¢Õ›˜cuzlû‡§ø÷ß»‹4¼endstream endobj 855 0 obj 3575 endobj 858 0 obj <> stream xœÅ[YoÇ~gò#öMÃ@ìô}$ȃD€sǦcÀvxˆ²b21Ò¯OUÓÕÓ=Ë¥Ö€À5kªëøêèÞšŸ6œ‰ Çÿåÿ?»:ˆÿ܈Í_æ§~:ù<“m>?>øí—ÒòM`ÁJ«7Ç"¿àäÆ)ÁŒ±›ã«ƒï¦?r&¹RÁM—‡Gœ)e•žN`U+%”›îpÕ9­œÇg¥ ã"LŸã²Ô†;} ÔJ8¥ý$ã‹:83½:<Lhîôô6q6NλÄç×ø¬MÐþ?Ç>PÖ1gˆy|’ý ÿ¤UBN7‡GÒ1ã@žs\6Î+¥¦òœù*é,ò…'æ…˜.Ò² ~ÒJȦSòæ[òæM%adùÓ¹P<𖜊NÌ6ùÓñÁ¿4ãfóxà$÷90’Ø\Í9ãa^¹<øj Âo„`Á±À‚ À<ø„å0Â?qò-¡…ÒO¼*¤ÛtÞxPó2‘8+UÖ°©Oê xD’rÞt =Ú{î wÁ3K J¯Àˆ‚{Yl›¹Ó^gÁ¬ŠÆBE-UÔ°€t›#Z*°nâ&Ò;¯ÑƒÆ0”þ‹ûLb+¤µBMgäù>!Rqmgßa4ì²±hàgpŒN3ãçtLZÓ«}@§]Õ+=3á ÷Ù¡ûª>T’ ’O1ê¤×fú˜%\f»&•£75Ö£”–¼ümò‰å24ô¯"å½5ÉùÝKòL,V-£Á24TÚ1kQg`fͼ-ƒk`>)x6L^€$ò´]†°F0åÃÆÂߤÖÉ.hÉÍ7ø!äוãéòMÈÍPh·$ŠòæMK’ÞTåÍHýا˜øü2sÑ¡˜+.Sn3 4Z·­-æç“ÎÂCÇÑXýš<¿A– mçªA×ñ¿ <é^WãÑ9(Äg†6í¡æqS)—êѳÌQæpH&±y$h¼íA×ïWÖj·`ià¼õÍ:ÚæuÔÛïÖɇ?/6°MttîA&{\Þ[²>ЛJÐéý²ê}¿®÷"„é®4„+9†­oP¾F~Yºä’âælŒŽâ"ïWhÎ+Ê©0 ¨ÐGê¹*Ñ¿ßWIh<ܬìrG$¡FѲl1ž6§§÷+X¾ëý×_f8W¢³ƒÀyõ)u;5ïà ~×R'å3À8w² •Åyjø* î–âú]ÿn¤É)û BrQ3ùx?ííA`Ÿ ©ƒ]M¼²Í£·-ÉB„´ÕÕ þ®[—¤àÆó|ºÉ”pôœ;Á»{¢Ù†Jû¾Û¦‡6Á/Yð¤6q¼[E–•FÅCŸÉ£ûNÉúCëíyý¢—§Ù"]´YR$ÄöˆJyš64·Æõ7ý®µ_H¶¤ Rð]õНENÉH)ïµÁ²V«h|¿ímé?T–ƒ8n¢H†}£¨Øƒ¤èÇN‘ĆUtÑîT–ÏrP@Ã.æƒãMoêøüް^+Cw+Ï—+ôïW´&ô9’ˆ1´hŠT))­Í #.Sÿõ‘Üçö—µ¡({èÕ*9¼tA+Ý29!ì ç‚‚IW~WØ,òd°¨B>U/Í¡-2ÔOÒ±Pnò>#n ©d®¼’‡ž*¾&¼×é›jág|:. ;7±#.Û[ŧN{…ãÖö7q\+¢T^Z!ïk ¯5¢‹äUúÖ‡•ú¸½ìÓpÒÚ ”ýëÞØñù±!ŸRZŒZÔ&õü¯Ñ2z·R.ß‘õw½Cè«‹9r€úl%ˆ>T_R 4Y¢c¯:N;¥Ò–ܱ )àßÍkG)j%jI‚½_äÌt×.Ÿ¯+ NÒÎ ÊÐãK„•SßEAzQóÙàÈ]î³è›ÿ$ÔZ+ÎëôŒpÓs§=?ætŠÁËV»%›ZùZ»Ý“˜ÂÛ¹%ó’¢÷¾!Hè¥-ãI’ŽÍÝ|öÀeäºç[’ò¨5Öú»ûåV)åÑ“ðöô—¶ºìuÝúî]íêŒZÜïG‚ßçn^ºíÝ+vóMÛ´ÈáêÓåß,Å;=–t—…©7@¿sö]M´o¸¯;èP6÷uWI¯ë!¾“ ùõÒ’ý½(9‡ÿ}¥ô¯Ô‚rCÙítSwÚ­ªŽÑÜ Ÿ®Œv¼k-õà ùò táå­ÛR­iÐ\o{RëO–ñÍ’›SCºx牔¼`µ"DÉ“‹¡ÈC2)ÅóZË1Ȫ`޳•`¹&ëª4ÖZ‹-7£åÒˆ²éjo:çïÐ7 Ò:"å¾U°×µ²Ñ])Ê¿×4Y*ÛÚ]ÙZ!ª¿À|ÝògîˆWpH½LŤ¿ صER«J½|;v!%ƒÎmk·?§+4seÔ«9”’¨íÑ?T¬]tQEžh¨KÌÏ‹p7d1ç ¥ÇaƒèÔ/ñ-åmð†Nü”¡ ´¢sIQp)¬N>U.ÆMÿ>„£MPåî4<Ñ1¼ÄC«òsoZOh€®h±÷ë44„㣋™2œ\Ž'öDžØ‹ã;ŽìÕýä–b¨ø{lú¥°›Z_â .-­ÞüdÏ«ôÕ‹"hÎÕô»Ã#­ óÞý<:Ña¾:çP¤PŽ©8’pàn^ˆã1Áh¥D>°Ð=w:&x|äÉŒÒdÈ'[èzŒ|•*uø»¹–D<)¹Ãi&*Ÿ”"QR*˜S U§2lì”*+tPª ]Án8¯D†®Ê ¥ÃzÜ®R•:šáÞÕd4 ¨4óŸ4´p†Ë-ŒL6Ž©"Oÿ­úWÝ€UŒÝ‹ÁŸ-CZ0]爞;÷D&HȨ ICÖNÚ0 þ$–óeÿ›âÑjñy…X|öX€éÆ{y¥¡ÂùZNÇïÊJãc ~·q²—ïçcd•ãˆNR|ŒrÙÇ1¢¤ïÄ/çd Áž3èeA¶Bþ¾îyRu¦Û§ñ/èTP:'Æ¥ ÜFÝ o³÷çâýI0hiN)+[‹Ôp°È<°<ú<øýEMè{œ¥T˜áLµ”ʇ\ÔÃɸ<ãº[¬'8/µF§‹>Ô2 í·Qx93ûôÿ¬ðK›+$€ˆÒ2u\i‹øT@H¿“dd8·ì¹2>üã‡!8u&_¥žÃ›yî.UÄØXîqÀ¸ª°ü""8 8[ª²ùCßóJgRGCeÃy-BõÜZÇ ~+ƒ,˜µ9¯t´«¡ÓÒô°Ö_µHšãiˆ*¡5窂™lˆ L¨°—¦m©ZEi^˜##ʾˆØ$»ÅɾÆŽk¬Áì€Ë…†g¡ás…w_‰E•þ ñõõÁ3üT»øìãú ÆCz’z0·±ø\B*«ñ£ˆª¾T’Dk$‚Ù@©4Ôeï÷1°`Â…±‹£ÀtXrèb‰éŽDÈe­Â§FzëøBG°ö{E"°`Æ-"q¥¿õômßé½Ç¾‘HÎfƶz…Cû 4v?/ Åt//(a$äj"—Þa#DåRÐ AA©¤ øaÎÒ \k¥¯ý>µ{üòŽuiÀ< ®acAc_i8Òª6ö!¯BLR"¼"Ò{e7`Un?«;í`cO‡ß›´öT¢Lº†Êê‡O‘¿[V¡|àÁŠQz«7&mzë.£#¢©ðâ·¤¾^ÁŠÅ-` N_Ô"Z‚Ì^øÁéØSô¢w.DÚÂYе‡ç\‹•+Ÿg)ŽcÙf–/°šù§Û¶Ž?f) Ìe¹ÊïÆyB­ Y´¥e$ó|9ÂStúQR*‹åç?úíUÞÒ†h\z>ÞÐ@årZÅOIds£ñ4KÚÎ N÷Ëîgk¯€7<L¸]‚ä£ójæ'DX8‘ÄÖÐF{àÐZÑçôÁ™ÂK¤˜:±Z†¨.ôyÈ´Ú =§éWtkÝÈ`_ ÐY²ƒ5›çùǼ"|{쳿«†±¬š‡v5”m=˜ÓÏL ²ÆÐTð¶ÞZ4ï$YùöÐÐo ~Œ£D¼µñ+D´®Oߨ;\Ìs¢å›7ðßÿ_*,¶endstream endobj 859 0 obj 3805 endobj 862 0 obj <> stream xœÍY]o·}¿¿â>®€ˆ%g†Cò5i´E‹¶ÑSš>4IÝ(±bÇ•‘"¿¾g¸_Ãë+Gñ"@aÀZq‡Ü™3g¾¨Î1¤s´ËϯNý×s:ÿq{úîôÃ)-¿ÄEìüñÝé7#çš’ÊùîÅ)- §³žïNŸ>¹‰"s+Ó˛ۘ•eú'V…9q™þc«¥—jÏÌ9ÄÔ¦m™$ǬÓçæTXêD}£´’§OonSH‹L÷óɹÐö•þü/{–ܤþãî'ÖŠ¨y÷54û“½l¤œhzusK%ä}¾¶å\*3OoÝór.SQ;O¡¦4½˜—k‚ú³U‰Z›¾t;ïÝÎW»HpË~ŠWñq67¶8Š{Õ܆ÉïîN=Iˆùüã©P„û @Jç‡S–ClÛÊËÓgOr!s>§ZÎé‚ Úpx«3~o‹‰Mß›K‰’”é›î%âÚxzÓ5…€ìl¾®f™1€Ḑ¹,%)‡ Ÿ½0’åLZp^³‘éÕƒ H¨ÿ~¹ã[wî|XIyújØ?¶!ÔŠ£tÖ’ža0ɶbð`­ÒA*3<2H=PI¯ˆ#,hìø9ÍHšÁ 6p3êš9µT™ák$@è¿\ó¥Æ#ƒˆ¨^2ˆɽ–A ߌzH{$îtÉ 7Nßž^©¦ž3 x•Þβ„þ"à„wã4¶P½kPó¬JÆiN¡h-ˆÀCÆi Úò!×TÑ|ØR­)ð¶XCÚ\ƒ ù˜k@`–ò+º†I YÛ©ÍÔJ:¢6Ž….âÁ«úß^g9Ö–vM¹?z’° ÷ÓHúJËGõ•†*ÈGHš%dŸWXk³§A{mÔS‰­×«‡*Ž©æç‘äõN'²›Ñdˆ8(Øê@nFƒiÑs]"‰/Ü`Ž’Ê3œà Ý»°T9põj8•Ë –¡j B ”¶Cºº½(cK½JM—V ­s™~º’K‚  ]Ú)uÔ)ïÉèêèÉUÇ$*Jt0‰âòDíÞøY×À’1‡JMz™C¥"cÒàÀÚÛËCÊW”ÌËê}óèT³?oºçf|ŽŒ¦k>G¸§ê …†) íñöDs÷,à›"R9Ž…±uÔ¡JÛÊÒwϽ¸“BѤ~qßm}U?4(À÷&îíÞçaº@·Ã-Õ¡b½Ü3íµV›žh —T˜†þþ»^x°ÏõîÖÅŽ•-Cx€ ŒÈ4¡6—t „/ÊïГ­»)Œ£ ç. nbgܲýDùì“yòQѲLqìóriçóT¯/LÙ^MDT̉˜‘ç©RÑö̓󼵄џÄ&Èc–ºž—í‘• ø·Ü0”¦Â쥻÷ð‘âŠPC9Vd¨lUÆ" *í õse0|Ÿ3êGPȬ Êáý9 ÇU—¡#R8RÒË ÍŸûä‹L¤:K³Õj¤MÕ˜Òór‘’*F­½±TnÊ»~ë‡ëÇ‚"/ôû­ûø8PªÖZ•Aá*³×ÀSëîøkAo“–Ëlƒ‘9¾2æýÚo%0> stream xœÕXKo7 ¾/ü#æTÌYE"õ4P m(’4EzH{°cÇq²ÆŽôß—zŒ–³3³qÝS‘"å2”øé#E‘ó©‘B52þ)ÿ»ž¥Ÿj^TéãìÓL•²˜5?-gNÀÊ&ˆ`Áêfùn¦Ê­¥­‡Jc›åzö¦ýe¾"€Eív¾'ŒCמGµqÛ[&¯¢L8Û^̈Z8Zù.«½r¾=K¡i»Ú3¶òŠ­ÜîLSM;"{k¬t.ŸÏž.g¿Í´¦ù:3 ­ÏDÈC³&µõçjöúß²Dë…U¾ÏÒMDàœF:_A#´íõ|¡„´htï| 0_ZÁ;爻ˆXK)d¨šƒ  ™ÒµÚAcQ|Æ É)¸@¡T„Q„1[)TÖÇ`#Ä@Á&­Õ@±®bŠ€V6`µ3æP;¯ ( u<¾Ö>†º.¼Ê ó.z‰@.Þ‡)Z/ì>])FÁš Ák—ÂKWFY¶;Õ>Ìn­F"äG'F›F)ŒQÑñB›<.,°@Êsrùc¾wšÒ=_°"fòû"K[ˆ,òu–ô>»/úã¡($ÍòålùàM&¿ìû-9î5"'6ÑÕTçðÁ|a”Š®ÀÏÌÇ“7l¯ óq5¡¿Œ[‚ Ð´¿öaDO2Øöõ±´òšé/˜ž#¸aú‹>‚䕲ö»Ý™žwG©m‡=é?FsJAƒí‹¡Ód~Ëôçðr0ɞёB %ªfQb3ëñØþC£/ ¯Æ'êå7—ô—Lÿe¢ e u‹Ì$0“ÐÏÞ#÷„ó“l/Íö’L/ûúî¡9™8ÙÍ•[«aqç'îÞ͈œê5“y’ñ¤\1ýñá Öò Š =Oô[¦y£öÔ[ûÃÏà™ä‰Ä+O 1¤’c®•bìAdÈsFí–ɛݣöû®OeÞ¤ñ;û°+8¡ë’  xn=ë_åÒ¿îÚH 4»yßezjðÑ(G«bré±½_¯hwjwU0®4øFS'¿É-; ‡D]0ä3 ×Ô_×NÞª’üä…Pð•)xtô»ŽÝ ©h6 Ú /ãÜi©3„8éHC—;TMì߃‘de-}:ZU¶Ä;ÌC;–º.?ø8¡A£i>¥9!5ù›ÝÉ/ K±—ÿeðÆ‡°?\*ˆì…¸‹¡Ñ @RUÜí ,ö€퀭á d¦´&â#¢¤ ÌøO´§1=L%¬Žþë±ÕMDº«)C°<%rUE`C—Ö¶—Ö䚆¢®±ø£í—F𦰇YÓLŽAuöé‹Ò©!C#Uz›¥q(K>gÄ»‘R!yá4’%ëÝh܃T'Ëøá oQiܦ{%mpù‰T]š ¶#Ÿ˜Ó”÷1·}Å¢ Öô(o„”µ{­M¯FYs©}Ö,Ò_XC ª¦YúWÔ¿æô\jïF‡à«¯¯æ¯&*>9XõG …:æý(XÑQ)Ç0H›>X• e tµüÊ“;íÿ· “­|ÚÈIøW%fÜ?¹£ËxOTÿåìn…2ÆÛZæ}ûtƒ' b™ŸJv|a`÷óp-´êÀ@¾Å#4mÒå=L¦Š^*Ü©OCðÎëÞ ÁmÎã·ø6®ë{Ë»´-Ûe­p.;Q”èùBîò,~ˆj›KŸ’Ó 㣅ÖôÔëüÙ.XÛÛä’Éy%KGykmzgO5^-%Æó"½jžÊ=ßnSžçÍ€Ö­ n\öSÁª¼ŸÄYÏdoâM.eøøÞÅ@IE8â+ž¿cËõœþMjg"qthz¡|aËÐö;êgrƒP{—ªa½K탤7ôFò>¨h&*˜±ÏÔ()„€¡ƒXr¢úô]íXÅ Z6—ô÷?ˆSÓendstream endobj 867 0 obj 1735 endobj 870 0 obj <> stream xœÅYoœ·ñ]ÈX´YËû0 -ÚmÓm„¼¸y°uÚÖIŽíþúïáGrµZÙ*$Ôh¾áp87Iý¼¢„­¨ÿ'ýÿèr/ü¸b«¿•Ñû½Ÿ÷Xú&´Õ÷~ûo®éʧ¹–«ÃÓ=–>0|e#JéÕáåÞ«õûVî¨X¿Þ§D Á„Yßî0Bµ4fývÿ€!”ác¼ñ`e×n}PNüXjj¨^ßù±1RûÓá_÷„¶„K \ÃÄ÷¿u\ Æ××ûÜ9 | [!Äú§I7ÚO"„$¾<`ËŒMì1î\f/|ù}y]Q3ŸÈ¯FÁzü þt¸÷¯=I¨Z}ÜSLhB…&pîV—Ѻüx±÷Ãcw¾'šÙv{ Ù¦J6ëC /Ř7œ‚²óKJ uâ™¶„2Xž“šX*iU p zë)Â~Û+O¦’™¹›¿íÉ`œ0 HðLCæ¾a‚%’Qe1æò ϲ„e^æ,mHÌ€Á€„Êú}™ØrH.*­Ò 5l_o:¦"³×f/'tÎúM cRiz¶2ßÀ­S‘ù¿ Õl|Ö쥢lÄ¿ëT5€Ï'Æ…µü‚ŸµjeìUÅê")Y.Ê@h~Ö3¿T2Læ*Q—â ÊŸs¬ÿ´ò~‰P°"ÜŽInã ®*:C(Ø/û8p¸kl“ĪUÄá Zc&ƒ}X¨l±¼Š£qiÆÇŸ6‰ÙB$£f§±fÏTï$nµbêú?µJîõ"KãÖ±n\´d²¬±©Ü¥I]Y^çÖ„M¥Sæ…viGñQ§²³ (Ÿ«2c ø¦Îcc%½#í¸ÿ4^aÉ„gDÛ•f¼; y€€¸N´)R ‰¤Ì—S-mu(S,™Ë >’FÐI® ÈÔ|å["ꦠ”¿C:q3q«3w›ãŒ±SMÄnu"sm«X#|e¥…RªX£ ‘¼@v< ªX ’çR¬r…õêÝÄü©QüËš€ÌÜ^1nùPŠÐÙÖýD?°œÕÈöÃõ. õŽê\Hp>N„ðv"ËDó—]†1ЧÒ5‰J–°›EŽ%§“‰pR…K‹ûÂâu¿‰x1FnD1Ÿ'Óœtk‹ÓOp<ذäà@˜hâÊ[¤µ% ÊÍáÆ‡vž5²Ó÷ŸüCû)ži¹§KÕˆ^¼)“¶áø 9-VW(Í .,0ip úÍ&ÝçFØæ>Mlãhm.;’«9J¿é÷${œ*bë>Í¢¾T"ŠEs]c÷Q š 6.l3 @†éõ©Q'Ér §nà¬Àzö²õ–_.ŠÅNãþ»É7b·1Ø_Ô‰>OÐOZô2>.m¡µ³Äã¶ÝlˆñE7/G9Ìá/ÎñDŸ—{3³Nnö|;Á?ÏÆô˜b5W±\`>ëH®áÕdJ\,_”]u3Nâ—³² &¿Y ¸«1§_ƒîJ×÷9Ÿà#8©²)ûB¿w'd)›Çf›z@ßÕ2X-m0z¿Y†—Ьäu¸›%?&H"µwóx=^H(ºí¼_NÑÛ<˜ì4¡7sŽ%ÑgËFê„ ^ƒWþ Áþ~ ô£^Iº€Æï—ñÁW©²ñò(ŽöÞ,Hd‘-:ž¯'èƒFd »¾ÛæÑ÷•™.GðÍ„ÇYÞ¸ù¬í÷"Ø6é_×NÄ«Æøïóêø²Æ‰>Œ-\{õÏå¼e÷xöAðA>e÷qœ¯œVðëîK䇡 ¶L6ÚŽÕîS/£Î³Þ ø àëšú©ëNhH¿¹C Û¢ |J®ø¢: ¾ïµ·*Â8;•ü‹lÌúŸ:ç°“”—#›‹š(·É¡ŽzŒ V:JuG=~¹ìëc'{üœ8Óë=@ú¤̸½ª¦3èÕvѬíL­aD^›}‹rômëð]u™ƒíëšó~—ºvÊìL Á¿vmüÇW¾( †>£”JîádÓ¶ï§¥\›þu¿RËjQä˜wy «âaaÁGþ®+jç`ëêà-þe²õ]ÜobíHC¿Z\ÌÒ«fƒúH1mÈ8léïŸ)vZ/ê‘Ã$Ú¡Øn×Ú4E6u±à ×>ÿÔs¶Ì¦êU5 ù»’+©ÄN±ºˆ.EìÐJþ~•'ëôYìÁmÖÒ rK0¶ŸGö¥Ãüÿ•|-š®K+Ÿ5”:W‡u)%;—hI—1ͬir„Q¯¾9í5m%³ K÷Í9C\ì $@¯yþÌŒ7JÒY&vÿYI”è]IsÊmU{2‚Û3ØMÌNÑ^.ôÈiãÚdŧֹz¥*8‡þ¹§ÙÅàÛh—fm—úã$Þ^Lö¥« €e­ž•åAÁÞ±ÿÔ:–:BUßIêû½Ãß¼jJo{¾qç3¤“p•©;Qk*×.Ó»¨éÚÏ3ìQt©|[71ÜÆY}:;C±`ù´OsU²8{Ém1Ͱ¾ô½mËØ€3Æâ¶JÊȽÃNë´á¸±„½õú¦³ùç8Ȫ¹u×ËlãT/ÛH”/#Dóx¹±_16¦…fädxÃQFéÎO㵘Ù]œíN¤Käö_ I9‘á¹Æ¡1Cv ¥ÞpéI*ìN—F*‡Â:b5æPr ÑôIJN´6-‡_ªFŠ18¶öq¶ƒ/ùj—MÛ¨ òÔnAï{éøÉfß±RÝ5fÐT›%…S§ÍQ€7ç-˜7ìqރ헺W5 Ó±ð@;ÑcÏz° ìȆã¾A眗}(¦¬h¯'.4 ôT@êÞT#¿®9$î®ÌÎáЙŽú‹šµ0p^“„AuÞYÜ,p¢úõ¢ß©œÚ´/29è8wUÊÀ8ºð~VÍü‰· ~ê>·íÅ…„ì7лD÷=g÷¥ýÐÑÅíÙŦD~°Œ˜Ý. ºéµÕrÞÙ­€Ú0¢†½ƒÚyñâœS*–ˆ1|!)©Xp¦†Ý(ÎðxC굌²øÛ®þÀÝ”ïÉìl"ׯÒö™S†‚3ªÁÕ—ßb†±¥˜OQ¦¥‰aƒ¢î'™Ø ˜…ljlPž¶ŠoMešH0ç_ø6=£¾»® $b)듌ªhLƒõhãtDè@‚%‹*~ãÿD‡ä6¥oÉ ¾Ší¬iP&&[_€(Ę̀ÂkPáéx»RB-ä]ªÅÊ^eÛ8µùÏ&ßÈãYLþ[d%ƒç›]®7+N¡«¨O¢J H¢‰°-ÎTä°5ƒ¿^"(#”‹•‚NSEnãŒ1Ò­e–õÐÕü÷˜ú¨wendstream endobj 871 0 obj 3555 endobj 874 0 obj <> stream xœÕZKo$·¾öGÌqd’Åç$‡ØAb[`Ø>ÈÒjWÉêá•”µÿ}¾"›ÝÅén=±‚Vœšb±Þ¬*Î/[­ÌVó¿áïéå¦|ÜšíWãêß›_6fø ´í7øÖ½Í*Üöø|c† Ñn#å}Ø_n~ØýéH+«‰rÜ}<ÚkEÈíNuD†âî–¡1:Љ×D^i“woì£Oɶ>Ú¸{ÇktÔá§ã¿nþ|¼ùfã”öÛÏcŒS.òùQù¼½ÄâFÈÇÍwÏ•§Ð¬$&¡$Ï‚¡Ý§£½Q:¸wË<Ë­Ì?Y¯:>Ù¿ñwÙ2vw}´·à9BCgU‰ˆv÷b=¨…l |‘S;Ï+80WõllλŸÅÎ ±ózBQüfý –ÅCšQÿÞPPš„â½ á5ZÇ~Lz–ÖÉ»N0Áé¡Ö ×ÑjxkŒPsì´V:™gƨì½9pýá‹9U~maÆ8ñΈuQ³3ÉØ´#ðnØ "`›|‚%>V”L„ Ù‡¦*‡ÓÑU™(ìŒ0‚8xg¨Ûùn8(Ð$µ 8-;æ”8BBà«~|ÌØ¯`¼^pÉ¥à  Mpaˆ9Ÿm/–žy惃i[µ6¬‹¦L†ß®ÈA°‰-¢ "NÙµ¤ˆÁ0¬ƒ5z£AÈåÇÅXv ç%Àw¹³ˆq^¢”ØÆÒ£ž\÷B¸Áõ/ÖñR\å9žž}‚0HáE9'5^"YÎ*å^0á±KÞž¼ÎM´àsËKV‡ÎÙ›”e.e¡¸$¥õ”„”ÖǬ¬}˜ o²_BNf|äBo-®î!ˆ¿*¾M¢¼»* p”ù"Ä`#råg‘ ¯jò³´ûnÒÕý´ YÛœ§% ˜hÒSÓêbò’ð·Å$ep}iïÛ½~^8°‚ô™ ’%‚‹Ë¸–ÉL ø›Šn]èR‚Hm“SÁ¥J[¨ŠTJ설hìyAr å+  §0Ùä`º$û©&$¯S/œÄ‘{¥ WGåB´«ÙùÝåR¯vѳÖ_)’_=PÂÏF­Ú/Ȥ²©Â¼F; ¡’¥^;oFþ³Êb§’´•‚äUCÕ­r¦/b±ê÷Þùîr¶!–÷(QW÷ÿ¶Rv¾ÕmÃúF¬‡Ó‘#âˆÃëÛC³ð+±¾8À‡â&ãK8½©Hê[žz±rR¡H\ ×ÈÀ畺ξÜRsõ"®6ï)N<‚bî8¿žJVÄ;ÄzYŸ<ŽÏæÂ™N~üõæøw?ì>퟈uáΡˆ¶#xPxe/4ö ølEk'Os­ì:óœ ŒûóÌâ{X_ yïªbCó¬¦×ávn)©´™¯ûƒØ³…¹ÙX"êt!¬y5ç¼ÿµg ©ëdE¸³fêÄû´âÿém^27Ë/¬}-Ö÷Ë–—n,ézâùýJ|ÝMÏWl)½ãr¢x'Àz6ŠWŒv»¬W©´ßz§áæŒM¶çÐ'¤{AæfnåYœž®$‡“¹†g’¼=ˆeÜW(œöÓ¾¦YÄ7B}7+Æ‘)ôì€z—)Nai®ûy>–ÑÄðFÌ7Z2ÿÿ:ÏáÏa’É]rõ) ÿnNîfEÒ›¹D“z>‰M2^ö±r™‡¼ÍTµFwe'ÛʵÙä¼]‘óõ È°FŽjöÍ)*P¨'´ Yeå./ú»;ÇÉÛmq ‹®SPËõãyг{ÆFÏö–§YL‚]²EØÄÉù'ÈÁÊÉ n8¤°WqÐÙSì9YÑÉj·+ §÷O+?gQà#® 7ÆÜÉÜ ·(®C|Ç$Òï‡'gL!ªÃÁ$ˆ¡® ØxÚ{ãúà¼}Çèˆd!yöy¥b)b/ö’úÕÈö{Að¶ôÁí>O9a\R8åY2rùžÕ¼4JØ{>F±ä„8Ùuœ« E¼,³y—CxxÜs<ö†õ²p_ÒHãJ!§ÅÔà²k“ÚR”ÈÌP¦ºåñf÷Ï£ŒèG~éÒŽàŠiï» ¼è]FáÊùIX ý<ðü1P*º­vÇ–2 ýÆ»Pøô’÷šýÄ Päß)¹ˆ†¢'¡²SÒfÑ=Ì’˜’·#ˆœâòKš^ÒÊû Oirš+j cyÆj­ÃßTj ~‡¥¶Ìž±;¤„¦£CzniÉ>©Ð„ƒ¨g+¡K·‰5\XÁžµ:r+ ùC£T%–CÉLÖЋ óðÜyL]FƒÈ.£u,À¢+û ¤ÃÒžcGb ÙטÀ¡æD_cáß ë™MH«~ ¢V“mãïÅ(—/)"),G.A_SMþ¿ï PÌ…‰^«%Ûùòç'­¤„!A>¶’²}|EIÉ^Ç•tQê_Š”RèýU悃TÙ âvè"ŸÉËZÞYü›d~; À{]wμÏf5-$ \^ö°?o0yè%ÂC›·Ë('½½A:,Ü µµ±H¸ªøfŠ Ãï«/ú9Èh=ôüppñ˜ÿÈ ä£1ÁC“ôÿä¹Fcbøøš˜°FÁÌU«_×ßðE,Y¸ØqîÌ<À¢/îÌ£kɵF/5 ¡ÞyéyPUÖ/ýˆŠ4”ÂO’èàyPQT•ê/ï"Je?.Gžõö=þÿ/¬R?endstream endobj 875 0 obj 2628 endobj 878 0 obj <> stream xœåZÛ’5 }ŸÊGôcÅË’o¯P@ Â/‡Ü6v7W ŸÔm»ådv'; ÙM¨Tmº5j·-Ÿs$kæù` Vþ•ÿœm¦Û†oÛÕ›ç(7¶¸ Ÿo>»ã‚²ÉÁŽO6PˆnˆÆû0ŸmîŽ_l­q1Çñt{d b@ﱕãøR¬1Æ$׈ÞXÈã-1ûèSrõA]É5møõø›Í—Ç›7d¬þÞŠòþh|ÎØBl¡f9ÝütÕõLcÎC,‹ÒsV_lÀØ@1ŽOvÏY?*óGçMâ?äa¿“ϲ n|º=r<çÈz8‡"!âø§º.aAƒ¼‘Lä'OfsžÜgp9÷Õ“OÔ“O£Ì·.~‘¬ÅójZü=`0Uà=„°&êü¼ ®uôÔ-LÍôͨO³ŽÎ2Zcä ÉŒÉZcs³È¤#‘q•)˜ÄWÑ¢ÌJœ­Ï&åfçì-{ù!ŸŒc§j`'gž0ðZLötr’5º!d0hÓ†g¼a<ÊÊ™](TA ˜Æ¿& Ek!Ì!!ˆ¢€ŠÃãÁQb$µa¦è4ï©L'èéP6äT˜þ2Î8%Š¿ÇnúÄ{†¹ù¿ ðÞÕICÓ3¨8ÞÁ#%*.äï‡lø£åýÛþýZr"3E,yg’›öÊ-·—ïA¸t"Ày ~˜âŽ9{˜÷ ;´T .*ïÃC\¶ 2.¬ÏÅ,Àœ<,¦y 3±â}†ñù´3.§(Ìãùî-糕£8>Pf5F‹PA3c× vN«Aã´Bž¨:åò”:ïXx¢v*–ŽÀî/Ø‹/Â*^дÊyS Yr Ã¶¦ÈEt9ß²ÌDÙÌWeÂÝL`%J×Ê„˜®Æ$h4ë5à÷gΰ-³ƒMnÎJ…/–]Hó­d=ëHâ.˜Ì*þŒ^⥣/2åRä€hfh½Rck»~¶rͦ·)YRp!è&;SÕ—éx)ÏdåúB6R4‹"E#0ì°#X±t^oœö*MCÏ0ä5 9<¼©khÈEšÉX´ñ|ážæØk•’ö±ŒÑ‘1æëÍ7¼®+°Ì'—•hõv×|H Xšƒú½ÆÛë%)¼šñèfæ˜m ß m¹ìe›W.ÏM–ÎË[®òt.ª–ßà8‰éòËSæ,¼Oö.Ç7rIX²ÌïS±‰i•eΦÌâÑ9¯ê³àBqŒ×˜B‚‰˜Ûû?]p³óõ;Žss?Ÿ·ÉMëw)åP×?D»ኌ’ÓƒóQåv £ä8ÂçÓi¿–ç¸0ìr†Î+O+y‚æÑµ$ªä%ÿÓä´P©Y•-RóšiY,Ú‹rÊ]Y šº$baAQ—<Ï} u)ãC©XNÕQ¨¯ÿ.e,à ?¤lD=³”}õvw(p¡Âû6g#Uïm¹~³Ägïû /4_Ô¯‡üÉlö ¤ÕPG;Uè׃(ø_×>Í¢àӀșEÃPn»Ï½µ¥…Q]ŠEC•‹>0h¤R–µ¬Bª$[Z·v`ÔAýÍ"ªk„9© dÄ,-36„)ZÕrÀ4y“ Ÿ¥n-è xoê”ÆÇªå 8·;5’tÌÜfZ£r"MaóÝ‚Irr¥ÅóÕ4}L)ø.!è•ε ô}ê9›j†f˜·¤Pﱺ~4Ó0a¾´‚ Ì£¸º‚Ü“„ÞÆž€•Cr{süÉÝñÎ øÀ¬îÔ[ᢃ¿,'²fÞfäÓ…sJuf˜Ç Ì®¾FÌ»Ë2 GÀc²ÀN°9™úŽ‹¬.ê÷•»¨ (öÀgêwÜ»}9¼ UÓD%TUó0¦hôñ²:Ÿ©[Ô9‹ÖE—¥U˜”0¢ô‹pU“=ªå·Þ(½ï¬Œ,æ!˘aîY±0f8HIŠ¢nš¥2îéÀVeDŠüúªŒån…2"¢q¹”p·çãW"ìhQ”‰%È-bÿ#1üwŽÓ‡ˆaJñCQCóÄpQ§&JªÒ±—o^¹<7Y:¯Ä ßêžEµtz–LºPd/W½ÔC&¢qD‡vÛz9ô<›$C>ÉavŒŒf9He~ý4ÿÏzÈÇwÇo¨‚XoW(¢#i.–T3 qJ º¾Ã"Dº‚¬íßšS×þ·…›EÁ&ÝÜ׋¼BŠ6¹ð‘Õ7Qùš5‹Ò¡¦i`‘W¬5­X´äˆÒ ]¼ªE+χä{ŒEù ³ ÄUß3Ÿç…BïçkðN(¥ÄùyjJ‚g¬cn–C„’ŸŒó˲>T¥„p5©ô\̼%•“ü¤Je½]!• 0¬Yè=Iå³Ý߆¾ñã€*›©€ê±½,-48¤¢ýˆ”õ&ž°¡k%tM4]°Í+—çöÿúueÇ£púÚ Ïõf°¥'›æ_ÔEÊch—mÒvxÌÿöÎ2Ùendstream endobj 879 0 obj 1892 endobj 882 0 obj <> stream xœíšI“EÇï/øïØc8eåRÛUC.u z@\`ÁåãûÏî®îlç1Â{8H@0Ý9YY™Y™¿®.úé>ÚGû3ÿ¼ûh7ÞîiÿÙrõËîéŽæ›8«í?¼Ø}ðç¸o¡eκ¿¸¿£y@á} )åýÅ£Ýíᣳ8Š´2<<;A$‹w U’2<3i)*¥ÚµH ‘ÚpËÄ©¤Z¹L…Ëðƒ]kŽ%æï.>Ý}|±ûr§!¦ý;"Ò Åæ/!µý#H]$w_¿j<£ÍÉÄ”÷Ù94üzvN!f-eøé°Ï~¨ù/œBÅD÷`ö û]ã,ÄÃã³s†Ïº7¥¢ŠÈ𛻞Ó"\²M!¢¡`äýI\ ÎMy&nmøÞüÉ|¼ª'¾õâ‰,–„h–ü'’¢¸Ä'Êù”¬c|ÈT_)ë’t˜óôïY½.Q­¥ iæ±Æb[$ætE%¢®šæPqU¢˜W¦S µ-Sn)B+í3&Õ´ºZò?äÁ…–ù<´jAò>7 딇ŸÇxÑGå€îÍII†G"'aNÓE|¥G¸¥ÀÕ ¦@æ%YÇÁ».9ÂK˜i2±z9.…RÉT6¾Ý KaªÆåJÄÚW”*Â2§m²ì'CuÃSî½òí05‹Æ\&ý$ç…#ºþ3ãPJœçv$ôGBecÑs­:÷MáÜΊ,Ò–^}¬¨œjäƒÓ—@)ÅEýr4‹(‹Æµ5Ì9%Fc+|pR– נϦ ax­cØ cÔÄ¡òXž¼Þ^¿žùÚª+H¦åüÔJŠ£Öl "€¤™ÿ(ÅsEÍ[å³êð|]㘉ўÓÊ ×‚À/W÷úÀb¼ œV KÖh3²«ç<•Ø´³'Ú öÚÜõl1ç©-®–s ±¢b.>ß]¼w{øjZs«ÉçTm*¾ÿFß‘P…ïˆNJ Údøæ¬Ih¨üMá?tÍ1ÙPiܧ1ñárÐЈÊþœ`3M5q߆##Ò6¿&اé±S™å¹²‘¾±öfB‚‡Éx¸²¯K<û:G¡%xè­jè÷æ•f‰gmÒšBr¨…’­ÍI¨¨ÖR¦ª¿;&— Õ-µ¿öUry†GWi‰|½\¡1ª˜²9yÌi†g¹ Ža1È1mÃxëXÜÐÿ«½ë± 1®XœoOÀbª9´þ˜³ý-E´x.zÍ×5ûB…ØÞ/òÈKa³y ÒldEóû‘ƶÞÔiçƒÖ‰Q6H}:.±ðºãšþæß(e¸}׉_†¢xL¾ƒè±] ¶PÕA­óJÔ•Ú<Ê´(à•f‰g¨"k(QkÁ®u$D_ÛØ"·¯ïX™ þ^ËHÆ3%âØûˆ1’ó˜±.9’Ö3´õò±ãÖ=3¶k)ûͶ¯_÷`˜}GéÞÃáAüüOayuÙçßÀï]5Hgå|w *#žþý)ôÉè¾ÔšÓ¦< =®žO;=Dùú±xgÒ€ú?’[-ïiÇ„]FáŒÄpÅ ª@xÜÕàIÛ]rDAÁ„Ee&Bææ[vAusAhÙæ~¹ü=_KîE^¹¸€Ùq±3V³4´¤cl—l´Rl¡xw‰'±Ôˆ‹êH ­„TŸBb•Š„é”0_¾P^Åp›yج'+^ÁQ(V;uظùv£øê¾õ ŠÕŽ[í,î·'Àù ªóaÚçS2«nßËg‚z¼ò·üKü-æÀÂß7ï5ÿKMÙŽ4WwÉ † #Å xÅá‚d‡ÃŽV)-/Z#Z»d£•sAx­YâÌ-BÙZ‚°O°$;¶˜OÑ.×Bòµöç˜#åëùkÛ÷j&“#ç‹ä(JºuóíðKî…aOB^ÜoO°ý Óü¾1rGUH7o…¾3÷üùr>M¼9iýq%ÄÌ_ŠÕ´úYþ\áÚ1¯¯°Í–X9¿ikù6b|Ùv–œBÚˆ­UÉ7@Ú•{ {÷:C¡¥‹V›Ç’VEX¼Ö,Ù–$ð'·Ð¢®u$i¹Øºó”°'‡ É×Ýþ„ÔÓÏÕ£Û$_=ǵ#Áj€juÐRÒÉ1`ìËdb ë'3å×p¦Ë¯R:šûí hfm¡õÇß ¡ùÉáób?ãï+¦_téNŸÍçÈt̆ýÝ™@Îè• Õ¼KN9~š¦›ù‚ÕEâ°º šØPèYⵯ€X§Õ%äÄ Trj¥ÂÍS@NxÇhúú>v@ub Å}ìÐ%'|ìà|ã©üú>zÀ¶ýö£‡,LÿÖGTZäýIÐoOx ”"ÿ¯¾zxsЮt4ÛWl1’c{—œÀv˜…åؾ’v‘8Ò.Ô¶Ýbôlï’kƒD|…go ÁÙ¡‘µõd>Ý,Ú†²\.NÇýüû¬ß°Kendstream endobj 883 0 obj 1868 endobj 886 0 obj <> stream xœÍ\K“$·q¾OðGLðÔk{ʉÇAË>ø¶¼á‹ìÉ%Å¥v¸Kвlÿz T2««gº»([Áˆe : •ïÀnòNþ›ÿÿÕóCûóÑ?þýúôÛ‡üü‡›ÁÿêíÃ_þ*$÷X§šBŠo¿yðó 9üËCœ?þáÁGŸ¦ØÎ×ÇgŒÄ4Q]G><üë­LÀS"ˈÏ3'8ƒçŠ›ç\'Ö8%W§˜á”ÜTû)Íü ||¿«~UðÀ8ÔŒO½}‡‰ÿQ~­!‘§°Îö,ˆBD‹\ÛóÌ 9ÉGˆâ”ñæ7}¸x ×UƇZEöë›ïÕ›Ȥ†?»ü!¡†AÏÊyö”&GŠõìS:Âw¼?%_nâ;q4„)L·|oXçà`x9ƒi‚qtnru¤ Œ Ú^¡ÚOÙ‘`%ÀŽëTê:"À• ø1áãS¨ePaJ¯ðÄz?Uf¯ùP‹Sõ¹Òùð$æÁ[ôïå1qô$\€Óð)¦lž;|ITàÀÏ\ÙŸ~jŒ*±F:7î L—oòä}3îÔÒ:r!˜-!ìCl®)üÄéô]“' ÂyEöŒ=ÕÐ\“|5鯒ø"^íêßOݰ¢K¹Ã3,#è¥êøß‰ûe ÷$LѶ«.Šàù Ê^' œcQõà )—)Iz6 ßSùB­FPy^W:@ÜXñù Þ•qàU½Qø†=ʴɈ©rlÔ䡸1]æ¿r8&d¨dlä¢ßAç%Ñ#X[5ÂPm…À ˆÕŽP!@±Oq.‚ërf©a“¶Í(5l±¶¥†-l ØëPwòRÄÖužg ÕÃpú‘l¢Ö˜ØÞ·¹Tò}Ýä¾²·–ëfçlp*¾¯™hÌ Dêƒâ4‘?„9*áÂUœ^–QLŒ¢Áù`Ý<»X¶nž¬Ò¸yvÕtó˜BÖö0}­dK¤˜ªa1Uƒ‚š«uoÕ€t!eË÷mE0’g‰ T5&>¡B+_‰ l¨ ’bB7H(ñÝ3  %h´¢ëÕµF>¢.wd à 6"¹yç Þԓž‡Qè¿ÞTÝ‹£ÈÓã¥$=-IH$ïPöJñâˆ>ð!¶—âZ8xI@b‹} Aë‘@qOæ`@šS±Ø«íˆÝ:ÉénPˆèøT­Š£šB~ï #¿?‚-f˜ª» â×–I’9i$;r/SN{ªÜ–P`OUúvy½Yëþƒìíz2« ¸#£¼(cêVyC’l  -¥\wÕKq b{A¢k”õ o•7”&ƒ|[°ª‡¯PÖ>Å@þÇ ùá§±*§@FÂë ÞPSAð)šß½`Ê­}GAxÌC±3L.Ò|TGUš ZQ"œÕ|Šø:G•Êǰ—–ÃL×Éà?Åé§í²«†Ö»?æ|³Š,¬hjªcâæ %´…{Í{€æ¡wñˆÄgsÛ(ZñŠÒ l\ÀX_óWP¥×¼÷c) +yWb-ŽõÐŒ¼n Íb3*)UËú‰V;蓉 ½D ŠV»È.é~׺>|N¥}\—ò§ÄÖéO·uºËÖéÆ,uÎ!§‹)ÑnòŠKš¿³fÝ*ƒ>îKMáµ5knù£–KÇÃ&÷cŸ‚6 ªeò‡äÄRܹ#rZ«„Xëfoa1U‚‚š«uo•+ÌÁÊé¬ÝNï!ܰdÝÞÝmB“]ÂP4E°$iÆ6t£ìnÛ{ ªÔ)•Ct£„¬\-Ý·n4H+ªÁ+ÕÜÒ}v±ÕJ*#ñɇGùU“¿,4-„ÿÙ‚é÷ùfmÆSi2`Yg\ñŽK‹3 ñààaŠ‚š¶ÀûÉ“tÃÕ´/›ÝØ#9°«Ñ¬ZSÓOí<eÞm 5‹Ë×|&]l›«¥¦-vÌ·7ù¢_ÄAúâ Šÿ%Ïsë¥EAÕá:–Ë_'#5Ûž3ã*¯ÐA²Õj¹ÂñR ÐÑYǃi£A|‘0ñ,¾©ýé\®Ë4í\E¦¹<Îý׫€ËÅnç§FS¼^&x"ػ˾7á¢kó¨Žç’fäÍìia¶{wûÄ5ï#ÈÈ)M¶öÆ/fšgÛŠ7~Ö´ò%ßÔeå^ê³~Ú'é_–˜÷$ËÈ>ëþÿºi?~9¾ñš·O–=w£ïãc#„Ï µ±º*Éëh¨]FtC­†ê µêΆZLB'š&´Í"ˆ‰ÔÚYêȾÓþa×#>ˆ2RQC††T‰äÁ•.PŠ ÈzkÌŽ~²b’« ê²a•HɆU ‡p— «¼A~ÄÝ=k$]8?±×¿ô̼Iƒ,ßk¼1Öö‚4Tl{A¨“ݤا8͵K[½gVáEÔ6ƒ öÒ}XØ@•¶tûv^-ö— üwg­O‘_oÎÈ(²Ö»eÃÂÒ–“—> T“t¡-#U®ŒæÚöZn›º ¯ZÏ|Æ6¾ =êÛD'Î|ÛÏ*D‚`†¤Édc4wì°#Ö[´/dSiû¯ZGHJJ‹qvt“øÿcè&û?d½(g£”¢ ¯Œ Y¯BEÚý´&Q‰Fçïj”“ïS ì_YjhtìøÓ6~¡ÿQ-l•, ƒŠÅC†ê”ÉEõ›ÅS,ŒùÊ6U$^Nû˜¹ÎQu Sš¼¶åÈ(ëè-Ëz–鲜^å{Š’Íi¬R‘|Üâ.}âIëX”£ 厵þÇÌG_J;«Ð’ÝoYå$ƒÉ­¢œdØäV·"_ˆåËŒWk ýì?Ud$Ús~X 2]Ãó$IN é ¿öê‘¢7¥Ùo› ¥Ä±äÀ ŸZ79%Ò^¥­á%xÀ¨å —È:s¸g s2_+ßù@fðúPúSDü“9ž¤!JØKš ç™äعí }®0=>Ñþp=ËO§ngŠQÒÔ:@ ÚÔÏä÷?IÝ6‘¬|-Å #¶Ù–Ϩ¸–³[5E" ݈d}ü8¶…¶(Ûa>fé¦1 ¬¾&‹ ¤à×ó!¤8>¾"´ýÓâÒ‚)š §’â¼NôO­L+\À+}Ìö¹3JJs„w$9QÎÓ°Âp¹C’ut·Áð¯õ âÎtéµãùèºKÕͯÀ?CÆóÙc† ˆ>.ÿ}ÏÑ´ÓpÛªt®#ŠÎE¦ã|ñÁ,ÓyÀÈÔ‹32ç~‰c›³õ£˜•ÞD #=_µªC¶žeééûFƒx™õ¨¿:€ÿcº÷ ëÚüήà9¶% ʲ’‡”%²°NÖDz'…Œ¨™Øü‰g•-ð¢G¿þnLÐ>ÐN…5~ÿiÈô\+·òÑœ¦*·Næ´¼hY\H²k]ðý ³n¡péP,w»¨J²•­¡n^‚¨âg0…ü¶^@ñúºÃ4B-aÿì(Q/=¶Òù)ABÓDÒâe `!²¬¡Î.îÏ\œ5@l4¸æ"mÔPçÊ[îæØswØ 6~ÙÎ!(,{›•ƒ›ÏñzX—¯Úé·+‚ŠdñI®*Κ´—´.¾µxòþ|¾Òì!•ä9›ožÇ$”´3„obÅÐþ·æùËÍJdÓi+!Igùµ+ ^Œ1¢‡¥”Ÿ'Æ ×‘û1\bŒÁðO#Æ :×Eç"Q ÒŠ«D:™JÉÅF¦óÜb É g*š1Fß#£>Ñ/A¢\ô×Î9¿òk+ ÃÕÖHk¸:¿§ã ²J/ë#ž,#:žh¨O4ÔñµÂTþv,iï„¶O1@tiך(üɾECYV|Pì]Çjeåʶ-»µZËÞ¼QëyàZ˜ÝõnC­kKE…¾,%´lEçVã/#wð+´“dÑ2í³AÀ…Ó®/½.WH…Ú¤z)Ô Ò•`Òî{‡ƒNfqÎ žz† .Ï¿{‰Ð“œ·¬…P³ÆÉ…R{ͺ{eOš¯ì¡`·Ñ_»±ÙHœ*ÖäLuÃe,#ÍÛÄáJ[Ÿz#!´Tî7‚´.3~‚ §Ï[àõ¸ö#»tH9+-Lj· FŽ™ÇH#CƾXK[Ñó©ýâÂ;È€®×œÂ£OâWIo‰0¾°Òš×½5iZž=WL©ºé¾¨à«(^ºv37ùp»\`¹«çŸåJKØ¥æ#½)ö~[SNL æ³½clûtfèL šÎÌrÞò( ÈýqèÔ}íY𩼬™µM9Ø “žÚM‚9¤®žëˆ´ ¾ªžûNËÇ)Ãd¥¹³Ä²¨g»)-!É¿\/¹:ØKùä¤\Ù‹þX<œê/—Ô$ r­>@²d%u¸‡®ßfPtý<ÎØÙãgæ|Oül|%~RŠíª˜•7íDf>À¹H…ʆ57O*жèFs_ó”ª\DJ?‡´úóün¤Hû±SŽbÈ¥ƒÅq]š–3?ÿÝÞ'GÈ®FcÖ¥¦ =î®xöç.ýÌK¨˜c¨r/^:ý¢?JB÷¹šd‹8|KÖ3\h>0ãŸ÷©¥Òùsyôm-áJrªAJ½ùùõD‚µª™âóy:ä¤3]uDJ¼rF×5„qµòXèM#Ióz-é–€¶g²L%·®\ºÆEo%#ò¯3þâÒs˜ß$óæç b¦öì,§B±‹&f˜‚z³·ÐÍÔê{,ÿ¯Œˆn6¢v!)’‹_ÌW–"‰ú#Q+Õ9ÃûWµäÈ›¹êØÐòâ²ßÅzåRjàþXîL.sócé·g¨èx\ý¾{ü þý_¥ ÂÃendstream endobj 887 0 obj 5099 endobj 890 0 obj <> stream xœÍ]Y“$·q~Ÿà˜7÷84%‰Ë~±ìpø–© G8$?\sw)î¡%)Zúõþ@2««fº»–’‚A²“ ä…¼ÀüîÞLöÞð?ýÿ_½½«?ÞÛûY>ýöîww¶ÿ`:Øýß½¸ûùç.šû2•è"Ý¿øúÎö/$wŸ¼Bˆ÷/ÞÞýúô‹39ã}I§oÍä}ôtú£ä½õéô¦D>eþì}˜Œ-§w.MD.ž~`€BÎîôöÁåÉ›O_><âcÈéô¿ü{Š&™xúøðh')éá—cŠÿyñÏwÿðâî?ïh2áþÇ;K6NT‘NS(÷o1BqòeùöîW×2SLÑkF|&ÈèœÉ)<ÜlHe §hÊDéNÑL¥M1’Ìßáã›m\åWoŒ]IXêÅKLüoüÛ⢷îô¢Ö Âî‚ÈÞûY®õsgˆw)ò"ÞÓ”ðͯÛp¶@¯©Œu¥°ì—o¾ß|?@&1üÙþBLM= çƒõq2^°>Øðߟ¢ÍWñÝR„ L×|¯X'g°ñRÓc2f2eyigwvq,Ø!%7|s6xÆËޕɩP(áDÛÃÙÀ¿j*jŠõ ˆis&ØÓ÷ÔB­{R—ûgW²Sûrვ<‘ãß³l( «ñâZb•ªÂ+‘wTYDRŠR[ä‚bî?TâM.v­s‚W]ü»[MêaßܼYtå‡eª·L(ö\èõ™ÊÛ=µãjf ³aæ­V5=DoçTÚÍèä”f[3Í®Ö~x˜ ÌKe=œÆ0ëL·¤ÍÈÿ8ü–ç0`¯ûÞõéôG1éÑ­‚^A|×¹jI0óCŸ¹YI9#Lš1_iá+ÁÌ ¬gÞϺµéëë-ûysY±äMWF…X–´Tz26q)pæ~ú¯‡Ã*7ùm›¯¦¶m‚kœ—ááíHz@² O'H.ÿØ(«áî(JŒÂ_µ-›AвeóîþÞ FáÇ `äŒpµÛç¼D‚JgÎb¹ìËm2%60ˆäArÖ¡vg¨Â°§o†©Ø³,RÝ' ´òB±2º\É\xÁê0aË@­.”ÀE=”Ä+ k‹ Kæ9!üìDäÌÈíl„…g“ã:ð@Ï9¬ÂÏ9KPX…T'yÕëQÁ€Ç¹ˆJÓ<"+MsÕ P®×ïzÕjyŠ1Á‡-Æ`5ÂöÞ6žüSUqëkvÌZ:Òéu¸ƒWéúֳ㖓¹”"Ë­#bõ ¹n`èÙÀiqu4=¿þÈ¿ö\Ñ|ÿ–ìp€sAÓ-Æ—ce¹ÚûIüÐê¶ÂmD Ît5­ß]ó!DÏŠÚC«‚Ð&ƒ>r/1Å×­ú]eh2&ŸÎ™¤ÍdÕí&@Ä'Ñiu)÷s’hri‹V‡”xJE™±Å]:DdöX>}z"[©¯KñWM÷° »2E8’¯Æ÷„²É™ß¿[¾·pÁÜÿ#þ}u-»Ü‘&ÓU½tþëd¥Püø…X÷ò#²= ìJYíЖm7>m:ºGo`À ÊÎUQUG"ÍôÛ©™ô$Ò·ðÍ™¬â¹4[Áç@ýÍÏØgä‰Ï >õªÂ“‹àèžBëSuÞÑ-#7y p:` ¶´tî%D ÑWkåî$l²¨FUÌ¢Èpn‹EØ^}¤”{Ò~*C ˆ‡êîþ‡êî§‡Ç •²§™GçCY¥dÐFTuÉ”|*|å” w="ØÉdÁ]lÖ\mëíÜåýžM¹BÿZæòJ|~VÿêBÿ>¹ÎjN¹ŠT›# iˆT/Jîì!õÂ\«ÞR¯FÝ™zQZ1öÂÑ'yÁ ö©…á>ÑäŠW•²¶RiÄš0‚‰yÎxTžX­ƒQ>Á”[ã¹ ‡ÅCb:EÈЧP ^,p‡e¹ÅàE¤–'uH?ÁÛ%¾¸´A|­,5¸%µ¦ŒwI;{~ÁŒ[,!É0N“þ'°dU¢®í•ï¶&m?lLZlºvÒaÍAO. ccÑĆþvc øŸøÉ•kŸ­)^Ãd½æÌ"üçxbáq7Ç·s€sÃ÷\Ç~RsÖtlæŸ:Ísºàòœër¡ëùiôn»VXÉÃV>šÍ:¿:{ô6Oeiw 2m-WrÚŽÇ:·/´hÐq¬c—‘[Œ£C¬S§ÈSù„Ñà¦qäÂAö7Ò_€c’ä—èk6{€ü'Ÿ5õûÈŒ¢¼¶—ü¾ißYµZ¢8Ü‹ÜþOZÒ*‡â~J„ÕÄ­5ClžJ™²?"6L1•DŸ\kw„…ÛÿbnUcñf ¸”1üa˜¥-nÁEn1ܪ–ÙÓnGñ.liùOf¡ç}ðåú2&5i·½úûç«ÆÉÒ’œWlÚ–œ8ôGN`@ÏT}'÷·HGËH낃ÝG´!¡‚çhCB]k®Là–aLÃJ“¤TpQyaZ.Î"(á÷“³qV4KŠc¼?„¸wø&iÄŸôçeuÊA²xgØ´(ìCm®UPÑa®CØ#Sƒiìå–Ð]\°0T!I i£$¿êá>/së Çñþ‘´8ã±W ‘{mŽPŒ)¸åx[^›>åL^Îi­áês´SÐxa,k©BüZª×bÏ&3ý8”†mÿŒzÛÄÇ29I ö­¬Ä”$™T lÑ SD%Z'ñ*\‡Ê{ƒ©Ê)ù C¿rJ×"›3â‹Cæ‹ ‘6_døŠf"Ô&ò ¨€²Îò èì‰KŒqå,wÊŸ_çËd¥}!—@¶/í¤ˆò|áçNSí/ÛÌ~®Ùp§&é³)XÙB=Xè’SP¨Ì!EÁ0î"V+Ÿ +Ór|£ù²~éÀ—£Ò ²‡#®â vör+vÒzçgýD^QæOx„)À@¾…+°Œ{2õfǧ[FzÄÜ¢hE±’# ®Ž˜ùî& Å(Ÿ§ßŸ L5{&°äߘD²®HåÃNö}*ØÚq„ÔÀ‡…+R¯Œ±#cPx%8ƤñâëI‡ÃŠ/ ÅCØ'†Òõ‚’‡X·I)(â>-¾#$)r¼äŽã-H‡¤æ8‡Aš¼)µ C88ü)D‰ßyKAcÿ5¥¤ aê!©ñij/µÍC[¶ÛEîæX½G\(œgK¨è•¸ßÈ×ÕŽq;P§¸‘ñ…·32Þ ¸cK`ÏSqÅm©ç¥ «ŽÎ˜™ª3]ÐóÖÛêLz|#™?% „=d‘ùî(ßl8 ¾ª7¢÷1­7¢÷=þP„Ø9çC(zB­ç—›ºF]ôÛ-")“ÉAzR ßBy8]£hH½®t€˜±lÓ! ä”jŽ8ðâ®G¡ð{¤i“w=ruy(.Å}þŸ]M8ï çaÐo'ãª} ? •š  ÚöèŽP)&â)¶DpYÌÌ9l”{“8‡Ízoç°9(¨`¥«»©ž W]VFtçnààlHj èPÔC!+T´­nr߈±TŽ0;%…S¶­f"1ÏÎJÆP!NÞ™ptî"N‹Ï‘4lJe惡¼6óÁ`W*3L1Í<¦à¢þ¦/YC€ü¢ÊúˆÊTÏÔ­YÒÃ4ß×ÁžÙƒú"1±‘/ i|ÙƒE•ãûºŽ]‰Õè^ù³ÍN¢E¦e×yB^n¼‚‚1X‰äZìCÖ‰}¿:“U3Ò–EœN+”"?¾±Ò’˜cM¸TÂ~õtqø Ëaȶçlª;xN®‚ƾðyYVP¡ó°‡#M1kì·OæGìË9$©â:>­âŽ› ŠUPñýl¹q½˜¿4MâÈIª¸ó¡6È+ä}4Òz0T µ„r{_ø ‡M^¯jÝõŽ•5.‰Î°s¤”iLY+¯‹0{.)(HK(×MùRæ»ì‡ØÎ•'¥¼ÈOÂZy]æÛ¨p¹¯B¾ØÚ"®ßë3÷åÈx­¯­°A›"ùÝ&Pf¥æ{‹yÈa†É¸CšïÙ “Ô|¤14E­ùž)(е–}{~û)ùËdÐï~­Ê®«K’òÞïúÒ¢8ìF†Â…IM1Aº¸ž¡¸Z(PÔrÞ4‚ÞщÁϦzP´àE–ZÎ+ðÂX«ù ¨ÜrÞÛ±'~ÕÁ¥M‰U?Ö\3‚÷Ù5óžA©(ësÖT;è“ò -EI|ùOB¥K¿©®›Sü¶. ùc ÚèO³6ºKÚèRâ<çÑå®TG«¸bOó7jÖ53hã­%ñ™šu¨ñ£”SàŽ‡Uìltrc0TÉ5K¸ÔÀÉ9"§%K çVg }De ªg êÖ,7FË©–£;ßC(V!\Q²®ßÝ Å,Ÿº,)âvq.MIº‰_") *—)æCt#…da)º¯=h€2y…W,©† ûd¨æJ*ñ£\‡GúU¢ÝšÂ·…°zgbî aríªx;rõ3qgb¨À5­ÀÛÉãpÔ¸-›ífP>D-¤jÇ£Õq~"è(õÝFqù’eânÛÔ¨–ö*GÏ_ X‹ƒã¾¸­ÎíÚººWMߣ\þ<±ì\«ÞyRA¢ò |Äê•!8îù€Õ 2—õÏWJÚCúÙv¨ýá\®ó4õK> Nòí§&à¼ÛûXir×·¾xìw“¬~ª@ôí¾ç0#Ehf²eõŒÄ“W3k‡s"uSZã'#ͳcÅ+—ÕÏ1í¼©tÙ½—í6Z~D}žºûúçk£}/®¯#æm“%»s©ù¬¡¶ž™Á¬†ÚyD6ÔJ¨ÖP+¡nl¨eu6–TÚúzÂÞ­éÙwÞÞ^ "Dñ; šTöäNåê.PJÜÅ® ½Ög“´˜øÄj…:XE/øÀ*»C¸óUZ!¿ÿ`ÐBÒÎ-€­›žsÏìÀžÔqù^â±z$¡¨ž ŽO“¨Mq.šKK[­gVàå}= RØs÷a *×à#Øó‹¦%hì÷ü—g­OžoÎHH’Ô;—øÀBÓ–ƒ$ÅT"w¡-!T.;›æÒöÚPu^¥œÙ6Œ­l›ç‡uÙ6Ö‰3ÛöI%ã}­€K´¹Édµin8a‡¯×hïDSnû/RG”úI#âùζF7²ý?†n¬/•Ѥ³Ä©¨À+•µÂ>s»ŸÔ$ŸIéüM²4Ù6ÅÀþ™RC¥cÞÖñþGQØÊõ¡Ar7eE†ê+B,*‡Ì,Õ7ûv6ó…mª¼Œ´1D¡t¯:§ù³€ Hëü¡½Ìõ,ë⾜žå{$Žæ$V1s<®qç>ñ(uŒø*C>¤cµÿ1…#ŒÏpSE±”O¬f)ñM[ßdXÅV×"_KûŒ5ÐþÈ_AD"-ç· Aªk¸OÍêæ¦xip~¬JÍ~[  ~ˆ'D¾¥(u3Äè¥U©5¼˜Œô*€J°€ñ|Ùª†p©|ûk>ú¡ýG‚ÿã9¹!'–ž Þüξïìÿ²¾Ö”¦”žEhSûãí‹õaÁÉs D<Ä/`û›üȸæ»[%’WÏöo½Ã_¨ÚwØ—þ’™™Æ³úR˜Ä*ÈHÄ/\-#|¢Yž{+nû=}nÁdM¨•¦^'ú÷š¦åK¹äÍ^ñtß§ Ãeäv ¹‚Ef…áßËwûsÀøÈ¡Š™ßЖï,Ê?ða<ÅØ_h £i», =Íý $Rí4¡U :—Aç,S›Ò„HÛÏJ¢†ßíVí3?ůճÚ#•åÎD Â)!ñÒ \xêω×wó_Wnqf&Ÿíï¯é[;ž‡wãöþÈ? \ÇCÀˆ™'þÚ¦à)ÄCýMùºÄ[åð,G¿ 3&¨ Ô—3¿¿_½§¯e±ðp-Éi[À¸?ÁiCµ•¥—"ŸÙØÂw~ú]]ËŽpiPõ1%U<dK¨« …­ O1¹YË7¼ÇÞ[õ)ÞÍ›£Þ×ÄC`Ë}ŸpŠ&X,MöŸK¨™³ƒ‹ƒûƒ‹]ïmf[>ô¾ÿ|Äõ˜ÊV[ýa?Æ/ª²¸ƒùT³ð;tù@^ZšûúXmæø=òS®ÜSà—²[õ$oÎç« u/ô?é"×<÷0%ýÚÃX¨Í ~¶Ÿ%ÇŸ†¨;„/‡g¹CT‹¼ _«°1ï20\FnÇpö. ÿ ï2è\F³DÁn"íJ¦–›O”LûÜü ¿!ÄLý‹ô/òàˆ%Úßš@ˆœåjçœ_øµ–…äjá~…j+×|V¾¡p{Àvñ%}DùÕ}‰€ºÕ— Ýt³N¿Åì ÷QO(ˆôk½?²5zâ—Ù%µ~c 5³r°mÍn¡Ö%f(±ð óÀ¥0û$l9Ï®Hà¹HçãÒÜþ_¢r*ËGñäé+ü÷ÿnè°:endstream endobj 891 0 obj 5928 endobj 895 0 obj <> stream xœå[Ks·¾oéGìq™²&èn<¯I%‡<*•˜7;=üP,R²d;ùùùzÀ4ÈYJÜeL;*U‘˜fh4úûº}¿wíþ«¿_\íæÇ=íÿÜ[ßí¾ßQ}pUmÿ»ËÝoÿÁÑíËT"G¿¿üzGµCâ}šBˆû˫݇ß_¸‰HI‡×OÝ$ÅžAêEHÒá½JSò’²¶EÂ䨞¨8¤3·Ž!q:|¥m]rñpmtêˆÉ—Ú2vlÕÿyù§Ý.wßùÉ…ý¿w$>N9¨¹i eI‚„»äõîóû.CL±Ðè»Dkÿ»‹§4¹èS:¼:²DÓUíÇV0ÕåK üWýká(ć7OV'¸ôåâ—,"‡M»úQ8EDÄO =¿^Ä™`ÞâFâRÏMÏW¦ç›Ue2â'Ç'ÒÕ¬§ï@ ‰“ãú@1žãwôŸ"å{ù]‚f,½é÷ÙêÄᜦ{‡0+]r§Ñ°Œh*!Ð ¬Ä‚h,y±—gc!¢dÚ³›=eâ|°8L™-ˆ9‡Œx½¨¤H {¨;á1i^Öá]òËšæ‡Êì!ÅàI†ž_Õ‰¢d€KU¼¼š' —·êÝIT¤@¦ …TIE!5?žà"ôŸJ¾á'»(kò»Ù6ÊÁ•ec=ÖXÚÆ²‹ÝÐj²Îí¼OÕ·:áSÁP>g4 ˜ãGÎ>^\p„*dß±hûR½™bÈàžW¦ý*ǘd€)~Xà s’Ž¡ãŠÏ‹FœÈe5æåœ²¿CÅ1b/ß-*â|e*ˆR9|¶Ì©>_{®Kù¡Îòyq{¸2¦yvÛªyJ«ór™’_ Ń”aD»¶«E;¥ ƒkÓInK ©Í3÷´£X'_÷}S s"©B»7ÖÔÚ±‚g£M` _â°°5L–…@úà%Þ_þewùÅ1b,ˆò ­ÍÅ©øPP¼)&wÐ?-V*¤!£Å.T7P¢g~«í˜#…¤Îó’ÞÂþU¼„{‹­ÍȯHE³Z`ЕÑà®)—.Q¸X“‘.CLyRÚk‚¨Êf¥šPKaä¾²Åb]ÑÄ?u‰*“C›xÐÊ m´îKÖy!»âšxe˜íz%¼W†1fwJÉñÊ`\b D¥2E?.%Í”ü •1GøÈeÄÍe6ÇÅq_Và/Ѳ½½–…ZQð^+®8VrDÞHüÈV1÷¾&üılr R)°šÛxŸ­°Ùœ>Áó‰°ªÏu€¸$ž‡I-×FåÙJKjñ®¤†Ï,©ð¦^&ñ¾¯ùË‹•úF–ì'EeÈÈA2WŽ×Çö§d-!0D’)åZel0æ-6Ü`Ì™Ç+Õg¿Å’³Æ&KFË’OVFÿÃùpÁ©.—n3»~¾Rã½ ¸Ï³¹9•…À9A9§óKX~iT%­ U5É <ö=[­*2ê”b ZºSè§Ç…gÐ]XâÂPŽ-Rþ3;#9× ÉÅÑf”k-ô(ÿÙ™ ,yíÊÚüö4ÕÁ&Ñ©ÏØêã9`cR/N£Mƒ _]¾Ï1Ê\M»Øª 2Ÿ,U¸ŸÚWZÂ9”Š3Ü&áXõu4Ì{Ôu‰‰ºÁ(a'?Dp• Z.ÀždµªÄƹG¤M9Û8w5Oç¨(X5?½]ã¼àÑDZ0ÿÉļÍÊoê!‡çj´cêûmò‡9Óã¢ÜJ>wÁÂçÄwX´Ç3`ᑃ\ª9èåöyà°¡P…EÐÃÑmX?*Öí¨01ÚâÝÇ»ÖïM2h!%ÀAV«JT(ñ{E´gܳP,#EZU é•úÙ ÇÀr}j3•Vìß‘mröùQqòýp€b»%g^ÏÁ{x±æÜcAnk.¼VýºXGØÑ>Vè-a—û™:„‡®ÐÎ:·±b±#£K 2:Ê45­RûÍ’AKGˆlµªÄbQb‚ÛÙb'ݯÔZTˆf(Z‚â_³%ÊÅz‘%ÌÁ¤°Í8׫ g÷>AS·§-]?ç\b[¿Íví‰ݯö“œg™îöx¸E“œpÛG¥TÁ~ ù§§¯·Á8AY¼¿©G¥(wKóõØÛ%så|<{Z<=êΕÅßJŽ€[ÍØì»sã]£ iКã}EZ“ ZÇf›@«`@#p0‰£½èøP©r7‘¨åSEÃKFa€ØÆ¼,˜¸°–ÔMrÊí#‘ùÑL[¦Zª°wáߘòõÆ]ømñúz‡C>¢fí8„G‘ŽãúxŽY™ Ó–ä;Ùg©y~Aì³ÒA§CZ8êU=Ì7É ؇‘&ˆüüg% Öè¤×Ò=ü@™1ðÿìÈ?0¸ØÕ9³þCy1\Ö$§P|È.Œ ùD(jóe‹À#©ST}<‡¢0½OþÑ(ê¡o3>†ê|Ñ%†/:÷Ì|yË=U2h9—ÇãY“X†¢ˆz!Ù‹hùÏ4-ú€UåË“.BÆúÕg/.w:¤Ÿê¡bj’SØGd ËÝÈÿ;òyàË›R–‹Áöªü>—7›ŒG™ýäûi¯=žÁxÛ…ñNe¨rê%ÎBüë"¸•n:ÁºiÔ­P?x¬ÔÕ$ƒ<œ«` 7¢´¼î_øÄ£U5ýô*¥‡¼ZÂ~Êæf© N¿XŒ´ï<±íp!Zn¶¶›šòÆ·J·‰/8 ý’?èœ#ÄSàÎ9õñÎAp¹ò+¹azÀBÙo±Åø ¬3ùgëÙ~Ô?iÊ]VùoÚÎ(“á(˜>‚JªWþ³áÇnæÍ°£L×™§K ót#’®Uj?ùàÇ+¶¾G‡UêG„ÈúqÜ–eý? ®7»Ñnÿ ~þ·**endstream endobj 896 0 obj 2437 endobj 899 0 obj <> stream xœí˜ßo5ÇßOù#öqO¢ÆžñÌØ¯ x!Ü[ËM[(ôRú#ðïóõ®×ëM.i› U ªRꛌÇ3ãï|n7¯ïÂàË¿úÿùq7}Âðm[ý±{µ õƒ¯nÇÝç?’ú!»¬¤q8<Û…ºÁh0ND‡Ãq÷pürïyælã‹ýï˜•ãø ¬‘9°oŠÕ,²¥²fçCÏŠYLR¢e£Ùø´¬£zó:^t>5¢Å<±ô°‘§ÞýçÃ7»¯»vÑyþÞŽê’”tÍIް,Ô,/v?}hùá4‡múûü_ïç5šÏo(±ÛZògOË8êð¿+¿Í¤h|¹@ÈÚÐÒ's_3—ݺö‘É´Âaç³ÙœÒ›Û(çñq·óy·óåêâ:óÙÍ•jõ´Àê¨ï,qSX—éÕ¾OYyÈÛ M+G™åf)I'HÊÊEXX™ç’Uqö’]ÊÍRœ³xxÉ *Éœœ"º½ ¨5—EB߆œJ4@‚Ž}šÛð'.,¨ÄÀ¥rŒcШ‹ÌBRNã_“Ìû sKb0 VD…öH ˜ ¤fêNô»;]¦*&u9• Ä…R{è’s³Ü¡,„p6‡XËêsƒV•ð+Ññ÷ér¹TÕWx^²‡¾BßNg¢’}9UûSqEœÅ–!{4ÎS½Úì/¼É2–‘ÌañSˆ'BK‹K0P‹ ÇëÀ$ŸO&²#]>ÚÏ  ÖÚStÓM'ô&Ѥ1Z?ÞÞd½U;Щ¹Ç¯×Òk1¨,‡¹…Õ~YN •mÜ/VsÁ:©+|é7þ¶z<­>A­'ÃÕÓU!¿I­‘rªÜ4L§*J†_^?]¥0ªX£Ì„ªûúÐ5kŠ ®áŽ“¨bV]RMqãPÉ¡ Kƒ.ºˆŽ Ýóã–ÆMé»Îþõ”§¤[ÿw”€è'*0Ý:_Ö)ZD/‘–ˆƒ‹aˆZâ½÷y·~{B”• Ú5²-†žl $á§\wÃÆG_UÖ;UˤîlIá……Þ‹¤qý<D.OCõ&À^ìñÅdYÂBŸ˜#_g'•o¯r&;*… "¤¦Írv¢)äe[Èžt:qmï…NŽ¡q³¬ïMœ£}4jö“yCèºfõ /ÃI~:fŠ'ÿ*)}ÊŸPùNT6v5KÇ®ÆA¢yåºo²l¼| µ÷ª–ž–É»(=-½Oñ}h‰W1—¹>^ÎðfˆïŽÅr2;™BtYþQ¨å™9-ñ>[gàäñæ A¼ÏT÷éÝšñ’Daº=J9ϳuôÙNMì8¼'%QvÞ/ïAaÑ„ãG£ðÙj½r®Ps&37¢cÓq!æ)¤â…âR@WÀ5¤v€[` /ß¼rÝ7YnÕ!¤Nü‚=ª$F )fiÒa^ÿ2Ú²%í‡_ñóæÝßendstream endobj 900 0 obj 1147 endobj 903 0 obj <> stream xœíZKoǾ/ô#ææÙÀwWõS@Žã p–‰ä`å@Š"©H$e‰Š üú|ýš©™IÙb õÖÖt×󫪞ý©SƒîTúSÿvµË;Ýýe\½Üý´ÓõƒªlÝŽw_ÂXkMv°¦¸JkÖ.$W1¥'&Õ"‚§Æev”Ñ.rq”·âµ8ÊcICñ#=(cBrÔøà‹ò ÷Á§S’ A_U7|”Ù­òÕOdƒóºÉÙÏ&–«ÂÂÖYyfö“…kl,~2ÎÃðõüà8l=y!ÎÉ~‚EŒwÉOÉÆ®ÓzˆÖêdc†¹aù×Ýñï~ì¿|—¶! H‰­õýe¡2ÎÏ:3©SXŒr¾¼?‚¨Cˆ®ÿòº²›²î÷!¹ÄAtÝÿùDlrUÎÕ¥Up`‘›œƒSê1¬Œ+VÑAU“Í;¥•ß@Øû †Tì?OGúÁDÓMÅ!rÿÃ(Ò“lKH„ þTÄCüôÇû Cí\‹Lè¥ÄU=úˆ8’ýVlóBðÜÌ·ÄjPŠf,×{„vÐÆÏ6¹)j)¸÷uf|Ȫ° QÏx/'YoU€ ¾Ôó”ØšãLÓ‘yKüÇûH9ò :¿I»é`Œ©¼Ž\QÕ§°íÿ‘ m×3×C8t!ž»Ìª’ cd&ææâ`«‹Šžš=prÒÐø [6™ GM…#ŽÐ‡¢IN\¶Åh¶®94…^W Bùùû>ò™jXƒSBQÙ—Ôm â´ŸñTœá8Tfy.r>G2Žƒeqp¡sÊH@I4L„„¹÷å®v/1_p!7ÂÝè=Ù²¡·¶0†±ØÔ Árðo³1‚ 1Î ÐÈJ­GMÉxNÒN6ÊÏ09ݨ…„Ü0zÿ,'‰rѯ¹4³¿.àntÅ<™±ÜÔ0"`äuf÷ÆN-Î1BÏF‘zVŸ‚É ^ø´f>EÁðÿÕÜËÞg.­4 Ùu6 »Ó\ZY=8;R — ƒ 3.„:ö\ÛÖw«ñ¡"JPÚ”†¨©XÿõTA$=U¡ÔDŠÁÏX.ÄZ‘Ѳ57õ)BÄpc®©…‘xÎ ¢tÆ5FãhÛY|VÛ>0ýg…= … õ­51ˆ®ÚÛä˜+‘K©Œ>ž8 àYd¢8ÔhD|ìÏDÝ8{"è§Ëb6Õ¤‘_ìsУ©f!^MÕÚ;©F¸/ÏMŽÓ¦Î^{Ñ`Þ÷4áýWÌ$lK`«âñ7ÏAP–GHf…ÇC)wP#‹DÇ­ÍsZD¯Ð pr|¬<«:5_ÊQSà¬öŠûB/G‡ŒUT¢FöˆkÑo¡þW†In8^“V&°(ãSv"ñpJ‡-|Ê6äy“0§Qrvfšé âÄ}5Q" ·¹+ïVqã ԣθ”Á5ÎG-Ö …îñ]U‚¸­]$]´É÷€»&@~ô“Ûºž_º²•óуOõšlž 1)†âOb ¤s#%ãh¦é.]hkG.PœC¤ºOÂQà4&îÎÝÙèæÏ¤[v3 =rl«H"—³6×÷ûgm>T6ÈÚüìaÖ‰±þÙRf|8”c¨ç5)=«x—”S%Z¤á‘¶1ûëˆÐ‚»Úy׿óÞz1_ÕÙI»µ)­¡yä˜æ¨<²Ê¡£N§ÁÌf&I~ŸØƒñ&øÕ¾‡)FI¾ÝèÔ¯ýù¼k?”À ÕÑ-O÷+]~½Ž•r`ÃõXÑôñc¡¾Ðã ÔUjBëˆþd·ó»ºJGÛt¥l¹+™|ÈÎu%ùïÞei§VA¬æt'¿Ü}d——U7…Ýì]î˜Y^ ú¹Xb})øW$Îë³ ž,1 l ûµ`?›;6ù]›ÐAòh‹óe¡»œk’­ÍÔvÉ,'‡öhtôû€¿çü𿓦Y‘LšRÔ©E·2Y%©°»|7¥eÿï}¾ºaðð.[^ŸË6âljä£ò®¹Ý¶ãœO/~Ñ!K#–ÿ!eóüô¢@/{)â¢Ñ,²,;üôæCT÷F‘Õ½õ à¢r§Ô…F™q¥[) àªÙO b¤{!ÑO …C¸Ç{¶m%ƒïêÅÓû\£ÊÝÆÖ ¶¼¹X\ÚVÔT‘Yÿ†š ‹˜øµš‹ˆ‘lYP›)Ö *1†æh[Am?á¶cô5&noët¼xñ•éCmû1ÇüâƒÑIÝ$«#Ð,ƘüVËg O1Àšñmä+FÜ6ªØáÒà§ÙŽç2Ín¡#c™Wt:x}w;GŒ¢Sèÿ#ö–ì¯G à ã*‡8Rg"IcÈi¬Úí¢½,LX,ÉR÷·EìHa롼깭ÜJW°N¯ÑÀ‘_ýqšŽÆ<9våAîÖÞx’p‘ü^(›8j'È6ä‘7³:ÆÐEBøn½ÜÕ×°ÚͶÓÂMnJ iU7ÒcØ«0«ã² ?ʸØz}¼q9Ð|ªÍa[×WÆ·uüG–<}3F§”hcrŸi°œR?”~¨Qøÿ7D¿Õ†èáxðªmÑM½ÊØ/‰^¥õ=:`Ô²ïi”V9²k?Wcí‰;‹Äs*–*§Ÿ~M?7…VÝþý/·©Vendstream endobj 904 0 obj 2596 endobj 907 0 obj <> stream xœÍ[Ys·~gùGìã2"gªò’Ø•8qÇæ›“I”(Y&)Ó’üú|c¦±;³¤8•JÊeÄ6}æûVf§ùŸöÿ7gåÏÙýe½=ûþÌ´?tÛýþòì7_Ù wYå`ƒÛ]¾:3mA´»HFyv—7gßìÿp®•ÕD9î¿;¿ÐŠ(Û?ì#2÷?ðlŒŽbâ1‘WÚäý'<í£OÉîßóØy5ím]]Þ_ LërÆ|Eîrô¹Xù¶‚ëœÌþM%ÅGÛÒd­¶.Æ~=_Öý³Kÿºüó9Àg n/¯Àà_ùÇl»¿;¿°{€­F\"¢ý1nB ãÅH%cö¯êt2B%ÂØœ÷ÏÅÊ7båÝ ¢Äô'üXh¼ÑEøsó"5òV€KV–^ÏÃ*´ÑG–Úg—gÿ8sJûÝOgÑjØIŒ*šÝÍ™wš:Í|wöõY‚ 0» FQSP¡kŸUÊÓ g¯åwÁ@39ªÏʪ Ôª›´3Feï´ãœ@¼¶»"ª1¿8‡iGÌþ55Á;CQ“¥BªàrÔÚ„ý§ÏжJU/”\v´ó,#&&Hb~Õ±[Ú?÷ÕÔœ±‚{hwp;ʦÃ_1d¢©&Õ†ek¼s¡MÛHyq{kUœ·ÿ/L.ºÔww^BgetLÓe¿à1iìy[ÇÖSEWÇË8,xì8á/ŒE¤Ù]ÌB)è³ÂåìÙÀ/ŒÒ.‡°ÇC›œ‡lP&“ßÿÿÃ$Âÿº$*±dSLnϰ(T@<Ï+^r©úG >i; ió!Y’I,×bÌQQ„èùDô‡:›¬@¦:%3bÃ\ŒÚU®¢2¾„PO¼¾¬«tbIôII廥½¾,Izß*ÑØà Wuoë#ö¶^!ÍRŽÃ~ÅëyG‰í^€üP±dmàd3È%†™l2|UŽ%z9ÿëóÚaI™B··5à&Á.%ˆ¤«éœb×3bˆä ]3È/ÕÌ„_ÍÌÁ‘š´êÂûÙƒŠåwJ/ ©ìšé×µdý¡ Oޏb~ï›ÉõÔ¦_¬0טö>›Á¯f'—®p;A\×m´ýãvv!©ÎnÇGèØ®Œ‹«FxàL‡æTlêDê!–§ÉÈ@ò_œ]þê›ýßçH·ÿ‘ý*¤WQIùJB¯f¶ ‰wÞÿöü¡ÞIØçéáE‰ð²9HËlVƒ=¤&Ž”@yšØÀû—ùÇIÞßÁåö/X[Ù'ê!ÅùåßChùÙÁ¹`ßÖ4LVçÕ(÷Œk5d›0jógF‚¿)ñ„+šl¦”(z2?á.Ë,ܯã"½ï "·ÐZâF§¨Ä ßë„É:jë¸N‘ÿa†¨ºñz–C Í+Ãä•Å„yÄïB$Ç=Õ÷€WÊGž‹¿¹Ðë3²ÐëE#g]‹¢±Ïœ*=ù¥rm ê{[óyƒ¡Ì cú-G¤×/kñ‘rÓ²l4½r†ì×åÂrGÚ"%9ã•§ R éÝóÏÄUøÝ 8Ä$+¸|Ó­ò|>ï,w»S⣥6¡mKÎÑöµEwFÎßí%ûg×ó¾/%àë¶‘Ø»ŽÉ¬[­â4\ üBÐÕ“¼ÕvóuUL«I7…fÊXHØÿvZ7Y›Þýÿ^¬¥PâÆ„Fs1‚,eCçb¿Ç7ß+{;c•~Ü»º’7)Ö\';±Qa’à+F¯uÓ û æ’²a€ò„ær€Zo°Â­@Á‡ŒBY›+­ ð0i‰ø2qc,²(‚ ÐFƒmdÃÆÄ¦€"„A›6±¤@&lÈNme¨3Ñ­ jƱÒ!øjŽ2Et,eÇ –ѵ_/× À)ïOd’9épŠ•…x§ªþ!:²BeEy¬ÇÏiB{­«`’«ÿj¶<Ú”Eá×ë>‰hKï0g' -Š!±ÓRâôu¢P•¿ª…D2 Í{/$d Û‹cZ ¾FŒIÝ’9f1Ï1|¥O“$\låªþ–”ÙÉéEhírLàfhìrZA$ª©«Z­Ùœâiçâ°`²ÿØ­Ö|JD²“‘‰ Ô=Î.D¾\=ž´À²“{ÁÞyO. ç…¦‚FAò£ˆ7SÓŸÔæ;ÄÉsŠ)q :‹Š“Oè§ù€‘¢·Êûiæ )(ø<ŠQ@(íèðÙ1µGI˜“¯ØgJÃq‚<-hˆBtSüJBŒüqóUQ¾­}ðærõ¥Ê$äèð»EŽ@¡¬¡QŽÒ%û¢Z8ªap=î`q ; ÕêÐ$Ý.gWQdãs:u”!¶Ÿœ0Fy„pìAûZË$Z3y²ð PØÒ¶¥™[‰ç_Ö$ŸóX‡Œöy%íM™†ùÖ3±ír|²fYM9Ëé8De#­Òõ|¦å ¡¶b7ØëéÛuîI}í˜RưÏQwG.æ$ÿ²‘X:]Ej§«ÝB´CdëVʳ“Tú4$G”¾äqkߣù¢DŠÎ Ošáƒ?¾dèB•¾+|¤~/kî…”qè‹s¯’z+Oh`J¨3<8ŸfžÔEà,HõP·RЯô ¦:õ+¤¡“¼®ra‘m¬òûßv܉ó‚oÞŠ,¿ÜÛOÊêý­KÝfýmŸ‘ý­„ªý­„zb ø¿«*]Ñ××,EÒ­îG-V»tØP'É„Ci¬B:Ê@É¢eÛÄ©ƒôhdôdÛyiΨQMš; =$R$Z"•ì&Ú£Q)¿~øˆ‹”£SK x®„fº­Ñ¹èÆZg |qw@+¶ËªYÌVGª/º“tAê4ROÕº  hõÄÇ5~¤þ1ËÚ±³„‘éXfõµ+דm„ÍÊ“B‚Ô ¼QH ÁðXBEŽû[„*ø°EÅħgq ËFÍåõ|u²„â6DDœ§POqÎ#õsÁ·v*3AÌk~E2ðà3Ú”AOЦÐ&)[-ýɈüH÷¡ÄWæ£ûP":°Ÿ„šk£ý¤À•üHýíbAý‡E„®8‹Ýi…–Fá ú>;æà´å6%.!ÜŠÐjð*él½A懴¬(‡]©8N™±n"2Üæ çÈneùþ®$îä[‹k½]H.Ú¬ü —ˆÊ.p#+J¨¤á ›˜KZ…d¶(Iý± ÊkÍ'Y˜Kʸʑ̠O (nÜS3ž†(åAq°Iâ@Ñ”8Ó¼pDÁwO3¨¾U’Å¢÷Á|¬¸<‚ÔèÝ>Àíì¦(õòÉþÃåêo¥\‡â¬fZQ_ }åSi€úè¢Þ¡-Hù ß` GÇ(óÓ˜ƒ×;íΊA’>‹ì¸àò‹#ü ÅåºÍ-\ð£ÓŠbæâ#+vä25êÀÃýF²Œ÷Z œ õ`7ï9åÙ‘xyô%UðÀc„Ç5VE '«™ ŽP!¼æXÓÉe9B¥-¬Vše==²|7|%YyÏ….k-•(8xˆ›¨·hò}ZTT©âdÙýo°dð’ý׫áµjeÏ#—Nd}t‡Nd=_ŸÉPß+çÕ[؃û†ä6)'¢ø, éÄZæÒe%”œÛ, Ó¡e­]ôˆVi®X5úŽ,-†8ýšÑbH{þº@ÁÿmÞB:P +Î[äN–›/é²Ü,¸‘xÇYº¿}çG[¨'nâºà?LI£=ÞÍfÛ­õÜMµÇ]4^ ˆW¢¬×FŠ…!¿··£Ã¸RpPˆ6~“[ú‘•ÜtT´W㨠ŧ(åÆqAü™ßuò)fùÂã7'‡õõ`v>ûõé c8“ùý—üŽ'¸L9·3ÏÊKÝiá;~µÊ·G|<Áç×V{#a‹g™ˆ¦_Zåàˆ$tQ6‰Âá²Ë%0pNˆíK­æ‰úòíq0‘‚æ¶•øc‰>cµå^ç KÏ÷óPšáÚñuùÀ&Ÿr–:Ôç]ÜÈòÛ‰9*:dRn†' §™§SHÎ*§(üT~ºQ…Ž=ñœitÈíé lÕõ×½ üÝüHû¢ÃCHõ2o¬KåÜÜ„èüÜ;Wå8Áç4#øì:Õ¡´@³NÛ„Ô)Á)xÝÍ‘–O¿x\Ö)l&£Ã&DANãó³GT`åÅ's§#$[¿†©Ÿ—ÔäLlU/$dºè(Ú‡P^žƒP¯s¹gäö¢kßBØ{þÝxk‹‹µ-n43QT|âò|¦Aì{7Ÿê*q]ÑP˜0á(z?ÆQ ïfˆ7baµéz·%\W$³í‚)c%–žÞ¿€ËŽ (t&€¹à@fp4®]¾®Z dMU†Ë¾?ö¯›7u9gÝ!·3’x=¹ì§õVr´:3o•ç¡"MÓO|N¹LL.l$é§KïÈ•g> stream xœÍ\[sG~WåGœ7Ž ÚÌôÜ©â…$@.pTðð G¶ìÄ’%N(~=_ÏÌîöìåèè,)BÖ£Þžž¾~Ý;ò÷;ÕéâÿÖs{–ÿ¸Ó»Ï†§ïξ?Óõª’í~yöÁ3òj—ºäÉÛÝåË3]_´ FwÎùÝåíÙWûÏUGʘöoÎ/TgŒ7v…UkŒ6aÿ¯†`MˆülŒë”Nû÷xÙ#íägëTRfOåÍ`ÓþZT.΃ä­X8¿Ðò6„ý‹ÌÅ« |¿ÿ —,Ë+±._•ÏR°×åt.PØß‚½Â‹¤Hnu3> .ÿ¼üôÌhê” Ðàå5”ögþi"åýýù¢M#ê»òl¬Ñ½b£†Ø/X…¦‹Zï_Šå"…¦”öÏË›d½Ð†‚ÇFI'–ßäsCdòk!‹Tá[ñj5„qvÁ’K¦^0D^_0Lª`ø.Ï47DÞêf|\Ø_žýíÌ»ŸÏ)¸s]лÛ3gx¥aåÍٗ뱡ãNÛÎXO“Øð ÌS,±Aù”ÂÀ@?š\ýdëkm´l}CüA?Xõ–ˆ?¯ç›n„ä‚%[þƒgκÖ]rN³Õl„& ŸŸ]þú«ý³“Ö…zŒú|%žáÂŽí°¬|(œÈÁùÕLb¨Ø¨’¼$òUë™»é Ý+Añƒ øf…ã뺩ÕÍòmy6Êúže^¿™Ê›7½«ïÄ›?Šõ·sy$¦g]Û‡€j/À9¹’ó~ùN#š?Ç»ÞÍþ‚ä¡=é°.ñJ¬Kßg–ÔÁ ö‹å/Åùž‰õ?ŒÏÅgr¤>s1œÌà.QΖ­hœFêæ@žk¬EÐÐ5D½ÿûy‚^ Q±Š³Ø%öqämo\¯×¡¡©ñmÒ2É Ù_ ÝðÄöqy¤æd§œêÆÎuÇÒ Ÿí .Ò7ˆ†¤™ÿ~4kŽºì³¦vPBÓùÈp£¤Î/²2¢‹)5 èãžÈÉS'% K;J8¬œ.¡±N$ühEéRØÈ(ŸÂ’I3yÍžV×<‚×’· É}u#²L¬-ZŒcÅ9‡qÎÞ¦Þ:þÑhÓºÐØNÏïÝάÌTZi2 *GfVZ9Ýy7¬*;*¸z Õºöý¢¨ÔŸ™9Ví¿åœOÖùù^Ð >s‡T5uqéÐNyT;áÐuáXš'ªÀÎ&pÕA»Gò=ùþC‘ÌdÚ–‰­f€ÿå6)x¼z„&2…MÖ pv¸I$‘cd’YKî?…h5™½šzMySxÐBËþ&3uÝHë¾jAQš&ðYp]b=¡ØÂp^QñÂ{Àð6De,ûmN»¦¯ 5 È„0)%ÚÈØe‡!rô"Ž)XÎaýJŽö¼fw ·Ñä TXñ'ó§ä5´8< ±ñµ~9œâª=&g;늆DSÔ(¢+ë>’©<(˜´Ä„Sæ¹~[Puòþ˜ôÙ _=,ÀSÜߨH~i@ó±þ“ËÝ:KÄ+qÆ5ȸPo¿’ór^Ó;KÈìٞà ÚéÇí¹œ—F€¸µº·'Ÿîî›Äü| «µ¢ß‰Xšgn‡³@Žß·cX?’²\+\fY G¾dò„,7º¢K>xžŸ¸—N-³–EúÈ©³`U˜@©ïq_õ\¢¥¾=ÍËóSg&R¬O=VÞIš¸Ð.eº ž¥’ür³b-ù~X‚ðÓŠš8»æ™B6ȧDÂY›CøÏPù"Àã$n³Nt²J ùÔ¹¤›h}]^µ©‰~ÛbÓ•Ü"äª*A§%f²å2P:ö<¡r†GNf|,‰ Er’B.çVÌñÊ,†‚OÙµ9Ëpm‘D´&©´–>zír·Š(ב¨Œ³êrñšd‚4l€ÝÏ@#(äx2P|WÛªÔÅÔ/dÄÂøI Š 4o‡åbtB:J‘i´ƒB´ \ŽGv‹~ Hã õðëýÔfÎ4â@|(Q÷ô?ð¸¹ßX)8€"…4ì [§š|ZÜm<+öüÞ}pqûÀí22|%™ó°Èoy‚Æ. {÷ ¦U)pQx‚Ø|‚(HHzA”‡s@V툌–m‚†ÍŽ’üŽÉ£ 6†EPŸx I¾XéwbýE ÙçXÔV3˜åëóˆ_Ç® }RvLX¦Ž^<äê“sL]‚.ÖŽè™È7Búf¶&æyr°ÔÏ¡É_Çeª§~n•Gk!N¹/ÍÍXõLŽƒ43¿‚äX)ž;ñüJÐ/HÜOiÊ´ :lÈïùukX¶»¶±™ô1½$Ws}ôë禳3ãü’ꓪYLª²o$æ¥{ÔJ*_X-£rÿÓ9y.¡ÁÐboY.e¡½˸|UÖhôôÜSDìsz+ð_m(ðhû¢–çÿ¤¡XÝ E³½@K' «È2¨÷ŽëýXÜûYÜ{˜*&pB¿r0/šÅ¼)Ô’?ÉÐ<=æ‘"¶Ñ|$$ïT=­êTýÎF!xÆßŠ?–XË‹¾ØfÔ|a‘%)nV«úÿØðw½û[&°py’\âT…ÏÇån÷øÃìUŠÑÖ¯œµ<¾v¸4r=—Ó^Ø_ÝŒû¾|:A_¶ ¨ýj.fÙj•¿áfZÆ Ÿ‚›)´û/‹1ø“XÑnôõ[O!Úoö¿ÞœNíþˆnžê)&"iÓº‹ÇHR7æ\ìwü‚•½-WïÚ½ €p:ef"x<èN$)O™Á±Õ¯Ô‰uD»ÐP9T×P=yíø†X„.öW d’¹[Ή“ΦŒžÈð€K HÍ…o‘AM’TeŽâ¦cð¨B§öÊ.×" [¬¢ZLy&÷á}&î¹ä{.™eÏÅò'”¿äQ^-—³J€¾­LñŠh8?*]Jn¥úƱ6×õ^–ü IYü\; æŸûV’?=Zd-‘õãq™²~FÝó@Y¢Ç€˜–E£4›¯bÉH öFøwU–ÑW†‘‘Ûpã¥âϲ×!ÛNöD}–Û/Ê.Ý2¡VÝ> ²gò",Ÿh/‚Ž Øe*BoøÐhÝP¦Àaî;óáÑlæ´ì}W¢Î\k†F0šœ.’;J˜¢Çã.éÜÿÊ¿¨ô(ã€kÒq%PáZLÝÍ’Ëbð”ê§îº½ÚÉw¾êøp}ݬ_A°lØŸDº™JS,u¶™>¤É‰ò'(ÛÞŠûÈÐY‹ éKßLmƶ´ÓÑòt EÊ"KwV+')°þa¦ˆ%íJ‘ºZ‘vî;…æ`öÈ~]ŸÉr—r/^–Y­É»•'Ó)7Ž. @½¡Ô4Ç+]Èw¥!¤eýjþNáÍN¥ùÛf† È44¬œ(°‚…çkÕ¯ì#e‚—>%gÀK™z@$e%@’ïŠÔ"gG ‰Ôß@ü¬y„Œ¥µVñÝÀE†ìãåÚ™§ô‡”/±­=Q3ø„Ÿ•Oœ°¼í JƒÈ×ö©Û¬0ËàeµÂ %.ú|þU[Kë­Õ·ŸÎ‘*ÃK™+dXò)LÁ0öÍ WlàÈ®À´ãˆ2è×õÒtÍ8zÿE#àöåçÒ/W ÀZè±?/_ ƒÕüÝc°µχq¡2¦\!¤“=ÀÊ—œå„–T¾>£§R0sòõ~唄–,‚Ü3 h­&´•c%FÖÀôa8ÀÖÿŸ`“Œ™_Ylû@²Ü ¬²ï?$¸öË ÒÁAùË £`Šcüï¦;÷b@ò­à[˜í–‡ãõľ¡Ç:oeC_Wš†^PÕ†^PÚÐk¨Ü×ö+3Ö…†gæì2ˈîèøVñWykù d{Th§£†(RgÒ¦“ZŽãö _~Ì*²{`¹ÖL–›ˆîתŒDv‹´Iö »&ÂoþÎÜ\"ÐÃÐBnÒ :×Ü”/#š†ŠóÖ¦Ó_É,L³˜qf¦!®ÞJ¹ŒÖM+½ákŸ®¡Š¬ MÒžO¹Vúc:£‹44kytœü¿“÷J‡3*)¥ÄÇãCk0^«$È ‘$*x¹ó[”w~‹‰ C#æÖJŸû‚$©x\(2Î)Ò¨8¥VúN.ÜÉ0h ÏàÐqEdÆ%ÅßIš3¸ä»ÔØÉ›ÎàÑMfO?Ý!i¾»+älDÞJ™øOôq«ÿDÏ}B+ýÝ"\Ï(©+Œj· N¡¤SX­)Ï…HXCx4D°–ÝTtBØ¥?†~ëdAç{yB*¾73‘~Õ…Ft“˜ë&ÑÑe¨8©9kM‡€ïÆAAm”ÉÑrBâÛg<Ár¾19]@õ ¢B€l:\ä»Kz‹aPT;%CÙ)…ƒ·¡ŒµÈ—á%•5²‚ž > stream xœÍWMo7 ½ò#æ8>XI‘”®ý@Ñ-ÚfoINœlÓfcÇMÑ¿_JšÕhö Nr ÛZÎE¾Gr´ïGï`ôùgþÿr7”#Œ?µÕßÃûæ~†_o†¯~GñcrIP¸y=À¼AqTÇ,ãf7<›¾¹ò=QÒéíÕµwDBaº1k ÒéŸlU ¤1¯‰ØyHÓ“lfåqú×}ò4aÝ©!M·döÂbûÎþpu ÎKP^/âÕËþü3^J,vö~k¿î{S³cEvæÞÛFôص]–—?6?è<«1¸¹5Ò~ÎOŠ™§»«kT hê¿uM`Ol ûU¦\˜^wæ`JÓ‹º3l4¡ŠÔ ®3?éàÇBømKOá}·u‚8œ¢÷RÐ'„(öB˜ä:fŒð>§c!ÊQÛeÙyÉB|·~‚i1þ7(z+gU§0îÞ|¥fy;<=ßgzC’9O±öF¡)sB˲¯)pâ±6_p~4ýš3”Èry(™KŒPŬMBG>eæ33èzl!Ô„Jž& …ì†.zØ!cc)…ä$Ž}>*3ä-¤Å z,ÆHE]R5Kôè‚^¦âà3ôT“3®FQ;G©òýKÎ#Gãê¦TU°íѪ$Û™y®ˆBK¦hìya³|z„l§?ˆðÛîø™të™ÈÓKÓȋѢ‚Ñ*× ¿ÏásŸÚ6Óq¹+v qzWà˜[žUœÐåÙ,]ž{MElFõšÎ†•¦Œ”÷íŽT¾ÄÓiM­fR°`Xœ‰Uû!Ï0IÁ2ÊÙy›ChC#ó ±* 6¹Rg Áž:R”TéB` †¶@mÂIžGb¦nž¤ûŸ#–›Øe¨mãôf¼XbèέPi?q•´Ími>ŠîÇ> únA¼é6Öš>)öN¶Õ iÂ=1eíº­—Ï/ðþ¤ãJ\—ÈYäWU`§4=Ÿò-M—§UE!„*FHLVÿËá³\!`8È»ÅI«n?~o¿Û­:›‘NEÖUËQiYö$R3w<þvu.˜TØ:˜çW½ãVn xØÜ«6¥H£wÞwy°ÉÅ6µÇqޱê‡"6ÊuE…cy)gÊ0j uÞA´¿‰A²w.e1Á²¶f\ÁwåFÁ^ö-^¼3Ðr;ä¤fíºa6V,aÃlöý9à £“/u˜Ýœ`-æ ­AóóË êXÆá¡>+¦ÁÛ·é™Îûì;EF±+›¡,£D†288áf©(ŽV+T"»T®P]Û)_š² ' >»¶?`ß‹ò­³‹Ö‰ÍÏuNv³÷w²×½Á Õ˜m,®ØŸYÜW>xZWþlx,æü˜OÝÉ[Ó"6À¼Øuº0˜–/FÜ–ÝÜÜÚßÿ/Fúzendstream endobj 919 0 obj 1111 endobj 923 0 obj <> stream xœÍZ[o·~?¿bÑ—ì)¬ 9ëÑõ­@cÇi%¨áôA±,Ù‘d9–\Ãÿ¾Ãë÷r$Ka$HxFCr8—of¸ü½ƒìDø'ÿÿåÙ&þìd÷¸ŽN6¿odþ!2[wóí30¢óƒ7`T·´‘y‚…΢´6ÝþÙæEÿ`+ˆÞö§Û=1 TýQ¢DÛ_ªµ ­ cD=éû“-Xb±¶”V˜þ0ŒµÕÎAÿ&-§-ØþŒÖDem«|‡Ê[Ý¿Wùïþw4vÐ HäýC’òûðW%ôçÛ=ÚZ[’-oç±ÿÀÆù$Ö„…i48)û£Dv’Ž’¤à}ÿ+›ù†Í<YFÎ'—féä³Eæ' Ã|rMë„“?Úßü{£¡» ‚ fí`ew¶ÑJÐZ¾RN7?®[_ºNª•‰õ§Å½KÖ‡h\°ž”©¶{R‚&µ'uKIgtAÝaЉj¶ë0*[Iã1)Ûê')Û:¥AÒÁ÷ä ”rAÙuâ›4ÑZgÃ.AGÞ—”<Ù"ž¦ö/ÓîZX,3AG ¦1hÔFó}ŽÙ‚QÃte£o}ûL+ÝI9x­eÐŽr$1ÐðÉfÿÏ/ú{ÉÙY3yU_²ñë<&ËžÇïÓX“ÉSädúÝíž–08ýwŒüб¿Ÿ/ég-¿–ü¬ÌÈoû+F?bô£ù¶(”i$¾3Jùˆ‘dìÏýã8èU“áëöH@¯SÜraÎØÌƒáO[•Uúoságê>_Ù‹óì$'ŒgA‘gAœ‡Û-òÿ}…çbEá|ÍaNŸò-ï5 9/“žO˜k¾dãÃ`P‚„rĦ8^QÛÅèv+Ú5îŒåa SÆðæ¦ý%lÿqEõÜ„—+cnÚ·ÙוK ³|*ëfæk6³›8=e,‡#ËãùQ#Ë;F7ç‰ãŒÿ£?ãôpîÅÜsÙX:*•qq^²ñå6¦`rÊO%Ÿ3†³Vuñ˽º°–±0(ºŽäsóÅñi»dÔ¤’ÍÔO#ù)#Ÿ·ž¬žVä»2¿zÓNMN€Í‘^//FeÑG¿û,Øø‚y˜fi|ƒeoǺdä×ËÁ7Yoþy¨ðìÂ]ïxq9‚r·ý”\RP™°àÍ3໸˜2@Li;5cÚFOyߺ’¶#ì –T}†Z¦Žs9á$¸^æÇÉþç­'K!@’‘ŠMYö*PŠš¨>1Ò6<¹„A_kŸÈò*x<Ò:]k:¯ü@¸­ÑBPÏ -†‘ʹëòPÉÖiO™€˜*…òÂàÌÕ…á¨ÃRJMÊ ªHSV‰¥P¨cdÓŽªT®€Rrh~êzRPéïLÂJ¹¹„¨€4:‘ðáŠÒ ÎÈF(Œ·K&ìïR=©dršæjXγ%‰·‘Ý*=Z4G±sV ;g±)àÈmš M…óaÞÙÌÊ»5fmJí‚W$ aŠ´YcÑc­ÑN@>8ªÒS¼/ŒSí ÆšXpÎm]%ŸZÿ¶&ß0ØšK> Xák÷A¶ËMI´hò ÔÀÜ9–«98]²Ü)Ã"žLxaÂÇJß®ðó¹<…̪”'Ÿ)ÃZ5ÿKÏ~ü‰1¬äýÕ|ÌÓýˤ ‡‰c¾×/Û§©aRfJCõ÷~zoïÑ)Ì©Iq¼#kY-UYðŽV2•rC¼Ò6²þ|/ b!ïBM¥ôíª§øw´ãB}ÝÕµñ']Ù]³äY+Ƥ Îy ëÔtËåÉD±<¹V¹QÍ=EyšÜS‹¼Lh"=Lʼvà’‚$Räá 5äÁç…–ƒÑ•’¸´´k¸È[¬m¸>;Š}üÌ@K´ˆNø®¦ûdä|E[È|Ep’\Ï;Û°¬Ü(°à6|òdGÐ PíA5é[.§(®UµÓ(½ML2u|‘„ûøÑJ”ñï 9hšwæî\55upîÎèéŒÜ3áº<Ÿ©q :G0¬Ù§ê+®wa¼ÞŸKòÝ%¿¥å÷˜ùÂÐÒ¿ñiƒ54Ó¦oΆ,o¥•.ûަä÷Âü*”/}œ% 7‡“+ÒYÈ\Ý >L-ûÞ’C† ¬õ ÂñߢHXn^sØñdÕÝ_:´K‡!ªâc VÐ(”_‘¦:TB‡Ø;)”»«n$Ö†ã‘1Ãs€dÌ£zŠƒö˜)¿&/ÜR‰n`^,ú¥EH­­ÂégéÉ€7æ:€UˆSw °ã;÷GáÀ,íOåÀXwPeð   âŒ)„ˆƒ‘$;$Ñ“5+Œ¾ÚšË8H¸€Ô’£)_¬ë%¦AÂ_g!3»T/O=X¦°3`ùåý<ìø£)6[®„]‰0Îá øÇï³Þ{T¹FíÍ| ïøŽ‚ bêÙ«ƒI'†§7röå¯xxxoCÖ•ÂõO¹‡½]‚Õ5/òDôA*_Z‰{Sèúðìg1ís‘ÒrÄÄ£‚KÄÚ•˜›)$†–LáÙ÷¾Ðë Aåƒ:Lêu œƒ“ãGÀØ(¥K°ÆÇ ¢¨ÀJ’ìk:DüÎjœ‘:>Ë!ÿ— õŒ™œòˆ§>fÌ­ÁlÝGJŒ”Sh€2dÌŒ~p¾Rbú ɒ™rU‘! 9€½Ñͬwámt C#Ÿ³(ÿÆ„ç®1ý™ò«Áú2¯|dn«lÄ¡üAj¬UõExo¨5”ý)q[M:\|ir1•_éY0~q{ªˆÉ·\YïÎèÞ‹ÛÛð©V˜±Å)‹§®œ¢ãµšèSÈ+á-0 E!_×bŸ! Úñš˜‰ò~Kõ“ÔW‚ÖòM¨wP£$ ì׿~ºR3ò{ÖŽ-K XÍR>û4õf~Õè©fŽ)” ‘bÆŸ»\}rŽ©«Kc†ìèÏ:ñV’¿6*¯t46“؃‹××[eª¥ò:ª<šš¬>mËÓ•rÅ¿ð8‚½‹ÙýrláÊìYÑŽKÇò†ƒ³óë«ÃÖ¬ÁêRµoþ®ñHå°MS}:­¡Ûú’êãªÙq‘1ÉS“„?jŧ§¶A-?Œ1Ùÿ/¦\W1pöy½y Ê3øa“ûëÔxdé•ÚK…Ô9{‹ù-´ãý^NúÔ |%…öêþTh7ÛOž9V'¥Úäj0”îu@µ1µ Oí¥Lái·’¬L(”襧þ>>vÚPn¹V÷ãë{S‡UhÑÓÿo8ë endstream endobj 924 0 obj 2968 endobj 927 0 obj <> stream xœÍ[Ks·¾ï¯Øã2"ÏTå’Ø•8±ÇæÍÉA%J¶IʲdÇùõùÀ »3KŠS©¤\¶AlO£ß<~Økeöšÿiÿq»+îÍþ/óè»Ý;ÓþÐ lÿû«Ýo¾²Aï³ÊÁ·¿zµ3íƒh÷‘Œò>ì¯nwßþp¡•ÕD9¾¿¸ÔŠ(;<ì#2?òlŒŽbâ1‘WÚäÃw6$ÆÃ pAG×<öѧdo*:m<ܟƤÕvÂ]>Ü”¡ËÑ^v,ÿ¼úóŽBTÞY|u *¿à_³ dìáþâKûÚÚr‰ˆĸqB6FŒ‘JÆ^ÕédÀJ¥ÂØœÏÅ—oÄ—÷D‰éƹ KœŸ 9å¼ ¼éÃÆ¹æüÓ«ÝßwNi¿ÿy­†ÂbTÑìowÞiàÊóÌ÷»¯w Ê`vA%Œ¢¦ BÖ>«”çÎ^ÊïƒqfÔ4(«B.P«eÒÞ•½7Ò rbØ}ÈF‘NÕª^\ÀÆ¢ æðŒšà¡Æ¨IR!'«6j ~ò¬HÑa©tx_¤˜\vtó,#&&Hb~Õq²–ª¹8b÷4Ðî`ÿ”ÍÍ4’‰¦šE–õ­ñÎ…6m#åÅå­U±/ÿ;þ0¹èÒ´ºó:+£cšWÿk'–m›Ç¤±æ]{XO]/àT°àqÀÅi,\~ 0 ¥T O ”³7°ÒK£´Ë!ÞòÐ&ç!”Éä¿À‡0‰ð¡I•X²)&wxǰ(T@<Ï+^r©úG >i; ió!Y’I,7bÌž Wd#z>ý¡ŽÀ&+©NÉŒØ0£v•«¨Œ/!ÔS$_±ø,Kbš”T¾]Zë{Á’¤÷ý± ¾p]×¶>bmëâF—rÖ“(^÷%¶wäÇŠ%kSãSY#°„w“M†¯Ê±D/ç}QÂ3,)S˜ìm ¸I0K "éj:§8é1ÄÎò…n3È/ÕÌ„_ÍÌÁ‘š´ê‡ïºËŸ(½4¤²k¦_¿%ëmxvÄó{ßLn ImúÅ siï³üª;¹t…»â¦.£ÝèwÝ…¤:';>AÇve\\5Â#g:6§B`S'R±üöâÒ¡ðHXçéáE‰ð²9HËlVƒ=¤fŽ”@yžØÀë—ùÇI^ßÁåò/X[Ù'šBŠóG.Ê¿‡Ðò³ƒsÁ†?©i˜¬Î«Qî×[È6aÔæ¿ þ¦Ä®h²™S¢˜’ùwYfáÝéwB¤÷EäZKܘ(*qÃOuÂlµu\§H‡ÿÐ!ªn¼îr(a ye˜½²¸Ã‚0Oø]ˆàxJõSÀ+å#Š?ÏÅ_/ô¦YèME#g]‹¢qš9WzòKå ú ŸŠSñYƒ¡Ì cú-G¤×/kñ‘rÓ²lD…^+gÈ>ä€!,×qDñ¨-rQ’3^yªq"µÞ;þ™¸A¹¿e‡˜d%—oºUžÏûÊrµ{%þ8ùÔ&Ô¡íS§sœº›ª{#ço‹ö’Ƈg7}Ý—ðuÙHì]§dÖ¥Vñ n~!èêIÞê»ùº*¦Õ¤›B3å ,¤?¬77[›ÞÿÿÞ|¬¥PâÆ„Fs1‚,eCb½ÇwÁ+k;c•~\»º’7)Ö\';±QºY’à+F¯uó û æ’²a€ò¤PþK¨õ+,Ñ Ü•3 em®´.Âã¤%âË̱Ȣ‚@ ´‘ 7šŠmÚÄ’™<²!;µ!”¡ÎD·‚¨ÇJK„àëeŠ˜°”µŒ†¬ýz¹Þh~Ly’ ”ô¤Ã)VâUõÑ‘ª(+Êcå8xNØk]“\­øW³åÉ¢, ¿^÷ID[z‡ž$´(V„ÄÎK‰Ó×™BUüªÉ(4ïS!!kÙ^œÒRð5bLʨè–Ì1ÛØˆ©xˆ)à+}š$áúl+Wõ·¤Ì‰œ©­]Ž Ü ]ÎR+ˆD•"uU«5›S<ï\Lö»ÔšO‰Hv62 1ºÇÙ…¨Ñ—«Ç³XVr28uÞ³ Èy¡é“ Qü$âÍÃÔÙÐæ:ÄÙ}Š9q :‹Š“Oè§yƒ‘¢·Êûyæ )(x?ŠQ@(mëðÙ)µ'I˜³¯ØgJÃv‚Ü-hˆBtsüJBŒüióUQ~Wûà18ôrõ¥Ê$äèð»EŽ@¡¬¡QŽÒ%û¢Zتap=îàãv@2ªÕ¡Iº[ή"¢ÈÆç|ê(Cì´sÂå©ìk-“hÍä΃@aKË–fn%žUL X;l|Æc2Úç•´7gæ[?ÎüŲËmðÙše5å,§ã•´J×óNËBmÅnް×ݶë<%õµmJÃ~º@ݹ˜“üËBFb™èŠ(R'ºj0AÃmÙº•ò쬄> ÉQ¥/yÜÚ·Áh>/‡¢3è“:|ãÇ— “P¥ï ™6¿ƒ—5÷BÊ8öÅÞk€$…Þʘê Îç™'u8 RES¨[)èWú†Ó8ñ–:ŸXþÌÛv4-î/ɾKzÇÙBw:¡ÕËà Ÿ—IÖÆªžÿÝ^ʽ؎øVà­È¢ñË[³-Lí³KÍlíó4#Ûg UÛg õÄö(ðW-fÅ8Å)Æ ½V˜O7{‡u’L8tÐáÀ*¤£ì”,:ÂMœ:HFFϖѯöàŒÕ ¹#ÒC"H¡ãRÉn¢=•âñëg8§9Ùµ€çB«Óm†ÌÍ@7æÐ™Óåà‹›¸ X±]VÍb2‹ì¸àò‹#|‡âò Íì.ø^jEѹøÈйL:ðp¿‘,ã½–g h=ØMÄ{Nyv$^î¬I{ 1N_Ù̾äkBÁeʹíy†T.Ͼå=[>œâí Þ·Ú [<ËD0Ó™XŽHBõa‘(.»\ç„ØZhÕ'êźÇÁDNšÛVâ·ӌՖ{'¼Å0žÿ¡4Ãï!Úîxy_`“O9Ëwõö7òƒ|šÑ£¢C&åfx¦pžy:…ä¬rúˆÂOäË*t¬™¸ˆçL£Cn7k`«nº<ÜÀßö÷%íÁˆ‡êeÞX—ʾ¹ ÑùÞ;Wå8Áç<#øœtªCiºNÛ„Ô)Á)ø»Û-Ÿ¿P¹¬SØLF‡Mˆ‚œÆû­JT`åB)s§#$[ÛÔ×+5y'[Õ ™ItmÈÃû–— Ôë\Ž1¹ý†èÚs©ûŽ7ÞÚâbm‰[ÍL”/hžwĺ÷}WW‰ãŠ†Â„GÑû)Ž}ß!Þˆ«M×£3ä¦"¡˜í$˜2VâÓóëp¹Ò)…®ó˜úÐ7ic9$œ]¾®Z dMU†Ë~zKPoêrκ5Bî:’¸œ¹ì§õÐs´:Ó—Ê}(…Hóôok.“K‰Aú™¤wâÊÝ{pS¤Ý1ôNß=©#mnš¬ ýܣ뛓ڧ»åS×å[T§˜y;–‰fBŠì±¬ý=È(¸²Ÿ{;Jí+ …2Wø e÷‹ñëÛŽ ¹§›Ý“ßÓÓ©.fÚi2œåêù rtû®í¢îQÚdÕ.£CñÓD…á–Úª3—KŒ…KÜlÕòrŸ ZAx›Hò1!o dyh_ÂÌ¥w,uiï^Ÿ±vƒo…Y•Š¢…·ÖÄÕ;œÐƒÕ Û•çÜŸ?Çy(¢å þû{ž\endstream endobj 928 0 obj 3661 endobj 933 0 obj <> stream xœ½ZIs·¾¿ü‰)’y»sÉf§,'Ž-³œCœI‘->=š‹Tü÷i¬ÓÌ ™r©Jj6@£¿¯—™Ñ/gbàáOþ÷d·‰?bø¦Jï7¿lDþg³áχ›Ï߀áƒgÞ€QÃáÙFä+ÓÚ ‡»Í¿Ç·N2ð\ŽG[Δ”BÚñz{ 7ÊÚñb{À™”Ú‚¥ÇA­­ãÇKbrde¸åf¼ ²µJZ÷ŸÃ×i8sЋ÷xð?Âo=)`ÜoÀâv¸ñÛ´±“RŽwD·H°&"¥bWž%µÖe÷x_Ü‹+/ÈÊýdˆz‡j޾ºKƒÔj”“VM¢®b¸à—‡›ï7Šq=|ÚhІ ±Æ‹ùa‡‡U5—›þWìp f´hü:ÞCYïÆÑqŒ·ªþXàˆ¹µ­à„âxS_5:!Ü nm`F ãñ–Þ¥ó!¢ Ö#x&@3 X„W)Œ ðJ+áE­Q€èV1‚«„ñ2k5C–%pñ2°PÊpë‹´ÐZgÃ)Á'Làæ wA-µÑt—ë¨F€At§¥ŠÈz’k@AkÁ@† HŒ(hï”ôã3‰ë™G,›˜~ˆ§%LQ”àc}þF+=K¸Íp6®?Pc"%×·)¹¦@JÉ,Úèànü—¬æÆŽ÷IÖ˜ã-Ñ¿#ú=ÑÛÈ`ãG¢>%æ×DCôD¿'ú¸%0§lsÒYPkŒLÆ1[%YreÊIQ/‰¬ˆ¬'û H¥£RSèªyÎN„Á8¶@ææ½hÃP™ÞmtË…Hr¼ê#Mh¤¯ú¸töm¤«|ž£ªàÕïÚ£Š7»ÇhrÞŸÚysÛ{ezñÌnë}¡€¿#ê{"Sóä»pX=ç›WY¶t8ÖDÔBò)ƒJzŽï‰¼#ò!*å;Eç¦ÏƒŽû×ùÞ^¿M—Ô›š¡g ‹ [?ëYMŽzï£üžÈŸ•’bóËšíû v´\`t T!ý1QßO™ùš¨)çþDô¯²¹–e—ŽÛ”ro·iæ­/3Кñy†w}&E¡gTS™z«Š¹oÂH=n¬‰³P_»µ§=jB•{†„r>7¥‘Ô9"ò5‘?‚ÒV1+ZUÿEÆRš_+_º¬^É—‹Ö<•0=þLÔw+x›à7q+n3g¡øu4_ê®8ë\õ&]¥[.´ÊQÓœs6åÐ3Ûu´Yj×8å3vОcÛuØ®p½LÕ<£]ãÌK?h‡S˜×M»îÚSÉxðMÞܵX“Yn—vò²VjäMëc) ?ËIÙl³'ÛSDÚNû_½ÌÍÕN+q> 'ö+’þwD¾]Ð?ÔiK)À ’¦6í&ïÛ¥¥~?eä¥ùyZÊs-cÁâ²/Q4ô/mU M´[z×ç\×E©›÷Sõ`l‚6΋Â*îëëŽð¦-(Røþ.©¥Ï5T"½•«o'T)=Šã6qÞ‰/<Œ°ÅCýÐ;±fÚ¿»W.sT€1BöØJp#º‹/47N ñ›`€Ï&^ãóIŒ›5ÚálBwüM¾’GèNŠô{¶´LãÒ¿µp:ÏšÙºô2™+ÌjNý¥ˆÒ¥·¡UÂÔ çh<Ãy_±°:)ðήÁ-z­QâË1ž,…Õá„DZÒL)__ˆþw+ýjóÝ­5r†U5g ØîxgŸ‹[dȃŒmU9ÛØD^ /°Ì6HœMa+ÇÞçÁ)½OŽÌ“à¹*ð¤9År.L“?©6ä{º µ…ÇP3øDƒ“yA 9‘‘©MLÇp¬¿Œ>Jœ;E ˆTn ð¸G2\(m§éó!¥ N ?”§¨(Éñ1,ü>hA=Ùbv{ qŒË¦keH ô~~´ÁäÖã›x¢‚·Éý¶DÙx´rµér gÔ¯¶N0¡A7{œØÐ=.‰Lõ·!Â!ò÷[‡<LzUJjJÏZ¹Éa5ZgO1Ú®K´óáè_[ã^¥YŸ_Œ©”Ê÷š=z‘§ÝÈÎËy%Ç|šåÕßc!ÁU®ÉRÔÒGጠÅ0ô+­Jþç¾DM­{!ët} ’Ηlá¤Ho2rv“SM“õßO5j¥¤äC$6jí€foª#šÈùûàB&ÇNŒ?n=njùÇSÜj­¡6ÇS›¿$&4l9œ(êúЋ]—7(®,NEáV|6)Â#ïSm,.=>2;‹FEƒVžIûø§‹þáYè0ÅjܧG éáù[R¥iÊWÀt%·&oã­Äß‹æJÑ™‡] zf<7Þ.Aͯ&öçž¡½Q âR²X¥'D8ŠÜ³hè=3¦hdï*¦EÑ`j-ëvÊÁJ`7dÊ Òá`ÑÜ¡sÁèªIVÚ1í+¤ºµÕzôÍ"?Ð i⦠GÿjjtkU›Œ-Ôä|yN¬‘cÃ5½r/|rmnªC”[+§¥Uec휟Ï`#²ŸÉäதĉ²|Evå‡È¹Ä\3ß“Åâ‡A%pv/%öwÍt6ë)YOŸýf¬ª=Ù§'t Õœâ”ÐØ]YünZ ¡äm‘*{7„Ƽb¶!tÖ4„&V™ÐÄ깄ÆJ9¡/2-µÆY+OÇŠóæÓDWï-õPb—¦½‡”€ÓIc…§Ëö•œ5rs¿„®ô¶ÿ7º*¯bO¸zÙ9)á „Ž„pYñT›Õ apþ‹Få8È0¹á>ͧÿ7c•]ë}øpŽÿ¹‰cWendstream endobj 934 0 obj 2360 endobj 937 0 obj <> stream xœ½ZYs·~ß×ü©<$³./ 4nû%‰u¸,%©P¬äÁNªV"EÑâ’2+yÊ_Oã43\Šª¸âŠz›=@_ÀÌÏgbàáùß7»Uü9ˆáÅD½_ý¼ùÏbߎW_áƒgÞ€QÃñÛ•ÈX¬Lk3ïV?Œß®9.¥·ãÅzÙ”Fªq‹\%¥v¼ \k•´.ÐRjÆ…w(ÁàP¤­òãõz#7ÊÚQV®ª¤®äyÚO[°KËERy«ÇÓ ­ ·Üüóøû•Ôø¬ VŸ õ`¤€ñj½Ë´EåO[['¥ïM•`MX)æ„ß&¶hkÒB€÷ãkòä9yòªŠ0Âîm‰"Ù5R«ìšÈU•Ô•®,p ¹µÌŠa·ÒŠãZ~â\¬^-ãG¸A(&•=ü‹{—ð`=zÛ …4C c<„¸ á Àx ×(ÀpLdŒ†ÆË «B/EÃ:¥A áÁyJ¹éÁóô µÎ†]‚"ñ›¢‘Ü´ÔFÓU®#[ÃQU„Ö„Î[9#ÝÒ’gD<†Dc­!ùêH+=Á¼Ö"¸ÓH¾\ñÃøÇ_… K8Íô-¡ßeš›ll¦¯­#)Y3ÿëJ„ÄÍË~Œ¬{ˆkÍÐq¿™²Ÿš üb½ÑB3ÁíøÙã”Зd­K²Çùÿ,, Ì);þµU#ìĽ_õ‹O^þ)áS nÿ´Õ îŠÈú]µéi¿ºäÊÝ#ÿ}Ç„Òr|ÑoÅïÿ¤+U&ÊSw|]éè~`’K1lrÜOb­?ìùÛ»¯ƒö2TÁ”—ónJŸ‘»S·„¿[öü¾–Ñ ["‘¢Ã±Ô-ølÆ—T….„oÿ]ë︕…Ò|º­n–¿È¾ô¡‘Km¢9Mý÷fAþ®W~Îð”/-,/sÔ”,Q‹ÒWýêE³$îÇ'ëØˆ±”y[úð9Ý:)"Î# âoúdé¶_’ÿ¦®ÙdM(âÊÏ MëäU믙¿‰mïõȧn¤™¦%EöE­/–}É¢Kv›‘2ÿ!üoöªm ψƒ® M“ð¤uÖl¢ûýBI=`gäŸþ/ %û't)÷èR•ºxñDÄwi̯=ê ±ù¡7daEæ„Ï[~iLG fÞô.ê\wÑ7j~¤ï '­ð;BSDR_>i&saaf |šw„?Óè:;é³èõéz-…-%:¬÷/Õ9ÈDz2×IÉ8ó=qí¡/k7üÇ…‚Nz4Á¿,ÕÉO»‘߬ÃFÏ/Kù¯uxÎ{Ñ”©½F—vÍlr¾àº· 4m7×% ”ž/Ô±ÿf ›m.jkz¾ЙfGË4ŒJ@çâù”ŽÎßï4?,”#š[dR¤ƒ(­Æt¤™™3º8ÒèÝ>@ær~¢Ž§È?ïeºIc¦çÕ1"C϶z³°ÕEÏïzÛL›âÙñçhb— îz½P Ok$ ŸJ‘²mý2bªÏëú#ãỞk 2– 4'¡6ž½¥ÓÖ:7Š|&wbüûÚ£«$@RP+ÜÅMaUJ:ž§°L>rK?Õ£ÈiÞ'œ‰cÅE¤ÓÓ„Wž7(¦h÷\sVáúá¡2ì ½Å:§P¨pP ‹–:|‘Q}Y.2„¸Ñƒâ¸óé6#N}àð·oPNüšZ=Y ÊJü;Ѱp>CC©=º§á“§#¸0F’oçBÅ?Ä0j%dÊ-|ÌÕˆ\e Ð âVéÑEì,jgŽ) ¢Æ´0š˜âèžÛuQR‚ ÔA)ëPE”\ fôÄIRÚ¡‡)„ºµÔ²÷Í,>p¬”&.ÊŒÌÞ? ·=€*On Rb 0FÈÉU¬aà©R·Q®U] T½B\ßMèš|µ·G  ÑŒ5E·öu%B÷Óý¢%_ÛE %$7¹Å&‰Ùë.%˜ÓåŒ8së=á÷€›L߇ œ“À \f4€3GIÖ6òq A*ƒá0%E£»¬ÑŽCƒ’³ú´¢‡´}q™4oqPóûÃO5ÿUÂOÛ=åèLé½ËŠYyÖ?Û ­tœxù‰:ì ¶¿ŒñÇo‰½ûØöGZZ:^;ç»’¥û”m¯458ÒTŸùt¿|NÚS_ü*iÿ{’)o{$Ó[¡.íiŠ’uz O®Ú‡6²FX‚ãôûaŸèn *îüÉÛ²;Ô‰ý[2ŽÒÁ›Ž¦y´ø_|?‹S‡¶™XgÆ}­J’ÀøT€òà§ MyM®¤œù½é¸KJÍ|XkØHƒIÉ!ƒ¶IFQ…ww?Å™V–¡;ç%ÍQr4­ ˆÖ…‹`°½èCvÎ XT '¦`ä)Ì㘔“” R{)5Öó`À£ú•‚þv²bÛš ÒÉÅ3óK|ã@æ5ÀJ?·ˆ,šY…òwée¥7æ!­(½_{¬¸wɘ¹ýñÌ^çÐñm6(0)ž§3qb¹Œ<¬pà<Ö§IJ)‡yT¹”OIø¯ðL`Êñ V`N›& ^×¹t¢*ï¥CIIи =¼Iòì¥/¦…pò@‚Æú}@!Ìt–t—ùÿª“ËúÙÊF`£ À†Ëây*ß|àCZ†o)L%^ñPï5• ìx¢ÃŸÒ[;<¤ùØÔÇ‘TQ„‘ïáŒ3BÇë?ƒpéÎ,³SùõÒ’väÃGì&N¤ ¦fâXãÏØmBsA\{ï0…ÂdU8(’æªü‡÷xŒñø(n”‡"g¯ÌHƒ¶[TÆ †‡È|ê wLàéWÀó°@Âå<äóå‚ôä8ì±PH¢žDwÕ˜ e˜J¨ŒÃ ôÃL˜Ÿý$ƒ›Öz‰—Ù8Û†ú¸è&|#¥5”Ë^ìÓVcCÆo4Ö^•?²ØHg›޽X8]YïËðA ²„ ¥ôÍj"€y_?sÚÆ*Œè <˜$Ëw'I§ªé¬€!²ºQ³Ê+ªÆa•NuzRé}Ú]ZãÇF8Nh—5Í×QASЦQö€ªáü!Ô´K¹"-cßF(ˬ6 p´FE©WµÒ>v›üí¹—ûEâC2‡ê¦G]ηÔî½oæÓfxVÄ\–ã/ë01êR÷êß§çîæUåDxÅy> stream xœí\Y·~_äGÌãleÈâ Iä°sÙûç!²ä•bI«¬e;ίÏW$»Yìéž=ÚFb $õpªÉb_ñ˜´2ÍÚÿŸ½¹(æðáüôÅÅ?/Lû Ùá—×?ý˜‚>d•w¸þü´"¢5Êûp¸~sñ×ã¯.µ"mmŽÇ×—WZY¬;þ­ÎZcãñKnÑÙ˜øÙZ¯´ÉÇ7 Ð)iš¨£ËÇ»Ë+£tp1mouýÑ÷ÇWu<)nuwS]Žþø‚©]ÐQ‡¿]ÿþÂz¼xV×Ï1?ð·™‚5t¼½¼¢¨|óϹÙÇd­=~%žÛT-ÅÀãI%cŽŸ×æd0×Ê…¡œÏÄ›¯Ä›·D‰æÓ¹’&ë]MiuýÑ÷ÇW÷wwÓ›h<„âùõõÅ_.œÒþðÍE$ •Ǩ¢9¼¹ðN£¯<·¼¾øä"A Ì.¨„§¨mP¡kŸUÊs gH=¡ãàBTD šZ@E*¢M‹4é`ŒÊÞi‘9±Zé²QV§j–w<%2zUóQ &ßñ$—•yj= s·æ”‘<ÌáûÊH9ù¼ŒÂ“(V£°šuÂíãž(¬9VåªìëËd”£!&}[£¤}/šo[&‚YjÄ1°I—”o2ÔDPÄ ßAðÖÞ4G‡×bÈEˆqŒß0µëÎìËÕ¨òee/ÓZ+ÒþMfšW ’üõøÌy‹hçmÐ:‡7ØhýÀµì|Êx>·”‚˜²–R ±äp+`¾'? ÇÇßë7¦âÔEM© Vö®ŒUÙ™ÊM}Ùæ ‹ùU7‚Ëœ³Í53˜£T¦L"·{‘·¤ñJ¿©ÔÅÌ´K\Áã´Gã/.'(èô$ñG§1ñ$FH÷^Ê5XÑòüŒ2DžŸàH$¢(‡ïªK%IkêO%«Z󛈞)<LÌmµåí%24ì¡ Y¼Ê„gŒED,/fdIpcLLHÝs˸A*Õ.:7·Ì ìÄÂÃN‚AÌz>½›nï…L"ÍÓ0\aÎüG!Œ]üGLp#ÿï:K“ý«XWÔÚ„a:¯M‰NG§ã:@±Ê±Ý,°Z/+‹Õ¸$n` Ž©Ã„§XZëh-CÄš–i(T—~2™ïÜ Ìwö̉(··¸a 1Ñ©(Ñ÷Ô"½ÅQD°šÒ®U ˆhà«‚?+îâq_vUK•V‚`Üñ ¡ôä*‘Dè¢}UæßêøT€þ¼CaŠßW'òÎ…ÖÌ‘y}m‚TìÃ?mq¤'ßï~qäÊ <ò‡+”R‰~-À…Hïælóž³·É@xßV\åŠõÏ9Jf » qûÓhIÆKcŒN؈zŠl¸ÓìhÐŒ½¡-Fíæ*Áçšå·ÞõFÉ廵±$Þ’ün$̺0$üì’àóˆå³”G&»xÙG<¤K-  œ¬“l1(Ññ6Rîí?©¨–”팚·ˆ›“ ä«éÜÆIÏ…4˳ ª×äÛjf¯fæàHMZõE.+®nœ\í§Š˜_µä—&<ûá†õ½oçÆå•Ï6æÖæì}6ƒ[]­Ö›½º¹i…“[-؃¤6çbwÙ›•qqÓ· ©ÄçpÏ«†)þëÿбþg¬­ì“\Q]”¿¡åggy±øøAMÖtÞŒr\õó>eµù/Ñ͸ÁvÅÛZ¹ï\H‚¡È^÷—õ)¬¬ëp‘î·ˆÈ-´–¸1q$ã†0ÔºUé§HÿªSTÝxÝåPâ@sˇõ¥ažÌw}%d¹Pàå#;Л¥zh•Ÿ©r{¯´œƒƒÞú58éàf}l»$¿+b06³Â˜âôòE)7=!ËFÓV~àPä€GX®ãˆâ-rQ’3^y[ã@Cêwüµå}îÛ7Là“H0|Ó y>ë#ËÑn•øpò*%^ú«¯ÖµœWB·‚F¶—uÕ˜4^8þý¦ûBô£}6Zö®S6ëP›ý nDÿBÐÕ“<¡xòÇOª2`ZMº)4S®ÄBúÃøoç÷fkÓ‡ßàïÍc-Å&Þ¶£¹1,ec/Åx?L±1¶3Ä‹ïãØÕ•¼IQ¯oL_YØž  Mc¬Qae£…ýÿywQÁäŠ9¯äãžæ§€‹¤òr=6?EdÊH†¿½gÇgÙ‰Œ‰²J:ÃVy @Æ4(î_ÚÝŒæ²L)ƒÚ ôK›ùSv´Ûöè)©E2IS. œ2 )å3HJ2|ºÜ:¥KÁAÉ…ì}‹Eöw?3ä3 ¯0S$¿QGHþül©1XРÌòaR惘9A1•¼"† ÎŽ4Á±š·›ôdÞ¾G=‚ ™®O|JàïUß™øA„ÅÐuÚçPxËÑ¥’PZ˺PD¥SEºml@ü‡øŠ¶b´ç1”>WÞ0#f,^þ{åù­¨pÿ!ú­q>\­Fgmåø$Ír¶Êóê…ј.¹¹…µ…¶¤( Tp>çªÇêT{>nÏ](Ã_½N*잢Hébw£«a: ¨“œçSèp˜*¤£h ‚'Á5öÌÔAzvœèYD*¦µMegÔ¨¦Í-Xɪ`%Q„Þíâ=š²s>0¿½}õ€µÿ“u6=-ø&£!s3ð¶ {¨ ü®ÙŸª]œªf5Cœ¨sÔäËZHÝŽÜ[ï*În÷Gg?rÿ*fk¡TÒl^ÙÚ$<[Z€C(O RƒòF!ÉBRÁÊ}Ø#$tR6ìQ±%ë$_TdŒÜóbwÊ’Ê"Šˆóîù¨IÎ#÷üm­ÓÌ}Þ; ÀÏšP sð9‹Kª€ämì®9ðñæjéOÖ@̘t›x“wt›¬]ØO i¯ý$>±Gîß®‚ëoæc½ Ô0 -ÂCxu` mpÈóAÆ=|3„pBß\B±( XXo9Ç!-«ç°+Ömæ^w±nyƒt‘sdå²¾ã4$¸­â%Ok‘²òƒ^b(G|†ÙÅÈ‹ ’*i8È®É%­B2{ƒ¤Êg¿;W^kÃ7$[hK¼û$©PpÛ]®Œ.nÜ÷©o‡(å8Ø%qtÑ”Øy>]É(K¤  o>d)ñÑrõ2ÈAjônàv´+ä£ @½¼Ã@2Ÿ@dø”Et…ë|Èæ–ê+ÐT1ÕTõ´tŠ˜?ÈÉŠJ?ͱ8oR1/± ¬äâb ¿8Âw*†_Ñïšßµ©]ôY<±#—©Qî7²Å7L¤À™CÚżç”G#órLªàžíó‡V …“UŸG¨Æ¹æXÓÉLE¡Òž©_a‰f]O„ï|¸˜kÀÎ!ï¹0ðEDPT¨øBÜÅ=¡È÷iUQ'78þ-– ^²þú|8_Y§ç‘K'"ÏGYG #Ÿø ©¤ ynW(`÷ ÉíRNø, éÄ,- miaY)Ø–…íÒ²¶6D©Ô«FÝ‘¥ÅXN¿f´«Ì@Äæ=¬ó)h_»xªÜ-q±à%_ÄÅ‚™çpœ¥ëð•}eÂ.î- q[ðýJR;nšÍ¾}ì^MµãHvÜKG·¬×FŠÀ&€F‡qpTˆ6~—[¡ Ô#¹é´À†âÇ0ʯXpW6ÖSöe“ø'¼å_hý±žwËÎg/)Ææ+Ã÷!Â?—#þ.ÛéÒ¨ ©œ-_|Ç-•Õ™—'x-›ø&Ÿ -že"Ì´‡•ƒ³VR×ë ÙFápÙåÊâK;»¯Uo¨gµF9!@¸ªœîŸ, xÒí Ï\P=›¶mW¬·ëµòÀ~½Fê-ß\\©­1Ñ!r)<ñ77<™?ëH9½àïyÑ ÝÁ#xÎ2:ä¸v-¸‹›)íþç}TIR=Ìr©¬™›ïusUŒë³œú,'m^[’Úl ƒ65²Q–Ú¬Ÿ?›·®M€ŽÌ•µá}/èy•³‰<3!Õzo£^„—–諸™ÄVïË«/ø§&¼Îå8—ÝÛúOQÜ7-¿æRqãYçAŒ{ÛWs•ئ7tZEç§}êÛNñJ¼(/E‹Nnj'åV¼!¤Ä«çÇ/är¤S _ç0õ—uxq6–¼y»å“ªÅrÉ»(Ãe?K¯ƒ7u9Gn‹qSüçüÖ}4$>u=ZéCåþ(…hçæ'ü[g&—Ð52ƒ´3IïÔ'÷[øµtQ“‰Æ€[_zRZ]ù…ý|›êÁr¢¡dz»¾º~ÜédöóÌâA $üF=ˆM ƒ„b¢!ˆµŽw1ƒÝÿj»]\ÿè4Çt³cò÷ï{R:ÕÄ$Á…j)mpÑñf!÷<­šÖ‹ ©œ’*[¡(IüÜR©¸OU¶¼‡ ©mÕ™!w év[u/à­å]`É-¯ sÜRv B‚çE.I5 v–â(ûÑêy[s°úÖðPšM ÂéW~ý `ôí1Û s¡íçÖôÚ£ˆ›7ø÷?ó¬ $endstream endobj 942 0 obj 4351 endobj 947 0 obj <> stream xœå[Ûr·}ßÊGlå!Ùu‰ÐàØ‰cÉq|Q™ŽS±ó@-/bÄ‹LIvò÷i܃.E&ÎCÊU6ØîÝs=³?¬Æ×Cø'ÿww¹Š®ùú‹qôjõÊç?†¬¶þÝáêñsa†µgÞ£Ö‡§+žPB0Ï×Vr¦µY^®¾Û|µ=˜Fr±¹ÞË´•vsÄÚ:)åæŒ/˜šÍÉö€FÌq¾9MbÇ­Ûm¦h:ï7/àÉsxòºª0_’xpNˆAà,7ÛÎ#µÚì‚¶2Ú ¶Œ;˜ÆÜóý3žÕáIå¯ž®þ¼RlÐëŸVV k+¬e–¯/WZ 4—%«¯—ýÏÝš+&•è+ÖÆÓäÞ%ß‹°6ÍçÉá–6É…f´ÉÎ%7.„DŠð„ =’ÔP EdÆ€(n¼L±šI.S@¬SZpÚxðŸR.d|ð<=h­³a•`ˆ“F¦€ä /ÃXh©ÆYn¢˜.Ìf·KvIiy™ó¶gÏ`©è{Ú¥²Ñ÷Ÿk¥×œ3¯5~3‚ #høåêðƒï6§TU甓yüÆ/óx0yWy|“Æš’aóäÖq0KZ¼¬Ç`Þ}ã0×Ì8®· SÖSã?Øh®§äþ Ö8ñÌukœ/ÈÏ”‚‘‹7lÍ+ Þl¾î=Ÿ¼ù ÈÑ‚7 ?i-ˆ«Rüªîéi?»”)¶Gù« N'GËÍý¢QýÈû°¢1QÝñaG÷ &É×9îÇt(?¹ƒçß.ìû&X/¥8ïÖ¸A)6Ÿ‚Ê»ã@~¹ìù©•Ñ G ‘¢3¦<_ðÙŒ/Ñ„.„;¿lý—²¢M·ÔÛ…é/²/}ÉÐ(Å=á™FÿíôßõÆÏm<—6-¯rÔ”,Q‹Ú×ýìŲ¤î7O¶!Ñ$A™·D1ÅÎAõÆÉ›ŒÓ–nù%ýêœÁƒl füsÈòs#N^·þÊ‘yG½×£݈ˆŒÇ3û¢bÇ— Ó¿¸²pÊ.Åfô£Î¿@þÑ%>ÝÀáqë¬YBÀ~µ©{öåg ÿq²ÿA.<¹Tm$¨xPñ]Ê4Û¯õöüŒ`b Zy!¦ç Û|Ó»¨sÝEO¸ý8¾-œˆð—0ÆŒÄ ¾9É\˜»g1ÌlAާâÈgˆ®Û'>ûÛÞžŽk1ÕJ0uXï_´9èGX™cR(g>×^Ãøª²á·w8(˜ìXéáŸVt3†= °ÄÀa"¾^8WG­ó laE…°‚ÜbV—ÌK•òÍÂZ¿yÁ¬RCåWmÕHϨàrìlIÍ-ùÛÂ87—nÃsÇËq‚V¯÷ÚæÎ–V\’Sc¯Jú€E4”ÂJŸ<#òJŽ-,Ã3_Ó*B9|2:€b$Û{Ž |ýÓÊ+äµÓ¡Ã7h*’}„Ÿ×éèµZ0Ú€£Ä“•níV•. w¡ß(ÖÒ(fh¹Ø ,Ý2!tJ­èñPgÉ™°““ì:ÚÊ´QÉÍiÄ.ôw/‰$)œ’{XISГ¼µò4öñ$™Ðø»ôUaò–T³ˆ[I 3M @ì›ysoP6v*¦µô£~·RQ†2" Ž8²Ý(©l7Ò&!K›IÐèpN<äP)K\…UÄqÉ•‡ÊÎ>„]…÷õ%' W[ Žu¦-%€] i ®±”@1ªO˜­!æX,ò`ŒeÚ "ÖbBŒ’û03…„¬ÝáËZ7¡mÈÀÇu+ »]$féÝ}‰9FÌâÃQy¦¼•ñUlãÿ‰§çe•©U’êa\åQ=³FÇjB‰¢~ Ô— E“)¤ÊÙU9!‰2ï³*åâÈ”H²àlÀà­h\P)|É„ªwbaá%¥L!áü×8XXO oSæÈ ÿ˜¸C·Üù‰ŠU©4`)=¹‡$J÷b‘$“^Í‘\€Ã‘åF¦'dÜCéB™yJך‰×5óB°>8Ê^º·Oè#½”ëe_,AvÅвC “‡Í¨åÓsIr²”¡Â6¾fØsçõÎ÷—­'r¤ ORx•@ÔFÈ.@AmîÚ—1ÙцÅa¤&bQüu7+ìZPµ®—UˆßïÖ¥C{“(1tTÆöø–M8í¼oü€wƹÛ!¥Yð}¾¸G˜›‰lT]™+3©öF5*ýÝÞ*]›‚£`Ÿ£öYbʇzbL³cJµ^¼?_vQ¾jò¯"c:DÉc eýÙÂxTJ­‰uµ|ý{Äšr‹øJ·–wç6^&ËgH;ì᤼ j~/“4f?öQœ9]è [øj ;©8^jŸ¢ëŸí^w!Žùž6LÚ£µw† ¹_‚ÒL»Æþo7ƾìÒçG½Ñ]¯íÉ5Äø­@s¸jbM.R² `As¸Œ' €³§9Z¡+C^JÐOBúÑULÊô²š*[!Ó;?â+Ÿ¿ààÒ9£7cÂ'Êb»yÖüuXçIr;(*ðÒwTNYE…˳mËöš#¹o{·ž¿f{?Ëùûu[q<~®H ¿Ì ö¸ñæ|5ÂüìÔš.žÄÐM<ó²ßúa£èqŸÇµwž^Ú½Y˜þ=?Šù@ÇN4÷øSP¿éO¾šZ_sÅ/ ¹æVRUbC²8§Ã½°Hní¶Þ³ÅQyN1á!í]î…óuÔû´óõÏPyÊ™Ãeè=ÓEö†Ó¡KÕ~—7 '{²TŠãuí´#{6äkyÓôVÿ ¼ôÑÍ«aDã‹.[b?9¾…cûÇ=0¼iZ4°l(5„X΂–é²ÝÂršø!°¬Ã[¡–k‡>*Ú §˜öqNב0i–Ügq:«&MQ,ø®†HNwÒÆŽþà ×lg[C¾®S° Ùßö>Y¥„kÂ;¡4ô?F3“3ÙÐÌé{ñRbä|:žüÆÆôq2—Â2«ñù‚ú£úæÅ߀z¶ÌRNeËÒ™?cÓ/ÇÅ2º  ø³õGmív løX¢¥®=&GùgF}ò9gV“»XuΔ¡CÕˆ±ÌEúšyW4N³­svóN›MPnïJÎÅ UÖñxË œ 1¯| ¼YÐ/—´¢Gä3ïkß½’3~ý³z%Q˜1½YòèÅÅñš2úo(Eß—âÜ{ÍA¿Ç¼ÑS- Þ«>¢ûÿ‡zjz SEsO¨¸º¡‘&õ÷ÿÅ:礯sþ hÅ÷”²\…7¡º…¥’B-,‡¤*ß=LYÀ”LÞ f]Lyî‡Ó ™*Ç-~ƒ'é”q¾ùø¯Íí;ÿ/ºl>Ž_y!œw…Šjû<hûÏr÷mZ4®[œ†퉒œÖ5ÐE€:Î0çQ' n½ËY½vT!隟˜òð2F¬]håŸ9î¶Z„ÍçN§×N©ü®-í.¿w³ÖÆoºxü€¦Õˆ¯ºmâEªL^íKY2X†·Õº™àdÓÆðÍ?ƒÔëÒwvÒ8f´¥‹¥¦d ?=‚ÉÎâc!\u†ü:.dYýíAx±íT…W“tcˆñãñ‡¦Ò*¿ê°JÇ ë3ú÷¿ìyDºendstream endobj 948 0 obj 3477 endobj 951 0 obj <> stream xœÝ\[w$µ~÷áGÌãÜH¥{Þ@„€O^€/»˜¼^6»@òëó•¤n•zºÇc÷B.'¹ºT÷›ÔóãN z§ø?õŸ_ßœåÝéÝ_¦§ïÏ~<Óõ_TÛýáòìíÏÈ«]’'ow—ßœéúB ]0zpÎï.oξؿ{®RƤ°ÿáüB Æxc÷WXµÆhöÿàÕ¬ ‘ŸqƒÒi#‘¢:Ø´q~¡åmû¯ùEëUP¾{~ÌÏ.8¼¼Z¶tÂÆëöø$cqÉÆ¯.ÿ|fœ³uù||ÌKä¦ýíùlêëfѳ%ž+¯†‚g´x¢ÖûoÊrÔ`¶Ð )¥ý#ñæSñæmÄò!'¤ÊÆ8;ÊÃA"K²9Øhãu{|Ò°°pÞ¿<ûÛ™”Ûý|HAí! AïnΜUÀ•¦•Î>?K6 >î‚2‘ÿ á¶…ûÀïÎ'¥Í»+AY5ø²ÛªÅê¸ÓzHÎii±Ú™!Y¤v TÍöf—¢‹`ý* ÍâõAñº3D®ŠDGoâ$²Áàï‚Âqe…ÆÒ`ÕŒÂ÷Äöʼn,tô 6ÊÃã^djµ·>uWðç âÕfÿ2[AtÉÛä6¯;M6îŸeð`›ø,ʱ‚ÏqEòYuê!ÅA Ž NI°‹Ð)p;^9.1¿¨SØ`² /"¶ðŸXb¼ŸÅaRrzÿÎ{E«†TÚË?|–…«·vâV;Ð<£Kx4jçy×iå!4:ð[P4ÿÈ»k£wû¿òs´ÁÆ ©*¡ÈÀÓþKVŠdÌ¡ NFy‚@M&?5#öïç ®_]$ ó‡bE&…8Z1WR>îß ˜ê·?sp?¹©aÑ^~tvù»/öo–Àëžö–g£l ùuýŽçSàsœ®ðµ°¾fóŽÈîÿÇ8s’϶æÇ,ÿº6ÊÙZ‡T,Ïr½<†ÒÉ_Epüu ¥žŒ¥u¡ ¥¤z ¥Œ`K(u4Ä×JQ³PZW¶„RIã'ïÔ@ ôHWLfÿ9×I­; ™“ຠz§àއLIÔ¯2­Æ£!B›Âú¾ëOÄó•x~,à%Ì‹ö<‰ÍX§A”Ð¥±1ö$UÎcþTëÄ!ª™¹½„üSø|…!™3Þê]î"¹Á¦D»‹šeX`þÛ,Iî›á—„D)háΛ„ê< I©8;­0„ø%Â-Ó¿»0¨CðÎÖq+ü Và8/¿ÿ.“dÆùJõMé§/¢›kØeçÀíà²{Q°YÆ•ì„yÍî`IŠ“ÿM[ƒƒ}P³G;‹„dxÊÿfââªg³TžEÄÁ»¨¨ÄPÖ=:úŠƒ‚IKH8’­a‘ë7y*h“÷§Dµ‘€üêqŽpqt£"ù¥ý­ ­j"—§‹0‰TôIÐûi%‡Ë¼†ŒŽJy0­ >´™ „}zƒüÕéó!º–ÛÁ¿1Itƒ¶d‘¼€œJ1sì¢=B²P ñy´1{ä¬0-d]ä%hÌ‘©ºWP`Ü­‹•ÔåJvg‘PI£.˜ ãŒï"Ò£å&™ƒÈo ‘2£‘3S1JÇ#¥ÖÑœ)§à/Þ•Ähí§ntÀsŒc‚‰9ÊÝ!1œÖ£öÉ¿@ ®\*Q»öô„-'[ÑŠ:{B…'Ô½•?ãå0àU†XªÆª [ås²ch$á5$+Öü¢@xº¬!ŸW$° áØ·=’É™Vö‘ÎüVáæÚü Ï ['¼æ2oÝ,÷jeû…Ê$‰¡UÊtïJi}]6BÎÝ’$éoŒ6¤¹Zj“r–ü¿jaèq½¶ÓÛ2¶ë*)“§#IœL*Õ¬¼ë‹‡lž{½qphÇ]a±¢®"Îøª[–#ݨ¹`†Š ùÄGeÎðá[h%>'ëÐ'›åeÍuŸã?MSð)×ÜLº.] 5`é}De²éAGñÅr© “ ±úµ3]‰n°‡qœ¯˜mA›DùœCÃs¾Íò+ó²lŒÈ«AWùAÁs6Ã#ÌàOÎÑÆaO&„ÛkgB–)‚rß ŸðÞÞ0€EN€ÏU…ÚÎr·Ûayë§ÂhßÈ‘Ž(ÄZ ‡¨TÑSŒ¶FÀ‚¾ðhAõ|uôìcØQs»;é\܉ýË}~WÇ xþÈ(•×¾ÉíëöÞÊî·U;ð)1«ÝŸð¿ëõˆYžñl-–¦P;B#¸ ) jŸ~Q`ˆÀ&az"¾ß³–«ÊiáÅ¥åû~&ãÆÚòj…ÖµÆýxa3…Ôˆ–{wÑ¥6èƒ%98Š“™PŽ_…øQ`wǯ+#’ïs`Ÿ…Qâ[‚,v¨šÂ ê)D"M+šGî4ß\(–Ãégß©^_ŠÙ‹…?V‡¤¬llä»"´ÈaÝÑ0Ã(5 ¨ç“ÿ¬™„ô¥µyú« ‹tÙ£ž— p}þ½#|³¿–u퉺›˜ùš—òÉ¢8_Þv¥I9’ßsÛå:çh#3LQÁýÅÁFL9!˜1=jD­ÌÍŽúXæU×R{kùí§stð«L,dX²IL© F¦ƒï^¸b‡@v¥^;=‚ €+­»RaäÕI+/EåöŸòsijŠ)ŒH•S`u¹ORuíÅó{¨|…0:.ޏóî”ûb@K*ßZ $Žz¬šl>0WÐ’…“{FL5 ^YÍÀ'UïË#¾]Ä”ÔÊü§g·¢ÍþNà-È‚vË-ñÁ¤L'4³)ŠIÙ¸"'eªLÊ$Ô'e@¶ë½‡•Zx­5‘Ö(À¨›eZl¨¢d‚ tÁ«Î@P$TŸ›8µìh=£G=säµÑîùpºS“‡æf¤ûh¸–@z‹´‰vÔh1̈?~–Yºû¬ž¯35ºI+È\wtS¾£e:(,›¸ X1-«f1¨†8”{+é2R7=õÆ:¾ç$¡b¾Ž¸…zÃ_×SJë²6k‘02HÊʪÝåçs+ˆ¸Òš_`mìCjP^/$Ѐö+tP°rç·‰'dÞù-*6<‡]ðFO—É…{’P<‡ç!Ôˆ8¥žúVï­i&ˆÆƒsV†Pç’âÛ}.á¹Ó“7\ámâÁ›Š¥?X!i¾³'èB]ÇÍcG}4ff?ÑÇ­öƒ7QÈ÷Ô?[¬§óABWhbGûøp¦‘dùò&õF5¸GmÙMI‡K»"ô»ÊÓÚùë|1JP•¯Ú÷”î†Ð‘ncÝD:Úg9g­+5Þ«ÖÊ×N–-$( ®ÓKð]sÏ]@ö ¢ÂÓ&æ"Ÿ»ë-ŠARåÉ@£Ê)•‡4’,Çß hÛA¡|6›\(n쯩t6kV£8Ø$q ¨Jl4/L(ºãj‡ê{ˆ²XDW†`ÞW\Aª÷nçáv´)äóÇMN§ ’<ü‡Ë'Ä­Á–rŠ#šVjQ_ }eóHOBÝ»¨·(A3Ò/zK98^ïˆÑ ÂHúÙ)̸àò‹#|ƒâò+¸M\ðÇ÷Eãâž»ãOv:8î^{â_ãéXtÑ ž6ÏßGx9ý“*˜ÝŸ{Xc•P¤p²j\p„ò±ç5•{¶ Š8BÅ-¬¸½¬§ËwbîY¤ùoGåËÞ±ƒâëúaõ„&ßÅEEå*N–ÝÿK/Ùµ¶¬±çøî³´0rÁΈz‘ C|ñkS(`÷õÑnRN@í, éDÏ- kqfY%ç6ËÂÆfnYk'>‹_:*>™—c8ýêÞb 8¢; È÷—·èŠÓ¹¾K¤‹¸Y°=ñŽ“tþm¾ž´…zÃÍBX|›æ?*Ãʤ·c·nªüJ‹5ýñ¸% Êz¥¥8P*ãóG°nsÁÕC!Ú¸MnèGVrÓAy°r!ý,ãÈR§Ïk|!•Ú…ÔOùú‹ç/.ê½xãc¾";½øœσQÉÊ«¶^^E3ÞLNÞšî~ëìÂj)zÊGYü M÷QÖ¸ >ܺ†¿LÔqÕïîžœƒP§R¾IÀÍ7DW*þà¿kG”¬nqà‰+ zÕ5ľ·m¦;ˆÃŠŠBû GÖû!Ž }Û žŠ‹I—û|ÉuAbB¯ˆ”çA¼z|ÿ .w:$ Óuœæ‚rËò(ƒcétèòyÑ¢7¤‹2І”Í«º¬%»Fȳ†äW—ÝÔGþ2¬·:ݶJíQ ÑL˼ƒ¸LLÊñ«'Ég”Þ¡+O8wné¦I»YÜ­¯mø)’ÍúT¯Œß£X ©ëž-ŸŠŠkU‹3ÊîÄÚ\""”%>VíG]¦…£A ÍjäKÐT7äúˆv¨î£nì;â¸j•“\„ñ#Õ&íªM‡òÕ]=¤‡xUøõ9Fè8Fù€>GlÐ :×!àdN†Ë¯_Š Åœ*ØÂ½ H ‚æ_š»È®óküÅZÃ0–8®+qx¢óMW¨ÞÅúÍn?ݧÚ#MÂ=®ñÿÿ› m›endstream endobj 952 0 obj 4525 endobj 958 0 obj <> stream xœ¥UÉn1½÷Wô±sˆqíö•å$`nˆCvBB¿OÙíé%É iººú¹–W‹oú åמ'Û®¾öпž¤¯ÝMí%6XÿtÓ=yû²¢r¿9ï 0ì ˆh¿Ùv‡g1`$Ê6\Æ@¤ÄÑk™ȆEkÆd©ÈD"äa눘bÄÚ8·‡¢²ÙpR²F‹º’O‹,&~x¸]Š¡í³x1‹gÕŠdNŸ6¯:’rIksêy¼)ß2*ׇhî£oÎ ?r˕д˜u)$€á|T'ðdÇsŽ'/'¯gHX¨fR!Þñ!ÎÈcÜq·5ZPVËÝàß D…†»ÚI²ò r]õÈiøVáÆ"Sžcqx‘çN³Ì³ÕTÅ‹šîÿ‚©u7…b{û þĪÐãu÷>Íì)$O”«/Ë —<ëÂ@4gø\9ƒ4V|‚e¤×Y„½d¨y¤A˜Ëì{ s=âTèm[ boËwÄ:ëÍŶ@ý˜¤¥öxvüe6Ppfç|ü~7×ýaÅ&ï×pÅ´"\]ŽYÅ@õUàÕÍAÅmʤQ’‚¤*“oújÿ$èã5Ë´­Qk6&ŽªÐö®©¤ºÈ K˜,ñ8 1û¥ÐdßS4±~/•m¶ˆ– ò:'¿¤|(–(Ÿ!ojâuÇáŠz[u½b\w}Sü-f/¾q¹=ÿ ԋǪ¾£+}0_€qi'Žbáÿ¿¨©­endstream endobj 959 0 obj 739 endobj 962 0 obj <> stream xœÍZ[o\·~_äGô¡>D /Ûuâ$mâ8­¢¦Nt±%UÒJ‘¥6þ÷^ÏpyެKdîìp8œËÇr8ÿòÿ‡«øqÃwut¶úe%òžÙ†/öVŸïJÃϼ‘†½w+‘'X9X%˜ÖfØ»X½Z;ŤçjÜ_sJ eÇëõŽ`Ü€µãéz‡3¥´•–r²¶Z?ž–·a †[nÆ÷al-(ëþµ÷íJÁ¬t¨ÅÞ.ü}øÖK£„/×;Ò¢8|”;¥ÔxKÆy%­ ‹(ÌâÌw‰ì„uY=!½/êÅ™§dæåÄÂæÉW¨ŠcÚ9Õìe³ ðgrç¤ä’®< ³r‚¾Ú[ý}Œëá¿++9úÃZÜÉp±ÒÀQ–¯”óÕËÎnÀ¹å\ãQ¸wɹ2z@Z†uèS!5ÓL/„ÆÓ+fH4=R H)Ñòu Âx• o5ÃH†·´¸ñ..¾NJ¶¬u.ÉøˆŒßOú=ÎGÊBæ`Á—¢(LJ©ºù–ÿF&þs¢§j/ÖÈSµ§<–‹Ödˆ¥±ÒÂjJã:ÎÕ©Ò"—ÌN `]-¼¶¹4Ö€5p*MAy‰Ç±#P>a–ràAÕ؈l \E‚£3£KQkåtíãû†9 z®|¥„ÁkŽ\zô&š¹*Å‚,\wv“•J'á]è|ä€ S¡FíÄÑ´u²™í® `F…©šÉ @Ëb}^)ÐE0DLú”@JbKNw)ƒ³¥©’“„®Dˆi"=lU9ß·J«F5À&ZyQøc¸bÜ`Ëò!†€â9tÄFÙÎ.*±]µ)þyÝ.íêÚ3øBLÂ@Nﶦ¹Ó»BËdͽµ ds^}Ý¡e|S\&2m²¯5ÚñPîÄdÛ0§6 M€å•}º6ìÔ ="3»1e7a>5O¦™o3ˆVÇþ< 8¢Z_ägÉïÓ<˜PxáèëX%6¹ Sžv÷Q+‰>?NÒo%žLUo?~’¨ ÓÉ–¥e§e£HÑ[Dý¢R3`oLÃ|LÆTÓÃ,[¹ì²t×’µ¸Xãw0Žâ]ˆ²J7¶#Å×6b!>éˆO‹*…`QÅ5eðhp-S.‰‰éåÊŠ~Ÿ†i ~¨ óþIà‡ß •ïR(|§« 0Bæët'±™ð‘ÂÎ}`Šˆ™… „=(}h>´)ÏÁÔ­šVs]\‰@<ʰϖ‘£ bH%${ÝÇJ;H+$ &­„€j÷x/šéªt¸LÔ(R3€ŒDñðC™ÎûÆ ´ŒÙ*Wâv%X…ßOúU£õS¡¢à[ú½\°{nïb©0ãÕÈ~5bnÓµ7аômº=959¦]V´ËâM+¦àÞ̄ƛ$¨7“àG@“à˜´€š<<|¶E 0Ç ãúÕ©Eï-·?ÂËSxèVï.[ã¡V#Ñkô"&E„䯥ÁÄ1[éÀžªç uÞ1¡ÓñÌ•aÇÏú¹Ým _=PúÐAÛÒrRÇ LTèU¯P÷ðÐ?l¤ÇŒý^¹N]·œÊMøÔl)᳕O4}´á<™Ò'šô‘ñ^ŽæO”ü±¾ïîËt›ï€b|ñMø`0Ž•ÿÆÜrlyÜøeFŽÖ‡ºU*üt…aIåÂ5ͤ¯”Çhˆçª–­‚¯ÿAUü"ŽAp•Ÿg¥ò^‹t™ÈÞâR¯ßgu5g›çj£k^Sm—¼~3“1&Ÿ‘/¾&ãÈx—ðÓ÷Îd¼—_I°åy>=‡;ÂaVýlº=§äƒ>«ÉƒdJÀ³…¤»î—ê05ãäö?Ú‹CójÞ@ȳ3qrhqGß»©‡ò¬Û4ó¡–*Ü¿’…8Q€¾P}Ú+9Y6ãßß¡°jendstream endobj 963 0 obj 2613 endobj 966 0 obj <> stream xœÕZYs·~ßò˜§dèòÂ@ã¶_’X’˹$Vò`ç)ŠÖ.Iëˆ+ÿ>cf>ìÌp))•ª”mj6}áën é¤PLÿÔÿ¿Øoò_;Õ=W¯7¿lTý‹¬lÝN7_>#'»(¢#gºÓ—U7xê¼VÂZ×î7?ößœHARëèûÝÉV ­6ýSÖJûþm¢zo´i­µRÅþ.‘­·!P]6ZO£¼®R¼‰ý»D6VF©û÷°µJ·Žé(fÏ[%3$s•—&zÛ_f‰NzéþyúýF[-dôlãé›õ§ôÓHN+êoO¶äù@6梴ÕÈ몵&ï’`^‰ Tÿ²ƒbÛ‹ŠbìÏaç5ì¼XïVØwËÒ‹«Ø26uÄ@ ˜¹«²˜«iyàªÇ§›¿mŒ¶ûuãIrJx/¼êök$ËŠ#e·y¾ž_*tÊmä—‹,<†’_”µ&Ùûñd«YaM‰RZ¹â£)í ŽS!J¦Ëì(£\Ô%:Þ NÍŒ%ņo•Æ„qãuÙè}ð锤Hàü.Ñ©ï2»•^ìÁéМ ÂspÈçUÕS•ØXMΆFʾ°kë,J¹]rp”s| Rp¾|fí”ÑZ•ëH#^þ°9ýüÇþ÷%± 'EÉŽº~ëWu-]5»®ß”µål)WúWÓ:© 4>œ'@î±u’µ°Îç­ð ç™ÑÀÏO¶VY¡¤ï¿ƒ3.a}²nàŒëúUI"ßÿ¥U#$£ëŸÏ=–w¾ú%ÐQƒ·@¿l5ȧrýf²éñ\º–Æ ºgúëÄÎWËêþéüÐÌþèó°¢2™ÝñÕ´Îî'¡¥VݶÆý"W…ãž·b÷›¤½N¨Unè²[³šú'Àò~ÅÃhàÐ÷ëž?Ô2;á øw%:’AçÙŠÏ|‰*ÌBøè¯Zç£< eivÔ»ñ»êË8dh¦¢Mx§Ñ/VøßÏ•_2¼Ü—6-ojÔŒ¢–¹oçÒÍ {ìäÍP6Uèk`Ýú(¢w.MÆ¿_–Ùñkü_O2“"Ûª fü3ÈòkX#NÞ¶þª‘ù3pœÍ½žéèFDd¼–˜Ù» ;~X~?d¡ÈYŠ-ðgžýë”À¢ðôÖx /Zg-!ì×+zÄÎL¿ú¿V ûgv©ŒìRÓk`‰Àg)Ó˜?Õ¨G`óSXoA°Áè²¥…éÙŠ™oç.š¹n7/h~^ßNDø=¬1#1ƒw@‡b²æÙ^ ³X¡ã­xô…B7³÷þn®Ï¬Öbª!”`ꈹQçÄŸae©’B;ó=¸öÖ7S5üÇ. &;vzxÁ;ºÅƒØHbà0ïVîÕYëü¶°£BXÁÚ¼P0g–ßÎ-¼—çf¹®#^Ì;+¼X2À{ª‡¥®?Y9êÅÊQ»9}Ò `oVÜu¾r­/§HþÔ ÅL9ký²bÔç§“6Cë<9=ÓeÒ‘'(JÖæqR[åm…뺮]PzUÇÌ ú¿ŸDv•&* ZçTʼngÄ›xDtÊ7÷}S…&›ù™MŽ&iÆDçBÎLb¬ã”ÅŽL*1ñÍÐUH¸zrÖ¨1š Œç¬-¯üŸþü„Xaó½ œÊCÕH‡f)¦¯SyÉ “›÷·~$äXdÇ˺Pc1P<—Ê£±X)bVP4×CÁuhˆE²B[í4:Ÿaà¬C>œ¤B7‡Lüp‚©Ô0¼Õ j$vt _N” údæúúpÅ2 J|¸by+6ÆÇ[„ò-•£²%m„Hcjõ˜DJR“héSYÜ$6z“È^ðÖþ¯Y=£U ËÖ(ñàm¸Þ¢Tß#×+¸¸x+qø[¹8®QgHjXP«ìpUtª|äŒ5Cz€”G¬^ކk;˜CŸë¨ßE?ããaª²XjQYPêbѲIÄUõ6éq¤Q¡61ò »ä–• ö‘ÈüfˆèÚqËq®ùK —`;œÃí'ÝЋPúâlµæÇiY–ÇÎh‘Éy`·éGå ysûœJñüSâª<°±¼¹à¸ÿÏy¢„ DåU§’ËÝÚ‡z­nºmÍg˜†”?æDP©ƒK# _me|ÿê²\¥uÉv®Œ^Õ[ÅŽò.Õ#^ò•7ée€g2>3)RFŸ}ÊLù½Ê&TOOûÄÀØ2¤O÷²BÕùt2žv+–¾†Dø,CQúä¡Ê)ã ž¸»ªPUÄ sPý…á"Ý';\;H'•KúQéåɪà¥îŸg7K§Üä·Ó¾•Óokt8uÇÒ*»où¿«Õºxùñ¥ÁwšéIÄ [ª¢}AÓàØ‡ÿ&Κ >%„FÊ«Xñïô¤Ä# ßNqqIÝ@öY÷Þ¥>0¼º†‹ç¹4e×? Øô A,"͵“[€Ãö .H§$Ïw×µfpâ¦N ¸4ª>É Æ­bkFó¬9˱^sow6W³µ*†‡E>8ºâaÁÒç#°UïþÇ€Èã÷ ü#J¿|Vîˆ3"úFŸü7‘Ф¯(ζgW,ÌõbèBlÓ…ä,–¸µ.õïµ QÓo ÊiiÇ%(~Åþ(]”endstream endobj 967 0 obj 2692 endobj 972 0 obj <> stream xœÍZKs·¾óWìqXŽFãuMœJœwdÝâ$Û’e‰¤ìHvÊ¿>_ØAcw†Zr’ª”Ëö,ØÓøúÝÁ3Ûƒ‘Úÿ¿¾½*?öðÇåéíÕW¶ý0ìðëçWŸ=£`yΞ¿º²í…H‡èìì}8<¿½úÇô›k3“q.ÇéÝõ™ ާXe笋ӿd5Fv1ɳs~66OïeÙGŸMoê‹>Ò¤<7.‘óôA–Ù›lÜôQ½Ú¸û€uÍæ¯!ÍæuyäýômáL4áŸÏÿpå¼›MŽñù7ëÏò×LÁYšî¯o(bCóMÝ:9·À(Ï µ£„1žædíôª.' Ù+ K9O/Õ›oÔ›÷dVËï7Èß­s¯ª‚d]cÔ†ÐlÎUUؼî'ªúíó«¿_ñlüáç«H.ãíáöʳ¯¼¬¼»úrÛ¿l8X;gï­ö¯fØØBÆ9U'{QàRЉÅv¦ä8ÙO_MÕ^Îp˜¾º®?Ø„8ýêúƇ4»<}}Mà˜§ï:‹"š¥¬;xžÞ)§8}^4ÈLn@ñAí§×@ÊÞ«@"#a¿$8“²~¯IV4Ò™°ÓukË. êkõCk§3¿WÌï®ÉÏÉ€ùO‚*Dš¢÷ù°²ç`‘qÏëi¦š‘V<>ŸŠ«öw‹kÛls°ÃóÝ¢™×%Èáž)åcßÊŸ CÓÃî«ÐËeà –¡°½¿BYÇ1Ù£š”¿ÔW†`òï „<[¾ÁMQQ¶Qä¿9*àÆ:D^ÕÂF4lÄÜŠí«¯?Ñμ@Þ´wy·jÄ›ÿî!ù‰­:¿Ìµšò#t¼%ùÝYŠY"x©C«]ß(~ÌNé²t(èõfN‚úÎrGaò“J;ŸDÃ&žRCÍÍÑ#Mï®7Ò>¼"Ú9Ô»½9€ TŒ„-=ªÃf>þ~B ƒ9¸Â6Ô s¨çžSiÎ"â¥p€–Ð`DnY·¾Ü\0D¦£‰‚ß(sGžÂÈÅP㜡}JCœ«T£=ümIë'IdQ.Š A‡€jÕZ)ì‰êÏ'hïϱ¾ÇlšmnŠÞaÌðÚ©Zð¹–«‡z{ÔVÑL,A|š¾TJùpi&––KûÚâfËt iItqý¸pÑ¡ú`Ä~¬»ŸHÛçÏŠ•ÑôW!Hb!Ï­ÁõmUº\2ø#·]ïol^te©&x¼:Ä}©wÌ@/;¨7*èîúòƒÁUäß´µ¶ÞV]ûéF”îRg Ö|@ƒ©ÝÀQhtîú…bà‰7ú´ËS²¦±¶¦¶CþvesàœŒŸþ&ÏäRvÍ—":ETß?•\ƒ‘ËNV;¨ç#4`ëŽ"‘‹ˆ#i½‚×íÈJO^®æ²lòìü!xâÙgIg™ñÄËÊS2ævAXÌäcÍh—·TtâIµí"ÑgÏìQXÌÁ‡=&v(ɨúE¼1âr¥kϚʡº«Œóô*ÎyDßû½­ã™…¢Ëà=ëTt>£•ƒ kýˆ¦ N:¼]2ì¼Ë1C>}ÝÌcø¸ä܉ÿ¤öúO ÒÈèïVûéŸ%-"uÅ®vŒíQÎj;$¶=ÌèXCx D°ï*:ÒBð†Ò?Õž¶‰ÞtÍa”åù9üjŽt—…ë.èL:©9[Sjñ>ö¾M²äi=!q¤,½¨Âcj¥‹¨~qPA2]Â%3‡d÷Eu6:”½1õpFÁÂZÂ=P±Óô àÁé†ÿ—–Á`3ˆÆÍÁ.ƒE3bǼrB‘çŽÝ÷œt³ˆ¡ É|ì¸<’ÔÝ> ìhWÊ ´zy‡ƒä€øAûä³ÔØÚ®ÃpDËJkêK£¯©9Õ Tnê-haŠ|=:ˆËÓêñŽ:E8Pâ‰Ò~!Ã+*i¿¢ß%…|Y¬,ºìØQËæÑžå¤tï½Ñ ¢äç@»À{)y4‚×§Úz€zò`•Ѥ X))$C…4Êšc)'Š$C¥=¢’|h‰vÝN¶ï6&™,BÝã0à""* T(|!îBOò}Z5TéâtÛý‹JX:yéù«e]ÏÂÆîÔ³¶¾ô¨Q©w¬é;kqR~íè1Îx¹8¢‰ÿ”÷@ LÅyÞɰà5.’aG𒎳¹ë0Û° ½“a!n+¾Ÿæ¿¬g•Ùîû|ݧ©z…Ýøù@ÝPm½±Zh rÈ£EçÒpTÈ6~WXæ‘ÚtÖÔCL¤4}˨\7hr( •,§˜$wQ<þÆSîåŽLÌì³×ãòµRÉä¨Z>upv9·3Ï’­wnê‹ïåÜyv&Ëñ„œÐ“ñVӖȲ · ˜;§©‹ù°IT—9—ÄÀ2JåÒîR_U_J¥ r"†Û¾ÂÈ=èŸ6ZZ¯ÉrÌ£‰è¡}‘ûK9™M>AWÅQeƒúéZN}êC»d‘Ϻ¤ÄQL¯.+OGè˜f6'?WÛ7¥¤1L$ë­.‚ ¶· <Û7‰ò%X.×b ‰Ð,rŒèKŽc[ñN6¶®²GÕ¹H¡]-#´‹ežPor¹C ã7T×.¼ÚåïÖ•k[Ü i–ÞB“¾è/;µï}?ÕÕçŠÆÂ†…G±û9B}ß)Þ¨«O³É‘4“ו‰‹ùx9¤>ÏêÕ‡÷/äz§s×Ãl½ª(‡´±|Å[>»|Y­Ùj ÎÞµzS7oæb&Þr×™,Þm¿Ã¿¯ëuˆM·0zí[åþ¨•è–e r¼äšê˜\Øå稽óP^pî€KPC²v{¸OšH[˜b2åØ0>¢_ |¼ÛƧ»õï¢êFÕê±ÆQÞE¶SèdftRɬ-h-±4¹c2k¼w$3†Eýÿk2»_Í`ßw-@y Pùû‡^ Î¬ÑuxjŸAÓ‘ÜèÇ÷Ú9Jy‘c@gV¿bFñÇ…J#CyÒ4hßbÔ4öë\ 5Ë’ÿ‚_÷qÞ9ù&¬°–«_<ȃÖK>òwÔyùƯh/Ú;ÕºòxÙÁã —ÒljmÑÊ{H_úpHLîY´Ý`7ý1,*s¾ÆÿéóµÞendstream endobj 973 0 obj 2859 endobj 977 0 obj <> stream xœÍZ[wÇ~ß_±'fÖ‡÷ýâ§€E"ÛØ&Bv’ƒy„¬ 2Hü{}ꙕ„rpŽ}ìVmuwݾªêîù}Éz¾dáŸüÿ—g‹øç’/¿¯£“Åï žÿ`™mùpñÕž0lé{o„QËý× ž'X±´’÷Z›åþÙâY÷ÍŠõ‚IémwºZ³^J#Uwª’’KÛ½Tk•´.Œ¥Ô=ã¾»dmµs¢;'ã3Ìd&ºã´ ¶Â6ô¼ºU¾;†¯·2Ì2ó|ÿ»äè9Wzÿrþ~õÂH.º·«µ°ØÒ¦­”²»"㬋Ö„…¥T½ÅÌ׉ì8”IRpá}÷‚Ì<&3ß,=!_ös2žÐ=òuK à Ýí/þ±P=ÓË +œf-ä_ž-´bXËWÊéâé|p·äª—ʈ0‹{—"@F ëaN¶Zs.t¯U28ç’ .E˜!`pPBÀÞuÍ­¸ñ2™ÛêÁ“ÌmÒ‚Cñ5ï™R.˜»N^ìù¬{BOÁË)Æòø’Œßä13Y<~—ÆîOHÊô¯WkÍEqº]B~EØÏ ýœÐgèGyIe»ŸKÈÀ¬7ÝÓ±’)Ó9!>òoðE¾H;qf»G„ã™yLè'á©e÷ýxÓÈ~Eè‡ca¨À‘Ÿ«…Æ-×\µ)|sc_ŽW/¾ÔX*¸ûõØ’Eר“ÝßËÕ´ŒNd|6oì:¾$ã£~¦ýËjÿufÍ `d kR™©éOÚ„’Ç¡Z—:*}/”s)ÅÄ”š£íOq’ǹss\¸ŽçvÒñî—•þ¤É}Za“ ^°˜­ á¶áÉÝ¢ôµÍŒ,¯ò>¡ç‹ÚÃGÒéÚ>{å{ -ö ­3Ó¬¡s¾)ºã¥òøI0 ¸€Fs}>˜²ôà\‡d­±(L:ÍЈÇÔ+œv8P”ŽVMµ®š e%~'Ê$”JÀ¢îÌE>’Ìx;åÒÈž»x…cALÞ˜æjXÞæ0BåNß*=x49G= …ê™}ª¼r8] >-„Æ§Ž³0ïläåí3“>ÅÉÌ+ˆçt/l¶XŒXk´c"«'D)—LŒÓÑD3½kqÙúºJ¾éýOð5b«—Á×Tò`¥`¾ôà»|þ‹Mq!˜q)ó&ŽÉÕâ½Ó¥W:I[G„NÇ©yÄßçŽR!mßRÚPÒtükGþø aº c*4mçšÆTëRÓ8¡LÓ½~]MMN šM(Qà8æšdX p´ ¥À kƒràXŽ“Sо§áäŽÓ:2ÁÏ#>]¨.±oãÒ9œîã)ýˆr¹%QJr•o.p¬¾{°bg!)É’c4Uu|]«Îv4u> ˜ž‘ø»Gbâ ¡ó1Oß/g[ÛŸeÄ5SýìL¹mf8Hñ)yãX‘ñ=‚…Ѧ£™z~&È:™ÞÌ©a>Ùvfæóa<kɾ9& Xµd=¬™Ð€5D$S¬:\ç©;UÉPMctïÆë!½×¼{°C"œþ@!úm£]—íF)?q†®ÒcäVÝ–o ÛväÝþTäÒ»‘ŸÉø!Ó‹Ÿ^þü@xúþ¶ˆÙ« é²Ì·ãåãøáùq¬ KEžáO¥&¹|çÿÿBÆÿãã<ßVak8×p, š· Í Zé­Úm^û. åº×Ò§È~B°fI ZÐ켬`VB~*–Ã2ÊàçÛÊð ó&¼ïfªóŸŠæ:…ÏΑ‘w:Eï„jÈ»d꣙­þ>ÿ5„ÞF‘ñN¤ü&ÌN(BJñÿ –ï7Ø÷f¼@ó.í¤Ïðÿ{†ÿÑØ®a"ŽrðîŒOöfì½-s ØÛÌe$sIôœ™«šÌlY$s•µgÜôÊ€Ëâ8–â ÙÏèJI\ÚõÚ5\@®µ ×­³ ÷XX¢7%#\ ’ã+C>‡Ÿ¤<àmXfŽíÕ²\3žp‰Z‰^¨VS #É–ËEûQ®š!«m7sæ2dcÏ’!i ¿&Jè‹ÀăÃ&ŽÆ]Mµâ4 ª³¡ 7幥ɭXJb@‘·÷k.QÅp‰_/ó !½ ¥·…ùZÎâßø½†5˜iéõÛùp¡š¯…`ª¹¥WŽtñ£,c¸¡Û¸ŠÁN÷>¬µ\KØ¡½‰®§—`p±Ö½ oü¿Å DYn83ò( É[ß1 '¼}› Žv\Œ¼‘ `‘¤–8>Øp?(ÞÁ6òSR‰µA9±Ÿ ¯«­’éì’ ]GŸ¦d:­_§aEyº+´½è±äæïuÞÕ´¨1›p¯‹=>÷éÊô= }‹ø°‚FHAvî5¯ùòƒJ|xíΡÏVŰ|/¹ÙJñÜJÅ ~ƒ^Šÿ!xÁáÎl€¹Ge4•s×á£Ú†É¡<4L·MÞõÞÅ5{ËÉhmlô!—m¦n‚‡„$ˆxèrmè¨|(i±¤\áÔ*@¤9Û*A]ñŸ˜‹ÑyÞ¼DΨTsáðR8²Æ›:š‹¹¹Å)ÿaÁ]‰D¬—>¶Ÿè6!tUr³‡v¸Yë|Ï,ßSRÌÍ©Nã:k(ÈÓfãå\ÎQ¿cƒ8”ëJ)åºV|ÎŽýLÙêiµ'¾¦Ç"ÔpmPeX®\|ø¤ C[‡Uv¶<Âÿ›à»ÿendstream endobj 978 0 obj 2961 endobj 981 0 obj <> stream xœí[YsÇ~GùG o@ÊØÌ}¤*/‰]‰ã#‰Í7;¤(QŠÄÃe…ÿ>_ϵ=À.’IXI±dÉËfoOO÷×ÇûóR r)èOùÿ‹ËEúq)—_·§·‹Ÿ²ü Ûò÷'‹ß|¯œXÆ!:åÌòäÕB–¼Zz-kÝòärñãêk1(¡uô«wë´vÚ¬NA5ZKíWˆê½Ñ>гÖv2®nˆl½ A­®Øó%ÞxPB­ÞdÖ+ßÑ‹toâêb||IÜÆ /ÜßOþ¼€ƒ”JŸœCÏoé·Q9-Õêz½QB»ó²ç2­¼#ÁZ›ÁãÍW™$&“µ*ÆÕ{ó {ózdù†±_±ç‰¹'þݹ'‘ããÖÜ¿ ÛY#5M›ä;._ÙÁiU!ðÓ*cÀç3»Õ:°ÖQVþmkU_ÂíÈ€Õ&˜¯\œ^ºÁ몼ÏS$8„šÞc*Э²Â3H´À\d€ÔÒË\…Œˆ^1 'UAÈŠhâ=TÑ^Ê UÞ¯M¤Uê€"ÚG5í“8x3jò;bÆ›P}b,gÇ`‡¦ÉwÙ…á@aLÏZ—-Tè/Ççi Ìà”nnùiÝóóà‰¼Ì`ÕTŠ 5þ¸ên/Ô½„õ2ÒoG\fÔ—IÝ!ñ QI£:–ëL*w"gðQæÑ*x€ô<³+çVM~Ò1Z¹úî[¢;À*æd“á@¾VL{–‚€TÉf”XFrNêœÞe”ÑÉjì>Ä#Rbêä›Åɯ„ZvÌ£œÓ3¤¬VÊvÑŸ ¡ƒŽJut.'éd„Ç“˜¢”~¹‘4ñbI¦SF¿ÜY¢ÿöàŒD!EV¤óS6¼. '×Ha2È Ç«L¶AV<$U^gyʸñŸú,S͵¬x—¹nÒ4›ªë†‡Üµcœ÷ÿ5ãð©ßæ‰ïg1?3ÍÕ/k«|ì¬}µFq@Õ­’£ðÕÆvïóˆäô_­7Í ”¯q¢.aEÑ)»°úP‡Ñ\éOk öh)µ‚Õ“Ÿï”5…Pág-ºn”«6ƒ‹™A B‚%8QW(Q»Ní0™’A™º±©iÊ£C7ŽÚç2bR¨“ÿ2æux#º0úkǮܧ|>ç#&’zMøJnÀ8lB|g£.›ÃkÈt”~„”BÇc³œwª“2—F&r¿ðíñ§ÓøìøäQ><ÇWq«¦ŒH³4‘h)$X{X)¼=¬­&¸ý†µš•Òq©œ«Pº†Ô¡³†5¤˜M¬|LCj] ñR•NAî”Bí_Éd ãñ´+H/Z{4ÝÙΑíMÏÆ†ô#µ©!D§ö£MÚ8æM  &†¼»ÍÕÖš”Ñšh4¦Œ'…Z<‰UÙùØ%hQ¢ñâÞ¶¬Á«9»Q˜³pr¼ìàU(—‰¶,Ž*W¡tðÂBkм V+þqðÒèËä.¼Ì3¼ž^ÍÙœ݀ƒ²Ü¸2p ¥ã’> Ýä\…ÂáeГc­Êá…‰< [Âpé.¸Ô3¸ž\£«¸ª«+fÀ"á.†™J鸂S”>W¡tÈB?‚F—!ˆC‹×½Ø2^£¸O`Ë>cëi±ÕœÝ(£³nœ7u3£à¦P:.¬ á3ÎU(º4'G<Ži? ^4åvᥟáõ´ðjÞnæí† ÈÉ_…ÒqÁ¥ƒçL™Ð¡KqºC—¢Ý»Ç¡KŠÁŠ t¹gt=-ºš·…y»áFqºCW¡p.X•ö•W¥p|Áª!u4J~ˆá1øÒ)û]|ùg|=)¾Fo7 óvCŽ'ÌñºW)—E0®BáøRÑ(8¾,ú8ù8|²qÁ×§dSÔø»-ð7TÞI_·Ì“µئFçLúÁ{‚#3Ž¶Ï’páµQÝ L—+Ær:n´Ýã(Íh,ñŒœƒÜF 5ˆè– Fi_öCOÖ…RµÃ;b€Ô^Û¶+«‰¡îýæmS_SÄĶé'š€JëÙÔ[ÆÎ‘¸È«rB6Y?!:mNˆ®…i&ü»Ž&êùC>7zÞNþ_ÝN~4ʹëQÿÏ”·ò9ÈíbjâJpèOH\H?Ï5†üìQ·ñ׃ֶ=N°ÏwMèL•näý8rìž±” ¤*é|ÂüHövW?.Œ,å<ˆŽŒjž"öÒ8ªVY¡ªE\¦qÅò^¢t\°#æÃ¹ …—F„VÁ$ëá•QyêÊ~ê‹5`äѹÀ»3½18iVo“e¼Ò­¾à‡Ð¼r2údYp´ªð-œ¬ãa÷*xÇ4«éK jðãð»UQoü'nUl¤’ƒÍE‘ÚÉÄôeš_¾ÀÂঅã-¥zQ!ïrù€Š<¡ñtõž8€iŸsSæ>.ç¥#YÉó)‹ízld/J¬¦Ýð°q¢,Q‰\Ë›©±x-åúJWÈ×gõ0¼YÙoŸ¾Ï”ôíd™XÚY·ìrÞœ‚ü0›?Ï\3AS˜î÷Ñ-ÝnKÍ1 Ûw \/–;yz}ÇÊﻑå.ÃÌÁøfÔ%]V7ò«¦ýuzU+» a~Ÿb }·q¦?}137~A‚‡Õ\qd×R›júð`·3¸7ÛE¥mq©„?‹Á¹þ…—^Ö=÷…ÿ?}á òV´AÏt_ù÷Εò\z¿/rÖJÄÙ$wš[Hë‘-dê½§Ka5ÙKVÅn )ƒðèÛJÈ%³¦´Q5JiÃÈÚ'ðëQÔYRŸ2ÑYG£¬åÎ2ÅÄ5w&<‘ Ìβõy­Õd}^m%ÝÑ|·®RöuƒVÛ©nЫ%–îƒå|ê«d©#9ŒÔW”‘^¿Ì½ÝÙJ~B‘õ²Ü¦BTÀU0\CÅ¢µˆÉIFÒÉjÎe³ã=ýZÓ÷ëKb0ÈIŠ3P÷&Jãy6ŽÌG»Ø;¯ª€6´¼š·)Þ0g\3NOÛ>¼°:½Ç}Éä Œ?ëéNè鮚y¨YùL‡ &Ÿ:G’UÂ6?dgYźÁ$gffýnü«ö^›Xþ/î‹èZ»îá"Ù4"·^³ñŽÿŽbfl#mOõcçH²2x1}¡}£=éúh;z³ÂÄÕ,6™[ˆòVã5…ýçÈ"©L%㢪¼ž®‡…ÁÖ”¬"ªáŸÜÛ“"_%íQk|¹O@”Æ8ÊF™˜Ü(K)|6óeJT#[!ÓÍP.è1½í˜=_·¬ gí·†•âžNŠ+|Ô…ÏT )0Æ]u.ï°2ª^>ÍÝð„2Éò3ëÞŸï]jtꜙ~¨ÎŸl¤~a­Û^æyoÏä>«®#VÑÛŒ`EçÑJ,ÑnhTRt4ZE¤j×(øf"PL“P «r­8ÝUzï•ݽiÏ*ºÝÖïÇó\;y÷÷HAÅd.´ÞæÅZ“£55Ý*gV4FÀ.ñ1V4TO²ˆÑŠ’|ÁÏÚõ‰åt— 'B2¨°5Œ¶SXY‹¨¨û`œ’)CÄên;Éh;Ä~SáfŒÙ‰$X$¥Â=ר³_ïm!L Œý=RÁÏ÷ N©nÿ= až™ÚWlåõ}n¬«±òlå˜iÕÉ,Dz9“þlÔez9yPº°aVúÜÏ`ù›êäæ>FùPƒŽa<^߯0`û6§ìt*3Ó£í¡dÆ­s¾Ï–¿ºÉ‹Œ4ߤ”£½‘å¢~æwìùÀÀ4“îæfÛhn>QE¶Ã²å=)£Ò!–éj±TZ¥‚R(H|1(•„biUŽGfZüãøÜ Ì%…zæÑ\f%)"ëê%›êéÖç×l‰û&7 £z8¹-+3T!ö}¼¢óôrC¹˜²,“ãÇéb| í‘­'/ðï¿ )\endstream endobj 982 0 obj 3170 endobj 986 0 obj <> stream xœÍYK·¾Ï¯˜c ˆ²|\$Hâ½Ù9XV´ÞØ»++2ä×ç«î²zvf¡q€@ÄaÙ_½ýÓ>†´ögýÿ»ûÝüsŸöì«v?íÒú#®dûÏnv¿ýå¸o¡eʲ¿y·KëBûÂ)¨æýÍýîëéw¯b ÈÜÊôã«×10g–é[ì sâ2ýËvK.ÕÖÌbjÓ{ÛÖ¢µÒôàÖ÷8± HÓÝr¡*›ýõö"mºËµäXbþûÍ—;à) @ß¼Î?ÙÓF™M¯^SÁ îíòêÊÌÓÏn½òÂT²]Ì,¡àä»e»&0³ HÔÚôƼs'IpÛïùƒ[Ÿà}¦Êû|åíXñþû›Ý_w¢îÙŠPZ)À¿¿ß©DÜÕúλ¯v­d¦}n I1¥@²ü´çبòx®DÇó³”òW5ÅÝ΂pÞ¬ÄÎI]ÌzÀK+K]xI”sZÕP²Ö™s“ÕReú¸hSb.‡5GÉÓ‡±ßå/ŒµÃÅÇžH 4W Ü.çN +Þ2÷Íäà~óÊáýÍàoàÍÿêÈP‡›+‡Ìýqr*]Ž·¤PËàw°¬Óãf¾Ò¥î¤ ›„¢´œO)Ƙë è¡ÐbJN16,b< z9G8ó¤Ó*PøQWÁüã” €2–Ž*;Ä,ªŽçÕdq9b\›nß:©z—øè°Ÿ‘ü†æƒ[ß9wz³xœ¨Å=[ÑÑA÷Ò!˜Ö ª.ˆ ªr‚ÁÛSà2žÃv5_,œYó5ªdBÂ);Dl°¶þ9«‹K#7BH[ÄßwQ{…͉1µÔr·ªt¿.mˆÛÎi°‘CšÈLpÙËq#[ÒbÂKº4ðЂ+å Î)9ÎÛFÍõ*Û¨9T)[Ä]ÒÞe~±p†¨S†x%Bí±«]R"œ`°C¡ ¹<)àü*ЧÂöTRàâr¹™eî9A'ƒG k eÀåf—]—|à('|p½pߎè±’¬:}·PÒé@"…ZÐ!ÿ’Q`yŽ òR ×k¿œ¡C®é Ñ…ØÝQc§Î±QC’ñ\¸§´ ã<„ü/5 <¢‹JB†¾\¾8¿*k õÿ=—§T«´ñ~eÞ^–)Êñ]£.ÎC5ÇèòÀŒó(ªÚ&Ð2¼Âê–Šâ@çBZ":l¬¥òR;AdOóârYPîÍWÂÀ¶¦0Wb« U[²ÎbÎXFeI&vèI¤l9°ÒÇÂr§±â§è5 î×å†ÁÁ kbd°‘½Š-¶&¯“3Íɨ##ªþæì„-™¦pTk9ø:µ+`ã4íy3YÉ®YÑ.àq›sñ„”¯AÎVº—óÿ¹'ô|P7·TåÁ³SÉÉne¤ ÓÆ‹~˜Ó=$Ú’+¸cr²@I9Ï“’Á¸ÌUÓ†aE¯q#Ü€.áLîy’ö -®Baç&ŸóÈÒîx‚…2ŠÀy È6}S<“)Žå<æ+M´éDç¶_§d¹J§¿Ø`/KãÖWà\kZƆËA$tØÇfCRÔäigoJ…‰¬Ñ®eaöÔ³êð’✬I›#j2“¸U¬€46æ¹à'Ò üÆ øû±cÆ‚íy¥ÕÓy—ÑÚBièÁ(ó¢´?TµBV³‘ªàxµAö•‘ Ö1hBœ’ _Z[Úö˲Px„ðs÷úUèK+Å-«ÄÜÊ¢9ت ¸säï$£Ž^<8=nHÓDRÑçyí¢q|öÇçA§6¦¬^§ëÆF§VÌ¢a¿ßj¹–g%†¾ât '³ئ¿(šg‰}aUʧyα@²ˆ/&/›l®‰º¦²V´P:ˆŽ 嶈‹PÎ]€jlÙz"ë‘!ºuf?Ó~°çI‰f[_qo¤ÍêOúí x30¸÷>Žé2Û/ÈzépEÊýŽYïOÅ;¸Ø´ÄVÈ_r»\Â¥ÑA0ó:¸£Ï¿&÷oz `Æõ<ãÂ>Šˆ ,šš*A/_-ZÌLiQ†4å5×,/_Õ%BrÈø¤[wÜÿo_juˆ‘Hlykui¼ª¥"÷m`¹ñS>3»¡nÁ ý¤÷Ô•»nœ{uÀƒSjGøÞM×su›‹›¢£1;_0¾ V ViÓ"=Œ;ž|ù| 1ŸN¬üÞŽeâ‚™VtæG0;ll¤T,z)î¾"˜iAñóÿÌOF°Ž V•î öüãHPOµÑex¬Ÿ¤µ‘Øï·²G3¸NH²­5£ü+ˈDÑ•hßY¨¬õ®ªÆ6Ç÷T/¶ífE“]äW°íѶ3ÛTÄæ@žP€!{*¤{Á†ªK¶Kq#ýUŠË·¯Ë_7>•æ¬Qøø X9®à6Ç6¢éú>ŽeëKAoñïð4endstream endobj 987 0 obj 2049 endobj 991 0 obj <> stream xœµ[[s\Å~üˆ-âUÊ:Ìýâ ©2ÁÇIlA*y°e9H–å€þ}ºçræ›s‘W&ÌÎöL÷ôåëžÙÖO1ÈàÊÿ8ßK7róõ8úqï§=Y>ˆB¶ùüpïÓgʉM¢SÎlOödYàÕÆk9Xë6‡ç{ßm¿ÝzPQèí‹}1­¥öÛ«ý9g¼ß¾Þ?ƒÖÖ+GüjO1çHŠÃcbüWþ6*§¥Ú^ì(OÛÑÆÇyã µÞ¾ƒqa¢•wÌ„FCr{’§ƒô¡ˆ'UŒU¼´ò5¬¼h$L—ójkê,7,biúH›“°F9¿½Ùë´Ž.T· h¡£y?ÏsŠ”Šõ÷èpï{fvóóžW‚,éýàåæ|ÏA”qœ9Û{¾î2l¤´qjâ.Òæ1d·ÐIjå#™D’¤RÙ$MF“RKØhZñ EÚ¡Yg”Rd³q˜Lf¤‹:›ÌÛ|'›Ìc•¤Ó²Œ l²qáë¼Ðûà™ ´ÓÙdeÃ++é¤rYÒ9ï-ÒÚ³ÉØçMÞd]{Òo²†²ÁAÙ"_üÖjålèh KTXcyžÉµu–Möé3kìFÊ!Z+YÝ&  Ÿìþþ»í³†<5ïXÆ/`|\ÆÂ%_²R62…•v¢„b!¸ÉcKn“E/ó/aþ-Ì_ÃüÕœ>_Íy›çóQÄz–‡ ó;_Ãø¶½€ñÕŠxø”j ão¿š/Mäo˜„üY«í?Wv| ó¯`þ´W„Önû%P5ha3B¦ÓÝq>Ñ¿*²›°ý Ùp"Úís˜¾€•Ws f\ßýË©:²Æ~×\äÑÜÌi%Êþcö-GÐôõÊ‘ÞÁüñí ÊxÌÞb)þ]Ø—hdÎÀ¨g0ÿ8™ØÎÕiT|âôv®Êª¾0Oaö¬¼^1åÅŠ0Κ²Ÿ¬l´²åÕâ,Ð'ò 2 ÓÈTEëHXäCÖtBtm¥'T“0. ¤ #ÒIJ§t £õÑ­!è~“1ZGµý‡”R¦ÈòBHWµC'WÝ&E žþí4¸ Ó’f¨20Õž*J.|-µ¾ßö°MiIwZ0Tê(+ýÇIAu 'q*-œÕ&¬°,åÆX—ÞOéš2g®Yfœü ƒº’_$/.úíGo÷ùLVÕs“KRr½nêXäO)HRѲ;{2ó(í/™öQ-nNq„Òî°»¥¨Ìää‡ÿYÚÒùÐT}§-¿ËHDúÒJfhÉÂoo®§^“µ:½lªnÃÅSÊæ.¢J›mXÄ3F™…é$õÍ御PWAÕ¬š…ôeeù“Såf‚_,º"çÀ0èÞJÁôŠ0 ô‹Òh®fÅ]ô¥l+y¶×"–‹Š§[•ÎuŠ$0¡3úKV’‰t­ÉŠ6t°e©ÔÀ•ïDGѪxM³8Î/r• £Óh¤Zß,ª‚®”=Ì%E…$—ý™†Z¥:<;ô2ïåá2 ØA)ÿë|#•oæ>Ðt—sïÔ% ({¹:% Qöô%Óá9«"݆`Ù²øAÐÙÖ5áü-šøÃ݇ss9-ÆÈà¶ ÁµóÆ—+»0kw k c7wñî=IéèëQ­œêi–;=}¿ßo—úÌj©ˆÄ¥êGµ·W5ÆDº¨«šTC£ Ò*ç¤Î†V•«{I~FYŸëº ±TökV+ÑRÙÆ€ž(h%?PõH蔯Ù*?¿‡R…i£ÌŒFÝÑ`©»&ß9³ôüа=i…(Õ Ôù®ÎCAÕÇùŒÆæ‡Šr®—ù0RȱlJû1Ií4/TõUVþ°ÏjräÞ§™‰2‰5¿ DÇ7úÞ{aX9ü½´é¡Š´¨½¶•3Å>JY´$£“K·õæîÍ.åT¯ò~TÇ­ÏÎÁHMç˜ê\Ó¹¹M¯xœX옾ÊBí]ÝXå»o’ßIÜ—Ôõù7o›˜b¤I=qƒª]$¾ŸÙ›Ø»ÁUžÎé¤M¿iÖÂi”dö4R\x!dHÂbÞ¨:î—¥VfM Y¤;:):Ë鸥x׌„7Ì=’JOz5Ž ÚvH‚(—>$½߉òQ¾ôØèL'8j纂OïÃ#&Ùê•‘®‡Å+!BGUE´Àø5òÆ8¸7Ç¥ICÕSòb_gmvÿ"(ºÿ‡‚fSìœ ë:Fýʬ¶”|ë,Úà—&,²9«±ç "0NP­çœ_Ź+žžñ¦êo¢H²Qì7CA‘áå(éeÞÖŠ–…£Ú¼qx7ž3š C)åh9°¯Šm'yÚ¹³¸tÑÓ°ôŒ$Ù剩µÕåXG1žlŠñÅxnsëÂ~ÕIìTõÊD[B(ênYñì,O÷¼7Ï%æFÂÈE¼éVz‘2¾ÙÜ­áú÷WÍY‘d ÜÉîadkJ¾”»[¦:R’J™ÞªÞs˜’.U\;B¤¬`õÑíiÀ÷i Ô°º{Hèbô[O‚\BÍ$Ó«ÞÊ}nK\ ìx°`4ÉçV¥Ðà_øÆK>V…]QÕÐø ü¬!pIÇ!†U¨Õc:䎩K“¥C‡¢yðêo)Ù2åžQ”ÀÓ÷K4j[€÷nt]«_ö¦ÑÞ+hT'ÆEs…Ê»^³R4LÜV¢¥g9›ýÚ‚Û¢BJ¡¬4ÿæP ad²œ¾×*^”ã4¹»RËùánèU•¦ ñš§Ù¾p«µ$¢·ÕÌ8îèÖ7^\‘×M\1kc©/ÕrlìHVnYʳHè܈äRY¹‚Ôð_Ö©óôý‚"ñÇ ,jºY³æ¥Xö¼m¦uÏqM5®ÉË,x°«ÐxŠ4É]”Á…ŸN@UÕKC‡™\²1ìpQoÔ|€éêXÀ±¬k¹ Y½S«ÑÐ_ystJYË…Iµ\“[ø¥B£a<æDc4E¨îi~ÞOÏý^u® jòâxPy£'ƒŸLÒñèy³3¿âxÌ0s@5b\ã…ÈÑôj2O§ËöDÓÜϽ‚phÌq!ûdÿ¿‡à"ìßfñ¦Û.“VHõÞ”—ÕÚSö«*¦–ù†¸xqÔ;$ˆ¨ýøcøH%œ*œu»ÔÏõ¹á®— ‹‰kWV/œ™ ÝnmVFFÕY´ýí"B6ÿ›^KU/úŸ¼%ìí`\_t‚½Õ³¹0IS.Ý3bž'™‰&h¼Hou|I+YM,fµü¾q…y‚×9 ¨ŠÓ…K£›‘T*`–À1œ ¹ÌšB¦x®ùRW«©É]«nx\Y ºýüp3]¶X ¤ؾ´X}f¹ã•sÙYº•Ê –Mm…ëUî¼–(÷„<µ7ÎËc·Öa3iêèɯþÛ/xlQi:=P¹ý ¾ƒ˜]Ü“Y{e_{ƒÄœÿž#–Ò!ƒlX{–X½{/úß‚_r!¼ð¸_ò`­jç«VÿÎß*#…Ý“dPíÌAeúáóf¢G%«ŽÄÁèJ( î“’’Ó·…4Rå ¦û²N§¬%ð}±–”tü‡OÿÌŸ](¬ª¬%Åñ_xšJjCFÛ>…Õ šýq’JPf{È)S’éOݪô³ —=î·y覂–ybÓÍ?oñÍóæ YV#8?NöÒ.Ûošl¯‡ÙZÓÝüe{VÍÄš¢?Ožf”°ÜÙÅ"·ß¤>3M´%hðg5}„ÊÐMŽ6J-©Új*jîÉ¿wxcÚbd…µÜP46Õ lª}HDd)[CRù€#¯6äFƒÕZlßÓ¥ZCÖ·û‘ Á? c'v aïÒµÞ«3 YhFêz²ê¯’&.l”—fYd‡ú9kk ¯üFYOùUsËVñ’k ѧ´\Ùrô,}Ë©ÍÔÌÉv¡cŠÔgñàãa•ñš¾ Ç™—<ž”:‘ð‹½—ŽºÔ³`ÕD~ÙšÍJËXúõIæMwÞØfÔlçgàœÕ¢–[¶Á¢ùsgQÃÄ¢eçø¹Z ʆD1žHÍú²3Ö«•ñÊãÃÜÒ£äSÛ€¥É³xl/ù,bsÆ®x²¶Vf¯P\Ë> stream xœÕ\[s^µ}wyëø¦ð™ÆÝ/¡Ó)4!MƒK‡B;'NâÆvBâ@ù÷ݺ³t$ÙŽÝÉÐaei_–ÖÞº|ü¸aß°ðOþøÇ ß|5·žïü¸ÃóXÛ|º¿óÑaØÆOÞ£6ûOvxþÀŠ•|ÒÚlöOv¾ß~»ëä$<“Û‡»lRRri·¯v÷øÄŒ²v{´»Ç&)µ%B·¶Z¿=‘ÃÐV†Yf¶¯CÛZ%­ûçþ—;ÒʉYKZì?¦‰¿ë…‘\l_ìî KÃÑÀÓÀNJ¹}í<‰Ö„I¨59ηOR·ãÖeõ¸ð¾¨¿<‚/_,"tŸE­5 n@ñ÷`˜ú”9'8ÓÓ¥ ¶{?Ûßù뎚˜Þü¼c#Ï[;Y¾9ÙÑŠÑX~î9ÞùfFî6\MR± £ñ4¸w)Œ2úZXO.=.ô¤Ur2ç’œ,EøB“©×(!ùxnF+n¼L.¶z¢X'[§´àdx†R.¸xþð(}h­³a– ˆ“F&磋 “„‚"ûß‹ÃHi9y8ˆh©Æ‰žÂˆÑÅÜkupñG´ÒÎ'¯5îQŽTÔ¼»³ÿá÷ÛÛ cJGt,íhßÉmfìö/»{šËIûí#è=NmMÑŸG ý¯¡ÿuø2„)C2‹¼‘WYDŠò,r8g=‚þÓÔ–L™àÍÅä”ÛþÜŠG‘3è–5Ðr»Ýw@ü6ôß^Ä ûÄBÿShÖ®™å§¥?Ä|íu ÖÊi˜ZXõìNŒaðFèl‰ßAâÕÀË/»_îƒšŽ¡}Òz°Âu•È+ð‹ڛÅÉßB÷Tð$·Ÿ F9iMŠíSh?®g Š™í7 ðq¿Ý Ó3âºÃ¢ Þþ°m§Œ_þ4P}w<€ÍÁ@æ0a;@ñ|º,´ûÐý ´¿Þ鯸‰ SÒM‚ w”+ÕØ-ñ²•3^ÊFÔýí4ü‚£ƒÁ— ý¼ä Œ—hµvâZ½»´ƒÁ{ÅâKçÉîO`ù¼ö´ŸµŒÕ,š×Ðsi‡‰Ãâ`¸‹ÚaˆN»à¾'S¦ù0E…3»ýF>¬©cÍ•#-´•84.]œ<Å^/=Bï²8j€9â°Ö ÎJðýŦÏK×Ñó…0¾j'âoZÀ¢2eMÍý7W -&É$ßìeªúó%<6°ûUÃŽçåÉÛ òfàa4™ýdìùµ– 'gî¡RéÁÀg_6ô‡!|TçaôwœÊŠR7S †?žymÂŒþ{4Ó*ß3<­—–§Kºݦ:}¡×Äz·2]‹ÉÏ›d|¬7fOÛhàbi¦É¼Œ™i4j¯2‹>˜AYñEí°š{ ñ°u{Sb ÿâº\•†…<î†?(Ö©ƒŒuä1ÇÆþkšXÛ¯ ‹ïqí£n¦A¢~> Ò Ì‹ýXþ4 ê“'™'Oª´ƒÊ"D|•Êê[`éWÐÞƒá Ç ŸÕý% =÷ºuLã0¬á:»ŒØîX4~mD]§˜Ãj`Óæ[Œé4èGä¿þN6kÌÃoÿÔêÓ$TÄòâdjÝŠ:Ï%X•. y@Ñò%ø6—Ø\TÞG¯ýk7ˆ÷¼b…Ub‹<³`oímô îGž´ÞkVЪÎëÕŸêof †_¦}X°Ð–^H?˜Ä;™µáôßÙ%dNû2&Âਕirk‡ä—Ä™ €Ûƒ© ¦ê4dÞ!í‚Ö°ð?¿iŸœÔÙ¹•¸–ø•cìGóÍkXÔ'lÙ—˪ÃÏ]°Sö£ó­<·j¿¹Xö9tßqLȸ-Æôòûš€ó!ßrŠ%Ĥ…-ç"·¢´ÆgDI§¼Ê‡aŠ;#sÙ®¸5Ü–! )íĵ(å£gªÚA›AÛdÄ@~0~ר½¬Ú^±zÞµr«˜ŸO(ÃÙl±^ÑÞàYê–^$PJŠŒÊÀ"ãU £b4Œ½ÐAÚLÖyW<ôe]0åL’V$Ò&ð6çEú4HKn¹ëMõ$Í[¤ÿUÞeˆÓžÝp™‚ŽZÍÉí$„מó!ÇC–dw~ŠîW`33~ÃÞœ’%®â“pJ§b,›|’N™­‰9X Rc*e^zéòɧ5Ú±œ§³æ¿IPÔÞ¨ÒO”R%”aH;i¦¶_à§§³.¹%JzÈó,OÆØÍ§Ã *•‹eSè¶"fÈ,û¢åRÇ4SǵÁ=÷†$näItJò O9ª©¢¬¡ U¨„‚±\ëÚ§»BOŽåA1öqj}¡B™>kpÊ[ÓF<™N;ïgR°:T’“¢%ZƸ©˜¢Ü`zÒ¾!³É³ø¡ã5ñ^Ä%†Òa3j“û¤÷š—pI;Deœ¼S#—Ž\2û]¨”dŒ ‹Ä%BŠ8Xœ}\#8ŒÍÈ?罹¢hÂ9sl#êMWtJ•Aìdȇ÷L°ìÀaP/@<~zœ†T¶»qMJ«x%A Gð®ô¥dêè2Z¿,üÐÇX‰c…±¤ùÞU¨y4Óa•—#c­(P˜Þ&uë€@í š÷²œ—ÅmŽàùÓµÀ¯©êHÒ7·L´'ý$´i> ëH@;_îÑÒv!ÇÇGÇ·ßîzÚH‘OÙ©láÎ ×Ê, ýDÐUÙ…ÔÔó «W~2n#|¸Õ–áv•i²sî—«—•±da}¼´=Yz¼$®Ñ_ÓBÞÊ×´\‡} ÞЊŸÈ³ñªöÚ_®?…Ðhôl¨PVÒ߃‚sÏÕ”в:«¼5pyÆxH¿½€Fñ— ÞÏ C¢VkiyX¥—x¦Ð(0sî3KD­§­F4wT%}Âw'MŒƒ§\0)³ å5±IqF+Áè¹'IiGù¦’" [[Ioºè`~’&:…WÁùȹÍñtMnåX¼$øtö&'¶™ŒG½…ܹÚ:EŽ¡Ò¥\í€k³3×x¼úíTÛèÊ HÁüü6Д7c ©‚™™FƒDÿiŸÈ¤L¢@zÀ³àÑQû9—”s?ŒÙ‚yöÚÞf£1;€9wT`Ž·R˜óØW i¬H­H¢ÿ±\ÀÌùtÐÆZ²kK[³âk(]8 ø;¹àa!6c{uEÒ•ŸÚop!0ï¾¥x{ƒõRuÿ»v4·)Oýí‹tCÓ1&¶q®r˜Saf^$3fÖ —M8å¸lrGµl„4W¸l♬ºÖ²!hØL[÷¡È—ô”&  ³…” ª|øÞgº¥‚8Ú’{®¢”P”´|¥Ô~Br ¯@5”Q“ô×Rƒ ¡/Q‹{û:¥|Úëp¬Y¿ÛmYbŽSÅÆé|–eþg,±:©¨XâÉêœbÅ(«s LF–ö¯®åiHc«ó=]ñëR¥€—ËQNç¼8*ð²&‘øzˆ²ê…/\ðTÛșԫ½±ƒ¶\&áfÍþ˜ ñZøËr#ŸÏjœ§ºÆþ› UuuÙã–vZ´N«ÛœwçÛÑ“¼z9sÊ“6M¼:·xlåŸØi|Ç… G@«8^Öi7òµ,WUÀî\1J†—l«ÅqYLµ^´gê63Z•Õ2£•&¤ªsXî¨ró&”É'MV»N#à‘39Â!B•à ¤&E^¡4qAv!ú ¶ÑdÒ"m*ÜäìÜs¥ôB#Ä!@m<`»w+Ѻ+>¹×É6³G×ùç:ÙU{'E)‡…)–úU½`kˆÎnXƒ!ÊhÃ’ž¯gˆæ„(÷ڮʬ<ö5 Ê=QÏý4–ä$íêøÂ¹ZRNáø…±pf -ã‚:¥çJ…–!ßëZ­+CpñØ”×€`¥Ú;`j‚hv!¸¸a J€ éIKGAcE ÇW<¡ÉtT³•5 løT³ýcþ6à³~.Ôïü€£~¿Â_:Ñ4œIZ¼ªvV¼çþÑÛr¬dp—ï2°H¸±¼'çkmÂ6¨.)°®Åºê ¶·¸¥íÌä–’ ª”å­²“ w›UuùAkmóÜtôä¨Õ§ÜC¦Ç,ªZ¦ƒ8àq>T½"<;ÖðVB]ìïN] HHþ>¿úêŸ ,«­bQÝ ©y%wT¼B+{Å+yìëðŠve²+ðJÎ,–Q•å¶ÿˆK7\VùKóÐlÏš™®ÃChÏÿ±5nÓCæ†'’4ïK‹>ÊqGcùQ n¬fi]H«ZzÌ#ùYžê«¨û*ºµtúå•9× µ´}+iדšïûæö`ç3ÂŒû5G #Ho'¸VÊ®ø€‹pŽ|F–W«) ÂxY?ËbÇÛ¼!ÂÃw<¸ï¼& À8]ø05m×xܦQU¥ÜÜs¥mZøù©«íiž¼gÓVzh.ú™0~¥Ÿ!ÈóëégÂÖåýÐáO[ç ïD˨3"*޽ç3*jø+dTd= ˱K¶ªð8gôcÆÑ=Æß5þàqõÓ×qUHž\íœÑÛÏò[‘ k¸ëØx·í?÷émìµv¹–šÝ¤ëñÓAí½úî,ƒ¿`ìÜFÅö7Ð~Øx-ñúË‹+Àó¹^¡U6¢â~Î]¸YÈ?w û{GS‘ŸëˆfàEAîÀ “ހ̟Дym¢Œ—ý$‚0Ÿ'¢X¿ \ò.Ĭ™ —s‹ZÑβR“{d%ãñʲœ]ºæÓë°'ºâ¿,èüp¸yMÐùYÀz+ÕÀxöÔ×€boÓAéŒâÒqY™¡ÇC¨Úÿ¯Á'¼¤Òfb†åƒžþ!Vù~s6ŒmžÒ¿ÿ L ªendstream endobj 996 0 obj 3718 endobj 999 0 obj <> stream xœí\[o·~Wó#ÎãQ±äð /½§IÛ4Ї¦JlËNl)qì¸è¯ï7äîrx÷è²5‚EštE͇œÛ7C®¾ßievšÿ™þÿëWgåÇÙ}²<}{öý™™~ÐÙî7—g¿úœ‚Þe•·»|vf¦"í¢5Êû°»|uöÏýoϵ"mmŽû—çZY¬Û_aÔYklÜÿÀ£1:?[ë•6yÿ†‡7Þ„ý‹ú¢÷ð³>%Ú¿BÎ.O]Ž~]™GŒ>-\‚Ž:üëòÏg6Z¥c„ —O Û_ø·™‚5´¿=¿ ÆèI"Yk÷oÅó$¿¥˜1žT2fÿ¬'ƒT) å¼ÿJ¼ùB¼yÛH”žÖ«³îÉ?lêz‘&9Óu{‰cNËkªŽ™]€í©*ÃT°µøw$D]¡]Ð VF³>yÖÛ0{%ͱiq”Í ¦½¨Î1ymð9Ìþ†G×ÑŸö7cBøéðž¹³6.ŒÏe;.ˆ \}÷“¢àlL㦰w6³ `ï(">½Aé¦XôM’·í-Ø^s¢~],ÎD“îÊ–g„ºñŸapÂú±.?§²Ç;ôœÉè:.¯käòÈ=]D“ÏO†ÞµÂð>^¼ ¹°%¤|ý"6FÀ•GG¹ ïÆR½Ï’ù”."ìŠQÈüj±“Mffj7/Îû8ˆWõy°ÓåÕN066Š ¾“fÛš$„3t¬E>› Þä7OÆÓ#ùŠ [  ¸WqaO± ó1iÆ|ö!õ>›!_3àžÔ;:% N·¿dEC€­y"Ì÷¨o¦Øe©éÉ.FXZë 3‰ ÑcÿóŒìRìÞ“Äßu*çÉ œHÈ'Wð B;¹ÿÆ?À@óS!#Q»Š2Ðå§g—¿dÇHÛ©-ÕV²óÙ¯ ÆužUA5k†•==gå’ö¦Z "¤Ç¾=ç炱ޖ(jj+k(Ì( Ò’\YE²ÙAxòõØe³ð*åe„³g†4 ™Ø¹œTð šG@…m Õ„s&“Ú9æí CÉ¢ŒYF Ó’RGÅj´ÕÓ6X(ã³àr§¦m joƹzÊšHDÔÐ$eØŒ•¢Æ‚ÁõË@1¦¢ë¨æð÷\ÆM‚…Ò:ôËørߌ»šŸ·Ý&ÃÂÌh~àZÑ{ SZDÍ€rî%W=Á#‡¹©ÖŠò8)„ë¼®«ãDGû_6×JbHeD¬ùÍ«–Ð_Ÿ»Œç”kX©25I‡rÔ}'F„5;)ÆÝ"%•øqâòmÝF@wìWDp~8 K w åà#ná÷åyˤ‹åäW:.á|ñ-j?>Â0à}®pDÁ‚ Y c%Œ}ÐÐJ ¡ìЧ"{ §K2ùË |ÓNi eoW‰uñ÷m#n…ä ä—¤ûÈÝГãû$S×@޹.ÆŽŒQÅ{ff®K«2½¿:Çï5Û¸!·¡¼è ÓIvî6 @G™E>¿;&¥j²¾]žä{}‰dríÔd3å¦ÈYðG–¡? 9Ô“”àIÓ™|UªPÚYìmŠãâÝLÅ{Éé÷¨Þ%ªk±¨±yf§=;Xç2PBoFy{¢„tÜ=4òÂÃr*’öhà³sk:¼.¨—Pë‹.\7.ùˆS!‚܈™Åv<k•ÐñJŒ¿:†”eü£;à¥3ÜZ¢šè‘H³ ˜Åë]çÇÏê°O¦s´ç­é±¼˜çÖN±Ä¦ÒÙ}ï«·“‘ÛùUqŸ5ôEm–î!ÄÃH奓}»‹Àp èÛq:§ø?Ðü¹͇'ÝF¨³aÀ‡6 8ÃI °#AçÌ‚T(ù§; côdt›…ª?ˆŽS·;yÊÂ'ú0/&º£C…¡Fú9ÓjÂŒ¤`k×)$Ï ¾_MY—ÚzBG+µÂPôòƒÐáÚÝ i5×€-ñ€„Ò§E0)#Å‹À™ã^\” #Êõ¢ÑżŽ:S·aÅVœn üjì']0 çu„ e^9üwóÉ;¦">ѽ—m ³¶ò›£3ö",ð¾-fåÜ=SºßLÒä¸8»¥²„½S¾ÑÖ/¤úšUí˜|TuF¼æ#Ò8F€lêÒ8À”e;‚! ÆÖr° å–GôiÀA[x* ·šÄ®Vd>6¡Js:ž°¹†å¦X×·âåÉßsxÒ.bä9]˪ï J]ºŸ¿­•ÌqQ?Ý?A"vgr¹J_ï)G•hyÌù&ÞŒ•…ò~Ú_YɈ/mlÊ åæ×(vwùwÞŒª¬»›ò]ad;âd´a–@jÜZs©µ§³KÏ=é€EoÒAg·ÿ¼èš»U²–í®— §]¶ÒæÐ8íïœ3Gåô#¶£Þ{ä¼°´Ç¾:º°Y\ï¦ Ÿt±²þU]Kí­¥¹Ïù<ѦŒ2 Œl@ SÑÁ¼èFýr+¸íþq\ÓyÞ/·.rÒ~ÿ?×â¦;Âû´ÞTÎðeÂE×A<Ÿt\nîRý`§?ˆ„^‚“D?l)ŠK:+®]bJ5_ æ”ËóÈ£.l88y`*Ì ãþ‹ é^(~>:éʰ ƒŠ%9¼`ûµ nEµýà[™EãÇ•q»¼ùJ<ßE´q¾Ÿ‰å’[Fê-NK ÜŒ{²‚ê¡:Õž¿lcÊÏ×Wñ¾‹1®ÜPk†é0¡NrŒC Ãn©ØEQ"`ÐM+uìgýBO:æñM©àŒêÕ ¹ÑC²J4¢È"i“ì@)¿é>÷¼Ðv…Ф‘{NFcÏM'7ÆWlGÅqeÓêøZ–«,ŽU3Ì„Gª!ŽäÁI¹¬Å®Û^zëPïûŽ*ñm’ž/gßKŸf­å2¸¾xÔÇ=º¾H/Ž’åœùK®¶|ìšãkàrù–/‹ÛØQÁÊ}زI–oãù°EÅ)I_ÊEoôrÙ‚Û³¤²Hî"âÓËfÛiöѽUÛŸˆËÖk#·ÀPÛPš> stream xœå[K“$7¾þ}ì` )SO¸1ažÞæ°ëawmïÌØë5~=_JªRªºz^e&À”5)U¾óË,õ×3Ùƒ‘ÿ´ÿÿìú¢üëÁ~·<}yñõ…mÿbÙá—Ï/~ö æ§(¸ÃóW¶mˆtˆl'ïÃáùõÅ_¿zf&2Ì9ß>»4s`w|UÇl9¿‘ÕÇ$ÏÌ~26?.Ä.'›Ž× 6)šwF—¯ûãß…ÚùìÒßžÿöâ×Ï/þ|á&ãß]XòØl…©8ù|¸ÆJßiYy{ñÉc…ÄS®GtI?zvi'ËÙÛãçURi‘ºöÈû<²÷N–Mpqàîø™z~_•k²áãm×¹Úù/¡ÀqTå¢'C¬<¿Â›/ÍØö_Bw>ÂðWuSbæã·ê¹)Œ)a OS²öøª.' ?©N`)çãKµósµó¶“LjYË¢É?PÇœº[9æuܲc$çqŠ6ôÎ༬ÜiD²g")dx1ü¬åýfsGêE¸˜áûþüò¥µ^þtü“ˆ\æ\ìñCJ¶*«nü §‰MvRÔC­h‹m4l]Õ`Ì¡©KHã%1õpÌ.O!B2ò*ÑK}AôP(õB )G-+ÉÐäâݪ¶é`픽·C¼xž «CˆxOäªï?ˆ”|‚®^÷pØ.ÙHÖ=ùæ6î’NÀ߇ËÊÓ9d‡fÅá‡êõMéÑ ± 9VË‘ .Äj®Fþ•ï,W‹bì8Ü–uoÉ¥ãM!ÎûEÎj§ä\V”œ³MC@Ð6m ƒM=±ì»>±ò]ó¼mSøLv`ƤWªû¸äh˜ÔB"‘ÎDhöø¦èËFÔš¢R‹,ã«ê !;«Ž#…\ÕEÖ;'ù Œ"›ÉfŒ¬ ÕµLUhßÉß­'*!Ö^q-¤ØæÒàeçA½·ž@‘猆$ºäÅhÃrF±ûé…ú¶S|®6VŸv&GÒ‡¼®‡pÌ4+¦[´wÊK®ƒ{SN¼J½mß݉-ܦHp>5«ý(Ûà@ >•j,*£“«ùÎfʉægÔ\cç$ã@~]Њ7añrú©ÙÖ:ÑÉŒMÆ©dÖ-‘s«dÖÎÞ“Ì(MáÇšÌn73Øý€ n Pùûû^ N­±èpmŸAÓÖ gZÓ²ÀW¨¬±X T(³àk`”)øe¥Rùÿ¨2£/¨íÛY@“1…lwûvïÐE ÀWÜ"‘ Ž2€¡~k*”{8Á@µhvÑâ ý¦ÅÙó­áÑóÛÂCi {€Ñ±L”ÃŒ+$‰p7RÏSƒ-–’ÐXt}hÐ|v÷¶’Ä`ãçnŠøoé?cÀÎx|^a.#'Í ¨lýIm €•;B ·ò,XuÒYBш²òL%,â(ÿ›ŽÚ4öÓò\ÇsÉn$ïÆ0;ñÙË †= š'ƒÂY[·[唈iïÖÄ´D:ϸy³öì÷µçcãT§‹4#±ë ~é}mÅDݼR¼¶¬¹ƒ·Î4eÎ+„¾Ø=M™d löÆIÇW•ùª”^+ðe×ñ94<)‡hèúåƒn‡Ö1 ¡tÛ^×#©æÆ¾uR¯m~Õ Ül¹!ÎA­"¤Gޑƃy—•'hGL쨹7$©«/T‰¹Ú¤8u±õ½D5+oC"&W/¼¿óåíeÛ;ß2„@§ŸíЪ¾ŸÕ TýFžC ÖG±6£¸&õJ-ou¶IÆKß!û!qà •4L¡åÑ<¥¼¬”)™›’eÉÉó ¨Hª’PµÙUFL†ŒøšXŠódí²RK—§4P%+#%MõØ€1if–#€+\5»vï›í(QÑÐãž2jkÊ nƒÅÛ Tˆwë(ÆvfXEmýCINh–›®P² üÁÎó«oz»¡ÕÛ2JñÀIN¤ÍÜ ‚®-Íçý´WýÍ×Gh>˜¼ñzÖÎ:ÕËÌÝÅh7ùâ2š]^„Î`ÐËe†$ð}Iö ±’ý³ÆsN-QuIªµMòR E ,f”ä Ý·…bkÔiÁŠ&” ‰¢y¬¥¡d®'à䨶á+Õèå÷£Ì ^Áá’f“4ƒœ¢”§NãÐ' ^ïÁÉà-"hgÕú>û,Vt,¹È=Rþa]ÃQ S5Í¿UÁo@ÀÕ$É‘2]ó…åuÙÅÔî!l(G™Âv6Àì~OØà$‘0ʳ¥odÏÞÔ»%;úÆr—Ò7["Á;ø³€¥´Ò÷UueTõú9%)j#t¦YÊ+†N‚þY3ÍÞ¨Ô#4pçö0-ÃZ`ééW}|§Qõ»,èIjŒnv´+åã@½¼ÃAЇNFà“ ­\…ë0ѲÒ@}úŠ =ž4Õ£A½Å¡¯äF)¸°)¾\¯ýjɢʅÔ×P>Î(þÕ)®¤ø%¾S üŠ~—r•VŽÐR<±£–M£ < :²e½7ZáB”ühórACŽÐÌë©’6n žÜXe€)V] ÉP!²æXËÉBE’¡ÒQqìd·íô@ønc*=`g‹P÷\ø"¢òE]S¡ð…¸‹{’™tÚ4ÔÉpsãByÖýWo˺xyh"òÑ­ƒˆÀU°ÞX­Cá y”è®®‘Jîïì +Åœ©M'ð`ûöˆüvHÎÛ#%÷Ýù1ýn)£°åRݼ .ÞÝK#W#¡+(ZÝ•Qœî3Ù¿šo¢9øïçW Ë“ù›31ð÷ãøÍÄ"å²Ð¥œ­ä¶»¶f[¬Yà˜¶f=xÇcÆúÿ—+Æ‹W¦´,·ú‡˜©›ôõbr–Älýzñ¼¢¯kªz½XS=ñz1Ž›HßÿõbÅm»^<ÈÔ®+ªv½XS-ju¸R¼öxù•¢òø¶ðPšÇ_.¶© Ýß-vßËÝâU‹o¯¯†¢äùjhÉ#[éÒ&he$TAùòÙF›Wž’ÐàQƒV>’ˆ3‰˜‡ëZâÍt.Âàdm¹óµƒ?1%3ò÷aã* ω;!à —ŸUn׉['kóËÏYsšÆê®ti¤8hÚÏ×'~»ÒÖË ¨îJÏ+ú®t¹ŸÖ/TcÁÓ}_ýï¼'m uÿC÷¤Oc þÆ÷Ä”\JVù4z‘ÝËG ¾\qšWžâ²ruXyPèiLï}«ÄÙŒ©e¦Œðçv1ˆÄžÙ þw‚ àN¡w “G’?\F*?Ê®AeûïÍÕ#/êçr¯ñÏÿ{{endstream endobj 1005 0 obj 3732 endobj 1009 0 obj <> stream xœí]]“7}_øûx]ÅNFß/$P_Áo„‡8Nâ¯cLB€_Ïi©5ê¾;w½÷ÊIœT*UöXÛ£9-u·º%Í?¯×Å\¯ôÿýÑíUýçµ¹þýöô«^þÇÊb׿z|õÎû6®×e)ÑFýø“+Ã/${œYBˆ×o¯þvx÷ѺØÕ¹’Ïݬ‹sÑùÇhõΗÿ¢Ö”¼K™ž ËjÊá·UØ—lòáÒkÎÖ®¶¿™|9|:?&iŠÏü»«_?¾úË•_Öpýõ•±/•–P®oÑ’€;o-ϯþz®’èb)­‹¡éoݘŸÌ᳦iHvÓº>7˜qMkÜp€ÁI€>£e ŸÏ¤½‚÷Á³! ï5¯Ñ'…îð‘xþ² îZVwøbŒ¹xó¿$î¬Ô+ ’•z [.SŠ»¤ÖÅÐLâ~ñßðnõ 5C ¥t¨+ ‹ Ú`›3:ü]ý~ZltÆBÕôlôi{);ç_‰gž[gS$xZ²1‡OZs60éf¯ÆâÓOÄ›Ÿ‰7¿"‹h– HñŸŠnîzFíæÓñ¸grÉ®ðÓ”–d0-Á¯è¤l-÷N‹5'œ>8\¢Îˆ£ïX˜?ØñX•Kn~¿Ù`¢L µ©€¾Å8(AÚÛ®UGÅ$\9<£ç˜£ ‰f 6a0m¶¸¹F_\FdȾ¾*>.O1¹ŒHC#±†BÚ[h$ ÐdøR4Ö,ÑBjkIÎw)6æ :ˆ&.)Í#ô-Æl-$lV¤VIeC1@Jœ“¯YJFyÆšã=u±øäÚRl‚;{cÐ~÷Mؘ…;w%vÑzzÇmhIÒÙ'Ÿû`ù ÅËbÖ”·ÁúcÛ€0BNDÏŸ±àöÇó.ëáîœñ2+z`qŠƒ„á'ûSÇã}Ÿÿãïg ÀPÔŒØ7 » ¬n¯~ðHÌ)²þú#b‚iûOõ7[râ`· Ms·5‡%Ãm°¬.®®”lV¿µTw3Ð’£m63¿tü H×qµ­×®ã²sGÆ“iÛgÎx2ím%þÅn‘ó5D­4ݯ°ˆUZ²?:öSˆÐ×PB˜+?µØPá÷‡¼úùÞbã҈Ǟ,7ʵY:Bš£Z’Bî õ:…׬×Y?Õ‰=þp(Š!ôòлŠ|²…Nìý’Ž”KXô’¼Â9¦tË´³i&¦ké²J/(­²+Th£#9%EÛfS^Œ.iü78/¨^”f¨õ)‹ŸÁìûnïîØœ} v/Yæ‡!$qe„'íØ¨±cŸ‹6RzW.·Žá:”2YÚƒ«;a+fÍÚ­…³ø–Ù )IÞ)©³³x¬³v ;+ʤ(çJaJ ºFѺZœ™¤c[ôøž†eÝ4P*†hãg| µÎjðrËVN,™..¥ rZ¦†žbÖº–ÔV’MÊRxÊ3ªZªÜ“ÙŸ§æì&åZõ XKž —µ••žbšBoéä'ïNÔ“ƒóºú,k®QŠ õ(ˆ('²!ùc'²H’¡ÀÒŠ2 È}cöS““hëQZslYhËG–•‘jÎY>ìŽ-KÎ͉Iœµ­õ”y€r´öm1n tùQ Áÿm™Nge¡uqé¸;KEB¸, ^ƒ§p\¤ëÐý0:NœAï¨HH§~lô£þ¤ÈbòÌ ®¨¢øhÁé-ÿºuÝNGDB¿9H Wë¶ŽPÝ×lKK!Ú„)·B(DN¬MwÒÞUÕ—æêWêã†5cáK"ß™³ãÎÜŸë–»/®ÞëŒ9›vÁ°½ø’Ît·//Õ Y¾_‡¦_‚(Ñ;uoïN]ñ…ƒO¾žh×ý]¬[CÛ~˜L‚@GK¤Sä­%y{áQŠ åt@§´ÇäÛ¤Õ{O6‡Œ±’§&·µ=8¬|y²^”Qѧzëf ÜZ.GXϹ×#„ï‰Ïó ¯x¤~;Bx5Î Ôµ>q$Ä7üæQ‰4/ Æú̇Iɇ 7öé\Aè¹µ=ûœFäõ`ŸSnPsê±.5§Ü÷ý›ÿ'î;ÂÉP[×ÛÓ«'ÈÀZÉóœgu¼hV³œ8’gE?а–XÏBQycèÄYºÀÏM°–Ouê'nI´Pn![ŸŒ>:¨ðÅ÷ù½ó=ÛÏigÝ‘÷ð{\zDJ±¼‹t¿¹ `][K“¢L6+©âhÿMJ] Š3ÔÈŸ}È–le6-.Ÿ9:;‘h‘@P¥tBÌ‚ÉK)xøK©md·Q<}iù)‘²|nx¨Ì™‘¹£Ë€Lw ÛUëæÅ æfÅóžnPæZ!êùûá]õž7‘z;XF@5ˆÊíFZŠx35çÚLœb$ÒrßßÄÒPxÏ»…”½Øi2²#¬‚Ð Ñ–ÆU?Í[o¹$ºgdK%êaù yÞš­sê´Ty7¸ÓVa  5¦^»œˆ.–¼|aEÄåÅ3B„%½Œâ2rË rÆ1?ßöËÀï¤F y›÷S%KW µFø‹zõ û¬w"Æ¡8Ï ÛÑE>=1a»åù–“³á!—œ†9Ò/Rh„ëZ-Tn§ ×[jШmP(èàïv´„µîÝ_b´¶Ýo§K›¨vúaÔ9@éOöoîK+X„]‹ýÊö:.Œìøoýû¯mKÓxuŸ½à!î5aÀ®QfPXý ;ynÍ BÍ{Ë%&é†Î뽪»=êìF˜Jõ™0™R}f –£â‚ømEx ]ZÁYêŶ ¨Ü,Ç6<Žj%×ú Še--•ÂÛC/¢ V¸q奷ȫcXxhc_\CàNTäîЋlˆ”_ zQo‘ô")ÕèERêBzº€ëÚ7B/™^¤Ô`z‘”jô¢‡©q/½H©ñ=¸î&éE²@ùp¯¹´†o"y¾”$´ÐQïórÝeÖßkWîõâ£e¸ÖÖ"\ksÓZ>J/m —1$éÜ×£¨ùa1$ÍŠá/F0${‹dHJ©Æ”R2$‰—ó·G‘J0ER©Ú(’R¨Q$g4mI¥èeI«q$tæH !æHÎ`gޤÿÍ$îN’”¸;IRJ5’ä„v$¹;5ç±$.fI*ôÌ’”R%9ƒžY’ ý[M“êwš¤T¿Ó$¥T£IN R§INLqçI \Ì“Tè™')¤˜'9ƒžy’ ý QR c¢¤Ò‰’BЉ’3:0Qrf˜))p1SR¡g¦¤”jLÉôÌ”TèϦJH*)!1UR 5ªän¦JîúY\Iªq%ræJJ¡Æ•œÎ\I…ý›!K ÜL–TÚ1YRH5²äŒrL–œ˜fKT-)au¶¤”jlÉ ð-ù ÎL¥K ÐL—œíyæ‡ò%æKª1f¾¤b¾ä \æK^n 0™4©²„ÉÞ" “Rª&¥Ô…„Éœ—B§Ùo€0)ð1aRiÁ„I!Å„É-˜0©´¸Œ0)p5¤Ï„I)Ô“3à™0©À„I¡&•®L˜RL˜œPµ&wçé<¤€Å„I‰«&¥T#LΠgÂäÞD½i¤΄I¥&…&gÔcÂäÌä0aRàb¤BÏ„I)U “3à™0yrnJ˜ :aR¢b¤j„É è091î0)p1aRg¤bÂä z&Lžø·Š09Tï„I©z'LJ©F˜œ N˜ÜÞ“„É .×­ä†D]̉OÇÍø?QˆG¿=nʯןâÏÿHflÕendstream endobj 1010 0 obj 4808 endobj 1013 0 obj <> stream xœ¥VKÜ6 ¾ý>z«ˆOI×6 -ú˜[‘CÍ6M¦›¤)Šþû~²<¶¼;»ÈÌpèù‘"ýnŒÆX?Ëïóã0ÿiü~•^ïZþÄ6~}üÂÇгëxx9ÐbxLBÁÌÇÃqømúæ"Ž"%Mo..cqÑé)´*B’¦¿«6%•”«,b!R™Ï`-™òt:æÌùd™´LW›ø{E«ÍOß ß†Ÿ ÑÆbƒ1Õ R°2¡Iˆ;¯š7$\„Ò\l™>º¸¤@RŒ¦W-SK¼f=Ë-L)ú')4éÔ Íŧ¹f¿ ïa ÍÊ>¼÷U]Ó.ºéy'häÆeºÞ8ï,ÿ«¸ã>¯\@÷yЖË%V8¤æbˬû¯ œ¡uõª•r 5¢±j¨l8g8?¼€«êÓÂ.ÄHõ¾,¡G_4£,"Ó?¼ÔV8yRÈDÓ˦΄–nýJŒ£Ÿu–¯:Ëë :uŸ@ÿªssûfÌn®6ñ\Ë%ޏ§)…D(‹i„“²jî- Ó—Þ .®Ä\©ç:L'ÞÄ9¹TpMm²ójF¡Èê£é§ššk‘2·Ò÷œ©‘Õ ß‚q‹"ËJGܽ;3H) ic0Góöèyúà”·ÉQ´Ï£çXª E„´)*A‹©£»s(  U“#M÷SMy$ ÅŒv7À$€«ÑÎIÒøþ±fÁÙ2¸z:·‡Â¼Ϊ7a¶¥(»l™2<àyáªùüEaoDø°;~!=B4 ”H¢—Ô*Çäê©•k¿­7%i…긃\Ïz#ÖŒPáIÍÖ<[q´ËsÕtyžjêŽÐ×tQìjj,Õîx«Ê÷1fr¾¦è™¢Æ›€cçu‚’2ªÙÅf§?f¾(a-Δ¦Œ5êÀ¨“Ä^]L¦ZçÅ4ñ:Í Ô-“jƾ¯Ïɘç+¶q¬P˜YîµÏ¶ƒÿÜÌhQiË£=ÿ°Õôv5VoÖgÇ´d¹q{»Š¢HŽñ6ºÖÝ¢uËàZ·UÓP–ƒåªÞ:v¨»ûÜÏW­Ô9S]À÷Rµ–:»Ó²’[ž‡så‰sÊÚÚ›¬d>ÉÁ²mN¼#ÕõÝE+ »[÷9af¡å{nš`‡Z™]Y¼É~ßù’9Dí:Q|,æîµaçÖ¨o>èúèX@3´½`t¢­âÊR¯ðý?•¡.endstream endobj 1014 0 obj 937 endobj 1017 0 obj <> stream xœÍZ[o·~?í[ÿÀA_ºj­ ïzqRÔ±ÓÔ I ÈÑÅŠ%Ù‘íÄþ÷ý†är‡{¸ºØhZˆ©9³äp®ßüq+F¹ô_ù÷û‹Mús+·_ÕÑËÍYþ…mûçƒÍgO”Û8F§œÙœldùÀ«­×r´Öm.6ßÙ£ZG?œïí‹Qk§ÍpªÑZj?¼!ª÷Fû@c­í(dÞÙz¥„kXŽ2݆ †³«$6¾/GaL u×Ïò‡ÞO« ˜Õ]&|Ÿ•ã¡§¤m«•³¡HבÓ,‰û‚ÆÊjëì´¦sÐõuÍÃy!²ñÕì¤Ýõa£ÂÿÁž…‹+6ì­©ÌJ¨HŽ Õ{0l˹¦z§R¥WAás­QG öñ¨ÑB•b›%ÿUv?™èÈ;ËôµãÚ(r8$´âäG ·’£ &êÄ~n½ ³'ûYŒ¥É b@Ýììv4&VµþfQ^Çf‹Ì!ŠTjÀYkV¸Ð°LS/gsß @î­:¤g|ÓˆŒ2:¹(0u#ãʲï&Gè›gÒÌ­Ìóz2ONn^隤s6Û!ž’˜^¤Ãlµ¤…›¬†&"8Q­–0‹Ò1Z9íJ›Ð³Zòu¤q0ˆq£ž .)q†ªê4ßE—™¬`šï÷”Ö•#¼XB‹›Ž/Í ×†ák»Ñ ›A—1R ÕˆwTâ>u¸²çÙY( ¢ r”VÙfžŸø$çlÌéoI2À€öÜ•â^^)aø+±:÷QKdQ—¹¬;ã’>ŸµÍ׿ÞËZó0YÙÌ\‚“òÆ`=åZ둇¡[C˜ü‰ÍÛÔÅš64¥\€Bãì,/åvP§CÎßΚ)„@Y÷ Ë-ê´GÖ„æÚý&Dˆºˆ¥É(?Í©ˆU›ásjYÉe¡}Ñ‚•×Ó,üù¸ôxAª0ÈÒx9üs/¢=Ъfm¬VSçy>CšsÆÂUUTˆ¡­v4q\Fûm!55ÙHÔãL û¶<裷ÆÑ˜*=¼èænUñÒ­K e ?5X.:[ö¯Yrå ˜z_…ðd»®;UÆk’v–°R>^BmrÄBÂ+J/^Np¤gÒÄþzöø· 1pŽXs€xcg‹fã¶ÏJaûœljœ=·i!46M©©±i™ûz¹®M4e ŒöÈ©Ec<]ñŒvº2^©ÿ»¶®’/­ÿ¶†ošlÍ%ß Ø³¦#!Ø®´ É¢Ù/¡û3GÿFŽÁNIë|YçÆ¬ÒùøšF®ÛOŸ2ÞnòòøèŽ2¬¢|7°?~˘޳1?8bcÞ¹^,«V”!˜w6“Æ|­ïö:NSä:Í2”xàPÕ†N!4ƒ¼´H†enâ’@£q[£´—("ÎVJæ²a´¡á‚ËyßpÝ9c:%Á£˜ÒÖëíÁÓ9ËJhVÍJ‹Ä#,ß’6ÐN»S %é–+„TÃU¹êvìŸÚ\¿Hhÿ®éF–éÏWB›‡!›gס«ª–.ÎÅ…~šºnËsG•{µ%| ÈNâoJjJ¼Åâx‡#éòÆCV°äD“›/Îr4[“ƒ,Ž+øì¼?[àÕƒ@b|B—dûv§V’ñsw­'SB‡áÛNö’¬²ÕøSPE—ÊÊ%ÅX¢™-\™Î¯*(Ú`Î*éÞÓö`O¡IiÙž'u‡í6;-WDéÃ]Pš·çI(Q­ÍÂéåÐ&:w›¤Õ\/À5»¸výÜ]uÖ7ÖÏFÙt ¸(²=•FžCœ()&X¤&ËW.I\jþ£²¡–Àø7ÜF5Ù3uHV»&>ß šŒ:]gQÆìÄ^BÆ»±—¦éÄž”Îwb/eÞ_l¥nïK“Þ¨áèS—à åô|lÕ9¨ÈG ®^¬ÑiÌ‹ÙÏsß.Ež±³–YR”­Þ±Fš„ÓÿFc´0¿eXÐùªððìqV„V‘  ‘*cºã’:gWÏ>ŠìAv"Ówª{ÄŒíñàã¡ÅÁäÊù–R’?€Wt0V. 4ÝE[­­áÜÐ~F‹ÂÓ%§ÆÝÒOù‚Gy  WsYéÑÈÆ|Oê‚“6´!ÈdP*ãÛBÎŽµgUœübû3J0Tˆ‘*æÇóŸ©DSAFVˆt^Léb"€ÃÒ­91•kõ§bÜÊ\–J…Ðz”r"dÜ œ"ç r´šóܵa”hý0œ¶Ô}^j/û±ÉNªçr§"k;\\(€ˆ„Säu—Gzó¢Þš|Nòƒ±ÜÈZ~¾úšå¦µ‹KÖƒö0£Sú.û×~¾|{1ŸÂïØšèuÙr"ñß“y´å,6W…®PڌФú4µ\{ŸûßUKñ9é\Ì«B:½]©êÈEÒˆèWM_²s×ÿ½:¦ž¿i‘"Lª5‰Ò %V5ÿù"zË„)¸kðuxIçÅ–ß­½ÉŸF™ ¦ 6>`xqíöåaJ½wé%Z¡ô.$—þoö´\=j¿Åérs‹Êé|Öd²úEåõ„^‹™Ü‡*Óå:×[ÄN-Nôæ…&€ueö<þîªs«–èìRó †Ÿ:òWB—Kt9ƒ±î£•ûË금Ôd‹X+aÊ¥|1_@U§Œìò‹;ÄòjžoÝ®ç; Yy‹E~]éAY«š)^e²–²wƒêuÛÉWù»YY¦7õ1 °E ¥Dî›áÃk*]Àwm‘úœ2M "xŽ2ø‡W,ÏVRþ)›isšg¥ëÃéí~ -2ãßç|?üDž@¸í|çÐüªèû¨ÉJËëü”-á]F[¤9ß?O‘k¯VT–$Gk”h…‘Ü£FvOP2?ºJHp3¢c÷-S@×Ñ0Ýo¢œÄ@sr– 2 ]v"˜sÎ 'è^™xJ;ÙȇN)q.:»Ö WéIЄXjBjÏ1xÏ15. AÆz—‰r­^0oç!·‚^ЋX‡:u’Zäüšš ]VMˆí)þÿŠendstream endobj 1018 0 obj 3107 endobj 1021 0 obj <> stream xœÍ[Yo$·~äGÌã(ˆ’U¼ä%q8q.[ovv}Èk¯¤µ²kùõùŠì£8Ó=©$0l·¨êbÝõ›úaoÛ[ùgøÿ—w»úãÞíÿ4=}¿ûaç†ì@¶ÿÍÍî—Ÿúh÷Å”è#ïo¾Ù¹á…ä÷‰œ !îoîvŸ~{e·D%Þ^][C‰¯°ÊDŽÒ៲šSÊòLŒuåð/YÉ{;’¯ÚzÈÙÞ4† J‡;p´XôÖÜ—ÃíüøµPs(œÿqóÇÅdRLùæ+ˆùgùeñ‘œ?<\]û„= ܰ[&¢Ãõ<¨B>Eá‹'“;|Ó–³ƒ MçK9¼Vo¾Qo>Ì$F-ª~µ¤ú ›SÕ+ËÛù±©m²QtÿÝÍîï;66ìÚ%oá³c¸ýÝ.°¯2­¼Ý}¶Ëð G“ñ”,E+± Åä2­q TaÙGTã ¨¼‰¥R­Æ”Ë{çL Áé˜*Y„÷ûXœ!›[`=ŠNÞEŽiÐÏåHbw±ƒ•X Á;µ…Ôü}0‘ü_Z °©‘êÄaD57ÒÿS";?îïàö€È€c Î<„Cò±,nï¢ITòÈïÕÕ1dë·OP²ä3óÃ}}´ÐÅÕpä’ˈ ±Û’¼’pQd¬-\ž! %çDy¼âb\ðþ A(¿ì“bÏ’üZÈ3'ΣO8hrlfSž$ùKsa@:HË3YŽÍBÃú×óó²l¢§É-_\õô×.“à¶kzFÜW²›«ì ×â¤4‘ˆ´÷v¡Pk"“àõË~”§˜ Fñ1âùQ‰ý8GdËøæ©ÎøŒ 9tLîÛ~\èpÝâà?›_{«¸½mĉº=* É}nEÈW¢ëvÑL¾©îöèVˆåoÅ«9 î Ir¢‡$Š‹Ð«šö~¢ýªÀþ[¤›÷Ö»¼WÁ¢ÖÅù® Ò¢Ü|²»ùù燿ÎÑ9x3OÕàEÞÔ¯z¡"ÓáWW׌Ƙ±RE ýzf¢y?(’Aó˜=mà2¬ã‘%±Q88Eßq¹UÏZ#³ì‘à‘'ö¯ëÃþ%Ƨö— ÒÛ?„s‘9õLt¼ oînãŠînc§•Ÿ¨Êð^]9×…¥\…ªÑ|kWÕÉTÙ;N‡o«.¨^e=Tê. ©GBxãa‰Ôk‘€ªì‚ Ôâkhkòkèñp'ŒX÷š@j¼úîëyg½ÛƒQ?œ¼êsæ ýárÀƒ¢Ñ뵟¤lñÂáÕí¼ï׊QômÛD±v*fÛj•¿’áö¸5> 8oÂö³æ DÙ`ÝóáË™XY¿Ûÿ~zoŠ6»ÿ=þ½}n¤P4F}¸8¥FѶ¡+µßåèeov^ÐO¿wë Áe$Ébǽ&Äž‹-éáSë¨ ©Ø7¼°Õâ:¶éZ]_BDèX™Z"jÕ·ËUv |ø¾‚H_Pc?j’=-5†ºŸ^×ÈqỶ$G=qø}!i4‡?<·mNUmªý @Lg™¹®±÷W€ÆÙ‚ù€Qì"F©ÜÞ/ìÙy¤ß3¯vÍH ¦û¸¶€îûúù^5õ:éa¤ÉyB”ªgèÝE¯?(6Ñá—D¯ä­±1@i×ü_©WÏ‹à2†êuù" ®«Á¼/®bæëÑ׎rÍ +Ù°’s ¾o±~6±[GZäf‘`c‡¸Ú$ÜRò‰­L\tæžMÀ*@ ç 1’öŸV_Gﻹõcy¶±00úò¶“)©Ô‚þÌm_pp2:¿Àľö ÒëY(=ÅÞÏËgS¬ê¿êëµc]É~¼ $1À]­Ðe`)´0 ŒJ§þôãU=ZJžW`ÛåuÜ:×Qœ9ÄoÉ6þ&Ïm¶i¡”€Ñ‹?©‡; ³¯£z>›¸røäÛ±û˜¸ï†µ48Y@è•ábA+¶Œ.RCZ¿@ÍaÉÇ•—´ÂHòÙ”±a\°üQ ] âë¡øÿ$ˆ‘Dý»ºà,´b™VÙ§¾Ýwí0ž‰¢Ý˜ö¿;ˆxP³üwŠoc–\Xž»§`()E Ñ;é$Á€ Ç€?­H0` ;*d1ü¬©ž26È—0° SÏ%dV÷Úü£c]Ðç¸glh³VB`|Ø© ëßeˆ»IS–4î=›÷úÃC“=²3½›"0…–Ëc´*½\TÇ‚¢©{ªŠóé &.¥—~F“kgAŬC¬K¤ ÅÊgíN‡P"ú·¦Š$øq“‘Œ¯‘þr$ ¯Ó‡²|ÛëÓ‡2ÑQü䘷ÆOS/ýý"Z¯ ¥+Ífg‹ °:(Ø9W;‘°†ôèˆà-ÞÔtBðŠÑŸ¿Mt‰Þ¨{£-›#ÉI¾w¢S®›D'ùÄxÔsÖf… ?ÌçÜìƒ_.Hœ|1¡óKŠŒ™¼×.¡û¥ÎÙ"A6)—­‰Ùmq šª±:•ƒµíH‰…µŒ½£bÒôƒÊ ÿ7=ƒ¹©SÀÁ&‹ƒEs¢’yáüC¾ ÍR}›¬Á"f>óqaÚ±}v‡ˆ´ó›J>Xê• R"òGà“„EhpŽó~Z@}úŠŠQS©£z6¨g@PÞ3úýx®¥aá`÷z~µxv¤ÎÝbB‰çќґ‚¾¤ÀÏT‚¾Rؤ„\e ­Ä3ñ::™é=|½T.«Í-D9˜è7ɤáùNv}°¨ §§OUE:Õ¬„”§˜{UKj½d¢òRžòM½|ÒA^/yéBèîR®óß,•GÒqìÄòÞ×ctM…¦Ó&á=ü—ÜTœFÜÿVµJ×-=zÍÙ¬]@íȇÄÇ äƤ«ò.JéÚ¢R7fÞâš”cVh$î8¬°–Â*ln +lLGaµö=IÍH3Tµ8Š’¾ëúp!äα&Bêû²Er°À8\6X¼ A‹åeHà^v©ÃE§\Â5.nždHH«fŸ? W ‹Ûö‰|¢Ú]g¦þ›„º Ð¼uÚÀƒrï×÷ÉÂgõT(4aSJEý·äÜP0Ü0"T·Óëµraq hãc.m’\‘øëÇvO¬p(áà×–¯“&çßòù„ •2œtÆœ]»ÛÝ^|'Gµ†l‘C 9õ÷68M[ÓÊ%À–ñz[‰L¤©«÷°IRÙV¸HQ`®YÛ®™¡-L í.Úe4 ­`qîæÎ¶—ÜØvêQxfâà²z9×çKéni·ëÁÐôMî¹2¨³|Ó‹å#ö†í‘|ékäÍàÛ¥ÁØXRwëü"7Ý4oÞÄkðaGÒ,8Ϲž”»˜8tw å›Ü¬å´0k9z“䆡öæ°ÐyÓË™¡öfc|þîá²76 æiFãFØ« ˆ@\Å÷ϬŠÒ2]ûV·â›»ÍÖn‹¿oÖ \§'Èl©×DT˜mùfùCw³œäµÐ‘ª«ç¯gÔ¾Gׇ 'Õç§<*õÃLñF½¨/»+&·‰Ü{×wàÇýë«ç÷¯äz§Sª\ç-ä6:ËÑ…TÑé#ËgÍ‹õ¯ª3¸ÚLÛ|p³ç5AÔŸ"<ããrŽÆ,·•û¨sóVe~ÔF¤iù…—…)µtõ íŒÖ;Mã1ýŽòºKQH)§¦wGIûÔɬLŸC’âwn,iÏ ¾dßMK÷ËŸXÕU­Å#ŒQÝI·Þ"¥+dòõ£+d¶²òÞ݉Ý6”2*Àžÿ?KÙÃbýúnf0¤'Oé)¿?·¦oÌ6<öOgé„(ïâq|o83‰2BB¾Ô¡K´ҨdÏU!yÒTÏŽí"PIX`fåͱ=OðDò XK[o”q¯`—ÜPThôrk@SM¶ž¬xl}ùää#ÊùãÂ¥4«.Zø³LX ‚phm™kéð·‘ê1Mª~Þâ¿ÿû¢Ñendstream endobj 1022 0 obj 3426 endobj 1027 0 obj <> stream xœí]YsÜÆ~gô#öq™ 'sô\q*v%NU.¾$vdÒR‰²œØ±ÿùt€EÏb°'–,—Læü¾éczß®¤P+Iÿµ?ï®Ò¯+µú|sõöêÛ+Õþ"ÛÇVŸÜ^ýòÏZ…•aÀéÕí«+Õ¾àõÊE%¤Ž«Û‡«/Ö¿½¾ÁßœS~ýþ«rVz³¾O—àÀ¯¿¾¾¡kï´]ÿH×à|Œ¿ý]ªÃ­”ÑZEuh%‚ô«Ûß_Ýþü‹õ+*Ã|í%½ftðÖ_Q}:€]¿¡»ÞÙ õú›þ‰¦dkBVr€úp{þrekkµóë×EÐFa5T¡ò*¬ïR£ƒòvý¶¹ÔÞwOhoâú5»ýuÿô—×›’‹]„ @ÅØ5ä}èñßÜ^ý §æ3ü÷zÇÄd%v£¬xǹ(´ÖÍäè|XÚâÁ@¹*§…q1¯ë§b]§uÅ¡ÕVù¦N_ËQ#ĵBû¶®Ð3ư·Í}‡xê^õÞ:Ôþ;a%êt‹2ä1Y‰‰SVºÕÿš]7C EU|¬ÎêàèUmb´ ÛNà—x÷¾ÿ÷ôlˆ«y‡—øW¥ëPn|Ôûan©_›ê'„¹F*CÜš/ÅFÆ×Á‰ì°Ty½b^ƒÃ)Wãý •¸,qÑ È5PÂÅñŸÖ¹ «4½ÊŸ?¥RˆÎí«”^-²NHTQÌÜ1öpV5"Eºè±‘›§ÙeK5odYhƒUo꜒jІsP-ZRòz§/xÖF§½0¡Ð¯ÚTS8®@µïè:âÂèõt«® µJ $êÞqV Hº;ï®þr4ûÀ ÛÑw•·þgéÅ%lÐ Rš Å ÝEäb»#6ñ@ýlQ¨Ôû˜håmHSô®Ç3‹_ô…L°Í‚¬–XÛpÑ™GESUDƒ";$ŸކJ{ÄÚhƒÉëR]7!ù³ò™ÙZMãé4C«›ŸR3˜æ™¬ç»æ¬Y/6Õ^6Ø‘p”"j¸p…k%\6ÍsÐÆ“ y½SÒ&X¡ÝVùœ6²2mT Ú¥Ðæ×ÔB‰µŠ&ä¢Ê¡ýúÓô¼ ÁÙ‘h)œ¾2€Êš|òf¶€VíV½S’5$/wô«¶*/M_ISêÙµi;šÓNEcͤ¬c…Ýo§(êˆ9-cÞ‘cÂÙ•AÕ£¦­u©„• G–­»Ì⊂Ë|µe¶-ƒÐ šAød%œénœdⲃ6|Ö™=MM÷y ù+†Ô–à ŒóEãpè×HlÞ€^¨_HÔmö íCã–î*-†üæ2û0pÆ @Ãý üz¬}\ÔX8Ÿ’¦¨,}[9£T>?•\µÐ'·à3é¶ÁçÅ3µ ZIO.³1‹èódÿ®x¾óÚè`—Ÿ0M ±6ÐèÓn J3íÉ ô›;'ˆ3,Kðù”¾O¾W4/¾ß¶ÄisëCú« –÷¶¸¬Ü(ä§_Ý(rKŸ#¶Hsj¥–…n·Áx½ZIûú8„–ò8*Ê® G,-:•|zðLÏ–žL¨i‚ø˜åüy²œ£‰&Œ6 8šþ0më2v‘º [£¥°Æ[[®H‡ œ}nîmÖ¿n…ÀJvNq£àÒÁª£F‹®ÖÊçÌ´Â]0XïûÛ\3iÛhìQ|R€LAñAùm÷)>ÝÖ~£ø8èøŽ8-ɤø8g„7›;§(>u禈~9AÇzôž¡…Q1ÝoPkV«FõÔT!Š ˜]";ÌÇIO=“t7I­Œ":NÒöÎ9$åÓ8uÂ9ùä¬mÎó#PRkž)9'%u +â”lïœCI>:J> Í)*þÍÌæ´ìJÇeøÏ ¡8âšB{†vwÎ`h6?\kØ76kÓKŠêõàþŸßëópÅò.”Vº µÓÔ¼¡ki½j3–ݨà…ÄÚ¸@ÞIÚKÎö}¤Õ ‚ÒU„Á¢ñg @H[Y¬*çiç™´‰´ÿcðŠ˜{eë”\Á¥ʱ——îRQÖ写᪠qœôÆðgté4 fu†G¢Wh!(v½TÜR‘UãgNÜjŠ_|ʸ=y“Å¡˜|árÁêÑpR9hfô[Ó"ožô"{ÔÆŠqB<-€Z¤p ÌPäzÂý]BÒ«õ;ö&¯hT>[ÔàÊç.¶h˜—Ãg%À@“»-K§¼¶ãéµÙ.n¼Ý¥|,…s³Nö+ÓÚ¶Æw9ƒ+¢ë0ë¬íšBOðß÷&Ô}ÿ0+îå°8z˜•‘Òi>YÎbvܧÖùÎŽH‡ç,~æñÇ‹tÆ£îÎ<â“p<šö4 !òöE\›]8«}X¦·ybë7=öÛAUÎgÍãÃúšuad¸ËÛ¯(V"‚#W‚áö«ˆI[Ú~åæ?Y×{ÌÿÑå¢Þþ« 8#ÑgÉ”ç\-É”ŸW‹«…E=,_-Ú;ç¬lXÄQñÐ÷å¾ì‘hº BtºÌ@GÉ0ž¦,féç WkÝea'a×@–4pÂd©5Ø™½"&(o#–±*ø[n¦aÑNù| f0gÐNNG[ Ɇ§1ÓãwãýÒuÍ´B²áǃôÁÓ È»^8]aÜ×û¢¿|Ç´¢ý©øQ >ð•VÖ;ÆžXc &=Í.OKP3 uÐpÑ´zñ©žb‡'ïbƒÆ4ãñU_<×¥±5¨¯ƒ¶q KZ¡r)v—‹1KÚA>×3,ÏVz!·ëpy¶ôQ»£_µ¸ÓjYjß©¹ÃÖL¾“3ñ'ºè¥z°|!žc@ìesıaê`Ð+ä¶ÈÁ+:hWH8<ÌÀù¢Ô‰¼x¶Õ^ÛÄ8"ßðã`|,ˆ‰IŒE!u²h(å^¬dN¸¨òiæ¤ñ•$ƒ Âl×;¥u¡Q7†­òç¤Íáù†Ÿ6Ÿ^…¸E rß>ç+û-¢°¸~@4"˜­üÑ3+i×1”ROd}+ä_ïW%ÞoT§a â3ù±»æq”Â=Q|á)PÔ“»D«ÜKЙɦŽ/©µŒò ÅvJãImr:¬3Þ«Za­ 8"còãá`SýUçÃ\¿ÕLxúVÐö¹ž¥ "RhìvšäØgC^¨¼Þ 6|–è–E¼×Ž~?"ÑíBøwÄçÕFC”¤8¡'u ÃÊ -#‹ÁÂõ!DŠËç㥒 ÄZ&Õ†¤ØÎkÌ:Ò ­§ ž×øã!AZ¯G‚ìxÆ’ö̧“:r÷ÿ¨WŽ «ÐFWë%j:¨‰©r,p VÒÈ­r¨amÕ;©K ‹ÝѯÚÜâ)Ÿ/[㬛úù!¦¦ôYú.9Šy‰åÐV `õ4”tô‡B[½2¢Ütç”ÐV¯H)Êçgxïæ‰®:4‚7Å ³ÍE²ì8ó,W97I*åùꈚ¥»¾¢£°µÕaéñ›¥Ä_êÅ^þúh…M#ZþT¿‘|ÝSøŒòi[<½Ä®E8Kü='y*ì &ð‡þ6'd!åÉà`Æå]ÛÑ\=nÄ/Ç/a¬Úä šÁÎÜ€ùðüêË3‡ÛÉ$3:S/ <9l÷ ëp½dÒζÊxN†t,BD³5É—î€"“t¤ µá4Ü$ò¼)÷ Z‡4¨¥1ë.qxÆõ9%Îá×—AÒ)|"R§öËðŠ– 1ä3ͽµNi¡ÆŒ¶m^ï”^IéÙüx¿j¹Ý;æð ìO9ÇY!ÝqŸhu¤YK3½þg¯4){wœœ¦0ÇË k·©™ågçâ R~EÚ»JãÊëð£¤Æ‘‘¼U>mµàg™×/¬cÛ¹\}¿ùÜM¦ÇíÎO¦±ù´ì$M£rŒÌh'‘ØÜ“¨œa€Vì$@ð8v¦xÿ&–jˆw©2€ÎO:°9.¸bS+rTEa¶ët‹Âßwô«rÀ\öå‚KàÙ›‘G~Ź+ðMŽ×B0¶¸.?)9€]–Û_¸˜Sþ…‹eà“)÷ìÖz&z?8G™~p0×ôäCC§£»s’#ŒÐ˜ðÂöYâÃ?a0£CëˆO,ƒEÃÜØi eÄ͈DIF=‡m‰DagÖmîœB$pB{Èù™Iu™”%­Ÿ”IÚ®hoAS^4ž,?4ƒ¬CeY¶é5Ô5Íxˆü2l.Yý¯ñÿÿâïQendstream endobj 1028 0 obj 4211 endobj 1119 0 obj <> stream xœí=Û®$·qï'úˆyœ²/U¼<&¾'@äXÀ@”[k] ]íJެùyWõeºØMžé™iÎ93'0äíårÈ*²î,²~Øievšÿ7üùåû‡î¯;³û×Ã×w?<˜á/zè¶ûç7ŸþÁz½K*yëa÷æ«3ü Ø]pF!úÝ›÷ÿ¹ÿÝ«×Z9HÑÄý¿½¢¹R2:îùêµQÑíÅ,÷ìÿ=Xó_oþå*íúæí4PHã8^ã@ iHÄa$îÁ#ýêÍÿ?€Ò¸ûù!XM0† ‚Ù½@ÐZéthy÷ðyaãwƨ„h$ÂFcÚùD3¤ØcýÏïlpiÿ§nC„ýŸ;h£ƒ¸ÿ–›ƒÇ¨íþƒè¢úv­»`”Ÿ¦.ÿÍ͉ÖҬû;ñýWþ6‰Ãtíß—gú²ën½7nÿ—éû°ÔVPÑñ’8Zd«‘Ùö=c…é÷Ãϧþ6ƒÒ¢Šˆ+ê˜Oÿ€.f#Ú*gG’úbO LDhii¾êV/ï­5Ç”h!¿ïšµwÖ hG’íg²ÀBËðÓÝ–Ù†ì§_¼:ÌÔ6C€ýã„ÝaQõî7ôß×'/^¤¡½ÏWÏ R‰Ó·˜ë9p„-"-Ü[0Á99Ü{þ$:÷1ûÕ0‹Óà%§ Ý!y_¦S›ˆâáeÑiRÎ@N/’NCc:õž6í¾èôã4Ìb˜“Ùÿ¿Á¦Žc‰„ÅD“°·.uÂÞ“!@ÂÞ†^Zó_Ïö6(´ùv|ÒC@ê^b-ùéû F¹Ô›ÍõÔ‚å€4V ¦ËYî5k &¤ÄS½6^+»{mœJ`ú ÆD Æ´¾ìhf?8°GùÒô$4ð¥GC›GK„ë󥋼wÅ—Ÿ—‡ùQ(‹Ü¾ÉÿkKgk¶©lØÆ‰ †ŠB H(Q·$Ýw¯xHZÍ|tÐz‹Ï&ƒÓ©H“ΑáaM ]á“"'!§ A‡{݆&;[j>ïÿç:SeÃ#x™Æ¼FbÄá}ñš´Àäðÿ$084€ùøßæ$»ä*•ñ fZˆŠThN*×t' ™+w¦þC¸ÙßMöØ$ö?¼²ž:ƒÛÿ̰j‚Ú‰þ7M†W0~>ú:†=äÌ€`3É›ì[öy{å×]«‹ÑcÛcW;¢ͬ¢‚b2½„´@0è%L” z©Êíô’! BÜaòϽ߮sx … ù¼ê%hù]¨ã…mðJÔd½Ýa´ —Lï,^ÂóŸLÝ¡ÙãD0dCErqŒKŽ=ž±åœ !ùL®bÂLÊé£ýX‘-þ%ÁQVUÎ(S0UòÙûN÷¸”ÐÐz9s<ÑÛ‰Ízý“w™ø¡¿Žñ ÚD!YÇîf¶’4S#SЙ ù´[Z‚@.cȇšµµÓ…>*ô~K-{ Çqœ EP¾ã8H,´-çp¶ë‡˜PÛˆã2m~4X1á™Ð“”x¦d•Á‹ðL‰Ã Gñd[WGÐdcàTÁr‹že0qÌWO2^3ÏÒª˜B>咽eTB/h,PÈmxr‚> ”¡å"Q{"éÖE?ÇÀ-û bU¬õ¨Ü%‹B#(tÅ5Y¸›H’*`‹z·(}Ⱦ6~¶|’KÙÙNÙš‘óné?P[DŸ¬ðúæ »ÏŸZúpØ’þÒgh¹DúHÔZHŸ)Ì {÷qbÞi¿¬ÖQ¥(дÈ/ — ICp$+Gs½…e (äÒ“ÐÃÎæº&ò80†âÒ7rh^TÖÂAbKû‡WsëF‰)ªøäRâ-cl¹@bd¨= ‰1¡9JŒ Ð%F†æéCÀ4HŒK`$Fié/•sd)=zý2¥D n†ëK@;èà©¥G ´7Æ–K¤‡D­ôè’ù¬Ï³«H×jÀnÙl$V™¦pdaÁOî=ôby,!¦HÉ\°<ôòå9Aê vÜ›`B>¾hËh]yËþß[/D8H7 ‘k„LXYx“Ï»¥3fÉ]SÇ«ña€#2qmsäi¿ݧ£K‘SJQ&Î`åô•_ÊœœcgžLS©œ×ٟ€NÁާ08žÂtü!ô3<…!b2Îä›+‰ªQZaªˆ†³i· ›§|ªcÕÚŽà4àäÙσWøbZa39E6ÿãoèt$»¤áü§'q3YU˜îåèã ï I‰+²ðAßÉy[è»^˜ø ïˆ™Mz2}'íìEÐâ^Ÿ–cð4’¡¾™šå/åw-ê$©Pf9’ÄX¾Àsã 4zÒ4˜S‹ Ìf)*ÐÏÛ ôï8µ•þ\àÕ8¥•0ÐAu—ÀÉ8ý¡åœÇ@2‰Lîl%$ròLmò•*:Ú¸‰Îï(jŽí¯|‘|#6£Å1n6×–l† Ò—Ɖüè„îÊhâ³@|æè¨LÇf‘Ø Ò¡å6ã+Íó•8ÎfÇdLnk?…3×ݺ‚¤õæDülÝ[qn"¿Áb>Wƒ¿üá—·Ö[èGë _¿ÚN=þVvú}…o1ݾݘ¸ùB¡.>ÏPðÁoIA¹¨4I&¹_­Ž‚ù¡ŸOµé¼¤Â “ÆÇ¿§"n¨œ®G噂(M;×ÏZu¬0(çñ^ô§f´Ñˆ¡œ†îHJNÕBkÐbŶ uÐäÄ6Tßqb"Ñ»ÉÞD|[DÄ¢ŽÐ2‡®jÁZšx¥ž¸±Xm ˜ïŒÞÛ6”Á‘UŒÏ»©Ö óÚA¯V/BŒ*D#‘~ÚR‡4$ùLiôóDç×ÏsYnž%÷€#31'€k0Td” ŸwÓ`\ÿLd¯F 5ªÃ›ª éÊú§Hv‹ j1i0ò%RÔÖ«ï Q˜rxh9'Jà­29ö§=@H9á#‰;eÍu Ž!i˜¯Œ¤ÇFAï=r°ìó£Ç3µ@ÝA&²°ñ.C¸ 4s§ÜÈt„É·Ôˆ*0KËy·Ôä'c‚:^‚]£åÃù&|µ¡åó䜑ÙGCÓ%Z ]x4—YQ>uïó݇5ú¨uwöq-æs¢³yäDWñjÄœ­å|÷ÌÎUµÖ—ÂÑxÜ¥xlÄ•¹Þw©´œr1äû(é§QøŸ•–N>ŸwS¥EÔ¾ŽW㈯±–C£WVZM#ÓY˪Úç9ŵ;©§kAµ»¾³âýÅZ¾åHn0-,? Àk„P€CË9kù$¼bÚ­ršr!½ÙÎ2 ÌÁ^Þªõ l1,qñ»ôÁÑJàm¿KotT6…«‰ ‘UôïÞÝ+«V~ÚGåÈq¨¼ž‚B ÅAE?íîÖó .îÐrÖÝzB-™êŠX®U'*ˆ;e~‹ŠëmÏoQ³C”v˜8И³›L¥Ì‘TѪ)ÜŽß\¤}$>Ëê]ßh¹~Ñú:B€ÇØí±ë!’„$‹Øm6Ñ‚àœŽÖÜÖ¸Í_û¥ô厀b§š¯Ñ®‡Å¢­dÍù¨ÌÂzeÒ rбpïE¸r]oñyž+Ç]L¿äêD;«ó#é·Õ)ª·Š6›wC“ÕÑ.¹ëx52Y‰ˆTÒ.¯ ³ _Êöýs/$PK^–ùï’û^‘Œ-NB,Ð|Ác £Ç!š¥ÇFóÀøÊJÏ+ÇÈ¿ì±mAþ¤8ù0-ß.#¤.7åëKú\dV‹l!w?– \ œšI¸²ËJ–€³ü¦óØr†%]ºïlWHúo'°¿<ÂŽósšŽóº‚ùcíá¤6»ãa¼>üôÃÄ1§X6åK0[°’ÒqÖæ«úT¬±¾Ïóe Á㔉p¨Ôkg%ϹäqϹjÉ Wç™_wMË+G–É7_åíÞV7}GZΪ…¼ Z>ϯ¦(óÔAÀYå‹kð`ÚžPc%ÆÑŽIîÿøKnF² h3WŸÁ­#›•×XtÜn܈夦yy’Š¦Þ’ €“šR,Ug˜Ïu^œÔ±Ž—kkuœP¡!¡¯’ÉhíGÇ‹£?P9Møzµ¨˜y«Ñ´ä˜˜ïô8]¢5¥Ê›pÎA]ÈÊR]4Js/[Ò2 (ß4% ¡Éâ©dÒF Þ ë°)=/A YÇ6bkyKòy7d )ø:^­”Îh]ɧý7a C¼k–7X A] ÿ§âÓSÛe>€=I£?äañÀÈ]Øe\ó-­EPL²‚È5ƒ†-ÙE;Ú X‡c#‘0jªSßç?ùÆ]>¶ÿ|i-›h-S …ŸvSµÙAÀu¸– Ó”r-Ö “`›óe®y¤¡“ÍÒ¾¹Ü×ì‘üšotuj”âÙCú›pÖdùòÎ?tÝ£KÖW½ƒáûÝãUoÀ"ñÅKtko=Ý’€ZzðùH <ŒÜ–Ï»¥'@;5Öñj¬,N¨ÑО¤ ãx3ÕêÄûrœü2/Ò oÕ€‡¨•'/9Û?I7¼FH–o%åónêGe­­ãÕŠF/Klµ Ÿ}Ö³+ 8e–á {üä:„|cj–uhDô´ºÉ¸RýŒmˆ>$Ž‹×q¬|7QËZÏdŽ`¦Nòôùâ@L] OæS—/9gâÐrV¾xT´¯ùzþº›ÝEò<äiÈ;¡ßŠúˆÊfË'ãÈÏÄ÷CLVRzjþM-wA&,Èß «(Å8b±Ô¾A= ²5×¥ÕU¡áL'ƒ¡Á™NÇ ¾MD×úòw'ºLý»äÑ5´\"ºäz^*º&GÑu€£è’^WtuÈ¡5È¡%iÚ×Ã89¢»´˜!—ç¼w7Lá!¨cb¶}@-­vKÏ9>Ró—0¸² "ëJe¶±¹²Gp%¯n'žP¾á9Ûe4[‡`BÔZÞ$öJ J=€ó†Ð»¤Ô¸¾Fw¶jß”B+êåí+“·å›„ABõNì(äJaFr505&{QgáùS}!Ÿ8Ì }oq0NšŠ_¤ºjëüÈú‘;}åx¯€ÖX‚°iö±í*­Á°; á¶e-‘ Ùé:Ó§?t”§u¾rÉ«¡ôæâ=œh{«|¶?5C£QÂ-G¸ ¦BM‘î}y¥uZ…aã+`ëk\Ÿ ½ ;Ìc“s¥yZ¼‹ã,Wô¾UÃr“ÉàÊ\FkD\V¨3²i –¬3RóÉ=ï8åˆP³†S.‡üBGg€{ Od²+œ²Ü¢Ë쓲] ±4òÝâV1ɨ»gÞ²y·ŒI’hi6>\¯ÔL ]MjRvà!ðH88Œ¬kvC³ª[Ø ¥¶Ø½¨)zy§’Ëzlœy²ç!Ç£œì5Iú pDΓaâbF9Ü^å­ìåiÖhVÁ=çÊ=¼ýDÜW/%ý7€åè‚ÍFK3+~$øèÆ­ž_ÅŒà‡–ŒàE¯àE¯s ^â!ÄÒÐZ„_;Œ${ä/íL¡aa@ë)> stream xœí[¯Ü¶Çßþû¨Ô ‡—áÌkРh h{ 4}H}K[Ÿø$µá"Ÿ¾C]VÃ])»GÖ! °kµ”vÈÿÃ’’‹,w½=ß(ñt´!Ž÷ œxº‘…Ç;åùNßÜþxÆÆãçCrVlLÉ$8>b°ÖX>yøóz…†c„³ #ËÍ™† ÿ;›,UöÝÇ|ÌÎǘºŸ†ã`1u&'ŒdÝÉ>b”SýͼXÆÒˆxø˜ÍbO†Ÿ¾Oò›iþú‰Vs2^,.,?[Õ½ékáÁw?ômL>ÐÉXoM¤ÉŒ&)k’3³±àl2L×­ž–¬ –æ~ۉȂ“}ÛÑ‘»Où4Isö–Ëi›|pÝ«¾F)²8ˆ!`÷áJ'~ÈÐxHBêx!zÝ·w§ßÉõ¿hÒ&Hu'Nµ ­=þFþ¼{ªH@>³]V;ô¦9J:˜Õo=¡¯#MÒa/¤Éz5ÔÉëS™ì¹ÈF´u 4Úg«gžmdcýlXisç´6»U<šào1ukH&†ÒÔ°N(8ŸU»Öˆò^X£ } êü±@zü~zúz#ÎÚò‡ì‘m`DQ÷¥KBa‚îõ‚Ÿv6 “)âGÅmãl‹œH½Ÿ¾'×ûñk¶®ñì‘¡ 4¶ YîäÎ4ªttRç´ÐQÆÙÈšéñLõ\j$[Ú·®ÅÃÿ( !ÐÚ« D‚ "eàNçT‰¹n2z5!ÃRŸÂê('ñ3ƒþsµ+Q.èIÃíD¹§˜c~Eùx¦ |.5R® m¤\×bªu¬­¦ük³mH4H…!£S”JÑ„›Œ]¥òpRZÛݶ¬r%²Å ùÝü· ñÌg ²çR#ÙªÐF²u-~R–_*Ž—ãñÊ Ê6q²2˜¶cßés!ѤÒo¨ÁjÈ"m\V¡Ü9JMÎø«„ÖÌE§¥Ž—¢ð«n?Fƒšêô(i•jT@2zLqoT§ÿáÔÑÿ¯ÿfýµ•ô—ì!¹]õWJ7 ÅuŸs«[rÞ/ÅÞŠFßO÷XŽsLÔ’ûÙŒ…ÖHcáŸ È 3;`ñŸ|¼õ*Љ‚š™|}* ©Ð…ÿ~*1å˜Ü"-2¤BÀ†rg%ˆü¼®-I¢ü´¼˜£ˆ ²â ÄMzr-y‚$M°lèJÚR0Da›¶oû†ô.9.­flu?¿–"Hˆ`¡©b^8/Ô¨@fÏo@ô ½»˜ † qè+Y¡$GÀ 9ôœŠñ¥•4hxk§×šëkfQÂÁi’(±žÁüB´H˱ í—Úa­‘þR £YÏÇBðâ }g¾Ÿ¿++w9`ù´C%ãÎ¥©Dƒ§Ä;ÓðzqeáªÐÊŠÃ2 Î@>l‰øJm*áQÒ¬qÐKGòò¦ØºÏwN¨‹ÉÆi)Tŵ@1Xß”oˆ†1•ÊT‚ÁB–p_ôñãâPL8^[DùÖ·”:¤TŠS‡Ÿ‡©èöåA_»¶½òdÉÚbSŒm91R©N% ’—úï ļ¨܃:2ç+SW ¹Ä“o‰2ÄgÂhâó±Ùø­Î់óJ “ 㦿¥D[êôÉtg­^IèC°B¿_ýÓÒ*ÀõmÂ8Ù–òéÕù ÈBJ¢{©—‹>Æÿ¸5þÏÏùÔTO'By¡@%Ñóã…°ƒè·\«ýãgŸ Zhi¶03€¡¤ùÙÔ­ÿq^ Ôù.®†×Â}^ÇWb‚üLy-¹ F1‚JÍê`∠nuzû» æýÚ™,ÌÜ´ù8JÞÜÔ‚~VÙr©ÆŸ‡ n{D£ á…Úmz¹«dyp†Eʆd–¶ŽE‹WÒÁ¤i€Öø—”϶^[SŽÞX -‰O^òÀTˆQI~‰ÂÒ]ü²À~›¡ Öú;æ'¹Ú‘\zºó\PIrï íÐã—÷ ªÌo5úÛ!*L"SC ÎZCXªW‰àþñÉ/feÍhá‘´~ÓÁU—ÑjþX¢HÏÇ€"ÅÎ h7 ÝÆÂÂZ”H†›0fK=ê ,§·º…®–>e+IÞ_Û’½"¼ ’êâsìÖŽ¿YõÕ2ËïK¹úÔFCm­1ä'•ƒ/å«D ciÛËÕVËß2ï¸ëSMɉ´Ô1Î:Ã’sòU"&¿‹ËïLÌÖE‰Ð/Ä6#;¤`b©–žOvÒX;È>.AB</FÞk’|ùè«.¢—©¯¾ô"ѵ¡„3?æ˜<—2U"Ã9ã¶:„+;ÑúóOÚ‰y£^SÁf~³”*TÞ’q¼q:r¡ÌEì âG.¬-LéT=µcBSïDÉë” JÑêpÂ2Jç4x'ŸæåìG½I±ß™HOÛ™h%÷MíLÉ'° ‚æD‡áÕòïØa>Jè:©ÖkáVʾXLGÏ^Ðv¡·g‰o]•dÎI¶QoŸØM‚‡àÂ$xé ¸ENÿ#ŠéÝyijáíó^,ï·)îâÒ¿ !A™‰ùå;Æ¢Aƒ»üÒŸwn>´§Cõûïäÿÿøƒòendstream endobj 1226 0 obj 2335 endobj 4 0 obj <> /Annots[220 0 R 223 0 R 224 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R]/Contents 212 0 R >> endobj 257 0 obj <> /Annots[262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R]/Contents 258 0 R >> endobj 308 0 obj <> /Annots[311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R]/Contents 309 0 R >> endobj 359 0 obj <> /Annots[362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R]/Contents 360 0 R >> endobj 409 0 obj <> /Annots[412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R]/Contents 410 0 R >> endobj 448 0 obj <> /Annots[455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R]/Contents 449 0 R >> endobj 492 0 obj <> /Annots[495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R]/Contents 493 0 R >> endobj 526 0 obj <> /Contents 527 0 R >> endobj 532 0 obj <> /Annots[537 0 R 540 0 R]/Contents 533 0 R >> endobj 542 0 obj <> /Contents 543 0 R >> endobj 548 0 obj <> /Annots[551 0 R 552 0 R]/Contents 549 0 R >> endobj 554 0 obj <> /Annots[557 0 R]/Contents 555 0 R >> endobj 559 0 obj <> /Annots[562 0 R]/Contents 560 0 R >> endobj 564 0 obj <> /Contents 565 0 R >> endobj 570 0 obj <> /Annots[573 0 R 574 0 R]/Contents 571 0 R >> endobj 578 0 obj <> /Contents 579 0 R >> endobj 582 0 obj <> /Contents 583 0 R >> endobj 586 0 obj <> /Contents 587 0 R >> endobj 590 0 obj <> /Contents 591 0 R >> endobj 594 0 obj <> /Contents 595 0 R >> endobj 598 0 obj <> /Contents 599 0 R >> endobj 602 0 obj <> /Annots[605 0 R 606 0 R]/Contents 603 0 R >> endobj 608 0 obj <> /Contents 609 0 R >> endobj 612 0 obj <> /Annots[615 0 R 616 0 R]/Contents 613 0 R >> endobj 618 0 obj <> /Contents 619 0 R >> endobj 622 0 obj <> /Annots[625 0 R 626 0 R]/Contents 623 0 R >> endobj 628 0 obj <> /Annots[631 0 R 632 0 R]/Contents 629 0 R >> endobj 634 0 obj <> /Contents 635 0 R >> endobj 638 0 obj <> /Annots[641 0 R 642 0 R]/Contents 639 0 R >> endobj 644 0 obj <> /Contents 645 0 R >> endobj 648 0 obj <> /Contents 649 0 R >> endobj 652 0 obj <> /Contents 653 0 R >> endobj 656 0 obj <> /Annots[659 0 R]/Contents 657 0 R >> endobj 661 0 obj <> /Annots[664 0 R]/Contents 662 0 R >> endobj 666 0 obj <> /Contents 667 0 R >> endobj 670 0 obj <> /Contents 671 0 R >> endobj 674 0 obj <> /Contents 675 0 R >> endobj 678 0 obj <> /Contents 679 0 R >> endobj 682 0 obj <> /Contents 683 0 R >> endobj 686 0 obj <> /Contents 687 0 R >> endobj 690 0 obj <> /Contents 691 0 R >> endobj 694 0 obj <> /Contents 695 0 R >> endobj 698 0 obj <> /Contents 699 0 R >> endobj 702 0 obj <> /Contents 703 0 R >> endobj 706 0 obj <> /Contents 707 0 R >> endobj 710 0 obj <> /Contents 711 0 R >> endobj 714 0 obj <> /Contents 715 0 R >> endobj 718 0 obj <> /Contents 719 0 R >> endobj 722 0 obj <> /Contents 723 0 R >> endobj 726 0 obj <> /Contents 727 0 R >> endobj 730 0 obj <> /Contents 731 0 R >> endobj 734 0 obj <> /Contents 735 0 R >> endobj 738 0 obj <> /Contents 739 0 R >> endobj 742 0 obj <> /Contents 743 0 R >> endobj 746 0 obj <> /Contents 747 0 R >> endobj 750 0 obj <> /Annots[753 0 R]/Contents 751 0 R >> endobj 755 0 obj <> /Contents 756 0 R >> endobj 759 0 obj <> /Annots[762 0 R 763 0 R]/Contents 760 0 R >> endobj 765 0 obj <> /Contents 766 0 R >> endobj 769 0 obj <> /Contents 770 0 R >> endobj 773 0 obj <> /Contents 774 0 R >> endobj 777 0 obj <> /Contents 778 0 R >> endobj 781 0 obj <> /Contents 782 0 R >> endobj 785 0 obj <> /Contents 786 0 R >> endobj 789 0 obj <> /Contents 790 0 R >> endobj 793 0 obj <> /Annots[796 0 R 797 0 R]/Contents 794 0 R >> endobj 799 0 obj <> /Contents 800 0 R >> endobj 803 0 obj <> /Contents 804 0 R >> endobj 807 0 obj <> /Contents 808 0 R >> endobj 811 0 obj <> /Contents 812 0 R >> endobj 815 0 obj <> /Contents 816 0 R >> endobj 819 0 obj <> /Contents 820 0 R >> endobj 823 0 obj <> /Contents 824 0 R >> endobj 827 0 obj <> /Contents 828 0 R >> endobj 831 0 obj <> /Contents 832 0 R >> endobj 835 0 obj <> /Contents 836 0 R >> endobj 839 0 obj <> /Contents 840 0 R >> endobj 843 0 obj <> /Annots[846 0 R]/Contents 844 0 R >> endobj 848 0 obj <> /Annots[851 0 R]/Contents 849 0 R >> endobj 853 0 obj <> /Contents 854 0 R >> endobj 857 0 obj <> /Contents 858 0 R >> endobj 861 0 obj <> /Contents 862 0 R >> endobj 865 0 obj <> /Contents 866 0 R >> endobj 869 0 obj <> /Contents 870 0 R >> endobj 873 0 obj <> /Contents 874 0 R >> endobj 877 0 obj <> /Contents 878 0 R >> endobj 881 0 obj <> /Contents 882 0 R >> endobj 885 0 obj <> /Contents 886 0 R >> endobj 889 0 obj <> /Annots[892 0 R]/Contents 890 0 R >> endobj 894 0 obj <> /Contents 895 0 R >> endobj 898 0 obj <> /Contents 899 0 R >> endobj 902 0 obj <> /Contents 903 0 R >> endobj 906 0 obj <> /Annots[909 0 R 910 0 R]/Contents 907 0 R >> endobj 912 0 obj <> /Annots[915 0 R]/Contents 913 0 R >> endobj 917 0 obj <> /Annots[920 0 R]/Contents 918 0 R >> endobj 922 0 obj <> /Contents 923 0 R >> endobj 926 0 obj <> /Annots[929 0 R 930 0 R]/Contents 927 0 R >> endobj 932 0 obj <> /Contents 933 0 R >> endobj 936 0 obj <> /Contents 937 0 R >> endobj 940 0 obj <> /Annots[943 0 R 944 0 R]/Contents 941 0 R >> endobj 946 0 obj <> /Contents 947 0 R >> endobj 950 0 obj <> /Annots[953 0 R 954 0 R 955 0 R]/Contents 951 0 R >> endobj 957 0 obj <> /Contents 958 0 R >> endobj 961 0 obj <> /Contents 962 0 R >> endobj 965 0 obj <> /Annots[968 0 R 969 0 R]/Contents 966 0 R >> endobj 971 0 obj <> /Annots[974 0 R]/Contents 972 0 R >> endobj 976 0 obj <> /Contents 977 0 R >> endobj 980 0 obj <> /Annots[983 0 R]/Contents 981 0 R >> endobj 985 0 obj <> /Annots[988 0 R]/Contents 986 0 R >> endobj 990 0 obj <> /Contents 991 0 R >> endobj 994 0 obj <> /Contents 995 0 R >> endobj 998 0 obj <> /Annots[1001 0 R]/Contents 999 0 R >> endobj 1003 0 obj <> /Annots[1006 0 R]/Contents 1004 0 R >> endobj 1008 0 obj <> /Contents 1009 0 R >> endobj 1012 0 obj <> /Contents 1013 0 R >> endobj 1016 0 obj <> /Contents 1017 0 R >> endobj 1020 0 obj <> /Annots[1023 0 R 1024 0 R]/Contents 1021 0 R >> endobj 1026 0 obj <> /Annots[1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R]/Contents 1027 0 R >> endobj 1118 0 obj <> /Annots[1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R]/Contents 1119 0 R >> endobj 1224 0 obj <> /Annots[1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R 1268 0 R 1269 0 R 1270 0 R 1271 0 R]/Contents 1225 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 257 0 R 308 0 R 359 0 R 409 0 R 448 0 R 492 0 R 526 0 R 532 0 R 542 0 R 548 0 R 554 0 R 559 0 R 564 0 R 570 0 R 578 0 R 582 0 R 586 0 R 590 0 R 594 0 R 598 0 R 602 0 R 608 0 R 612 0 R 618 0 R 622 0 R 628 0 R 634 0 R 638 0 R 644 0 R 648 0 R 652 0 R 656 0 R 661 0 R 666 0 R 670 0 R 674 0 R 678 0 R 682 0 R 686 0 R 690 0 R 694 0 R 698 0 R 702 0 R 706 0 R 710 0 R 714 0 R 718 0 R 722 0 R 726 0 R 730 0 R 734 0 R 738 0 R 742 0 R 746 0 R 750 0 R 755 0 R 759 0 R 765 0 R 769 0 R 773 0 R 777 0 R 781 0 R 785 0 R 789 0 R 793 0 R 799 0 R 803 0 R 807 0 R 811 0 R 815 0 R 819 0 R 823 0 R 827 0 R 831 0 R 835 0 R 839 0 R 843 0 R 848 0 R 853 0 R 857 0 R 861 0 R 865 0 R 869 0 R 873 0 R 877 0 R 881 0 R 885 0 R 889 0 R 894 0 R 898 0 R 902 0 R 906 0 R 912 0 R 917 0 R 922 0 R 926 0 R 932 0 R 936 0 R 940 0 R 946 0 R 950 0 R 957 0 R 961 0 R 965 0 R 971 0 R 976 0 R 980 0 R 985 0 R 990 0 R 994 0 R 998 0 R 1003 0 R 1008 0 R 1012 0 R 1016 0 R 1020 0 R 1026 0 R 1118 0 R 1224 0 R ] /Count 120 >> endobj 6 0 obj << /Count 34 /First 7 0 R /Last 207 0 R >> endobj 1 0 obj <> endobj 7 0 obj << /Title(Contents) /Dest/section*.2 /Parent 6 0 R /Next 8 0 R >> endobj 9 0 obj << /Title(Modules) /Dest/subsection.1.1 /Parent 8 0 R /Next 10 0 R >> endobj 10 0 obj << /Title(Variables) /Dest/subsection.1.2 /Parent 8 0 R /Prev 9 0 R >> endobj 8 0 obj << /Title(Package fabio) /Dest/section.1 /Count -2 /Parent 6 0 R /Prev 7 0 R /Next 11 0 R /First 9 0 R /Last 10 0 R >> endobj 12 0 obj << /Title(Functions) /Dest/subsection.2.1 /Parent 11 0 R /Next 13 0 R >> endobj 13 0 obj << /Title(Variables) /Dest/subsection.2.2 /Parent 11 0 R /Prev 12 0 R /Next 14 0 R >> endobj 15 0 obj << /Title(Methods) /Dest/subsubsection.2.3.1 /Parent 14 0 R /Next 16 0 R >> endobj 16 0 obj << /Title(Properties) /Dest/subsubsection.2.3.2 /Parent 14 0 R /Prev 15 0 R >> endobj 14 0 obj << /Title(Class GEimage) /Dest/subsection.2.3 /Count -2 /Parent 11 0 R /Prev 13 0 R /First 15 0 R /Last 16 0 R >> endobj 11 0 obj << /Title(Module fabio.GEimage) /Dest/section.2 /Count -3 /Parent 6 0 R /Prev 8 0 R /Next 17 0 R /First 12 0 R /Last 14 0 R >> endobj 18 0 obj << /Title(Variables) /Dest/subsection.3.1 /Parent 17 0 R /Next 19 0 R >> endobj 20 0 obj << /Title(Methods) /Dest/subsubsection.3.2.1 /Parent 19 0 R /Next 21 0 R >> endobj 21 0 obj << /Title(Properties) /Dest/subsubsection.3.2.2 /Parent 19 0 R /Prev 20 0 R >> endobj 19 0 obj << /Title(Class GEimage) /Dest/subsection.3.2 /Count -2 /Parent 17 0 R /Prev 18 0 R /First 20 0 R /Last 21 0 R >> endobj 17 0 obj << /Title(Module fabio.GEimage_old) /Dest/section.3 /Count -2 /Parent 6 0 R /Prev 11 0 R /Next 22 0 R /First 18 0 R /Last 19 0 R >> endobj 23 0 obj << /Title(Variables) /Dest/subsection.4.1 /Parent 22 0 R /Next 24 0 R >> endobj 25 0 obj << /Title(Methods) /Dest/subsubsection.4.2.1 /Parent 24 0 R /Next 26 0 R >> endobj 26 0 obj << /Title(Properties) /Dest/subsubsection.4.2.2 /Parent 24 0 R /Prev 25 0 R >> endobj 24 0 obj << /Title(Class HiPiCimage) /Dest/subsection.4.2 /Count -2 /Parent 22 0 R /Prev 23 0 R /First 25 0 R /Last 26 0 R >> endobj 22 0 obj << /Title(Module fabio.HiPiCimage) /Dest/section.4 /Count -2 /Parent 6 0 R /Prev 17 0 R /Next 27 0 R /First 23 0 R /Last 24 0 R >> endobj 28 0 obj << /Title(Variables) /Dest/subsection.5.1 /Parent 27 0 R /Next 29 0 R >> endobj 30 0 obj << /Title(Methods) /Dest/subsubsection.5.2.1 /Parent 29 0 R /Next 31 0 R >> endobj 31 0 obj << /Title(Properties) /Dest/subsubsection.5.2.2 /Parent 29 0 R /Prev 30 0 R >> endobj 29 0 obj << /Title(Class OXDimage) /Dest/subsection.5.2 /Count -2 /Parent 27 0 R /Prev 28 0 R /Next 32 0 R /First 30 0 R /Last 31 0 R >> endobj 33 0 obj << /Title(Methods) /Dest/subsubsection.5.3.1 /Parent 32 0 R /Next 34 0 R >> endobj 34 0 obj << /Title(Properties) /Dest/subsubsection.5.3.2 /Parent 32 0 R /Prev 33 0 R >> endobj 32 0 obj << /Title(Class Section) /Dest/subsection.5.3 /Count -2 /Parent 27 0 R /Prev 29 0 R /First 33 0 R /Last 34 0 R >> endobj 27 0 obj << /Title(Module fabio.OXDimage) /Dest/section.5 /Count -3 /Parent 6 0 R /Prev 22 0 R /Next 35 0 R /First 28 0 R /Last 32 0 R >> endobj 36 0 obj << /Title(Variables) /Dest/subsection.6.1 /Parent 35 0 R /Next 37 0 R >> endobj 38 0 obj << /Title(Methods) /Dest/subsubsection.6.2.1 /Parent 37 0 R /Next 39 0 R >> endobj 39 0 obj << /Title(Properties) /Dest/subsubsection.6.2.2 /Parent 37 0 R /Prev 38 0 R >> endobj 37 0 obj << /Title(Class TiffIO) /Dest/subsection.6.2 /Count -2 /Parent 35 0 R /Prev 36 0 R /First 38 0 R /Last 39 0 R >> endobj 35 0 obj << /Title(Module fabio.TiffIO) /Dest/section.6 /Count -2 /Parent 6 0 R /Prev 27 0 R /Next 40 0 R /First 36 0 R /Last 37 0 R >> endobj 41 0 obj << /Title(Functions) /Dest/subsection.7.1 /Parent 40 0 R /Next 42 0 R >> endobj 42 0 obj << /Title(Variables) /Dest/subsection.7.2 /Parent 40 0 R /Prev 41 0 R /Next 43 0 R >> endobj 44 0 obj << /Title(Methods) /Dest/subsubsection.7.3.1 /Parent 43 0 R /Next 45 0 R >> endobj 45 0 obj << /Title(Properties) /Dest/subsubsection.7.3.2 /Parent 43 0 R /Prev 44 0 R >> endobj 43 0 obj << /Title(Class adscimage) /Dest/subsection.7.3 /Count -2 /Parent 40 0 R /Prev 42 0 R /First 44 0 R /Last 45 0 R >> endobj 40 0 obj << /Title(Module fabio.adscimage) /Dest/section.7 /Count -3 /Parent 6 0 R /Prev 35 0 R /Next 46 0 R /First 41 0 R /Last 43 0 R >> endobj 47 0 obj << /Title(Variables) /Dest/subsection.8.1 /Parent 46 0 R /Next 48 0 R >> endobj 49 0 obj << /Title(Methods) /Dest/subsubsection.8.2.1 /Parent 48 0 R /Next 50 0 R >> endobj 50 0 obj << /Title(Properties) /Dest/subsubsection.8.2.2 /Parent 48 0 R /Prev 49 0 R >> endobj 48 0 obj << /Title(Class binaryimage) /Dest/subsection.8.2 /Count -2 /Parent 46 0 R /Prev 47 0 R /First 49 0 R /Last 50 0 R >> endobj 46 0 obj << /Title(Module fabio.binaryimage) /Dest/section.8 /Count -2 /Parent 6 0 R /Prev 40 0 R /Next 51 0 R /First 47 0 R /Last 48 0 R >> endobj 52 0 obj << /Title(Variables) /Dest/subsection.9.1 /Parent 51 0 R /Next 53 0 R >> endobj 54 0 obj << /Title(Methods) /Dest/subsubsection.9.2.1 /Parent 53 0 R /Next 55 0 R >> endobj 55 0 obj << /Title(Properties) /Dest/subsubsection.9.2.2 /Parent 53 0 R /Prev 54 0 R /Next 56 0 R >> endobj 56 0 obj << /Title(Class Variables) /Dest/subsubsection.9.2.3 /Parent 53 0 R /Prev 55 0 R >> endobj 53 0 obj << /Title(Class bruker100image) /Dest/subsection.9.2 /Count -3 /Parent 51 0 R /Prev 52 0 R /First 54 0 R /Last 56 0 R >> endobj 51 0 obj << /Title(Module fabio.bruker100image) /Dest/section.9 /Count -2 /Parent 6 0 R /Prev 46 0 R /Next 57 0 R /First 52 0 R /Last 53 0 R >> endobj 58 0 obj << /Title(Functions) /Dest/subsection.10.1 /Parent 57 0 R /Next 59 0 R >> endobj 59 0 obj << /Title(Variables) /Dest/subsection.10.2 /Parent 57 0 R /Prev 58 0 R /Next 60 0 R >> endobj 61 0 obj << /Title(Methods) /Dest/subsubsection.10.3.1 /Parent 60 0 R /Next 62 0 R >> endobj 62 0 obj << /Title(Properties) /Dest/subsubsection.10.3.2 /Parent 60 0 R /Prev 61 0 R /Next 63 0 R >> endobj 63 0 obj << /Title(Class Variables) /Dest/subsubsection.10.3.3 /Parent 60 0 R /Prev 62 0 R >> endobj 60 0 obj << /Title(Class brukerimage) /Dest/subsection.10.3 /Count -3 /Parent 57 0 R /Prev 59 0 R /First 61 0 R /Last 63 0 R >> endobj 57 0 obj << /Title(Module fabio.brukerimage) /Dest/section.10 /Count -3 /Parent 6 0 R /Prev 51 0 R /Next 64 0 R /First 58 0 R /Last 60 0 R >> endobj 65 0 obj << /Title(Variables) /Dest/subsection.11.1 /Parent 64 0 R >> endobj 64 0 obj << /Title(Module fabio.byte_offset) /Dest/section.11 /Count -1 /Parent 6 0 R /Prev 57 0 R /Next 66 0 R /First 65 0 R /Last 65 0 R >> endobj 67 0 obj << /Title(Variables) /Dest/subsection.12.1 /Parent 66 0 R /Next 68 0 R >> endobj 69 0 obj << /Title(Methods) /Dest/subsubsection.12.2.1 /Parent 68 0 R /Next 70 0 R >> endobj 70 0 obj << /Title(Properties) /Dest/subsubsection.12.2.2 /Parent 68 0 R /Prev 69 0 R >> endobj 68 0 obj << /Title(Class cbfimage) /Dest/subsection.12.2 /Count -2 /Parent 66 0 R /Prev 67 0 R /Next 71 0 R /First 69 0 R /Last 70 0 R >> endobj 72 0 obj << /Title(Methods) /Dest/subsubsection.12.3.1 /Parent 71 0 R /Next 73 0 R >> endobj 73 0 obj << /Title(Properties) /Dest/subsubsection.12.3.2 /Parent 71 0 R /Prev 72 0 R /Next 74 0 R >> endobj 74 0 obj << /Title(Class Variables) /Dest/subsubsection.12.3.3 /Parent 71 0 R /Prev 73 0 R >> endobj 71 0 obj << /Title(Class CIF) /Dest/subsection.12.3 /Count -3 /Parent 66 0 R /Prev 68 0 R /First 72 0 R /Last 74 0 R >> endobj 66 0 obj << /Title(Module fabio.cbfimage) /Dest/section.12 /Count -3 /Parent 6 0 R /Prev 64 0 R /Next 75 0 R /First 67 0 R /Last 71 0 R >> endobj 76 0 obj << /Title(Functions) /Dest/subsection.13.1 /Parent 75 0 R /Next 77 0 R >> endobj 77 0 obj << /Title(Variables) /Dest/subsection.13.2 /Parent 75 0 R /Prev 76 0 R >> endobj 75 0 obj << /Title(Module fabio.cf_io) /Dest/section.13 /Count -2 /Parent 6 0 R /Prev 66 0 R /Next 78 0 R /First 76 0 R /Last 77 0 R >> endobj 79 0 obj << /Title(Functions) /Dest/subsection.14.1 /Parent 78 0 R /Next 80 0 R >> endobj 80 0 obj << /Title(Variables) /Dest/subsection.14.2 /Parent 78 0 R /Prev 79 0 R /Next 81 0 R >> endobj 82 0 obj << /Title(Methods) /Dest/subsubsection.14.3.1 /Parent 81 0 R /Next 83 0 R >> endobj 83 0 obj << /Title(Properties) /Dest/subsubsection.14.3.2 /Parent 81 0 R /Prev 82 0 R >> endobj 81 0 obj << /Title(Class str) /Dest/subsection.14.3 /Count -2 /Parent 78 0 R /Prev 80 0 R /First 82 0 R /Last 83 0 R >> endobj 78 0 obj << /Title(Module fabio.compression) /Dest/section.14 /Count -3 /Parent 6 0 R /Prev 75 0 R /Next 84 0 R /First 79 0 R /Last 81 0 R >> endobj 85 0 obj << /Title(Functions) /Dest/subsection.15.1 /Parent 84 0 R /Next 86 0 R >> endobj 86 0 obj << /Title(Variables) /Dest/subsection.15.2 /Parent 84 0 R /Prev 85 0 R >> endobj 84 0 obj << /Title(Module fabio.converters) /Dest/section.15 /Count -2 /Parent 6 0 R /Prev 78 0 R /Next 87 0 R /First 85 0 R /Last 86 0 R >> endobj 88 0 obj << /Title(Variables) /Dest/subsection.16.1 /Parent 87 0 R /Next 89 0 R >> endobj 90 0 obj << /Title(Methods) /Dest/subsubsection.16.2.1 /Parent 89 0 R /Next 91 0 R >> endobj 91 0 obj << /Title(Properties) /Dest/subsubsection.16.2.2 /Parent 89 0 R /Prev 90 0 R >> endobj 89 0 obj << /Title(Class fabiodata) /Dest/subsection.16.2 /Count -2 /Parent 87 0 R /Prev 88 0 R /Next 92 0 R /First 90 0 R /Last 91 0 R >> endobj 93 0 obj << /Title(Methods) /Dest/subsubsection.16.3.1 /Parent 92 0 R /Next 94 0 R >> endobj 94 0 obj << /Title(Properties) /Dest/subsubsection.16.3.2 /Parent 92 0 R /Prev 93 0 R >> endobj 92 0 obj << /Title(Class columnfile) /Dest/subsection.16.3 /Count -2 /Parent 87 0 R /Prev 89 0 R /First 93 0 R /Last 94 0 R >> endobj 87 0 obj << /Title(Module fabio.datIO) /Dest/section.16 /Count -3 /Parent 6 0 R /Prev 84 0 R /Next 95 0 R /First 88 0 R /Last 92 0 R >> endobj 96 0 obj << /Title(Variables) /Dest/subsection.17.1 /Parent 95 0 R /Next 97 0 R >> endobj 98 0 obj << /Title(Methods) /Dest/subsubsection.17.2.1 /Parent 97 0 R /Next 99 0 R >> endobj 99 0 obj << /Title(Properties) /Dest/subsubsection.17.2.2 /Parent 97 0 R /Prev 98 0 R >> endobj 97 0 obj << /Title(Class dm3image) /Dest/subsection.17.2 /Count -2 /Parent 95 0 R /Prev 96 0 R /First 98 0 R /Last 99 0 R >> endobj 95 0 obj << /Title(Module fabio.dm3image) /Dest/section.17 /Count -2 /Parent 6 0 R /Prev 87 0 R /Next 100 0 R /First 96 0 R /Last 97 0 R >> endobj 101 0 obj << /Title(Variables) /Dest/subsection.18.1 /Parent 100 0 R /Next 102 0 R >> endobj 103 0 obj << /Title(Methods) /Dest/subsubsection.18.2.1 /Parent 102 0 R /Next 104 0 R >> endobj 104 0 obj << /Title(Properties) /Dest/subsubsection.18.2.2 /Parent 102 0 R /Prev 103 0 R >> endobj 102 0 obj << /Title(Class Frame) /Dest/subsection.18.2 /Count -2 /Parent 100 0 R /Prev 101 0 R /Next 105 0 R /First 103 0 R /Last 104 0 R >> endobj 106 0 obj << /Title(Methods) /Dest/subsubsection.18.3.1 /Parent 105 0 R /Next 107 0 R >> endobj 107 0 obj << /Title(Properties) /Dest/subsubsection.18.3.2 /Parent 105 0 R /Prev 106 0 R >> endobj 105 0 obj << /Title(Class edfimage) /Dest/subsection.18.3 /Count -2 /Parent 100 0 R /Prev 102 0 R /First 106 0 R /Last 107 0 R >> endobj 100 0 obj << /Title(Module fabio.edfimage) /Dest/section.18 /Count -3 /Parent 6 0 R /Prev 95 0 R /Next 108 0 R /First 101 0 R /Last 105 0 R >> endobj 109 0 obj << /Title(Functions) /Dest/subsection.19.1 /Parent 108 0 R /Next 110 0 R >> endobj 110 0 obj << /Title(Variables) /Dest/subsection.19.2 /Parent 108 0 R /Prev 109 0 R /Next 111 0 R >> endobj 112 0 obj << /Title(Methods) /Dest/subsubsection.19.3.1 /Parent 111 0 R /Next 113 0 R >> endobj 113 0 obj << /Title(Properties) /Dest/subsubsection.19.3.2 /Parent 111 0 R /Prev 112 0 R >> endobj 111 0 obj << /Title(Class fabioimage) /Dest/subsection.19.3 /Count -2 /Parent 108 0 R /Prev 110 0 R /First 112 0 R /Last 113 0 R >> endobj 108 0 obj << /Title(Module fabio.fabioimage) /Dest/section.19 /Count -3 /Parent 6 0 R /Prev 100 0 R /Next 114 0 R /First 109 0 R /Last 111 0 R >> endobj 115 0 obj << /Title(Functions) /Dest/subsection.20.1 /Parent 114 0 R /Next 116 0 R >> endobj 116 0 obj << /Title(Variables) /Dest/subsection.20.2 /Parent 114 0 R /Prev 115 0 R /Next 117 0 R >> endobj 118 0 obj << /Title(Methods) /Dest/subsubsection.20.3.1 /Parent 117 0 R /Next 119 0 R >> endobj 119 0 obj << /Title(Properties) /Dest/subsubsection.20.3.2 /Parent 117 0 R /Prev 118 0 R >> endobj 117 0 obj << /Title(Class FilenameObject) /Dest/subsection.20.3 /Count -2 /Parent 114 0 R /Prev 116 0 R /Next 120 0 R /First 118 0 R /Last 119 0 R >> endobj 121 0 obj << /Title(Methods) /Dest/subsubsection.20.4.1 /Parent 120 0 R /Next 122 0 R >> endobj 122 0 obj << /Title(Properties) /Dest/subsubsection.20.4.2 /Parent 120 0 R /Prev 121 0 R >> endobj 120 0 obj << /Title(Class StringIO) /Dest/subsection.20.4 /Count -2 /Parent 114 0 R /Prev 117 0 R /Next 123 0 R /First 121 0 R /Last 122 0 R >> endobj 124 0 obj << /Title(Methods) /Dest/subsubsection.20.5.1 /Parent 123 0 R /Next 125 0 R >> endobj 125 0 obj << /Title(Properties) /Dest/subsubsection.20.5.2 /Parent 123 0 R /Prev 124 0 R >> endobj 123 0 obj << /Title(Class File) /Dest/subsection.20.5 /Count -2 /Parent 114 0 R /Prev 120 0 R /Next 126 0 R /First 124 0 R /Last 125 0 R >> endobj 127 0 obj << /Title(Methods) /Dest/subsubsection.20.6.1 /Parent 126 0 R /Next 128 0 R >> endobj 128 0 obj << /Title(Properties) /Dest/subsubsection.20.6.2 /Parent 126 0 R /Prev 127 0 R >> endobj 126 0 obj << /Title(Class UnknownCompressedFile) /Dest/subsection.20.6 /Count -2 /Parent 114 0 R /Prev 123 0 R /Next 129 0 R /First 127 0 R /Last 128 0 R >> endobj 130 0 obj << /Title(Methods) /Dest/subsubsection.20.7.1 /Parent 129 0 R /Next 131 0 R >> endobj 131 0 obj << /Title(Properties) /Dest/subsubsection.20.7.2 /Parent 129 0 R /Prev 130 0 R /Next 132 0 R >> endobj 132 0 obj << /Title(Class Variables) /Dest/subsubsection.20.7.3 /Parent 129 0 R /Prev 131 0 R >> endobj 129 0 obj << /Title(Class GzipFile) /Dest/subsection.20.7 /Count -3 /Parent 114 0 R /Prev 126 0 R /Next 133 0 R /First 130 0 R /Last 132 0 R >> endobj 134 0 obj << /Title(Methods) /Dest/subsubsection.20.8.1 /Parent 133 0 R /Next 135 0 R >> endobj 135 0 obj << /Title(Properties) /Dest/subsubsection.20.8.2 /Parent 133 0 R /Prev 134 0 R >> endobj 133 0 obj << /Title(Class BZ2File) /Dest/subsection.20.8 /Count -2 /Parent 114 0 R /Prev 129 0 R /First 134 0 R /Last 135 0 R >> endobj 114 0 obj << /Title(Module fabio.fabioutils) /Dest/section.20 /Count -8 /Parent 6 0 R /Prev 108 0 R /Next 136 0 R /First 115 0 R /Last 133 0 R >> endobj 137 0 obj << /Title(Functions) /Dest/subsection.21.1 /Parent 136 0 R /Next 138 0 R >> endobj 138 0 obj << /Title(Variables) /Dest/subsection.21.2 /Parent 136 0 R /Prev 137 0 R /Next 139 0 R >> endobj 140 0 obj << /Title(Methods) /Dest/subsubsection.21.3.1 /Parent 139 0 R /Next 141 0 R >> endobj 141 0 obj << /Title(Properties) /Dest/subsubsection.21.3.2 /Parent 139 0 R /Prev 140 0 R /Next 142 0 R >> endobj 142 0 obj << /Title(Class Variables) /Dest/subsubsection.21.3.3 /Parent 139 0 R /Prev 141 0 R >> endobj 139 0 obj << /Title(Class file_series) /Dest/subsection.21.3 /Count -3 /Parent 136 0 R /Prev 138 0 R /Next 143 0 R /First 140 0 R /Last 142 0 R >> endobj 144 0 obj << /Title(Methods) /Dest/subsubsection.21.4.1 /Parent 143 0 R /Next 145 0 R >> endobj 145 0 obj << /Title(Properties) /Dest/subsubsection.21.4.2 /Parent 143 0 R /Prev 144 0 R /Next 146 0 R >> endobj 146 0 obj << /Title(Class Variables) /Dest/subsubsection.21.4.3 /Parent 143 0 R /Prev 145 0 R >> endobj 143 0 obj << /Title(Class numbered_file_series) /Dest/subsection.21.4 /Count -3 /Parent 136 0 R /Prev 139 0 R /Next 147 0 R /First 144 0 R /Last 146 0 R >> endobj 148 0 obj << /Title(Methods) /Dest/subsubsection.21.5.1 /Parent 147 0 R >> endobj 147 0 obj << /Title(Class filename_series) /Dest/subsection.21.5 /Count -1 /Parent 136 0 R /Prev 143 0 R /First 148 0 R /Last 148 0 R >> endobj 136 0 obj << /Title(Module fabio.file_series) /Dest/section.21 /Count -5 /Parent 6 0 R /Prev 114 0 R /Next 149 0 R /First 137 0 R /Last 147 0 R >> endobj 150 0 obj << /Title(Variables) /Dest/subsection.22.1 /Parent 149 0 R /Next 151 0 R >> endobj 152 0 obj << /Title(Methods) /Dest/subsubsection.22.2.1 /Parent 151 0 R /Next 153 0 R >> endobj 153 0 obj << /Title(Properties) /Dest/subsubsection.22.2.2 /Parent 151 0 R /Prev 152 0 R >> endobj 151 0 obj << /Title(Class fit2dmaskimage) /Dest/subsection.22.2 /Count -2 /Parent 149 0 R /Prev 150 0 R /First 152 0 R /Last 153 0 R >> endobj 149 0 obj << /Title(Module fabio.fit2dmaskimage) /Dest/section.22 /Count -2 /Parent 6 0 R /Prev 136 0 R /Next 154 0 R /First 150 0 R /Last 151 0 R >> endobj 155 0 obj << /Title(Variables) /Dest/subsection.23.1 /Parent 154 0 R /Next 156 0 R >> endobj 157 0 obj << /Title(Methods) /Dest/subsubsection.23.2.1 /Parent 156 0 R /Next 158 0 R >> endobj 158 0 obj << /Title(Properties) /Dest/subsubsection.23.2.2 /Parent 156 0 R /Prev 157 0 R >> endobj 156 0 obj << /Title(Class fit2dspreadsheetimage) /Dest/subsection.23.2 /Count -2 /Parent 154 0 R /Prev 155 0 R /First 157 0 R /Last 158 0 R >> endobj 154 0 obj << /Title(Module fabio.fit2dspreadsheetimage) /Dest/section.23 /Count -2 /Parent 6 0 R /Prev 149 0 R /Next 159 0 R /First 155 0 R /Last 156 0 R >> endobj 160 0 obj << /Title(Variables) /Dest/subsection.24.1 /Parent 159 0 R /Next 161 0 R >> endobj 162 0 obj << /Title(Methods) /Dest/subsubsection.24.2.1 /Parent 161 0 R /Next 163 0 R >> endobj 163 0 obj << /Title(Properties) /Dest/subsubsection.24.2.2 /Parent 161 0 R /Prev 162 0 R >> endobj 161 0 obj << /Title(Class kcdimage) /Dest/subsection.24.2 /Count -2 /Parent 159 0 R /Prev 160 0 R /First 162 0 R /Last 163 0 R >> endobj 159 0 obj << /Title(Module fabio.kcdimage) /Dest/section.24 /Count -2 /Parent 6 0 R /Prev 154 0 R /Next 164 0 R /First 160 0 R /Last 161 0 R >> endobj 165 0 obj << /Title(Variables) /Dest/subsection.25.1 /Parent 164 0 R >> endobj 164 0 obj << /Title(Module fabio.mar345_IO) /Dest/section.25 /Count -1 /Parent 6 0 R /Prev 159 0 R /Next 166 0 R /First 165 0 R /Last 165 0 R >> endobj 167 0 obj << /Title(Variables) /Dest/subsection.26.1 /Parent 166 0 R /Next 168 0 R >> endobj 169 0 obj << /Title(Methods) /Dest/subsubsection.26.2.1 /Parent 168 0 R /Next 170 0 R >> endobj 170 0 obj << /Title(Properties) /Dest/subsubsection.26.2.2 /Parent 168 0 R /Prev 169 0 R >> endobj 168 0 obj << /Title(Class mar345image) /Dest/subsection.26.2 /Count -2 /Parent 166 0 R /Prev 167 0 R /First 169 0 R /Last 170 0 R >> endobj 166 0 obj << /Title(Module fabio.mar345image) /Dest/section.26 /Count -2 /Parent 6 0 R /Prev 164 0 R /Next 171 0 R /First 167 0 R /Last 168 0 R >> endobj 172 0 obj << /Title(Functions) /Dest/subsection.27.1 /Parent 171 0 R /Next 173 0 R >> endobj 173 0 obj << /Title(Variables) /Dest/subsection.27.2 /Parent 171 0 R /Prev 172 0 R /Next 174 0 R >> endobj 175 0 obj << /Title(Methods) /Dest/subsubsection.27.3.1 /Parent 174 0 R /Next 176 0 R >> endobj 176 0 obj << /Title(Properties) /Dest/subsubsection.27.3.2 /Parent 174 0 R /Prev 175 0 R >> endobj 174 0 obj << /Title(Class marccdimage) /Dest/subsection.27.3 /Count -2 /Parent 171 0 R /Prev 173 0 R /First 175 0 R /Last 176 0 R >> endobj 171 0 obj << /Title(Module fabio.marccdimage) /Dest/section.27 /Count -3 /Parent 6 0 R /Prev 166 0 R /Next 177 0 R /First 172 0 R /Last 174 0 R >> endobj 178 0 obj << /Title(Functions) /Dest/subsection.28.1 /Parent 177 0 R /Next 179 0 R >> endobj 179 0 obj << /Title(Variables) /Dest/subsection.28.2 /Parent 177 0 R /Prev 178 0 R >> endobj 177 0 obj << /Title(Module fabio.openimage) /Dest/section.28 /Count -2 /Parent 6 0 R /Prev 171 0 R /Next 180 0 R /First 178 0 R /Last 179 0 R >> endobj 181 0 obj << /Title(Variables) /Dest/subsection.29.1 /Parent 180 0 R /Next 182 0 R >> endobj 183 0 obj << /Title(Methods) /Dest/subsubsection.29.2.1 /Parent 182 0 R /Next 184 0 R >> endobj 184 0 obj << /Title(Properties) /Dest/subsubsection.29.2.2 /Parent 182 0 R /Prev 183 0 R >> endobj 182 0 obj << /Title(Class pilatusimage) /Dest/subsection.29.2 /Count -2 /Parent 180 0 R /Prev 181 0 R /First 183 0 R /Last 184 0 R >> endobj 180 0 obj << /Title(Module fabio.pilatusimage) /Dest/section.29 /Count -2 /Parent 6 0 R /Prev 177 0 R /Next 185 0 R /First 181 0 R /Last 182 0 R >> endobj 186 0 obj << /Title(Variables) /Dest/subsection.30.1 /Parent 185 0 R /Next 187 0 R >> endobj 188 0 obj << /Title(Methods) /Dest/subsubsection.30.2.1 /Parent 187 0 R /Next 189 0 R >> endobj 189 0 obj << /Title(Properties) /Dest/subsubsection.30.2.2 /Parent 187 0 R /Prev 188 0 R >> endobj 187 0 obj << /Title(Class pnmimage) /Dest/subsection.30.2 /Count -2 /Parent 185 0 R /Prev 186 0 R /First 188 0 R /Last 189 0 R >> endobj 185 0 obj << /Title(Module fabio.pnmimage) /Dest/section.30 /Count -2 /Parent 6 0 R /Prev 180 0 R /Next 190 0 R /First 186 0 R /Last 187 0 R >> endobj 191 0 obj << /Title(Functions) /Dest/subsection.31.1 /Parent 190 0 R /Next 192 0 R >> endobj 192 0 obj << /Title(Variables) /Dest/subsection.31.2 /Parent 190 0 R /Prev 191 0 R >> endobj 190 0 obj << /Title(Module fabio.readbytestream) /Dest/section.31 /Count -2 /Parent 6 0 R /Prev 185 0 R /Next 193 0 R /First 191 0 R /Last 192 0 R >> endobj 194 0 obj << /Title(Variables) /Dest/subsection.32.1 /Parent 193 0 R /Next 195 0 R >> endobj 196 0 obj << /Title(Methods) /Dest/subsubsection.32.2.1 /Parent 195 0 R /Next 197 0 R >> endobj 197 0 obj << /Title(Properties) /Dest/subsubsection.32.2.2 /Parent 195 0 R /Prev 196 0 R >> endobj 195 0 obj << /Title(Class tifimage) /Dest/subsection.32.2 /Count -2 /Parent 193 0 R /Prev 194 0 R /Next 198 0 R /First 196 0 R /Last 197 0 R >> endobj 199 0 obj << /Title(Methods) /Dest/subsubsection.32.3.1 /Parent 198 0 R /Next 200 0 R >> endobj 200 0 obj << /Title(Properties) /Dest/subsubsection.32.3.2 /Parent 198 0 R /Prev 199 0 R >> endobj 198 0 obj << /Title(Class Tiff_header) /Dest/subsection.32.3 /Count -2 /Parent 193 0 R /Prev 195 0 R /Next 201 0 R /First 199 0 R /Last 200 0 R >> endobj 202 0 obj << /Title(Methods) /Dest/subsubsection.32.4.1 /Parent 201 0 R /Next 203 0 R >> endobj 203 0 obj << /Title(Properties) /Dest/subsubsection.32.4.2 /Parent 201 0 R /Prev 202 0 R >> endobj 201 0 obj << /Title(Class Image_File_Directory) /Dest/subsection.32.4 /Count -2 /Parent 193 0 R /Prev 198 0 R /Next 204 0 R /First 202 0 R /Last 203 0 R >> endobj 205 0 obj << /Title(Methods) /Dest/subsubsection.32.5.1 /Parent 204 0 R /Next 206 0 R >> endobj 206 0 obj << /Title(Properties) /Dest/subsubsection.32.5.2 /Parent 204 0 R /Prev 205 0 R >> endobj 204 0 obj << /Title(Class Image_File_Directory_entry) /Dest/subsection.32.5 /Count -2 /Parent 193 0 R /Prev 201 0 R /First 205 0 R /Last 206 0 R >> endobj 193 0 obj << /Title(Module fabio.tifimage) /Dest/section.32 /Count -5 /Parent 6 0 R /Prev 190 0 R /Next 207 0 R /First 194 0 R /Last 204 0 R >> endobj 208 0 obj << /Title(Variables) /Dest/subsection.33.1 /Parent 207 0 R /Next 209 0 R >> endobj 210 0 obj << /Title(Methods) /Dest/subsubsection.33.2.1 /Parent 209 0 R /Next 211 0 R >> endobj 211 0 obj << /Title(Properties) /Dest/subsubsection.33.2.2 /Parent 209 0 R /Prev 210 0 R >> endobj 209 0 obj << /Title(Class xsdimage) /Dest/subsection.33.2 /Count -2 /Parent 207 0 R /Prev 208 0 R /First 210 0 R /Last 211 0 R >> endobj 220 0 obj <>endobj 223 0 obj <>endobj 224 0 obj <>endobj 227 0 obj <>endobj 228 0 obj <>endobj 229 0 obj <>endobj 230 0 obj <>endobj 231 0 obj <>endobj 232 0 obj <>endobj 233 0 obj <>endobj 234 0 obj <>endobj 235 0 obj <>endobj 236 0 obj <>endobj 237 0 obj <>endobj 238 0 obj <>endobj 239 0 obj <>endobj 240 0 obj <>endobj 241 0 obj <>endobj 242 0 obj <>endobj 243 0 obj <>endobj 244 0 obj <>endobj 245 0 obj <>endobj 246 0 obj <>endobj 247 0 obj <>endobj 248 0 obj <>endobj 249 0 obj <>endobj 250 0 obj <>endobj 251 0 obj <>endobj 252 0 obj <>endobj 253 0 obj <>endobj 254 0 obj <>endobj 255 0 obj <>endobj 256 0 obj <> endobj 262 0 obj <>endobj 263 0 obj <>endobj 264 0 obj <>endobj 265 0 obj <>endobj 266 0 obj <>endobj 267 0 obj <>endobj 268 0 obj <>endobj 269 0 obj <>endobj 270 0 obj <>endobj 271 0 obj <>endobj 272 0 obj <>endobj 273 0 obj <>endobj 274 0 obj <>endobj 275 0 obj <>endobj 276 0 obj <>endobj 277 0 obj <>endobj 278 0 obj <>endobj 279 0 obj <>endobj 280 0 obj <>endobj 281 0 obj <>endobj 282 0 obj <>endobj 283 0 obj <>endobj 284 0 obj <>endobj 285 0 obj <>endobj 286 0 obj <>endobj 287 0 obj <>endobj 288 0 obj <>endobj 289 0 obj <>endobj 290 0 obj <>endobj 291 0 obj <>endobj 292 0 obj <>endobj 293 0 obj <>endobj 294 0 obj <>endobj 295 0 obj <>endobj 296 0 obj <>endobj 297 0 obj <>endobj 298 0 obj <>endobj 299 0 obj <>endobj 300 0 obj <>endobj 301 0 obj <>endobj 302 0 obj <>endobj 303 0 obj <>endobj 304 0 obj <>endobj 305 0 obj <>endobj 306 0 obj <>endobj 307 0 obj <> endobj 311 0 obj <>endobj 312 0 obj <>endobj 313 0 obj <>endobj 314 0 obj <>endobj 315 0 obj <>endobj 316 0 obj <>endobj 317 0 obj <>endobj 318 0 obj <>endobj 319 0 obj <>endobj 320 0 obj <>endobj 321 0 obj <>endobj 322 0 obj <>endobj 323 0 obj <>endobj 324 0 obj <>endobj 325 0 obj <>endobj 326 0 obj <>endobj 327 0 obj <>endobj 328 0 obj <>endobj 329 0 obj <>endobj 330 0 obj <>endobj 331 0 obj <>endobj 332 0 obj <>endobj 333 0 obj <>endobj 334 0 obj <>endobj 335 0 obj <>endobj 336 0 obj <>endobj 337 0 obj <>endobj 338 0 obj <>endobj 339 0 obj <>endobj 340 0 obj <>endobj 341 0 obj <>endobj 342 0 obj <>endobj 343 0 obj <>endobj 344 0 obj <>endobj 345 0 obj <>endobj 346 0 obj <>endobj 347 0 obj <>endobj 348 0 obj <>endobj 349 0 obj <>endobj 350 0 obj <>endobj 351 0 obj <>endobj 352 0 obj <>endobj 353 0 obj <>endobj 354 0 obj <>endobj 355 0 obj <>endobj 356 0 obj <>endobj 357 0 obj <>endobj 358 0 obj <> endobj 362 0 obj <>endobj 363 0 obj <>endobj 364 0 obj <>endobj 365 0 obj <>endobj 366 0 obj <>endobj 367 0 obj <>endobj 368 0 obj <>endobj 369 0 obj <>endobj 370 0 obj <>endobj 371 0 obj <>endobj 372 0 obj <>endobj 373 0 obj <>endobj 374 0 obj <>endobj 375 0 obj <>endobj 376 0 obj <>endobj 377 0 obj <>endobj 378 0 obj <>endobj 379 0 obj <>endobj 380 0 obj <>endobj 381 0 obj <>endobj 382 0 obj <>endobj 383 0 obj <>endobj 384 0 obj <>endobj 385 0 obj <>endobj 386 0 obj <>endobj 387 0 obj <>endobj 388 0 obj <>endobj 389 0 obj <>endobj 390 0 obj <>endobj 391 0 obj <>endobj 392 0 obj <>endobj 393 0 obj <>endobj 394 0 obj <>endobj 395 0 obj <>endobj 396 0 obj <>endobj 397 0 obj <>endobj 398 0 obj <>endobj 399 0 obj <>endobj 400 0 obj <>endobj 401 0 obj <>endobj 402 0 obj <>endobj 403 0 obj <>endobj 404 0 obj <>endobj 405 0 obj <>endobj 406 0 obj <>endobj 407 0 obj <>endobj 408 0 obj <> endobj 412 0 obj <>endobj 413 0 obj <>endobj 414 0 obj <>endobj 415 0 obj <>endobj 416 0 obj <>endobj 417 0 obj <>endobj 418 0 obj <>endobj 419 0 obj <>endobj 420 0 obj <>endobj 421 0 obj <>endobj 422 0 obj <>endobj 423 0 obj <>endobj 424 0 obj <>endobj 425 0 obj <>endobj 426 0 obj <>endobj 427 0 obj <>endobj 428 0 obj <>endobj 429 0 obj <>endobj 430 0 obj <>endobj 431 0 obj <>endobj 432 0 obj <>endobj 433 0 obj <>endobj 434 0 obj <>endobj 435 0 obj <>endobj 436 0 obj <>endobj 437 0 obj <>endobj 438 0 obj <>endobj 439 0 obj <>endobj 440 0 obj <>endobj 441 0 obj <>endobj 442 0 obj <>endobj 443 0 obj <>endobj 444 0 obj <>endobj 445 0 obj <>endobj 446 0 obj <>endobj 447 0 obj <> endobj 455 0 obj <>endobj 456 0 obj <>endobj 457 0 obj <>endobj 458 0 obj <>endobj 459 0 obj <>endobj 460 0 obj <>endobj 461 0 obj <>endobj 462 0 obj <>endobj 463 0 obj <>endobj 464 0 obj <>endobj 465 0 obj <>endobj 466 0 obj <>endobj 467 0 obj <>endobj 468 0 obj <>endobj 469 0 obj <>endobj 470 0 obj <>endobj 471 0 obj <>endobj 472 0 obj <>endobj 473 0 obj <>endobj 474 0 obj <>endobj 475 0 obj <>endobj 476 0 obj <>endobj 477 0 obj <>endobj 478 0 obj <>endobj 479 0 obj <>endobj 480 0 obj <>endobj 481 0 obj <>endobj 482 0 obj <>endobj 483 0 obj <>endobj 484 0 obj <>endobj 485 0 obj <>endobj 486 0 obj <>endobj 487 0 obj <>endobj 488 0 obj <>endobj 489 0 obj <>endobj 490 0 obj <>endobj 491 0 obj <> endobj 495 0 obj <>endobj 496 0 obj <>endobj 497 0 obj <>endobj 498 0 obj <>endobj 499 0 obj <>endobj 500 0 obj <>endobj 501 0 obj <>endobj 502 0 obj <>endobj 503 0 obj <>endobj 504 0 obj <>endobj 505 0 obj <>endobj 506 0 obj <>endobj 507 0 obj <>endobj 508 0 obj <>endobj 509 0 obj <>endobj 510 0 obj <>endobj 511 0 obj <>endobj 512 0 obj <>endobj 513 0 obj <>endobj 514 0 obj <>endobj 515 0 obj <>endobj 516 0 obj <>endobj 517 0 obj <>endobj 518 0 obj <>endobj 519 0 obj <>endobj 520 0 obj <>endobj 521 0 obj <>endobj 522 0 obj <>endobj 525 0 obj <> endobj 531 0 obj <> endobj 537 0 obj <>endobj 540 0 obj <>endobj 541 0 obj <> endobj 547 0 obj <> endobj 551 0 obj <>endobj 552 0 obj <>endobj 553 0 obj <> endobj 557 0 obj <>endobj 558 0 obj <> endobj 562 0 obj <>endobj 563 0 obj <> endobj 569 0 obj <> endobj 573 0 obj <>endobj 574 0 obj <>endobj 577 0 obj <> endobj 581 0 obj <> endobj 585 0 obj <> endobj 589 0 obj <> endobj 593 0 obj <> endobj 597 0 obj <> endobj 601 0 obj <> endobj 605 0 obj <>endobj 606 0 obj <>endobj 607 0 obj <> endobj 611 0 obj <> endobj 615 0 obj <>endobj 616 0 obj <>endobj 617 0 obj <> endobj 621 0 obj <> endobj 625 0 obj <>endobj 626 0 obj <>endobj 627 0 obj <> endobj 631 0 obj <>endobj 632 0 obj <>endobj 633 0 obj <> endobj 637 0 obj <> endobj 641 0 obj <>endobj 642 0 obj <>endobj 643 0 obj <> endobj 647 0 obj <> endobj 651 0 obj <> endobj 655 0 obj <> endobj 659 0 obj <>endobj 660 0 obj <> endobj 664 0 obj <>endobj 665 0 obj <> endobj 669 0 obj <> endobj 673 0 obj <> endobj 677 0 obj <> endobj 681 0 obj <> endobj 685 0 obj <> endobj 689 0 obj <> endobj 693 0 obj <> endobj 697 0 obj <> endobj 701 0 obj <> endobj 705 0 obj <> endobj 709 0 obj <> endobj 713 0 obj <> endobj 717 0 obj <> endobj 721 0 obj <> endobj 725 0 obj <> endobj 729 0 obj <> endobj 733 0 obj <> endobj 737 0 obj <> endobj 741 0 obj <> endobj 745 0 obj <> endobj 749 0 obj <> endobj 753 0 obj <>endobj 754 0 obj <> endobj 758 0 obj <> endobj 762 0 obj <>endobj 763 0 obj <>endobj 764 0 obj <> endobj 768 0 obj <> endobj 772 0 obj <> endobj 776 0 obj <> endobj 780 0 obj <> endobj 784 0 obj <> endobj 788 0 obj <> endobj 792 0 obj <> endobj 796 0 obj <>endobj 797 0 obj <>endobj 798 0 obj <> endobj 802 0 obj <> endobj 806 0 obj <> endobj 810 0 obj <> endobj 814 0 obj <> endobj 818 0 obj <> endobj 822 0 obj <> endobj 826 0 obj <> endobj 830 0 obj <> endobj 834 0 obj <> endobj 838 0 obj <> endobj 842 0 obj <> endobj 846 0 obj <>endobj 847 0 obj <> endobj 851 0 obj <>endobj 852 0 obj <> endobj 856 0 obj <> endobj 860 0 obj <> endobj 864 0 obj <> endobj 868 0 obj <> endobj 872 0 obj <> endobj 876 0 obj <> endobj 880 0 obj <> endobj 884 0 obj <> endobj 888 0 obj <> endobj 892 0 obj <>endobj 893 0 obj <> endobj 897 0 obj <> endobj 901 0 obj <> endobj 905 0 obj <> endobj 909 0 obj <>endobj 910 0 obj <>endobj 911 0 obj <> endobj 915 0 obj <>endobj 916 0 obj <> endobj 920 0 obj <>endobj 921 0 obj <> endobj 925 0 obj <> endobj 929 0 obj <>endobj 930 0 obj <>endobj 931 0 obj <> endobj 935 0 obj <> endobj 939 0 obj <> endobj 943 0 obj <>endobj 944 0 obj <>endobj 945 0 obj <> endobj 949 0 obj <> endobj 953 0 obj <>endobj 954 0 obj <>endobj 955 0 obj <>endobj 956 0 obj <> endobj 960 0 obj <> endobj 964 0 obj <> endobj 968 0 obj <>endobj 969 0 obj <>endobj 970 0 obj <> endobj 974 0 obj <>endobj 975 0 obj <> endobj 979 0 obj <> endobj 983 0 obj <>endobj 984 0 obj <> endobj 988 0 obj <>endobj 989 0 obj <> endobj 993 0 obj <> endobj 997 0 obj <> endobj 1001 0 obj <>endobj 1002 0 obj <> endobj 1006 0 obj <>endobj 1007 0 obj <> endobj 1011 0 obj <> endobj 1015 0 obj <> endobj 1019 0 obj <> endobj 1023 0 obj <>endobj 1024 0 obj <>endobj 1025 0 obj <> endobj 1029 0 obj <>endobj 1030 0 obj <>endobj 1031 0 obj <>endobj 1032 0 obj <>endobj 1033 0 obj <>endobj 1034 0 obj <>endobj 1035 0 obj <>endobj 1036 0 obj <>endobj 1037 0 obj <>endobj 1038 0 obj <>endobj 1039 0 obj <>endobj 1040 0 obj <>endobj 1041 0 obj <>endobj 1042 0 obj <>endobj 1043 0 obj <>endobj 1044 0 obj <>endobj 1045 0 obj <>endobj 1046 0 obj <>endobj 1047 0 obj <>endobj 1048 0 obj <>endobj 1049 0 obj <>endobj 1050 0 obj <>endobj 1051 0 obj <>endobj 1052 0 obj <>endobj 1053 0 obj <>endobj 1054 0 obj <>endobj 1055 0 obj <>endobj 1056 0 obj <>endobj 1057 0 obj <>endobj 1058 0 obj <>endobj 1059 0 obj <>endobj 1060 0 obj <>endobj 1061 0 obj <>endobj 1062 0 obj <>endobj 1063 0 obj <>endobj 1064 0 obj <>endobj 1065 0 obj <>endobj 1066 0 obj <>endobj 1067 0 obj <>endobj 1068 0 obj <>endobj 1069 0 obj <>endobj 1070 0 obj <>endobj 1071 0 obj <>endobj 1072 0 obj <>endobj 1073 0 obj <>endobj 1074 0 obj <>endobj 1075 0 obj <>endobj 1076 0 obj <>endobj 1077 0 obj <>endobj 1078 0 obj <>endobj 1079 0 obj <>endobj 1080 0 obj <>endobj 1081 0 obj <>endobj 1082 0 obj <>endobj 1083 0 obj <>endobj 1084 0 obj <>endobj 1085 0 obj <>endobj 1086 0 obj <>endobj 1087 0 obj <>endobj 1088 0 obj <>endobj 1089 0 obj <>endobj 1090 0 obj <>endobj 1091 0 obj <>endobj 1092 0 obj <>endobj 1093 0 obj <>endobj 1094 0 obj <>endobj 1095 0 obj <>endobj 1096 0 obj <>endobj 1097 0 obj <>endobj 1098 0 obj <>endobj 1099 0 obj <>endobj 1100 0 obj <>endobj 1101 0 obj <>endobj 1102 0 obj <>endobj 1103 0 obj <>endobj 1104 0 obj <>endobj 1105 0 obj <>endobj 1106 0 obj <>endobj 1107 0 obj <>endobj 1108 0 obj <>endobj 1109 0 obj <>endobj 1110 0 obj <>endobj 1111 0 obj <>endobj 1112 0 obj <>endobj 1113 0 obj <>endobj 1114 0 obj <>endobj 1115 0 obj <>endobj 1116 0 obj <>endobj 1117 0 obj <> endobj 1121 0 obj <>endobj 1122 0 obj <>endobj 1123 0 obj <>endobj 1124 0 obj <>endobj 1125 0 obj <>endobj 1126 0 obj <>endobj 1127 0 obj <>endobj 1128 0 obj <>endobj 1129 0 obj <>endobj 1130 0 obj <>endobj 1131 0 obj <>endobj 1132 0 obj <>endobj 1133 0 obj <>endobj 1134 0 obj <>endobj 1135 0 obj <>endobj 1136 0 obj <>endobj 1137 0 obj <>endobj 1138 0 obj <>endobj 1139 0 obj <>endobj 1140 0 obj <>endobj 1141 0 obj <>endobj 1142 0 obj <>endobj 1143 0 obj <>endobj 1144 0 obj <>endobj 1145 0 obj <>endobj 1146 0 obj <>endobj 1147 0 obj <>endobj 1148 0 obj <>endobj 1149 0 obj <>endobj 1150 0 obj <>endobj 1151 0 obj <>endobj 1152 0 obj <>endobj 1153 0 obj <>endobj 1154 0 obj <>endobj 1155 0 obj <>endobj 1156 0 obj <>endobj 1157 0 obj <>endobj 1158 0 obj <>endobj 1159 0 obj <>endobj 1160 0 obj <>endobj 1161 0 obj <>endobj 1162 0 obj <>endobj 1163 0 obj <>endobj 1164 0 obj <>endobj 1165 0 obj <>endobj 1166 0 obj <>endobj 1167 0 obj <>endobj 1168 0 obj <>endobj 1169 0 obj <>endobj 1170 0 obj <>endobj 1171 0 obj <>endobj 1172 0 obj <>endobj 1173 0 obj <>endobj 1174 0 obj <>endobj 1175 0 obj <>endobj 1176 0 obj <>endobj 1177 0 obj <>endobj 1178 0 obj <>endobj 1179 0 obj <>endobj 1180 0 obj <>endobj 1181 0 obj <>endobj 1182 0 obj <>endobj 1183 0 obj <>endobj 1184 0 obj <>endobj 1185 0 obj <>endobj 1186 0 obj <>endobj 1187 0 obj <>endobj 1188 0 obj <>endobj 1189 0 obj <>endobj 1190 0 obj <>endobj 1191 0 obj <>endobj 1192 0 obj <>endobj 1193 0 obj <>endobj 1194 0 obj <>endobj 1195 0 obj <>endobj 1196 0 obj <>endobj 1197 0 obj <>endobj 1198 0 obj <>endobj 1199 0 obj <>endobj 1200 0 obj <>endobj 1201 0 obj <>endobj 1202 0 obj <>endobj 1203 0 obj <>endobj 1204 0 obj <>endobj 1205 0 obj <>endobj 1206 0 obj <>endobj 1207 0 obj <>endobj 1208 0 obj <>endobj 1209 0 obj <>endobj 1210 0 obj <>endobj 1211 0 obj <>endobj 1212 0 obj <>endobj 1213 0 obj <>endobj 1214 0 obj <>endobj 1215 0 obj <>endobj 1216 0 obj <>endobj 1217 0 obj <>endobj 1218 0 obj <>endobj 1219 0 obj <>endobj 1220 0 obj <>endobj 1221 0 obj <>endobj 1222 0 obj <>endobj 1223 0 obj <> endobj 1227 0 obj <>endobj 1228 0 obj <>endobj 1229 0 obj <>endobj 1230 0 obj <>endobj 1231 0 obj <>endobj 1232 0 obj <>endobj 1233 0 obj <>endobj 1234 0 obj <>endobj 1235 0 obj <>endobj 1236 0 obj <>endobj 1237 0 obj <>endobj 1238 0 obj <>endobj 1239 0 obj <>endobj 1240 0 obj <>endobj 1241 0 obj <>endobj 1242 0 obj <>endobj 1243 0 obj <>endobj 1244 0 obj <>endobj 1245 0 obj <>endobj 1246 0 obj <>endobj 1247 0 obj <>endobj 1248 0 obj <>endobj 1249 0 obj <>endobj 1250 0 obj <>endobj 1251 0 obj <>endobj 1252 0 obj <>endobj 1253 0 obj <>endobj 1254 0 obj <>endobj 1255 0 obj <>endobj 1256 0 obj <>endobj 1257 0 obj <>endobj 1258 0 obj <>endobj 1259 0 obj <>endobj 1260 0 obj <>endobj 1261 0 obj <>endobj 1262 0 obj <>endobj 1263 0 obj <>endobj 1264 0 obj <>endobj 1265 0 obj <>endobj 1266 0 obj <>endobj 1267 0 obj <>endobj 1268 0 obj <>endobj 1269 0 obj <>endobj 1270 0 obj <>endobj 1271 0 obj <>endobj 1272 0 obj <> endobj 260 0 obj <> endobj 1288 0 obj <> endobj 225 0 obj <> endobj 1289 0 obj <> endobj 221 0 obj <> endobj 1290 0 obj <> endobj 218 0 obj <> endobj 1291 0 obj <> endobj 575 0 obj <> endobj 216 0 obj <> endobj 1292 0 obj <> endobj 214 0 obj <> endobj 567 0 obj <> endobj 545 0 obj <> endobj 1293 0 obj <> endobj 538 0 obj <> endobj 1294 0 obj <> endobj 535 0 obj <> endobj 1295 0 obj <> endobj 529 0 obj <> endobj 523 0 obj <> endobj 1296 0 obj <> endobj 453 0 obj <> endobj 451 0 obj <> endobj 1297 0 obj <> endobj 261 0 obj <> endobj 1273 0 obj <>stream €@@É¥2`Äaƒˆ° à8|@d×Ù‰ôu|•@ªà}â{¼‚/tH=îSpsyÕC7œ'#IœÐt b‘Är9‹!€Àr ›L³Ã„Ü &˜N†ƒ)¶´iª›3yŒÒe:h#ÉùÐà:‹Î÷1q„ÚsÎFqð¦”w4ÖÄ#)Φv2™cyº€N»D¨d8]”†Œ'ÓÔéS¬Ì•3pL47FòÀ´D"œˆÇ29Ðu$ŽæÁˆòc&žŒ„ã)<ÌPŸJf¢¡¬ªl+FÌh5 zbxr€  ¢€ 0¦€ €@ª€ ÀP® „ † @ˆÀ¶ ^À#€ˆ$H% %€¨&°&€¸'ˆ ˜ ¨ h€ TJ‚ @ V€$À€D@€e8€ƒÀ €¤€ €Æ˜Cçhh#@lB˜f@R¡HcÁ(vâ mÐ s‚"@"jC&‚g(1‚ È*E‚Àh,g‚ã@.`À2!%p4 Dp6e 8% ˜:ƒÁ)ðDÇÁ~E•GÀ2P¢¢œžãÑîu‚¤áÜ}„d 6¦!2CÎ}„0Ú‘É 4‘DI7Ž„X®EØàÁZFiJEÜåùV‘Eè’P ,Û¥!I$q>’E½úI–äXJeátT”ʼn6V`AdOŽâàøD¢'ظBŒ£Ù&‘`ÍŽÜw-ÏtÝwmßxÞw© MDq6“G!R’%yN&¸´RˆÁpª Ž#à<$h|€%PQŸ$È| ÇÀ, žáéî-“„ùf]ùX3‘C 5c.m$uÜã‰D„Q&Dƒ%©GDYEä1 A'ØD}‡ ÀX{ŠD!.E‘¼€2E“%98[—ˆ03‘2c&ƒ!·‘D>‘DM€ÆYK„àÒ{ƒgÙH c)öE‹â¸–A ù @‘DŽäajFá…™]e™·’%HêF ‚¸ãl{‹‘°ÔÄ÷M`ƒÑ¼>À†ŒãîBF5ÁÀ÷ƒÜ v°¸%"X}ˆI Ĭx`{€!T/€ø¼cDG‰Æ*Æà|”!ÐAË€Ð@øl AP6-ø4>C0uCä´áî!0ù#ä%Q&!Dp…â DÐ@<"DPˆÂ$D…PšOÍùˆÁ$‚ðà B~ ‚:>Ãû ãì<°—1ÜÈ£\hŠ¡x0€øå‚\w±¨„‚D7ñ"@ð„ ¡ì „@žÂÀRS¸Ò‘†=ÂL-àìsp ÅØÌcu0Øð1eÀûb Öˆ±Ä`b,H¹ZÄxŽƒJÈ}…aT=Á`¡¨RPä7Uàv`Ü „Á#…•Ã܈ñFİy|hÕà,=ßP Š#ÜÁª AÐS Áü@Y˜>Á2ÆYMDsăð5ˆ@Æ„XKd,q‹õÍX¾"¹•1,>0à c ñhÃF8¶ õ4¡ö S "È\éF>¸‹£à4áŠ>  Œ|°*%„Åob< a €ðü @-°êE ®à˜i ±îªð/Ãð?Áô ćΠˆ!#ðø àdq>C ‹3TИÃli=¥´Ð>A¨êW€¦°٠a|1VðÒCˆu!ô@ˆQ#Dˆ•"pŠMózN‡¸3Š@<}ƒ B8ŽQÒ;Ù‡XT`¼=qöè!áˆ*0¬ ˜h*Ò*FHá$%ùtc×qX’`ùª“‰`+ˆB°û!h*°cжs‘r6GÉp=Äð@g þƒ¸ˆ‚ =ü-ǸÄ>‚°Þ£ `Yq $X/Rb …E!6à<ˆ ÿ©€0”÷ü~ p ÈÅ ±vØD?tÁü5ˆþ™uÏä¼±ð5qQVŠÙ\qÒ8•àtã™`8Î ¶*ÙBɈÄHYK0EC…ªÂðû s B"¶zÈb0\ˆØ_[GŠp)wÀÈÀ ÁüHŠ2*ǸE ìN 1h:G3 @=ˆAbP ¢B H(Äø©aÀQ@–‚°Wm|‚:.«¸¹Ðä+ÎP6@¨ßÃ3Opó©8>§Õ:¬>îA{ à7‰=q®µà÷@Š@¾mÀxØÛ#elÁsÄ@.Ñ{OjÐÊ϶vÞÝÛû‡À?ñ²"Å‹Â,qÀ'®Ê×k³¡üIŠ/Ùš±Â½a<GÀ%ã©‚¡ðÀ¨•º¹ $‡~Aù£øw(jïÜQàG‰BØiaÐOêQLH…B[ˆ!Žüp !È"´à÷¢¡6"ăð/ÌD-Pè>ÀЇOÄEˆp!x‡B@FÁ><! !0  Ò!ò àL!êábaH!8àÜ âª ¼€¦Á !îa<Aü+p<A(AÁ!8Θ‰äàúV JžÉð½@ à¼¡"Ð Šl(è ¡ A á çB´Á ì¥ÂDºª 'Žá á è € <Z`ÁîêÚàá’μ«ÀH@>€A‡"®’aF þ !KHÀ˜@Ø`´ `d!ö ö ö !öáöéŒ` ªa¾aZÁ^²ê`ÇJÖafJæ LjÊî>!îÅváHkFÎ<á*øÀ !î V`Z ÀVïÚ 0ëN¥ªþ€ü T. AZ <¡T¡0¼ Bà„ úÀâ`øƒFa ÃaQ$Ï&”®á’®áZiÍ+Ô áð¬´aÐX ¢e€Ð€`ÊsásÀÎmÅÞu§ø@ ªrË^u >wÀò¡öíhá^!á¸d2N^RS%rZta&@G&‡Y&Òq'A 'Œ~¶(z-¸ÛÍÀ-ÄdgþÈòaï.a ¤`À ‡Ü'Â(èíP‰,À áö²ÂñrÈñ¡-ò2Ù-Æß.0¢Ž’ë.òó/rúV!~ô…l±œ˜jaNœ¡ö¡~@øGè o¡àE–ZáÀ>°@$ Ø`® ¾ Ö `Ø Øa „AbÏøÁà>¡îXsQ5SX3]6dY¡öÁ >c a ÁT äpÁ* ÁÈ¡JÁXá\•pÐ á†óŽ Áu*táNAvÊ~SXêÊ ¡ ¡'âßÏàa(°áGÁªl!Vòa>ÆX nKî á ÇORÀÙ@AFa(à2AØñdAöÀ0 AîÕ¼›Õ \a\¦XA cËp A µãYØç ¡$ À2´áØàðÁ qà2¾!a"áîîà0!öç T‡á%ej攨@!@àrWˆXæ¦ ’¦â€Â`Úxa¢l!<¡(‘øá"aDà,aB®ázàLà” `ô©äDaN ò(ÁTÁ‚ÕàAR €²! ªê~@èAö! `Ï`\|€öaÈA¢!&ÀŒÁPa>.Áè!`£ÀtVˆ Ø  Ì`æ ô  ÖáiÁî!î*»õêV  iÁ.„Wˆ@ ÈV Z6¢ à @ÈÇôrjN¡LO-§¦!.¸¡ *tPLg&a.a&aÊ0ÀRA®pç&!@Øßhš!aEÐahALã€F!Tm¼K;"nb ¡Ìêš¡€|Æ5zÞ5Ñ P° õŽZA$A8à ær`ì`ö'-ü ÁO   0Kâr)Á,AP´ƒ T†! 6"u"tÕ(måŽA593S8·Ÿ3Áð¡´WhŸ“LSR‚³¯;&ç;uÐàÀòàPÍOú® 3W _zàÈ Ð*¼}K.™Hàᦀ…7âæá +Ag a:ZaNÆ¡”DA  >8঺a pá¶"“ŸxÊ@¯A¶iÁ4°õjahAk‡4 ‡V`ÜtÕM•Y!$¡ `ü`üÊÎ`BaP@A1(õ¡Óæt„çA u`Úm!6/7ý `Ø!Âaà¡~-ú à^ æ€Ö Ô G<á¡4Áè À î`ö Þ@Ì A\ ÁpŠóâháð LáX^¯¡œîÒj`zjÀ* áÚ (#nTNÁf€† ’`:¥!öéxºáºÞÀá|üA(a JÈÛÏÈ @Ž @Ô & @šÉîw¦à.a2´ê F@QBô xaòèVA‡D£ÀvÔK+s'tZànüa ÀJxÇyZ…Wv¸aB€ÁK‹‚@ `ŒaIypjbV¡îú!á0ETªØ aîòÀ1µàT©0òÇ,¥‘G(ÁGÁ.S).Òðä³1µAÈR×G…oC…ä`xÀæþ¡daøÀ0V  iN…p!ð f¦ ÁðÉý Jp“Î!¤Ç|¬ÁFà ÁJ*¼à aÜ€üà¨p¬/î€ ÀÀžÕ`Ü@äá ÅÝ36¯XÈ}<ØÒ“÷Ó¬S°3_ŽnŽ¡àåž a`Ò@…@,gxKQrÀ¡Ò‚%"a¤à+?8»?“ý@®T @ôA`> AN¡‘a@ì €Ì €Ü & €“Á 9œ¢ábá€Kž¸@„¯ b’)¯6WÚ ^¡[[·]±¹*àÀ &vá,`jˆå û*Ü›0Á³vɳÛ@{å´›MµúAð!!_kßî!øá%M¡TÀ2qç3AaЂnarOÑL`Ð@´lá¼ œ Ùš%K* Ì&  öàˆ€|»Ý¥àÛh „W•%4!ðî`+^¸Ë† Ù ^aöw2„w:¤ºAèàK8™ÆV£ÇAÀ< `^° º PžáS lðá@ºÔaÔUêÄ`RàêA ¬ò ê­¯¡ìð!Ú½AFRkOÄÊ¡ö aöÌ^”ýýéÉ‘nõ·`€ò¿+ò *àt‹©b¡¢žà>áâ!]‘Áà áö@tz¢ ^à–@v [JƒAî­×y!îpex1¨k ¼„ AÊaw}!Là2JáBUí‹¡a Ạa(ÁRaH\ Å€|À ÀôÐÞÛ  ¼fF Ñ¡´€À~’·n$âŽ,­(ãX ^'DØ• A}Lí )ÞÏjî!Jᔄaêåxî±°ìà(Iª ‚~çÒ×»+;+ ?+ûŒñ’Ì æ²-b‹Y"Úhµz!z £ˆäÊ1&;‰‡äŠ…ŒHÅî'¼*TE¨°C„ Ûcœ§ÔA¥d‡ƒ@ÂTûÏ„CìÄ¢{”˜­ú1y´L¯ÔÊ׺±€¬c€ß GÁ*†DŸOȳà!“>'“ ôª•*…V æÑ´Ò@¥M*R”¨T2 Œ©£‚lôA Ì¦4YQiMGò9àÄ[E—¦ñaî u=Å 7¸ î }†QbñL nF”ˆµ:- ŒT©Tª³ŠÅ ±;œM· ¤=(ƒëušå˜ž¦Ÿip©°Æc$Ò EÄ>¡V«SЉRr~% äs¤Øðh3ž ’£[íîëµaX­äÄñ,Eš‰QÆubœ a(> —äYT|% î3  ð(ÊÁ {˜`©N‘dqM¸´RˆÁ°¬' C¸6–#Y&'“C)* ä€ÔJ„hÔL…i_Á¢lG¸^áôEäXö»d.G6¸<æ)ö0”'Á·Zµ°štžât{™µð*SŽÄèâ6 Ö æO¥9SB–€n}Š`¬–=ǤT€CŽ6ðc“Ä8ÜAìQ‰'à:@Š€„(K6ÐæEŽ„Á^H’•„NOÄøßÞÀo£\hŒÑÆ&€ðÝ„̬GذVà †•>¨âµ ñ%i³D` {€‘^8p!ÌD>)0žáÔÆž‡Ü6†BØ{‚ñ*,‡¸4bhEŠ!$DP "@D'Pù3‚€ `Ö"ð!%A•w A-Õb0æ-MÑx±&(D`‹â4K áð½#Ü8а)ÇÀ§Wc€{‰—ª#D0•qÌGQš%„˜ÎBÜF µX*€Àm•o°à"Âh¢15ˆPÚDÈ—Aø;‡€úƒ `ˆ ±ðÑÂ:Gˆùí$4Š‘×LIÉA).¤®¦×pŠ}z 1ÄH¥_I±7'Ê#àõ``|j !4…pJat ‰Pô$‹à ;‡Ñ@òÂ0cˆÑ@"Å0‹M"˜DªQTX}!Ä]>D  \U+p~8`°Zb Q&.G‘´“A”D…Á_˜‹ b46Êb!Rð¢",+-¡"Ø #ìv˦^ÁØ+K!ŒÃ@0éÊ"ã8|‘ *Äx–IdP€hØC@ˆ.OAÄXgÉ­òˆ€ú"„f‰Q„$Rá4~Tœ"Ë€#ì àp=á0iíìúŠ\«Ðˆù2Vq0®Å˲í‡Ç°Ò ÀHÉ!%LDž”RšU™+µNÌÔÄlW ½"¾jªi°ªUZ­¡4,PCCǸ!‚ 1ð7€¨¡b´RŒº8`‰ b*P†¡„hs¥N‹ñ2CÒ:" >KA4?°  xJˆ¤J#ÀÈ«)”U¦*°‹ 4¸F‡Kš—F|EbP1“ê?°â8DD`2&Ø !Dô$j«(`‚"™¢F‰Q:)E`ð*…`¿<„8â‚T/ˆ°\"¨AÅ8;‡Ø—–B_Y4‰efåëtÙÅØ§ò`LI‘3&‹O5ÕBsN©Ý<§´úŸÔ ƒPªD¨µÈT’”RÁ•L)«=ŽÔþ>TY€*tä²xOBÝ>'å ”"†Q!E(Ť2š•Rêfe)Üx¨1ú¤_y 2ª¢?k u#ä 6†¨÷CL¬ 1ð¨âÜ °@O‚{, hÄ0ƒ`è>ÁÈ‹ @ & ‘ö G¸-c€\Bq~†÷bT{ƒ±)@@û#óI –'¸FˆNб®Ååb`ñL4ƒøû¡1¸^€øcÚ?†òTPbz¨[‰ðgÆéX£ä Q% $a«‡ð<X1gÄDˆ 7úd%#R¥=î~¤¨6L±\#‡‹|PEñ1\Cq"D@Ð K(¡` ‚n!6¸ôƒÂÙaê=Ãå+ÉÞPä„H„á,>‡¡ÐVËÙa€D­v0÷¯€x1j,ºã0EŽhLÁ¿¤ø#€’Åp†Ï8Q‹LDàocâ,Ep<+`È• aXÂ8B ]| °-R•"CúGÀ( Sw:=Á!FCÀdŠEn ³êì[qÊDù²bŒ7 Ðê$·k -2ÀRè—aÀ q+q ˆ> 0ÐBà Øn…aØ=Àð÷ÜA¦Æ`4ß, yA(b‚qöB5 àK‡1X,Äð¬‚ØÅà<.Æ(Úø q\˜søŒ+ø2‚À4H/„@<: B„I„@C„XB€@@„E¾«”P{€Ñ  t| ¬ |x7F·¡«@q¬„P>„àà.@@> üè8:ø9Ú´ƒØBŸxÂe…G#‹¨E‚5XF„¨F´'Âp?ˆÛú‡(F„¸‡z¨p€0AÀ€ª·H‡ØD¼hD`чh{‚a €¸o³t±¼°oØ;‡Àd€¨Xú=`q‡(LœxFLFXC„‚ÁF"¬ ˆ0„ˆ/ø?„‘ØA–ññƒè,‡Ø^€Á°$øC€AŽ(K@F›8pZ…ðS•ÐU"ƒ¸A‡Øƒ0%€ø8‚è-0*®HE‚xV„mDàJQ€@ZØWM5‚Š’àH#‡:Ùª½¸‡h'†àÀ/È5ƒ2< , ˜s…cDÀ.@¬ø|zÆ€A‘ñlÙL5Ø!›çØv‡HZ/) ¨C7€@-„3à2‚ð¸Z_†.p#`}€€+ 'ƒÀ}€@ã8Ȩ}†Ñ*0C;’òÐjÑZÒ-3/­K@`†{†è‡¸0X«@9’XA¦+&C¦\ Ê¢² 0-S@•qX°tð.†8 …X9È;H8h6ƒ N T–pR…iשXÇ{„ƒDÈ ¬¸| ‡»ÆB|(˜}€Pù½„Èp^` „àÚHJ8;(=ÀEƒ˜ØJ°Û…O·01ð1‚à/ƒ ;ƒ  X‚˜H%[‚À<–@ Iƒ¸ ɬ›ÉÌÉ쟦aOÊòÒˤ-\¥Êl§¢ôœIÐ2ÉäŸ2È…š3hñˆE‡EZˆtÆBJ¤+Ù˜L¥ .‡À3¨M‡HqÀhXIˆ#\ƒÀ5„(?Ÿ;€@8„øA„a: Í}€H Ø4ŠBÀ!¶7°€0¢¸…PÐ€ð „øHP„ `€€ endstream endobj 226 0 obj <> endobj 1274 0 obj <>stream €@@É¥!ˆÂ >`Àpø€Ìo´sé ùAU¡Á)¸$ø^é°{Ü àæãš†o8NF“9 è Å"ˆär7C€ä@A6™gf3 ¸@M0 SmdÓT6 fó¤Êt<Гã¡Àt/îBã ´æ.7œŒãáM$îi­ FSHìe2Æótüu2ˆ!PÁ€»' ››NS¥J®o2TÀ !$‚n,ä3hˆE9Žds¡ êI;ŽæYàÄL<˜É§£!8ÊO3'¥#ILÔT5•M…ci\`1 ƃQ°Üp9ËÃÑ@¤€+ ¢áx/H"ÀŒP ì€0)€8*@*€H+P+€X,È!€h- Ø"€x#pŽ f @h `j €l  n Àp $`( ,à0 4`úÀ<    À Þ% ¨€4Ѐ’›` j ($€)ê€8Œ‘€@b@AÊ‹€IxX.™ aƒhâpÞ@xÆž €øàˆt”€" €™ ¡4 Š`©l @±˜ ‰ ¹ ŸÀÁŽ ´84&F61eà86ƒ‡è:1§`<@ƒÅ¸"ƒå>}hB &D@øD„C°F@eQî,•GÀ’O€%Yò €gÀD|‰€© L$öEåäA C§ØÆ~@Àò, càªE`Q…±Wã$Y~D•dQzeP,ŽE!JG„©FƒåÉî €§¹ØZFäi EàÈÚ)‘c€=¡äq¢E–$YlE—$QjDéúˆò‰äXúI`}”'Á* žà)ölòC¨ þ2|¥¨êP‚G¸hã)  ‚eÇD{€©öPâñE‰˜W…ñSe.”D•ºv¡© ™pžâ`yšF–e¨¤cïcÙöºqÝwö—àð:®EŽDYT¸¦‘g26ãé85â‰!bàÀ7‰ @&6 `„@V„êFˆ“h±qÆGÈ@Q¤ÉA0øÎ@pº(EX­cF–¤P\/”1ˆ°¶"ÃŽp-Yˆ¡BDXtbDˆ‘ Ø`ô · DHŽÂLEˆð2"ĸ¡‚ÙPµ Ð"Àea°E„Ñ„l3Àa±Ù w ¡t°2Ý`µ¢°E‹Exˆ| .ˆÀôïè‹‚8G‰!,=Á÷ À`{ƒ!ö Äh‡ÂEˆˆžèz íá¨ÞXµoùÀ<0ðßvØU+‘òÈ÷¢„{‹!Tè@øÞãv!ÞêÀ÷Cà9Å`Bèp ‡`®ÁX%… n>×ðæ@Tv á 2ÄXÕˆÑö€ðüA°Q€a°#DgãðQ€p&=8‰ø0ØE@0÷#”r‘ÄF´àà|&±´ë€ˆ…BHVÀˆ*` Daæ Ǹ à4xÑîÞ qap †Åp!È[ˆ±"Ú@²cQ‹qL.EРb.®‹`ê)CpoÚ-qC¨_¡x/†à²"å°f¢¨|‚Ù~0Çø b¹ªºÐ0ǸêuÁŒ{ƒaö G¸NàÞ§<€%DX’ÎÌBˆ„û`€Ô;‡ØX£Ü_ð&<¸¿á\VŒîG 0`˜Oádè™°lEˆæ=Ä–„@y8Ä !3 ð°/A\vc }„ñö GØ3a‚• ñö˜Ð,q dZµP$=] ›Πvp€>`°@V„4„… öØnÀÐõÝ£¶¢0_ˆ×|ïð‰Ï ¨€wŠ"Þ8÷€Jq ŨUö{€±çSœ€C¸}€Kl;è‹ !|;‡P#‡ÚÓáÌŠ|/25€ƒ"õ9 A¸A a”O‹@àÃè b0E‰õs2DX­ú ZE#%ãäY–ím¬;Ϩ¢u¢ '"*Fà÷°€aøGàû‡ï˜Eˆ02„€‹x| '¸Ÿ¡ÈZ>hû ¶}ƒ‡.>D|‚@{¯±ðÇxÃäYèç¼ùŸsö€Ð: AÀ š´{‚‚\=Âûcܰ~ÇØ € Ѻ:>ŒÐšSPw€a’"Æ€uÁ[( D^9œà'†p´ÀR 1Ö[Ér1ØÐ¬º°Aî… ÷bGf‘îÈ×´ƒª…¨÷Úl!ö ƒ BaRš4Ëhî™ v `Ö €ÿºpˆØ €õ˜€hÍ9ªhH-b˜* ±öÀF|Yè~ yé=§Äúsm͹×?}Æhõ. lpv=ÇPà``]¶¿=,„`º¢œEÖ±uÛdÃÀ ˆ‘,+Þ@.¤"Ôr q$#_0 Epþ"È â€> :)¸«a°T<ÿßÀg ô0K`A.EÓ;ïƒïà©ÀAih|ƒÀ*?ÏG×3è~;¯À0®ÃdEÖ!h"Ç5`î-D5pX"ÄÀ®y(p€qÖ%y?)ü¬qX£ÜHóM·5@e B,R>|º —x@8Ðl'€¬È]pò) »uø2p¬¡Báºeà†° Æ n áˆðða0A+Á€òÚ0àõá,<ËŒð¡<àÂËGÒárÁ¦Ú þ¢`Ô`È`Âgü¦ÀŠA\¡h'Db ð<áàºK¨Á`þÏáAÊàÄ`øÔ€   `Ð`ÞÀê¶ÁÈ`âá `ú–ÁH°aé”c J°ëÁÈ \uøÊ@*ê`ÆË A&GNÎá €ˆ˜ðZð ‹”TJ á ¨RÇAr*Á^áÚ`ü  Í=³Þ‚a:dfJáî€*¡zO“?Àë@!‡Ü`¼ ñATbèl!TæÖ! Ë„€0ØÁVá.O2Êĸ¦¥@@°4  ÝEÔa(´a6!*Á ¡, ¡$ ÐÀ02Á/ h›X5‡D´OE(t“€¬€ÏY¦„¨ .¦à$aì ¡p­Cá"2·^âa`á_p¬0¬ÔƒHg1;!BF4 aB¡Ê!Î'@¡° aγa HuÚîà*àÆÀÂíà!¸á†GÖ ä¡ A š ¸}‰T@ÎÈ@²h^rÀ¸ Úàô¡N¡>¡.ÁX >Á\,kˆ “V ÉüÁ€ ¡ €ÚÒGÆ àAØUvN¦øa<@ NøÀ† ¼ @ÄÁzAj˜@r2L)°Vô¦Jðç î!&a€Á¸„¦¤! fã¡ A 2¬èj(tàö!aa›)I(R›&Òq'Rx}(*¨fŸ²ŽŸ’Þ×Ò¸÷Rè•Å<‡‡/3Ôà‡1GÒAî '^0£ÀþmӜΩJnæòÆð•‰ ¡Á ¡nËáFé¨&áð“€aîà*!b!xs’áhAu?Àã! ¬ ýU•œp,e÷vÁ  šˆ€z´(žA4?‚ !eàì!Üëì¶At ìh 0Ô  `¢ †èîáJ¡T‡| R!FƤ¡¬A!Pa®à0a^ma@ø HáR†¡Bçoz|éZ÷è!PËá~ýµ(ix Ó¿V¿`&‹ür¢À“0HÐS°Ba2×ax4 ²­–ÅÌ`©àRÆ€ lr ¸`òÇáög GØ̶Á6A†A'ap¬â`Ê Ä×e `Ì ž À¼ÀØ  Õ~€½¡Fa`Ë+ša:–À — Æï×7ÍüTN$­9BÆj!ö‹.>£€>RáZa2@<’v á sœÇ3£¡+¥+j¯ÔqÊñÁ¾ !<æJu6¡JA|‹˜¥@‡U` ¸4hATA7§Ê´ÕhàLaˆ³!*-R‰ÁJÐIuxf0;E€ÇY”hÍŸ@ÐàT€j Ô ü ¨ àŒ aÈr`ð¡Tá'Ž¡6J6ŒzÀÚ Áj ázAhˆrMOqèÎ’©„ áζJi’©@Ürn¡j(A á\ÀÄfQRÀ!:áN¡>Rà~@|¨^`` òáèÚ!ÜØÇÒAVà¡+Ba¡ÀÜÀ”à̰ ÀfÁî¨Q½sRXNF“€#àR¡!«ç¯e¡AôX €HvÇpˆöhøŒ5ŠÀAMž¡^“¡úA!Z˜RŽÑ0Á&éAòV¤ÚÁ`Áž÷¼ Èû/-ÕºW‹)òtˆ` ‚‡Íö îŠ0 È(¦jà!’õ@4K?10ð ¡`òz¨Ï ÎÏ` !âÁ`tLXÈ„aø¡vp¾À2pèÌš¡¼Òáî î(Aö@ì áö HOÕ(o/À3³°W0‘„ “1@O1 1ó"¶Áxç’H ëù(Ú„ Á^®7èqf(¡ÚØÙW‘iÐZV}!@‘Ê}•` @ô  ¶ ÀêªÙª áJab!hˆo~áP@Abƒ,iRT Á-°¿–2O¹Íùº ró€ò[±W¡B'Ï(ظáAA¬ˆÇ¼{Ê{A½ù½{Ú{á¾YêŒLݬá XØ(ý¬K¹A% !ð€wtTJ  A AàÀ´ Ñ¥`GòÊáøàÄ±è ¡@à„t dá«°Ôœ*4žáIŸ A*Ù@ÈÚÇ ` !ÒAÜ ¡Ø¨ àH¨ mµ 4€U2¡îÇTa<©0Ô&¡· Ð€b‡a¯àÆ èÛ©WélªÞ n ±ð áäaò ¡îç ö© -ŽlÁ÷Å¡îÁ÷6Œà”àAï£@¼z’ `*aöAÆá2á.àLá¼Aî`ˆa(a:`:à^©‡‘ÎúÊÕ€¡ÎS€aðg avanظ4ÀþàóÀäè`îÁPA>a` ÁX ÀŠ›`Bz“Î ´a°ì§líÔíŽÜîÂînë{¡¬à jF.ÞÆ4*>RXÍýßó€áî ªî¸ý< ÷ÛÔØ£6¨8}ø£™Ñ(ðxæl+‘ÍTZÆ6‹k"ÕÈ…è0Fª9ÇÈ”²¼>ˆ{§¯uXI.ƒÎ@3Üf‹–‹ˆ·Øö3ƒŸ‡Ù‰D÷)1[ôÔZˆ$§_ÚÏrY\¿/±Bá7²îr{£D[½D¦F*ÓJ@úM.¢S¬Ñ`‡,Nt8"gÃ}:Ìw—Ø ÈE£êiÄúÈÞ´D'¯.†ƒA°°=¬J ú½Z¯H'QhÔZAŽE èd,þ=&é´ªy$¢NÕfC¹} b0‡Œ*à 8ëyˆÃâú„ʤ;ÏÇÃÉ©hß Y±0eUÉç£YcÝÅG¸9î y¯›*ãêø°§ Å8¢E‰ÄXäE½„!5‘ã±TE•`Aîf€*Åñ€\–%nGæ0 pžà!Š¢ ²¨çÁ~E•GÀ2Pžã1jžà {Œ¦€਼ىðØ•Äa|F”ÄYJE—äIZE$i($6eÀ>{‰€9æifY”K ¢<} <„EÈ’4‘%I’t¡)J…P+À¤YTÂ"˜Eœ1xØW¤àÔOÀA¹/½#,"yçØH@²1¢I‚ÒŽ|Žƒ©Cžæf_•@‘îDdQî‡ç‘ÖR¬'Ñî:çªbKÏÅK”$q*F•Y>¼œ±!}„¢0æa@>wÀ©ØQ›&AlYöçØO3È*„¡hjˆ¢h¨ W‘Æ‘Y]Ä]ÚW¤I"L”%IaîHžà8 Ÿ¤ÙZ¤Ib3¼sY%=¥ ÊZ æ T¯&É8n”ä‰KÍ™B@ù " Ì -d|>ñ¶ &X´V „ðúbq€ Zžàiê ǨŠf¬'Aî"Ÿp*}„œŒf„-2}”3L‡"€åY`‘¥@J2ê‰$9 Yà™àGŸˆ*UŽEÞ6£€â8#‰TS”…V)øêU!N e(âežæy–+Uà™¨{ž'À1¥…PšM † bƒ&‰‚d'¸vPŸaÀ¼HƒÄa E¤²òL5dô´.€äáIù?€ðÐ) ¥@ÄZDX2}€a¸f‡„lŽù,C—Ãù¢=;çALB$!N3‰*î @DR!†ãp~H‚°<(˜$A–EäQ*A‘dBò?±H\áê a$#lÂ,Fá+ª #,3ŽBò=ÀHۨᴠBÖFè7ìØ{ŒQöE›cà9³¶zƒçãÐ%40&¬C3Hi@±¦€q°%Á  ¤AP–!ƒ ‹Ä ¡'ÄÈ‹À R‡‘>ÃxyáÄ+Œ0Þ1°Éc˜1è>ApÌQ†àÜÜpaÌT F(ÅC!™€r(¸AWŠAî$Ç$‰€5rGà÷Áà}‡P )0™àÔM Áî ÄY¨IÂTDŠ"͘t ”4ˆ°ú€ðc"ÂÐG.eÈ‹B,Ë'@ÆÁ‹"´‚°f âY%ˆ³1(DXš Bd}ƒP&ŠC]g"¨{‡l=Fh©5&Âh#Ò¿lLYˆ¡f"S¢VK}GŒ±„6µ b,<ð„8xjâœF a(ZÀ(TO&ÅŽheì pŽPÌdGñ¤1Ĩ“BøZБ¨nü7ˆ¶Dh}‰Q# çòlßøw¡üAˆAöGØà:)$¥:–ˆ`8|ˆ'>@¸ªFàrE‘TÇÀÚáí¥ TÁ`\`*D&Qð@8¯c` 1Tƒ@ˆ",2×a莦Ä8„¢T€!à }ÕUø9Z(€xG,!("Åš„ÐE‹ä“¨gAlDÊðÐ"ÂØ ôÔ’$iz£7Eãä£aîçF!)¥T•*¥ÔÈüU5µqX#‚.â‹Á, UJö]MU@>A TÃä-Èà>è"ÀS ŸJS¨l!ŒEDXQ¡ÆÓ4Œ/ÄSäq,Aˆ "D(û cð;öÇÀ±LÕÐ2*%ƳDHÓ9ªuR£”vŽ‘áaˆà{ŽÆ”(-ôèMÓ=8¶ çsRÊ[K©}0¦4Ê™ñÛWÇ©Á'äÅ’Ò\KÉ1&DÌš'>LI8û'§6ÄÐ2zO‰ù@ ¥¡2ˆQJ0>Ž ‚%‚ð‹B,.ÞNøÜ–1ySÈB\:ݦDèú` }´DèÄÂUwÒ DHlW¨7°—{p¨Â(OÀðëÄ@ƒ¿CìÀÅ€ øÂ(Gˆ–2$È©©7†qëÅw 41j<B„¸g!Àƒ5ÇÀ€F¸IÝw¯E.¿Ø; ìzlÈøÂ\3p¸?ÈÂGg„Ü ¸:‚Gvî÷fw–ôfÅ%Nî±BEÞ‘#z­î5 pÛÃl4 Pº:ÁÈ› ",'ç@âpkˆ°w^Dx1€ü[¡¨Åà‹s£\P qÔ*Æ€",mX`Î>øda@R‘Ö 8‹â,c±–"Æh“"x{€±¬%.(¬êAäO+?Aø‹ •äE„qÃà,xyÏ‚¿Ô`,P·èÜ8 T|.‡È­tF‡@<BY= eå#,.ž/Å,­X8?ƒ<ȱ/e༲BX" K XÿFÀ÷ƒÐx*Az=¸_ÁÈRð=À˜Ø£Ôyp`©†;àfJ·PÇØ ¼1zkDà®âÒ+ŠPÑ«Ȉˆf a¯@@æåàä…xi ƒì5f"DXs1 |p )ÊÐ@CÑÄ|‚ $„Xæ»x:…8i,) h€d… ذx(s•`°Š{…³Ò¨n…0b†‹Ÿ@n˜aXø'ø5<@UøP…@^Š>,Ð^hLx¼… a¨ƒøD‚ˆ8‚øƒh-ƒHDEE˜D„!”Q„X@Žø~?Ck¬h[€0n…€#H}€à#p/ƒ àc@…pCQOˆx8ú8ƒX>‚ø@$‡¹€ps0x£8¡„Xn‚`lP;yO€Ñ º‡¸]ü·°´—0@²Z„q†_ ’ƒ°‚ |øqxU8|Ø–HƒØAêŸ0c‡à4ªP{… UPD ØDÀ€(¤D‘‚a€¸o^‡p-¦ð< °‡°|¨{‚蘀X‡x¡‚Ø0Ø48¸+ÅhB…`BZ €xh‡0LˆD¿PD0ƒ¸AÐ;‚@ö„X.„.A„sõ?P ”ØàƒÉ”ÈIhGˆG€ðKØXnzãèIƒÈMƒ0Fº ,Žø}ë˜0ƒ˜208‚ë:X)=0× qØ€@VàR#È= 5è4 .¨hQ@{,(x‡[Ù= ‡Ào0YÀ`Z– 28%(°¤›}ã¾€9}¸x_Z„(4…àÄ‚ð‚ƒâ…HJc‚ø]À}€ }€Ø}šP8›@}ØO¬("(‡Pt‡»}˜È£8~63À;‚Ù€X}†° »(6†8B„Ð<…ÐE†ÚQ€@l…Xw‡(M¥Ð&…Pê?ÀE™; È=86‚x.¢P¼ÆC‡ÀfÀ†RPsªÐ8ÁZ„ KHEÄ8}„8*E„HL9š¿¨5 ZL€0GØJPL¸I‹ž™ƒ=âè5Œ¿Îø„XÈ8E‚ð\¥Ð\¨ñ?GªxQÈp…¸dÀùpb |¬è:¸{…([ƒ ^‹v¸‡ÄlèT„8V„XN@d`Z†jX+‚) -‚x4ðPƒà †˜Xáh8 8ÈF‚ðZ‚䋸Ð!퀘yˆ7¨)@ x‚CÕ(uð{x@À2…¨ÀPØJ‚ZÉ80‰ˆèSƒÀ]/P'È ‚+È‚d†ðb…Xe‡œNS…xsŠˆ|$¬(%8{ƒ$¯ |ði«Í‡Ø?.‚ˆ=¨F…h8ð[„˜Tà“Ð:ƒØ6„2@`ƒp¸˜ ¸5Ì {8†x -È//£Ž‚ÈqI#8{¨Z¨Q*À¨=Çðñ†P<…€E¾K™œè]ïèX„ÀW%ØVHNðK[²‚èÀ4P›ø{˜˜z‡¸7‡¨‡z‘ð*Àª6£z8£˜7#ª;£Ê=‡Øl£b7#‚9#¢;#Â=ø¤‡ÀI¸(¸1¸'*ЇȨJIˆK€@NƒÍ™ƒãô(C“0Ø„à<Æ…€Pà_‘¹„ùrÚšP Bý™Êa~(N„ìaÈN‡¸ …˜{pYÎ8|jG{†Ø „ÐÌøOµH>ˆ`u€0>µH;ƒ¸ÌÒc‡P}‚²î[=´„X>`t€0>[…¹&!0G}›º‡pb‘ñn Ç(øFƒÐN؇¸ X{{hEŠÐXŠÐ{€x{€ŒóÎG@I8G(@ˆ#¨°(ð,Øùå„YDèK؆á†8}€xp‚PJ‹ÌŠpI\(}Ü=ÄÄh=Üh{™ØG pl‹ ‚}ѨfH@YÀC„)þ„HO v@b (¡+¸}ø3Ø"ØØ ð?ÎÉþ_G„8H„¨r†{Ù5‘ÀK­ˆE†û„è@˜‘˜e„øe`s„Î@{€ÉF‡ÀpQ …EcÀÐVî„(Ièe¸Lº  uû_°upy]…@Z…H„¨+…ø<àL‡”¥ƒõ÷ÚÂk¯ãW (}‚Ø}‚SØ7@_†XIÐe€øR—ØWhM€@JÂp=€ðAa=ý0D°1p9ÜòÃP}€°{ŠŒ¸)‡¸‡¸‡¸¸‡¸ݰ}„(„ ‚JÐ…õº0\Œt‡8>ƒ°/‚`,(;‹È!‚y‘ð†0p† U…Ø=‚˜–ÃTŸè<àX$\ZÐ\»¨|(YªÐ‡¸= ˆU¤Ý½[PX{…bM¦…¸„X<é3`}…`ÛxEÛˆÌÉ-ffbîd[BhÍrnƒd 8rxP€’qÜ®!À^‡¸oTh …ÈIð1™²Ù#. á®*ã®Jå“«)T¹HAØEh(EH †ðEKõìÀQU0wY†HT…x@ƒ OÖ:ý)x=€@5(?ðQM…Hc ZÒ@}€]Ú€ 30`mØl2^{®â.0E®Bå2 z‡¾›™¸}‚¨P°{…ø… ”ëØ=XF¨eƒ˜Z’¨8„à8xM„¸H„hF€(F`Eè%ƒx'ø.Bè(E„8 H(K†Ò®=~'†(„°{„é@{‚x ¡@N‚ˆ­eX%ƒ…X½†ØÕˆØìaÞmÄ\Tã‡À ªÐ%È.¨HÉ@KJ>„8@„ êØt‡ð!1ÿß( „JKÈG„¨J„uMBn‡¸H8Nsƒ0f‡@q*Õƒ ˜€8U+*€0rØ]ÀGÒÐøCƒÉÿƒ Mƒºï„ÐO…Wƒ@V‚˜(ø2ˆpX˜H€¼`Å‚¸¡ˆ™i¦›iÂtçΞiö~§¢çjp{8Y'PF…:É\ÓœPTQE •æ Z ˆ€8vèZ†`^SªðE (Dƒº—xFSE‰ÿ„Ú,1~€qN‡À!„à{ƒpKˆPθ1¸UPhXP! `xJ`€O€`€ endstream endobj 222 0 obj <> endobj 1275 0 obj <>stream €@@ɤ"ÀÄaƒˆ° à8|@h·Ùuô¯|”« àeÊ{¼‚/tH=îSpsyÕC7œ'#IœÐt b‘Är9‹!€Àr ›L³Ã„Ü &˜N†ƒ)¶´iª›3yŒÒe:h#ÉùÐà:‹Î÷1q„ÚsÎFqð¦”w4ÖÄ#)Φv2™cyº€N»D¨d8]”†Œ'ÓÔéS¬Ì•3pL4 ›‹òÀˆE9ÈçBAÔ’v;˜O"aäÆM2Œ¤ó1B|i*Í…chÀb2£a¸àr: zaž€  ¢€À˜¨  H¬ àÀ„ † ´€\ ^À#€ˆ$H%¨&h€p€ €  €° €À €Ð €h€ T:‚ @ >xS€@@rˆ¶–À 8À(æ–à0p@1¸ˆ@9È@H&‘@Iš ÀQ\‰YŒ a”†ài.žàqœ‡ yœ €ì`ˆ$— < ‘¶ ™¦  ¨ Ž@©ì @±v ‰À¸Ü 'Á'É]á1t| DøZ%0| ÇÈh (þEDXÞEä<Ÿdaøw(øDaùÂà X‘…ÙUe‘a‘e^t‘!¡L„q*F€ùz{ )îPÆ9ö¡e¼X‘ÇQ[e™q‘eu×v—AP}'ÀÖ žà1öU§ØðV•f{žÎW¥6:{Œè. —yð ŸfHŒ.å9c‘¥ÊE˜ÄINE]—pŒ{Œ 9îœ%á”V”°~ewžçú‡¢èúIu¥’à9è*–A8V+ BÀâfÁîbâ癡’Ic ?XVU¹È]%iòZ×ãÁðãáî8’ÄÍðWÀÉFG$YOm•Ð 0‘Ñ0o¤X|EŒäv“žº\@DI B‘$Aö bpžâÈ osÃbñ1‘wÑÕ]¢áÛ§GÞ/dé?‘$HÖD#¹;C½¶7[Å©^az°E•øÜ=(ÐK„i H‘¤qîžãx0=Âû -áhÂDX¸a¢,q1Ü.HÃàiˆQf>˜¯"¬{Aî$ ê¿CÜ71À4 Ç€ûãìJ>ÀÈûŒpv=Áàâܵ&>Âc8b-¹Ž(/„à­âxX Q@ú¨‹¡ìP†@DXTal/!öØÊÀin>œ ËàµW À>Dù TO±(DÙ‚  EèH¡EÃ>Áhû#ì0ÈÈ×"‡¸á<{¯â\Äø„è?%"€ø„`h}€Ðœ „X=`ÜQ…q Â,r®wôP̓4q a‹@üPÆ`‰KlR¿QJßÇÈaYZ^> bÌ V^$ ë3ƒÜ8qºDXž_dL‹1h/Ĉ¡[c8a„á÷4E á(>…Á0Bð`EˆÉÒèÁ [ˆh¶Ç¸*#”{ñîA€é` `ØC c°^1pŠÝÙã{a”ÁÖÙó@hK™°4†( úªÌ|80=á¨^ :€>@˜ƒ’/…ÁðÚpY¢0ð{†©È>ÁP÷gj–„%¼=ÄEK´õZ€qš"ÆðxW'!q!ü+°¼Â83a9m«ÉÅr´£ŸÃPD=Á¨ºáœ{Š`*·ƒ¨ûÁ¼°š¶ÇØ,â¸aaÖ%CAêÐV­à‚ ƒ*ÁP{‰Qî p5b”! ¹Jðlð ~€¸ÜÇàÞ©³E’€ÚÉÄÀ÷aPaMÖç7€s3f¡|{ŽV8X¸:¥•7ærÖÅpŒ4\ˆ¶„2ßdƒÞ¨7¢)ïÂ(Eö"Ãp B¬;ŠP*ųTTvà.+Ç !Ð&ˆ&D,×b¬ jF÷ø\i36åcÐ ÂH% efHè#XX†à¨$ðŒ‚0C ¶(ÄX@|m€xëÄ8‰aà2àâ&@‘y 6ºâ>À¸cáÀO‡ >,Ã@±£`>€€&9x…Áø( € ÄXu!Äj `þ„0™Â,>­°æ"Ä-!`‡ „è’¢,M b"Åš×5Ëñ>¶ÅP÷®*Ô[q\="T±"DÆ@r3q@=Ã"·Bè F¨ÙVAZŒÌ>B0¨ª8·À&W˜š¢Átm®ðÐ"daDEת󿀘1uïÀdÄ>± Ä]²¢ - À0ƒðÒcš"A>1E€¼bôl Ö"Ǵ˜“dL©™3¨°kÇÑÚAöæáX¡†sÀÖ@¯  1 ÷ ¸À²l„E™0æö €0°á-‡‚ Ä@Ä`Ø`¾ ÓaøA$A!H±^á*A8›Á.êa/q[à31fŽLl" ¥h áRfXƒ€Áî%kÖôÀ&ÁðA°±B ¡æÁvÁ>áaDÁÀ> Ê  DîàAȘ‘@¤`àf á\LL¡R8ÁN!V‘À¬ÀÂà> -ª@ˆvÁ$Aö 4aîòàÁ¶Vah!jôèæ€`^Àä ÆÁnnaîA2¡ŒoþdáäpBލÁÜác€à,2!$É ØÁ áÎp2 ! ñí€ááá Áàn 0!îà g<! ‡´mÁ€Õ¤iÀ`ˆ  â`ô΋i g\¡~ q^¡êl}àòî ÁA&áØiáîAöÀ …¼™¡®@h!Y1²$‚I£°¡^ࢹ©¼eÉÀhª¡ð¦8*L÷ož¥¡Ø]áx` axa&€ª€6àRJ(¢À2ª4®<A Ü`î"a„cáLÁv„¢#€©ü €âoÀÜ @º ÀÁ È!P–‡ìK ᎱAò¨‹[ÁÀôk*€ŠÈg< çl!t@¾iPî‡VðŠš¢ÿÁä`¸šá‹'ÒÓ0¬A2Ð#  pÁ5ð=@þA+è÷¦.â&áEðcpjYp9'W‰&€B€¶ ¶ `މ ΡÁ(áDØ\XaF #È€°@Äá°¡’M'A&‚Áðáf!bƒ¨êŒð`*¾Ç¾Ïàõ@¡Âs¼ !öà‚f/ 2+4ÁîÑ’XΡ'bÁ ÈÀ˜ `ð 0èˆár]«A] !þA®üÄ€ûOÁðÁîpð¡Í.NìŽÌÒ¾€Þæ „YdÐ`ᆆŠ)~ÿfÄGàY! ÁJ  t†œø¡(á.ÌL-a4á(áVnZO [Á^ÌT¡ê+ÒlH¾¬ŽØ`âàêu–å `%¥ns_6,+O‰Á@ølÀ* Fœ o^ö/f@>é7¯š÷ö íªd ® Ôf@f`Bváγ@PãÁavaT‘Ø@ @Àò @¨[PS=eø!vŸáKfAP¡t¥É[Áf aB¿ N»?ë W¡ Œ!ò¥ˆõØË05ŸZ5¦U«Zõ²[uœ[õ»[á\(\‡âUÏ]5×]µÞà ¸!*áA6¡LŽÌv¬í_NÇ.Ðg6Hí¡ GKŽýçV€u¡8A:0EsìÒø‚(&nR XàtƒH8ƒÁE~ HH¡B¡a €² > Á^ Á:Ë0€hö)Fê²²jÁê:ÏÁ Gda àì `¤ `”³BJ.À>€¡dˆœJafáPˆ€iá –aW€ €ÕÁð(ÖáfáÎc€Ù"îÈg¢Zzö Î*à@gxáï$î <–ª* AN A® A’mÔ!anáhœ¸½  áf !b até¡@ÂÀ¼@Š ª¯¡îrxV€àƒAï(àˆx¨À  € ¬aäg` ¼+Ƽ«Ïaæ(½n^î ¡àiÀá(!0á@<lü ò¡RÀh Îz‘`‘  Œezdá&î”ì–„aî¡ï!6~‡d)<¤Ð€ò¡J=@ôÀº€¸Ð à<!. !@+0€¨ Š A>¿jBaòÞ  @ìA VÖÁVüÁ °@€ë~¡²Á¢!@ < aN áa/ØÁ á$„u¡*á4!&Åö ²ŒÍ"§`š àÈ ³6` Ar!ŽA) dÖ?d!„§æ\ô†:¨À Ä9¦&¼¦†5–i¦žj&¦j¦®k*`kªfh›NlFÈlÆÐm@° ÆŽ˜Vl¥3~ÁîûEhe8ð$!ï/ nffîð ÆpK¶Ó~»æxAŠ!Rz,óP ­ª*œ¡n áZ À Ð D l¡^¡o– Vá² lÁî™ptòà* jÀì€O`Ö¡*œ`H[a°²‘¼'ô#p¹ ™î/²æœpŽa*þkp¸¡åŽ!î û6›Âdª¡ï¢Að »‚ùÆú¥¡zka`t¡^]6œ;ͶÁî`Da"á2… $(á6|N²GâÀ×BAÁ=x2`>gnÁêgÐ}ZïüûQžáˆàB' ÷ Hæ–Å~!îT%¼î@–¡ ¾ðRûBA~Áqy` á–ÚáÕ€o%hà š  `øaVaB¡~ !7ªÀ<F!-É !rà€ c)ŠD¾Ë¯³ øþ‹D¢Îá“Ëà‚>h²­î-{VM7¸ub² .㯰kÜ>÷HåQиMö{½&áV‚¨ÄE¸A û%ö!}‚Ǥ±ÙTpX®еƒª–C£Êå:Ý&ªE‚ÈâY¨üŠ}…ÄhPù‰‰E!‘HR%‹B‚oÄå*‹N‡–àg¸),bQÄ®T–ÃêÄ¢‘H‹ZµQ|Âh8.Â{Ü*÷#µî`ôЋaœ/±*¨i¢×X5ÓàŠŸ½Úpˆ ðQ{Œ®ÅЩð9)‘)yÙŠ>ÃÏ·‹ð’.=Ö° ì\¬QÎdZÙ³E¸‘jäBô#åßx.Cí‚EžæP Û#FAîá!^ržà€$bàÐp`ãQî&g±ðLžâëJ‡‡Aö ±5‹‰x0”ä1,D•ªùîèùHI$°þDDY@âê+£‘b±<8’„E„B¾>‘döƒ—8òEÅ 0F‘ä™$EÉ‚J–ŠùÈE†aØ> ŸBŸ``æ& ÂäiPQ²ÀA€0C˜ø+Bpll†ÐcV{á¡ÛÀü[ç‘^”*L”%âs„@É™ø{‰‡¹Ô “À;þ±$MeÑ‚W™ ñV‘è3ÃÈàE @ÒQ å‘dQ”¥‰’0™J08}‡!©öH5gÑÙh#Aù®9š1ˆ>u›°îÆ¢U7ƒ©)‘c~‡Ù” ŠäXàYdØöU‘f¢ü8F taDX€„ÄX‚Ð@|.e—WC†|ÁÐ ’¤±F¾ Aö0á}„ä€úGŽÄyJ$¨.ÃAöI¥Ð JšäÁ0G‘¤±"ndäb€Â ”¼‚ö åÁ@2"˜dY"M—Dš5ivGd‘tJÅŒW2ô±ðnSǪkäá¬*œ)™°{‹gÀæ d ß¦• A¢r’E™¾^ŒB8´8"øÜÀ@©¢W•E¹bˆ`\?'Ø>"‡X¾N‰†È¾Õœ¸Ì/ŠB4˜€ÃIH‡îàn] E;²ˆà©\<—C„6ã‘`;bØ…£Ø¤ŠEñ²l˜±\OâˆÂ4P8Eá^{ž´ô Q‚'»FÃÀ4{˜€¨ëVˆD >ô^Â--qDø—ÂÀLˆ±phtá20â@ÅðRà {aî Fø÷‹`gñ.>Äû@ ·l‡p@à=G ãp$…ˆÑe 1PX"ưï¢,maŒ(‚°à|K†¡DXi08‚PnŹ·8ãÜ p7<#àQlp`  4FÁ\³áÂØì‹@ c\má‚8Ç1]X ùFáL  ¸1X÷bxW!êð¸Kå¡à1z>ðø TQ‰8ÏǘUˆÁv#Oaì(¼ECì‡À+?BQHcy—ŽÐ 7Æx±â P`ü(€ðz¡À=°Æ ¨"¼X H-ø_cì° >Á d`$p€°ûR”ÊyS*Ä\­²¼ú‹ Œ¦´[?àÂ0Æ1î FÌhQ²7Gå#° ÊC#rx’$Ø3<Í N ¨“†”‹¡öÇ‚ã|G‰Ñ&ÍDP‘Áð@0ð"ÃÀÁàRŠ‘V( ¶ Â܆€¢!ƒj( "¹y¯R‡Ø# £ìùÑ:§dõÏ9],'˜áš©ža\#À",Xˆ±–"ÅyóžàÐü Š:;i(Í#˜U  !İ$8Á„XzAØN‡ðH°€Ãà( Aî…$Ä Iqt‡¸`x@n'À` bHË6)À` €0@@ endstream endobj 219 0 obj <> endobj 1276 0 obj <>stream €@@ɤ"ÀÄeƒˆ° à8|@egÙuô•|”« ày0|‚/t¨=îSpsyÕC7œ'#IœÐt b‘Är9‹!€Àr ›L³Ã„Ü &˜N†ƒ)¶´iª›3yŒÒe:h#ÉùÐà:‹Î÷1q„ÚsÎFqð¦”w4ÖÄ#)Φv2™cyº€N»D¨d8]”†Œ§ÓÔéS¬Ì•3pL@ ›‹#yd†p-$S‘æG:¤“±ÜÂK<‰‡“4ôd'Iæb„ø¤i)šŠ†²©°¬mC†cA¨Øn8Ž€Ñp/L"ÀŒP€@D; @ ˜)€8*@*€H+P+€À!`,€€Ð"p-€(€08€@$€˜% %€¨&°&€¸'ˆ ˜ ¨ ¸ È Ø6€ (@‚‚ @ @XI€'È)€F0#eÈ ƒ8g€¡@ A¦Ø >àÀ-€æ `g#˜wDHd`e‚xZ¢POÀxTàˆ?æà ‚à"5@`$+‚Gè&1ex(&‚†P(£*‚Ã0,Vàø.Zƒ(0O è2F@84?ƒEÀ6f06s„ðDÇÉÊE–Ǹ`[Q>Š‹ÇÈr „éHdXäE‘$1<Ÿdaø{ ÷‚ ä@äDäXêEÈÀ¤iŽE•YLEš„YDD— `F[ø¸ÊEä±JdiG˜¸, å ea€ ãeYve‰U‘g‰ReQlçÙÄ|`©îe  } 5ÚÞÀV'¸{í"öØŸ9îc§PÄ^`4H LÑðŠž#E”-|+/J+Àày¶Áî$dókÃìW:0¤¢Ü91ð=ÀèöÃÜp< ‡ ûa@,pÖÀø¿j¡Ã8‡ãøünµ×¹‡dæ¨FÐ ‹v0زc0cöú(C ,0B.ƒeª Bä|š†>cpƒä Q&ø€‹@ Pˆ1€ðüÀ@±E¨cÜ q~ΘÄHÃðÁÎ Ãø‹b¢ ‡G(@ðøÀNqVC«À$° À+€Ð/‚Ы 5l}àF GØ"`Œwƒabð_¸à½y¥æs.Ñ©`â ð(àÔÆXOÃÜ ÜÁ®.†0Ùè.Ú íªñbí´åxjHù Û ‡gÖèûY$qj1€0롈ñj=ÅNA0‚°<¸›^@{¿AX„Õ~„7|>? `‰ãž)Z¶Ä>ûelöÐy&¶Úè u¢°Ipg"@ð}¡èE‡…`z‚V Áh/‚¸§ `ð4„`Â[ûjp`âã\~¸³n]ÁqGA¤9›«ÄTuM¹µ&Ü (|ƒÐ*?'ÅÑHRÑî„X°cEŽGÃGØâ aqÖ$ÂøBÞÛã „!÷ö]Üð@fÓ™‹Ü/‹„ñ l©Ò#>› öàGÀ?¢{ Á "DX‚€xCˆŠ!„@oa˜HͰGØ*œ@Xp EP†â˜C Á 󅘂l 0€€| 0¸X ‚lvð Ö€æÆ0|*i(’“ðåâåî+lª’àÎJk@HÁöʦÈ!¶P A¸aTàB èaªá† < à Ú ÀØ áÁDœÁôhxâš-ºë!·!òaòÍaêz@Ý!›i·@ܤAêa:qz±†ñ‹Qq•Œ°q ZÊ`áÁPƒ BápèØ W±¿&Aˆr¯ÆÒmfÚmáî¡ð Å’èËÀ}༠Àz„Áî¤öΊ»î ᜠÁìaªa¸ÐN!"¦X ¡adáð‡nl„Ø0maO&´‡â N`Ã''`Ï@Šö‡è^ak)A†^îXÑA ð§x¡$Aa”cX~O@~Àà`|¤@ÁB`ÁaÁqÀa*¯Áî  G¤z€ŠhD`¢`â¤A”tˆ€$€ð¡ ©à2aa>Ñ!ò§*§x È+8Á$²ÅÑŽ~¡5R‚{À‡ÄÒÞA.mT $áb¡‰á „/@ *DÀÁüáÁ ¦ÆAé‚}@á=7Òú 0XÉÛ8ç@¥l@òá*·GÀa>¡î 1¡6€ë>J·>!$­lñê‚”€hmZmJ‚Ò Àá~¡ÎA’`B aöA àÂ`òÁR@!<_ ôÀ<(aó€áh  ràÆj d`f áömÚî°já>àÌ`À<À  (`úà˜ÄdƸ!† Zàò `´ærÇBAÚh’arfÒtkAà¼,&íÀ2e€ž/@ Éþ`z{“a>FAJ @€a¦¡îñ§³W(EH£ÑÁŌŽáÆàÊfŒ:!Ïj¤qŒb!+Ðj@ààªÆA !3@§ráôˆAÊákKŽ!,ôʶe€§Pï0 ÀfÔÁ@`Æ •àh,¾¬A<3Ç,êWàÞ¤A¤t``¤–!öàþ¡‰Â'ælh2d2–è:û`ì%KA&áÞõ(k¤È6aÇ1WÙ`ˆl±ãi6à«Áæ¶¡,·'Ú ”˜k¸pòq¡øjá8Öjüa| Á„v¸à<¡¾ˆk­   €ð `Äá `*Ává;)kŽ Ä`“P@¤`ÌàØ `¸0Y<`Ì`ú30ôÚëf+ŽM„ÁÀötr 0"LÝO  AA ÁI!öí–{ÈŸS¡ð²ZÑ`¸¶˜wBÒ²²à*!3+á—4àÒ&+,ÒÐ Rԉȳ±.ööñ/sêÞnБ *è> öAá Áà ^É B˜ XŒîøAŒ‚ä*ò@ü†Â®eD¡0Aº’Où!àŠÈƪÔáîén“ QhöÖát jFà)ؘa\T¦Úê¸ .ÄÎзä!!á&0ˆ*¡²×AµWfV€,ïA Üï¤vЄ‡@†”!8«xÆ!*N$äS  Áa¸æxäÑÈͱ†g>Úáô í@¡š¡ði8ËFà ðIçO ÊìTÌ8`€Ä !Ô!nmF0§Aøáƒï@€2æhü™ Çî L€È@B´4F0 —Kad6FÒ-&·maÞÊ˼èíle¡< áPÌ’@Laö VÍ\!„A<’SHK$rK$òRþ`ÊØ@œ üõÁ÷jÉØ©¡B >A†Á"©áhan!X í¶Ö˜V¡tmal l¡Ϥì’8w‡¸ˆ8‡ˆ¸‰8–v!‰­y‰ø£-©ŠÔ±‹!Xò°ÐÀþ ·EÙ÷%A¹¡B¡¡áý‹M<5 ‚H$ФAE-fjaFPú`bÀ€m%¡*“^ð`|“&AÎn°àâ©Á"iáR¬ ¡tà ¦k€`ÊÄY¦MÚaîap¡8X·âü > ”7Œk€Jp6`>¡hd^ÁVÁBšQ¼ö 30þÊ  ¶jˆ¨À”¨©ÜŽÐk@ÐÔ«˜haöµê`Ï·Áïš‘Ê︊k ÎuAøaœ« T ¡ˆ a¨Õtd¡Á¾žá¢aHÒ8aŽ P Á` !. ²~!²Âx €ÁP­!¨yXáîfÑbæŽ>àÛF´ÑaäÁæ¡6,¡!"ÊèNY ÇDJ!^An€Î ‰^ U ÀJ À¡öN”s›©Î ‡&h^!4ÒA€ÉéØáu¶æáŠk@|à€vÀãÄ*÷F¡øŽÅÑÙT1Ýhl'@LÚkWö ŽÔ`n`^qÈÂ.Â:aîAÎÜÐÁZ!T»ö¡"¦ÖÊ|¯æaLRÁ„¢ÀÜàþ»&aFá8¡õ*Ϫ ð¡J5¸`ò` ÄÀòÃÄ`ȈBk€< €| ØÞaj >@ð Ñ5`À@Ìöa  éÀ ˜ î îA¾!¬`¢äà< aF k`Aã! €À[SEó&5YëŽa"§¶r!ÄÎ@Œ  º`Œ€>lŽ¡¨ üÐ Ð +î¾àÎabrÂKTl…èlöEÔ9†n&æn¦îo L6 Úè§e¹Ž¼ø­pv0vh:s§>t'Ft§Nu'Wä-uäˆl×ÅÚ`þ€ì^!`‡á^À$ë'7ŠŠà&ð¡ï¶m˜áXr¡‚ÞA¾`šÃ'q.È¥¸åÊJ_ʆ¥¡`à&î` ‡aVáB!R/oð A| !~ ºSàâáÊ!8aÀðA 6€>À² €ì‚]¨œaΆ¡€œXXk€Bé†!îþÆà€nÀr ¨@h`v’îˆx|Äm fסh AT €Ä ‚Î ¡T !hAXAhu@ˆ`“á™’rADs6éèl ¡ð‡ƧAòáf!“Y!¨¦ÖAð €*B+Xa|ŒØ@¸–a@ÁÚáF&Ð* r€<‹Iˆ„R0ŽJÊÈT‹ ¾Äcñ‹ìHW—'Ðúü®§B¼ÎŽóª]¡;&ʃz,°0‡° ÍöT½ÄÈ0ò):‹GÑ`ƒ²-t¾àg„Z4’F#‰PòY,”L)ŒRëtüǤ½Æ ׫ÕÒMrÇðsÝÖû.+ ¥óÁî$•žà§#Ì÷K>@aU™­Vc1šÍxåY­f³UªÖaçÙ!öI ˜éÄZ…š–¡ÑgäYØüËÇññ8ð~G£a©r}6‹T‚ç¨Òr9š ,“kM¾è_¼ƒÏ„ùQ"Öχü÷l½Ã7É‘ò9 ¿Dàc»íZ’p MÁ}¤·Ž7جÀm‘§‘V‘fAk‘fÙ^lý»FØûa¹(}€@CÞ+°{ŸE±î-—À æÂï©X žà‘âK’ªé ‹À8âD©18‘b™:°XFÐåAä)D‘*x”}„À)ðÐb ´I$EŒ€ùøbˆÍDFÆE12ÆEÂ1î äÙ.M :{§Ø` DD‘dP@©ê”di›3eñL‘e¬Õ€ãÙ¤`úGäqL©è?»'Álî„ð/È| «F«”¤y:F“äbŠE° :!陦v  Œ2‘¤\ŠTäaEŽ­h"£0¢}G؆CÍÆ+¢± ÜD„XÏt‘w@Ý Aƒê~6¸0zÂ縺{‰¦ùï @òæf;ÁÙà,N6Ÿ"P+*JÒĵ.KÓ1T\ËŒM2 Øê')P ]L|È ’$ÁJšªI9^„H†EÏ©˜‰]òÒYN@Ãè0}Œ'àÐ}‡ÃÚtW£Y‘c)5‘aA9gƒË èJä¡Þƒ-é*E’…@}X.ÈV;¬+º/¾G¾î¼O©Œ œã!~ÂàŽ5`ðöpäЖEêb¸š; `A{€@1öâ<³-©æŽ+1zJjxä×60næQ`PŽ¡ë4StDoHSôÝE%6ýcå×ö=Ÿj}öósÒ÷}?SˆÎ¡ðcëÁݹ–ç¸{¾È|'¹¦ dYîBŸdØEŸd U©Ÿcùî@~Daî>Ì×Ò_º¸æLq@… {7£Ü?ˆ±¢"ÆX“âdw 1$iX‹!ðL¡P°"ÁЋ Ϭ@ÀúChwáÀ@‡2’†Æ3ÂØ[‰óº÷)…ÃäQPŸÃX!,}€5¦RCÀ`ÀW±€$E˜˜5¢„žšj#G ‹QPEU ï‡Øz0¬Àq–=ÀȾTÃ1!îðᬠ† "°„ ð@ˆ1°CáI`¼ V9†¸šÃÜឣGX0 €i¶ŒAPKX[ÁD*…x "Ô6 Ø#Àð³#GŠ’9Ÿ@`ô+0Ä xma܆'á@Èzâ.‡ñf,‡¸E‚¹~Aj+À ßKì{‚ øú+‚,…°¼"ÁûØ$ˆáZÀø¶‚hUà-p¨ A„7à ÇxUà<{ƒ‘´9‡x¼Cª>Š`<8Å0È",m¬ÆQ='@ä(¢&Å(¨Âx\Š!+Bà’ÂÔZ ñ$JHäapºÃ!¥QÄPwI(Bˆ‚¦"Ä8TˆO°¤‡€1Ù PÀ{ƒä÷‚(÷ Tv `T>‚(G‡ òŸÃà3C°~ô®=Å€ûs Ð ;„X¯@B.µ g| –¸½‡Hñ/ŘÒàD{‚ÑX_(—¨À\pÞx (.l ŠÑ™DÒÍcEŒáh*„ð¿  %é’ÂÐö„= B,-‰`¸' ФÀqŠx·åH@ ñ*#D`•`xK‰‘^-Ç©`´3`F>Àxf ‚db>0À³'S`ÚƒÈ\ƒhp=ÁpìƒÜp[ alA†¹e ¦÷b°`˜O2…Ð÷Eaœ{3 ‡¸þV# G ‘N0EµÂÉQ^"r ¢=“0à8¦‚¬RŠÁ8-Æ8cˆ}4GØ™ ¬MqxißÜ¡ª>ÀXwqÀØ1Ì@>Æ8qÁÈ`ˆq&Ebmr0Œ~1«P;íd‚:€ôÅß06î…3÷‹Àë¥dE¬ÁXØgÂõ‚‘ Ährâ$K‘*#€jb,÷k†$ƈœ+¢Do³{#K™Î@„?°Ø€ûˆ°´BbL‰%GÁ½â,[¾PZø ÊÊéLð90Ûãm½à> ¢”a´²/äp}ˆÁPUÁÃL¬iÞ±ÔÚ>‡¸EâHˆ ÐSÆ·ãc"-»àŒ>sôè…¸9½py½€ÂÀN` „E¸CBœø@„p8˜5X@#àØƒ(}€H¾óðÛñKò[û¿A½„?£ò¿³óQk†ˆ|( ½ÐwQ†H…ÈE1iPD@@8>„Z=„)ø>3 £¾Ÿ(¿<ŸμkǼ‹É¼«Ë¼Èê#Ô ‘,½Šö€Aïä‘Z¡²y0y†hM…`KhEHH€ò;= XUƒÈR®èM¸Z8Z‚ 6 Cƒh-ð1…h(„\>³‘n03²¾ûðÁdAyçÁH2AY䆱҅@E†áfðAŒ5½Ð{€zÐ_…pQ„D.)¡ƒ¼>ƒj\„ˆ=„È@7êøK‡À(ˆ/®KœÈ.„…°€ð „øHV„ Ð…hF` endstream endobj 576 0 obj <> endobj 1277 0 obj <>stream €@@É¥BHæ >`Àpø€Ño³ áÞù%U!À;0$÷;„^åà{Ü àæãš†o8NF“9 è Å"ˆär7C€ä@A6™gf3 ¸@M0 SmdÓT6 fó¤Êt<Гã¡Àt/îBã ´æ.7œŒãáM$îi­ FSHìe2Æótüu2ˆ!PÁÈ»' ››NS¥J®o2TÀ 0Ý8:L'ƒ„ÎiÒÀDU€ dD@` J`° n€Yà" Ð<àDXhP†Àf[á|5P GÀI1Ó,ÀÜ0± ¡Ï¨´J- $ÉMd>añ O&L’ea:h’%1LåùFQ“DÑXV$XX’ƒPÖ(ŒØ= Àøþ5$);©b7–‡Q`{„ä‘.?oÑDÄ(<@Œãxt*ÄDüFÅ.U’e>N—e¡î€Aœ1–B(†-‹ãXâEèÌRŒ$XÔEŽC¸ò2c@ú)È @üKd‰4E‘äù æÙô[Ú÷Ëf¡îN€ðNžå8*u æ˜^}‚gØ.}„'ØL¢Ò{‚Ǹ({„§¸Bd±öL‚£@¾Q›…‘>zF`>V…ñVZÄE¹\3ˆã@ð}€ÂðŒbи5Í E(}ŠÅQî=r(, ÍT¤ÖBã$DAäXòC¤,”¤YTGQ%aV‘Q^ Ldé0@cظE’D¡,Zžá¤ ”)R=ÑîàYîžá1Ø*™¬2ŒÃ`Ö¦¾L ótá9N“´ðCÏSäý@PT% DQTeBÒ‘–;¤™RPE @U•E9%?¸Ø}¸¾ŽB¨¼-Í£©=Ãñ@>dAZE‘»áI‘„uÄ{4°-sdø{†[êNŸ *p€Ääù‰8¨>€ÑØNG“;å ““Øö8¨ôCƒÃ!ö¯õŠ#ñ*E“`ù´‡ÙdE‘D0òE€È¼U ¦1àaW®êE‘ô†>ÈÃxŠ0Š¢ÜD@DidJÅ>ôTµÔ{†&a(dSÄùð ½DHèúJƒY6DH<ïE˜„ˆ&ñBÀ‡â` ! +G@‚ˆG§Á>àixaö WÀ—b@LˆÁ %ÄxB”SÑŒˆžp‰!È@Ñø]`<@†!À@)AÜ\‹Q`'… ­Âh/ŠðöÁ…È‹ÌI‰Á:,ÀÄn ¤ø¤CìA$<…tÞÀ„b‘ð>!>¤Ç•]*`.Ñð ÇÀ ~.…¾ˆðéD°{ÁÔA†ôŒ Døqáe°>Àl`¬Œ`¨3F8·b€Oñ,Åpr‚.(Å8«âÌ[tCÅñ@ôcŒ±ž4ƸÚÇÂXž¢4„À|“@TTM áR=Àš,e ±~-ÑÈ€ÜBg€" p ¯˜÷Œ¼=Æ8Þ>£È{*'x­ìP1$„(raü;ˆ°ðÚDЕ¬Š¡j[ ¨1 úƒ¸» "t3" HPtðŠÇ@#Àø¡¢ø^ ¤D+Ðn I:à¨Ã@ûè#Ð̽€ÈpN„ŠA&%…‹€ O‡±.Cšq Ax]‡qj/`±Âl °È,ŒQÐ`p2(%`}R!ùIðbM ¤> q\(›ñÀ6±î+†Ø´S M¾§ƒ°ð?"`A e5„H‰‚) tBê" !°XŒÑj'Çx¯`|T á|-Eè‹„BØD‰ÀÈÄ0‰ ©ä7 a$„ðªBà]dÇØ`X}‚(> Æ=ãœq‹Ñ’,@ò”›ƒÜ3 gTðË ¨ ˆá0#èŽuðF‡¡Ä‹âE74ôíÄåb “ô‚ûò"EHÀ3#¤„’’’ZLI©9'¥¢”‘J*Eh±¢â@•±‚1FḦ¥¬l|2â]KÉ}0&ĘÓ"eLÉ4DÒš“Y!Í“Ñ[E ÷ x„©€4‡¸Š‡Ô>pòF°‹âLW‰‘¢)ĠÊ@ \QhÁ(û@´}„™2‚Hà·–úàzù_ñü°VÃX„DÄ×ÂLEб7dĈ¤¢åŽŽä´Em  }ƒ1«aÄ! öÅ0#°‚1íÑGéø{àCàþ(ƒˆª{@ }€ö‡Ú¼(c0-Œqf,§ |;pþ„0w a¤ †ð×[C@‹ ‚,8‰ü#ÄpŒŽ„T†î%ƒÀy ¡ô2†jÆã'£Hg‰À<¸[—a¤&„ " šB¡-‰ÁdÅHÏBÈX"!”$Á°‡ Dˆ5&=ÆuÃCmÅaŽ-`÷£äQ6ÄàvaÌ; Þ(„(–‚„Q 0<%Çàtµe!¤TŽ’RZMIâ˜N D%…P;tF‰Áj+GH‚bXTˆ±= ԃЂ‰Â8K áL+…°¼CâÄ wAr”á CØa ˆ0ì ƒ˜‹èÕ£—<$®u#à!‰aî`› Ž `*€PÑ`x@n'À` ‚DÃH@@ endstream endobj 217 0 obj <> endobj 1278 0 obj <>stream €@@É¥!ˆÊ >`Àpø€Í/´{èàùAU¡Áa„$ø-„^ê {Ü àæãš†o8NF“9 è Å"ˆär7C€ä@A6™gf3 ¸@M0 SmdÓT6 fó¤Êt<Гã¡Àt/îBã ´æ.7œŒãáM$îi­ FSHìe2Æótüu2ˆ!PÁ»' ››NS¥J®o2TÀ !`‚n,å’À´D8‘NDc™èH:’NÄ£¹„–x1&2ièÈN2“ÌÅ éHÒS5 eSaXÚWCFcA¨ˆl7Ž"1Ðv%Dâø¤€*-ŠÁ‚ÀitZ{ Á`í ˆ'€È€€ (€Ø€˜€ ¨€°¸€À!`,€€Ð"p-€(€08€@$€˜% %€¨&°&€¸'À€ €  €°;€¸ (2H €(0€ðHP€X`6€hчÀø7€x PI (*H€&¸&€E€€e`€„(v£ h€Á¸ R€â`pd!P>' '`PG‚X¤xqðgãP]‚¨ ] ¸"5&ˆ$a&T‚ƒX(`£€*gÁÐ,pâ˜.H@0cƒ$H4ƒB4`ƒbˆ6Sƒ‚X8_¢:L§<-ƒÇ>Wƒç(@L„XBW„D€Di`F4gH 8JO„¥èLÅ0Lvä`NUåøNjçP…pRr@|ŽDYP{ŒAð"è .|‰€©K‘$ˆúEîdICgØÊ~@Àú1 ㈖Epd¤iVe9]‘e)^PŒ$`äPq¤Y"E‘¤0\žàÈ0{’1„}†$€þE‘$Y ¢Á9Ü1DF›\ïi‘e'ÊòâQ<î… }“ÇÁB žþYŸcà žÄŠí'¸f㘟‰îC‚¤YÑÆŽ…XÜY „ˆÒE…DXÊc¸E@1öpÃB+äcà =<=Âèœb [Ž¡\¸`05ÛÄXt°ià A&˜‹B,@q !Dûƒì"öǸ\BKbã@OqkG¸ãÜpŽ`-‡È?¡¸O€q¦#„fãðS€pÌ"CÁÜ7€‡¸£ˆuÀ„6ÇØ |u Ñ 2ÄXÖ„ áöá`FcIèÐ+h’ñ< aÞ+Á¨U !\°Á@û€T/ˆ‘$+!c àu‹ÐnÐN ¤½€ú EøM¤TÏ:ºùø÷ O@ ‚‘ä>ÞYó#ì °(;ÁX÷¢(vÑî¡`jax †a„ØnÀ\¡Œ"Ũ‹",d ¡p)Ű·b¸E‹+E0dAtE„Á_ƒ@‹ ¡Ä.ð¶CÀesž Ä9à6ÆÓä£àpQX0È—Ö­Ë…1ìm ^‡AÊI‚7 *~aù»÷èûãì'q‚!D¨‰Îx ŠJ#¤+—‚$HÛÌ$ÅpÓxLBǸgmô}…š B(U ÎìnÍÈ-gÜ„!%Et €¯…pí|E# |1JÇÈ  ô ‰Øþ D(Š8€ x†GÁ E‘öÇØ2Æ#ì0°Æ=Á ûÜ$pp:¸#à W  DP†€~8ƒ:Ð_¨£ì)‹Qî.'q.ãLz|d „ø®¼D {V&DXŽÌ/`Y°¬ØÁxŸ´P€æøØ×cÜD°r`苃ãÜ!q:… d¤ {€qà;(ˆ÷`´v° ÂàLâ Œà>ÀüpÃDHˆ@¿@ÃT/ÐBÁX.äaÀ?Uô‰á#°›"à^ ë°ÇìQŽ ðl Â`Op>|î6Ô"ÅPùxH|'È*ÇÈ¢LLkq$€@™Â,<áø0€aÌŠ $‡¸Cp{ƒkWŽ0üôPé3…h ±î'(uÂ}‚ì ÇÛÆy`õë—_¢ àtm€-=…¬ùŸsöÐAh= ¡a¸{¿ÑîǸà¨{„Ñîc¸÷ãêaúª%F©àZÒúcLÇ Â,f†1hEÅèÂ,1ˆ°¦"hR!¨0„ðÄ í[Ø»8g,èEtóoŒ|±ð@¨wÁ˜‘b?Å£ì0Z>ã°`¤{€‚-Å ½eƒì&ê¨c`ž®†ø Aà>¸’}!¬<˜ÐèÃ0eòÕƒð :G¾{ƒDoQ´-A¨Wª£äN¡”ØÅ€ªä@s~¡C†÷€W‰L ààÀÀÜàð <ObÀ4Ô@€ˆ VpÁN¡„aR–!›Ç„ÀLÀÁ,e†¾iԦƯ„ïˆà¨øáðì6¡øÏÿ*‹ðæ` ›!É ²ÆlIl  æXá`!* @nüÄâ@n Ô <aî¯Øéèž* †Ä Á2â¯ñ ,,äÁ:!XËò öðl:ÃáêAÀØ€Ø Öú€ à’ ˆ b >`Þ¡!A½¡Há:0©À@¶`’ abàêÁÃÉœ‡dµhÀò8çÁ*@€<˜@A6 ¸‚‰zèáŠA‚ AVA(àÎ@à ’àÚ „ÍŽTr¯ \ Áhü»`•Á ¯vŒàülÀPÂL(a¸Ã@ @*A–À!Á ¡`i‹Ô@aàÎà–Óçüá)B ávádË ¢á¢Aæ ö¡JÁ¬ÊÌìÒÌ!î- ÃìBÄplÄÀÜàœ@Xð`’lœ!ö ,lìœÇ`”A¸A–> Ö€ÔkW0Á"j«J°4l`pm!ä|8øáîðÇ !Pâ¡î Ž$ìÎ``áÀr€§Áª€AX!¦Áˆ ¨à† À €Ž}Q܈ Ô€ž¶òVÒæ¡`Á+6a> ‘r‘rrsª’HÈ加Aö!öòÆó›9à=:3¦3ª‘’u;+Õ;Ž\ ‹îæKô›+ú‚Ð’À lÀ€†+0î¡îáö³çÐÖ³ï Óõ Óq?ÓÍ‘4"AfäG¾|'Æáˆ„Ÿpz€¨`Žàl ÀˆrÁtží>0xçdH@´A áR AF!hé`—¡VaZPQækV à>¨ˆà#Ax„ðÁî¦ÄµÏ‡%aî ³•9“œÀ<3¤‘k:òu'³´’Bá­;®_>`€Àê Ô0Ý !Ä›él !1a0!@"HŠ¡ð‡Èî¨a(!8Á–€ràÜ&æ Áõ€º½@¡t¡! Àþ¡öÈìîÁ )žà2«²hA ðH`Ôv ÕDi.màØÈ!ö@0ú¡ ÌÈü*b«S¡>äþˆ¡|ÁîkcAðÒ_&!W¡ʼnXrz~áÉ(rŠ€¾àd €   ì & ÚÁRÁRÃÁ^FaH0â Ì˜ ¡ÄáÐì†ÌPÕ!: d|ãQà*!”á•,rõ|y8‘‡b µDî‹Àð‡.0@0˜¡_Zg@Í 2á`aA&€Þ Å:Ñfv §TKÀü àÔ@î™! â ܧà2Ë,ÕØ‡H¼‘Çb •D–*á,“jÛYÁ‰\ˆþÁ aÞábÞaböoÀ2•ÁAͪªéÚA<ºæÒá¤àį À,á>}((`¾@Ð`¼ ¾µ`r €ª @ÜÀúAFˆ¤€ÏSà>Aja:{@!Œ  bàÆÓàº~í|xàäšfvÔà¸@η`Š!¶á† ¦à¤a«T4À”ŠÊ@Ô ´ A_)çNÐñ"æ¾qNA8“މ`n±äA`a4ž.FáNARàS'^ Á!œhÄŒ€¡q˜@êÁö¡ögNà‰\òi:“­=«Ó„¾•Ȉ Hè!>ɹ?4üó€n´ªÐ”šmç©<á á Z@2¡Ö  ÷~xŠ¡¨›Ja{ é ¨ÔÖmªÜ¦Ì(Š¡ðŒöî*b¡‚Á@rA%Hx,‹Gb ‡íX€³TV¨pFˆÔA¡ `tzHö¶üI¤2>6Võ|‹µ…X•„ `Áàà`Z°Fd R ü àª á ®ábq!·kqAzœ æÁAÍ6A&¡0A@haT @9‡ca`öŽ‚Axs§qAŽœ ¬xáaVÚ¡gBlâàÓB°@,ôæáò @*ÔyØ~TÞá&ázá$@ÌÀÊÑmÑí"Òm*`¨ €ä ÒÌ@ª},<•¡6a^áQà!èáö € ÂrŠàØ `؇XØ \ALÇ8éxÚ¡ïKnC SŽÏ”ù€  NÁöaöÅ€¬é@>Zá^¡.dÁS:U2a´2tXv’“áNa *.Ö >¡®ˆ¡<ÇÈñÄ¡LÁtm‚Õ2nqg’–¡TA`!)’‡‘U! gu\aŠ|áH¬Ðs讫(òi&À´¼ËTv ¥TAŠa'lu–!ø@0 àBv`ô3@˃@ €ðÃÀ? áÁF0š ì Ü ¡` Á€ah”³ê°áP¡‚ήâà¼ÌöÁðÀ*êü @æ€ôaDÁ2œ¡vAö \jØ­Ïß!îRà(‡dAþӀꀪ ¸ØœA€õAÀz!„€ÈJªGÓ€®DáF8¬öAò€*<™ù(y`_ ´äè¼ €XÕ||€ƒ'ˆòÞAM«¡mÇ!î® o!a*Ŷüt!#á ¬ïzåOvkü|É §‰?• <³¡3 ^јA!ö Áø 0{z« 2m!L|€"N¡(•ÖË#¼ HXÍã.MêÁ"!<ßàÁd€: òqAB‰á´á³>â Ž @¶£1i9öÎYûŸîàža:LöT€t@âì \ ϨN*ݪ¡Ôñ€án»ààI CJ/Ja%J¡ð  Aø§Òy ê`Ð @܇@!ö*à¬a.aB©>AfXÒ0Þ Á*a.gb+Y©S‰ÄàblöÁò *A0A‡–´ð·ivÁøX.|yÇÜ€qÇÈiÃÈáQ«¡Dá&g`€ÿ1ÁøÀ0 ú™ÈýÊ¡˜* è,AÕ´¡ž©‘Ùê5DÚภÊ ,°ü àÁîj¸ža'Èaî–JqA<ª!ö¡öÀfö.xÏ`Ë"بuTÁàâà€Âµ`ÂÁNà‚á<ûÜaî!ƧÇ<â¡ )ΠìAòŒêÂað áÐîáÎzÆuÆ@„jUÙ s.ÊÂgYêáîáîðŠXAö +UÀ0o”Ï”œÁÓ\@6©”nÖ€^J«@g·Žî'º!”Ð$2zˆtš ¡r!ha46³XJ À6wtzRζ x Q(yö ››/¶à¼€E’ƒÆà:ÂEªQjd[I¢D¯A‚5AÜBD¥•áðsä\‹T=Öª7»1P{‡[Ov ÷7=ÚAW¸ô ÷½›O`©Æû ‡ßnSr| ÓG LÁ÷âœfD Ha㹸 £F·eÑt]¡GÈÀä4BU`D½ÓÔ% XI-ÃΚ(Ùû˜ 8P3ìo*|_fܪÂpäѪ ! ÷!´KÉè-îI ®‹4ZYr³™í…2 bkU‡ÖK5Ò- ‹Gï7È”  E Ô©ý6“N¤)ÓêœÐW2χÐñµDhLu£A|RW’¨ ùüøy7"̈²Š¸ä“COÅÓ:,®#"‘îžàYÜ`Å!c åP<,¢É‘bqBcÉ<@½$ñPdá"N¤Èw ¨fEž:E–„áL“ÅARJÃàAÆE„àòEŒCÐàpÚ@ŽÍiL}žà¨V!†!&F–E‰J”$É(Eš-i¼{€¤Xh(âà^Ç5EAðç¸ÒY¦À˜{Œf`| '¹ ‘gASŽ…XÜY „ˆÓ c”>€A{ž,X>@¨‘žI‚Ò´P!ˆr ‰¤iƒ?-5J·$@8–?‘eÀ>{‰À9èhfI’L‹r?Óˆz"ÔORu2ATB#‘E BV2Ðú^a͆j›§%©Ðv”°t{©ÜQQlc oa"_ªjª®¬«jê¾°¬`1D³­%Ao#µ:à¹.•q({9dE–L7•¯#aá8–ã4>£¡†Ö›$ÁÄP$Y(@8Ä)Eä0ž7Y.‘d tA˜Q$B–ÄD^åXÚU°âS „Ð’à©öäÐ Ž‘d¹@G’„b0Oµ¦áî 0¡Xh. gØ,•å\|™î ‰°e'¢ð~¥(ìQ ãˆê;iF<eQ:R”("'¨‘–J´Éö½¡µê$ŠkKXb‘en‰D9 YçÀÇÁf;ÈbS& Š{šf*z2¨*,ñzE™`A¢a™FÉî'Øl0 ñUä«ZÖí\/ñq @‘9?€ðÔ' fH’K‹äX2}€aÐd‹dà¾X `ù\2Ĥ<•Ä„>‰‘ .ƒ ª ¢,)€€€‚ 8 Á4K `´‚ˆ¿ãLE Á$Ä‹&´‡`òTº>ÂTHˆÁ%ÄâLP &&…xcA¤pšÑîàêàdAp` Âà/ `È%Vh÷ãì0 ñ66Ì{mmà4áÌÜǸ_nÀTT‡1<Ãxv¡À8Šê)EHžbŒ‚qöâÈÖŠ`­@A "$6±2ð¥M‰À(ƒÐaÈ=æÆqãLc ‘̇À€tãä+’áòi6£pB>AЃ°‘öÀ(¡Âd{ƒ!(+帋EËIˆ‘>"b«€ ~ €¡ƒè)Áœ² ±<„[ aCÌEжÀ8)µÒL)h”p´F¯Ô;.Ä g#ì‰hêÃj¬{‡4Þ<âЬâu=ˆÁ$ÄXŒb8e &$Æ€Çâ0PÀ2¸‰",6±aXt«‰ Á%Ä‹` ;‡pò"ˆ #`H€ìÇÚ’R€KGaø¦Ü¢ž"b5Ì‚0æ;žUJ°P2Æë`xMa$Cƒè!ôCe}8…ábØEˆÚºçƒ€‹á¼Z,ÑòXùKX5Ñê)“°Îá馂XAhOm´°€(ŀޣL ñPƒ˜‰",÷Ñ{èé!*`«‚´©%`à‰·p>N@àï“Vhd ‰x¦@q07ØáC“dHu°¸€sh”7väOBù M6š)U.¦iʼ§„R­ÔïªÆ™V’ºÔ(È"&¢t|„Ôì=ÇÀÜ¢PR Án6h„È &ŸƲ-¡Â(MZðî"Ä,¦@'ÁØYpCÊÀ#@ȨwÂ’Õ{í…¯â.ÉQà2DX›bh1pü?àôFˆa3 (ŽR •±äÒšÓ‚rN‰Í:žSÚ}OêA¨QXa áì2ѰEL`¨E†Pp úF,);‘‡Ø£¹Šù`*5ú©j"«Uª½X«5j­ÕÈûWtï/*À"óÔU9‘W+d­²¸WYuOç…˜V#žY )fáô –…Û&¢p}ð>€ˆø TM‹±P'Åíëá‚÷·ÑE`.²€d¡:ÌoȆ DˆAö ànÀ@Ø|,¡"hŽ"¤`¸Ý2,XA¶½ Û<1¯ÄȈÁäIá$Àg`Œ~, À†Å~‚ëÑ|±0xt8J×ìf-|À:¢C¢\2p´?ö$‚ƒ( !¸Ñ‡s€s‚iXNðq a† E†ÈІ(8 ‚p!UMQ„ÐT…X9„È:„+û¿ÈX†xtŽ`fàƒÀD˜7ƒh/ƒHD€E8‹¿ zÕÀ/¼]†hž‡è|€ø ë„DX?„‚~9J¸M€®Ž! ²ÐmaÙ€. ’ºÂ¨T0‚H|jVh}„<ƒè;3ð‡{‚‘6øk³‹„eÚSð|ˆ …°>…pE cð(i†ðL„xD„„< èCP)¤ˆD(¨$­ÀOƒÁKµÉe j „(=Š€^€9(K„€F`K„¨8ZÐQó_…(-˜=à2c•ð7‚ð:ƒ82‘ôGˆ%À<† HHH„PÞ€A„¨V¿Mƒ<ƒˆA xB‘/‡r™Øw)ø9àÇè|@É‚¸¸`øž@~€ª€`CðE»ð0#‘ èD@C„±„ m¨{€0dƒ Yƒ7À:ƒˆ8ð:…HSÀO`Fh J¬«ƒô¬„\­Ê쯄\°Ë²Ë<´Ë\¶Ë|¸ËœºË¼¼€ó¾ÆH| O‡8n…¤ n“Èn‰é‡€¡‰˜`…xW„6„ðøð:„Ð<*ó„ÐTø2…ð)h}°¦ƒ€}…8{€`&‡àB°{€È 5ð7„ Wx}†x ²`6†AA(@ªØhÃW‡pr–¨3HMðMƒ0Eˆ0(ÈE‚ð<(9Ø3ƒÐ1»ã‰l†K¼"=ø|x|€ ŇØB© àL8OCâƒ`}‚âY€0GèJHL°I„ˆk1Sð@ Xƒ€20}²}‚€ ˆp1… Z¦˜Lô~„X{H™@]r%›Hvõ‹ø¸fv$½$ȨUƒ‚§ƒ°6è0„px~ðFÐF·¹ôžˆF„pFè{X›À:…8£2£:4…8PSL¤ ÈÌè\‡¸\… ž…ð{ʘ^…0jÈE†ø†8@‚HJƒHSƒH°?`Eˆ-P/˸‚xHxÂtèzˆ!…À…Ø‚àr€¨? 1…(E…à`g… g˜e‚¸!‚p/‚Ð(ƒX0+ àRƒÐ\£ø'Èð+Ød†ðl† e`TÓÔd0X†ètø|4ÎÌøCÍ|{…¹¦„Ð'ƒ˜+púðH€0IHW™ X'€>ð8ƒˆ=ƒÐ8‚h^ƒq¸‡¸Îh{ƒh{ž@p»¸|ßÍøtˆw†¨X†_ø‚ NØEƒ€_OÛ³œÀ\YØR… N…0SAQ —ÈJƒ O¹XÂà¸2[бx}‚°É†XXQÝ«†k‹ O°I¸ 7¥©èOÐEƒà¨(•€({õ²%å³ÛH¨˜(^{„r€ÈKI„>„@?ØÈ}†P‡Ø'ÛÈ{ÛݾÛýÀÜÂÜ;üÜUÆݱƒéÈ<ã•u¶ }MÆÛ•ÏÅÐÝ{ÛÀ‡Ø]„;¿EEQŠ °L„pL­.LødÛ…ÇÝÙÝ©e]ÀAÝÕÞ]ð‚Ð{‡p ÛuÔ¸(5Ó]BÝÒ{„ ¸&Á|˜ …0:9p;ƒ 9hRÀQ0P…Sˆ q%ò_5ô_Uö_uø_•s˜P Tر/Ào°T5­…Ñ& xÓ‰èK‡È€¨j8d8M(Al° h< ?p9è=…O…J…xqnØ„ˆ…È7àA‚! hE‚ QàVƒHWƒD6…ø?:pb82pØ;‡¨GÌ“ hNK…HQȈ9ƒ¸:„3€`{€pA€ø.…@]8{¨h9ªè?…ø0Ø3 /„°1¢P7™¦›ÀE­ºy†8\†Xo¢ˆ‡ÜÊ`9ƒÊ/È"U Aeì‡Ø*ÊHv^Ýî‡xž‚eðßòß=ôß]öß}øß˜=à“Û½‚ 'B Ú„L±K HhË@…€DH-Lt¹K¢5„H¸|ÊÈa‚™6ù¶„O‡%­*{¾g S„l ‚q ! X}€P}€piØi†˜a‡,) ‡ØÓè!Zü(‚ i„ˆM^è,ø*€øXÈA¨H„¥3àÀ@„ˆAžØâÅ %¨ðÁCÐl–€:„ªŠ€FnÆoçqç.sÂTHX¸^€øf(aÂ"®HVTð 6¸~ÐB¿´P„5„ A„¨Je˜I€ |h çvx¾yg¦{gÆ}gà•ÈFX|-P{„ã‹8À[†4ææ€c… ž(8A0<¸5@ oht†pc…@]…ö¢ƒ¨d‚ p]†HbhpP 7(&ƒ3•¹X/ 0…à](V†0_‡WB‡NPEl¶´«%¨Ûu¨SƒØ7žèB„>1ƒ¸3€/18(ƒ`2Ž =ΰ.Î(R…8s‡v½@J”pÈ'(*. #… #hBvWL3n/p e€¨;(AxE…¸àX…pW†G ;‚Pˆ;˜€¨Y€fHe‚ &‚ˆ' ÷íø7‡(d(G…¨S ¨Fp_’ŽB ^kõ«HX‚T%8‡¸l¨LÛ-ºÛP~]]Ð]M p£ p¥´p· pÕÖðíìÊ>J °#J†¦Ä©Ëô¬JÔ®JòL6XÌL´KT¶Kt¸eìÈËĽ@ØG…}£‹h`‰è„“Ò‚ªüˆ8x˜{¬h{Ϙ{‚¶Ùƒ‡¸jopˆCS?È!J‚Á€xE’v€X_cØè%G‡„n@1]!Œ˜l†ðkZØo€P‡“Ž»«1=†0Q‡xµ;(UX_€@dk`}€((%ƒ8Ù„Ö)âªEè9CÁeH_†(Qµüp„X!((]G€ø#‚:‰h'@-ÇðE„8K `IA€XÝ)…-7ƒˆ6ƒÀ9ƒ™Àœ;SÅ=r/#òKÁƒÇ&‡¸W¸F“Øk„ ¦r°„âÈfp D„,P„HNЇx}¬j' (+à}Ûòæø@Ì,°„,’„xLèi‡h^ð_ˆQ»›Î*´h@“`×`xõ­æ€“L“æ | |è …EbAHØk‚hJ-xh}ò(0‡ž@€W…„ +è;»=F„ÀwxÀ{„(}‚ ·ߟ8}@} ‡Ù<à}äXd„hOÐ…hI’øW0èšýƒØ(çƒàAˆ0@=‚Ö‡Ø$d>08{ò°‡¸fŒØEBp$`C€T€ø%É=è Eè:p/‚ð8ô#àr.à(r¨XÐ:‚ÈUøL’DÄHÓ‹]B‰èI‡ÀL z‘TðIHL„¸KØMG„H € è€Kè߄Р„Ø?„µÂʸAø‚€%°`LPPƒ™ôûÀ?øGb(@€:v·Ÿ‡8?„§˜¸ ˆôþ€=Ÿ¨t¢>÷Ÿb1ý ‚C¢Ï“Ú]™G$iD¸yît_c *ˆ>¦é¤ZŒP¢“€sÝFûG,C%€îXÞèéàU`*Ÿ»°Óøø>Q£åÝf°{­ô'õð#{žÂ¯u@2E§SǨ°}ö¨´Z­§“Â,ô|\î`séåxN"ÓPµEÌ }ÁÛ‘iÄÐxøY¢Õ€JÍîo««ï6SÜÊÊ£4Ÿ`ªE"uºÔ^0û½À g‹‰bÆJ®ÑF•Hxˆ6 Ê3òq:£Kª—ÅÅÀø`û_` znl¾Û€ròJ€êtjñ©õ¢×¨µ:%z ªä³ú-q n=Æ 9rHÃäS<Èó=SØö=ï‹æú¾ïËö|Š¢t}ŠªÈ€v(B>£ ä8*dŽÅÈ7¨â8éRMÄ‘ HƒÄqF&dXF¶$0–8‰âøºäC`C1!&†¹ª{€ì“(Ë3 ¡(N-DÒYò%¤!;ÍQEÍ$14“a=Ç@*ŽË¶î»ï Æò¼ïKÛ>“èû?ÓøÑ;Ð<ûPkÝAÂ44)žçÊ΀çQ®\…t|B`ñ™äQ@D8‘d=„f C ÚzŸ¨'¸¢žáyòAª€ÌvÁT3àÐ œ›G¸¢`€$±îL(Å  ˜'Ù0*ª‡Àú{’ŠùpwÄ “çàú;Öä\A3üöÁô$%C¿g»ú2o°DüôOiLEšDYEÂp„D’ÅzäRžç½2ž'bc’E¹;ðàCkÈø½ƒé4BýŽV@6`J¨|˜yÓ4Î3ÒÛBÑË·9ÄÓµ-[^×M-“hÛ7 Óxß8ˆã9S˜ç:ð„)ŽxÖŽåpÂO‹1à\}€âÀA½ÏTfÿÐ4Œ!BÂtGEOn1G8þ\*•§ý 4 ýjpJIý8`>…€8üÂÐ1Ê+ƪ9 ð<ÄHiaèJ‡±6!@øŠŒ°?0U°  MpÞ%D˜ Ãì0‰`*PÌ`x@n'À` âPÁ˜&À` €€ endstream endobj 215 0 obj <> endobj 1279 0 obj <>stream €@@É¥!ˆÞ ¾`Àpø€Ñh7ÉñòW«C€cÐIîy½ËÀ÷¹< ÁÍÇ4 Þp<œ&sAÐ@(1ŠDÈän, †È€‚m2ÎŒfp€ša: ¦ÚÁ¦¦lÍæ3I”èyŸ'§C€è^/;ÜEÆiÌ\o9ÇšAÜÓYŒ§:‰ØÊdæéñ:èeB¡ƒqvJ66œ§JXÞd¨›€0iÜo"¤“ ŒÊP4›tb <P @PX*€@1€à:  Êc@#@ n%Ô0@!¨¾_€sä’‹R½ÍjWÀá>{¿ß$pª0D‘Ä $A ?cAøvÀª1A 9:F–dY}•@8ÊCÂ\”dio'”¤Yq)D1J%äydžâ s˜f¢j’bH¶d-LSP­;OÔ5 G)ÔÀ=QUóX¼A“§Ài8”ÆYîTs¸†{S(çØoÁ9ö `‘ОïÀtg¸%\ ÇØÀ ‹„XÆSŽ…ä\O–²YJ\åadU—ÕXŽEÐU^¯xØEŒ„Hž8 cxº0,&öÊå)ò”¯À0eŸÑª—çÈ~ ¦,E‹ÀùøX€âñEˆÒAîiç¸j{ÌAAî(â‰ö žá‘öÒ`Áú‚£H¨‰z•±yfà oáh´}”‡ØB1 CÀàŽc`¤*…˜ùî{Y‡À<ø‡/¹ÛƒÄè{…gÀQ1)öâhò! ІÄH=œGÙZYöàAŒV˜¦¨Â‹0ã I©&¥Tº™Sjt[!Ĥ"Å ‹V&;EÁ^D@3þ"a7't=Ó­àNÃä' */Dß`,#…ÀºCʇÁün…:ÄX<j >=¥¢€SÔê>ã)Ewr•òžT )b%UŽªÕj¯V*ÍZ«usÕêœÁK]L«r°VJÑ[+…urpÊ¿Ák*•V¡ÀøB\{†ñ&&DÚŠ PŠP0X@<†ðDØ•€0` €M endstream endobj 568 0 obj <> endobj 1280 0 obj <>stream €@@ɤÒHÄeƒ‡Ÿ° à8|@h³{ävøQU/€IîZ½Ê ÷¹D ÁÍçT! Þp<œ&sAÐ@(1ŠDÈän, †È€‚m2ÎŒfp€ša: ¦ÚÁ¦¦lÍæ3I”èyŸ'§C€è^/;ÜEÆiÌ\o9ÇšAÜÓYŒ§:‰ØÊdæéñ:èeB¡ávJ2›NS¥F¬o2TMÀ x>Ò@ù„SP>çÊ4ß±K'À-×äù¾aTêM’E¤A dM‰E"§ÐóñbûFžPh”"- E¡ˆTò ñ×F†Tj)‹å¤ÒidŠ%$yI‡ß‰wº Ú6ÍÃtÞ7Îî<¤ñ(F$[ú¾ä›¬{½#óêF/€þB$þIïX>|ÇÙýŸdîA<.ð2A’D .F‘a2ób!’¤±,{Ž }Œ¨PF`@ nO€IBI€cH€€ endstream endobj 546 0 obj <> endobj 1281 0 obj <>stream €@@É¥B Äeƒˆ° à8|@h§Ùåð |’€ªà˜š|/uX=îSpsyÕC7œ'#IœÐt b‘Är9‹!€Àr ›L³Ã„Ü &˜N†ƒ)¶´iª›3yŒÒe:h#ÉùÐà:‹Î÷1q„ÚsÎFqð¦”w4ÖÄ#)Φv2™cyº€N»D¨d8]”†Œ§ÓÔéS¬Ì•3pLV ›‹#yd†p"H§"1ÌŽt$I'bQÜÂK<‰‡“4ôd'Iæbœ¢h)Jf¢¡¬ªl+JãpÌh5 Ä#äF:Ä¡10ôN(ŠH¢Ø¬þ,.‹KÂá~˜D àr` @H J @L `N €P  R ÀT àV „€²`Z @ˆÀ¶ ú#€#€ˆ$x’`”€– ˜Àšàœ"@&€*À. ¦@4€Ø€àè€ðHP€X`A€hp€x˜Šè*°s#@k@¸D£Î—` N(Ž`0à1È@9œ`@ä`H¨›`P¶àX|‘à`2 h Ài® Àq^‚@x†€‰T ‘N ˆà™l @¡.  ¨v “à°x  ¸T @¹Ð @Á´ ‰€ÉŠ ÐÐ  Ø^ ¤‚Ø8Jƒ¢H:MÁ€3å8>| |‡á ÀÎá´‚¯8F?døFkŸ°¨‘f)î§ÀO€%1ð0g¹| ©WŽäXèE„XþCƒYö…805mcpÜSdÈ>u€ÄÎøTžØ”º¸ {†À1J}€€(ÙÃo[æýÀpD_ µ@ùöCáð*I&î@ØFÄpèL‰ÄY_# Æ¦Kj§¹ªb€'Y˜{І`|ǹr ¢érˆâøÊ<@ña¾Œ`𒣉½»è>ZfxÅì{^ç¼{„ü»Â{Cè>1þ¹Øg–Æ ŠKB<}cö^Øn{­ùô>§4*kïÎݪ︰ãd p=ÃÀ®ÁŠ€à"ßp-{}ó à>Ø.CÜQ8) < ’À0>'À0÷£ì<°2>ÄøÑó7áÕœ raÜŽ¡îˆû €=BFö÷¢8™}p"ðïÚ£VmX1;ÁÌïÃÛ£à{Xå^𣂠`‡Ø¬ßÀâ€1Œ8ÆÐÒ C0 À>/DØÄb,i€¨èûOì ±9_€ãxQ„ÐÎ@7sÀ}‹X*ǸãÀOƒPÒƒ(M@}ÛˆV¬7àÅwâး=Ãd Àw¹HA@û#ì pV=‡°çcÜ ?°¶>ÁÀ!C\u–3FˆÑa$°š´Œ0:YzGÀ½°lL xÄX~ðŠ;CQ ‚û¡È*€¾!˜¢ø(C Ñ#Dô[ƒð†À,àØ÷™#$°œ_ûå ÐÀMG „Ô0}‘t:p°k"mÞ 7~0F{à ÃànQ6"Åo"@A„@ƒaäD@Ä+Âèš ",°*Ûûãì%p>ÀÜÔà$nÆ*ƒ³n¡ìC¡ÄÊÂ=U@\ñ@÷uèpuV0F0`íøGQ(!DýT‚,N‰ùÔ%‡ØrjÀÉ«;·zïÄ{ÂázÈXµ bëð @Q‡`†T£¢'1îÁ¸ía.…ñ €ý‹OUëÆø÷… ü¯ŽßCaê>àƒ aŒÁ¦1B1a#„@€‡½Ð1¬Àð7]øœxC&6FêE „üs‹÷ó…¸rkè"àÈ{ƒ@q^¡óž£òy@áÕÀ@À«#ìP  >Àpû6>ÈÙ6¬6Ýà´wâ~^„¦q<ÄX¢ a¨E‡PðƒÀ|3 0U0P)£ì `Æ ¸‚Ð[ @烘^ñÝó‚ø9è˜ À%xÚÂÐ8`ü&AÊ:gÙâØÛ·G¸zjÁÞ;áî`ѳ@Ô{‹H*0haàV ¼2'@ðßâw á¼ÖØáŒ{ˆ´ƒËjv,P‰à<3@8ª¢T4¿±ýEcƒ~ÑÌ8i®ß‡À°I AVÆæsθsà—=Üã>·~Ëa ƒÜ(ÁP7ÆàEÙ <#ƒ8§Jª !6'¶ "l,„€¤B˜]âËDè½ ¢%¿oÃ]ðƒý³ ‡¸Š‰q÷*`îC{V Îðx»ð83ÕšcÜTÁP9šs^mÍùÇQa¬83ÀûƒÜ7qŸôtÐuCh£ðüšZ‹Š˜æx£ç{ŽÞék-ÝàÒjÂhb¼0p>5>¨¼9ˆPè"€ðcav%â€nAÀi BŒ7ŠÐðÅXyn‡ád!Ø~aP`ÒpK "i‡`Lq¶~•¾áöÁºÌè߯Ô < lÇiüoÁÂa À\`Òa‚ÁL+ Ô l:êÁ à¤&Özazkw(ÆèÊ!ÂwàЗ €ž *-Ɖ@øsÊNŸ­"áB`Ä`Ñls'È,Àø‰H‹Èæ­²¤ŠLÇðŽ¥î•С/ jR´Ý ̼ܲx'†Áð@*áí·«Î¸ö㘠¼áTÁîmªâÝg¾a.À^àÞ!H>ÀÎaã‹BÜ뺫4Ðh1(ÿÐl½†ü(æ­¾|ðŠ‹h‡nÁ@áòwDÐx`xÿ*°¨ƒÏJXp¸¢áHÀ©HÉŒᬱÑtÿÑxdžý,aØÀÒ)þúï, ò¦²çxá¸àŒ— IM0±JoÁ°€bÀfA @þ ! âÍvÎÌ€öÀæ- ø à–à¸á¾a€ ®ÑYÇxAð† ÑljU'<âqz{ÁtÀ²aŠ­ÄáJa†.‚ Ã8àþ –àŽ€Üò Ä áï$²C‘#Ȭ†Páö" 6Dúádaa>(Á6AÇVÁÁ á@Á> Ac!±!$¶j)lòኧx¹¨0—«è*à¤jÀ T`Œ<B!X¡j€<a áò2ž¡€äéðŸÜ  !  î ô `Î`Žˆ@žV! á~Á> Az2ÒGú î¡"}À” *mAÀÄàô  ¨ ÀahÁì¨u1/Á†l!Fáô‚ Z஡Q)ïúàog< ÁöW¡î>ïøÜ€>sܽ!½pÞrñ:‹ÁîÞáÌàç< Óþá¦Üg S¸Õh ÁîH*‚àV¡]@!öm³PHÁä¡E8ñCóÝC¡îaöi”› /NE‡>æÖ>¯ $©˜ är´TA>è a.,!@̺³ Æ m¬zÓܸ!(ÐÔßA@<´«Nµ µkZµëb¶kj¶ç< ¹kš¹ë¢ºkªºë³!è»Êüwá ³@ƒCÀUFáXŽkG#í0Oí8ÓÀ> Fð û¡ Õ&¢‡îAðçx¡µ‘m…toàÞ*`ú RxõABá,!LÍÂEEPÀ?áî«øáav@3Xâ’ ¡@¸ sÁ×,Da6€ä€ô3áV azl¡&Ò.)p!ªwàðÖ)|Æ1n‰A`úÀ< ¨ A pÀÀ†AÐÁP‚ÉRÁ@!€>Aa ÀÄA×€С4Á Á áöà¨`@ìNîaîA\Á7;‰Ø!žaîÓ¾áp< ü @ö a UVazîAáFÒ®  Í,†Jèæàã ºñr‰@âfàî€ ØÁàÎAö`0¡€Þ/!&a:5@« ŠAjj,{Ö­°fááK#lƒi€Èa á2Þw¬Õ€g~ÂG† að *á,᱆¬ÖaÂÀÔ©G: `á.Р<Aî vÈàþá 2 Q¨ÐÁî­6Ó­>ÍúÎÍJ !ö•(Ô˜jÀót¡ ô¥JýJáö@ Z€Ä§bBôdAöáÂ!älM ê¦Ágt‘¬Š*Ú r¢ÉÁÖážMà ¯NÓºÖ`f áð *áZm*Ò• V¨†ÁC ð¢jJõm 2*u–À€â °àR€p. 02ªRá&nC>È·>}5q‚ ðÜN´AJ!}q²âLrêöb§‡h@¨¯Øh$ ’4f\ì™à+^¡tJ! Ø €ø >@¢ A  !”°ua„¡0˜¡”aÞa@Á 7¦Að¦€G~Éz ò~‚¡nÁL`“’ÀìöÁöá@â~!@ÁîÇö³. `áFrÁ|aÊaˆa–a¤Áv!„!0¡A`þ ¬ó¡§bî |ª°¢ðªTÕîˆ A˜!¶l!ÈuCÀ  !£˜`<!& ÁXaDáN€~`øàv dÀª ¡Þ|(gôt†mT F¬j«.ϬÆàÈ*r¢áȆŒsÀÙFí&m+W_ƒ`>Ò¨—€al ¬ @¼ ZàB¦;fŒa‹fÄv\wà¦d†Â A‘nh!<×8hn¡XÁ^ªÌ!¨!HªÐ‡!FÁ4–¼ЍáHaS0¡X `ò Á @ÂàÔ@Òið` „ êÊàÎàð á ¦Ü`ЀÞa €Úàª`Èp@µÀ&’áîö¡ @<—à  ² ÁnÁŒ!n€Àº @¤ º À>ö* „árA Á`@>A4ïᠪƫÁ`º@¾,áA.™w„Áî¼G†¡tá0a(A"¡Á4’y+’ãw“Y9“Ù@ !2ÍÁà<ä š ä öj€ª:§á< ò¡„Áö‚àÜ¡7qއ°Ð ðÁǾ GeXV G¢` 0 üÁ!áùp¡xÁŠ!B!Y, !* Až`¬aö îÀèww'wIÚ LjxÇyG˜yÇ¡@¥°ÛJèæ¸”€·â}Çà~Gè~ÇðGøÚÌÑQ±¸ ¦¬Ý. %áî a™r@.`üáÐሡ„aR! À„áöGöØ%*p¶¤P¤Æ:D¥ ÞÀ&ÁµAíÁV áD­&Ö ³ÀÜÀÒ`â øíÀ²ªá>A0`Ú æAÆ(>áˆá!€?Ð@üp¡>ñü`@*N€ án à´ @¾ à_BmXÁʯ!³A„–¡Há>@ä.}ìàîHá>‡ö…8¼ÑÇÂÀ”náU@,` ’‘Á’Ì¡’xi৯’ àì! þÀ´À¤LÕ{À~àf \ #Aj !8áèA¬^f€Þ ê¨” à  À àx †Ç^A›ë¬Ö‰Š²ì.Ç2A&»ð@ÀŽÞ¡¤AÈ Àáà> ahÁF" (a A4 A\apÀ!z Á| `l ~Éìøo&Á€ðk!f½Ô!taî‹4áÞ]éÞÝð]õßýàö îà†õVà€`Áì@À àÌП m æ€ôà8  €ò€ü À†¡a_ëÁ|»A*¡b!ŽáðÜÁ€VZóÖNwà30hà2á ÐŽú¡ø7ItÀ> 7Sü.Áydèæ jCî´ã̱šÀwíft, 0«Ü ÷U dÊ•¨TQgÐûìL>œfãr™™«€Ï±³ì\{¼Àê¤*TÒ'E£¨äypüA—¦˜Üt>÷ЦcèÄH¼ß6Z¯p[ìd5œçS9è ‡D"G09ð–?±_ö(¬Ì{Ÿ™€7Á-ð½ ©¡TE& œÌ§ŠgÛ²B%Jåb[ î=ÝŠ`=sˆÝnó¸õéå!·…®çsyÒ÷‡«‰d]c{m/u³áœ•Kϱ:}µÏŃÑ b ¢€ÈU’jZ ïð§µBëï£]^â0 ÷ Ÿ…(3”YBEƒ01>E’…hдg¹ª±˜îB°ºÔ,žæ+à f4 #ØÌ8Ä)4:–"Ù/c`ÜADQV;cÉ ¯ÀÜê•H™žc«~ž(È[:F 蘛åy€[”ä˜Ð.6$=&,>j8ht–6I²|£)ʲ¹÷,ËjŠy/É3 ˜ä9N`KÔ3ºd‘PÆ®‚ "©@0À}› ¤A ¤PÊó€Ä1¤.âÁF…(äETÙC±A ÇØ´C CÐEÄI2CbÁð ã?±ô .OĈ>þgá>GähðVÀä©…H—ç¸îG—€CøG‹¥ùö=ä*;“Ä]“c‘¶;+ªùðM¬eêÌX-'ÀÈ{˜¨œàÁö`R}ƒGØ–}‰Çqö 0§¸vžàÑî%¶#öK‚¡à˜ÏáN0h桨hçÝü àxÁë*bž$ø{mIˆ|@©4E”£pôBCñ Ô+ Ä8øEÄI8Ñ*?”&lZ‘¤p<~!˜]/ Á [>Èf­«­±—ÆáîO5'î8¤É.x$Yî¸ ›gØ"}ðhŒ%qH“¥ €O„‰ GƒÄÉ€\•Æ,tpÂÐhŠxª."cö)Dcø2É0çˆ P’$\MN‘eÖ5SÛc¯4*ùîI™'¸¼±š[I$Ô’‡¹‚ žeÈ„*‰"ˆš„âñ‚L‘¤g¸Fäy$Gp_h=“Øì;Ã`hu mÉî )Ô_ æfXƒÆAbS q/À@Ö1}°BØA B@‰·P؃‚,FáR,F€ˆèg‹ÐÎpxˆBðÌ"C؉â,;ˆ‘ ˆˆ ÈNÈ1G¸,=–qœ0À±â ³ÁÒCÈ `CŠc"GØ èôàpˆ˜y ðìkE£Š¸ú°B 2Z1PÂ(?‡€>Áèüä 7qäGØòï (t Ëã,Â%xƒ¦œ"Ùb`± ÓûíhE‡!R&Äx¢N án&Åú:"ì"@tB`70"]—ÀøD‹\˜: ô ƒX† €Üo8vg‡håDÀ 0P‚ø…„Ã…Húº!йÃÜ¡2’(MH ã„ ‰Uð8‡xív.àD  ö!Ä4êað2…(¥BxQ Ä.ûóðÞµH![°ECØuî¸ ƒŒ…€¤è`0à€}‹0*¨÷‚2 #€ø‹"L±.(Á£tlŒ  J áã”- ¶ƒx£¦>¸û ‚5°”!k‚¨F ¡2„r”£Ü'z*%„¨â,L‰lFЂL‡GvCÀ à‡AV+P£¦â,ró” !øh  {Œ#XaŽB4p´û"02áÄ`‚Â.¹Ñ0#•â0cÑ#†X‹ ~ )¸ŸAÈ;‡{Z'ø¤‚|OŠJnðDœ: EŒbaDjh@Þ£lQ‹€"Æ àl°tÀ=!D]…q°ð& a”#°¦HçÄqÂ;†f ”Uà€* Sƒa Qv6ÀÅ aP*… ´H˜Í€Ô& š4†pÄ£|fðBPQ윮q´(¸‘e£üñ®øå  <>`‚ˆB €Ò"Ý8cB8- aöÀÀŒ08‘ÁO…(Œ«ãÝ‹*#…Øh E† Ã0øà4ã°û² ™ K.r½ÜÕ(L³ ªZ‰èª¢}x h‹*¼G‘8$ˆŽ‚¢P àú(ˆqà:‘^G©þ¡cÜ…aî#ÇØÕ~’FØ @ÐyŒ!†(¸³6 BPzpÚc@c A¼)Á nŠùÓˆ‘ë*Åbà¤ÁåuÃ@³²Ì aøúàä € &X‹®!°Ç„p 'G¸+¢÷hí=ªcÃt$GŠÀò%ÑÈ øÈ8ˆüÇØ_ rnmѺ>í¿xï00€0~ b-Ý ¢x3À0y{p,ð> ÁÉà´ÛÈP½eDrÈ"8RÙ˽ /|_ŒÒ9Hxý_`X{Ž¢½¸fÜ_MŒÑrLyÃ. ¼â¿ áð€¨¬Œ7»ZÃh¥"¤V 1L* ˆÒ£t€åÒºgNêHЃ@18÷ch{…ÁŽ1obnÐèŒzü,‡ÃÎX‡!.Ãú4‚,C€à(Cè¼F‹aZ˜IL`xXvlÎp‹ôP¾ƒðL, ˆ°ô#Ù&Á®8ˆ„¨o¢[IÑIĘÁÔL‡‘DX]âÔhàüƒ4–9›‰ <,@9…C(m±¶hÃ8æ`lR€€¢ÄÂP— ¢ÈE‹Á.ÅØµBV•±VFH€ˆ¼*°²‚ÈEù€}ü4¹À÷ç@ž9ò : ¡º+£ºK¥ºk§ºˆ ~:Aà8 8ƒðA„8@(EƒÚ¥Ð=ØO0_‡°fƒxSH4ƒ¨8!K8]J›ÂjBj„BjHcV†c†xÁÒ!ÀÈ ¨G„°FªèH =¸> BÀ@„8Ø„ð~‚T !c^€È<„Ð>@IèK{ ˜ †°3(-Ð3ˆ Xˆ^àX(kð‚ „<0]ÐO0K°O€.à<€@˜(Àn6x2† -‚È3‚€ ðX‚]…èW†0jôØ5[„¸ž‡ˆ}aš«V[kø‰‡³ƒkƒR¹Ô´‡¸f0Ð()—(b«ðRÀO±`B\ÓÍ8+ƒ,À6øB"§p=„Ø>„ÈPˆg Èl@V(6Bh:ƒ˜Nƒ°S¡ï{¯…|ƒ¢ñx)ª¯ GƒèJ‡ØP4‡¸„XvXuX{ {vÈJ„’®ªøJ„0Mƒ˜9(‚P.€ð)è7pE`E @YpZ‚€\‚Xjs €@Q„€N5©«¸å±†@nXi¡ØÔ…P{ƒÜêxWèl…À[…(N¬¨W€@Wƒ r˜ ~ %‚x4@A„¸M K…@M„0H8H€O…`P†q Wƒ@5x9àA0‰(@X,Ixˆ…xW„XN }à ­RÖ-rØ’Ù-¢Û-ÄåÎj…XÔ‡ayΠlƒÀxvH\‚gL  B¥È?„CìÈ È…ÉÏø„XƒpÙØ@?A„0EƒðHƒÐQ! `\€ò–…(t„Xr3B†*û‡¸VÕB†q¨ Áø‡À;€¨? 9„¸Œ@[K#M†x¨^H[¸Ò{¸` ˜0}€{–‡Ø$‡Ø$(Iƒ¸‡Hl@Q”ÈE„>!j€ø4ƒP2„(@i„Ï({Pv‡˜x…@Z„%˜i¨.ƒd†Èo…Àb \… &è‚ð)´‡(åÒƒ»¸ÀÄ©„¸H„¢ ˜OBX>„%I„AŸ Bï…8G!€ÈNèLØ=ƒè?ƒËÉ„FRȸFˆEƒ¢€ +&„„Ó€@>ƒÒ7ƒàJK„(ž€@&›ø&ù”à>È<à?„ÈI˜HpHŒ8†€EXDƒÐEƒ EƒÄ-Ð?„ÐM„ÈLàQ@q„XS€ðwpQƒØF„ZY€ÈL„àK„ðK„%¤•è9Ð*@10Àb‡È08€#È€«$X‰‚PB%Їè%€86ˆ@…hÃÜòE)Ü“› سâB¿V8Rˆ6ü½¶²Fï6‹jÑ<µGTp¸$ʸ@ÜG8ƒ+ˆEª‚›‡ÀOLñ& +éâ‡ÀeÒúÕ­h;ƒ°9ƒ˜Oƒµ3-¸Ã‚à ;…òS2­¨P+ Ð¿»ü¹Ø{…@c+ðTp „06¸2‚Ò\„H>T¢8ôØSp^ (`PZ‚ø3JØ8 h9…PH„‘îÚû¯ÜÉ™p> endobj 1282 0 obj <>stream €@@É¥BHÄeƒˆ° à8|@fwÚ=ôe| €ªà”|/tx=îSpsyÕC7œ'#IœÐt b‘Är9‹!€Àr ›L³Ã„Ü &˜N†ƒ)¶´iª›3yŒÒe:h#ÉùÐà:‹Î÷1q„ÚsÎFqð¦”w4ÖÄ#)Φv2™cyº€N»D¨d8]”†Œ§ÓÔéS¬Ì•3pL:7ä3hŠr#ÈçBAÔ’v;˜IgƒäÆM= ÆS1B|i)šŠ†³aXÚ0‡ Æ£aÀäz(ƒ€Ñh¸ÓÀ0@$@°˜S À@ U @`¨+€À!`,€- Ø"€x#8€@$€PX€`&€¸'ˆ ˜ ° €È ð€P6€hÒ¼x [Ö‚ @ T€!àJH¹ Š` tÀ(þŸ 1l…`@2`Hv– Pê€À`@h–žp¨…@y²ˆd’`T ˜” € ä †À©r €¸Ž — À† „àÉ Ÿ Ñ~ Œ`à  è éWh>!ãð@5„@`„& FŸ@|D >|äú*å ˆžäaîQ‚¤‰B`žà¡ÖEÉ,Bh¾}ƒÐ´C‘Ac°-•Cihtg¸RG’—¡?‘D@øCƒÄÒ8"È>d‘DQ’ÅQ&Oƒå)¨VYŠ¡x ¢àÎ/ @ñ\ …xºEŽ„Xâ@ŽÃð3ÂyD D’„±FDˆ{š 1îžà9î¦È ^¤¨>{ºEœ`A¢*‡Ød)öi¦JXJ< YËžàH m‚€Â1öq¢Iör£qFÄyF‘äÈ>hžå€ {‡à1²P‰¢ÀD…!?e‘u¡ià–{’æX>(÷`Ty„±ŠØ`H}‚ö ØÁTip=À÷cÜ;Á>Å !¤WŒñr(ßȬ€|X ±|*E‚ä”. ÀÇØ aP† ˆh\¨(aP>A{tà m1ò+ÇÈ>¢0GÇ8#@@”ŒìDˆq „  @ì5Œ`°*BS—ax}†öØ`ùü‚ÑîǸCdI 0>8‡›o~,ˆ1å8ŠB FÀZ>ÀH=˧?°8)ijèƒÜ ñ|40Ìë{Q.>Àø_‚$:0eàÄœTFˆÁ6Ú û ͹h¿r*Pcì Q … «@4ÄDHc-´FŠa*DX«" E‹ÐĈ—btK8€òCˆ‹BPF !t=Â`¡ÈRu) ¥à¸{‚QÄF`F \%ˆA ¼àg!¥˜3&hÍ™Ã:gŒù 4&ˆÑšCJi€!§5¤„8|ã =Q&*†@ÝKW‰àÌ‚˜i`DÜðÐCo ‹&ˆQÓ" Ë,v±T>@tŠ#ä­Ñ$#Ä€‹  I¸€ö‡àÁÙ­ˆ¡  û ``DˆA™à¢,GN!'Z0«èjpO)‚\~€DX€k`dA‰:ˆÈâ-¡‰84¸s:µˆÛ¬ÎD8™â„3R$p p>Áºä`¤6 VÛG¸ÊmÂÀUò G¸~¬ïÙ{2âlåžÂ$Dˆ0î!„aAˆ)Z»T€3Ú{yð>+ *€(âÃ8I‡°ÞD o¸ ~.Eá+P‹â\Fñ0#€ðÃáÊöˆË #ÀÍ¿ DÙÁøy`år€ ð„`”ÂHF ·] Áˆ'/KŽï †38C%XœB8NßPkeB­€dKH`õV¸Mø@¹Á7Jij±u«°6?›’rŽYÌcLlÇÀd±V2û  ²Á€ÜkA2´‡À)ë`Hqdkh¸à°ä°›bhNŠa0+ÅðGA¼.†PêÃ3 Á€M ÌÙ«7g,íž³ö‚ÐÚ+Gi--¦´ö¢ÔÚ«Wk6®5æÀØ› ž–í¤|+`/[p½¶£Ücq´FøBT>÷@€¼—ChÌ?ˆD°Âfø Qî -ú¿õ„€€Ã8\€ð Áî&pV ÁÀeÒ€aè(ÃhGB <ˆ€èÄM€.'b E[1(Äø¥ÎìY‹ªÀJÆYÎãŒtÎôÎ>È ʹw2ßëX…‚,YˆÑb"Å ‹Â$YÍÙ¾Ð\•ÁìˆP )ØŸº…ù€H³†@ÕàÐe‹õ¤5FÈ÷ bñÿ’€C8‡!µ®áá$Dø¢‚tV‹Æ,BZì ”0a<„ Âp=‰á -„¤Âø?ˆ°¨€scìp²&EЀÂîËq°(È“ 2p¨† h²€[p0GDalKàà$C;œpPŒñ¸-@v bKRˆnE@ø( ¸œ ǸP¢`_´?Kfx“ÂLBÚÄXh!¨E†A„lË›ÀŒAX'6ç@ø’ÂŦqÁH||8°±@@¾ƒ!´+¸5ÃÅñŽÂ,F„¤”Ò¢UJÉ\ ¥„²–’Ù´ î"*W1jòÅøÃã,g f5ÆØÞŽ!öaêAîp¡2AŒá&> î{éjŒžá²~À8mÀ„E°ðÀ*À ŠÖœˆ¶@>Úfàb‰jÄþa@ðA¦ÀÈ`b lÎƯ€€ aö á림 ¡L !„¡z‰a `&º!À<àØ €R €úAXAAGæ/hmÁ˜¶fè¡ò(œ ð*Z!&%ÈŒ@œ…è è„ Á á Á ¡vo|pp‡ qq€˜a"¡öà Õ¡ Ñ@3‰ÆÑ¦Ñqñ"âÀG‡5Çp§q'q§r'&ଋîá\a`¡^q–AïvõN2ÀøaÁ&€>¡4Aî‡Ï@„ȇ±1—±Ÿ‘¤Î4qªq®a`ä¡B~Å¢Ÿ Z<çþ!ðëv+zà@þ€ü áKüЦ¶a%N7 Ì ^¼ApŽÁÔA—D0a>fab @`¦@N¡ÝËØØfÐaR¡Ô¥Èá,ÀæA ì > `dÀ°ö !Œax¡\áf`<ÀÈ@íáe%PP\ርˆ²`F@è <àpÐ åÈ¡ = PÙ Å–†Ú n’vå–*L¡*AŽ\@s‘Ü™Áñ É– Ñ&°@òŒa Ö¡ãŽ á €Žràú™Î½@?¡†.a†1¢Î2‹`ð1¡‹ ¡– Ñô\:áî¦îð¡|á00nèO\ê <@àÑ` ºiN °¡naŠcDVá&rU%’]&e&’m'¨2w'²(2‡(²) > aöa€ÞJàö¡îAráú­HÓžŸ \¡8áÀîó®AîŠA ¡a` Øઠ!ZóHÎháhê×%²_&2frk&ìC'4 Òy'Ò€…(’)” @b¸`ÎR ê†pþá^ÁB ᩬáAœÁ¦AiCJîà;³¿<3Ç<®¥=ÔpÏjXø Àì  Ö ržç>¡NLìï‚!:&",ìC!2!¡ "~”Fà'þ áðLÁ8AŒ[;àÖlÁ@ð@Òí ÿ€`iÀd@˜áhJbá, Áp!EN2Å,’Í-Õ W2ß.2ç.²ï/2÷ pÚঠ* â àl %È Á!.¥úA6f2!pÁl\Ž@d¬ÍrgpÞÈ0b*Áð *àœà`¤$ í‰Ù8à! òà¦d•ç€Ö Ý‘l bN­zÁ þ ’qUr!áW!áööÀ0îM'/Q qñ3Qg3ñnp1s1xq‡rÆàÌiÑ‘Q™N1×81§¬''hàlsè6¡èabºÝa Ú áá!+Òm ¡xá¤a25b÷a#8A<‹Aà> ÆÂlžœá4‚¡Á.ZA|î,¶É!ð`*¡ Àò`îÎ äÎŒìát , À² €ÄøÁ€ØÀ²\€N !ö ïIÁ hAi¤A®av\ÀAD`¶ iŽá ªdkŠÒ@ª Ö vD!2&AFa.<¡*@âàêÆàòahaL¡CJ@æ ½1à¡|à2õ¹o ô àìภ€´\€Â¡r³"a.€>[Á*$á<>ª!@œ`ûs·>~áî $°tó¨ ‚á| f¡Á•cV7(aáú‘F¸+Ðs2¨¾,4¬Ð¼Áø3^fK X`¨x@çÎ4Ÿê Ä `öªá€ ¼¡‚¡dÁf!Êë(¡*²*A€¥Š\¦ d¦€Â¦Êp§H†Þ`Àá|zYñöñûò r õA!€ßTm˜À„av˜àÆ f2?$2G$²NrS%t‘@—I´ 'T¥A«JôKR—)²ž ’£*axÁR!6tD àþ Ð Ö ÀÎÈ„ÐÀÞØŽÝ!! î€Æ ¢ d A|aÄ¡ÔfÓsÅœnA¬GðAî ¡²à„ ä@ê`AC¡*"át !` ÈhàJžaîº2Aª¶~‘AÀ¬`€ õ àŒ„èR…aZáxµþ°Ù ¶ÉáôaAòÐ÷°ÿi€iÁ-'yJ¸³¡aöø 0 ¡ðA'·Fø°„Æ–±wgÁøàô ¶çaT×o¡'eÀ>p¡T©¸›T›qir'‡ ¡ çi(|+à6bÁŠô ð¡œ@2Äa a0 ²À `Dkñ‡6áæ˜áñ–Λá%rQß1ç±îYnNá4n,®AŽŸ „‰`*àŽ ÀƒF¦zÝÊÖ.ò4aLøŠ¤rV Ö€ä òEÈ%ÀaDª¡† ‘`>6@¤òìQà àÖnºë«:°A!d!jpaÔûÁî ƪ‰ ×@üŒ à Í €÷"Á$!HaDè`† @]eŒ@÷¤®ÁR¡<›‹! @ïHæd €ø7:~¹°Nx‘fwÀ€¨ö AðÁ G¶«øÚÏjû šÁ 1|q®:ç×ípvZáZù¯É®¨Ûr%°Ûû±±Û [@0Fî øaá³ç/V Ú˜qŸ`än z dá ¥°Aî€*ÏBh0Ì  iP¡ö€Là†G¤ºO¥! ¥a`?¥úcQ ’A´ao…¹…!>°ZaÚl¥ÈaD àÒöAÃ.0á:Áð&ܤ%¤Pa°[I *0Kú¢pT}!(Á"á8a(á,¨cV!H@ð )’ÐÁð!—¸¡X@È@Ä`ä`-ï<Çt ˜ßqnÈáŒÀˆ€àž!`œ! þdƺÍ×2¶,é°wõ€ô‚Ò @Èè¸è2¡TÔ‹^mÁj…æ¶À…°Áîx@tBVáÒ¡¼ !”]²oúÓQ5¶» ‡l‰7Ïl‘Õ ¿»mq²GÎY§ŠgŽ ´¹â æú ° `?gÀ¾ `` °Cì$> ϳ},Óx'ßTøîd€ß÷ÀH*ŽK"ÑÈ´h!,ƒLN‡ã±éE*#’´»¾àbWؘ^½(³X …ÊI$5¾ÂÈa”~:E†P³J,â–P¥‰ôZd˜A&·s‘èÖeYÛ³1´Ÿ^å ª ÔN`ETKa.»T½À©µˆ}HÉ\/–ð&:Lj…D¢È”~ˆ@Äé÷¹¥Sm/Ô,@Ý|ù…Q©b>@‹J!‡´P>¢H¤YäIÖר´‰@¢áéÛñ¸ˆ?"‘(´@dü”?§é*Id½Ñ‰îuÓ×(²Éèš_}ƒE úä‡A"ÎÀ‚Ú¨Ú´tg¸RG’¹?‘D@øäCHàŠhøA’EFKD™>”¦¡Ztf(`…à|%Œ#0Ò7ƒÀqî`2çÃ2{ƒÆª( —Åé~ÑšgÈ “Ãé,=#ˆö7ޤÙMå:R¹BaøI.c©?8@@¢YÅaÏ@P!AP=!ˆ¤ù Q”¤É^N—€ùŒ{†Ä¡HF·äè2_ E0ÈGØPCD¡HäaL‘àñ&U”§AŠ$Xð@$(ôB,¡ð]ÅAò”È ´ïŒ&@|€Èz ѳÚ@„D‘A@`ð¼'ŒÆ‚Ý©çØ}€IÃÞ:‘£^2åèNÆ€îKå þI‘%¨úNŒ„X¼èHÂ!dx’¤iLH”`ñI€µÁC xöäŠçØÉ5˦A7äiF„¹*9L1Y´§žàiîà¡î Cp,“`ùFˆ¥ðHd ¸L‘f°p›G¾{„Yö ’¸ôCÀñB×DYÞ’DY$K¤a7HE¦O’¦¡ðO3Q 3›¸Úa´gœz “$ 6;ƒ®Î>Ãá>Q;ƒ”,Ÿ¡ð*@ (r&‘d!=‘ƒé(T’¤H×+ªþÐ:pÎW±¶jšFÁ<ÀE‘„££(|Š]J  ðXÀ*I;$&F»…AN GhBˆÃi,Ø?];é©GÑ„q6GËø’Fý$g6 ’Ûèô‰xí¢`ö‡ØL ¾ˆƒzúDp•ab|Iáz€E£àp Ð (“„§8èñöÇà±A˜AˆlSÃø'Ü<$Àùé‚4]±v"Å艆âô1*GÄëøaè°ô߈4@¿Q6¢‰ó+qî6¨˜3FpŠ QŽ3ÆÁ£4¦œÔš³Zk͉³6¦ÜÜ›³zoÄÉÁ8g㜓–sNyÑ:gTë“¶wEø÷ bŒD €ö"Â@_Kèã`ï#Cè‚Ü9‹`›ÅXœÂxV‰†¢•º@â(:RÞƒÀN <‡ô.¦h”À}ξ¡Gư6tIŠ6Û…˜ºâÜY‹SÒV„ €‚$4ˆa„X|Ù$‰¡D(„ò“¤/…¾‚èdÁL$qDUâ8Ë0gG@ÂŒ†™Y‰M²6†ØÜ£xoŽÂ8‡ä $?&h‚D>¬+C@¹­¸S‰<'E`™ŠØJ«‘ !ÛéŽ% C‡Á ƒðZA<©€€ê!…ž@Sˆá0ðƒPvä €>CXøàTT ±F*‘‚Mú‰À%D ºÉT8è"À‹ Â48è~!Jˆx`â(Hñ""…QÑ Â,?ˆ0ú"0ûðE€®>à‰¢$S DÒ‰ˆgÜCðÔ"ÃDÎa¬©ÐÙXbS0ÀE‰Qv#„ nÀ|cÁú#CÈâ`§Úa#„˜˜Š£äZ#3P@1 4CàCqFOä<Äôž³Ú{ωó>§ÜüŸ³úÐ ”‰‘ Ô„PšBèe ¡Ô>ˆQ% ¡d3…@΄(Ï ‚ˆ-ˆ°¢"ÂÐl ádD €Ø+É­Y";ðƒðOW@ A‰%xŒBD ¡Œ'†0­ B–®ðð!臠|!±q…*b+x?‰Ñ.&ÄŸvOÌXpT$E "DPbÁ*,÷(|°þê€$±9CN’º*L? ÑD%DèœiãàDa>>@Ñà!; »j,ÇÀ…¢œEp@>À˜û)D*0 &Á€ƒdbp 1€ð«"ì{„:ˆº‚ † â2FÐÕã [ p>+ÆH»X0 axAÀ.ãìKˆPðÃà`=Àl#*ñGÀräT‰€®>@ª³aBEõ"ˆ„Â(EñƒQ d!@þÁ\E¿Â@D AN-DÀ¨‡(Àâ ÃH‚@ü§ˆ8Y ¬±E‚,[Ñk·„X·\K=h‰¶ÀD5Ê0E‰&•ObXÍ$±î-r 8ÌÜÍQšhǬí¢LŠ19€ÀR„s€Öˆ2uð}…ð”„ÀoÃhYp+…GBs®„p†ÂH>Àøt€@o ,&&Äà΃Ü(òp-ÃP<%€à, <P: Ä>°T 8û)aƒî÷^#D²‚¬MŠ‘R"ÅX‹¡àTqL8zÄ{€an= “L(]ÑÃØX !4'°Ûb„ s!ˆJ‡#WÄ2Vb D áÌ6…» й;(p¡ø¨Qt‰Ž‘N5…0ããLfŠSD=äñ¡é\Âý\'@ø¦ÔpEƒ`ò €b @|3…°ªW  ÁlVP>/öðŒÔH ´"Â`~Âè) ÜáÈ8 ÂdaRǸ#ó4‚ÀȆ‚ l0{¢Ä[Šñx'ĨäÜ è„HG¥@IèFù1@3‘P8)ˆPèl vhZ¸:‚8>„}‚ }Ñ<³~€hl‡¸+7øh7°‡ p‡¸>`Ñ… |¸ …p>¨M;pðl„ÈI0F@ÇŽÉ‚ð;ƒA—!rJYk­ F•é¡•Øç4¨a (C„Q¡„8@F J„F HHðL„Ø]†jˆa„%ƒ€/}€81)ˆ1X# d€c…€B„øUXP@þAè+X"È…À'à{€{€¸{€ëè/†‚0,øC¹`ʃ°SÀøx˜Z…ŠPd¸`†Èу {‡ †€{¸øøV[°…Aƒƒ`-Œ;Ÿ0< Nƒp†Hd‚°Lƒ(x6Ø €¨}€x<Û<¸PN™ÑáŒ{ Y¨{€9@/‚Ð0XSØn¨+ƒ¸]Ðq…à{ƒq˜Eð?(7 9°«0È5ÈÅ@u…Ègð{àaðZˆÀ ¸}¨fðc„Xu€@l`Y‚@8(&…(:…è0ŽP‚¨# E¸Àg¸o>Ȳ©˜3…@'èLY!€<¢ˆW€@i†Èe ^… 5‚€%‚Ð#¸/€ðG™Ð …€5êD—0—@81…Ðc†èj q”²xS€j‡ˆˆ4T¸†p{„ˆcÀ$¸e€¨&‡ØPH3/:i0HèUpG»* ©OD‚€$ˆ@…pq°g†x_€ðv¸   !Xi€C°‡¸ˆ}€¨}Íp82}€8{€c…ÈYVP  ‚E†ÐJ¨¡ŽËð…(a…Ð`XPH=‚÷@ÀžA˜XX È •p6"È „¹ÏèOÉ+ø~Xâ$ƒÈ<"‰’ç‚q±ž¼õ"H>Otøð< Ø<¸L•ØG…}£*@\MØC€¨‘ B„ =0/“/Ÿm…h|h{…ª¨GAú„@„)‚ð+‚Ù(Ø-K/ÙñhJ‚€MQ@[i—µ€H`¢ˆ=Ð]² oÀÑ•(A©Õø:‚ø ©2‚x+ßЩÀO…ˆßÅÍØŽaf .=¿¸sð{€Ð\€ö1¨V„W"ªžÀ!„¨{ƒ˜FÞPJ€8TPeXP¸O€`„øJ` endstream endobj 536 0 obj <> endobj 1283 0 obj <>stream €@@ɤ"ÁP’1A âÀløŸÐ¹ö}Ÿ( *°8i„ží‹Ý{–BâyDÍçÉÈÒg4ƒ¤@1ŽFâÁÈ`0ˆ&Ó,øÆa7 ¦¡ Êm®jæÁLÞc4™N‡šò‚t8…âó½Ô\a6œÅÆó‘œ|)¦Í5ÑHÊsªŒ¦AÞn¡¯Q*ˆ ²ÐØxÂtm8N•ZѼÉU75Bsq vZ9Žds¡Ô’a1ÏZryš€i)šfÃhÀb2FÑ@¤.ÕÀ0@QÀ0œT PX*€0[@`DŽ$ Ph `˜  œ $`(À.@@Úï €N‡€ ( ’ˆÀ &(¼šà0þ€`9( A‡@I €Qx‹ YÈ hšÀpÄ…Ày. Àª‰€  ˜ø  ¡, À¨Š  °„|qòeyð è¹x€g¹Š{—@©$TgAÌE±2xº}ãȼC‘@‘cà)—ÃQ‚y—‡¸6P#õ2<ÄXüC΃ˆà TA Adé@J”¤ÁZ“%p{DYˆÂRÂI# ðîb ä¸ÖE‹„Z|?ãˆÂ? dY¤ÁMdaR@ñ&V¦±[Dä‘:IC`øˆ}–$8øE‘$Y …þPE±_“ôäbeÑî\ç¹8]'Èž{ƒè˜f¤8úECÉ?‘CÞOD 0ô<‘cpòN\`ùðǸ¤sžà¹Òp¥ vIç¸:R™§mPhZ@ñøeÙ†eš@ùBÄYJEäP{Ãè*G“W1UDg 1>eaÈ~*„'ØŸ`ø (Ÿfà+Z„YFg¹n â QäXZ ›±ö àqðqγ¼ò{à îQs ñž©ä"œ´ŸaÙö„†”{i‰à{‡G¸$eáöJ£@¶NE‘J{€…!€•Q†VÔA\]B È8Ÿ` ä+ãp˜à‹G,qŸb¶$ÎÓÂ.>žÀÎ}‚ùù’ ´@ø=f#ù*B’€ùN"ÅXŽ,W±^"x½€ŒI ñ*àz‚>‡±#ð£Ü °Þ+Ä8¢`d{ƒÁÞî¸v€ÜZðœXx`|< à¼&Ã"ÔZÁ¥l-¥¸·—â\‹™t.¥Ø»—‚ò^‹Ù|ñäÀ¨B,GÁ&-† µM¬ !ZBU @@ð>APTÄE†Å€`!9>|>#ä$1ò&GÈ¢LJ ."ĸ!ýLµ  ƒ¸‹b,B‡p¨>ÂhB%‘0Dè‹¢„FÑD$Àð²à h î[`ÃðKÁÂ!‚Sä ‡Öº'ðø àP±""Ä ƒÜ=#„h”Š€ N³dØt`x4‚0ÂÇØGQìg,½…÷2¬N§‘ð"}cÜiQ"(…ÀÖ"-®Š1'ÃØ]Â(0Ää'ƒ°ª"´U‹€ExB ¡p@ÀƒÐª bˆ-C¥®¶VÚÝ[ë…q®UκWZí]à!x¯5ê½×Êû_«ý€°6 ÁØK a©Éi±!DÄ…À"àP•Qp†(•áÀ@ˆ€î!—È‹ Ú©IùB%DäSbD 1ϊ€fjˆ¹®"B¨Áä"‡ ä@gÃ4{‰ñ2#Eƒ^„cÜŒ±ÃЉb$<ú¨ÀDH\RˆÁ$'„hthD‰È,aü,¹ü5q&ZТ,V™Ž>Áü@a‘2FLÊTŒ µ—³ü%„0–ïD`ç¢1DXÇ B1.' }e ~¹v"Ã˜ŽŽƒà='QPòÐìiäpp=ÂX×t@ØŒPÊþ.pˆ=ŠAH,ø¼ALVÀz€| x5ðî„Xl`ØpÑ‘ /ÄÀSt¡ È~Z¢˜5á$#…­È X†±&ƒ0h Ái†qØ)ÆXŒ# ûàÜ`‹"V†aP…rXJ†Ñ"„˜‹ F±°=D¨¯º‰‡ &˜[Cà1î Õ~#Ü4Q]æ@ŒÂ5®µÐ(ÄÜ"K¯Ä"Âøˆ ¡PE…!.( ÆPYð>+@0—rPC‡@b¥Àøz a,5Ñ„XXÀQ†áLëÍ~'Ñê4‡(ðƒ1D!j˜kIðø×Dø¤¢,O‰ º=ãhŠ\ ȹ B8LàõkB1ö-ÇØCb}†ÁöÆÁAà´d q5|€ø¥‚Ô9Å94Dt‰rÀUÌ€V$Äûž£Á>Œ!ð@¨ÛÂqš :þ.XD´BØG ‰î$…(–â,IÅÐô'ƒx~ ¢.ð<ÇØ& è›:ÌÙ¨ÓÁ}еðठ ƒ4Œqîë Š•L͆S6Ã( Aæ6Ä`©²LG‰·*>@™}CܧÇ.>{gB/Y‰*ƒ˜—Áø2P³Ã‚0û¢“pÞåè~Aíú€€²"EСâ´r 1”Ä ¤Â,N†`Uah}°íIО,LõÔ)E0êb HM òƒøl·,5ƒPÞÄXSÀf¼)Ũ"ð àÐ.زb",R Ñ0'Å(µ Eˆù©ƒàsdÈB'@ÔBiQüB 1EÎùë•ô|F10ºJ\Â|F q'>ªˆ›ÎPŠ"„Ðvï„+€®"ðUߞ∭ÆÈ£Þ W–º>Áü±‘ˆ î!Lön*³ ü¡ ëvkz·!ḡ,¹ ìøàäÇ‚K¦sÒO!ê}¡ðað”éjàÎKªÀüÀÖ€Èj`xu€t`4nÁ¾ A®ta<`>ôÏPõAtõ\ödölår÷ozo~ø/†ø¯Ž®xçÀH`*'`À @ÂŒè !2‚Áîá,ìþ„AJ€àêÀƺaPèF* á†sÀaîGÚáÌ P¡˜ïÆLde  1)"f*¬a(á:d.ÀH€fKœ!ö¡¾ Ç áÚ„¦8…hZ ÀÌ!`<Aø*ÑÁ˜!Z!Jaá&á$]Tà˜¡,¡VaH%‹ÈÀŒHÈŒÀ΀ L÷Äêá$yBsg:ਞ)„> ²dÀºª ø`Ø¡j!\Áx álö FêÁöÀr@jàN¡’¡>Å‚dõI`îjšÕ÷ ‚LS% €ØAˆANlLà>A¦!4)øaLA<ë¦ÁaîÁêsÁ¤äÒéad®–@ÃD@ä ¢ `Ö Äâ €¸ €ˆ`ð\ o¨(«<áN&Ö…j>‘öÉFÆ •áZK0 ô¡ àê €°@lI°÷@êQ¶ÁBKÜ!ŠaV¡hÁJ† Hi‘€öæH/zàò`È_àä`ì ì€Ú@ê àQh €b  úéo^Öa. >ñ¡&X°Gï@èü‘)Ñ1AÀDqHϱO&ÀÀ¬`Ú aN á¡÷ð‚p‡° 0–ôïRõoZõïböp_ ÏtOx÷Ï€ø@øŒùŠ̪PÓ pÛ ðãpëðópûè Q †* F*Äòààá„úÁî À*äÊ:à<à¦à‚tngà`\`À•áTÁÁ|ò7#©A$MVpRM%³6 ÁXÅÐA(Wa(à*!z¡RVáZá6¥aj@à `H`nÑî~`ô¡òAfsÀhhÁñH&:!겡î ö¢gxöáö¡öQà|•`~àPæ*Aîáî æ¤aø*üàÒ€ò ÚAa¦îa‚¡˜Á¡‚m€ B `Š Aö `˜à> `Z@Ü 'Äfáö Äìæ$Dò ¼áž»ÄúmßP€û‹’f –` ataî$! 4á2ö«>A2€ë5@æà>áRt V 5#À ­`R ^j¬øk>.6€" ­ü 2ø ¬ KŸ/åÖ&msDÒá< ¢€ €¾ Az ¡Œ¼ P@<l<aoÕšb tNÀ!Bi!ð¦ÎÍ)9ADàâvVÒÀÖ«œöÀT`r`*!¦ áÊaTa¼Ðürt`öà¿9pK9±žO‘%:q/!q:Q?/ý;ÀݳÃGy¡°_Ëž`j!Lábwa“E$á†%%Q…R$R…,S4S…¢\!6Ì‚@2îîòïnúïè„ðOðÁ&ñQ`òÁI6çê0AòAlsÀÊs€¬¨ü áòL¼ Jša4TÁ SÒ < à¾ÁÈ.á Ѐ¾`žœ`‹k Z Î ÖÜáT !f!xáRfaAIÀ ÃGÁö aF7)ÆÐÊÄî˜öô¦†­@²`¸A •F—µÞá*\ÉÁT€È ’áV aŠ´m€ŠaïS@˜¡p ÁpàØØ@–`Ž€0A åÄ@!hG:Á† €NÁ^áÀù,¡DÖmja×ùgáð Æ+à Õª mØc*ÒøýØ !<¡S‚¸.w ·€ž à Z p%Ì\ÉŒ>a0¡Fî–ño@ÙÀÖ7!^ ˆâ¡ÎÉÒ穘À2@¤ ž``ð H6•$A„LÒN@Ú¥èšrÑb¡,•a31žì0îO±'·c:Ó±;S¹w3¾”7{‡ÊDˆ*JˆŠPˆêV¥¨–¦ô_šÊ`\,§a†ràôNÁåD`Ièèüð * ð¡ö B€¬à¢Àª`Çk&âŒt|èœá@ážÁÈàb¥¦Ö°ø @* àÊA„‡ ¡hTAt¯h~€Ð €‰`‹ >6UGÀOYaÆb!ð AsDÒ/Šh¢!” ¤Á@ð!Á  <Àbè  aL:"¦¡v>Çxø eüd€ê)z%þ_à f!  üð·°)W!…Up*p/[ô¦àÔÌÁÀàºGÆAèá,b¡D`|%€b .t!î áâ¡~œ¡RAî æ&௒òလcMàj€¾Ò(r öÀøÚöù˯a¯E¼Á¡! ° Ü h AçL¡ÂàBäáb òþ‚ ¾ À=+àš ¼ö€^ öZ¤2@/ a‚4!]áVáVÞöÀêàfÆIæAMŒe2†Iç`> Ä @Ê AZ`š!€¾Ì¨Ý|Òp t&*´F !„µ`AݪÁî@+1æIè!ö©"± ø\A<ÁVÔŒÑàì`b ´àî ˆ`Ò¾`¼þ¡{]%î @Ô€¢`rÁ” qv§;ÍÀÀà€½q.NabË‚ÆÁrÁö`J`@àazn!B ¥ñ †D!Ñè2! ‹†¡‘èdj% ƒH QhA¸Øt9Ÿé¤ÃMÈØv+ÖGò©Èô59ÃÆr©MnE‚χélÑ{…^âå{±î K§À/p[Ü4÷)½Á 7»1ðŒ £’èÄb5ŽE©ÊdZÙâJºéÔÒ],‹Md¢‰E¡Ð!âáè´€*¢ËȲêLÂ@¤(Ä> ƒh´#¦ïBxR:æ!^|/‘îžàqîQ`ð0å*4Ÿ`¸Þ3£¸ê7 # Æ $`ôP–$©:U«àAD>”C8Ü0ÂP†e†Qºu–‡9¦®Ù2{ŠDY^;¢¹¢}€C@nD‡Ø<ÄYö.à@ÂQVg¸DY$¹€[Ñ˜Ü Šä]GÊ`Ñ8\äù„Y•æ2n^’‚Øê; ‡ÙL}ƒ úrØ‘¥ô))¸zoO&)ò4‚¤iG‘äY"Ä  ‡¢XÎ3Y€ÍŸcz9&¤X€U‡Eœa‡Å"nG´ÍøFÈ>(œ$Aîe{„&Yî}žã±î*'Å×vÝêIÜoÏ"ð‚¤Y¢?™ã”<–‚©¸8&ä@ÄqGàù<7B-zW ¨~‡Ù}‹ãÈöEDY ä±H”&±”SÀñî,âq{߇¸Rœ!±ö/ñÜÜ—G¸äW€# |G,¨*Fùð¨8 "ŸeY=‘d&Ò ‰f8Ôa—E!ZO“ñJZ“GÈüEƒžÎ9€ñ5"Ò›ä!&Qäi+ƒæÑîg„qI+ ÏkÛÙ…  WnÄK‘déaU£Øê?8hÞøðT•E™J_çØ(F ‚`ŠE â¨<' üØ.¼ òMCÈœ-À|p€`Œ?h ¢(B‡à¨D0uh6˜Ñá’`LŠq(À@¦âx6†pÐøZa´`Œ1/è«Âx^ q|%Eù8ãÝ•r’AQRƒŒ Šàä(Ã8b a”,†!TE@¸Ð]pô'ÀPcÜ2ˆÁF'3‚`]¡ìÀð ä7€À+İ ‚0à endstream endobj 530 0 obj <> endobj 1284 0 obj <>stream €@@ɤÒHÄaƒ‡Ÿ° à8|@h³䔸XU/€IîZ½Ê ÷¹D ÁÍçT! Þp<œ&sAÐ@(1ŠDÈän, †È€‚m2ÎŒfp€ša: ¦ÚÁ¦¦lÍæ3I”èyŸ'§C€è^/;ÜEÆiÌ\o9ÇšAÜÓYŒ§:‰ØÊdæéñ:èeB¡ávJ0›NS¥F¬o2TMÀ x>Ò@ù„SP>çÊtɱV§À-çÃÜù¾ÁTºE$E¥ dQˆD¢Ð‡àóñ|ûL È42,þï$ÐÉd3ã®™ &ˆÔZ9ËJ%Éd"@þ‘¿/t`hÛ7 Óxß8¸ð ’Ä&ääY.A’ ëï@üI:$CÞ@D8H¤ÉŸ öF?Q8úBÄ)A$(AÄsØIð:”'À†ù“¸ÚP€ÇØÂKåPi`ðäø”„ˆ4ˆ endstream endobj 524 0 obj <> endobj 1285 0 obj <>stream €@@É¥B Äaƒˆ° à8|@hwÙåð |’€ªàD°{²/sØ=îSpsyÕC7œ'#IœÐt b‘Är9‹!€Àr ›L³Ã„Ü &˜N†ƒ)¶´iª›3yŒÒe:h#ÉùÐà:‹Î÷1q„ÚsÎFqð¦”w4ÖÄ#)Φv2™cyº€N»D¨d8]”†Œ'ÓÔéS¬Ì•3pL&7NH§"1ÌŽt$I&0òd'Iæc9¤¦l+FØD' KbÁv˜ž( 0¦€ €@ª€ ÀP„!€ Њ€ÀyH€@4€p€ €ºd@x ì ¨†‡ n „àX !€(’šà0ŠÀ8B’À@ A†…P X‰ÀY` @aNàhÄŸ p¢qʆ`xÞ– y¤| tÐE™¹’d †@$v¸¨hà™°{‡GÀ( •dY41ƒÂ =ŽDXØ6”¤Y2—Ù’/ÐôMFÑç¸f4iRUQ#Ø>/žñ¸&\æ©b_ÈÞ'ƒÇØî2ôE6”Ôp>{…´å=PuH>Ç€°[€ôô$bðÒ<DÔP³i°d&$êRð3žã`*{‚!qÜ}€—@\`‰ö Aaî^gQÖ{‚UˆÂ}† ¨‚&šÇAÌf†‘¦e‰A€\&ˆ?iŸc”Úͦ|á9N‡¹#<fäø{“€©Œb˜QªbˆA V"‰B(z4eÝb… Â[T{€'aÔ{‚g¸¡¶/#`Ò‚gaPD“#- JÖôÅ ~ô¥mK×TÕ|EÓõ FZsaî:Í¢þ1:‚æph ˜áôv¨Ûªk„Ð>|à1XI…X>räñP#A;àðŒ}“à8&~lç¸.ŒV \Vðäð$XÚ6Q»ÑS²Mslß8¥lê#SÉp{ŽG¸œ &5îƒÄ`æNå!$ù6Sãùj Xò& ša°VöýÏv}€]ýá”dY6Æâ’OéáÇúÿǸ™Âi_¼øÇØy…³¤Û€ñN q·-ÑîǸ§\`p9öæÜëŸt.!Å·J>Àà÷ CÜG:·ZëÝ‹³v¯ÕÝ;À"Þb‚â°~ÐÕ*»Ð-ñ)ðæ°@øW‚kT{­p$4Óh°d'‘à=Åð÷`T:ðî#ƒ Â<#‰q,€@¥b¨u á2CˆŽ{¡èF‡¡TøáÈŸã@‰±) ¸‡¢Dà¾(ø‹u  }ƒ°èC8/ès‡Ö˜:àƒaø+ ÌƒP0 LK ä„0âYà€‡ãø*V¢,9 ‘(&Ä`°àx^q€"E;ãàÈUávÓ€‹cì ŠÖ$’h ´¦Ñn¶Šu«t|Qî@¨£B,U ˜\ø‹P ×@Z Yñƒ¨@¸'Wƒly ‘\2ƒ ûpÇÑ"Ôh*ìÈYC°†¤>àÐ*Cš /Œ}€ÀH>ÀØû #ì&M02=ÀXÄ¢¤QH ê"ü(.yiÅF,<„øW‰ÔAàä>2ã1° ¨ž¨‡Ø8 ÃBÇãAÈ4VªX6¾&ô8ÇØˆÀ¬g†q¨5Fà¶‚uÙ€Ô"ƒ°zÂ(&…!>büR0÷’=òm Ë`q'PÑ9Hø@TRTÈÜñîOAH>Âðû Ü/XÑ5juž!î'¨º¼Å$EJÒÕØ…L,u¡TOT;pÐ>õ«²p«¹ãgêmOö®ž±tÜÚÓ³Ü} °*#X u° @ &ßíx2x/z¦î!ê†kqG©Ò•81Aü5ƒÁ+XâŠ;»ÅW²‘•Œh1¨²ƒÀ´bÐJ‹O6` Èõlpñ…íŠ\`ÀÑÇØ±wïáÄ‘î"- Ãpa¨Sg~"¸©Ä{ƒ;Ó€rpšÇ°øW8P†Áv"…‹ãðRv¨øD ]†À4‚¨ß`0Qƒh bŒM q(,`bLFÁ>#DÈŒ,J>1®/Ã`Di‚è}„Q>ÀxY`h#  ”)P¼ "Ñœ °6Ïó@hM´ÀøÖhy !²Jí™%d쥕²Ö^Ì@óeÁX2¡ê!`ðFÂC N+•?ŠAµ¬VöœXDPͼ­4B1¿8áû²taÜ;8áö!@;(V­l8–ðB©UãÜ Tõ»žoüS€`†>ÃH~ Â<ˆ@ØDPÂxA 'p÷€bÏZ „>Ýõ¤ÞqUaî‡ØùâEˆ‘"€ÏE@ä? Ü8‰‚(EˆÁ $ÄX˜<‰ÐäÐy!„V†1x;Þ˜Â?p¦…«‹¶ªNB½:êÐ'«Çн¡œE‡Ñfín½ÙÝô…áñ®¯ö‰ éHƒ+Ð/@j Bl0R Ábï`@r‚¡ë³†‹¢˜SІvÀ DáL/€|xÒƒ¬hŒÁ¢2ÅàS ·൰:€` {…!ð4À¨ðGÆç••ö¤>Û«)oG­±¸U7ˆÎ|àˆ Mˆ¥EH—ÂŽ‰Høµ²à‡|ZæõjC)¸£Ü qî…°ÆAîiÈ‚^š§ Ô aÚ`,² Vìð`LåÆt¡HàÜnHaàê ª@Þ`zaÂà*!¨Á„*öЀä€HÁ ¶&[†N¡Lœ‹6¥Æ ìáö °žÀàalajàÆÁî BÁî¥b AöŒ`f—@ázá|aÄa„Ðá,!0ÁTáºa¬a\A4 . X`œ`š`ˆª¦ ìGÆÜKŽ\Œ  Ž cN&àûK ÁtÁ²ÆÀÁ€ÈÁ>A6áŽe‚`|  hÀ¬ê¶çfô$ÌFë^l*Å .ñ|bòÿÀ‚„ÿÀºà$ŠÁë’AŠ !¦O!ìÑ@úàˆ ª !tˆáná‚©ö @¾ à®àb *Á è‡Æá¨aÈ!ôà>.a àA§ÆDáP@ðQ A ºàöÀÐÀº|`Z€€ÀÀ€Ô@ðiŠö@ê  4`Ð0zà‚ÒÀŽaj€œÿïþ’`!z LÀü@ b|dnÓüÒá@`þ!!à!aͦvaö@*à€Án§i6Í¡¨|lj¡ ¾ÀíHlÄÞÞ%ÊàŒcÐMÁð@*ñ%bQ~x‹^¥$`ñfôáwmß³$aàN¡B âj³T êì†!N÷ƒ`$á˜á6€Ê„ó1axáL¡N¡¼×€h®  €Þ AÅ !LájA:A9;Ö|inè  v—¡B!2a(Áf ¡a–™@aÆ– ájá0àÄ`à@z 4@t ÂàÊv!t!|vAîA4 Ø <ÀêÁ à*$vIóÄÉa @Ú`< A\ ¡.ÒÉ(`€€l r !¼i>á€è!ÁØ÷Ê„ÁïˆÂ!1çìV/ÖæºÌB¯S*¦þ.nÈ&a@!:ø[ÀªÂA^ºKµ K2k¤À>ÁöÉH~€ÀåTÁT2]LOôÊx ºA^W`08 ÊÁP`2W' Ëô|yF.A€ø S†O&<" J¡-x'Æ tÌu R@ àìVårQáÇ3ÁUU ÎW`ŽrAxhAhA2@”V úàð«•^á­VUiVÀWUyWÕXU‰XÅuY,NSõ–á îà @Ú @ü €ÞÀø Þ Ô|f;; Ú æ°€ÁP†!zN¡dœ€Üð”zÀJrÇð]$Aö Aö ÁâgN^€áîAïX+5 `* •AáîîÁ Áª¢!÷@Q`À³Á@â¨5´ƒÁ–²´@  ð þá ÀÊÀ®ð ö®Œ àA:Á4Áh!bçx@`V«Z´áîñR˜¡‚A÷`–«0YAèaàAÜgÚáîJ€ aÈ”®`®Ò Äg`@ah ”`È€î!8èḌÚaz€FA$!8a$’ázḠj ¤oxæ<@àÁŽÔ¡Ôx`8`—at !'*§Z ÁÀ¾ö à0™ ©a ¡†v Aî }ˆ„x‰ˆØ‘‰X˜Øœ|X£Šlá„ j O0«mœ‹ 'w¡Ò ¡° Á` @Ôì@æ>RA  =á ð†’6a 6Ô`!8¡2aêN¥òZ`r$çeÀ‚±ª¥!.óa¾ ¡îé7ÐaÞ!îW`4Á6Á%á4&Á> Ü`À`0a(²!r!\ <„À¦¨â>mI”!ó”j„îˆîÙP¦º Ð ¬€€hŸhá á, vö!4_€ N Áö‚6ø9$Âàa"|!QŠô<óÒZ`pòlIÈ áò +JK A@Öáú `Ba«å¤Z@ªY¢è' xÔdÚP –6 a–O7zÁ ø  ¸`þáóm@îø@ôV!‚^a d àÆ€Ú `Êä"A·> endobj 1286 0 obj <>stream €@@É¥BHÄaƒˆ° à8|@g'Ú9òÞ| €ªàE¢{¬/s˜=îSpsyÕC7œ'#IœÐt b‘Är9‹!€Àr ›L³Ã„Ü &˜N†ƒ)¶´iª›3yŒÒe:h#ÉùÐà:‹Î÷1q„ÚsÎFqð¦”w4ÖÄ#)Φv2™cyº€N»D¨d8]”†Œ'ÓÔéS¬Ì•3pL7NNG3¡ÔÂy1™LÆ’™°Ú0Œ†cA¨Øn8Š/Âí1<P@0PU€ hD€p(4@àDÀ@TÀ€d@ 4€ú €l€ „À€† À$A  K€§ø J€áP|X0&H"`(Uƒh¥H'ÆÈ1åÈ!¦™ðDÇÁŒ@'ÀZP€'¸ÎdâižãÑî!‚¤BH”±0_da8T%pkäX[‘¢ðì&‹çØ>Œ`øü4‘;ùN3—gAZ{…$*A‘d üE‘#ác€àŠ30ìEDÉHJ”¤™F“æh{€„YŠ¢¡B-"Øž<Àñ^ %HÀEŒäXî:chð1Â…$©HaP’ñ:h“ÅáU3¤XÜ@d@ðC`ø€}˜I EÄY ˜øO’äá$O@ô‚IÈ’4{€F‰îKš ðHžåP*u €h}‚Ø*}„GØLBi¼{‚¸*{„G¸Nd‰öO‚£ ÌUeéJ{€eY‚–AvT–S1xS‹â€À:„ƒXž °/ S5Þ}ŠÅQîH²:*'™ÀÊ}‚€©6d@ÈEþE! C@ùLE•qNE•dYZDYåè’$ÁOä >‹Y"J’$‘JG“`ù^{„ÄôR Eù žòH{…ì'—‚x´0 ãHÜæ(¼KŽU¥m\WUå|D؉cYU™gZ‘B‘cÙ7ƒæ0è ’ei’mS1pJŠCXÂ8MÃp—ÌC‹º‰pdqG¤˜? ‡$@{šÑ5$I¿(ǹh úeÆ$pØd^ÆO£AD dY Ä ðR“¥Q2,…øJÁ¨#p²CØ2 àÔ畺¹Wjõ_¬†±V:ÉYk5g€…¢´Öª×[+mn­õ¸×*ç"HT 1»‡À,Hƒmp\3Åè¡C\pA†=ÀÄ ƒP 1ô=ÄX÷ T[ˆpÜ‚ª!ìP¢$ô Â@E‹Q#@@žÂ`;@Þ‚ðN¡œipT,G¸#ˆ‰ÐÄ%ð¡¼H†q&-€Ð£ N fÞ%Ó²Ù`X8Á&búÃ"€= „vQ@x2°fA°B¬ñ("ÛèÛÁ }‹1!ÖÃs!dV1~<ò€PJB5qD!l1„¤™ƒ€‹‚lIN$)Þ¸ø‹Å£p^“ŠOT‰Q$Dd\À K14Ãh„  Dà„>ÅÀ†* Aà2 hm é˜/!n+@¬¢gñ&–f@žô5  À ƒ@û :q&Dxb¨S¡Š™„°–Ä9ˆàC !8„À@4¡¸`ŒZ*EH£YAT[Q<"Å€‹M ¡:,D½WŒ B‡ñ"ƒ¨…Áô)‡€˜S0qb˜LÐZ Bzñb|Dáîx÷ã""îÀûCì0 l.B(ÖàLl ñ-ų€ `q$Bàû " 5„Ðt8\cT‹Ö„Dèµâd ‘z-0·\0ˆ•À·¨Hya„M ¶.R($é áÀ†@šqzqò)@¨e`ä …ð²™‚Ø}"AcÁ$#øª]¯‰°(Ø–!ü2P¦Å iCÌs!Ü)ðíxF F€Í£ô†‘ÒZN.€(a¸B0žÝ5¦ôæÓÚ~$* C¨µ¤Ôºš±j}QªuV«ÑʵW*õ`¬U’³VŠÕ[#Èõ",U 10&%Xø {‹´.šõá„p/ Ž>h .À1+ü‚Ŧb„X‹ÀÀ,[`Ì!…ŒG÷ƒxw‰¡ è臰â|„Z „8zLÁT9 Š00ô¢í¿ Áz+…À‹—ÂàD‰ Å¤t˜¡áÃqµæ†€÷ÂÅ(1îÀ¨©c8G ±<6›(ÌbH Ì,‚[ `˜}„Pb.Á°ê×Zó_l°„VÄÛdl „ÒBÄJ‹$)€ø‘ T[pp<„rÂÌQÒqX‹ O\{Œl&(DðÛá¡Ѳ(@rãÜd¾1î*eÀ²ña Ñ0¡Ð LQ'DÐÑbÀK Ì$ëЉ äCÐæ­€@u¢MŠAH'Åp¶ Bˆ1’8ƒH„ÁØ}€ @0{›Ü@,!4ÆHCð‡ðš C…ÀdA†üÕ«r8@ ¡Sœ‹à P‡‘*Ãrá / `ì,šŸ ½vÊĆÑw„  1t0ƒ݈£à{ô0Fmº‡Q*,A†àà ÔˆaôF aJ&`˜|eÚ!**«o#2Š@Ì CHû";ˆÌò„ ¬££>Õ‘ ˜€Ìà†ÐpÀÔð @2 ÊïÈg !XÊ¢aÈÁðváHá& ìî/A>a2áNÁP†Œ¡T `ä’ kB ážaòAò§ÐìªaA&+œA@< À¦ œç`` Áöà® ¬ àä!! A€ú~&8!,¡,¥h` N@€^aDLÉ‹ïÜ‹ê8NÁ áù`< áö ¡Ä! o/Ü¡&Á,áJa*û@ª`øpÀˆHà4ˆPh!Vàä@þÀXàðØ  Ò@ôl¡hT°À!Nà‚! <@úªšǤŠ¢•…à!ò¡j!Ò–¡îaò'ÐzŽÀŒ(¡j!°áÀPk kÈXA2aPëž`"œá €ø ¬àÌabáL0Á8Á2a£knÇ`ÑÖ€ä@Š ç²K( ¡4%6Áòª^d–àœI€¬Iä¢JdªJä²!0ˆ¾á@zÁŠÌÑ`°€à¤A@> Aö¼\…%Ð]EØÁfàhJİJÀ3'r{'òƒ(rŠrŽM„ÜNäN„ìOôO„üžO’Q ¦Q¥ú%&R¥.S%6S¥>T%Fà¢à¸ ² ྠ¥®À¼`ž`´ @Ò ¥^V%fV¨"t((tÚƒ'Tƒ‡Z„¬[´[’¢„åÈ\Òª]oj&±¬æ!”á˜Eôáð€*a à,`À†kâÀžÀ´ÀÀ`†`dØaöñH¡ÒSàJ€<ÐŽda¸öáù7ÀÖ >!ºÁîa\fPÁ‚!ZLÁhàÚ `‚¡öàÀ€> ¸ ° æ}6 Þh@–að ѯ/ÂŒ&¡¥¾@øà<ÀHªD @á/A4"ÁtcŠF a zpá›I¸þ—ÁálapÔ†á!IÔa$mÆànE³GeAÁ¡¡iÊÁ(v]àê!$ÜA.ÜAd^`r!îÄa¤JX *¡Âh¯ÈlAÌ(’±Bàz z©@r`¼ @î À´´Þ!:A\Á Ò0%ŠJ þåà ÀÌ œáN“Ü âtp`J€n¡ à æ ® nŠf¨©¡.¡ ¤á:íäl¡NáHAJ!T¡fLÁîárà„Ën°Áaàú @È rD &aÀÈ“¦›f©LBhjaT-Ä ÄATRAB!¦1¸î@*RÚ.À€>à ÁŠ t!®fàß2 å1ì^ !R!ªÁûA@a`è  àòáv áÁ@$”ÞÁ€~À<a\¡Ìa®À AyPàÀDÀÐÀÜ`!\¡<]S20=Kl¨A$PàøÒ cêì¡´ÁÒ``ò`ö!ö V†&h¶aRéfáðEô!î à*á4™*6 æ ¡  ôQa,TA „¡hÀÜ ÌÍ• †¯S€üAîAîÁŠäÊŒ~¹ Ü¢Üï@ÕÄÚ€ˆ`†˜@Šá‡èÙ@öma&!4á&‘A(a(AŒa:ôAÁ a! ÏÔ…aì ¡<,A"ÉŠÁ#ÆìpõZ6 ˜~àó#’P·è~×yLNà!î MÄÁ®!ìhAhd ¡ð@+LjK©’¡ÁAõ¸AÆÁ4A ±ôØAÀ> Àî Á ¦`È ÜqÌáø([Á~aˆE 3Á$&ò¡EÚÁŽA(ðàÐ  ¨ ÀDÄâ àt ê Ç< Á>AØÁ§Ú[Dàü è á ÖAl 88‘Hà6ha´ ᮀº @õTÊ6!ND!Ôaf„’™vá¦áXJ( * þ!PU¾î!2!v0‰½ “¦ ª’€î €â €Â ¦LÀæá¡D¡F¡rÁTA€ay| Î¶ÀÄ€ú`ò¡Z¡N!z ÁP àr ¤ †àl`©¬`Š `[’bPf(Ázê` À¾ p@êðBA¢I HêJT¦±~uŽì$ÅŒJ£=ÀJá@¼Êî€ÞxšÁ8œb˜á$à€tA @’ö @ðèí!:8A(a[¦„•$wr~TrNÁ(mÙ°e S8¤€î Àª ÀÆÔ 3 A¡!-J  ´`¢ D©“w*nA ˜ïX0 •Ø¡”AîÁŒAp_@Báø¡ÜaŠ¡ à–³ü@N€N á2 á*U¡"aAp aöÀxR`¼n ­gâQPuºa`îÀ<¡$ ZFaÆ òWÖaFšÁš€@Ô & ClªïA:`0¡H¡D|v`và– ála¨ÁÆÔcƒ`aÖÃ9QiAJaîá˜_@˜æ * B@ž à¦Àâ `® µÜ`ÓmaPaÕ¶! â ò ÀÎ Ár’a¾F!ÞàB!ïX¡n¾àVs†áömh¼ö•ºánatF0” ˆa¨!cMÀ6ázôÒÁžDÌÁ6 `Às›oÀ:¡+ºÁ@@¦–f†¤ a÷7É“á* ¡ºaÀa¢‰ 8Áðáîî 2%" AKa `tahc`’ ö¿˜ ( : !H l )"á<à#¼çΤ’ð$–aŒA”!zAœ Š¤Ì©Ðµ8!%á‚!&Ú:€8 øüö`À ú°åÄá'Êá¸bÄÅèà’hKðÉVæ¡ö ¡@ÁîàBP¦H!Jøaî A4 øÀ² `¸ `ÿ\šš$¡î%Àà€ú Ö `ä Ü aD!@á6ÁY/laêI=ü$ A”¡Ba@ àÖ @Ú @⵬¡TR]Ód†| æ¡6 Âa,áTAž`<@á>€!(€4 endstream endobj 452 0 obj <> endobj 1287 0 obj <>stream €@@É¥2ÈÄaƒ‡ß° à8|@h·Ú9ðP| €ª—ÃÜ$÷0„^å€{ܤàæóª†o8NF“9 è Å"ˆär7C€ä@A6™gf3 ¸@M0 SmdÓT6 fó¤Êt<Гã¡Àt/îBã ´æ.7œŒãáM$îi­ FSHìe2Æótüu2ˆ!PÈp»' Mͧ©Ò¥W7™*Fà”f™ô€àè/ ,%À À <ˆ|"ÜêðfQ¾ )ð ÜØÎ½Õï‡èU³R²Þà’AG¢Ò „² €Œ Pyöx¢Ìˆ³YŒÔh7Q'TRCäY E$‰J‘Fi]Œä°´GYEŒàAö-># è]Œ¥Úf‘òdY,JÀd ‰„x´UÅñJdiW¸Ìø—$85•c±@7£y&n”EyrE˜ C†Deîw¹†ð €hùîG§°dqGØABqg¸z‡ìIî)ð48ÃI@æ¹îˆØ}.°Æ8‰gØB?бJ‡Axk‘€ñîøqVY•…qPX‘¥ ï<‘‚I-•äxDQQ´p{ÃYjE•bÙb1•B1*4Äd"@@°9™D9x5“ÁABP¤-‘bé&=cY@; NA‡# Î.‘bŒœâÅô)ʲ¼²Ÿc°*H¤LDd±(JѱCàùöuB NüEƒ$_BdI ?ƒàpæQŸ!ùB`Ù,–`QfƒÀP Ãø–dØe `Ò  endstream endobj 207 0 obj << /Title(Module fabio.xsdimage) /Dest/section.33 /Count -2 /Parent 6 0 R /Prev 193 0 R /First 208 0 R /Last 209 0 R >> endobj 5 0 obj <>endobj 2 0 obj <>endobj xref 0 1298 0000000000 65535 f 0000398829 00000 n 0000632012 00000 n 0000397750 00000 n 0000375104 00000 n 0000611057 00000 n 0000398771 00000 n 0000398953 00000 n 0000399206 00000 n 0000399034 00000 n 0000399119 00000 n 0000399848 00000 n 0000399340 00000 n 0000399429 00000 n 0000399718 00000 n 0000399531 00000 n 0000399623 00000 n 0000400397 00000 n 0000399991 00000 n 0000400267 00000 n 0000400080 00000 n 0000400172 00000 n 0000400954 00000 n 0000400545 00000 n 0000400821 00000 n 0000400634 00000 n 0000400726 00000 n 0000401838 00000 n 0000401101 00000 n 0000401377 00000 n 0000401190 00000 n 0000401282 00000 n 0000401708 00000 n 0000401521 00000 n 0000401613 00000 n 0000402388 00000 n 0000401983 00000 n 0000402259 00000 n 0000402072 00000 n 0000402164 00000 n 0000403041 00000 n 0000402531 00000 n 0000402620 00000 n 0000402909 00000 n 0000402722 00000 n 0000402814 00000 n 0000403597 00000 n 0000403187 00000 n 0000403463 00000 n 0000403276 00000 n 0000403368 00000 n 0000404271 00000 n 0000403745 00000 n 0000404134 00000 n 0000403834 00000 n 0000403926 00000 n 0000404034 00000 n 0000405053 00000 n 0000404422 00000 n 0000404512 00000 n 0000404918 00000 n 0000404615 00000 n 0000404708 00000 n 0000404817 00000 n 0000405279 00000 n 0000405202 00000 n 0000406282 00000 n 0000405428 00000 n 0000405707 00000 n 0000405518 00000 n 0000405611 00000 n 0000406155 00000 n 0000405852 00000 n 0000405945 00000 n 0000406054 00000 n 0000406608 00000 n 0000406428 00000 n 0000406518 00000 n 0000407260 00000 n 0000406751 00000 n 0000406841 00000 n 0000407133 00000 n 0000406944 00000 n 0000407037 00000 n 0000407589 00000 n 0000407409 00000 n 0000407499 00000 n 0000408485 00000 n 0000407737 00000 n 0000408016 00000 n 0000407827 00000 n 0000407920 00000 n 0000408351 00000 n 0000408162 00000 n 0000408255 00000 n 0000409039 00000 n 0000408628 00000 n 0000408907 00000 n 0000408718 00000 n 0000408811 00000 n 0000409954 00000 n 0000409186 00000 n 0000409474 00000 n 0000409279 00000 n 0000409375 00000 n 0000409817 00000 n 0000409622 00000 n 0000409718 00000 n 0000410638 00000 n 0000410104 00000 n 0000410197 00000 n 0000410499 00000 n 0000410304 00000 n 0000410400 00000 n 0000413185 00000 n 0000410791 00000 n 0000410884 00000 n 0000411186 00000 n 0000410991 00000 n 0000411087 00000 n 0000411538 00000 n 0000411343 00000 n 0000411439 00000 n 0000411884 00000 n 0000411689 00000 n 0000411785 00000 n 0000412226 00000 n 0000412031 00000 n 0000412127 00000 n 0000412703 00000 n 0000412390 00000 n 0000412486 00000 n 0000412599 00000 n 0000413049 00000 n 0000412854 00000 n 0000412950 00000 n 0000414707 00000 n 0000413338 00000 n 0000413431 00000 n 0000413851 00000 n 0000413538 00000 n 0000413634 00000 n 0000413747 00000 n 0000414318 00000 n 0000414005 00000 n 0000414101 00000 n 0000414214 00000 n 0000414563 00000 n 0000414481 00000 n 0000415292 00000 n 0000414861 00000 n 0000415149 00000 n 0000414954 00000 n 0000415050 00000 n 0000415887 00000 n 0000415449 00000 n 0000415737 00000 n 0000415542 00000 n 0000415638 00000 n 0000416476 00000 n 0000416051 00000 n 0000416339 00000 n 0000416144 00000 n 0000416240 00000 n 0000416706 00000 n 0000416627 00000 n 0000417286 00000 n 0000416858 00000 n 0000417146 00000 n 0000416951 00000 n 0000417047 00000 n 0000417975 00000 n 0000417440 00000 n 0000417533 00000 n 0000417835 00000 n 0000417640 00000 n 0000417736 00000 n 0000418315 00000 n 0000418129 00000 n 0000418222 00000 n 0000418896 00000 n 0000418467 00000 n 0000418755 00000 n 0000418560 00000 n 0000418656 00000 n 0000419476 00000 n 0000419051 00000 n 0000419339 00000 n 0000419144 00000 n 0000419240 00000 n 0000419813 00000 n 0000419627 00000 n 0000419720 00000 n 0000421466 00000 n 0000419970 00000 n 0000420258 00000 n 0000420063 00000 n 0000420159 00000 n 0000420604 00000 n 0000420409 00000 n 0000420505 00000 n 0000420953 00000 n 0000420758 00000 n 0000420854 00000 n 0000421311 00000 n 0000421116 00000 n 0000421212 00000 n 0000610920 00000 n 0000421617 00000 n 0000421905 00000 n 0000421710 00000 n 0000421806 00000 n 0000000015 00000 n 0000001936 00000 n 0000513732 00000 n 0000568142 00000 n 0000513045 00000 n 0000555616 00000 n 0000512228 00000 n 0000544577 00000 n 0000422042 00000 n 0000511665 00000 n 0000537200 00000 n 0000422177 00000 n 0000422310 00000 n 0000511036 00000 n 0000526478 00000 n 0000422449 00000 n 0000422588 00000 n 0000422722 00000 n 0000422860 00000 n 0000422999 00000 n 0000423138 00000 n 0000423282 00000 n 0000423426 00000 n 0000423559 00000 n 0000423698 00000 n 0000423837 00000 n 0000423981 00000 n 0000424125 00000 n 0000424259 00000 n 0000424398 00000 n 0000424537 00000 n 0000424681 00000 n 0000424825 00000 n 0000424959 00000 n 0000425098 00000 n 0000425237 00000 n 0000425381 00000 n 0000425523 00000 n 0000425662 00000 n 0000425806 00000 n 0000425950 00000 n 0000426083 00000 n 0000426222 00000 n 0000426361 00000 n 0000426505 00000 n 0000375513 00000 n 0000001958 00000 n 0000004080 00000 n 0000510472 00000 n 0000517461 00000 n 0000426592 00000 n 0000426736 00000 n 0000426870 00000 n 0000427009 00000 n 0000427148 00000 n 0000427287 00000 n 0000427430 00000 n 0000427574 00000 n 0000427708 00000 n 0000427847 00000 n 0000427985 00000 n 0000428128 00000 n 0000428272 00000 n 0000428406 00000 n 0000428545 00000 n 0000428683 00000 n 0000428827 00000 n 0000428971 00000 n 0000429115 00000 n 0000429249 00000 n 0000429389 00000 n 0000429529 00000 n 0000429669 00000 n 0000429814 00000 n 0000429959 00000 n 0000430103 00000 n 0000430238 00000 n 0000430378 00000 n 0000430513 00000 n 0000430653 00000 n 0000430793 00000 n 0000430938 00000 n 0000431083 00000 n 0000431222 00000 n 0000431367 00000 n 0000431512 00000 n 0000431657 00000 n 0000431792 00000 n 0000431931 00000 n 0000432071 00000 n 0000432206 00000 n 0000432346 00000 n 0000432485 00000 n 0000432624 00000 n 0000432769 00000 n 0000432914 00000 n 0000376028 00000 n 0000004102 00000 n 0000006221 00000 n 0000432975 00000 n 0000433110 00000 n 0000433249 00000 n 0000433389 00000 n 0000433524 00000 n 0000433664 00000 n 0000433803 00000 n 0000433948 00000 n 0000434093 00000 n 0000434233 00000 n 0000434378 00000 n 0000434523 00000 n 0000434658 00000 n 0000434798 00000 n 0000434938 00000 n 0000435083 00000 n 0000435227 00000 n 0000435362 00000 n 0000435502 00000 n 0000435642 00000 n 0000435787 00000 n 0000435931 00000 n 0000436071 00000 n 0000436216 00000 n 0000436361 00000 n 0000436495 00000 n 0000436635 00000 n 0000436775 00000 n 0000436915 00000 n 0000437060 00000 n 0000437205 00000 n 0000437340 00000 n 0000437480 00000 n 0000437620 00000 n 0000437760 00000 n 0000437904 00000 n 0000438049 00000 n 0000438189 00000 n 0000438334 00000 n 0000438479 00000 n 0000438619 00000 n 0000438763 00000 n 0000438908 00000 n 0000439048 00000 n 0000439193 00000 n 0000439338 00000 n 0000439478 00000 n 0000439622 00000 n 0000376559 00000 n 0000006243 00000 n 0000008567 00000 n 0000439683 00000 n 0000439828 00000 n 0000439972 00000 n 0000440112 00000 n 0000440257 00000 n 0000440402 00000 n 0000440536 00000 n 0000440676 00000 n 0000440816 00000 n 0000440956 00000 n 0000441101 00000 n 0000441246 00000 n 0000441390 00000 n 0000441530 00000 n 0000441675 00000 n 0000441820 00000 n 0000441965 00000 n 0000442105 00000 n 0000442249 00000 n 0000442384 00000 n 0000442524 00000 n 0000442664 00000 n 0000442808 00000 n 0000442952 00000 n 0000443087 00000 n 0000443227 00000 n 0000443367 00000 n 0000443511 00000 n 0000443656 00000 n 0000443791 00000 n 0000443931 00000 n 0000444070 00000 n 0000444215 00000 n 0000444360 00000 n 0000444495 00000 n 0000444634 00000 n 0000444769 00000 n 0000444909 00000 n 0000445049 00000 n 0000445193 00000 n 0000445337 00000 n 0000445472 00000 n 0000445612 00000 n 0000445752 00000 n 0000445891 00000 n 0000446036 00000 n 0000446181 00000 n 0000377082 00000 n 0000008589 00000 n 0000010511 00000 n 0000446242 00000 n 0000446377 00000 n 0000446516 00000 n 0000446656 00000 n 0000446791 00000 n 0000446931 00000 n 0000447068 00000 n 0000447213 00000 n 0000447358 00000 n 0000447493 00000 n 0000447632 00000 n 0000447771 00000 n 0000447916 00000 n 0000448061 00000 n 0000448196 00000 n 0000448335 00000 n 0000448475 00000 n 0000448610 00000 n 0000448750 00000 n 0000448889 00000 n 0000449034 00000 n 0000449179 00000 n 0000449319 00000 n 0000449464 00000 n 0000449609 00000 n 0000449748 00000 n 0000449893 00000 n 0000450038 00000 n 0000450178 00000 n 0000450323 00000 n 0000450468 00000 n 0000450602 00000 n 0000450742 00000 n 0000450882 00000 n 0000451027 00000 n 0000451171 00000 n 0000377517 00000 n 0000010533 00000 n 0000014059 00000 n 0000516985 00000 n 0000609884 00000 n 0000516607 00000 n 0000604284 00000 n 0000451232 00000 n 0000451366 00000 n 0000451500 00000 n 0000451634 00000 n 0000451768 00000 n 0000451902 00000 n 0000452036 00000 n 0000452170 00000 n 0000452304 00000 n 0000452436 00000 n 0000452570 00000 n 0000452704 00000 n 0000452838 00000 n 0000452972 00000 n 0000453106 00000 n 0000453239 00000 n 0000453373 00000 n 0000453508 00000 n 0000453642 00000 n 0000453777 00000 n 0000453911 00000 n 0000454046 00000 n 0000454180 00000 n 0000454315 00000 n 0000454450 00000 n 0000454585 00000 n 0000454719 00000 n 0000454854 00000 n 0000454988 00000 n 0000455123 00000 n 0000455257 00000 n 0000455392 00000 n 0000455526 00000 n 0000455661 00000 n 0000455795 00000 n 0000455930 00000 n 0000456064 00000 n 0000377960 00000 n 0000014081 00000 n 0000017368 00000 n 0000456164 00000 n 0000456298 00000 n 0000456432 00000 n 0000456567 00000 n 0000456701 00000 n 0000456836 00000 n 0000456970 00000 n 0000457105 00000 n 0000457239 00000 n 0000457374 00000 n 0000457508 00000 n 0000457643 00000 n 0000457777 00000 n 0000457912 00000 n 0000458046 00000 n 0000458181 00000 n 0000458315 00000 n 0000458450 00000 n 0000458584 00000 n 0000458718 00000 n 0000458851 00000 n 0000458986 00000 n 0000459120 00000 n 0000459255 00000 n 0000459389 00000 n 0000459524 00000 n 0000459658 00000 n 0000459793 00000 n 0000516114 00000 n 0000599315 00000 n 0000459927 00000 n 0000378339 00000 n 0000017390 00000 n 0000020460 00000 n 0000515951 00000 n 0000598602 00000 n 0000460040 00000 n 0000378486 00000 n 0000020482 00000 n 0000023974 00000 n 0000515416 00000 n 0000591651 00000 n 0000460153 00000 n 0000514833 00000 n 0000581229 00000 n 0000460293 00000 n 0000460432 00000 n 0000378657 00000 n 0000023996 00000 n 0000026258 00000 n 0000514180 00000 n 0000570935 00000 n 0000460558 00000 n 0000378804 00000 n 0000026280 00000 n 0000029973 00000 n 0000460645 00000 n 0000460785 00000 n 0000460924 00000 n 0000378975 00000 n 0000029995 00000 n 0000033022 00000 n 0000461050 00000 n 0000461189 00000 n 0000379138 00000 n 0000033044 00000 n 0000036054 00000 n 0000461315 00000 n 0000461454 00000 n 0000379301 00000 n 0000036076 00000 n 0000039267 00000 n 0000514017 00000 n 0000570224 00000 n 0000461567 00000 n 0000379448 00000 n 0000039289 00000 n 0000043883 00000 n 0000461680 00000 n 0000461819 00000 n 0000512820 00000 n 0000553143 00000 n 0000461958 00000 n 0000379619 00000 n 0000043905 00000 n 0000048034 00000 n 0000462097 00000 n 0000379766 00000 n 0000048056 00000 n 0000048955 00000 n 0000462223 00000 n 0000379913 00000 n 0000048976 00000 n 0000052777 00000 n 0000462323 00000 n 0000380060 00000 n 0000052799 00000 n 0000057216 00000 n 0000462436 00000 n 0000380207 00000 n 0000057238 00000 n 0000058029 00000 n 0000462562 00000 n 0000380354 00000 n 0000058050 00000 n 0000060307 00000 n 0000462649 00000 n 0000380501 00000 n 0000060329 00000 n 0000064425 00000 n 0000462736 00000 n 0000462876 00000 n 0000463015 00000 n 0000380672 00000 n 0000064447 00000 n 0000067375 00000 n 0000463141 00000 n 0000380819 00000 n 0000067397 00000 n 0000072804 00000 n 0000463241 00000 n 0000463380 00000 n 0000463519 00000 n 0000380990 00000 n 0000072826 00000 n 0000073700 00000 n 0000463671 00000 n 0000381137 00000 n 0000073721 00000 n 0000077239 00000 n 0000463758 00000 n 0000463897 00000 n 0000464037 00000 n 0000381308 00000 n 0000077261 00000 n 0000080180 00000 n 0000464163 00000 n 0000464302 00000 n 0000464442 00000 n 0000381479 00000 n 0000080202 00000 n 0000082888 00000 n 0000464555 00000 n 0000381626 00000 n 0000082910 00000 n 0000087397 00000 n 0000464642 00000 n 0000464782 00000 n 0000464921 00000 n 0000381797 00000 n 0000087419 00000 n 0000088221 00000 n 0000465047 00000 n 0000381944 00000 n 0000088242 00000 n 0000090846 00000 n 0000465134 00000 n 0000382091 00000 n 0000090868 00000 n 0000094285 00000 n 0000465234 00000 n 0000382238 00000 n 0000094307 00000 n 0000098645 00000 n 0000465347 00000 n 0000465487 00000 n 0000382401 00000 n 0000098667 00000 n 0000101696 00000 n 0000465613 00000 n 0000465752 00000 n 0000382564 00000 n 0000101718 00000 n 0000104161 00000 n 0000465865 00000 n 0000382711 00000 n 0000104183 00000 n 0000106846 00000 n 0000465965 00000 n 0000382858 00000 n 0000106868 00000 n 0000110447 00000 n 0000466078 00000 n 0000383005 00000 n 0000110469 00000 n 0000113389 00000 n 0000466191 00000 n 0000383152 00000 n 0000113411 00000 n 0000114905 00000 n 0000466330 00000 n 0000383299 00000 n 0000114927 00000 n 0000117503 00000 n 0000466430 00000 n 0000383446 00000 n 0000117525 00000 n 0000119749 00000 n 0000466543 00000 n 0000383593 00000 n 0000119771 00000 n 0000122576 00000 n 0000466643 00000 n 0000383740 00000 n 0000122598 00000 n 0000125382 00000 n 0000466743 00000 n 0000383887 00000 n 0000125404 00000 n 0000128283 00000 n 0000466869 00000 n 0000384034 00000 n 0000128305 00000 n 0000130691 00000 n 0000466969 00000 n 0000384181 00000 n 0000130713 00000 n 0000134127 00000 n 0000467069 00000 n 0000384328 00000 n 0000134149 00000 n 0000137562 00000 n 0000467169 00000 n 0000384475 00000 n 0000137584 00000 n 0000139669 00000 n 0000467269 00000 n 0000384622 00000 n 0000139691 00000 n 0000142513 00000 n 0000467369 00000 n 0000384769 00000 n 0000142535 00000 n 0000145400 00000 n 0000467469 00000 n 0000384916 00000 n 0000145422 00000 n 0000148543 00000 n 0000467569 00000 n 0000385063 00000 n 0000148565 00000 n 0000151692 00000 n 0000467669 00000 n 0000385210 00000 n 0000151714 00000 n 0000153842 00000 n 0000467769 00000 n 0000385357 00000 n 0000153864 00000 n 0000157708 00000 n 0000467882 00000 n 0000385504 00000 n 0000157730 00000 n 0000161548 00000 n 0000468008 00000 n 0000385651 00000 n 0000161570 00000 n 0000165176 00000 n 0000468134 00000 n 0000468274 00000 n 0000385814 00000 n 0000165198 00000 n 0000168353 00000 n 0000468400 00000 n 0000385961 00000 n 0000168375 00000 n 0000172643 00000 n 0000468539 00000 n 0000468679 00000 n 0000468817 00000 n 0000386132 00000 n 0000172665 00000 n 0000175817 00000 n 0000468943 00000 n 0000386279 00000 n 0000175839 00000 n 0000178971 00000 n 0000469056 00000 n 0000386426 00000 n 0000178993 00000 n 0000182986 00000 n 0000469169 00000 n 0000386573 00000 n 0000183008 00000 n 0000186004 00000 n 0000469295 00000 n 0000386720 00000 n 0000186026 00000 n 0000189229 00000 n 0000469408 00000 n 0000386867 00000 n 0000189251 00000 n 0000192389 00000 n 0000469508 00000 n 0000387014 00000 n 0000192411 00000 n 0000194747 00000 n 0000469608 00000 n 0000387161 00000 n 0000194769 00000 n 0000199078 00000 n 0000469708 00000 n 0000469848 00000 n 0000469987 00000 n 0000387332 00000 n 0000199100 00000 n 0000202220 00000 n 0000470100 00000 n 0000387479 00000 n 0000202242 00000 n 0000205294 00000 n 0000470187 00000 n 0000387626 00000 n 0000205316 00000 n 0000208841 00000 n 0000470300 00000 n 0000387773 00000 n 0000208863 00000 n 0000213056 00000 n 0000470413 00000 n 0000387920 00000 n 0000213078 00000 n 0000216045 00000 n 0000470539 00000 n 0000388067 00000 n 0000216067 00000 n 0000219246 00000 n 0000470639 00000 n 0000388214 00000 n 0000219268 00000 n 0000222359 00000 n 0000470752 00000 n 0000388361 00000 n 0000222381 00000 n 0000226314 00000 n 0000470865 00000 n 0000388508 00000 n 0000226336 00000 n 0000227493 00000 n 0000470991 00000 n 0000388655 00000 n 0000227515 00000 n 0000232102 00000 n 0000471065 00000 n 0000388802 00000 n 0000232124 00000 n 0000233820 00000 n 0000471191 00000 n 0000388949 00000 n 0000233842 00000 n 0000238532 00000 n 0000471278 00000 n 0000471418 00000 n 0000389112 00000 n 0000238554 00000 n 0000243080 00000 n 0000471544 00000 n 0000471683 00000 n 0000389275 00000 n 0000243102 00000 n 0000246751 00000 n 0000471796 00000 n 0000389422 00000 n 0000246773 00000 n 0000250652 00000 n 0000471935 00000 n 0000389569 00000 n 0000250674 00000 n 0000252632 00000 n 0000472061 00000 n 0000389716 00000 n 0000252654 00000 n 0000254463 00000 n 0000472174 00000 n 0000389863 00000 n 0000254485 00000 n 0000258114 00000 n 0000472274 00000 n 0000390010 00000 n 0000258136 00000 n 0000260838 00000 n 0000472374 00000 n 0000390157 00000 n 0000260860 00000 n 0000262826 00000 n 0000472487 00000 n 0000390304 00000 n 0000262848 00000 n 0000264790 00000 n 0000472574 00000 n 0000390451 00000 n 0000264812 00000 n 0000269985 00000 n 0000472661 00000 n 0000390598 00000 n 0000270007 00000 n 0000276009 00000 n 0000472774 00000 n 0000472914 00000 n 0000390761 00000 n 0000276031 00000 n 0000278542 00000 n 0000473040 00000 n 0000390908 00000 n 0000278564 00000 n 0000279785 00000 n 0000473140 00000 n 0000391055 00000 n 0000279807 00000 n 0000282477 00000 n 0000473227 00000 n 0000391202 00000 n 0000282499 00000 n 0000286242 00000 n 0000473340 00000 n 0000473479 00000 n 0000473618 00000 n 0000391373 00000 n 0000286264 00000 n 0000290469 00000 n 0000473744 00000 n 0000473884 00000 n 0000391536 00000 n 0000290491 00000 n 0000291676 00000 n 0000474010 00000 n 0000474149 00000 n 0000391699 00000 n 0000291698 00000 n 0000294740 00000 n 0000474249 00000 n 0000391846 00000 n 0000294762 00000 n 0000298497 00000 n 0000474388 00000 n 0000474527 00000 n 0000474666 00000 n 0000392017 00000 n 0000298519 00000 n 0000300953 00000 n 0000474792 00000 n 0000392164 00000 n 0000300975 00000 n 0000303919 00000 n 0000474892 00000 n 0000392311 00000 n 0000303941 00000 n 0000308366 00000 n 0000475005 00000 n 0000475145 00000 n 0000475283 00000 n 0000392482 00000 n 0000308388 00000 n 0000311939 00000 n 0000475409 00000 n 0000392629 00000 n 0000311961 00000 n 0000316560 00000 n 0000475535 00000 n 0000475675 00000 n 0000475815 00000 n 0000475954 00000 n 0000392808 00000 n 0000316582 00000 n 0000317395 00000 n 0000476093 00000 n 0000392955 00000 n 0000317416 00000 n 0000320103 00000 n 0000476180 00000 n 0000393102 00000 n 0000320125 00000 n 0000322891 00000 n 0000476293 00000 n 0000476431 00000 n 0000476570 00000 n 0000393273 00000 n 0000322913 00000 n 0000325846 00000 n 0000476683 00000 n 0000476822 00000 n 0000393436 00000 n 0000325868 00000 n 0000328903 00000 n 0000476935 00000 n 0000393583 00000 n 0000328925 00000 n 0000332169 00000 n 0000477048 00000 n 0000477188 00000 n 0000393746 00000 n 0000332191 00000 n 0000334314 00000 n 0000477301 00000 n 0000477440 00000 n 0000393909 00000 n 0000334336 00000 n 0000338257 00000 n 0000477540 00000 n 0000394056 00000 n 0000338279 00000 n 0000342071 00000 n 0000477666 00000 n 0000394203 00000 n 0000342093 00000 n 0000346339 00000 n 0000477779 00000 n 0000477920 00000 n 0000394368 00000 n 0000346362 00000 n 0000350170 00000 n 0000478047 00000 n 0000478187 00000 n 0000394535 00000 n 0000350193 00000 n 0000355077 00000 n 0000478301 00000 n 0000394685 00000 n 0000355100 00000 n 0000356113 00000 n 0000478428 00000 n 0000394835 00000 n 0000356135 00000 n 0000359318 00000 n 0000478529 00000 n 0000394985 00000 n 0000359341 00000 n 0000362843 00000 n 0000478656 00000 n 0000478797 00000 n 0000478936 00000 n 0000395161 00000 n 0000362866 00000 n 0000367153 00000 n 0000479063 00000 n 0000479195 00000 n 0000479327 00000 n 0000479460 00000 n 0000479593 00000 n 0000479725 00000 n 0000479858 00000 n 0000479991 00000 n 0000480123 00000 n 0000480254 00000 n 0000480386 00000 n 0000480518 00000 n 0000480650 00000 n 0000480782 00000 n 0000480915 00000 n 0000481048 00000 n 0000481181 00000 n 0000481314 00000 n 0000481447 00000 n 0000481580 00000 n 0000481713 00000 n 0000481846 00000 n 0000481979 00000 n 0000482112 00000 n 0000482244 00000 n 0000482377 00000 n 0000482510 00000 n 0000482643 00000 n 0000482774 00000 n 0000482907 00000 n 0000483039 00000 n 0000483171 00000 n 0000483303 00000 n 0000483436 00000 n 0000483569 00000 n 0000483702 00000 n 0000483835 00000 n 0000483968 00000 n 0000484101 00000 n 0000484234 00000 n 0000484367 00000 n 0000484500 00000 n 0000484633 00000 n 0000484765 00000 n 0000484898 00000 n 0000485031 00000 n 0000485163 00000 n 0000485296 00000 n 0000485428 00000 n 0000485560 00000 n 0000485693 00000 n 0000485826 00000 n 0000485958 00000 n 0000486091 00000 n 0000486223 00000 n 0000486355 00000 n 0000486487 00000 n 0000486619 00000 n 0000486752 00000 n 0000486885 00000 n 0000487018 00000 n 0000487151 00000 n 0000487284 00000 n 0000487417 00000 n 0000487550 00000 n 0000487683 00000 n 0000487816 00000 n 0000487949 00000 n 0000488082 00000 n 0000488214 00000 n 0000488346 00000 n 0000488478 00000 n 0000488610 00000 n 0000488742 00000 n 0000488874 00000 n 0000489007 00000 n 0000489140 00000 n 0000489273 00000 n 0000489406 00000 n 0000489539 00000 n 0000489672 00000 n 0000489805 00000 n 0000489938 00000 n 0000490071 00000 n 0000490204 00000 n 0000490335 00000 n 0000490468 00000 n 0000490601 00000 n 0000490734 00000 n 0000396111 00000 n 0000367176 00000 n 0000372647 00000 n 0000490809 00000 n 0000490941 00000 n 0000491074 00000 n 0000491207 00000 n 0000491340 00000 n 0000491473 00000 n 0000491606 00000 n 0000491738 00000 n 0000491870 00000 n 0000492002 00000 n 0000492134 00000 n 0000492266 00000 n 0000492398 00000 n 0000492530 00000 n 0000492663 00000 n 0000492796 00000 n 0000492929 00000 n 0000493062 00000 n 0000493195 00000 n 0000493328 00000 n 0000493461 00000 n 0000493594 00000 n 0000493727 00000 n 0000493858 00000 n 0000493991 00000 n 0000494124 00000 n 0000494257 00000 n 0000494389 00000 n 0000494521 00000 n 0000494653 00000 n 0000494785 00000 n 0000494917 00000 n 0000495049 00000 n 0000495181 00000 n 0000495312 00000 n 0000495443 00000 n 0000495573 00000 n 0000495704 00000 n 0000495835 00000 n 0000495966 00000 n 0000496098 00000 n 0000496231 00000 n 0000496363 00000 n 0000496496 00000 n 0000496629 00000 n 0000496761 00000 n 0000496894 00000 n 0000497027 00000 n 0000497160 00000 n 0000497293 00000 n 0000497425 00000 n 0000497558 00000 n 0000497691 00000 n 0000497824 00000 n 0000497957 00000 n 0000498091 00000 n 0000498225 00000 n 0000498359 00000 n 0000498492 00000 n 0000498624 00000 n 0000498756 00000 n 0000498888 00000 n 0000499021 00000 n 0000499154 00000 n 0000499286 00000 n 0000499419 00000 n 0000499553 00000 n 0000499687 00000 n 0000499821 00000 n 0000499955 00000 n 0000500089 00000 n 0000500223 00000 n 0000500357 00000 n 0000500490 00000 n 0000500624 00000 n 0000500756 00000 n 0000500888 00000 n 0000501021 00000 n 0000501154 00000 n 0000501288 00000 n 0000501422 00000 n 0000501556 00000 n 0000501690 00000 n 0000501824 00000 n 0000501958 00000 n 0000502091 00000 n 0000502224 00000 n 0000502357 00000 n 0000502490 00000 n 0000502623 00000 n 0000502756 00000 n 0000502889 00000 n 0000503022 00000 n 0000503155 00000 n 0000503288 00000 n 0000503421 00000 n 0000503554 00000 n 0000503687 00000 n 0000503820 00000 n 0000503953 00000 n 0000504086 00000 n 0000504217 00000 n 0000504350 00000 n 0000397187 00000 n 0000372670 00000 n 0000375081 00000 n 0000504425 00000 n 0000504558 00000 n 0000504691 00000 n 0000504824 00000 n 0000504957 00000 n 0000505090 00000 n 0000505223 00000 n 0000505356 00000 n 0000505487 00000 n 0000505619 00000 n 0000505751 00000 n 0000505883 00000 n 0000506016 00000 n 0000506149 00000 n 0000506282 00000 n 0000506414 00000 n 0000506547 00000 n 0000506680 00000 n 0000506812 00000 n 0000506945 00000 n 0000507078 00000 n 0000507211 00000 n 0000507344 00000 n 0000507477 00000 n 0000507610 00000 n 0000507743 00000 n 0000507876 00000 n 0000508009 00000 n 0000508142 00000 n 0000508275 00000 n 0000508408 00000 n 0000508540 00000 n 0000508672 00000 n 0000508804 00000 n 0000508936 00000 n 0000509069 00000 n 0000509202 00000 n 0000509335 00000 n 0000509468 00000 n 0000509601 00000 n 0000509733 00000 n 0000509866 00000 n 0000509999 00000 n 0000510132 00000 n 0000510264 00000 n 0000510397 00000 n 0000517804 00000 n 0000526931 00000 n 0000537559 00000 n 0000544963 00000 n 0000553392 00000 n 0000556190 00000 n 0000568394 00000 n 0000570452 00000 n 0000571552 00000 n 0000581623 00000 n 0000592001 00000 n 0000598830 00000 n 0000599707 00000 n 0000604629 00000 n 0000610166 00000 n 0000510947 00000 n 0000511553 00000 n 0000512139 00000 n 0000512728 00000 n 0000513594 00000 n 0000514717 00000 n 0000515320 00000 n 0000515865 00000 n 0000516513 00000 n 0000517332 00000 n trailer << /Size 1298 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 632225 %%EOF fabio-0.1.3/epydoc/fabio-module.html0000644000175000017500000002741612126623347020113 0ustar jeromejerome00000000000000 fabio
        Package fabio
        [hide private]
        [frames] | no frames]

        Package fabio

        source code

        FabIO module


        Date: 02/04/2013

        Author: J\xc3\xa9r\xc3\xb4me Kieffer

        Contact: Jerome.Kieffer@ESRF.eu

        Copyright: European Synchrotron Radiation Facility, Grenoble, France

        License: GPLv3+

        Submodules [hide private]

        Variables [hide private]
          __status__ = 'stable'
          version = '0.1.2'
          __package__ = 'fabio'
        fabio-0.1.3/epydoc/fabio.tifimage.Image_File_Directory-class.html0000644000175000017500000002244312126623347025516 0ustar jeromejerome00000000000000 fabio.tifimage.Image_File_Directory
        Package fabio :: Module tifimage :: Class Image_File_Directory
        [hide private]
        [frames] | no frames]

        Class Image_File_Directory

        source code

        object --+
                 |
                Image_File_Directory
        

        Instance Methods [hide private]
         
        __init__(self, instring=None, offset=-1)
        x.__init__(...) initializes x; see x.__class__.__doc__ for signature
        source code
         
        unpack(self, instring, offset=-1) source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, instring=None, offset=-1)
        (Constructor)

        source code 

        x.__init__(...) initializes x; see x.__class__.__doc__ for signature

        Overrides: object.__init__
        (inherited documentation)

        fabio-0.1.3/epydoc/fabio-pysrc.html0000644000175000017500000003107312126623347017760 0ustar jeromejerome00000000000000 fabio
        Package fabio
        [hide private]
        [frames] | no frames]

        Source Code for Package fabio

         1  #!/usr/bin/env python 
         2  #coding: utf8 
         3  """ 
         4  FabIO module 
         5    
         6  """ 
         7  __author__ = "Jérôme Kieffer" 
         8  __contact__ = "Jerome.Kieffer@ESRF.eu" 
         9  __license__ = "GPLv3+" 
        10  __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" 
        11  __date__ = "02/04/2013" 
        12  __status__ = "stable" 
        13   
        14  version = "0.1.2" 
        15  import logging 
        16  logging.basicConfig() 
        17  import fabioimage 
        18  import openimage 
        19  from fabioutils import COMPRESSORS, jump_filename, FilenameObject, \ 
        20          previous_filename, next_filename, deconstruct_filename, \ 
        21          extract_filenumber, getnum, construct_filename 
        22   
        23  # Compatibility with outside world: 
        24  filename_object = FilenameObject 
        25   
        26  from openimage import openimage as open 
        27  from openimage import openheader as openheader 
        28   
        

        fabio-0.1.3/epydoc/epydoc.js0000644000175000017500000002452512120434325016467 0ustar jeromejerome00000000000000function toggle_private() { // Search for any private/public links on this page. Store // their old text in "cmd," so we will know what action to // take; and change their text to the opposite action. var cmd = "?"; var elts = document.getElementsByTagName("a"); for(var i=0; i...
        "; elt.innerHTML = s; } } function toggle(id) { elt = document.getElementById(id+"-toggle"); if (elt.innerHTML == "-") collapse(id); else expand(id); return false; } function highlight(id) { var elt = document.getElementById(id+"-def"); if (elt) elt.className = "py-highlight-hdr"; var elt = document.getElementById(id+"-expanded"); if (elt) elt.className = "py-highlight"; var elt = document.getElementById(id+"-collapsed"); if (elt) elt.className = "py-highlight"; } function num_lines(s) { var n = 1; var pos = s.indexOf("\n"); while ( pos > 0) { n += 1; pos = s.indexOf("\n", pos+1); } return n; } // Collapse all blocks that mave more than `min_lines` lines. function collapse_all(min_lines) { var elts = document.getElementsByTagName("div"); for (var i=0; i 0) if (elt.id.substring(split, elt.id.length) == "-expanded") if (num_lines(elt.innerHTML) > min_lines) collapse(elt.id.substring(0, split)); } } function expandto(href) { var start = href.indexOf("#")+1; if (start != 0 && start != href.length) { if (href.substring(start, href.length) != "-") { collapse_all(4); pos = href.indexOf(".", start); while (pos != -1) { var id = href.substring(start, pos); expand(id); pos = href.indexOf(".", pos+1); } var id = href.substring(start, href.length); expand(id); highlight(id); } } } function kill_doclink(id) { var parent = document.getElementById(id); parent.removeChild(parent.childNodes.item(0)); } function auto_kill_doclink(ev) { if (!ev) var ev = window.event; if (!this.contains(ev.toElement)) { var parent = document.getElementById(this.parentID); parent.removeChild(parent.childNodes.item(0)); } } function doclink(id, name, targets_id) { var elt = document.getElementById(id); // If we already opened the box, then destroy it. // (This case should never occur, but leave it in just in case.) if (elt.childNodes.length > 1) { elt.removeChild(elt.childNodes.item(0)); } else { // The outer box: relative + inline positioning. var box1 = document.createElement("div"); box1.style.position = "relative"; box1.style.display = "inline"; box1.style.top = 0; box1.style.left = 0; // A shadow for fun var shadow = document.createElement("div"); shadow.style.position = "absolute"; shadow.style.left = "-1.3em"; shadow.style.top = "-1.3em"; shadow.style.background = "#404040"; // The inner box: absolute positioning. var box2 = document.createElement("div"); box2.style.position = "relative"; box2.style.border = "1px solid #a0a0a0"; box2.style.left = "-.2em"; box2.style.top = "-.2em"; box2.style.background = "white"; box2.style.padding = ".3em .4em .3em .4em"; box2.style.fontStyle = "normal"; box2.onmouseout=auto_kill_doclink; box2.parentID = id; // Get the targets var targets_elt = document.getElementById(targets_id); var targets = targets_elt.getAttribute("targets"); var links = ""; target_list = targets.split(","); for (var i=0; i" + target[0] + ""; } // Put it all together. elt.insertBefore(box1, elt.childNodes.item(0)); //box1.appendChild(box2); box1.appendChild(shadow); shadow.appendChild(box2); box2.innerHTML = "Which "+name+" do you want to see documentation for?" + ""; } return false; } function get_anchor() { var href = location.href; var start = href.indexOf("#")+1; if ((start != 0) && (start != href.length)) return href.substring(start, href.length); } function redirect_url(dottedName) { // Scan through each element of the "pages" list, and check // if "name" matches with any of them. for (var i=0; i-m" or "-c"; // extract the portion & compare it to dottedName. var pagename = pages[i].substring(0, pages[i].length-2); if (pagename == dottedName.substring(0,pagename.length)) { // We've found a page that matches `dottedName`; // construct its URL, using leftover `dottedName` // content to form an anchor. var pagetype = pages[i].charAt(pages[i].length-1); var url = pagename + ((pagetype=="m")?"-module.html": "-class.html"); if (dottedName.length > pagename.length) url += "#" + dottedName.substring(pagename.length+1, dottedName.length); return url; } } } fabio-0.1.3/epydoc/fabio.kcdimage-module.html0000644000175000017500000002417112126623347021651 0ustar jeromejerome00000000000000 fabio.kcdimage
        Package fabio :: Module kcdimage
        [hide private]
        [frames] | no frames]

        Module kcdimage

        source code

        
        Authors: Jerome Kieffer, ESRF 
                 email:jerome.kieffer@esrf.fr
        
        kcd images are 2D images written by the old KappaCCD diffractometer built by Nonius in the 1990's
        Based on the edfimage.py parser.
        
        
        Classes [hide private]
          kcdimage
        Read the Nonius kcd data format
        Variables [hide private]
          logger = logging.getLogger("kcdimage")
          DATA_TYPES = {'u16': <type 'numpy.uint16'>}
          MINIMUM_KEYS = ['ByteOrder', 'Data type', 'X dimension', 'Y di...
          DEFAULT_VALUES = {'Data type': 'u16'}
          __package__ = 'fabio'
        Variables Details [hide private]

        MINIMUM_KEYS

        Value:
        ['ByteOrder',
         'Data type',
         'X dimension',
         'Y dimension',
         'Number of readouts']
        

        fabio-0.1.3/epydoc/fabio.cbfimage-module.html0000644000175000017500000003111012126623347021631 0ustar jeromejerome00000000000000 fabio.cbfimage
        Package fabio :: Module cbfimage
        [hide private]
        [frames] | no frames]

        Module cbfimage

        source code

        
        Authors: Jérôme Kieffer, ESRF
                 email:jerome.kieffer@esrf.fr
        
        Cif Binary Files images are 2D images written by the Pilatus detector and others.
        They use a modified (simplified) byte-offset algorithm.
        
        CIF is a library for manipulating Crystallographic information files and tries
        to conform to the specification of the IUCR
        
        

        Author: J\xc3\xa9r\xc3\xb4me Kieffer

        Contact: jerome.kieffer@esrf.eu

        Copyright: European Synchrotron Radiation Facility, Grenoble, France

        License: GPLv3+

        Classes [hide private]
          cbfimage
        Read the Cif Binary File data format
          CIF
        This is the CIF class, it represents the CIF dictionary; and as a a python dictionary thus inherits from the dict built in class.
        Variables [hide private]
          logger = logging.getLogger("cbfimage")
          DATA_TYPES = {'signed 16-bit integer': <type 'numpy.int16'>, '...
          MINIMUM_KEYS = ['X-Binary-Size-Fastest-Dimension', 'ByteOrder'...
          STARTER = '\x0c\x1a\x04\xd5'
          PADDING = 512
          __package__ = 'fabio'
        Variables Details [hide private]

        DATA_TYPES

        Value:
        {'signed 16-bit integer': <type 'numpy.int16'>,
         'signed 32-bit integer': <type 'numpy.int32'>,
         'signed 64-bit integer': <type 'numpy.int64'>,
         'signed 8-bit integer': <type 'numpy.int8'>}
        

        MINIMUM_KEYS

        Value:
        ['X-Binary-Size-Fastest-Dimension',
         'ByteOrder',
         'Data type',
         'X dimension',
         'Y dimension',
         'Number of readouts']
        

        fabio-0.1.3/epydoc/toc-fabio.HiPiCimage-module.html0000644000175000017500000000245712120434325022620 0ustar jeromejerome00000000000000 HiPiCimage

        Module HiPiCimage


        Classes

        HiPiCimage

        Variables

        __package__
        logger

        [hide private] fabio-0.1.3/epydoc/fabio.fabioutils.StringIO-class.html0000644000175000017500000002671212126623347023566 0ustar jeromejerome00000000000000 fabio.fabioutils.StringIO
        Package fabio :: Module fabioutils :: Class StringIO
        [hide private]
        [frames] | no frames]

        Class StringIO

        source code

        StringIO.StringIO --+
                            |
                           StringIO
        

        just an interface providing the name and mode property to a StringIO

        BugFix for MacOSX mainly

        Instance Methods [hide private]
         
        __init__(self, data, fname=None, mode='r') source code
         
        getSize(self) source code
         
        setSize(self, size) source code

        Inherited from StringIO.StringIO: __iter__, close, flush, getvalue, isatty, next, read, readline, readlines, seek, tell, truncate, write, writelines

        Properties [hide private]
          size
        Method Details [hide private]

        __init__(self, data, fname=None, mode='r')
        (Constructor)

        source code 
        Overrides: StringIO.StringIO.__init__

        Property Details [hide private]

        size

        Get Method:
        getSize(self)
        Set Method:
        setSize(self, size)

        fabio-0.1.3/epydoc/fabio.HiPiCimage-pysrc.html0000644000175000017500000015370012126623347021720 0ustar jeromejerome00000000000000 fabio.HiPiCimage
        Package fabio :: Module HiPiCimage
        [hide private]
        [frames] | no frames]

        Source Code for Module fabio.HiPiCimage

          1   
          2  #!/usr/bin/env python 
          3  """ 
          4  Authors: Henning O. Sorensen & Erik Knudsen 
          5           Center for Fundamental Research: Metal Structures in Four Dimensions 
          6           Risoe National Laboratory 
          7           Frederiksborgvej 399 
          8           DK-4000 Roskilde 
          9           email:erik.knudsen@risoe.dk 
         10   
         11          + Jon Wright, ESRF 
         12   
         13  Information about the file format from Masakatzu Kobayashi is highly appreciated 
         14  """ 
         15   
         16  import numpy, logging 
         17  logger = logging.getLogger("HiPiCimage") 
         18  from fabioimage import fabioimage 
         19   
        
        20 -class HiPiCimage(fabioimage):
        21 """ Read HiPic images e.g. collected with a Hamamatsu CCD camera""" 22 23
        24 - def _readheader(self, infile):
        25 """ 26 Read in a header from an already open file 27 28 """ 29 Image_tag = infile.read(2) 30 print Image_tag 31 Comment_len = numpy.fromstring(infile.read(2), numpy.uint16) 32 Dim_1 = numpy.fromstring(infile.read(2), numpy.uint16)[0] 33 Dim_2 = numpy.fromstring(infile.read(2), numpy.uint16)[0] 34 Dim_1_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0] 35 Dim_2_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0] 36 HeaderType = numpy.fromstring(infile.read(2), numpy.uint16)[0] 37 Dump = infile.read(50) 38 Comment = infile.read(Comment_len) 39 self.header['Image_tag'] = Image_tag 40 self.header['Dim_1'] = Dim_1 41 self.header['Dim_2'] = Dim_2 42 self.header['Dim_1_offset'] = Dim_1_offset 43 self.header['Dim_2_offset'] = Dim_2_offset 44 #self.header['Comment'] = Comment 45 if Image_tag != 'IM' : 46 # This does not look like an HiPic file 47 logging.warning("no opening. Corrupt header of HiPic file " + \ 48 str(infile.name)) 49 Comment_split = Comment[:Comment.find('\x00')].split('\r\n') 50 51 for topcomment in Comment_split: 52 topsplit = topcomment.split(',') 53 for line in topsplit: 54 if '=' in line: 55 key, val = line.split('=' , 1) 56 # Users cannot type in significant whitespace 57 key = key.rstrip().lstrip() 58 self.header_keys.append(key) 59 self.header[key] = val.lstrip().rstrip() 60 self.header[key] = val.lstrip('"').rstrip('"')
        61
        62 - def read(self, fname, frame=None):
        63 """ 64 Read in header into self.header and 65 the data into self.data 66 """ 67 self.header = {} 68 self.resetvals() 69 infile = self._open(fname, "rb") 70 self._readheader(infile) 71 # Compute image size 72 try: 73 self.dim1 = int(self.header['Dim_1']) 74 self.dim2 = int(self.header['Dim_2']) 75 except: 76 raise Exception("HiPic file", str(fname) + \ 77 "is corrupt, cannot read it") 78 bytecode = numpy.uint16 79 self.bpp = len(numpy.array(0, bytecode).tostring()) 80 81 # Read image data 82 block = infile.read(self.dim1 * self.dim2 * self.bpp) 83 infile.close() 84 85 #now read the data into the array 86 try: 87 self.data = numpy.reshape( 88 numpy.fromstring(block, bytecode), 89 [self.dim2, self.dim1]) 90 except: 91 print len(block), bytecode, self.bpp, self.dim2, self.dim1 92 raise IOError, \ 93 'Size spec in HiPic-header does not match size of image data field' 94 self.bytecode = self.data.dtype.type 95 96 # Sometimes these files are not saved as 12 bit, 97 # But as 16 bit after bg subtraction - which results 98 # negative values saved as 16bit. Therefore values higher 99 # 4095 is really negative values 100 if self.data.max() > 4095: 101 gt12bit = self.data > 4095 102 self.data = self.data - gt12bit * (2 ** 16 - 1) 103 104 # ensure the PIL image is reset 105 self.pilimage = None 106 return self
        107

        fabio-0.1.3/epydoc/fabio.edfimage.Frame-class.html0000644000175000017500000005042312126623347022516 0ustar jeromejerome00000000000000 fabio.edfimage.Frame
        Package fabio :: Module edfimage :: Class Frame
        [hide private]
        [frames] | no frames]

        Class Frame

        source code

        object --+
                 |
                Frame
        

        A class representing a single frame in an EDF file

        Instance Methods [hide private]
         
        __init__(self, data=None, header=None, header_keys=None, number=None)
        x.__init__(...) initializes x; see x.__class__.__doc__ for signature
        source code
         
        parseheader(self, block)
        Parse the header in some EDF format from an already open file
        source code
         
        swap_needed(self)
        Decide if we need to byteswap
        source code
         
        getData(self)
        Unpack a binary blob according to the specification given in the header
        source code
         
        setData(self, npa=None)
        Setter for data in edf frame
        source code
         
        getByteCode(self) source code
         
        setByteCode(self, _iVal) source code
        python string with the concatenation of the ascii header and the binary data block
        getEdfBlock(self, force_type=None, fit2dMode=False)
        Returns: ascii header block
        source code

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Properties [hide private]
          data
        Unpack a binary blob according to the specification given in the header
          bytecode

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, data=None, header=None, header_keys=None, number=None)
        (Constructor)

        source code 

        x.__init__(...) initializes x; see x.__class__.__doc__ for signature

        Overrides: object.__init__
        (inherited documentation)

        parseheader(self, block)

        source code 

        Parse the header in some EDF format from an already open file

        Parameters:
        • block (string, should be full ascii) - string representing the header block
        Returns:
        size of the binary blob

        getData(self)

        source code 

        Unpack a binary blob according to the specification given in the header

        Returns:
        dataset as numpy.ndarray

        getEdfBlock(self, force_type=None, fit2dMode=False)

        source code 
        Parameters:
        • force_type (string or numpy.dtype) - type of the dataset to be enforced like "float64" or "uint16"
        • fit2dMode (boolean) - enforce compatibility with fit2d and starts countimg number of images at 1
        Returns: python string with the concatenation of the ascii header and the binary data block
        ascii header block

        Property Details [hide private]

        data

        Unpack a binary blob according to the specification given in the header

        Get Method:
        getData(self) - Unpack a binary blob according to the specification given in the header
        Set Method:
        setData(self, npa=None) - Setter for data in edf frame
        Delete Method:
        'property: (edf)frame.data, uncompress the datablock when needed'
        

        bytecode

        Get Method:
        getByteCode(self)
        Set Method:
        setByteCode(self, _iVal)

        fabio-0.1.3/epydoc/fabio.mar345image.mar345image-class.html0000644000175000017500000005730512126623347023765 0ustar jeromejerome00000000000000 fabio.mar345image.mar345image
        Package fabio :: Module mar345image :: Class mar345image
        [hide private]
        [frames] | no frames]

        Class mar345image

        source code

                   object --+    
                            |    
        fabioimage.fabioimage --+
                                |
                               mar345image
        

        Instance Methods [hide private]
         
        __init__(self, *args, **kwargs)
        Set up initial values
        source code
         
        read(self, fname, frame=None)
        Read a mar345 image
        source code
         
        _readheader(self, infile=None)
        Read a mar345 image header
        source code
         
        write(self, fname)
        Try to write mar345 file.
        source code
         
        _writeheader(self, linesep='\n', size=4096) source code
         
        _high_intensity_pixel_records(self) source code
         
        nb_overflow_pixels(self) source code

        Inherited from fabioimage.fabioimage: add, convert, getclassname, getframe, getheader, getmax, getmean, getmin, getstddev, integrate_area, load, make_slice, next, previous, readROI, readheader, rebin, resetvals, save, toPIL16, update_header

        Inherited from fabioimage.fabioimage (private): _compressed_stream, _open

        Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

        Static Methods [hide private]
         
        checkData(data=None)
        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers
        source code

        Inherited from fabioimage.fabioimage: checkHeader

        Class Variables [hide private]
          _need_a_real_file = True

        Inherited from fabioimage.fabioimage (private): _need_a_seek_to_read

        Properties [hide private]

        Inherited from fabioimage.fabioimage: classname

        Inherited from object: __class__

        Method Details [hide private]

        __init__(self, *args, **kwargs)
        (Constructor)

        source code 

        Set up initial values

        Overrides: object.__init__
        (inherited documentation)

        read(self, fname, frame=None)

        source code 

        Read a mar345 image

        Overrides: fabioimage.fabioimage.read

        _readheader(self, infile=None)

        source code 

        Read a mar345 image header

        Overrides: fabioimage.fabioimage._readheader

        write(self, fname)

        source code 

        Try to write mar345 file. This is still in beta version. It uses CCP4 (LGPL) PCK1 algo from JPA

        Overrides: fabioimage.fabioimage.write

        _writeheader(self, linesep='\n', size=4096)

        source code 
        Parameters:
        • linesep - end of line separator @return string/bytes containing the mar345 header

        checkData(data=None)
        Static Method

        source code 

        Empty for fabioimage but may be populated by others classes, especially for format accepting only integers

        Overrides: fabioimage.fabioimage.checkData
        (inherited documentation)